diff --git a/.gitignore b/.gitignore index c539dcd8..b7d582ef 100644 --- a/.gitignore +++ b/.gitignore
@@ -98,6 +98,7 @@ /chrome/browser/protector/internal /chrome/browser/resources/chromeos/quickoffice /chrome/browser/resources/pdf/html_office +/chrome/browser/resources/media_router_internal/ /chrome/browser/resources/settings_internal/ /chrome/browser/resources/software_rendering_list /chrome/browser/spellchecker/internal
diff --git a/BUILD.gn b/BUILD.gn index 5956fa4c..c013d454 100644 --- a/BUILD.gn +++ b/BUILD.gn
@@ -728,6 +728,13 @@ ] } + if (is_linux && use_ozone) { + deps += [ + "//headless", + "//headless:headless_tests", + ] + } + if (!is_chromecast && (is_android || is_linux || is_chromeos)) { deps += [ "//blimp",
diff --git a/DEPS b/DEPS index ab87699..2d9c4e8 100644 --- a/DEPS +++ b/DEPS
@@ -43,7 +43,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling V8 # and whatever else without interference from each other. - 'v8_revision': '1230ed3c5cbda716e3be74d0d78eec5c0163d116', + 'v8_revision': 'ad16e6c2cbd2c6b0f2e8ff944ac245561c682ac2', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling swarming_client # and whatever else without interference from each other. @@ -59,7 +59,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling PDFium # and whatever else without interference from each other. - 'pdfium_revision': '28de044e5d6ab3cb0335ad4e5dd64fdf3376b2eb', + 'pdfium_revision': '8ba5b59356d506d3b9e976e7422e69bbd5bec8d6', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling openmax_dl # and whatever else without interference from each other. @@ -87,7 +87,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling NaCl # and whatever else without interference from each other. - 'nacl_revision': 'fd4ad83acf5770768fda344462efc6ee6ff70b67', + 'nacl_revision': 'd182b0a028d44ba9767ae25b30cf3986a7e72e99', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling dEQP # and whatever else without interference from each other. @@ -275,7 +275,7 @@ 'src/third_party/catapult': Var('chromium_git') + '/external/github.com/catapult-project/catapult.git' + '@' + - '2fa6a22a7d1b06c36c97ae1513fc006b8ac42f62', + 'a489be785184f64356555a8170452a6d6880cc5d', 'src/third_party/openh264/src': Var('chromium_git') + '/external/github.com/cisco/openh264' + '@' + 'b37cda248234162033e3e11b0335f3131cdfe488',
diff --git a/PRESUBMIT_test_mocks.py b/PRESUBMIT_test_mocks.py index f68c134..5230c87 100644 --- a/PRESUBMIT_test_mocks.py +++ b/PRESUBMIT_test_mocks.py
@@ -109,6 +109,9 @@ def LocalPath(self): return self._local_path + def AbsoluteLocalPath(self): + return self._local_path + def rfind(self, p): """os.path.basename is called on MockFile so we need an rfind method.""" return self._local_path.rfind(p)
diff --git a/android_webview/BUILD.gn b/android_webview/BUILD.gn index d3efe002..db089a5 100644 --- a/android_webview/BUILD.gn +++ b/android_webview/BUILD.gn
@@ -450,10 +450,6 @@ "browser/net/aw_cookie_store_wrapper.h", "browser/net/aw_http_user_agent_settings.cc", "browser/net/aw_http_user_agent_settings.h", - "browser/net/aw_network_change_notifier.cc", - "browser/net/aw_network_change_notifier.h", - "browser/net/aw_network_change_notifier_factory.cc", - "browser/net/aw_network_change_notifier_factory.h", "browser/net/aw_network_delegate.cc", "browser/net/aw_network_delegate.h", "browser/net/aw_request_interceptor.cc",
diff --git a/android_webview/android_webview.gyp b/android_webview/android_webview.gyp index 8378d0e5..9c9ffa3 100644 --- a/android_webview/android_webview.gyp +++ b/android_webview/android_webview.gyp
@@ -354,10 +354,6 @@ 'browser/net/aw_cookie_store_wrapper.h', 'browser/net/aw_http_user_agent_settings.h', 'browser/net/aw_http_user_agent_settings.cc', - 'browser/net/aw_network_change_notifier.cc', - 'browser/net/aw_network_change_notifier.h', - 'browser/net/aw_network_change_notifier_factory.cc', - 'browser/net/aw_network_change_notifier_factory.h', 'browser/net/aw_network_delegate.cc', 'browser/net/aw_network_delegate.h', 'browser/net/aw_request_interceptor.cc',
diff --git a/android_webview/browser/aw_browser_main_parts.cc b/android_webview/browser/aw_browser_main_parts.cc index 54a3a52..c598a16d 100644 --- a/android_webview/browser/aw_browser_main_parts.cc +++ b/android_webview/browser/aw_browser_main_parts.cc
@@ -9,7 +9,6 @@ #include "android_webview/browser/aw_media_client_android.h" #include "android_webview/browser/aw_result_codes.h" #include "android_webview/browser/deferred_gpu_command_service.h" -#include "android_webview/browser/net/aw_network_change_notifier_factory.h" #include "android_webview/common/aw_resource.h" #include "android_webview/common/aw_switches.h" #include "base/android/apk_assets.h" @@ -47,7 +46,8 @@ } void AwBrowserMainParts::PreEarlyInitialization() { - net::NetworkChangeNotifier::SetFactory(new AwNetworkChangeNotifierFactory()); + net::NetworkChangeNotifier::SetFactory( + new net::NetworkChangeNotifierFactoryAndroid()); // Android WebView does not use default MessageLoop. It has its own // Android specific MessageLoop. Also see MainMessageLoopRun.
diff --git a/android_webview/browser/net/aw_network_change_notifier.cc b/android_webview/browser/net/aw_network_change_notifier.cc deleted file mode 100644 index f91aefc..0000000 --- a/android_webview/browser/net/aw_network_change_notifier.cc +++ /dev/null
@@ -1,82 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "android_webview/browser/net/aw_network_change_notifier.h" - -namespace android_webview { - -AwNetworkChangeNotifier::~AwNetworkChangeNotifier() { - delegate_->RemoveObserver(this); -} - -net::NetworkChangeNotifier::ConnectionType -AwNetworkChangeNotifier::GetCurrentConnectionType() const { - return delegate_->GetCurrentConnectionType(); -} - -void AwNetworkChangeNotifier::GetCurrentMaxBandwidthAndConnectionType( - double* max_bandwidth_mbps, - ConnectionType* connection_type) const { - delegate_->GetCurrentMaxBandwidthAndConnectionType(max_bandwidth_mbps, - connection_type); -} - -bool AwNetworkChangeNotifier::AreNetworkHandlesCurrentlySupported() const { - return false; -} - -void AwNetworkChangeNotifier::GetCurrentConnectedNetworks( - NetworkChangeNotifier::NetworkList* networks) const { - delegate_->GetCurrentlyConnectedNetworks(networks); -} - -net::NetworkChangeNotifier::ConnectionType -AwNetworkChangeNotifier::GetCurrentNetworkConnectionType( - NetworkHandle network) const { - return delegate_->GetNetworkConnectionType(network); -} - -net::NetworkChangeNotifier::NetworkHandle -AwNetworkChangeNotifier::GetCurrentDefaultNetwork() const { - return delegate_->GetCurrentDefaultNetwork(); -} - -void AwNetworkChangeNotifier::OnConnectionTypeChanged() {} - -void AwNetworkChangeNotifier::OnMaxBandwidthChanged( - double max_bandwidth_mbps, - ConnectionType type) { - // Note that this callback is sufficient for Network Information API because - // it also occurs on type changes (see network_change_notifier.h). - NetworkChangeNotifier::NotifyObserversOfMaxBandwidthChange(max_bandwidth_mbps, - type); -} - -void AwNetworkChangeNotifier::OnNetworkConnected(NetworkHandle network) {} -void AwNetworkChangeNotifier::OnNetworkSoonToDisconnect( - NetworkHandle network) {} -void AwNetworkChangeNotifier::OnNetworkDisconnected( - NetworkHandle network) {} -void AwNetworkChangeNotifier::OnNetworkMadeDefault(NetworkHandle network){} - -AwNetworkChangeNotifier::AwNetworkChangeNotifier( - net::NetworkChangeNotifierDelegateAndroid* delegate) - : net::NetworkChangeNotifier(DefaultNetworkChangeCalculatorParams()), - delegate_(delegate) { - delegate_->AddObserver(this); -} - -// static -net::NetworkChangeNotifier::NetworkChangeCalculatorParams -AwNetworkChangeNotifier::DefaultNetworkChangeCalculatorParams() { - net::NetworkChangeNotifier::NetworkChangeCalculatorParams params; - // Use defaults as in network_change_notifier_android.cc - params.ip_address_offline_delay_ = base::TimeDelta::FromSeconds(1); - params.ip_address_online_delay_ = base::TimeDelta::FromSeconds(1); - params.connection_type_offline_delay_ = base::TimeDelta::FromSeconds(0); - params.connection_type_online_delay_ = base::TimeDelta::FromSeconds(0); - return params; -} - -} // namespace android_webview
diff --git a/android_webview/browser/net/aw_network_change_notifier.h b/android_webview/browser/net/aw_network_change_notifier.h deleted file mode 100644 index 6fc25b0..0000000 --- a/android_webview/browser/net/aw_network_change_notifier.h +++ /dev/null
@@ -1,66 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef ANDROID_WEBVIEW_BROWSER_NET_AW_NETWORK_CHANGE_NOTIFIER_H_ -#define ANDROID_WEBVIEW_BROWSER_NET_AW_NETWORK_CHANGE_NOTIFIER_H_ - -#include "base/compiler_specific.h" -#include "base/macros.h" -#include "net/android/network_change_notifier_delegate_android.h" -#include "net/base/network_change_notifier.h" - -namespace android_webview { - -// AwNetworkChangeNotifier is similar to NetworkChangeNotifierAndroid except -// it only propagates max-bandwidth changes in order to make the Network -// Information API work in blink. -// -// This somewhat reduced functionality is necessary because of the way -// NetworkChangeNotifier is enabled in WebView. It is enabled only when there -// are living WebView instances (instead of using ApplicationStatus) hence the -// existing Chrome for Android implementation is not applicable as is -// (see crbug.com/529434). -class AwNetworkChangeNotifier - : public net::NetworkChangeNotifier, - public net::NetworkChangeNotifierDelegateAndroid::Observer { - public: - ~AwNetworkChangeNotifier() override; - - // NetworkChangeNotifier: - ConnectionType GetCurrentConnectionType() const override; - // Requires ACCESS_WIFI_STATE permission in order to provide precise WiFi link - // speed. - void GetCurrentMaxBandwidthAndConnectionType( - double* max_bandwidth_mbps, - ConnectionType* connection_type) const override; - bool AreNetworkHandlesCurrentlySupported() const override; - void GetCurrentConnectedNetworks(NetworkList* network_list) const override; - ConnectionType GetCurrentNetworkConnectionType( - NetworkHandle network) const override; - NetworkHandle GetCurrentDefaultNetwork() const override; - - // NetworkChangeNotifierDelegateAndroid::Observer: - void OnConnectionTypeChanged() override; - void OnMaxBandwidthChanged(double max_bandwidth_mbps, - ConnectionType type) override; - void OnNetworkConnected(NetworkHandle network) override; - void OnNetworkSoonToDisconnect(NetworkHandle network) override; - void OnNetworkDisconnected(NetworkHandle network) override; - void OnNetworkMadeDefault(NetworkHandle network) override; - - private: - friend class AwNetworkChangeNotifierFactory; - - AwNetworkChangeNotifier(net::NetworkChangeNotifierDelegateAndroid* delegate); - - static NetworkChangeCalculatorParams DefaultNetworkChangeCalculatorParams(); - - net::NetworkChangeNotifierDelegateAndroid* const delegate_; - - DISALLOW_COPY_AND_ASSIGN(AwNetworkChangeNotifier); -}; - -} // namespace android_webview - -#endif // ANDROID_WEBVIEW_BROWSER_NET_AW_NETWORK_CHANGE_NOTIFIER_H_
diff --git a/android_webview/browser/net/aw_network_change_notifier_factory.cc b/android_webview/browser/net/aw_network_change_notifier_factory.cc deleted file mode 100644 index f05627f9..0000000 --- a/android_webview/browser/net/aw_network_change_notifier_factory.cc +++ /dev/null
@@ -1,19 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "android_webview/browser/net/aw_network_change_notifier_factory.h" - -#include "android_webview/browser/net/aw_network_change_notifier.h" - -namespace android_webview { - -AwNetworkChangeNotifierFactory::AwNetworkChangeNotifierFactory() {} - -AwNetworkChangeNotifierFactory::~AwNetworkChangeNotifierFactory() {} - -net::NetworkChangeNotifier* AwNetworkChangeNotifierFactory::CreateInstance() { - return new AwNetworkChangeNotifier(&delegate_); -} - -} // namespace android_webview
diff --git a/android_webview/browser/net/aw_network_change_notifier_factory.h b/android_webview/browser/net/aw_network_change_notifier_factory.h deleted file mode 100644 index 6cfbd20..0000000 --- a/android_webview/browser/net/aw_network_change_notifier_factory.h +++ /dev/null
@@ -1,41 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef ANDROID_WEBVIEW_NET_AW_NETWORK_CHANGE_NOTIFIER_FACTORY_H_ -#define ANDROID_WEBVIEW_NET_AW_NETWORK_CHANGE_NOTIFIER_FACTORY_H_ - -#include "net/android/network_change_notifier_delegate_android.h" -#include "net/base/network_change_notifier_factory.h" - -namespace net { -class NetworkChangeNotifier; -class NetworkChangeNotifierDelegateAndroid; -} - -namespace android_webview { - -// AwNetworkChangeNotifierFactory creates WebView-specific specialization of -// NetworkChangeNotifier. See aw_network_change_notifier.h for more details. -class AwNetworkChangeNotifierFactory : - public net::NetworkChangeNotifierFactory { - public: - // Must be called on the JNI thread. - AwNetworkChangeNotifierFactory(); - - // Must be called on the JNI thread. - ~AwNetworkChangeNotifierFactory() override; - - // NetworkChangeNotifierFactory: - net::NetworkChangeNotifier* CreateInstance() override; - - private: - // Delegate passed to the instances created by this class. - net::NetworkChangeNotifierDelegateAndroid delegate_; - - DISALLOW_COPY_AND_ASSIGN(AwNetworkChangeNotifierFactory); -}; - -} // namespace android_webview - -#endif // ANDROID_WEBVIEW_NET_AW_NETWORK_CHANGE_NOTIFIER_FACTORY_H_
diff --git a/android_webview/glue/glue.gni b/android_webview/glue/glue.gni index e49cd3d6..fc9c65ab 100644 --- a/android_webview/glue/glue.gni +++ b/android_webview/glue/glue.gni
@@ -11,7 +11,6 @@ "//content/public/android:content_java", "//content/public/android:content_java_resources", "//components/web_contents_delegate_android:web_contents_delegate_android_java_resources", - "//net/android:net_java", "//ui/android:ui_java", "//ui/android:ui_java_resources", ]
diff --git a/android_webview/glue/java/src/com/android/webview/chromium/WebViewChromiumFactoryProvider.java b/android_webview/glue/java/src/com/android/webview/chromium/WebViewChromiumFactoryProvider.java index 3b4d3a4..13a9b0f 100644 --- a/android_webview/glue/java/src/com/android/webview/chromium/WebViewChromiumFactoryProvider.java +++ b/android_webview/glue/java/src/com/android/webview/chromium/WebViewChromiumFactoryProvider.java
@@ -34,7 +34,6 @@ import org.chromium.android_webview.AwCookieManager; import org.chromium.android_webview.AwDataReductionProxyManager; import org.chromium.android_webview.AwDevToolsServer; -import org.chromium.android_webview.AwNetworkChangeNotifierRegistrationPolicy; import org.chromium.android_webview.AwQuotaManagerBridge; import org.chromium.android_webview.AwResource; import org.chromium.android_webview.AwSettings; @@ -51,7 +50,6 @@ import org.chromium.base.library_loader.LibraryProcessType; import org.chromium.base.library_loader.ProcessInitException; import org.chromium.content.browser.ContentViewStatics; -import org.chromium.net.NetworkChangeNotifier; import org.chromium.ui.base.ResourceBundle; import java.io.File; @@ -243,9 +241,6 @@ setUpResources(webViewPackageName, context); ResourceBundle.initializeLocalePaks(context, R.array.locale_paks); initPlatSupportLibrary(); - NetworkChangeNotifier.init(context); - NetworkChangeNotifier.setAutoDetectConnectivityState( - new AwNetworkChangeNotifierRegistrationPolicy()); final int extraBindFlags = 0; AwBrowserProcess.configureChildProcessLauncher(webViewPackageName, extraBindFlags); AwBrowserProcess.start(context);
diff --git a/android_webview/glue/java/src/com/android/webview/chromium/WebViewContentsClientAdapter.java b/android_webview/glue/java/src/com/android/webview/chromium/WebViewContentsClientAdapter.java index a08e755a8..1d28526 100644 --- a/android_webview/glue/java/src/com/android/webview/chromium/WebViewContentsClientAdapter.java +++ b/android_webview/glue/java/src/com/android/webview/chromium/WebViewContentsClientAdapter.java
@@ -878,14 +878,15 @@ */ private boolean showDefaultJsDialog(JsPromptResult res, int jsDialogType, String defaultValue, String message, String url) { - if (AwContents.activityFromContext(mContext) == null) { + // Note we must unwrap the Context here due to JsDialogHelper only using instanceof to + // check if a Context is an Activity. + Context activityContext = AwContents.activityFromContext(mContext); + if (activityContext == null) { + Log.w(TAG, "Unable to create JsDialog without an Activity"); return false; } - // TODO(igsolla): the activity context should be retrieved inside JsDialogHelper.showDialog - // but for that we need it to return a boolean. Also, doing it here means that we can fix - // problem 2 in crbug/447607 before M is released. new JsDialogHelper(res, jsDialogType, defaultValue, message, url) - .showDialog(mContext); + .showDialog(activityContext); return true; }
diff --git a/android_webview/java/src/org/chromium/android_webview/AwContents.java b/android_webview/java/src/org/chromium/android_webview/AwContents.java index 7ec965f..a710d51 100644 --- a/android_webview/java/src/org/chromium/android_webview/AwContents.java +++ b/android_webview/java/src/org/chromium/android_webview/AwContents.java
@@ -69,7 +69,6 @@ import org.chromium.content_public.browser.navigation_controller.UserAgentOverrideOption; import org.chromium.content_public.common.Referrer; import org.chromium.net.NetError; -import org.chromium.net.NetworkChangeNotifier; import org.chromium.ui.base.ActivityWindowAndroid; import org.chromium.ui.base.PageTransition; import org.chromium.ui.base.WindowAndroid; @@ -2537,13 +2536,7 @@ public void setNetworkAvailable(boolean networkUp) { if (TRACE) Log.d(TAG, "setNetworkAvailable=%s", networkUp); - if (!isDestroyed(WARN)) { - // For backward compatibility when an app uses this API disable the - // Network Information API to prevent inconsistencies, - // see crbug.com/520088. - NetworkChangeNotifier.setAutoDetectConnectivityState(false); - nativeSetJsOnlineProperty(mNativeAwContents, networkUp); - } + if (!isDestroyed(WARN)) nativeSetJsOnlineProperty(mNativeAwContents, networkUp); } /**
diff --git a/android_webview/java/src/org/chromium/android_webview/AwNetworkChangeNotifierRegistrationPolicy.java b/android_webview/java/src/org/chromium/android_webview/AwNetworkChangeNotifierRegistrationPolicy.java deleted file mode 100644 index 798a9af..0000000 --- a/android_webview/java/src/org/chromium/android_webview/AwNetworkChangeNotifierRegistrationPolicy.java +++ /dev/null
@@ -1,37 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.android_webview; - -import org.chromium.net.NetworkChangeNotifierAutoDetect; - -/** - * Registration policy to make sure we only listen to network changes when - * there are live webview instances. - */ -public class AwNetworkChangeNotifierRegistrationPolicy - extends NetworkChangeNotifierAutoDetect.RegistrationPolicy - implements AwContentsLifecycleNotifier.Observer { - - @Override - protected void init(NetworkChangeNotifierAutoDetect notifier) { - super.init(notifier); - AwContentsLifecycleNotifier.addObserver(this); - } - - protected void destroy() { - AwContentsLifecycleNotifier.removeObserver(this); - } - - // AwContentsLifecycleNotifier.Observer - @Override - public void onFirstWebViewCreated() { - register(); - } - - @Override - public void onLastWebViewDestroyed() { - unregister(); - } -}
diff --git a/android_webview/lib/main/aw_main_delegate.cc b/android_webview/lib/main/aw_main_delegate.cc index a812e16..cdc9ba59c 100644 --- a/android_webview/lib/main/aw_main_delegate.cc +++ b/android_webview/lib/main/aw_main_delegate.cc
@@ -72,6 +72,7 @@ ->set_fling_touchscreen_tap_suppression_enabled(false); base::CommandLine* cl = base::CommandLine::ForCurrentProcess(); + cl->AppendSwitch(switches::kIPCSyncCompositing); cl->AppendSwitch(cc::switches::kEnableBeginFrameScheduling); // WebView uses the Android system's scrollbars and overscroll glow. @@ -139,9 +140,6 @@ cl->AppendSwitch(switches::kDisableRendererBackgrounding); } - // Enabled temporarily to gather performance metrics. - cl->AppendSwitch(switches::kIPCSyncCompositing); - return false; }
diff --git a/android_webview/renderer/aw_render_frame_ext.cc b/android_webview/renderer/aw_render_frame_ext.cc index a5d3491..673cc5a 100644 --- a/android_webview/renderer/aw_render_frame_ext.cc +++ b/android_webview/renderer/aw_render_frame_ext.cc
@@ -15,6 +15,7 @@ #include "third_party/WebKit/public/web/WebDocument.h" #include "third_party/WebKit/public/web/WebElement.h" #include "third_party/WebKit/public/web/WebElementCollection.h" +#include "third_party/WebKit/public/web/WebFrameWidget.h" #include "third_party/WebKit/public/web/WebHitTestResult.h" #include "third_party/WebKit/public/web/WebLocalFrame.h" #include "third_party/WebKit/public/web/WebMeaningfulLayout.h" @@ -253,11 +254,11 @@ } void AwRenderFrameExt::OnSetBackgroundColor(SkColor c) { - blink::WebView* webview = GetWebView(); - if (!webview) + blink::WebFrameWidget* web_frame_widget = GetWebFrameWidget(); + if (!web_frame_widget) return; - webview->setBaseBackgroundColor(c); + web_frame_widget->setBaseBackgroundColor(c); } void AwRenderFrameExt::OnSmoothScroll(int target_x, @@ -278,4 +279,11 @@ return render_frame()->GetRenderView()->GetWebView(); } +blink::WebFrameWidget* AwRenderFrameExt::GetWebFrameWidget() { + if (!render_frame() || !render_frame()->GetRenderView()) + return nullptr; + + return render_frame()->GetRenderView()->GetWebFrameWidget(); +} + } // namespace android_webview
diff --git a/android_webview/renderer/aw_render_frame_ext.h b/android_webview/renderer/aw_render_frame_ext.h index 804f281a..09c9853 100644 --- a/android_webview/renderer/aw_render_frame_ext.h +++ b/android_webview/renderer/aw_render_frame_ext.h
@@ -13,6 +13,7 @@ namespace blink { enum WebMeaningfulLayout; +class WebFrameWidget; class WebView; } @@ -50,6 +51,7 @@ void OnSmoothScroll(int target_x, int target_y, int duration_ms); blink::WebView* GetWebView(); + blink::WebFrameWidget* GetWebFrameWidget(); DISALLOW_COPY_AND_ASSIGN(AwRenderFrameExt); };
diff --git a/ash/ash.gyp b/ash/ash.gyp index e39e0196..cd1e630 100644 --- a/ash/ash.gyp +++ b/ash/ash.gyp
@@ -982,6 +982,7 @@ '../ui/gfx/gfx.gyp:gfx_vector_icons', '../ui/keyboard/keyboard.gyp:keyboard', '../ui/message_center/message_center.gyp:message_center', + '../ui/native_theme/native_theme.gyp:native_theme', '../ui/platform_window/stub/stub_window.gyp:stub_window', '../ui/resources/ui_resources.gyp:ui_resources', '../ui/strings/ui_strings.gyp:ui_strings',
diff --git a/base/message_loop/message_loop.cc b/base/message_loop/message_loop.cc index 88f75e91e..04aa9a8 100644 --- a/base/message_loop/message_loop.cc +++ b/base/message_loop/message_loop.cc
@@ -436,17 +436,7 @@ void MessageLoop::RunHandler() { DCHECK_EQ(this, current()); - StartHistogrammer(); - -#if defined(OS_WIN) - if (run_loop_->dispatcher_ && type() == TYPE_UI) { - static_cast<MessagePumpForUI*>(pump_.get())-> - RunWithDispatcher(this, run_loop_->dispatcher_); - return; - } -#endif - pump_->Run(this); }
diff --git a/base/message_loop/message_loop_unittest.cc b/base/message_loop/message_loop_unittest.cc index 1a3a9257..a06ba91 100644 --- a/base/message_loop/message_loop_unittest.cc +++ b/base/message_loop/message_loop_unittest.cc
@@ -27,7 +27,6 @@ #include "testing/gtest/include/gtest/gtest.h" #if defined(OS_WIN) -#include "base/message_loop/message_pump_dispatcher.h" #include "base/message_loop/message_pump_win.h" #include "base/process/memory.h" #include "base/strings/string16.h" @@ -426,70 +425,6 @@ #if defined(OS_WIN) -class DispatcherImpl : public MessagePumpDispatcher { - public: - DispatcherImpl() : dispatch_count_(0) {} - - uint32_t Dispatch(const NativeEvent& msg) override { - ::TranslateMessage(&msg); - ::DispatchMessage(&msg); - // Do not count WM_TIMER since it is not what we post and it will cause - // flakiness. - if (msg.message != WM_TIMER) - ++dispatch_count_; - // We treat WM_LBUTTONUP as the last message. - return msg.message == WM_LBUTTONUP ? POST_DISPATCH_QUIT_LOOP - : POST_DISPATCH_NONE; - } - - int dispatch_count_; -}; - -void MouseDownUp() { - PostMessage(NULL, WM_LBUTTONDOWN, 0, 0); - PostMessage(NULL, WM_LBUTTONUP, 'A', 0); -} - -void RunTest_Dispatcher(MessageLoop::Type message_loop_type) { - MessageLoop loop(message_loop_type); - - MessageLoop::current()->PostDelayedTask( - FROM_HERE, - Bind(&MouseDownUp), - TimeDelta::FromMilliseconds(100)); - DispatcherImpl dispatcher; - RunLoop run_loop(&dispatcher); - run_loop.Run(); - ASSERT_EQ(2, dispatcher.dispatch_count_); -} - -LRESULT CALLBACK MsgFilterProc(int code, WPARAM wparam, LPARAM lparam) { - if (code == MessagePumpForUI::kMessageFilterCode) { - MSG* msg = reinterpret_cast<MSG*>(lparam); - if (msg->message == WM_LBUTTONDOWN) - return TRUE; - } - return FALSE; -} - -void RunTest_DispatcherWithMessageHook(MessageLoop::Type message_loop_type) { - MessageLoop loop(message_loop_type); - - MessageLoop::current()->PostDelayedTask( - FROM_HERE, - Bind(&MouseDownUp), - TimeDelta::FromMilliseconds(100)); - HHOOK msg_hook = SetWindowsHookEx(WH_MSGFILTER, - MsgFilterProc, - NULL, - GetCurrentThreadId()); - DispatcherImpl dispatcher; - RunLoop run_loop(&dispatcher); - run_loop.Run(); - ASSERT_EQ(1, dispatcher.dispatch_count_); - UnhookWindowsHookEx(msg_hook); -} - class TestIOHandler : public MessageLoopForIO::IOHandler { public: TestIOHandler(const wchar_t* name, HANDLE signal, bool wait); @@ -711,16 +646,6 @@ } #if defined(OS_WIN) -TEST(MessageLoopTest, Dispatcher) { - // This test requires a UI loop - RunTest_Dispatcher(MessageLoop::TYPE_UI); -} - -TEST(MessageLoopTest, DispatcherWithMessageHook) { - // This test requires a UI loop - RunTest_DispatcherWithMessageHook(MessageLoop::TYPE_UI); -} - TEST(MessageLoopTest, IOHandler) { RunTest_IOHandler(); }
diff --git a/base/message_loop/message_pump_dispatcher.h b/base/message_loop/message_pump_dispatcher.h deleted file mode 100644 index 5b1bd55..0000000 --- a/base/message_loop/message_pump_dispatcher.h +++ /dev/null
@@ -1,43 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef BASE_MESSAGE_LOOP_MESSAGE_PUMP_DISPATCHER_H_ -#define BASE_MESSAGE_LOOP_MESSAGE_PUMP_DISPATCHER_H_ - -#include <stdint.h> - -#include "base/base_export.h" -#include "base/event_types.h" - -namespace base { - -// Dispatcher is used during a nested invocation of Run to dispatch events when -// |RunLoop(dispatcher).Run()| is used. If |RunLoop().Run()| is invoked, -// MessageLoop does not dispatch events (or invoke TranslateMessage), rather -// every message is passed to Dispatcher's Dispatch method for dispatch. It is -// up to the Dispatcher whether or not to dispatch the event. -// -// The nested loop is exited by either posting a quit, or setting the -// POST_DISPATCH_QUIT_LOOP flag on the return value from Dispatch. -class BASE_EXPORT MessagePumpDispatcher { - public: - enum PostDispatchAction { - POST_DISPATCH_NONE = 0x0, - POST_DISPATCH_QUIT_LOOP = 0x1, - POST_DISPATCH_PERFORM_DEFAULT = 0x2, - }; - - virtual ~MessagePumpDispatcher() {} - - // Dispatches the event. The return value can have more than one - // PostDispatchAction flags OR'ed together. If POST_DISPATCH_PERFORM_DEFAULT - // is set in the returned value, then the message-pump performs the default - // action. If POST_DISPATCH_QUIT_LOOP is set, in the return value, then the - // nested loop exits immediately. - virtual uint32_t Dispatch(const NativeEvent& event) = 0; -}; - -} // namespace base - -#endif // BASE_MESSAGE_LOOP_MESSAGE_PUMP_DISPATCHER_H_
diff --git a/base/message_loop/message_pump_win.cc b/base/message_loop/message_pump_win.cc index e7246fe..803bb5d 100644 --- a/base/message_loop/message_pump_win.cc +++ b/base/message_loop/message_pump_win.cc
@@ -38,11 +38,9 @@ //----------------------------------------------------------------------------- // MessagePumpWin public: -void MessagePumpWin::RunWithDispatcher( - Delegate* delegate, MessagePumpDispatcher* dispatcher) { +void MessagePumpWin::Run(Delegate* delegate) { RunState s; s.delegate = delegate; - s.dispatcher = dispatcher; s.should_quit = false; s.run_depth = state_ ? state_->run_depth + 1 : 1; @@ -54,10 +52,6 @@ state_ = previous_state; } -void MessagePumpWin::Run(Delegate* delegate) { - RunWithDispatcher(delegate, NULL); -} - void MessagePumpWin::Quit() { DCHECK(state_); state_->should_quit = true; @@ -369,15 +363,8 @@ if (CallMsgFilter(const_cast<MSG*>(&msg), kMessageFilterCode)) return true; - uint32_t action = MessagePumpDispatcher::POST_DISPATCH_PERFORM_DEFAULT; - if (state_->dispatcher) - action = state_->dispatcher->Dispatch(msg); - if (action & MessagePumpDispatcher::POST_DISPATCH_QUIT_LOOP) - state_->should_quit = true; - if (action & MessagePumpDispatcher::POST_DISPATCH_PERFORM_DEFAULT) { - TranslateMessage(&msg); - DispatchMessage(&msg); - } + TranslateMessage(&msg); + DispatchMessage(&msg); return true; }
diff --git a/base/message_loop/message_pump_win.h b/base/message_loop/message_pump_win.h index 257ccc92..6f4b699 100644 --- a/base/message_loop/message_pump_win.h +++ b/base/message_loop/message_pump_win.h
@@ -11,7 +11,6 @@ #include "base/base_export.h" #include "base/message_loop/message_pump.h" -#include "base/message_loop/message_pump_dispatcher.h" #include "base/observer_list.h" #include "base/time/time.h" #include "base/win/scoped_handle.h" @@ -25,9 +24,6 @@ public: MessagePumpWin() : have_work_(0), state_(NULL) {} - // Like MessagePump::Run, but MSG objects are routed through dispatcher. - void RunWithDispatcher(Delegate* delegate, MessagePumpDispatcher* dispatcher); - // MessagePump methods: void Run(Delegate* delegate) override; void Quit() override; @@ -35,7 +31,6 @@ protected: struct RunState { Delegate* delegate; - MessagePumpDispatcher* dispatcher; // Used to flag that the current Run() invocation should return ASAP. bool should_quit;
diff --git a/base/process/launch_win.cc b/base/process/launch_win.cc index 1ffb979..985dccc 100644 --- a/base/process/launch_win.cc +++ b/base/process/launch_win.cc
@@ -232,6 +232,13 @@ return Process(); } + // Ensure the handles can be inherited. + for (HANDLE handle : *options.handles_to_inherit) { + BOOL result = SetHandleInformation(handle, HANDLE_FLAG_INHERIT, + HANDLE_FLAG_INHERIT); + PCHECK(result); + } + if (!startup_info_wrapper.InitializeProcThreadAttributeList(1)) { DPLOG(ERROR); return Process();
diff --git a/base/run_loop.cc b/base/run_loop.cc index b8558db4..af2c568d 100644 --- a/base/run_loop.cc +++ b/base/run_loop.cc
@@ -8,10 +8,6 @@ #include "base/tracked_objects.h" #include "build/build_config.h" -#if defined(OS_WIN) -#include "base/message_loop/message_pump_dispatcher.h" -#endif - namespace base { RunLoop::RunLoop() @@ -23,25 +19,8 @@ running_(false), quit_when_idle_received_(false), weak_factory_(this) { -#if defined(OS_WIN) - dispatcher_ = NULL; -#endif } -#if defined(OS_WIN) -RunLoop::RunLoop(MessagePumpDispatcher* dispatcher) - : loop_(MessageLoop::current()), - previous_run_loop_(NULL), - dispatcher_(dispatcher), - run_depth_(0), - run_called_(false), - quit_called_(false), - running_(false), - quit_when_idle_received_(false), - weak_factory_(this) { -} -#endif - RunLoop::~RunLoop() { }
diff --git a/base/run_loop.h b/base/run_loop.h index 2c1cde1..61b0fe1 100644 --- a/base/run_loop.h +++ b/base/run_loop.h
@@ -17,10 +17,6 @@ class MessagePumpForUI; #endif -#if defined(OS_WIN) -class MessagePumpDispatcher; -#endif - #if defined(OS_IOS) class MessagePumpUIApplication; #endif @@ -33,9 +29,6 @@ class BASE_EXPORT RunLoop { public: RunLoop(); -#if defined(OS_WIN) - explicit RunLoop(MessagePumpDispatcher* dispatcher); -#endif ~RunLoop(); // Run the current MessageLoop. This blocks until Quit is called. Before @@ -95,10 +88,6 @@ // Parent RunLoop or NULL if this is the top-most RunLoop. RunLoop* previous_run_loop_; -#if defined(OS_WIN) - MessagePumpDispatcher* dispatcher_; -#endif - // Used to count how many nested Run() invocations are on the stack. int run_depth_;
diff --git a/base/strings/string_number_conversions.cc b/base/strings/string_number_conversions.cc index 0724850..f4cf6ec 100644 --- a/base/strings/string_number_conversions.cc +++ b/base/strings/string_number_conversions.cc
@@ -146,6 +146,7 @@ if (begin != end && *begin == '-') { if (!std::numeric_limits<value_type>::is_signed) { + *output = 0; valid = false; } else if (!Negative::Invoke(begin + 1, end, output)) { valid = false;
diff --git a/base/strings/string_number_conversions_unittest.cc b/base/strings/string_number_conversions_unittest.cc index 907227e..0cc71a6 100644 --- a/base/strings/string_number_conversions_unittest.cc +++ b/base/strings/string_number_conversions_unittest.cc
@@ -137,12 +137,12 @@ }; for (size_t i = 0; i < arraysize(cases); ++i) { - int output = 0; + int output = cases[i].output ^ 1; // Ensure StringToInt wrote something. EXPECT_EQ(cases[i].success, StringToInt(cases[i].input, &output)); EXPECT_EQ(cases[i].output, output); string16 utf16_input = UTF8ToUTF16(cases[i].input); - output = 0; + output = cases[i].output ^ 1; // Ensure StringToInt wrote something. EXPECT_EQ(cases[i].success, StringToInt(utf16_input, &output)); EXPECT_EQ(cases[i].output, output); } @@ -201,12 +201,13 @@ }; for (size_t i = 0; i < arraysize(cases); ++i) { - unsigned output = 0; + unsigned output = + cases[i].output ^ 1; // Ensure StringToUint wrote something. EXPECT_EQ(cases[i].success, StringToUint(cases[i].input, &output)); EXPECT_EQ(cases[i].output, output); string16 utf16_input = UTF8ToUTF16(cases[i].input); - output = 0; + output = cases[i].output ^ 1; // Ensure StringToUint wrote something. EXPECT_EQ(cases[i].success, StringToUint(utf16_input, &output)); EXPECT_EQ(cases[i].output, output); }
diff --git a/blimp/client/app/android/java/src/org/chromium/blimp/BlimpView.java b/blimp/client/app/android/java/src/org/chromium/blimp/BlimpView.java index c86c94b..212d15db 100644 --- a/blimp/client/app/android/java/src/org/chromium/blimp/BlimpView.java +++ b/blimp/client/app/android/java/src/org/chromium/blimp/BlimpView.java
@@ -53,10 +53,9 @@ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { windowManager.getDefaultDisplay().getRealSize(physicalSize); } - // TODO(dtrainor): Change 1.f to dpToPx once native fully supports dp. - float compositorDensity = 1.f; + float deviceScaleFactor = getContext().getResources().getDisplayMetrics().density; mNativeBlimpViewPtr = nativeInit(blimpClientSession, physicalSize.x, physicalSize.y, - displaySize.x, displaySize.y, compositorDensity); + displaySize.x, displaySize.y, deviceScaleFactor); getHolder().addCallback(this); setVisibility(VISIBLE); }
diff --git a/blimp/client/feature/navigation_feature.cc b/blimp/client/feature/navigation_feature.cc index 43bacec..529ca28 100644 --- a/blimp/client/feature/navigation_feature.cc +++ b/blimp/client/feature/navigation_feature.cc
@@ -93,7 +93,7 @@ switch (navigation_message.type()) { case NavigationMessage::NAVIGATION_STATE_CHANGED: { const NavigationStateChangeMessage& details = - navigation_message.navigation_state_change(); + navigation_message.navigation_state_changed(); if (details.has_url()) delegate->OnUrlChanged(tab_id, GURL(details.url()));
diff --git a/blimp/client/feature/navigation_feature_unittest.cc b/blimp/client/feature/navigation_feature_unittest.cc index e3edbf2..b016e45 100644 --- a/blimp/client/feature/navigation_feature_unittest.cc +++ b/blimp/client/feature/navigation_feature_unittest.cc
@@ -41,7 +41,7 @@ CreateBlimpMessage(&navigation_message, tab_id); navigation_message->set_type(NavigationMessage::NAVIGATION_STATE_CHANGED); NavigationStateChangeMessage* state = - navigation_message->mutable_navigation_state_change(); + navigation_message->mutable_navigation_state_changed(); if (url) state->set_url(url->spec());
diff --git a/blimp/common/proto/navigation.proto b/blimp/common/proto/navigation.proto index 7c62503..68b536c 100644 --- a/blimp/common/proto/navigation.proto +++ b/blimp/common/proto/navigation.proto
@@ -54,6 +54,6 @@ optional Type type = 1; - optional NavigationStateChangeMessage navigation_state_change = 1000; + optional NavigationStateChangeMessage navigation_state_changed = 1000; optional LoadUrlMessage load_url = 1001; }
diff --git a/blimp/engine/session/blimp_engine_session.cc b/blimp/engine/session/blimp_engine_session.cc index 3196722..e867b37 100644 --- a/blimp/engine/session/blimp_engine_session.cc +++ b/blimp/engine/session/blimp_engine_session.cc
@@ -459,7 +459,7 @@ CreateBlimpMessage(&navigation_message, kDummyTabId); navigation_message->set_type(NavigationMessage::NAVIGATION_STATE_CHANGED); NavigationStateChangeMessage* details = - navigation_message->mutable_navigation_state_change(); + navigation_message->mutable_navigation_state_changed(); if (changed_flags & content::InvalidateTypes::INVALIDATE_TYPE_URL) details->set_url(source->GetURL().spec());
diff --git a/blimp/net/common.cc b/blimp/net/common.cc index c4f0148..25eb09c 100644 --- a/blimp/net/common.cc +++ b/blimp/net/common.cc
@@ -11,7 +11,7 @@ namespace blimp { -const size_t kMaxPacketPayloadSizeBytes = 1 << 16; // 64KB +const size_t kMaxPacketPayloadSizeBytes = 1024 * 1024; // 1MB const size_t kPacketHeaderSizeBytes = 4; std::ostream& operator<<(std::ostream& out, const BlimpMessage& message) {
diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn index accbed0..ce2f609 100644 --- a/build/config/compiler/BUILD.gn +++ b/build/config/compiler/BUILD.gn
@@ -619,7 +619,7 @@ # configs -= [ "//build/config/compiler:clang_stackrealign" ] # See https://crbug.com/556393 for details of where it must be avoided. config("clang_stackrealign") { - if (is_clang && current_cpu == "x86" && !is_nacl) { + if (is_clang && current_cpu == "x86" && is_linux) { cflags = [ # Align the stack on 16-byte boundaries, http://crbug.com/418554. "-mstack-alignment=16",
diff --git a/build/toolchain/android/BUILD.gn b/build/toolchain/android/BUILD.gn index c2b82f3..2e47b2d 100644 --- a/build/toolchain/android/BUILD.gn +++ b/build/toolchain/android/BUILD.gn
@@ -13,8 +13,6 @@ # Sysroot for this architecture. # - android_ndk_lib_dir # Subdirectory inside of android_ndk_sysroot where libs go. -# - tool_prefix -# Prefix to be added to the tool names. # - toolchain_cpu # Same as gcc_toolchain template("android_gcc_toolchain") { @@ -31,7 +29,7 @@ solink_libs_section_postfix = "$android_ndk_lib/crtend_so.o" # The tools should be run relative to the build dir. - tool_prefix = rebase_path(invoker.tool_prefix, root_build_dir) + tool_prefix = rebase_path("$android_tool_prefix", root_build_dir) is_clang = invoker.is_clang if (is_clang) { @@ -62,14 +60,12 @@ android_gcc_toolchain(target_name) { android_ndk_sysroot = invoker.android_ndk_sysroot android_ndk_lib_dir = invoker.android_ndk_lib_dir - tool_prefix = invoker.tool_prefix toolchain_cpu = invoker.toolchain_cpu } android_gcc_toolchain("clang_$target_name") { android_ndk_sysroot = invoker.android_ndk_sysroot android_ndk_lib_dir = invoker.android_ndk_lib_dir - tool_prefix = invoker.tool_prefix toolchain_cpu = invoker.toolchain_cpu is_clang = true } @@ -79,7 +75,6 @@ android_ndk_sysroot = "$android_ndk_root/$x86_android_sysroot_subdir" android_ndk_lib_dir = "usr/lib" - tool_prefix = "$x86_android_toolchain_root/bin/i686-linux-android-" toolchain_cpu = "x86" } @@ -87,7 +82,6 @@ android_ndk_sysroot = "$android_ndk_root/$arm_android_sysroot_subdir" android_ndk_lib_dir = "usr/lib" - tool_prefix = "$arm_android_toolchain_root/bin/arm-linux-androideabi-" toolchain_cpu = "arm" } @@ -95,7 +89,6 @@ android_ndk_sysroot = "$android_ndk_root/$mips_android_sysroot_subdir" android_ndk_lib_dir = "usr/lib" - tool_prefix = "$mips_android_toolchain_root/bin/mipsel-linux-android-" toolchain_cpu = "mipsel" } @@ -103,7 +96,6 @@ android_ndk_sysroot = "$android_ndk_root/$x86_64_android_sysroot_subdir" android_ndk_lib_dir = "usr/lib64" - tool_prefix = "$x86_64_android_toolchain_root/bin/x86_64-linux-android-" toolchain_cpu = "x86_64" } @@ -111,7 +103,6 @@ android_ndk_sysroot = "$android_ndk_root/$arm64_android_sysroot_subdir" android_ndk_lib_dir = "usr/lib" - tool_prefix = "$arm64_android_toolchain_root/bin/aarch64-linux-android-" toolchain_cpu = "aarch64" } @@ -119,6 +110,5 @@ android_ndk_sysroot = "$android_ndk_root/$mips64_android_sysroot_subdir" android_ndk_lib_dir = "usr/lib64" - tool_prefix = "$mips64_android_toolchain_root/bin/mips64el-linux-android-" toolchain_cpu = "mipsel64el" }
diff --git a/cc/animation/OWNERS b/cc/animation/OWNERS new file mode 100644 index 0000000..ed0b8de --- /dev/null +++ b/cc/animation/OWNERS
@@ -0,0 +1 @@ +loyso@chromium.org
diff --git a/chrome/android/java/AndroidManifest.xml b/chrome/android/java/AndroidManifest.xml index c436e7b..369ba35 100644 --- a/chrome/android/java/AndroidManifest.xml +++ b/chrome/android/java/AndroidManifest.xml
@@ -262,9 +262,6 @@ android:windowSoftInputMode="stateHidden|adjustPan" android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc"> </activity> - <activity android:name="org.chromium.chrome.browser.signin.AccountSigninActivity" - android:theme="@style/MainTheme"> - </activity> <activity android:name="org.chromium.chrome.browser.preferences.Preferences" android:theme="@style/PreferencesTheme" android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc"
diff --git a/chrome/android/java/res/drawable-hdpi/offline_bolt.png b/chrome/android/java/res/drawable-hdpi/offline_bolt.png index 8ca6de8..7fda6ae 100644 --- a/chrome/android/java/res/drawable-hdpi/offline_bolt.png +++ b/chrome/android/java/res/drawable-hdpi/offline_bolt.png Binary files differ
diff --git a/chrome/android/java/res/drawable-hdpi/offline_bolt_light.png b/chrome/android/java/res/drawable-hdpi/offline_bolt_light.png new file mode 100644 index 0000000..2b8ac85 --- /dev/null +++ b/chrome/android/java/res/drawable-hdpi/offline_bolt_light.png Binary files differ
diff --git a/chrome/android/java/res/drawable-mdpi/offline_bolt.png b/chrome/android/java/res/drawable-mdpi/offline_bolt.png index ea61cc2..49e7778 100644 --- a/chrome/android/java/res/drawable-mdpi/offline_bolt.png +++ b/chrome/android/java/res/drawable-mdpi/offline_bolt.png Binary files differ
diff --git a/chrome/android/java/res/drawable-mdpi/offline_bolt_light.png b/chrome/android/java/res/drawable-mdpi/offline_bolt_light.png new file mode 100644 index 0000000..ff582c6 --- /dev/null +++ b/chrome/android/java/res/drawable-mdpi/offline_bolt_light.png Binary files differ
diff --git a/chrome/android/java/res/drawable-xhdpi/offline_bolt.png b/chrome/android/java/res/drawable-xhdpi/offline_bolt.png index 2ac89ec98..2f3cd79 100644 --- a/chrome/android/java/res/drawable-xhdpi/offline_bolt.png +++ b/chrome/android/java/res/drawable-xhdpi/offline_bolt.png Binary files differ
diff --git a/chrome/android/java/res/drawable-xhdpi/offline_bolt_light.png b/chrome/android/java/res/drawable-xhdpi/offline_bolt_light.png new file mode 100644 index 0000000..b48db80 --- /dev/null +++ b/chrome/android/java/res/drawable-xhdpi/offline_bolt_light.png Binary files differ
diff --git a/chrome/android/java/res/drawable-xxhdpi/offline_bolt.png b/chrome/android/java/res/drawable-xxhdpi/offline_bolt.png index 3c5ef9f5..3c01228 100644 --- a/chrome/android/java/res/drawable-xxhdpi/offline_bolt.png +++ b/chrome/android/java/res/drawable-xxhdpi/offline_bolt.png Binary files differ
diff --git a/chrome/android/java/res/drawable-xxhdpi/offline_bolt_light.png b/chrome/android/java/res/drawable-xxhdpi/offline_bolt_light.png new file mode 100644 index 0000000..cf9b0d6 --- /dev/null +++ b/chrome/android/java/res/drawable-xxhdpi/offline_bolt_light.png Binary files differ
diff --git a/chrome/android/java/res/drawable-xxxhdpi/offline_bolt.png b/chrome/android/java/res/drawable-xxxhdpi/offline_bolt.png index 95b5f6d0..a40ec568 100644 --- a/chrome/android/java/res/drawable-xxxhdpi/offline_bolt.png +++ b/chrome/android/java/res/drawable-xxxhdpi/offline_bolt.png Binary files differ
diff --git a/chrome/android/java/res/drawable-xxxhdpi/offline_bolt_light.png b/chrome/android/java/res/drawable-xxxhdpi/offline_bolt_light.png new file mode 100644 index 0000000..2c6c38a --- /dev/null +++ b/chrome/android/java/res/drawable-xxxhdpi/offline_bolt_light.png Binary files differ
diff --git a/chrome/android/java/res/layout/account_signin_view.xml b/chrome/android/java/res/layout/account_signin_view.xml deleted file mode 100644 index c123d79..0000000 --- a/chrome/android/java/res/layout/account_signin_view.xml +++ /dev/null
@@ -1,128 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright 2015 The Chromium Authors. All rights reserved. - - Use of this source code is governed by a BSD-style license that can be - found in the LICENSE file. ---> -<org.chromium.chrome.browser.signin.AccountSigninView - xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:chrome="http://schemas.android.com/apk/res-auto" - android:layout_width="match_parent" - android:layout_height="match_parent"> - - <ScrollView - android:layout_width="match_parent" - android:layout_height="match_parent" - android:layout_marginBottom="@dimen/fre_button_bar_height" - android:fillViewport="true"> - - <LinearLayout - android:id="@+id/fre_main_layout" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="vertical" - android:gravity="center_horizontal"> - - <TextView - android:id="@+id/title" - android:text="@string/signin_set_up_chrome" - style="@style/FreTitle"/> - - <!-- The orientation of this view is changed dynamically to give a nicer layout when in - landscape mode on devices with small screens. --> - <LinearLayout - android:id="@+id/fre_image_and_content" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="vertical" - android:gravity="center_horizontal" - android:layout_marginTop="@dimen/fre_vertical_spacing"> - - <org.chromium.chrome.browser.firstrun.ImageCarousel - android:id="@+id/image" - android:layout_width="@dimen/signin_image_carousel_width" - android:layout_height="@dimen/fre_image_height" /> - - <LinearLayout - android:id="@+id/fre_content_wrapper" - android:layout_width="0dp" - android:layout_height="0dp" - android:layout_weight="1" - android:layout_marginTop="@dimen/fre_vertical_spacing" - android:layout_marginEnd="@dimen/fre_content_margin" - android:layout_marginStart="@dimen/fre_content_margin" - android:orientation="vertical" > - - <Spinner - style="@style/Widget.AppCompat.Spinner.Underlined" - android:id="@+id/google_accounts_spinner" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginBottom="@dimen/fre_vertical_spacing" - android:layout_gravity="center_horizontal" - android:popupBackground="#ffffff" - android:textColor="@color/fre_text_color" /> - - <org.chromium.ui.widget.TextViewWithClickableSpans - android:id="@+id/description" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:gravity="center" - android:lineSpacingMultiplier="1.4" - android:text="@string/signin_account_choice_description" - android:textColor="@color/signin_light_text_color" - android:textSize="@dimen/fre_normal_text_size" /> - </LinearLayout> - - </LinearLayout> - </LinearLayout> - </ScrollView> - - <LinearLayout - android:id="@+id/button_bar" - android:layout_width="match_parent" - android:layout_height="@dimen/fre_button_bar_height" - android:layout_gravity="bottom" - android:orientation="horizontal" - android:paddingStart="16dp" - android:paddingEnd="16dp" > - - <!--suppress ButtonStyle --> - <Button - android:id="@+id/negative_button" - style="@style/ButtonCompatBorderless" - android:layout_width="wrap_content" - android:layout_height="36dp" - android:text="@string/fre_skip_text" - android:textAllCaps="true" - android:textColor="@color/light_active_color" - android:textSize="14sp" - android:layout_marginBottom="24dp" /> - - <View - android:layout_width="0dp" - android:layout_height="0dp" - android:layout_weight="1" - android:visibility="invisible"/> - - <!--suppress ButtonStyle --> - <org.chromium.ui.widget.ButtonCompat - android:id="@+id/positive_button" - android:layout_width="wrap_content" - android:layout_height="36dp" - android:text="@string/choose_account_sign_in" - android:textAllCaps="true" - android:textColor="@android:color/white" - android:textSize="14sp" - chrome:buttonColor="@color/light_active_color" - android:layout_marginBottom="24dp" /> - - <View - android:id="@+id/positive_button_end_padding" - android:layout_width="0dp" - android:layout_height="0dp" - android:layout_weight="1" - android:visibility="gone"/> - </LinearLayout> - -</org.chromium.chrome.browser.signin.AccountSigninView>
diff --git a/chrome/android/java/res/layout/confirm_import_sync_data.xml b/chrome/android/java/res/layout/confirm_import_sync_data.xml deleted file mode 100644 index 5e6d1e9a..0000000 --- a/chrome/android/java/res/layout/confirm_import_sync_data.xml +++ /dev/null
@@ -1,42 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright 2016 The Chromium Authors. All rights reserved. - Use of this source code is governed by a BSD-style license that can be - found in the LICENSE file. --> - -<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:overScrollMode="ifContentScrolls" - android:paddingEnd="25dp" - android:paddingStart="25dp"> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="vertical" - android:paddingTop="8dp"> - - <TextView - android:id="@+id/sync_import_data_prompt" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:textColor="#de000000" - android:textSize="16sp" /> - - <org.chromium.chrome.browser.widget.RadioButtonWithDescription - android:id="@+id/sync_confirm_import_choice" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:paddingTop="16dp" - app:titleText="@string/sync_import_existing_data" /> - - <org.chromium.chrome.browser.widget.RadioButtonWithDescription - android:id="@+id/sync_keep_separate_choice" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:paddingTop="16dp" - app:titleText="@string/sync_keep_existing_data_separate" /> - - </LinearLayout> -</ScrollView> \ No newline at end of file
diff --git a/chrome/android/java/res/layout/confirm_sync_account_change_account.xml b/chrome/android/java/res/layout/confirm_sync_account_change_account.xml new file mode 100644 index 0000000..d4c7d91 --- /dev/null +++ b/chrome/android/java/res/layout/confirm_sync_account_change_account.xml
@@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright 2015 The Chromium Authors. All rights reserved. + Use of this source code is governed by a BSD-style license that can be + found in the LICENSE file. --> + +<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:overScrollMode="ifContentScrolls" + android:paddingBottom="12dp" + android:paddingEnd="10dp" + android:paddingStart="14dp" + android:paddingTop="2dp" > + <org.chromium.ui.widget.TextViewWithClickableSpans + android:id="@+id/confirmMessage" + style="?android:attr/textAppearanceMedium" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:bufferType="spannable" + android:padding="5dp" /> +</ScrollView>
diff --git a/chrome/android/java/res/layout/custom_tabs_bottombar.xml b/chrome/android/java/res/layout/custom_tabs_bottombar.xml index 3651d624..5df714f 100644 --- a/chrome/android/java/res/layout/custom_tabs_bottombar.xml +++ b/chrome/android/java/res/layout/custom_tabs_bottombar.xml
@@ -2,9 +2,10 @@ <!-- Copyright 2015 The Chromium Authors. All rights reserved. Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. --> -<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" +<org.chromium.chrome.browser.widget.BoundedLinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:chrome="http://schemas.android.com/apk/res-auto" android:id="@+id/bottombar" android:layout_width="match_parent" - android:layout_height="@dimen/toolbar_height_no_shadow" - android:orientation="horizontal" > -</LinearLayout> \ No newline at end of file + android:layout_height="wrap_content" + android:orientation="horizontal" + chrome:maxHeight="@dimen/toolbar_height_no_shadow" /> \ No newline at end of file
diff --git a/chrome/android/java/res/layout/fre_choose_account.xml b/chrome/android/java/res/layout/fre_choose_account.xml new file mode 100644 index 0000000..b6bccdda --- /dev/null +++ b/chrome/android/java/res/layout/fre_choose_account.xml
@@ -0,0 +1,153 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright 2015 The Chromium Authors. All rights reserved. + + Use of this source code is governed by a BSD-style license that can be + found in the LICENSE file. +--> +<org.chromium.chrome.browser.firstrun.AccountFirstRunView + xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:chrome="http://schemas.android.com/apk/res-auto" + android:id="@+id/fre_account_layout" + android:layout_width="match_parent" + android:layout_height="match_parent" > + + <ScrollView + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_marginBottom="76dp" + android:fillViewport="true" + android:scrollbarStyle="outsideOverlay" > + + <LinearLayout + android:id="@+id/fre_account_linear_layout" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:gravity="center" + android:orientation="vertical" > + + <TextView + android:id="@+id/title" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginTop="@dimen/fre_margin" + android:gravity="center" + android:lineSpacingMultiplier="1.4" + android:text="@string/fre_set_up_chrome" + android:textColor="@color/fre_title_color" + android:textSize="@dimen/fre_title_text_size" /> + + <LinearLayout + android:id="@+id/fre_content" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="@dimen/fre_margin" + android:gravity="center_horizontal" + android:orientation="vertical" > + + <org.chromium.chrome.browser.firstrun.ImageCarousel + android:id="@+id/image_slider" + android:layout_width="@dimen/fre_image_carousel_width" + android:layout_height="@dimen/fre_image_carousel_height" + android:layout_marginBottom="@dimen/fre_margin"/> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginBottom="@dimen/fre_margin" + android:orientation="vertical" + android:gravity="center_horizontal" + android:paddingEnd="24dp" + android:paddingStart="24dp" > + + <Spinner + style="@style/Widget.AppCompat.Spinner.Underlined" + android:id="@+id/google_accounts_spinner" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginBottom="@dimen/fre_margin" + android:padding="0dp" + android:textColor="@color/fre_text_color" /> + + + <FrameLayout + android:layout_width="wrap_content" + android:layout_height="wrap_content"> + + <org.chromium.ui.widget.TextViewWithClickableSpans + android:id="@+id/description" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:gravity="center_horizontal" + android:lineSpacingMultiplier="1.4" + android:text="@string/fre_account_choice_description" + android:textColor="@color/fre_light_text_color" + android:textSize="@dimen/fre_normal_text_size" + android:visibility="visible"/> + + <!-- We use an invisible TextView overlapping with the visible one to keep + the layout constant between text changes. This TextView will have its + contents programmatically set to the longest string the above TextView can + contain. --> + + <org.chromium.ui.widget.TextViewWithClickableSpans + android:id="@+id/longest_description" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:gravity="center" + android:lineSpacingMultiplier="1.4" + android:textColor="@color/fre_light_text_color" + android:textSize="@dimen/fre_normal_text_size" + android:visibility="invisible"/> + + </FrameLayout> + + </LinearLayout> + </LinearLayout> + </LinearLayout> + </ScrollView> + + <LinearLayout + android:id="@+id/button_bar" + android:layout_width="match_parent" + android:layout_height="76dp" + android:layout_gravity="bottom" + android:orientation="horizontal" + android:padding="@dimen/fre_button_padding" > + + <!--suppress ButtonStyle --> + <Button + android:id="@+id/negative_button" + style="@style/ButtonCompatBorderless" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="@string/fre_skip_text" + android:textAllCaps="true" + android:textColor="@color/light_normal_color" + android:textSize="15sp" /> + + <View + android:layout_width="0dp" + android:layout_height="0dp" + android:layout_weight="1" + android:visibility="invisible"/> + + <!--suppress ButtonStyle --> + <org.chromium.ui.widget.ButtonCompat + android:id="@+id/positive_button" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="@string/choose_account_sign_in" + android:textAllCaps="true" + android:textColor="@android:color/white" + android:textSize="15sp" + chrome:buttonColor="@color/light_active_color" /> + + <View + android:id="@+id/positive_button_end_padding" + android:layout_width="0dp" + android:layout_height="0dp" + android:layout_weight="1" + android:visibility="gone"/> + </LinearLayout> + +</org.chromium.chrome.browser.firstrun.AccountFirstRunView>
diff --git a/chrome/android/java/res/layout/fre_data_reduction_proxy.xml b/chrome/android/java/res/layout/fre_data_reduction_proxy.xml index ccf45e7..f589125e 100644 --- a/chrome/android/java/res/layout/fre_data_reduction_proxy.xml +++ b/chrome/android/java/res/layout/fre_data_reduction_proxy.xml
@@ -4,60 +4,61 @@ Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. --> -<org.chromium.chrome.browser.firstrun.FirstRunView +<org.chromium.chrome.browser.firstrun.DataReductionProxyView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" - android:layout_height="match_parent"> + android:layout_height="match_parent" > <ScrollView android:layout_width="match_parent" android:layout_height="match_parent" - android:layout_marginBottom="@dimen/fre_button_bar_height" - android:fillViewport="true"> + android:layout_marginBottom="57dp" + android:fillViewport="true" + android:scrollbarStyle="outsideOverlay" > <LinearLayout - android:id="@+id/fre_main_layout" android:layout_width="match_parent" android:layout_height="wrap_content" - android:orientation="vertical" - android:gravity="center_horizontal"> + android:gravity="center" + android:orientation="vertical" > <TextView - android:id="@+id/title" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginTop="@dimen/fre_margin" + android:gravity="center" + android:lineSpacingMultiplier="1.4" android:text="@string/data_reduction_promo_title" - style="@style/FreTitle"/> - - <!-- The orientation of this view is changed dynamically to give a nicer layout when in - landscape mode on devices with small screens. --> + android:textColor="@color/fre_title_color" + android:textSize="@dimen/fre_title_text_size" /> + <LinearLayout - android:id="@+id/fre_image_and_content" + android:id="@+id/fre_content" android:layout_width="match_parent" android:layout_height="wrap_content" - android:orientation="vertical" - android:gravity="center_horizontal" - android:layout_marginTop="@dimen/fre_vertical_spacing"> + android:layout_marginTop="@dimen/fre_margin" + android:gravity="center_horizontal" > <ImageView - android:id="@+id/image" android:layout_width="wrap_content" - android:layout_height="@dimen/fre_image_height" + android:layout_height="@dimen/fre_image_carousel_height" + android:layout_marginBottom="@dimen/fre_margin" android:contentDescription="@null" android:src="@drawable/data_reduction_illustration" /> <LinearLayout - android:id="@+id/fre_content_wrapper" - android:layout_width="0dp" - android:layout_height="0dp" - android:layout_weight="1" - android:layout_marginTop="@dimen/fre_vertical_spacing" - android:layout_marginEnd="@dimen/fre_content_margin" - android:layout_marginStart="@dimen/fre_content_margin" - android:orientation="vertical" > + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginBottom="@dimen/fre_margin" + android:orientation="vertical" + android:gravity="center_horizontal" + android:paddingEnd="24dp" + android:paddingStart="24dp" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginBottom="@dimen/fre_vertical_spacing" + android:layout_marginBottom="@dimen/fre_margin" android:gravity="start" android:lineSpacingMultiplier="1.4" android:text="@string/data_reduction_promo_summary" @@ -74,31 +75,26 @@ android:textColor="@color/fre_text_color" android:textSize="@dimen/fre_normal_text_size" android:fontFamily="sans-serif-medium" /> - </LinearLayout> </LinearLayout> </LinearLayout> </ScrollView> - <LinearLayout - android:id="@+id/button_bar" - android:layout_width="match_parent" - android:layout_height="@dimen/fre_button_bar_height" + <View + style="@style/ButtonBarTopDivider" android:layout_gravity="bottom" - android:orientation="vertical"> + android:layout_marginBottom="56dp" /> - <View style="@style/ButtonBarTopDivider" /> + <Button + android:id="@+id/next_button" + android:layout_width="match_parent" + android:layout_height="56dp" + android:layout_gravity="bottom" + android:background="?attr/listChoiceBackgroundIndicator" + android:padding="16dp" + android:text="@string/next" + android:textAllCaps="true" + android:textColor="@color/light_active_color" + android:textSize="@dimen/fre_button_text_size" /> - <Button - android:id="@+id/next_button" - android:layout_width="match_parent" - android:layout_height="@dimen/fre_button_bar_height" - android:layout_gravity="bottom" - android:background="?attr/listChoiceBackgroundIndicator" - android:padding="16dp" - android:text="@string/next" - android:textAllCaps="true" - android:textColor="@color/light_active_color" - android:textSize="@dimen/fre_button_text_size" /> - </LinearLayout> -</org.chromium.chrome.browser.firstrun.FirstRunView> \ No newline at end of file +</org.chromium.chrome.browser.firstrun.DataReductionProxyView>
diff --git a/chrome/android/java/res/layout/fre_spinner_dropdown.xml b/chrome/android/java/res/layout/fre_spinner_dropdown.xml index 5aba8e8..ba06f4ee 100644 --- a/chrome/android/java/res/layout/fre_spinner_dropdown.xml +++ b/chrome/android/java/res/layout/fre_spinner_dropdown.xml
@@ -9,7 +9,7 @@ style="?android:attr/spinnerDropDownItemStyle" android:singleLine="true" android:ellipsize="end" - android:maxWidth="300dp" + android:maxWidth="216dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:textColor="@color/fre_text_color"
diff --git a/chrome/android/java/res/layout/fre_spinner_text.xml b/chrome/android/java/res/layout/fre_spinner_text.xml index fcdbd29e..cb14ff1 100644 --- a/chrome/android/java/res/layout/fre_spinner_text.xml +++ b/chrome/android/java/res/layout/fre_spinner_text.xml
@@ -8,12 +8,12 @@ android:id="@+id/fre_spinner_text" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:maxWidth="300dp" + android:maxWidth="216dp" android:layoutDirection="locale" - android:paddingTop="8dp" - android:paddingBottom="8dp" - android:paddingEnd="16dp" - android:paddingStart="0dp" + android:paddingBottom="16dp" + android:paddingEnd="12dp" + android:paddingStart="12dp" + android:paddingTop="16dp" android:textAlignment="viewStart" android:ellipsize="end" android:singleLine="true"
diff --git a/chrome/android/java/res/layout/fre_tosanduma.xml b/chrome/android/java/res/layout/fre_tosanduma.xml index d5004772..04700e9 100644 --- a/chrome/android/java/res/layout/fre_tosanduma.xml +++ b/chrome/android/java/res/layout/fre_tosanduma.xml
@@ -4,61 +4,63 @@ Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. --> -<org.chromium.chrome.browser.firstrun.FirstRunView +<org.chromium.chrome.browser.firstrun.TosAndUmaView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" - android:layout_height="match_parent"> + android:layout_height="match_parent" > <ScrollView android:layout_width="match_parent" android:layout_height="match_parent" - android:layout_marginBottom="@dimen/fre_button_bar_height" - android:fillViewport="true"> + android:layout_marginBottom="57dp" + android:fillViewport="true" + android:scrollbarStyle="outsideOverlay" > <LinearLayout - android:id="@+id/fre_main_layout" android:layout_width="match_parent" android:layout_height="wrap_content" - android:orientation="vertical" - android:gravity="center_horizontal"> + android:gravity="center" + android:orientation="vertical" > <TextView - android:id="@+id/title" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginTop="@dimen/fre_margin" + android:gravity="center" + android:lineSpacingMultiplier="1.4" android:text="@string/fre_welcome" - style="@style/FreTitle" /> - - <!-- The orientation of this view is changed dynamically to give a nicer layout when in - landscape mode on devices with small screens. --> + android:textColor="@color/fre_title_color" + android:textSize="@dimen/fre_title_text_size" /> + <LinearLayout - android:id="@+id/fre_image_and_content" + android:id="@+id/fre_content" android:layout_width="match_parent" android:layout_height="wrap_content" - android:orientation="vertical" - android:gravity="center_horizontal" - android:layout_marginTop="@dimen/fre_vertical_spacing"> + android:layout_marginTop="@dimen/fre_margin" + android:gravity="center_horizontal"> <ImageView - android:id="@+id/image" android:layout_width="wrap_content" - android:layout_height="@dimen/fre_image_height" + android:layout_height="@dimen/fre_image_carousel_height" + android:layout_marginBottom="@dimen/fre_margin" android:contentDescription="@null" android:src="@drawable/fre_product_logo" /> <LinearLayout - android:id="@+id/fre_content_wrapper" + android:id="@+id/text_wrapper" android:layout_width="0dp" android:layout_height="0dp" android:layout_weight="1" - android:layout_marginTop="@dimen/fre_vertical_spacing" - android:layout_marginEnd="@dimen/fre_content_margin" - android:layout_marginStart="@dimen/fre_content_margin" - android:orientation="vertical" > - + android:layout_marginBottom="@dimen/fre_margin" + android:orientation="vertical" + android:paddingEnd="@dimen/fre_margin" + android:paddingStart="@dimen/fre_margin" > + <org.chromium.ui.widget.TextViewWithClickableSpans android:id="@+id/tos_and_privacy" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginBottom="@dimen/fre_vertical_spacing" + android:layout_marginBottom="@dimen/fre_margin" android:gravity="center" android:lineSpacingMultiplier="1.4" android:textColor="@color/fre_text_color" @@ -72,30 +74,26 @@ android:text="@string/fre_send_report_check" android:textColor="@color/fre_text_color" android:textSize="@dimen/fre_normal_text_size" /> - </LinearLayout> + </LinearLayout> </LinearLayout> </LinearLayout> </ScrollView> - <LinearLayout - android:id="@+id/button_bar" - android:layout_width="match_parent" - android:layout_height="@dimen/fre_button_bar_height" + <View + style="@style/ButtonBarTopDivider" android:layout_gravity="bottom" - android:orientation="vertical"> + android:layout_marginBottom="56dp" /> - <View style="@style/ButtonBarTopDivider" /> + <Button + android:id="@+id/terms_accept" + android:layout_width="match_parent" + android:layout_height="56dp" + android:layout_gravity="bottom" + android:background="?attr/listChoiceBackgroundIndicator" + android:padding="16dp" + android:text="@string/fre_accept_continue" + android:textAllCaps="true" + android:textColor="@color/light_active_color" + android:textSize="@dimen/fre_button_text_size" /> - <Button - android:id="@+id/terms_accept" - android:layout_width="match_parent" - android:layout_height="@dimen/fre_button_bar_height" - android:layout_gravity="bottom" - android:background="?attr/listChoiceBackgroundIndicator" - android:padding="16dp" - android:text="@string/fre_accept_continue" - android:textAllCaps="true" - android:textColor="@color/light_active_color" - android:textSize="@dimen/fre_button_text_size" /> - </LinearLayout> -</org.chromium.chrome.browser.firstrun.FirstRunView> \ No newline at end of file +</org.chromium.chrome.browser.firstrun.TosAndUmaView>
diff --git a/chrome/android/java/res/layout/radio_button_with_description.xml b/chrome/android/java/res/layout/radio_button_with_description.xml deleted file mode 100644 index 24823f4..0000000 --- a/chrome/android/java/res/layout/radio_button_with_description.xml +++ /dev/null
@@ -1,32 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright 2016 The Chromium Authors. All rights reserved. - Use of this source code is governed by a BSD-style license that can be - found in the LICENSE file. --> - -<!-- RadioButtonWithDescription extends RelativeLayout --> -<merge xmlns:android="http://schemas.android.com/apk/res/android" - android:paddingTop="10dp" > - - <RadioButton - android:id="@+id/radio_button" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:paddingEnd="16dp" /> - - <TextView - android:id="@+id/title" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_toEndOf="@id/radio_button" - android:textColor="#de000000" - android:textSize="16sp" /> - - <TextView - android:id="@+id/description" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_alignStart="@id/title" - android:layout_below="@id/title" - android:textColor="#8a000000" - android:textSize="14sp" /> -</merge>
diff --git a/chrome/android/java/res/layout/website_settings.xml b/chrome/android/java/res/layout/website_settings.xml index 9cc5ee339..a8d3cc1a 100644 --- a/chrome/android/java/res/layout/website_settings.xml +++ b/chrome/android/java/res/layout/website_settings.xml
@@ -20,16 +20,33 @@ android:paddingEnd="@dimen/website_settings_popup_padding_sides" android:paddingStart="@dimen/website_settings_popup_padding_sides" > - <view class="org.chromium.chrome.browser.pageinfo.WebsiteSettingsPopup$ElidedUrlTextView" - android:id="@+id/website_settings_url" + <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" - android:ellipsize="end" - android:lineSpacingExtra="6dp" - android:paddingTop="16dp" - android:textAlignment="viewStart" - android:textColor="@color/url_emphasis_default_text" - android:textSize="16sp"/> + android:orientation="horizontal" + android:paddingTop="16dp" > + + <ImageView android:id="@+id/offline_icon" + style="@style/LocationBarButton" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="start|top" + android:paddingEnd="12dp" + android:src="@drawable/offline_bolt" + android:visibility="gone" + android:contentDescription="@string/page_info_offline_icon" /> + + <view class="org.chromium.chrome.browser.pageinfo.WebsiteSettingsPopup$ElidedUrlTextView" + android:id="@+id/website_settings_url" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:ellipsize="end" + android:lineSpacingExtra="6dp" + android:textAlignment="viewStart" + android:textColor="@color/url_emphasis_default_text" + android:textSize="16sp"/> + + </LinearLayout> <TextView android:id="@+id/website_settings_connection_message"
diff --git a/chrome/android/java/res/values-large/dimens.xml b/chrome/android/java/res/values-large/dimens.xml deleted file mode 100644 index bfa99b4..0000000 --- a/chrome/android/java/res/values-large/dimens.xml +++ /dev/null
@@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright 2016 The Chromium Authors. All rights reserved. - Use of this source code is governed by a BSD-style license that can be - found in the LICENSE file. --> - -<resources> - <dimen name="fre_content_margin">60dp</dimen> -</resources>
diff --git a/chrome/android/java/res/values-v17/styles.xml b/chrome/android/java/res/values-v17/styles.xml index f3fd898..fa3f480 100644 --- a/chrome/android/java/res/values-v17/styles.xml +++ b/chrome/android/java/res/values-v17/styles.xml
@@ -268,16 +268,6 @@ <item name="android:paddingEnd">0dp</item> <item name="externalRouteEnabledDrawable">@drawable/ic_cast_dark_chrome</item> </style> - - <!-- First Run Experience --> - <style name="FreTitle"> - <item name="android:layout_width">wrap_content</item> - <item name="android:layout_height">wrap_content</item> - <item name="android:gravity">center</item> - <item name="android:lineSpacingMultiplier">1.4</item> - <item name="android:textColor">@color/fre_title_color</item> - <item name="android:textSize">@dimen/fre_title_text_size</item> - </style> <!-- Web Notifications --> <style name="WebNotificationTitle"
diff --git a/chrome/android/java/res/values/attrs.xml b/chrome/android/java/res/values/attrs.xml index b5fa1f7..63bd52b 100644 --- a/chrome/android/java/res/values/attrs.xml +++ b/chrome/android/java/res/values/attrs.xml
@@ -49,6 +49,7 @@ <declare-styleable name="BoundedView"> <attr name="maxWidth" format="dimension" /> + <attr name="maxHeight" format="dimension" /> </declare-styleable> <declare-styleable name="ClipDrawableProgressBar"> @@ -56,7 +57,4 @@ <attr name="backgroundColor" format="reference|color" /> </declare-styleable> - <declare-styleable name="RadioButtonWithDescription"> - <attr name="titleText" format="string" /> - </declare-styleable> </resources>
diff --git a/chrome/android/java/res/values/colors.xml b/chrome/android/java/res/values/colors.xml index a3977b2..5843249 100644 --- a/chrome/android/java/res/values/colors.xml +++ b/chrome/android/java/res/values/colors.xml
@@ -15,7 +15,6 @@ <color name="text_highlight_color">#C6DAFC</color> <color name="dark_action_bar_color">#263238</color> <color name="descriptive_text_color">#646464</color> - <color name="ui_link_text_color">#3367D6</color> <!-- Infobar colors --> <color name="infobar_accent_blue">#4285f4</color> @@ -80,11 +79,8 @@ <!-- First Run Experience Colors --> <color name="fre_text_color">#000000</color> + <color name="fre_light_text_color">#494949</color> <color name="fre_title_color">#161616</color> - - <!-- Account Signin Colors --> - <!-- As in dimens.xml, signin uses values from the First Run Experience --> - <color name="signin_light_text_color">#494949</color> <!-- Sad Tab colors --> <color name="sad_tab_header_text_color">#333333</color> @@ -123,6 +119,9 @@ <color name="locationbar_light_hint_text">#80ffffff</color> <color name="locationbar_light_selection_color">#cc5595fe</color> <color name="locationbar_verbose_status_color">#8a000000</color> + <color name="locationbar_light_verbose_status_color">#b3ffffff</color> + <color name="locationbar_status_separator_color">#1f000000</color> + <color name="locationbar_light_status_separator_color">#26ffffff</color> <!-- Find in Page colors --> <color name="find_result_bar_background_color">#bfffffff</color>
diff --git a/chrome/android/java/res/values/dimens.xml b/chrome/android/java/res/values/dimens.xml index 61d8ec02..e0e2379 100644 --- a/chrome/android/java/res/values/dimens.xml +++ b/chrome/android/java/res/values/dimens.xml
@@ -161,25 +161,17 @@ <dimen name="badge_radius">10dp</dimen> <dimen name="badge_border_size">1.3dp</dimen> - <!-- First Run Experience dimensions --> - <dimen name="fre_content_margin">24dp</dimen> - <dimen name="fre_vertical_spacing">32dp</dimen> - <dimen name="fre_button_bar_height">56dp</dimen> + <!-- First Run Experience and Welcome Page dimensions --> <dimen name="fre_button_padding">12dp</dimen> <dimen name="fre_margin">24dp</dimen> <dimen name="fre_title_text_size">24sp</dimen> <dimen name="fre_button_text_size">14sp</dimen> <dimen name="fre_normal_text_size">14sp</dimen> - <dimen name="fre_image_height">120dp</dimen> + <dimen name="fre_image_carousel_width">260dp</dimen> + <dimen name="fre_image_carousel_height">130dp</dimen> + <dimen name="fre_checkmark_size">38dp</dimen> <dimen name="fre_tos_checkbox_padding">12dp</dimen> - <!-- Account Signin dimensions --> - <!-- The Account Signin page appears in the First Run Experience (amongst other places), so uses - a lot of the fre_* dimensions for consistency. --> - <dimen name="signin_image_carousel_width">240dp</dimen> - <dimen name="signin_checkmark_size">38dp</dimen> - <dimen name="signin_spinner_selected_bottom_padding">16dp</dimen> - <!-- Sign-in promo dimensions --> <dimen name="sign_in_promo_padding_bottom">16dp</dimen>
diff --git a/chrome/android/java/src/android/support/customtabs/CustomTabsIntent.java b/chrome/android/java/src/android/support/customtabs/CustomTabsIntent.java index 3cb66a2..c3c3a91 100644 --- a/chrome/android/java/src/android/support/customtabs/CustomTabsIntent.java +++ b/chrome/android/java/src/android/support/customtabs/CustomTabsIntent.java
@@ -14,6 +14,7 @@ import android.os.Build; import android.os.Bundle; import android.os.IBinder; +import android.widget.RemoteViews; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; @@ -162,6 +163,14 @@ "android.support.customtabs.extra.SECONDARY_TOOLBAR_COLOR"; /** + * Extra that specifies the {@link RemoteViews} showing on the secondary toolbar. If this extra + * is set, the other secondary toolbar configurations will be overriden. The height of the + * {@link RemoteViews} should not exceed 56dp. + */ + public static final String EXTRA_SECONDARY_TOOLBAR_REMOTEVIEWS = + "android.support.customtabs.extra.EXTRA_SECONDARY_TOOLBAR_REMOTEVIEWS"; + + /** * Convenience method to create a VIEW intent without a session for the given package. * @param packageName The package name to set in the intent. * @param data The data {@link Uri} to be used in the intent.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/BluetoothChooserDialog.java b/chrome/android/java/src/org/chromium/chrome/browser/BluetoothChooserDialog.java index a0e07a24..2780051 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/BluetoothChooserDialog.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/BluetoothChooserDialog.java
@@ -321,6 +321,14 @@ } @CalledByNative + private void notifyAdapterTurnedOn() { + mItemChooserDialog.clear(); + if (mNativeBluetoothChooserDialogPtr != 0) { + nativeRestartSearch(mNativeBluetoothChooserDialogPtr); + } + } + + @CalledByNative private void notifyDiscoveryState(int discoveryState) { switch (discoveryState) { case DISCOVERY_FAILED_TO_START: {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java index bbfad313..162d1fa3 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java
@@ -104,6 +104,7 @@ import org.chromium.chrome.browser.sync.ProfileSyncService; import org.chromium.chrome.browser.sync.SyncController; import org.chromium.chrome.browser.tab.Tab; +import org.chromium.chrome.browser.tabmodel.AsyncTabParamsManager; import org.chromium.chrome.browser.tabmodel.ChromeTabCreator; import org.chromium.chrome.browser.tabmodel.EmptyTabModel; import org.chromium.chrome.browser.tabmodel.TabCreatorManager; @@ -253,6 +254,9 @@ if (!Build.VERSION.CODENAME.equals("N")) { getWindow().setBackgroundDrawable(getBackgroundDrawable()); } + mWindowAndroid = ((ChromeApplication) getApplicationContext()) + .createActivityWindowAndroid(this); + mWindowAndroid.restoreInstanceState(getSavedInstanceState()); } @SuppressLint("NewApi") @@ -260,9 +264,6 @@ public void postInflationStartup() { super.postInflationStartup(); - mWindowAndroid = ((ChromeApplication) getApplicationContext()) - .createActivityWindowAndroid(this); - mWindowAndroid.restoreInstanceState(getSavedInstanceState()); mSnackbarManager = new SnackbarManager(getWindow()); mDataUseSnackbarController = new DataUseSnackbarController(this, getSnackbarManager()); @@ -698,6 +699,9 @@ @Override public void onStart() { + if (AsyncTabParamsManager.hasParamsWithTabToReparent()) { + mCompositorViewHolder.prepareForTabReparenting(); + } super.onStart(); if (mContextReporter != null) mContextReporter.enable(); @@ -1465,7 +1469,7 @@ return -1; } - private final void postDeferredStartupIfNeeded() { + protected final void postDeferredStartupIfNeeded() { if (!mDeferredStartupNotified) { // We want to perform deferred startup tasks a short time after the first page // load completes, but only when the main thread Looper has become idle.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/banners/AppBannerManager.java b/chrome/android/java/src/org/chromium/chrome/browser/banners/AppBannerManager.java index cd0a59ae..851e1995 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/banners/AppBannerManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/banners/AppBannerManager.java
@@ -40,9 +40,6 @@ /** Pointer to the native side AppBannerManager. */ private long mNativePointer; - /** Tab that the AppBannerView/AppBannerManager is owned by. */ - private final Tab mTab; - /** * Checks if app banners are enabled. * @return True if banners are enabled, false otherwise. @@ -70,19 +67,18 @@ */ public AppBannerManager(Tab tab, Context context) { mNativePointer = nativeInit(); - mTab = tab; - updatePointers(); + updatePointers(tab); } @Override public void onWebContentsSwapped(Tab tab, boolean didStartLoad, boolean didFinishLoad) { - updatePointers(); + updatePointers(tab); } @Override public void onContentChanged(Tab tab) { - updatePointers(); + updatePointers(tab); } /** @@ -96,8 +92,8 @@ /** * Updates which WebContents the native AppBannerManager is monitoring. */ - private void updatePointers() { - nativeReplaceWebContents(mNativePointer, mTab.getWebContents()); + private void updatePointers(Tab tab) { + nativeReplaceWebContents(mNativePointer, tab.getWebContents()); } /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkBridge.java index 9483fe9..d32654b 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkBridge.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkBridge.java
@@ -159,6 +159,76 @@ } /** + * Contains data about a bookmark or bookmark folder. + */ + public static class BookmarkItem { + + private final String mTitle; + private final String mUrl; + private final BookmarkId mId; + private final boolean mIsFolder; + private final BookmarkId mParentId; + private final boolean mIsEditable; + private final boolean mIsManaged; + + private BookmarkItem(BookmarkId id, String title, String url, boolean isFolder, + BookmarkId parentId, boolean isEditable, boolean isManaged) { + mId = id; + mTitle = title; + mUrl = url; + mIsFolder = isFolder; + mParentId = parentId; + mIsEditable = isEditable; + mIsManaged = isManaged; + } + + /** @return Title of the bookmark item. */ + public String getTitle() { + return mTitle; + } + + /** @return Url of the bookmark item. */ + public String getUrl() { + return mUrl; + } + + /** @return Id of the bookmark item. */ + public BookmarkId getId() { + return mId; + } + + /** @return Whether item is a folder or a bookmark. */ + public boolean isFolder() { + return mIsFolder; + } + + /** @return Parent id of the bookmark item. */ + public BookmarkId getParentId() { + return mParentId; + } + + /** @return Whether this bookmark can be edited. */ + public boolean isEditable() { + return mIsEditable; + } + + /**@return Whether this bookmark's URL can be edited */ + public boolean isUrlEditable() { + return isEditable() && mId.getType() == BookmarkType.NORMAL; + } + + /**@return Whether this bookmark can be moved */ + public boolean isMovable() { + return isEditable() && mId.getType() == BookmarkType.NORMAL; + } + + /** @return Whether this is a managed bookmark. */ + public boolean isManaged() { + return mIsManaged; + } + } + + /** * Handler to fetch the bookmarks, titles, urls and folder hierarchy. * @param profile Profile instance corresponding to the active profile. */ @@ -755,6 +825,44 @@ return pairList; } + /** + * Details about callbacks that need to be called once the bookmark model has loaded. + */ + private static class DelayedBookmarkCallback { + + private static final int GET_BOOKMARKS_FOR_FOLDER = 0; + private static final int GET_CURRENT_FOLDER_HIERARCHY = 1; + + private final BookmarksCallback mCallback; + private final BookmarkId mFolderId; + private final int mCallbackMethod; + private final BookmarkBridge mHandler; + + private DelayedBookmarkCallback(BookmarkId folderId, BookmarksCallback callback, + int method, BookmarkBridge handler) { + mFolderId = folderId; + mCallback = callback; + mCallbackMethod = method; + mHandler = handler; + } + + /** + * Invoke the callback method. + */ + private void callCallbackMethod() { + switch (mCallbackMethod) { + case GET_BOOKMARKS_FOR_FOLDER: + mHandler.getBookmarksForFolder(mFolderId, mCallback); + break; + case GET_CURRENT_FOLDER_HIERARCHY: + mHandler.getCurrentFolderHierarchy(mFolderId, mCallback); + break; + default: + assert false; + break; + } + } + } private native BookmarkItem nativeGetBookmarkByID(long nativeBookmarkBridge, long id, int type); @@ -806,113 +914,4 @@ private native boolean nativeIsDoingExtensiveChanges(long nativeBookmarkBridge); private native void nativeDestroy(long nativeBookmarkBridge); private static native boolean nativeIsEditBookmarksEnabled(long nativeBookmarkBridge); - - /** - * Simple object representing the bookmark item. - */ - public static class BookmarkItem { - - private final String mTitle; - private final String mUrl; - private final BookmarkId mId; - private final boolean mIsFolder; - private final BookmarkId mParentId; - private final boolean mIsEditable; - private final boolean mIsManaged; - - private BookmarkItem(BookmarkId id, String title, String url, boolean isFolder, - BookmarkId parentId, boolean isEditable, boolean isManaged) { - mId = id; - mTitle = title; - mUrl = url; - mIsFolder = isFolder; - mParentId = parentId; - mIsEditable = isEditable; - mIsManaged = isManaged; - } - - /** @return Title of the bookmark item. */ - public String getTitle() { - return mTitle; - } - - /** @return Url of the bookmark item. */ - public String getUrl() { - return mUrl; - } - - /** @return Id of the bookmark item. */ - public BookmarkId getId() { - return mId; - } - - /** @return Whether item is a folder or a bookmark. */ - public boolean isFolder() { - return mIsFolder; - } - - /** @return Parent id of the bookmark item. */ - public BookmarkId getParentId() { - return mParentId; - } - - /** @return Whether this bookmark can be edited. */ - public boolean isEditable() { - return mIsEditable; - } - - /**@return Whether this bookmark's URL can be edited */ - public boolean isUrlEditable() { - return isEditable() && mId.getType() == BookmarkType.NORMAL; - } - - /**@return Whether this bookmark can be moved */ - public boolean isMovable() { - return isEditable() && mId.getType() == BookmarkType.NORMAL; - } - - /** @return Whether this is a managed bookmark. */ - public boolean isManaged() { - return mIsManaged; - } - } - - /** - * Details about callbacks that need to be called once the bookmark model has loaded. - */ - private static class DelayedBookmarkCallback { - - private static final int GET_BOOKMARKS_FOR_FOLDER = 0; - private static final int GET_CURRENT_FOLDER_HIERARCHY = 1; - - private final BookmarksCallback mCallback; - private final BookmarkId mFolderId; - private final int mCallbackMethod; - private final BookmarkBridge mHandler; - - private DelayedBookmarkCallback(BookmarkId folderId, BookmarksCallback callback, - int method, BookmarkBridge handler) { - mFolderId = folderId; - mCallback = callback; - mCallbackMethod = method; - mHandler = handler; - } - - /** - * Invoke the callback method. - */ - private void callCallbackMethod() { - switch (mCallbackMethod) { - case GET_BOOKMARKS_FOR_FOLDER: - mHandler.getBookmarksForFolder(mFolderId, mCallback); - break; - case GET_CURRENT_FOLDER_HIERARCHY: - mHandler.getCurrentFolderHierarchy(mFolderId, mCallback); - break; - default: - assert false; - break; - } - } - } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkSigninActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkSigninActivity.java index e84fcd7..dedbb5c 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkSigninActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkSigninActivity.java
@@ -127,6 +127,7 @@ @Override public void onNewAccount() { RecordUserAction.record("Stars_SignInPromoActivity_NewAccount"); + RecordUserAction.record("Signin_AddAccountToDevice"); } @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java index ef57345..9c346bf 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java
@@ -302,6 +302,15 @@ } } + /** + * Perform any initialization necessary for showing a reparented tab. + */ + public void prepareForTabReparenting() { + // Set the background to white while we wait for the first swap of buffers. This gets + // corrected inside the view. + mCompositorView.setBackgroundColor(Color.WHITE); + } + @Override public ResourceManager getResourceManager() { return mCompositorView.getResourceManager();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome.java index 91902fa..6d0d900 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome.java
@@ -91,6 +91,7 @@ public void willAddTab(Tab tab, TabLaunchType type) { // Open the new tab if (type == TabLaunchType.FROM_RESTORE) return; + if (type == TabLaunchType.FROM_REPARENTING) return; tabCreating(getTabModelSelector().getCurrentTabId(), tab.getUrl(), tab.isIncognito()); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java index c87e2fa3..ebe9f57 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java
@@ -13,6 +13,7 @@ import android.os.StrictMode; import android.support.customtabs.CustomTabsCallback; import android.support.customtabs.CustomTabsIntent; +import android.support.v4.app.ActivityOptionsCompat; import android.text.TextUtils; import android.view.KeyEvent; import android.view.MenuItem; @@ -22,6 +23,7 @@ import android.view.ViewStub; import android.view.Window; import android.widget.ImageButton; +import android.widget.RemoteViews; import org.chromium.base.ApiCompatibilityUtils; import org.chromium.base.Log; @@ -40,14 +42,16 @@ import org.chromium.chrome.browser.compositor.layouts.LayoutManagerDocument; import org.chromium.chrome.browser.datausage.DataUseTabUIManager; import org.chromium.chrome.browser.document.ChromeLauncherActivity; +import org.chromium.chrome.browser.externalnav.ExternalNavigationDelegateImpl; import org.chromium.chrome.browser.rappor.RapporServiceBridge; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.TabIdManager; +import org.chromium.chrome.browser.tabmodel.AsyncTabParamsManager; import org.chromium.chrome.browser.tabmodel.EmptyTabModelObserver; import org.chromium.chrome.browser.tabmodel.TabModel.TabLaunchType; -import org.chromium.chrome.browser.tabmodel.TabModel.TabSelectionType; import org.chromium.chrome.browser.tabmodel.TabModelObserver; import org.chromium.chrome.browser.tabmodel.TabModelSelectorImpl; +import org.chromium.chrome.browser.tabmodel.TabReparentingParams; import org.chromium.chrome.browser.toolbar.ToolbarControlContainer; import org.chromium.chrome.browser.util.ColorUtils; import org.chromium.chrome.browser.util.IntentUtils; @@ -55,6 +59,7 @@ import org.chromium.components.dom_distiller.core.DomDistillerUrlUtils; import org.chromium.content_public.browser.LoadUrlParams; import org.chromium.content_public.browser.WebContents; +import org.chromium.content_public.browser.WebContentsObserver; import org.chromium.content_public.common.Referrer; import org.chromium.ui.base.PageTransition; @@ -76,6 +81,7 @@ private CustomTabIntentDataProvider mIntentDataProvider; private IBinder mSession; private CustomTabContentHandler mCustomTabContentHandler; + private Tab mMainTab; // This is to give the right package name while using the client's resources during an // overridePendingTransition call. @@ -85,24 +91,15 @@ private boolean mRecordedStartupUma; private boolean mShouldReplaceCurrentEntry; + private boolean mHasCreatedTabEarly; private CustomTabObserver mTabObserver; // Only the normal tab model is observed because there is no icognito tabmodel in Custom Tabs. private TabModelObserver mTabModelObserver = new EmptyTabModelObserver() { @Override public void didAddTab(Tab tab, TabLaunchType type) { - if (mTabObserver == null) { - mTabObserver = new CustomTabObserver(getApplication(), mSession); - } tab.addObserver(mTabObserver); } - - @Override - public void didSelectTab(Tab tab, TabSelectionType type, int lastId) { - // TODO(ianwen): If the user selects an background tab by keyboard - // shortcuts, close all tabs that are above the selected tab. - // http://crbug.com/500058 - } }; /** @@ -153,6 +150,20 @@ return sActiveContentHandler.updateCustomButton(id, bitmap, description); } + /** + * Checks whether the active {@link CustomTabContentHandler} belongs to the given session, and + * if true, updates {@link RemoteViews} on the secondary toolbar. + * @return Whether the update is successful. + */ + static boolean updateRemoteViews(IBinder session, RemoteViews remoteViews) { + ThreadUtils.assertOnUiThread(); + // Do nothing if there is no activity or the activity does not belong to this session. + if (sActiveContentHandler == null || !sActiveContentHandler.getSession().equals(session)) { + return false; + } + return sActiveContentHandler.updateRemoteViews(remoteViews); + } + @Override public boolean isCustomTab() { return true; @@ -181,7 +192,14 @@ public void preInflationStartup() { super.preInflationStartup(); mIntentDataProvider = new CustomTabIntentDataProvider(getIntent(), this); + mSession = mIntentDataProvider.getSession(); supportRequestWindowFeature(Window.FEATURE_ACTION_MODE_OVERLAY); + if (CustomTabsConnection.hasWarmUpBeenFinished(getApplication())) { + mMainTab = createMainTab(); + loadUrlInTab(mMainTab, new LoadUrlParams(IntentHandler.getUrlFromIntent(getIntent())), + IntentHandler.getTimestampFromIntent(getIntent())); + mHasCreatedTabEarly = true; + } } @Override @@ -208,16 +226,21 @@ @Override public void finishNativeInitialization() { - mSession = mIntentDataProvider.getSession(); CustomTabsConnection connection = CustomTabsConnection.getInstance(getApplication()); // If extra headers have been passed, cancel any current prerender, as // prerendering doesn't support extra headers. if (IntentHandler.getExtraHeadersFromIntent(getIntent()) != null) { connection.cancelPrerender(mSession); } - Tab mainTab = createMainTab(); + if (mHasCreatedTabEarly) { + // When the tab is created early, we don't have the TabContentManager connected, since + // compositor related controllers were not initialized at that point. + mMainTab.attachTabContentManager(getTabContentManager()); + } else { + mMainTab = createMainTab(); + } getTabModelSelector().getModel(false).addObserver(mTabModelObserver); - getTabModelSelector().getModel(false).addTab(mainTab, 0, mainTab.getLaunchType()); + getTabModelSelector().getModel(false).addTab(mMainTab, 0, mMainTab.getLaunchType()); ToolbarControlContainer controlContainer = (ToolbarControlContainer) findViewById( R.id.control_container); @@ -242,11 +265,11 @@ } }); - mainTab.setFullscreenManager(getFullscreenManager()); + mMainTab.setFullscreenManager(getFullscreenManager()); mCustomTabContentHandler = new CustomTabContentHandler() { @Override public void loadUrlAndTrackFromTimestamp(LoadUrlParams params, long timestamp) { - loadUrlInCurrentTab(params, timestamp); + loadUrlInTab(getActivityTab(), params, timestamp); } @Override @@ -275,14 +298,31 @@ } return true; } + + @Override + public boolean updateRemoteViews(RemoteViews rv) { + if (mIntentDataProvider.getBottomBarRemoteViews() == null) { + // Update only makes sense if we are already showing a RemoteViews. + return false; + } + ViewGroup bottomBar = (ViewGroup) findViewById(R.id.bottombar); + View view = rv.apply(CustomTabActivity.this, bottomBar); + bottomBar.removeAllViews(); + bottomBar.addView(view); + return true; + } }; - DataUseTabUIManager.onCustomTabInitialNavigation(mainTab, + DataUseTabUIManager.onCustomTabInitialNavigation(mMainTab, connection.getClientPackageNameForSession(mSession), IntentHandler.getUrlFromIntent(getIntent())); recordClientPackageName(); connection.showSignInToastIfNecessary(mSession, getIntent()); - loadUrlInCurrentTab(new LoadUrlParams(IntentHandler.getUrlFromIntent(getIntent())), - IntentHandler.getTimestampFromIntent(getIntent())); + if (mHasCreatedTabEarly) { + if (!mMainTab.isLoading()) postDeferredStartupIfNeeded(); + } else { + loadUrlInTab(mMainTab, new LoadUrlParams(IntentHandler.getUrlFromIntent(getIntent())), + IntentHandler.getTimestampFromIntent(getIntent())); + } super.finishNativeInitialization(); } @@ -316,6 +356,8 @@ false); tab.getTabRedirectHandler().updateIntent(getIntent()); tab.getView().requestFocus(); + mTabObserver = new CustomTabObserver(getApplication(), mSession); + tab.addObserver(mTabObserver); return tab; } @@ -371,7 +413,7 @@ * Loads the current tab with the given load params while taking client * referrer and extra headers into account. */ - void loadUrlInCurrentTab(LoadUrlParams params, long timeStamp) { + private void loadUrlInTab(final Tab tab, final LoadUrlParams params, long timeStamp) { Intent intent = getIntent(); IntentHandler.addReferrerAndHeaders(params, intent, this); if (params.getReferrer() == null) { @@ -383,8 +425,24 @@ params.setTransitionType(PageTransition.LINK | PageTransition.FROM_API); mTabObserver.trackNextPageLoadFromTimestamp(timeStamp); if (mShouldReplaceCurrentEntry) params.setShouldReplaceCurrentEntry(true); + if (mShouldReplaceCurrentEntry + && tab.getWebContents().getNavigationController().getEntryAtIndex(0) + == null) { + // If the spare web contents has gotten a loadurl but has not committed yet, wait + // until commit to start the actual load. + tab.getWebContents().addObserver(new WebContentsObserver() { + @Override + public void didCommitProvisionalLoadForFrame(long frameId, boolean isMainFrame, + String url, int transitionType) { + if (!isMainFrame) return; + tab.loadUrl(params); + tab.getWebContents().removeObserver(this); + } + }); + } else { + tab.loadUrl(params); + } mShouldReplaceCurrentEntry = false; - getActivityTab().loadUrl(params); } @Override @@ -399,6 +457,13 @@ } @Override + public Tab getActivityTab() { + Tab tab = super.getActivityTab(); + if (tab == null) tab = mMainTab; + return tab; + } + + @Override protected AppMenuPropertiesDelegate createAppMenuPropertiesDelegate() { return new CustomTabAppMenuPropertiesDelegate(this, mIntentDataProvider.getMenuTitles(), mIntentDataProvider.shouldShowShareMenuItem(), @@ -512,29 +577,37 @@ shadow.setVisibility(View.VISIBLE); ViewGroup bottomBar = (ViewGroup) findViewById(R.id.bottombar); - bottomBar.setBackgroundColor(mIntentDataProvider.getBottomBarColor()); - List<CustomButtonParams> items = mIntentDataProvider.getCustomButtonsOnBottombar(); - for (CustomButtonParams params : items) { - if (params.showOnToolbar()) continue; - final PendingIntent pendingIntent = params.getPendingIntent(); - OnClickListener clickListener = null; - if (pendingIntent != null) { - clickListener = new OnClickListener() { - @Override - public void onClick(View v) { - Intent addedIntent = new Intent(); - addedIntent.setData(Uri.parse(getActivityTab().getUrl())); - try { - pendingIntent.send(CustomTabActivity.this, 0, addedIntent, null, null); - } catch (CanceledException e) { - Log.e(TAG, - "CanceledException while sending pending intent in custom tab"); + RemoteViews remoteViews = mIntentDataProvider.getBottomBarRemoteViews(); + if (remoteViews != null) { + //TODO(ianwen): add UMA to see the usage of RemoteViews. + View inflatedView = remoteViews.apply(this, bottomBar); + bottomBar.addView(inflatedView); + } else { + bottomBar.setBackgroundColor(mIntentDataProvider.getBottomBarColor()); + List<CustomButtonParams> items = mIntentDataProvider.getCustomButtonsOnBottombar(); + for (CustomButtonParams params : items) { + if (params.showOnToolbar()) continue; + final PendingIntent pendingIntent = params.getPendingIntent(); + OnClickListener clickListener = null; + if (pendingIntent != null) { + clickListener = new OnClickListener() { + @Override + public void onClick(View v) { + Intent addedIntent = new Intent(); + addedIntent.setData(Uri.parse(getActivityTab().getUrl())); + try { + pendingIntent.send(CustomTabActivity.this, 0, addedIntent, null, + null); + } catch (CanceledException e) { + Log.e(TAG, + "CanceledException while sending pending intent."); + } } - } - }; + }; + } + ImageButton button = params.buildBottomBarButton(this, bottomBar, clickListener); + bottomBar.addView(button); } - ImageButton button = params.buildBottomBarButton(this, bottomBar, clickListener); - bottomBar.addView(button); } } @@ -647,11 +720,44 @@ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.putExtra(ChromeLauncherActivity.EXTRA_IS_ALLOWED_TO_RETURN_TO_PARENT, false); - // Temporarily allowing disk access while fixing. TODO: http://crbug.com/581860 + boolean chromeIsDefault; StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskReads(); StrictMode.allowThreadDiskWrites(); try { - startActivity(intent); + chromeIsDefault = ExternalNavigationDelegateImpl + .willChromeHandleIntent(this, intent, true); + } finally { + StrictMode.setThreadPolicy(oldPolicy); + } + + if (chromeIsDefault) { + // Take the activity tab and set it aside for reparenting. + final Tab tab = getActivityTab(); + // TODO(yusufo): The removal should happen as a part of the callback or as a part of + // onDestroy when finish() gets called. Find a way to do this properly without confusing + // the TabModel and without hiding the tab. crbug.com/590278 + getCurrentTabModel().removeTab(getActivityTab()); + mMainTab = null; + tab.getContentViewCore().updateWindowAndroid(null); + + Runnable finalizeCallback = new Runnable() { + @Override + public void run() { + finish(); + } + }; + AsyncTabParamsManager.add( + tab.getId(), new TabReparentingParams(tab, intent, finalizeCallback)); + intent.putExtra(IntentHandler.EXTRA_TAB_ID, tab.getId()); + intent.setPackage(getPackageName()); + } + + // Temporarily allowing disk access while fixing. TODO: http://crbug.com/581860 + StrictMode.allowThreadDiskReads(); + StrictMode.allowThreadDiskWrites(); + try { + startActivity(intent, ActivityOptionsCompat.makeCustomAnimation( + this, R.anim.abc_fade_in, R.anim.abc_fade_out).toBundle()); } finally { StrictMode.setThreadPolicy(oldPolicy); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabContentHandler.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabContentHandler.java index 9ff45873..830e839 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabContentHandler.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabContentHandler.java
@@ -7,6 +7,7 @@ import android.content.Intent; import android.graphics.Bitmap; import android.os.IBinder; +import android.widget.RemoteViews; import org.chromium.content_public.browser.LoadUrlParams; @@ -42,4 +43,10 @@ * @return Whether the action button has been updated. */ boolean updateCustomButton(int id, Bitmap bitmap, String description); + + /** + * Updates the {@link RemoteViews} shown on the secondary toolbar. + * @return Whether this update is successful. + */ + boolean updateRemoteViews(RemoteViews rv); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabIntentDataProvider.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabIntentDataProvider.java index d0ad74c5..3b360c7 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabIntentDataProvider.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabIntentDataProvider.java
@@ -20,6 +20,7 @@ import android.support.customtabs.CustomTabsIntent; import android.text.TextUtils; import android.util.Pair; +import android.widget.RemoteViews; import org.chromium.base.ApiCompatibilityUtils; import org.chromium.base.Log; @@ -89,6 +90,7 @@ private boolean mShowShareItem; private CustomButtonParams mToolbarButton; private List<CustomButtonParams> mBottombarButtons = new ArrayList<>(2); + private RemoteViews mRemoteViews; // OnFinished listener for PendingIntents. Used for testing only. private PendingIntent.OnFinished mOnFinished; @@ -149,6 +151,8 @@ CustomTabsIntent.EXTRA_TITLE_VISIBILITY_STATE, CustomTabsIntent.NO_TITLE); mShowShareItem = IntentUtils.safeGetBooleanExtra(intent, CustomTabsIntent.EXTRA_DEFAULT_SHARE_MENU_ITEM, false); + mRemoteViews = IntentUtils.safeGetParcelableExtra(intent, + CustomTabsIntent.EXTRA_SECONDARY_TOOLBAR_REMOTEVIEWS); } /** @@ -278,7 +282,7 @@ * @return Whether the bottom bar should be shown. */ public boolean shouldShowBottomBar() { - return !mBottombarButtons.isEmpty(); + return !mBottombarButtons.isEmpty() || mRemoteViews != null; } /** @@ -289,6 +293,14 @@ } /** + * @return The {@link RemoteViews} to show on the bottom bar, or null if the extra is not + * specified. + */ + public RemoteViews getBottomBarRemoteViews() { + return mRemoteViews; + } + + /** * Gets params for all custom buttons, which is the combination of * {@link #getCustomButtonsOnBottombar()} and {@link #getCustomButtonOnToolbar()}. */
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnection.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnection.java index 7cac6777..e623f9f 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnection.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnection.java
@@ -26,6 +26,7 @@ import android.support.customtabs.ICustomTabsService; import android.text.TextUtils; import android.view.WindowManager; +import android.widget.RemoteViews; import org.chromium.base.CommandLine; import org.chromium.base.FieldTrialList; @@ -100,6 +101,7 @@ protected final Application mApplication; private final boolean mLogRequests; private final AtomicBoolean mWarmupHasBeenCalled = new AtomicBoolean(); + private final AtomicBoolean mWarmupHasBeenFinished = new AtomicBoolean(); private final ClientManager mClientManager; private ExternalPrerenderHandler mExternalPrerenderHandler; private WebContents mSpareWebContents; @@ -204,6 +206,13 @@ } /** + * @return Whether {@link CustomTabsConnection#warmup(long)} has been called. + */ + public static boolean hasWarmUpBeenFinished(Application application) { + return getInstance(application).mWarmupHasBeenFinished.get(); + } + + /** * Starts as much as possible in anticipation of a future navigation. * * @param mayCreatesparewebcontents true if warmup() can create a spare renderer. @@ -222,6 +231,7 @@ if (mayCreateSpareWebContents && mPrerender == null && !SysUtils.isLowEndDevice()) { createSpareWebContents(); } + mWarmupHasBeenFinished.set(true); } }); return true; @@ -386,27 +396,45 @@ @Override public boolean updateVisuals(final ICustomTabsCallback callback, Bundle bundle) { + final RemoteViews remoteViews = IntentUtils.safeGetParcelable(bundle, + CustomTabsIntent.EXTRA_SECONDARY_TOOLBAR_REMOTEVIEWS); final Bundle actionButtonBundle = IntentUtils.safeGetBundle(bundle, CustomTabsIntent.EXTRA_ACTION_BUTTON_BUNDLE); - if (actionButtonBundle == null) return false; - final int id = actionButtonBundle.getInt(CustomTabsIntent.KEY_ID, - CustomTabsIntent.TOOLBAR_ACTION_BUTTON_ID); - final Bitmap bitmap = CustomButtonParams.parseBitmapFromBundle(actionButtonBundle); - final String description = CustomButtonParams - .parseDescriptionFromBundle(actionButtonBundle); - if (bitmap == null || description == null) return false; - - try { - return ThreadUtils.runOnUiThreadBlocking(new Callable<Boolean>() { - @Override - public Boolean call() throws Exception { - return CustomTabActivity.updateCustomButton(callback.asBinder(), id, bitmap, - description); + boolean result = true; + if (actionButtonBundle != null) { + final int id = IntentUtils.safeGetInt(actionButtonBundle, CustomTabsIntent.KEY_ID, + CustomTabsIntent.TOOLBAR_ACTION_BUTTON_ID); + final Bitmap bitmap = CustomButtonParams.parseBitmapFromBundle(actionButtonBundle); + final String description = CustomButtonParams + .parseDescriptionFromBundle(actionButtonBundle); + if (bitmap != null && description != null) { + try { + result &= ThreadUtils.runOnUiThreadBlocking(new Callable<Boolean>() { + @Override + public Boolean call() throws Exception { + return CustomTabActivity.updateCustomButton(callback.asBinder(), id, + bitmap, description); + } + }); + } catch (ExecutionException e) { + result = false; } - }); - } catch (ExecutionException e) { - return false; + } } + if (remoteViews != null) { + try { + result &= ThreadUtils.runOnUiThreadBlocking(new Callable<Boolean>() { + @Override + public Boolean call() throws Exception { + return CustomTabActivity.updateRemoteViews(callback.asBinder(), + remoteViews); + } + }); + } catch (ExecutionException e) { + result = false; + } + } + return result; } /** @@ -484,7 +512,7 @@ * Notifies the application of a navigation event. * * Delivers the {@link ICustomTabsConnectionCallback#onNavigationEvent} - * callback to the aplication. + * callback to the application. * * @param session The Binder object identifying the session. * @param navigationEvent The navigation event code, defined in {@link CustomTabsCallback}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/document/ChromeLauncherActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/document/ChromeLauncherActivity.java index 70d93139..f23bfb5 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/document/ChromeLauncherActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/document/ChromeLauncherActivity.java
@@ -677,7 +677,10 @@ // re-delivered when a Chrome Activity is restarted. boolean isWebContentsPending = false; int tabId = ActivityDelegate.getTabIdFromIntent(intent); - AsyncTabParamsManager.add(tabId, asyncParams); + if (!AsyncTabParamsManager.hasParamsForTabId(tabId)) { + AsyncTabParamsManager.add(tabId, asyncParams); + } + isWebContentsPending = asyncParams.getWebContents() != null; Bundle options = null; @@ -700,7 +703,7 @@ if (exception.getCause() instanceof TransactionTooLargeException) { Log.e(TAG, "Failed to launch DocumentActivity because Intent was too large"); AsyncTabParamsManager.remove(tabId); - if (isWebContentsPending) asyncParams.getWebContents().destroy(); + asyncParams.destroy(); return false; } throw exception;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/document/DocumentActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/document/DocumentActivity.java index 91bd08b..345fa55 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/document/DocumentActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/document/DocumentActivity.java
@@ -568,15 +568,22 @@ mDefaultThemeColor = isIncognito() ? ApiCompatibilityUtils.getColor(getResources(), R.color.incognito_primary_color) : ApiCompatibilityUtils.getColor(getResources(), R.color.default_primary_color); + AsyncTabParams params = AsyncTabParamsManager.remove( ActivityDelegate.getTabIdFromIntent(getIntent())); + AsyncTabCreationParams asyncParams = params instanceof AsyncTabCreationParams ? (AsyncTabCreationParams) params : null; boolean isAffiliated = asyncParams != null ? asyncParams.isAffiliated() : false; boolean isCreatedWithWebContents = asyncParams != null && asyncParams.getWebContents() != null; - mTab = createActivityTab(asyncParams); + if (params.getTabToReparent() != null) { + mTab = params.getTabToReparent(); + mTab.reparentToActivity(this, new DocumentTabDelegateFactory()); + } else { + mTab = createActivityTab(asyncParams); + } if (asyncParams != null && asyncParams.getWebContents() != null) { Intent parentIntent = IntentUtils.safeGetParcelableExtra(getIntent(),
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/AccountFirstRunFragment.java b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/AccountFirstRunFragment.java index 5557e053..be16f4c3 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/AccountFirstRunFragment.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/AccountFirstRunFragment.java
@@ -12,24 +12,23 @@ import android.view.ViewGroup; import org.chromium.chrome.R; -import org.chromium.chrome.browser.signin.AccountSigninView; /** * A {@link Fragment} meant to handle sync setup for the first run experience. */ -public class AccountFirstRunFragment extends FirstRunPage implements AccountSigninView.Delegate { +public class AccountFirstRunFragment extends FirstRunPage { // Per-page parameters: public static final String FORCE_SIGNIN_ACCOUNT_TO = "ForceSigninAccountTo"; public static final String PRESELECT_BUT_ALLOW_TO_CHANGE = "PreselectButAllowToChange"; public static final String IS_CHILD_ACCOUNT = "IsChildAccount"; - private AccountSigninView mView; + private AccountFirstRunView mView; @Override public View onCreateView( LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - mView = (AccountSigninView) inflater.inflate( - R.layout.account_signin_view, container, false); + mView = (AccountFirstRunView) inflater.inflate( + R.layout.fre_choose_account, container, false); return mView; } @@ -37,7 +36,7 @@ public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); - mView.setListener(new AccountSigninView.Listener() { + mView.setListener(new AccountFirstRunView.Listener() { @Override public void onAccountSelectionCanceled() { getPageDelegate().refuseSignIn(); @@ -71,8 +70,8 @@ // The user would have to go through the FRE again. getPageDelegate().abortFirstRunExperience(); } + }); - mView.setDelegate(this); mView.init(getPageDelegate().getProfileDataCache());
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/signin/AccountSigninView.java b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/AccountFirstRunView.java similarity index 75% rename from chrome/android/java/src/org/chromium/chrome/browser/signin/AccountSigninView.java rename to chrome/android/java/src/org/chromium/chrome/browser/firstrun/AccountFirstRunView.java index 0be5ea95..5b83dff 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/signin/AccountSigninView.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/AccountFirstRunView.java
@@ -2,9 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -package org.chromium.chrome.browser.signin; +package org.chromium.chrome.browser.firstrun; -import android.app.FragmentManager; import android.content.Context; import android.graphics.Bitmap; import android.graphics.drawable.Drawable; @@ -14,29 +13,21 @@ import android.text.method.LinkMovementMethod; import android.text.style.ClickableSpan; import android.util.AttributeSet; -import android.view.Gravity; import android.view.View; -import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Button; +import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.Spinner; import android.widget.TextView; import org.chromium.base.ApiCompatibilityUtils; -import org.chromium.base.metrics.RecordUserAction; import org.chromium.chrome.R; -import org.chromium.chrome.browser.firstrun.FirstRunView; -import org.chromium.chrome.browser.firstrun.ImageCarousel; import org.chromium.chrome.browser.firstrun.ImageCarousel.ImageCarouselPositionChangeListener; -import org.chromium.chrome.browser.firstrun.ProfileDataCache; -import org.chromium.chrome.browser.preferences.PrefServiceBridge; import org.chromium.chrome.browser.profiles.ProfileDownloader; -import org.chromium.chrome.browser.sync.ui.ConfirmImportSyncDataDialog; -import org.chromium.chrome.browser.sync.ui.ConfirmImportSyncDataDialog.ImportSyncType; -import org.chromium.signin.InvestigatedScenario; +import org.chromium.chrome.browser.signin.SigninManager; import org.chromium.sync.signin.AccountManagerHelper; import org.chromium.ui.text.SpanApplier; import org.chromium.ui.text.SpanApplier.SpanInfo; @@ -46,11 +37,10 @@ /** * This view allows the user to select an account to log in to, add an account, * cancel account selection, etc. Users of this class should - * {@link AccountSigninView#setListener(Listener)} and - * {@link AccountSigninView#setDelegate(Delegate) after the view has been inflated. + * {@link AccountFirstRunView#setListener(Listener)} after the view has been + * inflated. */ - -public class AccountSigninView extends FirstRunView +public class AccountFirstRunView extends FrameLayout implements ImageCarouselPositionChangeListener, ProfileDownloader.Observer { /** @@ -69,7 +59,7 @@ /** * The user selected an account. - * This call will be followed immediately by either {@link #onSettingsClicked} or + * This call will be followed by either {@link #onSettingsClicked} or * {@link #onDoneClicked}. * @param accountName The name of the account */ @@ -94,18 +84,6 @@ public void onFailedToSetForcedAccount(String forcedAccountName); } - // TODO(peconn): Investigate expanding the Delegate to simplify the Listener implementations. - - /** - * Provides UI objects for new UI component creation. - */ - public interface Delegate { - /** - * Provides a FragmentManager for the view to create dialogs. - */ - public FragmentManager getFragmentManager(); - } - private class SpinnerOnItemSelectedListener implements AdapterView.OnItemSelectedListener { @Override public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) { @@ -117,7 +95,6 @@ mSpinner.setSelection(oldPosition, false); mListener.onNewAccount(); - RecordUserAction.record("Signin_AddAccountToDevice"); } else { mAccountName = accountName; if (!mPositionSetProgrammatically) mImageCarousel.scrollTo(pos, false, false); @@ -130,28 +107,6 @@ } } - /** - * A class that overrides the spinner styling when it is disabled (an account is selected). - */ - private class AccountSpinnerArrayAdapter extends ArrayAdapter<CharSequence> { - /** - * Creates an AccountSpinnerArrayAdapter for the given context from the given resource. - */ - public AccountSpinnerArrayAdapter(Context context, int resource) { - super(context, resource); - } - - @Override - public View getView(int position, View convertView, ViewGroup parent) { - View view = super.getView(position, convertView, parent); - if (!mSpinner.isEnabled()) { - view.setPadding(0, view.getPaddingTop(), 0, view.getPaddingBottom()); - parent.setPadding(0, parent.getPaddingTop(), 0, parent.getPaddingTop()); - } - return view; - } - } - private static final String TAG = "AccountFirstRunView"; private static final int EXPERIMENT_TITLE_VARIANT_MASK = 1; @@ -171,7 +126,6 @@ private TextView mTitle; private TextView mDescriptionText; private Listener mListener; - private Delegate mDelegate; private Spinner mSpinner; private Drawable mSpinnerBackground; private String mForcedAccountName; @@ -184,10 +138,9 @@ private int mCancelButtonTextId; private boolean mIsChildAccount; private boolean mHorizontalModeEnabled = true; - private boolean mDynamicPaddingEnabled = true; private boolean mShowSettingsSpan = true; - public AccountSigninView(Context context, AttributeSet attrs) { + public AccountFirstRunView(Context context, AttributeSet attrs) { super(context, attrs); mAccountManagerHelper = AccountManagerHelper.get(getContext().getApplicationContext()); } @@ -214,7 +167,7 @@ protected void onFinishInflate() { super.onFinishInflate(); - mImageCarousel = (ImageCarousel) findViewById(R.id.image); + mImageCarousel = (ImageCarousel) findViewById(R.id.image_slider); mImageCarousel.setListener(this); mPositiveButton = (Button) findViewById(R.id.positive_button); @@ -229,17 +182,21 @@ mDescriptionText = (TextView) findViewById(R.id.description); // For the spans to be clickable. mDescriptionText.setMovementMethod(LinkMovementMethod.getInstance()); - mDescriptionTextId = R.string.signin_account_choice_description; + mDescriptionTextId = R.string.fre_account_choice_description; // TODO(peconn): Ensure this is changed to R.string.cancel when used in Settings > Sign In. - mCancelButtonTextId = R.string.no_thanks; + mCancelButtonTextId = R.string.fre_skip_text; - mAddAnotherAccount = getResources().getString(R.string.signin_add_account); + // Set the invisible TextView to contain the longest text the visible TextView can hold. + // It assumes that the signed in description for child accounts is the longest text. + ((TextView) findViewById(R.id.longest_description)).setText(getSignedInDescription(true)); + + mAddAnotherAccount = getResources().getString(R.string.fre_add_account); mSpinner = (Spinner) findViewById(R.id.google_accounts_spinner); mSpinnerBackground = mSpinner.getBackground(); - mArrayAdapter = new AccountSpinnerArrayAdapter(getContext().getApplicationContext(), - R.layout.fre_spinner_text); + mArrayAdapter = new ArrayAdapter<CharSequence>( + getContext().getApplicationContext(), R.layout.fre_spinner_text); mArrayAdapter.setDropDownViewResource(R.layout.fre_spinner_dropdown); mSpinner.setAdapter(mArrayAdapter); @@ -256,13 +213,13 @@ public boolean performAccessibilityAction(View host, int action, Bundle args) { if (mSpinner.getContentDescription() == null) { mSpinner.setContentDescription(getResources().getString( - R.string.accessibility_signin_account_spinner)); + R.string.accessibility_fre_account_spinner)); } return super.performAccessibilityAction(host, action, args); } }); - showSigninPage(); + showSignInPage(); } @Override @@ -279,19 +236,33 @@ // A new account has been added and the visibility has returned to us. // The updateAccounts function will have selected the new account. // Shortcut to confirm sign in page. - checkForPreviousAccountThenShowConfirmSigninPage(); + showConfirmSignInPage(); } } } @Override - protected boolean isHorizontalModeEnabled() { - return mHorizontalModeEnabled; - } - - @Override - protected boolean isDynamicPaddingEnabled() { - return mDynamicPaddingEnabled; + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + // This assumes that view's layout_width is set to match_parent. + assert MeasureSpec.getMode(widthMeasureSpec) == MeasureSpec.EXACTLY; + int width = MeasureSpec.getSize(widthMeasureSpec); + int height = MeasureSpec.getSize(heightMeasureSpec); + LinearLayout content = (LinearLayout) findViewById(R.id.fre_content); + int paddingStart = 0; + if (mHorizontalModeEnabled + && width >= 2 * getResources().getDimension(R.dimen.fre_image_carousel_width) + && width > height) { + content.setOrientation(LinearLayout.HORIZONTAL); + paddingStart = getResources().getDimensionPixelSize(R.dimen.fre_margin); + } else { + content.setOrientation(LinearLayout.VERTICAL); + } + ApiCompatibilityUtils.setPaddingRelative(content, + paddingStart, + content.getPaddingTop(), + ApiCompatibilityUtils.getPaddingEnd(content), + content.getPaddingBottom()); + super.onMeasure(widthMeasureSpec, heightMeasureSpec); } /** @@ -301,7 +272,6 @@ */ public void configureForRecentTabsOrBookmarksPage() { mHorizontalModeEnabled = false; - mDynamicPaddingEnabled = false; mShowSettingsSpan = false; setBackgroundResource(R.color.ntp_bg); @@ -327,8 +297,7 @@ } mDescriptionTextId = (experimentGroup & EXPERIMENT_SUMMARY_VARIANT_MASK) != 0 - ? R.string.signin_sign_in_to_chrome_summary_variant - : R.string.sign_in_to_chrome_summary; + ? R.string.sign_in_to_chrome_summary_variant : R.string.sign_in_to_chrome_summary; if ((experimentGroup & EXPERIMENT_LAYOUT_VARIANT_MASK) != 0) { mImageCarousel.setVisibility(GONE); @@ -338,7 +307,7 @@ illustrationView.setBackgroundColor(ApiCompatibilityUtils.getColor(getResources(), R.color.illustration_background_color)); - LinearLayout linearLayout = (LinearLayout) findViewById(R.id.fre_main_layout); + LinearLayout linearLayout = (LinearLayout) findViewById(R.id.fre_account_linear_layout); linearLayout.addView(illustrationView, 0); } } @@ -363,14 +332,6 @@ } /** - * Set the UI object creation delegate. See {@link Delegate} - * @param delegate The delegate. - */ - public void setDelegate(Delegate delegate) { - mDelegate = delegate; - } - - /** * Refresh the list of available system account. * @return Whether any new accounts were added (the first newly added account will now be * selected). @@ -398,14 +359,14 @@ mArrayAdapter.addAll(mAccountNames); mArrayAdapter.add(mAddAnotherAccount); - setUpSigninButton(true); + setUpSignInButton(true); mDescriptionText.setText(mDescriptionTextId); } else { mSpinner.setVisibility(View.GONE); mArrayAdapter.add(mAddAnotherAccount); - setUpSigninButton(false); - mDescriptionText.setText(R.string.signin_no_account_choice_description); + setUpSignInButton(false); + mDescriptionText.setText(R.string.fre_no_account_choice_description); } if (mProfileData != null) mProfileData.update(); @@ -477,42 +438,23 @@ if (name == null) name = mProfileData.getFullName(mAccountName); } if (name == null) name = mAccountName; - String text = String.format(getResources().getString(R.string.signin_hi_name), name); + String text = String.format(getResources().getString(R.string.fre_hi_name), name); mTitle.setText(text); } /** * Updates the view to show that sign in has completed. - * This should only be used if the user is not currently signed in (eg on the First - * Run Experience). */ public void switchToSignedMode() { - // TODO(peconn): Add a warning here - showConfirmSigninPage(); + showConfirmSignInPage(); } - private void configureSpinner(boolean signinPage) { - mSpinner.setEnabled(signinPage); - MarginLayoutParams params = (MarginLayoutParams) mSpinner.getLayoutParams(); - if (signinPage) { - mSpinner.setBackground(mSpinnerBackground); - params.bottomMargin = getResources().getDimensionPixelSize( - R.dimen.fre_vertical_spacing); - } else { - mSpinner.setBackground(null); - params.bottomMargin = getResources().getDimensionPixelSize( - R.dimen.signin_spinner_selected_bottom_padding); - mSpinner.setGravity(Gravity.CENTER_VERTICAL); - } - - mSpinner.setLayoutParams(params); - } - - private void showSigninPage() { + private void showSignInPage() { mSignedIn = false; mTitle.setText(R.string.sign_in_to_chrome); - configureSpinner(true); + mSpinner.setEnabled(true); + mSpinner.setBackground(mSpinnerBackground); mImageCarousel.setVisibility(VISIBLE); setUpCancelButton(); @@ -521,11 +463,12 @@ mImageCarousel.setSignedInMode(false); } - private void showConfirmSigninPage() { + private void showConfirmSignInPage() { mSignedIn = true; updateProfileName(); - configureSpinner(false); + mSpinner.setEnabled(false); + mSpinner.setBackground(null); setUpConfirmButton(); setUpUndoButton(); @@ -539,7 +482,7 @@ @Override public void updateDrawState(TextPaint textPaint) { - textPaint.setColor(getResources().getColor(R.color.ui_link_text_color)); + textPaint.setColor(textPaint.linkColor); textPaint.setUnderlineText(false); } }; @@ -556,26 +499,6 @@ mImageCarousel.setSignedInMode(true); } - private void checkForPreviousAccountThenShowConfirmSigninPage() { - if (SigninInvestigator.investigate(mAccountName) - == InvestigatedScenario.DIFFERENT_ACCOUNT) { - - ConfirmImportSyncDataDialog.showNewInstance( - PrefServiceBridge.getInstance().getSyncLastAccountName(), - mAccountName, - ImportSyncType.PREVIOUS_DATA_FOUND, - mDelegate.getFragmentManager(), - new ConfirmImportSyncDataDialog.Listener() { - @Override - public void onConfirm() { - showConfirmSigninPage(); - } - }); - } else { - showConfirmSigninPage(); - } - } - private void setUpCancelButton() { setNegativeButtonVisible(true); @@ -589,20 +512,20 @@ }); } - private void setUpSigninButton(boolean hasAccounts) { - mPositiveButton.setText(R.string.choose_account_sign_in); + private void setUpSignInButton(boolean hasAccounts) { if (hasAccounts) { + mPositiveButton.setText(R.string.choose_account_sign_in); mPositiveButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { - checkForPreviousAccountThenShowConfirmSigninPage(); + showConfirmSignInPage(); } }); } else { + mPositiveButton.setText(R.string.fre_no_accounts); mPositiveButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { - RecordUserAction.record("Signin_AddAccountToDevice"); mListener.onNewAccount(); } }); @@ -617,14 +540,13 @@ mNegativeButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { - RecordUserAction.record("Signin_Undo_Signin"); - showSigninPage(); + showSignInPage(); } }); } private void setUpConfirmButton() { - mPositiveButton.setText(getResources().getText(R.string.signin_accept)); + mPositiveButton.setText(getResources().getText(R.string.fre_accept)); mPositiveButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { @@ -646,10 +568,10 @@ private String getSignedInDescription(boolean childAccount) { if (childAccount) { - return getResources().getString(R.string.signin_signed_in_description) + '\n' - + getResources().getString(R.string.signin_signed_in_description_uca_addendum); + return getResources().getString(R.string.fre_signed_in_description) + '\n' + + getResources().getString(R.string.fre_signed_in_description_uca_addendum); } else { - return getResources().getString(R.string.signin_signed_in_description); + return getResources().getString(R.string.fre_signed_in_description); } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/DataReductionProxyView.java b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/DataReductionProxyView.java new file mode 100644 index 0000000..52890aaf --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/DataReductionProxyView.java
@@ -0,0 +1,47 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.firstrun; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.View.MeasureSpec; +import android.widget.FrameLayout; +import android.widget.LinearLayout; + +import org.chromium.base.ApiCompatibilityUtils; +import org.chromium.chrome.R; + +/** + * View that handles orientation changes for the Data Saver first run page. + */ +public class DataReductionProxyView extends FrameLayout { + + public DataReductionProxyView(Context context, AttributeSet attrs) { + super(context, attrs); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + // This assumes that view's layout_width is set to match_parent. + assert MeasureSpec.getMode(widthMeasureSpec) == MeasureSpec.EXACTLY; + int width = MeasureSpec.getSize(widthMeasureSpec); + int height = MeasureSpec.getSize(heightMeasureSpec); + LinearLayout content = (LinearLayout) findViewById(R.id.fre_content); + int paddingStart = 0; + if (width >= 2 * getResources().getDimension(R.dimen.fre_image_carousel_width) + && width > height) { + content.setOrientation(LinearLayout.HORIZONTAL); + paddingStart = getResources().getDimensionPixelSize(R.dimen.fre_margin); + } else { + content.setOrientation(LinearLayout.VERTICAL); + } + ApiCompatibilityUtils.setPaddingRelative(content, + paddingStart, + content.getPaddingTop(), + ApiCompatibilityUtils.getPaddingEnd(content), + content.getPaddingBottom()); + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + } +} \ No newline at end of file
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunView.java b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunView.java deleted file mode 100644 index d360389..0000000 --- a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunView.java +++ /dev/null
@@ -1,118 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.chrome.browser.firstrun; - -import android.content.Context; -import android.util.AttributeSet; -import android.view.View; -import android.widget.FrameLayout; -import android.widget.LinearLayout; - -import org.chromium.base.ApiCompatibilityUtils; -import org.chromium.chrome.R; - -/** - * A page shown during the First Run Experience. It modifies the layout for a better appearance - * for certain screen dimensions. - */ -public class FirstRunView extends FrameLayout { - private static final String TAG = "FirstRunView"; - - private View mMainLayout; - private LinearLayout mImageAndContent; - private LinearLayout mContentWrapper; - - /** - * Constructor for inflating via XML. - */ - public FirstRunView(Context context, AttributeSet attrs) { - super(context, attrs); - } - - @Override - protected void onFinishInflate() { - super.onFinishInflate(); - // TODO(peconn): Unify the common parts of the FirstRunView layouts. - // TODO(peconn): Use different layout files for the landscape and horizontal parts - - mMainLayout = findViewById(R.id.fre_main_layout); - mImageAndContent = (LinearLayout) findViewById(R.id.fre_image_and_content); - mContentWrapper = (LinearLayout) findViewById(R.id.fre_content_wrapper); - - - } - - protected boolean isHorizontalModeEnabled() { - return true; - } - - protected boolean isDynamicPaddingEnabled() { - return true; - } - - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - // This assumes that view's layout_width is set to match_parent. - assert MeasureSpec.getMode(widthMeasureSpec) == MeasureSpec.EXACTLY; - - int width = MeasureSpec.getSize(widthMeasureSpec); - int height = MeasureSpec.getSize(heightMeasureSpec); - - MarginLayoutParams contentWrapperLayout = - (MarginLayoutParams) mContentWrapper.getLayoutParams(); - - int imageAndContentPaddingStart = 0; - int halfContentHeight = 0; - // The AccountSigninView is part of the First Run Experience, and it's image carousel is - // the widest of the 'image's to be displayed in the FRE. - if (isHorizontalModeEnabled() - && width >= 2 * getResources().getDimension(R.dimen.signin_image_carousel_width) - && width > height) { - mImageAndContent.setOrientation(LinearLayout.HORIZONTAL); - imageAndContentPaddingStart = getResources().getDimensionPixelSize(R.dimen.fre_margin); - - contentWrapperLayout.width = 0; - contentWrapperLayout.height = LayoutParams.WRAP_CONTENT; - contentWrapperLayout.topMargin = 0; - - halfContentHeight = getResources().getDimensionPixelSize(R.dimen.fre_title_text_size) - + getResources().getDimensionPixelSize(R.dimen.fre_vertical_spacing) - + getResources().getDimensionPixelSize(R.dimen.fre_image_height) / 2; - - } else { - mImageAndContent.setOrientation(LinearLayout.VERTICAL); - - contentWrapperLayout.width = LayoutParams.WRAP_CONTENT; - contentWrapperLayout.height = 0; - contentWrapperLayout.topMargin = - getResources().getDimensionPixelSize(R.dimen.fre_vertical_spacing); - - halfContentHeight = getResources().getDimensionPixelSize(R.dimen.fre_title_text_size) - + getResources().getDimensionPixelSize(R.dimen.fre_vertical_spacing) - + getResources().getDimensionPixelSize(R.dimen.fre_image_height) - + getResources().getDimensionPixelSize(R.dimen.fre_vertical_spacing); - } - - // Add padding to get it roughly centered. - if (isDynamicPaddingEnabled()) { - int topPadding = Math.max(0, (height / 2) - halfContentHeight); - - mMainLayout.setPadding(mMainLayout.getPaddingLeft(), topPadding, - mMainLayout.getPaddingRight(), mMainLayout.getPaddingBottom()); - } - - ApiCompatibilityUtils.setPaddingRelative(mImageAndContent, - imageAndContentPaddingStart, - mImageAndContent.getPaddingTop(), - ApiCompatibilityUtils.getPaddingEnd(mImageAndContent), - mImageAndContent.getPaddingBottom()); - - mContentWrapper.setLayoutParams(contentWrapperLayout); - - super.onMeasure(widthMeasureSpec, heightMeasureSpec); - } - -} -
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/ImageCarousel.java b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/ImageCarousel.java index c4d17b25..499bac2 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/ImageCarousel.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/ImageCarousel.java
@@ -258,7 +258,7 @@ public void onFinishInflate() { super.onFinishInflate(); - mImageWidth = getResources().getDimensionPixelSize(R.dimen.fre_image_height); + mImageWidth = getResources().getDimensionPixelSize(R.dimen.fre_image_carousel_height); for (int i = 0; i < VIEW_COUNT; ++i) { ImageView view = new ImageView(getContext()); FrameLayout.LayoutParams params = @@ -269,7 +269,7 @@ addView(view); } - mCarouselWidth = getResources().getDimensionPixelSize(R.dimen.signin_image_carousel_width); + mCarouselWidth = getResources().getDimensionPixelSize(R.dimen.fre_image_carousel_width); mScrollScalingFactor = SCROLL_FACTOR * mCarouselWidth; mFlingScalingFactor = FLING_FACTOR * mCarouselWidth; mTranslationFactor = TRANSLATION_FACTOR * mImageWidth; @@ -426,7 +426,7 @@ } private void setLayoutParamsForCheckmark(View view) { - int size = getResources().getDimensionPixelSize(R.dimen.signin_checkmark_size); + int size = getResources().getDimensionPixelSize(R.dimen.fre_checkmark_size); FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(size, size); params.gravity = Gravity.CENTER;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/ToSAndUMAFirstRunFragment.java b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/ToSAndUMAFirstRunFragment.java index 14aa3c6..61c2d506 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/ToSAndUMAFirstRunFragment.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/ToSAndUMAFirstRunFragment.java
@@ -6,7 +6,6 @@ import android.content.Context; import android.os.Bundle; -import android.text.TextPaint; import android.text.method.LinkMovementMethod; import android.text.style.ClickableSpan; import android.view.LayoutInflater; @@ -65,8 +64,7 @@ mTosAndPrivacy.setMovementMethod(LinkMovementMethod.getInstance()); - int linkColor = getResources().getColor(R.color.ui_link_text_color); - ClickableSpan clickableTermsSpan = new FreClickableSpan(linkColor) { + ClickableSpan clickableTermsSpan = new ClickableSpan() { @Override public void onClick(View widget) { if (!isAdded()) return; @@ -75,7 +73,7 @@ } }; - ClickableSpan clickablePrivacySpan = new FreClickableSpan(linkColor) { + ClickableSpan clickablePrivacySpan = new ClickableSpan() { @Override public void onClick(View widget) { if (!isAdded()) return; @@ -88,24 +86,6 @@ new SpanInfo("<LINK2>", "</LINK2>", clickablePrivacySpan))); } - // TODO(peconn): Move this out into a more general class. - private abstract static class FreClickableSpan extends ClickableSpan { - private final int mColor; - - /** - * Creates a clickable span that styles without an underline and uses the given color. - */ - public FreClickableSpan(int color) { - mColor = color; - } - - @Override - public void updateDrawState(TextPaint textPaint) { - textPaint.setColor(mColor); - textPaint.setUnderlineText(false); - } - } - @Override public boolean shouldSkipPageOnCreate(Context appContext) { return PrefServiceBridge.getInstance().isFirstRunEulaAccepted();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/TosAndUmaView.java b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/TosAndUmaView.java new file mode 100644 index 0000000..3c8ec64 --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/TosAndUmaView.java
@@ -0,0 +1,53 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.firstrun; + +import android.content.Context; +import android.util.AttributeSet; +import android.widget.FrameLayout; +import android.widget.LinearLayout; + +import org.chromium.base.ApiCompatibilityUtils; +import org.chromium.chrome.R; + +/** + * View that handles orientation changes for Terms of Service and UMA first run page. + */ +public class TosAndUmaView extends FrameLayout { + + public TosAndUmaView(Context context, AttributeSet attrs) { + super(context, attrs); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + // This assumes that view's layout_width is set to match_parent. + assert MeasureSpec.getMode(widthMeasureSpec) == MeasureSpec.EXACTLY; + int width = MeasureSpec.getSize(widthMeasureSpec); + int height = MeasureSpec.getSize(heightMeasureSpec); + LinearLayout content = (LinearLayout) findViewById(R.id.fre_content); + LinearLayout wrapper = (LinearLayout) findViewById(R.id.text_wrapper); + MarginLayoutParams params = (MarginLayoutParams) wrapper.getLayoutParams(); + int paddingStart = 0; + if (width >= 2 * getResources().getDimension(R.dimen.fre_image_carousel_width) + && width > height) { + content.setOrientation(LinearLayout.HORIZONTAL); + paddingStart = getResources().getDimensionPixelSize(R.dimen.fre_margin); + params.width = 0; + params.height = LayoutParams.WRAP_CONTENT; + } else { + content.setOrientation(LinearLayout.VERTICAL); + params.width = LayoutParams.WRAP_CONTENT; + params.height = 0; + } + ApiCompatibilityUtils.setPaddingRelative(content, + paddingStart, + content.getPaddingTop(), + ApiCompatibilityUtils.getPaddingEnd(content), + content.getPaddingBottom()); + wrapper.setLayoutParams(params); + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + } +}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/RecentTabsPromoView.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/RecentTabsPromoView.java index 352e9e5..f84cdee 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/RecentTabsPromoView.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/RecentTabsPromoView.java
@@ -8,7 +8,6 @@ import android.animation.AnimatorListenerAdapter; import android.animation.ObjectAnimator; import android.app.Activity; -import android.app.FragmentManager; import android.graphics.Color; import android.view.Gravity; import android.view.LayoutInflater; @@ -17,9 +16,9 @@ import android.widget.TextView; import org.chromium.chrome.R; +import org.chromium.chrome.browser.firstrun.AccountFirstRunView; import org.chromium.chrome.browser.firstrun.ProfileDataCache; import org.chromium.chrome.browser.signin.AccountAdder; -import org.chromium.chrome.browser.signin.AccountSigninView; import org.chromium.chrome.browser.signin.SigninManager; import org.chromium.sync.AndroidSyncSettings.AndroidSyncSettingsObserver; @@ -177,7 +176,7 @@ } if (animate && mPromoType == PROMO_TYPE_SIGN_IN) { - ((AccountSigninView) mPromo).switchToSignedMode(); + ((AccountFirstRunView) mPromo).switchToSignedMode(); } final View oldPromo = mPromo; @@ -250,13 +249,13 @@ } private View createSignInPromoView() { - AccountSigninView signInPromoView = (AccountSigninView) LayoutInflater.from(getContext()) - .inflate(R.layout.account_signin_view, this, false); + AccountFirstRunView signInPromoView = (AccountFirstRunView) + LayoutInflater.from(getContext()).inflate(R.layout.fre_choose_account, this, false); signInPromoView.init(mModel.getProfileDataCache()); signInPromoView.getLayoutParams().height = LayoutParams.WRAP_CONTENT; ((FrameLayout.LayoutParams) signInPromoView.getLayoutParams()).gravity = Gravity.CENTER; signInPromoView.configureForRecentTabsOrBookmarksPage(); - signInPromoView.setListener(new AccountSigninView.Listener() { + signInPromoView.setListener(new AccountFirstRunView.Listener() { private String mAccountName; @Override @@ -294,12 +293,6 @@ assert false : "No forced accounts in SignInPromoView"; } }); - signInPromoView.setDelegate(new AccountSigninView.Delegate() { - @Override - public FragmentManager getFragmentManager() { - return mActivity.getFragmentManager(); - } - }); SigninManager.logSigninStartAccessPoint(mModel.getAccessPoint()); return signInPromoView; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/RecentTabsRowAdapter.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/RecentTabsRowAdapter.java index a301e552..6afa1e0 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/RecentTabsRowAdapter.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/RecentTabsRowAdapter.java
@@ -600,7 +600,9 @@ RecordUserAction.record("Signin_Signin_FromRecentTabs"); } @Override - public void onNewAccount() {} + public void onNewAccount() { + RecordUserAction.record("Signin_AddAccountToDevice"); + } @Override public void onAccountSelectionCancelled() { mRecentTabsManager.setSigninPromoDeclined();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageTabObserver.java b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageTabObserver.java index 69fe1e68..2ded01d3 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageTabObserver.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageTabObserver.java
@@ -102,8 +102,6 @@ if (mWasHidden) { if (mConnected) { OfflinePageUtils.showReloadSnackbar(mActivity, mSnackbarController); - } else { - OfflinePageUtils.showEditSnackbar(mActivity, mSnackbarController); } mWasHidden = false;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtils.java index 4f7af13b..16a55f2 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtils.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtils.java
@@ -11,12 +11,9 @@ import org.chromium.base.metrics.RecordUserAction; import org.chromium.chrome.R; import org.chromium.chrome.browser.ChromeActivity; -import org.chromium.chrome.browser.bookmarks.BookmarkUtils; import org.chromium.chrome.browser.snackbar.Snackbar; import org.chromium.chrome.browser.snackbar.SnackbarManager.SnackbarController; import org.chromium.chrome.browser.tab.Tab; -import org.chromium.components.bookmarks.BookmarkId; -import org.chromium.components.bookmarks.BookmarkType; import org.chromium.components.offlinepages.FeatureMode; import org.chromium.content_public.browser.LoadUrlParams; import org.chromium.net.NetworkChangeNotifier; @@ -29,7 +26,6 @@ private static final String TAG = "OfflinePageUtils"; /** Snackbar button types */ public static final int RELOAD_BUTTON = 0; - public static final int EDIT_BUTTON = 1; private static final int SNACKBAR_DURATION = 6 * 1000; // 6 second @@ -192,38 +188,17 @@ /** * Shows the "reload" snackbar for the given tab. + * @param activity The activity owning the tab. + * @param snackbarController Class to show the snackbar. */ public static void showReloadSnackbar(final ChromeActivity activity, final SnackbarController snackbarController) { Log.d(TAG, "showReloadSnackbar called with controller " + snackbarController); - int buttonType = RELOAD_BUTTON; - int actionTextId = R.string.reload; - showOfflineSnackbar(activity, snackbarController, buttonType, actionTextId); - } - - public static void showEditSnackbar(final ChromeActivity activity, - final SnackbarController snackbarController) { - int buttonType = EDIT_BUTTON; - int actionTextId = R.string.bookmark_item_edit; - showOfflineSnackbar(activity, snackbarController, buttonType, actionTextId); - } - - /** - * Shows the snackbar for the current tab to provide offline specific information. - * @param activity The activity owning the tab. - * @param snackbarController Class to show the snackbar. - * @param buttonType Which snackbar button to show. - * @param actionTextId Resource ID of the text to put on the snackbar button. - */ - public static void showOfflineSnackbar(final ChromeActivity activity, - final SnackbarController snackbarController, int buttonType, final int actionTextId) { Context context = activity.getBaseContext(); - final int snackbarTextId = getStringId(R.string.offline_pages_viewing_offline_page); - - Snackbar snackbar = Snackbar - .make(context.getString(snackbarTextId), snackbarController, Snackbar.TYPE_ACTION) - .setAction(context.getString(actionTextId), buttonType); + Snackbar snackbar = Snackbar.make(context.getString(snackbarTextId), snackbarController, + Snackbar.TYPE_ACTION) + .setAction(context.getString(R.string.reload), RELOAD_BUTTON); Log.d(TAG, "made snackbar with controller " + snackbarController); snackbar.setDuration(SNACKBAR_DURATION); activity.getSnackbarManager().showSnackbar(snackbar); @@ -234,48 +209,23 @@ */ private static SnackbarController getSnackbarController( final ChromeActivity activity, final Tab tab) { - final long bookmarkId = tab.getUserBookmarkId(); final int tabId = tab.getId(); Log.d(TAG, "building snackbar controller"); return new SnackbarController() { @Override public void onAction(Object actionData) { + assert RELOAD_BUTTON == (int) actionData; + RecordUserAction.record("OfflinePages.ReloadButtonClicked"); Tab foundTab = activity.getTabModelSelector().getTabById(tabId); if (foundTab == null) return; - int buttonType = (int) actionData; - switch (buttonType) { - case RELOAD_BUTTON: - RecordUserAction.record("OfflinePages.ReloadButtonClicked"); - foundTab.loadUrl(new LoadUrlParams( - foundTab.getOfflinePageOriginalUrl(), PageTransition.RELOAD)); - break; - case EDIT_BUTTON: - RecordUserAction.record("OfflinePages.ViewingOffline.EditButtonClicked"); - BookmarkUtils.startEditActivity( - activity, new BookmarkId(bookmarkId, BookmarkType.NORMAL), null); - break; - default: - assert false; - break; - } + foundTab.loadUrl(new LoadUrlParams( + foundTab.getOfflinePageOriginalUrl(), PageTransition.RELOAD)); } @Override public void onDismissNoAction(Object actionData) { - if (actionData == null) return; - int buttonType = (int) actionData; - switch (buttonType) { - case RELOAD_BUTTON: - RecordUserAction.record("OfflinePages.ReloadButtonNotClicked"); - break; - case EDIT_BUTTON: - RecordUserAction.record("OfflinePages.ViewingOffline.EditButtonNotClicked"); - break; - default: - assert false; - break; - } + RecordUserAction.record("OfflinePages.ReloadButtonNotClicked"); } }; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java index 9cf07f47..47a8f13 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java
@@ -1290,14 +1290,13 @@ mNavigationButton.setImageDrawable(null); break; case OFFLINE: - mNavigationButton.setImageResource(R.drawable.offline_bolt); + mNavigationButton.setImageResource( + mUseDarkColors ? R.drawable.offline_bolt : R.drawable.offline_bolt_light); break; default: assert false; } - mNavigationButton.setAlpha(buttonType == NavigationButtonType.OFFLINE ? 0.54f : 1.0f); - if (mNavigationButton.getVisibility() != VISIBLE) { mNavigationButton.setVisibility(VISIBLE); } @@ -1314,10 +1313,20 @@ private void updateVerboseStatusVisibility() { boolean verboseStatusVisible = mNavigationButtonType == NavigationButtonType.OFFLINE && !mUrlHasFocus; + int verboseStatusVisibility = verboseStatusVisible ? VISIBLE : GONE; + + mVerboseStatusTextView.setTextColor(ApiCompatibilityUtils.getColor(getResources(), + mUseDarkColors ? R.color.locationbar_verbose_status_color + : R.color.locationbar_light_verbose_status_color)); mVerboseStatusTextView.setVisibility(verboseStatusVisibility); - findViewById(R.id.location_bar_verbose_status_separator) - .setVisibility(verboseStatusVisibility); + + View separator = findViewById(R.id.location_bar_verbose_status_separator); + separator.setBackgroundColor(ApiCompatibilityUtils.getColor(getResources(), mUseDarkColors + ? R.color.locationbar_status_separator_color + : R.color.locationbar_light_status_separator_color)); + separator.setVisibility(verboseStatusVisibility); + findViewById(R.id.location_bar_verbose_status_extra_space) .setVisibility(verboseStatusVisibility); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/pageinfo/WebsiteSettingsPopup.java b/chrome/android/java/src/org/chromium/chrome/browser/pageinfo/WebsiteSettingsPopup.java index 77ae5c0..e1d39cea 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/pageinfo/WebsiteSettingsPopup.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/pageinfo/WebsiteSettingsPopup.java
@@ -400,13 +400,17 @@ } }); - // Work out the URL and connection message. + // Work out the URL and connection message and status visibility. + int statusIconVisibility = View.GONE; if (isShowingOfflinePage()) { mFullUrl = mOfflinePageOriginalUrl; + statusIconVisibility = View.VISIBLE; } else { mFullUrl = mWebContents.getVisibleUrl(); } + mContainer.findViewById(R.id.offline_icon).setVisibility(statusIconVisibility); + try { mParsedUrl = new URI(mFullUrl); mIsInternalPage = UrlUtilities.isInternalScheme(mParsedUrl);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/physicalweb/PhysicalWebDiagnosticsPage.java b/chrome/android/java/src/org/chromium/chrome/browser/physicalweb/PhysicalWebDiagnosticsPage.java index bf019ad..ad766445 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/physicalweb/PhysicalWebDiagnosticsPage.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/physicalweb/PhysicalWebDiagnosticsPage.java
@@ -102,114 +102,57 @@ sb.append(String.format("<font color=\"%s\">%s</font><br/>", color, message)); } - private boolean appendSdkVersionReport(StringBuilder sb) { - boolean isAndroidKOrLater = (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT); - - sb.append("Android SDK version: "); - appendResult(sb, isAndroidKOrLater, "Compatible", "Incompatible"); - return isAndroidKOrLater; - } - - private boolean appendDataConnectivityReport(StringBuilder sb) { - ConnectivityManager cm = - (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE); - boolean isDataConnectionActive = (cm.getActiveNetworkInfo() != null - && cm.getActiveNetworkInfo().isConnectedOrConnecting()); - - sb.append("Data connection: "); - appendResult(sb, isDataConnectionActive, "Connected", "Not connected"); - return isDataConnectionActive; - } - - private boolean isBluetoothPermissionGranted() { - return PermissionChecker.checkSelfPermission(mContext, Manifest.permission.BLUETOOTH) - == PackageManager.PERMISSION_GRANTED; - } - - private int appendBluetoothReport(StringBuilder sb) { - // Chrome normally does not have the Bluetooth permission, which is required to check - // whether Bluetooth is enabled. Without the Bluetooth permission we must ask the user to - // perform a manual check. - int successValue = RESULT_INDETERMINATE; - if (isBluetoothPermissionGranted()) { - BluetoothAdapter bt = BluetoothAdapter.getDefaultAdapter(); - successValue = (bt != null && bt.isEnabled()) ? RESULT_SUCCESS : RESULT_FAILURE; - } - - sb.append("Bluetooth: "); - appendResult(sb, successValue, "Enabled", "Disabled", "Needs verification"); - return successValue; - } - - private boolean appendLocationServicesReport(StringBuilder sb) { - LocationManager lm = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE); - boolean isGpsProviderEnabled = lm.isProviderEnabled(LocationManager.GPS_PROVIDER); - boolean isNetworkProviderEnabled = lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER); - boolean isLocationProviderAvailable = isGpsProviderEnabled || isNetworkProviderEnabled; - - sb.append("Location services: "); - appendResult(sb, isLocationProviderAvailable, "Enabled", "Disabled"); - return isLocationProviderAvailable; - } - - private boolean appendLocationAppPermissionReport(StringBuilder sb) { - boolean isLocationPermissionGranted = false; - isLocationPermissionGranted = PermissionChecker.checkSelfPermission(mContext, - Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED; - - sb.append("Location app permission: "); - appendResult(sb, isLocationPermissionGranted, "Granted", "Not granted"); - return isLocationPermissionGranted; - } - - private boolean appendPhysicalWebPrivacyPreferenceReport(StringBuilder sb) { + private void appendPrerequisitesReport(StringBuilder sb) { + boolean isSdkVersionCorrect = isSdkVersionCorrect(); + boolean isDataConnectionActive = isDataConnectionActive(); + int bluetoothStatus = getBluetoothEnabledStatus(); + boolean isLocationServicesEnabled = isLocationServicesEnabled(); + boolean isLocationPermissionGranted = isLocationPermissionGranted(); boolean isPreferenceEnabled = PhysicalWeb.isPhysicalWebPreferenceEnabled(mContext); boolean isOnboarding = PhysicalWeb.isOnboarding(mContext); - String failureMessage = (isOnboarding ? "Default (off)" : "Off"); + int prerequisitesResult = RESULT_SUCCESS; + if (!isSdkVersionCorrect || !isDataConnectionActive || (bluetoothStatus == RESULT_FAILURE) + || !isLocationServicesEnabled || !isLocationPermissionGranted + || !isPreferenceEnabled) { + prerequisitesResult = RESULT_FAILURE; + } else if (bluetoothStatus == RESULT_INDETERMINATE) { + prerequisitesResult = RESULT_INDETERMINATE; + } - sb.append("Physical Web privacy settings: "); - appendResult(sb, isPreferenceEnabled, "On", failureMessage); - return isPreferenceEnabled; - } + sb.append("<h2>Status</h2>"); - private void appendPrerequisitesReport(StringBuilder sb) { - boolean isAndroidMOrLater = (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M); + sb.append("Physical Web is "); + appendResult(sb, prerequisitesResult != RESULT_FAILURE, "ON", "OFF"); sb.append("<h2>Prerequisites</h2>"); - boolean isSdkVersionCorrect = appendSdkVersionReport(sb); - boolean isDataConnectionActive = appendDataConnectivityReport(sb); - int bluetoothStatus = appendBluetoothReport(sb); - boolean isLocationProviderAvailable = appendLocationServicesReport(sb); - boolean isLocationPermissionGranted = true; - if (isAndroidMOrLater) { - isLocationPermissionGranted = appendLocationAppPermissionReport(sb); - } - boolean isPreferenceEnabled = appendPhysicalWebPrivacyPreferenceReport(sb); + sb.append("Android SDK version: "); + appendResult(sb, isSdkVersionCorrect, "Compatible", "Incompatible"); - int successValue = RESULT_SUCCESS; - if (!isSdkVersionCorrect || !isDataConnectionActive || (bluetoothStatus == RESULT_FAILURE) - || !isLocationProviderAvailable || !isLocationPermissionGranted - || !isPreferenceEnabled) { - successValue = RESULT_FAILURE; - } else if (bluetoothStatus == RESULT_INDETERMINATE) { - successValue = RESULT_INDETERMINATE; + sb.append("Data connection: "); + appendResult(sb, isDataConnectionActive, "Connected", "Not connected"); + + sb.append("Location services: "); + appendResult(sb, isLocationServicesEnabled, "Enabled", "Disabled"); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + sb.append("Location app permission: "); + appendResult(sb, isLocationPermissionGranted, "Granted", "Not granted"); } - sb.append("<br/>"); - if (successValue == RESULT_SUCCESS) { - sb.append("All prerequisite checks "); - } else { - sb.append("One or more prerequisite checks "); - } - appendResult(sb, successValue, "SUCCEEDED", "FAILED", "need verification"); + sb.append("Physical Web privacy settings: "); + String preferenceDisabledMessage = (isOnboarding ? "Default (off)" : "Off"); + appendResult(sb, isPreferenceEnabled, "On", preferenceDisabledMessage); + + sb.append("Bluetooth: "); + appendResult(sb, bluetoothStatus, "Enabled", "Disabled", "Unknown"); // Append instructions for how to verify Bluetooth is enabled when we are unable to check // programmatically. - if (!isBluetoothPermissionGranted()) { - sb.append("<br/>To verify Bluetooth is enabled, check that the Bluetooth icon is " - + "shown in the status bar."); + if (bluetoothStatus == RESULT_INDETERMINATE) { + sb.append("<br/>To verify Bluetooth is enabled on this device, check that the " + + "Bluetooth icon is shown in the status bar."); } } @@ -249,6 +192,46 @@ return sb.toString(); } + private boolean isSdkVersionCorrect() { + return (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT); + } + + private boolean isDataConnectionActive() { + ConnectivityManager cm = + (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE); + return (cm.getActiveNetworkInfo() != null + && cm.getActiveNetworkInfo().isConnectedOrConnecting()); + } + + private boolean isBluetoothPermissionGranted() { + return PermissionChecker.checkSelfPermission(mContext, Manifest.permission.BLUETOOTH) + == PackageManager.PERMISSION_GRANTED; + } + + private int getBluetoothEnabledStatus() { + int statusResult = RESULT_INDETERMINATE; + if (isBluetoothPermissionGranted()) { + BluetoothAdapter bt = BluetoothAdapter.getDefaultAdapter(); + statusResult = (bt != null && bt.isEnabled()) ? RESULT_SUCCESS : RESULT_FAILURE; + } + return statusResult; + } + + private boolean isLocationServicesEnabled() { + LocationManager lm = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE); + boolean isGpsProviderEnabled = lm.isProviderEnabled(LocationManager.GPS_PROVIDER); + boolean isNetworkProviderEnabled = lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER); + return isGpsProviderEnabled || isNetworkProviderEnabled; + } + + private boolean isLocationPermissionGranted() { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { + return true; + } + return PermissionChecker.checkSelfPermission(mContext, + Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED; + } + private static Intent createListUrlsIntent(Context context) { Intent intent = new Intent(context, ListUrlsActivity.class); intent.putExtra(ListUrlsActivity.REFERER_KEY, ListUrlsActivity.OPTIN_REFERER);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/MainPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/MainPreferences.java index 2e655d14..c9017d3 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/MainPreferences.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/MainPreferences.java
@@ -4,26 +4,37 @@ package org.chromium.chrome.browser.preferences; -import android.content.Intent; +import android.app.DialogFragment; +import android.app.FragmentManager; +import android.content.Context; import android.os.Bundle; import android.os.Handler; import android.preference.Preference; import android.preference.Preference.OnPreferenceClickListener; import android.preference.PreferenceFragment; +import org.chromium.base.Callback; +import org.chromium.base.VisibleForTesting; +import org.chromium.base.metrics.RecordUserAction; import org.chromium.chrome.R; import org.chromium.chrome.browser.PasswordUIView; import org.chromium.chrome.browser.autofill.PersonalDataManager; import org.chromium.chrome.browser.net.spdyproxy.DataReductionProxySettings; import org.chromium.chrome.browser.partnercustomizations.HomepageManager; import org.chromium.chrome.browser.preferences.datareduction.DataReductionPreferences; -import org.chromium.chrome.browser.signin.AccountSigninActivity; +import org.chromium.chrome.browser.signin.AccountAdder; +import org.chromium.chrome.browser.signin.AddGoogleAccountDialogFragment; +import org.chromium.chrome.browser.signin.AddGoogleAccountDialogFragment.AddGoogleAccountListener; import org.chromium.chrome.browser.signin.SigninAccessPoint; import org.chromium.chrome.browser.signin.SigninManager; import org.chromium.chrome.browser.signin.SigninManager.SignInStateObserver; +import org.chromium.chrome.browser.sync.ui.ChooseAccountFragment; import org.chromium.chrome.browser.util.FeatureUtilities; +import org.chromium.sync.signin.AccountManagerHelper; import org.chromium.sync.signin.ChromeSigninController; +import java.util.List; + /** * The main settings screen, shown when the user first opens Settings. */ @@ -87,21 +98,13 @@ mSignInPreference.setOnPreferenceClickListener(new OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { - if (ChromeSigninController.get(getActivity()).isSignedIn()) return false; - if (!SigninManager.get(getActivity()).isSignInAllowed()) { - if (SigninManager.get(getActivity()).isSigninDisabledByPolicy()) { - ManagedPreferencesUtils.showManagedByAdministratorToast(getActivity()); - } - return false; + if (!ChromeSigninController.get(getActivity()).isSignedIn()) { + displayAccountPicker(); + return true; } - - mSignInPreference.setEnabled(false); - SigninManager.logSigninStartAccessPoint(SigninAccessPoint.SETTINGS); - startActivity(new Intent(getActivity(), AccountSigninActivity.class)); - return true; + return false; } }); - mSignInPreference.setEnabled(true); Preference documentMode = findPreference(PREF_DOCUMENT_MODE); if (FeatureUtilities.isDocumentModeEligible(getActivity())) { @@ -162,6 +165,80 @@ } } + private void displayAccountPicker() { + displayAccountPicker(new Callback<DialogFragment>() { + @Override + public void onResult(DialogFragment fragment) {} + }); + } + + /** + * Displays the account picker or the add account dialog and signs the user in. + * + * @param callback Called with the fragment that was shown, or null. Used for testing. + */ + @VisibleForTesting + public void displayAccountPicker(final Callback<DialogFragment> callback) { + Context context = getActivity(); + if (context == null) { + postCallback(callback, null); + return; + } + + if (!SigninManager.get(context).isSignInAllowed()) { + if (SigninManager.get(context).isSigninDisabledByPolicy()) { + ManagedPreferencesUtils.showManagedByAdministratorToast(context); + } + postCallback(callback, null); + return; + } + + AccountManagerHelper.get(context).getGoogleAccountNames(new Callback<List<String>>() { + @Override + public void onResult(List<String> accountNames) { + FragmentManager fragmentManager = getFragmentManager(); + if (fragmentManager == null) { + // Preferences were closed since the click happened; abort. + callback.onResult(null); + return; + } + + if (!accountNames.isEmpty()) { + if (fragmentManager.findFragmentByTag(ACCOUNT_PICKER_DIALOG_TAG) != null) { + callback.onResult(null); + } else { + ChooseAccountFragment chooserFragment = + new ChooseAccountFragment(accountNames); + chooserFragment.show(fragmentManager, ACCOUNT_PICKER_DIALOG_TAG); + callback.onResult(chooserFragment); + SigninManager.logSigninStartAccessPoint(SigninAccessPoint.SETTINGS); + } + } else { + AddGoogleAccountDialogFragment dialog = new AddGoogleAccountDialogFragment(); + dialog.setListener(new AddGoogleAccountListener() { + @Override + public void onAddAccountClicked() { + RecordUserAction.record("Signin_AddAccountToDevice"); + AccountAdder.getInstance().addAccount( + MainPreferences.this, AccountAdder.ADD_ACCOUNT_RESULT); + } + }); + dialog.show(fragmentManager, null); + callback.onResult(dialog); + } + } + }); + } + + private <V> void postCallback(final Callback<V> callback, final V result) { + new Handler().post(new Runnable() { + @Override + public void run() { + callback.onResult(result); + } + }); + } + // SignInStateObserver @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/SyncedAccountPreference.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/SyncedAccountPreference.java index 9251e9d..9a7f8ff9 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/SyncedAccountPreference.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/SyncedAccountPreference.java
@@ -17,10 +17,9 @@ /** * A preference that displays the account currently being synced and allows the user to choose a new - * account to use for syncing. The values used are the account names. + * account to use for syncing */ public class SyncedAccountPreference extends ListPreference { - private static final String TAG = "SyncedAccountPreference"; /** * Constructor for inflating from XML @@ -31,14 +30,6 @@ updateAccountsList(); } - /** - * Updates the list of accounts to those currently signed in and sets the display to the - * current sync account. - */ - public void update() { - updateAccountsList(); - } - private void updateAccountsList() { boolean syncEnabled = AndroidSyncSettings.isSyncEnabled(getContext()); if (!syncEnabled) { @@ -66,12 +57,13 @@ setEntries(accountNames); setEntryValues(accountValues); - setValue(signedInSettingsKey); + setDefaultValue(signedInSettingsKey); setSummary(signedInAccountName); } @Override protected void onDialogClosed(boolean positiveResult) { super.onDialogClosed(positiveResult); + // TODO(crbug/557786): Add switching sync accounts } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/prerender/ExternalPrerenderHandler.java b/chrome/android/java/src/org/chromium/chrome/browser/prerender/ExternalPrerenderHandler.java index 25c072da..00665868 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/prerender/ExternalPrerenderHandler.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/prerender/ExternalPrerenderHandler.java
@@ -79,6 +79,7 @@ * @param webContents The {@link WebContents} for which to compare the session info. * @return Whether the given url was prerendered. */ + @VisibleForTesting public static boolean hasPrerenderedUrl(Profile profile, String url, WebContents webContents) { return nativeHasPrerenderedUrl(profile, url, webContents); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/signin/AccountSigninActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/signin/AccountSigninActivity.java deleted file mode 100644 index 5b262fef..0000000 --- a/chrome/android/java/src/org/chromium/chrome/browser/signin/AccountSigninActivity.java +++ /dev/null
@@ -1,118 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.chrome.browser.signin; - -import android.content.Intent; -import android.os.Bundle; -import android.support.v7.app.AppCompatActivity; -import android.view.LayoutInflater; - -import org.chromium.base.Log; -import org.chromium.base.annotations.SuppressFBWarnings; -import org.chromium.base.library_loader.ProcessInitException; -import org.chromium.base.metrics.RecordUserAction; -import org.chromium.chrome.R; -import org.chromium.chrome.browser.firstrun.ProfileDataCache; -import org.chromium.chrome.browser.init.ChromeBrowserInitializer; -import org.chromium.chrome.browser.preferences.Preferences; -import org.chromium.chrome.browser.preferences.PreferencesLauncher; -import org.chromium.chrome.browser.profiles.Profile; -import org.chromium.chrome.browser.sync.ui.SyncCustomizationFragment; - -/** - * An Activity displayed from the MainPreferences to allow the user to pick an account to - * sign in to. The AccountSigninView.Delegate interface is fulfilled by the AppCompatActivity. - */ -public class AccountSigninActivity extends AppCompatActivity - implements AccountSigninView.Listener, AccountSigninView.Delegate, - SigninManager.SignInCallback{ - private static final String TAG = "SigninActivity"; - - private static final String CONFIRM_IMPORT_SYNC_DATA_DIALOG_TAG = - "signin_import_data_tag"; - - private AccountSigninView mView; - private String mAccountName; - private boolean mShowSyncSettings = false; - - @Override - @SuppressFBWarnings("DM_EXIT") - protected void onCreate(Bundle savedInstanceState) { - // The browser process must be started here because this activity may be started from the - // recent apps list and it relies on other activities and the native library to be loaded. - try { - ChromeBrowserInitializer.getInstance(this).handleSynchronousStartup(); - } catch (ProcessInitException e) { - Log.e(TAG, "Failed to start browser process.", e); - // Since the library failed to initialize nothing in the application - // can work, so kill the whole application not just the activity - System.exit(-1); - } - - super.onCreate(savedInstanceState); - - mView = (AccountSigninView) LayoutInflater.from(this).inflate( - R.layout.account_signin_view, null); - mView.init(new ProfileDataCache(this, Profile.getLastUsedProfile())); - mView.setListener(this); - mView.setDelegate(this); - - setContentView(mView); - } - - @Override - public void onAccountSelectionCanceled() { - finish(); - } - - @Override - public void onNewAccount() { - AccountAdder.getInstance().addAccount(this, AccountAdder.ADD_ACCOUNT_RESULT); - } - - @Override - public void onAccountSelected(String accountName) { - mAccountName = accountName; - - } - - @Override - public void onDoneClicked() { - RecordUserAction.record("Signin_Signin_FromSettings"); - SigninManager.get(this).signIn(mAccountName, this, this); - } - - @Override - public void onSettingsClicked() { - RecordUserAction.record("Signin_Signin_FromSettings"); - mShowSyncSettings = true; - SigninManager.get(this).signIn(mAccountName, this, this); - } - - @Override - public void onFailedToSetForcedAccount(String forcedAccountName) { - assert false : "No forced accounts in account switching preferences."; - - } - - @Override - public void onSignInComplete() { - if (mShowSyncSettings) { - Intent intent = PreferencesLauncher.createIntentForSettingsPage(this, - SyncCustomizationFragment.class.getName()); - Bundle args = new Bundle(); - args.putString(SyncCustomizationFragment.ARGUMENT_ACCOUNT, mAccountName); - intent.putExtra(Preferences.EXTRA_SHOW_FRAGMENT_ARGUMENTS, args); - startActivity(intent); - } - - finish(); - } - - @Override - public void onSignInAborted() { - assert false : "Signin cannot be aborted when forced."; - } -}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/signin/ConfirmAccountChangeFragment.java b/chrome/android/java/src/org/chromium/chrome/browser/signin/ConfirmAccountChangeFragment.java new file mode 100644 index 0000000..48a70f6 --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/signin/ConfirmAccountChangeFragment.java
@@ -0,0 +1,114 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.signin; + +import android.app.Activity; +import android.app.Dialog; +import android.app.DialogFragment; +import android.content.DialogInterface; +import android.content.Intent; +import android.os.Bundle; +import android.support.v7.app.AlertDialog; +import android.text.SpannableString; +import android.text.method.LinkMovementMethod; +import android.text.style.ClickableSpan; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.TextView; + +import org.chromium.base.metrics.RecordUserAction; +import org.chromium.chrome.R; +import org.chromium.chrome.browser.preferences.PrefServiceBridge; +import org.chromium.chrome.browser.preferences.PreferencesLauncher; +import org.chromium.chrome.browser.sync.ui.ClearSyncDataPreferences; +import org.chromium.ui.text.SpanApplier; +import org.chromium.ui.text.SpanApplier.SpanInfo; + +/** + * The fragment shown when the user was previously signed in, then disconnected their account, + * and is now attempting to sign in to a new account. This dialog warns the user that they should + * clear their browser data, or else their bookmarks etc from their old account will be merged with + * the new account when they sign in. This dialog assumes it is being created in the middle of the + * signin flow, and as such is purposefully package private. + */ +class ConfirmAccountChangeFragment + extends DialogFragment implements DialogInterface.OnClickListener { + private static final String KEY_OLD_ACCOUNT_NAME = "lastAccountName"; + private static final String KEY_NEW_ACCOUNT_NAME = "newAccountName"; + + // Tracks whether to abort signin in onDismiss. + private boolean mAbortSignin = true; + + public static ConfirmAccountChangeFragment newInstance(String accountName) { + ConfirmAccountChangeFragment dialogFragment = new ConfirmAccountChangeFragment(); + Bundle args = new Bundle(); + args.putString( + KEY_OLD_ACCOUNT_NAME, PrefServiceBridge.getInstance().getSyncLastAccountName()); + args.putString(KEY_NEW_ACCOUNT_NAME, accountName); + dialogFragment.setArguments(args); + return dialogFragment; + } + + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + final Activity activity = getActivity(); + String lastSyncAccountName = getArguments().getString(KEY_OLD_ACCOUNT_NAME); + String currentAccountName = getArguments().getString(KEY_NEW_ACCOUNT_NAME); + + LayoutInflater inflater = activity.getLayoutInflater(); + View v = inflater.inflate(R.layout.confirm_sync_account_change_account, null); + final TextView textView = (TextView) v.findViewById(R.id.confirmMessage); + String message = activity.getString(R.string.confirm_account_change_dialog_message, + lastSyncAccountName, currentAccountName); + + // Show clear sync data dialog when the user clicks the "settings" link. + SpannableString messageWithLink = SpanApplier.applySpans( + message, new SpanInfo("<link>", "</link>", new ClickableSpan() { + @Override + public void onClick(View widget) { + showClearSyncDataPreferences(); + } + })); + + RecordUserAction.record("Signin_Show_ImportDataPrompt"); + textView.setText(messageWithLink); + textView.setMovementMethod(LinkMovementMethod.getInstance()); + return new AlertDialog.Builder(getActivity(), R.style.AlertDialogTheme) + .setTitle(R.string.confirm_account_change_dialog_title) + .setPositiveButton(R.string.confirm_account_change_dialog_signin, this) + .setNegativeButton(R.string.cancel, this) + .setView(v) + .create(); + } + + @Override + public void onClick(DialogInterface dialog, int which) { + if (which == AlertDialog.BUTTON_POSITIVE) { + RecordUserAction.record("Signin_ImportDataPrompt_ImportData"); + SigninManager.get(getActivity()).progressInteractiveSignInFlowAccountConfirmed(); + mAbortSignin = false; + } else if (which == AlertDialog.BUTTON_NEGATIVE) { + RecordUserAction.record("Signin_ImportDataPrompt_Cancel"); + } + } + + @Override + public void onDismiss(DialogInterface dialogInterface) { + super.onDismiss(dialogInterface); + if (mAbortSignin) { + // Something other than BUTTON_POSITIVE is dismissing this fragment; abort signin. + SigninManager.get(getActivity()).abortSignIn(); + } + } + + private void showClearSyncDataPreferences() { + Intent intent = PreferencesLauncher.createIntentForSettingsPage(getActivity(), + ClearSyncDataPreferences.class.getName()); + startActivity(intent); + + RecordUserAction.record("Signin_ImportDataPrompt_DontImport"); + dismiss(); + } +}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninManager.java b/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninManager.java index 2a3a18a..5d2bcd99 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninManager.java
@@ -23,6 +23,7 @@ import org.chromium.base.metrics.RecordUserAction; import org.chromium.chrome.browser.externalauth.ExternalAuthUtils; import org.chromium.chrome.browser.externalauth.UserRecoverableErrorHandler; +import org.chromium.signin.InvestigatedScenario; import org.chromium.sync.signin.AccountManagerHelper; import org.chromium.sync.signin.ChromeSigninController; @@ -291,7 +292,7 @@ public void onSystemAccountsSeedingComplete() { if (mSignInState != null && mSignInState.blockedOnAccountSeeding) { mSignInState.blockedOnAccountSeeding = false; - progressSignInFlowCheckPolicy(); + progressSignInFlowInvestigateScenario(); } } @@ -365,7 +366,7 @@ private void progressSignInFlowSeedSystemAccounts() { if (AccountTrackerService.get(mContext).checkAndSeedSystemAccounts()) { - progressSignInFlowCheckPolicy(); + progressSignInFlowInvestigateScenario(); } else if (AccountIdProvider.getInstance().canBeUsed(mContext)) { mSignInState.blockedOnAccountSeeding = true; } else { @@ -380,11 +381,11 @@ } /** - * Continues the signin flow by checking if there is a policy that the account is subject to. + * If sign-in is interactive and the user is changing accounts, display a confirmation dialog. */ - private void progressSignInFlowCheckPolicy() { - if (mSignInState == null) { - Log.w(TAG, "Ignoring sign in progress request as no pending sign in."); + private void progressSignInFlowInvestigateScenario() { + if (!mSignInState.isInteractive()) { + progressSignInFlowCheckPolicy(); return; } @@ -393,6 +394,41 @@ return; } + // TODO(skym): Warn for high risk upgrade scenario, crbug.com/572754. + if (SigninInvestigator.investigate(mSignInState.account.name) + == InvestigatedScenario.DIFFERENT_ACCOUNT) { + mSignInState.displayedDialog = + ConfirmAccountChangeFragment.newInstance(mSignInState.account.name); + mSignInState.displayedDialog.show( + mSignInState.activity.getFragmentManager(), CONFIRM_ACCOUNT_CHANGED_DIALOG_TAG); + } else { + // Do not display dialog, just sign-in. + progressSignInFlowCheckPolicy(); + } + } + + /** + * Called from ConfirmAccountChangeFragment if the new account name was confirmed. + */ + void progressInteractiveSignInFlowAccountConfirmed() { + if (mSignInState == null || mSignInState.displayedDialog == null) { + // Stop if sign-in was cancelled or this is a duplicate click event. + return; + } + mSignInState.displayedDialog = null; + + progressSignInFlowCheckPolicy(); + } + + /** + * Continues the signin flow by checking if there is a policy that the account is subject to. + */ + private void progressSignInFlowCheckPolicy() { + if (mSignInState == null) { + Log.w(TAG, "Ignoring sign in progress request as no pending sign in."); + return; + } + if (!nativeShouldLoadPolicyForUser(mSignInState.account.name)) { // Proceed with the sign-in flow without checking for policy if it can be determined // that this account can't have management enabled based on the username. @@ -429,7 +465,6 @@ return; } - // TODO(peconn): Move this and other UI interactions into AccountSigninView. Log.d(TAG, "Account has policy management"); mSignInState.displayedDialog = ConfirmManagedSigninFragment.newInstance(managementDomain); mSignInState.displayedDialog.show(
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninPromoScreen.java b/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninPromoScreen.java index 09445d3..b72e672 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninPromoScreen.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninPromoScreen.java
@@ -5,15 +5,16 @@ package org.chromium.chrome.browser.signin; import android.app.Activity; -import android.app.FragmentManager; import android.content.Intent; import android.os.Bundle; import android.text.TextUtils; import android.view.LayoutInflater; +import android.view.View; import android.widget.LinearLayout; import org.chromium.base.metrics.RecordUserAction; import org.chromium.chrome.R; +import org.chromium.chrome.browser.firstrun.AccountFirstRunView; import org.chromium.chrome.browser.firstrun.ProfileDataCache; import org.chromium.chrome.browser.multiwindow.MultiWindowUtils; import org.chromium.chrome.browser.preferences.ChromePreferenceManager; @@ -30,9 +31,9 @@ /** * This class implements the dialog UI for the signin promo. */ -public class SigninPromoScreen extends AlwaysDismissedDialog - implements AccountSigninView.Listener, AccountSigninView.Delegate { - private AccountSigninView mAccountFirstRunView; +public class SigninPromoScreen + extends AlwaysDismissedDialog implements AccountFirstRunView.Listener { + private AccountFirstRunView mAccountFirstRunView; private ProfileDataCache mProfileDataCache; private String mAccountName; @@ -74,15 +75,14 @@ setOwnerActivity(activity); LayoutInflater inflater = LayoutInflater.from(activity); - mAccountFirstRunView = (AccountSigninView) - inflater.inflate(R.layout.account_signin_view, null); + View view = inflater.inflate(R.layout.fre_choose_account, null); mProfileDataCache = new ProfileDataCache(activity, Profile.getLastUsedProfile()); + mAccountFirstRunView = (AccountFirstRunView) view.findViewById(R.id.fre_account_layout); mAccountFirstRunView.init(mProfileDataCache); mAccountFirstRunView.configureForAddAccountPromo(); mAccountFirstRunView.setListener(this); - mAccountFirstRunView.setDelegate(this); - setContentView(mAccountFirstRunView, new LinearLayout.LayoutParams( + setContentView(view, new LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT)); } @@ -153,9 +153,4 @@ public void onFailedToSetForcedAccount(String forcedAccountName) { assert false : "No forced accounts in SigninPromoScreen"; } - - @Override - public FragmentManager getFragmentManager() { - return getOwnerActivity().getFragmentManager(); - } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/sync/SyncAccountSwitcher.java b/chrome/android/java/src/org/chromium/chrome/browser/sync/SyncAccountSwitcher.java deleted file mode 100644 index bb70a3f2..0000000 --- a/chrome/android/java/src/org/chromium/chrome/browser/sync/SyncAccountSwitcher.java +++ /dev/null
@@ -1,81 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.chrome.browser.sync; - -import android.app.Activity; -import android.preference.Preference; -import android.preference.Preference.OnPreferenceChangeListener; -import android.text.TextUtils; - -import org.chromium.chrome.browser.preferences.SyncedAccountPreference; -import org.chromium.chrome.browser.signin.SigninManager; -import org.chromium.chrome.browser.signin.SigninManager.SignInCallback; -import org.chromium.chrome.browser.sync.ui.ConfirmImportSyncDataDialog; -import org.chromium.chrome.browser.sync.ui.ConfirmImportSyncDataDialog.ImportSyncType; - -/** - * A class that encapsulates the control flow of listeners and callbacks when switching sync - * accounts. - * - * Control flows through the method in this order: - * {@link OnPreferenceChangeListener#onPreferenceChange} - * {@link ConfirmImportSyncDataDialog.Listener#onConfirm} - * {@link SignInCallback#onSignInComplete} - */ -public class SyncAccountSwitcher - implements OnPreferenceChangeListener, ConfirmImportSyncDataDialog.Listener, - SignInCallback { - private static final String TAG = "SyncAccountSwitcher"; - - private final SyncedAccountPreference mSyncedAccountPreference; - private final Activity mActivity; - - private String mNewAccountName; - - /** - * Sets up a SyncAccountSwitcher to be ready to accept callbacks. - * @param activity Activity used to get the context for signin and get the fragmentManager - * for the data sync fragment. - * @param syncedAccountPreference The preference to update once signin has been completed. - */ - public SyncAccountSwitcher(Activity activity, SyncedAccountPreference syncedAccountPreference) { - mActivity = activity; - mSyncedAccountPreference = syncedAccountPreference; - } - - @Override - public boolean onPreferenceChange(Preference p, Object newValue) { - if (newValue == null) return false; - - mNewAccountName = (String) newValue; - String currentAccount = mSyncedAccountPreference.getValue(); - - if (TextUtils.equals(mNewAccountName, currentAccount)) return false; - - ConfirmImportSyncDataDialog.showNewInstance(currentAccount, mNewAccountName, - ImportSyncType.SWITCHING_SYNC_ACCOUNTS, mActivity.getFragmentManager(), this); - - // Don't update the selected account in the preference. It will be updated by - // the call to mSyncAccountListPreference.update() if everything succeeds. - return false; - } - - @Override - public void onConfirm() { - assert mNewAccountName != null; - SigninManager.get(mActivity).signIn(mNewAccountName, mActivity, this); - } - - @Override - public void onSignInComplete() { - // Update the Preference so it displays the correct account name. - mSyncedAccountPreference.update(); - } - - @Override - public void onSignInAborted() { - // If the user aborted signin, there is nothing to do. - } -} \ No newline at end of file
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/sync/ui/ChooseAccountFragment.java b/chrome/android/java/src/org/chromium/chrome/browser/sync/ui/ChooseAccountFragment.java new file mode 100644 index 0000000..ade00ae --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/sync/ui/ChooseAccountFragment.java
@@ -0,0 +1,63 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.sync.ui; + +import android.app.Activity; +import android.app.Dialog; +import android.app.DialogFragment; +import android.content.DialogInterface; +import android.content.DialogInterface.OnClickListener; +import android.os.Bundle; +import android.support.v7.app.AlertDialog; + +import org.chromium.base.metrics.RecordUserAction; +import org.chromium.chrome.R; +import org.chromium.chrome.browser.signin.SigninManager; + +import java.util.List; + +/** + * A dialog that lets the user choose which Google account to use when signing in to Chrome. + */ +public class ChooseAccountFragment extends DialogFragment implements OnClickListener { + + protected String[] mAccounts; + + protected int mSelectedAccount; + + // TODO(skym): Fragments should have empty constructors, crbug.com/580093. + public ChooseAccountFragment(List<String> accountNames) { + mAccounts = accountNames.toArray(new String[accountNames.size()]); + } + + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + return new AlertDialog.Builder(getActivity(), R.style.AlertDialogTheme) + .setSingleChoiceItems(mAccounts, mSelectedAccount, this) + .setPositiveButton(R.string.choose_account_sign_in, this) + .setNegativeButton(R.string.cancel, this) + .setTitle(R.string.sign_in_google_account) + .create(); + } + + private static void signIn(final Activity activity, String accountName) { + RecordUserAction.record("Signin_Signin_FromSettings"); + SigninManager.get(activity).signIn(accountName, activity, null); + } + + @Override + public void onClick(DialogInterface dialog, int which) { + switch (which) { + case AlertDialog.BUTTON_POSITIVE: { + signIn(getActivity(), mAccounts[mSelectedAccount]); + break; + } + default: { + mSelectedAccount = which; + break; + } + } + } +}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/sync/ui/ConfirmImportSyncDataDialog.java b/chrome/android/java/src/org/chromium/chrome/browser/sync/ui/ConfirmImportSyncDataDialog.java deleted file mode 100644 index b65923f6..0000000 --- a/chrome/android/java/src/org/chromium/chrome/browser/sync/ui/ConfirmImportSyncDataDialog.java +++ /dev/null
@@ -1,208 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.chrome.browser.sync.ui; - -import android.app.AlertDialog; -import android.app.Dialog; -import android.app.DialogFragment; -import android.app.FragmentManager; -import android.content.Context; -import android.content.DialogInterface; -import android.os.AsyncTask; -import android.os.Bundle; -import android.view.LayoutInflater; -import android.view.View; -import android.widget.TextView; - -import org.chromium.base.metrics.RecordUserAction; -import org.chromium.chrome.R; -import org.chromium.chrome.browser.BrowsingDataType; -import org.chromium.chrome.browser.preferences.PrefServiceBridge; -import org.chromium.chrome.browser.preferences.PrefServiceBridge.OnClearBrowsingDataListener; -import org.chromium.chrome.browser.provider.ChromeBrowserProviderClient; -import org.chromium.chrome.browser.signin.SigninManager; -import org.chromium.chrome.browser.widget.RadioButtonWithDescription; - -import java.util.Arrays; -import java.util.List; - -/** - * A dialog that is displayed when the user switches the account they are syncing to. It gives the - * option to merge the data of the two accounts or to keep them separate. - */ -public class ConfirmImportSyncDataDialog extends DialogFragment - implements DialogInterface.OnClickListener, OnClearBrowsingDataListener { - - /** - * Callback for completion of the dialog. - */ - public interface Listener { - /** - * The user has completed the dialog using the positive button. If requested, the previous - * sync data has been cleared. - */ - public void onConfirm(); - } - - /** - * The situation ConfirmImportSyncDataDialog is created for - whether the user had previously - * been signed into another account, had signed out then signed into a different one, or - * if they directly switched accounts. This changes the strings displayed. - */ - public enum ImportSyncType { SWITCHING_SYNC_ACCOUNTS, PREVIOUS_DATA_FOUND } - - private static final String CONFIRM_IMPORT_SYNC_DATA_DIALOG_TAG = - "sync_account_switch_import_data_tag"; - - private static final int[] SYNC_DATA_TYPES = { - BrowsingDataType.HISTORY, - BrowsingDataType.CACHE, - BrowsingDataType.COOKIES, - BrowsingDataType.PASSWORDS, - BrowsingDataType.FORM_DATA - }; - - private static final String KEY_OLD_ACCOUNT_NAME = "lastAccountName"; - private static final String KEY_NEW_ACCOUNT_NAME = "newAccountName"; - private static final String KEY_IMPORT_SYNC_TYPE = "importSyncType"; - - private RadioButtonWithDescription mConfirmImportOption; - private RadioButtonWithDescription mKeepSeparateOption; - - private Listener mListener; - - private static ConfirmImportSyncDataDialog newInstance( - String oldAccountName, String newAccountName, ImportSyncType importSyncType) { - - ConfirmImportSyncDataDialog fragment = new ConfirmImportSyncDataDialog(); - Bundle args = new Bundle(); - args.putString(KEY_OLD_ACCOUNT_NAME, oldAccountName); - args.putString(KEY_NEW_ACCOUNT_NAME, newAccountName); - args.putSerializable(KEY_IMPORT_SYNC_TYPE, importSyncType); - fragment.setArguments(args); - return fragment; - } - - /** - * Creates and shows a new instance of ConfirmImportSyncDataFragment, a dialog that gives the - * user the option to merge data between the account they are attempting to sign in to and the - * account they were previously signed into, or to keep the data separate. - * @param oldAccountName The previous sync account name. - * @param newAccountName The potential next sync account name. - * @param importSyncType The situation the dialog is created in - either when directly changing - * the sync account or signing in after being signed out (this changes - * displayed strings). - * @param fragmentManager FragmentManager to attach the dialog to. - * @param callback Callback to be called if the user completes the dialog (as opposed to - * hitting cancel). - */ - public static void showNewInstance(String oldAccountName, String newAccountName, - ImportSyncType importSyncType, FragmentManager fragmentManager, Listener callback) { - ConfirmImportSyncDataDialog confirmSync = - newInstance(oldAccountName, newAccountName, importSyncType); - - confirmSync.setListener(callback); - confirmSync.show(fragmentManager, CONFIRM_IMPORT_SYNC_DATA_DIALOG_TAG); - } - - @Override - public Dialog onCreateDialog(Bundle savedInstanceState) { - String oldAccountName = getArguments().getString(KEY_OLD_ACCOUNT_NAME); - String newAccountName = getArguments().getString(KEY_NEW_ACCOUNT_NAME); - ImportSyncType importSyncType = - (ImportSyncType) getArguments().getSerializable(KEY_IMPORT_SYNC_TYPE); - - LayoutInflater inflater = getActivity().getLayoutInflater(); - View v = inflater.inflate(R.layout.confirm_import_sync_data, null); - - TextView prompt = (TextView) v.findViewById(R.id.sync_import_data_prompt); - - if (importSyncType == ImportSyncType.SWITCHING_SYNC_ACCOUNTS) { - prompt.setText(getActivity().getString( - R.string.sync_import_data_prompt_switching_accounts, - newAccountName, oldAccountName)); - } else { - prompt.setText(getActivity().getString( - R.string.sync_import_data_prompt_existing_data, - newAccountName, oldAccountName)); - } - - mConfirmImportOption = (RadioButtonWithDescription) - v.findViewById(R.id.sync_confirm_import_choice); - mKeepSeparateOption = (RadioButtonWithDescription) - v.findViewById(R.id.sync_keep_separate_choice); - - mConfirmImportOption.setDescriptionText(getActivity().getString( - R.string.sync_import_existing_data_subtext, newAccountName)); - mKeepSeparateOption.setDescriptionText(getActivity().getString( - R.string.sync_keep_existing_data_separate_subtext, newAccountName, oldAccountName)); - - List<RadioButtonWithDescription> radioGroup = - Arrays.asList(mConfirmImportOption, mKeepSeparateOption); - mConfirmImportOption.setRadioButtonGroup(radioGroup); - mKeepSeparateOption.setRadioButtonGroup(radioGroup); - - if (importSyncType == ImportSyncType.SWITCHING_SYNC_ACCOUNTS) { - mKeepSeparateOption.setChecked(true); - } else { - mConfirmImportOption.setChecked(true); - } - - return new AlertDialog.Builder(getActivity(), R.style.AlertDialogTheme) - .setTitle(R.string.sync_import_data_title) - .setPositiveButton(R.string.continue_button, this) - .setNegativeButton(R.string.cancel, this) - .setView(v) - .create(); - } - - private void setListener(Listener listener) { - assert mListener == null; - mListener = listener; - } - - @Override - public void onClick(DialogInterface dialog, int which) { - if (which != AlertDialog.BUTTON_POSITIVE) { - RecordUserAction.record("Signin_ImportDataPrompt_Cancel"); - return; - } - if (mListener == null) return; - - assert mConfirmImportOption.isChecked() ^ mKeepSeparateOption.isChecked(); - - if (mConfirmImportOption.isChecked()) { - RecordUserAction.record("Signin_ImportDataPrompt_ImportData"); - mListener.onConfirm(); - } else { - RecordUserAction.record("Signin_ImportDataPrompt_DontImport"); - - final Context context = getActivity(); - final PrefServiceBridge.OnClearBrowsingDataListener listener = this; - - // The ChromeBrowserProvider API currently enforces calls to not be on the UI thread. - // This is being reviewed in http://crbug.com/225050 and this code could be simplified. - new AsyncTask<Void, Void, Void>() { - @Override - protected Void doInBackground(Void... arg0) { - ChromeBrowserProviderClient.removeAllUserBookmarks(context); - return null; - } - - @Override - protected void onPostExecute(Void result) { - PrefServiceBridge.getInstance().clearBrowsingData(listener, SYNC_DATA_TYPES); - } - }.execute(); - } - } - - @Override - public void onBrowsingDataCleared() { - SigninManager.get(getActivity()).clearLastSignedInUser(); - mListener.onConfirm(); - } -} -
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/sync/ui/SyncCustomizationFragment.java b/chrome/android/java/src/org/chromium/chrome/browser/sync/ui/SyncCustomizationFragment.java index 2afc507..c19c7c9 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/sync/ui/SyncCustomizationFragment.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/sync/ui/SyncCustomizationFragment.java
@@ -36,7 +36,6 @@ import org.chromium.chrome.browser.preferences.ChromeSwitchPreference; import org.chromium.chrome.browser.preferences.SyncedAccountPreference; import org.chromium.chrome.browser.sync.ProfileSyncService; -import org.chromium.chrome.browser.sync.SyncAccountSwitcher; import org.chromium.sync.AndroidSyncSettings; import org.chromium.sync.ModelType; import org.chromium.sync.PassphraseType; @@ -117,13 +116,12 @@ private Preference mSyncEncryption; private Preference mManageSyncData; private CheckBoxPreference[] mAllTypes; - private SyncedAccountPreference mSyncedAccountPreference; private ProfileSyncService mProfileSyncService; @Override - public View onCreateView( - LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { mProfileSyncService = ProfileSyncService.get(); assert mProfileSyncService != null; mIsBackendInitialized = mProfileSyncService.isBackendInitialized(); @@ -180,11 +178,6 @@ } }); - mSyncedAccountPreference = - (SyncedAccountPreference) findPreference(PREFERENCE_SYNC_ACCOUNT_LIST); - mSyncedAccountPreference.setOnPreferenceChangeListener( - new SyncAccountSwitcher(getActivity(), mSyncedAccountPreference)); - return view; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java index 9c4ac524..d613d2b 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java
@@ -156,7 +156,7 @@ private final Context mThemedApplicationContext; /** Gives {@link Tab} a way to interact with the Android window. */ - private final WindowAndroid mWindowAndroid; + private WindowAndroid mWindowAndroid; /** Whether or not this {@link Tab} is initialized and should be interacted with. */ private boolean mIsInitialized; @@ -1323,7 +1323,7 @@ // Attach the TabContentManager if we have one. This will bind this Tab's content layer // to this manager. // TODO(dtrainor): Remove this and move to a pull model instead of pushing the layer. - nativeAttachToTabContentManager(mNativeTabAndroid, tabContentManager); + attachTabContentManager(tabContentManager); // If there is a frozen WebContents state or a pending lazy load, don't create a new // WebContents. @@ -1358,6 +1358,45 @@ } /** + * Detaches tab and related objects from an existing activity and attaches to a new one. This + * updates many delegates inside the tab and {@link ContentViewCore} both on java and native + * sides. + * @param activity The new activity this tab should be associated with. + * @param tabDelegateFactory The new delegate factory this tab should be using. + */ + public void reparentToActivity(ChromeActivity activity, TabDelegateFactory tabDelegateFactory) { + // TODO(yusufo): Share these calls with the construction related calls. + // crbug.com/590281 + + // Update and propagate for the new WindowAndroid. + mWindowAndroid = activity.getWindowAndroid(); + mContentViewCore.updateWindowAndroid(mWindowAndroid); + + // Update for the controllers that need the Compositor from the new Activity. + attachTabContentManager(activity.getTabContentManager()); + mFullscreenManager = activity.getFullscreenManager(); + activity.getCompositorViewHolder().prepareForTabReparenting(); + + // Update the delegate factory, then recreate and propagate all delegates. + mDelegateFactory = tabDelegateFactory; + mWebContentsDelegate = mDelegateFactory.createWebContentsDelegate(this); + nativeUpdateDelegates(mNativeTabAndroid, + mWebContentsDelegate, mDelegateFactory.createContextMenuPopulator(this)); + mTopControlsVisibilityDelegate = mDelegateFactory.createTopControlsVisibilityDelegate(this); + setInterceptNavigationDelegate(mDelegateFactory.createInterceptNavigationDelegate(this)); + mAppBannerManager = mDelegateFactory.createAppBannerManager(this); + } + + /** + * Attach the content layer for this tab to the given {@link TabContentManager}. + * @param tabContentManager {@link TabContentManager} to attach to. + */ + public void attachTabContentManager(TabContentManager tabContentManager) { + if (tabContentManager == null) return; + nativeAttachToTabContentManager(mNativeTabAndroid, tabContentManager); + } + + /** * @return The delegate factory for testing purposes only. */ public TabDelegateFactory getDelegateFactory() { @@ -2949,6 +2988,8 @@ private native void nativeInitWebContents(long nativeTabAndroid, boolean incognito, ContentViewCore contentViewCore, TabWebContentsDelegateAndroid delegate, ContextMenuPopulator contextMenuPopulator); + private native void nativeUpdateDelegates(long nativeTabAndroid, + TabWebContentsDelegateAndroid delegate, ContextMenuPopulator contextMenuPopulator); private native void nativeDestroyWebContents(long nativeTabAndroid, boolean deleteNative); private native Profile nativeGetProfileAndroid(long nativeTabAndroid); private native int nativeLoadUrl(long nativeTabAndroid, String url, String extraHeaders,
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/AsyncTabParams.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/AsyncTabParams.java index a7d18034..596df2c 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/AsyncTabParams.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/AsyncTabParams.java
@@ -39,4 +39,9 @@ * @return The tab that would be reparenting through this {@link AsyncTabParams}. Can be null. */ Tab getTabToReparent(); + + /** + * Destroy any internal fields if it is necessary. + */ + void destroy(); } \ No newline at end of file
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/AsyncTabParamsManager.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/AsyncTabParamsManager.java index e5f91d6..b7ba9ec 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/AsyncTabParamsManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/AsyncTabParamsManager.java
@@ -24,13 +24,26 @@ } /** - * @return Whether there are any saved {@link AsyncTabParams} with the given tab id. + * @return Whether there is already an {@link AsyncTabParams} added for the given ID. */ public static boolean hasParamsForTabId(int tabId) { return sAsyncTabParams.get(tabId) != null; } /** + * @return Whether there are any saved {@link AsyncTabParams} with a tab to reparent. All + * implementations of this are keyed off of a user gesture so the likelihood of having + * more than one is zero. + */ + public static boolean hasParamsWithTabToReparent() { + for (int i = 0; i < sAsyncTabParams.size(); i++) { + if (sAsyncTabParams.get(sAsyncTabParams.keyAt(i)).getTabToReparent() == null) continue; + return true; + } + return false; + } + + /** * @return Retrieves and removes AsyncTabCreationParams for a particular tab id. */ public static AsyncTabParams remove(int tabId) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/ChromeTabCreator.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/ChromeTabCreator.java index da056d46..2acbb9e 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/ChromeTabCreator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/ChromeTabCreator.java
@@ -12,7 +12,6 @@ import org.chromium.chrome.browser.ChromeActivity; import org.chromium.chrome.browser.IntentHandler; import org.chromium.chrome.browser.TabState; -import org.chromium.chrome.browser.WarmupManager; import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.TabDelegateFactory; @@ -110,14 +109,22 @@ intent, IntentHandler.EXTRA_TAB_ID, Tab.INVALID_TAB_ID); AsyncTabParams asyncParams = AsyncTabParamsManager.remove(assignedTabId); - WebContents webContents = asyncParams == null ? null : asyncParams.getWebContents(); - boolean openInForeground = mOrderController.willOpenInForeground(type, mIncognito) - || webContents != null; + boolean openInForeground = mOrderController.willOpenInForeground(type, mIncognito); TabDelegateFactory delegateFactory = parent == null ? new TabDelegateFactory() : parent.getDelegateFactory(); Tab tab; - if (webContents != null) { + if (asyncParams != null && asyncParams.getTabToReparent() != null) { + type = TabLaunchType.FROM_REPARENTING; + openInForeground = true; + + TabReparentingParams params = (TabReparentingParams) asyncParams; + tab = params.getTabToReparent(); + tab.reparentToActivity(mActivity, new TabDelegateFactory()); + params.finalizeTabReparenting(); + } else if (asyncParams != null && asyncParams.getWebContents() != null) { + openInForeground = true; + WebContents webContents = asyncParams.getWebContents(); // A WebContents was passed through the Intent. Create a new Tab to hold it. Intent parentIntent = IntentUtils.safeGetParcelableExtra( intent, IntentHandler.EXTRA_PARENT_INTENT); @@ -144,14 +151,9 @@ tab.initialize(null, mTabContentManager, delegateFactory, !openInForeground, false); mTabSaver.addTabToSaveQueue(tab); } else { - webContents = - WarmupManager.getInstance().hasPrerenderedUrl(loadUrlParams.getUrl()) - ? WarmupManager.getInstance().takePrerenderedWebContents() : null; - tab = Tab.createLiveTab(Tab.INVALID_TAB_ID, mActivity, mIncognito, mNativeWindow, type, parentId, !openInForeground); - tab.initialize( - webContents, mTabContentManager, delegateFactory, !openInForeground, false); + tab.initialize(null, mTabContentManager, delegateFactory, !openInForeground, false); tab.loadUrl(loadUrlParams); } tab.getTabRedirectHandler().updateIntent(intent);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/EmptyTabModel.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/EmptyTabModel.java index a4a363e..93630440 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/EmptyTabModel.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/EmptyTabModel.java
@@ -136,4 +136,8 @@ public void removeObserver(TabModelObserver observer) { } + @Override + public void removeTab(Tab tab) { + } + }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/OffTheRecordTabModel.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/OffTheRecordTabModel.java index c37c700..a461cb2 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/OffTheRecordTabModel.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/OffTheRecordTabModel.java
@@ -224,4 +224,9 @@ mDelegateModel.removeObserver(observer); } + @Override + public void removeTab(Tab tab) { + mDelegateModel.removeTab(tab); + } + }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/SingleTabModel.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/SingleTabModel.java index feb93f1..46a6ecd 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/SingleTabModel.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/SingleTabModel.java
@@ -172,6 +172,11 @@ } @Override + public void removeTab(Tab tab) { + assert false; + } + + @Override public void addObserver(TabModelObserver observer) { mObservers.addObserver(observer); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModel.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModel.java index 287af15..dced692 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModel.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModel.java
@@ -47,7 +47,12 @@ * Opened from the long press context menu. Will not be brought to the foreground. * Like FROM_CHROME_UI, but also sets up a parent/child relationship like FROM_LINK. */ - FROM_LONGPRESS_BACKGROUND + FROM_LONGPRESS_BACKGROUND, + + /** + * Changed windows by moving from one activity to another. Will be opened in the foreground. + */ + FROM_REPARENTING } /** @@ -181,6 +186,13 @@ void addTab(Tab tab, int index, TabLaunchType type); /** + * Removes the given tab from the model without destroying it. The tab should be inserted into + * another model to avoid leaking as after this the link to the old Activity will be broken. + * @param tab The tab to remove. + */ + void removeTab(Tab tab); + + /** * Subscribes a {@link TabModelObserver} to be notified about changes to this model. * @param observer The observer to be subscribed. */
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelImpl.java index c2c55e0..5c6c7a7 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelImpl.java
@@ -84,6 +84,11 @@ } @Override + public void removeTab(Tab tab) { + mTabs.remove(tab); + } + + @Override public void destroy() { for (Tab tab : mTabs) { if (tab.isInitialized()) tab.destroy();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabReparentingParams.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabReparentingParams.java index 6d8b2b0d6..389ca6c4 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabReparentingParams.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabReparentingParams.java
@@ -16,13 +16,16 @@ public class TabReparentingParams implements AsyncTabParams { private final Tab mTabToReparent; private final Intent mOriginalIntent; + private final Runnable mFinalizeCallback; /** * Basic constructor for {@link TabReparentingParams}. */ - public TabReparentingParams(Tab tabToReparent, Intent originalIntent) { + public TabReparentingParams( + Tab tabToReparent, Intent originalIntent, Runnable finalizeCallback) { mTabToReparent = tabToReparent; mOriginalIntent = originalIntent; + mFinalizeCallback = finalizeCallback; } @Override @@ -50,4 +53,15 @@ return mTabToReparent; } + /** + * Carry out any remaining finalization to be done after the tab is reparented. + */ + public void finalizeTabReparenting() { + mFinalizeCallback.run(); + } + + @Override + public void destroy() { + if (mTabToReparent != null) mTabToReparent.destroy(); + } } \ No newline at end of file
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/document/ActivityDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/document/ActivityDelegate.java index afaa1b8..9f478eab 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/document/ActivityDelegate.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/document/ActivityDelegate.java
@@ -12,11 +12,14 @@ import org.chromium.base.ApplicationStatus; import org.chromium.chrome.browser.ChromeActivity; +import org.chromium.chrome.browser.IntentHandler; import org.chromium.chrome.browser.UrlConstants; import org.chromium.chrome.browser.document.DocumentActivity; import org.chromium.chrome.browser.externalnav.ExternalNavigationDelegateImpl; import org.chromium.chrome.browser.tab.Tab; +import org.chromium.chrome.browser.tabmodel.AsyncTabParamsManager; import org.chromium.chrome.browser.tabmodel.document.DocumentTabModel.Entry; +import org.chromium.chrome.browser.util.IntentUtils; import java.lang.ref.WeakReference; import java.util.List; @@ -123,6 +126,12 @@ public static int getTabIdFromIntent(Intent intent) { if (intent == null || intent.getData() == null) return Tab.INVALID_TAB_ID; + // Avoid AsyncTabCreationParams related flows early returning here. + if (AsyncTabParamsManager.hasParamsWithTabToReparent()) { + return IntentUtils.safeGetIntExtra( + intent, IntentHandler.EXTRA_TAB_ID, Tab.INVALID_TAB_ID); + } + Uri data = intent.getData(); if (!TextUtils.equals(data.getScheme(), UrlConstants.DOCUMENT_SCHEME)) { return Tab.INVALID_TAB_ID;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/document/AsyncTabCreationParams.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/document/AsyncTabCreationParams.java index 2e63389..3d6ad22 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/document/AsyncTabCreationParams.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/document/AsyncTabCreationParams.java
@@ -125,4 +125,9 @@ public Tab getTabToReparent() { return null; } + + @Override + public void destroy() { + if (mWebContents != null) mWebContents.destroy(); + } } \ No newline at end of file
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/document/DocumentTabModelImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/document/DocumentTabModelImpl.java index f12c8f16..8ea7ea40 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/document/DocumentTabModelImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/document/DocumentTabModelImpl.java
@@ -890,6 +890,11 @@ } @Override + public void removeTab(Tab tab) { + assert false; + } + + @Override public boolean supportsPendingClosures() { return false; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/BoundedLinearLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/widget/BoundedLinearLayout.java index 4c6b41c2..6fe79ff 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/widget/BoundedLinearLayout.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/widget/BoundedLinearLayout.java
@@ -12,7 +12,7 @@ import org.chromium.chrome.R; /** - * A LinearLayout that can be constrained to a maximum width. + * A LinearLayout that can be constrained to a maximum size. * * Example: * <org.chromium.chrome.browser.widget.BoundedLinearLayout @@ -25,9 +25,10 @@ */ public class BoundedLinearLayout extends LinearLayout { - private static final int NO_MAX_WIDTH = -1; + private static final int NOT_SPECIFIED = -1; private final int mMaxWidth; + private final int mMaxHeight; /** * Constructor for inflating from XML. @@ -35,7 +36,8 @@ public BoundedLinearLayout(Context context, AttributeSet attrs) { super(context, attrs); TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.BoundedView); - mMaxWidth = a.getDimensionPixelSize(R.styleable.BoundedView_maxWidth, NO_MAX_WIDTH); + mMaxWidth = a.getDimensionPixelSize(R.styleable.BoundedView_maxWidth, NOT_SPECIFIED); + mMaxHeight = a.getDimensionPixelSize(R.styleable.BoundedView_maxHeight, NOT_SPECIFIED); a.recycle(); } @@ -43,11 +45,17 @@ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // Limit width to mMaxWidth. int widthSize = MeasureSpec.getSize(widthMeasureSpec); - if (mMaxWidth != NO_MAX_WIDTH && widthSize > mMaxWidth) { + if (mMaxWidth != NOT_SPECIFIED && widthSize > mMaxWidth) { int widthMode = MeasureSpec.getMode(widthMeasureSpec); if (widthMode == MeasureSpec.UNSPECIFIED) widthMode = MeasureSpec.AT_MOST; widthMeasureSpec = MeasureSpec.makeMeasureSpec(mMaxWidth, widthMode); } + int heightSize = MeasureSpec.getSize(heightMeasureSpec); + if (mMaxHeight != NOT_SPECIFIED && heightSize > mMaxHeight) { + int heightMode = MeasureSpec.getMode(heightMeasureSpec); + if (heightMode == MeasureSpec.UNSPECIFIED) heightMode = MeasureSpec.AT_MOST; + heightMeasureSpec = MeasureSpec.makeMeasureSpec(mMaxHeight, heightMode); + } super.onMeasure(widthMeasureSpec, heightMeasureSpec); } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/RadioButtonWithDescription.java b/chrome/android/java/src/org/chromium/chrome/browser/widget/RadioButtonWithDescription.java deleted file mode 100644 index c51f15d..0000000 --- a/chrome/android/java/src/org/chromium/chrome/browser/widget/RadioButtonWithDescription.java +++ /dev/null
@@ -1,107 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.chrome.browser.widget; - -import android.content.Context; -import android.content.res.TypedArray; -import android.util.AttributeSet; -import android.view.LayoutInflater; -import android.view.View; -import android.view.View.OnClickListener; -import android.widget.RadioButton; -import android.widget.RelativeLayout; -import android.widget.TextView; - -import org.chromium.chrome.R; - -import java.util.List; - -/** - * A RadioButton with a title and descriptive text to the right. - */ -public class RadioButtonWithDescription extends RelativeLayout implements OnClickListener { - private RadioButton mRadioButton; - private TextView mTitle; - private TextView mDescription; - - private List<RadioButtonWithDescription> mGroup; - - /** - * Constructor for inflating via XML. - */ - public RadioButtonWithDescription(Context context, AttributeSet attrs) { - super(context, attrs); - LayoutInflater.from(context).inflate(R.layout.radio_button_with_description, this, true); - - mRadioButton = (RadioButton) findViewById(R.id.radio_button); - mTitle = (TextView) findViewById(R.id.title); - mDescription = (TextView) findViewById(R.id.description); - - if (attrs != null) applyAttributes(attrs); - - // We want RadioButtonWithDescription to handle the clicks itself. - mRadioButton.setClickable(false); - setOnClickListener(this); - } - - private void applyAttributes(AttributeSet attrs) { - TypedArray a = getContext().getTheme().obtainStyledAttributes(attrs, - R.styleable.RadioButtonWithDescription, 0, 0); - - String titleText = a.getString(R.styleable.RadioButtonWithDescription_titleText); - if (titleText != null) mTitle.setText(titleText); - - a.recycle(); - } - - @Override - public void onClick(View v) { - if (mGroup != null) { - for (RadioButtonWithDescription button : mGroup) { - button.setChecked(false); - } - } - - setChecked(true); - } - - /** - * Sets the text shown in the title section. - */ - public void setTitleText(CharSequence text) { - mTitle.setText(text); - } - - /** - * Sets the text shown in the description section. - */ - public void setDescriptionText(CharSequence text) { - mDescription.setText(text); - } - - /** - * Returns true if checked. - */ - public boolean isChecked() { - return mRadioButton.isChecked(); - } - - /** - * Sets the checked status. - */ - public void setChecked(boolean checked) { - mRadioButton.setChecked(checked); - } - - /** - * Sets the group of RadioButtonWithDescriptions that should be unchecked when this button is - * checked. - * @param group A list containing all elements of the group. - */ - public void setRadioButtonGroup(List<RadioButtonWithDescription> group) { - mGroup = group; - } -} -
diff --git a/chrome/android/java/strings/android_chrome_strings.grd b/chrome/android/java/strings/android_chrome_strings.grd index 53fffee..c5ec0b1 100644 --- a/chrome/android/java/strings/android_chrome_strings.grd +++ b/chrome/android/java/strings/android_chrome_strings.grd
@@ -170,9 +170,6 @@ <message name="IDS_NEXT" desc="Generic label for a button to advance to the next item. [CHAR-LIMIT=20]"> Next </message> - <message name="IDS_CONTINUE_BUTTON" desc="Generic label for a button to continue to the next screen. Used in multiple contexts. [CHAR-LIMIT=20]"> - Continue - </message> <message name="IDS_SUBMIT" desc="Generic label for a button to submit data. Used in multiple contexts. [CHAR-LIMIT=20]"> Submit </message> @@ -1066,26 +1063,14 @@ <message name="IDS_SYNC_LOADING" desc="Preference title to let the user change their encryption password. [CHAR-LIMIT=20]"> Loading… </message> - <message name="IDS_SYNC_IMPORT_DATA_TITLE" desc="Preference title of screen to let user choose to switch sync accounts. [CHAR-LIMIT=24]"> - Import data? - </message> - <message name="IDS_SYNC_IMPORT_DATA_PROMPT_SWITCHING_ACCOUNTS" desc="Prompt for the user to choose how they want to handle their existing sync data"> - You’re switching sync accounts from <ph name="FROM_ACCOUNT">%2$s<ex>johndoe@old.com</ex></ph> to <ph name="TO_ACCOUNT">%1$s<ex>johndoe@new.com</ex></ph>. What do you want to do with your existing bookmarks, history, passwords and other settings? - </message> - <message name="IDS_SYNC_IMPORT_DATA_PROMPT_EXISTING_DATA" desc="Prompt for the user to choose how they want to handle their existing sync data"> - You’re signing in to <ph name="TO_ACCOUNT">%1$s<ex>johndoe@new.com</ex></ph>. Some of your existing bookmarks, history, passwords, and other settings were previously synced to <ph name="FROM_ACCOUNT">%2$s<ex>johndoe@old.com</ex></ph>. What do you want to do with your existing data? - </message> - <message name="IDS_SYNC_IMPORT_EXISTING_DATA" desc="Option to import existing data to the newly selected sync account"> - Import existing data - </message> - <message name="IDS_SYNC_IMPORT_EXISTING_DATA_SUBTEXT" desc="Subtext describing what happens if the user elects to import existing data to the newly selected sync account"> - Keep existing data on your device and permanently import the data to <ph name="TO_ACCOUNT">%1$s<ex>johndoe@new.com</ex></ph>. - </message> <message name="IDS_SYNC_KEEP_EXISTING_DATA_SEPARATE" desc="Option to keep the existing data separate from the newly selected sync account"> Keep existing data separate </message> <message name="IDS_SYNC_KEEP_EXISTING_DATA_SEPARATE_SUBTEXT" desc="Subtext describing what happens if the user elects to keep the existing data separate"> - Replace this device’s data with <ph name="TO_ACCOUNT">%1$s<ex>johndoe@new.com</ex></ph>’s data. You can retrieve your existing data by switching back to <ph name="FROM_ACCOUNT">%2$s<ex>johndoe@old.com</ex></ph>, but data created since you signed out will be lost. + Replace this device’s data with <ph name="ACCOUNT">%1$s<ex>john@doe.com</ex></ph>’s data. You can retrieve your existing data by switching back to <ph name="ACCOUNT">%1$s<ex>johndoe@gmail.com</ex></ph> + </message> + <message name="IDS_SYNC_KEEP_EXISTING_DATA_SEPARATE_VALUE" desc="Internal value for keep existing data preference" translateable="false"> + keep_existing_data </message> <!-- Bluetooth Picker UI strings --> @@ -1471,6 +1456,9 @@ <message name="IDS_PAGE_INFO_CONNECTION_OFFLINE" desc="Message to display int the page info bubble when viewing and offline page."> You are viewing an offline copy of this page from <ph name="CREATION_TIME">%1$s<ex>Feb 9, 2016</ex></ph> </message> + <message name="IDS_PAGE_INFO_OFFLINE_ICON" desc="Content description for the offline page icon on page info dialog."> + Offline content + </message> <!-- Sad tab page --> <message name="IDS_SAD_TAB_SUGGESTIONS" desc="The help message displayed on the sad tab page after a tab crashes."> @@ -1629,15 +1617,51 @@ </message> <!-- First Run strings --> + <message name="IDS_FRE_SET_UP_CHROME" desc="Header text shown when the user is first setting up Chrome"> + Set up Chrome + </message> + <message name="IDS_FRE_ACCOUNT_CHOICE_DESCRIPTION" desc="Text for account chooser page"> + Sign in to get your bookmarks, history, passwords, and other settings on all your devices. + </message> + <message name="IDS_FRE_ACCEPT" desc="Text for button to accept being signed in"> + OK, got it + </message> <message name="IDS_FRE_SKIP_TEXT" desc="Text for second page skip button"> No thanks </message> + <message name="IDS_CHOOSE_ACCOUNT_SIGN_IN" desc="Sign in button for choose google account dialog [CHAR-LIMIT=20]"> + Sign in + </message> <message name="IDS_FRE_DONE" desc="Button to dismiss the sign-in screen once the user is done"> Done </message> <message name="IDS_FRE_SETTINGS" desc="Button that opens Chrome settings"> Settings </message> + <message name="IDS_FRE_ADD_ACCOUNT" desc="Text for adding another Google Account"> + Add account + </message> + <message name="IDS_MAKE_CHROME_YOURS" desc="Title for the signin promo that prompts the user to sign in to Chrome to have a personalized experirence. [CHAR-LIMIT=24]"> + Make Chrome yours + </message> + <message name="IDS_FRE_NO_ACCOUNT_CHOICE_DESCRIPTION" desc="Text for account chooser page when there are no accounts on the device."> + Add an account to get your bookmarks, history, passwords, and other settings on all your devices. + </message> + <message name="IDS_SIGN_IN_TO_CHROME_SUMMARY_VARIANT" desc="A variant of summary for the signin promo; lists reasons to sign in to Chrome."> + Sign in to access all your web stuff from any device + </message> + <message name="IDS_FRE_NO_ACCOUNTS" desc="Text for spinner when there is no google accounts [CHAR-LIMIT=40]"> + Add an account + </message> + <message name="IDS_FRE_HI_NAME" desc="Title welcoming the user by their name after they have signed in."> + Hi, <ph name="FULL_NAME">%1$s<ex>John Smith</ex></ph> + </message> + <message name="IDS_FRE_SIGNED_IN_DESCRIPTION" desc="Explanation of what gets synced after the user signed in"> + Your bookmarks, history, passwords, and other settings will be synced to your Google Account so you can use them on all your devices. You can choose what to sync in <ph name="BEGIN_LINK1"><LINK1></ph>Settings<ph name="END_LINK1"></LINK1></ph>. + </message> + <message name="IDS_FRE_SIGNED_IN_DESCRIPTION_UCA_ADDENDUM" desc="Additional explanation for child accounts that synced settings are managed by parents."> + Your parents help manage these settings. + </message> <message name="IDS_FRE_TOS_AND_PRIVACY" desc="Message explaining that use of Chrome is governed by Chrome's terms of service and privacy notice."> By using this application, you agree to Chrome’s <ph name="BEGIN_LINK1"><LINK1></ph>Terms of Service<ph name="END_LINK1"></LINK1></ph> and <ph name="BEGIN_LINK2"><LINK2></ph>Privacy Notice<ph name="END_LINK2"></LINK2></ph>. </message> @@ -1650,42 +1674,7 @@ <message name="IDS_FRE_WELCOME" desc="Text for greeting the user on Chrome First Run"> Welcome to Chrome </message> - - <!-- Account Signin Strings --> - <message name="IDS_SIGNIN_SET_UP_CHROME" desc="Header text shown when the user is first setting up Chrome"> - Set up Chrome - </message> - <message name="IDS_CHOOSE_ACCOUNT_SIGN_IN" desc="Sign in button for choose google account dialog [CHAR-LIMIT=20]"> - Sign in - </message> - <message name="IDS_SIGNIN_ACCOUNT_CHOICE_DESCRIPTION" desc="Text for account chooser page"> - Sign in to get your bookmarks, history, passwords, and other settings on all your devices. - </message> - <message name="IDS_SIGNIN_ACCEPT" desc="Text for button to accept being signed in"> - OK, got it - </message> - <message name="IDS_SIGNIN_ADD_ACCOUNT" desc="Text for adding another Google Account"> - Add account - </message> - <message name="IDS_MAKE_CHROME_YOURS" desc="Title for the signin promo that prompts the user to sign in to Chrome to have a personalized experirence. [CHAR-LIMIT=24]"> - Make Chrome yours - </message> - <message name="IDS_SIGNIN_NO_ACCOUNT_CHOICE_DESCRIPTION" desc="Text for account chooser page when there are no accounts on the device."> - Add an account to get your bookmarks, history, passwords, and other settings on all your devices. - </message> - <message name="IDS_SIGNIN_SIGN_IN_TO_CHROME_SUMMARY_VARIANT" desc="A variant of summary for the signin promo; lists reasons to sign in to Chrome."> - Sign in to access all your web stuff from any device - </message> - <message name="IDS_SIGNIN_HI_NAME" desc="Title welcoming the user by their name after they have signed in."> - Hi, <ph name="FULL_NAME">%1$s<ex>John Smith</ex></ph> - </message> - <message name="IDS_SIGNIN_SIGNED_IN_DESCRIPTION" desc="Explanation of what gets synced after the user signed in"> - Your bookmarks, history, passwords, and other settings will be synced to your Google Account so you can use them on all your devices. You can choose what to sync in <ph name="BEGIN_LINK1"><LINK1></ph>Settings<ph name="END_LINK1"></LINK1></ph>. - </message> - <message name="IDS_SIGNIN_SIGNED_IN_DESCRIPTION_UCA_ADDENDUM" desc="Additional explanation for child accounts that synced settings are managed by parents."> - Your parents help manage these settings. - </message> - <message name="IDS_ACCESSIBILITY_SIGNIN_ACCOUNT_SPINNER" desc="Content description for the first run account drop down spinner."> + <message name="IDS_ACCESSIBILITY_FRE_ACCOUNT_SPINNER" desc="Content description for the first run account drop down spinner."> Choose account </message>
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/TabTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/TabTest.java index e2475d9c..63159cc 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/TabTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/TabTest.java
@@ -4,6 +4,7 @@ package org.chromium.chrome.browser; +import android.app.Activity; import android.test.suitebuilder.annotation.SmallTest; import org.chromium.base.ThreadUtils; @@ -53,6 +54,16 @@ @SmallTest @Feature({"Tab"}) + public void testTabContext() throws Throwable { + assertFalse("The tab context cannot be an activity", + mTab.getContentViewCore().getContext() instanceof Activity); + assertNotSame("The tab context's theme should have been updated", + mTab.getContentViewCore().getContext().getTheme(), + getActivity().getApplication().getTheme()); + } + + @SmallTest + @Feature({"Tab"}) public void testTitleDelayUpdate() throws Throwable { final String oldTitle = "oldTitle"; final String newTitle = "newTitle";
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/PreferencesTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/PreferencesTest.java index 59f7844..ac740c92 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/PreferencesTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/PreferencesTest.java
@@ -4,7 +4,9 @@ package org.chromium.chrome.browser.preferences; +import android.accounts.Account; import android.app.Activity; +import android.app.DialogFragment; import android.app.Instrumentation; import android.content.Context; import android.content.Intent; @@ -23,9 +25,14 @@ import org.chromium.chrome.browser.search_engines.TemplateUrlService; import org.chromium.chrome.browser.search_engines.TemplateUrlService.LoadListener; import org.chromium.chrome.browser.search_engines.TemplateUrlService.TemplateUrl; +import org.chromium.chrome.browser.signin.SigninManager; +import org.chromium.chrome.browser.sync.ui.ChooseAccountFragment; import org.chromium.content.browser.test.NativeLibraryTestBase; import org.chromium.content.browser.test.util.CallbackHelper; import org.chromium.content.browser.test.util.UiUtils; +import org.chromium.sync.signin.AccountManagerHelper; +import org.chromium.sync.test.util.MockAccountManager; +import org.chromium.sync.test.util.SimpleFuture; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; @@ -212,6 +219,50 @@ return locationPermission; } + /** + * Tests that double-clicking on sign-in doesn't show two sign-in prompts. + * + * This is a regression test for http://crbug.com/515055. + */ + @SmallTest + @Feature({"Preferences"}) + public void testDoubleSignin() throws Exception { + // Sets up state so that displayAccountPicker() shows a ChooseAccountFragment. + setUpTestAccount(); + final Preferences prefActivity = startPreferences(getInstrumentation(), + MainPreferences.class.getName()); + final MainPreferences mainPrefs = (MainPreferences) prefActivity.getFragmentForTest(); + + DialogFragment fragment1 = displayAccountPicker(mainPrefs); + DialogFragment fragment2 = displayAccountPicker(mainPrefs); + assertTrue(fragment1 instanceof ChooseAccountFragment); + assertNull(fragment2); + } + + private DialogFragment displayAccountPicker(final MainPreferences mainPrefs) + throws InterruptedException { + final SimpleFuture<DialogFragment> result = new SimpleFuture<DialogFragment>(); + ThreadUtils.runOnUiThread(new Runnable() { + public void run() { + mainPrefs.displayAccountPicker(result.createCallback()); + } + }); + return result.get(); + } + + private void setUpTestAccount() { + final Context context = getInstrumentation().getTargetContext(); + ThreadUtils.runOnUiThreadBlocking(new Runnable() { + @Override + public void run() { + SigninManager.get(context).onFirstRunCheckDone(); + } + }); + Account account = AccountManagerHelper.createAccountFromName("test@chromium.org"); + MockAccountManager accountManager = new MockAccountManager(context, context, account); + AccountManagerHelper.overrideAccountManagerHelperForTests(context, accountManager); + } + // TODO(mvanouwerkerk): Write new preference intent tests for notification settings. // https://crbug.com/461885
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd index 0ef2655..d47f7f9 100644 --- a/chrome/app/generated_resources.grd +++ b/chrome/app/generated_resources.grd
@@ -10430,6 +10430,12 @@ desc="Text for the button that opens the app in a tab. (In sentence case.)"> Open in a tab </message> + <if expr="chromeos"> + <message name="IDS_APP_CONTEXT_MENU_ACTIVATE_ARC" + desc="Text for the button that activates Android App. (In sentence case.)"> + Activate + </message> + </if> </if> <if expr="use_titlecase"> @@ -10481,6 +10487,12 @@ desc="Text for the button that opens the app in a tab. (In title case.)"> Open in a Tab </message> + <if expr="chromeos"> + <message name="IDS_APP_CONTEXT_MENU_ACTIVATE_ARC" + desc="Text for the button that activates Android App. (In title case.)"> + Activate + </message> + </if> </if> <!-- Multi-profile -->
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn index e86e4628..fc5b93e 100644 --- a/chrome/browser/BUILD.gn +++ b/chrome/browser/BUILD.gn
@@ -603,6 +603,14 @@ ] } + if (is_chromeos) { + sources += [ + "metrics/leak_detector_controller.cc", + "metrics/leak_detector_controller.h", + ] + deps += [ "//components/metrics:leak_detector" ] + } + if (use_cups) { configs += [ "//printing:cups" ] }
diff --git a/chrome/browser/android/most_visited_sites.cc b/chrome/browser/android/most_visited_sites.cc index 3e8e7f4..a41f6c8 100644 --- a/chrome/browser/android/most_visited_sites.cc +++ b/chrome/browser/android/most_visited_sites.cc
@@ -29,6 +29,7 @@ #include "chrome/browser/search/suggestions/suggestions_utils.h" #include "chrome/browser/supervised_user/supervised_user_service.h" #include "chrome/browser/supervised_user/supervised_user_service_factory.h" +#include "chrome/browser/supervised_user/supervised_user_url_filter.h" #include "chrome/browser/sync/profile_sync_service_factory.h" #include "chrome/browser/thumbnails/thumbnail_list_source.h" #include "chrome/common/chrome_switches.h" @@ -475,6 +476,9 @@ void MostVisitedSites::OnMostVisitedURLsAvailable( const history::MostVisitedURLList& visited_list) { + SupervisedUserURLFilter* url_filter = + SupervisedUserServiceFactory::GetForProfile(profile_) + ->GetURLFilterForUIThread(); MostVisitedSites::SuggestionsVector suggestions; size_t num_tiles = std::min(visited_list.size(), static_cast<size_t>(num_sites_)); @@ -484,6 +488,11 @@ num_tiles = i; break; // This is the signal that there are no more real visited sites. } + if (url_filter->GetFilteringBehaviorForURL(visited.url) == + SupervisedUserURLFilter::FilteringBehavior::BLOCK) { + continue; + } + suggestions.push_back(make_scoped_ptr( new Suggestion(visited.title, visited.url.spec(), TOP_SITES))); } @@ -505,9 +514,17 @@ if (num_sites_ < num_tiles) num_tiles = num_sites_; + SupervisedUserURLFilter* url_filter = + SupervisedUserServiceFactory::GetForProfile(profile_) + ->GetURLFilterForUIThread(); MostVisitedSites::SuggestionsVector suggestions; for (int i = 0; i < num_tiles; ++i) { const ChromeSuggestion& suggestion = suggestions_profile.suggestions(i); + if (url_filter->GetFilteringBehaviorForURL(GURL(suggestion.url())) == + SupervisedUserURLFilter::FilteringBehavior::BLOCK) { + continue; + } + suggestions.push_back(make_scoped_ptr(new Suggestion( base::UTF8ToUTF16(suggestion.title()), suggestion.url(), SUGGESTIONS_SERVICE, @@ -531,8 +548,30 @@ SupervisedUserService* supervised_user_service = SupervisedUserServiceFactory::GetForProfile(profile_); + SupervisedUserURLFilter* url_filter = + supervised_user_service->GetURLFilterForUIThread(); + + std::set<std::string> personal_hosts; + for (const auto& suggestion : personal_suggestions) + personal_hosts.insert(suggestion->url.host()); + scoped_refptr<TopSites> top_sites(TopSitesFactory::GetForProfile(profile_)); for (const auto& whitelist : supervised_user_service->whitelists()) { + // Skip blacklisted sites. + if (top_sites && top_sites->IsBlacklisted(whitelist->entry_point())) + continue; + + // Skip suggestions already present. + if (personal_hosts.find(whitelist->entry_point().host()) != + personal_hosts.end()) + continue; + + // Skip whitelist entry points that are manually blocked. + if (url_filter->GetFilteringBehaviorForURL(whitelist->entry_point()) == + SupervisedUserURLFilter::FilteringBehavior::BLOCK) { + continue; + } + whitelist_suggestions.push_back(make_scoped_ptr(new Suggestion( whitelist->title(), whitelist->entry_point(), WHITELIST))); if (whitelist_suggestions.size() >= num_whitelist_suggestions) @@ -546,6 +585,10 @@ MostVisitedSites::CreatePopularSitesSuggestions( const MostVisitedSites::SuggestionsVector& personal_suggestions, const MostVisitedSites::SuggestionsVector& whitelist_suggestions) { + // For child accounts popular sites suggestions will not be added. + if (profile_->IsChild()) + return MostVisitedSites::SuggestionsVector(); + size_t num_suggestions = personal_suggestions.size() + whitelist_suggestions.size(); DCHECK_LE(num_suggestions, static_cast<size_t>(num_sites_)); @@ -556,17 +599,19 @@ MostVisitedSites::SuggestionsVector popular_sites_suggestions; if (num_popular_sites_suggestions > 0 && popular_sites_) { - std::set<std::string> personal_hosts; + std::set<std::string> hosts; for (const auto& suggestion : personal_suggestions) - personal_hosts.insert(suggestion->url.host()); + hosts.insert(suggestion->url.host()); + for (const auto& suggestion : whitelist_suggestions) + hosts.insert(suggestion->url.host()); scoped_refptr<TopSites> top_sites(TopSitesFactory::GetForProfile(profile_)); for (const PopularSites::Site& popular_site : popular_sites_->sites()) { // Skip blacklisted sites. if (top_sites && top_sites->IsBlacklisted(popular_site.url)) continue; std::string host = popular_site.url.host(); - // Skip suggestions already present in personal. - if (personal_hosts.find(host) != personal_hosts.end()) + // Skip suggestions already present in personal or whitelists. + if (hosts.find(host) != hosts.end()) continue; popular_sites_suggestions.push_back(make_scoped_ptr(
diff --git a/chrome/browser/android/offline_pages/offline_page_tab_helper.cc b/chrome/browser/android/offline_pages/offline_page_tab_helper.cc new file mode 100644 index 0000000..c0e6e3b --- /dev/null +++ b/chrome/browser/android/offline_pages/offline_page_tab_helper.cc
@@ -0,0 +1,117 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/android/offline_pages/offline_page_tab_helper.h" + +#include "base/bind.h" +#include "base/logging.h" +#include "base/metrics/histogram.h" +#include "base/thread_task_runner_handle.h" +#include "chrome/browser/android/offline_pages/offline_page_utils.h" +#include "content/public/browser/browser_thread.h" +#include "content/public/browser/navigation_controller.h" +#include "content/public/browser/navigation_handle.h" +#include "content/public/browser/render_frame_host.h" +#include "content/public/browser/web_contents.h" +#include "net/base/net_errors.h" +#include "net/base/network_change_notifier.h" + +DEFINE_WEB_CONTENTS_USER_DATA_KEY(offline_pages::OfflinePageTabHelper); + +namespace offline_pages { + +OfflinePageTabHelper::OfflinePageTabHelper(content::WebContents* web_contents) + : content::WebContentsObserver(web_contents), + weak_ptr_factory_(this) { + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); +} + +OfflinePageTabHelper::~OfflinePageTabHelper() {} + +void OfflinePageTabHelper::DidStartNavigation( + content::NavigationHandle* navigation_handle) { + GURL last_redirect_from_url_copy = last_redirect_from_url_; + last_redirect_from_url_ = GURL(); + + // Skips non-main frame. + if (!navigation_handle->IsInMainFrame()) + return; + + // Redirecting to online version will only take effect when there is network + // connection. + if (net::NetworkChangeNotifier::IsOffline()) + return; + + // Skips if not loading an offline copy of saved page. + GURL online_url = offline_pages::OfflinePageUtils::GetOnlineURLForOfflineURL( + web_contents()->GetBrowserContext(), navigation_handle->GetURL()); + if (!online_url.is_valid()) + return; + + // Avoids looping between online and offline redirections. + if (last_redirect_from_url_copy == online_url) + return; + last_redirect_from_url_ = navigation_handle->GetURL(); + + base::ThreadTaskRunnerHandle::Get()->PostTask( + FROM_HERE, + base::Bind(&OfflinePageTabHelper::RedirectFromOfflineToOnline, + weak_ptr_factory_.GetWeakPtr(), + online_url)); +} + +void OfflinePageTabHelper::DidFailProvisionalLoad( + content::RenderFrameHost* render_frame_host, + const GURL& validated_url, + int error_code, + const base::string16& error_description, + bool was_ignored_by_handler) { + GURL last_redirect_from_url_copy = last_redirect_from_url_; + last_redirect_from_url_ = GURL(); + + // Skips non-main frame or load failure other than no network. + if (error_code != net::ERR_INTERNET_DISCONNECTED || + render_frame_host->GetParent() != nullptr) { + return; + } + + // Redirecting to offline version will only take effect when there is no + // network connection. + if (!net::NetworkChangeNotifier::IsOffline()) + return; + + // Skips if not loading an online version of saved page. + GURL offline_url = offline_pages::OfflinePageUtils::GetOfflineURLForOnlineURL( + web_contents()->GetBrowserContext(), validated_url); + if (!offline_url.is_valid()) + return; + + // Avoids looping between online and offline redirections. + if (last_redirect_from_url_copy == offline_url) + return; + last_redirect_from_url_ = validated_url; + + base::ThreadTaskRunnerHandle::Get()->PostTask( + FROM_HERE, + base::Bind(&OfflinePageTabHelper::RedirectFromOnlineToOffline, + weak_ptr_factory_.GetWeakPtr(), + offline_url)); +} + +void OfflinePageTabHelper::RedirectFromOfflineToOnline(const GURL& online_url) { + UMA_HISTOGRAM_COUNTS("OfflinePages.RedirectToOnlineCount", 1); + content::NavigationController::LoadURLParams load_params(online_url); + load_params.transition_type = ui::PAGE_TRANSITION_CLIENT_REDIRECT; + web_contents()->GetController().LoadURLWithParams(load_params); +} + +void OfflinePageTabHelper::RedirectFromOnlineToOffline( + const GURL& offline_url) { + UMA_HISTOGRAM_COUNTS("OfflinePages.RedirectToOfflineCount", 1); + content::NavigationController::LoadURLParams load_params(offline_url); + load_params.transition_type = ui::PAGE_TRANSITION_CLIENT_REDIRECT; + web_contents()->GetController().LoadURLWithParams(load_params); +} + +} // namespace offline_pages
diff --git a/chrome/browser/android/offline_pages/offline_page_tab_helper.h b/chrome/browser/android/offline_pages/offline_page_tab_helper.h new file mode 100644 index 0000000..2339197 --- /dev/null +++ b/chrome/browser/android/offline_pages/offline_page_tab_helper.h
@@ -0,0 +1,54 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_ANDROID_OFFLINE_PAGES_OFFLINE_PAGE_TAB_HELPER_H_ +#define CHROME_BROWSER_ANDROID_OFFLINE_PAGES_OFFLINE_PAGE_TAB_HELPER_H_ + +#include "base/macros.h" +#include "base/memory/weak_ptr.h" +#include "content/public/browser/web_contents_observer.h" +#include "content/public/browser/web_contents_user_data.h" +#include "url/gurl.h" + +namespace content { +class WebContents; +} + +namespace offline_pages { + +// Per-tab class to manage switch between online version and offline version. +class OfflinePageTabHelper : + public content::WebContentsObserver, + public content::WebContentsUserData<OfflinePageTabHelper> { + public: + ~OfflinePageTabHelper() override; + + private: + friend class content::WebContentsUserData<OfflinePageTabHelper>; + friend class OfflinePageTabHelperTest; + + explicit OfflinePageTabHelper(content::WebContents* web_contents); + + // Overridden from content::WebContentsObserver: + void DidStartNavigation( + content::NavigationHandle* navigation_handle) override; + void DidFailProvisionalLoad( + content::RenderFrameHost* render_frame_host, + const GURL& validated_url, + int error_code, + const base::string16& error_description, + bool was_ignored_by_handler) override; + + void RedirectFromOfflineToOnline(const GURL& online_url); + void RedirectFromOnlineToOffline(const GURL& offline_url); + + GURL last_redirect_from_url_; + base::WeakPtrFactory<OfflinePageTabHelper> weak_ptr_factory_; + + DISALLOW_COPY_AND_ASSIGN(OfflinePageTabHelper); +}; + +} // namespace offline_pages + +#endif // CHROME_BROWSER_ANDROID_OFFLINE_PAGES_OFFLINE_PAGE_TAB_HELPER_H_
diff --git a/chrome/browser/android/offline_pages/offline_page_tab_helper_unittest.cc b/chrome/browser/android/offline_pages/offline_page_tab_helper_unittest.cc new file mode 100644 index 0000000..3501f0e --- /dev/null +++ b/chrome/browser/android/offline_pages/offline_page_tab_helper_unittest.cc
@@ -0,0 +1,195 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/bind.h" +#include "base/command_line.h" +#include "base/files/file_path.h" +#include "base/memory/scoped_ptr.h" +#include "base/memory/weak_ptr.h" +#include "base/run_loop.h" +#include "chrome/browser/android/offline_pages/offline_page_model_factory.h" +#include "chrome/browser/android/offline_pages/offline_page_tab_helper.h" +#include "chrome/browser/android/offline_pages/test_offline_page_model_builder.h" +#include "chrome/test/base/chrome_render_view_host_test_harness.h" +#include "components/offline_pages/offline_page_item.h" +#include "components/offline_pages/offline_page_model.h" +#include "components/offline_pages/offline_page_switches.h" +#include "components/offline_pages/offline_page_test_archiver.h" +#include "content/public/browser/navigation_entry.h" +#include "content/public/browser/web_contents.h" +#include "net/base/net_errors.h" +#include "net/base/network_change_notifier.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace offline_pages { + +namespace { + +const GURL kTestPageUrl("http://test.org/page1"); +const int64_t kTestPageBookmarkId = 1234; +const int64_t kTestFileSize = 876543LL; + +class TestNetworkChangeNotifier : public net::NetworkChangeNotifier { + public: + TestNetworkChangeNotifier() : online_(true) {} + + net::NetworkChangeNotifier::ConnectionType GetCurrentConnectionType() + const override { + return online_ ? net::NetworkChangeNotifier::CONNECTION_UNKNOWN + : net::NetworkChangeNotifier::CONNECTION_NONE; + } + + void set_online(bool online) { online_ = online; } + + private: + bool online_; + + DISALLOW_COPY_AND_ASSIGN(TestNetworkChangeNotifier); +}; + +} // namespace + +class OfflinePageTabHelperTest : + public ChromeRenderViewHostTestHarness, + public OfflinePageTestArchiver::Observer, + public base::SupportsWeakPtr<OfflinePageTabHelperTest> { + public: + OfflinePageTabHelperTest() + : network_change_notifier_(new TestNetworkChangeNotifier()) {} + ~OfflinePageTabHelperTest() override {} + + void SetUp() override; + void TearDown() override; + + void RunUntilIdle(); + void SimulateHasNetworkConnectivity(bool has_connectivity); + void StartLoad(const GURL& url); + void CommitLoad(const GURL& url); + void FailLoad(const GURL& url); + + OfflinePageTabHelper* offline_page_tab_helper() const { + return offline_page_tab_helper_; + } + + private: + // OfflinePageTestArchiver::Observer implementation: + void SetLastPathCreatedByArchiver(const base::FilePath& file_path) override; + + scoped_ptr<OfflinePageTestArchiver> BuildArchiver( + const GURL& url, + const base::FilePath& file_name); + void OnSavePageDone(OfflinePageModel::SavePageResult result); + + scoped_ptr<TestNetworkChangeNotifier> network_change_notifier_; + OfflinePageTabHelper* offline_page_tab_helper_; // Not owned. + + DISALLOW_COPY_AND_ASSIGN(OfflinePageTabHelperTest); +}; + +void OfflinePageTabHelperTest::SetUp() { + // Creates a test web contents. + content::RenderViewHostTestHarness::SetUp(); + OfflinePageTabHelper::CreateForWebContents(web_contents()); + offline_page_tab_helper_ = + OfflinePageTabHelper::FromWebContents(web_contents()); + + // Enables offline pages feature. + base::CommandLine::ForCurrentProcess()->AppendSwitch( + switches::kEnableOfflinePages); + + // Sets up the factory for testing. + OfflinePageModelFactory::GetInstance()->SetTestingFactoryAndUse( + browser_context(), BuildTestOfflinePageModel); + RunUntilIdle(); + + // Saves an offline page. + OfflinePageModel* model = + OfflinePageModelFactory::GetForBrowserContext(browser_context()); + scoped_ptr<OfflinePageTestArchiver> archiver(BuildArchiver( + kTestPageUrl, base::FilePath(FILE_PATH_LITERAL("page1.mhtml")))); + model->SavePage( + kTestPageUrl, kTestPageBookmarkId, std::move(archiver), + base::Bind(&OfflinePageTabHelperTest::OnSavePageDone, AsWeakPtr())); + RunUntilIdle(); +} + +void OfflinePageTabHelperTest::TearDown() { + content::RenderViewHostTestHarness::TearDown(); +} + +void OfflinePageTabHelperTest::RunUntilIdle() { + base::RunLoop().RunUntilIdle(); +} + +void OfflinePageTabHelperTest::SimulateHasNetworkConnectivity(bool online) { + network_change_notifier_->set_online(online); +} + +void OfflinePageTabHelperTest::StartLoad(const GURL& url) { + controller().LoadURL(url, content::Referrer(), ui::PAGE_TRANSITION_TYPED, + std::string()); +} + +void OfflinePageTabHelperTest::CommitLoad(const GURL& url) { + int entry_id = controller().GetPendingEntry()->GetUniqueID(); + content::RenderFrameHostTester::For(main_rfh())->SendNavigate( + 0, entry_id, true, url); +} + +void OfflinePageTabHelperTest::FailLoad(const GURL& url) { + content::RenderFrameHostTester::For(main_rfh())->SimulateNavigationError( + url, net::ERR_INTERNET_DISCONNECTED); + // Gives a chance to run delayed task to do redirection. + RunUntilIdle(); +} + +void OfflinePageTabHelperTest::SetLastPathCreatedByArchiver( + const base::FilePath& file_path) { +} + +scoped_ptr<OfflinePageTestArchiver> OfflinePageTabHelperTest::BuildArchiver( + const GURL& url, + const base::FilePath& file_name) { + scoped_ptr<OfflinePageTestArchiver> archiver(new OfflinePageTestArchiver( + this, url, OfflinePageArchiver::ArchiverResult::SUCCESSFULLY_CREATED, + kTestFileSize, base::ThreadTaskRunnerHandle::Get())); + archiver->set_filename(file_name); + return archiver; +} + +void OfflinePageTabHelperTest::OnSavePageDone( + OfflinePageModel::SavePageResult result) { +} + +TEST_F(OfflinePageTabHelperTest, SwitchToOnlineFromOffline) { + SimulateHasNetworkConnectivity(true); + + OfflinePageModel* model = + OfflinePageModelFactory::GetForBrowserContext(browser_context()); + const OfflinePageItem* page = model->GetPageByBookmarkId(kTestPageBookmarkId); + GURL offline_url = page->GetOfflineURL(); + GURL online_url = page->url; + + StartLoad(offline_url); + CommitLoad(online_url); + EXPECT_EQ(online_url, controller().GetLastCommittedEntry()->GetURL()); +} + +TEST_F(OfflinePageTabHelperTest, SwitchToOfflineFromOnline) { + SimulateHasNetworkConnectivity(false); + + OfflinePageModel* model = + OfflinePageModelFactory::GetForBrowserContext(browser_context()); + const OfflinePageItem* page = model->GetPageByBookmarkId(kTestPageBookmarkId); + GURL offline_url = page->GetOfflineURL(); + GURL online_url = page->url; + + StartLoad(online_url); + EXPECT_EQ(online_url, controller().GetPendingEntry()->GetURL()); + + FailLoad(online_url); + EXPECT_EQ(offline_url, controller().GetPendingEntry()->GetURL()); +} + +} // namespace offline_pages
diff --git a/chrome/browser/android/tab_android.cc b/chrome/browser/android/tab_android.cc index 80157ce..15613c3 100644 --- a/chrome/browser/android/tab_android.cc +++ b/chrome/browser/android/tab_android.cc
@@ -434,6 +434,19 @@ content_layer_->InsertChild(content_view_core->GetLayer(), 0); } +void TabAndroid::UpdateDelegates( + JNIEnv* env, + const JavaParamRef<jobject>& obj, + const JavaParamRef<jobject>& jweb_contents_delegate, + const JavaParamRef<jobject>& jcontext_menu_populator) { + ContextMenuHelper::FromWebContents(web_contents())->SetPopulator( + jcontext_menu_populator); + web_contents_delegate_.reset( + new chrome::android::TabWebContentsDelegateAndroid( + env, jweb_contents_delegate)); + web_contents()->SetDelegate(web_contents_delegate_.get()); +} + void TabAndroid::DestroyWebContents(JNIEnv* env, const JavaParamRef<jobject>& obj, jboolean delete_native) {
diff --git a/chrome/browser/android/tab_android.h b/chrome/browser/android/tab_android.h index 4205e2e..d55f62c 100644 --- a/chrome/browser/android/tab_android.h +++ b/chrome/browser/android/tab_android.h
@@ -166,6 +166,11 @@ const base::android::JavaParamRef<jobject>& jcontent_view_core, const base::android::JavaParamRef<jobject>& jweb_contents_delegate, const base::android::JavaParamRef<jobject>& jcontext_menu_populator); + void UpdateDelegates( + JNIEnv* env, + const base::android::JavaParamRef<jobject>& obj, + const base::android::JavaParamRef<jobject>& jweb_contents_delegate, + const base::android::JavaParamRef<jobject>& jcontext_menu_populator); void DestroyWebContents(JNIEnv* env, const base::android::JavaParamRef<jobject>& obj, jboolean delete_native);
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc index b85bffd..3e884bb1 100644 --- a/chrome/browser/chrome_content_browser_client.cc +++ b/chrome/browser/chrome_content_browser_client.cc
@@ -110,6 +110,7 @@ #include "components/content_settings/core/browser/cookie_settings.h" #include "components/content_settings/core/browser/host_content_settings_map.h" #include "components/content_settings/core/common/content_settings.h" +#include "components/content_settings/core/common/content_settings_types.h" #include "components/data_reduction_proxy/content/browser/data_reduction_proxy_message_filter.h" #include "components/dom_distiller/core/dom_distiller_switches.h" #include "components/dom_distiller/core/url_constants.h" @@ -163,6 +164,8 @@ #include "ui/base/l10n/l10n_util.h" #include "ui/base/resource/resource_bundle.h" #include "ui/resources/grit/ui_resources.h" +#include "url/gurl.h" +#include "url/origin.h" #if defined(OS_WIN) #include "base/strings/string_tokenizer.h" @@ -1988,6 +1991,21 @@ CONTENT_SETTING_ALLOW; } +bool ChromeContentBrowserClient::AllowWebBluetooth( + content::BrowserContext* browser_context, + const url::Origin& requesting_origin, + const url::Origin& embedding_origin) { + const HostContentSettingsMap* const content_settings = + HostContentSettingsMapFactory::GetForProfile( + Profile::FromBrowserContext(browser_context)); + + return content_settings->GetContentSetting( + GURL(requesting_origin.Serialize()), + GURL(embedding_origin.Serialize()), + CONTENT_SETTINGS_TYPE_BLUETOOTH_GUARD, + std::string()) != CONTENT_SETTING_BLOCK; +} + net::URLRequestContext* ChromeContentBrowserClient::OverrideRequestContextForURL( const GURL& url, content::ResourceContext* context) {
diff --git a/chrome/browser/chrome_content_browser_client.h b/chrome/browser/chrome_content_browser_client.h index f969305..d8ccfa8 100644 --- a/chrome/browser/chrome_content_browser_client.h +++ b/chrome/browser/chrome_content_browser_client.h
@@ -172,6 +172,9 @@ #endif // defined(ENABLE_WEBRTC) bool AllowKeygen(const GURL& url, content::ResourceContext* context) override; + bool AllowWebBluetooth(content::BrowserContext* browser_context, + const url::Origin& requesting_origin, + const url::Origin& embedding_origin) override; net::URLRequestContext* OverrideRequestContextForURL( const GURL& url,
diff --git a/chrome/browser/chromeos/arc/arc_service_launcher.cc b/chrome/browser/chromeos/arc/arc_service_launcher.cc new file mode 100644 index 0000000..cc426fc --- /dev/null +++ b/chrome/browser/chromeos/arc/arc_service_launcher.cc
@@ -0,0 +1,45 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/chromeos/arc/arc_service_launcher.h" + +#include "base/bind.h" +#include "chrome/browser/chromeos/arc/arc_auth_service.h" +#include "chrome/browser/chromeos/arc/arc_intent_helper_bridge.h" +#include "chromeos/dbus/dbus_thread_manager.h" +#include "chromeos/dbus/session_manager_client.h" +#include "components/arc/arc_bridge_service.h" + +namespace arc { + +ArcServiceLauncher::ArcServiceLauncher() : weak_factory_(this) {} + +ArcServiceLauncher::~ArcServiceLauncher() {} + +void ArcServiceLauncher::Initialize() { + // Create ARC service manager. + arc_service_manager_.reset(new ArcServiceManager()); + arc_service_manager_->AddService(make_scoped_ptr( + new ArcAuthService(arc_service_manager_->arc_bridge_service()))); + arc_service_manager_->AddService(make_scoped_ptr( + new ArcIntentHelperBridge(arc_service_manager_->arc_bridge_service()))); + + // Detect availiability. + chromeos::SessionManagerClient* session_manager_client = + chromeos::DBusThreadManager::Get()->GetSessionManagerClient(); + session_manager_client->CheckArcAvailability(base::Bind( + &ArcServiceLauncher::OnArcAvailable, weak_factory_.GetWeakPtr())); +} + +void ArcServiceLauncher::Shutdown() { + DCHECK(arc_service_manager_); + arc_service_manager_->arc_bridge_service()->Shutdown(); +} + +void ArcServiceLauncher::OnArcAvailable(bool arc_available) { + arc_service_manager_->arc_bridge_service()->SetDetectedAvailability( + arc_available); +} + +} // namespace arc
diff --git a/chrome/browser/chromeos/arc/arc_service_launcher.h b/chrome/browser/chromeos/arc/arc_service_launcher.h new file mode 100644 index 0000000..75236ee --- /dev/null +++ b/chrome/browser/chromeos/arc/arc_service_launcher.h
@@ -0,0 +1,38 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_CHROMEOS_ARC_ARC_SERVICE_LAUNCHER_H_ +#define CHROME_BROWSER_CHROMEOS_ARC_ARC_SERVICE_LAUNCHER_H_ + +#include "base/macros.h" +#include "base/memory/scoped_ptr.h" +#include "base/memory/weak_ptr.h" +#include "base/threading/thread_checker.h" +#include "components/arc/arc_service_manager.h" + +namespace arc { + +// Detects ARC availability and launches ARC bridge service. +class ArcServiceLauncher { + public: + ArcServiceLauncher(); + ~ArcServiceLauncher(); + + void Initialize(); + void Shutdown(); + + private: + // DBus callback. + void OnArcAvailable(bool available); + + base::ThreadChecker thread_checker_; + scoped_ptr<ArcServiceManager> arc_service_manager_; + base::WeakPtrFactory<ArcServiceLauncher> weak_factory_; + + DISALLOW_COPY_AND_ASSIGN(ArcServiceLauncher); +}; + +} // namespace arc + +#endif // CHROME_BROWSER_CHROMEOS_ARC_ARC_SERVICE_LAUNCHER_H_
diff --git a/chrome/browser/chromeos/chrome_browser_main_chromeos.cc b/chrome/browser/chromeos/chrome_browser_main_chromeos.cc index c7b59cc0..7ec7f7c 100644 --- a/chrome/browser/chromeos/chrome_browser_main_chromeos.cc +++ b/chrome/browser/chromeos/chrome_browser_main_chromeos.cc
@@ -32,8 +32,7 @@ #include "chrome/browser/chromeos/app_mode/kiosk_app_launch_error.h" #include "chrome/browser/chromeos/app_mode/kiosk_app_manager.h" #include "chrome/browser/chromeos/app_mode/kiosk_mode_idle_app_name_notification.h" -#include "chrome/browser/chromeos/arc/arc_auth_service.h" -#include "chrome/browser/chromeos/arc/arc_intent_helper_bridge.h" +#include "chrome/browser/chromeos/arc/arc_service_launcher.h" #include "chrome/browser/chromeos/boot_times_recorder.h" #include "chrome/browser/chromeos/dbus/chrome_console_service_provider_delegate.h" #include "chrome/browser/chromeos/dbus/chrome_display_power_service_provider_delegate.h" @@ -114,8 +113,6 @@ #include "chromeos/network/portal_detector/network_portal_detector_stub.h" #include "chromeos/system/statistics_provider.h" #include "chromeos/tpm/tpm_token_loader.h" -#include "components/arc/arc_bridge_service.h" -#include "components/arc/arc_service_manager.h" #include "components/browser_sync/common/browser_sync_switches.h" #include "components/device_event_log/device_event_log.h" #include "components/metrics/metrics_service.h" @@ -415,13 +412,8 @@ wake_on_wifi_manager_.reset(new WakeOnWifiManager()); - arc_service_manager_.reset(new arc::ArcServiceManager()); - arc_service_manager_->AddService(make_scoped_ptr( - new arc::ArcAuthService(arc_service_manager_->arc_bridge_service()))); - arc_service_manager_->AddService( - make_scoped_ptr(new arc::ArcIntentHelperBridge( - arc_service_manager_->arc_bridge_service()))); - arc_service_manager_->arc_bridge_service()->DetectAvailability(); + arc_service_launcher_.reset(new arc::ArcServiceLauncher()); + arc_service_launcher_->Initialize(); chromeos::ResourceReporter::GetInstance()->StartMonitoring(); @@ -750,7 +742,7 @@ BootTimesRecorder::Get()->AddLogoutTimeMarker("UIMessageLoopEnded", true); - arc_service_manager_->arc_bridge_service()->Shutdown(); + arc_service_launcher_->Shutdown(); // Destroy the application name notifier for Kiosk mode. KioskModeIdleAppNameNotification::Shutdown();
diff --git a/chrome/browser/chromeos/chrome_browser_main_chromeos.h b/chrome/browser/chromeos/chrome_browser_main_chromeos.h index 67960cf..dcaa9658 100644 --- a/chrome/browser/chromeos/chrome_browser_main_chromeos.h +++ b/chrome/browser/chromeos/chrome_browser_main_chromeos.h
@@ -17,7 +17,7 @@ } namespace arc { -class ArcServiceManager; +class ArcServiceLauncher; } namespace chromeos { @@ -83,7 +83,7 @@ scoped_refptr<chromeos::ExternalMetrics> external_metrics_; - scoped_ptr<arc::ArcServiceManager> arc_service_manager_; + scoped_ptr<arc::ArcServiceLauncher> arc_service_launcher_; #if defined(MOJO_SHELL_CLIENT) scoped_ptr<ChromeInterfaceFactory> interface_factory_;
diff --git a/chrome/browser/chromeos/login/chrome_restart_request.cc b/chrome/browser/chromeos/login/chrome_restart_request.cc index c3b0ef36..43eb77a 100644 --- a/chrome/browser/chromeos/login/chrome_restart_request.cc +++ b/chrome/browser/chromeos/login/chrome_restart_request.cc
@@ -89,7 +89,6 @@ ::switches::kDisableLowResTiling, ::switches::kDisableMediaSource, ::switches::kDisablePreferCompositingToLCDText, - ::switches::kEnablePrefixedEncryptedMedia, ::switches::kDisablePanelFitting, ::switches::kDisableRGBA4444Textures, ::switches::kDisableSeccompFilterSandbox,
diff --git a/chrome/browser/engagement/site_engagement_helper.cc b/chrome/browser/engagement/site_engagement_helper.cc index 69d8ee93..089e47c 100644 --- a/chrome/browser/engagement/site_engagement_helper.cc +++ b/chrome/browser/engagement/site_engagement_helper.cc
@@ -105,6 +105,9 @@ case blink::WebInputEvent::MouseWheel: helper()->RecordUserInput(SiteEngagementMetrics::ENGAGEMENT_WHEEL); break; + case blink::WebInputEvent::Undefined: + // Explicitly ignore browser-initiated navigation input. + break; default: NOTREACHED(); }
diff --git a/chrome/browser/extensions/api/extension_action/extension_action_api.cc b/chrome/browser/extensions/api/extension_action/extension_action_api.cc index 907f31f..b749865 100644 --- a/chrome/browser/extensions/api/extension_action/extension_action_api.cc +++ b/chrome/browser/extensions/api/extension_action/extension_action_api.cc
@@ -232,6 +232,11 @@ return browser->window()->GetLocationBar()->ShowPageActionPopup( extension, grant_active_tab_permissions); } + + // Don't support showing action popups in a popup window. + if (!browser->SupportsWindowFeature(Browser::FEATURE_TOOLBAR)) + return false; + ToolbarActionsBar* toolbar_actions_bar = browser->window()->GetToolbarActionsBar(); // ToolbarActionsBar could be null if, e.g., this is a popup window with no
diff --git a/chrome/browser/extensions/extension_service.cc b/chrome/browser/extensions/extension_service.cc index d3f1dfb..7d12152 100644 --- a/chrome/browser/extensions/extension_service.cc +++ b/chrome/browser/extensions/extension_service.cc
@@ -142,11 +142,9 @@ CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); // Check if the providers know about this extension. - extensions::ProviderCollection::const_iterator i; - for (i = external_extension_providers_.begin(); - i != external_extension_providers_.end(); ++i) { - DCHECK(i->get()->IsReady()); - if (i->get()->HasExtension(id)) + for (const auto& provider : external_extension_providers_) { + DCHECK(provider->IsReady()); + if (provider->HasExtension(id)) return; // Yup, known extension, don't uninstall. } @@ -164,8 +162,7 @@ } UninstallExtension(id, extensions::UNINSTALL_REASON_ORPHANED_EXTERNAL_EXTENSION, - base::Bind(&base::DoNothing), - NULL); + base::Bind(&base::DoNothing), nullptr); } void ExtensionService::SetFileTaskRunnerForTesting( @@ -312,14 +309,7 @@ pending_extension_manager_(profile), install_directory_(install_directory), extensions_enabled_(extensions_enabled), - show_extensions_prompts_(true), - install_updates_when_idle_(true), ready_(ready), - update_once_all_providers_are_ready_(false), - browser_terminating_(false), - installs_delayed_for_gc_(false), - is_first_run_(false), - block_extensions_(false), shared_module_service_(new extensions::SharedModuleService(profile_)), app_data_migrator_(new extensions::AppDataMigrator(profile_, registry_)) { CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); @@ -401,13 +391,8 @@ ExtensionService::~ExtensionService() { // No need to unload extensions here because they are profile-scoped, and the // profile is in the process of being deleted. - - extensions::ProviderCollection::const_iterator i; - for (i = external_extension_providers_.begin(); - i != external_extension_providers_.end(); ++i) { - ExternalProviderInterface* provider = i->get(); + for (const auto& provider : external_extension_providers_) provider->ServiceShutdown(); - } } void ExtensionService::Shutdown() { @@ -458,14 +443,10 @@ "ExtensionService::EnabledReloadableExtensions"); std::vector<std::string> extensions_to_enable; - const ExtensionSet& disabled_extensions = registry_->disabled_extensions(); - for (ExtensionSet::const_iterator iter = disabled_extensions.begin(); - iter != disabled_extensions.end(); ++iter) { - const Extension* e = iter->get(); + for (const auto& e : registry_->disabled_extensions()) { if (extension_prefs_->GetDisableReasons(e->id()) == - Extension::DISABLE_RELOAD) { + Extension::DISABLE_RELOAD) extensions_to_enable.push_back(e->id()); - } } for (const std::string& extension : extensions_to_enable) { EnableExtension(extension); @@ -480,7 +461,7 @@ extension_prefs_->GetAllDelayedInstallInfo()); for (size_t i = 0; i < delayed_info->size(); ++i) { ExtensionInfo* info = delayed_info->at(i).get(); - scoped_refptr<const Extension> extension(NULL); + scoped_refptr<const Extension> extension(nullptr); if (info->extension_manifest) { std::string error; extension = Extension::Create( @@ -505,14 +486,13 @@ scoped_ptr<ExtensionSet> all_extensions = registry_->GenerateInstalledExtensionsSet(); - for (ExtensionSet::const_iterator it = all_extensions->begin(); - it != all_extensions->end(); ++it) { - extensions::BlacklistState state = - extension_prefs_->GetExtensionBlacklistState((*it)->id()); + for (const auto& extension : *all_extensions) { + const extensions::BlacklistState state = + extension_prefs_->GetExtensionBlacklistState(extension->id()); if (state == extensions::BLACKLISTED_SECURITY_VULNERABILITY || state == extensions::BLACKLISTED_POTENTIALLY_UNWANTED || state == extensions::BLACKLISTED_CWS_POLICY_VIOLATION) - greylist_.Insert(*it); + greylist_.Insert(extension); } } @@ -678,7 +658,7 @@ path = unloaded_extension_paths_[extension_id]; } - transient_current_extension = NULL; + transient_current_extension = nullptr; if (delayed_installs_.Contains(extension_id)) { FinishDelayedInstallation(extension_id); @@ -854,7 +834,7 @@ registry_->disabled_extensions().GetByID(extension_id); ManagementPolicy* policy = system_->management_policy(); - if (extension && policy->MustRemainDisabled(extension, NULL, NULL)) { + if (extension && policy->MustRemainDisabled(extension, nullptr, nullptr)) { UMA_HISTOGRAM_COUNTS_100("Extensions.EnableDeniedByPolicy", 1); return; } @@ -889,15 +869,15 @@ } const Extension* extension = GetInstalledExtension(extension_id); - // |extension| can be NULL if sync disables an extension that is not + // |extension| can be nullptr if sync disables an extension that is not // installed yet. // EXTERNAL_COMPONENT extensions are not generally modifiable by users, but // can be uninstalled by the browser if the user sets extension-specific // preferences. - if (extension && - !(disable_reasons & Extension::DISABLE_RELOAD) && + if (extension && !(disable_reasons & Extension::DISABLE_RELOAD) && !(disable_reasons & Extension::DISABLE_UPDATE_REQUIRED_BY_POLICY) && - !system_->management_policy()->UserMayModifySettings(extension, NULL) && + !system_->management_policy()->UserMayModifySettings(extension, + nullptr) && extension->location() != Manifest::EXTERNAL_COMPONENT) { return; } @@ -931,26 +911,22 @@ system_->management_policy(); extensions::ExtensionList to_disable; - const ExtensionSet& enabled_set = registry_->enabled_extensions(); - for (ExtensionSet::const_iterator extension = enabled_set.begin(); - extension != enabled_set.end(); ++extension) { - if (management_policy->UserMayModifySettings(extension->get(), NULL)) - to_disable.push_back(*extension); - } - const ExtensionSet& terminated_set = registry_->terminated_extensions(); - for (ExtensionSet::const_iterator extension = terminated_set.begin(); - extension != terminated_set.end(); ++extension) { - if (management_policy->UserMayModifySettings(extension->get(), NULL)) - to_disable.push_back(*extension); + for (const auto& extension : registry_->enabled_extensions()) { + if (management_policy->UserMayModifySettings(extension.get(), nullptr)) + to_disable.push_back(extension); } - for (extensions::ExtensionList::const_iterator extension = to_disable.begin(); - extension != to_disable.end(); ++extension) { - if ((*extension)->was_installed_by_default() && + for (const auto& extension : registry_->terminated_extensions()) { + if (management_policy->UserMayModifySettings(extension.get(), nullptr)) + to_disable.push_back(extension); + } + + for (const auto& extension : to_disable) { + if (extension->was_installed_by_default() && extension_urls::IsWebstoreUpdateUrl( - extensions::ManifestURL::GetUpdateURL(extension->get()))) + extensions::ManifestURL::GetUpdateURL(extension.get()))) continue; - const std::string& id = (*extension)->id(); + const std::string& id = extension->id(); if (except_ids.end() == std::find(except_ids.begin(), except_ids.end(), id)) DisableExtension(id, extensions::Extension::DISABLE_USER_ACTION); } @@ -970,7 +946,7 @@ ExtensionRegistry::DISABLED | ExtensionRegistry::TERMINATED); - for (const scoped_refptr<const Extension>& extension : *extensions) { + for (const auto& extension : *extensions) { const std::string& id = extension->id(); if (!CanBlockExtension(extension.get())) @@ -992,7 +968,7 @@ scoped_ptr<ExtensionSet> to_unblock = registry_->GenerateInstalledExtensionsSet(ExtensionRegistry::BLOCKED); - for (const scoped_refptr<const Extension>& extension : *to_unblock) { + for (const auto& extension : *to_unblock) { registry_->RemoveBlocked(extension->id()); AddExtension(extension.get()); } @@ -1210,8 +1186,7 @@ // Loop through the extensions list, finding extensions we need to unload or // disable. - for (scoped_refptr<const Extension> extension : - registry_->enabled_extensions()) { + for (const auto& extension : registry_->enabled_extensions()) { if (!system_->management_policy()->UserMayLoad(extension.get(), nullptr)) to_unload.push_back(extension->id()); Extension::DisableReason disable_reason = Extension::DISABLE_NONE; @@ -1227,8 +1202,7 @@ // automatically. These extensions are exclusive from the |to_disable| and // |to_unload| lists constructed above, since disabled_extensions() and // enabled_extensions() are supposed to be mutually exclusive. - for (scoped_refptr<const Extension> extension : - registry_->disabled_extensions()) { + for (const auto& extension : registry_->disabled_extensions()) { // Find all disabled extensions disabled due to minimum version requirement, // but now satisfying it. if (management->CheckMinimumVersion(extension.get(), nullptr) && @@ -1249,9 +1223,8 @@ for (const std::string& id : to_unload) UnloadExtension(id, UnloadedExtensionInfo::REASON_DISABLE); - for (std::map<std::string, Extension::DisableReason>::const_iterator i = - to_disable.begin(); i != to_disable.end(); ++i) - DisableExtension(i->first, i->second); + for (const auto& i : to_disable) + DisableExtension(i.first, i.second); // No extension is getting re-enabled here after disabling/unloading // because to_enable is mutually exclusive to to_disable + to_unload. @@ -1263,8 +1236,7 @@ // policy (including the ones that got disabled just now), and check // for update. extensions::ExtensionUpdater::CheckParams to_recheck; - for (scoped_refptr<const Extension> extension : - registry_->disabled_extensions()) { + for (const auto& extension : registry_->disabled_extensions()) { if (extension_prefs_->GetDisableReasons(extension->id()) == Extension::DISABLE_UPDATE_REQUIRED_BY_POLICY) { // The minimum version check is the only thing holding this extension @@ -1306,12 +1278,8 @@ // Ask each external extension provider to give us a call back for each // extension they know about. See OnExternalExtension(File|UpdateUrl)Found. - extensions::ProviderCollection::const_iterator i; - for (i = external_extension_providers_.begin(); - i != external_extension_providers_.end(); ++i) { - ExternalProviderInterface* provider = i->get(); + for (const auto& provider : external_extension_providers_) provider->VisitRegisteredExtension(); - } // Do any required work that we would have done after completion of all // providers. @@ -1331,10 +1299,8 @@ } bool ExtensionService::AreAllExternalProvidersReady() const { - extensions::ProviderCollection::const_iterator i; - for (i = external_extension_providers_.begin(); - i != external_extension_providers_.end(); ++i) { - if (!i->get()->IsReady()) + for (const auto& provider : external_extension_providers_) { + if (!provider->IsReady()) return false; } return true; @@ -1695,10 +1661,7 @@ void ExtensionService::UpdateActiveExtensionsInCrashReporter() { std::set<std::string> extension_ids; - const ExtensionSet& extensions = registry_->enabled_extensions(); - for (ExtensionSet::const_iterator iter = extensions.begin(); - iter != extensions.end(); ++iter) { - const Extension* extension = iter->get(); + for (const auto& extension : registry_->enabled_extensions()) { if (!extension->is_theme() && extension->location() != Manifest::COMPONENT) extension_ids.insert(extension->id()); } @@ -1867,7 +1830,7 @@ CHECK(settings); scoped_ptr<ExtensionSet> all_extensions( registry_->GenerateInstalledExtensionsSet()); - for (const auto& extension : *all_extensions.get()) { + for (const auto& extension : *all_extensions) { if (!settings->IsPermissionSetAllowed( extension.get(), extension->permissions_data()->active_permissions())) { @@ -2281,7 +2244,7 @@ DCHECK(extension); return extension->location() != Manifest::COMPONENT && extension->location() != Manifest::EXTERNAL_COMPONENT && - !system_->management_policy()->MustRemainEnabled(extension, NULL); + !system_->management_policy()->MustRemainEnabled(extension, nullptr); } bool ExtensionService::ShouldDelayExtensionUpdate( @@ -2323,15 +2286,11 @@ void ExtensionService::MaybeFinishDelayedInstallations() { std::vector<std::string> to_be_installed; - for (ExtensionSet::const_iterator it = delayed_installs_.begin(); - it != delayed_installs_.end(); - ++it) { - to_be_installed.push_back((*it)->id()); + for (const auto& extension : delayed_installs_) { + to_be_installed.push_back(extension->id()); } - for (std::vector<std::string>::const_iterator it = to_be_installed.begin(); - it != to_be_installed.end(); - ++it) { - MaybeFinishDelayedInstallation(*it); + for (const auto& extension_id : to_be_installed) { + MaybeFinishDelayedInstallation(extension_id); } } @@ -2348,26 +2307,23 @@ std::set<std::string> blacklisted; ExtensionIdSet greylist; ExtensionIdSet unchanged; - for (extensions::Blacklist::BlacklistStateMap::const_iterator it = - state_map.begin(); - it != state_map.end(); - ++it) { - switch (it->second) { + for (const auto& it : state_map) { + switch (it.second) { case extensions::NOT_BLACKLISTED: break; case extensions::BLACKLISTED_MALWARE: - blacklisted.insert(it->first); + blacklisted.insert(it.first); break; case extensions::BLACKLISTED_SECURITY_VULNERABILITY: case extensions::BLACKLISTED_CWS_POLICY_VIOLATION: case extensions::BLACKLISTED_POTENTIALLY_UNWANTED: - greylist.insert(it->first); + greylist.insert(it.first); break; case extensions::BLACKLISTED_UNKNOWN: - unchanged.insert(it->first); + unchanged.insert(it.first); break; } }
diff --git a/chrome/browser/extensions/extension_service.h b/chrome/browser/extensions/extension_service.h index 59da336..9edd4ec1 100644 --- a/chrome/browser/extensions/extension_service.h +++ b/chrome/browser/extensions/extension_service.h
@@ -464,12 +464,7 @@ external_updates_finished_callback_ = callback; } - private: - // Creates an ExtensionDownloader for use by the updater. - scoped_ptr<extensions::ExtensionDownloader> CreateExtensionDownloader( - extensions::ExtensionDownloaderDelegate* delegate); - // Reloads the specified extension, sending the onLaunched() event to it if it // currently has any window showing. |be_noisy| determines whether noisy // failures are allowed for unpacked extension installs. @@ -600,19 +595,19 @@ const base::FilePath& extension_path); // The normal profile associated with this ExtensionService. - Profile* profile_; + Profile* profile_ = nullptr; // The ExtensionSystem for the profile above. - extensions::ExtensionSystem* system_; + extensions::ExtensionSystem* system_ = nullptr; // Preferences for the owning profile. - extensions::ExtensionPrefs* extension_prefs_; + extensions::ExtensionPrefs* extension_prefs_ = nullptr; // Blacklist for the owning profile. - extensions::Blacklist* blacklist_; + extensions::Blacklist* blacklist_ = nullptr; // Sets of enabled/disabled/terminated/blacklisted extensions. Not owned. - extensions::ExtensionRegistry* registry_; + extensions::ExtensionRegistry* registry_ = nullptr; // Set of greylisted extensions. These extensions are disabled if they are // already installed in Chromium at the time when they are added to @@ -634,14 +629,14 @@ base::FilePath install_directory_; // Whether or not extensions are enabled. - bool extensions_enabled_; + bool extensions_enabled_ = true; // Whether to notify users when they attempt to install an extension. - bool show_extensions_prompts_; + bool show_extensions_prompts_ = true; // Whether to delay installing of extension updates until the extension is // idle. - bool install_updates_when_idle_; + bool install_updates_when_idle_ = true; // Signaled when all extensions are loaded. extensions::OneShotEvent* const ready_; @@ -652,13 +647,13 @@ // Map unloaded extensions' ids to their paths. When a temporarily loaded // extension is unloaded, we lose the information about it and don't have // any in the extension preferences file. - typedef std::map<std::string, base::FilePath> UnloadedExtensionPathMap; + using UnloadedExtensionPathMap = std::map<std::string, base::FilePath>; UnloadedExtensionPathMap unloaded_extension_paths_; // Map of DevToolsAgentHost instances that are detached, // waiting for an extension to be reloaded. - typedef std::map<std::string, scoped_refptr<content::DevToolsAgentHost> > - OrphanedDevTools; + using OrphanedDevTools = + std::map<std::string, scoped_refptr<content::DevToolsAgentHost>>; OrphanedDevTools orphaned_dev_tools_; content::NotificationRegistrar registrar_; @@ -676,7 +671,7 @@ // has to wait for the external providers. Used in // OnAllExternalProvidersReady() to determine if an update check is needed to // install pending extensions. - bool update_once_all_providers_are_ready_; + bool update_once_all_providers_are_ready_ = false; // A callback to be called when all external providers are ready and their // extensions have been installed. Normally this is a null callback, but @@ -686,21 +681,21 @@ // Set when the browser is terminating. Prevents us from installing or // updating additional extensions and allows in-progress installations to // decide to abort. - bool browser_terminating_; + bool browser_terminating_ = false; // Set to true to delay all new extension installations. Acts as a lock to // allow background processing of garbage collection of on-disk state without // needing to worry about race conditions caused by extension installation and // reinstallation. - bool installs_delayed_for_gc_; + bool installs_delayed_for_gc_ = false; // Set to true if this is the first time this ExtensionService has run. // Used for specially handling external extensions that are installed the // first time. - bool is_first_run_; + bool is_first_run_ = false; // Set to true if extensions are all to be blocked. - bool block_extensions_; + bool block_extensions_ = false; // Store the ids of reloading extensions. We use this to re-enable extensions // which were disabled for a reload.
diff --git a/chrome/browser/media/OWNERS b/chrome/browser/media/OWNERS index 3f2652f..c122598 100644 --- a/chrome/browser/media/OWNERS +++ b/chrome/browser/media/OWNERS
@@ -1,7 +1,13 @@ +chcunningham@chromium.org dalecurtis@chromium.org ddorwin@chromium.org +hubbe@chromium.org +jrummell@chromium.org +sandersd@chromium.org sergeyu@chromium.org tommi@chromium.org +watk@chromium.org +wolenetz@chromium.org xhwang@chromium.org # For Cast streaming changes.
diff --git a/chrome/browser/media/router/presentation_service_delegate_impl.cc b/chrome/browser/media/router/presentation_service_delegate_impl.cc index 5a5ffd65..4383135 100644 --- a/chrome/browser/media/router/presentation_service_delegate_impl.cc +++ b/chrome/browser/media/router/presentation_service_delegate_impl.cc
@@ -107,7 +107,9 @@ content::PresentationScreenAvailabilityListener* listener) const; base::SmallMap<std::map<std::string, MediaRoute::Id>> presentation_id_to_route_id_; - scoped_ptr<PresentationMediaSinksObserver> sinks_observer_; + // TODO(btolsch): Use SmallMap here if move operation patch is accepted. + std::map<std::string, scoped_ptr<PresentationMediaSinksObserver>> + url_to_sinks_observer_; base::ScopedPtrHashMap<MediaRoute::Id, scoped_ptr<PresentationConnectionStateSubscription>> connection_state_subscriptions_; @@ -158,15 +160,16 @@ bool PresentationFrame::SetScreenAvailabilityListener( content::PresentationScreenAvailabilityListener* listener) { - if (sinks_observer_ && sinks_observer_->listener() == listener) + MediaSource source(GetMediaSourceFromListener(listener)); + auto& sinks_observer = url_to_sinks_observer_[source.id()]; + if (sinks_observer && sinks_observer->listener() == listener) return false; - MediaSource source(GetMediaSourceFromListener(listener)); - sinks_observer_.reset( + sinks_observer.reset( new PresentationMediaSinksObserver(router_, listener, source)); - if (!sinks_observer_->Init()) { - sinks_observer_.reset(); + if (!sinks_observer->Init()) { + url_to_sinks_observer_.erase(source.id()); listener->OnScreenAvailabilityNotSupported(); return false; } @@ -176,8 +179,11 @@ bool PresentationFrame::RemoveScreenAvailabilityListener( content::PresentationScreenAvailabilityListener* listener) { - if (sinks_observer_ && sinks_observer_->listener() == listener) { - sinks_observer_.reset(); + MediaSource source(GetMediaSourceFromListener(listener)); + auto sinks_observer_it = url_to_sinks_observer_.find(source.id()); + if (sinks_observer_it != url_to_sinks_observer_.end() && + sinks_observer_it->second->listener() == listener) { + url_to_sinks_observer_.erase(sinks_observer_it); return true; } return false; @@ -185,7 +191,7 @@ bool PresentationFrame::HasScreenAvailabilityListenerForTest( const MediaSource::Id& source_id) const { - return sinks_observer_ && sinks_observer_->source().id() == source_id; + return url_to_sinks_observer_.find(source_id) != url_to_sinks_observer_.end(); } void PresentationFrame::Reset() { @@ -193,7 +199,7 @@ router_->DetachRoute(pid_route_id.second); presentation_id_to_route_id_.clear(); - sinks_observer_.reset(); + url_to_sinks_observer_.clear(); connection_state_subscriptions_.clear(); session_messages_observers_.clear(); }
diff --git a/chrome/browser/media/router/presentation_service_delegate_impl_unittest.cc b/chrome/browser/media/router/presentation_service_delegate_impl_unittest.cc index defefaa..3790195 100644 --- a/chrome/browser/media/router/presentation_service_delegate_impl_unittest.cc +++ b/chrome/browser/media/router/presentation_service_delegate_impl_unittest.cc
@@ -192,6 +192,41 @@ render_process_id, render_frame_id2, source2.id())); } +TEST_F(PresentationServiceDelegateImplTest, AddMultipleListenersToFrame) { + ON_CALL(router_, RegisterMediaSinksObserver(_)).WillByDefault(Return(true)); + + std::string presentation_url1("http://url1.com"); + std::string presentation_url2("http://url2.com"); + MediaSource source1 = MediaSourceForPresentationUrl(presentation_url1); + MediaSource source2 = MediaSourceForPresentationUrl(presentation_url2); + MockScreenAvailabilityListener listener1(presentation_url1); + MockScreenAvailabilityListener listener2(presentation_url2); + int render_process_id = 10; + int render_frame_id = 1; + + EXPECT_CALL(router_, RegisterMediaSinksObserver(_)).Times(2); + EXPECT_TRUE(delegate_impl_->AddScreenAvailabilityListener( + render_process_id, render_frame_id, &listener1)); + EXPECT_TRUE(delegate_impl_->AddScreenAvailabilityListener( + render_process_id, render_frame_id, &listener2)); + EXPECT_TRUE(delegate_impl_->HasScreenAvailabilityListenerForTest( + render_process_id, render_frame_id, source1.id())) + << "Mapping not found for " << source1.ToString(); + EXPECT_TRUE(delegate_impl_->HasScreenAvailabilityListenerForTest( + render_process_id, render_frame_id, source2.id())) + << "Mapping not found for " << source2.ToString(); + + EXPECT_CALL(router_, UnregisterMediaSinksObserver(_)).Times(2); + delegate_impl_->RemoveScreenAvailabilityListener( + render_process_id, render_frame_id, &listener1); + delegate_impl_->RemoveScreenAvailabilityListener( + render_process_id, render_frame_id, &listener2); + EXPECT_FALSE(delegate_impl_->HasScreenAvailabilityListenerForTest( + render_process_id, render_frame_id, source1.id())); + EXPECT_FALSE(delegate_impl_->HasScreenAvailabilityListenerForTest( + render_process_id, render_frame_id, source2.id())); +} + TEST_F(PresentationServiceDelegateImplTest, AddSameListenerTwice) { std::string presentation_url1("http://url1.fakeUrl"); MediaSource source1(MediaSourceForPresentationUrl(presentation_url1));
diff --git a/chrome/browser/media_router_resources.grdp b/chrome/browser/media_router_resources.grdp index 06b683b..8fa73c9 100644 --- a/chrome/browser/media_router_resources.grdp +++ b/chrome/browser/media_router_resources.grdp
@@ -9,6 +9,12 @@ <include name="IDR_MEDIA_ROUTER_UI_INTERFACE_JS" file="resources\media_router\media_router_ui_interface.js" type="BINDATA" /> <!-- Polymer --> + <if expr="_google_chrome"> + <include name="IDR_MEDIA_ROUTER_ICONS_HTML" file="resources\media_router_internal\icons\media_router_icons.html" type="BINDATA" /> + </if> + <if expr="not _google_chrome"> + <include name="IDR_MEDIA_ROUTER_ICONS_HTML" file="resources\media_router\icons\media_router_icons.html" type="BINDATA" /> + </if> <include name="IDR_ISSUE_BANNER_HTML" file="resources\media_router\elements\issue_banner\issue_banner.html" type="BINDATA" /> <include name="IDR_ISSUE_BANNER_JS" file="resources\media_router\elements\issue_banner\issue_banner.js" type="BINDATA" /> <include name="IDR_ISSUE_BANNER_CSS" file="resources\media_router\elements\issue_banner\issue_banner.css" type="BINDATA" />
diff --git a/chrome/browser/metrics/chromeos_metrics_provider.cc b/chrome/browser/metrics/chromeos_metrics_provider.cc index 7677d2d..baa8917 100644 --- a/chrome/browser/metrics/chromeos_metrics_provider.cc +++ b/chrome/browser/metrics/chromeos_metrics_provider.cc
@@ -6,13 +6,16 @@ #include <stddef.h> +#include "base/feature_list.h" #include "base/strings/string_number_conversions.h" #include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h" +#include "chrome/common/chrome_features.h" #include "chrome/common/pref_names.h" #include "chromeos/system/statistics_provider.h" +#include "components/metrics/leak_detector/leak_detector.h" #include "components/metrics/metrics_service.h" #include "components/metrics/proto/chrome_user_metrics_extension.pb.h" #include "components/prefs/pref_registry_simple.h" @@ -141,6 +144,10 @@ void ChromeOSMetricsProvider::Init() { perf_provider_.Init(); + + if (base::FeatureList::IsEnabled(features::kRuntimeMemoryLeakDetector)) { + leak_detector_controller_.reset(new metrics::LeakDetectorController); + } } void ChromeOSMetricsProvider::OnDidCreateMetricsLog() {
diff --git a/chrome/browser/metrics/chromeos_metrics_provider.h b/chrome/browser/metrics/chromeos_metrics_provider.h index 5c8247a..55d96c2 100644 --- a/chrome/browser/metrics/chromeos_metrics_provider.h +++ b/chrome/browser/metrics/chromeos_metrics_provider.h
@@ -9,6 +9,7 @@ #include "base/macros.h" #include "base/memory/weak_ptr.h" +#include "chrome/browser/metrics/leak_detector_controller.h" #include "chrome/browser/metrics/perf/perf_provider_chromeos.h" #include "components/metrics/metrics_provider.h" @@ -86,8 +87,12 @@ // Record the device enrollment status. void RecordEnrollmentStatus(); + // For collecting systemwide perf data. metrics::PerfProvider perf_provider_; + // Enables runtime memory leak detection and gets notified of leak reports. + scoped_ptr<metrics::LeakDetectorController> leak_detector_controller_; + // Bluetooth Adapter instance for collecting information about paired devices. scoped_refptr<device::BluetoothAdapter> adapter_;
diff --git a/chrome/browser/metrics/leak_detector_controller.cc b/chrome/browser/metrics/leak_detector_controller.cc new file mode 100644 index 0000000..5403f2c --- /dev/null +++ b/chrome/browser/metrics/leak_detector_controller.cc
@@ -0,0 +1,65 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/metrics/leak_detector_controller.h" + +#include <algorithm> + +#include "base/logging.h" + +namespace metrics { + +namespace { + +// Default parameters for LeakDetector. +const float kSamplingRate = 1.0f / 256; +const int kMaxStackDepth = 4; +const uint64_t kAnalysisIntervalBytes = 32 * 1024 * 1024; +const int kSizeSuspicionThreshold = 4; +const int kCallStackSuspicionThreshold = 4; + +} // namespace + +LeakDetectorController::LeakDetectorController() + : detector_(kSamplingRate, + kMaxStackDepth, + kAnalysisIntervalBytes, + kSizeSuspicionThreshold, + kCallStackSuspicionThreshold) { + detector_.AddObserver(this); +} + +LeakDetectorController::~LeakDetectorController() { + DCHECK(thread_checker_.CalledOnValidThread()); + detector_.RemoveObserver(this); +} + +void LeakDetectorController::OnLeakFound( + const LeakDetector::LeakReport& report) { + DCHECK(thread_checker_.CalledOnValidThread()); + + stored_reports_.push_back(MemoryLeakReportProto()); + MemoryLeakReportProto* proto = &stored_reports_.back(); + + // Copy the contents of the report to the protobuf. + proto->set_size_bytes(report.alloc_size_bytes); + proto->mutable_call_stack()->Reserve(report.call_stack.size()); + for (uintptr_t call_stack_entry : report.call_stack) + proto->mutable_call_stack()->Add(call_stack_entry); + + // Store the LeakDetector parameters in the protobuf. + proto->set_sampling_rate(kSamplingRate); + proto->set_max_stack_depth(kMaxStackDepth); + proto->set_analysis_interval_bytes(kAnalysisIntervalBytes); + proto->set_size_suspicion_threshold(kSizeSuspicionThreshold); + proto->set_call_stack_suspicion_threshold(kCallStackSuspicionThreshold); +} + +void LeakDetectorController::GetLeakReports( + std::vector<MemoryLeakReportProto>* reports) { + DCHECK(thread_checker_.CalledOnValidThread()); + *reports = std::move(stored_reports_); +} + +} // namespace metrics
diff --git a/chrome/browser/metrics/leak_detector_controller.h b/chrome/browser/metrics/leak_detector_controller.h new file mode 100644 index 0000000..308c6f0 --- /dev/null +++ b/chrome/browser/metrics/leak_detector_controller.h
@@ -0,0 +1,48 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_METRICS_LEAK_DETECTOR_CONTROLLER_H_ +#define CHROME_BROWSER_METRICS_LEAK_DETECTOR_CONTROLLER_H_ + +#include <vector> + +#include "base/macros.h" +#include "base/threading/thread_checker.h" +#include "components/metrics/leak_detector/leak_detector.h" +#include "components/metrics/proto/memory_leak_report.pb.h" + +namespace metrics { + +// This class initializes the LeakDetector on the browser process and registers +// itself to be notified of leak reports. +class LeakDetectorController : public LeakDetector::Observer { + public: + LeakDetectorController(); + ~LeakDetectorController() override; + + // Retrieves all reports in |stored_reports_|, moving them to |*reports|. + // |stored_reports_| is empty afterwards. + void GetLeakReports(std::vector<MemoryLeakReportProto>* reports); + + protected: + // LeakDetector::Observer: + void OnLeakFound(const LeakDetector::LeakReport& report) override; + + private: + // Leak detector interface object. + LeakDetector detector_; + + // All leak reports received through OnLeakFound() are stored in protobuf + // format. + std::vector<MemoryLeakReportProto> stored_reports_; + + // For thread safety. + base::ThreadChecker thread_checker_; + + DISALLOW_COPY_AND_ASSIGN(LeakDetectorController); +}; + +} // namespace metrics + +#endif // CHROME_BROWSER_METRICS_LEAK_DETECTOR_CONTROLLER_H_
diff --git a/chrome/browser/metrics/leak_detector_controller_unittest.cc b/chrome/browser/metrics/leak_detector_controller_unittest.cc new file mode 100644 index 0000000..c0361140 --- /dev/null +++ b/chrome/browser/metrics/leak_detector_controller_unittest.cc
@@ -0,0 +1,169 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/metrics/leak_detector_controller.h" + +#include <set> + +#include "base/macros.h" +#include "base/memory/scoped_ptr.h" +#include "components/metrics/proto/memory_leak_report.pb.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace metrics { + +// Test class for LeakDetectorController that exposes protected methods. +class TestLeakDetectorController : public LeakDetectorController { + public: + using LeakDetectorController::OnLeakFound; + + TestLeakDetectorController() {} + + private: + DISALLOW_COPY_AND_ASSIGN(TestLeakDetectorController); +}; + +using LeakReport = LeakDetector::LeakReport; + +TEST(LeakDetectorControllerTest, SingleReport) { + LeakReport report; + report.alloc_size_bytes = 8; + report.call_stack = {1, 2, 3, 4}; + + TestLeakDetectorController controller; + controller.OnLeakFound(report); + + std::vector<MemoryLeakReportProto> stored_reports; + controller.GetLeakReports(&stored_reports); + ASSERT_EQ(1U, stored_reports.size()); + + EXPECT_EQ(8U, stored_reports[0].size_bytes()); + ASSERT_EQ(4, stored_reports[0].call_stack().size()); + EXPECT_EQ(1U, stored_reports[0].call_stack().Get(0)); + EXPECT_EQ(2U, stored_reports[0].call_stack().Get(1)); + EXPECT_EQ(3U, stored_reports[0].call_stack().Get(2)); + EXPECT_EQ(4U, stored_reports[0].call_stack().Get(3)); + + // No more reports. + controller.GetLeakReports(&stored_reports); + ASSERT_EQ(0U, stored_reports.size()); +} + +TEST(LeakDetectorControllerTest, MultipleReportsSeparately) { + TestLeakDetectorController controller; + std::vector<MemoryLeakReportProto> stored_reports; + + // Pass in first report. + LeakReport report; + report.alloc_size_bytes = 8; + report.call_stack = {1, 2, 3, 4}; + + controller.OnLeakFound(report); + controller.GetLeakReports(&stored_reports); + ASSERT_EQ(1U, stored_reports.size()); + + EXPECT_EQ(8U, stored_reports[0].size_bytes()); + ASSERT_EQ(4, stored_reports[0].call_stack().size()); + EXPECT_EQ(1U, stored_reports[0].call_stack().Get(0)); + EXPECT_EQ(2U, stored_reports[0].call_stack().Get(1)); + EXPECT_EQ(3U, stored_reports[0].call_stack().Get(2)); + EXPECT_EQ(4U, stored_reports[0].call_stack().Get(3)); + + controller.GetLeakReports(&stored_reports); + ASSERT_EQ(0U, stored_reports.size()); + + // Pass in second report. + report.alloc_size_bytes = 16; + report.call_stack = {5, 6, 7, 8, 9, 10}; + controller.OnLeakFound(report); + + controller.GetLeakReports(&stored_reports); + ASSERT_EQ(1U, stored_reports.size()); + + EXPECT_EQ(16U, stored_reports[0].size_bytes()); + ASSERT_EQ(6, stored_reports[0].call_stack().size()); + EXPECT_EQ(5U, stored_reports[0].call_stack().Get(0)); + EXPECT_EQ(6U, stored_reports[0].call_stack().Get(1)); + EXPECT_EQ(7U, stored_reports[0].call_stack().Get(2)); + EXPECT_EQ(8U, stored_reports[0].call_stack().Get(3)); + EXPECT_EQ(9U, stored_reports[0].call_stack().Get(4)); + EXPECT_EQ(10U, stored_reports[0].call_stack().Get(5)); + + controller.GetLeakReports(&stored_reports); + ASSERT_EQ(0U, stored_reports.size()); + + // Pass in third report. + report.alloc_size_bytes = 24; + report.call_stack = {9, 10, 11, 12, 13, 14, 15, 16}; + controller.OnLeakFound(report); + + controller.GetLeakReports(&stored_reports); + ASSERT_EQ(1U, stored_reports.size()); + + EXPECT_EQ(24U, stored_reports[0].size_bytes()); + ASSERT_EQ(8, stored_reports[0].call_stack().size()); + EXPECT_EQ(9U, stored_reports[0].call_stack().Get(0)); + EXPECT_EQ(10U, stored_reports[0].call_stack().Get(1)); + EXPECT_EQ(11U, stored_reports[0].call_stack().Get(2)); + EXPECT_EQ(12U, stored_reports[0].call_stack().Get(3)); + EXPECT_EQ(13U, stored_reports[0].call_stack().Get(4)); + EXPECT_EQ(14U, stored_reports[0].call_stack().Get(5)); + EXPECT_EQ(15U, stored_reports[0].call_stack().Get(6)); + EXPECT_EQ(16U, stored_reports[0].call_stack().Get(7)); + + controller.GetLeakReports(&stored_reports); + ASSERT_EQ(0U, stored_reports.size()); +} + +TEST(LeakDetectorControllerTest, MultipleReportsTogether) { + LeakReport report1, report2, report3; + report1.alloc_size_bytes = 8; + report1.call_stack = {1, 2, 3, 4}; + report2.alloc_size_bytes = 16; + report2.call_stack = {5, 6, 7, 8, 9, 10}; + report3.alloc_size_bytes = 24; + report3.call_stack = {9, 10, 11, 12, 13, 14, 15, 16}; + + TestLeakDetectorController controller; + controller.OnLeakFound(report1); + controller.OnLeakFound(report2); + controller.OnLeakFound(report3); + + std::vector<MemoryLeakReportProto> stored_reports; + + controller.GetLeakReports(&stored_reports); + ASSERT_EQ(3U, stored_reports.size()); + + EXPECT_EQ(8U, stored_reports[0].size_bytes()); + ASSERT_EQ(4, stored_reports[0].call_stack().size()); + EXPECT_EQ(1U, stored_reports[0].call_stack().Get(0)); + EXPECT_EQ(2U, stored_reports[0].call_stack().Get(1)); + EXPECT_EQ(3U, stored_reports[0].call_stack().Get(2)); + EXPECT_EQ(4U, stored_reports[0].call_stack().Get(3)); + + EXPECT_EQ(16U, stored_reports[1].size_bytes()); + ASSERT_EQ(6, stored_reports[1].call_stack().size()); + EXPECT_EQ(5U, stored_reports[1].call_stack().Get(0)); + EXPECT_EQ(6U, stored_reports[1].call_stack().Get(1)); + EXPECT_EQ(7U, stored_reports[1].call_stack().Get(2)); + EXPECT_EQ(8U, stored_reports[1].call_stack().Get(3)); + EXPECT_EQ(9U, stored_reports[1].call_stack().Get(4)); + EXPECT_EQ(10U, stored_reports[1].call_stack().Get(5)); + + EXPECT_EQ(24U, stored_reports[2].size_bytes()); + ASSERT_EQ(8, stored_reports[2].call_stack().size()); + EXPECT_EQ(9U, stored_reports[2].call_stack().Get(0)); + EXPECT_EQ(10U, stored_reports[2].call_stack().Get(1)); + EXPECT_EQ(11U, stored_reports[2].call_stack().Get(2)); + EXPECT_EQ(12U, stored_reports[2].call_stack().Get(3)); + EXPECT_EQ(13U, stored_reports[2].call_stack().Get(4)); + EXPECT_EQ(14U, stored_reports[2].call_stack().Get(5)); + EXPECT_EQ(15U, stored_reports[2].call_stack().Get(6)); + EXPECT_EQ(16U, stored_reports[2].call_stack().Get(7)); + + controller.GetLeakReports(&stored_reports); + ASSERT_EQ(0U, stored_reports.size()); +} + +} // namespace metrics
diff --git a/chrome/browser/page_load_metrics/observers/aborts_page_load_metrics_observer.cc b/chrome/browser/page_load_metrics/observers/aborts_page_load_metrics_observer.cc index bdea7b9..4c101f6 100644 --- a/chrome/browser/page_load_metrics/observers/aborts_page_load_metrics_observer.cc +++ b/chrome/browser/page_load_metrics/observers/aborts_page_load_metrics_observer.cc
@@ -132,7 +132,7 @@ DCHECK(!time_to_abort.is_zero()); // Don't log abort times if the page was backgrounded before the abort event. - if (!EventOccurredInForeground(time_to_abort, extra_info)) + if (!WasStartedInForegroundEventInForeground(time_to_abort, extra_info)) return; if (extra_info.time_to_commit.is_zero()) {
diff --git a/chrome/browser/page_load_metrics/observers/core_page_load_metrics_observer.cc b/chrome/browser/page_load_metrics/observers/core_page_load_metrics_observer.cc index b85bc48..4d8ed1c 100644 --- a/chrome/browser/page_load_metrics/observers/core_page_load_metrics_observer.cc +++ b/chrome/browser/page_load_metrics/observers/core_page_load_metrics_observer.cc
@@ -88,6 +88,9 @@ const char kHistogramFailedProvisionalLoad[] = "PageLoad.Timing2.NavigationToFailedProvisionalLoad"; +const char kHistogramForegroundToFirstPaint[] = + "PageLoad.Timing2.ForegroundToFirstPaint"; + const char kRapporMetricsNameCoarseTiming[] = "PageLoad.CoarseTiming.NavigationToFirstContentfulPaint"; @@ -125,8 +128,11 @@ void CorePageLoadMetricsObserver::RecordTimingHistograms( const page_load_metrics::PageLoadTiming& timing, const page_load_metrics::PageLoadExtraInfo& info) { - if (!info.first_background_time.is_zero() && - !EventOccurredInForeground(timing.first_paint, info)) { + // Record metrics for pages which starts in the foreground and is backgrounded + // prior to the first paint. + if (info.started_in_foreground && !info.first_background_time.is_zero() && + (timing.first_paint.is_zero() || + timing.first_paint > info.first_background_time)) { if (!info.time_to_commit.is_zero()) { PAGE_LOAD_HISTOGRAM(internal::kHistogramBackgroundBeforePaint, info.first_background_time); @@ -138,8 +144,8 @@ if (failed_provisional_load_info_.error != net::OK) { // Ignores a background failed provisional load. - if (EventOccurredInForeground(failed_provisional_load_info_.interval, - info)) { + if (WasStartedInForegroundEventInForeground( + failed_provisional_load_info_.interval, info)) { PAGE_LOAD_HISTOGRAM(internal::kHistogramFailedProvisionalLoad, failed_provisional_load_info_.interval); } @@ -150,15 +156,15 @@ if (info.time_to_commit.is_zero() || timing.IsEmpty()) return; - if (EventOccurredInForeground(info.time_to_commit, info)) { + if (WasStartedInForegroundEventInForeground(info.time_to_commit, info)) { PAGE_LOAD_HISTOGRAM(internal::kHistogramCommit, info.time_to_commit); } else { PAGE_LOAD_HISTOGRAM(internal::kBackgroundHistogramCommit, info.time_to_commit); } if (!timing.dom_content_loaded_event_start.is_zero()) { - if (EventOccurredInForeground(timing.dom_content_loaded_event_start, - info)) { + if (WasStartedInForegroundEventInForeground( + timing.dom_content_loaded_event_start, info)) { PAGE_LOAD_HISTOGRAM(internal::kHistogramDomContentLoaded, timing.dom_content_loaded_event_start); } else { @@ -167,7 +173,8 @@ } } if (!timing.load_event_start.is_zero()) { - if (EventOccurredInForeground(timing.load_event_start, info)) { + if (WasStartedInForegroundEventInForeground(timing.load_event_start, + info)) { PAGE_LOAD_HISTOGRAM(internal::kHistogramLoad, timing.load_event_start); } else { PAGE_LOAD_HISTOGRAM(internal::kBackgroundHistogramLoad, @@ -175,7 +182,7 @@ } } if (!timing.first_layout.is_zero()) { - if (EventOccurredInForeground(timing.first_layout, info)) { + if (WasStartedInForegroundEventInForeground(timing.first_layout, info)) { PAGE_LOAD_HISTOGRAM(internal::kHistogramFirstLayout, timing.first_layout); } else { PAGE_LOAD_HISTOGRAM(internal::kBackgroundHistogramFirstLayout, @@ -183,15 +190,29 @@ } } if (!timing.first_paint.is_zero()) { - if (EventOccurredInForeground(timing.first_paint, info)) { + if (WasStartedInForegroundEventInForeground(timing.first_paint, info)) { PAGE_LOAD_HISTOGRAM(internal::kHistogramFirstPaint, timing.first_paint); } else { PAGE_LOAD_HISTOGRAM(internal::kBackgroundHistogramFirstPaint, timing.first_paint); } + + // Record the time to first paint for pages which were: + // - Opened in the background. + // - Moved to the foreground prior to the first paint. + // - Not moved back to the background prior to the first paint. + if (!info.started_in_foreground && !info.first_foreground_time.is_zero() && + timing.first_paint > info.first_foreground_time && + (info.first_background_time.is_zero() || + timing.first_paint < info.first_background_time)) { + PAGE_LOAD_HISTOGRAM( + internal::kHistogramForegroundToFirstPaint, + timing.first_paint - info.first_foreground_time); + } } if (!timing.first_text_paint.is_zero()) { - if (EventOccurredInForeground(timing.first_text_paint, info)) { + if (WasStartedInForegroundEventInForeground(timing.first_text_paint, + info)) { PAGE_LOAD_HISTOGRAM(internal::kHistogramFirstTextPaint, timing.first_text_paint); } else { @@ -200,7 +221,8 @@ } } if (!timing.first_image_paint.is_zero()) { - if (EventOccurredInForeground(timing.first_image_paint, info)) { + if (WasStartedInForegroundEventInForeground(timing.first_image_paint, + info)) { PAGE_LOAD_HISTOGRAM(internal::kHistogramFirstImagePaint, timing.first_image_paint); } else { @@ -209,7 +231,8 @@ } } if (!timing.first_contentful_paint.is_zero()) { - if (EventOccurredInForeground(timing.first_contentful_paint, info)) { + if (WasStartedInForegroundEventInForeground(timing.first_contentful_paint, + info)) { PAGE_LOAD_HISTOGRAM(internal::kHistogramFirstContentfulPaint, timing.first_contentful_paint); // Bucket these histograms into high/low resolution clock systems. This @@ -229,12 +252,15 @@ // Log time to first foreground / time to first background. Log counts that we // started a relevant page load in the foreground / background. - if (!info.first_background_time.is_zero()) - PAGE_LOAD_HISTOGRAM(internal::kHistogramFirstBackground, - info.first_background_time); - else if (!info.first_foreground_time.is_zero()) - PAGE_LOAD_HISTOGRAM(internal::kHistogramFirstForeground, - info.first_foreground_time); + if (info.started_in_foreground) { + if (!info.first_background_time.is_zero()) + PAGE_LOAD_HISTOGRAM(internal::kHistogramFirstBackground, + info.first_background_time); + } else { + if (!info.first_foreground_time.is_zero()) + PAGE_LOAD_HISTOGRAM(internal::kHistogramFirstForeground, + info.first_foreground_time); + } } void CorePageLoadMetricsObserver::RecordRappor( @@ -253,7 +279,8 @@ return; DCHECK(!info.committed_url.is_empty()); // Log the eTLD+1 of sites that show poor loading performance. - if (!EventOccurredInForeground(timing.first_contentful_paint, info)) { + if (!WasStartedInForegroundEventInForeground(timing.first_contentful_paint, + info)) { return; } scoped_ptr<rappor::Sample> sample =
diff --git a/chrome/browser/page_load_metrics/observers/from_gws_page_load_metrics_observer.cc b/chrome/browser/page_load_metrics/observers/from_gws_page_load_metrics_observer.cc index d0a5e981..127479b 100644 --- a/chrome/browser/page_load_metrics/observers/from_gws_page_load_metrics_observer.cc +++ b/chrome/browser/page_load_metrics/observers/from_gws_page_load_metrics_observer.cc
@@ -63,44 +63,49 @@ void FromGWSPageLoadMetricsObserver::OnComplete( const page_load_metrics::PageLoadTiming& timing, const page_load_metrics::PageLoadExtraInfo& extra_info) { - using page_load_metrics::EventOccurredInForeground; + using page_load_metrics::WasStartedInForegroundEventInForeground; if (!navigation_from_gws_) return; - if (EventOccurredInForeground(timing.dom_content_loaded_event_start, - extra_info)) { + if (WasStartedInForegroundEventInForeground( + timing.dom_content_loaded_event_start, extra_info)) { PAGE_LOAD_HISTOGRAM( "PageLoad.Clients.FromGWS.Timing2." "NavigationToDOMContentLoadedEventFired", timing.dom_content_loaded_event_start); } - if (EventOccurredInForeground(timing.load_event_start, extra_info)) { + if (WasStartedInForegroundEventInForeground(timing.load_event_start, + extra_info)) { PAGE_LOAD_HISTOGRAM( "PageLoad.Clients.FromGWS.Timing2.NavigationToLoadEventFired", timing.load_event_start); } - if (EventOccurredInForeground(timing.first_layout, extra_info)) { + if (WasStartedInForegroundEventInForeground(timing.first_layout, + extra_info)) { PAGE_LOAD_HISTOGRAM( "PageLoad.Clients.FromGWS.Timing2.NavigationToFirstLayout", timing.first_layout); } - if (EventOccurredInForeground(timing.first_text_paint, extra_info)) { + if (WasStartedInForegroundEventInForeground(timing.first_text_paint, + extra_info)) { PAGE_LOAD_HISTOGRAM( "PageLoad.Clients.FromGWS.Timing2.NavigationToFirstTextPaint", timing.first_text_paint); } - if (EventOccurredInForeground(timing.first_image_paint, extra_info)) { + if (WasStartedInForegroundEventInForeground(timing.first_image_paint, + extra_info)) { PAGE_LOAD_HISTOGRAM( "PageLoad.Clients.FromGWS.Timing2.NavigationToFirstImagePaint", timing.first_image_paint); } - if (EventOccurredInForeground(timing.first_paint, extra_info)) { + if (WasStartedInForegroundEventInForeground(timing.first_paint, extra_info)) { PAGE_LOAD_HISTOGRAM( "PageLoad.Clients.FromGWS.Timing2.NavigationToFirstPaint", timing.first_paint); } - if (EventOccurredInForeground(timing.first_contentful_paint, extra_info)) { + if (WasStartedInForegroundEventInForeground(timing.first_contentful_paint, + extra_info)) { PAGE_LOAD_HISTOGRAM( "PageLoad.Clients.FromGWS.Timing2.NavigationToFirstContentfulPaint", timing.first_contentful_paint);
diff --git a/chrome/browser/page_load_metrics/observers/stale_while_revalidate_metrics_observer.cc b/chrome/browser/page_load_metrics/observers/stale_while_revalidate_metrics_observer.cc index f474d2f..b021704 100644 --- a/chrome/browser/page_load_metrics/observers/stale_while_revalidate_metrics_observer.cc +++ b/chrome/browser/page_load_metrics/observers/stale_while_revalidate_metrics_observer.cc
@@ -23,24 +23,27 @@ void StaleWhileRevalidateMetricsObserver::OnComplete( const page_load_metrics::PageLoadTiming& timing, const page_load_metrics::PageLoadExtraInfo& extra_info) { - using page_load_metrics::EventOccurredInForeground; + using page_load_metrics::WasStartedInForegroundEventInForeground; if (!is_interesting_domain_) return; - if (EventOccurredInForeground(timing.load_event_start, extra_info)) { + if (WasStartedInForegroundEventInForeground(timing.load_event_start, + extra_info)) { PAGE_LOAD_HISTOGRAM( "PageLoad.Clients.StaleWhileRevalidateExperiment.Timing2." "NavigationToLoadEventFired", timing.load_event_start); } - if (EventOccurredInForeground(timing.first_layout, extra_info)) { + if (WasStartedInForegroundEventInForeground(timing.first_layout, + extra_info)) { PAGE_LOAD_HISTOGRAM( "PageLoad.Clients.StaleWhileRevalidateExperiment.Timing2." "NavigationToFirstLayout", timing.first_layout); } - if (EventOccurredInForeground(timing.first_text_paint, extra_info)) { + if (WasStartedInForegroundEventInForeground(timing.first_text_paint, + extra_info)) { PAGE_LOAD_HISTOGRAM( "PageLoad.Clients.StaleWhileRevalidateExperiment.Timing2." "NavigationToFirstTextPaint",
diff --git a/chrome/browser/password_manager/chrome_password_manager_client.cc b/chrome/browser/password_manager/chrome_password_manager_client.cc index 70799e19..7a28592 100644 --- a/chrome/browser/password_manager/chrome_password_manager_client.cc +++ b/chrome/browser/password_manager/chrome_password_manager_client.cc
@@ -367,12 +367,15 @@ void ChromePasswordManagerClient::PasswordWasAutofilled( const autofill::PasswordFormMap& best_matches, - const GURL& origin) const { + const GURL& origin, + const std::vector<scoped_ptr<autofill::PasswordForm>>* federated_matches) + const { #if !BUILDFLAG(ANDROID_JAVA_UI) PasswordsClientUIDelegate* manage_passwords_ui_controller = PasswordsClientUIDelegateFromWebContents(web_contents()); if (manage_passwords_ui_controller && IsTheHotNewBubbleUIEnabled()) - manage_passwords_ui_controller->OnPasswordAutofilled(best_matches, origin); + manage_passwords_ui_controller->OnPasswordAutofilled(best_matches, origin, + federated_matches); #endif }
diff --git a/chrome/browser/password_manager/chrome_password_manager_client.h b/chrome/browser/password_manager/chrome_password_manager_client.h index 087e276..5a80ee8 100644 --- a/chrome/browser/password_manager/chrome_password_manager_client.h +++ b/chrome/browser/password_manager/chrome_password_manager_client.h
@@ -5,6 +5,8 @@ #ifndef CHROME_BROWSER_PASSWORD_MANAGER_CHROME_PASSWORD_MANAGER_CLIENT_H_ #define CHROME_BROWSER_PASSWORD_MANAGER_CHROME_PASSWORD_MANAGER_CLIENT_H_ +#include <vector> + #include "base/compiler_specific.h" #include "base/macros.h" #include "base/memory/scoped_ptr.h" @@ -68,8 +70,11 @@ const autofill::PasswordForm& form) override; void AutomaticPasswordSave(scoped_ptr<password_manager::PasswordFormManager> saved_form_manager) override; - void PasswordWasAutofilled(const autofill::PasswordFormMap& best_matches, - const GURL& origin) const override; + void PasswordWasAutofilled( + const autofill::PasswordFormMap& best_matches, + const GURL& origin, + const std::vector<scoped_ptr<autofill::PasswordForm>>* federated_matches) + const override; PrefService* GetPrefs() override; password_manager::PasswordStore* GetPasswordStore() const override; password_manager::PasswordSyncState GetPasswordSyncState() const override;
diff --git a/chrome/browser/policy/configuration_policy_handler_list_factory.cc b/chrome/browser/policy/configuration_policy_handler_list_factory.cc index c8bfa33..5ee927f 100644 --- a/chrome/browser/policy/configuration_policy_handler_list_factory.cc +++ b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
@@ -329,6 +329,9 @@ { key::kRestrictSigninToPattern, prefs::kGoogleServicesUsernamePattern, base::Value::TYPE_STRING }, + { key::kDefaultWebBluetoothGuardSetting, + prefs::kManagedDefaultWebBluetoothGuardSetting, + base::Value::TYPE_INTEGER }, { key::kDefaultMediaStreamSetting, prefs::kManagedDefaultMediaStreamSetting, base::Value::TYPE_INTEGER },
diff --git a/chrome/browser/policy/policy_browsertest.cc b/chrome/browser/policy/policy_browsertest.cc index df2ca80..9a88dc60 100644 --- a/chrome/browser/policy/policy_browsertest.cc +++ b/chrome/browser/policy/policy_browsertest.cc
@@ -141,6 +141,7 @@ #include "content/public/browser/web_contents.h" #include "content/public/common/content_constants.h" #include "content/public/common/content_paths.h" +#include "content/public/common/content_switches.h" #include "content/public/common/process_type.h" #include "content/public/common/result_codes.h" #include "content/public/common/url_constants.h" @@ -150,6 +151,8 @@ #include "content/public/test/mock_notification_observer.h" #include "content/public/test/test_navigation_observer.h" #include "content/public/test/test_utils.h" +#include "device/bluetooth/bluetooth_adapter_factory.h" +#include "device/bluetooth/test/mock_bluetooth_adapter.h" #include "extensions/browser/extension_dialog_auto_confirm.h" #include "extensions/browser/extension_host.h" #include "extensions/browser/extension_prefs.h" @@ -181,6 +184,7 @@ #include "ui/base/page_transition_types.h" #include "ui/base/resource/resource_bundle.h" #include "url/gurl.h" +#include "url/origin.h" #if defined(OS_CHROMEOS) #include "ash/accelerators/accelerator_controller.h" @@ -3653,6 +3657,53 @@ MediaStreamDevicesControllerBrowserTest, testing::Bool()); +class WebBluetoothPolicyTest : public PolicyTest { + void SetUpCommandLine(base::CommandLine* command_line)override { + // This is needed while Web Bluetooth is an Origin Trial, but can go away + // once it ships globally. + command_line->AppendSwitch(switches::kEnableWebBluetooth); + PolicyTest::SetUpCommandLine(command_line); + } +}; + +IN_PROC_BROWSER_TEST_F(WebBluetoothPolicyTest, Block) { + // Fake the BluetoothAdapter to say it's present. + scoped_refptr<device::MockBluetoothAdapter> adapter = + new testing::NiceMock<device::MockBluetoothAdapter>; + EXPECT_CALL(*adapter, IsPresent()).WillRepeatedly(testing::Return(true)); + device::BluetoothAdapterFactory::SetAdapterForTesting(adapter); + + // Navigate to a secure context. + embedded_test_server()->ServeFilesFromSourceDirectory("content/test/data"); + ASSERT_TRUE(embedded_test_server()->Start()); + ui_test_utils::NavigateToURL( + browser(), + embedded_test_server()->GetURL("localhost", "/simple_page.html")); + content::WebContents* const web_contents = + browser()->tab_strip_model()->GetActiveWebContents(); + EXPECT_THAT( + web_contents->GetMainFrame()->GetLastCommittedOrigin().Serialize(), + testing::StartsWith("http://localhost:")); + + // Set the policy to block Web Bluetooth. + PolicyMap policies; + policies.Set(key::kDefaultWebBluetoothGuardSetting, POLICY_LEVEL_MANDATORY, + POLICY_SCOPE_USER, POLICY_SOURCE_CLOUD, + new base::FundamentalValue(2), nullptr); + UpdateProviderPolicy(policies); + + std::string rejection; + EXPECT_TRUE(content::ExecuteScriptAndExtractString( + web_contents, + "navigator.bluetooth.requestDevice({filters: [{name: 'Hello'}]})" + " .then(() => { domAutomationController.send('Success'); }," + " reason => {" + " domAutomationController.send(reason.name + ': ' + reason.message);" + " });", + &rejection)); + EXPECT_THAT(rejection, testing::MatchesRegex("NotFoundError: .*policy.*")); +} + // Test that when extended reporting opt-in is disabled by policy, the // opt-in checkbox does not appear on SSL blocking pages. IN_PROC_BROWSER_TEST_F(PolicyTest, SafeBrowsingExtendedReportingOptInAllowed) {
diff --git a/chrome/browser/printing/print_preview_dialog_controller.cc b/chrome/browser/printing/print_preview_dialog_controller.cc index 936cd77..d245d3e 100644 --- a/chrome/browser/printing/print_preview_dialog_controller.cc +++ b/chrome/browser/printing/print_preview_dialog_controller.cc
@@ -487,15 +487,6 @@ PrintViewManager::FromWebContents(initiator)->PrintPreviewDone(); } - // Print preview WebContents is destroyed. Notify |PrintPreviewUI| to abort - // the initiator preview request. - if (content::WebUI* web_ui = preview_dialog->GetWebUI()) { - PrintPreviewUI* print_preview_ui = - static_cast<PrintPreviewUI*>(web_ui->GetController()); - if (print_preview_ui) - print_preview_ui->OnPrintPreviewDialogDestroyed(); - } - preview_dialog_map_.erase(preview_dialog); RemoveObservers(preview_dialog); }
diff --git a/chrome/browser/printing/print_view_manager.cc b/chrome/browser/printing/print_view_manager.cc index 8fdf54d..b50a5ba 100644 --- a/chrome/browser/printing/print_view_manager.cc +++ b/chrome/browser/printing/print_view_manager.cc
@@ -13,7 +13,6 @@ #include "chrome/browser/plugins/chrome_plugin_service_filter.h" #include "chrome/browser/printing/print_job_manager.h" #include "chrome/browser/printing/print_preview_dialog_controller.h" -#include "chrome/browser/printing/print_view_manager_observer.h" #include "chrome/browser/ui/webui/print_preview/print_preview_ui.h" #include "chrome/common/chrome_content_client.h" #include "components/printing/common/print_messages.h" @@ -59,7 +58,6 @@ PrintViewManager::PrintViewManager(content::WebContents* web_contents) : PrintViewManagerBase(web_contents), - observer_(NULL), print_preview_state_(NOT_PREVIEWING), scripted_print_preview_rph_(NULL) { if (PrintPreviewDialogController::IsPrintPreviewDialog(web_contents)) { @@ -74,7 +72,11 @@ } #if defined(ENABLE_BASIC_PRINTING) -bool PrintViewManager::PrintForSystemDialogNow() { +bool PrintViewManager::PrintForSystemDialogNow( + const base::Closure& dialog_shown_callback) { + DCHECK(!dialog_shown_callback.is_null()); + DCHECK(on_print_dialog_shown_callback_.is_null()); + on_print_dialog_shown_callback_ = dialog_shown_callback; return PrintNowInternal(new PrintMsg_PrintForSystemDialog(routing_id())); } @@ -137,11 +139,6 @@ print_preview_state_ = NOT_PREVIEWING; } -void PrintViewManager::set_observer(PrintViewManagerObserver* observer) { - DCHECK(!observer || !observer_); - observer_ = observer; -} - void PrintViewManager::RenderFrameCreated( content::RenderFrameHost* render_frame_host) { if (PrintPreviewDialogController::IsPrintPreviewDialog(web_contents())) { @@ -156,8 +153,9 @@ } void PrintViewManager::OnDidShowPrintDialog() { - if (observer_) - observer_->OnPrintDialogShown(); + if (!on_print_dialog_shown_callback_.is_null()) + on_print_dialog_shown_callback_.Run(); + on_print_dialog_shown_callback_.Reset(); } void PrintViewManager::OnSetupScriptedPrintPreview(IPC::Message* reply_msg) {
diff --git a/chrome/browser/printing/print_view_manager.h b/chrome/browser/printing/print_view_manager.h index a5345e24..b86c0b64 100644 --- a/chrome/browser/printing/print_view_manager.h +++ b/chrome/browser/printing/print_view_manager.h
@@ -15,8 +15,6 @@ namespace printing { -class PrintViewManagerObserver; - // Manages the print commands for a WebContents. class PrintViewManager : public PrintViewManagerBase, public content::WebContentsUserData<PrintViewManager> { @@ -26,7 +24,8 @@ #if defined(ENABLE_BASIC_PRINTING) // Same as PrintNow(), but for the case where a user prints with the system // dialog from print preview. - bool PrintForSystemDialogNow(); + // |dialog_shown_callback| is called when the print dialog is shown. + bool PrintForSystemDialogNow(const base::Closure& dialog_shown_callback); // Same as PrintNow(), but for the case where a user press "ctrl+shift+p" to // show the native system dialog. This can happen from both initiator and @@ -48,11 +47,6 @@ // renderer in the case of scripted print preview. void PrintPreviewDone(); - // Sets |observer| as the current PrintViewManagerObserver. Pass in NULL to - // remove the current observer. |observer| may always be NULL, but |observer_| - // must be NULL if |observer| is non-NULL. - void set_observer(PrintViewManagerObserver* observer); - // content::WebContentsObserver implementation. bool OnMessageReceived(const IPC::Message& message) override; @@ -79,9 +73,7 @@ void OnShowScriptedPrintPreview(bool source_is_modifiable); void OnScriptedPrintPreviewReply(IPC::Message* reply_msg); - // Weak pointer to an observer that is notified when the print dialog is - // shown. - PrintViewManagerObserver* observer_; + base::Closure on_print_dialog_shown_callback_; // Current state of print preview for this view. PrintPreviewState print_preview_state_;
diff --git a/chrome/browser/printing/print_view_manager_observer.h b/chrome/browser/printing/print_view_manager_observer.h deleted file mode 100644 index 55cd28c..0000000 --- a/chrome/browser/printing/print_view_manager_observer.h +++ /dev/null
@@ -1,23 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_PRINTING_PRINT_VIEW_MANAGER_OBSERVER_H_ -#define CHROME_BROWSER_PRINTING_PRINT_VIEW_MANAGER_OBSERVER_H_ - -namespace printing { - -// An interface the PrintViewManager uses to notify an observer when the print -// dialog is shown. Register the observer via PrintViewManager::set_observer. -class PrintViewManagerObserver { - public: - // Notifies the observer that the print dialog was shown. - virtual void OnPrintDialogShown() = 0; - - protected: - virtual ~PrintViewManagerObserver() {} -}; - -} // namespace printing - -#endif // CHROME_BROWSER_PRINTING_PRINT_VIEW_MANAGER_OBSERVER_H_
diff --git a/chrome/browser/renderer_host/safe_browsing_resource_throttle.cc b/chrome/browser/renderer_host/safe_browsing_resource_throttle.cc index 9ed2c959..891ee98 100644 --- a/chrome/browser/renderer_host/safe_browsing_resource_throttle.cc +++ b/chrome/browser/renderer_host/safe_browsing_resource_throttle.cc
@@ -13,6 +13,7 @@ #include "chrome/browser/browser_process.h" #include "chrome/browser/prerender/prerender_contents.h" #include "chrome/browser/safe_browsing/safe_browsing_service.h" +#include "components/safe_browsing_db/util.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/render_frame_host.h" #include "content/public/browser/resource_controller.h" @@ -206,7 +207,7 @@ void SafeBrowsingResourceThrottle::OnCheckBrowseUrlResult( const GURL& url, safe_browsing::SBThreatType threat_type, - const std::string& metadata) { + const safe_browsing::ThreatMetadata& metadata) { CHECK_EQ(state_, STATE_CHECKING_URL); CHECK_EQ(url, url_being_checked_); @@ -363,8 +364,8 @@ CHECK_EQ(state_, STATE_CHECKING_URL); database_manager_->CancelCheck(this); - OnCheckBrowseUrlResult( - url_being_checked_, safe_browsing::SB_THREAT_TYPE_SAFE, std::string()); + OnCheckBrowseUrlResult(url_being_checked_, safe_browsing::SB_THREAT_TYPE_SAFE, + safe_browsing::ThreatMetadata()); } void SafeBrowsingResourceThrottle::ResumeRequest() {
diff --git a/chrome/browser/renderer_host/safe_browsing_resource_throttle.h b/chrome/browser/renderer_host/safe_browsing_resource_throttle.h index c363f7d..3589010 100644 --- a/chrome/browser/renderer_host/safe_browsing_resource_throttle.h +++ b/chrome/browser/renderer_host/safe_browsing_resource_throttle.h
@@ -82,9 +82,10 @@ const char* GetNameForLogging() const override; // SafeBrowsingDabaseManager::Client implementation (called on IO thread): - void OnCheckBrowseUrlResult(const GURL& url, - safe_browsing::SBThreatType result, - const std::string& metadata) override; + void OnCheckBrowseUrlResult( + const GURL& url, + safe_browsing::SBThreatType result, + const safe_browsing::ThreatMetadata& metadata) override; protected: SafeBrowsingResourceThrottle(const net::URLRequest* request,
diff --git a/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.css b/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.css index 37de623..ea976da 100644 --- a/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.css +++ b/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.css
@@ -68,8 +68,10 @@ #first-run-flow { background-color: var(--paper-blue-500); + box-sizing: border-box; padding: 24px 16px 4px 16px; position: fixed; + width: 100%; } #first-run-flow a {
diff --git a/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.html b/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.html index 6f8b33a..9c8f373e 100644 --- a/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.html +++ b/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.html
@@ -13,6 +13,7 @@ <link rel="import" href="../media_router_header/media_router_header.html"> <link rel="import" href="../media_router_search_highlighter/media_router_search_highlighter.html"> <link rel="import" href="../route_details/route_details.html"> +<link rel="import" href="../../icons/media_router_icons.html"> <dom-module id="media-router-container"> <link rel="import" type="css" href="../../media_router_common.css"> <link rel="import" type="css" href="media_router_container.css">
diff --git a/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.js b/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.js index 86dc0e1e..64ef04c 100644 --- a/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.js +++ b/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.js
@@ -877,7 +877,7 @@ computeSinkIcon_: function(sink) { switch (sink.iconType) { case media_router.SinkIconType.CAST: - return 'hardware:tv'; + return 'media-router:chromecast'; case media_router.SinkIconType.CAST_AUDIO: return 'hardware:speaker'; case media_router.SinkIconType.CAST_AUDIO_GROUP: @@ -885,7 +885,7 @@ case media_router.SinkIconType.GENERIC: return 'hardware:tv'; case media_router.SinkIconType.HANGOUT: - return 'communication:message'; + return 'media-router:hangout'; default: return 'hardware:tv'; }
diff --git a/chrome/browser/resources/media_router/icons/media_router_icons.html b/chrome/browser/resources/media_router/icons/media_router_icons.html new file mode 100644 index 0000000..bb2d462 --- /dev/null +++ b/chrome/browser/resources/media_router/icons/media_router_icons.html
@@ -0,0 +1,10 @@ +<link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html"> +<link rel="import" href="chrome://resources/polymer/v1_0/iron-iconset-svg/iron-iconset-svg.html"> +<iron-iconset-svg name="media-router" size="24"> +<svg><defs> + <!-- copy of third_party/polymer/v1_0/components-chromium/iron-icons/hardware-icons.html hardware:tv icon --> + <g id="chromecast"><path d="M21 3H3c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h5v2h8v-2h5c1.1 0 1.99-.9 1.99-2L23 5c0-1.1-.9-2-2-2zm0 14H3V5h18v12z"></path></g> + <!-- copy of third_party/polymer/v1_0/components-chromium/iron-icons/hardware-icons.html communication:message icon --> + <g id="hangout"><path d="M20 2H4c-1.1 0-1.99.9-1.99 2L2 22l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-2 12H6v-2h12v2zm0-3H6V9h12v2zm0-3H6V6h12v2z"></path></g> +</defs></svg> +</iron-iconset-svg>
diff --git a/chrome/browser/resources/settings/a11y_page/a11y_page.html b/chrome/browser/resources/settings/a11y_page/a11y_page.html index 678a8d24..be9c60fa 100644 --- a/chrome/browser/resources/settings/a11y_page/a11y_page.html +++ b/chrome/browser/resources/settings/a11y_page/a11y_page.html
@@ -6,69 +6,67 @@ <dom-module id="settings-a11y-page"> <template> <style include="settings-shared"></style> - <div class="settings-card"> - <div class="settings-box row first"> - <span i18n-content="a11yExplanation"></span> - <a i18n-values="href:a11yLearnMoreUrl" i18n-content="learnMore" - target="_blank"></a> + <div class="settings-box row first"> + <span i18n-content="a11yExplanation"></span> + <a i18n-values="href:a11yLearnMoreUrl" i18n-content="learnMore" + target="_blank"></a> + </div> + + <div class="settings-box block"> + <settings-checkbox i18n-values="label:optionsInMenuLabel" + pref="{{prefs.settings.a11y.enable_menu}}"> + </settings-checkbox> + <settings-checkbox i18n-values="label:largeMouseCursorLabel" + pref="{{prefs.settings.a11y.large_cursor_enabled}}"> + </settings-checkbox> + <settings-checkbox i18n-values="label:highContrastLabel" + pref="{{prefs.settings.a11y.high_contrast_enabled}}"> + </settings-checkbox> + <settings-checkbox + pref="{{prefs.settings.a11y.sticky_keys_enabled}}" + i18n-values="label:stickyKeysLabel"> + </settings-checkbox> + <settings-checkbox pref="{{prefs.settings.accessibility}}" + i18n-values="label:chromeVoxLabel"> + </settings-checkbox> + <settings-checkbox i18n-values="label:screenMagnifierLabel" + pref="{{prefs.settings.a11y.screen_magnifier}}"> + </settings-checkbox> + <settings-checkbox i18n-values="label:tapDraggingLabel" + pref="{{prefs.settings.touchpad.enable_tap_dragging}}"> + </settings-checkbox> + <settings-checkbox i18n-values="label:clickOnStopLabel" + pref="{{prefs.settings.a11y.autoclick}}"> + </settings-checkbox> + + <div class="list-frame"> + <div class="list-item"> + <div i18n-content="delayBeforeClickLabel"></div> + <select + value="{{prefs.settings.a11y.autoclick_delay_ms::change}}"> + <option value="200" i18n-content="delayBeforeClickExtremelyShort"> + </option> + <option value="400" i18n-content="delayBeforeClickVeryShort"> + </option> + <option value="600" i18n-content="delayBeforeClickShort"> + </option> + <option value="800" i18n-content="delayBeforeClickLong"> + </option> + <option value="1000" i18n-content="delayBeforeClickVeryLong"> + </option> + </select> + </div> </div> - <div class="settings-box block"> - <settings-checkbox i18n-values="label:optionsInMenuLabel" - pref="{{prefs.settings.a11y.enable_menu}}"> - </settings-checkbox> - <settings-checkbox i18n-values="label:largeMouseCursorLabel" - pref="{{prefs.settings.a11y.large_cursor_enabled}}"> - </settings-checkbox> - <settings-checkbox i18n-values="label:highContrastLabel" - pref="{{prefs.settings.a11y.high_contrast_enabled}}"> - </settings-checkbox> - <settings-checkbox - pref="{{prefs.settings.a11y.sticky_keys_enabled}}" - i18n-values="label:stickyKeysLabel"> - </settings-checkbox> - <settings-checkbox pref="{{prefs.settings.accessibility}}" - i18n-values="label:chromeVoxLabel"> - </settings-checkbox> - <settings-checkbox i18n-values="label:screenMagnifierLabel" - pref="{{prefs.settings.a11y.screen_magnifier}}"> - </settings-checkbox> - <settings-checkbox i18n-values="label:tapDraggingLabel" - pref="{{prefs.settings.touchpad.enable_tap_dragging}}"> - </settings-checkbox> - <settings-checkbox i18n-values="label:clickOnStopLabel" - pref="{{prefs.settings.a11y.autoclick}}"> - </settings-checkbox> + <settings-checkbox pref="{{prefs.settings.a11y.virtual_keyboard}}" + i18n-values="label:onScreenKeyboardLabel"> + </settings-checkbox> + </div> - <div class="list-frame"> - <div class="list-item"> - <div i18n-content="delayBeforeClickLabel"></div> - <select - value="{{prefs.settings.a11y.autoclick_delay_ms::change}}"> - <option value="200" i18n-content="delayBeforeClickExtremelyShort"> - </option> - <option value="400" i18n-content="delayBeforeClickVeryShort"> - </option> - <option value="600" i18n-content="delayBeforeClickShort"> - </option> - <option value="800" i18n-content="delayBeforeClickLong"> - </option> - <option value="1000" i18n-content="delayBeforeClickVeryLong"> - </option> - </select> - </div> - </div> - - <settings-checkbox pref="{{prefs.settings.a11y.virtual_keyboard}}" - i18n-values="label:onScreenKeyboardLabel"> - </settings-checkbox> - </div> - - <div class="settings-box"> - <div class="button-strip"> - <paper-button i18n-content="moreFeaturesLink" - on-tap="onMoreFeaturesTap_"></paper-button> - </div> + <div class="settings-box"> + <div class="button-strip"> + <paper-button i18n-content="moreFeaturesLink" + on-tap="onMoreFeaturesTap_"></paper-button> </div> </div> </template>
diff --git a/chrome/browser/resources/settings/appearance_page/appearance_fonts_page.html b/chrome/browser/resources/settings/appearance_page/appearance_fonts_page.html index 638364a..df0a73cf 100644 --- a/chrome/browser/resources/settings/appearance_page/appearance_fonts_page.html +++ b/chrome/browser/resources/settings/appearance_page/appearance_fonts_page.html
@@ -24,8 +24,7 @@ menu-options="[[fontOptions_]]"> </settings-dropdown-menu> <div class="settings-column" - style$="[[computeStyle_(defaultFontSize_, - prefs.webkit.webprefs.fonts.standard.Zyyy.value)]]"> + style$="[[computeStyle_(defaultFontSize_, prefs.webkit.webprefs.fonts.standard.Zyyy.value)]]"> <span>[[defaultFontSize_]]</span>: <span i18n-content="loremIpsum"></span> </div> @@ -37,8 +36,7 @@ menu-options="[[fontOptions_]]"> </settings-dropdown-menu> <div class="settings-column" - style$="[[computeStyle_(defaultFontSize_, - prefs.webkit.webprefs.fonts.serif.Zyyy.value)]]"> + style$="[[computeStyle_(defaultFontSize_, prefs.webkit.webprefs.fonts.serif.Zyyy.value)]]"> <span>[[defaultFontSize_]]</span>: <span i18n-content="loremIpsum"></span> </div> @@ -50,8 +48,7 @@ menu-options="[[fontOptions_]]"> </settings-dropdown-menu> <div class="settings-column" - style$="{{computeStyle_(defaultFontSize_, - prefs.webkit.webprefs.fonts.sansserif.Zyyy.value)}}"> + style$="[[computeStyle_(defaultFontSize_, prefs.webkit.webprefs.fonts.sansserif.Zyyy.value)]]"> <span>[[defaultFontSize_]]</span>: <span i18n-content="loremIpsum"></span> </div> @@ -63,8 +60,7 @@ menu-options="[[fontOptions_]]"> </settings-dropdown-menu> <div class="settings-column" - style$="[[computeStyle_(defaultFontSize_, - prefs.webkit.webprefs.fonts.fixed.Zyyy.value)]]"> + style$="[[computeStyle_(defaultFontSize_, prefs.webkit.webprefs.fonts.fixed.Zyyy.value)]]"> <span i18n-content="loremIpsum"></span> </div> </div> @@ -77,8 +73,7 @@ on-immediate-value-change="immediateMinimumSizeIndexChanged_"> </paper-slider> </div> - <div style$="[[computeStyle_(minimumFontSize_, - prefs.webkit.webprefs.fonts.standard.Zyyy.value)]]"> + <div style$="[[computeStyle_(minimumFontSize_, prefs.webkit.webprefs.fonts.standard.Zyyy.value)]]"> <span>[[minimumFontSize_]]</span>: <span i18n-content="loremIpsum"></span> </div>
diff --git a/chrome/browser/resources/settings/appearance_page/appearance_fonts_page.js b/chrome/browser/resources/settings/appearance_page/appearance_fonts_page.js index 6c8edeb..a2a261c2 100644 --- a/chrome/browser/resources/settings/appearance_page/appearance_fonts_page.js +++ b/chrome/browser/resources/settings/appearance_page/appearance_fonts_page.js
@@ -2,235 +2,234 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -/** - * This is the absolute difference maintained between standard and - * fixed-width font sizes. http://crbug.com/91922. - * @const - */ -var SIZE_DIFFERENCE_FIXED_STANDARD = 3; - -var FONT_SIZE_RANGE = [ - 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, - 40, 44, 48, 56, 64, 72, -]; - -var FONT_SIZE_RANGE_LIMIT = FONT_SIZE_RANGE.length - 1; - -var MINIMUM_FONT_SIZE_RANGE = [ - 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 22, 24 -]; - -var MINIMUM_FONT_SIZE_RANGE_LIMIT = MINIMUM_FONT_SIZE_RANGE.length - 1; - -/** - * 'settings-appearance-page' is the settings page containing appearance - * settings. - * - * Example: - * - * <settings-appearance-fonts-page prefs="{{prefs}}"> - * </settings-appearance-fonts-page> - * - * @group Chrome Settings Elements - * @element settings-appearance-page - */ -Polymer({ - is: 'settings-appearance-fonts-page', - - properties: { - /** - * The font size used by default. - * @private - */ - defaultFontSize_: { - type: Number, - }, - - /** - * The value of the font size slider. - * @private - */ - fontSizeIndex_: { - type: Number, - }, - - /** - * Common font sizes. - * @private {!Array<number>} - */ - fontSizeRange_: { - readOnly: true, - type: Array, - value: FONT_SIZE_RANGE, - }, - - /** - * Upper bound of the font size slider. - * @private - */ - fontSizeRangeLimit_: { - readOnly: true, - type: Number, - value: MINIMUM_FONT_SIZE_RANGE_LIMIT, - }, - - /** - * The interactive value of the minimum font size slider. - * @private - */ - immediateMinimumSizeIndex_: { - type: Number, - }, - - /** - * The interactive value of the font size slider. - * @private - */ - immediateSizeIndex_: { - type: Number, - }, - - /** - * Reasonable, minimum font sizes. - * @private {!Array<number>} - */ - minimumFontSizeRange_: { - readOnly: true, - type: Array, - value: MINIMUM_FONT_SIZE_RANGE, - }, - - /** - * Upper bound of the minimum font size slider. - * @private - */ - minimumFontSizeRangeLimit_: { - readOnly: true, - type: Number, - value: MINIMUM_FONT_SIZE_RANGE_LIMIT, - }, - - /** - * The font size used at minimum. - * @private - */ - minimumFontSize_: { - type: Number, - }, - - /** - * The value of the minimum font size slider. - * @private - */ - minimumSizeIndex_: { - type: Number, - }, - - /** - * Preferences state. - */ - prefs: { - type: Object, - notify: true, - }, - }, +(function() { + 'use strict'; /** * This is the absolute difference maintained between standard and * fixed-width font sizes. http://crbug.com/91922. - * @const + * @const @private {number} */ - SIZE_DIFFERENCE_FIXED_STANDARD: 3, + var SIZE_DIFFERENCE_FIXED_STANDARD_ = 3; - observers: [ - 'fontSizeChanged_(prefs.webkit.webprefs.default_font_size.value)', - 'minimumFontSizeChanged_(prefs.webkit.webprefs.minimum_font_size.value)', - ], + /** @const @private {!Array<number>} */ + var FONT_SIZE_RANGE_ = [ + 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, + 40, 44, 48, 56, 64, 72, + ]; - ready: function() { - var self = this; - cr.define('Settings', function() { - return { - setFontsData: function() { - return self.setFontsData_.apply(self, arguments); - }, - }; - }); - chrome.send('fetchFontsData'); - }, + /** @const @private {!Array<number>} */ + var MINIMUM_FONT_SIZE_RANGE_ = [ + 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 22, 24 + ]; /** - * @param {number} value The intermediate slider value. - * @private + * 'settings-appearance-fonts-page' is the settings page containing appearance + * settings. + * + * Example: + * + * <settings-appearance-fonts-page prefs="{{prefs}}"> + * </settings-appearance-fonts-page> + * + * @group Chrome Settings Elements + * @element settings-appearance-fonts-page */ - immediateSizeIndexChanged_: function(value) { - this.set('prefs.webkit.webprefs.default_font_size.value', - this.fontSizeRange_[this.immediateSizeIndex_]); - }, + Polymer({ + is: 'settings-appearance-fonts-page', - /** - * @param {number} value The intermediate slider value. - * @private - */ - immediateMinimumSizeIndexChanged_: function(value) { - this.set('prefs.webkit.webprefs.minimum_font_size.value', - this.minimumFontSizeRange_[this.immediateMinimumSizeIndex_]); - }, + properties: { + /** + * The font size used by default. + * @private + */ + defaultFontSize_: { + type: Number, + }, - /** - * @param {!Array<{0: string, 1: (string|undefined), 2: (string|undefined)}>} - * fontList The font menu options. - * @param {!Array<{0: string, 1: string}>} encodingList The encoding menu - * options. - * @private - */ - setFontsData_: function(fontList, encodingList) { - var fontMenuOptions = []; - for (var i = 0; i < fontList.length; ++i) - fontMenuOptions.push({value: fontList[i][0], name: fontList[i][1]}); - this.$.standardFont.menuOptions = fontMenuOptions; - this.$.serifFont.menuOptions = fontMenuOptions; - this.$.sansSerifFont.menuOptions = fontMenuOptions; - this.$.fixedFont.menuOptions = fontMenuOptions; + /** + * The value of the font size slider. + * @private + */ + fontSizeIndex_: { + type: Number, + }, - var encodingMenuOptions = []; - for (var i = 0; i < encodingList.length; ++i) { - encodingMenuOptions.push({ - value: encodingList[i][0], name: encodingList[i][1]}); - } - this.$.encoding.menuOptions = encodingMenuOptions; - }, + /** + * Common font sizes. + * @private {!Array<number>} + */ + fontSizeRange_: { + readOnly: true, + type: Array, + value: FONT_SIZE_RANGE_, + }, - /** - * @param {number} value The changed font size slider value. - * @private - */ - fontSizeChanged_: function(value) { - this.defaultFontSize_ = value; - if (!this.$.sizeSlider.dragging) { - this.fontSizeIndex_ = this.fontSizeRange_.indexOf(value); - this.set('prefs.webkit.webprefs.default_fixed_font_size.value', - value - SIZE_DIFFERENCE_FIXED_STANDARD); - } - }, + /** + * Upper bound of the font size slider. + * @private + */ + fontSizeRangeLimit_: { + readOnly: true, + type: Number, + value: FONT_SIZE_RANGE_.length - 1, + }, - /** - * @param {number} value The changed font size slider value. - * @private - */ - minimumFontSizeChanged_: function(value) { - this.minimumFontSize_ = value; - if (!this.$.minimumSizeSlider.dragging) - this.minimumSizeIndex_ = this.minimumFontSizeRange_.indexOf(value); - }, + /** + * The interactive value of the minimum font size slider. + * @private + */ + immediateMinimumSizeIndex_: { + type: Number, + }, - /** - * Creates an html style value. - * @param {number} fontSize The font size to use. - * @param {string} fontFamily The name of the font family use. - * @private - */ - computeStyle_: function(fontSize, fontFamily) { - return 'font-size: ' + fontSize + "px; font-family: '" + fontFamily + "';"; - }, -}); + /** + * The interactive value of the font size slider. + * @private + */ + immediateSizeIndex_: { + type: Number, + }, + + /** + * Reasonable, minimum font sizes. + * @private {!Array<number>} + */ + minimumFontSizeRange_: { + readOnly: true, + type: Array, + value: MINIMUM_FONT_SIZE_RANGE_, + }, + + /** + * Upper bound of the minimum font size slider. + * @private + */ + minimumFontSizeRangeLimit_: { + readOnly: true, + type: Number, + value: MINIMUM_FONT_SIZE_RANGE_.length - 1, + }, + + /** + * The font size used at minimum. + * @private + */ + minimumFontSize_: { + type: Number, + }, + + /** + * The value of the minimum font size slider. + * @private + */ + minimumSizeIndex_: { + type: Number, + }, + + /** + * Preferences state. + */ + prefs: { + type: Object, + notify: true, + }, + }, + + observers: [ + 'fontSizeChanged_(prefs.webkit.webprefs.default_font_size.value)', + 'minimumFontSizeChanged_(prefs.webkit.webprefs.minimum_font_size.value)', + ], + + /** @override */ + ready: function() { + var self = this; + cr.define('Settings', function() { + return { + setFontsData: function() { + return self.setFontsData_.apply(self, arguments); + }, + }; + }); + chrome.send('fetchFontsData'); + }, + + /** + * @param {number} value The intermediate slider value. + * @private + */ + immediateSizeIndexChanged_: function(value) { + this.set('prefs.webkit.webprefs.default_font_size.value', + this.fontSizeRange_[this.immediateSizeIndex_]); + }, + + /** + * @param {number} value The intermediate slider value. + * @private + */ + immediateMinimumSizeIndexChanged_: function(value) { + this.set('prefs.webkit.webprefs.minimum_font_size.value', + this.minimumFontSizeRange_[this.immediateMinimumSizeIndex_]); + }, + + /** + * @param {!Array<{0: string, 1: (string|undefined), + * 2: (string|undefined)}>} + * fontList The font menu options. + * @param {!Array<{0: string, 1: string}>} encodingList The encoding menu + * options. + * @private + */ + setFontsData_: function(fontList, encodingList) { + var fontMenuOptions = []; + for (var i = 0; i < fontList.length; ++i) + fontMenuOptions.push({value: fontList[i][0], name: fontList[i][1]}); + this.$.standardFont.menuOptions = fontMenuOptions; + this.$.serifFont.menuOptions = fontMenuOptions; + this.$.sansSerifFont.menuOptions = fontMenuOptions; + this.$.fixedFont.menuOptions = fontMenuOptions; + + var encodingMenuOptions = []; + for (var i = 0; i < encodingList.length; ++i) { + encodingMenuOptions.push({ + value: encodingList[i][0], name: encodingList[i][1]}); + } + this.$.encoding.menuOptions = encodingMenuOptions; + }, + + /** + * @param {number} value The changed font size slider value. + * @private + */ + fontSizeChanged_: function(value) { + this.defaultFontSize_ = value; + if (!this.$.sizeSlider.dragging) { + this.fontSizeIndex_ = this.fontSizeRange_.indexOf(value); + this.set('prefs.webkit.webprefs.default_fixed_font_size.value', + value - SIZE_DIFFERENCE_FIXED_STANDARD_); + } + }, + + /** + * @param {number} value The changed font size slider value. + * @private + */ + minimumFontSizeChanged_: function(value) { + this.minimumFontSize_ = value; + if (!this.$.minimumSizeSlider.dragging) + this.minimumSizeIndex_ = this.minimumFontSizeRange_.indexOf(value); + }, + + /** + * Creates an html style value. + * @param {number} fontSize The font size to use. + * @param {string} fontFamily The name of the font family use. + * @return {string} + * @private + */ + computeStyle_: function(fontSize, fontFamily) { + return 'font-size: ' + fontSize + "px; font-family: '" + fontFamily + + "';"; + }, + }); +})();
diff --git a/chrome/browser/resources/settings/date_time_page/date_time_page.html b/chrome/browser/resources/settings/date_time_page/date_time_page.html index c0ddb9c..c5457d7 100644 --- a/chrome/browser/resources/settings/date_time_page/date_time_page.html +++ b/chrome/browser/resources/settings/date_time_page/date_time_page.html
@@ -6,14 +6,12 @@ <dom-module id="settings-date-time-page"> <template> <style include="settings-shared"></style> - <div class="settings-card"> - <div class="settings-box first block"> - <div i18n-content="timeZone"></div> - <settings-checkbox pref="{{prefs.settings.clock.use_24hour_clock}}" - i18n-values="label:use24HourClock"> - </settings-checkbox> - <div id="setAutomatically" i18n-content="dateTimeSetAutomatically"> - </div> + <div class="settings-box first block"> + <div i18n-content="timeZone"></div> + <settings-checkbox pref="{{prefs.settings.clock.use_24hour_clock}}" + i18n-values="label:use24HourClock"> + </settings-checkbox> + <div id="setAutomatically" i18n-content="dateTimeSetAutomatically"> </div> </div> </template>
diff --git a/chrome/browser/resources/settings/default_browser_page/default_browser_page.html b/chrome/browser/resources/settings/default_browser_page/default_browser_page.html index 6bea5d8..913872b 100644 --- a/chrome/browser/resources/settings/default_browser_page/default_browser_page.html +++ b/chrome/browser/resources/settings/default_browser_page/default_browser_page.html
@@ -8,22 +8,20 @@ <link rel="import" type="css" href="default_browser_page.css"> <template> <style include="settings-shared"></style> - <div class="settings-card"> - <div class="settings-box first"> - <template is="dom-if" if="[[showButton_]]"> - <div on-tap="onSetDefaultBrowserTap_"> - <div>[[i18n('defaultBrowser')]]</div> - <div class="secondary">[[i18n('defaultBrowserMakeDefault')]]</div> - </div> - <template is="dom-if" if="[[showError_]]"> - <iron-icon icon="error" class="error-icon" - title="[[i18n('unableToSetDefaultBrowser')]]"></iron-icon> - </template> + <div class="settings-box first"> + <template is="dom-if" if="[[showButton_]]"> + <div on-tap="onSetDefaultBrowserTap_"> + <div>[[i18n('defaultBrowser')]]</div> + <div class="secondary">[[i18n('defaultBrowserMakeDefault')]]</div> + </div> + <template is="dom-if" if="[[showError_]]"> + <iron-icon icon="error" class="error-icon" + title="[[i18n('unableToSetDefaultBrowser')]]"></iron-icon> </template> - <template is="dom-if" if="[[!showButton_]]"> - <div class="secondary">[[message_]]</div> - </template> - </div> + </template> + <template is="dom-if" if="[[!showButton_]]"> + <div class="secondary">[[message_]]</div> + </template> </div> </template> <script src="default_browser_page.js"></script>
diff --git a/chrome/browser/resources/settings/downloads_page/downloads_page.html b/chrome/browser/resources/settings/downloads_page/downloads_page.html index f8c50666..682b242 100644 --- a/chrome/browser/resources/settings/downloads_page/downloads_page.html +++ b/chrome/browser/resources/settings/downloads_page/downloads_page.html
@@ -9,29 +9,27 @@ <link rel="import" type="css" href="downloads_page.css"> <template> <style include="settings-shared"></style> - <div class="settings-card"> - <div class="settings-box first"> - <div class="start"> - <settings-input id="downloadsPath" always-flow-label readonly - i18n-values="label:downloadLocation" - pref="{{prefs.download.default_directory}}" - aria-labelledby="locationLabel"> - </settings-input> - </div> - <paper-button id="changeDownloadsPath" on-tap="selectDownloadLocation_" - i18n-content="changeDownloadLocation"> - </paper-button> + <div class="settings-box first"> + <div class="start"> + <settings-input id="downloadsPath" always-flow-label readonly + i18n-values="label:downloadLocation" + pref="{{prefs.download.default_directory}}" + aria-labelledby="locationLabel"> + </settings-input> </div> - <div class="settings-box block"> - <settings-checkbox pref="{{prefs.download.prompt_for_download}}" - i18n-values="label:promptForDownload"> - </settings-checkbox> + <paper-button id="changeDownloadsPath" on-tap="selectDownloadLocation_" + i18n-content="changeDownloadLocation"> + </paper-button> + </div> + <div class="settings-box block"> + <settings-checkbox pref="{{prefs.download.prompt_for_download}}" + i18n-values="label:promptForDownload"> + </settings-checkbox> <if expr="chromeos"> - <settings-checkbox pref="{{prefs.gdata.disabled}}" - i18n-values="label:disconnectGoogleDriveAccount"> - </settings-checkbox> + <settings-checkbox pref="{{prefs.gdata.disabled}}" + i18n-values="label:disconnectGoogleDriveAccount"> + </settings-checkbox> </if> - </div> </div> </template> <script src="downloads_page.js"></script>
diff --git a/chrome/browser/resources/settings/on_startup_page/on_startup_page.html b/chrome/browser/resources/settings/on_startup_page/on_startup_page.html index 4681097..a7861b94 100644 --- a/chrome/browser/resources/settings/on_startup_page/on_startup_page.html +++ b/chrome/browser/resources/settings/on_startup_page/on_startup_page.html
@@ -12,27 +12,25 @@ <link rel="import" type="css" href="on_startup_shared.css"> <template> <style include="settings-shared"></style> - <div class="settings-card"> - <div class="settings-box block first"> - <settings-radio-group id="onStartupRadioGroup" - pref="{{prefs.session.restore_on_startup}}"> - <paper-radio-button name="[[prefValues_.OPEN_NEW_TAB]]" - i18n-content="onStartupOpenNewTab"> - </paper-radio-button> - <paper-radio-button name="[[prefValues_.CONTINUE]]" - i18n-content="onStartupContinue"> - </paper-radio-button> - <paper-radio-button name="[[prefValues_.OPEN_SPECIFIC]]" - i18n-content="onStartupOpenSpecific"> - </paper-radio-button> - </settings-radio-group> - </div> - <template is="dom-if" - if="[[showStartupUrls_(prefs.session.restore_on_startup.value)]]"> - <settings-startup-urls-page prefs="{{prefs}}"> - </settings-startup-urls-page> - </template> + <div class="settings-box block first"> + <settings-radio-group id="onStartupRadioGroup" + pref="{{prefs.session.restore_on_startup}}"> + <paper-radio-button name="[[prefValues_.OPEN_NEW_TAB]]" + i18n-content="onStartupOpenNewTab"> + </paper-radio-button> + <paper-radio-button name="[[prefValues_.CONTINUE]]" + i18n-content="onStartupContinue"> + </paper-radio-button> + <paper-radio-button name="[[prefValues_.OPEN_SPECIFIC]]" + i18n-content="onStartupOpenSpecific"> + </paper-radio-button> + </settings-radio-group> </div> + <template is="dom-if" + if="[[showStartupUrls_(prefs.session.restore_on_startup.value)]]"> + <settings-startup-urls-page prefs="{{prefs}}"> + </settings-startup-urls-page> + </template> </template> <script src="on_startup_page.js"></script> </dom-module>
diff --git a/chrome/browser/resources/settings/on_startup_page/startup_urls_page.html b/chrome/browser/resources/settings/on_startup_page/startup_urls_page.html index 8b1b380..9cee7d9e 100644 --- a/chrome/browser/resources/settings/on_startup_page/startup_urls_page.html +++ b/chrome/browser/resources/settings/on_startup_page/startup_urls_page.html
@@ -1,12 +1,13 @@ <link rel="import" href="chrome://resources/polymer/v1_0/polymer/polymer.html"> <link rel="import" href="chrome://resources/polymer/v1_0/paper-dialog/paper-dialog.html"> <link rel="import" href="chrome://resources/polymer/v1_0/paper-input/paper-input.html"> +<link rel="import" href="chrome://md-settings/settings_dialog_css.html"> <link rel="import" href="chrome://md-settings/settings_shared_css.html"> <dom-module id="settings-startup-urls-page"> - <link rel="import" type="css" href="chrome://md-settings/settings_dialog.css"> <link rel="import" type="css" href="on_startup_shared.css"> <template> + <style include="settings-dialog"></style> <style include="settings-shared"></style> <div class="list-frame vertical-list"> <template is="dom-repeat" items="[[startupPages_]]">
diff --git a/chrome/browser/resources/settings/passwords_and_forms_page/passwords_and_forms_page.html b/chrome/browser/resources/settings/passwords_and_forms_page/passwords_and_forms_page.html index 34ecc8c..4950af9 100644 --- a/chrome/browser/resources/settings/passwords_and_forms_page/passwords_and_forms_page.html +++ b/chrome/browser/resources/settings/passwords_and_forms_page/passwords_and_forms_page.html
@@ -10,36 +10,34 @@ <dom-module id="settings-passwords-and-forms-page"> <template> <style include="settings-shared"></style> - <div class="settings-card"> - <div class="settings-box first two-line"> - <div class="start"> - <div i18n-content="autofill"></div> - <div class="secondary" i18n-content="autofillDetail"></div> - </div> - <paper-toggle-button - checked="{{prefs.autofill.enabled.value}}"> - </paper-toggle-button> - <cr-expand-button disabled="{{!prefs.autofill.enabled.value}}"> - </cr-expand-button> + <div class="settings-box first two-line"> + <div class="start"> + <div i18n-content="autofill"></div> + <div class="secondary" i18n-content="autofillDetail"></div> </div> - <div class="settings-box two-line"> - <div class="start"> - <div i18n-content="passwords"></div> - <div class="secondary" i18n-content="passwordsDetail"></div> - </div> - <paper-toggle-button - checked="{{prefs.profile.password_manager_enabled.value}}"> - </paper-toggle-button> - <cr-expand-button expanded="{{passwordsOpened}}" - disabled="{{!prefs.profile.password_manager_enabled.value}}"> - </cr-expand-button> - </div> - <iron-collapse id="collapse" opened="{{passwordsOpened}}"> - <passwords-section saved-passwords="{{savedPasswords}}" - password-exceptions="{{passwordExceptions}}"> - </passwords-section> - </iron-collapse> + <paper-toggle-button + checked="{{prefs.autofill.enabled.value}}"> + </paper-toggle-button> + <cr-expand-button disabled="{{!prefs.autofill.enabled.value}}"> + </cr-expand-button> </div> + <div class="settings-box two-line"> + <div class="start"> + <div i18n-content="passwords"></div> + <div class="secondary" i18n-content="passwordsDetail"></div> + </div> + <paper-toggle-button + checked="{{prefs.profile.password_manager_enabled.value}}"> + </paper-toggle-button> + <cr-expand-button expanded="{{passwordsOpened}}" + disabled="{{!prefs.profile.password_manager_enabled.value}}"> + </cr-expand-button> + </div> + <iron-collapse id="collapse" opened="{{passwordsOpened}}"> + <passwords-section saved-passwords="{{savedPasswords}}" + password-exceptions="{{passwordExceptions}}"> + </passwords-section> + </iron-collapse> </template> <script src="passwords_and_forms_page.js"></script> </dom-module>
diff --git a/chrome/browser/resources/settings/reset_page/powerwash_dialog.html b/chrome/browser/resources/settings/reset_page/powerwash_dialog.html index 82b07e55..ef43287 100644 --- a/chrome/browser/resources/settings/reset_page/powerwash_dialog.html +++ b/chrome/browser/resources/settings/reset_page/powerwash_dialog.html
@@ -4,11 +4,12 @@ <link rel="import" href="chrome://resources/polymer/v1_0/paper-checkbox/paper-checkbox.html"> <link rel="import" href="chrome://resources/polymer/v1_0/paper-dialog/paper-dialog.html"> <link rel="import" href="chrome://resources/polymer/v1_0/paper-icon-button/paper-icon-button.html"> +<link rel="import" href="chrome://md-settings/settings_dialog_css.html"> <dom-module id="settings-powerwash-dialog"> - <link rel="import" type="css" href="chrome://md-settings/settings_dialog.css"> <link rel="import" type="css" href="reset_page_dialog.css"> <template> + <style include="settings-dialog"></style> <paper-dialog modal id="dialog"> <div id="dialog-content"> <div class="top-row">
diff --git a/chrome/browser/resources/settings/reset_page/reset_page.html b/chrome/browser/resources/settings/reset_page/reset_page.html index ba136156..80098c8 100644 --- a/chrome/browser/resources/settings/reset_page/reset_page.html +++ b/chrome/browser/resources/settings/reset_page/reset_page.html
@@ -9,24 +9,22 @@ <dom-module id="settings-reset-page"> <template> <style include="settings-shared"></style> - <div class="settings-card"> - <div class="settings-box first two-line" id="resetProfile" - on-tap="onShowResetProfileDialog_"> - <div> - <div i18n-content="resetPageTitle"></div> - <div class="secondary" i18n-content="resetPageDescription"></div> - </div> + <div class="settings-box first two-line" id="resetProfile" + on-tap="onShowResetProfileDialog_"> + <div> + <div i18n-content="resetPageTitle"></div> + <div class="secondary" i18n-content="resetPageDescription"></div> </div> -<if expr="chromeos"> - <div class="settings-box two-line" id="powerwash" - on-tap="onShowPowerwashDialog_" hidden="[[!allowPowerwash_]]"> - <div> - <div i18n-content="powerwashTitle"></div> - <div class="secondary" i18n-content="powerwashDescription"></div> - </div> - </div> -</if> </div> +<if expr="chromeos"> + <div class="settings-box two-line" id="powerwash" + on-tap="onShowPowerwashDialog_" hidden="[[!allowPowerwash_]]"> + <div> + <div i18n-content="powerwashTitle"></div> + <div class="secondary" i18n-content="powerwashDescription"></div> + </div> + </div> +</if> </template> <script src="chrome://md-settings/reset_page/reset_page.js"></script> </dom-module>
diff --git a/chrome/browser/resources/settings/reset_page/reset_profile_dialog.html b/chrome/browser/resources/settings/reset_page/reset_profile_dialog.html index 9be9d87..23abc233 100644 --- a/chrome/browser/resources/settings/reset_page/reset_profile_dialog.html +++ b/chrome/browser/resources/settings/reset_page/reset_profile_dialog.html
@@ -5,12 +5,13 @@ <link rel="import" href="chrome://resources/polymer/v1_0/paper-dialog/paper-dialog.html"> <link rel="import" href="chrome://resources/polymer/v1_0/paper-icon-button/paper-icon-button.html"> <link rel="import" href="chrome://resources/polymer/v1_0/paper-spinner/paper-spinner.html"> +<link rel="import" href="chrome://md-settings/settings_dialog_css.html"> <dom-module id="settings-reset-profile-dialog"> - <link rel="import" type="css" href="chrome://md-settings/settings_dialog.css"> <link rel="import" type="css" href="reset_page_dialog.css"> <link rel="import" type="css" href="reset_profile_dialog.css"> <template> + <style include="settings-dialog"></style> <paper-dialog modal id="dialog"> <div id="dialog-content"> <div class="top-row">
diff --git a/chrome/browser/resources/settings/search_engines_page/search_engine_dialog.html b/chrome/browser/resources/settings/search_engines_page/search_engine_dialog.html index cc5ff00..f49c543 100644 --- a/chrome/browser/resources/settings/search_engines_page/search_engine_dialog.html +++ b/chrome/browser/resources/settings/search_engines_page/search_engine_dialog.html
@@ -6,10 +6,11 @@ <link rel="import" href="chrome://resources/polymer/v1_0/paper-icon-button/paper-icon-button.html"> <link rel="import" href="chrome://resources/polymer/v1_0/paper-input/paper-input.html"> <link rel="import" href="chrome://resources/polymer/v1_0/polymer/polymer.html"> +<link rel="import" href="chrome://md-settings/settings_dialog_css.html"> <dom-module id="settings-search-engine-dialog"> - <link rel="import" type="css" href="chrome://md-settings/settings_dialog.css"> <template> + <style include="settings-dialog"></style> <paper-dialog modal id="dialog"> <div id="dialog-content"> <div class="top-row">
diff --git a/chrome/browser/resources/settings/settings_dialog.css b/chrome/browser/resources/settings/settings_dialog.css deleted file mode 100644 index 4d72f16..0000000 --- a/chrome/browser/resources/settings/settings_dialog.css +++ /dev/null
@@ -1,77 +0,0 @@ -/* Copyright 2015 The Chromium Authors. All rights reserved. - * Use of this source code is governed by a BSD-style license that can be - * found in the LICENSE file. */ - -/** - * @fileoverview - * Common dialog styles for Material Design settings. - */ - -paper-dialog { - min-width: 500px; - max-width: 800px; -} - -#dialog-content { - -webkit-padding-end: 0; - -webkit-padding-start: 0; - margin-bottom: 0; - margin-top: 0; -} - -paper-dialog .top-row { - align-items: center; - border-bottom: 1px solid gainsboro; - display: flex; - padding-bottom: 5px; - padding-top: 5px; -} - -paper-dialog .title { - flex: 1; - font-size: 1.13em; -} - -paper-dialog .body { - font-size: 1em; - margin: 20px 0; -} - -paper-dialog .title, -paper-dialog .body { - -webkit-padding-end: 24px; - -webkit-padding-start: 24px; -} - -paper-dialog .action-button { - -webkit-margin-start: 10px; - font-weight: 500; -} - -paper-dialog .action-button:not([disabled]) { - background-color: rgb(66, 133, 244); - color: white; -} - -paper-dialog .cancel-button { - color: rgb(109, 109, 109); - font-weight: 500; -} - -paper-dialog .explanation { - margin-bottom: 35px; -} - -paper-dialog .button-container { - display: flex; - justify-content: flex-end; -} - -paper-dialog paper-button { - margin: 0; - min-width: auto; -} - -paper-dialog paper-button[toggles][active] { - background-color: LightGray; -}
diff --git a/chrome/browser/resources/settings/settings_dialog_css.html b/chrome/browser/resources/settings/settings_dialog_css.html new file mode 100644 index 0000000..5c34203 --- /dev/null +++ b/chrome/browser/resources/settings/settings_dialog_css.html
@@ -0,0 +1,83 @@ +/* Copyright 2016 The Chromium Authors. All rights reserved. + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. */ + +/** + * @fileoverview + * Common dialog styles for Material Design settings. + */ + +<dom-module id="settings-dialog"> + <template> + <style> + paper-dialog { + max-width: 800px; + min-width: 500px; + } + + #dialog-content { + -webkit-padding-end: 0; + -webkit-padding-start: 0; + margin-bottom: 0; + margin-top: 0; + } + + paper-dialog .top-row { + align-items: center; + border-bottom: 1px solid gainsboro; + display: flex; + padding-bottom: 5px; + padding-top: 5px; + } + + paper-dialog .title { + flex: 1; + font-size: 1.13em; + } + + paper-dialog .body { + font-size: 1em; + margin: 20px 0; + } + + paper-dialog .title, + paper-dialog .body { + -webkit-padding-end: 24px; + -webkit-padding-start: 24px; + } + + paper-dialog .action-button { + -webkit-margin-start: 10px; + font-weight: 500; + } + + paper-dialog .action-button:not([disabled]) { + background-color: rgb(66, 133, 244); + color: white; + } + + paper-dialog .cancel-button { + color: rgb(109, 109, 109); + font-weight: 500; + } + + paper-dialog .explanation { + margin-bottom: 35px; + } + + paper-dialog .button-container { + display: flex; + justify-content: flex-end; + } + + paper-dialog paper-button { + margin: 0; + min-width: auto; + } + + paper-dialog paper-button[toggles][active] { + background-color: LightGray; + } + </style> + </template> +</dom-module>
diff --git a/chrome/browser/resources/settings/settings_page/settings_animated_pages.html b/chrome/browser/resources/settings/settings_page/settings_animated_pages.html index 4844215..fcd6b9d 100644 --- a/chrome/browser/resources/settings/settings_page/settings_animated_pages.html +++ b/chrome/browser/resources/settings/settings_page/settings_animated_pages.html
@@ -9,17 +9,13 @@ <link rel="import" href="chrome://resources/polymer/v1_0/neon-animation/neon-animatable.html"> <link rel="import" href="chrome://resources/polymer/v1_0/neon-animation/neon-animated-pages.html"> <link rel="import" href="chrome://resources/polymer/v1_0/neon-animation/neon-animation-runner-behavior.html"> -<link rel="import" href="chrome://md-settings/settings_shared_css.html"> <dom-module id="settings-animated-pages"> <link rel="import" type="css" href="settings_animated_pages.css"> <template> - <style include="settings-shared"></style> - <div class="settings-card"> - <neon-animated-pages id="animatedPages" attr-for-selected="id"> - <content select="*"></content> - </neon-animated-pages> - </div> + <neon-animated-pages id="animatedPages" attr-for-selected="id"> + <content select="*"></content> + </neon-animated-pages> </template> <script src="settings_animated_pages.js"></script> </dom-module>
diff --git a/chrome/browser/resources/settings/settings_resources.grd b/chrome/browser/resources/settings/settings_resources.grd index c0e74f7..201ade79 100644 --- a/chrome/browser/resources/settings/settings_resources.grd +++ b/chrome/browser/resources/settings/settings_resources.grd
@@ -130,8 +130,8 @@ <structure name="IDR_SETTINGS_CR_SETTINGS_SUBHEADER_JS" file="settings_page/settings_subheader.js" type="chrome_html" /> - <structure name="IDR_SETTINGS_CR_SETTINGS_DIALOG_CSS" - file="settings_dialog.css" + <structure name="IDR_SETTINGS_CR_SETTINGS_DIALOG_CSS_HTML" + file="settings_dialog_css.html" type="chrome_html" /> <structure name="IDR_SETTINGS_CR_SETTINGS_PAGE_CSS" file="settings_page.css"
diff --git a/chrome/browser/resources/settings/settings_shared_css.html b/chrome/browser/resources/settings/settings_shared_css.html index 16a194a1..b39dc83 100644 --- a/chrome/browser/resources/settings/settings_shared_css.html +++ b/chrome/browser/resources/settings/settings_shared_css.html
@@ -12,7 +12,7 @@ <style> :root { --settings-secondary: { - color: #969696; + color: var(--paper-grey-500); font-weight: 400; } } @@ -28,11 +28,11 @@ } iron-icon { - color: #969696; + color: var(--paper-grey-300); } iron-icon[icon=done] { - color: rgb(0, 128, 0); + color: var(--google-green-500); } paper-button { @@ -41,7 +41,7 @@ } paper-button[toggles][active] { - background-color: LightGray; + background-color: var(--paper-grey-300); } span ~ a { @@ -52,9 +52,8 @@ [is='action-link']:active, [is='action-link']:hover, [is='action-link']:visited, - paper-button.primary-button { - /* TODO(dbeam): change all other colors in this file into --google or - * --paper where applicable. */ + paper-button.primary-button, + paper-button.tertiary-button { color: var(--google-blue-700); } @@ -74,7 +73,7 @@ paper-button.secondary-button { --paper-button: { - color: #5a5a5a; + color: var(--paper-grey-700); text-decoration: none; font-weight: 500; }; @@ -82,7 +81,6 @@ paper-button.tertiary-button { --paper-button: { - color: rgb(51, 103, 214); font-weight: 400; text-decoration: none; }; @@ -91,7 +89,7 @@ paper-radio-button { --paper-radio-button-checked-color: var(--google-blue-500); --paper-radio-button-label-spacing: 18px; - --paper-radio-button-unchecked-color: #969696; + --paper-radio-button-unchecked-color: var(--paper-grey-500); -webkit-margin-start: 2px; } @@ -137,9 +135,8 @@ /* This button has no ink ripple */ .list-item.list-button { @apply(--layout-center); - color: rgb(66, 133, 244); + color: var(--google-blue-500); font-weight: 500; - text-decoration: none; } .list-item iron-icon { @@ -172,10 +169,6 @@ font-weight: 500; } - .settings-card { - padding: 8px 0; - } - .settings-box { @apply(--layout-center); border-top: 1px solid var(--paper-grey-300);
diff --git a/chrome/browser/safe_browsing/local_database_manager.h b/chrome/browser/safe_browsing/local_database_manager.h index d5c06e5..c190d15 100644 --- a/chrome/browser/safe_browsing/local_database_manager.h +++ b/chrome/browser/safe_browsing/local_database_manager.h
@@ -72,7 +72,7 @@ // initialized to be empty strings. std::vector<GURL> urls; std::vector<SBThreatType> url_results; - std::vector<std::string> url_metadata; + std::vector<ThreatMetadata> url_metadata; std::vector<std::string> url_hit_hash; std::vector<SBFullHash> full_hashes; std::vector<SBThreatType> full_hash_results;
diff --git a/chrome/browser/safe_browsing/protocol_parser.cc b/chrome/browser/safe_browsing/protocol_parser.cc index 398426c..60e3304 100644 --- a/chrome/browser/safe_browsing/protocol_parser.cc +++ b/chrome/browser/safe_browsing/protocol_parser.cc
@@ -155,8 +155,9 @@ return false; if (full_hashes) { - (*full_hashes)[full_hashes->size() - hash_count + i].metadata.assign( - reinterpret_cast<const char*>(meta_data), meta_data_len); + (*full_hashes)[full_hashes->size() - hash_count + i] + .metadata.raw_metadata.assign( + reinterpret_cast<const char*>(meta_data), meta_data_len); } } return true;
diff --git a/chrome/browser/safe_browsing/protocol_parser_unittest.cc b/chrome/browser/safe_browsing/protocol_parser_unittest.cc index 069a283..c1f04db 100644 --- a/chrome/browser/safe_browsing/protocol_parser_unittest.cc +++ b/chrome/browser/safe_browsing/protocol_parser_unittest.cc
@@ -451,17 +451,17 @@ "zzzzyyyyxxxxwwwwvvvvuuuuttttssss", sizeof(SBFullHash)), 0); EXPECT_EQ(MALWARE, full_hashes[0].list_id); - EXPECT_EQ(std::string("ab"), full_hashes[0].metadata); + EXPECT_EQ(std::string("ab"), full_hashes[0].metadata.raw_metadata); EXPECT_EQ(memcmp(&full_hashes[1].hash, "00112233445566778899aabbccddeeff", sizeof(SBFullHash)), 0); EXPECT_EQ(MALWARE, full_hashes[1].list_id); - EXPECT_EQ(std::string("xy"), full_hashes[1].metadata); + EXPECT_EQ(std::string("xy"), full_hashes[1].metadata.raw_metadata); EXPECT_EQ(memcmp(&full_hashes[2].hash, "cafebeefcafebeefdeaddeaddeaddead", sizeof(SBFullHash)), 0); EXPECT_EQ(PHISH, full_hashes[2].list_id); - EXPECT_EQ(std::string(), full_hashes[2].metadata); + EXPECT_EQ(std::string(), full_hashes[2].metadata.raw_metadata); } TEST(SafeBrowsingProtocolParsingTest, TestGetHashWithUnknownList) { @@ -519,7 +519,7 @@ "0123456789hashhashhashhashhashha", sizeof(SBFullHash)), 0); EXPECT_EQ(MALWARE, full_hashes[0].list_id); - EXPECT_EQ(std::string(), full_hashes[0].metadata); + EXPECT_EQ(std::string(), full_hashes[0].metadata.raw_metadata); } TEST(SafeBrowsingProtocolParsingTest, TestFormatHash) {
diff --git a/chrome/browser/safe_browsing/safe_browsing_service_browsertest.cc b/chrome/browser/safe_browsing/safe_browsing_service_browsertest.cc index 8807d149..3d56a35 100644 --- a/chrome/browser/safe_browsing/safe_browsing_service_browsertest.cc +++ b/chrome/browser/safe_browsing/safe_browsing_service_browsertest.cc
@@ -705,15 +705,15 @@ MalwarePatternType proto; switch (GetParam()) { case METADATA_NONE: - full_hash->metadata = std::string(); + full_hash->metadata.raw_metadata = std::string(); break; case METADATA_LANDING: proto.set_pattern_type(MalwarePatternType::LANDING); - full_hash->metadata = proto.SerializeAsString(); + full_hash->metadata.raw_metadata = proto.SerializeAsString(); break; case METADATA_DISTRIBUTION: proto.set_pattern_type(MalwarePatternType::DISTRIBUTION); - full_hash->metadata = proto.SerializeAsString(); + full_hash->metadata.raw_metadata = proto.SerializeAsString(); break; } } @@ -1219,7 +1219,7 @@ // Called when the result of checking a browse URL is known. void OnCheckBrowseUrlResult(const GURL& /* url */, SBThreatType threat_type, - const std::string& /* metadata */) override { + const ThreatMetadata& /* metadata */) override { threat_type_ = threat_type; BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, base::Bind(&TestSBClient::CheckDone, this));
diff --git a/chrome/browser/safe_browsing/safe_browsing_test.cc b/chrome/browser/safe_browsing/safe_browsing_test.cc index 50b81e85..71542db 100644 --- a/chrome/browser/safe_browsing/safe_browsing_test.cc +++ b/chrome/browser/safe_browsing/safe_browsing_test.cc
@@ -355,7 +355,7 @@ // Callbacks for SafeBrowsingDatabaseManager::Client. void OnCheckBrowseUrlResult(const GURL& url, SBThreatType threat_type, - const std::string& metadata) override { + const ThreatMetadata& metadata) override { EXPECT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::IO)); EXPECT_TRUE(safe_browsing_test_->is_checked_url_in_db()); safe_browsing_test_->set_is_checked_url_safe(
diff --git a/chrome/browser/safe_browsing/ui_manager.cc b/chrome/browser/safe_browsing/ui_manager.cc index a8eda2d8..faebd87 100644 --- a/chrome/browser/safe_browsing/ui_manager.cc +++ b/chrome/browser/safe_browsing/ui_manager.cc
@@ -155,11 +155,13 @@ // applied to malware sites tagged as "landing sites" (see "Types of // Malware sites" under // https://developers.google.com/safe-browsing/developers_guide_v3#UserWarnings). + // TODO(nparker): Replace the use of raw_metadata when other fields are + // populated. crbug/589610 MalwarePatternType proto; if (resource.threat_type == SB_THREAT_TYPE_URL_UNWANTED || (resource.threat_type == SB_THREAT_TYPE_URL_MALWARE && - !resource.threat_metadata.empty() && - proto.ParseFromString(resource.threat_metadata) && + !resource.threat_metadata.raw_metadata.empty() && + proto.ParseFromString(resource.threat_metadata.raw_metadata) && proto.pattern_type() == MalwarePatternType::LANDING)) { if (!resource.callback.is_null()) { DCHECK(resource.callback_thread);
diff --git a/chrome/browser/safe_browsing/ui_manager.h b/chrome/browser/safe_browsing/ui_manager.h index 66a3b37e..8938c1d 100644 --- a/chrome/browser/safe_browsing/ui_manager.h +++ b/chrome/browser/safe_browsing/ui_manager.h
@@ -78,7 +78,7 @@ bool is_subresource; bool is_subframe; SBThreatType threat_type; - std::string threat_metadata; + ThreatMetadata threat_metadata; UrlCheckCallback callback; // This is called back on |callback_thread|. scoped_refptr<base::SingleThreadTaskRunner> callback_thread; int render_process_host_id;
diff --git a/chrome/browser/signin/easy_unlock_service_regular.cc b/chrome/browser/signin/easy_unlock_service_regular.cc index 1d0af809..85e60da0 100644 --- a/chrome/browser/signin/easy_unlock_service_regular.cc +++ b/chrome/browser/signin/easy_unlock_service_regular.cc
@@ -163,11 +163,13 @@ // |profile| has to be a signed-in profile with SigninManager already // created. Otherwise, just crash to collect stack. DCHECK(signin_manager); - const std::string user_email = - signin_manager->GetAuthenticatedAccountInfo().email; - return user_email.empty() + const AccountInfo account_info = + signin_manager->GetAuthenticatedAccountInfo(); + return account_info.email.empty() ? EmptyAccountId() - : AccountId::FromUserEmail(gaia::CanonicalizeEmail(user_email)); + : AccountId::FromUserEmailGaiaId( + gaia::CanonicalizeEmail(account_info.email), + account_info.gaia); } void EasyUnlockServiceRegular::LaunchSetup() {
diff --git a/chrome/browser/signin/easy_unlock_service_signin_chromeos.cc b/chrome/browser/signin/easy_unlock_service_signin_chromeos.cc index 7868b69..3b93ac2 100644 --- a/chrome/browser/signin/easy_unlock_service_signin_chromeos.cc +++ b/chrome/browser/signin/easy_unlock_service_signin_chromeos.cc
@@ -338,8 +338,7 @@ // these // cases update the app state. Otherwise, it's enough to notify the app the // user data has been updated. - const bool should_update_app_state = - account_id_.is_valid() != account_id.is_valid(); + const bool should_update_app_state = (account_id_ != account_id); account_id_ = account_id; user_pod_last_focused_timestamp_ = base::TimeTicks::Now(); @@ -375,7 +374,7 @@ if (!base::SysInfo::IsRunningOnChromeOS()) return; - if (account_id_.is_valid() || !service_active_) + if (!account_id_.is_valid() || !service_active_) return; const auto it = user_data_.find(account_id_); @@ -467,7 +466,7 @@ const EasyUnlockServiceSignin::UserData* EasyUnlockServiceSignin::FindLoadedDataForCurrentUser() const { - if (account_id_.is_valid()) + if (!account_id_.is_valid()) return nullptr; const auto it = user_data_.find(account_id_);
diff --git a/chrome/browser/signin/easy_unlock_service_unittest_chromeos.cc b/chrome/browser/signin/easy_unlock_service_unittest_chromeos.cc index 118c2b2f..7305084 100644 --- a/chrome/browser/signin/easy_unlock_service_unittest_chromeos.cc +++ b/chrome/browser/signin/easy_unlock_service_unittest_chromeos.cc
@@ -45,7 +45,9 @@ // IDs for fake users used in tests. const char kTestUserPrimary[] = "primary_user@nowhere.com"; +const char kPrimaryGaiaId[] = "1111111111"; const char kTestUserSecondary[] = "secondary_user@nowhere.com"; +const char kSecondaryGaiaId[] = "2222222222"; // App manager to be used in EasyUnlockService tests. // This effectivelly abstracts the extension system from the tests. @@ -222,7 +224,8 @@ ON_CALL(*mock_user_manager_, IsCurrentUserNonCryptohomeDataEphemeral()) .WillByDefault(Return(false)); - SetUpProfile(&profile_, AccountId::FromUserEmail(kTestUserPrimary)); + SetUpProfile(&profile_, AccountId::FromUserEmailGaiaId( + kTestUserPrimary, kPrimaryGaiaId)); } void TearDown() override { @@ -267,7 +270,8 @@ void SetUpSecondaryProfile() { SetUpProfile(&secondary_profile_, - AccountId::FromUserEmail(kTestUserSecondary)); + AccountId::FromUserEmailGaiaId(kTestUserSecondary, + kSecondaryGaiaId)); } private: @@ -287,7 +291,7 @@ SigninManagerBase* signin_manager = SigninManagerFactory::GetForProfile(profile->get()); - signin_manager->SetAuthenticatedAccountInfo(account_id.GetUserEmail(), + signin_manager->SetAuthenticatedAccountInfo(account_id.GetGaiaId(), account_id.GetUserEmail()); } @@ -375,4 +379,14 @@ EasyUnlockAppInState(profile_.get(), TestAppManager::STATE_NOT_LOADED)); } +TEST_F(EasyUnlockServiceTest, GetAccountId) { + EXPECT_EQ(AccountId::FromUserEmailGaiaId(kTestUserPrimary, kPrimaryGaiaId), + EasyUnlockService::Get(profile_.get())->GetAccountId()); + + SetUpSecondaryProfile(); + EXPECT_EQ(AccountId::FromUserEmailGaiaId(kTestUserSecondary, + kSecondaryGaiaId), + EasyUnlockService::Get(secondary_profile_.get())->GetAccountId()); +} + } // namespace
diff --git a/chrome/browser/stack_sampling_configuration.cc b/chrome/browser/stack_sampling_configuration.cc index c5fc88b6..925b9596 100644 --- a/chrome/browser/stack_sampling_configuration.cc +++ b/chrome/browser/stack_sampling_configuration.cc
@@ -133,8 +133,8 @@ // Generate a configuration according to the associated weights. const Variation variations[] = { - { PROFILE_10HZ, 50}, - { PROFILE_CONTROL, 50}, + { PROFILE_10HZ, 100}, + { PROFILE_CONTROL, 0}, { PROFILE_DISABLED, 0} };
diff --git a/chrome/browser/translate/translate_manager_render_view_host_unittest.cc b/chrome/browser/translate/translate_manager_render_view_host_unittest.cc index c82f233..227389ec 100644 --- a/chrome/browser/translate/translate_manager_render_view_host_unittest.cc +++ b/chrome/browser/translate/translate_manager_render_view_host_unittest.cc
@@ -192,6 +192,31 @@ infobar->Translate(); } } + + translate::TranslateStep CurrentStep() { + if (bubble_factory_.get()) { + TranslateBubbleModel::ViewState view_state = + bubble_factory_->model()->GetViewState(); + switch (view_state) { + case TranslateBubbleModel::VIEW_STATE_BEFORE_TRANSLATE: + return translate::TRANSLATE_STEP_BEFORE_TRANSLATE; + case TranslateBubbleModel::VIEW_STATE_TRANSLATING: + return translate::TRANSLATE_STEP_TRANSLATING; + case TranslateBubbleModel::VIEW_STATE_AFTER_TRANSLATE: + return translate::TRANSLATE_STEP_AFTER_TRANSLATE; + case TranslateBubbleModel::VIEW_STATE_ERROR: + return translate::TRANSLATE_STEP_TRANSLATE_ERROR; + case TranslateBubbleModel::VIEW_STATE_ADVANCED: + NOTREACHED(); + break; + } + NOTREACHED(); + return translate::TRANSLATE_STEP_TRANSLATE_ERROR; + } else { + translate::TranslateInfoBarDelegate* infobar = GetTranslateInfoBar(); + return infobar->translate_step(); + } + } #endif // defined(USE_AURA) // Simulates navigating to a page and getting the page contents and language @@ -765,8 +790,7 @@ // Tests that we show/don't show an info-bar for the languages. TEST_F(TranslateManagerRenderViewHostTest, TestLanguages) { - // TODO(port): Test corresponding bubble translate UX: http://crbug.com/383235 - // This actually doesn't make sense to port, because the check for supported + // This only makes sense for infobars, because the check for supported // languages moved out of the Infobar into the TranslateManager. if (TranslateService::IsTranslateBubbleEnabled()) return; @@ -860,22 +884,20 @@ // Test that reloading the page brings back the infobar if the // reload succeeded and does not bring it back the reload fails. TEST_F(TranslateManagerRenderViewHostTest, Reload) { - // TODO(port): Test corresponding bubble translate UX: http://crbug.com/383235 - if (TranslateService::IsTranslateBubbleEnabled()) - return; + EnableBubbleTest(); SimulateNavigation(GURL("http://www.google.fr"), "fr", true); - EXPECT_TRUE(CloseTranslateInfoBar()); + EXPECT_TRUE(CloseTranslateUi()); // Reload should bring back the infobar if the reload succeeds. ReloadAndWait(true); - EXPECT_TRUE(GetTranslateInfoBar() != NULL); - EXPECT_TRUE(CloseTranslateInfoBar()); + EXPECT_TRUE(TranslateUiVisible()); + EXPECT_TRUE(CloseTranslateUi()); // ...But not show it if the reload fails. ReloadAndWait(false); - EXPECT_TRUE(GetTranslateInfoBar() == NULL); + EXPECT_FALSE(TranslateUiVisible()); // If we set reload attempts to a high value, we will not see the infobar // immediately. @@ -883,20 +905,18 @@ ->translate_driver() .set_translate_max_reload_attempts(100); ReloadAndWait(true); - EXPECT_TRUE(GetTranslateInfoBar() == NULL); + EXPECT_FALSE(TranslateUiVisible()); } // Test that reloading the page by way of typing again the URL in the // location bar brings back the infobar. TEST_F(TranslateManagerRenderViewHostTest, ReloadFromLocationBar) { - // TODO(port): Test corresponding bubble translate UX: http://crbug.com/383235 - if (TranslateService::IsTranslateBubbleEnabled()) - return; + EnableBubbleTest(); GURL url("http://www.google.fr"); SimulateNavigation(url, "fr", true); - EXPECT_TRUE(CloseTranslateInfoBar()); + EXPECT_TRUE(CloseTranslateUi()); // Create a pending navigation and simulate a page load. That should be the // equivalent of typing the URL again in the location bar. @@ -919,39 +939,39 @@ // The TranslateManager class processes the navigation entry committed // notification in a posted task; process that task. base::MessageLoop::current()->RunUntilIdle(); - EXPECT_TRUE(GetTranslateInfoBar() != NULL); + EXPECT_TRUE(CloseTranslateUi()); } // Tests that a closed translate infobar does not reappear when navigating // in-page. TEST_F(TranslateManagerRenderViewHostTest, CloseInfoBarInPageNavigation) { - // TODO(port): Test corresponding bubble translate UX: http://crbug.com/383235 - if (TranslateService::IsTranslateBubbleEnabled()) - return; + EnableBubbleTest(); SimulateNavigation(GURL("http://www.google.fr"), "fr", true); - EXPECT_TRUE(CloseTranslateInfoBar()); + EXPECT_TRUE(CloseTranslateUi()); // Navigate in page, no infobar should be shown. SimulateNavigation(GURL("http://www.google.fr/#ref1"), "fr", true); - EXPECT_TRUE(GetTranslateInfoBar() == NULL); + EXPECT_FALSE(TranslateUiVisible()); - // Navigate out of page, a new infobar should show. - SimulateNavigation(GURL("http://www.google.fr/foot"), "fr", true); - EXPECT_TRUE(GetTranslateInfoBar() != NULL); + // This is deliberately different behavior for bubbles - same language + // navigation does not show a bubble, ever. Blame ChromeTranslateClient. + if (!TranslateService::IsTranslateBubbleEnabled()) { + // Navigate out of page, a new infobar should show. + SimulateNavigation(GURL("http://www.google.fr/foot"), "fr", true); + EXPECT_TRUE(TranslateUiVisible()); + } } // Tests that a closed translate infobar does not reappear when navigating // in a subframe. (http://crbug.com/48215) TEST_F(TranslateManagerRenderViewHostTest, CloseInfoBarInSubframeNavigation) { - // TODO(port): Test corresponding bubble translate UX: http://crbug.com/383235 - if (TranslateService::IsTranslateBubbleEnabled()) - return; + EnableBubbleTest(); SimulateNavigation(GURL("http://www.google.fr"), "fr", true); - EXPECT_TRUE(CloseTranslateInfoBar()); + EXPECT_TRUE(CloseTranslateUi()); content::RenderFrameHostTester* subframe_tester = content::RenderFrameHostTester::For( @@ -961,23 +981,25 @@ // Simulate a sub-frame auto-navigating. subframe_tester->SendNavigateWithTransition( 0, 0, false, GURL("http://pub.com"), ui::PAGE_TRANSITION_AUTO_SUBFRAME); - EXPECT_TRUE(GetTranslateInfoBar() == NULL); + EXPECT_FALSE(TranslateUiVisible()); // Simulate the user navigating in a sub-frame. subframe_tester->SendNavigateWithTransition( 1, 0, true, GURL("http://pub.com"), ui::PAGE_TRANSITION_MANUAL_SUBFRAME); - EXPECT_TRUE(GetTranslateInfoBar() == NULL); + EXPECT_FALSE(TranslateUiVisible()); - // Navigate out of page, a new infobar should show. - SimulateNavigation(GURL("http://www.google.fr/foot"), "fr", true); - EXPECT_TRUE(GetTranslateInfoBar() != NULL); + // This is deliberately different behavior for bubbles - same language + // navigation does not show a bubble, ever. Blame ChromeTranslateClient. + if (!TranslateService::IsTranslateBubbleEnabled()) { + // Navigate out of page, a new infobar should show. + SimulateNavigation(GURL("http://www.google.fr/foot"), "fr", true); + EXPECT_TRUE(TranslateUiVisible()); + } } // Tests that denying translation is sticky when navigating in page. TEST_F(TranslateManagerRenderViewHostTest, DenyTranslateInPageNavigation) { - // TODO(port): Test corresponding bubble translate UX: http://crbug.com/383235 - if (TranslateService::IsTranslateBubbleEnabled()) - return; + EnableBubbleTest(); SimulateNavigation(GURL("http://www.google.fr"), "fr", true); @@ -986,101 +1008,94 @@ // Navigate in page, no infobar should be shown. SimulateNavigation(GURL("http://www.google.fr/#ref1"), "fr", true); - EXPECT_TRUE(GetTranslateInfoBar() == NULL); + EXPECT_FALSE(TranslateUiVisible()); - // Navigate out of page, a new infobar should show. + // Navigate out of page, a new infobar should show. (Infobar only). SimulateNavigation(GURL("http://www.google.fr/foot"), "fr", true); - EXPECT_TRUE(GetTranslateInfoBar() != NULL); + EXPECT_NE(TranslateService::IsTranslateBubbleEnabled(), TranslateUiVisible()); } // Tests that after translating and closing the infobar, the infobar does not // return when navigating in page. TEST_F(TranslateManagerRenderViewHostTest, TranslateCloseInfoBarInPageNavigation) { - // TODO(port): Test corresponding bubble translate UX: http://crbug.com/383235 - if (TranslateService::IsTranslateBubbleEnabled()) - return; + EnableBubbleTest(); SimulateNavigation(GURL("http://www.google.fr"), "fr", true); // Simulate the user translating. - translate::TranslateInfoBarDelegate* infobar = GetTranslateInfoBar(); - ASSERT_TRUE(infobar != NULL); - infobar->Translate(); + SimulateTranslatePress(); + // Simulate the translate script being retrieved. SimulateTranslateScriptURLFetch(true); SimulateOnPageTranslated("fr", "en"); - EXPECT_TRUE(CloseTranslateInfoBar()); + EXPECT_TRUE(CloseTranslateUi()); // Navigate in page, no infobar should be shown. SimulateNavigation(GURL("http://www.google.fr/#ref1"), "fr", true); - EXPECT_TRUE(GetTranslateInfoBar() == NULL); + EXPECT_FALSE(TranslateUiVisible()); // Navigate out of page, a new infobar should show. // Note that we navigate to a page in a different language so we don't trigger // the auto-translate feature (it would translate the page automatically and // the before translate infobar would not be shown). SimulateNavigation(GURL("http://www.google.de"), "de", true); - EXPECT_TRUE(GetTranslateInfoBar() != NULL); + EXPECT_TRUE(TranslateUiVisible()); } // Tests that the after translate the infobar still shows when navigating // in-page. TEST_F(TranslateManagerRenderViewHostTest, TranslateInPageNavigation) { - // TODO(port): Test corresponding bubble translate UX: http://crbug.com/383235 - if (TranslateService::IsTranslateBubbleEnabled()) - return; + EnableBubbleTest(); SimulateNavigation(GURL("http://www.google.fr"), "fr", true); // Simulate the user translating. - translate::TranslateInfoBarDelegate* infobar = GetTranslateInfoBar(); - ASSERT_TRUE(infobar != NULL); - infobar->Translate(); + SimulateTranslatePress(); SimulateTranslateScriptURLFetch(true); SimulateOnPageTranslated("fr", "en"); - // The after translate infobar is showing. - infobar = GetTranslateInfoBar(); - ASSERT_TRUE(infobar != NULL); + // The after translate UI is showing. + EXPECT_TRUE(TranslateUiVisible()); + + // Remember infobar, so removal can be verified. + translate::TranslateInfoBarDelegate* infobar = nullptr; + if (!TranslateService::IsTranslateBubbleEnabled()) + infobar = GetTranslateInfoBar(); // Navigate out of page, a new infobar should show. // See note in TranslateCloseInfoBarInPageNavigation test on why it is // important to navigate to a page in a different language for this test. SimulateNavigation(GURL("http://www.google.de"), "de", true); - // The old infobar is gone. - EXPECT_TRUE(CheckInfoBarRemovedAndReset(infobar)); + // The old infobar is gone. Can't verify this for bubbles. + // Also, does not apply - existing bubbles are reused. + if (!TranslateService::IsTranslateBubbleEnabled()) + EXPECT_TRUE(CheckInfoBarRemovedAndReset(infobar)); // And there is a new one. - EXPECT_TRUE(GetTranslateInfoBar() != NULL); + EXPECT_TRUE(TranslateUiVisible()); } // Tests that no translate infobar is shown when navigating to a page in an // unsupported language. TEST_F(TranslateManagerRenderViewHostTest, CLDReportsUnsupportedPageLanguage) { - // TODO(port): Test corresponding bubble translate UX: http://crbug.com/383235 - if (TranslateService::IsTranslateBubbleEnabled()) - return; + EnableBubbleTest(); // Simulate navigating to a page and getting an unsupported language. SimulateNavigation(GURL("http://www.google.com"), "qbz", true); // No info-bar should be shown. - EXPECT_TRUE(GetTranslateInfoBar() == NULL); + EXPECT_FALSE(TranslateUiVisible()); } // Tests that we deal correctly with unsupported languages returned by the // server. // The translation server might return a language we don't support. TEST_F(TranslateManagerRenderViewHostTest, ServerReportsUnsupportedLanguage) { - // TODO(port): Test corresponding bubble translate UX: http://crbug.com/383235 - if (TranslateService::IsTranslateBubbleEnabled()) - return; + EnableBubbleTest(); SimulateNavigation(GURL("http://mail.google.fr"), "fr", true); - translate::TranslateInfoBarDelegate* infobar = GetTranslateInfoBar(); - ASSERT_TRUE(infobar != NULL); process()->sink().ClearMessages(); - infobar->Translate(); + SimulateTranslatePress(); SimulateTranslateScriptURLFetch(true); // Simulate the render notifying the translation has been done, but it // reports a language we don't support. @@ -1088,22 +1103,26 @@ // An error infobar should be showing to report that we don't support this // language. - infobar = GetTranslateInfoBar(); - ASSERT_TRUE(infobar != NULL); - EXPECT_EQ(translate::TRANSLATE_STEP_TRANSLATE_ERROR, - infobar->translate_step()); + EXPECT_EQ(translate::TRANSLATE_STEP_TRANSLATE_ERROR, CurrentStep()); // This infobar should have a button (so the string should not be empty). - ASSERT_FALSE(infobar->GetMessageInfoBarButtonText().empty()); + // The error string on bubbles is currently not retrievable. + // TODO(http://crbug.com/589301): OSX does not have an error view (yet). + if (!TranslateService::IsTranslateBubbleEnabled()) { + translate::TranslateInfoBarDelegate* infobar = GetTranslateInfoBar(); + ASSERT_TRUE(infobar); + ASSERT_FALSE(infobar->GetMessageInfoBarButtonText().empty()); - // Pressing the button on that infobar should revert to the original language. - process()->sink().ClearMessages(); - infobar->MessageInfoBarButtonPressed(); - const IPC::Message* message = process()->sink().GetFirstMessageMatching( - ChromeFrameMsg_RevertTranslation::ID); - EXPECT_TRUE(message != NULL); - // And it should have removed the infobar. - EXPECT_TRUE(GetTranslateInfoBar() == NULL); + // Pressing the button on that infobar should revert to the original + // language. + process()->sink().ClearMessages(); + infobar->MessageInfoBarButtonPressed(); + const IPC::Message* message = process()->sink().GetFirstMessageMatching( + ChromeFrameMsg_RevertTranslation::ID); + EXPECT_TRUE(message != NULL); + // And it should have removed the infobar. + EXPECT_TRUE(GetTranslateInfoBar() == NULL); + } } // Tests that no translate infobar is shown and context menu is disabled, when
diff --git a/chrome/browser/ui/android/bluetooth_chooser_android.cc b/chrome/browser/ui/android/bluetooth_chooser_android.cc index 1b5567df..5631e64 100644 --- a/chrome/browser/ui/android/bluetooth_chooser_android.cc +++ b/chrome/browser/ui/android/bluetooth_chooser_android.cc
@@ -62,9 +62,12 @@ } void BluetoothChooserAndroid::SetAdapterPresence(AdapterPresence presence) { + JNIEnv* env = AttachCurrentThread(); if (presence != AdapterPresence::POWERED_ON) { - Java_BluetoothChooserDialog_notifyAdapterTurnedOff(AttachCurrentThread(), - java_dialog_.obj()); + Java_BluetoothChooserDialog_notifyAdapterTurnedOff(env, java_dialog_.obj()); + } else { + Java_BluetoothChooserDialog_notifyAdapterTurnedOn(env, java_dialog_.obj()); + RestartSearch(); } } @@ -127,11 +130,15 @@ NOTREACHED(); } -void BluetoothChooserAndroid::RestartSearch(JNIEnv* env, - const JavaParamRef<jobject>& obj) { +void BluetoothChooserAndroid::RestartSearch() { event_handler_.Run(Event::RESCAN, ""); } +void BluetoothChooserAndroid::RestartSearch(JNIEnv*, + const JavaParamRef<jobject>&) { + RestartSearch(); +} + void BluetoothChooserAndroid::ShowBluetoothOverviewLink( JNIEnv* env, const JavaParamRef<jobject>& obj) {
diff --git a/chrome/browser/ui/android/bluetooth_chooser_android.h b/chrome/browser/ui/android/bluetooth_chooser_android.h index fc77e636c..0af0b1a 100644 --- a/chrome/browser/ui/android/bluetooth_chooser_android.h +++ b/chrome/browser/ui/android/bluetooth_chooser_android.h
@@ -37,8 +37,9 @@ const base::android::JavaParamRef<jstring>& device_id); // Notify bluetooth stack that the search needs to be re-issued. - void RestartSearch(JNIEnv* env, - const base::android::JavaParamRef<jobject>& obj); + void RestartSearch(); + // Calls RestartSearch(). Unused JNI parameters enable calls from Java. + void RestartSearch(JNIEnv*, const base::android::JavaParamRef<jobject>&); void ShowBluetoothOverviewLink( JNIEnv* env,
diff --git a/chrome/browser/ui/app_list/app_context_menu_unittest.cc b/chrome/browser/ui/app_list/app_context_menu_unittest.cc index de2a179a..5b9e081f 100644 --- a/chrome/browser/ui/app_list/app_context_menu_unittest.cc +++ b/chrome/browser/ui/app_list/app_context_menu_unittest.cc
@@ -14,14 +14,30 @@ #include "chrome/browser/ui/app_list/app_context_menu_delegate.h" #include "chrome/browser/ui/app_list/app_list_controller_delegate.h" #include "chrome/browser/ui/app_list/app_list_test_util.h" +#include "chrome/browser/ui/app_list/chrome_app_list_item.h" #include "chrome/browser/ui/app_list/extension_app_context_menu.h" #include "chrome/browser/ui/app_list/test/test_app_list_controller_delegate.h" #include "chrome/test/base/testing_profile.h" #include "components/keyed_service/core/keyed_service.h" #include "testing/gtest/include/gtest/gtest.h" + +#if defined(OS_CHROMEOS) +#include "chrome/browser/ui/app_list/arc/arc_app_item.h" +#include "chrome/browser/ui/app_list/arc/arc_app_list_prefs.h" +#include "components/arc/arc_bridge_service.h" +#include "components/arc/test/fake_app_instance.h" +#include "components/arc/test/fake_arc_bridge_service.h" +#endif + namespace { +#if defined(OS_CHROMEOS) +const char kArcFakeAppName[] = "ArcFakeApp"; +const char kArcFakeAppActivity[] = "arc.fake.app.activity"; +const char kArcFakeAppPackage[] = "arc.fake.app"; +#endif + class FakeAppContextMenuDelegate : public app_list::AppContextMenuDelegate { public: FakeAppContextMenuDelegate() = default; @@ -93,6 +109,8 @@ profile(), MenuManagerFactory); controller_.reset(new FakeAppListControllerDelegate()); menu_delegate_.reset(new FakeAppContextMenuDelegate()); + ChromeAppListItem::OverrideAppListControllerDelegateForTesting( + controller()); } void TearDown() override { @@ -141,6 +159,24 @@ EXPECT_EQ(state_index, states.size()); } +#if defined(OS_CHROMEOS) + void CreateArcBridge() { + arc_bridge_service_.reset(new arc::FakeArcBridgeService()); + arc_app_instance_.reset( + new arc::FakeAppInstance(ArcAppListPrefs::Get(profile()))); + arc::AppInstancePtr instance; + arc_app_instance_->Bind(mojo::GetProxy(&instance)); + arc_bridge_service_->OnAppInstanceReady(std::move(instance)); + arc_app_instance_->WaitForOnAppInstanceReady(); + + arc_fake_app_.name = kArcFakeAppName; + arc_fake_app_.package_name = kArcFakeAppPackage; + arc_fake_app_.activity = kArcFakeAppActivity; + + arc_bridge_service_->SetReady(); + } +#endif + FakeAppListControllerDelegate* controller() { return controller_.get(); } @@ -153,6 +189,16 @@ return profile_.get(); } +#if defined(OS_CHROMEOS) + arc::FakeAppInstance* arc_app_instance() { + return arc_app_instance_.get(); + } + + const arc::AppInfo& arc_fake_app() const { + return arc_fake_app_; + } +#endif + void AddSeparator(std::vector<MenuState>& states) { if (states.empty() || states.back().command_id == -1) return; @@ -268,6 +314,11 @@ scoped_ptr<KeyedService> menu_manager_; scoped_ptr<FakeAppListControllerDelegate> controller_; scoped_ptr<FakeAppContextMenuDelegate> menu_delegate_; +#if defined(OS_CHROMEOS) + arc::AppInfo arc_fake_app_; + scoped_ptr<arc::FakeArcBridgeService> arc_bridge_service_; + scoped_ptr<arc::FakeAppInstance> arc_app_instance_; +#endif DISALLOW_COPY_AND_ASSIGN(AppContextMenuTest); }; @@ -326,3 +377,63 @@ ui::MenuModel* menu_model = menu.GetMenuModel(); EXPECT_EQ(nullptr, menu_model); } + +#if defined(OS_CHROMEOS) +TEST_F(AppContextMenuTest, ArcMenu) { + CreateArcBridge(); + + const std::string app_id = ArcAppListPrefs::GetAppId( + kArcFakeAppPackage, kArcFakeAppActivity); + controller()->SetAppPinnable(app_id, + AppListControllerDelegate::PIN_EDITABLE); + + ArcAppListPrefs* prefs = ArcAppListPrefs::Get(profile_.get()); + ASSERT_NE(nullptr, prefs); + + std::vector<arc::AppInfo> fake_apps; + fake_apps.push_back(arc_fake_app()); + arc_app_instance()->RefreshAppList(); + arc_app_instance()->SendRefreshAppList(fake_apps); + + ArcAppItem item(profile(), nullptr, app_id, std::string(), true); + + ui::MenuModel* menu = item.GetContextMenuModel(); + ASSERT_NE(nullptr, menu); + + ASSERT_EQ(3, menu->GetItemCount()); + EXPECT_EQ(app_list::AppContextMenu::LAUNCH_NEW, menu->GetCommandIdAt(0)); + EXPECT_EQ(true, menu->IsEnabledAt(0)); + EXPECT_EQ(false, menu->IsItemCheckedAt(0)); + EXPECT_EQ(-1, menu->GetCommandIdAt(1)); // separator + EXPECT_EQ(app_list::AppContextMenu::TOGGLE_PIN, menu->GetCommandIdAt(2)); + EXPECT_EQ(true, menu->IsEnabledAt(2)); + EXPECT_EQ(false, menu->IsItemCheckedAt(2)); + + // Test activate request. + EXPECT_EQ(0u, arc_app_instance()->launch_requests(). + size()); + + menu->ActivatedAt(0); + arc_app_instance()->WaitForIncomingMethodCall(); + + const ScopedVector<arc::FakeAppInstance::Request>& launch_requests = + arc_app_instance()->launch_requests(); + ASSERT_EQ(1u, launch_requests.size()); + EXPECT_EQ(true, launch_requests[0]->IsForApp(arc_fake_app())); + + fake_apps.clear(); + arc_app_instance()->RefreshAppList(); + arc_app_instance()->SendRefreshAppList(fake_apps); + item.SetReady(false); + + EXPECT_EQ(item.GetContextMenuModel(), menu); + ASSERT_EQ(3, menu->GetItemCount()); + EXPECT_EQ(app_list::AppContextMenu::LAUNCH_NEW, menu->GetCommandIdAt(0)); + EXPECT_EQ(false, menu->IsEnabledAt(0)); + EXPECT_EQ(false, menu->IsItemCheckedAt(0)); + EXPECT_EQ(-1, menu->GetCommandIdAt(1)); // separator + EXPECT_EQ(app_list::AppContextMenu::TOGGLE_PIN, menu->GetCommandIdAt(2)); + EXPECT_EQ(true, menu->IsEnabledAt(2)); + EXPECT_EQ(false, menu->IsItemCheckedAt(2)); +} +#endif
diff --git a/chrome/browser/ui/app_list/arc/arc_app_context_menu.cc b/chrome/browser/ui/app_list/arc/arc_app_context_menu.cc new file mode 100644 index 0000000..08fdea000b --- /dev/null +++ b/chrome/browser/ui/app_list/arc/arc_app_context_menu.cc
@@ -0,0 +1,45 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/ui/app_list/arc/arc_app_context_menu.h" + +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/ui/app_list/app_context_menu_delegate.h" +#include "chrome/browser/ui/app_list/arc/arc_app_list_prefs.h" +#include "chrome/grit/generated_resources.h" + +ArcAppContextMenu::ArcAppContextMenu( + app_list::AppContextMenuDelegate* delegate, + Profile* profile, + const std::string& app_id, + AppListControllerDelegate* controller) + : app_list::AppContextMenu(delegate, profile, app_id, controller) { +} + +ArcAppContextMenu::~ArcAppContextMenu() { +} + +void ArcAppContextMenu::BuildMenu(ui::SimpleMenuModel* menu_model) { + menu_model->AddItemWithStringId(LAUNCH_NEW, + IDS_APP_CONTEXT_MENU_ACTIVATE_ARC); + menu_model->AddSeparator(ui::NORMAL_SEPARATOR); + // Create default items. + AppContextMenu::BuildMenu(menu_model); +} + +bool ArcAppContextMenu::IsCommandIdEnabled(int command_id) const { + if (command_id == LAUNCH_NEW) { + ArcAppListPrefs* arc_prefs = ArcAppListPrefs::Get(profile()); + scoped_ptr<ArcAppListPrefs::AppInfo> app_info = arc_prefs->GetApp(app_id()); + return app_info && app_info->ready; + } + return AppContextMenu::IsCommandIdEnabled(command_id); +} + +void ArcAppContextMenu::ExecuteCommand(int command_id, int event_flags) { + if (command_id == LAUNCH_NEW) + delegate()->ExecuteLaunchCommand(event_flags); + else + AppContextMenu::ExecuteCommand(command_id, event_flags); +}
diff --git a/chrome/browser/ui/app_list/arc/arc_app_context_menu.h b/chrome/browser/ui/app_list/arc/arc_app_context_menu.h new file mode 100644 index 0000000..7e7acbc --- /dev/null +++ b/chrome/browser/ui/app_list/arc/arc_app_context_menu.h
@@ -0,0 +1,39 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_UI_APP_LIST_ARC_ARC_APP_CONTEXT_MENU_H_ +#define CHROME_BROWSER_UI_APP_LIST_ARC_ARC_APP_CONTEXT_MENU_H_ + +#include <string> + +#include "base/macros.h" +#include "chrome/browser/ui/app_list/app_context_menu.h" + +class AppListControllerDelegate; +class Profile; + +namespace app_list { +class AppContextMenuDelegate; +} + +class ArcAppContextMenu : public app_list::AppContextMenu { + public: + ArcAppContextMenu(app_list::AppContextMenuDelegate* delegate, + Profile* profile, + const std::string& app_id, + AppListControllerDelegate* controller); + ~ArcAppContextMenu() override; + + // AppListContextMenu overrides: + void BuildMenu(ui::SimpleMenuModel* menu_model) override; + + // ui::SimpleMenuModel::Delegate overrides: + bool IsCommandIdEnabled(int command_id) const override; + void ExecuteCommand(int command_id, int event_flags) override; + + private: + DISALLOW_COPY_AND_ASSIGN(ArcAppContextMenu); +}; + +#endif // CHROME_BROWSER_UI_APP_LIST_ARC_ARC_APP_CONTEXT_MENU_H_
diff --git a/chrome/browser/ui/app_list/arc/arc_app_item.cc b/chrome/browser/ui/app_list/arc/arc_app_item.cc index b1f79d2..9740648ed2 100644 --- a/chrome/browser/ui/app_list/arc/arc_app_item.cc +++ b/chrome/browser/ui/app_list/arc/arc_app_item.cc
@@ -6,6 +6,7 @@ #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/app_list/app_list_controller_delegate.h" +#include "chrome/browser/ui/app_list/arc/arc_app_context_menu.h" #include "chrome/browser/ui/app_list/arc/arc_app_list_prefs.h" #include "components/arc/arc_bridge_service.h" #include "content/public/browser/browser_thread.h" @@ -79,6 +80,10 @@ GetController()->DismissView(); } +void ArcAppItem::ExecuteLaunchCommand(int event_flags) { + Activate(event_flags); +} + void ArcAppItem::SetReady(bool ready) { if (ready_ == ready) return; @@ -117,3 +122,13 @@ void ArcAppItem::OnIconUpdated(ArcAppIcon* icon) { UpdateIcon(); } + +ui::MenuModel* ArcAppItem::GetContextMenuModel() { + if (!context_menu_) { + context_menu_.reset(new ArcAppContextMenu(this, + profile(), + id(), + GetController())); + } + return context_menu_->GetMenuModel(); +}
diff --git a/chrome/browser/ui/app_list/arc/arc_app_item.h b/chrome/browser/ui/app_list/arc/arc_app_item.h index 246648b..ee6cde2 100644 --- a/chrome/browser/ui/app_list/arc/arc_app_item.h +++ b/chrome/browser/ui/app_list/arc/arc_app_item.h
@@ -8,15 +8,19 @@ #include <string> #include "base/macros.h" +#include "base/memory/scoped_vector.h" +#include "chrome/browser/ui/app_list/app_context_menu_delegate.h" #include "chrome/browser/ui/app_list/arc/arc_app_icon.h" #include "chrome/browser/ui/app_list/chrome_app_list_item.h" #include "ui/app_list/app_list_item.h" +class ArcAppContextMenu; class Profile; // ArcAppItem represents an ARC app in app list. class ArcAppItem : public ChromeAppListItem, - public ArcAppIcon::Observer { + public ArcAppIcon::Observer, + app_list::AppContextMenuDelegate { public: static const char kItemType[]; @@ -29,9 +33,14 @@ void SetName(const std::string& name); + // AppListItem overrides: void Activate(int event_flags) override; + ui::MenuModel* GetContextMenuModel() override; const char* GetItemType() const override; + // app_list::AppContextMenuDelegate overrides: + void ExecuteLaunchCommand(int event_flags) override; + ArcAppIcon* arc_app_icon() { return arc_app_icon_.get(); } bool ready() const { return ready_; } @@ -50,6 +59,7 @@ bool ready_; scoped_ptr<ArcAppIcon> arc_app_icon_; + scoped_ptr<ArcAppContextMenu> context_menu_; DISALLOW_COPY_AND_ASSIGN(ArcAppItem); };
diff --git a/chrome/browser/ui/bluetooth/bluetooth_chooser_bubble_delegate.cc b/chrome/browser/ui/bluetooth/bluetooth_chooser_bubble_controller.cc similarity index 64% rename from chrome/browser/ui/bluetooth/bluetooth_chooser_bubble_delegate.cc rename to chrome/browser/ui/bluetooth/bluetooth_chooser_bubble_controller.cc index 10ad62b..9e9e280 100644 --- a/chrome/browser/ui/bluetooth/bluetooth_chooser_bubble_delegate.cc +++ b/chrome/browser/ui/bluetooth/bluetooth_chooser_bubble_controller.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/ui/bluetooth/bluetooth_chooser_bubble_delegate.h" +#include "chrome/browser/ui/bluetooth/bluetooth_chooser_bubble_controller.h" #include "base/stl_util.h" #include "chrome/browser/ui/bluetooth/bluetooth_chooser_desktop.h" @@ -10,26 +10,26 @@ #include "components/bubble/bubble_controller.h" #include "url/gurl.h" -BluetoothChooserBubbleDelegate::BluetoothChooserBubbleDelegate( +BluetoothChooserBubbleController::BluetoothChooserBubbleController( content::RenderFrameHost* owner) - : ChooserBubbleDelegate(owner), bluetooth_chooser_(nullptr) {} + : ChooserBubbleController(owner), bluetooth_chooser_(nullptr) {} -BluetoothChooserBubbleDelegate::~BluetoothChooserBubbleDelegate() { +BluetoothChooserBubbleController::~BluetoothChooserBubbleController() { if (bluetooth_chooser_) - bluetooth_chooser_->set_bluetooth_chooser_bubble_delegate(nullptr); + bluetooth_chooser_->set_bluetooth_chooser_bubble_controller(nullptr); } -size_t BluetoothChooserBubbleDelegate::NumOptions() const { +size_t BluetoothChooserBubbleController::NumOptions() const { return device_names_and_ids_.size(); } -const base::string16& BluetoothChooserBubbleDelegate::GetOption( +const base::string16& BluetoothChooserBubbleController::GetOption( size_t index) const { DCHECK_LT(index, device_names_and_ids_.size()); return device_names_and_ids_[index].first; } -void BluetoothChooserBubbleDelegate::Select(size_t index) { +void BluetoothChooserBubbleController::Select(size_t index) { DCHECK_LT(index, device_names_and_ids_.size()); if (bluetooth_chooser_) { bluetooth_chooser_->CallEventHandler( @@ -37,32 +37,32 @@ device_names_and_ids_[index].second); } - if (bubble_controller_) - bubble_controller_->CloseBubble(BUBBLE_CLOSE_ACCEPTED); + if (bubble_reference_) + bubble_reference_->CloseBubble(BUBBLE_CLOSE_ACCEPTED); } -void BluetoothChooserBubbleDelegate::Cancel() { +void BluetoothChooserBubbleController::Cancel() { if (bluetooth_chooser_) { bluetooth_chooser_->CallEventHandler( content::BluetoothChooser::Event::CANCELLED, std::string()); } - if (bubble_controller_) - bubble_controller_->CloseBubble(BUBBLE_CLOSE_CANCELED); + if (bubble_reference_) + bubble_reference_->CloseBubble(BUBBLE_CLOSE_CANCELED); } -void BluetoothChooserBubbleDelegate::Close() { +void BluetoothChooserBubbleController::Close() { if (bluetooth_chooser_) { bluetooth_chooser_->CallEventHandler( content::BluetoothChooser::Event::CANCELLED, std::string()); } } -GURL BluetoothChooserBubbleDelegate::GetHelpCenterUrl() const { +GURL BluetoothChooserBubbleController::GetHelpCenterUrl() const { return GURL(chrome::kChooserBluetoothOverviewURL); } -void BluetoothChooserBubbleDelegate::AddDevice( +void BluetoothChooserBubbleController::AddDevice( const std::string& device_id, const base::string16& device_name) { device_names_and_ids_.push_back(std::make_pair(device_name, device_id)); @@ -70,7 +70,7 @@ observer()->OnOptionAdded(device_names_and_ids_.size() - 1); } -void BluetoothChooserBubbleDelegate::RemoveDevice( +void BluetoothChooserBubbleController::RemoveDevice( const std::string& device_id) { for (auto it = device_names_and_ids_.begin(); it != device_names_and_ids_.end(); ++it) {
diff --git a/chrome/browser/ui/bluetooth/bluetooth_chooser_bubble_delegate.h b/chrome/browser/ui/bluetooth/bluetooth_chooser_bubble_controller.h similarity index 64% rename from chrome/browser/ui/bluetooth/bluetooth_chooser_bubble_delegate.h rename to chrome/browser/ui/bluetooth/bluetooth_chooser_bubble_controller.h index 26d2455..f619e13c 100644 --- a/chrome/browser/ui/bluetooth/bluetooth_chooser_bubble_delegate.h +++ b/chrome/browser/ui/bluetooth/bluetooth_chooser_bubble_controller.h
@@ -2,27 +2,27 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_UI_BLUETOOTH_BLUETOOTH_CHOOSER_BUBBLE_DELEGATE_H_ -#define CHROME_BROWSER_UI_BLUETOOTH_BLUETOOTH_CHOOSER_BUBBLE_DELEGATE_H_ +#ifndef CHROME_BROWSER_UI_BLUETOOTH_BLUETOOTH_CHOOSER_BUBBLE_CONTROLLER_H_ +#define CHROME_BROWSER_UI_BLUETOOTH_BLUETOOTH_CHOOSER_BUBBLE_CONTROLLER_H_ #include <stddef.h> #include "base/macros.h" -#include "chrome/browser/ui/website_settings/chooser_bubble_delegate.h" +#include "chrome/browser/ui/website_settings/chooser_bubble_controller.h" #include "components/bubble/bubble_reference.h" class BluetoothChooserDesktop; -// BluetoothChooserBubbleDelegate is a chooser that presents a list of +// BluetoothChooserBubbleController is a chooser that presents a list of // Bluetooth device names, which come from |bluetooth_chooser_desktop_|. // It can be used by WebBluetooth API to get the user's permission to // access a Bluetooth device. -class BluetoothChooserBubbleDelegate : public ChooserBubbleDelegate { +class BluetoothChooserBubbleController : public ChooserBubbleController { public: - explicit BluetoothChooserBubbleDelegate(content::RenderFrameHost* owner); - ~BluetoothChooserBubbleDelegate() override; + explicit BluetoothChooserBubbleController(content::RenderFrameHost* owner); + ~BluetoothChooserBubbleController() override; - // ChooserBubbleDelegate: + // ChooserBubbleController: size_t NumOptions() const override; const base::string16& GetOption(size_t index) const override; void Select(size_t index) override; @@ -41,17 +41,17 @@ bluetooth_chooser_ = bluetooth_chooser; } - void set_bubble_controller(BubbleReference bubble_controller) { - bubble_controller_ = bubble_controller; + void set_bubble_reference(BubbleReference bubble_reference) { + bubble_reference_ = bubble_reference; } private: // Each pair is a (device name, device id). std::vector<std::pair<base::string16, std::string>> device_names_and_ids_; BluetoothChooserDesktop* bluetooth_chooser_; - BubbleReference bubble_controller_; + BubbleReference bubble_reference_; - DISALLOW_COPY_AND_ASSIGN(BluetoothChooserBubbleDelegate); + DISALLOW_COPY_AND_ASSIGN(BluetoothChooserBubbleController); }; -#endif // CHROME_BROWSER_UI_BLUETOOTH_BLUETOOTH_CHOOSER_BUBBLE_DELEGATE_H_ +#endif // CHROME_BROWSER_UI_BLUETOOTH_BLUETOOTH_CHOOSER_BUBBLE_CONTROLLER_H_
diff --git a/chrome/browser/ui/bluetooth/bluetooth_chooser_desktop.cc b/chrome/browser/ui/bluetooth/bluetooth_chooser_desktop.cc index 91bc638a..b014048c 100644 --- a/chrome/browser/ui/bluetooth/bluetooth_chooser_desktop.cc +++ b/chrome/browser/ui/bluetooth/bluetooth_chooser_desktop.cc
@@ -4,16 +4,16 @@ #include "chrome/browser/ui/bluetooth/bluetooth_chooser_desktop.h" -#include "chrome/browser/ui/bluetooth/bluetooth_chooser_bubble_delegate.h" +#include "chrome/browser/ui/bluetooth/bluetooth_chooser_bubble_controller.h" BluetoothChooserDesktop::BluetoothChooserDesktop( const content::BluetoothChooser::EventHandler& event_handler) : event_handler_(event_handler), - bluetooth_chooser_bubble_delegate_(nullptr) {} + bluetooth_chooser_bubble_controller_(nullptr) {} BluetoothChooserDesktop::~BluetoothChooserDesktop() { - if (bluetooth_chooser_bubble_delegate_) - bluetooth_chooser_bubble_delegate_->set_bluetooth_chooser(nullptr); + if (bluetooth_chooser_bubble_controller_) + bluetooth_chooser_bubble_controller_->set_bluetooth_chooser(nullptr); } void BluetoothChooserDesktop::SetAdapterPresence(AdapterPresence presence) {} @@ -22,13 +22,13 @@ void BluetoothChooserDesktop::AddDevice(const std::string& device_id, const base::string16& device_name) { - if (bluetooth_chooser_bubble_delegate_) - bluetooth_chooser_bubble_delegate_->AddDevice(device_id, device_name); + if (bluetooth_chooser_bubble_controller_) + bluetooth_chooser_bubble_controller_->AddDevice(device_id, device_name); } void BluetoothChooserDesktop::RemoveDevice(const std::string& device_id) { - if (bluetooth_chooser_bubble_delegate_) - bluetooth_chooser_bubble_delegate_->RemoveDevice(device_id); + if (bluetooth_chooser_bubble_controller_) + bluetooth_chooser_bubble_controller_->RemoveDevice(device_id); } void BluetoothChooserDesktop::CallEventHandler(
diff --git a/chrome/browser/ui/bluetooth/bluetooth_chooser_desktop.h b/chrome/browser/ui/bluetooth/bluetooth_chooser_desktop.h index 9809640..ccd28172 100644 --- a/chrome/browser/ui/bluetooth/bluetooth_chooser_desktop.h +++ b/chrome/browser/ui/bluetooth/bluetooth_chooser_desktop.h
@@ -8,7 +8,7 @@ #include "base/macros.h" #include "content/public/browser/bluetooth_chooser.h" -class BluetoothChooserBubbleDelegate; +class BluetoothChooserBubbleController; // Represents a Bluetooth chooser to ask the user to select a Bluetooth // device from a list of options. This implementation is for desktop. @@ -26,9 +26,9 @@ const base::string16& device_name) override; void RemoveDevice(const std::string& device_id) override; - void set_bluetooth_chooser_bubble_delegate( - BluetoothChooserBubbleDelegate* bluetooth_chooser_bubble_delegate) { - bluetooth_chooser_bubble_delegate_ = bluetooth_chooser_bubble_delegate; + void set_bluetooth_chooser_bubble_controller( + BluetoothChooserBubbleController* bluetooth_chooser_bubble_controller) { + bluetooth_chooser_bubble_controller_ = bluetooth_chooser_bubble_controller; } // Use this function to call event_handler_. @@ -37,7 +37,7 @@ private: content::BluetoothChooser::EventHandler event_handler_; - BluetoothChooserBubbleDelegate* bluetooth_chooser_bubble_delegate_; + BluetoothChooserBubbleController* bluetooth_chooser_bubble_controller_; DISALLOW_COPY_AND_ASSIGN(BluetoothChooserDesktop); };
diff --git a/chrome/browser/ui/browser.cc b/chrome/browser/ui/browser.cc index ca1fb51c..6f94a621 100644 --- a/chrome/browser/ui/browser.cc +++ b/chrome/browser/ui/browser.cc
@@ -87,7 +87,7 @@ #include "chrome/browser/translate/chrome_translate_client.h" #include "chrome/browser/ui/autofill/chrome_autofill_client.h" #include "chrome/browser/ui/blocked_content/popup_blocker_tab_helper.h" -#include "chrome/browser/ui/bluetooth/bluetooth_chooser_bubble_delegate.h" +#include "chrome/browser/ui/bluetooth/bluetooth_chooser_bubble_controller.h" #include "chrome/browser/ui/bluetooth/bluetooth_chooser_desktop.h" #include "chrome/browser/ui/bookmarks/bookmark_tab_helper.h" #include "chrome/browser/ui/bookmarks/bookmark_utils.h" @@ -1421,20 +1421,21 @@ const content::BluetoothChooser::EventHandler& event_handler) { scoped_ptr<BluetoothChooserDesktop> bluetooth_chooser_desktop( new BluetoothChooserDesktop(event_handler)); - scoped_ptr<BluetoothChooserBubbleDelegate> bubble_delegate( - new BluetoothChooserBubbleDelegate(frame)); - BluetoothChooserBubbleDelegate* bubble_delegate_ptr = bubble_delegate.get(); + scoped_ptr<BluetoothChooserBubbleController> bubble_controller( + new BluetoothChooserBubbleController(frame)); + BluetoothChooserBubbleController* bubble_controller_ptr = + bubble_controller.get(); - // Wire the ChooserBubbleDelegate to the BluetoothChooser. - bluetooth_chooser_desktop->set_bluetooth_chooser_bubble_delegate( - bubble_delegate_ptr); - bubble_delegate->set_bluetooth_chooser(bluetooth_chooser_desktop.get()); + // Wire the ChooserBubbleController to the BluetoothChooser. + bluetooth_chooser_desktop->set_bluetooth_chooser_bubble_controller( + bubble_controller_ptr); + bubble_controller->set_bluetooth_chooser(bluetooth_chooser_desktop.get()); Browser* browser = chrome::FindBrowserWithWebContents( WebContents::FromRenderFrameHost(frame)); - BubbleReference bubble_controller = - browser->GetBubbleManager()->ShowBubble(std::move(bubble_delegate)); - bubble_delegate_ptr->set_bubble_controller(bubble_controller); + BubbleReference bubble_reference = + browser->GetBubbleManager()->ShowBubble(std::move(bubble_controller)); + bubble_controller_ptr->set_bubble_reference(bubble_reference); return std::move(bluetooth_chooser_desktop); }
diff --git a/chrome/browser/ui/browser_browsertest.cc b/chrome/browser/ui/browser_browsertest.cc index da10776..5ae8bf8 100644 --- a/chrome/browser/ui/browser_browsertest.cc +++ b/chrome/browser/ui/browser_browsertest.cc
@@ -2099,7 +2099,12 @@ got_user_gesture_(false) { } - void DidGetUserGesture() override { got_user_gesture_ = true; } + void DidGetUserInteraction(const blink::WebInputEvent::Type type) override { + // We expect the only interaction here to be a browser-initiated navigation, + // which is sent with the Undefined event type. + EXPECT_EQ(blink::WebInputEvent::Undefined, type); + got_user_gesture_ = true; + } bool got_user_gesture() const { return got_user_gesture_;
diff --git a/chrome/browser/ui/cocoa/website_settings/chooser_bubble_ui_cocoa.h b/chrome/browser/ui/cocoa/website_settings/chooser_bubble_ui_cocoa.h index f742754..42323af 100644 --- a/chrome/browser/ui/cocoa/website_settings/chooser_bubble_ui_cocoa.h +++ b/chrome/browser/ui/cocoa/website_settings/chooser_bubble_ui_cocoa.h
@@ -8,21 +8,20 @@ #import <Cocoa/Cocoa.h> #include "base/macros.h" -#include "chrome/browser/ui/website_settings/chooser_bubble_delegate.h" +#include "chrome/browser/ui/website_settings/chooser_bubble_controller.h" #include "components/bubble/bubble_ui.h" class Browser; -class ChooserBubbleDelegate; @class ChooserBubbleUiController; // ChooserBubbleUiCocoa implements a chooser-based permission model. // It uses |NSTableView| to show a list of options for user to grant // permission. It can be used by the WebUSB or WebBluetooth APIs. class ChooserBubbleUiCocoa : public BubbleUi, - public ChooserBubbleDelegate::Observer { + public ChooserBubbleController::Observer { public: ChooserBubbleUiCocoa(Browser* browser, - ChooserBubbleDelegate* chooser_bubble_delegate); + ChooserBubbleController* chooser_bubble_controller); ~ChooserBubbleUiCocoa() override; // BubbleUi: @@ -30,7 +29,7 @@ void Close() override; void UpdateAnchorPosition() override; - // ChooserBubbleDelegate::Observer: + // ChooserBubbleController::Observer: void OnOptionsInitialized() override; void OnOptionAdded(size_t index) override; void OnOptionRemoved(size_t index) override; @@ -39,8 +38,8 @@ void OnBubbleClosing(); private: - Browser* browser_; // Weak. - ChooserBubbleDelegate* chooser_bubble_delegate_; // Weak. + Browser* browser_; // Weak. + ChooserBubbleController* chooser_bubble_controller_; // Weak. // Cocoa-side chooser bubble UI controller. Weak, as it will close itself. ChooserBubbleUiController* chooser_bubble_ui_controller_;
diff --git a/chrome/browser/ui/cocoa/website_settings/chooser_bubble_ui_cocoa.mm b/chrome/browser/ui/cocoa/website_settings/chooser_bubble_ui_cocoa.mm index 45e2349c..bfae5ba 100644 --- a/chrome/browser/ui/cocoa/website_settings/chooser_bubble_ui_cocoa.mm +++ b/chrome/browser/ui/cocoa/website_settings/chooser_bubble_ui_cocoa.mm
@@ -4,9 +4,10 @@ #import "chrome/browser/ui/cocoa/website_settings/chooser_bubble_ui_cocoa.h" +#include <stddef.h> + #include <algorithm> #include <cmath> -#include <vector> #include "base/mac/scoped_nsobject.h" #include "base/strings/sys_string_conversions.h" @@ -23,11 +24,14 @@ #import "chrome/browser/ui/cocoa/info_bubble_view.h" #import "chrome/browser/ui/cocoa/info_bubble_window.h" #import "chrome/browser/ui/cocoa/location_bar/location_bar_view_mac.h" -#include "chrome/browser/ui/website_settings/chooser_bubble_delegate.h" #include "chrome/grit/generated_resources.h" #include "content/public/browser/native_web_keyboard_event.h" +#include "skia/ext/skia_utils_mac.h" +#include "ui/base/cocoa/controls/hyperlink_text_view.h" #include "ui/base/cocoa/window_size_constants.h" +#include "ui/base/l10n/l10n_util.h" #include "ui/base/l10n/l10n_util_mac.h" +#include "url/gurl.h" namespace { @@ -35,7 +39,7 @@ const CGFloat kChooserBubbleWidth = 320.0f; // Chooser bubble height. -const CGFloat kChooserBubbleHeight = 220.0f; +const CGFloat kChooserBubbleHeight = 280.0f; // Distance between the bubble border and the view that is closest to the // border. @@ -46,10 +50,9 @@ const CGFloat kHorizontalPadding = 10.0f; const CGFloat kVerticalPadding = 10.0f; -const CGFloat kTitlePaddingX = 50.0f; -} +} // namespace -scoped_ptr<BubbleUi> ChooserBubbleDelegate::BuildBubbleUi() { +scoped_ptr<BubbleUi> ChooserBubbleController::BuildBubbleUi() { return make_scoped_ptr(new ChooserBubbleUiCocoa(browser_, this)); } @@ -65,16 +68,18 @@ base::scoped_nsobject<NSTableView> tableView_; base::scoped_nsobject<NSButton> connectButton_; base::scoped_nsobject<NSButton> cancelButton_; + base::scoped_nsobject<HyperlinkTextView> message_; bool buttonPressed_; - Browser* browser_; // Weak. - ChooserBubbleDelegate* chooserBubbleDelegate_; // Weak. + Browser* browser_; // Weak. + ChooserBubbleController* chooserBubbleController_; // Weak. } // Designated initializer. |browser| and |bridge| must both be non-nil. - (id)initWithBrowser:(Browser*)browser - initWithChooserBubbleDelegate:(ChooserBubbleDelegate*)chooserBubbleDelegate - bridge:(ChooserBubbleUiCocoa*)bridge; + initWithChooserBubbleController: + (ChooserBubbleController*)chooserBubbleController + bridge:(ChooserBubbleUiCocoa*)bridge; // Makes the bubble visible. - (void)show; @@ -121,6 +126,9 @@ // Creates the "Cancel" button. - (base::scoped_nsobject<NSButton>)cancelButton; +// Creates the help link. +- (base::scoped_nsobject<HyperlinkTextView>)message; + // Called when the "Connect" button is pressed. - (void)onConnect:(id)sender; @@ -132,14 +140,15 @@ @implementation ChooserBubbleUiController - (id)initWithBrowser:(Browser*)browser - initWithChooserBubbleDelegate:(ChooserBubbleDelegate*)chooserBubbleDelegate - bridge:(ChooserBubbleUiCocoa*)bridge { + initWithChooserBubbleController: + (ChooserBubbleController*)chooserBubbleController + bridge:(ChooserBubbleUiCocoa*)bridge { DCHECK(browser); - DCHECK(chooserBubbleDelegate); + DCHECK(chooserBubbleController); DCHECK(bridge); browser_ = browser; - chooserBubbleDelegate_ = chooserBubbleDelegate; + chooserBubbleController_ = chooserBubbleController; base::scoped_nsobject<InfoBubbleWindow> window([[InfoBubbleWindow alloc] initWithContentRect:ui::kWindowSizeDeterminedLater @@ -170,7 +179,7 @@ name:NSWindowDidMoveNotification object:nil]; if (!buttonPressed_) - chooserBubbleDelegate_->Close(); + chooserBubbleController_->Close(); bridge_->OnBubbleClosing(); [super windowWillClose:notification]; } @@ -201,7 +210,9 @@ // | | | | // | | | | // | -------------------------------- | - // | [ Connect] [ Cancel ] | + // | [ Connect ] [ Cancel ] | + // |----------------------------------| + // | Not seeing your device? Get help | // ------------------------------------ // Determine the dimensions of the bubble. @@ -213,28 +224,38 @@ // Create the views. // Title. titleView_ = [self bubbleTitle]; - CGFloat titleOriginX = kMarginX; CGFloat titleHeight = NSHeight([titleView_ frame]); - CGFloat titleOriginY = kChooserBubbleHeight - kMarginY - titleHeight; - [titleView_ setFrameOrigin:NSMakePoint(titleOriginX, titleOriginY)]; - [view addSubview:titleView_]; // Connect button. connectButton_ = [self connectButton]; - // Cancel button. - cancelButton_ = [self cancelButton]; CGFloat connectButtonWidth = NSWidth([connectButton_ frame]); CGFloat connectButtonHeight = NSHeight([connectButton_ frame]); + + // Cancel button. + cancelButton_ = [self cancelButton]; CGFloat cancelButtonWidth = NSWidth([cancelButton_ frame]); + // Message. + message_ = [self message]; + CGFloat messageHeight = NSHeight([message_ frame]); + + // Separator. + CGFloat separatorOriginX = 0.0f; + CGFloat separatorOriginY = kMarginY + messageHeight + kVerticalPadding; + NSBox* separator = + [self horizontalSeparatorWithFrame:NSMakeRect(separatorOriginX, + separatorOriginY, + kChooserBubbleWidth, 0.0f)]; + // ScollView embedding with TableView. CGFloat scrollViewWidth = kChooserBubbleWidth - 2 * kMarginX; CGFloat scrollViewHeight = kChooserBubbleHeight - 2 * kMarginY - - 2 * kVerticalPadding - titleHeight - - connectButtonHeight; - NSRect scrollFrame = - NSMakeRect(kMarginX, kMarginY + connectButtonHeight + kVerticalPadding, - scrollViewWidth, scrollViewHeight); + 4 * kVerticalPadding - titleHeight - + connectButtonHeight - messageHeight; + NSRect scrollFrame = NSMakeRect( + kMarginX, + kMarginY + messageHeight + 3 * kVerticalPadding + connectButtonHeight, + scrollViewWidth, scrollViewHeight); scrollView_.reset([[NSScrollView alloc] initWithFrame:scrollFrame]); [scrollView_ setBorderType:NSBezelBorder]; [scrollView_ setHasVerticalScroller:YES]; @@ -252,26 +273,45 @@ [tableView_ setHeaderView:nil]; [tableView_ setFocusRingType:NSFocusRingTypeNone]; + // Lay out the views. + // Title. + CGFloat titleOriginX = kMarginX; + CGFloat titleOriginY = kChooserBubbleHeight - kMarginY - titleHeight; + [titleView_ setFrameOrigin:NSMakePoint(titleOriginX, titleOriginY)]; + [view addSubview:titleView_]; + + // ScollView. [scrollView_ setDocumentView:tableView_]; [view addSubview:scrollView_]; - // Set connect button and cancel button to the right place. + // Connect button. CGFloat connectButtonOriginX = kChooserBubbleWidth - kMarginX - kHorizontalPadding - connectButtonWidth - cancelButtonWidth; - CGFloat connectButtonOriginY = kMarginY; + CGFloat connectButtonOriginY = + kMarginY + messageHeight + 2 * kVerticalPadding; [connectButton_ setFrameOrigin:NSMakePoint(connectButtonOriginX, connectButtonOriginY)]; [connectButton_ setEnabled:NO]; [view addSubview:connectButton_]; + // Cancel button. CGFloat cancelButtonOriginX = kChooserBubbleWidth - kMarginX - cancelButtonWidth; - CGFloat cancelButtonOriginY = kMarginY; + CGFloat cancelButtonOriginY = connectButtonOriginY; [cancelButton_ setFrameOrigin:NSMakePoint(cancelButtonOriginX, cancelButtonOriginY)]; [view addSubview:cancelButton_]; + // Separator. + [view addSubview:separator]; + + // Message. + CGFloat messageOriginX = kMarginX; + CGFloat messageOriginY = kMarginY; + [message_ setFrameOrigin:NSMakePoint(messageOriginX, messageOriginY)]; + [view addSubview:message_]; + bubbleFrame = [[self window] frameRectForContentRect:bubbleFrame]; if ([[self window] isVisible]) { // Unfortunately, calling -setFrame followed by -setFrameOrigin (called @@ -296,15 +336,16 @@ - (NSInteger)numberOfRowsInTableView:(NSTableView*)tableView { // When there are no devices, the table contains a message saying there are // no devices, so the number of rows is always at least 1. - return std::max(static_cast<NSInteger>(chooserBubbleDelegate_->NumOptions()), - static_cast<NSInteger>(1)); + return std::max( + static_cast<NSInteger>(chooserBubbleController_->NumOptions()), + static_cast<NSInteger>(1)); } - (id)tableView:(NSTableView*)tableView objectValueForTableColumn:(NSTableColumn*)tableColumn row:(NSInteger)rowIndex { NSInteger num_options = - static_cast<NSInteger>(chooserBubbleDelegate_->NumOptions()); + static_cast<NSInteger>(chooserBubbleController_->NumOptions()); if (num_options == 0) { DCHECK_EQ(0, rowIndex); return l10n_util::GetNSString(IDS_CHOOSER_BUBBLE_NO_DEVICES_FOUND_PROMPT); @@ -313,7 +354,7 @@ DCHECK_GE(rowIndex, 0); DCHECK_LT(rowIndex, num_options); return base::SysUTF16ToNSString( - chooserBubbleDelegate_->GetOption(static_cast<size_t>(rowIndex))); + chooserBubbleController_->GetOption(static_cast<size_t>(rowIndex))); } - (BOOL)tableView:(NSTableView*)aTableView @@ -341,7 +382,7 @@ } - (void)updateTableView { - [tableView_ setEnabled:chooserBubbleDelegate_->NumOptions() > 0]; + [tableView_ setEnabled:chooserBubbleController_->NumOptions() > 0]; [tableView_ reloadData]; } @@ -392,9 +433,6 @@ [titleView setStringValue:l10n_util::GetNSString(IDS_CHOOSER_BUBBLE_PROMPT)]; [titleView setFont:[NSFont systemFontOfSize:[NSFont systemFontSize]]]; [titleView sizeToFit]; - NSRect titleFrame = [titleView frame]; - [titleView setFrameSize:NSMakeSize(NSWidth(titleFrame) + kTitlePaddingX, - NSHeight(titleFrame))]; return titleView; } @@ -422,6 +460,42 @@ return [self buttonWithTitle:cancelTitle action:@selector(onCancel:)]; } +- (base::scoped_nsobject<HyperlinkTextView>)message { + base::scoped_nsobject<HyperlinkTextView> textView( + [[HyperlinkTextView alloc] initWithFrame:NSZeroRect]); + + base::string16 linkString = + l10n_util::GetStringUTF16(IDS_CHOOSER_BUBBLE_GET_HELP_LINK_TEXT); + + NSString* text = + l10n_util::GetNSStringF(IDS_CHOOSER_BUBBLE_FOOTNOTE_TEXT, linkString); + [textView setMessage:text + withFont:[NSFont systemFontOfSize:[NSFont systemFontSize]] + messageColor:[NSColor blackColor]]; + + NSColor* linkColor = + skia::SkColorToCalibratedNSColor(chrome_style::GetLinkColor()); + [textView + addLinkRange:NSMakeRange([text length] - linkString.size(), + linkString.size()) + withURL:base::SysUTF8ToNSString( + chooserBubbleController_->GetHelpCenterUrl().spec()) + linkColor:linkColor]; + + // Removes the underlining from the link. + NSTextStorage* textStorage = [textView textStorage]; + [textStorage addAttribute:NSUnderlineStyleAttributeName + value:@(NSUnderlineStyleNone) + range:NSMakeRange(0, [text length])]; + + [textView setVerticallyResizable:YES]; + [textView + setFrameSize:NSMakeSize(kChooserBubbleWidth - 2 * kMarginX, MAXFLOAT)]; + [textView sizeToFit]; + + return textView; +} + + (CGFloat)matchWidthsOf:(NSView*)viewA andOf:(NSView*)viewB { NSRect frameA = [viewA frame]; NSRect frameB = [viewB frame]; @@ -442,13 +516,13 @@ - (void)onConnect:(id)sender { buttonPressed_ = true; NSInteger row = [tableView_ selectedRow]; - chooserBubbleDelegate_->Select(row); + chooserBubbleController_->Select(row); [self close]; } - (void)onCancel:(id)sender { buttonPressed_ = true; - chooserBubbleDelegate_->Cancel(); + chooserBubbleController_->Cancel(); [self close]; } @@ -456,17 +530,17 @@ ChooserBubbleUiCocoa::ChooserBubbleUiCocoa( Browser* browser, - ChooserBubbleDelegate* chooser_bubble_delegate) + ChooserBubbleController* chooser_bubble_controller) : browser_(browser), - chooser_bubble_delegate_(chooser_bubble_delegate), + chooser_bubble_controller_(chooser_bubble_controller), chooser_bubble_ui_controller_(nil) { DCHECK(browser); - DCHECK(chooser_bubble_delegate); - chooser_bubble_delegate_->set_observer(this); + DCHECK(chooser_bubble_controller); + chooser_bubble_controller_->set_observer(this); } ChooserBubbleUiCocoa::~ChooserBubbleUiCocoa() { - chooser_bubble_delegate_->set_observer(nullptr); + chooser_bubble_controller_->set_observer(nullptr); [chooser_bubble_ui_controller_ close]; chooser_bubble_ui_controller_ = nil; } @@ -474,9 +548,9 @@ void ChooserBubbleUiCocoa::Show(BubbleReference bubble_reference) { if (!chooser_bubble_ui_controller_) { chooser_bubble_ui_controller_ = [[ChooserBubbleUiController alloc] - initWithBrowser:browser_ - initWithChooserBubbleDelegate:chooser_bubble_delegate_ - bridge:this]; + initWithBrowser:browser_ + initWithChooserBubbleController:chooser_bubble_controller_ + bridge:this]; } [chooser_bubble_ui_controller_ show];
diff --git a/chrome/browser/ui/libgtk2ui/native_theme_gtk2.cc b/chrome/browser/ui/libgtk2ui/native_theme_gtk2.cc index 371e13dd..d9dd353 100644 --- a/chrome/browser/ui/libgtk2ui/native_theme_gtk2.cc +++ b/chrome/browser/ui/libgtk2ui/native_theme_gtk2.cc
@@ -199,7 +199,7 @@ SkCanvas* canvas, State state, const gfx::Rect& rect, - const MenuListExtraParams& menu_list) const { + const MenuItemExtraParams& menu_item) const { SkColor color; SkPaint paint; switch (state) { @@ -217,6 +217,11 @@ NOTREACHED() << "Invalid state " << state; break; } + if (menu_item.corner_radius > 0) { + const SkScalar radius = SkIntToScalar(menu_item.corner_radius); + canvas->drawRoundRect(gfx::RectToSkRect(rect), radius, radius, paint); + return; + } canvas->drawRect(gfx::RectToSkRect(rect), paint); }
diff --git a/chrome/browser/ui/libgtk2ui/native_theme_gtk2.h b/chrome/browser/ui/libgtk2ui/native_theme_gtk2.h index ddb83eb..042a87e 100644 --- a/chrome/browser/ui/libgtk2ui/native_theme_gtk2.h +++ b/chrome/browser/ui/libgtk2ui/native_theme_gtk2.h
@@ -30,7 +30,7 @@ SkCanvas* canvas, State state, const gfx::Rect& rect, - const MenuListExtraParams& menu_list) const override; + const MenuItemExtraParams& menu_item) const override; // Gets a ChromeGtkFrame theme color; returns true on success. Always returns // false in GTK3.
diff --git a/chrome/browser/ui/passwords/manage_passwords_state.cc b/chrome/browser/ui/passwords/manage_passwords_state.cc index dc8657d..436aaec2 100644 --- a/chrome/browser/ui/passwords/manage_passwords_state.cc +++ b/chrome/browser/ui/passwords/manage_passwords_state.cc
@@ -40,6 +40,15 @@ return ret; } +void AddRawPtrFromOwningVector( + const std::vector<scoped_ptr<autofill::PasswordForm>>& owning_vector, + std::vector<const autofill::PasswordForm*>* destination) { + destination->reserve(destination->size() + owning_vector.size()); + for (const auto& owning_ptr : owning_vector) { + destination->push_back(owning_ptr.get()); + } +} + ScopedVector<const autofill::PasswordForm> DeepCopyMapToVector( const PasswordFormMap& password_form_map) { ScopedVector<const autofill::PasswordForm> ret; @@ -101,6 +110,8 @@ ClearData(); form_manager_ = std::move(form_manager); current_forms_weak_ = ScopedPtrMapToVector(form_manager_->best_matches()); + AddRawPtrFromOwningVector(form_manager_->federated_matches(), + ¤t_forms_weak_); origin_ = form_manager_->pending_credentials().origin; SetState(password_manager::ui::PENDING_PASSWORD_STATE); } @@ -110,6 +121,8 @@ ClearData(); form_manager_ = std::move(form_manager); current_forms_weak_ = ScopedPtrMapToVector(form_manager_->best_matches()); + AddRawPtrFromOwningVector(form_manager_->federated_matches(), + ¤t_forms_weak_); origin_ = form_manager_->pending_credentials().origin; SetState(password_manager::ui::PENDING_PASSWORD_UPDATE_STATE); } @@ -145,13 +158,16 @@ current_forms[form_manager_->pending_credentials().username_value] = &form_manager_->pending_credentials(); current_forms_weak_ = MapToVector(current_forms); + AddRawPtrFromOwningVector(form_manager_->federated_matches(), + ¤t_forms_weak_); origin_ = form_manager_->pending_credentials().origin; SetState(password_manager::ui::CONFIRMATION_STATE); } void ManagePasswordsState::OnPasswordAutofilled( const PasswordFormMap& password_form_map, - const GURL& origin) { + const GURL& origin, + const std::vector<scoped_ptr<autofill::PasswordForm>>* federated_matches) { DCHECK(!password_form_map.empty()); ClearData(); bool only_PSL_matches = @@ -167,6 +183,14 @@ SetState(password_manager::ui::INACTIVE_STATE); } else { local_credentials_forms_ = DeepCopyMapToVector(password_form_map); + if (federated_matches) { + local_credentials_forms_.reserve(local_credentials_forms_.size() + + federated_matches->size()); + for (const auto& owned_form : *federated_matches) { + local_credentials_forms_.push_back( + new autofill::PasswordForm(*owned_form)); + } + } origin_ = origin; SetState(password_manager::ui::MANAGE_STATE); }
diff --git a/chrome/browser/ui/passwords/manage_passwords_state.h b/chrome/browser/ui/passwords/manage_passwords_state.h index eed55be..4053a8c 100644 --- a/chrome/browser/ui/passwords/manage_passwords_state.h +++ b/chrome/browser/ui/passwords/manage_passwords_state.h
@@ -66,9 +66,12 @@ // Move to MANAGE_STATE or INACTIVE_STATE for PSL matched passwords. // |password_form_map| contains best matches from the password store for the // form which was autofilled, |origin| is an origin of the form which was - // autofilled. - void OnPasswordAutofilled(const autofill::PasswordFormMap& password_form_map, - const GURL& origin); + // autofilled. In addition, |federated_matches|, if not null, contains stored + // federated credentials to show to the user as well. + void OnPasswordAutofilled( + const autofill::PasswordFormMap& password_form_map, + const GURL& origin, + const std::vector<scoped_ptr<autofill::PasswordForm>>* federated_matches); // Move to INACTIVE_STATE. void OnInactive();
diff --git a/chrome/browser/ui/passwords/manage_passwords_state_unittest.cc b/chrome/browser/ui/passwords/manage_passwords_state_unittest.cc index 5fd7eea..ae17057 100644 --- a/chrome/browser/ui/passwords/manage_passwords_state_unittest.cc +++ b/chrome/browser/ui/passwords/manage_passwords_state_unittest.cc
@@ -15,6 +15,8 @@ #include "components/password_manager/core/common/credential_manager_types.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" +#include "url/gurl.h" +#include "url/origin.h" using ::testing::_; using ::testing::Contains; @@ -39,6 +41,13 @@ test_submitted_form_.username_value = base::ASCIIToUTF16("new one"); test_submitted_form_.password_value = base::ASCIIToUTF16("asdfjkl;"); + test_local_federated_form_ = test_local_form_; + test_local_federated_form_.federation_origin = + url::Origin(GURL("https://idp.com")); + test_local_federated_form_.password_value.clear(); + test_local_federated_form_.signon_realm = + "federation://example.com/accounts.com"; + test_federated_form_.origin = GURL("https://idp.com"); test_federated_form_.username_value = base::ASCIIToUTF16("username"); @@ -47,12 +56,20 @@ autofill::PasswordForm& test_local_form() { return test_local_form_; } autofill::PasswordForm& test_submitted_form() { return test_submitted_form_; } + autofill::PasswordForm& test_local_federated_form() { + return test_local_federated_form_; + } autofill::PasswordForm& test_federated_form() { return test_federated_form_; } ManagePasswordsState& passwords_data() { return passwords_data_; } // Returns a PasswordFormManager containing test_local_form() as a best match. scoped_ptr<password_manager::PasswordFormManager> CreateFormManager(); + // Returns a PasswordFormManager containing test_local_form() as a best match + // and test_federated_form() as a stored federated credential. + scoped_ptr<password_manager::PasswordFormManager> + CreateFormManagerWithFederation(); + // Pushes irrelevant updates to |passwords_data_| and checks that they don't // affect the state. void TestNoisyUpdates(); @@ -67,6 +84,10 @@ void(const password_manager::CredentialInfo&)); private: + // Implements both CreateFormManager and CreateFormManagerWithFederation. + scoped_ptr<password_manager::PasswordFormManager> CreateFormManagerInternal( + bool include_federated); + password_manager::StubPasswordManagerClient stub_client_; password_manager::StubPasswordManagerDriver driver_; password_manager::PasswordManager password_manager_; @@ -74,11 +95,22 @@ ManagePasswordsState passwords_data_; autofill::PasswordForm test_local_form_; autofill::PasswordForm test_submitted_form_; + autofill::PasswordForm test_local_federated_form_; autofill::PasswordForm test_federated_form_; }; scoped_ptr<password_manager::PasswordFormManager> ManagePasswordsStateTest::CreateFormManager() { + return CreateFormManagerInternal(false); +} + +scoped_ptr<password_manager::PasswordFormManager> +ManagePasswordsStateTest::CreateFormManagerWithFederation() { + return CreateFormManagerInternal(true); +} + +scoped_ptr<password_manager::PasswordFormManager> +ManagePasswordsStateTest::CreateFormManagerInternal(bool include_federated) { scoped_ptr<password_manager::PasswordFormManager> test_form_manager( new password_manager::PasswordFormManager( &password_manager_, &stub_client_, driver_.AsWeakPtr(), @@ -86,10 +118,20 @@ test_form_manager->SimulateFetchMatchingLoginsFromPasswordStore(); ScopedVector<autofill::PasswordForm> stored_forms; stored_forms.push_back(new autofill::PasswordForm(test_local_form())); + if (include_federated) { + stored_forms.push_back( + new autofill::PasswordForm(test_local_federated_form())); + } test_form_manager->OnGetPasswordStoreResults(std::move(stored_forms)); EXPECT_EQ(1u, test_form_manager->best_matches().size()); EXPECT_EQ(test_local_form(), *test_form_manager->best_matches().begin()->second); + EXPECT_EQ(include_federated ? 1u : 0u, + test_form_manager->federated_matches().size()); + if (include_federated) { + EXPECT_EQ(test_local_federated_form(), + *test_form_manager->federated_matches().front()); + } return test_form_manager; } @@ -262,6 +304,20 @@ TestAllUpdates(); } +TEST_F(ManagePasswordsStateTest, PasswordSubmittedFederationsPresent) { + scoped_ptr<password_manager::PasswordFormManager> test_form_manager( + CreateFormManagerWithFederation()); + test_form_manager->ProvisionallySave( + test_submitted_form(), + password_manager::PasswordFormManager::IGNORE_OTHER_POSSIBLE_USERNAMES); + passwords_data().OnPendingPassword(std::move(test_form_manager)); + + EXPECT_THAT(passwords_data().GetCurrentForms(), + UnorderedElementsAre(Pointee(test_local_form()), + Pointee(test_local_federated_form()))); + EXPECT_THAT(passwords_data().federated_credentials_forms(), IsEmpty()); +} + TEST_F(ManagePasswordsStateTest, OnRequestCredentials) { ScopedVector<autofill::PasswordForm> local_credentials; local_credentials.push_back(new autofill::PasswordForm(test_local_form())); @@ -344,13 +400,28 @@ TestAllUpdates(); } +TEST_F(ManagePasswordsStateTest, AutomaticPasswordSaveWithFederations) { + scoped_ptr<password_manager::PasswordFormManager> test_form_manager( + CreateFormManagerWithFederation()); + test_form_manager->ProvisionallySave( + test_submitted_form(), + password_manager::PasswordFormManager::IGNORE_OTHER_POSSIBLE_USERNAMES); + + passwords_data().OnAutomaticPasswordSave(std::move(test_form_manager)); + EXPECT_THAT(passwords_data().GetCurrentForms(), + UnorderedElementsAre(Pointee(test_local_form()), + Pointee(test_submitted_form()), + Pointee(test_local_federated_form()))); + EXPECT_THAT(passwords_data().federated_credentials_forms(), IsEmpty()); +} + TEST_F(ManagePasswordsStateTest, PasswordAutofilled) { autofill::PasswordFormMap password_form_map; password_form_map.insert(std::make_pair( test_local_form().username_value, make_scoped_ptr(new autofill::PasswordForm(test_local_form())))); GURL origin("https://example.com"); - passwords_data().OnPasswordAutofilled(password_form_map, origin); + passwords_data().OnPasswordAutofilled(password_form_map, origin, nullptr); EXPECT_THAT(passwords_data().GetCurrentForms(), ElementsAre(Pointee(test_local_form()))); @@ -364,6 +435,27 @@ TestAllUpdates(); } +TEST_F(ManagePasswordsStateTest, PasswordAutofillWithSavedFederations) { + autofill::PasswordFormMap password_form_map; + password_form_map.insert(std::make_pair( + test_local_form().username_value, + make_scoped_ptr(new autofill::PasswordForm(test_local_form())))); + GURL origin("https://example.com"); + std::vector<scoped_ptr<autofill::PasswordForm>> federated; + federated.push_back( + make_scoped_ptr(new autofill::PasswordForm(test_local_federated_form()))); + passwords_data().OnPasswordAutofilled(password_form_map, origin, &federated); + + // |federated| represents the locally saved federations. These are bundled in + // the "current forms". + EXPECT_THAT(passwords_data().GetCurrentForms(), + UnorderedElementsAre(Pointee(test_local_form()), + Pointee(test_local_federated_form()))); + // |federated_credentials_forms()| do not refer to the saved federations. + EXPECT_THAT(passwords_data().federated_credentials_forms(), IsEmpty()); + EXPECT_EQ(password_manager::ui::MANAGE_STATE, passwords_data().state()); +} + TEST_F(ManagePasswordsStateTest, ActiveOnMixedPSLAndNonPSLMatched) { autofill::PasswordFormMap password_form_map; password_form_map.insert(std::make_pair( @@ -375,7 +467,7 @@ psl_matched_test_form.username_value, make_scoped_ptr(new autofill::PasswordForm(psl_matched_test_form)))); GURL origin("https://example.com"); - passwords_data().OnPasswordAutofilled(password_form_map, origin); + passwords_data().OnPasswordAutofilled(password_form_map, origin, nullptr); EXPECT_THAT(passwords_data().GetCurrentForms(), ElementsAre(Pointee(test_local_form()))); @@ -396,8 +488,8 @@ password_form_map.insert(std::make_pair( psl_matched_test_form.username_value, make_scoped_ptr(new autofill::PasswordForm(psl_matched_test_form)))); - passwords_data().OnPasswordAutofilled(password_form_map, - GURL("https://m.example.com/")); + passwords_data().OnPasswordAutofilled( + password_form_map, GURL("https://m.example.com/"), nullptr); EXPECT_THAT(passwords_data().GetCurrentForms(), IsEmpty()); EXPECT_THAT(passwords_data().federated_credentials_forms(), IsEmpty()); @@ -481,7 +573,7 @@ test_local_form().username_value, make_scoped_ptr(new autofill::PasswordForm(test_local_form())))); passwords_data().OnPasswordAutofilled( - password_form_map, password_form_map.begin()->second->origin); + password_form_map, password_form_map.begin()->second->origin, nullptr); EXPECT_EQ(password_manager::ui::MANAGE_STATE, passwords_data().state()); TestBlacklistedUpdates(); @@ -520,6 +612,20 @@ TestAllUpdates(); } +TEST_F(ManagePasswordsStateTest, PasswordUpdateSubmittedWithFederations) { + scoped_ptr<password_manager::PasswordFormManager> test_form_manager( + CreateFormManagerWithFederation()); + test_form_manager->ProvisionallySave( + test_submitted_form(), + password_manager::PasswordFormManager::IGNORE_OTHER_POSSIBLE_USERNAMES); + passwords_data().OnUpdatePassword(std::move(test_form_manager)); + + EXPECT_THAT(passwords_data().GetCurrentForms(), + UnorderedElementsAre(Pointee(test_local_form()), + Pointee(test_local_federated_form()))); + EXPECT_THAT(passwords_data().federated_credentials_forms(), IsEmpty()); +} + TEST_F(ManagePasswordsStateTest, ChooseCredentialLocal) { passwords_data().OnRequestCredentials(ScopedVector<autofill::PasswordForm>(), ScopedVector<autofill::PasswordForm>(),
diff --git a/chrome/browser/ui/passwords/manage_passwords_test.cc b/chrome/browser/ui/passwords/manage_passwords_test.cc index 973c8c6..ce9efdd 100644 --- a/chrome/browser/ui/passwords/manage_passwords_test.cc +++ b/chrome/browser/ui/passwords/manage_passwords_test.cc
@@ -50,7 +50,8 @@ map.insert(std::make_pair( kTestUsername, make_scoped_ptr(new autofill::PasswordForm(*test_form())))); - GetController()->OnPasswordAutofilled(map, map.begin()->second->origin); + GetController()->OnPasswordAutofilled(map, map.begin()->second->origin, + nullptr); } void ManagePasswordsTest::SetupPendingPassword() {
diff --git a/chrome/browser/ui/passwords/manage_passwords_ui_controller.cc b/chrome/browser/ui/passwords/manage_passwords_ui_controller.cc index 270ad0d..92ab0eb 100644 --- a/chrome/browser/ui/passwords/manage_passwords_ui_controller.cc +++ b/chrome/browser/ui/passwords/manage_passwords_ui_controller.cc
@@ -147,8 +147,9 @@ } void ManagePasswordsUIController::OnPasswordAutofilled( - const PasswordFormMap& password_form_map, - const GURL& origin) { + const autofill::PasswordFormMap& password_form_map, + const GURL& origin, + const std::vector<scoped_ptr<autofill::PasswordForm>>* federated_matches) { // If we fill a form while a dialog is open, then skip the state change; we // have // the information we need, and the dialog will change its own state once the @@ -157,7 +158,8 @@ password_manager::ui::AUTO_SIGNIN_STATE && passwords_data_.state() != password_manager::ui::CREDENTIAL_REQUEST_STATE) { - passwords_data_.OnPasswordAutofilled(password_form_map, origin); + passwords_data_.OnPasswordAutofilled(password_form_map, origin, + federated_matches); UpdateBubbleAndIconVisibility(); } }
diff --git a/chrome/browser/ui/passwords/manage_passwords_ui_controller.h b/chrome/browser/ui/passwords/manage_passwords_ui_controller.h index d21cde2..5651cb59 100644 --- a/chrome/browser/ui/passwords/manage_passwords_ui_controller.h +++ b/chrome/browser/ui/passwords/manage_passwords_ui_controller.h
@@ -5,6 +5,8 @@ #ifndef CHROME_BROWSER_UI_PASSWORDS_MANAGE_PASSWORDS_UI_CONTROLLER_H_ #define CHROME_BROWSER_UI_PASSWORDS_MANAGE_PASSWORDS_UI_CONTROLLER_H_ +#include <vector> + #include "base/macros.h" #include "chrome/browser/ui/passwords/manage_passwords_state.h" #include "chrome/browser/ui/passwords/passwords_client_ui_delegate.h" @@ -56,8 +58,11 @@ void OnPromptEnableAutoSignin() override; void OnAutomaticPasswordSave( scoped_ptr<password_manager::PasswordFormManager> form_manager) override; - void OnPasswordAutofilled(const autofill::PasswordFormMap& password_form_map, - const GURL& origin) override; + void OnPasswordAutofilled( + const autofill::PasswordFormMap& password_form_map, + const GURL& origin, + const std::vector<scoped_ptr<autofill::PasswordForm>>* federated_matches) + override; // PasswordStore::Observer: void OnLoginsChanged(
diff --git a/chrome/browser/ui/passwords/manage_passwords_ui_controller_unittest.cc b/chrome/browser/ui/passwords/manage_passwords_ui_controller_unittest.cc index bd75b397..0c40ffc 100644 --- a/chrome/browser/ui/passwords/manage_passwords_ui_controller_unittest.cc +++ b/chrome/browser/ui/passwords/manage_passwords_ui_controller_unittest.cc
@@ -262,7 +262,7 @@ base::string16 kTestUsername = test_form->username_value; autofill::PasswordFormMap map; map.insert(std::make_pair(kTestUsername, std::move(test_form))); - controller()->OnPasswordAutofilled(map, map.begin()->second->origin); + controller()->OnPasswordAutofilled(map, map.begin()->second->origin, nullptr); EXPECT_EQ(password_manager::ui::MANAGE_STATE, controller()->GetState()); EXPECT_EQ(test_form_ptr->origin, controller()->GetOrigin()); @@ -440,7 +440,7 @@ map.insert(std::make_pair( kTestUsername, make_scoped_ptr(new autofill::PasswordForm(test_local_form())))); - controller()->OnPasswordAutofilled(map, map.begin()->second->origin); + controller()->OnPasswordAutofilled(map, map.begin()->second->origin, nullptr); test_local_form().blacklisted_by_user = true; password_manager::PasswordStoreChange change( @@ -633,7 +633,7 @@ const base::string16 kTestUsername = test_form->username_value; autofill::PasswordFormMap map; map.insert(std::make_pair(kTestUsername, std::move(test_form))); - controller()->OnPasswordAutofilled(map, test_form_ptr->origin); + controller()->OnPasswordAutofilled(map, test_form_ptr->origin, nullptr); EXPECT_EQ(password_manager::ui::MANAGE_STATE, controller()->GetState()); // Pop up the autosignin promo. The state should stay intact. @@ -675,7 +675,7 @@ autofill::PasswordFormMap map; base::string16 kTestUsername = test_form->username_value; map.insert(std::make_pair(kTestUsername, std::move(test_form))); - controller()->OnPasswordAutofilled(map, map.begin()->second->origin); + controller()->OnPasswordAutofilled(map, map.begin()->second->origin, nullptr); ExpectIconAndControllerStateIs(password_manager::ui::AUTO_SIGNIN_STATE); } @@ -687,7 +687,7 @@ new autofill::PasswordForm(test_local_form())); psl_matched_test_form->is_public_suffix_match = true; map.insert(std::make_pair(kTestUsername, std::move(psl_matched_test_form))); - controller()->OnPasswordAutofilled(map, map.begin()->second->origin); + controller()->OnPasswordAutofilled(map, map.begin()->second->origin, nullptr); EXPECT_EQ(password_manager::ui::INACTIVE_STATE, controller()->GetState()); }
diff --git a/chrome/browser/ui/passwords/passwords_client_ui_delegate.h b/chrome/browser/ui/passwords/passwords_client_ui_delegate.h index 495604c..cd9d7ef 100644 --- a/chrome/browser/ui/passwords/passwords_client_ui_delegate.h +++ b/chrome/browser/ui/passwords/passwords_client_ui_delegate.h
@@ -5,6 +5,8 @@ #ifndef CHROME_BROWSER_UI_PASSWORDS_PASSWORDS_CLIENT_UI_DELEGATE_H_ #define CHROME_BROWSER_UI_PASSWORDS_PASSWORDS_CLIENT_UI_DELEGATE_H_ +#include <vector> + #include "base/callback.h" #include "base/memory/scoped_ptr.h" #include "base/memory/scoped_vector.h" @@ -65,10 +67,13 @@ // Called when a form is autofilled with login information, so we can manage // password credentials for the current site which are stored in // |password_form_map|. This stores a copy of |password_form_map| and shows - // the manage password icon. + // the manage password icon. |federated_matches| contain the matching stored + // federated credentials to display in the UI. virtual void OnPasswordAutofilled( const autofill::PasswordFormMap& password_form_map, - const GURL& origin) = 0; + const GURL& origin, + const std::vector<scoped_ptr<autofill::PasswordForm>>* + federated_matches) = 0; protected: virtual ~PasswordsClientUIDelegate() = default;
diff --git a/chrome/browser/ui/tab_helpers.cc b/chrome/browser/ui/tab_helpers.cc index 97a1586..906defa 100644 --- a/chrome/browser/ui/tab_helpers.cc +++ b/chrome/browser/ui/tab_helpers.cc
@@ -53,6 +53,7 @@ #if BUILDFLAG(ANDROID_JAVA_UI) #include "chrome/browser/android/data_usage/data_use_tab_helper.h" +#include "chrome/browser/android/offline_pages/offline_page_tab_helper.h" #include "chrome/browser/android/voice_search_tab_helper.h" #include "chrome/browser/android/webapps/single_tab_mode_tab_helper.h" #include "chrome/browser/ui/android/context_menu_helper.h" @@ -179,6 +180,7 @@ #if BUILDFLAG(ANDROID_JAVA_UI) ContextMenuHelper::CreateForWebContents(web_contents); DataUseTabHelper::CreateForWebContents(web_contents); + offline_pages::OfflinePageTabHelper::CreateForWebContents(web_contents); SingleTabModeTabHelper::CreateForWebContents(web_contents); ViewAndroidHelper::CreateForWebContents(web_contents); VoiceSearchTabHelper::CreateForWebContents(web_contents);
diff --git a/chrome/browser/ui/translate/translate_bubble_view_state_transition.cc b/chrome/browser/ui/translate/translate_bubble_view_state_transition.cc index 9a7134b..4b0689e 100644 --- a/chrome/browser/ui/translate/translate_bubble_view_state_transition.cc +++ b/chrome/browser/ui/translate/translate_bubble_view_state_transition.cc
@@ -5,6 +5,21 @@ #include "chrome/browser/ui/translate/translate_bubble_view_state_transition.h" #include "base/logging.h" +#include "base/metrics/histogram_macros.h" + +namespace { + +enum TranslateBubbleUiEvent { + // Bubble enters the options state. + SET_STATE_OPTIONS = 1, + + // Bubble leaves the options state. + LEAVE_STATE_OPTIONS = 2, + + TRANSLATE_BUBBLE_UI_EVENT_MAX +}; + +} // namespace TranslateBubbleViewStateTransition::TranslateBubbleViewStateTransition( TranslateBubbleModel::ViewState view_state) @@ -19,9 +34,14 @@ view_state_ = view_state; if (view_state != TranslateBubbleModel::VIEW_STATE_ADVANCED) view_state_before_advanced_view_ = view_state; + else + UMA_HISTOGRAM_ENUMERATION("Translate.BubbleUiEvent", SET_STATE_OPTIONS, + TRANSLATE_BUBBLE_UI_EVENT_MAX); } void TranslateBubbleViewStateTransition::GoBackFromAdvanced() { DCHECK(view_state_ == TranslateBubbleModel::VIEW_STATE_ADVANCED); + UMA_HISTOGRAM_ENUMERATION("Translate.BubbleUiEvent", LEAVE_STATE_OPTIONS, + TRANSLATE_BUBBLE_UI_EVENT_MAX); SetViewState(view_state_before_advanced_view_); }
diff --git a/chrome/browser/ui/views/bookmarks/bookmark_bar_view.cc b/chrome/browser/ui/views/bookmarks/bookmark_bar_view.cc index 3954b1c..dc33320 100644 --- a/chrome/browser/ui/views/bookmarks/bookmark_bar_view.cc +++ b/chrome/browser/ui/views/bookmarks/bookmark_bar_view.cc
@@ -85,6 +85,7 @@ #include "ui/compositor/paint_recorder.h" #include "ui/gfx/animation/slide_animation.h" #include "ui/gfx/canvas.h" +#include "ui/gfx/color_utils.h" #include "ui/gfx/favicon_size.h" #include "ui/gfx/paint_vector_icon.h" #include "ui/gfx/scoped_canvas.h" @@ -92,6 +93,7 @@ #include "ui/gfx/text_elider.h" #include "ui/gfx/vector_icons_public.h" #include "ui/resources/grit/ui_resources.h" +#include "ui/views/animation/button_ink_drop_delegate.h" #include "ui/views/button_drag_utils.h" #include "ui/views/controls/button/label_button.h" #include "ui/views/controls/button/label_button_border.h" @@ -192,8 +194,10 @@ public: BookmarkButtonBase(views::ButtonListener* listener, const base::string16& title) - : LabelButton(listener, title) { + : LabelButton(listener, title), ink_drop_delegate_(this, this) { SetElideBehavior(kElideBehavior); + set_ink_drop_delegate(&ink_drop_delegate_); + set_has_ink_drop_action_on_click(true); show_animation_.reset(new gfx::SlideAnimation(this)); if (!animations_enabled) { // For some reason during testing the events generated by animating @@ -226,6 +230,9 @@ private: scoped_ptr<gfx::SlideAnimation> show_animation_; + // Controls the visual feedback for the button state. + views::ButtonInkDropDelegate ink_drop_delegate_; + DISALLOW_COPY_AND_ASSIGN(BookmarkButtonBase); }; @@ -1689,6 +1696,7 @@ SkColor color = GetThemeProvider()->GetColor(ThemeProperties::COLOR_BOOKMARK_TEXT); button->SetEnabledTextColors(color); + button->set_ink_drop_base_color(color_utils::DeriveDefaultIconColor(color)); if (node->is_folder()) { button->SetImage(views::Button::STATE_NORMAL, chrome::GetBookmarkFolderIcon(color));
diff --git a/chrome/browser/ui/views/frame/top_container_view.cc b/chrome/browser/ui/views/frame/top_container_view.cc index b1deab7..41df9d4 100644 --- a/chrome/browser/ui/views/frame/top_container_view.cc +++ b/chrome/browser/ui/views/frame/top_container_view.cc
@@ -22,14 +22,13 @@ void TopContainerView::PaintChildren(const ui::PaintContext& context) { if (browser_view_->immersive_mode_controller()->IsRevealed()) { - // Top-views depend on parts of the frame (themes, window title, - // window controls) being painted underneath them. Clip rect has already - // been set to the bounds of this view, so just paint the frame. - views::View* frame = browser_view_->frame()->GetFrameView(); - // Use a clone without invalidation info, as we're painting something - // outside of the normal parent-child relationship, so invalidations are - // no longer in the correct space to compare. - frame->Paint(ui::PaintContext( + // Top-views depend on parts of the frame (themes, window title, window + // controls) being painted underneath them. Clip rect has already been set + // to the bounds of this view, so just paint the frame. Use a clone without + // invalidation info, as we're painting something outside of the normal + // parent-child relationship, so invalidations are no longer in the correct + // space to compare. + browser_view_->frame()->GetFrameView()->Paint(ui::PaintContext( context, ui::PaintContext::CLONE_WITHOUT_INVALIDATION)); } View::PaintChildren(context);
diff --git a/chrome/browser/ui/views/ime/ime_window_view.h b/chrome/browser/ui/views/ime/ime_window_view.h index b33d2a0..631a30a 100644 --- a/chrome/browser/ui/views/ime/ime_window_view.h +++ b/chrome/browser/ui/views/ime/ime_window_view.h
@@ -64,7 +64,7 @@ void UpdateWindowIcon() override; bool IsVisible() const override; - // views::WidgetDelegate: + // views::WidgetDelegateView: views::View* GetContentsView() override; views::NonClientFrameView* CreateNonClientFrameView( views::Widget* widget) override; @@ -77,7 +77,6 @@ gfx::ImageSkia GetWindowIcon() override; void DeleteDelegate() override; - // views::View: ImeWindowFrameView* GetFrameView() const; views::Widget* window() const { return window_; } views::WebView* web_view() const { return web_view_; }
diff --git a/chrome/browser/ui/views/profiles/avatar_menu_button.cc b/chrome/browser/ui/views/profiles/avatar_menu_button.cc index c5d3f08b..67a7403d 100644 --- a/chrome/browser/ui/views/profiles/avatar_menu_button.cc +++ b/chrome/browser/ui/views/profiles/avatar_menu_button.cc
@@ -97,7 +97,7 @@ } // static -bool AvatarMenuButton::GetAvatarImages(BrowserView* browser_view, +bool AvatarMenuButton::GetAvatarImages(const BrowserView* browser_view, bool should_show_avatar_menu, gfx::Image* avatar, gfx::Image* taskbar_badge_avatar,
diff --git a/chrome/browser/ui/views/profiles/avatar_menu_button.h b/chrome/browser/ui/views/profiles/avatar_menu_button.h index 4b693ea..d3dcab31 100644 --- a/chrome/browser/ui/views/profiles/avatar_menu_button.h +++ b/chrome/browser/ui/views/profiles/avatar_menu_button.h
@@ -51,7 +51,7 @@ // |taskbar_badge_avatar| is empty then |avatar| should be used for the // taskbar as well. Returns false if the cache doesn't have an entry for a // Profile::REGULAR_PROFILE type Profile, otherwise return true. - static bool GetAvatarImages(BrowserView* browser_view, + static bool GetAvatarImages(const BrowserView* browser_view, bool should_show_avatar_menu, gfx::Image* avatar, gfx::Image* taskbar_badge_avatar,
diff --git a/chrome/browser/ui/views/profiles/new_avatar_button.cc b/chrome/browser/ui/views/profiles/new_avatar_button.cc index beef30e..577d14ea 100644 --- a/chrome/browser/ui/views/profiles/new_avatar_button.cc +++ b/chrome/browser/ui/views/profiles/new_avatar_button.cc
@@ -195,7 +195,7 @@ const bool use_generic_button = !profile_->IsGuestSession() && storage.GetNumberOfProfiles() == 1 && - storage.GetAllProfilesAttributes().front()->IsAuthenticated(); + !storage.GetAllProfilesAttributes().front()->IsAuthenticated(); SetText(use_generic_button ? base::string16()
diff --git a/chrome/browser/ui/views/tabs/tab.cc b/chrome/browser/ui/views/tabs/tab.cc index 893ffd4..98358d1 100644 --- a/chrome/browser/ui/views/tabs/tab.cc +++ b/chrome/browser/ui/views/tabs/tab.cc
@@ -1412,7 +1412,7 @@ canvas->sk_canvas()->clipRect( SkRect::MakeWH(width() * scale, height() * scale - 1)); } - paint.setARGB(0x40, 0x00, 0x00, 0x00); + paint.setColor(tp->GetColor(ThemeProperties::COLOR_TOOLBAR_TOP_SEPARATOR)); canvas->DrawPath(stroke, paint); } else { if (draw_hover) {
diff --git a/chrome/browser/ui/views/tabs/tab_strip.cc b/chrome/browser/ui/views/tabs/tab_strip.cc index 4348dd3..d3649cb 100644 --- a/chrome/browser/ui/views/tabs/tab_strip.cc +++ b/chrome/browser/ui/views/tabs/tab_strip.cc
@@ -138,7 +138,7 @@ GetLayoutConstant(TABSTRIP_NEW_TAB_BUTTON_OVERLAP); } -skia::RefPtr<SkDrawLooper> CreateShadowDrawLooper(SkAlpha alpha) { +skia::RefPtr<SkDrawLooper> CreateShadowDrawLooper(SkColor color) { SkLayerDrawLooper::Builder looper_builder; looper_builder.addLayer(); @@ -150,9 +150,8 @@ skia::RefPtr<SkMaskFilter> blur_mask = skia::AdoptRef(SkBlurMaskFilter::Create( kNormal_SkBlurStyle, 0.5, SkBlurMaskFilter::kHighQuality_BlurFlag)); - skia::RefPtr<SkColorFilter> color_filter = - skia::AdoptRef(SkColorFilter::CreateModeFilter( - SkColorSetA(SK_ColorBLACK, alpha), SkXfermode::kSrcIn_Mode)); + skia::RefPtr<SkColorFilter> color_filter = skia::AdoptRef( + SkColorFilter::CreateModeFilter(color, SkXfermode::kSrcIn_Mode)); SkPaint* layer_paint = looper_builder.addLayer(layer_info); layer_paint->setMaskFilter(blur_mask.get()); layer_paint->setColorFilter(color_filter.get()); @@ -381,6 +380,7 @@ const float scale = canvas->image_scale(); SkPath fill; + const ui::ThemeProvider* tp = GetThemeProvider(); if (ui::MaterialDesignController::IsModeMaterial()) { // Fill. const float fill_bottom = (visible_height - 2) * scale; @@ -416,13 +416,15 @@ // the shadow will be affected by the clip we set above. SkPaint paint; paint.setAntiAlias(true); - skia::RefPtr<SkDrawLooper> stroke_looper = CreateShadowDrawLooper(0x8C); + const SkColor stroke_color = + tp->GetColor(ThemeProperties::COLOR_TOOLBAR_TOP_SEPARATOR); + skia::RefPtr<SkDrawLooper> stroke_looper = + CreateShadowDrawLooper(SkColorSetA(stroke_color, 0x8C)); paint.setLooper(stroke_looper.get()); - paint.setColor(SkColorSetA(SK_ColorBLACK, pressed ? 0x38 : 0x27)); + paint.setColor(SkColorSetA(stroke_color, pressed ? 0x38 : 0x27)); canvas->DrawPath(stroke, paint); } else { // Fill. - const ui::ThemeProvider* tp = GetThemeProvider(); gfx::ImageSkia* mask = tp->GetImageSkiaNamed(IDR_NEWTAB_BUTTON_MASK); // The canvas and mask have to use the same scale factor. const float fill_canvas_scale = mask->HasRepresentation(scale) ? @@ -563,7 +565,10 @@ } else { paint.setColor(tp->GetColor(ThemeProperties::COLOR_BACKGROUND_TAB)); } - skia::RefPtr<SkDrawLooper> looper = CreateShadowDrawLooper(0x26); + const SkColor stroke_color = GetThemeProvider()->GetColor( + ThemeProperties::COLOR_TOOLBAR_TOP_SEPARATOR); + skia::RefPtr<SkDrawLooper> looper = + CreateShadowDrawLooper(SkColorSetA(stroke_color, 0x26)); paint.setLooper(looper.get()); canvas->DrawPath(fill, paint); }
diff --git a/chrome/browser/ui/views/toolbar/app_menu.cc b/chrome/browser/ui/views/toolbar/app_menu.cc index 916ebad..487e2c41 100644 --- a/chrome/browser/ui/views/toolbar/app_menu.cc +++ b/chrome/browser/ui/views/toolbar/app_menu.cc
@@ -46,6 +46,7 @@ #include "third_party/skia/include/core/SkPaint.h" #include "ui/base/l10n/l10n_util.h" #include "ui/base/layout.h" +#include "ui/base/material_design/material_design_controller.h" #include "ui/base/resource/resource_bundle.h" #include "ui/gfx/canvas.h" #include "ui/gfx/font_list.h" @@ -131,10 +132,20 @@ class InMenuButtonBackground : public views::Background { public: enum ButtonType { + // A rectangular button with no neighbor on the left. LEFT_BUTTON, + + // A rectangular button with neighbors on both sides. CENTER_BUTTON, + + // A rectangular button with no neighbor on the right. RIGHT_BUTTON, + + // A rectangular button that is not a member in a group. SINGLE_BUTTON, + + // A button with no group neighbors and a rounded background. + ROUNDED_BUTTON, }; explicit InMenuButtonBackground(ButtonType type) @@ -161,14 +172,15 @@ int h = view->height(); // Normal buttons get a border drawn on the right side and the rest gets - // filled in. The left button however does not get a line to combine - // buttons. - if (type_ != RIGHT_BUTTON) { + // filled in. The left or rounded buttons however do not get a line to + // combine buttons. + gfx::Rect bounds(view->GetLocalBounds()); + if (type_ != RIGHT_BUTTON && type_ != ROUNDED_BUTTON) { canvas->FillRect(gfx::Rect(0, 0, 1, h), BorderColor(view, views::Button::STATE_NORMAL)); + bounds.Inset(gfx::Insets(0, 1, 0, 0)); } - gfx::Rect bounds(view->GetLocalBounds()); bounds.set_x(view->GetMirroredXForRect(bounds)); DrawBackground(canvas, view, bounds, state); } @@ -213,11 +225,15 @@ views::Button::ButtonState state) const { if (state == views::Button::STATE_HOVERED || state == views::Button::STATE_PRESSED) { + ui::NativeTheme::ExtraParams params; + if (type_ == ROUNDED_BUTTON) { + // Consistent with a hover corner radius (kInkDropSmallCornerRadius). + const int kBackgroundCornerRadius = 2; + params.menu_item.corner_radius = kBackgroundCornerRadius; + } view->GetNativeTheme()->Paint(canvas->sk_canvas(), ui::NativeTheme::kMenuItemBackground, - ui::NativeTheme::kHovered, - bounds, - ui::NativeTheme::ExtraParams()); + ui::NativeTheme::kHovered, bounds, params); } } @@ -1137,11 +1153,21 @@ case IDC_EXTENSIONS_OVERFLOW_MENU: { scoped_ptr<ExtensionToolbarMenuView> extension_toolbar( new ExtensionToolbarMenuView(browser_, this)); - extension_toolbar_ = extension_toolbar.get(); - if (extension_toolbar->ShouldShow()) - item->AddChildView(extension_toolbar.release()); - else + if (!extension_toolbar->ShouldShow()) { item->SetVisible(false); + extension_toolbar_ = nullptr; + break; + } + if (ui::MaterialDesignController::IsModeMaterial()) { + for (int i = 0; i < extension_toolbar->contents()->child_count(); + ++i) { + View* action_view = extension_toolbar->contents()->child_at(i); + action_view->set_background(new InMenuButtonBackground( + InMenuButtonBackground::ROUNDED_BUTTON)); + } + } + extension_toolbar_ = extension_toolbar.get(); + item->AddChildView(extension_toolbar.release()); break; }
diff --git a/chrome/browser/ui/views/toolbar/toolbar_action_view.cc b/chrome/browser/ui/views/toolbar/toolbar_action_view.cc index 40e9ee8..37f5140 100644 --- a/chrome/browser/ui/views/toolbar/toolbar_action_view.cc +++ b/chrome/browser/ui/views/toolbar/toolbar_action_view.cc
@@ -126,6 +126,11 @@ ThemeProperties::COLOR_TOOLBAR_BUTTON_ICON); } +bool ToolbarActionView::ShouldShowInkDropHover() const { + return !delegate_->ShownInsideMenu() && + views::MenuButton::ShouldShowInkDropHover(); +} + content::WebContents* ToolbarActionView::GetCurrentWebContents() const { return delegate_->GetCurrentWebContents(); }
diff --git a/chrome/browser/ui/views/toolbar/toolbar_action_view.h b/chrome/browser/ui/views/toolbar/toolbar_action_view.h index 0524dec..08d2b61b 100644 --- a/chrome/browser/ui/views/toolbar/toolbar_action_view.h +++ b/chrome/browser/ui/views/toolbar/toolbar_action_view.h
@@ -79,6 +79,7 @@ void AddInkDropLayer(ui::Layer* ink_drop_layer) override; void RemoveInkDropLayer(ui::Layer* ink_drop_layer) override; SkColor GetInkDropBaseColor() const override; + bool ShouldShowInkDropHover() const override; // ToolbarActionViewDelegateViews: content::WebContents* GetCurrentWebContents() const override;
diff --git a/chrome/browser/ui/views/toolbar/toolbar_action_view_interactive_uitest.cc b/chrome/browser/ui/views/toolbar/toolbar_action_view_interactive_uitest.cc index 8c77e14..8a7e08103 100644 --- a/chrome/browser/ui/views/toolbar/toolbar_action_view_interactive_uitest.cc +++ b/chrome/browser/ui/views/toolbar/toolbar_action_view_interactive_uitest.cc
@@ -72,12 +72,8 @@ gfx::NativeWindow native_window = views::MenuController::GetActiveInstance()->owner()->GetNativeWindow(); - // Send two key down events followed by the return key. - // The two key down events target the toolbar action in the app menu. - // TODO(devlin): Shouldn't this be one key down event? - ui_controls::SendKeyPress(native_window, - ui::VKEY_DOWN, - false, false, false, false); + // Send a key down event followed by the return key. + // The key down event targets the toolbar action in the app menu. ui_controls::SendKeyPress(native_window, ui::VKEY_DOWN, false, false, false, false);
diff --git a/chrome/browser/ui/views/website_settings/chooser_bubble_ui_view.cc b/chrome/browser/ui/views/website_settings/chooser_bubble_ui_view.cc index b69e4c9..23a8991 100644 --- a/chrome/browser/ui/views/website_settings/chooser_bubble_ui_view.cc +++ b/chrome/browser/ui/views/website_settings/chooser_bubble_ui_view.cc
@@ -19,7 +19,7 @@ #include "chrome/browser/ui/views/frame/top_container_view.h" #include "chrome/browser/ui/views/location_bar/location_bar_view.h" #include "chrome/browser/ui/views/location_bar/location_icon_view.h" -#include "chrome/browser/ui/website_settings/chooser_bubble_delegate.h" +#include "chrome/browser/ui/website_settings/chooser_bubble_controller.h" #include "chrome/common/pref_names.h" #include "chrome/grit/generated_resources.h" #include "components/prefs/pref_service.h" @@ -52,7 +52,7 @@ } // namespace -scoped_ptr<BubbleUi> ChooserBubbleDelegate::BuildBubbleUi() { +scoped_ptr<BubbleUi> ChooserBubbleController::BuildBubbleUi() { return make_scoped_ptr(new ChooserBubbleUiView(browser_, this)); } @@ -68,7 +68,7 @@ ChooserBubbleUiViewDelegate(views::View* anchor_view, views::BubbleBorder::Arrow anchor_arrow, ChooserBubbleUiView* owner, - ChooserBubbleDelegate* chooser_bubble_delegate); + ChooserBubbleController* controller); ~ChooserBubbleUiViewDelegate() override; void Close(); @@ -98,7 +98,7 @@ friend ChooserBubbleUiView; ChooserBubbleUiView* owner_; - ChooserBubbleDelegate* chooser_bubble_delegate_; + ChooserBubbleController* controller_; views::LabelButton* connect_button_; views::TableView* table_view_; @@ -116,16 +116,16 @@ } class ChooserTableModel : public ui::TableModel, - public ChooserBubbleDelegate::Observer { + public ChooserBubbleController::Observer { public: - explicit ChooserTableModel(ChooserBubbleDelegate* chooser_bubble_delegate); + explicit ChooserTableModel(ChooserBubbleController* controller); // ui::TableModel: int RowCount() override; base::string16 GetText(int row, int column_id) override; void SetObserver(ui::TableModelObserver* observer) override; - // ChooserBubbleDelegate::Observer: + // ChooserBubbleController::Observer: void OnOptionsInitialized() override; void OnOptionAdded(size_t index) override; void OnOptionRemoved(size_t index) override; @@ -135,7 +135,7 @@ private: ui::TableModelObserver* observer_; - ChooserBubbleDelegate* chooser_bubble_delegate_; + ChooserBubbleController* controller_; views::LabelButton* connect_button_; }; @@ -143,10 +143,10 @@ views::View* anchor_view, views::BubbleBorder::Arrow anchor_arrow, ChooserBubbleUiView* owner, - ChooserBubbleDelegate* chooser_bubble_delegate) + ChooserBubbleController* controller) : views::BubbleDelegateView(anchor_view, anchor_arrow), owner_(owner), - chooser_bubble_delegate_(chooser_bubble_delegate), + controller_(controller), button_pressed_(false) { // TODO(juncai): try using DialogClientView to build the chooser UI view since // they look similar. @@ -178,13 +178,13 @@ std::vector<ui::TableColumn> table_columns; table_columns.push_back(ChooserTableColumn( 0, "" /* Empty string makes the column title invisible */)); - chooser_table_model_ = new ChooserTableModel(chooser_bubble_delegate_); + chooser_table_model_ = new ChooserTableModel(controller_); table_view_ = new views::TableView(chooser_table_model_, table_columns, views::TEXT_ONLY, true); table_view_->set_select_on_remove(false); chooser_table_model_->SetObserver(table_view_); table_view_->SetObserver(this); - table_view_->SetEnabled(chooser_bubble_delegate_->NumOptions() > 0); + table_view_->SetEnabled(controller_->NumOptions() > 0); layout->AddView(table_view_->CreateParentIfNecessary(), 1, 1, views::GridLayout::FILL, views::GridLayout::FILL, kChooserPermissionBubbleWidth, @@ -247,7 +247,7 @@ void ChooserBubbleUiViewDelegate::Close() { if (!button_pressed_) - chooser_bubble_delegate_->Close(); + controller_->Close(); owner_ = nullptr; GetWidget()->Close(); } @@ -273,9 +273,9 @@ button_pressed_ = true; if (button == connect_button_) - chooser_bubble_delegate_->Select(table_view_->selection_model().active()); + controller_->Select(table_view_->selection_model().active()); else - chooser_bubble_delegate_->Cancel(); + controller_->Cancel(); if (owner_) { owner_->Close(); @@ -287,7 +287,7 @@ views::StyledLabel* label, const gfx::Range& range, int event_flags) { - chooser_bubble_delegate_->OpenHelpCenterUrl(); + controller_->OpenHelpCenterUrl(); } void ChooserBubbleUiViewDelegate::OnSelectionChanged() { @@ -315,20 +315,19 @@ SetAnchorView(anchor_view); } -ChooserTableModel::ChooserTableModel( - ChooserBubbleDelegate* chooser_bubble_delegate) - : observer_(nullptr), chooser_bubble_delegate_(chooser_bubble_delegate) { - chooser_bubble_delegate_->set_observer(this); +ChooserTableModel::ChooserTableModel(ChooserBubbleController* controller) + : observer_(nullptr), controller_(controller) { + controller_->set_observer(this); } int ChooserTableModel::RowCount() { // When there are no devices, the table contains a message saying there // are no devices, so the number of rows is always at least 1. - return std::max(static_cast<int>(chooser_bubble_delegate_->NumOptions()), 1); + return std::max(static_cast<int>(controller_->NumOptions()), 1); } base::string16 ChooserTableModel::GetText(int row, int column_id) { - int num_options = static_cast<int>(chooser_bubble_delegate_->NumOptions()); + int num_options = static_cast<int>(controller_->NumOptions()); if (num_options == 0) { DCHECK_EQ(0, row); return l10n_util::GetStringUTF16( @@ -337,7 +336,7 @@ DCHECK_GE(row, 0); DCHECK_LT(row, num_options); - return chooser_bubble_delegate_->GetOption(static_cast<size_t>(row)); + return controller_->GetOption(static_cast<size_t>(row)); } void ChooserTableModel::SetObserver(ui::TableModelObserver* observer) { @@ -368,7 +367,7 @@ void ChooserTableModel::Update() { views::TableView* table_view = static_cast<views::TableView*>(observer_); - if (chooser_bubble_delegate_->NumOptions() == 0) { + if (controller_->NumOptions() == 0) { observer_->OnModelChanged(); table_view->SetEnabled(false); } else { @@ -383,21 +382,20 @@ ////////////////////////////////////////////////////////////////////////////// // ChooserBubbleUiView -ChooserBubbleUiView::ChooserBubbleUiView( - Browser* browser, - ChooserBubbleDelegate* chooser_bubble_delegate) +ChooserBubbleUiView::ChooserBubbleUiView(Browser* browser, + ChooserBubbleController* controller) : browser_(browser), - chooser_bubble_delegate_(chooser_bubble_delegate), + controller_(controller), chooser_bubble_ui_view_delegate_(nullptr) { DCHECK(browser_); - DCHECK(chooser_bubble_delegate_); + DCHECK(controller_); } ChooserBubbleUiView::~ChooserBubbleUiView() {} void ChooserBubbleUiView::Show(BubbleReference bubble_reference) { chooser_bubble_ui_view_delegate_ = new ChooserBubbleUiViewDelegate( - GetAnchorView(), GetAnchorArrow(), this, chooser_bubble_delegate_); + GetAnchorView(), GetAnchorArrow(), this, controller_); // Set |parent_window| because some valid anchors can become hidden. views::Widget* widget = views::Widget::GetWidgetForNativeWindow(
diff --git a/chrome/browser/ui/views/website_settings/chooser_bubble_ui_view.h b/chrome/browser/ui/views/website_settings/chooser_bubble_ui_view.h index 72a71b6..b3d7241d 100644 --- a/chrome/browser/ui/views/website_settings/chooser_bubble_ui_view.h +++ b/chrome/browser/ui/views/website_settings/chooser_bubble_ui_view.h
@@ -13,7 +13,7 @@ } class Browser; -class ChooserBubbleDelegate; +class ChooserBubbleController; class ChooserBubbleUiViewDelegate; // ChooserBubbleUiView implements a chooser-based permission model, @@ -21,8 +21,7 @@ // for user to grant permission. It can be used by WebUsb, WebBluetooth. class ChooserBubbleUiView : public BubbleUi { public: - ChooserBubbleUiView(Browser* browser, - ChooserBubbleDelegate* chooser_bubble_delegate); + ChooserBubbleUiView(Browser* browser, ChooserBubbleController* controller); ~ChooserBubbleUiView() override; // BubbleUi: @@ -36,7 +35,7 @@ views::BubbleBorder::Arrow GetAnchorArrow(); Browser* browser_; - ChooserBubbleDelegate* chooser_bubble_delegate_; + ChooserBubbleController* controller_; ChooserBubbleUiViewDelegate* chooser_bubble_ui_view_delegate_; };
diff --git a/chrome/browser/ui/website_settings/chooser_bubble_delegate.cc b/chrome/browser/ui/website_settings/chooser_bubble_controller.cc similarity index 62% rename from chrome/browser/ui/website_settings/chooser_bubble_delegate.cc rename to chrome/browser/ui/website_settings/chooser_bubble_controller.cc index 7622b5d..05113f0 100644 --- a/chrome/browser/ui/website_settings/chooser_bubble_delegate.cc +++ b/chrome/browser/ui/website_settings/chooser_bubble_controller.cc
@@ -2,28 +2,30 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include "chrome/browser/ui/website_settings/chooser_bubble_controller.h" + #include "chrome/browser/net/referrer.h" #include "chrome/browser/ui/browser_finder.h" -#include "chrome/browser/ui/website_settings/chooser_bubble_delegate.h" #include "content/public/browser/web_contents.h" -ChooserBubbleDelegate::ChooserBubbleDelegate(content::RenderFrameHost* owner) +ChooserBubbleController::ChooserBubbleController( + content::RenderFrameHost* owner) : browser_(chrome::FindBrowserWithWebContents( content::WebContents::FromRenderFrameHost(owner))), owning_frame_(owner) {} -ChooserBubbleDelegate::~ChooserBubbleDelegate() {} +ChooserBubbleController::~ChooserBubbleController() {} -void ChooserBubbleDelegate::OpenHelpCenterUrl() const { +void ChooserBubbleController::OpenHelpCenterUrl() const { browser_->OpenURL(content::OpenURLParams( GetHelpCenterUrl(), content::Referrer(), NEW_FOREGROUND_TAB, ui::PAGE_TRANSITION_AUTO_TOPLEVEL, false /* is_renderer_initiated */)); } -std::string ChooserBubbleDelegate::GetName() const { +std::string ChooserBubbleController::GetName() const { return "ChooserBubble"; } -const content::RenderFrameHost* ChooserBubbleDelegate::OwningFrame() const { +const content::RenderFrameHost* ChooserBubbleController::OwningFrame() const { return owning_frame_; }
diff --git a/chrome/browser/ui/website_settings/chooser_bubble_delegate.h b/chrome/browser/ui/website_settings/chooser_bubble_controller.h similarity index 82% rename from chrome/browser/ui/website_settings/chooser_bubble_delegate.h rename to chrome/browser/ui/website_settings/chooser_bubble_controller.h index 93afa892..238b57d 100644 --- a/chrome/browser/ui/website_settings/chooser_bubble_delegate.h +++ b/chrome/browser/ui/website_settings/chooser_bubble_controller.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_UI_WEBSITE_SETTINGS_CHOOSER_BUBBLE_DELEGATE_H_ -#define CHROME_BROWSER_UI_WEBSITE_SETTINGS_CHOOSER_BUBBLE_DELEGATE_H_ +#ifndef CHROME_BROWSER_UI_WEBSITE_SETTINGS_CHOOSER_BUBBLE_CONTROLLER_H_ +#define CHROME_BROWSER_UI_WEBSITE_SETTINGS_CHOOSER_BUBBLE_CONTROLLER_H_ #include <vector> @@ -14,7 +14,7 @@ class Browser; class GURL; -// Subclass ChooserBubbleDelegate to implement a chooser bubble, which has +// Subclass ChooserBubbleController to implement a chooser bubble, which has // some introductory text and a list of options that users can pick one of. // Create an instance of your subclass and pass it to // BubbleManager::ShowBubble() to show the bubble. Your subclass must define @@ -24,14 +24,10 @@ // collecting metrics. // After Select/Cancel/Close is called, this object is destroyed and call back // into it is not allowed. -// TODO(juncai): Change class name ChooserBubbleDelegate to -// ChooserBubbleController since it better reflects its responsibilities and -// clarifies the roles of this class. -// https://crbug.com/588933 -class ChooserBubbleDelegate : public BubbleDelegate { +class ChooserBubbleController : public BubbleDelegate { public: - explicit ChooserBubbleDelegate(content::RenderFrameHost* owner); - ~ChooserBubbleDelegate() override; + explicit ChooserBubbleController(content::RenderFrameHost* owner); + ~ChooserBubbleController() override; // Since the set of options can change while the UI is visible an // implementation should register an observer. @@ -97,7 +93,7 @@ const content::RenderFrameHost* const owning_frame_; Observer* observer_ = nullptr; - DISALLOW_COPY_AND_ASSIGN(ChooserBubbleDelegate); + DISALLOW_COPY_AND_ASSIGN(ChooserBubbleController); }; -#endif // CHROME_BROWSER_UI_WEBSITE_SETTINGS_CHOOSER_BUBBLE_DELEGATE_H_ +#endif // CHROME_BROWSER_UI_WEBSITE_SETTINGS_CHOOSER_BUBBLE_CONTROLLER_H_
diff --git a/chrome/browser/ui/webui/media_router/media_router_resources_provider.cc b/chrome/browser/ui/webui/media_router/media_router_resources_provider.cc index fb9c648..3124db0 100644 --- a/chrome/browser/ui/webui/media_router/media_router_resources_provider.cc +++ b/chrome/browser/ui/webui/media_router/media_router_resources_provider.cc
@@ -23,6 +23,9 @@ void AddPolymerElements(content::WebUIDataSource* html_source) { html_source->AddResourcePath( + "icons/media_router_icons.html", + IDR_MEDIA_ROUTER_ICONS_HTML); + html_source->AddResourcePath( "elements/issue_banner/issue_banner.css", IDR_ISSUE_BANNER_CSS); html_source->AddResourcePath(
diff --git a/chrome/browser/ui/webui/print_preview/print_preview_handler.cc b/chrome/browser/ui/webui/print_preview/print_preview_handler.cc index 240c3a0..10afc73 100644 --- a/chrome/browser/ui/webui/print_preview/print_preview_handler.cc +++ b/chrome/browser/ui/webui/print_preview/print_preview_handler.cc
@@ -1192,8 +1192,9 @@ printing::PrintViewManager* print_view_manager = printing::PrintViewManager::FromWebContents(initiator); - print_view_manager->set_observer(this); - print_view_manager->PrintForSystemDialogNow(); + print_view_manager->PrintForSystemDialogNow( + base::Bind(&PrintPreviewHandler::ClosePreviewDialog, + weak_factory_.GetWeakPtr())); // Cancel the pending preview request if exists. print_preview_ui()->OnCancelPendingPreviewRequest(); @@ -1386,10 +1387,6 @@ return dialog_controller->GetInitiator(preview_web_contents()); } -void PrintPreviewHandler::OnPrintDialogShown() { - ClosePreviewDialog(); -} - void PrintPreviewHandler::OnAddAccountToCookieCompleted( const std::string& account_id, const GoogleServiceAuthError& error) { @@ -1455,16 +1452,6 @@ FileSelected(path, 0, nullptr); } -void PrintPreviewHandler::OnPrintPreviewDialogDestroyed() { - WebContents* initiator = GetInitiator(); - if (!initiator) - return; - - printing::PrintViewManager* print_view_manager = - printing::PrintViewManager::FromWebContents(initiator); - print_view_manager->set_observer(NULL); -} - void PrintPreviewHandler::OnPrintPreviewFailed() { if (reported_failed_preview_) return;
diff --git a/chrome/browser/ui/webui/print_preview/print_preview_handler.h b/chrome/browser/ui/webui/print_preview/print_preview_handler.h index ea838f5..f12fa699 100644 --- a/chrome/browser/ui/webui/print_preview/print_preview_handler.h +++ b/chrome/browser/ui/webui/print_preview/print_preview_handler.h
@@ -13,7 +13,6 @@ #include "base/memory/ref_counted.h" #include "base/memory/scoped_ptr.h" #include "base/memory/weak_ptr.h" -#include "chrome/browser/printing/print_view_manager_observer.h" #include "chrome/browser/ui/webui/print_preview/print_preview_distiller.h" #include "components/signin/core/browser/gaia_cookie_manager_service.h" #include "content/public/browser/web_ui_message_handler.h" @@ -49,7 +48,6 @@ public cloud_print::PrivetLocalPrintOperation::Delegate, #endif public ui::SelectFileDialog::Listener, - public printing::PrintViewManagerObserver, public GaiaCookieManagerService::Observer { public: PrintPreviewHandler(); @@ -64,19 +62,11 @@ void* params) override; void FileSelectionCanceled(void* params) override; - // PrintViewManagerObserver implementation. - void OnPrintDialogShown() override; - // GaiaCookieManagerService::Observer implementation. void OnAddAccountToCookieCompleted( const std::string& account_id, const GoogleServiceAuthError& error) override; - // Called when the print preview dialog is destroyed. This is the last time - // this object has access to the PrintViewManager in order to disconnect the - // observer. - void OnPrintPreviewDialogDestroyed(); - // Called when print preview failed. void OnPrintPreviewFailed();
diff --git a/chrome/browser/ui/webui/print_preview/print_preview_ui.cc b/chrome/browser/ui/webui/print_preview/print_preview_ui.cc index f568688c..aa176f5f0 100644 --- a/chrome/browser/ui/webui/print_preview/print_preview_ui.cc +++ b/chrome/browser/ui/webui/print_preview/print_preview_ui.cc
@@ -598,10 +598,6 @@ ui_preview_request_id); } -void PrintPreviewUI::OnPrintPreviewDialogDestroyed() { - handler_->OnPrintPreviewDialogDestroyed(); -} - void PrintPreviewUI::OnFileSelectionCancelled() { web_ui()->CallJavascriptFunction("fileSelectionCancelled"); }
diff --git a/chrome/browser/ui/webui/print_preview/print_preview_ui.h b/chrome/browser/ui/webui/print_preview/print_preview_ui.h index fbcd8724..02a7cae 100644 --- a/chrome/browser/ui/webui/print_preview/print_preview_ui.h +++ b/chrome/browser/ui/webui/print_preview/print_preview_ui.h
@@ -113,11 +113,6 @@ void OnPreviewDataIsAvailable(int expected_pages_count, int preview_request_id); - // Notifies the Web UI that preview dialog has been destroyed. This is the - // last chance to communicate with the initiator before the association is - // erased. - void OnPrintPreviewDialogDestroyed(); - // Notifies the Web UI that the print preview failed to render. void OnPrintPreviewFailed();
diff --git a/chrome/browser/usb/usb_chooser_bubble_delegate.cc b/chrome/browser/usb/usb_chooser_bubble_controller.cc similarity index 83% rename from chrome/browser/usb/usb_chooser_bubble_delegate.cc rename to chrome/browser/usb/usb_chooser_bubble_controller.cc index 026641d..b4cce8f 100644 --- a/chrome/browser/usb/usb_chooser_bubble_delegate.cc +++ b/chrome/browser/usb/usb_chooser_bubble_controller.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/usb/usb_chooser_bubble_delegate.h" +#include "chrome/browser/usb/usb_chooser_bubble_controller.h" #include <stddef.h> #include <utility> @@ -73,12 +73,12 @@ } // namespace -UsbChooserBubbleDelegate::UsbChooserBubbleDelegate( +UsbChooserBubbleController::UsbChooserBubbleController( content::RenderFrameHost* owner, mojo::Array<device::usb::DeviceFilterPtr> device_filters, content::RenderFrameHost* render_frame_host, const webusb::WebUsbPermissionBubble::GetPermissionCallback& callback) - : ChooserBubbleDelegate(owner), + : ChooserBubbleController(owner), render_frame_host_(render_frame_host), callback_(callback), usb_service_observer_(this), @@ -94,25 +94,27 @@ if (!device_filters.is_null()) filters_ = device_filters.To<std::vector<device::UsbDeviceFilter>>(); - usb_service->GetDevices(base::Bind( - &UsbChooserBubbleDelegate::GotUsbDeviceList, weak_factory_.GetWeakPtr())); + usb_service->GetDevices( + base::Bind(&UsbChooserBubbleController::GotUsbDeviceList, + weak_factory_.GetWeakPtr())); } -UsbChooserBubbleDelegate::~UsbChooserBubbleDelegate() { +UsbChooserBubbleController::~UsbChooserBubbleController() { if (!callback_.is_null()) callback_.Run(nullptr); } -size_t UsbChooserBubbleDelegate::NumOptions() const { +size_t UsbChooserBubbleController::NumOptions() const { return devices_.size(); } -const base::string16& UsbChooserBubbleDelegate::GetOption(size_t index) const { +const base::string16& UsbChooserBubbleController::GetOption( + size_t index) const { DCHECK_LT(index, devices_.size()); return devices_[index].second; } -void UsbChooserBubbleDelegate::Select(size_t index) { +void UsbChooserBubbleController::Select(size_t index) { DCHECK_LT(index, devices_.size()); content::WebContents* web_contents = content::WebContents::FromRenderFrameHost(render_frame_host_); @@ -135,22 +137,22 @@ ? WEBUSB_CHOOSER_CLOSED_EPHEMERAL_PERMISSION_GRANTED : WEBUSB_CHOOSER_CLOSED_PERMISSION_GRANTED); - if (bubble_controller_) - bubble_controller_->CloseBubble(BUBBLE_CLOSE_ACCEPTED); + if (bubble_reference_) + bubble_reference_->CloseBubble(BUBBLE_CLOSE_ACCEPTED); } -void UsbChooserBubbleDelegate::Cancel() { +void UsbChooserBubbleController::Cancel() { RecordChooserClosure(devices_.size() == 0 ? WEBUSB_CHOOSER_CLOSED_CANCELLED_NO_DEVICES : WEBUSB_CHOOSER_CLOSED_CANCELLED); - if (bubble_controller_) - bubble_controller_->CloseBubble(BUBBLE_CLOSE_CANCELED); + if (bubble_reference_) + bubble_reference_->CloseBubble(BUBBLE_CLOSE_CANCELED); } -void UsbChooserBubbleDelegate::Close() {} +void UsbChooserBubbleController::Close() {} -void UsbChooserBubbleDelegate::OnDeviceAdded( +void UsbChooserBubbleController::OnDeviceAdded( scoped_refptr<device::UsbDevice> device) { if (device::UsbDeviceFilter::MatchesAny(device, filters_) && FindInAllowedOrigins( @@ -162,11 +164,11 @@ } } -GURL UsbChooserBubbleDelegate::GetHelpCenterUrl() const { +GURL UsbChooserBubbleController::GetHelpCenterUrl() const { return GURL(chrome::kChooserUsbOverviewURL); } -void UsbChooserBubbleDelegate::OnDeviceRemoved( +void UsbChooserBubbleController::OnDeviceRemoved( scoped_refptr<device::UsbDevice> device) { for (auto it = devices_.begin(); it != devices_.end(); ++it) { if (it->first == device) { @@ -181,7 +183,7 @@ // Get a list of devices that can be shown in the chooser bubble UI for // user to grant permsssion. -void UsbChooserBubbleDelegate::GotUsbDeviceList( +void UsbChooserBubbleController::GotUsbDeviceList( const std::vector<scoped_refptr<device::UsbDevice>>& devices) { for (const auto& device : devices) { if (device::UsbDeviceFilter::MatchesAny(device, filters_) && @@ -195,7 +197,7 @@ observer()->OnOptionsInitialized(); } -void UsbChooserBubbleDelegate::set_bubble_controller( - BubbleReference bubble_controller) { - bubble_controller_ = bubble_controller; +void UsbChooserBubbleController::set_bubble_reference( + BubbleReference bubble_reference) { + bubble_reference_ = bubble_reference; }
diff --git a/chrome/browser/usb/usb_chooser_bubble_delegate.h b/chrome/browser/usb/usb_chooser_bubble_controller.h similarity index 69% rename from chrome/browser/usb/usb_chooser_bubble_delegate.h rename to chrome/browser/usb/usb_chooser_bubble_controller.h index 4921b0f..6de8fb0 100644 --- a/chrome/browser/usb/usb_chooser_bubble_delegate.h +++ b/chrome/browser/usb/usb_chooser_bubble_controller.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_USB_USB_CHOOSER_BUBBLE_DELEGATE_H_ -#define CHROME_BROWSER_USB_USB_CHOOSER_BUBBLE_DELEGATE_H_ +#ifndef CHROME_BROWSER_USB_USB_CHOOSER_BUBBLE_CONTROLLER_H_ +#define CHROME_BROWSER_USB_USB_CHOOSER_BUBBLE_CONTROLLER_H_ #include <utility> @@ -11,7 +11,7 @@ #include "base/memory/ref_counted.h" #include "base/memory/weak_ptr.h" #include "base/scoped_observer.h" -#include "chrome/browser/ui/website_settings/chooser_bubble_delegate.h" +#include "chrome/browser/ui/website_settings/chooser_bubble_controller.h" #include "components/bubble/bubble_reference.h" #include "components/webusb/public/interfaces/webusb_permission_bubble.mojom.h" #include "device/usb/usb_service.h" @@ -26,18 +26,18 @@ class UsbDeviceFilter; } -// UsbChooserBubbleDelegate creates a chooser bubble for WebUsb. -class UsbChooserBubbleDelegate : public ChooserBubbleDelegate, - public device::UsbService::Observer { +// UsbChooserBubbleController creates a chooser bubble for WebUsb. +class UsbChooserBubbleController : public ChooserBubbleController, + public device::UsbService::Observer { public: - UsbChooserBubbleDelegate( + UsbChooserBubbleController( content::RenderFrameHost* owner, mojo::Array<device::usb::DeviceFilterPtr> device_filters, content::RenderFrameHost* render_frame_host, const webusb::WebUsbPermissionBubble::GetPermissionCallback& callback); - ~UsbChooserBubbleDelegate() override; + ~UsbChooserBubbleController() override; - // ChooserBubbleDelegate: + // ChooserBubbleController: size_t NumOptions() const override; const base::string16& GetOption(size_t index) const override; void Select(size_t index) override; @@ -52,7 +52,7 @@ void GotUsbDeviceList( const std::vector<scoped_refptr<device::UsbDevice>>& devices); - void set_bubble_controller(BubbleReference bubble_controller); + void set_bubble_reference(BubbleReference bubble_reference); private: content::RenderFrameHost* const render_frame_host_; @@ -63,10 +63,10 @@ // Each pair is a (device, device name). std::vector<std::pair<scoped_refptr<device::UsbDevice>, base::string16>> devices_; - BubbleReference bubble_controller_; - base::WeakPtrFactory<UsbChooserBubbleDelegate> weak_factory_; + BubbleReference bubble_reference_; + base::WeakPtrFactory<UsbChooserBubbleController> weak_factory_; - DISALLOW_COPY_AND_ASSIGN(UsbChooserBubbleDelegate); + DISALLOW_COPY_AND_ASSIGN(UsbChooserBubbleController); }; -#endif // CHROME_BROWSER_USB_USB_CHOOSER_BUBBLE_DELEGATE_H_ +#endif // CHROME_BROWSER_USB_USB_CHOOSER_BUBBLE_CONTROLLER_H_
diff --git a/chrome/browser/usb/web_usb_permission_bubble.cc b/chrome/browser/usb/web_usb_permission_bubble.cc index 6ba7d266..8b6b7d1 100644 --- a/chrome/browser/usb/web_usb_permission_bubble.cc +++ b/chrome/browser/usb/web_usb_permission_bubble.cc
@@ -8,7 +8,7 @@ #include "chrome/browser/ui/browser_finder.h" #include "chrome/browser/ui/chrome_bubble_manager.h" -#include "chrome/browser/usb/usb_chooser_bubble_delegate.h" +#include "chrome/browser/usb/usb_chooser_bubble_controller.h" #include "components/bubble/bubble_controller.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/render_frame_host.h" @@ -33,15 +33,15 @@ content::WebContents* web_contents = content::WebContents::FromRenderFrameHost(render_frame_host_); Browser* browser = chrome::FindBrowserWithWebContents(web_contents); - scoped_ptr<UsbChooserBubbleDelegate> bubble_delegate( - new UsbChooserBubbleDelegate(render_frame_host_, - std::move(device_filters), - render_frame_host_, callback)); - UsbChooserBubbleDelegate* bubble_delegate_ptr = bubble_delegate.get(); - BubbleReference bubble_controller = - browser->GetBubbleManager()->ShowBubble(std::move(bubble_delegate)); - bubble_delegate_ptr->set_bubble_controller(bubble_controller); - bubbles_.push_back(bubble_controller); + scoped_ptr<UsbChooserBubbleController> bubble_controller( + new UsbChooserBubbleController(render_frame_host_, + std::move(device_filters), + render_frame_host_, callback)); + UsbChooserBubbleController* bubble_controller_ptr = bubble_controller.get(); + BubbleReference bubble_reference = + browser->GetBubbleManager()->ShowBubble(std::move(bubble_controller)); + bubble_controller_ptr->set_bubble_reference(bubble_reference); + bubbles_.push_back(bubble_reference); } void ChromeWebUsbPermissionBubble::Bind(
diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi index 1a0f27b..ec0ffa5 100644 --- a/chrome/chrome_browser.gypi +++ b/chrome/chrome_browser.gypi
@@ -1388,8 +1388,8 @@ 'browser/tracing/chrome_tracing_delegate.h', 'browser/upgrade_detector.cc', 'browser/upgrade_detector.h', - 'browser/usb/usb_chooser_bubble_delegate.cc', - 'browser/usb/usb_chooser_bubble_delegate.h', + 'browser/usb/usb_chooser_bubble_controller.cc', + 'browser/usb/usb_chooser_bubble_controller.h', 'browser/usb/web_usb_permission_bubble.cc', 'browser/usb/web_usb_permission_bubble.h', ], @@ -1498,6 +1498,8 @@ 'browser/android/offline_pages/offline_page_mhtml_archiver.h', 'browser/android/offline_pages/offline_page_model_factory.cc', 'browser/android/offline_pages/offline_page_model_factory.h', + 'browser/android/offline_pages/offline_page_tab_helper.cc', + 'browser/android/offline_pages/offline_page_tab_helper.h', 'browser/android/offline_pages/offline_page_utils.cc', 'browser/android/offline_pages/offline_page_utils.h', ], @@ -2460,7 +2462,6 @@ 'browser/printing/print_preview_message_handler.h', 'browser/printing/print_view_manager.cc', 'browser/printing/print_view_manager.h', - 'browser/printing/print_view_manager_observer.h', 'browser/printing/printer_manager_dialog.h', 'browser/printing/printer_manager_dialog_linux.cc', 'browser/printing/printer_manager_dialog_mac.mm', @@ -3655,6 +3656,15 @@ '../ui/chromeos/ui_chromeos.gyp:ui_chromeos_resources', ], }], + ['chromeos==1', { + 'sources': [ + 'browser/metrics/leak_detector_controller.cc', + 'browser/metrics/leak_detector_controller.h', + ], + 'dependencies': [ + '../components/components.gyp:metrics_leak_detector', + ], + }], ['use_cups==1', { 'dependencies': [ '../printing/printing.gyp:cups',
diff --git a/chrome/chrome_browser_chromeos.gypi b/chrome/chrome_browser_chromeos.gypi index 2b9e273..9d170c5 100644 --- a/chrome/chrome_browser_chromeos.gypi +++ b/chrome/chrome_browser_chromeos.gypi
@@ -56,6 +56,8 @@ 'browser/chromeos/arc/arc_auth_service.h', 'browser/chromeos/arc/arc_intent_helper_bridge.cc', 'browser/chromeos/arc/arc_intent_helper_bridge.h', + 'browser/chromeos/arc/arc_service_launcher.cc', + 'browser/chromeos/arc/arc_service_launcher.h', 'browser/chromeos/arc/settings_bridge.cc', 'browser/chromeos/arc/settings_bridge.h', 'browser/chromeos/attestation/attestation_ca_client.cc',
diff --git a/chrome/chrome_browser_ui.gypi b/chrome/chrome_browser_ui.gypi index 4c437de4..180dc22 100644 --- a/chrome/chrome_browser_ui.gypi +++ b/chrome/chrome_browser_ui.gypi
@@ -708,6 +708,8 @@ ], # ARC-only sources. 'chrome_browser_ui_chromeos_arc_sources': [ + 'browser/ui/app_list/arc/arc_app_context_menu.cc', + 'browser/ui/app_list/arc/arc_app_context_menu.h', 'browser/ui/app_list/arc/arc_app_icon.cc', 'browser/ui/app_list/arc/arc_app_icon.h', 'browser/ui/app_list/arc/arc_app_icon_loader.cc', @@ -1527,8 +1529,8 @@ 'browser/ui/autofill/new_credit_card_bubble_view.h', 'browser/ui/blocked_content/app_modal_dialog_helper.cc', 'browser/ui/blocked_content/app_modal_dialog_helper.h', - 'browser/ui/bluetooth/bluetooth_chooser_bubble_delegate.cc', - 'browser/ui/bluetooth/bluetooth_chooser_bubble_delegate.h', + 'browser/ui/bluetooth/bluetooth_chooser_bubble_controller.cc', + 'browser/ui/bluetooth/bluetooth_chooser_bubble_controller.h', 'browser/ui/bluetooth/bluetooth_chooser_desktop.cc', 'browser/ui/bluetooth/bluetooth_chooser_desktop.h', 'browser/ui/bookmarks/bookmark_bubble_sign_in_delegate.cc', @@ -1797,8 +1799,8 @@ 'browser/ui/unload_controller.h', 'browser/ui/user_manager.cc', 'browser/ui/user_manager.h', - 'browser/ui/website_settings/chooser_bubble_delegate.cc', - 'browser/ui/website_settings/chooser_bubble_delegate.h', + 'browser/ui/website_settings/chooser_bubble_controller.cc', + 'browser/ui/website_settings/chooser_bubble_controller.h', 'browser/ui/website_settings/permission_bubble_manager.cc', 'browser/ui/website_settings/permission_bubble_manager.h', 'browser/ui/website_settings/permission_bubble_view.h',
diff --git a/chrome/chrome_tests_unit.gypi b/chrome/chrome_tests_unit.gypi index 2e27e9c..4d98dc92 100644 --- a/chrome/chrome_tests_unit.gypi +++ b/chrome/chrome_tests_unit.gypi
@@ -1115,6 +1115,7 @@ 'browser/extensions/api/log_private/syslog_parser_unittest.cc', 'browser/extensions/updater/local_extension_cache_unittest.cc', 'browser/metrics/chromeos_metrics_provider_unittest.cc', + 'browser/metrics/leak_detector_controller_unittest.cc', 'browser/metrics/perf/cpu_identity_unittest.cc', 'browser/metrics/perf/random_selector_unittest.cc', 'browser/notifications/login_state_notification_blocker_chromeos_unittest.cc', @@ -1642,6 +1643,7 @@ # Sources for Offline pages. For now only for Android. 'chrome_unit_tests_offline_pages_sources': [ 'browser/android/offline_pages/offline_page_mhtml_archiver_unittest.cc', + 'browser/android/offline_pages/offline_page_tab_helper_unittest.cc', 'browser/android/offline_pages/offline_page_utils_unittest.cc', 'browser/android/offline_pages/test_offline_page_model_builder.cc', 'browser/android/offline_pages/test_offline_page_model_builder.h',
diff --git a/chrome/common/chrome_features.cc b/chrome/common/chrome_features.cc index b571587..418e283 100644 --- a/chrome/common/chrome_features.cc +++ b/chrome/common/chrome_features.cc
@@ -22,4 +22,11 @@ "LinuxObsoleteSystemIsEndOfTheLine", base::FEATURE_DISABLED_BY_DEFAULT}; #endif +#if defined(OS_CHROMEOS) +// Runtime flag that indicates whether this leak detector should be enabled in +// the current instance of Chrome. +const base::Feature kRuntimeMemoryLeakDetector{ + "RuntimeMemoryLeakDetector", base::FEATURE_DISABLED_BY_DEFAULT}; +#endif // defined(OS_CHROMEOS) + } // namespace features
diff --git a/chrome/common/chrome_features.h b/chrome/common/chrome_features.h index f1fc0b7..e881669 100644 --- a/chrome/common/chrome_features.h +++ b/chrome/common/chrome_features.h
@@ -23,6 +23,10 @@ extern const base::Feature kLinuxObsoleteSystemIsEndOfTheLine; #endif +#if defined(OS_CHROMEOS) +extern const base::Feature kRuntimeMemoryLeakDetector; +#endif // defined(OS_CHROMEOS) + // DON'T ADD RANDOM STUFF HERE. Put it in the main section above in // alphabetical order, or in one of the ifdefs (also in order in each section).
diff --git a/chrome/renderer/media/OWNERS b/chrome/renderer/media/OWNERS index ab71d0ff..1b5f072 100644 --- a/chrome/renderer/media/OWNERS +++ b/chrome/renderer/media/OWNERS
@@ -1,9 +1,13 @@ +chcunningham@chromium.org dalecurtis@chromium.org ddorwin@chromium.org +hubbe@chromium.org jrummell@chromium.org sandersd@chromium.org sergeyu@chromium.org tommi@chromium.org +watk@chromium.org +wolenetz@chromium.org xhwang@chromium.org # For Cast streaming changes.
diff --git a/chrome/service/service_utility_process_host.cc b/chrome/service/service_utility_process_host.cc index 3dad747..15748c48 100644 --- a/chrome/service/service_utility_process_host.cc +++ b/chrome/service/service_utility_process_host.cc
@@ -249,7 +249,8 @@ process_ = base::LaunchProcess(*cmd_line, base::LaunchOptions()); } else { ServiceSandboxedProcessLauncherDelegate delegate; - process_ = content::StartSandboxedProcess(&delegate, cmd_line); + process_ = content::StartSandboxedProcess( + &delegate, cmd_line, base::HandlesToInheritVector()); } return process_.IsValid(); }
diff --git a/chrome/test/chromedriver/test/run_py_tests.py b/chrome/test/chromedriver/test/run_py_tests.py index 8b1ad5d..e20fa13 100755 --- a/chrome/test/chromedriver/test/run_py_tests.py +++ b/chrome/test/chromedriver/test/run_py_tests.py
@@ -66,11 +66,6 @@ # https://code.google.com/p/chromedriver/issues/detail?id=992 'ChromeDownloadDirTest.testDownloadDirectoryOverridesExistingPreferences', ] -_VERSION_SPECIFIC_FILTER['44'] = [ - # https://code.google.com/p/chromedriver/issues/detail?id=1202 - 'ChromeDownloadDirTest.testFileDownloadWithGet', - -] _OS_SPECIFIC_FILTER = {} _OS_SPECIFIC_FILTER['win'] = [
diff --git a/chrome/test/data/autofill/heuristics/output/117_cc_checkout_macys.com.out b/chrome/test/data/autofill/heuristics/output/117_cc_checkout_macys.com.out index 4839242..fb33871 100644 --- a/chrome/test/data/autofill/heuristics/output/117_cc_checkout_macys.com.out +++ b/chrome/test/data/autofill/heuristics/output/117_cc_checkout_macys.com.out
@@ -8,7 +8,7 @@ CREDIT_CARD_VERIFICATION_CODE | creditCard.securityCode | Security code | | payment.type_1-cc UNKNOWN_TYPE | useMyShippingAddress | Use my shipping address | false | payment.type_1-default CREDIT_CARD_NAME | billingContact.firstName | First name | | payment.type_1-cc -UNKNOWN_TYPE | billingContact.lastName | Last name | | payment.type_1-default +NAME_LAST | billingContact.lastName | Last name | | payment.type_1-default ADDRESS_HOME_LINE1 | billingAddress.addressLine1 | Address line 1 | | payment.type_1-default ADDRESS_HOME_LINE2 | billingAddress.addressLine2 | Address line 2 (optional) | | payment.type_1-default ADDRESS_HOME_CITY | billingAddress.city | City | | payment.type_1-default
diff --git a/chrome/test/data/autofill/heuristics/output/118_checkout_cvs.com.out b/chrome/test/data/autofill/heuristics/output/118_checkout_cvs.com.out index 097005ff..71d83a6 100644 --- a/chrome/test/data/autofill/heuristics/output/118_checkout_cvs.com.out +++ b/chrome/test/data/autofill/heuristics/output/118_checkout_cvs.com.out
@@ -18,9 +18,9 @@ UNKNOWN_TYPE | bopusSMSagree1 | Text me information from CVS/pharmacy�, including information about my order. | on | fname_1-default UNKNOWN_TYPE | fsaValue | I would like to apply $0.00 of eligible items in this order to my FSA Debit Card. | on | fname_1-default UNKNOWN_TYPE | fsaValue1 | I would like to apply $0.00 of eligible items in this order to my FSA Debit Card. | on | fname_1-default -UNKNOWN_TYPE | ccfield | FSA Card | | fname_1-default +CREDIT_CARD_NUMBER | ccfield | FSA Card | | fname_1-cc PHONE_HOME_WHOLE_NUMBER | expfield | First Name Last Name Street Address Apartment, Building, Floor, Etc City State ZIP Code Phone Number FSA Card Exp FSA Card Exp First Name Last Name Street Address Apartment, Building, Floor, Etc City State ZIP Code Phone Number Credit Card Exp Credit Card Exp First Name Last Name Street Address Apartment, Building, Floor, Etc City State ZIP Code Phone Number | | fname_1-default -UNKNOWN_TYPE | cvvfield | Specify a different email address: First Name Last Name Phone Number Specify a different email address CVV CVV CVV CVV | | fname_1-default +CREDIT_CARD_VERIFICATION_CODE | cvvfield | Specify a different email address: First Name Last Name Phone Number Specify a different email address CVV CVV CVV CVV | | fname_1-cc CREDIT_CARD_VERIFICATION_CODE | cvvfield | | CVV | | fname_1-cc CREDIT_CARD_NUMBER | ccfield | FSA Card | | fname_1-cc CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR | expfield | Exp | | fname_1-cc @@ -28,7 +28,7 @@ CREDIT_CARD_VERIFICATION_CODE | cvvfield | |CVV | | fname_1-cc UNKNOWN_TYPE | chk1 | Use ... as Billing Address. | on | fname_1-default CREDIT_CARD_NAME | ffname | First Name | | fname_1-cc -UNKNOWN_TYPE | flname | Last Name | | fname_1-default +NAME_LAST | flname | Last Name | | fname_1-default ADDRESS_HOME_LINE1 | fstreetAddr | Street Address | | fname_1-default ADDRESS_HOME_LINE2 | fstreetAddr1 | Apartment, Building, Floor, Etc | | fname_1-default ADDRESS_HOME_CITY | fcity | City | | fname_1-default
diff --git a/chrome/test/data/policy/policy_test_cases.json b/chrome/test/data/policy/policy_test_cases.json index ea7e14c..211d84328 100644 --- a/chrome/test/data/policy/policy_test_cases.json +++ b/chrome/test/data/policy/policy_test_cases.json
@@ -1215,6 +1215,14 @@ ] }, + "DefaultWebBluetoothGuardSetting": { + "os": ["win", "linux", "mac", "chromeos"], + "test_policy": { "DefaultWebBluetoothGuardSetting": 2 }, + "pref_mappings": [ + { "pref": "profile.managed_default_content_settings.web_bluetooth_guard" } + ] + }, + "AutoSelectCertificateForUrls": { "os": ["win", "linux", "mac", "chromeos"], "test_policy": { "AutoSelectCertificateForUrls": ["{'pattern':'https://example.com','filter':{'ISSUER':{'CN': 'issuer-name'}}}"] },
diff --git a/chrome/test/data/webui/media_router/media_router_container_filter_tests.js b/chrome/test/data/webui/media_router/media_router_container_filter_tests.js new file mode 100644 index 0000000..3128fb4d --- /dev/null +++ b/chrome/test/data/webui/media_router/media_router_container_filter_tests.js
@@ -0,0 +1,791 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** @fileoverview Suite of tests for media-router-container specifically related + * to the filter view. */ +cr.define('media_router_container_filter', function() { + function registerTests() { + suite('MediaRouterContainerFilter', function() { + /** + * The list of current routes. + * @type {!Array<!media_router.Route>} + */ + var fakeRouteList = []; + + /** + * The list of available sinks. + * @type {!Array<!media_router.Sink>} + */ + var fakeSinkList = []; + + /** + * The list of elements to check for visibility. + * @const {!Array<string>} + */ + var hiddenCheckElementIdList = [ + 'cast-mode-list', + 'container-header', + 'device-missing', + 'first-run-flow', + 'first-run-flow-cloud-pref', + 'issue-banner', + 'no-search-matches', + 'route-details', + 'search-results', + 'sink-list', + 'sink-list-view', + ]; + + /** + * Search text that will match all sinks. + * @type {string} + */ + var searchTextAll; + + /** + * Search text that won't match any sink in fakeSinkList. + * @type {string} + */ + var searchTextNone; + + /** + * Search text that will match exactly one sink. + * @type {string} + */ + var searchTextOne; + + // Checks whether |view| matches the current view of |container|. + var checkCurrentView = function(view) { + assertEquals(view, container.currentView_); + }; + + // Checks whether the elements specified in |elementIdList| are visible. + // Checks whether all other elements are not visible. + var checkElementsVisibleWithId = function(elementIdList) { + for (var i = 0; i < elementIdList.length; i++) + checkElementVisibleWithId(true, elementIdList[i]); + + for (var j = 0; j < hiddenCheckElementIdList.length; j++) { + if (elementIdList.indexOf(hiddenCheckElementIdList[j]) == -1) + checkElementVisibleWithId(false, hiddenCheckElementIdList[j]); + } + }; + + // Checks the visibility of an element with |elementId| in |container|. + // An element is considered visible if it exists and its |hidden| property + // is |false|. + var checkElementVisibleWithId = function(visible, elementId) { + var element = container.$$('#' + elementId); + var elementVisible = !!element && !element.hidden && + element.style.display != 'none'; + assertEquals(visible, elementVisible, elementId); + }; + + // Checks whether |expected| and the text in the |element| are equal. + var checkElementText = function(expected, element) { + assertEquals(expected.trim(), element.textContent.trim()); + }; + + // Import media_router_container.html before running suite. + suiteSetup(function() { + return PolymerTest.importHtml( + 'chrome://media-router/elements/media_router_container/' + + 'media_router_container.html'); + }); + + // Initialize a media-router-container before each test. + setup(function(done) { + PolymerTest.clearBody(); + container = document.createElement('media-router-container'); + document.body.appendChild(container); + + // Initialize local variables. + container.castModeList = [ + new media_router.CastMode(0x1, 'Description 0', 'google.com'), + new media_router.CastMode(0x2, 'Description 1', null), + new media_router.CastMode(0x4, 'Description 2', null), + ]; + + fakeRouteList = [ + new media_router.Route('id 1', 'sink id 1', + 'Title 1', 0, true, false), + new media_router.Route('id 2', 'sink id 2', + 'Title 2', 1, false, true), + ]; + + fakeRouteListWithLocalRoutesOnly = [ + new media_router.Route('id 1', 'sink id 1', + 'Title 1', 0, true, false), + new media_router.Route('id 2', 'sink id 2', + 'Title 2', 1, true, false), + ]; + + var castModeBitset = 0x2 | 0x4 | 0x8; + fakeSinkList = [ + new media_router.Sink('sink id 1', 'Sink 1', null, null, + media_router.SinkIconType.CAST, + media_router.SinkStatus.ACTIVE, castModeBitset), + new media_router.Sink('sink id 2', 'Sink 2', null, null, + media_router.SinkIconType.CAST, + media_router.SinkStatus.ACTIVE, castModeBitset), + new media_router.Sink('sink id 3', 'Sink 3', null, null, + media_router.SinkIconType.CAST, + media_router.SinkStatus.PENDING, castModeBitset), + ]; + + searchTextAll = 'sink'; + searchTextNone = 'abc'; + searchTextOne = 'sink 1'; + + // Allow for the media router container to be created and attached. + setTimeout(done); + }); + + // Tests that clicking the search icon will cause the container to enter + // filter view. + test('click search icon', function(done) { + MockInteractions.tap(container.$['sink-search-icon']); + setTimeout(function() { + checkCurrentView(media_router.MediaRouterView.FILTER); + assertEquals(container.$['sink-search-input'], + container.shadowRoot.activeElement); + done(); + }); + }); + + // Tests that focusing the sink search input will cause the container to + // enter filter view. + test('focus sink search input', function(done) { + MockInteractions.focus(container.$['sink-search-input']); + setTimeout(function() { + checkCurrentView(media_router.MediaRouterView.FILTER); + assertEquals(container.$['sink-search-input'], + container.shadowRoot.activeElement); + done(); + }); + }); + + // Tests that the back button in the FILTER view returns |container| to + // the SINK_LIST view. + test('filter view back button', function(done) { + MockInteractions.tap(container.$['sink-search-icon']); + setTimeout(function() { + MockInteractions.tap( + container.$['container-header'].$['back-button']); + checkCurrentView(media_router.MediaRouterView.SINK_LIST); + done(); + }); + }); + + // Tests that pressing the Escape key in the FILTER view returns + // |container| to the SINK_LIST view. + test('filter view escape key', function(done) { + MockInteractions.tap(container.$['sink-search-icon']); + setTimeout(function() { + MockInteractions.pressAndReleaseKeyOn( + container, media_router.KEYCODE_ESC); + checkCurrentView(media_router.MediaRouterView.SINK_LIST); + done(); + }); + }); + + // Tests that expected elements are visible when in filter view. + test('filter view visibility', function(done) { + checkElementsVisibleWithId(['container-header', + 'device-missing', + 'sink-search', + 'sink-list-view']); + // Clicking the search icon should transition |container| to FILTER + // view. + MockInteractions.tap(container.$['sink-search-icon']); + setTimeout(function() { + checkElementsVisibleWithId(['container-header', + 'device-missing', + 'sink-search', + 'sink-list-view']); + + // Adding sinks should populate the search list. + container.allSinks = fakeSinkList; + setTimeout(function() { + checkElementsVisibleWithId(['container-header', + 'search-results', + 'sink-search', + 'sink-list-view']); + // Typing text that doesn't match any sinks should display a 'no + // matches' message. + container.$['sink-search-input'].value = searchTextNone; + checkElementsVisibleWithId(['container-header', + 'no-search-matches', + 'sink-search', + 'sink-list-view']); + // Changing that text to something that matches at least one sink + // should show the matching sinks again. + container.$['sink-search-input'].value = searchTextOne; + setTimeout(function() { + checkElementsVisibleWithId(['container-header', + 'search-results', + 'sink-search', + 'sink-list-view']); + // Clicking the back button should leave |searchTextOne| in the + // input but return to the SINK_LIST view. + MockInteractions.tap( + container.$['container-header'].$['back-button']); + checkElementsVisibleWithId(['container-header', + 'sink-search', + 'sink-list', + 'sink-list-view']); + // When the search button is clicked again, the matching sinks + // should be shown again. This doesn't prove that the matching + // worked when returning to the FILTER view though, just that it + // at least shows some sort of sink list as search results. + MockInteractions.tap(container.$['sink-search-icon']); + checkElementsVisibleWithId(['container-header', + 'search-results', + 'sink-search', + 'sink-list-view']); + + container.$['sink-search-input'].value = searchTextNone; + // Clicking the back button should leave |searchTextNone| in the + // input but return to the SINK_LIST view. + MockInteractions.tap( + container.$['container-header'].$['back-button']); + checkElementsVisibleWithId(['container-header', + 'sink-search', + 'sink-list', + 'sink-list-view']); + // When the search button is clicked again, there should be no + // matches because |searchTextNone| should still be used to + // filter. + MockInteractions.tap(container.$['sink-search-icon']); + checkElementsVisibleWithId(['container-header', + 'no-search-matches', + 'sink-search', + 'sink-list-view']); + // Pressing the Escape key in FILTER view should return + // |container| to SINK_LIST view and not exit the dialog. + MockInteractions.pressAndReleaseKeyOn( + container, media_router.KEYCODE_ESC); + checkElementsVisibleWithId(['container-header', + 'sink-search', + 'sink-list', + 'sink-list-view']); + done(); + }); + }); + }); + }); + + // Tests that entering filter view with text already in the search input + // will immediately use that text to filter the sinks. This tests the case + // that the text matches one sink. + test('existing search text filters success', function(done) { + container.allSinks = fakeSinkList; + container.$['sink-search-input'].value = searchTextOne; + MockInteractions.tap(container.$['sink-search-icon']); + setTimeout(function() { + var searchResults = + container.$$('#search-results').querySelectorAll('paper-item'); + assertEquals(1, searchResults.length); + done(); + }); + }); + + // Tests that entering filter view with text already in the search input + // will immediately use that text to filter the sinks. This tests the case + // that the text doesn't match any sinks. + test('existing search text filters fail', function(done) { + container.allSinks = fakeSinkList; + container.$['sink-search-input'].value = searchTextNone; + MockInteractions.tap(container.$['sink-search-icon']); + setTimeout(function() { + var searchResults = + container.$$('#search-results').querySelectorAll('paper-item'); + assertEquals(0, searchResults.length); + done(); + }); + }); + + // Tests that the text in the search input is not cleared or altered after + // leaving filter view by pressing the back button in the header. + test('search text persists back button', function(done) { + MockInteractions.tap(container.$['sink-search-icon']); + setTimeout(function() { + container.$['sink-search-input'].value = searchTextAll; + + MockInteractions.tap( + container.$['container-header'].$['back-button']); + assertEquals(searchTextAll, container.$['sink-search-input'].value); + done(); + }); + }); + + // Tests that the text in the search input is not cleared or altered after + // leaving filter view by pressing the Escape key. + test('search text persists escape key', function(done) { + MockInteractions.tap(container.$['sink-search-icon']); + setTimeout(function() { + container.$['sink-search-input'].value = searchTextAll; + + MockInteractions.pressAndReleaseKeyOn( + container, media_router.KEYCODE_ESC); + assertEquals(searchTextAll, container.$['sink-search-input'].value); + done(); + }); + }); + + // Tests that the correct number of results are returned in the search + // results. + test('search text filters correct number', function(done) { + container.allSinks = fakeSinkList; + MockInteractions.tap(container.$['sink-search-icon']); + var searchInput = container.$['sink-search-input']; + setTimeout(function() { + searchInput.value = searchTextAll; + var searchResults = + container.$$('#search-results').querySelectorAll('paper-item'); + assertEquals(fakeSinkList.length, searchResults.length); + + searchInput.value = searchTextOne; + setTimeout(function() { + var searchResults = + container.$$('#search-results').querySelectorAll('paper-item'); + assertEquals(1, searchResults.length); + + searchInput.value = searchTextNone; + setTimeout(function() { + var searchResults = + container.$$('#search-results') + .querySelectorAll('paper-item'); + assertEquals(0, searchResults.length); + done(); + }); + }); + }); + }); + + // Tests that the correct item is returned when searching using the first + // fake sink's name. + test('search text filters correct text', function(done) { + container.allSinks = fakeSinkList; + MockInteractions.tap(container.$['sink-search-icon']); + var testSinkName = fakeSinkList[0].name; + container.$['sink-search-input'].value = testSinkName; + setTimeout(function() { + var searchResults = + container.$$('#search-results').querySelectorAll('paper-item'); + assertEquals(1, searchResults.length); + // This selector works only because there's only one result in the + // list. + var searchResultText = + container.$$('media-router-search-highlighter').text; + assertEquals(testSinkName.trim(), searchResultText.trim()); + done(); + }); + }); + + // Tests that a route can be created from search results the same as in + // the sink list. + test('create route from search result without a route', function(done) { + container.allSinks = fakeSinkList; + MockInteractions.tap(container.$['sink-search-icon']); + setTimeout(function() { + var searchResults = + container.$$('#search-results').querySelectorAll('paper-item'); + container.addEventListener('create-route', function(data) { + assertEquals(fakeSinkList[1].id, data.detail.sinkId); + done(); + }); + MockInteractions.tap(searchResults[1]); + }); + }); + + // Tests that clicking a sink in the search results that already has an + // associated route will transition |container| to the ROUTE_DETAILS view. + test('navigate to route details from search result', function(done) { + container.allSinks = fakeSinkList; + container.routeList = fakeRouteList; + MockInteractions.tap(container.$['sink-search-icon']); + setTimeout(function() { + var searchResults = + container.$$('#search-results').querySelectorAll('paper-item'); + MockInteractions.tap(searchResults[1]); + checkCurrentView(media_router.MediaRouterView.ROUTE_DETAILS); + done(); + }); + }); + + // Tests that subtext is shown in filter view the same as the sink list. + // This is basically a copy of 'initial sink list route text' but in + // filter view. + test('subtext displayed in filter view', function(done) { + // Sink 1 - no sink description, no route -> no subtext + // Sink 2 - sink description, no route -> subtext = sink description + // Sink 3 - no sink description, route -> subtext = route description + // Sink 4 - sink description, route -> subtext = route description + container.allSinks = [ + new media_router.Sink('sink id 1', 'Sink 1', null, null, + media_router.SinkIconType.CAST, + media_router.SinkStatus.ACTIVE, [1, 2, 3]), + new media_router.Sink('sink id 2', 'Sink 2', + 'Sink 2 description', null, + media_router.SinkIconType.CAST, + media_router.SinkStatus.ACTIVE, [1, 2, 3]), + new media_router.Sink('sink id 3', 'Sink 3', null, null, + media_router.SinkIconType.CAST, + media_router.SinkStatus.PENDING, [1, 2, 3]), + new media_router.Sink('sink id 4', 'Sink 4', + 'Sink 4 description', null, + media_router.SinkIconType.CAST, + media_router.SinkStatus.PENDING, [1, 2, 3]) + ]; + + container.routeList = [ + new media_router.Route('id 3', 'sink id 3', 'Title 3', 0, true), + new media_router.Route('id 4', 'sink id 4', 'Title 4', 1, false), + ]; + + MockInteractions.tap(container.$['sink-search-icon']); + setTimeout(function() { + var sinkSubtextList = + container.$$('#search-results').querySelectorAll('.sink-subtext'); + + // There will only be 3 sink subtext entries, because Sink 1 does not + // have any subtext. + assertEquals(3, sinkSubtextList.length); + + checkElementText(container.allSinks[1].description, + sinkSubtextList[0]); + + // Route description overrides sink description for subtext. + checkElementText(container.routeList[0].description, + sinkSubtextList[1]); + + checkElementText(container.routeList[1].description, + sinkSubtextList[2]); + done(); + }); + }); + + // Tests that compareSearchMatches_ works correctly for zero and one + // substring matches from the filter text. Earlier, longer matches should + // be ordered first, in that priority order. + test('compareSearchMatches_ test single substrings', function(done) { + var checkEqual = function(left, right) { + assertEquals(0, container.compareSearchMatches_(left, right)); + assertEquals(0, container.compareSearchMatches_(right, left)); + }; + var checkLess = function(left, right) { + assertEquals(-1, container.compareSearchMatches_(left, right)); + assertEquals(1, container.compareSearchMatches_(right, left)); + }; + + var noMatches = {sinkItem: null, substrings: []}; + var oneMatchSectionSingleChar = {sinkItem: null, substrings: [[0, 0]]}; + + checkEqual(noMatches, noMatches); + checkEqual(oneMatchSectionSingleChar, oneMatchSectionSingleChar); + checkLess(oneMatchSectionSingleChar, noMatches); + + var oneMatchSectionBeginningLong = {sinkItem: null, + substrings: [[0, 2]]}; + var oneMatchSectionBeginningShort = {sinkItem: null, + substrings: [[0, 1]]}; + checkEqual(oneMatchSectionBeginningLong, oneMatchSectionBeginningLong); + checkEqual(oneMatchSectionBeginningShort, + oneMatchSectionBeginningShort); + + checkLess(oneMatchSectionBeginningLong, oneMatchSectionBeginningShort); + + var oneMatchSectionMiddleLong = {sinkItem: null, substrings: [[2, 4]]}; + var oneMatchSectionMiddleShort = {sinkItem: null, substrings: [[2, 3]]}; + checkEqual(oneMatchSectionMiddleLong, oneMatchSectionMiddleLong); + checkEqual(oneMatchSectionMiddleShort, oneMatchSectionMiddleShort); + + checkLess(oneMatchSectionMiddleLong, oneMatchSectionMiddleShort); + + var oneMatchSectionEndLong = {sinkItem: null, substrings: [[4, 6]]}; + var oneMatchSectionEndShort = {sinkItem: null, substrings: [[4, 5]]}; + checkEqual(oneMatchSectionEndLong, oneMatchSectionEndLong); + checkEqual(oneMatchSectionEndShort, oneMatchSectionEndShort); + + checkLess(oneMatchSectionEndLong, oneMatchSectionEndShort); + + // Check beginning < middle < end for both short and long matches. + checkLess(oneMatchSectionBeginningLong, oneMatchSectionMiddleLong); + checkLess(oneMatchSectionMiddleLong, oneMatchSectionEndLong); + checkLess(oneMatchSectionBeginningLong, oneMatchSectionEndLong); + checkLess(oneMatchSectionBeginningShort, oneMatchSectionMiddleShort); + checkLess(oneMatchSectionMiddleShort, oneMatchSectionEndShort); + checkLess(oneMatchSectionBeginningShort, oneMatchSectionEndShort); + + // Check some long/short transitivity + // i.e. beginning-long < middle-long, middle-long < middle-short, so + // check that beginning-long < middle-short + checkLess(oneMatchSectionBeginningLong, oneMatchSectionMiddleShort); + checkLess(oneMatchSectionBeginningShort, oneMatchSectionMiddleLong); + checkLess(oneMatchSectionMiddleLong, oneMatchSectionEndShort); + checkLess(oneMatchSectionMiddleShort, oneMatchSectionEndLong); + checkLess(oneMatchSectionBeginningLong, oneMatchSectionEndShort); + checkLess(oneMatchSectionBeginningShort, oneMatchSectionEndLong); + + var oneMatchBeginningOverlap = {sinkItem: null, substrings: [[0, 2]]}; + var oneMatchMiddleOverlap = {sinkItem: null, substrings: [[1, 3]]}; + var oneMatchEndOverlap = {sinkItem: null, substrings: [[2, 4]]} + + checkEqual(oneMatchBeginningOverlap, oneMatchBeginningOverlap); + checkEqual(oneMatchMiddleOverlap, oneMatchMiddleOverlap); + checkEqual(oneMatchEndOverlap, oneMatchEndOverlap); + + checkLess(oneMatchBeginningOverlap, oneMatchMiddleOverlap); + checkLess(oneMatchMiddleOverlap, oneMatchEndOverlap); + checkLess(oneMatchBeginningOverlap, oneMatchEndOverlap); + + done(); + }); + + // Tests that compareSearchMatches_ works correctly for one or more + // substring matches from the filter text. Earlier, longer matches should + // be ordered first, in that priority order. + test('compareSearchMatches_ test multiple substrings', function(done) { + var checkEqual = function(left, right) { + assertEquals(0, container.compareSearchMatches_(left, right)); + assertEquals(0, container.compareSearchMatches_(right, left)); + }; + var checkLess = function(left, right) { + assertEquals(-1, container.compareSearchMatches_(left, right)); + assertEquals(1, container.compareSearchMatches_(right, left)); + }; + + // Variables are named by number of substring elements followed by their + // sort order as X_Y where they should be sorted in ascending order by + // X.Y. For example: 1_1 < 1_2 < 2_1. + var threeMatches1_1 = { + sinkItem: null, + substrings: [[0, 2], [4, 5], [7, 9]], + }; + var threeMatches1_2 = { + sinkItem: null, + substrings: [[0, 2], [4, 5], [7, 8]], + }; + var threeMatches1_3 = { + sinkItem: null, + substrings: [[0, 2], [4, 5], [8, 9]], + }; + var threeMatches1_4 = { + sinkItem: null, + substrings: [[0, 2], [4, 4], [6, 8]], + }; + var twoMatches2_1 = { + sinkItem: null, + substrings: [[0, 2], [4, 4]], + }; + var twoMatches2_2 = { + sinkItem: null, + substrings: [[0, 1], [3, 5]], + }; + var twoMatches2_3 = { + sinkItem: null, + substrings: [[0, 1], [4, 6]], + }; + var twoMatches2_4 = { + sinkItem: null, + substrings: [[0, 1], [4, 5]], + }; + var threeMatches2_5 = { + sinkItem: null, + substrings: [[0, 1], [4, 4], [6, 9]], + }; + var oneMatch3_1 = { + sinkItem: null, + substrings: [[0, 1]], + }; + var oneMatch3_2 = { + sinkItem: null, + substrings: [[0, 0]], + }; + + var orderedMatches = [ + threeMatches1_1, + threeMatches1_2, + threeMatches1_3, + threeMatches1_4, + twoMatches2_1, + twoMatches2_2, + twoMatches2_3, + twoMatches2_4, + threeMatches2_5, + oneMatch3_1, + oneMatch3_2, + ]; + + for (var i = 0; i < orderedMatches.length; ++i) { + checkEqual(orderedMatches[i], orderedMatches[i]); + } + for (var i = 0; i < orderedMatches.length - 1; ++i) { + checkLess(orderedMatches[i], orderedMatches[i+1]); + } + // Check some transitivity. + for (var i = 0; i < orderedMatches.length - 2; ++i) { + checkLess(orderedMatches[i], orderedMatches[i+2]); + } + for (var i = 0; i < orderedMatches.length - 3; ++i) { + checkLess(orderedMatches[i], orderedMatches[i+3]); + } + + done(); + }); + + // Tests that computeSearchMatches_ correctly computes the matching + // substrings of a sink name from search text. + test('computeSearchMatches_ test', function(done) { + var sinkName = '012345 789'; + var checkMatches = function(searchText, answer) { + proposed = container.computeSearchMatches_(searchText, sinkName); + + if (answer == null || proposed == null) { + assertEquals(answer, proposed); + return; + } + assertEquals(answer.length, proposed.length); + for (var i = 0; i < proposed.length; ++i) { + assertEquals(answer[i].length, proposed[i].length); + for (var j = 0; j < proposed[i].length; ++j) { + assertEquals(answer[i][j], proposed[i][j]); + } + } + }; + + // Check search text against |sinkName| for correct match output. + checkMatches('', []); + checkMatches('a', null); + checkMatches('0', [[0, 0]]); + checkMatches('1', [[1, 1]]); + checkMatches('012', [[0, 2]]); + checkMatches('03', [[0, 0], [3, 3]]); + checkMatches('210', null); + checkMatches('01345789', [[0, 1], [3, 5], [7, 9]]); + checkMatches('024', [[0, 0], [2, 2], [4, 4]]); + checkMatches('09a', null); + checkMatches(' ', [[6, 6]]); + checkMatches('45 ', [[4, 6]]); + checkMatches(' 78', [[6, 8]]); + checkMatches('45 7', [[4, 7]]); + checkMatches(' ', null); + checkMatches('12 89', [[1, 2], [6, 6], [8, 9]]); + + done(); + }); + + // Tests that computeSinkMatchingText_ correctly splits a sink name into + // |plainText| and |highlightedText| arrays given a sink name and an array + // of match indices. + test('computeSinkMatchingText_ test', function(done) { + var sinkName = '012345 789'; + var sink = new media_router.Sink('id', sinkName, null, null, + media_router.SinkIconType.CAST, + media_router.SinkStatus.ACTIVE, 0); + var checkMatches = function(matchesAndAnswers) { + var matches = matchesAndAnswers.matches; + var plainText = matchesAndAnswers.plainText; + var highlightedText = matchesAndAnswers.highlightedText; + + var proposed = container.computeSinkMatchingText_( + {sinkItem: sink, substrings: matches}); + assertEquals(plainText.length, proposed.plainText.length); + assertEquals(highlightedText.length, proposed.highlightedText.length); + for (var i = 0; i < plainText.length; ++i) { + assertEquals(plainText[i], proposed.plainText[i]); + } + for (var i = 0; i < highlightedText.length; ++i) { + assertEquals(highlightedText[i], proposed.highlightedText[i]); + } + }; + + // Check that |sinkName| is correctly partitioned by |matches|. + var matchesAndAnswers1 = { + matches: null, + plainText: ['012345 789'], + highlightedText: [null] + }; + checkMatches(matchesAndAnswers1); + + var matchesAndAnswers2 = { + matches: [], + plainText: ['012345 789'], + highlightedText: [null] + }; + checkMatches(matchesAndAnswers2); + + var matchesAndAnswers3 = { + matches: [[0, 0]], + plainText: [null, '12345 789'], + highlightedText: ['0', null] + }; + checkMatches(matchesAndAnswers3); + + var matchesAndAnswers4 = { + matches: [[9, 9]], + plainText: ['012345 78'], + highlightedText: ['9'] + }; + checkMatches(matchesAndAnswers4); + + var matchesAndAnswers5 = { + matches: [[1, 1]], + plainText: ['0', '2345 789'], + highlightedText: ['1', null] + }; + checkMatches(matchesAndAnswers5); + + var matchesAndAnswers6 = { + matches: [[1, 2], [4, 6]], + plainText: ['0', '3', '789'], + highlightedText: ['12', '45 ', null] + }; + checkMatches(matchesAndAnswers6); + + var matchesAndAnswers7 = { + matches: [[0, 3], [7, 9]], + plainText: [null, '45 '], + highlightedText: ['0123', '789'], + }; + checkMatches(matchesAndAnswers7); + + var matchesAndAnswers8 = { + matches: [[4, 6], [9, 9]], + plainText: ['0123', '78'], + highlightedText: ['45 ', '9'] + }; + checkMatches(matchesAndAnswers8); + + var matchesAndAnswers9 = { + matches: [[0, 1], [3, 4], [6, 7], [9, 9]], + plainText: [null, '2', '5', '8'], + highlightedText: ['01', '34', ' 7', '9'], + }; + checkMatches(matchesAndAnswers9); + + var matchesAndAnswers10 = { + matches: [[0, 1], [3, 4], [6, 6], [9, 9]], + plainText: [null, '2', '5', '78'], + highlightedText: ['01', '34', ' ', '9'], + }; + checkMatches(matchesAndAnswers10); + + var matchesAndAnswers11 = { + matches: [[5, 7]], + plainText: ['01234', '89'], + highlightedText: ['5 7', null], + }; + checkMatches(matchesAndAnswers11); + + done(); + }); + }); + } + + return { + registerTests: registerTests, + }; +});
diff --git a/chrome/test/data/webui/media_router/media_router_container_tests.js b/chrome/test/data/webui/media_router/media_router_container_tests.js index 0696a22..446b098 100644 --- a/chrome/test/data/webui/media_router/media_router_container_tests.js +++ b/chrome/test/data/webui/media_router/media_router_container_tests.js
@@ -66,24 +66,6 @@ 'sink-list-view', ]; - /** - * Search text that will match all sinks. - * @type {string} - */ - var searchTextAll; - - /** - * Search text that won't match any sink in fakeSinkList. - * @type {string} - */ - var searchTextNone; - - /** - * Search text that will match exactly one sink. - * @type {string} - */ - var searchTextOne; - // Checks whether |view| matches the current view of |container|. var checkCurrentView = function(view) { assertEquals(view, container.currentView_); @@ -1005,647 +987,6 @@ }); }); }); - - // Tests that clicking the search icon will cause the container to enter - // filter view. - test('click search icon', function(done) { - MockInteractions.tap(container.$['sink-search-icon']); - setTimeout(function() { - checkCurrentView(media_router.MediaRouterView.FILTER); - assertEquals(container.$['sink-search-input'], - container.shadowRoot.activeElement); - done(); - }); - }); - - // Tests that focusing the sink search input will cause the container to - // enter filter view. - test('focus sink search input', function(done) { - MockInteractions.focus(container.$['sink-search-input']); - setTimeout(function() { - checkCurrentView(media_router.MediaRouterView.FILTER); - assertEquals(container.$['sink-search-input'], - container.shadowRoot.activeElement); - done(); - }); - }); - - // Tests that the back button in the FILTER view returns |container| to - // the SINK_LIST view. - test('filter view back button', function(done) { - MockInteractions.tap(container.$['sink-search-icon']); - setTimeout(function() { - MockInteractions.tap( - container.$['container-header'].$['back-button']); - checkCurrentView(media_router.MediaRouterView.SINK_LIST); - done(); - }); - }); - - // Tests that pressing the Escape key in the FILTER view returns - // |container| to the SINK_LIST view. - test('filter view escape key', function(done) { - MockInteractions.tap(container.$['sink-search-icon']); - setTimeout(function() { - MockInteractions.pressAndReleaseKeyOn( - container, media_router.KEYCODE_ESC); - checkCurrentView(media_router.MediaRouterView.SINK_LIST); - done(); - }); - }); - - // Tests that expected elements are visible when in filter view. - test('filter view visibility', function(done) { - checkElementsVisibleWithId(['container-header', - 'device-missing', - 'sink-search', - 'sink-list-view']); - // Clicking the search icon should transition |container| to FILTER - // view. - MockInteractions.tap(container.$['sink-search-icon']); - setTimeout(function() { - checkElementsVisibleWithId(['container-header', - 'device-missing', - 'sink-search', - 'sink-list-view']); - - // Adding sinks should populate the search list. - container.allSinks = fakeSinkList; - setTimeout(function() { - checkElementsVisibleWithId(['container-header', - 'search-results', - 'sink-search', - 'sink-list-view']); - // Typing text that doesn't match any sinks should display a 'no - // matches' message. - container.$['sink-search-input'].value = searchTextNone; - checkElementsVisibleWithId(['container-header', - 'no-search-matches', - 'sink-search', - 'sink-list-view']); - // Changing that text to something that matches at least one sink - // should show the matching sinks again. - container.$['sink-search-input'].value = searchTextOne; - setTimeout(function() { - checkElementsVisibleWithId(['container-header', - 'search-results', - 'sink-search', - 'sink-list-view']); - // Clicking the back button should leave |searchTextOne| in the - // input but return to the SINK_LIST view. - MockInteractions.tap( - container.$['container-header'].$['back-button']); - checkElementsVisibleWithId(['container-header', - 'sink-search', - 'sink-list', - 'sink-list-view']); - // When the search button is clicked again, the matching sinks - // should be shown again. This doesn't prove that the matching - // worked when returning to the FILTER view though, just that it - // at least shows some sort of sink list as search results. - MockInteractions.tap(container.$['sink-search-icon']); - checkElementsVisibleWithId(['container-header', - 'search-results', - 'sink-search', - 'sink-list-view']); - - container.$['sink-search-input'].value = searchTextNone; - // Clicking the back button should leave |searchTextNone| in the - // input but return to the SINK_LIST view. - MockInteractions.tap( - container.$['container-header'].$['back-button']); - checkElementsVisibleWithId(['container-header', - 'sink-search', - 'sink-list', - 'sink-list-view']); - // When the search button is clicked again, there should be no - // matches because |searchTextNone| should still be used to - // filter. - MockInteractions.tap(container.$['sink-search-icon']); - checkElementsVisibleWithId(['container-header', - 'no-search-matches', - 'sink-search', - 'sink-list-view']); - // Pressing the Escape key in FILTER view should return - // |container| to SINK_LIST view and not exit the dialog. - MockInteractions.pressAndReleaseKeyOn( - container, media_router.KEYCODE_ESC); - checkElementsVisibleWithId(['container-header', - 'sink-search', - 'sink-list', - 'sink-list-view']); - done(); - }); - }); - }); - }); - - // Tests that entering filter view with text already in the search input - // will immediately use that text to filter the sinks. This tests the case - // that the text matches one sink. - test('existing search text filters success', function(done) { - container.allSinks = fakeSinkList; - container.$['sink-search-input'].value = searchTextOne; - MockInteractions.tap(container.$['sink-search-icon']); - setTimeout(function() { - var searchResults = - container.$$('#search-results').querySelectorAll('paper-item'); - assertEquals(1, searchResults.length); - done(); - }); - }); - - // Tests that entering filter view with text already in the search input - // will immediately use that text to filter the sinks. This tests the case - // that the text doesn't match any sinks. - test('existing search text filters fail', function(done) { - container.allSinks = fakeSinkList; - container.$['sink-search-input'].value = searchTextNone; - MockInteractions.tap(container.$['sink-search-icon']); - setTimeout(function() { - var searchResults = - container.$$('#search-results').querySelectorAll('paper-item'); - assertEquals(0, searchResults.length); - done(); - }); - }); - - // Tests that the text in the search input is not cleared or altered after - // leaving filter view by pressing the back button in the header. - test('search text persists back button', function(done) { - MockInteractions.tap(container.$['sink-search-icon']); - setTimeout(function() { - container.$['sink-search-input'].value = searchTextAll; - - MockInteractions.tap( - container.$['container-header'].$['back-button']); - assertEquals(searchTextAll, container.$['sink-search-input'].value); - done(); - }); - }); - - // Tests that the text in the search input is not cleared or altered after - // leaving filter view by pressing the Escape key. - test('search text persists escape key', function(done) { - MockInteractions.tap(container.$['sink-search-icon']); - setTimeout(function() { - container.$['sink-search-input'].value = searchTextAll; - - MockInteractions.pressAndReleaseKeyOn( - container, media_router.KEYCODE_ESC); - assertEquals(searchTextAll, container.$['sink-search-input'].value); - done(); - }); - }); - - // Tests that the correct number of results are returned in the search - // results. - test('search text filters correct number', function(done) { - container.allSinks = fakeSinkList; - MockInteractions.tap(container.$['sink-search-icon']); - var searchInput = container.$['sink-search-input']; - setTimeout(function() { - searchInput.value = searchTextAll; - var searchResults = - container.$$('#search-results').querySelectorAll('paper-item'); - assertEquals(fakeSinkList.length, searchResults.length); - - searchInput.value = searchTextOne; - setTimeout(function() { - var searchResults = - container.$$('#search-results').querySelectorAll('paper-item'); - assertEquals(1, searchResults.length); - - searchInput.value = searchTextNone; - setTimeout(function() { - var searchResults = - container.$$('#search-results') - .querySelectorAll('paper-item'); - assertEquals(0, searchResults.length); - done(); - }); - }); - }); - }); - - // Tests that the correct item is returned when searching using the first - // fake sink's name. - test('search text filters correct text', function(done) { - container.allSinks = fakeSinkList; - MockInteractions.tap(container.$['sink-search-icon']); - var testSinkName = fakeSinkList[0].name; - container.$['sink-search-input'].value = testSinkName; - setTimeout(function() { - var searchResults = - container.$$('#search-results').querySelectorAll('paper-item'); - assertEquals(1, searchResults.length); - // This selector works only because there's only one result in the - // list. - var searchResultText = - container.$$('media-router-search-highlighter').text; - assertEquals(testSinkName.trim(), searchResultText.trim()); - done(); - }); - }); - - // Tests that a route can be created from search results the same as in - // the sink list. - test('create route from search result without a route', function(done) { - container.allSinks = fakeSinkList; - MockInteractions.tap(container.$['sink-search-icon']); - setTimeout(function() { - var searchResults = - container.$$('#search-results').querySelectorAll('paper-item'); - container.addEventListener('create-route', function(data) { - assertEquals(fakeSinkList[1].id, data.detail.sinkId); - done(); - }); - MockInteractions.tap(searchResults[1]); - }); - }); - - // Tests that clicking a sink in the search results that already has an - // associated route will transition |container| to the ROUTE_DETAILS view. - test('navigate to route details from search result', function(done) { - container.allSinks = fakeSinkList; - container.routeList = fakeRouteList; - MockInteractions.tap(container.$['sink-search-icon']); - setTimeout(function() { - var searchResults = - container.$$('#search-results').querySelectorAll('paper-item'); - MockInteractions.tap(searchResults[1]); - checkCurrentView(media_router.MediaRouterView.ROUTE_DETAILS); - done(); - }); - }); - - // Tests that subtext is shown in filter view the same as the sink list. - // This is basically a copy of 'initial sink list route text' but in - // filter view. - test('subtext displayed in filter view', function(done) { - // Sink 1 - no sink description, no route -> no subtext - // Sink 2 - sink description, no route -> subtext = sink description - // Sink 3 - no sink description, route -> subtext = route description - // Sink 4 - sink description, route -> subtext = route description - container.allSinks = [ - new media_router.Sink('sink id 1', 'Sink 1', null, null, - media_router.SinkIconType.CAST, - media_router.SinkStatus.ACTIVE, [1, 2, 3]), - new media_router.Sink('sink id 2', 'Sink 2', - 'Sink 2 description', null, - media_router.SinkIconType.CAST, - media_router.SinkStatus.ACTIVE, [1, 2, 3]), - new media_router.Sink('sink id 3', 'Sink 3', null, null, - media_router.SinkIconType.CAST, - media_router.SinkStatus.PENDING, [1, 2, 3]), - new media_router.Sink('sink id 4', 'Sink 4', - 'Sink 4 description', null, - media_router.SinkIconType.CAST, - media_router.SinkStatus.PENDING, [1, 2, 3]) - ]; - - container.routeList = [ - new media_router.Route('id 3', 'sink id 3', 'Title 3', 0, true), - new media_router.Route('id 4', 'sink id 4', 'Title 4', 1, false), - ]; - - MockInteractions.tap(container.$['sink-search-icon']); - setTimeout(function() { - var sinkSubtextList = - container.$$('#search-results').querySelectorAll('.sink-subtext'); - - // There will only be 3 sink subtext entries, because Sink 1 does not - // have any subtext. - assertEquals(3, sinkSubtextList.length); - - checkElementText(container.allSinks[1].description, - sinkSubtextList[0]); - - // Route description overrides sink description for subtext. - checkElementText(container.routeList[0].description, - sinkSubtextList[1]); - - checkElementText(container.routeList[1].description, - sinkSubtextList[2]); - done(); - }); - }); - - // Tests that compareSearchMatches_ works correctly for zero and one - // substring matches from the filter text. Earlier, longer matches should - // be ordered first, in that priority order. - test('compareSearchMatches_ test single substrings', function(done) { - var checkEqual = function(left, right) { - assertEquals(0, container.compareSearchMatches_(left, right)); - assertEquals(0, container.compareSearchMatches_(right, left)); - }; - var checkLess = function(left, right) { - assertEquals(-1, container.compareSearchMatches_(left, right)); - assertEquals(1, container.compareSearchMatches_(right, left)); - }; - - var noMatches = {sinkItem: null, substrings: []}; - var oneMatchSectionSingleChar = {sinkItem: null, substrings: [[0, 0]]}; - - checkEqual(noMatches, noMatches); - checkEqual(oneMatchSectionSingleChar, oneMatchSectionSingleChar); - checkLess(oneMatchSectionSingleChar, noMatches); - - var oneMatchSectionBeginningLong = {sinkItem: null, - substrings: [[0, 2]]}; - var oneMatchSectionBeginningShort = {sinkItem: null, - substrings: [[0, 1]]}; - checkEqual(oneMatchSectionBeginningLong, oneMatchSectionBeginningLong); - checkEqual(oneMatchSectionBeginningShort, - oneMatchSectionBeginningShort); - - checkLess(oneMatchSectionBeginningLong, oneMatchSectionBeginningShort); - - var oneMatchSectionMiddleLong = {sinkItem: null, substrings: [[2, 4]]}; - var oneMatchSectionMiddleShort = {sinkItem: null, substrings: [[2, 3]]}; - checkEqual(oneMatchSectionMiddleLong, oneMatchSectionMiddleLong); - checkEqual(oneMatchSectionMiddleShort, oneMatchSectionMiddleShort); - - checkLess(oneMatchSectionMiddleLong, oneMatchSectionMiddleShort); - - var oneMatchSectionEndLong = {sinkItem: null, substrings: [[4, 6]]}; - var oneMatchSectionEndShort = {sinkItem: null, substrings: [[4, 5]]}; - checkEqual(oneMatchSectionEndLong, oneMatchSectionEndLong); - checkEqual(oneMatchSectionEndShort, oneMatchSectionEndShort); - - checkLess(oneMatchSectionEndLong, oneMatchSectionEndShort); - - // Check beginning < middle < end for both short and long matches. - checkLess(oneMatchSectionBeginningLong, oneMatchSectionMiddleLong); - checkLess(oneMatchSectionMiddleLong, oneMatchSectionEndLong); - checkLess(oneMatchSectionBeginningLong, oneMatchSectionEndLong); - checkLess(oneMatchSectionBeginningShort, oneMatchSectionMiddleShort); - checkLess(oneMatchSectionMiddleShort, oneMatchSectionEndShort); - checkLess(oneMatchSectionBeginningShort, oneMatchSectionEndShort); - - // Check some long/short transitivity - // i.e. beginning-long < middle-long, middle-long < middle-short, so - // check that beginning-long < middle-short - checkLess(oneMatchSectionBeginningLong, oneMatchSectionMiddleShort); - checkLess(oneMatchSectionBeginningShort, oneMatchSectionMiddleLong); - checkLess(oneMatchSectionMiddleLong, oneMatchSectionEndShort); - checkLess(oneMatchSectionMiddleShort, oneMatchSectionEndLong); - checkLess(oneMatchSectionBeginningLong, oneMatchSectionEndShort); - checkLess(oneMatchSectionBeginningShort, oneMatchSectionEndLong); - - var oneMatchBeginningOverlap = {sinkItem: null, substrings: [[0, 2]]}; - var oneMatchMiddleOverlap = {sinkItem: null, substrings: [[1, 3]]}; - var oneMatchEndOverlap = {sinkItem: null, substrings: [[2, 4]]} - - checkEqual(oneMatchBeginningOverlap, oneMatchBeginningOverlap); - checkEqual(oneMatchMiddleOverlap, oneMatchMiddleOverlap); - checkEqual(oneMatchEndOverlap, oneMatchEndOverlap); - - checkLess(oneMatchBeginningOverlap, oneMatchMiddleOverlap); - checkLess(oneMatchMiddleOverlap, oneMatchEndOverlap); - checkLess(oneMatchBeginningOverlap, oneMatchEndOverlap); - - done(); - }); - - // Tests that compareSearchMatches_ works correctly for one or more - // substring matches from the filter text. Earlier, longer matches should - // be ordered first, in that priority order. - test('compareSearchMatches_ test multiple substrings', function(done) { - var checkEqual = function(left, right) { - assertEquals(0, container.compareSearchMatches_(left, right)); - assertEquals(0, container.compareSearchMatches_(right, left)); - }; - var checkLess = function(left, right) { - assertEquals(-1, container.compareSearchMatches_(left, right)); - assertEquals(1, container.compareSearchMatches_(right, left)); - }; - - // Variables are named by number of substring elements followed by their - // sort order as X_Y where they should be sorted in ascending order by - // X.Y. For example: 1_1 < 1_2 < 2_1. - var threeMatches1_1 = { - sinkItem: null, - substrings: [[0, 2], [4, 5], [7, 9]], - }; - var threeMatches1_2 = { - sinkItem: null, - substrings: [[0, 2], [4, 5], [7, 8]], - }; - var threeMatches1_3 = { - sinkItem: null, - substrings: [[0, 2], [4, 5], [8, 9]], - }; - var threeMatches1_4 = { - sinkItem: null, - substrings: [[0, 2], [4, 4], [6, 8]], - }; - var twoMatches2_1 = { - sinkItem: null, - substrings: [[0, 2], [4, 4]], - }; - var twoMatches2_2 = { - sinkItem: null, - substrings: [[0, 1], [3, 5]], - }; - var twoMatches2_3 = { - sinkItem: null, - substrings: [[0, 1], [4, 6]], - }; - var twoMatches2_4 = { - sinkItem: null, - substrings: [[0, 1], [4, 5]], - }; - var threeMatches2_5 = { - sinkItem: null, - substrings: [[0, 1], [4, 4], [6, 9]], - }; - var oneMatch3_1 = { - sinkItem: null, - substrings: [[0, 1]], - }; - var oneMatch3_2 = { - sinkItem: null, - substrings: [[0, 0]], - }; - - var orderedMatches = [ - threeMatches1_1, - threeMatches1_2, - threeMatches1_3, - threeMatches1_4, - twoMatches2_1, - twoMatches2_2, - twoMatches2_3, - twoMatches2_4, - threeMatches2_5, - oneMatch3_1, - oneMatch3_2, - ]; - - for (var i = 0; i < orderedMatches.length; ++i) { - checkEqual(orderedMatches[i], orderedMatches[i]); - } - for (var i = 0; i < orderedMatches.length - 1; ++i) { - checkLess(orderedMatches[i], orderedMatches[i+1]); - } - // Check some transitivity. - for (var i = 0; i < orderedMatches.length - 2; ++i) { - checkLess(orderedMatches[i], orderedMatches[i+2]); - } - for (var i = 0; i < orderedMatches.length - 3; ++i) { - checkLess(orderedMatches[i], orderedMatches[i+3]); - } - - done(); - }); - - // Tests that computeSearchMatches_ correctly computes the matching - // substrings of a sink name from search text. - test('computeSearchMatches_ test', function(done) { - var sinkName = '012345 789'; - var checkMatches = function(searchText, answer) { - proposed = container.computeSearchMatches_(searchText, sinkName); - - if (answer == null || proposed == null) { - assertEquals(answer, proposed); - return; - } - assertEquals(answer.length, proposed.length); - for (var i = 0; i < proposed.length; ++i) { - assertEquals(answer[i].length, proposed[i].length); - for (var j = 0; j < proposed[i].length; ++j) { - assertEquals(answer[i][j], proposed[i][j]); - } - } - }; - - // Check search text against |sinkName| for correct match output. - checkMatches('', []); - checkMatches('a', null); - checkMatches('0', [[0, 0]]); - checkMatches('1', [[1, 1]]); - checkMatches('012', [[0, 2]]); - checkMatches('03', [[0, 0], [3, 3]]); - checkMatches('210', null); - checkMatches('01345789', [[0, 1], [3, 5], [7, 9]]); - checkMatches('024', [[0, 0], [2, 2], [4, 4]]); - checkMatches('09a', null); - checkMatches(' ', [[6, 6]]); - checkMatches('45 ', [[4, 6]]); - checkMatches(' 78', [[6, 8]]); - checkMatches('45 7', [[4, 7]]); - checkMatches(' ', null); - checkMatches('12 89', [[1, 2], [6, 6], [8, 9]]); - - done(); - }); - - // Tests that computeSinkMatchingText_ correctly splits a sink name into - // |plainText| and |highlightedText| arrays given a sink name and an array - // of match indices. - test('computeSinkMatchingText_ test', function(done) { - var sinkName = '012345 789'; - var sink = new media_router.Sink('id', sinkName, null, null, - media_router.SinkIconType.CAST, - media_router.SinkStatus.ACTIVE, 0); - var checkMatches = function(matchesAndAnswers) { - var matches = matchesAndAnswers.matches; - var plainText = matchesAndAnswers.plainText; - var highlightedText = matchesAndAnswers.highlightedText; - - var proposed = container.computeSinkMatchingText_( - {sinkItem: sink, substrings: matches}); - assertEquals(plainText.length, proposed.plainText.length); - assertEquals(highlightedText.length, proposed.highlightedText.length); - for (var i = 0; i < plainText.length; ++i) { - assertEquals(plainText[i], proposed.plainText[i]); - } - for (var i = 0; i < highlightedText.length; ++i) { - assertEquals(highlightedText[i], proposed.highlightedText[i]); - } - }; - - // Check that |sinkName| is correctly partitioned by |matches|. - var matchesAndAnswers1 = { - matches: null, - plainText: ['012345 789'], - highlightedText: [null] - }; - checkMatches(matchesAndAnswers1); - - var matchesAndAnswers2 = { - matches: [], - plainText: ['012345 789'], - highlightedText: [null] - }; - checkMatches(matchesAndAnswers2); - - var matchesAndAnswers3 = { - matches: [[0, 0]], - plainText: [null, '12345 789'], - highlightedText: ['0', null] - }; - checkMatches(matchesAndAnswers3); - - var matchesAndAnswers4 = { - matches: [[9, 9]], - plainText: ['012345 78'], - highlightedText: ['9'] - }; - checkMatches(matchesAndAnswers4); - - var matchesAndAnswers5 = { - matches: [[1, 1]], - plainText: ['0', '2345 789'], - highlightedText: ['1', null] - }; - checkMatches(matchesAndAnswers5); - - var matchesAndAnswers6 = { - matches: [[1, 2], [4, 6]], - plainText: ['0', '3', '789'], - highlightedText: ['12', '45 ', null] - }; - checkMatches(matchesAndAnswers6); - - var matchesAndAnswers7 = { - matches: [[0, 3], [7, 9]], - plainText: [null, '45 '], - highlightedText: ['0123', '789'], - }; - checkMatches(matchesAndAnswers7); - - var matchesAndAnswers8 = { - matches: [[4, 6], [9, 9]], - plainText: ['0123', '78'], - highlightedText: ['45 ', '9'] - }; - checkMatches(matchesAndAnswers8); - - var matchesAndAnswers9 = { - matches: [[0, 1], [3, 4], [6, 7], [9, 9]], - plainText: [null, '2', '5', '8'], - highlightedText: ['01', '34', ' 7', '9'], - }; - checkMatches(matchesAndAnswers9); - - var matchesAndAnswers10 = { - matches: [[0, 1], [3, 4], [6, 6], [9, 9]], - plainText: [null, '2', '5', '78'], - highlightedText: ['01', '34', ' ', '9'], - }; - checkMatches(matchesAndAnswers10); - - var matchesAndAnswers11 = { - matches: [[5, 7]], - plainText: ['01234', '89'], - highlightedText: ['5 7', null], - }; - checkMatches(matchesAndAnswers11); - - done(); - }); }); }
diff --git a/chrome/test/data/webui/media_router/media_router_elements_browsertest.js b/chrome/test/data/webui/media_router/media_router_elements_browsertest.js index 163063d..26e66889 100644 --- a/chrome/test/data/webui/media_router/media_router_elements_browsertest.js +++ b/chrome/test/data/webui/media_router/media_router_elements_browsertest.js
@@ -28,26 +28,72 @@ switchName: 'media-router', switchValue: '1' }], - // List tests for individual elements. + // List tests for individual elements. The media_router_container tests are + // split between media_router_container_tests.js and + // media_router_container_filter_tests.js. extraLibraries: PolymerTest.getLibraries(ROOT_PATH).concat([ 'issue_banner_tests.js', 'media_router_container_tests.js', + 'media_router_container_filter_tests.js', 'media_router_header_tests.js', 'media_router_search_highlighter.js', 'route_details_tests.js', ]), }; -// Runs all tests. -// TODO(crbug.com/590177, crbug.com/582649): This test is disabled, as it -// consistently fails on Linux Tests, and is flaky on Win7 and other bots. -TEST_F('MediaRouterElementsBrowserTest', 'DISABLED_MediaRouterElementsTest', +TEST_F('MediaRouterElementsBrowserTest', 'MediaRouterElementsTestIssueBanner', function() { - // Register mocha tests for each element. + // Register mocha tests for the issue banner. issue_banner.registerTests(); + + // Run all registered tests. + mocha.run(); +}); + +TEST_F('MediaRouterElementsBrowserTest', + 'MediaRouterElementsTestMediaRouterContainer', + function() { + // Register mocha tests for the container. media_router_container.registerTests(); + + // Run all registered tests. + mocha.run(); +}); + +TEST_F('MediaRouterElementsBrowserTest', + 'MediaRouterElementsTestMediaRouterContainerFilter', + function() { + // Register mocha tests for the container filter. + media_router_container_filter.registerTests(); + + // Run all registered tests. + mocha.run(); +}); + +TEST_F('MediaRouterElementsBrowserTest', + 'MediaRouterElementsTestMediaRouterHeader', + function() { + // Register mocha tests for the header. media_router_header.registerTests(); + + // Run all registered tests. + mocha.run(); +}); + +TEST_F('MediaRouterElementsBrowserTest', + 'MediaRouterElementsTestMediaRouterSearchHighlighter', + function() { + // Register mocha tests for the search highlighter. media_router_search_highlighter.registerTests(); + + // Run all registered tests. + mocha.run(); +}); + +TEST_F('MediaRouterElementsBrowserTest', + 'MediaRouterElementsTestMediaRouterRouteDetails', + function() { + // Register mocha tests for the route details. route_details.registerTests(); // Run all registered tests.
diff --git a/chrome/test/remoting/remote_desktop_browsertest.cc b/chrome/test/remoting/remote_desktop_browsertest.cc index ac54a19e..a79877b 100644 --- a/chrome/test/remoting/remote_desktop_browsertest.cc +++ b/chrome/test/remoting/remote_desktop_browsertest.cc
@@ -314,16 +314,24 @@ // There is nothing for the V2 app to approve because the chromoting test // account has already been granted permissions. + // // TODO(weitaosu): Revoke the permission at the beginning of the test so // that we can test first-time experience here. + // + // TODO(jamiewalch): Remove the elapsed time logging once this has run a few + // times on the bots. + base::Time start = base::Time::Now(); ConditionalTimeoutWaiter waiter( - base::TimeDelta::FromSeconds(7), + base::TimeDelta::FromSeconds(10), base::TimeDelta::FromSeconds(1), base::Bind( &RemoteDesktopBrowserTest::IsAuthenticatedInWindow, active_web_contents())); - - ASSERT_TRUE(waiter.Wait()); + bool result = waiter.Wait(); + base::TimeDelta elapsed = base::Time::Now() - start; + LOG(INFO) << "*** IsAuthenticatedInWindow took " + << elapsed.InSeconds() << "s"; + ASSERT_TRUE(result); } else { ASSERT_EQ("accounts.google.com", GetCurrentURL().host());
diff --git a/chromecast/chromecast.gyp b/chromecast/chromecast.gyp index 0a7fb65f..4fb27ce6 100644 --- a/chromecast/chromecast.gyp +++ b/chromecast/chromecast.gyp
@@ -554,7 +554,7 @@ ['OS=="android"', { 'includes': ['../build/android/v8_external_startup_data_arch_suffix.gypi',], 'variables': { - 'cast_shell_assets_path': '<(PRODUCT_DIR)/assets/cast_shell_apk', + 'cast_shell_assets_path': '<(PRODUCT_DIR)/assets', }, 'targets': [ { @@ -568,7 +568,6 @@ 'dest_path': '<(cast_shell_assets_path)', 'src_files': [ '<(PRODUCT_DIR)/icudtl.dat', - '<(PRODUCT_DIR)/assets/cast_shell.pak', ], 'renaming_sources': [ '<(PRODUCT_DIR)/natives_blob.bin',
diff --git a/chromecast/renderer/cast_content_renderer_client.cc b/chromecast/renderer/cast_content_renderer_client.cc index 6de24ec..f6b7a77 100644 --- a/chromecast/renderer/cast_content_renderer_client.cc +++ b/chromecast/renderer/cast_content_renderer_client.cc
@@ -27,6 +27,7 @@ #include "content/public/renderer/render_view.h" #include "content/public/renderer/render_view_observer.h" #include "third_party/WebKit/public/platform/WebColor.h" +#include "third_party/WebKit/public/web/WebFrameWidget.h" #include "third_party/WebKit/public/web/WebSettings.h" #include "third_party/WebKit/public/web/WebView.h" @@ -148,7 +149,8 @@ content::RenderView* render_view) { blink::WebView* webview = render_view->GetWebView(); if (webview) { - webview->setBaseBackgroundColor(kColorBlack); + blink::WebFrameWidget* web_frame_widget = render_view->GetWebFrameWidget(); + web_frame_widget->setBaseBackgroundColor(kColorBlack); // The following settings express consistent behaviors across Cast // embedders, though Android has enabled by default for mobile browsers.
diff --git a/components/arc/arc_bridge_service.h b/components/arc/arc_bridge_service.h index 13a6e66a..2e94ee1 100644 --- a/components/arc/arc_bridge_service.h +++ b/components/arc/arc_bridge_service.h
@@ -131,10 +131,10 @@ // switch. static bool GetEnabled(const base::CommandLine* command_line); - // DetectAvailability() should be called once D-Bus is available. It will - // call CheckArcAvailability() on the session_manager. This can only be - // called on the thread that this class was created on. - virtual void DetectAvailability() = 0; + // SetDetectedAvailability() should be called once CheckArcAvailability() on + // the session_manager is called. This can only be called on the thread that + // this class was created on. + virtual void SetDetectedAvailability(bool availability) = 0; // HandleStartup() should be called upon profile startup. This will only // launch an instance if the instance service is available and it is enabled.
diff --git a/components/arc/arc_bridge_service_impl.cc b/components/arc/arc_bridge_service_impl.cc index 18e44a7..49ee41c 100644 --- a/components/arc/arc_bridge_service_impl.cc +++ b/components/arc/arc_bridge_service_impl.cc
@@ -34,13 +34,6 @@ ArcBridgeServiceImpl::~ArcBridgeServiceImpl() { } -void ArcBridgeServiceImpl::DetectAvailability() { - chromeos::SessionManagerClient* session_manager_client = - chromeos::DBusThreadManager::Get()->GetSessionManagerClient(); - session_manager_client->CheckArcAvailability(base::Bind( - &ArcBridgeServiceImpl::OnArcAvailable, weak_factory_.GetWeakPtr())); -} - void ArcBridgeServiceImpl::HandleStartup() { DCHECK(CalledOnValidThread()); session_started_ = true; @@ -81,7 +74,7 @@ bootstrap_->Stop(); } -void ArcBridgeServiceImpl::OnArcAvailable(bool arc_available) { +void ArcBridgeServiceImpl::SetDetectedAvailability(bool arc_available) { DCHECK(CalledOnValidThread()); if (available() == arc_available) return;
diff --git a/components/arc/arc_bridge_service_impl.h b/components/arc/arc_bridge_service_impl.h index ea90b087..1d884ff 100644 --- a/components/arc/arc_bridge_service_impl.h +++ b/components/arc/arc_bridge_service_impl.h
@@ -29,7 +29,7 @@ explicit ArcBridgeServiceImpl(scoped_ptr<ArcBridgeBootstrap> bootstrap); ~ArcBridgeServiceImpl() override; - void DetectAvailability() override; + void SetDetectedAvailability(bool available) override; void HandleStartup() override; @@ -51,9 +51,6 @@ void OnConnectionEstablished(ArcBridgeInstancePtr instance) override; void OnStopped() override; - // DBus callbacks. - void OnArcAvailable(bool available); - // Called when the bridge channel is closed. This typically only happens when // the ARC instance crashes. This is not called during shutdown. void OnChannelClosed();
diff --git a/components/arc/test/fake_arc_bridge_service.cc b/components/arc/test/fake_arc_bridge_service.cc index 200d59e..64d17b0 100644 --- a/components/arc/test/fake_arc_bridge_service.cc +++ b/components/arc/test/fake_arc_bridge_service.cc
@@ -13,7 +13,8 @@ SetStopped(); } -void FakeArcBridgeService::DetectAvailability() { +void FakeArcBridgeService::SetDetectedAvailability(bool availability) { + SetAvailable(availability); } void FakeArcBridgeService::HandleStartup() {
diff --git a/components/arc/test/fake_arc_bridge_service.h b/components/arc/test/fake_arc_bridge_service.h index 9598be6..f66b872 100644 --- a/components/arc/test/fake_arc_bridge_service.h +++ b/components/arc/test/fake_arc_bridge_service.h
@@ -19,7 +19,7 @@ ~FakeArcBridgeService() override; // arc::ArcBridgeService - void DetectAvailability() override; + void SetDetectedAvailability(bool availability) override; void HandleStartup() override; void Shutdown() override;
diff --git a/components/autofill/core/browser/autofill_manager.cc b/components/autofill/core/browser/autofill_manager.cc index e6dd1a9a..3eeeb601 100644 --- a/components/autofill/core/browser/autofill_manager.cc +++ b/components/autofill/core/browser/autofill_manager.cc
@@ -24,6 +24,7 @@ #include "base/metrics/histogram_macros.h" #include "base/path_service.h" #include "base/strings/string16.h" +#include "base/strings/string_split.h" #include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" #include "base/threading/sequenced_worker_pool.h" @@ -111,6 +112,29 @@ return sanitized; } +// If |name| consists of three whitespace-separated parts and the second of the +// three parts is a single character or a single character followed by a period, +// returns the result of joining the first and third parts with a space. +// Otherwise, returns |name|. +// +// Note that a better way to do this would be to use SplitName from +// src/components/autofill/core/browser/contact_info.cc. However, for now we +// want the logic of which variations of names are considered to be the same to +// exactly match the logic applied on the Payments server. +base::string16 RemoveMiddleInitial(const base::string16& name) { + std::vector<base::string16> parts = + base::SplitString(name, base::kWhitespaceUTF16, base::KEEP_WHITESPACE, + base::SPLIT_WANT_NONEMPTY); + if (parts.size() == 3 && (parts[1].length() == 1 || + (parts[1].length() == 2 && + base::EndsWith(parts[1], base::ASCIIToUTF16("."), + base::CompareCase::SENSITIVE)))) { + parts.erase(parts.begin() + 1); + return base::JoinString(parts, base::ASCIIToUTF16(" ")); + } + return name; +} + } // namespace AutofillManager::AutofillManager( @@ -1052,20 +1076,40 @@ return false; } - // If neither the card nor any of the addresses have a name associated with - // them, the candidate set is invalid. - bool name_available = false; - if (!card.GetInfo(AutofillType(CREDIT_CARD_NAME), app_locale_).empty()) { - name_available = true; - } else { - for (const AutofillProfile& profile : candidate_profiles) { - if (!profile.GetInfo(AutofillType(NAME_FULL), app_locale_).empty()) { - name_available = true; - break; + // If any of the names on the card or the addresses don't match (where + // matching is case insensitive and ignores middle initials if present), the + // candidate set is invalid. This matches the rules for name matching applied + // server-side by Google Payments and ensures that we don't send upload + // requests that are guaranteed to fail. + base::string16 verified_name; + base::string16 card_name = + card.GetInfo(AutofillType(CREDIT_CARD_NAME), app_locale_); + if (!card_name.empty()) { + verified_name = RemoveMiddleInitial(card_name); + } + for (const AutofillProfile& profile : candidate_profiles) { + base::string16 address_name = + profile.GetInfo(AutofillType(NAME_FULL), app_locale_); + if (!address_name.empty()) { + if (verified_name.empty()) { + verified_name = RemoveMiddleInitial(address_name); + } else { + // TODO(crbug.com/590307): We only use ASCII case insensitivity here + // because the feature is launching US-only and middle initials only + // make sense for Western-style names anyway. As we launch in more + // countries, we'll need to make the name comparison more sophisticated. + if (!base::EqualsCaseInsensitiveASCII( + verified_name, RemoveMiddleInitial(address_name))) { + AutofillMetrics::LogCardUploadDecisionMetric( + AutofillMetrics::UPLOAD_NOT_OFFERED_CONFLICTING_NAMES); + return false; + } } } } - if (!name_available) { + // If neither the card nor any of the addresses have a name associated with + // them, the candidate set is invalid. + if (verified_name.empty()) { AutofillMetrics::LogCardUploadDecisionMetric( AutofillMetrics::UPLOAD_NOT_OFFERED_NO_NAME); return false;
diff --git a/components/autofill/core/browser/autofill_manager_unittest.cc b/components/autofill/core/browser/autofill_manager_unittest.cc index 54b49d9..8a4e17e71 100644 --- a/components/autofill/core/browser/autofill_manager_unittest.cc +++ b/components/autofill/core/browser/autofill_manager_unittest.cc
@@ -4158,7 +4158,7 @@ AutofillMetrics::UPLOAD_NOT_OFFERED_NO_ZIP_CODE, 1); } -TEST_F(AutofillManagerTest, UploadCreditCard_NamesDontHaveToMatch) { +TEST_F(AutofillManagerTest, UploadCreditCard_NamesMatchLoosely) { autofill_manager_->set_credit_card_upload_enabled(true); // Create, fill and submit two address forms with different names. @@ -4171,7 +4171,54 @@ address_forms.push_back(address_form2); FormsSeen(address_forms); - ManuallyFillAddressForm("Flo", "Master", "", "US", &address_form1); + // Names can be different case. + ManuallyFillAddressForm("flo", "master", "77401", "US", &address_form1); + FormSubmitted(address_form1); + + // And they can have a middle initial even if the other names don't. + ManuallyFillAddressForm("Flo W", "Master", "77401", "US", &address_form2); + FormSubmitted(address_form2); + + // Set up our credit card form data. + FormData credit_card_form; + CreateTestCreditCardFormData(&credit_card_form, true, false); + FormsSeen(std::vector<FormData>(1, credit_card_form)); + + // Edit the data, but use the name with a middle initial *and* period, and + // submit. + credit_card_form.fields[0].value = ASCIIToUTF16("Flo W. Master"); + credit_card_form.fields[1].value = ASCIIToUTF16("4111111111111111"); + credit_card_form.fields[2].value = ASCIIToUTF16("11"); + credit_card_form.fields[3].value = ASCIIToUTF16("2017"); + credit_card_form.fields[4].value = ASCIIToUTF16("123"); + + base::HistogramTester histogram_tester; + + // Names match loosely, upload should happen. + EXPECT_CALL(autofill_client_, ConfirmSaveCreditCardLocally(_, _)).Times(0); + FormSubmitted(credit_card_form); + EXPECT_TRUE(autofill_manager_->credit_card_was_uploaded()); + + // Verify that the correct histogram entry (and only that) was logged. + histogram_tester.ExpectUniqueSample( + "Autofill.CardUploadDecisionExpanded", + AutofillMetrics::UPLOAD_OFFERED, 1); +} + +TEST_F(AutofillManagerTest, UploadCreditCard_NamesHaveToMatch) { + autofill_manager_->set_credit_card_upload_enabled(true); + + // Create, fill and submit two address forms with different names. + FormData address_form1, address_form2; + test::CreateTestAddressFormData(&address_form1); + test::CreateTestAddressFormData(&address_form2); + + std::vector<FormData> address_forms; + address_forms.push_back(address_form1); + address_forms.push_back(address_form2); + FormsSeen(address_forms); + + ManuallyFillAddressForm("Flo", "Master", "77401", "US", &address_form1); FormSubmitted(address_form1); ManuallyFillAddressForm("Master", "Blaster", "77401", "US", &address_form2); @@ -4191,14 +4238,15 @@ base::HistogramTester histogram_tester; - // Names are not required to match, upload should happen. + // Names are required to match, upload should not happen. EXPECT_CALL(autofill_client_, ConfirmSaveCreditCardLocally(_, _)).Times(0); FormSubmitted(credit_card_form); - EXPECT_TRUE(autofill_manager_->credit_card_was_uploaded()); + EXPECT_FALSE(autofill_manager_->credit_card_was_uploaded()); // Verify that the correct histogram entry (and only that) was logged. - histogram_tester.ExpectUniqueSample("Autofill.CardUploadDecisionExpanded", - AutofillMetrics::UPLOAD_OFFERED, 1); + histogram_tester.ExpectUniqueSample( + "Autofill.CardUploadDecisionExpanded", + AutofillMetrics::UPLOAD_NOT_OFFERED_CONFLICTING_NAMES, 1); } TEST_F(AutofillManagerTest, UploadCreditCard_UploadDetailsFails) {
diff --git a/components/autofill/core/browser/autofill_metrics.h b/components/autofill/core/browser/autofill_metrics.h index 84b33be..47df5ef 100644 --- a/components/autofill/core/browser/autofill_metrics.h +++ b/components/autofill/core/browser/autofill_metrics.h
@@ -64,6 +64,11 @@ // A CVC, one or more valid addresses, and a name were available but the // request to Payments for upload details failed. UPLOAD_NOT_OFFERED_GET_UPLOAD_DETAILS_FAILED, + // A CVC and one or more addresses were available but the names on the card + // and/or the addresses didn't match. We don't know whether the address(es) + // were otherwise valid nor whether we would have been able to get upload + // details. + UPLOAD_NOT_OFFERED_CONFLICTING_NAMES, NUM_CARD_UPLOAD_DECISION_METRICS, };
diff --git a/components/autofill/core/browser/field_candidates.cc b/components/autofill/core/browser/field_candidates.cc index 6f18aae..d133b082 100644 --- a/components/autofill/core/browser/field_candidates.cc +++ b/components/autofill/core/browser/field_candidates.cc
@@ -11,14 +11,13 @@ namespace autofill { +FieldCandidate::FieldCandidate(ServerFieldType field_type, float field_score) + : type(field_type), score(field_score) {} + FieldCandidates::FieldCandidates() {} FieldCandidates::~FieldCandidates() {} -FieldCandidates::FieldCandidate::FieldCandidate(ServerFieldType field_type, - float field_score) - : type(field_type), score(field_score) {} - void FieldCandidates::AddFieldCandidate(ServerFieldType type, float score) { field_candidates_.emplace_back(type, score); } @@ -44,4 +43,8 @@ return static_cast<ServerFieldType>(index); } +const std::vector<FieldCandidate>& FieldCandidates::field_candidates() const { + return field_candidates_; +} + } // namespace autofill
diff --git a/components/autofill/core/browser/field_candidates.h b/components/autofill/core/browser/field_candidates.h index 6a34d7f2..16a6a24 100644 --- a/components/autofill/core/browser/field_candidates.h +++ b/components/autofill/core/browser/field_candidates.h
@@ -5,13 +5,25 @@ #ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_FIELD_CANDIDATES_H_ #define COMPONENTS_AUTOFILL_CORE_BROWSER_FIELD_CANDIDATES_H_ -#include <map> +#include <unordered_map> #include <vector> #include "components/autofill/core/browser/field_types.h" namespace autofill { +// Represents a possible type for a given field. +struct FieldCandidate { + FieldCandidate(ServerFieldType field_type, float field_score); + + // The associated type for this candidate. + ServerFieldType type = UNKNOWN_TYPE; + + // A non-negative number indicating how sure the type is for this specific + // candidate. The higher the more confidence. + float score = 0.0f; +}; + // Each field can be of different types. This class collects all these possible // types and determines which type is the most likely. class FieldCandidates { @@ -31,25 +43,18 @@ // Determines the best type based on the current possible types. ServerFieldType BestHeuristicType() const; + // Returns the underlying candidates. + // + // This reference is only valid while the FieldCandidates object is valid. + const std::vector<FieldCandidate>& field_candidates() const; + private: - // Represents a possible type for a given field. - struct FieldCandidate { - FieldCandidate(ServerFieldType field_type, float field_score); - - // The associated type for this candidate. - ServerFieldType type = UNKNOWN_TYPE; - - // A non-negative number indicating how sure the type is for this specific - // candidate. The higher the more confidence. - float score = 0.0f; - }; - // Internal storage for all the possible types for a given field. std::vector<FieldCandidate> field_candidates_; }; // A map from the field's unique name to its possible candidates. -using FieldCandidatesMap = std::map<base::string16, FieldCandidates>; +using FieldCandidatesMap = std::unordered_map<base::string16, FieldCandidates>; } // namespace autofill
diff --git a/components/autofill/core/browser/form_field.cc b/components/autofill/core/browser/form_field.cc index 81da9bd0..84caf06 100644 --- a/components/autofill/core/browser/form_field.cc +++ b/components/autofill/core/browser/form_field.cc
@@ -54,29 +54,28 @@ const std::vector<AutofillField*>& fields, bool is_form_tag) { // Set up a working copy of the fields to be processed. - std::vector<AutofillField*> remaining_fields; + std::vector<AutofillField*> processed_fields; std::copy_if(fields.begin(), fields.end(), - std::back_inserter(remaining_fields), ShouldBeProcessed); + std::back_inserter(processed_fields), ShouldBeProcessed); FieldCandidatesMap field_candidates; // Email pass. - ParseFormFieldsPass(EmailField::Parse, &remaining_fields, &field_candidates); + ParseFormFieldsPass(EmailField::Parse, processed_fields, &field_candidates); const size_t email_count = field_candidates.size(); // Phone pass. - ParseFormFieldsPass(PhoneField::Parse, &remaining_fields, &field_candidates); + ParseFormFieldsPass(PhoneField::Parse, processed_fields, &field_candidates); // Address pass. - ParseFormFieldsPass(AddressField::Parse, &remaining_fields, - &field_candidates); + ParseFormFieldsPass(AddressField::Parse, processed_fields, &field_candidates); // Credit card pass. - ParseFormFieldsPass(CreditCardField::Parse, &remaining_fields, + ParseFormFieldsPass(CreditCardField::Parse, processed_fields, &field_candidates); // Name pass. - ParseFormFieldsPass(NameField::Parse, &remaining_fields, &field_candidates); + ParseFormFieldsPass(NameField::Parse, processed_fields, &field_candidates); // Do not autofill a form if there are less than 3 recognized fields. // Otherwise it is very easy to have false positives. http://crbug.com/447332 @@ -171,16 +170,12 @@ // static void FormField::ParseFormFieldsPass(ParseFunction parse, - std::vector<AutofillField*>* fields, + const std::vector<AutofillField*>& fields, FieldCandidatesMap* field_candidates) { - // Store unmatched fields for further processing by the caller. - std::vector<AutofillField*> remaining_fields; - - AutofillScanner scanner(*fields); + AutofillScanner scanner(fields); while (!scanner.IsEnd()) { scoped_ptr<FormField> form_field(parse(&scanner)); if (form_field == nullptr) { - remaining_fields.push_back(scanner.Cursor()); scanner.Advance(); } else { // Add entries into |field_candidates| for each field type found in @@ -188,8 +183,6 @@ form_field->AddClassifications(field_candidates); } } - - std::swap(*fields, remaining_fields); } bool FormField::MatchesFormControlType(const std::string& type,
diff --git a/components/autofill/core/browser/form_field.h b/components/autofill/core/browser/form_field.h index 683e0fc..d3a127a 100644 --- a/components/autofill/core/browser/form_field.h +++ b/components/autofill/core/browser/form_field.h
@@ -133,7 +133,7 @@ // Classification results of the processed fields are stored in // |field_candidates|. static void ParseFormFieldsPass(ParseFunction parse, - std::vector<AutofillField*>* fields, + const std::vector<AutofillField*>& fields, FieldCandidatesMap* field_candidates); DISALLOW_COPY_AND_ASSIGN(FormField);
diff --git a/components/autofill/core/browser/form_field_unittest.cc b/components/autofill/core/browser/form_field_unittest.cc index 52f7bc5..b0873012 100644 --- a/components/autofill/core/browser/form_field_unittest.cc +++ b/components/autofill/core/browser/form_field_unittest.cc
@@ -160,4 +160,35 @@ ->second.BestHeuristicType()); } +// All parsers see the same form and should not modify it. +// Furthermore, all parsers are allowed to cast their votes on what the +// ServerFieldType for a given type should be, so for an ambiguous input more +// than one candidate is expected. +TEST(FormFieldTest, ParseFormFieldsImmutableForm) { + const base::string16 unique_name = ASCIIToUTF16("blah"); + FormFieldData field_data; + field_data.form_control_type = "text"; + field_data.name = ASCIIToUTF16("business_email_address"); + + ScopedVector<AutofillField> fields; + fields.push_back(new AutofillField(field_data, unique_name)); + + const FieldCandidatesMap field_candidates_map = + FormField::ParseFormFields(fields.get(), true); + + // The input form should not be modified. + EXPECT_EQ(1U, fields.size()); + + // The output should contain detected information for the sole field in the + // input. + EXPECT_EQ(1U, field_candidates_map.size()); + EXPECT_TRUE(field_candidates_map.find(unique_name) != + field_candidates_map.end()); + + // Because we use a handcrafted field name, we can expect it to match more + // than just one parser (at least email, but probably some more from the other + // parsers). + EXPECT_LT(1U, field_candidates_map.at(unique_name).field_candidates().size()); +} + } // namespace autofill
diff --git a/components/autofill/core/browser/form_structure_unittest.cc b/components/autofill/core/browser/form_structure_unittest.cc index 6d726bd9..4162781 100644 --- a/components/autofill/core/browser/form_structure_unittest.cc +++ b/components/autofill/core/browser/form_structure_unittest.cc
@@ -1751,15 +1751,15 @@ EXPECT_TRUE(form_structure->IsAutofillable()); // Expect the correct number of fields. - ASSERT_EQ(6U, form_structure->field_count()); - ASSERT_EQ(5U, form_structure->autofill_count()); + EXPECT_EQ(6U, form_structure->field_count()); + EXPECT_EQ(6U, form_structure->autofill_count()); // Card Number. EXPECT_EQ(CREDIT_CARD_NUMBER, form_structure->field(0)->heuristic_type()); // First name, taken as name on card. EXPECT_EQ(CREDIT_CARD_NAME, form_structure->field(1)->heuristic_type()); - // Last name is not merged. - EXPECT_EQ(UNKNOWN_TYPE, form_structure->field(2)->heuristic_type()); + // Last name is picked up by the name parser. + EXPECT_EQ(NAME_LAST, form_structure->field(2)->heuristic_type()); // Expiration Date. EXPECT_EQ(CREDIT_CARD_EXP_MONTH, form_structure->field(3)->heuristic_type()); // Expiration Year.
diff --git a/components/autofill/core/browser/phone_field.cc b/components/autofill/core/browser/phone_field.cc index 77ba9ac..ef815d6 100644 --- a/components/autofill/core/browser/phone_field.cc +++ b/components/autofill/core/browser/phone_field.cc
@@ -245,6 +245,13 @@ PHONE_HOME_WHOLE_NUMBER, kBasePhoneParserScore, field_candidates); } + + if (parsed_phone_fields_[FIELD_EXTENSION]) { + // TODO(crbug.com/589211): Change from UNKNOWN_TYPE to the proper + // ServerFieldType once the new phone suffix is checked in. + AddClassification(parsed_phone_fields_[FIELD_EXTENSION], UNKNOWN_TYPE, + kBasePhoneParserScore, field_candidates); + } } PhoneField::PhoneField() {
diff --git a/components/autofill/core/browser/phone_field_unittest.cc b/components/autofill/core/browser/phone_field_unittest.cc index 72903fc..2649cb0 100644 --- a/components/autofill/core/browser/phone_field_unittest.cc +++ b/components/autofill/core/browser/phone_field_unittest.cc
@@ -155,7 +155,7 @@ CheckField("areacode1", PHONE_HOME_CITY_CODE); CheckField("prefix2", PHONE_HOME_NUMBER); CheckField("suffix3", PHONE_HOME_NUMBER); - EXPECT_FALSE(ContainsKey(field_candidates_map_, ASCIIToUTF16("ext4"))); + EXPECT_TRUE(ContainsKey(field_candidates_map_, ASCIIToUTF16("ext4"))); } }
diff --git a/components/components_tests.gyp b/components/components_tests.gyp index 029e64b..f7204edb 100644 --- a/components/components_tests.gyp +++ b/components/components_tests.gyp
@@ -371,6 +371,7 @@ 'metrics/leak_detector/call_stack_manager_unittest.cc', 'metrics/leak_detector/call_stack_table_unittest.cc', 'metrics/leak_detector/leak_analyzer_unittest.cc', + 'metrics/leak_detector/leak_detector_unittest.cc', 'metrics/leak_detector/leak_detector_impl_unittest.cc', 'metrics/leak_detector/ranked_list_unittest.cc', ], @@ -633,6 +634,7 @@ ], 'safe_browsing_db_unittest_sources': [ 'safe_browsing_db/prefix_set_unittest.cc', + 'safe_browsing_db/testing_util.h', 'safe_browsing_db/util_unittest.cc', 'safe_browsing_db/v4_get_hash_protocol_manager_unittest.cc', 'safe_browsing_db/v4_protocol_manager_util_unittest.cc',
diff --git a/components/content_settings/core/browser/content_settings_default_provider.cc b/components/content_settings/core/browser/content_settings_default_provider.cc index 7d8d25b..e995c0a9 100644 --- a/components/content_settings/core/browser/content_settings_default_provider.cc +++ b/components/content_settings/core/browser/content_settings_default_provider.cc
@@ -180,6 +180,11 @@ IntToContentSetting(prefs_->GetInteger( GetPrefName(CONTENT_SETTINGS_TYPE_KEYGEN))), CONTENT_SETTING_NUM_SETTINGS); + UMA_HISTOGRAM_ENUMERATION( + "ContentSettings.DefaultWebBluetoothGuardSetting", + IntToContentSetting(prefs_->GetInteger( + GetPrefName(CONTENT_SETTINGS_TYPE_BLUETOOTH_GUARD))), + CONTENT_SETTING_NUM_SETTINGS); pref_change_registrar_.Init(prefs_); PrefChangeRegistrar::NamedChangeCallback callback = base::Bind(
diff --git a/components/content_settings/core/browser/content_settings_policy_provider.cc b/components/content_settings/core/browser/content_settings_policy_provider.cc index ef9643d..d8d1b83 100644 --- a/components/content_settings/core/browser/content_settings_policy_provider.cc +++ b/components/content_settings/core/browser/content_settings_policy_provider.cc
@@ -89,6 +89,8 @@ {CONTENT_SETTINGS_TYPE_PLUGINS, prefs::kManagedDefaultPluginsSetting}, {CONTENT_SETTINGS_TYPE_POPUPS, prefs::kManagedDefaultPopupsSetting}, {CONTENT_SETTINGS_TYPE_KEYGEN, prefs::kManagedDefaultKeygenSetting}, + {CONTENT_SETTINGS_TYPE_BLUETOOTH_GUARD, + prefs::kManagedDefaultWebBluetoothGuardSetting}, }; // static @@ -130,6 +132,8 @@ CONTENT_SETTING_DEFAULT); registry->RegisterIntegerPref(prefs::kManagedDefaultKeygenSetting, CONTENT_SETTING_DEFAULT); + registry->RegisterIntegerPref(prefs::kManagedDefaultWebBluetoothGuardSetting, + CONTENT_SETTING_DEFAULT); } PolicyProvider::PolicyProvider(PrefService* prefs) : prefs_(prefs) { @@ -178,6 +182,8 @@ pref_change_registrar_.Add(prefs::kManagedDefaultPluginsSetting, callback); pref_change_registrar_.Add(prefs::kManagedDefaultPopupsSetting, callback); pref_change_registrar_.Add(prefs::kManagedDefaultKeygenSetting, callback); + pref_change_registrar_.Add(prefs::kManagedDefaultWebBluetoothGuardSetting, + callback); } PolicyProvider::~PolicyProvider() {
diff --git a/components/content_settings/core/browser/content_settings_registry.cc b/components/content_settings/core/browser/content_settings_registry.cc index 890006d..ee738a6e 100644 --- a/components/content_settings/core/browser/content_settings_registry.cc +++ b/components/content_settings/core/browser/content_settings_registry.cc
@@ -279,6 +279,13 @@ WhitelistedSchemes(), ValidSettings(), WebsiteSettingsInfo::TOP_LEVEL_DOMAIN_ONLY_SCOPE, ContentSettingsInfo::INHERIT_IN_INCOGNITO); + + Register(CONTENT_SETTINGS_TYPE_BLUETOOTH_GUARD, "bluetooth-guard", + CONTENT_SETTING_ASK, WebsiteSettingsInfo::UNSYNCABLE, + WhitelistedSchemes(), + ValidSettings(CONTENT_SETTING_ASK, CONTENT_SETTING_BLOCK), + WebsiteSettingsInfo::REQUESTING_ORIGIN_AND_TOP_LEVEL_ORIGIN_SCOPE, + ContentSettingsInfo::INHERIT_IN_INCOGNITO); } void ContentSettingsRegistry::Register(
diff --git a/components/content_settings/core/common/content_settings.cc b/components/content_settings/core/common/content_settings.cc index e37461d..5b0e36f 100644 --- a/components/content_settings/core/common/content_settings.cc +++ b/components/content_settings/core/common/content_settings.cc
@@ -53,6 +53,7 @@ CONTENT_SETTINGS_TYPE_SITE_ENGAGEMENT, CONTENT_SETTINGS_TYPE_DURABLE_STORAGE, CONTENT_SETTINGS_TYPE_KEYGEN, + CONTENT_SETTINGS_TYPE_BLUETOOTH_GUARD, }; int ContentSettingTypeToHistogramValue(ContentSettingsType content_setting,
diff --git a/components/content_settings/core/common/content_settings_types.h b/components/content_settings/core/common/content_settings_types.h index 02c389ea..0e91e3f1 100644 --- a/components/content_settings/core/common/content_settings_types.h +++ b/components/content_settings/core/common/content_settings_types.h
@@ -44,6 +44,7 @@ CONTENT_SETTINGS_TYPE_SITE_ENGAGEMENT, CONTENT_SETTINGS_TYPE_DURABLE_STORAGE, CONTENT_SETTINGS_TYPE_USB_CHOOSER_DATA, + CONTENT_SETTINGS_TYPE_BLUETOOTH_GUARD, CONTENT_SETTINGS_TYPE_KEYGEN, // WARNING: This enum is going to be removed soon. Do not depend on NUM_TYPES.
diff --git a/components/content_settings/core/common/pref_names.cc b/components/content_settings/core/common/pref_names.cc index 90f1f84..ebcf7f0 100644 --- a/components/content_settings/core/common/pref_names.cc +++ b/components/content_settings/core/common/pref_names.cc
@@ -38,6 +38,8 @@ "profile.managed_default_content_settings.popups"; const char kManagedDefaultKeygenSetting[] = "profile.managed_default_content_settings.keygen"; +const char kManagedDefaultWebBluetoothGuardSetting[] = + "profile.managed_default_content_settings.web_bluetooth_guard"; // Preferences that are exclusively used to store managed // content settings patterns.
diff --git a/components/content_settings/core/common/pref_names.h b/components/content_settings/core/common/pref_names.h index da5fbe2..aa1af1cf 100644 --- a/components/content_settings/core/common/pref_names.h +++ b/components/content_settings/core/common/pref_names.h
@@ -26,6 +26,7 @@ extern const char kManagedDefaultNotificationsSetting[]; extern const char kManagedDefaultMediaStreamSetting[]; extern const char kManagedDefaultKeygenSetting[]; +extern const char kManagedDefaultWebBluetoothGuardSetting[]; extern const char kManagedCookiesAllowedForUrls[]; extern const char kManagedCookiesBlockedForUrls[];
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_config_service_client.cc b/components/data_reduction_proxy/core/browser/data_reduction_proxy_config_service_client.cc index a3bb98e1..2fda7a2 100644 --- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_config_service_client.cc +++ b/components/data_reduction_proxy/core/browser/data_reduction_proxy_config_service_client.cc
@@ -302,7 +302,13 @@ InvalidateConfig(); RetrieveConfig(); - if (!load_timing_info.request_start.is_null()) { + if (!load_timing_info.send_start.is_null() && + !load_timing_info.request_start.is_null() && + net::NetworkChangeNotifier::GetConnectionType() != + net::NetworkChangeNotifier::CONNECTION_NONE && + last_ip_address_change_ < load_timing_info.request_start) { + // Record only if there was no change in the IP address since the + // request started. UMA_HISTOGRAM_TIMES( "DataReductionProxy.ConfigService.AuthFailure.LatencyPenalty", base::TimeTicks::Now() - load_timing_info.request_start); @@ -339,6 +345,7 @@ void DataReductionProxyConfigServiceClient::OnIPAddressChanged() { DCHECK(thread_checker_.CalledOnValidThread()); GetBackoffEntry()->Reset(); + last_ip_address_change_ = base::TimeTicks::Now(); failed_attempts_before_success_ = 0; RetrieveConfig(); }
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_config_service_client.h b/components/data_reduction_proxy/core/browser/data_reduction_proxy_config_service_client.h index 913b4f53..4d9d24b 100644 --- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_config_service_client.h +++ b/components/data_reduction_proxy/core/browser/data_reduction_proxy_config_service_client.h
@@ -267,6 +267,9 @@ // config is fetched successfully. int32_t failed_attempts_before_success_; + // Time when the IP address last changed. + base::TimeTicks last_ip_address_change_; + // Enforce usage on the IO thread. base::ThreadChecker thread_checker_;
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_config_service_client_unittest.cc b/components/data_reduction_proxy/core/browser/data_reduction_proxy_config_service_client_unittest.cc index d3b9b1a..c77e837a 100644 --- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_config_service_client_unittest.cc +++ b/components/data_reduction_proxy/core/browser/data_reduction_proxy_config_service_client_unittest.cc
@@ -29,6 +29,7 @@ #include "components/data_reduction_proxy/core/common/data_reduction_proxy_pref_names.h" #include "components/data_reduction_proxy/core/common/data_reduction_proxy_switches.h" #include "components/data_reduction_proxy/proto/client_config.pb.h" +#include "net/base/network_change_notifier.h" #include "net/http/http_request_headers.h" #include "net/http/http_response_headers.h" #include "net/proxy/proxy_server.h" @@ -593,6 +594,8 @@ // headers matches the currrent session key. TEST_F(DataReductionProxyConfigServiceClientTest, AuthFailure) { Init(true); + net::NetworkChangeNotifier::NotifyObserversOfConnectionTypeChangeForTests( + net::NetworkChangeNotifier::CONNECTION_WIFI); net::HttpRequestHeaders request_headers; request_headers.SetHeader( "chrome-proxy", "something=something_else, s=" + @@ -625,6 +628,7 @@ net::LoadTimingInfo load_timing_info; load_timing_info.request_start = base::TimeTicks::Now() - base::TimeDelta::FromSeconds(1); + load_timing_info.send_start = load_timing_info.request_start; EXPECT_TRUE(config_client()->ShouldRetryDueToAuthFailure( request_headers, parsed.get(), origin.host_port_pair(), load_timing_info)); @@ -708,6 +712,7 @@ net::LoadTimingInfo load_timing_info; load_timing_info.request_start = base::TimeTicks::Now() - base::TimeDelta::FromSeconds(1); + load_timing_info.send_start = load_timing_info.request_start; EXPECT_TRUE(config_client()->ShouldRetryDueToAuthFailure( request_headers, parsed.get(), origin.host_port_pair(),
diff --git a/components/domain_reliability.gypi b/components/domain_reliability.gypi index 6b53ab2..fbd1314 100644 --- a/components/domain_reliability.gypi +++ b/components/domain_reliability.gypi
@@ -70,6 +70,7 @@ 'inputs': [ '<(bake_in_configs_script)', '<@(baked_in_configs)', + 'domain_reliability/baked_in_configs.gypi', ], 'outputs': [ '<(baked_in_configs_cc)'
diff --git a/components/domain_reliability/BUILD.gn b/components/domain_reliability/BUILD.gn index a0fb15f..5834a82 100644 --- a/components/domain_reliability/BUILD.gn +++ b/components/domain_reliability/BUILD.gn
@@ -23,7 +23,7 @@ visibility = [ ":*" ] script = "bake_in_configs.py" - inputs = baked_in_configs + inputs = baked_in_configs + [ "baked_in_configs.gypi" ] output_file = "$target_gen_dir/baked_in_configs.cc" outputs = [ output_file, @@ -31,7 +31,7 @@ # The JSON file list is too long for the command line on Windows, so put # them in a response file. - response_file_contents = rebase_path(inputs, root_build_dir) + response_file_contents = rebase_path(baked_in_configs, root_build_dir) args = [ "--file-list", "{{response_file_name}}",
diff --git a/components/domain_reliability/baked_in_configs.gypi b/components/domain_reliability/baked_in_configs.gypi index eebb3aca..a872ef8 100644 --- a/components/domain_reliability/baked_in_configs.gypi +++ b/components/domain_reliability/baked_in_configs.gypi
@@ -20,7 +20,6 @@ 'domain_reliability/baked_in_configs/googlevideo_com.json', 'domain_reliability/baked_in_configs/gvt1_com.json', 'domain_reliability/baked_in_configs/gvt2_com.json', - 'domain_reliability/baked_in_configs/mail_google_com.json', 'domain_reliability/baked_in_configs/ssl_gstatic_com.json', 'domain_reliability/baked_in_configs/www_google_com.json', ],
diff --git a/components/domain_reliability/baked_in_configs/mail_google_com.json b/components/domain_reliability/baked_in_configs/mail_google_com.json deleted file mode 100644 index 5a7026d..0000000 --- a/components/domain_reliability/baked_in_configs/mail_google_com.json +++ /dev/null
@@ -1,20 +0,0 @@ -{ - "origin": "https://mail.google.com/", - "has_same_origin_collector": true, - "success_sample_rate": 0.05, - "collectors": [ - "https://beacons.gvt2.com/domainreliability/upload", - "https://beacons2.gvt2.com/domainreliability/upload", - "https://beacons3.gvt2.com/domainreliability/upload", - "https://beacons4.gvt2.com/domainreliability/upload", - "https://beacons5.gvt2.com/domainreliability/upload", - "https://beacons5.gvt3.com/domainreliability/upload", - "https://clients2.google.com/domainreliability/upload" - ], - "failure_sample_rate": 1.0, - "include_subdomains": false, - "path_prefixes": [ - "/*/channel/bind", - "" - ] -}
diff --git a/components/domain_reliability/google_configs.cc b/components/domain_reliability/google_configs.cc index 5063b56..0e0647c 100644 --- a/components/domain_reliability/google_configs.cc +++ b/components/domain_reliability/google_configs.cc
@@ -479,7 +479,14 @@ // Origins without subdomains and with same-origin collectors. { "accounts.google.com", false, true, false }, { "apis.google.com", false, true, false }, + { "b.mail.google.com", false, true, false }, + { "chatenabled.mail.google.com", false, true, false }, { "ddm.google.com", false, true, false }, + { "gmail.com", false, true, false }, + { "gmail.google.com", false, true, false }, + { "mail.google.com", false, true, false }, + { "mail-attachment.googleusercontent.com", false, true, false }, + { "www.gmail.com", false, true, false }, // Origins without subdomains or same-origin collectors. { "ad.doubleclick.net", false, false, false },
diff --git a/components/domain_reliability/monitor.cc b/components/domain_reliability/monitor.cc index 12dfdab..a8d87d4 100644 --- a/components/domain_reliability/monitor.cc +++ b/components/domain_reliability/monitor.cc
@@ -319,9 +319,18 @@ request.remote_endpoint, URLRequestStatusToNetError(request.status)); DomainReliabilityBeacon beacon_template; - beacon_template.protocol = - GetDomainReliabilityProtocol(request.response_info.connection_info, - request.response_info.ssl_info.is_valid()); + if (request.response_info.connection_info != + net::HttpResponseInfo::CONNECTION_INFO_UNKNOWN) { + beacon_template.protocol = + GetDomainReliabilityProtocol(request.response_info.connection_info, + request.response_info.ssl_info.is_valid()); + } else { + // Use the connection info from the network error details if the response + // is unavailable. + beacon_template.protocol = + GetDomainReliabilityProtocol(request.details.connection_info, + request.response_info.ssl_info.is_valid()); + } GetDomainReliabilityBeaconQuicError(request.details.quic_connection_error, &beacon_template.quic_error); beacon_template.http_response_code = response_code;
diff --git a/components/error_page/common/localized_error.cc b/components/error_page/common/localized_error.cc index bda8f35..ead0a35 100644 --- a/components/error_page/common/localized_error.cc +++ b/components/error_page/common/localized_error.cc
@@ -48,6 +48,8 @@ "https://support.google.com/chrome?p=rl_error"; static const char kWeakDHKeyLearnMoreUrl[] = "https://support.google.com/chrome?p=dh_error"; +static const char kSslInvalidResponseLearnMoreUrl[] = + "https://support.google.com/chrome?p=ir_ssl_error"; static const int kGoogleCachedCopySuggestionType = 0; enum NAV_SUGGESTIONS { @@ -73,6 +75,9 @@ // Standalone reload page suggestion for pages created by a post. // Should not be mixed with others and is not prefixed with 'Try'. SUGGEST_RELOAD_STANDALONE = 1 << 13, + // Standalone learn more suggestion for linking to Help Center. + // Should not be mixed with others and is not prefixed with 'Try'. + SUGGEST_LEARNMORE_STANDALONE = 1 << 14, }; struct LocalizedErrorMap { @@ -261,7 +266,7 @@ IDS_ERRORPAGES_HEADING_INSECURE_CONNECTION, IDS_ERRORPAGES_SUMMARY_INVALID_RESPONSE, IDS_ERRORPAGES_DETAILS_SSL_PROTOCOL_ERROR, - SUGGEST_RELOAD, + SUGGEST_RELOAD | SUGGEST_LEARNMORE, }, {net::ERR_BAD_SSL_CLIENT_AUTH_CERT, IDS_ERRORPAGES_TITLE_LOAD_FAILED, @@ -275,7 +280,7 @@ IDS_ERRORPAGES_HEADING_INSECURE_CONNECTION, IDS_ERRORPAGES_SUMMARY_SSL_SECURITY_ERROR, IDS_ERRORPAGES_DETAILS_SSL_PROTOCOL_ERROR, - SUGGEST_LEARNMORE, + SUGGEST_LEARNMORE_STANDALONE, }, {net::ERR_SSL_PINNED_KEY_NOT_IN_CERT_CHAIN, IDS_ERRORPAGES_TITLE_LOAD_FAILED, @@ -324,7 +329,7 @@ IDS_ERRORPAGES_HEADING_INSECURE_CONNECTION, IDS_ERRORPAGES_SUMMARY_INVALID_RESPONSE, IDS_ERRORPAGES_DETAILS_SSL_FALLBACK_BEYOND_MINIMUM_VERSION, - SUGGEST_NONE, + SUGGEST_LEARNMORE_STANDALONE, }, {net::ERR_SSL_VERSION_OR_CIPHER_MISMATCH, IDS_ERRORPAGES_TITLE_LOAD_FAILED, @@ -568,6 +573,53 @@ } } +// Adds a linked suggestion dictionary entry to the suggestions list. +void AddLinkedSuggestionToList(const int error_code, + const std::string& locale, + base::ListValue* suggestions_summary_list) { + GURL learn_more_url; + base::string16 suggestion_string; + + switch (error_code) { + case net::ERR_SSL_WEAK_SERVER_EPHEMERAL_DH_KEY: + learn_more_url = GURL(kWeakDHKeyLearnMoreUrl); + suggestion_string = l10n_util::GetStringUTF16( + IDS_ERRORPAGES_SUGGESTION_LEARNMORE_SUMMARY); + break; + case net::ERR_SSL_FALLBACK_BEYOND_MINIMUM_VERSION: + learn_more_url = GURL(kSslInvalidResponseLearnMoreUrl); + suggestion_string = l10n_util::GetStringUTF16( + IDS_ERRORPAGES_SUGGESTION_LEARNMORE_SUMMARY); + break; + case net::ERR_TOO_MANY_REDIRECTS: + learn_more_url = GURL(kRedirectLoopLearnMoreUrl); + suggestion_string = l10n_util::GetStringUTF16( + IDS_ERRORPAGES_SUGGESTION_CLEAR_COOKIES_SUMMARY); + break; + case net::ERR_SSL_PROTOCOL_ERROR: + learn_more_url = GURL(kSslInvalidResponseLearnMoreUrl); + suggestion_string = l10n_util::GetStringUTF16( + IDS_ERRORPAGES_SUGGESTION_LEARNMORE_SUMMARY); + break; + default: + NOTREACHED(); + break; + } + + DCHECK(learn_more_url.is_valid()); + // Add the language parameter to the URL. + std::string query = learn_more_url.query() + "&hl=" + locale; + GURL::Replacements repl; + repl.SetQueryStr(query); + GURL learn_more_url_with_locale = learn_more_url.ReplaceComponents(repl); + + base::DictionaryValue* suggestion_list_item = new base::DictionaryValue; + suggestion_list_item->SetString("summary", suggestion_string); + suggestion_list_item->SetString("learnMoreUrl", + learn_more_url_with_locale.spec()); + suggestions_summary_list->Append(suggestion_list_item); +} + // Creates a list of suggestions that a user may try to resolve a particular // network error. Appears above the fold underneath heading and intro paragraph. void GetSuggestionsSummaryList(int error_code, @@ -605,6 +657,13 @@ return; } + if (suggestions & SUGGEST_LEARNMORE_STANDALONE) { + DCHECK(suggestions_summary_list->empty()); + DCHECK(!(suggestions & ~SUGGEST_LEARNMORE_STANDALONE)); + AddLinkedSuggestionToList(error_code, locale, suggestions_summary_list); + return; + } + if (suggestions & SUGGEST_CHECK_CONNECTION) { AddSingleEntryDictionaryToList(suggestions_summary_list, "summary", IDS_ERRORPAGES_SUGGESTION_CHECK_CONNECTION_SUMMARY, false); @@ -661,35 +720,7 @@ } if (suggestions & SUGGEST_LEARNMORE) { - GURL learn_more_url; - base::string16 suggestion_string; - switch (error_code) { - case net::ERR_SSL_WEAK_SERVER_EPHEMERAL_DH_KEY: - learn_more_url = GURL(kWeakDHKeyLearnMoreUrl); - suggestion_string = l10n_util::GetStringUTF16( - IDS_ERRORPAGES_SUGGESTION_LEARNMORE_SUMMARY); - break; - case net::ERR_TOO_MANY_REDIRECTS: - learn_more_url = GURL(kRedirectLoopLearnMoreUrl); - suggestion_string = l10n_util::GetStringUTF16( - IDS_ERRORPAGES_SUGGESTION_CLEAR_COOKIES_SUMMARY); - break; - default: - NOTREACHED(); - break; - } - - DCHECK(learn_more_url.is_valid()); - // Add the language parameter to the URL. - std::string query = learn_more_url.query() + "&hl=" + locale; - GURL::Replacements repl; - repl.SetQueryStr(query); - learn_more_url = learn_more_url.ReplaceComponents(repl); - - base::DictionaryValue* suggestion_list_item = new base::DictionaryValue; - suggestion_list_item->SetString("summary", suggestion_string); - suggestion_list_item->SetString("learnMoreUrl", learn_more_url.spec()); - suggestions_summary_list->Append(suggestion_list_item); + AddLinkedSuggestionToList(error_code, locale, suggestions_summary_list); } // Only add a explicit reload suggestion if there are other suggestions.
diff --git a/components/exo.gypi b/components/exo.gypi index 7814ce5..fdf82cec 100644 --- a/components/exo.gypi +++ b/components/exo.gypi
@@ -24,6 +24,9 @@ '../ui/gl/gl.gyp:gl', '../ui/views/views.gyp:views', ], + 'export_dependent_settings': [ + '../ui/views/views.gyp:views', + ], 'sources': [ # Note: sources list duplicated in GN build. 'exo/buffer.cc',
diff --git a/components/metrics.gypi b/components/metrics.gypi index f735b347..a08db88a 100644 --- a/components/metrics.gypi +++ b/components/metrics.gypi
@@ -261,6 +261,8 @@ 'metrics/leak_detector/custom_allocator.h', 'metrics/leak_detector/leak_analyzer.cc', 'metrics/leak_detector/leak_analyzer.h', + 'metrics/leak_detector/leak_detector.cc', + 'metrics/leak_detector/leak_detector.h', 'metrics/leak_detector/leak_detector_impl.cc', 'metrics/leak_detector/leak_detector_impl.h', 'metrics/leak_detector/leak_detector_value_type.cc',
diff --git a/components/metrics/BUILD.gn b/components/metrics/BUILD.gn index bb421f1..6130dd5 100644 --- a/components/metrics/BUILD.gn +++ b/components/metrics/BUILD.gn
@@ -124,6 +124,8 @@ "leak_detector/custom_allocator.h", "leak_detector/leak_analyzer.cc", "leak_detector/leak_analyzer.h", + "leak_detector/leak_detector.cc", + "leak_detector/leak_detector.h", "leak_detector/leak_detector_impl.cc", "leak_detector/leak_detector_impl.h", "leak_detector/leak_detector_value_type.cc", @@ -134,6 +136,7 @@ deps = [ "//base", + "//content/public/browser", ] } } @@ -286,12 +289,14 @@ "leak_detector/call_stack_table_unittest.cc", "leak_detector/leak_analyzer_unittest.cc", "leak_detector/leak_detector_impl_unittest.cc", + "leak_detector/leak_detector_unittest.cc", "leak_detector/ranked_list_unittest.cc", ] deps = [ ":leak_detector", "//base", + "//content/test:test_support", "//testing/gtest", ] }
diff --git a/components/metrics/DEPS b/components/metrics/DEPS index 2898844..8960a59 100644 --- a/components/metrics/DEPS +++ b/components/metrics/DEPS
@@ -7,6 +7,8 @@ "+components/prefs", "+components/variations", "+components/version_info", + "+content/public/browser", + "+content/public/test", "+third_party/zlib/google", "-net", ]
diff --git a/components/metrics/leak_detector/leak_detector.cc b/components/metrics/leak_detector/leak_detector.cc new file mode 100644 index 0000000..0fbd868 --- /dev/null +++ b/components/metrics/leak_detector/leak_detector.cc
@@ -0,0 +1,50 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/metrics/leak_detector/leak_detector.h" + +#include "content/public/browser/browser_thread.h" + +namespace metrics { + +LeakDetector::LeakReport::LeakReport() {} + +LeakDetector::LeakReport::~LeakReport() {} + +LeakDetector::LeakDetector(float sampling_rate, + size_t max_call_stack_unwind_depth, + uint64_t analysis_interval_bytes, + uint32_t size_suspicion_threshold, + uint32_t call_stack_suspicion_threshold) + : weak_factory_(this) { + // TODO(sque): Connect this class to LeakDetectorImpl and base::allocator. +} + +LeakDetector::~LeakDetector() {} + +void LeakDetector::AddObserver(Observer* observer) { + DCHECK(thread_checker_.CalledOnValidThread()); + observers_.AddObserver(observer); +} + +void LeakDetector::RemoveObserver(Observer* observer) { + DCHECK(thread_checker_.CalledOnValidThread()); + observers_.RemoveObserver(observer); +} + +void LeakDetector::NotifyObservers(const std::vector<LeakReport>& reports) { + if (!content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)) { + content::BrowserThread::PostTask( + content::BrowserThread::UI, FROM_HERE, + base::Bind(&LeakDetector::NotifyObservers, weak_factory_.GetWeakPtr(), + reports)); + return; + } + + for (const LeakReport& report : reports) { + FOR_EACH_OBSERVER(Observer, observers_, OnLeakFound(report)); + } +} + +} // namespace metrics
diff --git a/components/metrics/leak_detector/leak_detector.h b/components/metrics/leak_detector/leak_detector.h new file mode 100644 index 0000000..e236094 --- /dev/null +++ b/components/metrics/leak_detector/leak_detector.h
@@ -0,0 +1,109 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_METRICS_LEAK_DETECTOR_LEAK_DETECTOR_H_ +#define COMPONENTS_METRICS_LEAK_DETECTOR_LEAK_DETECTOR_H_ + +#include <stddef.h> +#include <stdint.h> + +#include <list> +#include <vector> + +#include "base/feature_list.h" +#include "base/gtest_prod_util.h" +#include "base/macros.h" +#include "base/memory/weak_ptr.h" +#include "base/observer_list.h" +#include "base/threading/thread_checker.h" + +namespace metrics { + +// LeakDetector is an interface layer that connects the allocator +// (base::allocator), the leak detector logic (LeakDetectorImpl), and any +// external classes interested in receiving leak reports (extend the Observer +// class). +// +// Currently it is stubbed out and only provides an interface for registering +// observers to receive leak reports. +// TODO(sque): Add the full functionality and allow only one instance. +// +// This class is not thread-safe, and it should always be called on the same +// thread that instantiated it. +class LeakDetector { + public: + // Contains a report of a detected memory leak. + struct LeakReport { + LeakReport(); + ~LeakReport(); + + size_t alloc_size_bytes; + + // Unlike the CallStack struct, which consists of addresses, this call stack + // will contain offsets in the executable binary. + std::vector<uintptr_t> call_stack; + }; + + // Interface for receiving leak reports. + class Observer { + public: + virtual ~Observer() {} + + // Called by leak detector to report a leak. + virtual void OnLeakFound(const LeakReport& report) = 0; + }; + + // Constructor arguments: + // sampling_rate: + // Pseudorandomly sample a fraction of the incoming allocations and frees, + // based on hash values. Setting to 0 means no allocs/frees are sampled. + // Setting to 1.0 or more means all allocs/frees are sampled. Anything in + // between will result in an approximately that fraction of allocs/frees + // being sampled. + // max_call_stack_unwind_depth: + // The max number of call stack frames to unwind. + // analysis_interval_bytes: + // Perform a leak analysis each time this many bytes have been allocated + // since the previous analysis. + // size_suspicion_threshold, call_stack_suspicion_threshold: + // A possible leak should be suspected this many times to take action on i + // For size analysis, the action is to start profiling by call stack. + // For call stack analysis, the action is to generate a leak report. + LeakDetector(float sampling_rate, + size_t max_call_stack_unwind_depth, + uint64_t analysis_interval_bytes, + uint32_t size_suspicion_threshold, + uint32_t call_stack_suspicion_threshold); + + ~LeakDetector(); + + // Add |observer| to the list of stored Observers, i.e. |observers_|, to which + // the leak detector will report leaks. + void AddObserver(Observer* observer); + + // Remove |observer| from |observers_|. + void RemoveObserver(Observer* observer); + + private: + FRIEND_TEST_ALL_PREFIXES(LeakDetectorTest, NotifyObservers); + + // Notifies all Observers in |observers_| with the given vector of leak + // reports. + void NotifyObservers(const std::vector<LeakReport>& reports); + + // List of observers to notify when there's a leak report. + base::ObserverList<Observer> observers_; + + // For thread safety. + base::ThreadChecker thread_checker_; + + // For generating closures containing objects of this class. + base::WeakPtrFactory<LeakDetector> weak_factory_; + + DISALLOW_COPY_AND_ASSIGN(LeakDetector); +}; + +} // namespace metrics + +#endif // COMPONENTS_METRICS_LEAK_DETECTOR_LEAK_DETECTOR_H_
diff --git a/components/metrics/leak_detector/leak_detector_unittest.cc b/components/metrics/leak_detector/leak_detector_unittest.cc new file mode 100644 index 0000000..a134a17 --- /dev/null +++ b/components/metrics/leak_detector/leak_detector_unittest.cc
@@ -0,0 +1,124 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/metrics/leak_detector/leak_detector.h" + +#include <set> + +#include "base/macros.h" +#include "base/memory/scoped_ptr.h" +#include "content/public/test/test_browser_thread_bundle.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace metrics { + +namespace { + +// Default values for LeakDetector params. See header file for the meaning of +// each parameter. +const float kDefaultSamplingRate = 1.0f; +const size_t kDefaultMaxCallStackUnwindDepth = 4; +const uint64_t kDefaultAnalysisIntervalBytes = 32 * 1024 * 1024; // 32 MiB. +const uint32_t kDefaultSizeSuspicionThreshold = 4; +const uint32_t kDefaultCallStackSuspicionThreshold = 4; + +using LeakReport = LeakDetector::LeakReport; + +// Observer class that receives leak reports and stores them in |reports_|. +// Only one copy of each unique report will be stored. +class TestObserver : public LeakDetector::Observer { + public: + // Contains a comparator function used to compare LeakReports for uniqueness. + struct Comparator { + bool operator()(const LeakReport& a, const LeakReport& b) const { + if (a.alloc_size_bytes != b.alloc_size_bytes) + return a.alloc_size_bytes < b.alloc_size_bytes; + + return a.call_stack < b.call_stack; + } + }; + + TestObserver() {} + + void OnLeakFound(const LeakReport& report) override { + reports_.insert(report); + } + + const std::set<LeakReport, Comparator>& reports() const { return reports_; } + + private: + // Container for all leak reports received through OnLeakFound(). Stores only + // one copy of each unique report. + std::set<LeakReport, Comparator> reports_; + + DISALLOW_COPY_AND_ASSIGN(TestObserver); +}; + +} // namespace + +class LeakDetectorTest : public ::testing::Test { + public: + LeakDetectorTest() + : detector_(new LeakDetector(kDefaultSamplingRate, + kDefaultMaxCallStackUnwindDepth, + kDefaultAnalysisIntervalBytes, + kDefaultSizeSuspicionThreshold, + kDefaultCallStackSuspicionThreshold)) {} + + protected: + // Use a scoped_ptr to hold the test object so it can be destroyed before the + // test is over. + scoped_ptr<LeakDetector> detector_; + + private: + // For supporting content::BrowserThread operations. + content::TestBrowserThreadBundle thread_bundle_; + + DISALLOW_COPY_AND_ASSIGN(LeakDetectorTest); +}; + +TEST_F(LeakDetectorTest, NotifyObservers) { + // Generate two sets of leak reports. + std::vector<LeakReport> reports1(3); + reports1[0].alloc_size_bytes = 8; + reports1[0].call_stack = {1, 2, 3, 4}; + reports1[1].alloc_size_bytes = 16; + reports1[1].call_stack = {5, 6, 7, 8}; + reports1[2].alloc_size_bytes = 24; + reports1[2].call_stack = {9, 10, 11, 12}; + + std::vector<LeakReport> reports2(3); + reports2[0].alloc_size_bytes = 32; + reports2[0].call_stack = {1, 2, 4, 8}; + reports2[1].alloc_size_bytes = 40; + reports2[1].call_stack = {16, 32, 64, 128}; + reports2[2].alloc_size_bytes = 48; + reports2[2].call_stack = {256, 512, 1024, 2048}; + + // Register three observers; + TestObserver obs1, obs2, obs3; + detector_->AddObserver(&obs1); + detector_->AddObserver(&obs2); + detector_->AddObserver(&obs3); + + // Pass both sets of reports to the leak detector. + detector_->NotifyObservers(reports1); + detector_->NotifyObservers(reports2); + + // Shut down the leak detector before checking the reports, so that the + // stored reports can be examined without new reports being generated. + detector_.reset(); + + // Check that all three observers got both sets of reports, passed in + // separately. + for (const TestObserver* obs : {&obs1, &obs2, &obs3}) { + EXPECT_EQ(6U, obs->reports().size()); + for (const auto& report : {reports1[0], reports1[1], reports1[2], + reports2[0], reports2[1], reports2[2]}) { + EXPECT_TRUE(obs->reports().find(report) != obs->reports().end()); + } + } +} + +} // namespace metrics
diff --git a/components/metrics/net/network_metrics_provider.cc b/components/metrics/net/network_metrics_provider.cc index 29fe946d..07cdf57 100644 --- a/components/metrics/net/network_metrics_provider.cc +++ b/components/metrics/net/network_metrics_provider.cc
@@ -38,11 +38,11 @@ net::NetworkChangeNotifier::RemoveConnectionTypeObserver(this); } -void NetworkMetricsProvider::OnDidCreateMetricsLog() { -#if defined(OS_ANDROID) - net::NetworkChangeNotifier::LogOperatorCodeHistogram( - net::NetworkChangeNotifier::GetConnectionType()); -#endif // OS_ANDROID +void NetworkMetricsProvider::ProvideGeneralMetrics( + ChromeUserMetricsExtension*) { + // ProvideGeneralMetrics is called on the main thread, at the time a metrics + // record is being finalized. + net::NetworkChangeNotifier::FinalizingMetricsLogRecord(); } void NetworkMetricsProvider::ProvideSystemProfileMetrics(
diff --git a/components/metrics/net/network_metrics_provider.h b/components/metrics/net/network_metrics_provider.h index 2b100a9ab..e1f02dd 100644 --- a/components/metrics/net/network_metrics_provider.h +++ b/components/metrics/net/network_metrics_provider.h
@@ -29,7 +29,7 @@ private: // MetricsProvider: - void OnDidCreateMetricsLog() override; + void ProvideGeneralMetrics(ChromeUserMetricsExtension* uma_proto) override; void ProvideSystemProfileMetrics(SystemProfileProto* system_profile) override; // ConnectionTypeObserver:
diff --git a/components/nacl/broker/nacl_broker_listener.cc b/components/nacl/broker/nacl_broker_listener.cc index aedf5149..2704695a 100644 --- a/components/nacl/broker/nacl_broker_listener.cc +++ b/components/nacl/broker/nacl_broker_listener.cc
@@ -9,6 +9,7 @@ #include "base/command_line.h" #include "base/message_loop/message_loop.h" #include "base/path_service.h" +#include "base/process/launch.h" #include "base/process/process.h" #include "base/process/process_handle.h" #include "base/thread_task_runner_handle.h" @@ -108,8 +109,8 @@ cmd_line->AppendSwitchASCII(switches::kProcessChannelID, loader_channel_id); - base::Process loader_process = content::StartSandboxedProcess(this, - cmd_line); + base::Process loader_process = content::StartSandboxedProcess( + this, cmd_line, base::HandlesToInheritVector()); if (loader_process.IsValid()) { // Note: PROCESS_DUP_HANDLE is necessary here, because: // 1) The current process is the broker, which is the loader's parent.
diff --git a/components/omnibox/browser/url_index_private_data.cc b/components/omnibox/browser/url_index_private_data.cc index 3845922..419db066 100644 --- a/components/omnibox/browser/url_index_private_data.cc +++ b/components/omnibox/browser/url_index_private_data.cc
@@ -177,7 +177,8 @@ base::string16 lower_raw_string(base::i18n::ToLower(search_string)); base::string16 lower_unescaped_string = net::UnescapeURLComponent(lower_raw_string, - net::UnescapeRule::SPACES | net::UnescapeRule::URL_SPECIAL_CHARS); + net::UnescapeRule::SPACES | net::UnescapeRule::PATH_SEPARATORS | + net::UnescapeRule::URL_SPECIAL_CHARS_EXCEPT_PATH_SEPARATORS); // Extract individual 'words' (as opposed to 'terms'; see below) from the // search string. When the user types "colspec=ID%20Mstone Release" we get // four 'words': "colspec", "id", "mstone" and "release".
diff --git a/components/page_load_metrics/browser/metrics_web_contents_observer.cc b/components/page_load_metrics/browser/metrics_web_contents_observer.cc index 81747999..21130fa 100644 --- a/components/page_load_metrics/browser/metrics_web_contents_observer.cc +++ b/components/page_load_metrics/browser/metrics_web_contents_observer.cc
@@ -159,14 +159,13 @@ void PageLoadTracker::WebContentsHidden() { // Only log the first time we background in a given page load. - if (started_in_foreground_ && background_time_.is_null()) + if (background_time_.is_null()) background_time_ = base::TimeTicks::Now(); } void PageLoadTracker::WebContentsShown() { // Only log the first time we foreground in a given page load. - // Don't log foreground time if we started foregrounded. - if (!started_in_foreground_ && foreground_time_.is_null()) + if (foreground_time_.is_null()) foreground_time_ = base::TimeTicks::Now(); } @@ -227,9 +226,9 @@ base::TimeDelta first_foreground_time; base::TimeDelta time_to_abort; base::TimeDelta time_to_commit; - if (!background_time_.is_null() && started_in_foreground_) + if (!background_time_.is_null()) first_background_time = background_time_ - navigation_start_; - if (!foreground_time_.is_null() && !started_in_foreground_) + if (!foreground_time_.is_null()) first_foreground_time = foreground_time_ - navigation_start_; if (abort_type_ != ABORT_NONE) { DCHECK_GT(abort_time_, navigation_start_);
diff --git a/components/page_load_metrics/browser/page_load_metrics_observer.h b/components/page_load_metrics/browser/page_load_metrics_observer.h index 0f455c23..c42f36d 100644 --- a/components/page_load_metrics/browser/page_load_metrics_observer.h +++ b/components/page_load_metrics/browser/page_load_metrics_observer.h
@@ -59,14 +59,12 @@ UserAbortType abort_type, base::TimeDelta time_to_abort); - // Returns the time to first background if the page load started in the - // foreground. If the page has not been backgrounded, or the page started in - // the background, this will be base::TimeDelta(). + // The first time that the page was backgrounded since the navigation started. + // If the page has not been backgrounded this will be base::TimeDelta(). const base::TimeDelta first_background_time; - // Returns the time to first foreground if the page load started in the - // background. If the page has not been foregrounded, or the page started in - // the foreground, this will be base::TimeDelta(). + // The first time that the page was foregrounded since the navigation started. + // If the page has not been foregrounded this will be base::TimeDelta(). const base::TimeDelta first_foreground_time; // True if the page load started in the foreground.
diff --git a/components/page_load_metrics/browser/page_load_metrics_util.cc b/components/page_load_metrics/browser/page_load_metrics_util.cc index 913b141..dbfa35e 100644 --- a/components/page_load_metrics/browser/page_load_metrics_util.cc +++ b/components/page_load_metrics/browser/page_load_metrics_util.cc
@@ -11,8 +11,8 @@ namespace page_load_metrics { -bool EventOccurredInForeground(base::TimeDelta event, - const PageLoadExtraInfo& info) { +bool WasStartedInForegroundEventInForeground(base::TimeDelta event, + const PageLoadExtraInfo& info) { return info.started_in_foreground && !event.is_zero() && (info.first_background_time.is_zero() || event < info.first_background_time);
diff --git a/components/page_load_metrics/browser/page_load_metrics_util.h b/components/page_load_metrics/browser/page_load_metrics_util.h index 375debb..380c077 100644 --- a/components/page_load_metrics/browser/page_load_metrics_util.h +++ b/components/page_load_metrics/browser/page_load_metrics_util.h
@@ -18,13 +18,15 @@ struct PageLoadExtraInfo; struct PageLoadTiming; -// Returns false for events for which we have no timing information, and events -// that happened on a page that had been in the background. When a page is -// backgrounded, some events (e.g. paint) are delayed. Since these data points -// can skew the mean, they should not be mixed with timing events that occurred -// in the foreground. -bool EventOccurredInForeground(base::TimeDelta event, - const PageLoadExtraInfo& info); +// Returns true if: +// - We have timing information for the event. +// - The page load started while the page was in the foreground. +// - The event occurred prior to the page being moved to the background. +// When a page is backgrounded, some events (e.g. paint) are delayed. Since +// these data points can skew the mean, they should not be mixed with timing +// events that occurred in the foreground. +bool WasStartedInForegroundEventInForeground(base::TimeDelta event, + const PageLoadExtraInfo& info); } // namespace page_load_metrics
diff --git a/components/pairing/shark_connection_listener.cc b/components/pairing/shark_connection_listener.cc index 961d962..db9b4b7 100644 --- a/components/pairing/shark_connection_listener.cc +++ b/components/pairing/shark_connection_listener.cc
@@ -25,10 +25,14 @@ } void SharkConnectionListener::PairingStageChanged(Stage new_stage) { - if (new_stage == HostPairingController::STAGE_WAITING_FOR_CODE_CONFIRMATION) { + if (new_stage == HostPairingController::STAGE_WAITING_FOR_CODE_CONFIRMATION + // Code confirmation stage can be skipped if devices were paired before. + || new_stage == HostPairingController::STAGE_SETUP_BASIC_CONFIGURATION) { controller_->RemoveObserver(this); callback_.Run(std::move(controller_)); callback_.Reset(); + } else if (new_stage != HostPairingController::STAGE_WAITING_FOR_CONTROLLER) { + LOG(ERROR) << "Unexpected stage " << new_stage; } }
diff --git a/components/password_manager/core/browser/password_form_manager.cc b/components/password_manager/core/browser/password_form_manager.cc index 60a01ef..959e5a7 100644 --- a/components/password_manager/core/browser/password_form_manager.cc +++ b/components/password_manager/core/browser/password_form_manager.cc
@@ -91,6 +91,27 @@ return !s.empty() && DoesStringContainOnlyDigits(s) && s.size() < 3; } +// Splits federated matches from |store_results| into a separate vector and +// returns that. +std::vector<scoped_ptr<autofill::PasswordForm>> SplitFederatedMatches( + ScopedVector<PasswordForm>* store_results) { + auto first_federated = + std::partition(store_results->begin(), store_results->end(), + [](const PasswordForm* form) { + return form->federation_origin.unique(); + }); + + std::vector<scoped_ptr<autofill::PasswordForm>> federated_matches; + federated_matches.reserve(store_results->end() - first_federated); + for (auto federated = first_federated; federated != store_results->end(); + ++federated) { + federated_matches.push_back(make_scoped_ptr(*federated)); + *federated = nullptr; + } + store_results->weak_erase(first_federated, store_results->end()); + return federated_matches; +} + } // namespace PasswordFormManager::PasswordFormManager( @@ -512,7 +533,8 @@ else manager_action_ = kManagerActionAutofilled; password_manager_->Autofill(driver.get(), observed_form_, best_matches_, - *preferred_match_, wait_for_username); + federated_matches_, *preferred_match_, + wait_for_username); } void PasswordFormManager::ProcessLoginPrompt() { @@ -544,6 +566,7 @@ logger->LogNumber(Logger::STRING_NUMBER_RESULTS, results.size()); } + federated_matches_ = SplitFederatedMatches(&results); if (!results.empty()) OnRequestDone(std::move(results)); state_ = POST_MATCHING_PHASE;
diff --git a/components/password_manager/core/browser/password_form_manager.h b/components/password_manager/core/browser/password_form_manager.h index 27f4cd3..6bb8623 100644 --- a/components/password_manager/core/browser/password_form_manager.h +++ b/components/password_manager/core/browser/password_form_manager.h
@@ -231,6 +231,10 @@ return is_possible_change_password_form_without_username_; } + const std::vector<scoped_ptr<autofill::PasswordForm>>& federated_matches() { + return federated_matches_; + } + // Use this to wipe copies of |pending_credentials_| from the password store // (and |best_matches_| as well. It will only wipe if: // 1. The stored password differs from the one in |pending_credentials_|. @@ -453,6 +457,12 @@ // that are not in |best_matches_|. ScopedVector<autofill::PasswordForm> not_best_matches_; + // Federated credentials relevant to the observed form. They are neither + // filled not saved by this PasswordFormManager, so they are kept separately + // from |best_matches_|. The PasswordFormManager passes them further to + // PasswordManager to show them in the UI. + std::vector<scoped_ptr<autofill::PasswordForm>> federated_matches_; + // Set of blacklisted forms from the PasswordStore that best match the current // form. ScopedVector<autofill::PasswordForm> blacklisted_matches_;
diff --git a/components/password_manager/core/browser/password_form_manager_unittest.cc b/components/password_manager/core/browser/password_form_manager_unittest.cc index 09269c6..c0947af 100644 --- a/components/password_manager/core/browser/password_form_manager_unittest.cc +++ b/components/password_manager/core/browser/password_form_manager_unittest.cc
@@ -36,6 +36,8 @@ #include "components/prefs/testing_pref_service.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" +#include "url/gurl.h" +#include "url/origin.h" using autofill::PasswordForm; using base::ASCIIToUTF16; @@ -2938,4 +2940,25 @@ EXPECT_EQ(autofill::PasswordForm::TYPE_API, new_credentials.type); } +TEST_F(PasswordFormManagerTest, FederatedCredentialsFiltered) { + PasswordForm federated(*saved_match()); + federated.password_value.clear(); + federated.federation_origin = + url::Origin(GURL("https://accounts.google.com")); + + EXPECT_CALL(*mock_store(), + GetLogins(form_manager()->observed_form(), form_manager())); + form_manager()->FetchDataFromPasswordStore(); + + ScopedVector<PasswordForm> results; + results.push_back(new PasswordForm(federated)); + results.push_back(new PasswordForm(*saved_match())); + form_manager()->OnGetPasswordStoreResults(std::move(results)); + + EXPECT_EQ(1u, form_manager()->federated_matches().size()); + EXPECT_EQ(*form_manager()->federated_matches()[0], federated); + EXPECT_EQ(1u, form_manager()->best_matches().size()); + EXPECT_EQ(*(form_manager()->best_matches().begin()->second), *saved_match()); +} + } // namespace password_manager
diff --git a/components/password_manager/core/browser/password_manager.cc b/components/password_manager/core/browser/password_manager.cc index 6f4d050c..620d14b 100644 --- a/components/password_manager/core/browser/password_manager.cc +++ b/components/password_manager/core/browser/password_manager.cc
@@ -742,11 +742,13 @@ return false; } -void PasswordManager::Autofill(password_manager::PasswordManagerDriver* driver, - const PasswordForm& form_for_autofill, - const PasswordFormMap& best_matches, - const PasswordForm& preferred_match, - bool wait_for_username) const { +void PasswordManager::Autofill( + password_manager::PasswordManagerDriver* driver, + const PasswordForm& form_for_autofill, + const PasswordFormMap& best_matches, + const std::vector<scoped_ptr<PasswordForm>>& federated_matches, + const PasswordForm& preferred_match, + bool wait_for_username) const { DCHECK_EQ(PasswordForm::SCHEME_HTML, preferred_match.scheme); scoped_ptr<BrowserSavePasswordProgressLogger> logger; @@ -769,7 +771,8 @@ PreferredRealmIsFromAndroid(fill_data)); driver->FillPasswordForm(fill_data); - client_->PasswordWasAutofilled(best_matches, form_for_autofill.origin); + client_->PasswordWasAutofilled(best_matches, form_for_autofill.origin, + &federated_matches); } void PasswordManager::AutofillHttpAuth( @@ -790,7 +793,7 @@ OnAutofillDataAvailable(preferred_match)); DCHECK(!best_matches.empty()); client_->PasswordWasAutofilled(best_matches, - best_matches.begin()->second->origin); + best_matches.begin()->second->origin, nullptr); } void PasswordManager::ProcessAutofillPredictions(
diff --git a/components/password_manager/core/browser/password_manager.h b/components/password_manager/core/browser/password_manager.h index 745251a8..f2c8b616 100644 --- a/components/password_manager/core/browser/password_manager.h +++ b/components/password_manager/core/browser/password_manager.h
@@ -63,11 +63,13 @@ // Called by a PasswordFormManager when it decides a form can be autofilled // on the page. - void Autofill(password_manager::PasswordManagerDriver* driver, - const autofill::PasswordForm& form_for_autofill, - const autofill::PasswordFormMap& best_matches, - const autofill::PasswordForm& preferred_match, - bool wait_for_username) const; + void Autofill( + password_manager::PasswordManagerDriver* driver, + const autofill::PasswordForm& form_for_autofill, + const autofill::PasswordFormMap& best_matches, + const std::vector<scoped_ptr<autofill::PasswordForm>>& federated_matches, + const autofill::PasswordForm& preferred_match, + bool wait_for_username) const; // Called by a PasswordFormManager when it decides a HTTP auth dialog can be // autofilled.
diff --git a/components/password_manager/core/browser/password_manager_client.cc b/components/password_manager/core/browser/password_manager_client.cc index 78ed5ca..a3f8e13 100644 --- a/components/password_manager/core/browser/password_manager_client.cc +++ b/components/password_manager/core/browser/password_manager_client.cc
@@ -26,7 +26,9 @@ void PasswordManagerClient::PasswordWasAutofilled( const autofill::PasswordFormMap& best_matches, - const GURL& origin) const {} + const GURL& origin, + const std::vector<scoped_ptr<autofill::PasswordForm>>* federated_matches) + const {} PasswordSyncState PasswordManagerClient::GetPasswordSyncState() const { return NOT_SYNCING_PASSWORDS;
diff --git a/components/password_manager/core/browser/password_manager_client.h b/components/password_manager/core/browser/password_manager_client.h index 2c26a0f..5939874 100644 --- a/components/password_manager/core/browser/password_manager_client.h +++ b/components/password_manager/core/browser/password_manager_client.h
@@ -5,6 +5,8 @@ #ifndef COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_PASSWORD_MANAGER_CLIENT_H_ #define COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_PASSWORD_MANAGER_CLIENT_H_ +#include <vector> + #include "base/callback.h" #include "base/macros.h" #include "base/memory/scoped_vector.h" @@ -128,11 +130,15 @@ // Called when a password is autofilled. |best_matches| contains the // PasswordForm into which a password was filled: the client may choose to // save this to the PasswordStore, for example. |origin| is the origin of the - // form into which a password was filled. Default implementation is a - // noop. + // form into which a password was filled. |federated_matches| are the stored + // federated matches relevant to the filled form, this argument may be null. + // They are never filled, but might be needed in the UI, for example. Default + // implementation is a noop. virtual void PasswordWasAutofilled( const autofill::PasswordFormMap& best_matches, - const GURL& origin) const; + const GURL& origin, + const std::vector<scoped_ptr<autofill::PasswordForm>>* federated_matches) + const; // Gets prefs associated with this embedder. virtual PrefService* GetPrefs() = 0;
diff --git a/components/policy/resources/policy_templates.json b/components/policy/resources/policy_templates.json index b626efa..7bdc31e 100644 --- a/components/policy/resources/policy_templates.json +++ b/components/policy/resources/policy_templates.json
@@ -137,7 +137,7 @@ # persistent IDs for all fields (but not for groups!) are needed. These are # specified by the 'id' keys of each policy. NEVER CHANGE EXISTING IDs, # because doing so would break the deployed wire format! -# For your editing convenience: highest ID currently used: 319 +# For your editing convenience: highest ID currently used: 320 # # Placeholders: # The following placeholder strings are automatically substituted: @@ -3076,6 +3076,38 @@ If this policy is left not set, 'PromptOnAccess' will be used and the user will be able to change it.''', }, { + 'name': 'DefaultWebBluetoothGuardSetting', + 'type': 'int-enum', + 'schema': { + 'type': 'integer', + 'enum': [ 2, 3 ], + }, + 'items': [ + { + 'name': 'BlockWebBluetooth', + 'value': 2, + 'caption': '''Do not allow any site to request access to Bluetooth devices via the Web Bluetooth API''', + }, + { + 'name': 'AskWebBluetooth', + 'value': 3, + 'caption': '''Allow sites to ask the user to grant access to a nearby Bluetooth device''', + }, + ], + 'supported_on': ['chrome_os:50-', 'android:50-', 'chrome.*:50-'], + 'features': { + 'dynamic_refresh': True, + 'per_profile': True, + }, + 'example_value': 2, + 'id': 320, + 'caption': '''Control use of the Web Bluetooth API''', + 'tags': ['website-sharing'], + 'desc': '''Allows you to set whether websites are allowed to get access to nearby Bluetooth devices. Access can be completely blocked, or the user can be asked every time a website wants to get access to nearby Bluetooth devices. + + If this policy is left not set, '3' will be used, and the user will be able to change it.''', + }, + { 'name': 'DefaultKeygenSetting', 'type': 'int-enum', 'schema': {
diff --git a/components/safe_browsing_db/database_manager.h b/components/safe_browsing_db/database_manager.h index 660a6ee..f5ba2dbe 100644 --- a/components/safe_browsing_db/database_manager.h +++ b/components/safe_browsing_db/database_manager.h
@@ -43,7 +43,7 @@ // Called when the result of checking a browse URL is known. virtual void OnCheckBrowseUrlResult(const GURL& url, SBThreatType threat_type, - const std::string& metadata) {} + const ThreatMetadata& metadata) {} // Called when the result of checking a download URL is known. virtual void OnCheckDownloadUrlResult(const std::vector<GURL>& url_chain,
diff --git a/components/safe_browsing_db/remote_database_manager.cc b/components/safe_browsing_db/remote_database_manager.cc index 74c6c0c..47d80627 100644 --- a/components/safe_browsing_db/remote_database_manager.cc +++ b/components/safe_browsing_db/remote_database_manager.cc
@@ -42,9 +42,9 @@ static void OnRequestDoneWeak(const base::WeakPtr<ClientRequest>& req, SBThreatType matched_threat_type, - const std::string& metadata); + const ThreatMetadata& metadata); void OnRequestDone(SBThreatType matched_threat_type, - const std::string& metadata); + const ThreatMetadata& metadata); // Accessors Client* client() const { return client_; } @@ -74,7 +74,7 @@ void RemoteSafeBrowsingDatabaseManager::ClientRequest::OnRequestDoneWeak( const base::WeakPtr<ClientRequest>& req, SBThreatType matched_threat_type, - const std::string& metadata) { + const ThreatMetadata& metadata) { DCHECK_CURRENTLY_ON(BrowserThread::IO); if (!req) return; // Previously canceled @@ -83,7 +83,7 @@ void RemoteSafeBrowsingDatabaseManager::ClientRequest::OnRequestDone( SBThreatType matched_threat_type, - const std::string& metadata) { + const ThreatMetadata& metadata) { DVLOG(1) << "OnRequestDone took " << timer_.Elapsed().InMilliseconds() << " ms for client " << client_ << " and URL " << url_; client_->OnCheckBrowseUrlResult(url_, matched_threat_type, metadata); @@ -251,7 +251,7 @@ DVLOG(1) << "Checking for client " << client << " and URL " << url; SafeBrowsingApiHandler* api_handler = SafeBrowsingApiHandler::GetInstance(); // This shouldn't happen since SafeBrowsingResourceThrottle checks - // IsSupported() ealier. + // IsSupported() earlier. DCHECK(api_handler) << "SafeBrowsingApiHandler was never constructed"; api_handler->StartURLCheck( base::Bind(&ClientRequest::OnRequestDoneWeak, req->GetWeakPtr()), url, @@ -298,7 +298,7 @@ std::vector<ClientRequest*> to_callback(current_requests_); for (auto req : to_callback) { DVLOG(1) << "Stopping: Invoking unfinished req for URL " << req->url(); - req->OnRequestDone(SB_THREAT_TYPE_SAFE, std::string()); + req->OnRequestDone(SB_THREAT_TYPE_SAFE, ThreatMetadata()); } enabled_ = false;
diff --git a/components/safe_browsing_db/safe_browsing_api_handler.cc b/components/safe_browsing_db/safe_browsing_api_handler.cc index fd3c3cee..178a35d 100644 --- a/components/safe_browsing_db/safe_browsing_api_handler.cc +++ b/components/safe_browsing_db/safe_browsing_api_handler.cc
@@ -2,10 +2,25 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include "base/bind.h" #include "components/safe_browsing_db/safe_browsing_api_handler.h" namespace safe_browsing { +namespace { + +// TODO(nparker): Remove this as part of crbug/589610. +void OnRequestDoneShim( + const SafeBrowsingApiHandler::URLCheckCallbackMeta& callback, + SBThreatType sb_threat_type, + const std::string& raw_metadata) { + ThreatMetadata metadata_struct; + metadata_struct.raw_metadata = raw_metadata; + callback.Run(sb_threat_type, metadata_struct); +} + +} // namespace + SafeBrowsingApiHandler* SafeBrowsingApiHandler::instance_ = NULL; // static @@ -18,4 +33,14 @@ return instance_; } +// TODO(nparker): Remove this as part of crbug/589610. +// Default impl since clank/ code doesn't yet support this. +void SafeBrowsingApiHandler::StartURLCheck( + const URLCheckCallbackMeta& callback, + const GURL& url, + const std::vector<SBThreatType>& threat_types) { + URLCheckCallback impl_callback = base::Bind(OnRequestDoneShim, callback); + StartURLCheck(impl_callback, url, threat_types); +} + } // namespace safe_browsing
diff --git a/components/safe_browsing_db/safe_browsing_api_handler.h b/components/safe_browsing_db/safe_browsing_api_handler.h index 0ffdd6b..8ec5deb 100644 --- a/components/safe_browsing_db/safe_browsing_api_handler.h +++ b/components/safe_browsing_db/safe_browsing_api_handler.h
@@ -24,13 +24,24 @@ static SafeBrowsingApiHandler* GetInstance(); typedef base::Callback<void(SBThreatType sb_threat_type, - const std::string& metadata)> + const ThreatMetadata& metadata)> + URLCheckCallbackMeta; + + // TODO(nparker): Remove this as part of crbug/589610. + typedef base::Callback<void(SBThreatType sb_threat_type, + const std::string& metadata_str)> URLCheckCallback; // Makes Native->Java call and invokes callback when check is done. + // TODO(nparker): Switch this back to pure virtual. crbug/589610. + virtual void StartURLCheck(const URLCheckCallbackMeta& callback, + const GURL& url, + const std::vector<SBThreatType>& threat_types); + + // TODO(nparker): Remove this as part of crbug/589610. virtual void StartURLCheck(const URLCheckCallback& callback, const GURL& url, - const std::vector<SBThreatType>& threat_types) = 0; + const std::vector<SBThreatType>& threat_types) {}; virtual ~SafeBrowsingApiHandler() {}
diff --git a/components/safe_browsing_db/safe_browsing_api_handler_unittest.cc b/components/safe_browsing_db/safe_browsing_api_handler_unittest.cc index 20cbe05..15b5063 100644 --- a/components/safe_browsing_db/safe_browsing_api_handler_unittest.cc +++ b/components/safe_browsing_db/safe_browsing_api_handler_unittest.cc
@@ -4,6 +4,7 @@ #include "components/safe_browsing_db/metadata.pb.h" #include "components/safe_browsing_db/safe_browsing_api_handler_util.h" +#include "components/safe_browsing_db/testing_util.h" #include "components/safe_browsing_db/util.h" #include "testing/gtest/include/gtest/gtest.h" @@ -12,65 +13,61 @@ class SafeBrowsingApiHandlerUtilTest : public ::testing::Test { protected: SBThreatType threat_; - std::string pb_str_; + ThreatMetadata meta_; + const ThreatMetadata empty_meta_; UmaRemoteCallResult ResetAndParseJson(const std::string& json) { threat_ = SB_THREAT_TYPE_EXTENSION; // Should never be seen - pb_str_ = "unitialized value"; - return ParseJsonToThreatAndPB(json, &threat_, &pb_str_); + meta_ = ThreatMetadata(); + return ParseJsonFromGMSCore(json, &threat_, &meta_); } - MalwarePatternType::PATTERN_TYPE ParsePatternType() { - MalwarePatternType proto; - EXPECT_TRUE(proto.ParseFromString(pb_str_)); - return proto.pattern_type(); - } }; TEST_F(SafeBrowsingApiHandlerUtilTest, BadJson) { EXPECT_EQ(UMA_STATUS_JSON_EMPTY, ResetAndParseJson("")); EXPECT_EQ(SB_THREAT_TYPE_SAFE, threat_); - EXPECT_TRUE(pb_str_.empty()); + EXPECT_EQ(empty_meta_, meta_); EXPECT_EQ(UMA_STATUS_JSON_FAILED_TO_PARSE, ResetAndParseJson("{")); EXPECT_EQ(SB_THREAT_TYPE_SAFE, threat_); - EXPECT_TRUE(pb_str_.empty()); + EXPECT_EQ(empty_meta_, meta_); EXPECT_EQ(UMA_STATUS_JSON_FAILED_TO_PARSE, ResetAndParseJson("[]")); EXPECT_EQ(SB_THREAT_TYPE_SAFE, threat_); - EXPECT_TRUE(pb_str_.empty()); + EXPECT_EQ(empty_meta_, meta_); EXPECT_EQ(UMA_STATUS_JSON_FAILED_TO_PARSE, ResetAndParseJson("{\"matches\":\"foo\"}")); EXPECT_EQ(SB_THREAT_TYPE_SAFE, threat_); - EXPECT_TRUE(pb_str_.empty()); + EXPECT_EQ(empty_meta_, meta_); EXPECT_EQ(UMA_STATUS_JSON_UNKNOWN_THREAT, ResetAndParseJson("{\"matches\":[{}]}")); EXPECT_EQ(SB_THREAT_TYPE_SAFE, threat_); - EXPECT_TRUE(pb_str_.empty()); + EXPECT_EQ(empty_meta_, meta_); EXPECT_EQ(UMA_STATUS_JSON_UNKNOWN_THREAT, ResetAndParseJson("{\"matches\":[{\"threat_type\":\"junk\"}]}")); EXPECT_EQ(SB_THREAT_TYPE_SAFE, threat_); - EXPECT_TRUE(pb_str_.empty()); + EXPECT_EQ(empty_meta_, meta_); EXPECT_EQ(UMA_STATUS_JSON_UNKNOWN_THREAT, ResetAndParseJson("{\"matches\":[{\"threat_type\":\"999\"}]}")); EXPECT_EQ(SB_THREAT_TYPE_SAFE, threat_); - EXPECT_TRUE(pb_str_.empty()); + EXPECT_EQ(empty_meta_, meta_); } TEST_F(SafeBrowsingApiHandlerUtilTest, BasicThreats) { EXPECT_EQ(UMA_STATUS_UNSAFE, ResetAndParseJson("{\"matches\":[{\"threat_type\":\"4\"}]}")); EXPECT_EQ(SB_THREAT_TYPE_URL_MALWARE, threat_); - EXPECT_TRUE(pb_str_.empty()); + EXPECT_EQ(empty_meta_, meta_); EXPECT_EQ(UMA_STATUS_UNSAFE, ResetAndParseJson("{\"matches\":[{\"threat_type\":\"5\"}]}")); EXPECT_EQ(SB_THREAT_TYPE_URL_PHISHING, threat_); - EXPECT_TRUE(pb_str_.empty()); + EXPECT_EQ(empty_meta_, meta_); } TEST_F(SafeBrowsingApiHandlerUtilTest, MultipleThreats) { @@ -79,45 +76,68 @@ ResetAndParseJson( "{\"matches\":[{\"threat_type\":\"4\"}, {\"threat_type\":\"5\"}]}")); EXPECT_EQ(SB_THREAT_TYPE_URL_MALWARE, threat_); - EXPECT_TRUE(pb_str_.empty()); + EXPECT_EQ(empty_meta_, meta_); } TEST_F(SafeBrowsingApiHandlerUtilTest, PhaSubType) { + ThreatMetadata expected; + EXPECT_EQ(UMA_STATUS_UNSAFE, ResetAndParseJson("{\"matches\":[{\"threat_type\":\"4\", " "\"pha_pattern_type\":\"LANDING\"}]}")); EXPECT_EQ(SB_THREAT_TYPE_URL_MALWARE, threat_); - EXPECT_EQ(MalwarePatternType::LANDING, ParsePatternType()); + expected.threat_pattern_type = ThreatPatternType::LANDING; + EXPECT_EQ(expected, meta_); + // Test the ThreatMetadata comparitor for this field. + EXPECT_NE(empty_meta_, meta_); EXPECT_EQ(UMA_STATUS_UNSAFE, ResetAndParseJson("{\"matches\":[{\"threat_type\":\"4\", " "\"pha_pattern_type\":\"DISTRIBUTION\"}]}")); EXPECT_EQ(SB_THREAT_TYPE_URL_MALWARE, threat_); - EXPECT_EQ(MalwarePatternType::DISTRIBUTION, ParsePatternType()); + expected.threat_pattern_type = ThreatPatternType::DISTRIBUTION; + EXPECT_EQ(expected, meta_); EXPECT_EQ(UMA_STATUS_UNSAFE, ResetAndParseJson("{\"matches\":[{\"threat_type\":\"4\", " "\"pha_pattern_type\":\"junk\"}]}")); - EXPECT_TRUE(pb_str_.empty()); + EXPECT_EQ(empty_meta_, meta_); } TEST_F(SafeBrowsingApiHandlerUtilTest, SocialEngineeringSubType) { + ThreatMetadata expected; + EXPECT_EQ(UMA_STATUS_UNSAFE, ResetAndParseJson("{\"matches\":[{\"threat_type\":\"5\", " "\"se_pattern_type\":\"LANDING\"}]}")); EXPECT_EQ(SB_THREAT_TYPE_URL_PHISHING, threat_); - EXPECT_EQ(MalwarePatternType::LANDING, ParsePatternType()); + expected.threat_pattern_type = ThreatPatternType::LANDING; + EXPECT_EQ(expected, meta_); EXPECT_EQ(UMA_STATUS_UNSAFE, ResetAndParseJson("{\"matches\":[{\"threat_type\":\"5\", " "\"se_pattern_type\":\"DISTRIBUTION\"}]}")); EXPECT_EQ(SB_THREAT_TYPE_URL_PHISHING, threat_); - EXPECT_EQ(MalwarePatternType::DISTRIBUTION, ParsePatternType()); + expected.threat_pattern_type = ThreatPatternType::DISTRIBUTION; + EXPECT_EQ(expected, meta_); EXPECT_EQ(UMA_STATUS_UNSAFE, ResetAndParseJson("{\"matches\":[{\"threat_type\":\"5\", " "\"se_pattern_type\":\"junk\"}]}")); - EXPECT_TRUE(pb_str_.empty()); + EXPECT_EQ(empty_meta_, meta_); +} + +TEST_F(SafeBrowsingApiHandlerUtilTest, PopulationId) { + ThreatMetadata expected; + + EXPECT_EQ(UMA_STATUS_UNSAFE, + ResetAndParseJson("{\"matches\":[{\"threat_type\":\"4\", " + "\"UserPopulation\":\"foobarbazz\"}]}")); + EXPECT_EQ(SB_THREAT_TYPE_URL_MALWARE, threat_); + expected.population_id = "foobarbazz"; + EXPECT_EQ(expected, meta_); + // Test the ThreatMetadata comparator for this field. + EXPECT_NE(empty_meta_, meta_); } } // namespace safe_browsing
diff --git a/components/safe_browsing_db/safe_browsing_api_handler_util.cc b/components/safe_browsing_db/safe_browsing_api_handler_util.cc index 181b3a07..1c1fb3d 100644 --- a/components/safe_browsing_db/safe_browsing_api_handler_util.cc +++ b/components/safe_browsing_db/safe_browsing_api_handler_util.cc
@@ -45,14 +45,11 @@ } } -// Parse the extra key/value pair(s) added by Safe Browsing backend. To make -// it binary compatible with the Pver3 metadata that UIManager expects to -// deserialize, we convert it to a MalwarePatternType. -// -// TODO(nparker): When chrome desktop is converted to use Pver4, convert this -// to the new proto instead. -const std::string ParseExtraMetadataToPB(const base::DictionaryValue* match, - SBThreatType threat_type) { +// Parse the appropriate "*_pattern_type" key from the metadata. +// Returns NONE if no pattern type was found. +ThreatPatternType ParseThreatSubType( + const base::DictionaryValue* match, + SBThreatType threat_type) { std::string pattern_key; if (threat_type == SB_THREAT_TYPE_URL_MALWARE) { pattern_key = "pha_pattern_type"; @@ -64,24 +61,54 @@ std::string pattern_type; if (!match->GetString(pattern_key, &pattern_type)) { ReportUmaThreatSubType(threat_type, UMA_THREAT_SUB_TYPE_NOT_SET); - return std::string(); + return ThreatPatternType::NONE; } - MalwarePatternType pb; if (pattern_type == "LANDING") { - pb.set_pattern_type(MalwarePatternType::LANDING); ReportUmaThreatSubType(threat_type, UMA_THREAT_SUB_TYPE_LANDING); + return ThreatPatternType::LANDING; } else if (pattern_type == "DISTRIBUTION") { - pb.set_pattern_type(MalwarePatternType::DISTRIBUTION); ReportUmaThreatSubType(threat_type, UMA_THREAT_SUB_TYPE_DISTRIBUTION); + return ThreatPatternType::DISTRIBUTION; } else { ReportUmaThreatSubType(threat_type, UMA_THREAT_SUB_TYPE_UNKNOWN); - return std::string(); + return ThreatPatternType::NONE; + } +} + +// DEPRECATED +// TODO(nparker): Remove this as part of crbug/589610 +// Convert back to PB for compatibility with clank, until we land +// a CL there to use ParseJson(). +const std::string ParseExtraMetadataToPB(const base::DictionaryValue* match, + SBThreatType threat_type) { + ThreatPatternType pattern_type = ParseThreatSubType(match, threat_type); + + MalwarePatternType pb; + switch (pattern_type) { + case ThreatPatternType::LANDING: + pb.set_pattern_type(MalwarePatternType::LANDING); + break; + case ThreatPatternType::DISTRIBUTION: + pb.set_pattern_type(MalwarePatternType::DISTRIBUTION); + break; + default: + return std::string(); } return pb.SerializeAsString(); } +// Parse the optional "UserPopulation" key from the metadata. +// Returns empty string if none was found. +std::string ParseUserPopulation(const base::DictionaryValue* match) { + std::string population_id; + if (!match->GetString("UserPopulation", &population_id)) + return std::string(); + else + return population_id; +} + int GetThreatSeverity(int java_threat_num) { // Assign higher numbers to more severe threats. switch (java_threat_num) { @@ -114,6 +141,62 @@ // or // {"matches":[{"threat_type":"4"}, // {"threat_type":"5", "se_pattern_type":"LANDING"}]} +// or +// {"matches":[{"threat_type":"4", "UserPopulation":"YXNvZWZpbmFqO..."}] +UmaRemoteCallResult ParseJsonFromGMSCore(const std::string& metadata_str, + SBThreatType* worst_threat, + ThreatMetadata* metadata) { + *worst_threat = SB_THREAT_TYPE_SAFE; // Default to safe. + *metadata = ThreatMetadata(); // Default values. + + if (metadata_str.empty()) + return UMA_STATUS_JSON_EMPTY; + + // Pick out the "matches" list. + scoped_ptr<base::Value> value = base::JSONReader::Read(metadata_str); + const base::ListValue* matches = nullptr; + if (!value.get() || !value->IsType(base::Value::TYPE_DICTIONARY) || + !(static_cast<base::DictionaryValue*>(value.get())) + ->GetList(kJsonKeyMatches, &matches) || + !matches) { + return UMA_STATUS_JSON_FAILED_TO_PARSE; + } + + // Go through each matched threat type and pick the most severe. + int worst_threat_num = -1; + const base::DictionaryValue* worst_match = nullptr; + for (size_t i = 0; i < matches->GetSize(); i++) { + // Get the threat number + const base::DictionaryValue* match; + std::string threat_num_str; + int java_threat_num = -1; + if (!matches->GetDictionary(i, &match) || + !match->GetString(kJsonKeyThreatType, &threat_num_str) || + !base::StringToInt(threat_num_str, &java_threat_num)) { + continue; // Skip malformed list entries + } + + if (GetThreatSeverity(java_threat_num) > + GetThreatSeverity(worst_threat_num)) { + worst_threat_num = java_threat_num; + worst_match = match; + } + } + + *worst_threat = JavaToSBThreatType(worst_threat_num); + if (*worst_threat == SB_THREAT_TYPE_SAFE || !worst_match) + return UMA_STATUS_JSON_UNKNOWN_THREAT; + + // Fill in the metadata + metadata->threat_pattern_type = + ParseThreatSubType(worst_match, *worst_threat); + metadata->population_id = ParseUserPopulation(worst_match); + + return UMA_STATUS_UNSAFE; // success +} + +// DEPRECATED +// TODO(nparker): Remove this as part of crbug/589610 UmaRemoteCallResult ParseJsonToThreatAndPB(const std::string& metadata_str, SBThreatType* worst_threat, std::string* metadata_pb_str) {
diff --git a/components/safe_browsing_db/safe_browsing_api_handler_util.h b/components/safe_browsing_db/safe_browsing_api_handler_util.h index 5733c66..0cb5e57 100644 --- a/components/safe_browsing_db/safe_browsing_api_handler_util.h +++ b/components/safe_browsing_db/safe_browsing_api_handler_util.h
@@ -43,13 +43,15 @@ // This parses the JSON from the GMSCore API and then: // 1) Picks the most severe threat type -// 2) Parses remaining key/value pairs into a MalwarePatternType PB -// so DisplayBlockingPage() can unmarshal it. We make this string -// is binary compatible with the Pver3 API's metadata string even -// though it comes from Pver4. +// 2) Parses that threat's key/value pairs into the metadata struct. // // If anything fails to parse, this sets the threat to "safe". The caller // should report the return value via UMA. +UmaRemoteCallResult ParseJsonFromGMSCore(const std::string& metadata_str, + SBThreatType* worst_threat, + ThreatMetadata* metadata); + +// DEPRECATED. Will be removed. UmaRemoteCallResult ParseJsonToThreatAndPB(const std::string& metadata_str, SBThreatType* worst_threat, std::string* metadata_pb_str);
diff --git a/components/safe_browsing_db/testing_util.h b/components/safe_browsing_db/testing_util.h new file mode 100644 index 0000000..0030518 --- /dev/null +++ b/components/safe_browsing_db/testing_util.h
@@ -0,0 +1,38 @@ +// Copyright (c) 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// Utilities to be used in tests of safe_browsing_db/ component. + +#ifndef COMPONENTS_SAFE_BROWSING_DB_TESTING_UTIL_H_ +#define COMPONENTS_SAFE_BROWSING_DB_TESTING_UTIL_H_ + +#include "components/safe_browsing_db/util.h" + +#include <ostream> + +namespace safe_browsing { + +inline bool operator==(const ThreatMetadata& lhs, const ThreatMetadata& rhs) { + return lhs.threat_pattern_type == rhs.threat_pattern_type && + lhs.api_permissions == rhs.api_permissions && + lhs.population_id == rhs.population_id && + lhs.raw_metadata == rhs.raw_metadata; +} + +inline bool operator!=(const ThreatMetadata& lhs, const ThreatMetadata& rhs) { + return !(lhs == rhs); +} + +inline std::ostream& operator<<(std::ostream& os, const ThreatMetadata& meta) { + os << "{threat_pattern_type=" << static_cast<int>(meta.threat_pattern_type) + << ", api_permissions=["; + for (auto p : meta.api_permissions) + os << p << ","; + return os << "], population_id=" << meta.population_id + << ", raw_metadata=" << meta.raw_metadata << "}"; +} + +} // namespace safe_browsing + +#endif // COMPONENTS_SAFE_BROWSING_DB_TESTING_UTIL_H_
diff --git a/components/safe_browsing_db/util.cc b/components/safe_browsing_db/util.cc index 18dd9f8..153da706 100644 --- a/components/safe_browsing_db/util.cc +++ b/components/safe_browsing_db/util.cc
@@ -29,6 +29,12 @@ } } // namespace +// ThreatMetadata ------------------------------------------------------------ +ThreatMetadata::ThreatMetadata() + : threat_pattern_type(ThreatPatternType::NONE) {} + +ThreatMetadata::~ThreatMetadata() {} + // SBCachedFullHashResult ------------------------------------------------------ SBCachedFullHashResult::SBCachedFullHashResult() {}
diff --git a/components/safe_browsing_db/util.h b/components/safe_browsing_db/util.h index 8f82c60..edf12f3 100644 --- a/components/safe_browsing_db/util.h +++ b/components/safe_browsing_db/util.h
@@ -53,6 +53,37 @@ SB_THREAT_TYPE_BLACKLISTED_RESOURCE, }; +// Metadata that indicates what kind of URL match this is. +enum class ThreatPatternType { + NONE, // Pattern type didn't appear in the metadata + LANDING, // The match is a landing page + DISTRIBUTION, // The match is a distribution page +}; + +// Metadata that was returned by a GetFullHash call. This is the parsed version +// of the PB (from Pver3, or Pver4 local) or JSON (from Pver4 via GMSCore). +// Some fields are only applicable to certain lists. +struct ThreatMetadata { + ThreatMetadata(); + ~ThreatMetadata(); + + // Type of blacklisted page. Used on malware and UwS lists. + // This will be NONE if it wasn't present in the reponse. + ThreatPatternType threat_pattern_type; + + // List of permissions blocked. Used with threat_type API_ABUSE. + // This will be empty if it wasn't present in the response. + std::vector<std::string> api_permissions; + + // Opaque base64 string used for user-population experiments in pver4. + // This will be empty if it wasn't present in the response. + std::string population_id; + + // This is the only field currently populated, and it'll be removed + // when the others are used. + // TODO(nparker): Remove this as part of crbug/589610. + std::string raw_metadata; +}; // A truncated hash's type. typedef uint32_t SBPrefix; @@ -68,7 +99,7 @@ SBFullHash hash; // TODO(shess): Refactor to allow ListType here. int list_id; - std::string metadata; + ThreatMetadata metadata; // Used only for V4 results. The cache lifetime for this result. The response // must not be cached for more than this duration to avoid false positives. base::TimeDelta cache_duration;
diff --git a/components/safe_browsing_db/v4_get_hash_protocol_manager.cc b/components/safe_browsing_db/v4_get_hash_protocol_manager.cc index b78a4b5..55196ba 100644 --- a/components/safe_browsing_db/v4_get_hash_protocol_manager.cc +++ b/components/safe_browsing_db/v4_get_hash_protocol_manager.cc
@@ -211,11 +211,11 @@ if (match.has_platform_type() && match.platform_type() == CHROME_PLATFORM) { if (match.has_threat_entry_metadata()) { - // For API Abuse, store a csv of the returned permissions. + // For API Abuse, store a list of the returned permissions. for (const ThreatEntryMetadata::MetadataEntry& m : match.threat_entry_metadata().entries()) { if (m.key() == "permission") { - result.metadata += m.value() + ","; + result.metadata.api_permissions.push_back(m.value()); } } } else {
diff --git a/components/safe_browsing_db/v4_get_hash_protocol_manager_unittest.cc b/components/safe_browsing_db/v4_get_hash_protocol_manager_unittest.cc index 0a177ff..ba76637 100644 --- a/components/safe_browsing_db/v4_get_hash_protocol_manager_unittest.cc +++ b/components/safe_browsing_db/v4_get_hash_protocol_manager_unittest.cc
@@ -9,6 +9,7 @@ #include "base/strings/stringprintf.h" #include "base/time/time.h" #include "components/safe_browsing_db/safebrowsing.pb.h" +#include "components/safe_browsing_db/testing_util.h" #include "components/safe_browsing_db/util.h" #include "components/safe_browsing_db/v4_get_hash_protocol_manager.h" #include "net/base/escape.h" @@ -142,7 +143,7 @@ std::vector<SBFullHashResult> expected_full_hashes; SBFullHashResult hash_result; hash_result.hash = SBFullHashForString("Everything's shiny, Cap'n."); - hash_result.metadata = "NOTIFICATIONS,"; + hash_result.metadata.api_permissions.push_back("NOTIFICATIONS"); hash_result.cache_duration = base::TimeDelta::FromSeconds(300); expected_full_hashes.push_back(hash_result); base::TimeDelta expected_cache_duration = base::TimeDelta::FromSeconds(600); @@ -229,7 +230,8 @@ EXPECT_EQ(1ul, full_hashes.size()); EXPECT_TRUE(SBFullHashEqual(SBFullHashForString("Everything's shiny, Cap'n."), full_hashes[0].hash)); - EXPECT_EQ("NOTIFICATIONS,", full_hashes[0].metadata); + EXPECT_EQ(1ul, full_hashes[0].metadata.api_permissions.size()); + EXPECT_EQ("NOTIFICATIONS", full_hashes[0].metadata.api_permissions[0]); EXPECT_EQ(base::TimeDelta::FromSeconds(300), full_hashes[0].cache_duration); EXPECT_LE(now + base::TimeDelta::FromSeconds(400), pm->next_gethash_time_); } @@ -318,7 +320,7 @@ EXPECT_TRUE(SBFullHashEqual(SBFullHashForString("Not to fret."), full_hashes[0].hash)); // Metadata should be empty. - EXPECT_EQ("", full_hashes[0].metadata); + EXPECT_EQ(0ul, full_hashes[0].metadata.api_permissions.size()); EXPECT_EQ(base::TimeDelta::FromSeconds(0), full_hashes[0].cache_duration); }
diff --git a/components/search_engines/template_url.cc b/components/search_engines/template_url.cc index c9b2922c..0988193 100644 --- a/components/search_engines/template_url.cc +++ b/components/search_engines/template_url.cc
@@ -416,7 +416,8 @@ base::string16 result; net::UnescapeRule::Type unescape_rules = - net::UnescapeRule::SPACES | net::UnescapeRule::URL_SPECIAL_CHARS; + net::UnescapeRule::SPACES | net::UnescapeRule::PATH_SEPARATORS | + net::UnescapeRule::URL_SPECIAL_CHARS_EXCEPT_PATH_SEPARATORS; if (search_term_key_location_ != url::Parsed::PATH) unescape_rules |= net::UnescapeRule::REPLACE_PLUS_WITH_SPACE;
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn index 26fd1b1f..0fd88af 100644 --- a/content/browser/BUILD.gn +++ b/content/browser/BUILD.gn
@@ -261,7 +261,7 @@ if (use_udev) { deps += [ "//device/udev_linux", - "//media/", + "//media/capture", ] } else { if (is_linux) {
diff --git a/content/browser/android/content_view_core_impl.cc b/content/browser/android/content_view_core_impl.cc index d70219a..90b001b 100644 --- a/content/browser/android/content_view_core_impl.cc +++ b/content/browser/android/content_view_core_impl.cc
@@ -273,6 +273,24 @@ } } +void ContentViewCoreImpl::UpdateWindowAndroid( + JNIEnv* env, + const base::android::JavaParamRef<jobject>& obj, + jlong window_android) { + if (window_android) { + DCHECK(!window_android_); + window_android_ = reinterpret_cast<ui::WindowAndroid*>(window_android); + FOR_EACH_OBSERVER(ContentViewCoreImplObserver, + observer_list_, + OnAttachedToWindow()); + } else { + FOR_EACH_OBSERVER(ContentViewCoreImplObserver, + observer_list_, + OnDetachedFromWindow()); + window_android_ = NULL; + } +} + base::android::ScopedJavaLocalRef<jobject> ContentViewCoreImpl::GetWebContentsAndroid(JNIEnv* env, const JavaParamRef<jobject>& obj) {
diff --git a/content/browser/android/content_view_core_impl.h b/content/browser/android/content_view_core_impl.h index aab7ecaf..d6308a1 100644 --- a/content/browser/android/content_view_core_impl.h +++ b/content/browser/android/content_view_core_impl.h
@@ -88,6 +88,9 @@ JNIEnv* env, const base::android::JavaParamRef<jobject>& obj); + void UpdateWindowAndroid(JNIEnv* env, + const base::android::JavaParamRef<jobject>& obj, + jlong window_android); void OnJavaContentViewCoreDestroyed( JNIEnv* env, const base::android::JavaParamRef<jobject>& obj);
diff --git a/content/browser/background_sync/background_sync_manager.cc b/content/browser/background_sync/background_sync_manager.cc index 4cc3901..a973793 100644 --- a/content/browser/background_sync/background_sync_manager.cc +++ b/content/browser/background_sync/background_sync_manager.cc
@@ -817,93 +817,6 @@ registration_handle_ids_.Remove(handle_id); } -void BackgroundSyncManager::Unregister( - int64_t sw_registration_id, - BackgroundSyncRegistrationHandle::HandleId handle_id, - const StatusCallback& callback) { - DCHECK_CURRENTLY_ON(BrowserThread::IO); - - BackgroundSyncRegistration* registration = - GetRegistrationForHandle(handle_id); - DCHECK(registration); - - if (disabled_) { - BackgroundSyncMetrics::CountUnregister( - BACKGROUND_SYNC_STATUS_STORAGE_ERROR); - base::ThreadTaskRunnerHandle::Get()->PostTask( - FROM_HERE, base::Bind(callback, BACKGROUND_SYNC_STATUS_STORAGE_ERROR)); - return; - } - - op_scheduler_.ScheduleOperation(base::Bind( - &BackgroundSyncManager::UnregisterImpl, weak_ptr_factory_.GetWeakPtr(), - sw_registration_id, RegistrationKey(*registration), registration->id(), - MakeStatusCompletion(callback))); -} - -void BackgroundSyncManager::UnregisterImpl( - int64_t sw_registration_id, - const RegistrationKey& registration_key, - BackgroundSyncRegistration::RegistrationId sync_registration_id, - const StatusCallback& callback) { - DCHECK_CURRENTLY_ON(BrowserThread::IO); - - if (disabled_) { - BackgroundSyncMetrics::CountUnregister( - BACKGROUND_SYNC_STATUS_STORAGE_ERROR); - base::ThreadTaskRunnerHandle::Get()->PostTask( - FROM_HERE, base::Bind(callback, BACKGROUND_SYNC_STATUS_STORAGE_ERROR)); - return; - } - - RefCountedRegistration* existing_registration = - LookupActiveRegistration(sw_registration_id, registration_key); - - if (!existing_registration || - existing_registration->value()->id() != sync_registration_id) { - BackgroundSyncMetrics::CountUnregister(BACKGROUND_SYNC_STATUS_NOT_FOUND); - base::ThreadTaskRunnerHandle::Get()->PostTask( - FROM_HERE, base::Bind(callback, BACKGROUND_SYNC_STATUS_NOT_FOUND)); - return; - } - - RemoveActiveRegistration(sw_registration_id, registration_key); - - StoreRegistrations( - sw_registration_id, - base::Bind(&BackgroundSyncManager::UnregisterDidStore, - weak_ptr_factory_.GetWeakPtr(), sw_registration_id, callback)); -} - -void BackgroundSyncManager::UnregisterDidStore(int64_t sw_registration_id, - const StatusCallback& callback, - ServiceWorkerStatusCode status) { - DCHECK_CURRENTLY_ON(BrowserThread::IO); - - if (status == SERVICE_WORKER_ERROR_NOT_FOUND) { - // ServiceWorker was unregistered. - BackgroundSyncMetrics::CountUnregister( - BACKGROUND_SYNC_STATUS_STORAGE_ERROR); - active_registrations_.erase(sw_registration_id); - base::ThreadTaskRunnerHandle::Get()->PostTask( - FROM_HERE, base::Bind(callback, BACKGROUND_SYNC_STATUS_STORAGE_ERROR)); - return; - } - - if (status != SERVICE_WORKER_OK) { - LOG(ERROR) << "BackgroundSync failed to unregister due to backend failure."; - BackgroundSyncMetrics::CountUnregister( - BACKGROUND_SYNC_STATUS_STORAGE_ERROR); - DisableAndClearManager( - base::Bind(callback, BACKGROUND_SYNC_STATUS_STORAGE_ERROR)); - return; - } - - BackgroundSyncMetrics::CountUnregister(BACKGROUND_SYNC_STATUS_OK); - base::ThreadTaskRunnerHandle::Get()->PostTask( - FROM_HERE, base::Bind(callback, BACKGROUND_SYNC_STATUS_OK)); -} - void BackgroundSyncManager::GetRegistrationsImpl( int64_t sw_registration_id, const StatusAndRegistrationsCallback& callback) { @@ -1205,10 +1118,6 @@ registration->set_sync_state(BackgroundSyncState::PENDING); registration->set_num_attempts(0); registration_completed = false; - } else if (registration->sync_state() == - BackgroundSyncState::UNREGISTERED_WHILE_FIRING) { - // TODO(jkarlin): Remove this condition when the unregister method is - // removed. See https://crbug.com/583327. } else if (status_code != SERVICE_WORKER_OK && can_retry) { // Sync failed but can retry registration->set_sync_state(BackgroundSyncState::PENDING);
diff --git a/content/browser/background_sync/background_sync_manager.h b/content/browser/background_sync/background_sync_manager.h index fe3eda60..3af82629 100644 --- a/content/browser/background_sync/background_sync_manager.h +++ b/content/browser/background_sync/background_sync_manager.h
@@ -250,21 +250,6 @@ const StatusAndRegistrationCallback& callback, ServiceWorkerStatusCode status); - // Removes the background sync with id |sync_registration_id|. Calls - // |callback| with BACKGROUND_SYNC_STATUS_NOT_FOUND if no match is found. - // Calls |callback| with BACKGROUND_SYNC_STATUS_OK on success. - void Unregister(int64_t sw_registration_id, - BackgroundSyncRegistrationHandle::HandleId handle_id, - const StatusCallback& callback); - void UnregisterImpl( - int64_t sw_registration_id, - const RegistrationKey& key, - BackgroundSyncRegistration::RegistrationId sync_registration_id, - const StatusCallback& callback); - void UnregisterDidStore(int64_t sw_registration_id, - const StatusCallback& callback, - ServiceWorkerStatusCode status); - // GetRegistrations callbacks void GetRegistrationsImpl(int64_t sw_registration_id, const StatusAndRegistrationsCallback& callback);
diff --git a/content/browser/background_sync/background_sync_manager_unittest.cc b/content/browser/background_sync/background_sync_manager_unittest.cc index a8a4574..c8f96f1 100644 --- a/content/browser/background_sync/background_sync_manager_unittest.cc +++ b/content/browser/background_sync/background_sync_manager_unittest.cc
@@ -425,24 +425,6 @@ return callback_status_ == BACKGROUND_SYNC_STATUS_OK; } - bool Unregister(BackgroundSyncRegistrationHandle* registration_handle) { - return UnregisterWithServiceWorkerId(sw_registration_id_1_, - registration_handle); - } - - bool UnregisterWithServiceWorkerId( - int64_t sw_registration_id, - BackgroundSyncRegistrationHandle* registration_handle) { - bool was_called = false; - registration_handle->Unregister( - sw_registration_id, - base::Bind(&BackgroundSyncManagerTest::StatusCallback, - base::Unretained(this), &was_called)); - base::RunLoop().RunUntilIdle(); - EXPECT_TRUE(was_called); - return callback_status_ == BACKGROUND_SYNC_STATUS_OK; - } - bool GetRegistration( const BackgroundSyncRegistrationOptions& registration_options) { return GetRegistrationWithServiceWorkerId(sw_registration_id_1_, @@ -697,45 +679,25 @@ EXPECT_FALSE(GetRegistrations()); } -TEST_F(BackgroundSyncManagerTest, Unregister) { - EXPECT_TRUE(Register(sync_options_1_)); - EXPECT_TRUE(Unregister(callback_registration_handle_.get())); - EXPECT_FALSE(GetRegistration(sync_options_1_)); -} TEST_F(BackgroundSyncManagerTest, Reregister) { EXPECT_TRUE(Register(sync_options_1_)); - EXPECT_TRUE(Unregister(callback_registration_handle_.get())); EXPECT_TRUE(Register(sync_options_1_)); -} - -TEST_F(BackgroundSyncManagerTest, UnregisterSecond) { - EXPECT_TRUE(Register(sync_options_1_)); - EXPECT_TRUE(Register(sync_options_2_)); - EXPECT_TRUE(Unregister(callback_registration_handle_.get())); EXPECT_TRUE(GetRegistration(sync_options_1_)); - EXPECT_TRUE(Register(sync_options_2_)); } -TEST_F(BackgroundSyncManagerTest, UnregisterBadBackend) { +TEST_F(BackgroundSyncManagerTest, ReregisterSecond) { EXPECT_TRUE(Register(sync_options_1_)); EXPECT_TRUE(Register(sync_options_2_)); - test_background_sync_manager_->set_corrupt_backend(true); - EXPECT_FALSE(Unregister(callback_registration_handle_.get())); - // Unregister should have discovered the bad backend and disabled the - // BackgroundSyncManager. - test_background_sync_manager_->set_corrupt_backend(false); - EXPECT_FALSE(GetRegistration(sync_options_1_)); - EXPECT_FALSE(GetRegistration(sync_options_2_)); + EXPECT_TRUE(Register(sync_options_2_)); } TEST_F(BackgroundSyncManagerTest, RegisterMaxTagLength) { sync_options_1_.tag = std::string(MaxTagLength(), 'a'); EXPECT_TRUE(Register(sync_options_1_)); - EXPECT_TRUE(Unregister(callback_registration_handle_.get())); - sync_options_1_.tag = std::string(MaxTagLength() + 1, 'a'); - EXPECT_FALSE(Register(sync_options_1_)); + sync_options_2_.tag = std::string(MaxTagLength() + 1, 'b'); + EXPECT_FALSE(Register(sync_options_2_)); EXPECT_EQ(BACKGROUND_SYNC_STATUS_NOT_ALLOWED, callback_status_); } @@ -749,11 +711,6 @@ EXPECT_TRUE(GetRegistration(sync_options_1_)); EXPECT_TRUE(Register(sync_options_2_)); EXPECT_LT(cur_id, callback_registration_handle_->handle_id()); - cur_id = callback_registration_handle_->handle_id(); - - EXPECT_TRUE(Unregister(registered_handle.get())); - EXPECT_TRUE(Register(sync_options_1_)); - EXPECT_LT(cur_id, callback_registration_handle_->handle_id()); } TEST_F(BackgroundSyncManagerTest, RebootRecovery) { @@ -954,13 +911,11 @@ } TEST_F(BackgroundSyncManagerTest, EmptyTagSupported) { - sync_options_1_.tag = "a"; + sync_options_1_.tag = ""; EXPECT_TRUE(Register(sync_options_1_)); EXPECT_TRUE(GetRegistration(sync_options_1_)); EXPECT_TRUE( sync_options_1_.Equals(*callback_registration_handle_->options())); - EXPECT_TRUE(Unregister(callback_registration_handle_.get())); - EXPECT_FALSE(GetRegistration(sync_options_1_)); } TEST_F(BackgroundSyncManagerTest, FiresOnRegistration) { @@ -1005,40 +960,6 @@ EXPECT_FALSE(GetRegistration(sync_options_1_)); } -TEST_F(BackgroundSyncManagerTest, - NotifyUnregisteredMidSyncNoRetryAttemptsLeft) { - InitDelayedSyncEventTest(); - - RegisterAndVerifySyncEventDelayed(sync_options_1_); - - // Unregister the event mid-sync. - EXPECT_TRUE(Unregister(callback_registration_handle_.get())); - - // Finish firing the event. - sync_fired_callback_.Run(SERVICE_WORKER_ERROR_FAILED); - base::RunLoop().RunUntilIdle(); - - // Since there were no retry attempts left, the sync ultimately failed. - EXPECT_FALSE(GetRegistration(sync_options_1_)); -} - -TEST_F(BackgroundSyncManagerTest, - NotifyUnregisteredMidSyncWithRetryAttemptsLeft) { - SetMaxSyncAttemptsAndRestartManager(2); - InitDelayedSyncEventTest(); - - RegisterAndVerifySyncEventDelayed(sync_options_1_); - - // Unregister the event mid-sync. - EXPECT_TRUE(Unregister(callback_registration_handle_.get())); - - // Finish firing the event. - sync_fired_callback_.Run(SERVICE_WORKER_ERROR_FAILED); - base::RunLoop().RunUntilIdle(); - // Even though there was 1 retry attempt left, the sync should be gone. - EXPECT_FALSE(GetRegistration(sync_options_1_)); -} - TEST_F(BackgroundSyncManagerTest, OverwritePendingRegistration) { InitFailedSyncEventTest(); @@ -1182,18 +1103,6 @@ EXPECT_FALSE(GetRegistration(sync_options_1_)); } -TEST_F(BackgroundSyncManagerTest, UnregisterMidSync) { - InitDelayedSyncEventTest(); - - RegisterAndVerifySyncEventDelayed(sync_options_1_); - - EXPECT_TRUE(Unregister(callback_registration_handle_.get())); - EXPECT_FALSE(GetRegistration(sync_options_1_)); - - sync_fired_callback_.Run(SERVICE_WORKER_OK); - EXPECT_FALSE(GetRegistration(sync_options_1_)); -} - TEST_F(BackgroundSyncManagerTest, BadBackendMidSync) { InitDelayedSyncEventTest(); @@ -1257,13 +1166,6 @@ EXPECT_FALSE(Register(sync_options_1_)); } -TEST_F(BackgroundSyncManagerTest, UnregisterSucceedsWithoutMainFrame) { - EXPECT_TRUE(Register(sync_options_1_)); - test_background_sync_manager_->set_has_main_frame_provider_host(false); - EXPECT_TRUE(Unregister(callback_registration_handle_.get())); - EXPECT_FALSE(GetRegistration(sync_options_1_)); -} - TEST_F(BackgroundSyncManagerTest, DefaultParameters) { *GetController()->background_sync_parameters() = BackgroundSyncParameters(); // Restart the BackgroundSyncManager so that it updates its parameters.
diff --git a/content/browser/background_sync/background_sync_metrics.cc b/content/browser/background_sync/background_sync_metrics.cc index 8198815c..8ae07b7 100644 --- a/content/browser/background_sync/background_sync_metrics.cc +++ b/content/browser/background_sync/background_sync_metrics.cc
@@ -81,11 +81,4 @@ return; } -// static -void BackgroundSyncMetrics::CountUnregister(BackgroundSyncStatus result) { - UMA_HISTOGRAM_ENUMERATION("BackgroundSync.Unregistration.OneShot", result, - BACKGROUND_SYNC_STATUS_MAX + 1); - return; -} - } // namespace content
diff --git a/content/browser/background_sync/background_sync_metrics.h b/content/browser/background_sync/background_sync_metrics.h index 891e11494..3280896 100644 --- a/content/browser/background_sync/background_sync_metrics.h +++ b/content/browser/background_sync/background_sync_metrics.h
@@ -49,9 +49,6 @@ // Records the status of a failed sync registration. static void CountRegisterFailure(BackgroundSyncStatus status); - // Records the result of trying to unregister a sync. - static void CountUnregister(BackgroundSyncStatus result); - private: DISALLOW_IMPLICIT_CONSTRUCTORS(BackgroundSyncMetrics); };
diff --git a/content/browser/background_sync/background_sync_registration.cc b/content/browser/background_sync/background_sync_registration.cc index 29f93d3..b9b42dde 100644 --- a/content/browser/background_sync/background_sync_registration.cc +++ b/content/browser/background_sync/background_sync_registration.cc
@@ -34,7 +34,6 @@ switch (sync_state_) { case BackgroundSyncState::FIRING: case BackgroundSyncState::REREGISTERED_WHILE_FIRING: - case BackgroundSyncState::UNREGISTERED_WHILE_FIRING: return true; case BackgroundSyncState::PENDING: return false;
diff --git a/content/browser/background_sync/background_sync_registration_handle.cc b/content/browser/background_sync/background_sync_registration_handle.cc index b706af53..952c758 100644 --- a/content/browser/background_sync/background_sync_registration_handle.cc +++ b/content/browser/background_sync/background_sync_registration_handle.cc
@@ -15,17 +15,6 @@ background_sync_manager_->ReleaseRegistrationHandle(handle_id_); } -void BackgroundSyncRegistrationHandle::Unregister( - int64_t sw_registration_id, - const StatusCallback& callback) { - DCHECK_CURRENTLY_ON(BrowserThread::IO); - DCHECK(IsValid()); - DCHECK(background_sync_manager_); - - background_sync_manager_->Unregister(sw_registration_id, handle_id_, - callback); -} - bool BackgroundSyncRegistrationHandle::IsValid() const { return registration_ != nullptr; }
diff --git a/content/browser/background_sync/background_sync_registration_handle.h b/content/browser/background_sync/background_sync_registration_handle.h index 354bc266..6a2bd351 100644 --- a/content/browser/background_sync/background_sync_registration_handle.h +++ b/content/browser/background_sync/background_sync_registration_handle.h
@@ -44,10 +44,6 @@ return registration_->sync_state(); } - // Unregisters the background sync registration. Calls |callback| - // with BACKGROUND_SYNC_STATUS_OK if it succeeds. - void Unregister(int64_t service_worker_id, const StatusCallback& callback); - // Returns true if the handle is backed by a BackgroundSyncRegistration in the // BackgroundSyncManager. bool IsValid() const;
diff --git a/content/browser/background_sync/background_sync_service_impl.cc b/content/browser/background_sync/background_sync_service_impl.cc index 2855ceeb..1443132 100644 --- a/content/browser/background_sync/background_sync_service_impl.cc +++ b/content/browser/background_sync/background_sync_service_impl.cc
@@ -110,25 +110,6 @@ weak_ptr_factory_.GetWeakPtr(), callback)); } -void BackgroundSyncServiceImpl::Unregister( - BackgroundSyncRegistrationHandle::HandleId handle_id, - int64_t sw_registration_id, - const UnregisterCallback& callback) { - DCHECK_CURRENTLY_ON(BrowserThread::IO); - - BackgroundSyncRegistrationHandle* registration = - active_handles_.Lookup(handle_id); - if (!registration) { - callback.Run(BackgroundSyncError::NOT_ALLOWED); - return; - } - - registration->Unregister( - sw_registration_id, - base::Bind(&BackgroundSyncServiceImpl::OnUnregisterResult, - weak_ptr_factory_.GetWeakPtr(), callback)); -} - void BackgroundSyncServiceImpl::GetRegistrations( int64_t sw_registration_id, const GetRegistrationsCallback& callback) { @@ -198,13 +179,6 @@ std::move(mojoResult)); } -void BackgroundSyncServiceImpl::OnUnregisterResult( - const UnregisterCallback& callback, - BackgroundSyncStatus status) { - DCHECK_CURRENTLY_ON(BrowserThread::IO); - callback.Run(static_cast<content::BackgroundSyncError>(status)); -} - void BackgroundSyncServiceImpl::OnGetRegistrationsResult( const GetRegistrationsCallback& callback, BackgroundSyncStatus status,
diff --git a/content/browser/background_sync/background_sync_service_impl.h b/content/browser/background_sync/background_sync_service_impl.h index a52c979..0466e994 100644 --- a/content/browser/background_sync/background_sync_service_impl.h +++ b/content/browser/background_sync/background_sync_service_impl.h
@@ -36,9 +36,6 @@ int64_t sw_registration_id, bool requested_from_service_worker, const RegisterCallback& callback) override; - void Unregister(BackgroundSyncRegistrationHandle::HandleId handle_id, - int64_t sw_registration_id, - const UnregisterCallback& callback) override; void GetRegistrations(int64_t sw_registration_id, const GetRegistrationsCallback& callback) override; void DuplicateRegistrationHandle( @@ -50,8 +47,6 @@ void OnRegisterResult(const RegisterCallback& callback, BackgroundSyncStatus status, scoped_ptr<BackgroundSyncRegistrationHandle> result); - void OnUnregisterResult(const UnregisterCallback& callback, - BackgroundSyncStatus status); void OnGetRegistrationsResult( const GetRegistrationsCallback& callback, BackgroundSyncStatus status,
diff --git a/content/browser/background_sync/background_sync_service_impl_unittest.cc b/content/browser/background_sync/background_sync_service_impl_unittest.cc index f2f341b..5e4fde5 100644 --- a/content/browser/background_sync/background_sync_service_impl_unittest.cc +++ b/content/browser/background_sync/background_sync_service_impl_unittest.cc
@@ -62,13 +62,6 @@ *out_registration = registration.Clone(); } -void ErrorCallback(bool* called, - BackgroundSyncError* out_error, - BackgroundSyncError error) { - *called = true; - *out_error = error; -} - void ErrorAndRegistrationListCallback( bool* called, BackgroundSyncError* out_error, @@ -189,13 +182,6 @@ base::RunLoop().RunUntilIdle(); } - void Unregister(int32_t handle_id, - const BackgroundSyncService::UnregisterCallback& callback) { - service_impl_->Unregister( - handle_id, sw_registration_id_, callback); - base::RunLoop().RunUntilIdle(); - } - void GetRegistrations( const BackgroundSyncService::GetRegistrationsCallback& callback) { service_impl_->GetRegistrations(sw_registration_id_, callback); @@ -228,33 +214,6 @@ EXPECT_EQ("", reg->tag); } -TEST_F(BackgroundSyncServiceImplTest, Unregister) { - bool unregister_called = false; - BackgroundSyncError unregister_error; - SyncRegistrationPtr reg; - Unregister(default_sync_registration_->handle_id, - base::Bind(&ErrorCallback, &unregister_called, &unregister_error)); - EXPECT_TRUE(unregister_called); - EXPECT_EQ(BackgroundSyncError::NOT_ALLOWED, unregister_error); -} - -TEST_F(BackgroundSyncServiceImplTest, UnregisterWithRegisteredSync) { - bool register_called = false; - bool unregister_called = false; - BackgroundSyncError register_error; - BackgroundSyncError unregister_error; - SyncRegistrationPtr reg; - Register(default_sync_registration_.Clone(), - base::Bind(&ErrorAndRegistrationCallback, ®ister_called, - ®ister_error, ®)); - EXPECT_TRUE(register_called); - EXPECT_EQ(BackgroundSyncError::NONE, register_error); - Unregister(reg->handle_id, - base::Bind(&ErrorCallback, &unregister_called, &unregister_error)); - EXPECT_TRUE(unregister_called); - EXPECT_EQ(BackgroundSyncError::NONE, unregister_error); -} - TEST_F(BackgroundSyncServiceImplTest, GetRegistrations) { bool called = false; BackgroundSyncError error;
diff --git a/content/browser/bluetooth/bluetooth_dispatcher_host.cc b/content/browser/bluetooth/bluetooth_dispatcher_host.cc index f783d31e..b69fa4fa 100644 --- a/content/browser/bluetooth/bluetooth_dispatcher_host.cc +++ b/content/browser/bluetooth/bluetooth_dispatcher_host.cc
@@ -25,6 +25,7 @@ #include "content/browser/bluetooth/first_device_bluetooth_chooser.h" #include "content/browser/frame_host/render_frame_host_impl.h" #include "content/common/bluetooth/bluetooth_messages.h" +#include "content/public/browser/content_browser_client.h" #include "content/public/browser/web_contents.h" #include "content/public/browser/web_contents_delegate.h" #include "device/bluetooth/bluetooth_adapter.h" @@ -307,6 +308,7 @@ OnGATTServerDisconnect) IPC_MESSAGE_HANDLER(BluetoothHostMsg_GetPrimaryService, OnGetPrimaryService) IPC_MESSAGE_HANDLER(BluetoothHostMsg_GetCharacteristic, OnGetCharacteristic) + IPC_MESSAGE_HANDLER(BluetoothHostMsg_GetCharacteristics, OnGetCharacteristics) IPC_MESSAGE_HANDLER(BluetoothHostMsg_ReadValue, OnReadValue) IPC_MESSAGE_HANDLER(BluetoothHostMsg_WriteValue, OnWriteValue) IPC_MESSAGE_HANDLER(BluetoothHostMsg_StartNotifications, OnStartNotifications) @@ -517,9 +519,21 @@ &request_device_sessions_); !iter.IsAtEnd(); iter.Advance()) { RequestDeviceSession* session = iter.GetCurrentValue(); + + // Stop ongoing discovery session if power is off. + if (!powered && session->discovery_session) { + StopDiscoverySession(std::move(session->discovery_session)); + } + if (session->chooser) session->chooser->SetAdapterPresence(presence); } + + // Stop the timer so that we don't change the state of the chooser + // when timer expires. + if (!powered) { + discovery_session_timer_.Stop(); + } } void BluetoothDispatcherHost::DeviceAdded(device::BluetoothAdapter* adapter, @@ -843,6 +857,86 @@ thread_id, request_id, WebBluetoothError::CharacteristicNotFound)); } +void BluetoothDispatcherHost::OnGetCharacteristics( + int thread_id, + int request_id, + int frame_routing_id, + const std::string& service_instance_id, + const std::string& characteristics_uuid) { + DCHECK_CURRENTLY_ON(BrowserThread::UI); + RecordWebBluetoothFunctionCall( + UMAWebBluetoothFunction::SERVICE_GET_CHARACTERISTICS); + RecordGetCharacteristicsCharacteristic(characteristics_uuid); + + // Check Blacklist for characteristics_uuid. + if (!characteristics_uuid.empty() && + BluetoothBlacklist::Get().IsExcluded( + BluetoothUUID(characteristics_uuid))) { + RecordGetCharacteristicsOutcome(UMAGetCharacteristicOutcome::BLACKLISTED); + Send(new BluetoothMsg_GetCharacteristicsError( + thread_id, request_id, + WebBluetoothError::BlacklistedCharacteristicUUID)); + return; + } + + const CacheQueryResult query_result = + QueryCacheForService(GetOrigin(frame_routing_id), service_instance_id); + + if (query_result.outcome == CacheQueryOutcome::BAD_RENDERER) { + return; + } + + if (query_result.outcome != CacheQueryOutcome::SUCCESS) { + RecordGetCharacteristicsOutcome(query_result.outcome); + Send(new BluetoothMsg_GetCharacteristicsError(thread_id, request_id, + query_result.GetWebError())); + return; + } + + std::vector<std::string> characteristics_instance_ids; + std::vector<std::string> characteristics_uuids; + std::vector<uint32_t> characteristics_properties; + + for (BluetoothGattCharacteristic* characteristic : + query_result.service->GetCharacteristics()) { + if (!BluetoothBlacklist::Get().IsExcluded(characteristic->GetUUID()) && + (characteristics_uuid.empty() || + characteristics_uuid == characteristic->GetUUID().canonical_value())) { + const std::string& characteristic_instance_id = + characteristic->GetIdentifier(); + + characteristics_instance_ids.push_back(characteristic_instance_id); + characteristics_uuids.push_back( + characteristic->GetUUID().canonical_value()); + characteristics_properties.push_back( + static_cast<uint32_t>(characteristic->GetProperties())); + + auto insert_result = characteristic_to_service_.insert( + make_pair(characteristic_instance_id, service_instance_id)); + + // If value is already in map, DCHECK it's valid. + if (!insert_result.second) + DCHECK(insert_result.first->second == service_instance_id); + } + } + + if (!characteristics_instance_ids.empty()) { + RecordGetCharacteristicsOutcome(UMAGetCharacteristicOutcome::SUCCESS); + Send(new BluetoothMsg_GetCharacteristicsSuccess( + thread_id, request_id, characteristics_instance_ids, + characteristics_uuids, characteristics_properties)); + return; + } + RecordGetCharacteristicsOutcome( + characteristics_uuid.empty() + ? UMAGetCharacteristicOutcome::NO_CHARACTERISTICS + : UMAGetCharacteristicOutcome::NOT_FOUND); + Send(new BluetoothMsg_GetCharacteristicsError( + thread_id, request_id, characteristics_uuid.empty() + ? WebBluetoothError::NoCharacteristicsFound + : WebBluetoothError::CharacteristicNotFound)); +} + void BluetoothDispatcherHost::OnReadValue( int thread_id, int request_id, @@ -1081,18 +1175,25 @@ RenderFrameHostImpl* render_frame_host = RenderFrameHostImpl::FromID(render_process_id_, frame_routing_id); + WebContents* web_contents = + WebContents::FromRenderFrameHost(render_frame_host); - if (!render_frame_host) { - DLOG(WARNING) - << "Got a requestDevice IPC without a matching RenderFrameHost: " - << render_process_id_ << ", " << frame_routing_id; + if (!render_frame_host || !web_contents) { + DLOG(WARNING) << "Got a requestDevice IPC without a matching " + << "RenderFrameHost or WebContents: " << render_process_id_ + << ", " << frame_routing_id; RecordRequestDeviceOutcome(UMARequestDeviceOutcome::NO_RENDER_FRAME); Send(new BluetoothMsg_RequestDeviceError( thread_id, request_id, WebBluetoothError::RequestDeviceWithoutFrame)); return; } - if (render_frame_host->GetLastCommittedOrigin().unique()) { + const url::Origin requesting_origin = + render_frame_host->GetLastCommittedOrigin(); + const url::Origin embedding_origin = + web_contents->GetMainFrame()->GetLastCommittedOrigin(); + + if (requesting_origin.unique()) { VLOG(1) << "Request device with unique origin."; Send(new BluetoothMsg_RequestDeviceError( thread_id, request_id, @@ -1118,23 +1219,29 @@ return; } + if (!GetContentClient()->browser()->AllowWebBluetooth( + web_contents->GetBrowserContext(), requesting_origin, + embedding_origin)) { + RecordRequestDeviceOutcome( + UMARequestDeviceOutcome::BLUETOOTH_CHOOSER_GLOBALLY_DISABLED); + Send(new BluetoothMsg_RequestDeviceError( + thread_id, request_id, WebBluetoothError::ChooserDisabled)); + return; + } + // Create storage for the information that backs the chooser, and show the // chooser. - RequestDeviceSession* const session = - new RequestDeviceSession(thread_id, request_id, frame_routing_id, - render_frame_host->GetLastCommittedOrigin(), - filters, optional_services_blacklist_filtered); + RequestDeviceSession* const session = new RequestDeviceSession( + thread_id, request_id, frame_routing_id, requesting_origin, filters, + optional_services_blacklist_filtered); int chooser_id = request_device_sessions_.Add(session); BluetoothChooser::EventHandler chooser_event_handler = base::Bind(&BluetoothDispatcherHost::OnBluetoothChooserEvent, weak_ptr_on_ui_thread_, chooser_id); - if (WebContents* web_contents = - WebContents::FromRenderFrameHost(render_frame_host)) { - if (WebContentsDelegate* delegate = web_contents->GetDelegate()) { - session->chooser = delegate->RunBluetoothChooser(render_frame_host, - chooser_event_handler); - } + if (WebContentsDelegate* delegate = web_contents->GetDelegate()) { + session->chooser = + delegate->RunBluetoothChooser(render_frame_host, chooser_event_handler); } if (!session->chooser) { LOG(WARNING)
diff --git a/content/browser/bluetooth/bluetooth_dispatcher_host.h b/content/browser/bluetooth/bluetooth_dispatcher_host.h index e8ce203..d55e5888 100644 --- a/content/browser/bluetooth/bluetooth_dispatcher_host.h +++ b/content/browser/bluetooth/bluetooth_dispatcher_host.h
@@ -120,6 +120,11 @@ int frame_routing_id, const std::string& service_instance_id, const std::string& characteristic_uuid); + void OnGetCharacteristics(int thread_id, + int request_id, + int frame_routing_id, + const std::string& service_instance_id, + const std::string& characteristics_uuid); void OnReadValue(int thread_id, int request_id, int frame_routing_id,
diff --git a/content/browser/bluetooth/bluetooth_metrics.cc b/content/browser/bluetooth/bluetooth_metrics.cc index 13070bd..32f7c73 100644 --- a/content/browser/bluetooth/bluetooth_metrics.cc +++ b/content/browser/bluetooth/bluetooth_metrics.cc
@@ -150,7 +150,8 @@ switch (outcome) { case CacheQueryOutcome::SUCCESS: case CacheQueryOutcome::BAD_RENDERER: - NOTREACHED() << "No need to record a success or renderer crash"; + // No need to record a success or renderer crash. + NOTREACHED(); return; case CacheQueryOutcome::NO_DEVICE: RecordGetCharacteristicOutcome(UMAGetCharacteristicOutcome::NO_DEVICE); @@ -169,6 +170,38 @@ HashUUID(characteristic)); } +// getCharacteristics + +void RecordGetCharacteristicsOutcome(UMAGetCharacteristicOutcome outcome) { + UMA_HISTOGRAM_ENUMERATION( + "Bluetooth.Web.GetCharacteristics.Outcome", static_cast<int>(outcome), + static_cast<int>(UMAGetCharacteristicOutcome::COUNT)); +} + +void RecordGetCharacteristicsOutcome(CacheQueryOutcome outcome) { + switch (outcome) { + case CacheQueryOutcome::SUCCESS: + case CacheQueryOutcome::BAD_RENDERER: + // No need to record a success or renderer crash. + NOTREACHED(); + return; + case CacheQueryOutcome::NO_DEVICE: + RecordGetCharacteristicsOutcome(UMAGetCharacteristicOutcome::NO_DEVICE); + return; + case CacheQueryOutcome::NO_SERVICE: + RecordGetCharacteristicsOutcome(UMAGetCharacteristicOutcome::NO_SERVICE); + return; + case CacheQueryOutcome::NO_CHARACTERISTIC: + NOTREACHED(); + return; + } +} + +void RecordGetCharacteristicsCharacteristic(const std::string& characteristic) { + UMA_HISTOGRAM_SPARSE_SLOWLY("Bluetooth.Web.GetCharacteristics.Characteristic", + HashUUID(characteristic)); +} + // GATT Operations void RecordGATTOperationOutcome(UMAGATTOperation operation, @@ -195,7 +228,8 @@ switch (outcome) { case CacheQueryOutcome::SUCCESS: case CacheQueryOutcome::BAD_RENDERER: - NOTREACHED() << "No need to record success or renderer crash"; + // No need to record a success or renderer crash. + NOTREACHED(); return UMAGATTOperationOutcome::NOT_SUPPORTED; case CacheQueryOutcome::NO_DEVICE: return UMAGATTOperationOutcome::NO_DEVICE;
diff --git a/content/browser/bluetooth/bluetooth_metrics.h b/content/browser/bluetooth/bluetooth_metrics.h index fe89e6ae..0652e8b 100644 --- a/content/browser/bluetooth/bluetooth_metrics.h +++ b/content/browser/bluetooth/bluetooth_metrics.h
@@ -32,6 +32,7 @@ CHARACTERISTIC_START_NOTIFICATIONS = 6, CHARACTERISTIC_STOP_NOTIFICATIONS = 7, REMOTE_GATT_SERVER_DISCONNECT = 8, + SERVICE_GET_CHARACTERISTICS = 9, // NOTE: Add new actions immediately above this line. Make sure to update // the enum list in tools/metrics/histograms/histograms.xml accordingly. COUNT @@ -67,6 +68,7 @@ BLUETOOTH_OVERVIEW_HELP_LINK_PRESSED = 12, ADAPTER_OFF_HELP_LINK_PRESSED = 13, NEED_LOCATION_HELP_LINK_PRESSED = 14, + BLUETOOTH_CHOOSER_GLOBALLY_DISABLED = 15, // NOTE: Add new requestDevice() outcomes immediately above this line. Make // sure to update the enum list in // tools/metrics/histograms/histograms.xml accordingly. @@ -151,6 +153,7 @@ NO_SERVICE = 2, NOT_FOUND = 3, BLACKLISTED = 4, + NO_CHARACTERISTICS = 5, // Note: Add new outcomes immediately above this line. // Make sure to update the enum list in // tools/metrisc/histogram/histograms.xml accordingly. @@ -166,6 +169,17 @@ // Records the UUID of the characteristic used when calling getCharacteristic. void RecordGetCharacteristicCharacteristic(const std::string& characteristic); +// getCharacteristics() Metrics +// There should be a call to this function for every call to +// Send(BluetoothMsg_GetCharacteristicsSuccess) and +// Send(BluetoothMsg_GetCharacteristicsError). +void RecordGetCharacteristicsOutcome(UMAGetCharacteristicOutcome outcome); +// Records the outcome of the cache query for getCharacteristics. Should only be +// called if QueryCacheForService fails. +void RecordGetCharacteristicsOutcome(CacheQueryOutcome outcome); +// Records the UUID of the characteristic used when calling getCharacteristic. +void RecordGetCharacteristicsCharacteristic(const std::string& characteristic); + // GATT Operations Metrics // These are the possible outcomes when performing GATT operations i.e.
diff --git a/content/browser/cache_storage/cache_storage.proto b/content/browser/cache_storage/cache_storage.proto index 07a61700c..807c1e5 100644 --- a/content/browser/cache_storage/cache_storage.proto +++ b/content/browser/cache_storage/cache_storage.proto
@@ -42,7 +42,6 @@ required ResponseType response_type = 3; repeated CacheHeaderMap headers = 4; optional string url = 5; - optional int64 response_time = 6; } message CacheMetadata {
diff --git a/content/browser/cache_storage/cache_storage_cache.cc b/content/browser/cache_storage/cache_storage_cache.cc index 1e114d9d..0c9a85af 100644 --- a/content/browser/cache_storage/cache_storage_cache.cc +++ b/content/browser/cache_storage/cache_storage_cache.cc
@@ -773,7 +773,7 @@ operation.response.status_text, operation.response.response_type, operation.response.headers, operation.response.blob_uuid, operation.response.blob_size, operation.response.stream_url, - operation.response.error, operation.response.response_time)); + operation.response.error)); scoped_ptr<storage::BlobDataHandle> blob_data_handle; @@ -898,8 +898,6 @@ response_metadata->set_response_type( WebResponseTypeToProtoResponseType(put_context->response->response_type)); response_metadata->set_url(put_context->response->url.spec()); - response_metadata->set_response_time( - put_context->response->response_time.ToInternalValue()); for (ServiceWorkerHeaderMap::const_iterator it = put_context->response->headers.begin(); it != put_context->response->headers.end(); ++it) { @@ -1373,8 +1371,7 @@ metadata.response().status_text(), ProtoResponseTypeToWebResponseType(metadata.response().response_type()), ServiceWorkerHeaderMap(), "", 0, GURL(), - blink::WebServiceWorkerResponseErrorUnknown, - base::Time::FromInternalValue(metadata.response().response_time())); + blink::WebServiceWorkerResponseErrorUnknown); for (int i = 0; i < metadata.response().headers_size(); ++i) { const CacheHeaderMap header = metadata.response().headers(i);
diff --git a/content/browser/cache_storage/cache_storage_cache_unittest.cc b/content/browser/cache_storage/cache_storage_cache_unittest.cc index 505f9bd8..d2ed1df 100644 --- a/content/browser/cache_storage/cache_storage_cache_unittest.cc +++ b/content/browser/cache_storage/cache_storage_cache_unittest.cc
@@ -328,18 +328,18 @@ GURL("http://example.com/body.html"), 200, "OK", blink::WebServiceWorkerResponseTypeDefault, headers, blob_handle_->uuid(), expected_blob_data_.size(), GURL(), - blink::WebServiceWorkerResponseErrorUnknown, base::Time()); + blink::WebServiceWorkerResponseErrorUnknown); body_response_with_query_ = ServiceWorkerResponse( GURL("http://example.com/body.html?query=test"), 200, "OK", blink::WebServiceWorkerResponseTypeDefault, headers, blob_handle_->uuid(), expected_blob_data_.size(), GURL(), - blink::WebServiceWorkerResponseErrorUnknown, base::Time()); + blink::WebServiceWorkerResponseErrorUnknown); no_body_response_ = ServiceWorkerResponse( GURL("http://example.com/no_body.html"), 200, "OK", blink::WebServiceWorkerResponseTypeDefault, headers, "", 0, GURL(), - blink::WebServiceWorkerResponseErrorUnknown, base::Time()); + blink::WebServiceWorkerResponseErrorUnknown); } scoped_ptr<ServiceWorkerFetchRequest> CopyFetchRequest( @@ -1029,10 +1029,10 @@ TEST_F(CacheStorageCacheTest, CaselessServiceWorkerResponseHeaders) { // CacheStorageCache depends on ServiceWorkerResponse having caseless // headers so that it can quickly lookup vary headers. - ServiceWorkerResponse response( - GURL("http://www.example.com"), 200, "OK", - blink::WebServiceWorkerResponseTypeDefault, ServiceWorkerHeaderMap(), "", - 0, GURL(), blink::WebServiceWorkerResponseErrorUnknown, base::Time()); + ServiceWorkerResponse response(GURL("http://www.example.com"), 200, "OK", + blink::WebServiceWorkerResponseTypeDefault, + ServiceWorkerHeaderMap(), "", 0, GURL(), + blink::WebServiceWorkerResponseErrorUnknown); response.headers["content-type"] = "foo"; response.headers["Content-Type"] = "bar"; EXPECT_EQ("bar", response.headers["content-type"]);
diff --git a/content/browser/cache_storage/cache_storage_manager_unittest.cc b/content/browser/cache_storage/cache_storage_manager_unittest.cc index c06df8c..37a3e13 100644 --- a/content/browser/cache_storage/cache_storage_manager_unittest.cc +++ b/content/browser/cache_storage/cache_storage_manager_unittest.cc
@@ -240,7 +240,7 @@ ServiceWorkerResponse response( url, 200, "OK", blink::WebServiceWorkerResponseTypeDefault, ServiceWorkerHeaderMap(), blob_handle->uuid(), url.spec().size(), - GURL(), blink::WebServiceWorkerResponseErrorUnknown, base::Time()); + GURL(), blink::WebServiceWorkerResponseErrorUnknown); CacheStorageBatchOperation operation; operation.operation_type = CACHE_STORAGE_CACHE_OPERATION_TYPE_PUT;
diff --git a/content/browser/child_process_launcher.cc b/content/browser/child_process_launcher.cc index e92554c..cb2fa2d 100644 --- a/content/browser/child_process_launcher.cc +++ b/content/browser/child_process_launcher.cc
@@ -13,6 +13,7 @@ #include "base/logging.h" #include "base/memory/scoped_ptr.h" #include "base/metrics/histogram.h" +#include "base/process/launch.h" #include "base/process/process.h" #include "base/strings/string_number_conversions.h" #include "base/synchronization/lock.h" @@ -132,7 +133,8 @@ options.start_hidden = true; process = base::LaunchElevatedProcess(*cmd_line, options); } else { - process = StartSandboxedProcess(delegate, cmd_line); + process = StartSandboxedProcess( + delegate, cmd_line, base::HandlesToInheritVector()); } #elif defined(OS_POSIX) std::string process_type =
diff --git a/content/browser/compositor/surface_utils.h b/content/browser/compositor/surface_utils.h index 00d0fd7..6d986a9c8 100644 --- a/content/browser/compositor/surface_utils.h +++ b/content/browser/compositor/surface_utils.h
@@ -6,6 +6,7 @@ #define CONTENT_BROWSER_COMPOSITOR_SURFACE_UTILS_H_ #include "base/memory/scoped_ptr.h" +#include "content/common/content_export.h" #include "content/public/browser/readback_types.h" #include "third_party/skia/include/core/SkImageInfo.h" #include "ui/gfx/geometry/size.h" @@ -20,6 +21,7 @@ scoped_ptr<cc::SurfaceIdAllocator> CreateSurfaceIdAllocator(); +CONTENT_EXPORT cc::SurfaceManager* GetSurfaceManager(); void CopyFromCompositingSurfaceHasResult(
diff --git a/content/browser/fileapi/file_system_dir_url_request_job_unittest.cc b/content/browser/fileapi/file_system_dir_url_request_job_unittest.cc index f3576cbf..8a535bbdd 100644 --- a/content/browser/fileapi/file_system_dir_url_request_job_unittest.cc +++ b/content/browser/fileapi/file_system_dir_url_request_job_unittest.cc
@@ -251,9 +251,11 @@ const std::string& url, bool is_directory, int64_t size) { +#define NUMBER "([0-9-]*)" #define STR "([^\"]*)" icu::UnicodeString pattern("^<script>addRow\\(\"" STR "\",\"" STR - "\",(0|1),\"" STR "\",\"" STR "\"\\);</script>"); + "\",(0|1)," NUMBER ",\"" STR "\"," NUMBER ",\"" STR "\"\\);</script>"); +#undef NUMBER #undef STR icu::UnicodeString input(entry_line.c_str()); @@ -261,7 +263,7 @@ icu::RegexMatcher match(pattern, input, 0, status); EXPECT_TRUE(match.find()); - EXPECT_EQ(5, match.groupCount()); + EXPECT_EQ(7, match.groupCount()); EXPECT_EQ(icu::UnicodeString(name.c_str()), match.group(1, status)); EXPECT_EQ(icu::UnicodeString(url.c_str()), match.group(2, status)); EXPECT_EQ(icu::UnicodeString(is_directory ? "1" : "0"), @@ -269,10 +271,10 @@ if (size >= 0) { icu::UnicodeString size_string( base::FormatBytesUnlocalized(size).c_str()); - EXPECT_EQ(size_string, match.group(4, status)); + EXPECT_EQ(size_string, match.group(5, status)); } - icu::UnicodeString date_ustr(match.group(5, status)); + icu::UnicodeString date_ustr(match.group(7, status)); scoped_ptr<icu::DateFormat> formatter( icu::DateFormat::createDateTimeInstance(icu::DateFormat::kShort)); UErrorCode parse_status = U_ZERO_ERROR;
diff --git a/content/browser/frame_host/cross_process_frame_connector.h b/content/browser/frame_host/cross_process_frame_connector.h index 9958c9e..f42466f 100644 --- a/content/browser/frame_host/cross_process_frame_connector.h +++ b/content/browser/frame_host/cross_process_frame_connector.h
@@ -100,6 +100,11 @@ // page) has focus. bool HasFocus(); + // Exposed for tests. + RenderWidgetHostViewBase* GetRootRenderWidgetHostViewForTesting() { + return GetRootRenderWidgetHostView(); + } + private: // Handlers for messages received from the parent frame. void OnForwardInputEvent(const blink::WebInputEvent* event);
diff --git a/content/browser/frame_host/render_frame_host_manager.cc b/content/browser/frame_host/render_frame_host_manager.cc index d05dd9e..96b27bd2 100644 --- a/content/browser/frame_host/render_frame_host_manager.cc +++ b/content/browser/frame_host/render_frame_host_manager.cc
@@ -762,7 +762,7 @@ } void RenderFrameHostManager::ResetProxyHosts() { - for (auto& pair : proxy_hosts_) { + for (const auto& pair : proxy_hosts_) { static_cast<SiteInstanceImpl*>(pair.second->GetSiteInstance()) ->RemoveObserver(this); } @@ -1038,12 +1038,14 @@ RenderFrameProxyHost* RenderFrameHostManager::CreateRenderFrameProxyHost( SiteInstance* site_instance, RenderViewHostImpl* rvh) { - auto result = proxy_hosts_.add(site_instance->GetId(), - make_scoped_ptr(new RenderFrameProxyHost( - site_instance, rvh, frame_tree_node_))); - CHECK(result.second) << "A proxy already existed for this SiteInstance."; + int site_instance_id = site_instance->GetId(); + CHECK(proxy_hosts_.find(site_instance_id) == proxy_hosts_.end()) + << "A proxy already existed for this SiteInstance."; + RenderFrameProxyHost* proxy_host = + new RenderFrameProxyHost(site_instance, rvh, frame_tree_node_); + proxy_hosts_[site_instance_id] = make_scoped_ptr(proxy_host); static_cast<SiteInstanceImpl*>(site_instance)->AddObserver(this); - return result.first->second; + return proxy_host; } void RenderFrameHostManager::DeleteRenderFrameProxyHost( @@ -1772,7 +1774,7 @@ for (const auto& pair : proxy_hosts_) { // Do not create proxies for subframes in the outer delegate's process, // since the outer delegate does not need to interact with them. - if (pair.second == outer_delegate_proxy) + if (pair.second.get() == outer_delegate_proxy) continue; child->render_manager()->CreateRenderFrameProxy( @@ -2354,7 +2356,7 @@ SiteInstance* instance) const { auto it = proxy_hosts_.find(instance->GetId()); if (it != proxy_hosts_.end()) - return it->second; + return it->second.get(); return nullptr; } @@ -2362,14 +2364,6 @@ return proxy_hosts_.size(); } -std::map<int, RenderFrameProxyHost*> -RenderFrameHostManager::GetAllProxyHostsForTesting() { - std::map<int, RenderFrameProxyHost*> result; - for (const auto& pair : proxy_hosts_) - result[pair.first] = pair.second; - return result; -} - void RenderFrameHostManager::CollectOpenerFrameTrees( std::vector<FrameTree*>* opener_frame_trees, base::hash_set<FrameTreeNode*>* nodes_with_back_links) {
diff --git a/content/browser/frame_host/render_frame_host_manager.h b/content/browser/frame_host/render_frame_host_manager.h index 23f0e4db..1b4afcb 100644 --- a/content/browser/frame_host/render_frame_host_manager.h +++ b/content/browser/frame_host/render_frame_host_manager.h
@@ -9,9 +9,9 @@ #include <list> #include <map> +#include <unordered_map> #include "base/containers/hash_tables.h" -#include "base/containers/scoped_ptr_hash_map.h" #include "base/logging.h" #include "base/macros.h" #include "base/memory/scoped_ptr.h" @@ -487,9 +487,12 @@ // Returns the number of RenderFrameProxyHosts for this frame. int GetProxyCount(); - // Returns a copy of the map of proxy hosts. The keys are SiteInstance IDs, - // the values are RenderFrameProxyHosts. - std::map<int, RenderFrameProxyHost*> GetAllProxyHostsForTesting(); + // Returns a const reference to the map of proxy hosts. The keys are + // SiteInstance IDs, the values are RenderFrameProxyHosts. + const std::unordered_map<int32_t, scoped_ptr<RenderFrameProxyHost>>& + GetAllProxyHostsForTesting() const { + return proxy_hosts_; + } // SiteInstanceImpl::Observer void ActiveFrameCountIsZero(SiteInstanceImpl* site_instance) override; @@ -753,8 +756,7 @@ scoped_ptr<NavigationHandleImpl> transfer_navigation_handle_; // Proxy hosts, indexed by site instance ID. - base::ScopedPtrHashMap<int32_t, scoped_ptr<RenderFrameProxyHost>> - proxy_hosts_; + std::unordered_map<int32_t, scoped_ptr<RenderFrameProxyHost>> proxy_hosts_; // A list of RenderFrameHosts waiting to shut down after swapping out. using RFHPendingDeleteList = std::list<scoped_ptr<RenderFrameHostImpl>>;
diff --git a/content/browser/frame_host/render_widget_host_view_child_frame.cc b/content/browser/frame_host/render_widget_host_view_child_frame.cc index f1399a0e..f0c6f4f 100644 --- a/content/browser/frame_host/render_widget_host_view_child_frame.cc +++ b/content/browser/frame_host/render_widget_host_view_child_frame.cc
@@ -533,4 +533,8 @@ surface_id_ = cc::SurfaceId(); } +cc::SurfaceId RenderWidgetHostViewChildFrame::SurfaceIdForTesting() const { + return surface_id_; +}; + } // namespace content
diff --git a/content/browser/frame_host/render_widget_host_view_child_frame.h b/content/browser/frame_host/render_widget_host_view_child_frame.h index bfff4b10..f79f7ab 100644 --- a/content/browser/frame_host/render_widget_host_view_child_frame.h +++ b/content/browser/frame_host/render_widget_host_view_child_frame.h
@@ -178,6 +178,12 @@ // to Bind() to it. void SurfaceDrawn(uint32_t output_surface_id, cc::SurfaceDrawStatus drawn); + // Exposed for tests. + cc::SurfaceId SurfaceIdForTesting() const override; + CrossProcessFrameConnector* FrameConnectorForTesting() const { + return frame_connector_; + } + protected: friend class RenderWidgetHostView; friend class RenderWidgetHostViewChildFrameTest;
diff --git a/content/browser/media/OWNERS b/content/browser/media/OWNERS index d363e52..753b24e 100644 --- a/content/browser/media/OWNERS +++ b/content/browser/media/OWNERS
@@ -1,5 +1,11 @@ +chcunningham@chromium.org dalecurtis@chromium.org ddorwin@chromium.org +hubbe@chromium.org +jrummell@chromium.org +sandersd@chromium.org +watk@chromium.org +wolenetz@chromium.org xhwang@chromium.org per-file midi_*=toyoshim@chromium.org
diff --git a/content/browser/media/media_internals.cc b/content/browser/media/media_internals.cc index c645576..e34cb57 100644 --- a/content/browser/media/media_internals.cc +++ b/content/browser/media/media_internals.cc
@@ -281,20 +281,15 @@ private: struct PipelineInfo { - media::PipelineStatus last_pipeline_status; - bool has_audio; - bool has_video; - bool video_dds; - bool video_decoder_changed; + bool has_pipeline = false; + media::PipelineStatus last_pipeline_status = media::PIPELINE_OK; + bool has_audio = false; + bool has_video = false; + bool video_dds = false; + bool video_decoder_changed = false; std::string audio_codec_name; std::string video_codec_name; std::string video_decoder; - PipelineInfo() - : last_pipeline_status(media::PIPELINE_OK), - has_audio(false), - has_video(false), - video_dds(false), - video_decoder_changed(false) {} }; // Helper function to report PipelineStatus associated with a player to UMA. @@ -324,6 +319,10 @@ DCHECK_CURRENTLY_ON(BrowserThread::UI); PlayerInfoMap& player_info = renderer_info_[render_process_id]; switch (event.type) { + case media::MediaLogEvent::PIPELINE_STATE_CHANGED: { + player_info[event.id].has_pipeline = true; + break; + } case media::MediaLogEvent::PIPELINE_ERROR: { int status; event.params.GetInteger("pipeline_error", &status); @@ -404,6 +403,12 @@ void MediaInternals::MediaInternalsUMAHandler::ReportUMAForPipelineStatus( const PipelineInfo& player_info) { DCHECK_CURRENTLY_ON(BrowserThread::UI); + + // Don't log pipeline status for players which don't actually have a pipeline; + // e.g., the Android MediaSourcePlayer implementation. + if (!player_info.has_pipeline) + return; + if (player_info.has_video && player_info.has_audio) { base::LinearHistogram::FactoryGet( GetUMANameForAVStream(player_info), 1, media::PIPELINE_STATUS_MAX,
diff --git a/content/browser/renderer_host/media/OWNERS b/content/browser/renderer_host/media/OWNERS index b77671af..4796c4fa 100644 --- a/content/browser/renderer_host/media/OWNERS +++ b/content/browser/renderer_host/media/OWNERS
@@ -1,5 +1,11 @@ +chcunningham@chromium.org dalecurtis@chromium.org ddorwin@chromium.org +hubbe@chromium.org +jrummell@chromium.org +sandersd@chromium.org +watk@chromium.org +wolenetz@chromium.org xhwang@chromium.org # WebRTC OWNERS.
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc index b62a5b50..de6cb37a 100644 --- a/content/browser/renderer_host/render_process_host_impl.cc +++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -1462,7 +1462,6 @@ switches::kEnablePluginPlaceholderTesting, switches::kEnablePreciseMemoryInfo, switches::kEnablePreferCompositingToLCDText, - switches::kEnablePrefixedEncryptedMedia, switches::kEnableRGBA4444Textures, switches::kEnableRendererMojoChannel, switches::kEnableSkiaBenchmarking, @@ -1626,6 +1625,16 @@ renderer_cmd->AppendSwitch(switches::kWaitForDebugger); } } + +#if defined(OS_WIN) && !defined(OFFICIAL_BUILD) + // Needed because we can't show the dialog from the sandbox. Don't pass + // --no-sandbox in official builds because that would bypass the bad_flgs + // prompt. + if (renderer_cmd->HasSwitch(switches::kRendererStartupDialog) && + !renderer_cmd->HasSwitch(switches::kNoSandbox)) { + renderer_cmd->AppendSwitch(switches::kNoSandbox); + } +#endif } base::ProcessHandle RenderProcessHostImpl::GetHandle() const {
diff --git a/content/browser/renderer_host/render_widget_host_delegate.h b/content/browser/renderer_host/render_widget_host_delegate.h index 4c0fea9..e562f290 100644 --- a/content/browser/renderer_host/render_widget_host_delegate.h +++ b/content/browser/renderer_host/render_widget_host_delegate.h
@@ -79,21 +79,18 @@ virtual bool HandleWheelEvent(const blink::WebMouseWheelEvent& event); // Notification the user has performed a direct interaction (mouse down, mouse - // wheel, raw key down, or gesture tap) while focus was on the page. Informs - // the delegate that a user is interacting with a site. Only the first mouse - // wheel event during a scroll will trigger this method. - virtual void OnUserInteraction(const blink::WebInputEvent::Type type) {} + // wheel, raw key down, gesture tap, or browser-initiated navigation) while + // focus was on the page. Informs the delegate that a user is interacting with + // a site. Only the first mouse wheel event during a scroll will trigger this + // method. + virtual void OnUserInteraction(RenderWidgetHostImpl* render_widget_host, + const blink::WebInputEvent::Type type) {} // Callback to give the browser a chance to handle the specified gesture // event before sending it to the renderer. // Returns true if the |event| was handled. virtual bool PreHandleGestureEvent(const blink::WebGestureEvent& event); - // Notification the user has made a gesture while focus was on the - // page. This is used to avoid uninitiated user downloads (aka carpet - // bombing), see DownloadRequestLimiter for details. - virtual void OnUserGesture(RenderWidgetHostImpl* render_widget_host) {} - // Notifies that screen rects were sent to renderer process. virtual void DidSendScreenRects(RenderWidgetHostImpl* rwh) {}
diff --git a/content/browser/renderer_host/render_widget_host_impl.cc b/content/browser/renderer_host/render_widget_host_impl.cc index baf1cc4..996e2e7 100644 --- a/content/browser/renderer_host/render_widget_host_impl.cc +++ b/content/browser/renderer_host/render_widget_host_impl.cc
@@ -1133,13 +1133,6 @@ return; } - if (key_event.type == WebKeyboardEvent::Char && - (key_event.windowsKeyCode == ui::VKEY_RETURN || - key_event.windowsKeyCode == ui::VKEY_SPACE)) { - if (delegate_) - delegate_->OnUserGesture(this); - } - // Double check the type to make sure caller hasn't sent us nonsense that // will mess up our key queue. if (!WebInputEvent::isKeyboardEventType(key_event.type)) @@ -1907,21 +1900,17 @@ if (!process_->HasConnection()) return INPUT_EVENT_ACK_STATE_UNKNOWN; - if (event.type == WebInputEvent::MouseDown || - event.type == WebInputEvent::GestureTapDown) { - if (delegate_) - delegate_->OnUserGesture(this); - } - if (delegate_) { if (event.type == WebInputEvent::MouseDown || event.type == WebInputEvent::GestureTapDown || event.type == WebInputEvent::RawKeyDown) { - delegate_->OnUserInteraction(event.type); + delegate_->OnUserInteraction(this, event.type); } else if (event.type == WebInputEvent::MouseWheel) { if (mouse_wheel_coalesce_timer_->Elapsed().InSecondsF() > kMouseWheelCoalesceIntervalInSeconds) { - delegate_->OnUserInteraction(event.type); + // TODO(dominickn): once GestureScrollBegin has landed on all platforms, + // replace this branch and remove. + delegate_->OnUserInteraction(this, event.type); } mouse_wheel_coalesce_timer_.reset(new base::ElapsedTimer());
diff --git a/content/browser/renderer_host/render_widget_host_impl.h b/content/browser/renderer_host/render_widget_host_impl.h index f14edda8..3c2ead0 100644 --- a/content/browser/renderer_host/render_widget_host_impl.h +++ b/content/browser/renderer_host/render_widget_host_impl.h
@@ -834,6 +834,7 @@ // Timer used to batch together mouse wheel events for the delegate // OnUserInteraction method. A wheel event is only dispatched when a wheel // event has not been seen for kMouseWheelCoalesceInterval seconds prior. + // TODO(dominickn): remove this when GestureScrollBegin has landed. scoped_ptr<base::ElapsedTimer> mouse_wheel_coalesce_timer_; base::WeakPtrFactory<RenderWidgetHostImpl> weak_factory_;
diff --git a/content/browser/renderer_host/render_widget_host_view_android.cc b/content/browser/renderer_host/render_widget_host_view_android.cc index d0f4d0e..109d9163 100644 --- a/content/browser/renderer_host/render_widget_host_view_android.cc +++ b/content/browser/renderer_host/render_widget_host_view_android.cc
@@ -1759,12 +1759,10 @@ selection_controller_.reset(); ReleaseLocksOnSurface(); resize = true; - if (content_view_core_) { - if (!content_view_core) - content_view_core_->RemoveObserver(this); - else - content_view_core->AddObserver(this); - } + if (content_view_core_) + content_view_core_->RemoveObserver(this); + if (content_view_core) + content_view_core->AddObserver(this); } content_view_core_ = content_view_core;
diff --git a/content/browser/renderer_host/render_widget_host_view_aura.cc b/content/browser/renderer_host/render_widget_host_view_aura.cc index d59eea5..a504a49 100644 --- a/content/browser/renderer_host/render_widget_host_view_aura.cc +++ b/content/browser/renderer_host/render_widget_host_view_aura.cc
@@ -3083,6 +3083,10 @@ return delegated_frame_host_->GetSurfaceIdNamespace(); } +cc::SurfaceId RenderWidgetHostViewAura::SurfaceIdForTesting() const { + return delegated_frame_host_->SurfaceIdForTesting(); +} + //////////////////////////////////////////////////////////////////////////////// // RenderWidgetHostViewBase, public:
diff --git a/content/browser/renderer_host/render_widget_host_view_aura.h b/content/browser/renderer_host/render_widget_host_view_aura.h index 871d712..be934a0 100644 --- a/content/browser/renderer_host/render_widget_host_view_aura.h +++ b/content/browser/renderer_host/render_widget_host_view_aura.h
@@ -344,6 +344,9 @@ void SetSelectionControllerClientForTest( scoped_ptr<TouchSelectionControllerClientAura> client); + // Exposed for tests. + cc::SurfaceId SurfaceIdForTesting() const override; + protected: ~RenderWidgetHostViewAura() override;
diff --git a/content/browser/renderer_host/render_widget_host_view_base.cc b/content/browser/renderer_host/render_widget_host_view_base.cc index 780ced5..e5e09b9 100644 --- a/content/browser/renderer_host/render_widget_host_view_base.cc +++ b/content/browser/renderer_host/render_widget_host_view_base.cc
@@ -701,4 +701,8 @@ *transformed_point = point; } +cc::SurfaceId RenderWidgetHostViewBase::SurfaceIdForTesting() const { + return cc::SurfaceId(); +} + } // namespace content
diff --git a/content/browser/renderer_host/render_widget_host_view_base.h b/content/browser/renderer_host/render_widget_host_view_base.h index 9a2e25b..5c2495c 100644 --- a/content/browser/renderer_host/render_widget_host_view_base.h +++ b/content/browser/renderer_host/render_widget_host_view_base.h
@@ -18,6 +18,7 @@ #include "base/timer/timer.h" #include "build/build_config.h" #include "cc/output/compositor_frame.h" +#include "cc/surfaces/surface_id.h" #include "content/browser/renderer_host/event_with_latency_info.h" #include "content/common/content_export.h" #include "content/common/input/input_event_ack_state.h" @@ -388,6 +389,9 @@ static void DetachPluginWindowsCallback(HWND window); #endif + // Exposed for testing. + virtual cc::SurfaceId SurfaceIdForTesting() const; + protected: // Interface class only, do not construct. RenderWidgetHostViewBase();
diff --git a/content/browser/renderer_host/render_widget_host_view_mac.h b/content/browser/renderer_host/render_widget_host_view_mac.h index dd3f440a..3fa0ef7 100644 --- a/content/browser/renderer_host/render_widget_host_view_mac.h +++ b/content/browser/renderer_host/render_widget_host_view_mac.h
@@ -21,6 +21,7 @@ #include "base/memory/scoped_ptr.h" #include "base/memory/weak_ptr.h" #include "base/time/time.h" +#include "cc/surfaces/surface_id.h" #include "content/browser/compositor/browser_compositor_view_mac.h" #include "content/browser/compositor/delegated_frame_host.h" #include "content/browser/renderer_host/input/mouse_wheel_rails_filter_mac.h" @@ -529,6 +530,9 @@ // state, if appropriate (see BrowserCompositorViewState for details). void DestroySuspendedBrowserCompositorViewIfNeeded(); + // Exposed for testing. + cc::SurfaceId SurfaceIdForTesting() const override; + private: friend class RenderWidgetHostViewMacTest;
diff --git a/content/browser/renderer_host/render_widget_host_view_mac.mm b/content/browser/renderer_host/render_widget_host_view_mac.mm index 866a803f..5eb76792 100644 --- a/content/browser/renderer_host/render_widget_host_view_mac.mm +++ b/content/browser/renderer_host/render_widget_host_view_mac.mm
@@ -594,6 +594,10 @@ allow_pause_for_resize_or_repaint_ = allow; } +cc::SurfaceId RenderWidgetHostViewMac::SurfaceIdForTesting() const { + return delegated_frame_host_->SurfaceIdForTesting(); +} + /////////////////////////////////////////////////////////////////////////////// // RenderWidgetHostViewMac, RenderWidgetHostView implementation:
diff --git a/content/browser/resources/media/OWNERS b/content/browser/resources/media/OWNERS index ffdcc7a1..4e588e64 100644 --- a/content/browser/resources/media/OWNERS +++ b/content/browser/resources/media/OWNERS
@@ -1,4 +1,10 @@ +chcunningham@chromium.org dalecurtis@chromium.org ddorwin@chromium.org +hubbe@chromium.org +jrummell@chromium.org +sandersd@chromium.org tommi@chromium.org +watk@chromium.org +wolenetz@chromium.org xhwang@chromium.org
diff --git a/content/browser/service_worker/embedded_worker_test_helper.cc b/content/browser/service_worker/embedded_worker_test_helper.cc index 21b99de5..cac4286 100644 --- a/content/browser/service_worker/embedded_worker_test_helper.cc +++ b/content/browser/service_worker/embedded_worker_test_helper.cc
@@ -225,10 +225,10 @@ SimulateSend(new ServiceWorkerHostMsg_FetchEventFinished( embedded_worker_id, request_id, SERVICE_WORKER_FETCH_EVENT_RESULT_RESPONSE, - ServiceWorkerResponse( - GURL(), 200, "OK", blink::WebServiceWorkerResponseTypeDefault, - ServiceWorkerHeaderMap(), std::string(), 0, GURL(), - blink::WebServiceWorkerResponseErrorUnknown, base::Time()))); + ServiceWorkerResponse(GURL(), 200, "OK", + blink::WebServiceWorkerResponseTypeDefault, + ServiceWorkerHeaderMap(), std::string(), 0, GURL(), + blink::WebServiceWorkerResponseErrorUnknown))); } void EmbeddedWorkerTestHelper::OnPushEvent(int embedded_worker_id,
diff --git a/content/browser/service_worker/service_worker_browsertest.cc b/content/browser/service_worker/service_worker_browsertest.cc index 731ade6..5dd0ff2 100644 --- a/content/browser/service_worker/service_worker_browsertest.cc +++ b/content/browser/service_worker/service_worker_browsertest.cc
@@ -14,7 +14,6 @@ #include "base/single_thread_task_runner.h" #include "base/strings/utf_string_conversions.h" #include "base/thread_task_runner_handle.h" -#include "base/time/time.h" #include "build/build_config.h" #include "content/browser/fileapi/chrome_blob_storage_context.h" #include "content/browser/service_worker/embedded_worker_instance.h" @@ -950,31 +949,6 @@ } IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest, - FetchEvent_ResponseTime) { - ServiceWorkerFetchEventResult result; - ServiceWorkerResponse response1; - ServiceWorkerResponse response2; - scoped_ptr<storage::BlobDataHandle> blob_data_handle; - const base::Time start_time(base::Time::Now()); - - RunOnIOThread( - base::Bind(&self::SetUpRegistrationOnIOThread, this, - "/service_worker/fetch_event_response_via_cache.js")); - - FetchOnRegisteredWorker(&result, &response1, &blob_data_handle); - ASSERT_EQ(SERVICE_WORKER_FETCH_EVENT_RESULT_RESPONSE, result); - EXPECT_EQ(200, response1.status_code); - EXPECT_EQ("OK", response1.status_text); - EXPECT_TRUE(response1.response_time >= start_time); - - FetchOnRegisteredWorker(&result, &response2, &blob_data_handle); - ASSERT_EQ(SERVICE_WORKER_FETCH_EVENT_RESULT_RESPONSE, result); - EXPECT_EQ(200, response2.status_code); - EXPECT_EQ("OK", response2.status_text); - EXPECT_EQ(response1.response_time, response2.response_time); -} - -IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest, FetchEvent_respondWithRejection) { ServiceWorkerFetchEventResult result; ServiceWorkerResponse response;
diff --git a/content/browser/service_worker/service_worker_url_request_job.cc b/content/browser/service_worker/service_worker_url_request_job.cc index 092d72db..b5b97f2 100644 --- a/content/browser/service_worker/service_worker_url_request_job.cc +++ b/content/browser/service_worker/service_worker_url_request_job.cc
@@ -310,8 +310,7 @@ void ServiceWorkerURLRequestJob::OnResponseStarted(net::URLRequest* request) { // TODO(falken): Add Content-Length, Content-Type if they were not provided in // the ServiceWorkerResponse. - if (response_time_.is_null()) - response_time_ = base::Time::Now(); + response_time_ = base::Time::Now(); CommitResponseHeader(); } @@ -664,7 +663,6 @@ streaming_version_->AddStreamingURLRequestJob(this); response_url_ = response.url; service_worker_response_type_ = response.response_type; - response_time_ = response.response_time; CreateResponseHeader( response.status_code, response.status_text, response.headers); load_timing_info_.receive_headers_end = base::TimeTicks::Now();
diff --git a/content/browser/service_worker/service_worker_url_request_job_unittest.cc b/content/browser/service_worker/service_worker_url_request_job_unittest.cc index 39b07600c..3421141 100644 --- a/content/browser/service_worker/service_worker_url_request_job_unittest.cc +++ b/content/browser/service_worker/service_worker_url_request_job_unittest.cc
@@ -434,7 +434,7 @@ ServiceWorkerResponse( GURL(), 200, "OK", blink::WebServiceWorkerResponseTypeDefault, ServiceWorkerHeaderMap(), std::string(), 0, GURL(), - blink::WebServiceWorkerResponseErrorUnknown, base::Time()))); + blink::WebServiceWorkerResponseErrorUnknown))); } private: @@ -506,7 +506,7 @@ ServiceWorkerResponse( GURL(), 200, "OK", blink::WebServiceWorkerResponseTypeDefault, ServiceWorkerHeaderMap(), blob_uuid_, blob_size_, GURL(), - blink::WebServiceWorkerResponseErrorUnknown, base::Time()))); + blink::WebServiceWorkerResponseErrorUnknown))); } std::string blob_uuid_; @@ -575,10 +575,10 @@ SimulateSend(new ServiceWorkerHostMsg_FetchEventFinished( embedded_worker_id, request_id, SERVICE_WORKER_FETCH_EVENT_RESULT_RESPONSE, - ServiceWorkerResponse( - GURL(), 200, "OK", blink::WebServiceWorkerResponseTypeDefault, - ServiceWorkerHeaderMap(), "", 0, stream_url_, - blink::WebServiceWorkerResponseErrorUnknown, base::Time()))); + ServiceWorkerResponse(GURL(), 200, "OK", + blink::WebServiceWorkerResponseTypeDefault, + ServiceWorkerHeaderMap(), "", 0, stream_url_, + blink::WebServiceWorkerResponseErrorUnknown))); } const GURL stream_url_;
diff --git a/content/browser/site_per_process_browsertest.cc b/content/browser/site_per_process_browsertest.cc index 2a4cc3c..c91e6b15 100644 --- a/content/browser/site_per_process_browsertest.cc +++ b/content/browser/site_per_process_browsertest.cc
@@ -196,19 +196,9 @@ RenderWidgetHostViewBase* rwhv_child = static_cast<RenderWidgetHostViewBase*>( child_node->current_frame_host()->GetRenderWidgetHost()->GetView()); - // We need to wait for a compositor frame from the child frame, at which - // point its surface will be created. - while (rwhv_child->RendererFrameNumber() <= 0) { - // TODO(lazyboy): Find a better way to avoid sleeping like this. See - // http://crbug.com/405282 for details. - base::RunLoop run_loop; - base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( - FROM_HERE, run_loop.QuitClosure(), - base::TimeDelta::FromMilliseconds(10)); - run_loop.Run(); - } - - uint32_t cur_render_frame_number = root_view->RendererFrameNumber(); + SurfaceHitTestReadyNotifier notifier( + static_cast<RenderWidgetHostViewChildFrame*>(rwhv_child)); + notifier.WaitForSurfaceReady(); // Target input event to child frame. blink::WebMouseEvent child_event; @@ -221,32 +211,6 @@ child_frame_monitor.ResetEventReceived(); router->RouteMouseEvent(root_view, &child_event); - while (!child_frame_monitor.EventWasReceived()) { - // This is working around a big synchronization problem. It is very - // difficult to know if we have received a compositor frame from the - // main frame renderer *after* it received the child frame's surface - // ID. Hit testing won't work until this happens. So if the hit test - // fails then we wait for another frame to arrive and try again. - // TODO(kenrb): We need a better way to do all of this, possibly coming - // from http://crbug.com/405282. - while (root_view->RendererFrameNumber() <= cur_render_frame_number) { - base::RunLoop run_loop; - base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( - FROM_HERE, run_loop.QuitClosure(), - base::TimeDelta::FromMilliseconds(10)); - run_loop.Run(); - } - cur_render_frame_number = root_view->RendererFrameNumber(); - child_event.type = blink::WebInputEvent::MouseDown; - child_event.button = blink::WebPointerProperties::ButtonLeft; - child_event.x = 75; - child_event.y = 75; - child_event.clickCount = 1; - main_frame_monitor.ResetEventReceived(); - child_frame_monitor.ResetEventReceived(); - router->RouteMouseEvent(root_view, &child_event); - } - EXPECT_TRUE(child_frame_monitor.EventWasReceived()); EXPECT_EQ(23, child_frame_monitor.event().x); EXPECT_EQ(23, child_frame_monitor.event().y); @@ -823,17 +787,9 @@ RenderWidgetHostViewBase* rwhv_child = static_cast<RenderWidgetHostViewBase*>( child_node->current_frame_host()->GetRenderWidgetHost()->GetView()); - // We need to wait for a compositor frame from the child frame, at which - // point its surface will be created. - while (rwhv_child->RendererFrameNumber() <= 0) { - // TODO(lazyboy): Find a better way to avoid sleeping like this. See - // http://crbug.com/405282 for details. - base::RunLoop run_loop; - base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( - FROM_HERE, run_loop.QuitClosure(), - base::TimeDelta::FromMilliseconds(10)); - run_loop.Run(); - } + SurfaceHitTestReadyNotifier notifier( + static_cast<RenderWidgetHostViewChildFrame*>(rwhv_child)); + notifier.WaitForSurfaceReady(); // Target input event to child frame. blink::WebMouseEvent child_event;
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc index f86e4f6..0cf8512 100644 --- a/content/browser/web_contents/web_contents_impl.cc +++ b/content/browser/web_contents/web_contents_impl.cc
@@ -2727,7 +2727,8 @@ } void WebContentsImpl::UserGestureDone() { - OnUserGesture(GetRenderViewHost()->GetWidget()); + OnUserInteraction(GetRenderViewHost()->GetWidget(), + blink::WebInputEvent::Undefined); } void WebContentsImpl::SetClosedByUserGesture(bool value) { @@ -4340,21 +4341,22 @@ return render_view_routing_id; } -void WebContentsImpl::OnUserGesture(RenderWidgetHostImpl* render_widget_host) { +void WebContentsImpl::OnUserInteraction( + RenderWidgetHostImpl* render_widget_host, + const blink::WebInputEvent::Type type) { + // Ignore when the renderer is swapped out. + // TODO(dominickn,creis): support widgets for out-of-process iframes. if (render_widget_host != GetRenderViewHost()->GetWidget()) return; - // Notify observers. - FOR_EACH_OBSERVER(WebContentsObserver, observers_, DidGetUserGesture()); - - ResourceDispatcherHostImpl* rdh = ResourceDispatcherHostImpl::Get(); - if (rdh) // NULL in unittests. - rdh->OnUserGesture(this); -} - -void WebContentsImpl::OnUserInteraction(const blink::WebInputEvent::Type type) { FOR_EACH_OBSERVER(WebContentsObserver, observers_, DidGetUserInteraction(type)); + + ResourceDispatcherHostImpl* rdh = ResourceDispatcherHostImpl::Get(); + // Exclude scroll events as user gestures for resource load dispatches. + // rdh is NULL in unittests. + if (rdh && type != blink::WebInputEvent::MouseWheel) + rdh->OnUserGesture(this); } void WebContentsImpl::OnIgnoredUIEvent() {
diff --git a/content/browser/web_contents/web_contents_impl.h b/content/browser/web_contents/web_contents_impl.h index 0cd1ecb..aff6a069 100644 --- a/content/browser/web_contents/web_contents_impl.h +++ b/content/browser/web_contents/web_contents_impl.h
@@ -482,7 +482,8 @@ const base::string16& source_id) override; RendererPreferences GetRendererPrefs( BrowserContext* browser_context) const override; - void OnUserInteraction(const blink::WebInputEvent::Type type) override; + void OnUserInteraction(RenderWidgetHostImpl* render_widget_host, + const blink::WebInputEvent::Type type) override; void OnIgnoredUIEvent() override; void LoadStateChanged(const GURL& url, const net::LoadStateWithParam& load_state, @@ -582,7 +583,6 @@ bool* is_keyboard_shortcut) override; void HandleKeyboardEvent(const NativeWebKeyboardEvent& event) override; bool HandleWheelEvent(const blink::WebMouseWheelEvent& event) override; - void OnUserGesture(RenderWidgetHostImpl* render_widget_host) override; bool PreHandleGestureEvent(const blink::WebGestureEvent& event) override; void DidSendScreenRects(RenderWidgetHostImpl* rwh) override; BrowserAccessibilityManager* GetRootBrowserAccessibilityManager() override;
diff --git a/content/child/background_sync/background_sync_provider.cc b/content/child/background_sync/background_sync_provider.cc index 23d8b45..06976de 100644 --- a/content/child/background_sync/background_sync_provider.cc +++ b/content/child/background_sync/background_sync_provider.cc
@@ -106,25 +106,6 @@ base::Passed(std::move(callbacksPtr)))); } -void BackgroundSyncProvider::unregisterBackgroundSync( - int64_t handle_id, - blink::WebServiceWorkerRegistration* service_worker_registration, - blink::WebSyncUnregistrationCallbacks* callbacks) { - DCHECK(service_worker_registration); - DCHECK(callbacks); - int64_t service_worker_registration_id = - GetServiceWorkerRegistrationId(service_worker_registration); - scoped_ptr<blink::WebSyncUnregistrationCallbacks> callbacksPtr(callbacks); - - // base::Unretained is safe here, as the mojo channel will be deleted (and - // will wipe its callbacks) before 'this' is deleted. - GetBackgroundSyncServicePtr()->Unregister( - handle_id, service_worker_registration_id, - base::Bind(&BackgroundSyncProvider::UnregisterCallback, - base::Unretained(this), - base::Passed(std::move(callbacksPtr)))); -} - void BackgroundSyncProvider::getRegistrations( blink::WebServiceWorkerRegistration* service_worker_registration, blink::WebSyncGetRegistrationsCallbacks* callbacks) { @@ -194,35 +175,6 @@ } } -void BackgroundSyncProvider::UnregisterCallback( - scoped_ptr<blink::WebSyncUnregistrationCallbacks> callbacks, - BackgroundSyncError error) { - // TODO(iclelland): Determine the correct error message to return in each case - switch (error) { - case BackgroundSyncError::NONE: - callbacks->onSuccess(true); - break; - case BackgroundSyncError::NOT_FOUND: - callbacks->onSuccess(false); - break; - case BackgroundSyncError::STORAGE: - callbacks->onError( - blink::WebSyncError(blink::WebSyncError::ErrorTypeUnknown, - "Background Sync is disabled.")); - break; - case BackgroundSyncError::NOT_ALLOWED: - // This error should never be returned from - // BackgroundSyncManager::Unregister - NOTREACHED(); - break; - case BackgroundSyncError::NO_SERVICE_WORKER: - callbacks->onError( - blink::WebSyncError(blink::WebSyncError::ErrorTypeUnknown, - "No service worker is active.")); - break; - } -} - void BackgroundSyncProvider::GetRegistrationsCallback( scoped_ptr<blink::WebSyncGetRegistrationsCallbacks> callbacks, BackgroundSyncError error,
diff --git a/content/child/background_sync/background_sync_provider.h b/content/child/background_sync/background_sync_provider.h index fc76d9d..cbcd9d7 100644 --- a/content/child/background_sync/background_sync_provider.h +++ b/content/child/background_sync/background_sync_provider.h
@@ -50,10 +50,6 @@ blink::WebServiceWorkerRegistration* service_worker_registration, bool requested_from_service_worker, blink::WebSyncRegistrationCallbacks* callbacks) override; - void unregisterBackgroundSync( - int64_t handle_id, - blink::WebServiceWorkerRegistration* service_worker_registration, - blink::WebSyncUnregistrationCallbacks* callbacks) override; void getRegistrations( blink::WebServiceWorkerRegistration* service_worker_registration, blink::WebSyncGetRegistrationsCallbacks* callbacks) override; @@ -74,9 +70,6 @@ scoped_ptr<blink::WebSyncRegistrationCallbacks> callbacks, BackgroundSyncError error, const SyncRegistrationPtr& options); - void UnregisterCallback( - scoped_ptr<blink::WebSyncUnregistrationCallbacks> callbacks, - BackgroundSyncError error); void GetRegistrationsCallback( scoped_ptr<blink::WebSyncGetRegistrationsCallbacks> callbacks, BackgroundSyncError error,
diff --git a/content/child/runtime_features.cc b/content/child/runtime_features.cc index 9fcb6573..c7a8f476 100644 --- a/content/child/runtime_features.cc +++ b/content/child/runtime_features.cc
@@ -70,8 +70,8 @@ if (command_line.HasSwitch(switches::kEnableExperimentalWebPlatformFeatures)) WebRuntimeFeatures::enableExperimentalFeatures(true); - if (base::FeatureList::IsEnabled(features::kExperimentalFramework)) - WebRuntimeFeatures::enableExperimentalFramework(true); + WebRuntimeFeatures::enableExperimentalFramework( + base::FeatureList::IsEnabled(features::kExperimentalFramework)); if (command_line.HasSwitch(switches::kEnableWebBluetooth)) WebRuntimeFeatures::enableWebBluetooth(true);
diff --git a/content/common/background_sync_service.mojom b/content/common/background_sync_service.mojom index 3251d45..8ff823c8 100644 --- a/content/common/background_sync_service.mojom +++ b/content/common/background_sync_service.mojom
@@ -19,7 +19,6 @@ enum BackgroundSyncState { PENDING, FIRING, - UNREGISTERED_WHILE_FIRING, REREGISTERED_WHILE_FIRING, }; @@ -34,8 +33,6 @@ => (BackgroundSyncError err, SyncRegistration options); GetRegistrations(int64 service_worker_registration_id) => (BackgroundSyncError err, array<SyncRegistration> registrations); - Unregister(int64 handle_id, int64 service_worker_registration_id) - => (BackgroundSyncError err); DuplicateRegistrationHandle(int64 handle_id) => (BackgroundSyncError err, SyncRegistration? registration); ReleaseRegistration(int64 handle_id);
diff --git a/content/common/bluetooth/bluetooth_messages.h b/content/common/bluetooth/bluetooth_messages.h index 53623e7..8863475 100644 --- a/content/common/bluetooth/bluetooth_messages.h +++ b/content/common/bluetooth/bluetooth_messages.h
@@ -164,6 +164,23 @@ int /* request_id */, blink::WebBluetoothError /* result */) +// Informs the renderer that the multiple-characteristic request |request_id| +// succeeded. +IPC_MESSAGE_CONTROL5( + BluetoothMsg_GetCharacteristicsSuccess, + int /* thread_id */, + int /* request_id */, + std::vector<std::string> /* characteristics_instance_ids */, + std::vector<std::string> /* characteristics_uuids */, + std::vector<uint32_t> /* characteristics_properties */) + +// Informs the renderer that the multiple-characteristic request |request_id| +// failed. +IPC_MESSAGE_CONTROL3(BluetoothMsg_GetCharacteristicsError, + int /* thread_id */, + int /* request_id */, + blink::WebBluetoothError /* result */) + // Informs the renderer that the value has been read. IPC_MESSAGE_CONTROL3(BluetoothMsg_ReadCharacteristicValueSuccess, int /* thread_id */, @@ -253,6 +270,14 @@ std::string /* service_instance_id */, std::string /* characteristic_uuid */) +// Gets GATT Characteristics within a GATT Service. +IPC_MESSAGE_CONTROL5(BluetoothHostMsg_GetCharacteristics, + int /* thread_id */, + int /* request_id */, + int /* frame_routing_id */, + std::string /* service_instance_id */, + std::string /* characteristics_uuid */) + // Reads the characteristics value from a bluetooth device. IPC_MESSAGE_CONTROL4(BluetoothHostMsg_ReadValue, int /* thread_id */,
diff --git a/content/common/gpu/media/android_deferred_rendering_backing_strategy.cc b/content/common/gpu/media/android_deferred_rendering_backing_strategy.cc index 7ef2e77f..91fbd09 100644 --- a/content/common/gpu/media/android_deferred_rendering_backing_strategy.cc +++ b/content/common/gpu/media/android_deferred_rendering_backing_strategy.cc
@@ -84,7 +84,7 @@ // If we're rendering to a SurfaceTexture we can make a copy of the current // front buffer so that the PictureBuffer textures are still valid. - if (surface_texture_) + if (surface_texture_ && have_context) CopySurfaceTextureToPictures(buffers); // Now that no AVDACodecImages refer to the SurfaceTexture's texture, delete @@ -270,14 +270,6 @@ if (!gl_decoder) return; - scoped_ptr<ui::ScopedMakeCurrent> scoped_make_current; - if (!shared_state_->context()->IsCurrent(NULL)) { - scoped_make_current.reset(new ui::ScopedMakeCurrent( - shared_state_->context(), shared_state_->surface())); - if (!scoped_make_current->Succeeded()) - return; - } - const gfx::Size size = state_provider_->GetSize(); // Create a 2D texture to hold a copy of the SurfaceTexture's front buffer.
diff --git a/content/common/media/OWNERS b/content/common/media/OWNERS index 9d38af2..a943b52 100644 --- a/content/common/media/OWNERS +++ b/content/common/media/OWNERS
@@ -1,8 +1,12 @@ +chcunningham@chromium.org dalecurtis@chromium.org ddorwin@chromium.org +hubbe@chromium.org jrummell@chromium.org sandersd@chromium.org tommi@chromium.org +watk@chromium.org +wolenetz@chromium.org xhwang@chromium.org # For security review of IPC message files.
diff --git a/content/common/sandbox_win.cc b/content/common/sandbox_win.cc index 6a2b3d7..1d7e24a7 100644 --- a/content/common/sandbox_win.cc +++ b/content/common/sandbox_win.cc
@@ -403,7 +403,6 @@ if (result != sandbox::SBOX_ALL_OK) return false; - sandbox::TokenLevel initial_token = sandbox::USER_UNPROTECTED; if (base::win::GetVersion() > base::win::VERSION_XP) { // On 2003/Vista the initial token has to be restricted if the main @@ -665,7 +664,8 @@ base::Process StartSandboxedProcess( SandboxedProcessLauncherDelegate* delegate, - base::CommandLine* cmd_line) { + base::CommandLine* cmd_line, + const base::HandlesToInheritVector& handles_to_inherit) { DCHECK(delegate); const base::CommandLine& browser_command_line = *base::CommandLine::ForCurrentProcess(); @@ -684,8 +684,15 @@ if ((!delegate->ShouldSandbox()) || browser_command_line.HasSwitch(switches::kNoSandbox) || cmd_line->HasSwitch(switches::kNoSandbox)) { - base::Process process = - base::LaunchProcess(*cmd_line, base::LaunchOptions()); + base::LaunchOptions options; + + base::HandlesToInheritVector handles = handles_to_inherit; + if (!handles_to_inherit.empty()) { + options.inherit_handles = true; + options.handles_to_inherit = &handles; + } + base::Process process = base::LaunchProcess(*cmd_line, options); + // TODO(rvargas) crbug.com/417532: Don't share a raw handle. g_broker_services->AddTargetPeer(process.Handle()); return process.Pass(); @@ -693,6 +700,10 @@ sandbox::TargetPolicy* policy = g_broker_services->CreatePolicy(); + // Add any handles to be inherited to the policy. + for (HANDLE handle : handles_to_inherit) + policy->AddHandleToShare(handle); + // Pre-startup mitigations. sandbox::MitigationFlags mitigations = sandbox::MITIGATION_HEAP_TERMINATE | @@ -735,6 +746,9 @@ } #if !defined(NACL_WIN64) + // NOTE: This is placed at function scope so that it stays alive through + // process launch. + base::SharedMemory direct_write_font_cache_section; if (type_str == switches::kRendererProcess || type_str == switches::kPpapiPluginProcess) { if (gfx::win::ShouldUseDirectWrite()) { @@ -753,13 +767,12 @@ std::string name(content::kFontCacheSharedSectionName); name.append(base::UintToString(base::GetCurrentProcId())); - base::SharedMemory direct_write_font_cache_section; if (direct_write_font_cache_section.Open(name, true)) { - void* shared_handle = policy->AddHandleToShare( - direct_write_font_cache_section.handle().GetHandle()); + HANDLE handle = direct_write_font_cache_section.handle().GetHandle(); + policy->AddHandleToShare(handle); cmd_line->AppendSwitchASCII( switches::kFontCacheSharedHandle, - base::UintToString(base::win::HandleToUint32(shared_handle))); + base::UintToString(base::win::HandleToUint32(handle))); } } }
diff --git a/content/common/sandbox_win_unittest.cc b/content/common/sandbox_win_unittest.cc new file mode 100644 index 0000000..c3e6723b --- /dev/null +++ b/content/common/sandbox_win_unittest.cc
@@ -0,0 +1,328 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/base_switches.h" +#include "base/command_line.h" +#include "base/files/file_path.h" +#include "base/lazy_instance.h" +#include "base/rand_util.h" +#include "base/strings/string_number_conversions.h" +#include "base/strings/stringprintf.h" +#include "base/test/multiprocess_test.h" +#include "base/win/win_util.h" +#include "content/public/common/sandbox_init.h" +#include "content/public/common/sandboxed_process_launcher_delegate.h" +#include "sandbox/win/src/sandbox_factory.h" +#include "sandbox/win/src/security_level.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "testing/multiprocess_func_list.h" + +namespace content { +namespace { + +const size_t kMaxMessageLength = 64; +const char kTestMessage1Switch[] = "sandbox-test-message-1"; +const char kTestMessage2Switch[] = "sandbox-test-message-2"; +const char kInheritedHandle1Switch[] = "inherited-handle-1"; +const char kInheritedHandle2Switch[] = "inherited-handle-2"; + +void InitializeTestSandbox() { + sandbox::SandboxInterfaceInfo info = {0}; + info.broker_services = sandbox::SandboxFactory::GetBrokerServices(); + if (!info.broker_services) + info.target_services = sandbox::SandboxFactory::GetTargetServices(); + CHECK(info.broker_services || info.target_services); + CHECK(InitializeSandbox(&info)); +} + +class SandboxInitializer { + public: + SandboxInitializer() { InitializeTestSandbox(); } +}; + +base::LazyInstance<SandboxInitializer> g_sandbox_initializer; + +HANDLE GetHandleFromCommandLine(const char* switch_name) { + unsigned handle_id; + CHECK(base::StringToUint( + base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(switch_name), + &handle_id)); + CHECK(handle_id); + return reinterpret_cast<HANDLE>(handle_id); +} + +std::string ReadMessageFromPipe(HANDLE pipe) { + char buffer[kMaxMessageLength]; + DWORD bytes_read = 0; + BOOL result = + ::ReadFile(pipe, buffer, kMaxMessageLength, &bytes_read, nullptr); + PCHECK(result); + return std::string(buffer, bytes_read); +} + +void WriteMessageToPipe(HANDLE pipe, const base::StringPiece& message) { + DWORD bytes_written = 0; + BOOL result = ::WriteFile(pipe, message.data(), message.size(), + &bytes_written, nullptr); + CHECK_EQ(message.size(), static_cast<size_t>(bytes_written)); + PCHECK(result); +} + +// Does what MultiProcessTest::MakeCmdLine does, plus ensures ".exe" extension +// on Program. +base::CommandLine MakeCmdLineWithExtension(const std::string& testTarget) { + base::CommandLine cmd_line = base::GetMultiProcessTestChildBaseCommandLine(); + cmd_line.AppendSwitchASCII(switches::kTestChildProcess, testTarget); + + base::FilePath program = cmd_line.GetProgram(); + cmd_line.SetProgram(program.ReplaceExtension(L"exe")); + return cmd_line; +} + +class SandboxWinTest : public base::MultiProcessTest { + public: + SandboxWinTest() {} + ~SandboxWinTest() override {} + + void SetUp() override { + // Ensure the sandbox broker services are initialized exactly once in the + // parent test process. + g_sandbox_initializer.Get(); + } + + protected: + // Creates a new pipe for synchronous IO. The client handle is created in a + // non-inheritable state. + void CreatePipe(base::win::ScopedHandle* server, + base::win::ScopedHandle* client) { + std::string pipe_name = base::StringPrintf( + "\\\\.\\pipe\\sandbox_win_test.%I64u", base::RandUint64()); + server->Set(CreateNamedPipeA( + pipe_name.c_str(), PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED | + FILE_FLAG_FIRST_PIPE_INSTANCE, + PIPE_TYPE_BYTE | PIPE_READMODE_BYTE, 1, 4096, 4096, 5000, nullptr)); + CHECK(server->IsValid()); + + client->Set(CreateFileA( + pipe_name.c_str(), GENERIC_READ | GENERIC_WRITE, 0, nullptr, + OPEN_EXISTING, SECURITY_SQOS_PRESENT | SECURITY_ANONYMOUS, nullptr)); + CHECK(client->IsValid()); + } + + base::Process LaunchTestClient( + base::CommandLine* cmd_line, + bool sandboxed, + const base::HandlesToInheritVector& handles_to_inherit) { + TestLauncherDelegate delegate(sandboxed); + base::Process process = StartSandboxedProcess( + &delegate, cmd_line, handles_to_inherit); + CHECK(process.IsValid()); + return process; + } + + class TestLauncherDelegate : public SandboxedProcessLauncherDelegate { + public: + explicit TestLauncherDelegate(bool should_sandbox) + : should_sandbox_(should_sandbox) {} + ~TestLauncherDelegate() override {} + + // SandboxedProcessLauncherDelegate: + bool ShouldSandbox() override { return should_sandbox_; } + + bool PreSpawnTarget(sandbox::TargetPolicy* policy) override { + policy->SetTokenLevel(sandbox::USER_INTERACTIVE, sandbox::USER_LOCKDOWN); + return true; + } + + SandboxType GetSandboxType() override { return SANDBOX_TYPE_RENDERER; } + + private: + bool should_sandbox_; + }; +}; + +// ----------------------------------------------------------------------------- +// Tests follow: single-handle inheritance. +// ----------------------------------------------------------------------------- + +MULTIPROCESS_TEST_MAIN(ReadPipe) { + InitializeTestSandbox(); + + // Expects a message and pipe handle to be passed in, and expects to read the + // same message from that pipe. Exits with 0 on success, 1 on failure. + + base::win::ScopedHandle pipe( + GetHandleFromCommandLine(kInheritedHandle1Switch)); + std::string message = ReadMessageFromPipe(pipe.Get()); + + if (base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( + kTestMessage1Switch) != message) { + return 1; + } + + return 0; +} + +TEST_F(SandboxWinTest, InheritSingleHandleUnsandboxed) { + base::CommandLine cmd_line = MakeCmdLineWithExtension("ReadPipe"); + + base::win::ScopedHandle server, client; + CreatePipe(&server, &client); + + base::HandlesToInheritVector handles; + handles.push_back(client.Get()); + + // Pass a test message and the pipe handle ID on the command line. + const std::string kTestMessage = "Hello, world!"; + cmd_line.AppendSwitchASCII(kTestMessage1Switch, kTestMessage); + cmd_line.AppendSwitchASCII( + kInheritedHandle1Switch, + base::UintToString(base::win::HandleToUint32(client.Get()))); + + base::Process child_process = + LaunchTestClient(&cmd_line, false /* sandboxed */, handles); + + WriteMessageToPipe(server.Get(), kTestMessage); + + int exit_code = 0; + child_process.WaitForExit(&exit_code); + EXPECT_EQ(0, exit_code); +} + +TEST_F(SandboxWinTest, InheritSingleHandleSandboxed) { + base::CommandLine cmd_line = MakeCmdLineWithExtension("ReadPipe"); + + base::win::ScopedHandle server, client; + CreatePipe(&server, &client); + + base::HandlesToInheritVector handles; + handles.push_back(client.Get()); + + // Pass a test message and the pipe handle ID on the command line. + const std::string kTestMessage = "Hello, world!"; + cmd_line.AppendSwitchASCII(kTestMessage1Switch, kTestMessage); + cmd_line.AppendSwitchASCII( + kInheritedHandle1Switch, + base::UintToString(base::win::HandleToUint32(client.Get()))); + + base::Process child_process = + LaunchTestClient(&cmd_line, true /* sandboxed */, handles); + + WriteMessageToPipe(server.Get(), kTestMessage); + + int exit_code = 0; + child_process.WaitForExit(&exit_code); + EXPECT_EQ(0, exit_code); +} + +// ----------------------------------------------------------------------------- +// Tests follow: multi-handle inheritance. +// ----------------------------------------------------------------------------- + +MULTIPROCESS_TEST_MAIN(ReadMultiPipes) { + InitializeTestSandbox(); + + // Expects two messages and two pipe handles to be passed in, and expects to + // read each message from its respective pipe. Exits with 0 on success, 1 on + // failure. + + base::win::ScopedHandle pipe1( + GetHandleFromCommandLine(kInheritedHandle1Switch)); + std::string message1 = ReadMessageFromPipe(pipe1.Get()); + + if (base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( + kTestMessage1Switch) != message1) { + return 1; + } + + base::win::ScopedHandle pipe2( + GetHandleFromCommandLine(kInheritedHandle2Switch)); + std::string message2 = ReadMessageFromPipe(pipe2.Get()); + + if (base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( + kTestMessage2Switch) != message2) { + return 1; + } + + return 0; +} + +TEST_F(SandboxWinTest, InheritMultipleHandlesUnsandboxed) { + base::CommandLine cmd_line = MakeCmdLineWithExtension("ReadMultiPipes"); + + base::win::ScopedHandle server1, client1; + CreatePipe(&server1, &client1); + + base::win::ScopedHandle server2, client2; + CreatePipe(&server2, &client2); + + base::HandlesToInheritVector handles; + handles.push_back(client1.Get()); + handles.push_back(client2.Get()); + + // Pass each pipe handle ID and a message for each on the command line. + const std::string kTestMessage1 = "Hello, world!"; + const std::string kTestMessage2 = "Goodbye, world!"; + + cmd_line.AppendSwitchASCII(kTestMessage1Switch, kTestMessage1); + cmd_line.AppendSwitchASCII( + kInheritedHandle1Switch, + base::UintToString(base::win::HandleToUint32(client1.Get()))); + + cmd_line.AppendSwitchASCII(kTestMessage2Switch, kTestMessage2); + cmd_line.AppendSwitchASCII( + kInheritedHandle2Switch, + base::UintToString(base::win::HandleToUint32(client2.Get()))); + + base::Process child_process = + LaunchTestClient(&cmd_line, false /* sandboxed */, handles); + + WriteMessageToPipe(server1.Get(), kTestMessage1); + WriteMessageToPipe(server2.Get(), kTestMessage2); + + int exit_code = 0; + child_process.WaitForExit(&exit_code); + EXPECT_EQ(0, exit_code); +} + +TEST_F(SandboxWinTest, InheritMultipleHandlesSandboxed) { + base::CommandLine cmd_line = MakeCmdLineWithExtension("ReadMultiPipes"); + + base::win::ScopedHandle server1, client1; + CreatePipe(&server1, &client1); + + base::win::ScopedHandle server2, client2; + CreatePipe(&server2, &client2); + + base::HandlesToInheritVector handles; + handles.push_back(client1.Get()); + handles.push_back(client2.Get()); + + // Pass each pipe handle ID and a message for each on the command line. + const std::string kTestMessage1 = "Hello, world!"; + const std::string kTestMessage2 = "Goodbye, world!"; + + cmd_line.AppendSwitchASCII(kTestMessage1Switch, kTestMessage1); + cmd_line.AppendSwitchASCII( + kInheritedHandle1Switch, + base::UintToString(base::win::HandleToUint32(client1.Get()))); + + cmd_line.AppendSwitchASCII(kTestMessage2Switch, kTestMessage2); + cmd_line.AppendSwitchASCII( + kInheritedHandle2Switch, + base::UintToString(base::win::HandleToUint32(client2.Get()))); + + base::Process child_process = + LaunchTestClient(&cmd_line, true /* sandboxed */, handles); + + WriteMessageToPipe(server1.Get(), kTestMessage1); + WriteMessageToPipe(server2.Get(), kTestMessage2); + + int exit_code = 0; + child_process.WaitForExit(&exit_code); + EXPECT_EQ(0, exit_code); +} + +} // namespace +} // namespace
diff --git a/content/common/service_worker/service_worker_messages.h b/content/common/service_worker/service_worker_messages.h index c6ccfefb..2bd68cd 100644 --- a/content/common/service_worker/service_worker_messages.h +++ b/content/common/service_worker/service_worker_messages.h
@@ -86,7 +86,6 @@ IPC_STRUCT_TRAITS_MEMBER(blob_size) IPC_STRUCT_TRAITS_MEMBER(stream_url) IPC_STRUCT_TRAITS_MEMBER(error) - IPC_STRUCT_TRAITS_MEMBER(response_time) IPC_STRUCT_TRAITS_END() IPC_STRUCT_TRAITS_BEGIN(content::ServiceWorkerObjectInfo)
diff --git a/content/common/service_worker/service_worker_types.cc b/content/common/service_worker/service_worker_types.cc index 93af174..56437d0 100644 --- a/content/common/service_worker/service_worker_types.cc +++ b/content/common/service_worker/service_worker_types.cc
@@ -71,8 +71,7 @@ const std::string& blob_uuid, uint64_t blob_size, const GURL& stream_url, - blink::WebServiceWorkerResponseError error, - base::Time response_time) + blink::WebServiceWorkerResponseError error) : url(url), status_code(status_code), status_text(status_text), @@ -81,8 +80,7 @@ blob_uuid(blob_uuid), blob_size(blob_size), stream_url(stream_url), - error(error), - response_time(response_time) {} + error(error) {} ServiceWorkerResponse::ServiceWorkerResponse( const ServiceWorkerResponse& other) = default;
diff --git a/content/common/service_worker/service_worker_types.h b/content/common/service_worker/service_worker_types.h index b4d49b23..e332f1c 100644 --- a/content/common/service_worker/service_worker_types.h +++ b/content/common/service_worker/service_worker_types.h
@@ -11,7 +11,6 @@ #include <string> #include "base/strings/string_util.h" -#include "base/time/time.h" #include "content/common/content_export.h" #include "content/public/common/referrer.h" #include "content/public/common/request_context_frame_type.h" @@ -161,8 +160,7 @@ const std::string& blob_uuid, uint64_t blob_size, const GURL& stream_url, - blink::WebServiceWorkerResponseError error, - base::Time response_time); + blink::WebServiceWorkerResponseError error); ServiceWorkerResponse(const ServiceWorkerResponse& other); ~ServiceWorkerResponse(); @@ -175,7 +173,6 @@ uint64_t blob_size; GURL stream_url; blink::WebServiceWorkerResponseError error; - base::Time response_time; }; // Represents initialization info for a WebServiceWorker object.
diff --git a/content/content_tests.gypi b/content/content_tests.gypi index 43085aa..bdf3453 100644 --- a/content/content_tests.gypi +++ b/content/content_tests.gypi
@@ -269,6 +269,7 @@ 'browser/webkit_browsertest.cc', 'browser/webui/web_ui_mojo_browsertest.cc', 'child/site_isolation_stats_gatherer_browsertest.cc', + 'common/sandbox_win_unittest.cc', 'renderer/accessibility/renderer_accessibility_browsertest.cc', 'renderer/devtools/v8_sampling_profiler_browsertest.cc', 'renderer/gin_browsertest.cc',
diff --git a/content/public/android/BUILD.gn b/content/public/android/BUILD.gn index 5f0ca17..11a4bf2 100644 --- a/content/public/android/BUILD.gn +++ b/content/public/android/BUILD.gn
@@ -195,7 +195,10 @@ # GYP: //content/content_tests.gypi:content_junit_tests junit_binary("content_junit_tests") { - java_files = [ "junit/src/org/chromium/content/browser/input/GamepadMappingsTest.java" ] + java_files = [ + "junit/src/org/chromium/content/browser/input/GamepadMappingsTest.java", + "junit/src/org/chromium/content/browser/BindingManagerImplTest.java", + ] deps = [ ":content_java", "//base:base_java",
diff --git a/content/public/android/java/src/org/chromium/content/browser/BindingManagerImpl.java b/content/public/android/java/src/org/chromium/content/browser/BindingManagerImpl.java index 2eaf20e..dd17816 100644 --- a/content/public/android/java/src/org/chromium/content/browser/BindingManagerImpl.java +++ b/content/public/android/java/src/org/chromium/content/browser/BindingManagerImpl.java
@@ -33,11 +33,9 @@ // Delays used when clearing moderate binding pool when onSentToBackground happens. private static final long MODERATE_BINDING_POOL_CLEARER_DELAY_MILLIS = 10 * 1000; - private static final long MODERATE_BINDING_POOL_CLEARER_DELAY_MILLIS_ON_TESTING = 100; // These fields allow to override the parameters for testing - see // createBindingManagerForTesting(). - private final long mRemoveStrongBindingDelay; private final boolean mIsLowMemoryDevice; private static class ModerateBindingPool @@ -147,9 +145,7 @@ evictAll(); } }; - mHandler.postDelayed(mDelayedClearer, onTesting - ? MODERATE_BINDING_POOL_CLEARER_DELAY_MILLIS_ON_TESTING - : MODERATE_BINDING_POOL_CLEARER_DELAY_MILLIS); + mHandler.postDelayed(mDelayedClearer, MODERATE_BINDING_POOL_CLEARER_DELAY_MILLIS); } } @@ -234,7 +230,7 @@ if (mIsLowMemoryDevice) { doUnbind.run(); } else { - ThreadUtils.postOnUiThreadDelayed(doUnbind, mRemoveStrongBindingDelay); + ThreadUtils.postOnUiThreadDelayed(doUnbind, DETACH_AS_ACTIVE_HIGH_END_DELAY_MILLIS); } } @@ -351,16 +347,13 @@ * The constructor is private to hide parameters exposed for testing from the regular consumer. * Use factory methods to create an instance. */ - private BindingManagerImpl( - boolean isLowMemoryDevice, long removeStrongBindingDelay, boolean onTesting) { + private BindingManagerImpl(boolean isLowMemoryDevice, boolean onTesting) { mIsLowMemoryDevice = isLowMemoryDevice; - mRemoveStrongBindingDelay = removeStrongBindingDelay; mOnTesting = onTesting; } public static BindingManagerImpl createBindingManager() { - return new BindingManagerImpl( - SysUtils.isLowEndDevice(), DETACH_AS_ACTIVE_HIGH_END_DELAY_MILLIS, false); + return new BindingManagerImpl(SysUtils.isLowEndDevice(), false); } /** @@ -369,7 +362,7 @@ * @param isLowEndDevice true iff the created instance should apply low-end binding policies */ public static BindingManagerImpl createBindingManagerForTesting(boolean isLowEndDevice) { - return new BindingManagerImpl(isLowEndDevice, 0, true); + return new BindingManagerImpl(isLowEndDevice, true); } @Override
diff --git a/content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java b/content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java index 19c3737..9c2105f 100644 --- a/content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java +++ b/content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java
@@ -786,6 +786,16 @@ mWebContentsObserver = new ContentViewWebContentsObserver(this); } + /** + * Updates the native {@link ContentViewCore} with a new window. This moves the NativeView and + * attached it to the new NativeWindow linked with the given {@link WindowAndroid}. + * @param windowAndroid The new {@link WindowAndroid} for this {@link ContentViewCore}. + */ + public void updateWindowAndroid(WindowAndroid windowAndroid) { + long windowNativePointer = windowAndroid == null ? 0 : windowAndroid.getNativePointer(); + nativeUpdateWindowAndroid(mNativeContentViewCore, windowNativePointer); + } + @VisibleForTesting public void createContentViewAndroidDelegate() { mViewAndroidDelegate = new ContentViewAndroidDelegate(mContainerView, mRenderCoordinates); @@ -3210,6 +3220,8 @@ long windowAndroidPtr, HashSet<Object> retainedObjectSet); private static native ContentViewCore nativeFromWebContentsAndroid(WebContents webContents); + private native void nativeUpdateWindowAndroid( + long nativeContentViewCoreImpl, long windowAndroidPtr); private native WebContents nativeGetWebContentsAndroid(long nativeContentViewCoreImpl); private native WindowAndroid nativeGetJavaWindowAndroid(long nativeContentViewCoreImpl);
diff --git a/content/public/android/javatests/src/org/chromium/content/browser/BindingManagerImplTest.java b/content/public/android/junit/src/org/chromium/content/browser/BindingManagerImplTest.java similarity index 71% rename from content/public/android/javatests/src/org/chromium/content/browser/BindingManagerImplTest.java rename to content/public/android/junit/src/org/chromium/content/browser/BindingManagerImplTest.java index ebbe6ca..1011c405 100644 --- a/content/public/android/javatests/src/org/chromium/content/browser/BindingManagerImplTest.java +++ b/content/public/android/junit/src/org/chromium/content/browser/BindingManagerImplTest.java
@@ -8,16 +8,21 @@ import static android.content.ComponentCallbacks2.TRIM_MEMORY_RUNNING_LOW; import static android.content.ComponentCallbacks2.TRIM_MEMORY_RUNNING_MODERATE; +import android.app.Activity; import android.app.Application; import android.os.Bundle; -import android.os.SystemClock; -import android.test.InstrumentationTestCase; -import android.test.suitebuilder.annotation.SmallTest; import android.util.Pair; import org.chromium.base.test.util.Feature; import org.chromium.content.common.IChildProcessCallback; import org.chromium.content.common.IChildProcessService; +import org.chromium.testing.local.LocalRobolectricTestRunner; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.Robolectric; +import org.robolectric.annotation.Config; import java.util.ArrayList; @@ -26,10 +31,11 @@ * implementation, thus testing only the BindingManagerImpl itself. * * Default property of being low-end device is overriden, so that both low-end and high-end policies - * are tested. Unbinding delays are set to 0, so that we don't need to deal with waiting, but we - * still can test if the unbinding tasks are posted or executed synchronously. + * are tested. */ -public class BindingManagerImplTest extends InstrumentationTestCase { +@RunWith(LocalRobolectricTestRunner.class) +@Config(manifest = Config.NONE) +public class BindingManagerImplTest { private static class MockChildProcessConnection implements ChildProcessConnection { boolean mInitialBindingBound; boolean mModerateBindingBound; @@ -156,19 +162,22 @@ } } + Activity mActivity; + // The managers are created in setUp() for convenience. BindingManagerImpl mLowEndManager; BindingManagerImpl mHighEndManager; BindingManagerImpl mModerateBindingManager; ManagerEntry[] mAllManagers; - @Override - protected void setUp() { + @Before + public void setUp() { + mActivity = Robolectric.buildActivity(Activity.class).setup().get(); + mLowEndManager = BindingManagerImpl.createBindingManagerForTesting(true); mHighEndManager = BindingManagerImpl.createBindingManagerForTesting(false); mModerateBindingManager = BindingManagerImpl.createBindingManagerForTesting(false); - mModerateBindingManager.startModerateBindingManagement( - getInstrumentation().getTargetContext(), 4, 0.25f, 0.5f); + mModerateBindingManager.startModerateBindingManagement(mActivity, 4, 0.25f, 0.5f); mAllManagers = new ManagerEntry[] { new ManagerEntry(mLowEndManager, "low-end"), new ManagerEntry(mHighEndManager, "high-end"), @@ -179,7 +188,7 @@ * Verifies that when running on low-end, the binding manager drops the oom bindings for the * previously bound connection when a new connection is used in foreground. */ - @SmallTest + @Test @Feature({"ProcessManagement"}) public void testNewConnectionDropsPreviousOnLowEnd() { // This test applies only to the low-end manager. @@ -191,19 +200,19 @@ // Bind a strong binding on the connection. manager.setInForeground(firstConnection.getPid(), true); - assertTrue(firstConnection.isStrongBindingBound()); + Assert.assertTrue(firstConnection.isStrongBindingBound()); // Add a new connection. MockChildProcessConnection secondConnection = new MockChildProcessConnection(2); manager.addNewConnection(secondConnection.getPid(), secondConnection); // Verify that the strong binding for the first connection wasn't dropped. - assertTrue(firstConnection.isStrongBindingBound()); + Assert.assertTrue(firstConnection.isStrongBindingBound()); // Verify that the strong binding for the first connection was dropped when a new connection // got used in foreground. manager.setInForeground(secondConnection.getPid(), true); - assertFalse(firstConnection.isStrongBindingBound()); + Assert.assertFalse(firstConnection.isStrongBindingBound()); } /** @@ -211,7 +220,7 @@ * - the initial binding should not be affected * - removal of a strong binding should be executed synchronously */ - @SmallTest + @Test @Feature({"ProcessManagement"}) public void testStrongBindingRemovalOnLowEnd() throws Throwable { // This test applies only to the low-end manager. @@ -220,33 +229,26 @@ // Add a connection to the manager. final MockChildProcessConnection connection = new MockChildProcessConnection(1); manager.addNewConnection(connection.getPid(), connection); - assertTrue(connection.isInitialBindingBound()); - assertFalse(connection.isStrongBindingBound()); + Assert.assertTrue(connection.isInitialBindingBound()); + Assert.assertFalse(connection.isStrongBindingBound()); - // This has to happen on the UI thread, so that we can check the binding status right after - // the call to remove it, before the any other task is executed on the main thread. - runTestOnUiThread(new Runnable() { - @Override - public void run() { - // Add a strong binding, verify that the initial binding is not removed. - manager.setInForeground(connection.getPid(), true); - assertTrue(connection.isStrongBindingBound()); - assertTrue(connection.isInitialBindingBound()); + // Add a strong binding, verify that the initial binding is not removed. + manager.setInForeground(connection.getPid(), true); + Assert.assertTrue(connection.isStrongBindingBound()); + Assert.assertTrue(connection.isInitialBindingBound()); - // Remove the strong binding, verify that the strong binding is removed immediately - // and that the initial binding is not affected. - manager.setInForeground(connection.getPid(), false); - assertFalse(connection.isStrongBindingBound()); - assertTrue(connection.isInitialBindingBound()); - } - }); + // Remove the strong binding, verify that the strong binding is removed immediately + // and that the initial binding is not affected. + manager.setInForeground(connection.getPid(), false); + Assert.assertFalse(connection.isStrongBindingBound()); + Assert.assertTrue(connection.isInitialBindingBound()); } /** * Verifies the strong binding removal policies for high end devices, where the removal should * be delayed. */ - @SmallTest + @Test @Feature({"ProcessManagement"}) public void testStrongBindingRemovalOnHighEnd() throws Throwable { // This test applies only to the high-end manager. @@ -255,39 +257,32 @@ // Add a connection to the manager. final MockChildProcessConnection connection = new MockChildProcessConnection(1); manager.addNewConnection(connection.getPid(), connection); - assertTrue(connection.isInitialBindingBound()); - assertFalse(connection.isStrongBindingBound()); - // This has to happen on the UI thread, so that we can check the binding status right after - // the call to remove it, before the any other task is executed on the main thread. - runTestOnUiThread(new Runnable() { - @Override - public void run() { - // Add a strong binding, verify that the initial binding is not removed. - manager.setInForeground(connection.getPid(), true); - assertTrue(connection.isStrongBindingBound()); - assertTrue(connection.isInitialBindingBound()); + Assert.assertTrue(connection.isInitialBindingBound()); + Assert.assertFalse(connection.isStrongBindingBound()); - // Remove the strong binding, verify that the strong binding is not removed - // immediately. - manager.setInForeground(connection.getPid(), false); - assertTrue(connection.isStrongBindingBound()); - assertTrue(connection.isInitialBindingBound()); - } - }); + // Add a strong binding, verify that the initial binding is not removed. + manager.setInForeground(connection.getPid(), true); + Assert.assertTrue(connection.isStrongBindingBound()); + Assert.assertTrue(connection.isInitialBindingBound()); + + // Remove the strong binding, verify that the strong binding is not removed + // immediately. + manager.setInForeground(connection.getPid(), false); + Assert.assertTrue(connection.isStrongBindingBound()); + Assert.assertTrue(connection.isInitialBindingBound()); // Wait until the posted unbinding tasks get executed and verify that the strong binding was - // removed while the initial binding is not affected. Note that this works only because the - // test binding manager has the unbinding delay set to 0. - getInstrumentation().waitForIdleSync(); - assertFalse(connection.isStrongBindingBound()); - assertTrue(connection.isInitialBindingBound()); + // removed while the initial binding is not affected. + Robolectric.runUiThreadTasksIncludingDelayedTasks(); + Assert.assertFalse(connection.isStrongBindingBound()); + Assert.assertTrue(connection.isInitialBindingBound()); } /** * Verifies the strong binding removal policies with moderate binding management, where the * moderate binding should be bound. */ - @SmallTest + @Test @Feature({"ProcessManagement"}) public void testStrongBindingRemovalWithModerateBinding() throws Throwable { // This test applies only to the moderate-binding manager. @@ -296,41 +291,35 @@ // Add a connection to the manager. final MockChildProcessConnection connection = new MockChildProcessConnection(1); manager.addNewConnection(connection.getPid(), connection); - assertTrue(connection.isInitialBindingBound()); - assertFalse(connection.isStrongBindingBound()); - assertFalse(connection.isModerateBindingBound()); - // This has to happen on the UI thread, so that we can check the binding status right after - // the call to remove it, before the any other task is executed on the main thread. - runTestOnUiThread(new Runnable() { - @Override - public void run() { - // Add a strong binding, verify that the initial binding is not removed. - manager.setInForeground(connection.getPid(), true); - assertTrue(connection.isStrongBindingBound()); - assertTrue(connection.isInitialBindingBound()); - assertFalse(connection.isModerateBindingBound()); + Assert.assertTrue(connection.isInitialBindingBound()); + Assert.assertFalse(connection.isStrongBindingBound()); + Assert.assertFalse(connection.isModerateBindingBound()); - // Remove the strong binding, verify that the strong binding is not removed - // immediately. - manager.setInForeground(connection.getPid(), false); - assertTrue(connection.isStrongBindingBound()); - assertTrue(connection.isInitialBindingBound()); - assertFalse(connection.isModerateBindingBound()); - } - }); + // Add a strong binding, verify that the initial binding is not removed. + manager.setInForeground(connection.getPid(), true); + Assert.assertTrue(connection.isStrongBindingBound()); + Assert.assertTrue(connection.isInitialBindingBound()); + Assert.assertFalse(connection.isModerateBindingBound()); + + // Remove the strong binding, verify that the strong binding is not removed + // immediately. + manager.setInForeground(connection.getPid(), false); + Assert.assertTrue(connection.isStrongBindingBound()); + Assert.assertTrue(connection.isInitialBindingBound()); + Assert.assertFalse(connection.isModerateBindingBound()); // Wait until the posted unbinding tasks get executed and verify that the strong binding was // removed while the initial binding is not affected, and the moderate binding is bound. - getInstrumentation().waitForIdleSync(); - assertFalse(connection.isStrongBindingBound()); - assertTrue(connection.isInitialBindingBound()); - assertTrue(connection.isModerateBindingBound()); + Robolectric.runUiThreadTasksIncludingDelayedTasks(); + Assert.assertFalse(connection.isStrongBindingBound()); + Assert.assertTrue(connection.isInitialBindingBound()); + Assert.assertTrue(connection.isModerateBindingBound()); } /** * Verifies that the initial binding is removed after determinedVisibility() is called. */ - @SmallTest + @Test @Feature({"ProcessManagement"}) public void testInitialBindingRemoval() { // This test applies to low-end, high-end and moderate-binding policies. @@ -343,11 +332,11 @@ manager.addNewConnection(connection.getPid(), connection); // Verify that the initial binding is held. - assertTrue(connection.isInitialBindingBound()); + Assert.assertTrue(connection.isInitialBindingBound()); // Call determinedVisibility() and verify that the initial binding was released. manager.determinedVisibility(connection.getPid()); - assertFalse(connection.isInitialBindingBound()); + Assert.assertFalse(connection.isInitialBindingBound()); } } @@ -360,7 +349,7 @@ * This test corresponds to a process crash scenario: after a process dies and its connection is * cleared, isOomProtected() may be called to decide if it was a crash or out-of-memory kill. */ - @SmallTest + @Test @Feature({"ProcessManagement"}) public void testIsOomProtected() { // This test applies to low-end, high-end and moderate-binding policies. @@ -373,36 +362,36 @@ manager.addNewConnection(connection.getPid(), connection); // Initial binding is an oom binding. - assertTrue(message, manager.isOomProtected(connection.getPid())); + Assert.assertTrue(message, manager.isOomProtected(connection.getPid())); // After initial binding is removed, the connection is no longer oom protected. manager.setInForeground(connection.getPid(), false); manager.determinedVisibility(connection.getPid()); - getInstrumentation().waitForIdleSync(); - assertFalse(message, manager.isOomProtected(connection.getPid())); + Robolectric.runUiThreadTasksIncludingDelayedTasks(); + Assert.assertFalse(message, manager.isOomProtected(connection.getPid())); // Add a strong binding, restoring the oom protection. manager.setInForeground(connection.getPid(), true); - assertTrue(message, manager.isOomProtected(connection.getPid())); + Assert.assertTrue(message, manager.isOomProtected(connection.getPid())); // Simulate a process crash - clear a connection in binding manager and remove the // bindings. - assertFalse(manager.isConnectionCleared(connection.getPid())); + Assert.assertFalse(manager.isConnectionCleared(connection.getPid())); manager.clearConnection(connection.getPid()); - assertTrue(manager.isConnectionCleared(connection.getPid())); + Assert.assertTrue(manager.isConnectionCleared(connection.getPid())); connection.stop(); // Verify that the connection doesn't keep any oom bindings, but the manager reports the // oom status as protected. - assertFalse(message, connection.isInitialBindingBound()); - assertFalse(message, connection.isStrongBindingBound()); - assertTrue(message, manager.isOomProtected(connection.getPid())); + Assert.assertFalse(message, connection.isInitialBindingBound()); + Assert.assertFalse(message, connection.isStrongBindingBound()); + Assert.assertTrue(message, manager.isOomProtected(connection.getPid())); } } /** * Verifies that onSentToBackground() / onBroughtToForeground() correctly attach and remove - * additional strong binding keept on the most recently bound renderer for the background + * additional strong binding kept on the most recently bound renderer for the background * period. * * The renderer that will be bound for the background period should be the one that was most @@ -410,7 +399,7 @@ * .addNewConnection() after that. Otherwise we would bound a background renderer when user * loads a new tab in background and leaves the browser. */ - @SmallTest + @Test @Feature({"ProcessManagement"}) public void testBackgroundPeriodBinding() { // This test applies to low-end, high-end and moderate-binding policies. @@ -435,26 +424,26 @@ manager.setInForeground(thirdConnection.getPid(), false); // Sanity check: verify that no connection has a strong binding. - getInstrumentation().waitForIdleSync(); - assertFalse(message, firstConnection.isStrongBindingBound()); - assertFalse(message, secondConnection.isStrongBindingBound()); - assertFalse(message, thirdConnection.isStrongBindingBound()); + Robolectric.runUiThreadTasksIncludingDelayedTasks(); + Assert.assertFalse(message, firstConnection.isStrongBindingBound()); + Assert.assertFalse(message, secondConnection.isStrongBindingBound()); + Assert.assertFalse(message, thirdConnection.isStrongBindingBound()); // Call onSentToBackground() and verify that a strong binding was added for the second // connection: // - not the first one, because it was bound earlier than the second // - not the thirs one, because it was never bound at all manager.onSentToBackground(); - assertFalse(message, firstConnection.isStrongBindingBound()); - assertTrue(message, secondConnection.isStrongBindingBound()); - assertFalse(message, thirdConnection.isStrongBindingBound()); + Assert.assertFalse(message, firstConnection.isStrongBindingBound()); + Assert.assertTrue(message, secondConnection.isStrongBindingBound()); + Assert.assertFalse(message, thirdConnection.isStrongBindingBound()); // Call onBroughtToForeground() and verify that the strong binding was removed. manager.onBroughtToForeground(); - getInstrumentation().waitForIdleSync(); - assertFalse(message, firstConnection.isStrongBindingBound()); - assertFalse(message, secondConnection.isStrongBindingBound()); - assertFalse(message, thirdConnection.isStrongBindingBound()); + Robolectric.runUiThreadTasksIncludingDelayedTasks(); + Assert.assertFalse(message, firstConnection.isStrongBindingBound()); + Assert.assertFalse(message, secondConnection.isStrongBindingBound()); + Assert.assertFalse(message, thirdConnection.isStrongBindingBound()); } } @@ -462,7 +451,7 @@ * Verifies that onSentToBackground() drops all the moderate bindings after some delay, and * onBroughtToForeground() doesn't recover them. */ - @SmallTest + @Test @Feature({"ProcessManagement"}) public void testModerateBindingDropOnBackground() { // This test applies only to the moderate-binding manager. @@ -479,8 +468,8 @@ for (MockChildProcessConnection connection : connections) { manager.setInForeground(connection.getPid(), true); manager.setInForeground(connection.getPid(), false); - getInstrumentation().waitForIdleSync(); - assertTrue(connection.isModerateBindingBound()); + Robolectric.runUiThreadTasksIncludingDelayedTasks(); + Assert.assertTrue(connection.isModerateBindingBound()); } // Exclude lastInForeground because it will be kept in foreground when onSentToBackground() @@ -489,51 +478,49 @@ manager.addNewConnection(lastInForeground.getPid(), lastInForeground); manager.setInForeground(lastInForeground.getPid(), true); manager.setInForeground(lastInForeground.getPid(), false); - getInstrumentation().waitForIdleSync(); + Robolectric.runUiThreadTasksIncludingDelayedTasks(); // Verify that leaving the application for a short time doesn't clear the moderate bindings. manager.onSentToBackground(); for (MockChildProcessConnection connection : connections) { - assertTrue(connection.isModerateBindingBound()); + Assert.assertTrue(connection.isModerateBindingBound()); } - assertTrue(lastInForeground.isStrongBindingBound()); - assertFalse(lastInForeground.isModerateBindingBound()); + Assert.assertTrue(lastInForeground.isStrongBindingBound()); + Assert.assertFalse(lastInForeground.isModerateBindingBound()); manager.onBroughtToForeground(); - SystemClock.sleep(500); + Robolectric.runUiThreadTasksIncludingDelayedTasks(); for (MockChildProcessConnection connection : connections) { - assertTrue(connection.isModerateBindingBound()); + Assert.assertTrue(connection.isModerateBindingBound()); } // Call onSentToBackground() and verify that all the moderate bindings drop after some // delay. manager.onSentToBackground(); for (MockChildProcessConnection connection : connections) { - assertTrue(connection.isModerateBindingBound()); + Assert.assertTrue(connection.isModerateBindingBound()); } - assertTrue(lastInForeground.isStrongBindingBound()); - assertFalse(lastInForeground.isModerateBindingBound()); - SystemClock.sleep(500); + Assert.assertTrue(lastInForeground.isStrongBindingBound()); + Assert.assertFalse(lastInForeground.isModerateBindingBound()); + Robolectric.runUiThreadTasksIncludingDelayedTasks(); for (MockChildProcessConnection connection : connections) { - assertFalse(connection.isModerateBindingBound()); + Assert.assertFalse(connection.isModerateBindingBound()); } // Call onBroughtToForeground() and verify that the previous moderate bindings aren't // recovered. manager.onBroughtToForeground(); for (MockChildProcessConnection connection : connections) { - assertFalse(connection.isModerateBindingBound()); + Assert.assertFalse(connection.isModerateBindingBound()); } } /** * Verifies that onLowMemory() drops all the moderate bindings. */ - @SmallTest + @Test @Feature({"ProcessManagement"}) public void testModerateBindingDropOnLowMemory() { - final Application app = - (Application) getInstrumentation().getTargetContext().getApplicationContext(); - // This test applies only to the moderate-binding manager. + final Application app = mActivity.getApplication(); final BindingManagerImpl manager = mModerateBindingManager; MockChildProcessConnection[] connections = new MockChildProcessConnection[4]; @@ -547,25 +534,24 @@ for (MockChildProcessConnection connection : connections) { manager.setInForeground(connection.getPid(), true); manager.setInForeground(connection.getPid(), false); - getInstrumentation().waitForIdleSync(); - assertTrue(connection.isModerateBindingBound()); + Robolectric.runUiThreadTasksIncludingDelayedTasks(); + Assert.assertTrue(connection.isModerateBindingBound()); } // Call onLowMemory() and verify that all the moderate bindings drop. app.onLowMemory(); for (MockChildProcessConnection connection : connections) { - assertFalse(connection.isModerateBindingBound()); + Assert.assertFalse(connection.isModerateBindingBound()); } } /** * Verifies that onTrimMemory() drops moderate bindings properly. */ - @SmallTest + @Test @Feature({"ProcessManagement"}) public void testModerateBindingDropOnTrimMemory() { - final Application app = - (Application) getInstrumentation().getTargetContext().getApplicationContext(); + final Application app = mActivity.getApplication(); // This test applies only to the moderate-binding manager. final BindingManagerImpl manager = mModerateBindingManager; @@ -590,14 +576,15 @@ for (MockChildProcessConnection connection : connections) { manager.setInForeground(connection.getPid(), true); manager.setInForeground(connection.getPid(), false); - getInstrumentation().waitForIdleSync(); - assertTrue(message, connection.isModerateBindingBound()); + Robolectric.runUiThreadTasksIncludingDelayedTasks(); + Assert.assertTrue(message, connection.isModerateBindingBound()); } app.onTrimMemory(pair.first); // Verify that some of moderate bindings drop. for (int i = 0; i < connections.length; i++) { - assertEquals(message, i >= pair.second, connections[i].isModerateBindingBound()); + Assert.assertEquals( + message, i >= pair.second, connections[i].isModerateBindingBound()); } } } @@ -605,7 +592,7 @@ /** * Verifies that BindingManager.releaseAllModerateBindings() drops all the moderate bindings. */ - @SmallTest + @Test @Feature({"ProcessManagement"}) public void testModerateBindingDropOnReleaseAllModerateBindings() { // This test applies only to the moderate-binding manager. @@ -622,15 +609,15 @@ for (MockChildProcessConnection connection : connections) { manager.setInForeground(connection.getPid(), true); manager.setInForeground(connection.getPid(), false); - getInstrumentation().waitForIdleSync(); - assertTrue(connection.isModerateBindingBound()); + Robolectric.runUiThreadTasksIncludingDelayedTasks(); + Assert.assertTrue(connection.isModerateBindingBound()); } // Call BindingManager.releaseAllModerateBindings() and verify that all the moderate // bindings drop. manager.releaseAllModerateBindings(); for (MockChildProcessConnection connection : connections) { - assertFalse(connection.isModerateBindingBound()); + Assert.assertFalse(connection.isModerateBindingBound()); } } }
diff --git a/content/public/browser/content_browser_client.cc b/content/public/browser/content_browser_client.cc index 269aaeea..be79b6b7 100644 --- a/content/public/browser/content_browser_client.cc +++ b/content/public/browser/content_browser_client.cc
@@ -222,6 +222,13 @@ return true; } +bool ContentBrowserClient::AllowWebBluetooth( + content::BrowserContext* browser_context, + const url::Origin& requesting_origin, + const url::Origin& embedding_origin) { + return true; +} + QuotaPermissionContext* ContentBrowserClient::CreateQuotaPermissionContext() { return nullptr; }
diff --git a/content/public/browser/content_browser_client.h b/content/public/browser/content_browser_client.h index 9e6c174..00bae9f 100644 --- a/content/public/browser/content_browser_client.h +++ b/content/public/browser/content_browser_client.h
@@ -84,6 +84,10 @@ class SelectFilePolicy; } +namespace url { +class Origin; +} + namespace storage { class ExternalMountPoints; class FileSystemBackend; @@ -410,6 +414,12 @@ // Allow the embedder to control whether we can use <keygen>. virtual bool AllowKeygen(const GURL& url, content::ResourceContext* context); + // Allow the embedder to control whether we can use Web Bluetooth. + // TODO(crbug.com/589228): Replace this with a use of the permission system. + virtual bool AllowWebBluetooth(content::BrowserContext* browser_context, + const url::Origin& requesting_origin, + const url::Origin& embedding_origin); + // Allow the embedder to override the request context based on the URL for // certain operations, like cookie access. Returns nullptr to indicate the // regular request context should be used.
diff --git a/content/public/browser/web_contents_observer.h b/content/public/browser/web_contents_observer.h index 6c8aded1..29c2c1e 100644 --- a/content/public/browser/web_contents_observer.h +++ b/content/public/browser/web_contents_observer.h
@@ -317,22 +317,19 @@ // failure methods will also be invoked. virtual void NavigationStopped() {} - // This indicates that the next navigation was triggered by a user gesture. - // TODO(dominickn): remove this method in favor of DidGetUserInteraction, - // with the appropriate filtering by input event type. - virtual void DidGetUserGesture() {} - // Called when there has been direct user interaction with the WebContents. // The type argument specifies the kind of interaction. Direct user input // signalled through this callback includes: // 1) any mouse down event (blink::WebInputEvent::MouseDown); // 2) the start of a mouse wheel scroll (blink::WebInputEvent::MouseWheel); - // 3) any raw key down event (blink::WebInputEvent::RawKeyDown); and - // 4) any gesture tap event (blink::WebInputEvent::GestureTapDown). + // 3) any raw key down event (blink::WebInputEvent::RawKeyDown); + // 4) any gesture tap event (blink::WebInputEvent::GestureTapDown); and + // 5) a browser navigation or reload (blink::WebInputEvent::Undefined). // The start of a mouse wheel scroll is heuristically detected: a mouse // wheel event fired at least 0.1 seconds after any other wheel event is // regarded as the beginning of a scroll. This matches the interval used by // the Blink EventHandler to detect the end of scrolls. + // TODO(dominickn): replace MouseWheel with GestureScrollBegin. virtual void DidGetUserInteraction(const blink::WebInputEvent::Type type) {} // This method is invoked when a RenderViewHost of this WebContents was
diff --git a/content/public/common/content_features.cc b/content/public/common/content_features.cc index 2a83379..5b3bf32 100644 --- a/content/public/common/content_features.cc +++ b/content/public/common/content_features.cc
@@ -26,7 +26,7 @@ // The Experimental Framework for controlling access to API experiments. const base::Feature kExperimentalFramework{"ExperimentalFramework", - base::FEATURE_DISABLED_BY_DEFAULT}; + base::FEATURE_ENABLED_BY_DEFAULT}; // Non-validating reload on reload-to-refresh-content (e.g. pull-to-refresh). // See https://crbug.com/558829
diff --git a/content/public/common/content_switches.cc b/content/public/common/content_switches.cc index 462b789..22afe19 100644 --- a/content/public/common/content_switches.cc +++ b/content/public/common/content_switches.cc
@@ -193,10 +193,6 @@ // this switch. const char kDisableKillAfterBadIPC[] = "disable-kill-after-bad-ipc"; -// Enables prefixed Encrypted Media API (e.g. webkitGenerateKeyRequest()). -const char kEnablePrefixedEncryptedMedia[] = - "enable-prefixed-encrypted-media"; - // Disables LCD text. const char kDisableLCDText[] = "disable-lcd-text"; @@ -741,7 +737,9 @@ // or instability. const char kRendererProcessLimit[] = "renderer-process-limit"; -// Causes the renderer process to display a dialog on launch. +// Causes the renderer process to display a dialog on launch. Passing this flag +// also adds kNoSandbox on Windows non-official builds, since that's needed to +// show a dialog. const char kRendererStartupDialog[] = "renderer-startup-dialog"; // Reduce the default `referer` header's granularity.
diff --git a/content/public/common/content_switches.h b/content/public/common/content_switches.h index 6277db9..aef75bf 100644 --- a/content/public/common/content_switches.h +++ b/content/public/common/content_switches.h
@@ -66,7 +66,6 @@ extern const char kDisableHistogramCustomizer[]; CONTENT_EXPORT extern const char kDisableLCDText[]; CONTENT_EXPORT extern const char kDisablePreferCompositingToLCDText[]; -CONTENT_EXPORT extern const char kEnablePrefixedEncryptedMedia[]; extern const char kDisableKillAfterBadIPC[]; CONTENT_EXPORT extern const char kDisableLocalStorage[]; CONTENT_EXPORT extern const char kDisableLogging[];
diff --git a/content/public/common/sandbox_init.h b/content/public/common/sandbox_init.h index 071facda..cbd8142 100644 --- a/content/public/common/sandbox_init.h +++ b/content/public/common/sandbox_init.h
@@ -8,6 +8,7 @@ #include "base/files/scoped_file.h" #include "base/memory/scoped_ptr.h" #include "base/memory/shared_memory.h" +#include "base/process/launch.h" #include "base/process/process.h" #include "base/process/process_handle.h" #include "build/build_config.h" @@ -60,10 +61,13 @@ CONTENT_EXPORT bool BrokerAddTargetPeer(HANDLE peer_process); // Launch a sandboxed process. |delegate| may be NULL. If |delegate| is non-NULL -// then it just has to outlive this method call. +// then it just has to outlive this method call. |handles_to_inherit| is a list +// of handles for the child process to inherit. The caller retains ownership of +// the handles. CONTENT_EXPORT base::Process StartSandboxedProcess( SandboxedProcessLauncherDelegate* delegate, - base::CommandLine* cmd_line); + base::CommandLine* cmd_line, + const base::HandlesToInheritVector& handles_to_inherit); #elif defined(OS_MACOSX)
diff --git a/content/public/renderer/render_view.h b/content/public/renderer/render_view.h index d02fa8f..f913f64 100644 --- a/content/public/renderer/render_view.h +++ b/content/public/renderer/render_view.h
@@ -21,6 +21,7 @@ namespace blink { class WebElement; class WebFrame; +class WebFrameWidget; class WebLocalFrame; class WebNode; class WebString; @@ -88,6 +89,9 @@ // Returns the associated WebView. May return NULL when the view is closing. virtual blink::WebView* GetWebView() = 0; + // Returns the associated WebFrameWidget. + virtual blink::WebFrameWidget* GetWebFrameWidget() = 0; + // Returns true if we should display scrollbars for the given view size and // false if the scrollbars should be hidden. virtual bool ShouldDisplayScrollbars(int width, int height) const = 0;
diff --git a/content/renderer/bluetooth/bluetooth_dispatcher.cc b/content/renderer/bluetooth/bluetooth_dispatcher.cc index d24a056..63f1753 100644 --- a/content/renderer/bluetooth/bluetooth_dispatcher.cc +++ b/content/renderer/bluetooth/bluetooth_dispatcher.cc
@@ -65,6 +65,17 @@ scoped_ptr<blink::WebBluetoothGetCharacteristicCallbacks> callbacks; }; +struct BluetoothCharacteristicsRequest { + BluetoothCharacteristicsRequest( + blink::WebString service_instance_id, + blink::WebBluetoothGetCharacteristicsCallbacks* callbacks) + : service_instance_id(service_instance_id), callbacks(callbacks) {} + ~BluetoothCharacteristicsRequest() {} + + blink::WebString service_instance_id; + scoped_ptr<blink::WebBluetoothGetCharacteristicsCallbacks> callbacks; +}; + // Struct that holds a pending WriteValue request. struct BluetoothWriteValueRequest { BluetoothWriteValueRequest(const blink::WebVector<uint8_t>& value, @@ -179,6 +190,10 @@ OnGetCharacteristicSuccess); IPC_MESSAGE_HANDLER(BluetoothMsg_GetCharacteristicError, OnGetCharacteristicError); + IPC_MESSAGE_HANDLER(BluetoothMsg_GetCharacteristicsSuccess, + OnGetCharacteristicsSuccess); + IPC_MESSAGE_HANDLER(BluetoothMsg_GetCharacteristicsError, + OnGetCharacteristicsError); IPC_MESSAGE_HANDLER(BluetoothMsg_ReadCharacteristicValueSuccess, OnReadValueSuccess); IPC_MESSAGE_HANDLER(BluetoothMsg_ReadCharacteristicValueError, @@ -269,6 +284,18 @@ service_instance_id.utf8(), characteristic_uuid.utf8())); } +void BluetoothDispatcher::getCharacteristics( + int frame_routing_id, + const blink::WebString& service_instance_id, + const blink::WebString& characteristics_uuid, + blink::WebBluetoothGetCharacteristicsCallbacks* callbacks) { + int request_id = pending_characteristics_requests_.Add( + new BluetoothCharacteristicsRequest(service_instance_id, callbacks)); + Send(new BluetoothHostMsg_GetCharacteristics( + CurrentWorkerId(), request_id, frame_routing_id, + service_instance_id.utf8(), characteristics_uuid.utf8())); +} + void BluetoothDispatcher::readValue( int frame_routing_id, const blink::WebString& characteristic_instance_id, @@ -659,9 +686,9 @@ pending_characteristic_requests_.Lookup(request_id); request->callbacks->onSuccess( blink::adoptWebPtr(new WebBluetoothRemoteGATTCharacteristicInit( + request->service_instance_id, WebString::fromUTF8(characteristic_instance_id), - request->service_instance_id, request->characteristic_uuid, - characteristic_properties))); + request->characteristic_uuid, characteristic_properties))); pending_characteristic_requests_.Remove(request_id); } @@ -677,6 +704,45 @@ pending_characteristic_requests_.Remove(request_id); } +void BluetoothDispatcher::OnGetCharacteristicsSuccess( + int thread_id, + int request_id, + const std::vector<std::string>& characteristics_instance_ids, + const std::vector<std::string>& characteristics_uuids, + const std::vector<uint32_t>& characteristics_properties) { + DCHECK(pending_characteristics_requests_.Lookup(request_id)) << request_id; + + BluetoothCharacteristicsRequest* request = + pending_characteristics_requests_.Lookup(request_id); + + WebVector<blink::WebBluetoothRemoteGATTCharacteristicInit*>* characteristics = + new WebVector<WebBluetoothRemoteGATTCharacteristicInit*>( + characteristics_instance_ids.size()); + + for (size_t i = 0; i < characteristics_instance_ids.size(); i++) { + (*characteristics)[i] = new WebBluetoothRemoteGATTCharacteristicInit( + request->service_instance_id, + WebString::fromUTF8(characteristics_instance_ids[i]), + WebString::fromUTF8(characteristics_uuids[i]), + characteristics_properties[i]); + } + + request->callbacks->onSuccess(blink::adoptWebPtr(characteristics)); + + pending_characteristics_requests_.Lookup(request_id); +} + +void BluetoothDispatcher::OnGetCharacteristicsError(int thread_id, + int request_id, + WebBluetoothError error) { + DCHECK(pending_characteristics_requests_.Lookup(request_id)) << request_id; + + pending_characteristics_requests_.Lookup(request_id) + ->callbacks->onError(WebBluetoothError(error)); + + pending_characteristics_requests_.Remove(request_id); +} + void BluetoothDispatcher::OnReadValueSuccess( int thread_id, int request_id,
diff --git a/content/renderer/bluetooth/bluetooth_dispatcher.h b/content/renderer/bluetooth/bluetooth_dispatcher.h index 1054ac4b..c93d66f 100644 --- a/content/renderer/bluetooth/bluetooth_dispatcher.h +++ b/content/renderer/bluetooth/bluetooth_dispatcher.h
@@ -32,6 +32,7 @@ } struct BluetoothCharacteristicRequest; +struct BluetoothCharacteristicsRequest; struct BluetoothPrimaryServiceRequest; struct BluetoothWriteValueRequest; struct BluetoothNotificationsRequest; @@ -74,12 +75,16 @@ const blink::WebString& device_id, const blink::WebString& service_uuid, blink::WebBluetoothGetPrimaryServiceCallbacks* callbacks); - void getCharacteristic( int frame_routing_id, const blink::WebString& service_instance_id, const blink::WebString& characteristic_uuid, blink::WebBluetoothGetCharacteristicCallbacks* callbacks); + void getCharacteristics( + int frame_routing_id, + const blink::WebString& service_instance_id, + const blink::WebString& characteristics_uuid, + blink::WebBluetoothGetCharacteristicsCallbacks* callbacks); void readValue(int frame_routing_id, const blink::WebString& characteristic_instance_id, blink::WebBluetoothReadValueCallbacks* callbacks); @@ -196,6 +201,15 @@ void OnGetCharacteristicError(int thread_id, int request_id, blink::WebBluetoothError error); + void OnGetCharacteristicsSuccess( + int thread_id, + int request_id, + const std::vector<std::string>& characteristics_instance_ids, + const std::vector<std::string>& characteristics_uuids, + const std::vector<uint32_t>& characteristic_properties); + void OnGetCharacteristicsError(int thread_id, + int request_id, + blink::WebBluetoothError error); void OnReadValueSuccess(int thread_id, int request_id, const std::vector<uint8_t>& value); @@ -237,6 +251,9 @@ // Tracks requests to get a characteristic from a service. IDMap<BluetoothCharacteristicRequest, IDMapOwnPointer> pending_characteristic_requests_; + // Tracks requests to get characteristics from a service. + IDMap<BluetoothCharacteristicsRequest, IDMapOwnPointer> + pending_characteristics_requests_; // Tracks requests to read from a characteristics. IDMap<blink::WebBluetoothReadValueCallbacks, IDMapOwnPointer> pending_read_value_requests_;
diff --git a/content/renderer/bluetooth/web_bluetooth_impl.cc b/content/renderer/bluetooth/web_bluetooth_impl.cc index d138492..2df80b3a 100644 --- a/content/renderer/bluetooth/web_bluetooth_impl.cc +++ b/content/renderer/bluetooth/web_bluetooth_impl.cc
@@ -47,10 +47,18 @@ void WebBluetoothImpl::getCharacteristic( const blink::WebString& service_instance_id, - const blink::WebString& characteristic_uuid, + const blink::WebString& characteristics_uuid, blink::WebBluetoothGetCharacteristicCallbacks* callbacks) { GetDispatcher()->getCharacteristic(frame_routing_id_, service_instance_id, - characteristic_uuid, callbacks); + characteristics_uuid, callbacks); +} + +void WebBluetoothImpl::getCharacteristics( + const blink::WebString& service_instance_id, + const blink::WebString& characteristic_uuid, + blink::WebBluetoothGetCharacteristicsCallbacks* callbacks) { + GetDispatcher()->getCharacteristics(frame_routing_id_, service_instance_id, + characteristic_uuid, callbacks); } void WebBluetoothImpl::readValue(
diff --git a/content/renderer/bluetooth/web_bluetooth_impl.h b/content/renderer/bluetooth/web_bluetooth_impl.h index 5ba96eb..3075d1b 100644 --- a/content/renderer/bluetooth/web_bluetooth_impl.h +++ b/content/renderer/bluetooth/web_bluetooth_impl.h
@@ -49,6 +49,11 @@ const blink::WebString& service_instance_id, const blink::WebString& characteristic_uuid, blink::WebBluetoothGetCharacteristicCallbacks* callbacks) override; + void getCharacteristics( + const blink::WebString& service_instance_id, + const blink::WebString& characteristics_uuid, + blink::WebBluetoothGetCharacteristicsCallbacks* callbacks) override; + void readValue(const blink::WebString& characteristic_instance_id, blink::WebBluetoothReadValueCallbacks* callbacks) override; void writeValue(const blink::WebString& characteristic_instance_id,
diff --git a/content/renderer/cache_storage/cache_storage_dispatcher.cc b/content/renderer/cache_storage/cache_storage_dispatcher.cc index b20d19e..9091468 100644 --- a/content/renderer/cache_storage/cache_storage_dispatcher.cc +++ b/content/renderer/cache_storage/cache_storage_dispatcher.cc
@@ -89,8 +89,7 @@ web_response.responseType(), headers, base::UTF16ToASCII(base::StringPiece16(web_response.blobUUID())), web_response.blobSize(), web_response.streamURL(), - blink::WebServiceWorkerResponseErrorUnknown, - base::Time::FromInternalValue(web_response.responseTime())); + blink::WebServiceWorkerResponseErrorUnknown); } CacheStorageCacheQueryParams QueryParamsFromWebQueryParams( @@ -647,7 +646,6 @@ web_response->setStatus(response.status_code); web_response->setStatusText(base::ASCIIToUTF16(response.status_text)); web_response->setResponseType(response.response_type); - web_response->setResponseTime(response.response_time.ToInternalValue()); for (const auto& i : response.headers) { web_response->setHeader(base::ASCIIToUTF16(i.first),
diff --git a/content/renderer/dom_storage/dom_storage_dispatcher.cc b/content/renderer/dom_storage/dom_storage_dispatcher.cc index 29dbb04..c80df04b 100644 --- a/content/renderer/dom_storage/dom_storage_dispatcher.cc +++ b/content/renderer/dom_storage/dom_storage_dispatcher.cc
@@ -301,9 +301,8 @@ const DOMStorageMsg_Event_Params& params) { RenderThreadImpl::current()->EnsureWebKitInitialized(); - bool originated_in_process = params.connection_id != 0; WebStorageAreaImpl* originating_area = NULL; - if (originated_in_process) { + if (params.connection_id) { originating_area = WebStorageAreaImpl::FromConnectionId( params.connection_id); } else { @@ -320,8 +319,7 @@ params.new_value, params.origin, params.page_url, - originating_area, - originated_in_process); + originating_area); } else { WebStorageNamespaceImpl session_namespace_for_event_dispatch(params.namespace_id); @@ -332,8 +330,7 @@ params.origin, params.page_url, session_namespace_for_event_dispatch, - originating_area, - originated_in_process); + originating_area); } }
diff --git a/content/renderer/media/OWNERS b/content/renderer/media/OWNERS index 69a9c2fe..180a6a9 100644 --- a/content/renderer/media/OWNERS +++ b/content/renderer/media/OWNERS
@@ -1,9 +1,12 @@ +chcunningham@chromium.org dalecurtis@chromium.org ddorwin@chromium.org +hubbe@chromium.org jrummell@chromium.org mcasas@chromium.org miu@chromium.org sandersd@chromium.org +watk@chromium.org wolenetz@chromium.org xhwang@chromium.org
diff --git a/content/renderer/media/android/webmediaplayer_android.cc b/content/renderer/media/android/webmediaplayer_android.cc index 059e96f..a0096d5 100644 --- a/content/renderer/media/android/webmediaplayer_android.cc +++ b/content/renderer/media/android/webmediaplayer_android.cc
@@ -605,11 +605,11 @@ return natural_size_; } -WebMediaPlayer::NetworkState WebMediaPlayerAndroid::networkState() const { +WebMediaPlayer::NetworkState WebMediaPlayerAndroid::getNetworkState() const { return network_state_; } -WebMediaPlayer::ReadyState WebMediaPlayerAndroid::readyState() const { +WebMediaPlayer::ReadyState WebMediaPlayerAndroid::getReadyState() const { return ready_state_; }
diff --git a/content/renderer/media/android/webmediaplayer_android.h b/content/renderer/media/android/webmediaplayer_android.h index a661150..12f56c3 100644 --- a/content/renderer/media/android/webmediaplayer_android.h +++ b/content/renderer/media/android/webmediaplayer_android.h
@@ -162,8 +162,8 @@ bool didLoadingProgress() override; // Internal states of loading and network. - blink::WebMediaPlayer::NetworkState networkState() const override; - blink::WebMediaPlayer::ReadyState readyState() const override; + blink::WebMediaPlayer::NetworkState getNetworkState() const override; + blink::WebMediaPlayer::ReadyState getReadyState() const override; bool hasSingleSecurityOrigin() const override; bool didPassCORSAccessCheck() const override;
diff --git a/content/renderer/media/html_video_element_capturer_source_unittest.cc b/content/renderer/media/html_video_element_capturer_source_unittest.cc index af949ecf..89e518bf 100644 --- a/content/renderer/media/html_video_element_capturer_source_unittest.cc +++ b/content/renderer/media/html_video_element_capturer_source_unittest.cc
@@ -54,10 +54,10 @@ bool seeking() const override { return false; } double duration() const override { return 0.0; } double currentTime() const override { return 0.0; } - NetworkState networkState() const override { + NetworkState getNetworkState() const override { return NetworkStateEmpty; } - ReadyState readyState() const override { + ReadyState getReadyState() const override { return ReadyStateHaveNothing; } bool didLoadingProgress() override { return true; }
diff --git a/content/renderer/media/video_track_recorder.cc b/content/renderer/media/video_track_recorder.cc index 82ae3ea9..e95999a 100644 --- a/content/renderer/media/video_track_recorder.cc +++ b/content/renderer/media/video_track_recorder.cc
@@ -260,9 +260,8 @@ const vpx_codec_iface_t* interface = use_vp9_ ? vpx_codec_vp9_cx() : vpx_codec_vp8_cx(); - const vpx_codec_err_t result = vpx_codec_enc_config_default(interface, - &codec_config_, - 0 /* reserved */); + vpx_codec_err_t result = + vpx_codec_enc_config_default(interface, &codec_config_, 0 /* reserved */); DCHECK_EQ(VPX_CODEC_OK, result); DCHECK_EQ(320u, codec_config_.g_w); @@ -285,6 +284,14 @@ // DCHECK that the profile selected by default is I420 (magic number 0). DCHECK_EQ(0u, codec_config_.g_profile); + + // Values of VP8E_SET_CPUUSED greater than 0 will increase encoder speed at + // the expense of quality up to a maximum value of 16 for VP9, by tuning the + // target time spent encoding the frame. Go from 12 to 6 depending on the + // amount of cores available in the system. + const int kCpuUsed = std::max(6, 13 - base::SysInfo::NumberOfProcessors()); + result = vpx_codec_control(encoder_.get(), VP8E_SET_CPUUSED, kCpuUsed); + DLOG_IF(WARNING, VPX_CODEC_OK != result) << "VP8E_SET_CPUUSED failed"; } else { // VP8 always produces frames instantaneously. DCHECK_EQ(0u, codec_config_.g_lag_in_frames);
diff --git a/content/renderer/media/video_track_recorder_unittest.cc b/content/renderer/media/video_track_recorder_unittest.cc index bf3e3717..aff2ba3b 100644 --- a/content/renderer/media/video_track_recorder_unittest.cc +++ b/content/renderer/media/video_track_recorder_unittest.cc
@@ -38,17 +38,9 @@ closure.Run(); } -struct TrackRecorderTestParams { - const bool use_vp9; - const size_t first_encoded_frame_size; - const size_t second_encoded_frame_size; - const size_t third_encoded_frame_size; -}; +const bool kTrackRecorderTestUseVp9OrNot[] = {false, true}; -const TrackRecorderTestParams kTrackRecorderTestParams[] = {{false, 52, 32, 57}, - {true, 33, 18, 33}}; - -class VideoTrackRecorderTest : public TestWithParam<TrackRecorderTestParams> { +class VideoTrackRecorderTest : public TestWithParam<bool> { public: VideoTrackRecorderTest() : mock_source_(new MockMediaStreamVideoSource(false)) { @@ -67,7 +59,7 @@ blink_track_.setExtraData(track_); video_track_recorder_.reset(new VideoTrackRecorder( - GetParam().use_vp9 /* use_vp9 */, blink_track_, + GetParam() /* use_vp9 */, blink_track_, base::Bind(&VideoTrackRecorderTest::OnEncodedVideo, base::Unretained(this)), 0 /* bits_per_second */)); @@ -168,18 +160,16 @@ run_loop.Run(); - EXPECT_EQ(GetParam().first_encoded_frame_size, - first_frame_encoded_data.size()); - EXPECT_EQ(GetParam().second_encoded_frame_size, - second_frame_encoded_data.size()); - EXPECT_EQ(GetParam().third_encoded_frame_size, - third_frame_encoded_data.size()); + const size_t kEncodedSizeThreshold = 18; + EXPECT_GE(first_frame_encoded_data.size(), kEncodedSizeThreshold); + EXPECT_GE(second_frame_encoded_data.size(), kEncodedSizeThreshold); + EXPECT_GE(third_frame_encoded_data.size(), kEncodedSizeThreshold); Mock::VerifyAndClearExpectations(this); } INSTANTIATE_TEST_CASE_P(, VideoTrackRecorderTest, - ValuesIn(kTrackRecorderTestParams)); + ValuesIn(kTrackRecorderTestUseVp9OrNot)); } // namespace content
diff --git a/content/renderer/media/webmediaplayer_ms.cc b/content/renderer/media/webmediaplayer_ms.cc index 8085930..d2ecb54 100644 --- a/content/renderer/media/webmediaplayer_ms.cc +++ b/content/renderer/media/webmediaplayer_ms.cc
@@ -154,47 +154,61 @@ void WebMediaPlayerMS::play() { DVLOG(1) << __FUNCTION__; DCHECK(thread_checker_.CalledOnValidThread()); - if (paused_) { - if (video_frame_provider_.get()) - video_frame_provider_->Play(); - - compositor_->StartRendering(); - - if (audio_renderer_.get()) - audio_renderer_->Play(); - - if (delegate_) { - delegate_->DidPlay(delegate_id_, hasVideo(), hasAudio(), false, - media::kInfiniteDuration()); - } - } - - paused_ = false; media_log_->AddEvent(media_log_->CreateEvent(media::MediaLogEvent::PLAY)); + if (!paused_) + return; + +#if defined(OS_ANDROID) + // Don't allow rendering to start while hidden; for either video or audio + // since this may steal focus from a foreground player. + if (delegate_ && delegate_->IsHidden()) { + paused_on_hidden_ = true; + return; + } +#endif + + if (video_frame_provider_) + video_frame_provider_->Play(); + + compositor_->StartRendering(); + + if (audio_renderer_) + audio_renderer_->Play(); + + if (delegate_) { + delegate_->DidPlay(delegate_id_, hasVideo(), hasAudio(), false, + media::kInfiniteDuration()); + } + + paused_on_hidden_ = false; + paused_ = false; } void WebMediaPlayerMS::pause() { DVLOG(1) << __FUNCTION__; DCHECK(thread_checker_.CalledOnValidThread()); - if (video_frame_provider_.get()) + // Always clear |paused_on_hidden_| since manual pause() should clear it and + // an OnHidden() pause will set it appropriately after this call. + paused_on_hidden_ = false; + media_log_->AddEvent(media_log_->CreateEvent(media::MediaLogEvent::PAUSE)); + if (paused_) + return; + + if (video_frame_provider_) video_frame_provider_->Pause(); compositor_->StopRendering(); compositor_->ReplaceCurrentFrameWithACopy(); - if (!paused_) { - if (audio_renderer_.get()) - audio_renderer_->Pause(); + if (audio_renderer_) + audio_renderer_->Pause(); - if (delegate_) - delegate_->DidPause(delegate_id_, false); - } + if (delegate_) + delegate_->DidPause(delegate_id_, false); paused_ = true; - - media_log_->AddEvent(media_log_->CreateEvent(media::MediaLogEvent::PAUSE)); } bool WebMediaPlayerMS::supportsSave() const { @@ -278,13 +292,13 @@ return 0.0; } -blink::WebMediaPlayer::NetworkState WebMediaPlayerMS::networkState() const { +blink::WebMediaPlayer::NetworkState WebMediaPlayerMS::getNetworkState() const { DVLOG(1) << __FUNCTION__ << ", state:" << network_state_; DCHECK(thread_checker_.CalledOnValidThread()); return network_state_; } -blink::WebMediaPlayer::ReadyState WebMediaPlayerMS::readyState() const { +blink::WebMediaPlayer::ReadyState WebMediaPlayerMS::getReadyState() const { DVLOG(1) << __FUNCTION__ << ", state:" << ready_state_; DCHECK(thread_checker_.CalledOnValidThread()); return ready_state_; @@ -368,15 +382,15 @@ void WebMediaPlayerMS::OnHidden(bool must_suspend) { #if defined(OS_ANDROID) DCHECK(thread_checker_.CalledOnValidThread()); - DCHECK(!render_frame_suspended_); // Method called when the RenderFrame is sent to background and suspended // (android). Substitute the displayed VideoFrame with a copy to avoid // holding on to it unnecessarily. - render_frame_suspended_ = true; - if (!paused_) - compositor_->ReplaceCurrentFrameWithACopy(); + // + // During undoable tab closures OnHidden() may be called back to back, so we + // can't rely on |render_frame_suspended_| being false here. + render_frame_suspended_ = true; if (must_suspend) { if (!paused_) { pause(); @@ -385,6 +399,9 @@ if (delegate_) delegate_->PlayerGone(delegate_id_); + } else if (!paused_) { + // pause() will make its own copy in the block above otherwise. + compositor_->ReplaceCurrentFrameWithACopy(); } #endif // defined(OS_ANDROID) } @@ -395,9 +412,9 @@ render_frame_suspended_ = false; + // Resume playback on visibility. play() clears |paused_on_hidden_|. if (paused_on_hidden_) play(); - paused_on_hidden_ = false; #endif // defined(OS_ANDROID) } @@ -407,8 +424,15 @@ } void WebMediaPlayerMS::OnPause() { + const bool was_playing = !paused_ || paused_on_hidden_; pause(); client_->playbackStateChanged(); + + // MediaSession may suspend the background player if a foreground player + // starts playing audio, in this case we want to track this so that when + // OnShown() is called, we resume into the right state. + if (was_playing && delegate_ && delegate_->IsHidden()) + paused_on_hidden_ = true; } void WebMediaPlayerMS::OnVolumeMultiplierUpdate(double multiplier) {
diff --git a/content/renderer/media/webmediaplayer_ms.h b/content/renderer/media/webmediaplayer_ms.h index 8cac7c2..e43afba3 100644 --- a/content/renderer/media/webmediaplayer_ms.h +++ b/content/renderer/media/webmediaplayer_ms.h
@@ -119,8 +119,8 @@ double currentTime() const override; // Internal states of loading and network. - blink::WebMediaPlayer::NetworkState networkState() const override; - blink::WebMediaPlayer::ReadyState readyState() const override; + blink::WebMediaPlayer::NetworkState getNetworkState() const override; + blink::WebMediaPlayer::ReadyState getReadyState() const override; bool didLoadingProgress() override;
diff --git a/content/renderer/media/webmediaplayer_ms_compositor.cc b/content/renderer/media/webmediaplayer_ms_compositor.cc index b802281..7bd992d 100644 --- a/content/renderer/media/webmediaplayer_ms_compositor.cc +++ b/content/renderer/media/webmediaplayer_ms_compositor.cc
@@ -9,6 +9,7 @@ #include "base/command_line.h" #include "base/hash.h" #include "base/single_thread_task_runner.h" +#include "base/values.h" #include "cc/blink/context_provider_web_context.h" #include "content/renderer/media/webmediaplayer_ms.h" #include "content/renderer/render_thread_impl.h" @@ -89,6 +90,11 @@ new_frame->stride(media::VideoFrame::kVPlane), size.width(), size.height()); } + + // Transfer metadata keys. + base::DictionaryValue original_metadata; + frame->metadata()->MergeInternalValuesInto(&original_metadata); + new_frame->metadata()->MergeInternalValuesFrom(original_metadata); return new_frame; }
diff --git a/content/renderer/media/webmediaplayer_ms_unittest.cc b/content/renderer/media/webmediaplayer_ms_unittest.cc index 66439996..2718231 100644 --- a/content/renderer/media/webmediaplayer_ms_unittest.cc +++ b/content/renderer/media/webmediaplayer_ms_unittest.cc
@@ -24,6 +24,63 @@ using TestFrame = std::pair<FrameType, scoped_refptr<media::VideoFrame>>; +class FakeWebMediaPlayerDelegate + : public media::WebMediaPlayerDelegate, + public base::SupportsWeakPtr<FakeWebMediaPlayerDelegate> { + public: + FakeWebMediaPlayerDelegate() {} + ~FakeWebMediaPlayerDelegate() override { + DCHECK(!observer_); + DCHECK(is_gone_); + } + + int AddObserver(Observer* observer) override { + observer_ = observer; + return delegate_id_; + } + + void RemoveObserver(int delegate_id) override { + EXPECT_EQ(delegate_id_, delegate_id); + observer_ = nullptr; + } + + void DidPlay(int delegate_id, + bool has_video, + bool has_audio, + bool is_remote, + base::TimeDelta duration) override { + EXPECT_EQ(delegate_id_, delegate_id); + EXPECT_FALSE(playing_); + playing_ = true; + is_gone_ = false; + } + + void DidPause(int delegate_id, bool reached_end_of_stream) override { + EXPECT_EQ(delegate_id_, delegate_id); + EXPECT_TRUE(playing_); + EXPECT_FALSE(is_gone_); + playing_ = false; + } + + void PlayerGone(int delegate_id) override { + EXPECT_EQ(delegate_id_, delegate_id); + is_gone_ = true; + } + + bool IsHidden() override { return is_hidden_; } + + void set_hidden(bool is_hidden) { is_hidden_ = is_hidden; } + + private: + int delegate_id_ = 1234; + Observer* observer_ = nullptr; + bool playing_ = false; + bool is_hidden_ = false; + bool is_gone_ = true; + + DISALLOW_COPY_AND_ASSIGN(FakeWebMediaPlayerDelegate); +}; + class ReusableMessageLoopEvent { public: ReusableMessageLoopEvent() : event_(new media::WaitableMessageLoopEvent()) {} @@ -281,7 +338,7 @@ &message_loop_controller_)), player_(nullptr, this, - base::WeakPtr<media::WebMediaPlayerDelegate>(), + delegate_.AsWeakPtr(), new media::MediaLog(), scoped_ptr<MediaStreamRendererFactory>(render_factory_), message_loop_.task_runner(), @@ -352,6 +409,7 @@ base::MessageLoop message_loop_; MockRenderFactory* render_factory_; + FakeWebMediaPlayerDelegate delegate_; WebMediaPlayerMS player_; WebMediaPlayerMSCompositor* compositor_; ReusableMessageLoopEvent message_loop_controller_; @@ -389,7 +447,7 @@ } void WebMediaPlayerMSTest::networkStateChanged() { - blink::WebMediaPlayer::NetworkState state = player_.networkState(); + blink::WebMediaPlayer::NetworkState state = player_.getNetworkState(); DoNetworkStateChanged(state); if (state == blink::WebMediaPlayer::NetworkState::NetworkStateFormatError || state == blink::WebMediaPlayer::NetworkState::NetworkStateDecodeError || @@ -400,7 +458,7 @@ } void WebMediaPlayerMSTest::readyStateChanged() { - blink::WebMediaPlayer::ReadyState state = player_.readyState(); + blink::WebMediaPlayer::ReadyState state = player_.getReadyState(); DoReadyStateChanged(state); if (state == blink::WebMediaPlayer::ReadyState::ReadyStateHaveEnoughData) player_.play(); @@ -639,4 +697,55 @@ EXPECT_CALL(*this, DoStopRendering()); } +#if defined(OS_ANDROID) +TEST_F(WebMediaPlayerMSTest, HiddenPlayerTests) { + delegate_.set_hidden(true); + LoadAndGetFrameProvider(true); + + // A hidden player shouldn't automatically start rendering after play(). + player_.play(); + EXPECT_TRUE(player_.paused()); + + // A pause delivered via the delegate should not undo automatic resume when + // OnShown() occurs. + player_.OnPause(); + EXPECT_TRUE(player_.paused()); + + // A hidden player should start playing after being shown again. + delegate_.set_hidden(false); + player_.OnShown(); + EXPECT_FALSE(player_.paused()); + + // A hidden event should not pause the player. + delegate_.set_hidden(true); + player_.OnHidden(false); + EXPECT_FALSE(player_.paused()); + + // OnPause() should pause the player. + player_.OnPause(); + EXPECT_TRUE(player_.paused()); + + // A user generated pause() should clear the automatic resumption. + player_.pause(); + delegate_.set_hidden(false); + player_.OnShown(); + EXPECT_TRUE(player_.paused()); + + // A user generated play() should start playback. + player_.play(); + EXPECT_FALSE(player_.paused()); + + // An OnHidden() with forced suspension should pause playback. + delegate_.set_hidden(true); + player_.OnHidden(true); + EXPECT_TRUE(player_.paused()); + + // OnShown() should restart after a forced suspension. + delegate_.set_hidden(false); + player_.OnShown(); + EXPECT_FALSE(player_.paused()); + EXPECT_CALL(*this, DoSetWebLayer(false)); +} +#endif + } // namespace content
diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc index 3f7c05a8..4278f55e 100644 --- a/content/renderer/render_view_impl.cc +++ b/content/renderer/render_view_impl.cc
@@ -144,6 +144,7 @@ #include "third_party/WebKit/public/web/WebFormElement.h" #include "third_party/WebKit/public/web/WebFrame.h" #include "third_party/WebKit/public/web/WebFrameContentDumper.h" +#include "third_party/WebKit/public/web/WebFrameWidget.h" #include "third_party/WebKit/public/web/WebHistoryItem.h" #include "third_party/WebKit/public/web/WebHitTestResult.h" #include "third_party/WebKit/public/web/WebInputElement.h" @@ -1761,7 +1762,7 @@ } } -void RenderViewImpl::AttachWebFrameWidget(blink::WebWidget* frame_widget) { +void RenderViewImpl::AttachWebFrameWidget(blink::WebFrameWidget* frame_widget) { // The previous WebFrameWidget must already be detached by CloseForFrame(). DCHECK(!frame_widget_); frame_widget_ = frame_widget; @@ -2287,6 +2288,10 @@ return webview(); } +blink::WebFrameWidget* RenderViewImpl::GetWebFrameWidget() { + return frame_widget_; +} + bool RenderViewImpl::ShouldDisplayScrollbars(int width, int height) const { return (!send_preferred_size_changes_ || (disable_scrollbars_size_limit_.width() <= width || @@ -2779,8 +2784,8 @@ } void RenderViewImpl::OnSetBackgroundOpaque(bool opaque) { - if (webview()) - webview()->setIsTransparent(!opaque); + if (frame_widget_) + frame_widget_->setIsTransparent(!opaque); if (compositor_) compositor_->setHasTransparentBackground(!opaque); }
diff --git a/content/renderer/render_view_impl.h b/content/renderer/render_view_impl.h index c25a408..f15b37b 100644 --- a/content/renderer/render_view_impl.h +++ b/content/renderer/render_view_impl.h
@@ -241,7 +241,7 @@ // FocusController. void SetFocus(bool enable); - void AttachWebFrameWidget(blink::WebWidget* frame_widget); + void AttachWebFrameWidget(blink::WebFrameWidget* frame_widget); // Plugin-related functions -------------------------------------------------- @@ -436,6 +436,7 @@ WebPreferences& GetWebkitPreferences() override; void SetWebkitPreferences(const WebPreferences& preferences) override; blink::WebView* GetWebView() override; + blink::WebFrameWidget* GetWebFrameWidget() override; bool ShouldDisplayScrollbars(int width, int height) const override; int GetEnabledBindings() const override; bool GetContentStateImmediately() const override; @@ -905,7 +906,7 @@ // Note: RenderViewImpl is pulling double duty: it's the RenderWidget for the // "view", but it's also the RenderWidget for the main frame. - blink::WebWidget* frame_widget_; + blink::WebFrameWidget* frame_widget_; // The next group of objects all implement RenderViewObserver, so are deleted // along with the RenderView automatically. This is why we just store
diff --git a/content/renderer/render_widget.cc b/content/renderer/render_widget.cc index 888a9f1..82d73646 100644 --- a/content/renderer/render_widget.cc +++ b/content/renderer/render_widget.cc
@@ -317,7 +317,7 @@ } // static -blink::WebWidget* RenderWidget::CreateWebFrameWidget( +blink::WebFrameWidget* RenderWidget::CreateWebFrameWidget( RenderWidget* render_widget, blink::WebLocalFrame* frame) { if (!frame->parent()) {
diff --git a/content/renderer/render_widget.h b/content/renderer/render_widget.h index 9499211..6b17ad1 100644 --- a/content/renderer/render_widget.h +++ b/content/renderer/render_widget.h
@@ -58,6 +58,7 @@ namespace blink { struct WebDeviceEmulationParams; +class WebFrameWidget; class WebGestureEvent; class WebLocalFrame; class WebMouseEvent; @@ -377,8 +378,9 @@ ~RenderWidget() override; - static blink::WebWidget* CreateWebFrameWidget(RenderWidget* render_widget, - blink::WebLocalFrame* frame); + static blink::WebFrameWidget* CreateWebFrameWidget( + RenderWidget* render_widget, + blink::WebLocalFrame* frame); // Creates a WebWidget based on the popup type. static blink::WebWidget* CreateWebWidget(RenderWidget* render_widget);
diff --git a/content/renderer/service_worker/service_worker_context_client.cc b/content/renderer/service_worker/service_worker_context_client.cc index 78a49cd..ba47847 100644 --- a/content/renderer/service_worker/service_worker_context_client.cc +++ b/content/renderer/service_worker/service_worker_context_client.cc
@@ -534,8 +534,7 @@ web_response.url(), web_response.status(), web_response.statusText().utf8(), web_response.responseType(), headers, web_response.blobUUID().utf8(), web_response.blobSize(), - web_response.streamURL(), web_response.error(), - base::Time::FromInternalValue(web_response.responseTime())); + web_response.streamURL(), web_response.error()); Send(new ServiceWorkerHostMsg_FetchEventFinished( GetRoutingID(), request_id, SERVICE_WORKER_FETCH_EVENT_RESULT_RESPONSE,
diff --git a/content/shell/browser/layout_test/layout_test_bluetooth_adapter_provider.cc b/content/shell/browser/layout_test/layout_test_bluetooth_adapter_provider.cc index 87956f59..89df797 100644 --- a/content/shell/browser/layout_test/layout_test_bluetooth_adapter_provider.cc +++ b/content/shell/browser/layout_test/layout_test_bluetooth_adapter_provider.cc
@@ -724,7 +724,7 @@ scoped_ptr<NiceMockBluetoothGattCharacteristic> blacklist_exclude_reads_characteristic(GetBaseGATTCharacteristic( - blacklist_test_service.get(), + "Excluded Reads Characteristic", blacklist_test_service.get(), kBlacklistExcludeReadsCharacteristicUUID, BluetoothGattCharacteristic::PROPERTY_READ | BluetoothGattCharacteristic::PROPERTY_WRITE)); @@ -759,9 +759,9 @@ GetBaseGATTService(device, kDeviceInformationServiceUUID)); scoped_ptr<NiceMockBluetoothGattCharacteristic> serial_number_string( - GetBaseGATTCharacteristic(device_information.get(), - kSerialNumberStringUUID, - BluetoothGattCharacteristic::PROPERTY_READ)); + GetBaseGATTCharacteristic( + "Serial Number String", device_information.get(), + kSerialNumberStringUUID, BluetoothGattCharacteristic::PROPERTY_READ)); // Crash if ReadRemoteCharacteristic called. Not using GoogleMock's Expect // because this is used in layout tests that may not report a mock expectation @@ -788,7 +788,7 @@ { // Device Name: scoped_ptr<NiceMockBluetoothGattCharacteristic> device_name( GetBaseGATTCharacteristic( - generic_access.get(), kDeviceNameUUID, + "Device Name", generic_access.get(), kDeviceNameUUID, BluetoothGattCharacteristic::PROPERTY_READ | BluetoothGattCharacteristic::PROPERTY_WRITE)); @@ -810,7 +810,8 @@ { // Peripheral Privacy Flag: scoped_ptr<NiceMockBluetoothGattCharacteristic> peripheral_privacy_flag( GetBaseGATTCharacteristic( - generic_access.get(), kPeripheralPrivacyFlagUUID, + "Peripheral Privacy Flag", generic_access.get(), + kPeripheralPrivacyFlagUUID, BluetoothGattCharacteristic::PROPERTY_READ | BluetoothGattCharacteristic::PROPERTY_WRITE)); @@ -847,7 +848,8 @@ // Heart Rate Measurement scoped_ptr<NiceMockBluetoothGattCharacteristic> heart_rate_measurement( - GetBaseGATTCharacteristic(heart_rate.get(), kHeartRateMeasurementUUID, + GetBaseGATTCharacteristic("Heart Rate Measurement", heart_rate.get(), + kHeartRateMeasurementUUID, BluetoothGattCharacteristic::PROPERTY_NOTIFY)); NiceMockBluetoothGattCharacteristic* measurement_ptr = heart_rate_measurement.get(); @@ -867,15 +869,17 @@ return notify_session; })); - // Body Sensor Location Characteristic - scoped_ptr<NiceMockBluetoothGattCharacteristic> body_sensor_location( - GetBaseGATTCharacteristic(heart_rate.get(), kBodySensorLocation, + // Body Sensor Location Characteristic (Chest) + scoped_ptr<NiceMockBluetoothGattCharacteristic> body_sensor_location_chest( + GetBaseGATTCharacteristic("Body Sensor Location Chest", heart_rate.get(), + kBodySensorLocation, BluetoothGattCharacteristic::PROPERTY_READ)); - BluetoothGattCharacteristic* location_ptr = body_sensor_location.get(); + BluetoothGattCharacteristic* location_chest_ptr = + body_sensor_location_chest.get(); - ON_CALL(*body_sensor_location, ReadRemoteCharacteristic(_, _)) + ON_CALL(*body_sensor_location_chest, ReadRemoteCharacteristic(_, _)) .WillByDefault(RunCallbackWithResult<0 /* success_callback */>( - [adapter, location_ptr]() { + [adapter, location_chest_ptr]() { std::vector<uint8_t> location(1 /* size */); location[0] = 1; // Chest // Read a characteristic has a side effect of @@ -883,12 +887,35 @@ FOR_EACH_OBSERVER(BluetoothAdapter::Observer, adapter->GetObservers(), GattCharacteristicValueChanged( - adapter, location_ptr, location)); + adapter, location_chest_ptr, location)); + return location; + })); + + // Body Sensor Location Characteristic (Wrist) + scoped_ptr<NiceMockBluetoothGattCharacteristic> body_sensor_location_wrist( + GetBaseGATTCharacteristic("Body Sensor Location Wrist", heart_rate.get(), + kBodySensorLocation, + BluetoothGattCharacteristic::PROPERTY_READ)); + BluetoothGattCharacteristic* location_wrist_ptr = + body_sensor_location_wrist.get(); + + ON_CALL(*body_sensor_location_wrist, ReadRemoteCharacteristic(_, _)) + .WillByDefault(RunCallbackWithResult<0 /* success_callback */>( + [adapter, location_wrist_ptr]() { + std::vector<uint8_t> location(1 /* size */); + location[0] = 2; // Wrist + // Read a characteristic has a side effect of + // GattCharacteristicValueChanged being called. + FOR_EACH_OBSERVER(BluetoothAdapter::Observer, + adapter->GetObservers(), + GattCharacteristicValueChanged( + adapter, location_wrist_ptr, location)); return location; })); heart_rate->AddMockCharacteristic(std::move(heart_rate_measurement)); - heart_rate->AddMockCharacteristic(std::move(body_sensor_location)); + heart_rate->AddMockCharacteristic(std::move(body_sensor_location_chest)); + heart_rate->AddMockCharacteristic(std::move(body_sensor_location_wrist)); return heart_rate; } @@ -898,11 +925,12 @@ // static scoped_ptr<NiceMockBluetoothGattCharacteristic> LayoutTestBluetoothAdapterProvider::GetBaseGATTCharacteristic( + const std::string& identifier, MockBluetoothGattService* service, const std::string& uuid, BluetoothGattCharacteristic::Properties properties) { return make_scoped_ptr(new NiceMockBluetoothGattCharacteristic( - service, uuid + " Identifier", BluetoothUUID(uuid), false /* is_local */, + service, identifier, BluetoothUUID(uuid), false /* is_local */, properties, NULL /* permissions */)); } @@ -914,12 +942,12 @@ uint32_t error_alias = error_code + 0xA1; // Error UUIDs start at 0xA1. scoped_ptr<NiceMockBluetoothGattCharacteristic> characteristic( GetBaseGATTCharacteristic( - service, + // Use the UUID to generate unique identifiers. + "Error Characteristic " + errorUUID(error_alias), service, errorUUID(error_alias), BluetoothGattCharacteristic::PROPERTY_READ | - BluetoothGattCharacteristic::PROPERTY_WRITE | - BluetoothGattCharacteristic::PROPERTY_INDICATE)); - + BluetoothGattCharacteristic::PROPERTY_WRITE | + BluetoothGattCharacteristic::PROPERTY_INDICATE)); // Read response. ON_CALL(*characteristic, ReadRemoteCharacteristic(_, _))
diff --git a/content/shell/browser/layout_test/layout_test_bluetooth_adapter_provider.h b/content/shell/browser/layout_test/layout_test_bluetooth_adapter_provider.h index 95dfc69..68a062c 100644 --- a/content/shell/browser/layout_test/layout_test_bluetooth_adapter_provider.h +++ b/content/shell/browser/layout_test/layout_test_bluetooth_adapter_provider.h
@@ -528,13 +528,19 @@ // callback with [1] which corresponds to chest. // - GetProperties: Returns // BluetoothGattCharacteristic::PROPERTY_READ + // - Body Sensor Location (0x2a38) + // - Mock Functions: + // - Read: Calls GattCharacteristicValueChanged and success + // callback with [2] which corresponds to wrist. + // - GetProperties: Returns + // BluetoothGattCharacteristic::PROPERTY_READ static scoped_ptr<testing::NiceMock<device::MockBluetoothGattService>> GetHeartRateService(device::MockBluetoothAdapter* adapter, device::MockBluetoothDevice* device); // Characteristics - // |BaseCharacteristic|(service, uuid) + // |BaseCharacteristic|(identifier, service, uuid) // Descriptors added: // None. // Mock Functions: @@ -544,7 +550,7 @@ // Returns the descriptor matching the identifier provided if the // descriptor was added to the characteristic. // - GetIdentifier: - // Returns: uuid + “ Identifier” + // Returns: identifier // - GetUUID: // Returns: uuid // - IsLocal: @@ -557,6 +563,7 @@ // Returns: NULL static scoped_ptr<testing::NiceMock<device::MockBluetoothGattCharacteristic>> GetBaseGATTCharacteristic( + const std::string& identifier, device::MockBluetoothGattService* service, const std::string& uuid, device::BluetoothGattCharacteristic::Properties properties);
diff --git a/content/test/content_browser_test_utils_internal.cc b/content/test/content_browser_test_utils_internal.cc index 431e2ab..af3d347c 100644 --- a/content/test/content_browser_test_utils_internal.cc +++ b/content/test/content_browser_test_utils_internal.cc
@@ -12,9 +12,18 @@ #include <vector> #include "base/strings/stringprintf.h" +#include "base/test/test_timeouts.h" +#include "base/thread_task_runner_handle.h" +#include "cc/surfaces/surface.h" +#include "cc/surfaces/surface_manager.h" +#include "content/browser/compositor/delegated_frame_host.h" +#include "content/browser/compositor/surface_utils.h" +#include "content/browser/frame_host/cross_process_frame_connector.h" #include "content/browser/frame_host/frame_tree_node.h" #include "content/browser/frame_host/navigator.h" #include "content/browser/frame_host/render_frame_proxy_host.h" +#include "content/browser/frame_host/render_widget_host_view_child_frame.h" +#include "content/browser/renderer_host/render_widget_host_view_base.h" #include "content/public/browser/resource_dispatcher_host.h" #include "content/public/browser/resource_throttle.h" #include "content/public/test/browser_test_utils.h" @@ -86,13 +95,19 @@ to_explore.push(node->child_at(i)); } - // Sort the proxies by SiteInstance ID to avoid hash_map ordering. - std::map<int, RenderFrameProxyHost*> sorted_proxy_hosts = - node->render_manager()->GetAllProxyHostsForTesting(); - for (auto& proxy_pair : sorted_proxy_hosts) { - RenderFrameProxyHost* proxy = proxy_pair.second; - legend[GetName(proxy->GetSiteInstance())] = proxy->GetSiteInstance(); + // Sort the proxies by SiteInstance ID to avoid unordered_map ordering. + std::vector<SiteInstance*> site_instances; + for (const auto& proxy_pair : + node->render_manager()->GetAllProxyHostsForTesting()) { + site_instances.push_back(proxy_pair.second->GetSiteInstance()); } + std::sort(site_instances.begin(), site_instances.end(), + [](SiteInstance* lhs, SiteInstance* rhs) { + return lhs->GetId() < rhs->GetId(); + }); + + for (SiteInstance* site_instance : site_instances) + legend[GetName(site_instance)] = site_instance; } // Traversal 4: Now that all names are assigned, make a big loop to pretty- @@ -155,9 +170,9 @@ } // Show the SiteInstances of the RenderFrameProxyHosts of this node. - std::map<int, RenderFrameProxyHost*> sorted_proxy_host_map = + const auto& proxy_host_map = node->render_manager()->GetAllProxyHostsForTesting(); - if (!sorted_proxy_host_map.empty()) { + if (!proxy_host_map.empty()) { // Show a dashed line of variable length before the proxy list. Always at // least two dashes. line.append(" --"); @@ -176,7 +191,7 @@ // Sort these alphabetically, to avoid hash_map ordering dependency. std::vector<std::string> sorted_proxy_hosts; - for (auto& proxy_pair : sorted_proxy_host_map) { + for (const auto& proxy_pair : proxy_host_map) { sorted_proxy_hosts.push_back( GetName(proxy_pair.second->GetSiteInstance())); } @@ -256,6 +271,45 @@ } // namespace +SurfaceHitTestReadyNotifier::SurfaceHitTestReadyNotifier( + RenderWidgetHostViewChildFrame* target_view) + : target_view_(target_view) { + surface_manager_ = GetSurfaceManager(); +} + +void SurfaceHitTestReadyNotifier::WaitForSurfaceReady() { + root_surface_id_ = target_view_->FrameConnectorForTesting() + ->GetRootRenderWidgetHostViewForTesting() + ->SurfaceIdForTesting(); + if (ContainsSurfaceId()) + return; + + while (true) { + // TODO(kenrb): Need a better way to do this. If + // RenderWidgetHostViewBase lifetime observer lands (see + // https://codereview.chromium.org/1711103002/), we can add a callback + // from OnSwapCompositorFrame and avoid this busy waiting, which is very + // frequent in tests in this file. + base::RunLoop run_loop; + base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( + FROM_HERE, run_loop.QuitClosure(), TestTimeouts::tiny_timeout()); + run_loop.Run(); + if (ContainsSurfaceId()) + break; + } +} + +bool SurfaceHitTestReadyNotifier::ContainsSurfaceId() { + if (root_surface_id_.is_null()) + return false; + for (cc::SurfaceId id : surface_manager_->GetSurfaceForId(root_surface_id_) + ->referenced_surfaces()) { + if (id == target_view_->SurfaceIdForTesting()) + return true; + } + return false; +} + NavigationStallDelegate::NavigationStallDelegate(const GURL& url) : url_(url) {} void NavigationStallDelegate::RequestBeginning(
diff --git a/content/test/content_browser_test_utils_internal.h b/content/test/content_browser_test_utils_internal.h index 22e9531..12e7f84 100644 --- a/content/test/content_browser_test_utils_internal.h +++ b/content/test/content_browser_test_utils_internal.h
@@ -14,12 +14,18 @@ #include <vector> #include "base/macros.h" +#include "cc/surfaces/surface_id.h" #include "content/public/browser/resource_dispatcher_host_delegate.h" #include "url/gurl.h" +namespace cc { +class SurfaceManager; +} + namespace content { class FrameTreeNode; +class RenderWidgetHostViewChildFrame; class Shell; class SiteInstance; class ToRenderFrameHost; @@ -97,6 +103,27 @@ GURL url_; }; +// Helper class to assist with hit testing surfaces in multiple processes. +// WaitForSurfaceReady() will only return after a Surface from |target_view| +// has been composited in the top-level frame's Surface. At that point, +// browser process hit testing to target_view's Surface can succeed. +class SurfaceHitTestReadyNotifier { + public: + SurfaceHitTestReadyNotifier(RenderWidgetHostViewChildFrame* target_view); + ~SurfaceHitTestReadyNotifier() {} + + void WaitForSurfaceReady(); + + private: + bool ContainsSurfaceId(); + + cc::SurfaceManager* surface_manager_; + cc::SurfaceId root_surface_id_; + RenderWidgetHostViewChildFrame* target_view_; + + DISALLOW_COPY_AND_ASSIGN(SurfaceHitTestReadyNotifier); +}; + } // namespace content #endif // CONTENT_TEST_CONTENT_BROWSER_TEST_UTILS_INTERNAL_H_
diff --git a/content/test/data/media/OWNERS b/content/test/data/media/OWNERS deleted file mode 100644 index fe9001c6..0000000 --- a/content/test/data/media/OWNERS +++ /dev/null
@@ -1,7 +0,0 @@ -dalecurtis@chromium.org -ddorwin@chromium.org -jrummell@chromium.org -phoglund@chromium.org -sandersd@chromium.org -tommi@chromium.org -xhwang@chromium.org
diff --git a/content/test/data/service_worker/fetch_event_response_via_cache.js b/content/test/data/service_worker/fetch_event_response_via_cache.js deleted file mode 100644 index 4fd03db7..0000000 --- a/content/test/data/service_worker/fetch_event_response_via_cache.js +++ /dev/null
@@ -1,28 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -this.onfetch = function(event) { - var CACHE_NAME = 'cache_name'; - var cache = undefined; - var url = event.request.url; - event.respondWith( - caches.open(CACHE_NAME) - .then(function(c) { - cache = c; - return cache.match(url); - }) - .then(function(response) { - if (response) - return response; - var cloned_response = undefined; - return fetch(url) - .then(function(res) { - cloned_response = res.clone(); - return cache.put(url, res); - }) - .then(function() { - return cloned_response; - }); - })); - };
diff --git a/content/test/gpu/gpu_tests/webgl2_conformance_expectations.py b/content/test/gpu/gpu_tests/webgl2_conformance_expectations.py index 3942cac6..4ac3a4f 100644 --- a/content/test/gpu/gpu_tests/webgl2_conformance_expectations.py +++ b/content/test/gpu/gpu_tests/webgl2_conformance_expectations.py
@@ -334,12 +334,8 @@ ['mac'], bug=584994) self.Fail('conformance2/state/gl-object-get-calls.html', ['mac'], bug=483282) - self.Fail('conformance2/textures/image_bitmap_from_image_data/*', - ['mac'], bug=589930) self.Fail('conformance2/textures/image_bitmap_from_image/*', ['mac'], bug=589930) - self.Fail('conformance2/textures/image_bitmap_from_video/*', - ['mac'], bug=589930) # Mac Retina NVIDIA self.Fail('conformance2/rendering/draw-buffers.html',
diff --git a/content/test/gpu/gpu_tests/webgl_conformance_expectations.py b/content/test/gpu/gpu_tests/webgl_conformance_expectations.py index 4775da88..1ce9bc0 100644 --- a/content/test/gpu/gpu_tests/webgl_conformance_expectations.py +++ b/content/test/gpu/gpu_tests/webgl_conformance_expectations.py
@@ -226,6 +226,9 @@ self.Fail('conformance/textures/image/tex-image-and-sub-image-2d-' + 'with-image-rgb-rgb-unsigned_byte.html', ['android'], bug=586183) + # The following tests timed out on android, so skip them for now. + self.Skip('conformance/textures/image_bitmap_from_video/*', + ['android'], bug=585108) # The following WebView crashes are causing problems with further # tests in the suite, so skip them for now. self.Skip('conformance/textures/video/tex-image-and-sub-image-2d-with-' + @@ -271,65 +274,7 @@ ['android', ('qualcomm', 'Adreno (TM) 420')], bug=499555) self.Fail('conformance/extensions/oes-texture-float-with-image.html', ['android', ('qualcomm', 'Adreno (TM) 420')], bug=499555) - self.Fail('conformance/textures/image_bitmap_from_image_data/' + - 'tex-image-and-sub-image-2d-with-image-bitmap-from-image-data-' + - 'rgb-rgb-unsigned_byte.html', - ['android', ('qualcomm', 'Adreno (TM) 420')], bug=585108) - self.Fail('conformance/textures/image_bitmap_from_image_data/' + - 'tex-image-and-sub-image-2d-with-image-bitmap-from-image-data-' + - 'rgba-rgba-unsigned_byte.html', - ['android', ('qualcomm', 'Adreno (TM) 420')], bug=585108) - self.Fail('conformance/textures/image_bitmap_from_image_data/' + - 'tex-image-and-sub-image-2d-with-image-bitmap-from-image-data-' + - 'rgb-rgb-unsigned_short_5_6_5.html', - ['android', ('qualcomm', 'Adreno (TM) 420')], bug=585108) - self.Fail('conformance/textures/image_bitmap_from_image_data/' + - 'tex-image-and-sub-image-2d-with-image-bitmap-from-image-data-' + - 'rgba-rgba-unsigned_short_4_4_4_4.html', - ['android', ('qualcomm', 'Adreno (TM) 420')], bug=585108) - self.Fail('conformance/textures/image_bitmap_from_image_data/' + - 'tex-image-and-sub-image-2d-with-image-bitmap-from-image-data-' + - 'rgba-rgba-unsigned_short_5_5_5_1.html', - ['android', ('qualcomm', 'Adreno (TM) 420')], bug=585108) - self.Fail('conformance/textures/image_bitmap_from_image/' + - 'tex-image-and-sub-image-2d-with-image-bitmap-from-image-' + - 'rgb-rgb-unsigned_byte.html', - ['android', ('qualcomm', 'Adreno (TM) 420')], bug=585108) - self.Fail('conformance/textures/image_bitmap_from_image/' + - 'tex-image-and-sub-image-2d-with-image-bitmap-from-image-' + - 'rgba-rgba-unsigned_byte.html', - ['android', ('qualcomm', 'Adreno (TM) 420')], bug=585108) - self.Fail('conformance/textures/image_bitmap_from_image/' + - 'tex-image-and-sub-image-2d-with-image-bitmap-from-image-' + - 'rgb-rgb-unsigned_short_5_6_5.html', - ['android', ('qualcomm', 'Adreno (TM) 420')], bug=585108) - self.Fail('conformance/textures/image_bitmap_from_image/' + - 'tex-image-and-sub-image-2d-with-image-bitmap-from-image-' + - 'rgba-rgba-unsigned_short_4_4_4_4.html', - ['android', ('qualcomm', 'Adreno (TM) 420')], bug=585108) - self.Fail('conformance/textures/image_bitmap_from_image/' + - 'tex-image-and-sub-image-2d-with-image-bitmap-from-image-' + - 'rgba-rgba-unsigned_short_5_5_5_1.html', - ['android', ('qualcomm', 'Adreno (TM) 420')], bug=585108) - self.Fail('conformance/textures/image_bitmap_from_video/' + - 'tex-image-and-sub-image-2d-with-image-bitmap-from-video-' + - 'rgb-rgb-unsigned_byte.html', - ['android', ('qualcomm', 'Adreno (TM) 420')], bug=585108) - self.Fail('conformance/textures/image_bitmap_from_video/' + - 'tex-image-and-sub-image-2d-with-image-bitmap-from-video-' + - 'rgba-rgba-unsigned_byte.html', - ['android', ('qualcomm', 'Adreno (TM) 420')], bug=585108) - self.Fail('conformance/textures/image_bitmap_from_video/' + - 'tex-image-and-sub-image-2d-with-image-bitmap-from-video-' + - 'rgb-rgb-unsigned_short_5_6_5.html', - ['android', ('qualcomm', 'Adreno (TM) 420')], bug=585108) - self.Fail('conformance/textures/image_bitmap_from_video/' + - 'tex-image-and-sub-image-2d-with-image-bitmap-from-video-' + - 'rgba-rgba-unsigned_short_4_4_4_4.html', - ['android', ('qualcomm', 'Adreno (TM) 420')], bug=585108) - self.Fail('conformance/textures/image_bitmap_from_video/' + - 'tex-image-and-sub-image-2d-with-image-bitmap-from-video-' + - 'rgba-rgba-unsigned_short_5_5_5_1.html', + self.Fail('conformance/textures/image_bitmap_from_image_data/*', ['android', ('qualcomm', 'Adreno (TM) 420')], bug=585108) self.Fail('conformance/textures/video/tex-image-and-sub-image-2d-with-' + 'video-rgb-rgb-unsigned_byte.html',
diff --git a/device/bluetooth/android/java/src/org/chromium/device/bluetooth/ChromeBluetoothAdapter.java b/device/bluetooth/android/java/src/org/chromium/device/bluetooth/ChromeBluetoothAdapter.java index 0a54a0bd..a7751f75 100644 --- a/device/bluetooth/android/java/src/org/chromium/device/bluetooth/ChromeBluetoothAdapter.java +++ b/device/bluetooth/android/java/src/org/chromium/device/bluetooth/ChromeBluetoothAdapter.java
@@ -8,6 +8,10 @@ import android.annotation.TargetApi; import android.bluetooth.BluetoothAdapter; import android.bluetooth.le.ScanSettings; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; import android.os.Build; import android.os.ParcelUuid; @@ -26,11 +30,12 @@ */ @JNINamespace("device") @TargetApi(Build.VERSION_CODES.LOLLIPOP) -final class ChromeBluetoothAdapter { +final class ChromeBluetoothAdapter extends BroadcastReceiver { private static final String TAG = "Bluetooth"; private long mNativeBluetoothAdapterAndroid; - private Wrappers.BluetoothAdapterWrapper mAdapter; + // mAdapter is final to ensure registerReceiver is followed by unregisterReceiver. + private final Wrappers.BluetoothAdapterWrapper mAdapter; private int mNumDiscoverySessions; private ScanCallback mScanCallback; @@ -49,6 +54,7 @@ long nativeBluetoothAdapterAndroid, Wrappers.BluetoothAdapterWrapper adapterWrapper) { mNativeBluetoothAdapterAndroid = nativeBluetoothAdapterAndroid; mAdapter = adapterWrapper; + registerBroadcastReceiver(); if (adapterWrapper == null) { Log.i(TAG, "ChromeBluetoothAdapter created with no adapterWrapper."); } else { @@ -63,6 +69,7 @@ private void onBluetoothAdapterAndroidDestruction() { stopScan(); mNativeBluetoothAdapterAndroid = 0; + unregisterBroadcastReceiver(); } // --------------------------------------------------------------------------------------------- @@ -187,6 +194,19 @@ || context.checkPermission(Manifest.permission.ACCESS_FINE_LOCATION); } + private void registerBroadcastReceiver() { + if (mAdapter != null) { + mAdapter.getContext().registerReceiver( + this, new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED)); + } + } + + private void unregisterBroadcastReceiver() { + if (mAdapter != null) { + mAdapter.getContext().unregisterReceiver(this); + } + } + /** * Starts a Low Energy scan. * @return True on success. @@ -275,6 +295,45 @@ } } + @Override + public void onReceive(Context context, Intent intent) { + String action = intent.getAction(); + + if (isPresent() && BluetoothAdapter.ACTION_STATE_CHANGED.equals(action)) { + int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR); + + Log.w(TAG, "onReceive: BluetoothAdapter.ACTION_STATE_CHANGED: %s", + getBluetoothStateString(state)); + + switch (state) { + case BluetoothAdapter.STATE_ON: + nativeOnAdapterStateChanged(mNativeBluetoothAdapterAndroid, true); + break; + case BluetoothAdapter.STATE_OFF: + nativeOnAdapterStateChanged(mNativeBluetoothAdapterAndroid, false); + break; + default: + // do nothing + } + } + } + + private String getBluetoothStateString(int state) { + switch (state) { + case BluetoothAdapter.STATE_OFF: + return "STATE_OFF"; + case BluetoothAdapter.STATE_ON: + return "STATE_ON"; + case BluetoothAdapter.STATE_TURNING_OFF: + return "STATE_TURNING_OFF"; + case BluetoothAdapter.STATE_TURNING_ON: + return "STATE_TURNING_ON"; + default: + assert false; + return "illegal state: " + state; + } + } + // --------------------------------------------------------------------------------------------- // BluetoothAdapterAndroid C++ methods declared for access from java: @@ -287,4 +346,8 @@ // http://crbug.com/505554 private native void nativeCreateOrUpdateDeviceOnScan(long nativeBluetoothAdapterAndroid, String address, Object bluetoothDeviceWrapper, List<ParcelUuid> advertisedUuids); + + // Binds to BluetoothAdapterAndroid::nativeOnAdapterStateChanged + private native void nativeOnAdapterStateChanged( + long nativeBluetoothAdapterAndroid, boolean powered); }
diff --git a/device/bluetooth/android/java/src/org/chromium/device/bluetooth/Wrappers.java b/device/bluetooth/android/java/src/org/chromium/device/bluetooth/Wrappers.java index 9287f85..96634b3 100644 --- a/device/bluetooth/android/java/src/org/chromium/device/bluetooth/Wrappers.java +++ b/device/bluetooth/android/java/src/org/chromium/device/bluetooth/Wrappers.java
@@ -18,7 +18,10 @@ import android.bluetooth.le.ScanFilter; import android.bluetooth.le.ScanResult; import android.bluetooth.le.ScanSettings; +import android.content.BroadcastReceiver; import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; import android.content.pm.PackageManager; import android.os.Build; import android.os.ParcelUuid; @@ -163,6 +166,14 @@ return mContext.checkPermission(permission, Process.myPid(), Process.myUid()) == PackageManager.PERMISSION_GRANTED; } + + public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) { + return mContext.registerReceiver(receiver, filter); + } + + public void unregisterReceiver(BroadcastReceiver receiver) { + mContext.unregisterReceiver(receiver); + } } /**
diff --git a/device/bluetooth/bluetooth_adapter.cc b/device/bluetooth/bluetooth_adapter.cc index 390bb939..dea3593 100644 --- a/device/bluetooth/bluetooth_adapter.cc +++ b/device/bluetooth/bluetooth_adapter.cc
@@ -158,6 +158,11 @@ return pairing_delegates_.front().first; } +void BluetoothAdapter::NotifyAdapterStateChanged(bool powered) { + FOR_EACH_OBSERVER(BluetoothAdapter::Observer, observers_, + AdapterPoweredChanged(this, powered)); +} + void BluetoothAdapter::NotifyGattServiceAdded(BluetoothGattService* service) { DCHECK_EQ(service->GetDevice()->GetAdapter(), this);
diff --git a/device/bluetooth/bluetooth_adapter.h b/device/bluetooth/bluetooth_adapter.h index e099e32..5dcf12f5 100644 --- a/device/bluetooth/bluetooth_adapter.h +++ b/device/bluetooth/bluetooth_adapter.h
@@ -398,8 +398,8 @@ const CreateAdvertisementCallback& callback, const CreateAdvertisementErrorCallback& error_callback) = 0; - // The following methods are used to send various GATT observer events to - // observers. + // The following methods are used to send various events to observers. + void NotifyAdapterStateChanged(bool powered); void NotifyGattServiceAdded(BluetoothGattService* service); void NotifyGattServiceRemoved(BluetoothGattService* service); void NotifyGattServiceChanged(BluetoothGattService* service);
diff --git a/device/bluetooth/bluetooth_adapter_android.cc b/device/bluetooth/bluetooth_adapter_android.cc index 00cead7..fc19a812 100644 --- a/device/bluetooth/bluetooth_adapter_android.cc +++ b/device/bluetooth/bluetooth_adapter_android.cc
@@ -134,6 +134,13 @@ error_callback.Run(BluetoothAdvertisement::ERROR_UNSUPPORTED_PLATFORM); } +void BluetoothAdapterAndroid::OnAdapterStateChanged( + JNIEnv* env, + const JavaParamRef<jobject>& caller, + const bool powered) { + NotifyAdapterStateChanged(powered); +} + void BluetoothAdapterAndroid::OnScanFailed( JNIEnv* env, const JavaParamRef<jobject>& caller) {
diff --git a/device/bluetooth/bluetooth_adapter_android.h b/device/bluetooth/bluetooth_adapter_android.h index 3612602..8ebb49ce 100644 --- a/device/bluetooth/bluetooth_adapter_android.h +++ b/device/bluetooth/bluetooth_adapter_android.h
@@ -83,6 +83,11 @@ const CreateAdvertisementCallback& callback, const CreateAdvertisementErrorCallback& error_callback) override; + // Called when adapter state changes. + void OnAdapterStateChanged(JNIEnv* env, + const base::android::JavaParamRef<jobject>& caller, + const bool powered); + // Handles a scan error event by invalidating all discovery sessions. void OnScanFailed(JNIEnv* env, const base::android::JavaParamRef<jobject>& caller);
diff --git a/device/bluetooth/bluetooth_adapter_unittest.cc b/device/bluetooth/bluetooth_adapter_unittest.cc index a40af0e..55bffb7 100644 --- a/device/bluetooth/bluetooth_adapter_unittest.cc +++ b/device/bluetooth/bluetooth_adapter_unittest.cc
@@ -660,31 +660,40 @@ #if defined(OS_ANDROID) TEST_F(BluetoothTest, TogglePowerFakeAdapter) { InitWithFakeAdapter(); + TestBluetoothAdapterObserver observer(adapter_); + ASSERT_TRUE(adapter_->IsPresent()); ASSERT_TRUE(adapter_->IsPowered()); + EXPECT_EQ(0, observer.powered_changed_count()); // Check if power can be turned off. adapter_->SetPowered(false, GetCallback(Call::EXPECTED), GetErrorCallback(Call::NOT_EXPECTED)); EXPECT_FALSE(adapter_->IsPowered()); + EXPECT_EQ(1, observer.powered_changed_count()); // Check if power can be turned on again. adapter_->SetPowered(true, GetCallback(Call::EXPECTED), GetErrorCallback(Call::NOT_EXPECTED)); EXPECT_TRUE(adapter_->IsPowered()); + EXPECT_EQ(2, observer.powered_changed_count()); } #endif // defined(OS_ANDROID) #if defined(OS_ANDROID) TEST_F(BluetoothTest, TogglePowerBeforeScan) { InitWithFakeAdapter(); + TestBluetoothAdapterObserver observer(adapter_); + ASSERT_TRUE(adapter_->IsPresent()); ASSERT_TRUE(adapter_->IsPowered()); + EXPECT_EQ(0, observer.powered_changed_count()); // Turn off adapter. adapter_->SetPowered(false, GetCallback(Call::EXPECTED), GetErrorCallback(Call::NOT_EXPECTED)); ASSERT_FALSE(adapter_->IsPowered()); + EXPECT_EQ(1, observer.powered_changed_count()); // Try to perform a scan. StartLowEnergyDiscoverySessionExpectedToFail(); @@ -693,6 +702,7 @@ adapter_->SetPowered(true, GetCallback(Call::EXPECTED), GetErrorCallback(Call::NOT_EXPECTED)); ASSERT_TRUE(adapter_->IsPowered()); + EXPECT_EQ(2, observer.powered_changed_count()); // Try to perform a scan again. ResetEventCounts();
diff --git a/device/bluetooth/test/android/java/src/org/chromium/device/bluetooth/Fakes.java b/device/bluetooth/test/android/java/src/org/chromium/device/bluetooth/Fakes.java index 538f618..46f9c66 100644 --- a/device/bluetooth/test/android/java/src/org/chromium/device/bluetooth/Fakes.java +++ b/device/bluetooth/test/android/java/src/org/chromium/device/bluetooth/Fakes.java
@@ -9,7 +9,11 @@ import android.bluetooth.BluetoothDevice; import android.bluetooth.le.ScanFilter; import android.bluetooth.le.ScanSettings; +import android.content.BroadcastReceiver; import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; + import android.os.Build; import android.os.ParcelUuid; @@ -133,12 +137,14 @@ @Override public boolean disable() { mPowered = false; + nativeOnFakeAdapterStateChanged(mNativeBluetoothTestAndroid, false); return true; } @Override public boolean enable() { mPowered = true; + nativeOnFakeAdapterStateChanged(mNativeBluetoothTestAndroid, true); return true; } @@ -191,6 +197,14 @@ public boolean checkPermission(String permission) { return mPermissions.contains(permission); } + + @Override + public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) { + return null; + } + + @Override + public void unregisterReceiver(BroadcastReceiver receiver) {} } /** @@ -715,6 +729,10 @@ // --------------------------------------------------------------------------------------------- // BluetoothTestAndroid C++ methods declared for access from java: + // Binds to BluetoothTestAndroid::OnFakeAdapterStateChanged. + private static native void nativeOnFakeAdapterStateChanged( + long nativeBluetoothTestAndroid, boolean powered); + // Binds to BluetoothTestAndroid::OnFakeBluetoothDeviceConnectGattCalled. private static native void nativeOnFakeBluetoothDeviceConnectGattCalled( long nativeBluetoothTestAndroid);
diff --git a/device/bluetooth/test/bluetooth_test_android.cc b/device/bluetooth/test/bluetooth_test_android.cc index 43299bcf..522cd61 100644 --- a/device/bluetooth/test/bluetooth_test_android.cc +++ b/device/bluetooth/test/bluetooth_test_android.cc
@@ -356,4 +356,11 @@ base::android::JavaByteArrayToByteVector(env, value, &last_write_value_); } +void BluetoothTestAndroid::OnFakeAdapterStateChanged( + JNIEnv* env, + const JavaParamRef<jobject>& caller, + const bool powered) { + adapter_->NotifyAdapterStateChanged(powered); +} + } // namespace device
diff --git a/device/bluetooth/test/bluetooth_test_android.h b/device/bluetooth/test/bluetooth_test_android.h index 3fb3a33..b855eca 100644 --- a/device/bluetooth/test/bluetooth_test_android.h +++ b/device/bluetooth/test/bluetooth_test_android.h
@@ -118,6 +118,12 @@ const base::android::JavaParamRef<jobject>& caller, const base::android::JavaParamRef<jbyteArray>& value); + // Records that Java FakeBluetoothAdapter onAdapterStateChanged was called. + void OnFakeAdapterStateChanged( + JNIEnv* env, + const base::android::JavaParamRef<jobject>& caller, + const bool powered); + base::android::ScopedJavaGlobalRef<jobject> j_fake_bluetooth_adapter_; int gatt_open_connections_ = 0;
diff --git a/docs/mac_build_instructions.md b/docs/mac_build_instructions.md index 9695de7..947cbcb 100644 --- a/docs/mac_build_instructions.md +++ b/docs/mac_build_instructions.md
@@ -5,7 +5,7 @@ ## Prerequisites * A Mac running 10.9+. -* https://developer.apple.com/xcode, 5+ +* [Xcode](https://developer.apple.com/xcode), 5+. * Install [gclient](http://dev.chromium.org/developers/how-tos/install-depot-tools), part of the
diff --git a/extensions/browser/api/alarms/alarm_manager.cc b/extensions/browser/api/alarms/alarm_manager.cc index 4f9aeda..0616481 100644 --- a/extensions/browser/api/alarms/alarm_manager.cc +++ b/extensions/browser/api/alarms/alarm_manager.cc
@@ -465,6 +465,8 @@ } } +Alarm::Alarm(const Alarm& other) = default; + Alarm::~Alarm() { }
diff --git a/extensions/browser/api/alarms/alarm_manager.h b/extensions/browser/api/alarms/alarm_manager.h index a93c59f..66e5fb10 100644 --- a/extensions/browser/api/alarms/alarm_manager.h +++ b/extensions/browser/api/alarms/alarm_manager.h
@@ -38,6 +38,7 @@ const api::alarms::AlarmCreateInfo& create_info, base::TimeDelta min_granularity, base::Time now); + Alarm(const Alarm& other); ~Alarm(); linked_ptr<api::alarms::Alarm> js_alarm;
diff --git a/extensions/browser/api/bluetooth_socket/bluetooth_socket_event_dispatcher.cc b/extensions/browser/api/bluetooth_socket/bluetooth_socket_event_dispatcher.cc index 4d54ee0..d6185db 100644 --- a/extensions/browser/api/bluetooth_socket/bluetooth_socket_event_dispatcher.cc +++ b/extensions/browser/api/bluetooth_socket/bluetooth_socket_event_dispatcher.cc
@@ -97,6 +97,9 @@ BluetoothSocketEventDispatcher::SocketParams::SocketParams() {} +BluetoothSocketEventDispatcher::SocketParams::SocketParams( + const SocketParams& other) = default; + BluetoothSocketEventDispatcher::SocketParams::~SocketParams() {} void BluetoothSocketEventDispatcher::OnSocketConnect(
diff --git a/extensions/browser/api/bluetooth_socket/bluetooth_socket_event_dispatcher.h b/extensions/browser/api/bluetooth_socket/bluetooth_socket_event_dispatcher.h index e64336b..5e45fc0 100644 --- a/extensions/browser/api/bluetooth_socket/bluetooth_socket_event_dispatcher.h +++ b/extensions/browser/api/bluetooth_socket/bluetooth_socket_event_dispatcher.h
@@ -64,6 +64,7 @@ // StartAccept(). struct SocketParams { SocketParams(); + SocketParams(const SocketParams& other); ~SocketParams(); content::BrowserThread::ID thread_id;
diff --git a/extensions/browser/api/cast_channel/cast_transport.cc b/extensions/browser/api/cast_channel/cast_transport.cc index 9572f3b..8a22af65 100644 --- a/extensions/browser/api/cast_channel/cast_transport.cc +++ b/extensions/browser/api/cast_channel/cast_transport.cc
@@ -197,6 +197,9 @@ payload.size()); } +CastTransportImpl::WriteRequest::WriteRequest(const WriteRequest& other) = + default; + CastTransportImpl::WriteRequest::~WriteRequest() { }
diff --git a/extensions/browser/api/cast_channel/cast_transport.h b/extensions/browser/api/cast_channel/cast_transport.h index e08216e..740bd5f 100644 --- a/extensions/browser/api/cast_channel/cast_transport.h +++ b/extensions/browser/api/cast_channel/cast_transport.h
@@ -125,6 +125,7 @@ explicit WriteRequest(const std::string& namespace_, const std::string& payload, const net::CompletionCallback& callback); + WriteRequest(const WriteRequest& other); ~WriteRequest(); // Namespace of the serialized message.
diff --git a/extensions/browser/api/document_scan/document_scan_interface.cc b/extensions/browser/api/document_scan/document_scan_interface.cc index c42cf397..976e1a9 100644 --- a/extensions/browser/api/document_scan/document_scan_interface.cc +++ b/extensions/browser/api/document_scan/document_scan_interface.cc
@@ -17,6 +17,9 @@ DocumentScanInterface::ScannerDescription::ScannerDescription() { } +DocumentScanInterface::ScannerDescription::ScannerDescription( + const ScannerDescription& other) = default; + DocumentScanInterface::ScannerDescription::~ScannerDescription() { }
diff --git a/extensions/browser/api/document_scan/document_scan_interface.h b/extensions/browser/api/document_scan/document_scan_interface.h index 3339a16..dbcee19 100644 --- a/extensions/browser/api/document_scan/document_scan_interface.h +++ b/extensions/browser/api/document_scan/document_scan_interface.h
@@ -19,6 +19,7 @@ public: struct ScannerDescription { ScannerDescription(); + ScannerDescription(const ScannerDescription& other); ~ScannerDescription(); std::string name; std::string manufacturer;
diff --git a/extensions/browser/api/printer_provider/printer_provider_print_job.cc b/extensions/browser/api/printer_provider/printer_provider_print_job.cc index 3339daf0..a2838be1 100644 --- a/extensions/browser/api/printer_provider/printer_provider_print_job.cc +++ b/extensions/browser/api/printer_provider/printer_provider_print_job.cc
@@ -9,6 +9,9 @@ PrinterProviderPrintJob::PrinterProviderPrintJob() { } +PrinterProviderPrintJob::PrinterProviderPrintJob( + const PrinterProviderPrintJob& other) = default; + PrinterProviderPrintJob::~PrinterProviderPrintJob() { }
diff --git a/extensions/browser/api/printer_provider/printer_provider_print_job.h b/extensions/browser/api/printer_provider/printer_provider_print_job.h index 4148d0d..a9f4b4b5 100644 --- a/extensions/browser/api/printer_provider/printer_provider_print_job.h +++ b/extensions/browser/api/printer_provider/printer_provider_print_job.h
@@ -22,6 +22,7 @@ // or bytes. struct PrinterProviderPrintJob { PrinterProviderPrintJob(); + PrinterProviderPrintJob(const PrinterProviderPrintJob& other); ~PrinterProviderPrintJob(); // The id of the printer that should handle the print job. The id is
diff --git a/extensions/browser/api/serial/serial_event_dispatcher.cc b/extensions/browser/api/serial/serial_event_dispatcher.cc index 81f9457..31e44b0 100644 --- a/extensions/browser/api/serial/serial_event_dispatcher.cc +++ b/extensions/browser/api/serial/serial_event_dispatcher.cc
@@ -59,6 +59,9 @@ SerialEventDispatcher::ReceiveParams::ReceiveParams() { } +SerialEventDispatcher::ReceiveParams::ReceiveParams( + const ReceiveParams& other) = default; + SerialEventDispatcher::ReceiveParams::~ReceiveParams() { }
diff --git a/extensions/browser/api/serial/serial_event_dispatcher.h b/extensions/browser/api/serial/serial_event_dispatcher.h index 502f57a2..10188af4 100644 --- a/extensions/browser/api/serial/serial_event_dispatcher.h +++ b/extensions/browser/api/serial/serial_event_dispatcher.h
@@ -48,6 +48,7 @@ struct ReceiveParams { ReceiveParams(); + ReceiveParams(const ReceiveParams& other); ~ReceiveParams(); content::BrowserThread::ID thread_id;
diff --git a/extensions/browser/api/socket/socket.cc b/extensions/browser/api/socket/socket.cc index 52ba3219..a47f255 100644 --- a/extensions/browser/api/socket/socket.cc +++ b/extensions/browser/api/socket/socket.cc
@@ -135,6 +135,8 @@ callback(callback), bytes_written(0) {} +Socket::WriteRequest::WriteRequest(const WriteRequest& other) = default; + Socket::WriteRequest::~WriteRequest() {} } // namespace extensions
diff --git a/extensions/browser/api/socket/socket.h b/extensions/browser/api/socket/socket.h index 49a4dc3..fefe6bc 100644 --- a/extensions/browser/api/socket/socket.h +++ b/extensions/browser/api/socket/socket.h
@@ -137,6 +137,7 @@ WriteRequest(scoped_refptr<net::IOBuffer> io_buffer, int byte_count, const CompletionCallback& callback); + WriteRequest(const WriteRequest& other); ~WriteRequest(); scoped_refptr<net::IOBuffer> io_buffer; int byte_count;
diff --git a/extensions/browser/api/sockets_tcp/tcp_socket_event_dispatcher.cc b/extensions/browser/api/sockets_tcp/tcp_socket_event_dispatcher.cc index bdc2fbd..7d2f2ca 100644 --- a/extensions/browser/api/sockets_tcp/tcp_socket_event_dispatcher.cc +++ b/extensions/browser/api/sockets_tcp/tcp_socket_event_dispatcher.cc
@@ -57,6 +57,9 @@ TCPSocketEventDispatcher::ReadParams::ReadParams() {} +TCPSocketEventDispatcher::ReadParams::ReadParams(const ReadParams& other) = + default; + TCPSocketEventDispatcher::ReadParams::~ReadParams() {} void TCPSocketEventDispatcher::OnSocketConnect(const std::string& extension_id,
diff --git a/extensions/browser/api/sockets_tcp/tcp_socket_event_dispatcher.h b/extensions/browser/api/sockets_tcp/tcp_socket_event_dispatcher.h index 886cb28..0c90980 100644 --- a/extensions/browser/api/sockets_tcp/tcp_socket_event_dispatcher.h +++ b/extensions/browser/api/sockets_tcp/tcp_socket_event_dispatcher.h
@@ -56,6 +56,7 @@ // as a workaround that limitation for invoking StartReceive. struct ReadParams { ReadParams(); + ReadParams(const ReadParams& other); ~ReadParams(); content::BrowserThread::ID thread_id;
diff --git a/extensions/browser/api/sockets_tcp_server/tcp_server_socket_event_dispatcher.cc b/extensions/browser/api/sockets_tcp_server/tcp_server_socket_event_dispatcher.cc index 468237ef..a43d6be1 100644 --- a/extensions/browser/api/sockets_tcp_server/tcp_server_socket_event_dispatcher.cc +++ b/extensions/browser/api/sockets_tcp_server/tcp_server_socket_event_dispatcher.cc
@@ -62,6 +62,9 @@ TCPServerSocketEventDispatcher::AcceptParams::AcceptParams() {} +TCPServerSocketEventDispatcher::AcceptParams::AcceptParams( + const AcceptParams& other) = default; + TCPServerSocketEventDispatcher::AcceptParams::~AcceptParams() {} void TCPServerSocketEventDispatcher::OnServerSocketListen(
diff --git a/extensions/browser/api/sockets_tcp_server/tcp_server_socket_event_dispatcher.h b/extensions/browser/api/sockets_tcp_server/tcp_server_socket_event_dispatcher.h index ca5f6bc..e792b82 100644 --- a/extensions/browser/api/sockets_tcp_server/tcp_server_socket_event_dispatcher.h +++ b/extensions/browser/api/sockets_tcp_server/tcp_server_socket_event_dispatcher.h
@@ -58,6 +58,7 @@ // as a workaround that limitation for invoking StartAccept. struct AcceptParams { AcceptParams(); + AcceptParams(const AcceptParams& other); ~AcceptParams(); content::BrowserThread::ID thread_id;
diff --git a/extensions/browser/api/sockets_udp/udp_socket_event_dispatcher.cc b/extensions/browser/api/sockets_udp/udp_socket_event_dispatcher.cc index 7b8f9a1d..07e2a22f 100644 --- a/extensions/browser/api/sockets_udp/udp_socket_event_dispatcher.cc +++ b/extensions/browser/api/sockets_udp/udp_socket_event_dispatcher.cc
@@ -52,6 +52,9 @@ UDPSocketEventDispatcher::ReceiveParams::ReceiveParams() {} +UDPSocketEventDispatcher::ReceiveParams::ReceiveParams( + const ReceiveParams& other) = default; + UDPSocketEventDispatcher::ReceiveParams::~ReceiveParams() {} void UDPSocketEventDispatcher::OnSocketBind(const std::string& extension_id,
diff --git a/extensions/browser/api/sockets_udp/udp_socket_event_dispatcher.h b/extensions/browser/api/sockets_udp/udp_socket_event_dispatcher.h index b4c4624..ff8f111 100644 --- a/extensions/browser/api/sockets_udp/udp_socket_event_dispatcher.h +++ b/extensions/browser/api/sockets_udp/udp_socket_event_dispatcher.h
@@ -58,6 +58,7 @@ // as a workaround that limitation for invoking StartReceive. struct ReceiveParams { ReceiveParams(); + ReceiveParams(const ReceiveParams& other); ~ReceiveParams(); content::BrowserThread::ID thread_id;
diff --git a/extensions/browser/api/web_request/web_request_api.cc b/extensions/browser/api/web_request/web_request_api.cc index a43d14a3..aa799bb 100644 --- a/extensions/browser/api/web_request/web_request_api.cc +++ b/extensions/browser/api/web_request/web_request_api.cc
@@ -561,6 +561,9 @@ : tab_id(-1), window_id(-1) { } +ExtensionWebRequestEventRouter::RequestFilter::RequestFilter( + const RequestFilter& other) = default; + ExtensionWebRequestEventRouter::RequestFilter::~RequestFilter() { }
diff --git a/extensions/browser/api/web_request/web_request_api.h b/extensions/browser/api/web_request/web_request_api.h index 805d11b..382860d 100644 --- a/extensions/browser/api/web_request/web_request_api.h +++ b/extensions/browser/api/web_request/web_request_api.h
@@ -115,6 +115,7 @@ // filter what network events an extension cares about. struct RequestFilter { RequestFilter(); + RequestFilter(const RequestFilter& other); ~RequestFilter(); // Returns false if there was an error initializing. If it is a user error,
diff --git a/extensions/browser/api/web_request/web_request_time_tracker.cc b/extensions/browser/api/web_request/web_request_time_tracker.cc index 806f18d6..58bfbad2 100644 --- a/extensions/browser/api/web_request/web_request_time_tracker.cc +++ b/extensions/browser/api/web_request/web_request_time_tracker.cc
@@ -89,6 +89,9 @@ : profile(NULL), completed(false) { } +ExtensionWebRequestTimeTracker::RequestTimeLog::RequestTimeLog( + const RequestTimeLog& other) = default; + ExtensionWebRequestTimeTracker::RequestTimeLog::~RequestTimeLog() { }
diff --git a/extensions/browser/api/web_request/web_request_time_tracker.h b/extensions/browser/api/web_request/web_request_time_tracker.h index b65e537..af30731 100644 --- a/extensions/browser/api/web_request/web_request_time_tracker.h +++ b/extensions/browser/api/web_request/web_request_time_tracker.h
@@ -91,6 +91,7 @@ base::TimeDelta block_duration; std::map<std::string, base::TimeDelta> extension_block_durations; RequestTimeLog(); + RequestTimeLog(const RequestTimeLog& other); ~RequestTimeLog(); };
diff --git a/extensions/browser/app_window/app_window.cc b/extensions/browser/app_window/app_window.cc index 5bb73e6..0c0a45b 100644 --- a/extensions/browser/app_window/app_window.cc +++ b/extensions/browser/app_window/app_window.cc
@@ -174,6 +174,8 @@ visible_on_all_workspaces(false) { } +AppWindow::CreateParams::CreateParams(const CreateParams& other) = default; + AppWindow::CreateParams::~CreateParams() {} gfx::Rect AppWindow::CreateParams::GetInitialWindowBounds(
diff --git a/extensions/browser/app_window/app_window.h b/extensions/browser/app_window/app_window.h index 59d8463..6917c4d 100644 --- a/extensions/browser/app_window/app_window.h +++ b/extensions/browser/app_window/app_window.h
@@ -145,6 +145,7 @@ struct CreateParams { CreateParams(); + CreateParams(const CreateParams& other); ~CreateParams(); WindowType window_type;
diff --git a/extensions/browser/error_map.cc b/extensions/browser/error_map.cc index dcf0101a..5f94e34 100644 --- a/extensions/browser/error_map.cc +++ b/extensions/browser/error_map.cc
@@ -37,6 +37,8 @@ restrict_to_incognito(restrict_to_incognito) { } +ErrorMap::Filter::Filter(const Filter& other) = default; + ErrorMap::Filter::~Filter() { }
diff --git a/extensions/browser/error_map.h b/extensions/browser/error_map.h index 4c679ea..929335a 100644 --- a/extensions/browser/error_map.h +++ b/extensions/browser/error_map.h
@@ -33,6 +33,7 @@ int restrict_to_type, const std::set<int>& restrict_to_ids, bool restrict_to_incognito); + Filter(const Filter& other); ~Filter(); // Convenience methods to get a specific type of filter. Prefer these over
diff --git a/extensions/browser/extension_api_frame_id_map.cc b/extensions/browser/extension_api_frame_id_map.cc index 5ce80d2..53ee551 100644 --- a/extensions/browser/extension_api_frame_id_map.cc +++ b/extensions/browser/extension_api_frame_id_map.cc
@@ -64,6 +64,9 @@ ExtensionApiFrameIdMap::FrameDataCallbacks::FrameDataCallbacks() : is_iterating(false) {} +ExtensionApiFrameIdMap::FrameDataCallbacks::FrameDataCallbacks( + const FrameDataCallbacks& other) = default; + ExtensionApiFrameIdMap::FrameDataCallbacks::~FrameDataCallbacks() {} bool ExtensionApiFrameIdMap::RenderFrameIdKey::operator<(
diff --git a/extensions/browser/extension_api_frame_id_map.h b/extensions/browser/extension_api_frame_id_map.h index 58b1320..6c661ff5 100644 --- a/extensions/browser/extension_api_frame_id_map.h +++ b/extensions/browser/extension_api_frame_id_map.h
@@ -137,6 +137,7 @@ struct FrameDataCallbacks { FrameDataCallbacks(); + FrameDataCallbacks(const FrameDataCallbacks& other); ~FrameDataCallbacks(); // This is a std::list so that iterators are not invalidated when the list
diff --git a/extensions/browser/guest_view/web_view/web_view_permission_helper.cc b/extensions/browser/guest_view/web_view/web_view_permission_helper.cc index b0b140e3..822f131 100644 --- a/extensions/browser/guest_view/web_view/web_view_permission_helper.cc +++ b/extensions/browser/guest_view/web_view/web_view_permission_helper.cc
@@ -403,6 +403,9 @@ allowed_by_default(allowed_by_default) { } +WebViewPermissionHelper::PermissionResponseInfo::PermissionResponseInfo( + const PermissionResponseInfo& other) = default; + WebViewPermissionHelper::PermissionResponseInfo::~PermissionResponseInfo() { }
diff --git a/extensions/browser/guest_view/web_view/web_view_permission_helper.h b/extensions/browser/guest_view/web_view/web_view_permission_helper.h index 8383665..f5d037d 100644 --- a/extensions/browser/guest_view/web_view/web_view_permission_helper.h +++ b/extensions/browser/guest_view/web_view/web_view_permission_helper.h
@@ -43,6 +43,7 @@ PermissionResponseInfo(const PermissionResponseCallback& callback, WebViewPermissionType permission_type, bool allowed_by_default); + PermissionResponseInfo(const PermissionResponseInfo& other); ~PermissionResponseInfo(); };
diff --git a/extensions/browser/guest_view/web_view/web_view_renderer_state.cc b/extensions/browser/guest_view/web_view/web_view_renderer_state.cc index 8e9e26d..c95fac9 100644 --- a/extensions/browser/guest_view/web_view/web_view_renderer_state.cc +++ b/extensions/browser/guest_view/web_view/web_view_renderer_state.cc
@@ -12,6 +12,9 @@ WebViewRendererState::WebViewInfo::WebViewInfo() { } +WebViewRendererState::WebViewInfo::WebViewInfo(const WebViewInfo& other) = + default; + WebViewRendererState::WebViewInfo::~WebViewInfo() { }
diff --git a/extensions/browser/guest_view/web_view/web_view_renderer_state.h b/extensions/browser/guest_view/web_view/web_view_renderer_state.h index f5b18f5..c1c9242 100644 --- a/extensions/browser/guest_view/web_view/web_view_renderer_state.h +++ b/extensions/browser/guest_view/web_view/web_view_renderer_state.h
@@ -36,6 +36,7 @@ std::set<int> content_script_ids; WebViewInfo(); + WebViewInfo(const WebViewInfo& other); ~WebViewInfo(); };
diff --git a/extensions/browser/value_store/value_store_change.cc b/extensions/browser/value_store/value_store_change.cc index 904ec82..3bbad59 100644 --- a/extensions/browser/value_store/value_store_change.cc +++ b/extensions/browser/value_store/value_store_change.cc
@@ -31,6 +31,8 @@ const std::string& key, base::Value* old_value, base::Value* new_value) : inner_(new Inner(key, old_value, new_value)) {} +ValueStoreChange::ValueStoreChange(const ValueStoreChange& other) = default; + ValueStoreChange::~ValueStoreChange() {} const std::string& ValueStoreChange::key() const {
diff --git a/extensions/browser/value_store/value_store_change.h b/extensions/browser/value_store/value_store_change.h index 4c03cc3..a5e6bf5b 100644 --- a/extensions/browser/value_store/value_store_change.h +++ b/extensions/browser/value_store/value_store_change.h
@@ -26,6 +26,8 @@ ValueStoreChange( const std::string& key, base::Value* old_value, base::Value* new_value); + ValueStoreChange(const ValueStoreChange& other); + ~ValueStoreChange(); // Gets the key of the setting which changed.
diff --git a/extensions/common/api/PRESUBMIT.py b/extensions/common/api/PRESUBMIT.py new file mode 100644 index 0000000..b74059f --- /dev/null +++ b/extensions/common/api/PRESUBMIT.py
@@ -0,0 +1,37 @@ +# Copyright 2016 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +"""Chromium presubmit script for src/extensions/common. + +See http://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts +for more details on the presubmit API built into depot_tools. +""" + +import sys + + +def _CheckExterns(input_api, output_api): + original_sys_path = sys.path + + try: + sys.path.append(input_api.PresubmitLocalPath()) + from externs_checker import ExternsChecker + finally: + sys.path = original_sys_path + + join = input_api.os_path.join + api_root = input_api.PresubmitLocalPath() + externs_root = join(api_root, '..', '..', '..', 'third_party', + 'closure_compiler', 'externs') + + api_pairs = { + join(api_root, 'bluetooth.idl'): join(externs_root, 'bluetooth.js'), + # TODO(rdevlin.cronin): Add more! + } + + return ExternsChecker(input_api, output_api, api_pairs).RunChecks() + + +def CheckChangeOnUpload(input_api, output_api): + return _CheckExterns(input_api, output_api)
diff --git a/extensions/common/api/externs_checker.py b/extensions/common/api/externs_checker.py new file mode 100644 index 0000000..58c0076f --- /dev/null +++ b/extensions/common/api/externs_checker.py
@@ -0,0 +1,32 @@ +# Copyright 2016 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +class ExternsChecker(object): + _UPDATE_MESSAGE = """To update the externs, run: + src/ $ python tools/json_schema_compiler/compiler.py\ + %s --root=. --generator=externs > %s""" + + def __init__(self, input_api, output_api, api_pairs): + self._input_api = input_api + self._output_api = output_api + self._api_pairs = api_pairs + + def RunChecks(self): + bad_files = [] + affected = [f.AbsoluteLocalPath() for f in self._input_api.AffectedFiles()] + for path in affected: + pair = self._api_pairs.get(path) + if pair != None and pair not in affected: + bad_files.append({'source': path, 'extern': pair}) + results = [] + if bad_files: + replacements = (('<source_file>', '<output_file>') if len(bad_files) > 1 + else (bad_files[0]['source'], bad_files[0]['extern'])) + long_text = self._UPDATE_MESSAGE % replacements + results.append(self._output_api.PresubmitPromptWarning( + str('Found updated extension api files without updated extern files. ' + 'Please update the extern files.'), + [f['source'] for f in bad_files], + long_text)) + return results
diff --git a/extensions/common/api/externs_checker_test.py b/extensions/common/api/externs_checker_test.py new file mode 100755 index 0000000..73b65fa --- /dev/null +++ b/extensions/common/api/externs_checker_test.py
@@ -0,0 +1,63 @@ +#!/usr/bin/env python +# Copyright 2016 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import os +import sys +import unittest + +from externs_checker import ExternsChecker + +sys.path.append( + os.path.join(os.path.dirname(os.path.abspath(__file__)), '..', '..', '..')) + +from PRESUBMIT_test_mocks import MockInputApi, MockOutputApi, MockFile + + +class ExternsCheckerTest(unittest.TestCase): + API_PAIRS = {'a': '1', 'b': '2', 'c': '3'} + + def _runChecks(self, files): + input_api = MockInputApi() + input_api.files = [MockFile(f, '') for f in files] + output_api = MockOutputApi() + checker = ExternsChecker(input_api, output_api, self.API_PAIRS) + return checker.RunChecks() + + def testModifiedSourceWithoutModifiedExtern(self): + results = self._runChecks(['b', 'test', 'random']) + self.assertEquals(1, len(results)) + self.assertEquals(1, len(results[0].items)) + self.assertEquals('b', results[0].items[0]) + self.assertEquals( + 'To update the externs, run:\n' + ' src/ $ python tools/json_schema_compiler/compiler.py b --root=. ' + '--generator=externs > 2', + results[0].long_text) + + def testModifiedSourceWithModifiedExtern(self): + results = self._runChecks(['b', '2', 'test', 'random']) + self.assertEquals(0, len(results)) + + def testModifiedMultipleSourcesWithNoModifiedExterns(self): + results = self._runChecks(['b', 'test', 'c', 'random']) + self.assertEquals(1, len(results)) + self.assertEquals(2, len(results[0].items)) + self.assertTrue('b' in results[0].items) + self.assertTrue('c' in results[0].items) + self.assertEquals( + 'To update the externs, run:\n' + ' src/ $ python tools/json_schema_compiler/compiler.py <source_file> ' + '--root=. --generator=externs > <output_file>', + results[0].long_text) + + def testModifiedMultipleSourcesWithOneModifiedExtern(self): + results = self._runChecks(['b', 'test', 'c', 'random', '2']) + self.assertEquals(1, len(results)) + self.assertEquals(1, len(results[0].items)) + self.assertEquals('c', results[0].items[0]) + + +if __name__ == '__main__': + unittest.main()
diff --git a/extensions/common/event_filtering_info.cc b/extensions/common/event_filtering_info.cc index 3c39864..a426e1b 100644 --- a/extensions/common/event_filtering_info.cc +++ b/extensions/common/event_filtering_info.cc
@@ -18,6 +18,9 @@ has_window_type_(false), has_window_exposed_by_default_(false) {} +EventFilteringInfo::EventFilteringInfo(const EventFilteringInfo& other) = + default; + EventFilteringInfo::~EventFilteringInfo() { }
diff --git a/extensions/common/event_filtering_info.h b/extensions/common/event_filtering_info.h index 30581108..aaa03a4 100644 --- a/extensions/common/event_filtering_info.h +++ b/extensions/common/event_filtering_info.h
@@ -25,6 +25,7 @@ class EventFilteringInfo { public: EventFilteringInfo(); + EventFilteringInfo(const EventFilteringInfo& other); ~EventFilteringInfo(); void SetWindowExposedByDefault(bool exposed); void SetWindowType(const std::string& window_type);
diff --git a/extensions/common/extension_icon_set.cc b/extensions/common/extension_icon_set.cc index 221f32f5..421407c7 100644 --- a/extensions/common/extension_icon_set.cc +++ b/extensions/common/extension_icon_set.cc
@@ -10,6 +10,8 @@ ExtensionIconSet::ExtensionIconSet() {} +ExtensionIconSet::ExtensionIconSet(const ExtensionIconSet& other) = default; + ExtensionIconSet::~ExtensionIconSet() {} void ExtensionIconSet::Clear() {
diff --git a/extensions/common/extension_icon_set.h b/extensions/common/extension_icon_set.h index e491b72c..91ce0f5 100644 --- a/extensions/common/extension_icon_set.h +++ b/extensions/common/extension_icon_set.h
@@ -28,6 +28,7 @@ typedef std::map<int, std::string> IconMap; ExtensionIconSet(); + ExtensionIconSet(const ExtensionIconSet& other); ~ExtensionIconSet(); const IconMap& map() const { return map_; }
diff --git a/extensions/common/extension_messages.cc b/extensions/common/extension_messages.cc index d6ab4f28..c648b28a 100644 --- a/extensions/common/extension_messages.cc +++ b/extensions/common/extension_messages.cc
@@ -35,6 +35,9 @@ scriptable_hosts(permissions.scriptable_hosts()) { } +ExtensionMsg_PermissionSetStruct::ExtensionMsg_PermissionSetStruct( + const ExtensionMsg_PermissionSetStruct& other) = default; + ExtensionMsg_PermissionSetStruct::~ExtensionMsg_PermissionSetStruct() { } @@ -70,6 +73,9 @@ } } +ExtensionMsg_Loaded_Params::ExtensionMsg_Loaded_Params( + const ExtensionMsg_Loaded_Params& other) = default; + scoped_refptr<Extension> ExtensionMsg_Loaded_Params::ConvertToExtension( std::string* error) const { scoped_refptr<Extension> extension =
diff --git a/extensions/common/extension_messages.h b/extensions/common/extension_messages.h index 5125941..54f1433 100644 --- a/extensions/common/extension_messages.h +++ b/extensions/common/extension_messages.h
@@ -249,6 +249,8 @@ ExtensionMsg_PermissionSetStruct(); explicit ExtensionMsg_PermissionSetStruct( const extensions::PermissionSet& permissions); + ExtensionMsg_PermissionSetStruct( + const ExtensionMsg_PermissionSetStruct& other); ~ExtensionMsg_PermissionSetStruct(); scoped_ptr<const extensions::PermissionSet> ToPermissionSet() const; @@ -264,6 +266,7 @@ ~ExtensionMsg_Loaded_Params(); ExtensionMsg_Loaded_Params(const extensions::Extension* extension, bool include_tab_permissions); + ExtensionMsg_Loaded_Params(const ExtensionMsg_Loaded_Params& other); // Creates a new extension from the data in this object. scoped_refptr<extensions::Extension> ConvertToExtension(
diff --git a/extensions/common/extension_resource.cc b/extensions/common/extension_resource.cc index e1eaa3c..fea9286 100644 --- a/extensions/common/extension_resource.cc +++ b/extensions/common/extension_resource.cc
@@ -24,6 +24,8 @@ follow_symlinks_anywhere_(false) { } +ExtensionResource::ExtensionResource(const ExtensionResource& other) = default; + ExtensionResource::~ExtensionResource() {} void ExtensionResource::set_follow_symlinks_anywhere() {
diff --git a/extensions/common/extension_resource.h b/extensions/common/extension_resource.h index 806889e..43281cc8 100644 --- a/extensions/common/extension_resource.h +++ b/extensions/common/extension_resource.h
@@ -30,6 +30,8 @@ const base::FilePath& extension_root, const base::FilePath& relative_path); + ExtensionResource(const ExtensionResource& other); + ~ExtensionResource(); // set_follow_symlinks_anywhere allows the resource to be a symlink to
diff --git a/extensions/common/manifest_handlers/file_handler_info.cc b/extensions/common/manifest_handlers/file_handler_info.cc index b525c14..c95a5e46 100644 --- a/extensions/common/manifest_handlers/file_handler_info.cc +++ b/extensions/common/manifest_handlers/file_handler_info.cc
@@ -26,6 +26,7 @@ } FileHandlerInfo::FileHandlerInfo() : include_directories(false) {} +FileHandlerInfo::FileHandlerInfo(const FileHandlerInfo& other) = default; FileHandlerInfo::~FileHandlerInfo() {} FileHandlers::FileHandlers() {}
diff --git a/extensions/common/manifest_handlers/file_handler_info.h b/extensions/common/manifest_handlers/file_handler_info.h index ac9e51de..90de31c 100644 --- a/extensions/common/manifest_handlers/file_handler_info.h +++ b/extensions/common/manifest_handlers/file_handler_info.h
@@ -17,6 +17,7 @@ struct FileHandlerInfo { FileHandlerInfo(); + FileHandlerInfo(const FileHandlerInfo& other); ~FileHandlerInfo(); // The id of this handler.
diff --git a/extensions/common/permissions/api_permission_set.cc b/extensions/common/permissions/api_permission_set.cc index 164390b..0e48d2f4 100644 --- a/extensions/common/permissions/api_permission_set.cc +++ b/extensions/common/permissions/api_permission_set.cc
@@ -197,6 +197,8 @@ PermissionIDSet::PermissionIDSet() { } +PermissionIDSet::PermissionIDSet(const PermissionIDSet& other) = default; + PermissionIDSet::~PermissionIDSet() { }
diff --git a/extensions/common/permissions/api_permission_set.h b/extensions/common/permissions/api_permission_set.h index c913466..e64d519c0 100644 --- a/extensions/common/permissions/api_permission_set.h +++ b/extensions/common/permissions/api_permission_set.h
@@ -117,6 +117,7 @@ using const_iterator = std::set<PermissionID>::const_iterator; PermissionIDSet(); + PermissionIDSet(const PermissionIDSet& other); virtual ~PermissionIDSet(); // Adds the given permission, and an optional parameter, to the set.
diff --git a/extensions/common/permissions/permission_message.cc b/extensions/common/permissions/permission_message.cc index 416b6c97..83553e66 100644 --- a/extensions/common/permissions/permission_message.cc +++ b/extensions/common/permissions/permission_message.cc
@@ -16,6 +16,8 @@ const std::vector<base::string16>& submessages) : message_(message), permissions_(permissions), submessages_(submessages) {} +PermissionMessage::PermissionMessage(const PermissionMessage& other) = default; + PermissionMessage::~PermissionMessage() {} } // namespace extensions
diff --git a/extensions/common/permissions/permission_message.h b/extensions/common/permissions/permission_message.h index bdb053a..28f1f15 100644 --- a/extensions/common/permissions/permission_message.h +++ b/extensions/common/permissions/permission_message.h
@@ -44,6 +44,7 @@ PermissionMessage(const base::string16& message, const PermissionIDSet& permissions, const std::vector<base::string16>& submessages); + PermissionMessage(const PermissionMessage& other); virtual ~PermissionMessage(); const base::string16& message() const { return message_; }
diff --git a/extensions/common/update_manifest.cc b/extensions/common/update_manifest.cc index 57162da..c8ebdf79 100644 --- a/extensions/common/update_manifest.cc +++ b/extensions/common/update_manifest.cc
@@ -23,6 +23,8 @@ : size(0), diff_size(0) {} +UpdateManifest::Result::Result(const Result& other) = default; + UpdateManifest::Result::~Result() {} UpdateManifest::Results::Results() : daystart_elapsed_seconds(kNoDaystart) {}
diff --git a/extensions/common/update_manifest.h b/extensions/common/update_manifest.h index d2b1be4..6761a39 100644 --- a/extensions/common/update_manifest.h +++ b/extensions/common/update_manifest.h
@@ -42,6 +42,7 @@ // The result of parsing one <app> tag in an xml update check manifest. struct Result { Result(); + Result(const Result& other); ~Result(); std::string extension_id;
diff --git a/extensions/common/url_pattern.cc b/extensions/common/url_pattern.cc index 0be7aba..a74c864 100644 --- a/extensions/common/url_pattern.cc +++ b/extensions/common/url_pattern.cc
@@ -151,6 +151,8 @@ NOTREACHED() << "URLPattern invalid: " << pattern << " result " << result; } +URLPattern::URLPattern(const URLPattern& other) = default; + URLPattern::~URLPattern() { }
diff --git a/extensions/common/url_pattern.h b/extensions/common/url_pattern.h index c58c3ef..bcdc7f6 100644 --- a/extensions/common/url_pattern.h +++ b/extensions/common/url_pattern.h
@@ -90,6 +90,7 @@ URLPattern(int valid_schemes, const std::string& pattern); URLPattern(); + URLPattern(const URLPattern& other); ~URLPattern(); bool operator<(const URLPattern& other) const;
diff --git a/extensions/common/user_script.cc b/extensions/common/user_script.cc index 0bb3c8de..20bff9f1 100644 --- a/extensions/common/user_script.cc +++ b/extensions/common/user_script.cc
@@ -82,6 +82,8 @@ UserScript::File::File() {} +UserScript::File::File(const File& other) = default; + UserScript::File::~File() {} UserScript::UserScript() @@ -93,6 +95,8 @@ match_about_blank_(false), incognito_enabled_(false) {} +UserScript::UserScript(const UserScript& other) = default; + UserScript::~UserScript() { }
diff --git a/extensions/common/user_script.h b/extensions/common/user_script.h index 8bf16bf2..40ad3303 100644 --- a/extensions/common/user_script.h +++ b/extensions/common/user_script.h
@@ -80,6 +80,7 @@ const base::FilePath& relative_path, const GURL& url); File(); + File(const File& other); ~File(); const base::FilePath& extension_root() const { return extension_root_; } @@ -133,6 +134,7 @@ // Constructor. Default the run location to document end, which is like // Greasemonkey and probably more useful for typical scripts. UserScript(); + UserScript(const UserScript& other); ~UserScript(); const std::string& name_space() const { return name_space_; }
diff --git a/headless/BUILD.gn b/headless/BUILD.gn index f94e93d..f31584f9 100644 --- a/headless/BUILD.gn +++ b/headless/BUILD.gn
@@ -2,23 +2,133 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import("//testing/test.gni") +import("//tools/grit/repack.gni") + group("headless") { deps = [ "//headless:headless_lib", ] } -static_library("headless_lib") { +repack("pak") { sources = [ - "public/headless_browser.cc", - "public/headless_browser.h", - "public/headless_export.h", - "public/network.h", - "public/web_contents.h", - "public/web_frame.h", + "$root_gen_dir/blink/devtools_resources.pak", + "$root_gen_dir/blink/public/resources/blink_image_resources_100_percent.pak", + "$root_gen_dir/blink/public/resources/blink_resources.pak", + "$root_gen_dir/content/app/resources/content_resources_100_percent.pak", + "$root_gen_dir/content/app/strings/content_strings_en-US.pak", + "$root_gen_dir/content/browser/tracing/tracing_resources.pak", + "$root_gen_dir/content/content_resources.pak", + "$root_gen_dir/net/net_resources.pak", + "$root_gen_dir/ui/resources/ui_resources_100_percent.pak", + "$root_gen_dir/ui/resources/webui_resources.pak", + "$root_gen_dir/ui/strings/app_locale_settings_en-US.pak", + "$root_gen_dir/ui/strings/ui_strings_en-US.pak", ] deps = [ + "//content:resources", + "//content/app/resources", + "//content/app/strings", + "//content/browser/devtools:resources", + "//content/browser/tracing:resources", + "//net:net_resources", + "//third_party/WebKit/public:image_resources", + "//third_party/WebKit/public:resources", + "//ui/resources", + "//ui/strings", + ] + + output = "$root_out_dir/headless_lib.pak" +} + +static_library("headless_lib") { + sources = [ + "lib/browser/headless_browser_context.cc", + "lib/browser/headless_browser_context.h", + "lib/browser/headless_browser_impl.cc", + "lib/browser/headless_browser_impl.h", + "lib/browser/headless_browser_main_parts.cc", + "lib/browser/headless_browser_main_parts.h", + "lib/browser/headless_content_browser_client.cc", + "lib/browser/headless_content_browser_client.h", + "lib/browser/headless_devtools.cc", + "lib/browser/headless_devtools.h", + "lib/browser/headless_screen.cc", + "lib/browser/headless_screen.h", + "lib/browser/headless_url_request_context_getter.cc", + "lib/browser/headless_url_request_context_getter.h", + "lib/browser/headless_web_contents_impl.cc", + "lib/browser/headless_web_contents_impl.h", + "lib/headless_content_client.cc", + "lib/headless_content_client.h", + "lib/headless_content_main_delegate.cc", + "lib/headless_content_main_delegate.h", + "lib/renderer/headless_content_renderer_client.cc", + "lib/renderer/headless_content_renderer_client.h", + "lib/utility/headless_content_utility_client.cc", + "lib/utility/headless_content_utility_client.h", + "public/headless_browser.cc", + "public/headless_browser.h", + "public/headless_export.h", + "public/headless_web_contents.h", + ] + + deps = [ + ":pak", "//base", + "//components/devtools_http_handler", + "//content/public/browser", + "//content/public/common", + "//content/public/renderer", + "//content/public/utility", + "//net", + "//ui/aura", + "//ui/base", + "//ui/compositor", + "//ui/ozone", + "//url", + ] +} + +group("headless_tests") { + testonly = true + + deps = [ + ":headless_browsertests", + ] +} + +test("headless_browsertests") { + sources = [ + "lib/headless_browser_browsertest.cc", + "lib/headless_web_contents_browsertest.cc", + "test/headless_browser_test.cc", + "test/headless_browser_test.h", + "test/headless_test_launcher.cc", + ] + + defines = [ "HAS_OUT_OF_PROC_TEST_RUNNER" ] + + deps = [ + "//base", + "//content/test:browsertest_base", + "//content/test:test_support", + "//headless:headless_lib", + "//testing/gmock", + "//testing/gtest", + ] +} + +executable("headless_shell") { + testonly = true + + sources = [ + "app/headless_shell.cc", + ] + + deps = [ + "//headless:headless_lib", ] }
diff --git a/headless/DEPS b/headless/DEPS new file mode 100644 index 0000000..b251cd9 --- /dev/null +++ b/headless/DEPS
@@ -0,0 +1,10 @@ +include_rules = [ + "+components/devtools_http_handler", + "+content/public", + "+net", + "+ui/base", + "+ui/base/resource", + "+ui/gfx", + "+ui/gfx/geometry", + "+ui/ozone/public", +]
diff --git a/headless/README.md b/headless/README.md new file mode 100644 index 0000000..733bef4 --- /dev/null +++ b/headless/README.md
@@ -0,0 +1,59 @@ +# Headless Chromium + +Headless Chromium is a library for running Chromium in a headless/server +environment. Expected use cases include loading web pages, extracting metadata +(e.g., the DOM) and generating bitmaps from page contents -- using all the +modern web platform features provided by Chromium and Blink. + +## Headless shell + +The headless shell is a sample application which demonstrates the use of the +headless API. To run it, first open the build configuration editor: + +``` +$ gn args out/Release +``` + +and enable headless mode with `is_headless = true`. + +Then build the shell: + +``` +$ ninja -C out/Release headless_shell +``` + +After the build completes, the headless shell can be run with the following +command: + +``` +$ out/Release/headless_shell https://www.google.com +``` + +To attach a [DevTools](https://developer.chrome.com/devtools) debugger to the +shell, start it with an argument specifying the debugging port: + +``` +$ out/Release/headless_shell --remote-debugging-port=9222 https://youtube.com +``` + +Then navigate to `http://127.0.0.1:9222` with your browser. + +## Embedder API + +The embedder API allows developers to integrate the headless library into their +application. The API provides default implementations for low level adaptation +points such as networking and the run loop. + +The main embedder API classes are: + +- `HeadlessBrowser::Options::Builder` - Defines the embedding options, e.g.: + - `SetMessagePump` - Replaces the default base message pump. See + `base::MessagePump`. + +## Headless API + +The headless API is used to drive the browser and interact with the loaded web +pages. Its main classes are: + +- `HeadlessBrowser` - Represents the global headless browser instance. +- `HeadlessWebContents` - Represents a single "tab" within the browser.
diff --git a/headless/app/headless_shell.cc b/headless/app/headless_shell.cc new file mode 100644 index 0000000..9375746 --- /dev/null +++ b/headless/app/headless_shell.cc
@@ -0,0 +1,103 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/bind.h" +#include "base/callback.h" +#include "base/command_line.h" +#include "base/location.h" +#include "base/memory/ref_counted.h" +#include "base/numerics/safe_conversions.h" +#include "base/strings/string_number_conversions.h" +#include "content/public/common/content_switches.h" +#include "headless/public/headless_browser.h" +#include "headless/public/headless_web_contents.h" +#include "net/base/ip_address.h" +#include "ui/gfx/geometry/size.h" + +using headless::HeadlessBrowser; +using headless::HeadlessWebContents; + +namespace { +// Address where to listen to incoming DevTools connections. +const char kDevToolsHttpServerAddress[] = "127.0.0.1"; +} + +// A sample application which demonstrates the use of the headless API. +class HeadlessShell : public HeadlessWebContents::Observer { + public: + HeadlessShell() : browser_(nullptr) {} + ~HeadlessShell() override { + if (web_contents_) + web_contents_->RemoveObserver(this); + } + + void OnStart(HeadlessBrowser* browser) { + browser_ = browser; + web_contents_ = browser->CreateWebContents(gfx::Size(800, 600)); + web_contents_->AddObserver(this); + + base::CommandLine::StringVector args = + base::CommandLine::ForCurrentProcess()->GetArgs(); + + const char kDefaultUrl[] = "about:blank"; + GURL url; + if (args.empty() || args[0].empty()) { + url = GURL(kDefaultUrl); + } else { + url = GURL(args[0]); + } + if (!web_contents_->OpenURL(url)) { + LOG(ERROR) << "Navigation failed"; + web_contents_ = nullptr; + browser_->Shutdown(); + } + } + + void ShutdownIfNeeded() { + const base::CommandLine& command_line = + *base::CommandLine::ForCurrentProcess(); + if (!command_line.HasSwitch(switches::kRemoteDebuggingPort)) { + web_contents_ = nullptr; + browser_->Shutdown(); + } + } + + // HeadlessWebContents::Observer implementation: + void DocumentOnLoadCompletedInMainFrame() override { + LOG(DEBUG) << "Document load completed"; + ShutdownIfNeeded(); + } + + private: + HeadlessBrowser* browser_; // Not owned. + scoped_ptr<HeadlessWebContents> web_contents_; + + DISALLOW_COPY_AND_ASSIGN(HeadlessShell); +}; + +int main(int argc, const char** argv) { + HeadlessShell shell; + HeadlessBrowser::Options::Builder builder(argc, argv); + + // Enable devtools if requested. + base::CommandLine command_line(argc, argv); + if (command_line.HasSwitch(switches::kRemoteDebuggingPort)) { + int parsed_port; + std::string port_str = + command_line.GetSwitchValueASCII(switches::kRemoteDebuggingPort); + if (base::StringToInt(port_str, &parsed_port) && + base::IsValueInRangeForNumericType<uint16_t>(parsed_port)) { + net::IPAddress devtools_address; + bool result = + devtools_address.AssignFromIPLiteral(kDevToolsHttpServerAddress); + DCHECK(result); + builder.EnableDevToolsServer(net::IPEndPoint( + devtools_address, base::checked_cast<uint16_t>(parsed_port))); + } + } + + return HeadlessBrowserMain( + builder.Build(), + base::Bind(&HeadlessShell::OnStart, base::Unretained(&shell))); +}
diff --git a/headless/lib/browser/DEPS b/headless/lib/browser/DEPS new file mode 100644 index 0000000..75ab3c7 --- /dev/null +++ b/headless/lib/browser/DEPS
@@ -0,0 +1,3 @@ +include_rules = [ + "+ui/aura" +]
diff --git a/headless/lib/browser/headless_browser_context.cc b/headless/lib/browser/headless_browser_context.cc new file mode 100644 index 0000000..aca8351 --- /dev/null +++ b/headless/lib/browser/headless_browser_context.cc
@@ -0,0 +1,163 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "headless/lib/browser/headless_browser_context.h" + +#include "base/path_service.h" +#include "content/public/browser/browser_thread.h" +#include "content/public/browser/resource_context.h" +#include "content/public/browser/storage_partition.h" +#include "headless/lib/browser/headless_url_request_context_getter.h" +#include "net/url_request/url_request_context.h" + +namespace headless { + +// Contains net::URLRequestContextGetter required for resource loading. +// Must be destructed on the IO thread as per content::ResourceContext +// requirements. +class HeadlessResourceContext : public content::ResourceContext { + public: + HeadlessResourceContext(); + ~HeadlessResourceContext() override; + + // ResourceContext implementation: + net::HostResolver* GetHostResolver() override; + net::URLRequestContext* GetRequestContext() override; + + // Configure the URL request context getter to be used for resource fetching. + // Must be called before any of the other methods of this class are used. Must + // be called on the browser UI thread. + void set_url_request_context_getter( + scoped_refptr<net::URLRequestContextGetter> url_request_context_getter) { + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); + url_request_context_getter_ = std::move(url_request_context_getter); + } + + private: + scoped_refptr<net::URLRequestContextGetter> url_request_context_getter_; + + DISALLOW_COPY_AND_ASSIGN(HeadlessResourceContext); +}; + +HeadlessResourceContext::HeadlessResourceContext() { + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); +} + +HeadlessResourceContext::~HeadlessResourceContext() { + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); +} + +net::HostResolver* HeadlessResourceContext::GetHostResolver() { + CHECK(url_request_context_getter_); + return url_request_context_getter_->GetURLRequestContext()->host_resolver(); +} + +net::URLRequestContext* HeadlessResourceContext::GetRequestContext() { + CHECK(url_request_context_getter_); + return url_request_context_getter_->GetURLRequestContext(); +} + +HeadlessBrowserContext::HeadlessBrowserContext( + const HeadlessBrowser::Options& options) + : resource_context_(new HeadlessResourceContext), options_(options) { + InitWhileIOAllowed(); +} + +HeadlessBrowserContext::~HeadlessBrowserContext() { + if (resource_context_) { + content::BrowserThread::DeleteSoon(content::BrowserThread::IO, FROM_HERE, + resource_context_.release()); + } +} + +void HeadlessBrowserContext::InitWhileIOAllowed() { + // TODO(skyostil): Allow the embedder to override this. + PathService::Get(base::DIR_EXE, &path_); +} + +scoped_ptr<content::ZoomLevelDelegate> +HeadlessBrowserContext::CreateZoomLevelDelegate( + const base::FilePath& partition_path) { + return scoped_ptr<content::ZoomLevelDelegate>(); +} + +base::FilePath HeadlessBrowserContext::GetPath() const { + return path_; +} + +bool HeadlessBrowserContext::IsOffTheRecord() const { + return false; +} + +net::URLRequestContextGetter* HeadlessBrowserContext::GetRequestContext() { + return GetDefaultStoragePartition(this)->GetURLRequestContext(); +} + +net::URLRequestContextGetter* +HeadlessBrowserContext::GetRequestContextForRenderProcess( + int renderer_child_id) { + return GetRequestContext(); +} + +net::URLRequestContextGetter* HeadlessBrowserContext::GetMediaRequestContext() { + return GetRequestContext(); +} + +net::URLRequestContextGetter* +HeadlessBrowserContext::GetMediaRequestContextForRenderProcess( + int renderer_child_id) { + return GetRequestContext(); +} + +net::URLRequestContextGetter* +HeadlessBrowserContext::GetMediaRequestContextForStoragePartition( + const base::FilePath& partition_path, + bool in_memory) { + return GetRequestContext(); +} + +content::ResourceContext* HeadlessBrowserContext::GetResourceContext() { + return resource_context_.get(); +} + +content::DownloadManagerDelegate* +HeadlessBrowserContext::GetDownloadManagerDelegate() { + return nullptr; +} + +content::BrowserPluginGuestManager* HeadlessBrowserContext::GetGuestManager() { + // TODO(altimin): Should be non-null? (is null in content/shell). + return nullptr; +} + +storage::SpecialStoragePolicy* +HeadlessBrowserContext::GetSpecialStoragePolicy() { + return nullptr; +} + +content::PushMessagingService* +HeadlessBrowserContext::GetPushMessagingService() { + return nullptr; +} + +content::SSLHostStateDelegate* +HeadlessBrowserContext::GetSSLHostStateDelegate() { + return nullptr; +} + +content::PermissionManager* HeadlessBrowserContext::GetPermissionManager() { + return nullptr; +} + +content::BackgroundSyncController* +HeadlessBrowserContext::GetBackgroundSyncController() { + return nullptr; +} + +void HeadlessBrowserContext::SetURLRequestContextGetter( + scoped_refptr<net::URLRequestContextGetter> url_request_context_getter) { + resource_context_->set_url_request_context_getter(url_request_context_getter); +} + +} // namespace headless
diff --git a/headless/lib/browser/headless_browser_context.h b/headless/lib/browser/headless_browser_context.h new file mode 100644 index 0000000..41b7211 --- /dev/null +++ b/headless/lib/browser/headless_browser_context.h
@@ -0,0 +1,67 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef HEADLESS_LIB_BROWSER_HEADLESS_BROWSER_CONTEXT_H_ +#define HEADLESS_LIB_BROWSER_HEADLESS_BROWSER_CONTEXT_H_ + +#include "base/files/file_path.h" +#include "content/public/browser/browser_context.h" +#include "content/public/browser/content_browser_client.h" +#include "content/public/browser/resource_context.h" +#include "headless/lib/browser/headless_url_request_context_getter.h" +#include "headless/public/headless_browser.h" + +namespace headless { +class HeadlessResourceContext; + +class HeadlessBrowserContext : public content::BrowserContext { + public: + explicit HeadlessBrowserContext(const HeadlessBrowser::Options& options); + ~HeadlessBrowserContext() override; + + // BrowserContext implementation: + scoped_ptr<content::ZoomLevelDelegate> CreateZoomLevelDelegate( + const base::FilePath& partition_path) override; + base::FilePath GetPath() const override; + bool IsOffTheRecord() const override; + net::URLRequestContextGetter* GetRequestContext() override; + net::URLRequestContextGetter* GetRequestContextForRenderProcess( + int renderer_child_id) override; + net::URLRequestContextGetter* GetMediaRequestContext() override; + net::URLRequestContextGetter* GetMediaRequestContextForRenderProcess( + int renderer_child_id) override; + net::URLRequestContextGetter* GetMediaRequestContextForStoragePartition( + const base::FilePath& partition_path, + bool in_memory) override; + content::ResourceContext* GetResourceContext() override; + content::DownloadManagerDelegate* GetDownloadManagerDelegate() override; + content::BrowserPluginGuestManager* GetGuestManager() override; + storage::SpecialStoragePolicy* GetSpecialStoragePolicy() override; + content::PushMessagingService* GetPushMessagingService() override; + content::SSLHostStateDelegate* GetSSLHostStateDelegate() override; + content::PermissionManager* GetPermissionManager() override; + content::BackgroundSyncController* GetBackgroundSyncController() override; + + const HeadlessBrowser::Options& options() const { return options_; } + + // Configure the URL request context getter to be used for serving URL + // requests in this browser instance. + void SetURLRequestContextGetter( + scoped_refptr<net::URLRequestContextGetter> url_request_context_getter); + + private: + // Performs initialization of the HeadlessBrowserContext while IO is still + // allowed on the current thread. + void InitWhileIOAllowed(); + + base::FilePath path_; + scoped_ptr<HeadlessResourceContext> resource_context_; + HeadlessBrowser::Options options_; + + DISALLOW_COPY_AND_ASSIGN(HeadlessBrowserContext); +}; + +} // namespace headless + +#endif // HEADLESS_LIB_BROWSER_HEADLESS_BROWSER_CONTEXT_H_
diff --git a/headless/lib/browser/headless_browser_impl.cc b/headless/lib/browser/headless_browser_impl.cc new file mode 100644 index 0000000..6bc2b5dc --- /dev/null +++ b/headless/lib/browser/headless_browser_impl.cc
@@ -0,0 +1,93 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "headless/lib/browser/headless_browser_impl.h" + +#include "base/thread_task_runner_handle.h" +#include "content/public/app/content_main.h" +#include "content/public/browser/browser_thread.h" +#include "content/public/browser/web_contents.h" +#include "headless/lib/browser/headless_browser_context.h" +#include "headless/lib/browser/headless_browser_main_parts.h" +#include "headless/lib/browser/headless_web_contents_impl.h" +#include "headless/lib/headless_content_main_delegate.h" +#include "ui/aura/env.h" +#include "ui/aura/window_tree_host.h" +#include "ui/gfx/geometry/size.h" + +namespace headless { + +HeadlessBrowserImpl::HeadlessBrowserImpl( + const base::Callback<void(HeadlessBrowser*)>& on_start_callback, + const HeadlessBrowser::Options& options) + : on_start_callback_(on_start_callback), + options_(options), + browser_main_parts_(nullptr) { + DCHECK(!on_start_callback_.is_null()); +} + +HeadlessBrowserImpl::~HeadlessBrowserImpl() {} + +scoped_ptr<HeadlessWebContents> HeadlessBrowserImpl::CreateWebContents( + const gfx::Size& size) { + DCHECK(BrowserMainThread()->BelongsToCurrentThread()); + return make_scoped_ptr(new HeadlessWebContentsImpl( + browser_context(), window_tree_host_->window(), size)); +} + +scoped_refptr<base::SingleThreadTaskRunner> +HeadlessBrowserImpl::BrowserMainThread() const { + return content::BrowserThread::GetMessageLoopProxyForThread( + content::BrowserThread::UI); +} + +void HeadlessBrowserImpl::Shutdown() { + DCHECK(BrowserMainThread()->BelongsToCurrentThread()); + BrowserMainThread()->PostTask(FROM_HERE, + base::MessageLoop::QuitWhenIdleClosure()); +} + +HeadlessBrowserContext* HeadlessBrowserImpl::browser_context() const { + DCHECK(BrowserMainThread()->BelongsToCurrentThread()); + DCHECK(browser_main_parts()); + return browser_main_parts()->browser_context(); +} + +HeadlessBrowserMainParts* HeadlessBrowserImpl::browser_main_parts() const { + DCHECK(BrowserMainThread()->BelongsToCurrentThread()); + return browser_main_parts_; +} + +void HeadlessBrowserImpl::set_browser_main_parts( + HeadlessBrowserMainParts* browser_main_parts) { + DCHECK(!browser_main_parts_); + browser_main_parts_ = browser_main_parts; +} + +void HeadlessBrowserImpl::RunOnStartCallback() { + DCHECK(aura::Env::GetInstance()); + window_tree_host_.reset(aura::WindowTreeHost::Create(gfx::Rect())); + window_tree_host_->InitHost(); + + on_start_callback_.Run(this); + on_start_callback_ = base::Callback<void(HeadlessBrowser*)>(); +} + +int HeadlessBrowserMain( + const HeadlessBrowser::Options& options, + const base::Callback<void(HeadlessBrowser*)>& on_browser_start_callback) { + scoped_ptr<HeadlessBrowserImpl> browser( + new HeadlessBrowserImpl(on_browser_start_callback, options)); + + // TODO(skyostil): Implement custom message pumps. + DCHECK(!options.message_pump); + + headless::HeadlessContentMainDelegate delegate(std::move(browser)); + content::ContentMainParams params(&delegate); + params.argc = options.argc; + params.argv = options.argv; + return content::ContentMain(params); +} + +} // namespace headless
diff --git a/headless/lib/browser/headless_browser_impl.h b/headless/lib/browser/headless_browser_impl.h new file mode 100644 index 0000000..2f276c8 --- /dev/null +++ b/headless/lib/browser/headless_browser_impl.h
@@ -0,0 +1,58 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef HEADLESS_LIB_BROWSER_HEADLESS_BROWSER_IMPL_H_ +#define HEADLESS_LIB_BROWSER_HEADLESS_BROWSER_IMPL_H_ + +#include "headless/public/headless_browser.h" + +#include "base/memory/scoped_ptr.h" +#include "base/synchronization/lock.h" +#include "headless/lib/browser/headless_web_contents_impl.h" + +namespace aura { +class WindowTreeHost; +} + +namespace headless { + +class HeadlessBrowserContext; +class HeadlessBrowserMainParts; + +class HeadlessBrowserImpl : public HeadlessBrowser { + public: + HeadlessBrowserImpl( + const base::Callback<void(HeadlessBrowser*)>& on_start_callback, + const HeadlessBrowser::Options& options); + ~HeadlessBrowserImpl() override; + + // HeadlessBrowser implementation: + scoped_ptr<HeadlessWebContents> CreateWebContents( + const gfx::Size& size) override; + scoped_refptr<base::SingleThreadTaskRunner> BrowserMainThread() + const override; + + void Shutdown() override; + + void set_browser_main_parts(HeadlessBrowserMainParts* browser_main_parts); + HeadlessBrowserMainParts* browser_main_parts() const; + + HeadlessBrowserContext* browser_context() const; + + void RunOnStartCallback(); + + const HeadlessBrowser::Options& options() const { return options_; } + + protected: + base::Callback<void(HeadlessBrowser*)> on_start_callback_; + HeadlessBrowser::Options options_; + HeadlessBrowserMainParts* browser_main_parts_; // Not owned. + scoped_ptr<aura::WindowTreeHost> window_tree_host_; + + DISALLOW_COPY_AND_ASSIGN(HeadlessBrowserImpl); +}; + +} // namespace headless + +#endif // HEADLESS_LIB_BROWSER_HEADLESS_BROWSER_IMPL_H_
diff --git a/headless/lib/browser/headless_browser_main_parts.cc b/headless/lib/browser/headless_browser_main_parts.cc new file mode 100644 index 0000000..c85ba35 --- /dev/null +++ b/headless/lib/browser/headless_browser_main_parts.cc
@@ -0,0 +1,54 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "headless/lib/browser/headless_browser_main_parts.h" + +#include "components/devtools_http_handler/devtools_http_handler.h" +#include "headless/lib/browser/headless_browser_context.h" +#include "headless/lib/browser/headless_browser_impl.h" +#include "headless/lib/browser/headless_devtools.h" +#include "headless/lib/browser/headless_screen.h" +#include "ui/aura/env.h" +#include "ui/gfx/screen.h" + +namespace headless { + +namespace { + +void PlatformInitialize() { + HeadlessScreen* screen = HeadlessScreen::Create(gfx::Size()); + gfx::Screen::SetScreenInstance(screen); +} + +void PlatformExit() { + aura::Env::DeleteInstance(); +} + +} // namespace + +HeadlessBrowserMainParts::HeadlessBrowserMainParts(HeadlessBrowserImpl* browser) + : browser_(browser) {} + +HeadlessBrowserMainParts::~HeadlessBrowserMainParts() {} + +void HeadlessBrowserMainParts::PreMainMessageLoopRun() { + browser_context_.reset(new HeadlessBrowserContext(browser_->options())); + if (browser_->options().devtools_endpoint.address().IsValid()) { + devtools_http_handler_ = + CreateLocalDevToolsHttpHandler(browser_context_.get()); + } + PlatformInitialize(); +} + +void HeadlessBrowserMainParts::PostMainMessageLoopRun() { + browser_context_.reset(); + devtools_http_handler_.reset(); + PlatformExit(); +} + +HeadlessBrowserContext* HeadlessBrowserMainParts::browser_context() const { + return browser_context_.get(); +} + +} // namespace headless
diff --git a/headless/lib/browser/headless_browser_main_parts.h b/headless/lib/browser/headless_browser_main_parts.h new file mode 100644 index 0000000..f666065 --- /dev/null +++ b/headless/lib/browser/headless_browser_main_parts.h
@@ -0,0 +1,42 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef HEADLESS_LIB_BROWSER_HEADLESS_BROWSER_MAIN_PARTS_H_ +#define HEADLESS_LIB_BROWSER_HEADLESS_BROWSER_MAIN_PARTS_H_ + +#include "base/memory/scoped_ptr.h" +#include "content/public/browser/browser_main_parts.h" +#include "headless/public/headless_browser.h" + +namespace devtools_http_handler { +class DevToolsHttpHandler; +} + +namespace headless { + +class HeadlessBrowserContext; +class HeadlessBrowserImpl; + +class HeadlessBrowserMainParts : public content::BrowserMainParts { + public: + explicit HeadlessBrowserMainParts(HeadlessBrowserImpl* browser); + ~HeadlessBrowserMainParts() override; + + // content::BrowserMainParts implementation: + void PreMainMessageLoopRun() override; + void PostMainMessageLoopRun() override; + + HeadlessBrowserContext* browser_context() const; + + private: + HeadlessBrowserImpl* browser_; // Not owned. + scoped_ptr<HeadlessBrowserContext> browser_context_; + scoped_ptr<devtools_http_handler::DevToolsHttpHandler> devtools_http_handler_; + + DISALLOW_COPY_AND_ASSIGN(HeadlessBrowserMainParts); +}; + +} // namespace headless + +#endif // HEADLESS_LIB_BROWSER_HEADLESS_BROWSER_MAIN_PARTS_H_
diff --git a/headless/lib/browser/headless_content_browser_client.cc b/headless/lib/browser/headless_content_browser_client.cc new file mode 100644 index 0000000..fb718af --- /dev/null +++ b/headless/lib/browser/headless_content_browser_client.cc
@@ -0,0 +1,51 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "headless/lib/browser/headless_content_browser_client.h" + +#include "content/public/browser/browser_thread.h" +#include "headless/lib/browser/headless_browser_context.h" +#include "headless/lib/browser/headless_browser_impl.h" +#include "headless/lib/browser/headless_browser_main_parts.h" + +namespace headless { + +HeadlessContentBrowserClient::HeadlessContentBrowserClient( + HeadlessBrowserImpl* browser) + : browser_(browser) {} + +HeadlessContentBrowserClient::~HeadlessContentBrowserClient() {} + +content::BrowserMainParts* HeadlessContentBrowserClient::CreateBrowserMainParts( + const content::MainFunctionParams&) { + scoped_ptr<HeadlessBrowserMainParts> browser_main_parts = + make_scoped_ptr(new HeadlessBrowserMainParts(browser_)); + browser_->set_browser_main_parts(browser_main_parts.get()); + return browser_main_parts.release(); +} + +net::URLRequestContextGetter* +HeadlessContentBrowserClient::CreateRequestContext( + content::BrowserContext* content_browser_context, + content::ProtocolHandlerMap* protocol_handlers, + content::URLRequestInterceptorScopedVector request_interceptors) { + CHECK(content_browser_context == browser_context()); + scoped_refptr<HeadlessURLRequestContextGetter> url_request_context_getter( + new HeadlessURLRequestContextGetter( + false /* ignore_certificate_errors */, browser_context()->GetPath(), + content::BrowserThread::GetMessageLoopProxyForThread( + content::BrowserThread::IO), + content::BrowserThread::GetMessageLoopProxyForThread( + content::BrowserThread::FILE), + protocol_handlers, std::move(request_interceptors), + nullptr /* net_log */, browser_context()->options())); + browser_context()->SetURLRequestContextGetter(url_request_context_getter); + return url_request_context_getter.get(); +} + +HeadlessBrowserContext* HeadlessContentBrowserClient::browser_context() const { + return browser_->browser_context(); +} + +} // namespace headless
diff --git a/headless/lib/browser/headless_content_browser_client.h b/headless/lib/browser/headless_content_browser_client.h new file mode 100644 index 0000000..cf124e1 --- /dev/null +++ b/headless/lib/browser/headless_content_browser_client.h
@@ -0,0 +1,39 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef HEADLESS_LIB_BROWSER_HEADLESS_CONTENT_BROWSER_CLIENT_H_ +#define HEADLESS_LIB_BROWSER_HEADLESS_CONTENT_BROWSER_CLIENT_H_ + +#include "content/public/browser/content_browser_client.h" + +namespace headless { + +class HeadlessBrowserImpl; +class HeadlessBrowserMainParts; +class HeadlessBrowserContext; + +class HeadlessContentBrowserClient : public content::ContentBrowserClient { + public: + explicit HeadlessContentBrowserClient(HeadlessBrowserImpl* browser); + ~HeadlessContentBrowserClient() override; + + // content::ContentBrowserClient implementation: + content::BrowserMainParts* CreateBrowserMainParts( + const content::MainFunctionParams&) override; + net::URLRequestContextGetter* CreateRequestContext( + content::BrowserContext* browser_context, + content::ProtocolHandlerMap* protocol_handlers, + content::URLRequestInterceptorScopedVector request_interceptors) override; + + HeadlessBrowserContext* browser_context() const; + + private: + HeadlessBrowserImpl* browser_; // Not owned. + + DISALLOW_COPY_AND_ASSIGN(HeadlessContentBrowserClient); +}; + +} // namespace headless + +#endif // HEADLESS_LIB_BROWSER_HEADLESS_CONTENT_BROWSER_CLIENT_H_
diff --git a/headless/lib/browser/headless_devtools.cc b/headless/lib/browser/headless_devtools.cc new file mode 100644 index 0000000..8fe4b7d --- /dev/null +++ b/headless/lib/browser/headless_devtools.cc
@@ -0,0 +1,102 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "headless/lib/browser/headless_devtools.h" + +#include "base/files/file_path.h" +#include "components/devtools_http_handler/devtools_http_handler.h" +#include "components/devtools_http_handler/devtools_http_handler_delegate.h" +#include "content/public/browser/browser_context.h" +#include "content/public/browser/devtools_frontend_host.h" +#include "content/public/browser/navigation_entry.h" +#include "headless/lib/browser/headless_browser_context.h" +#include "net/base/net_errors.h" +#include "net/socket/tcp_server_socket.h" +#include "ui/base/resource/resource_bundle.h" + +using devtools_http_handler::DevToolsHttpHandler; + +namespace headless { + +namespace { + +const int kBackLog = 10; + +class TCPServerSocketFactory : public DevToolsHttpHandler::ServerSocketFactory { + public: + TCPServerSocketFactory(const net::IPEndPoint& endpoint) + : endpoint_(endpoint) { + DCHECK(endpoint_.address().IsValid()); + } + + private: + // DevToolsHttpHandler::ServerSocketFactory implementation: + scoped_ptr<net::ServerSocket> CreateForHttpServer() override { + scoped_ptr<net::ServerSocket> socket( + new net::TCPServerSocket(nullptr, net::NetLog::Source())); + if (socket->Listen(endpoint_, kBackLog) != net::OK) + return scoped_ptr<net::ServerSocket>(); + + return socket; + } + + net::IPEndPoint endpoint_; + + DISALLOW_COPY_AND_ASSIGN(TCPServerSocketFactory); +}; + +class HeadlessDevToolsDelegate + : public devtools_http_handler::DevToolsHttpHandlerDelegate { + public: + HeadlessDevToolsDelegate(); + ~HeadlessDevToolsDelegate() override; + + // devtools_http_handler::DevToolsHttpHandlerDelegate implementation: + std::string GetDiscoveryPageHTML() override; + std::string GetFrontendResource(const std::string& path) override; + std::string GetPageThumbnailData(const GURL& url) override; + content::DevToolsExternalAgentProxyDelegate* HandleWebSocketConnection( + const std::string& path) override; + + private: + DISALLOW_COPY_AND_ASSIGN(HeadlessDevToolsDelegate); +}; + +HeadlessDevToolsDelegate::HeadlessDevToolsDelegate() {} + +HeadlessDevToolsDelegate::~HeadlessDevToolsDelegate() {} + +std::string HeadlessDevToolsDelegate::GetDiscoveryPageHTML() { + return std::string(); +} + +std::string HeadlessDevToolsDelegate::GetFrontendResource( + const std::string& path) { + return content::DevToolsFrontendHost::GetFrontendResource(path).as_string(); +} + +std::string HeadlessDevToolsDelegate::GetPageThumbnailData(const GURL& url) { + return std::string(); +} + +content::DevToolsExternalAgentProxyDelegate* +HeadlessDevToolsDelegate::HandleWebSocketConnection(const std::string& path) { + return nullptr; +} + +} // namespace + +scoped_ptr<DevToolsHttpHandler> CreateLocalDevToolsHttpHandler( + HeadlessBrowserContext* browser_context) { + const net::IPEndPoint& endpoint = + browser_context->options().devtools_endpoint; + scoped_ptr<DevToolsHttpHandler::ServerSocketFactory> socket_factory( + new TCPServerSocketFactory(endpoint)); + return make_scoped_ptr(new DevToolsHttpHandler( + std::move(socket_factory), std::string(), new HeadlessDevToolsDelegate(), + browser_context->GetPath(), base::FilePath(), std::string(), + browser_context->options().user_agent)); +} + +} // namespace headless
diff --git a/headless/lib/browser/headless_devtools.h b/headless/lib/browser/headless_devtools.h new file mode 100644 index 0000000..96f63334 --- /dev/null +++ b/headless/lib/browser/headless_devtools.h
@@ -0,0 +1,24 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef HEADLESS_LIB_BROWSER_HEADLESS_DEVTOOLS_H_ +#define HEADLESS_LIB_BROWSER_HEADLESS_DEVTOOLS_H_ + +#include "base/memory/scoped_ptr.h" + +namespace devtools_http_handler { +class DevToolsHttpHandler; +} + +namespace headless { +class HeadlessBrowserContext; + +// Starts a DevTools HTTP handler on the loopback interface on the port +// configured by HeadlessBrowser::Options. +scoped_ptr<devtools_http_handler::DevToolsHttpHandler> +CreateLocalDevToolsHttpHandler(HeadlessBrowserContext* browser_context); + +} // namespace content + +#endif // HEADLESS_LIB_BROWSER_HEADLESS_DEVTOOLS_H_
diff --git a/headless/lib/browser/headless_screen.cc b/headless/lib/browser/headless_screen.cc new file mode 100644 index 0000000..6d6f607 --- /dev/null +++ b/headless/lib/browser/headless_screen.cc
@@ -0,0 +1,174 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "headless/lib/browser/headless_screen.h" + +#include <stdint.h> + +#include "base/logging.h" +#include "ui/aura/env.h" +#include "ui/aura/window.h" +#include "ui/aura/window_event_dispatcher.h" +#include "ui/aura/window_tree_host.h" +#include "ui/base/ime/input_method.h" +#include "ui/gfx/geometry/rect_conversions.h" +#include "ui/gfx/geometry/size_conversions.h" +#include "ui/gfx/native_widget_types.h" +#include "ui/gfx/screen.h" + +namespace headless { + +namespace { + +bool IsRotationPortrait(gfx::Display::Rotation rotation) { + return rotation == gfx::Display::ROTATE_90 || + rotation == gfx::Display::ROTATE_270; +} + +} // namespace + +// static +HeadlessScreen* HeadlessScreen::Create(const gfx::Size& size) { + const gfx::Size kDefaultSize(800, 600); + return new HeadlessScreen(gfx::Rect(size.IsEmpty() ? kDefaultSize : size)); +} + +HeadlessScreen::~HeadlessScreen() {} + +aura::WindowTreeHost* HeadlessScreen::CreateHostForPrimaryDisplay() { + DCHECK(!host_); + host_ = aura::WindowTreeHost::Create(gfx::Rect(display_.GetSizeInPixel())); + // Some tests don't correctly manage window focus/activation states. + // Makes sure InputMethod is default focused so that IME basics can work. + host_->GetInputMethod()->OnFocus(); + host_->window()->AddObserver(this); + host_->InitHost(); + return host_; +} + +void HeadlessScreen::SetDeviceScaleFactor(float device_scale_factor) { + gfx::Rect bounds_in_pixel(display_.GetSizeInPixel()); + display_.SetScaleAndBounds(device_scale_factor, bounds_in_pixel); +} + +void HeadlessScreen::SetDisplayRotation(gfx::Display::Rotation rotation) { + gfx::Rect bounds_in_pixel(display_.GetSizeInPixel()); + gfx::Rect new_bounds(bounds_in_pixel); + if (IsRotationPortrait(rotation) != IsRotationPortrait(display_.rotation())) { + new_bounds.set_width(bounds_in_pixel.height()); + new_bounds.set_height(bounds_in_pixel.width()); + } + display_.set_rotation(rotation); + display_.SetScaleAndBounds(display_.device_scale_factor(), new_bounds); + host_->SetRootTransform(GetRotationTransform() * GetUIScaleTransform()); +} + +void HeadlessScreen::SetUIScale(float ui_scale) { + ui_scale_ = ui_scale; + gfx::Rect bounds_in_pixel(display_.GetSizeInPixel()); + gfx::Rect new_bounds = gfx::ToNearestRect( + gfx::ScaleRect(gfx::RectF(bounds_in_pixel), 1.0f / ui_scale)); + display_.SetScaleAndBounds(display_.device_scale_factor(), new_bounds); + host_->SetRootTransform(GetRotationTransform() * GetUIScaleTransform()); +} + +void HeadlessScreen::SetWorkAreaInsets(const gfx::Insets& insets) { + display_.UpdateWorkAreaFromInsets(insets); +} + +gfx::Transform HeadlessScreen::GetRotationTransform() const { + gfx::Transform rotate; + switch (display_.rotation()) { + case gfx::Display::ROTATE_0: + break; + case gfx::Display::ROTATE_90: + rotate.Translate(display_.bounds().height(), 0); + rotate.Rotate(90); + break; + case gfx::Display::ROTATE_270: + rotate.Translate(0, display_.bounds().width()); + rotate.Rotate(270); + break; + case gfx::Display::ROTATE_180: + rotate.Translate(display_.bounds().width(), display_.bounds().height()); + rotate.Rotate(180); + break; + } + + return rotate; +} + +gfx::Transform HeadlessScreen::GetUIScaleTransform() const { + gfx::Transform ui_scale; + ui_scale.Scale(1.0f / ui_scale_, 1.0f / ui_scale_); + return ui_scale; +} + +void HeadlessScreen::OnWindowBoundsChanged(aura::Window* window, + const gfx::Rect& old_bounds, + const gfx::Rect& new_bounds) { + DCHECK_EQ(host_->window(), window); + display_.SetSize(gfx::ScaleToFlooredSize(new_bounds.size(), + display_.device_scale_factor())); +} + +void HeadlessScreen::OnWindowDestroying(aura::Window* window) { + if (host_->window() == window) + host_ = NULL; +} + +gfx::Point HeadlessScreen::GetCursorScreenPoint() { + return aura::Env::GetInstance()->last_mouse_location(); +} + +gfx::NativeWindow HeadlessScreen::GetWindowUnderCursor() { + return GetWindowAtScreenPoint(GetCursorScreenPoint()); +} + +gfx::NativeWindow HeadlessScreen::GetWindowAtScreenPoint( + const gfx::Point& point) { + if (!host_ || !host_->window()) + return nullptr; + return host_->window()->GetTopWindowContainingPoint(point); +} + +int HeadlessScreen::GetNumDisplays() const { + return 1; +} + +std::vector<gfx::Display> HeadlessScreen::GetAllDisplays() const { + return std::vector<gfx::Display>(1, display_); +} + +gfx::Display HeadlessScreen::GetDisplayNearestWindow( + gfx::NativeWindow window) const { + return display_; +} + +gfx::Display HeadlessScreen::GetDisplayNearestPoint( + const gfx::Point& point) const { + return display_; +} + +gfx::Display HeadlessScreen::GetDisplayMatching( + const gfx::Rect& match_rect) const { + return display_; +} + +gfx::Display HeadlessScreen::GetPrimaryDisplay() const { + return display_; +} + +void HeadlessScreen::AddObserver(gfx::DisplayObserver* observer) {} + +void HeadlessScreen::RemoveObserver(gfx::DisplayObserver* observer) {} + +HeadlessScreen::HeadlessScreen(const gfx::Rect& screen_bounds) + : host_(NULL), ui_scale_(1.0f) { + static int64_t synthesized_display_id = 2000; + display_.set_id(synthesized_display_id++); + display_.SetScaleAndBounds(1.0f, screen_bounds); +} + +} // namespace headless
diff --git a/headless/lib/browser/headless_screen.h b/headless/lib/browser/headless_screen.h new file mode 100644 index 0000000..c6b6b3b --- /dev/null +++ b/headless/lib/browser/headless_screen.h
@@ -0,0 +1,76 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef HEADLESS_LIB_BROWSER_HEADLESS_SCREEN_H_ +#define HEADLESS_LIB_BROWSER_HEADLESS_SCREEN_H_ + +#include "base/compiler_specific.h" +#include "base/macros.h" +#include "ui/aura/window_observer.h" +#include "ui/gfx/display.h" +#include "ui/gfx/screen.h" + +namespace gfx { +class Insets; +class Rect; +class Transform; +} + +namespace aura { +class Window; +class WindowTreeHost; +} + +namespace headless { + +class HeadlessScreen : public gfx::Screen, public aura::WindowObserver { + public: + // Creates a gfx::Screen of the specified size. If no size is specified, then + // creates a 800x600 screen. |size| is in physical pixels. + static HeadlessScreen* Create(const gfx::Size& size); + ~HeadlessScreen() override; + + aura::WindowTreeHost* CreateHostForPrimaryDisplay(); + + void SetDeviceScaleFactor(float device_scale_fator); + void SetDisplayRotation(gfx::Display::Rotation rotation); + void SetUIScale(float ui_scale); + void SetWorkAreaInsets(const gfx::Insets& insets); + + protected: + gfx::Transform GetRotationTransform() const; + gfx::Transform GetUIScaleTransform() const; + + // WindowObserver overrides: + void OnWindowBoundsChanged(aura::Window* window, + const gfx::Rect& old_bounds, + const gfx::Rect& new_bounds) override; + void OnWindowDestroying(aura::Window* window) override; + + // gfx::Screen overrides: + gfx::Point GetCursorScreenPoint() override; + gfx::NativeWindow GetWindowUnderCursor() override; + gfx::NativeWindow GetWindowAtScreenPoint(const gfx::Point& point) override; + int GetNumDisplays() const override; + std::vector<gfx::Display> GetAllDisplays() const override; + gfx::Display GetDisplayNearestWindow(gfx::NativeView view) const override; + gfx::Display GetDisplayNearestPoint(const gfx::Point& point) const override; + gfx::Display GetDisplayMatching(const gfx::Rect& match_rect) const override; + gfx::Display GetPrimaryDisplay() const override; + void AddObserver(gfx::DisplayObserver* observer) override; + void RemoveObserver(gfx::DisplayObserver* observer) override; + + private: + explicit HeadlessScreen(const gfx::Rect& screen_bounds); + + aura::WindowTreeHost* host_; + gfx::Display display_; + float ui_scale_; + + DISALLOW_COPY_AND_ASSIGN(HeadlessScreen); +}; + +} // namespace headless + +#endif // HEADLESS_LIB_BROWSER_HEADLESS_SCREEN_H_
diff --git a/headless/lib/browser/headless_url_request_context_getter.cc b/headless/lib/browser/headless_url_request_context_getter.cc new file mode 100644 index 0000000..4e8a1954 --- /dev/null +++ b/headless/lib/browser/headless_url_request_context_getter.cc
@@ -0,0 +1,221 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "headless/lib/browser/headless_url_request_context_getter.h" + +#include "base/command_line.h" +#include "base/memory/scoped_ptr.h" +#include "base/single_thread_task_runner.h" +#include "base/threading/worker_pool.h" +#include "content/public/browser/browser_thread.h" +#include "content/public/browser/cookie_store_factory.h" +#include "content/public/common/content_switches.h" +#include "net/cert/cert_verifier.h" +#include "net/dns/host_resolver.h" +#include "net/dns/mapped_host_resolver.h" +#include "net/http/http_auth_handler_factory.h" +#include "net/http/http_cache.h" +#include "net/http/http_network_session.h" +#include "net/http/http_server_properties_impl.h" +#include "net/http/transport_security_state.h" +#include "net/proxy/proxy_service.h" +#include "net/ssl/channel_id_service.h" +#include "net/ssl/default_channel_id_store.h" +#include "net/ssl/ssl_config_service_defaults.h" +#include "net/url_request/data_protocol_handler.h" +#include "net/url_request/file_protocol_handler.h" +#include "net/url_request/static_http_user_agent_settings.h" +#include "net/url_request/url_request_context.h" +#include "net/url_request/url_request_context_storage.h" +#include "net/url_request/url_request_intercepting_job_factory.h" +#include "net/url_request/url_request_job_factory_impl.h" + +namespace headless { + +namespace { + +void InstallProtocolHandlers(net::URLRequestJobFactoryImpl* job_factory, + content::ProtocolHandlerMap* protocol_handlers) { + for (content::ProtocolHandlerMap::iterator it = protocol_handlers->begin(); + it != protocol_handlers->end(); ++it) { + bool set_protocol = job_factory->SetProtocolHandler( + it->first, make_scoped_ptr(it->second.release())); + DCHECK(set_protocol); + } + protocol_handlers->clear(); +} + +} // namespace + +HeadlessURLRequestContextGetter::HeadlessURLRequestContextGetter( + bool ignore_certificate_errors, + const base::FilePath& base_path, + scoped_refptr<base::SingleThreadTaskRunner> io_task_runner, + scoped_refptr<base::SingleThreadTaskRunner> file_task_runner, + content::ProtocolHandlerMap* protocol_handlers, + content::URLRequestInterceptorScopedVector request_interceptors, + net::NetLog* net_log, + const HeadlessBrowser::Options& options) + : ignore_certificate_errors_(ignore_certificate_errors), + base_path_(base_path), + io_task_runner_(std::move(io_task_runner)), + file_task_runner_(std::move(file_task_runner)), + net_log_(net_log), + options_(options), + request_interceptors_(std::move(request_interceptors)) { + // Must first be created on the UI thread. + DCHECK_CURRENTLY_ON(content::BrowserThread::UI); + + std::swap(protocol_handlers_, *protocol_handlers); + + // We must create the proxy config service on the UI loop on Linux because it + // must synchronously run on the glib message loop. This will be passed to + // the URLRequestContextStorage on the IO thread in GetURLRequestContext(). + proxy_config_service_ = GetProxyConfigService(); +} + +HeadlessURLRequestContextGetter::~HeadlessURLRequestContextGetter() {} + +scoped_ptr<net::NetworkDelegate> +HeadlessURLRequestContextGetter::CreateNetworkDelegate() { + return nullptr; +} + +scoped_ptr<net::ProxyConfigService> +HeadlessURLRequestContextGetter::GetProxyConfigService() { + return net::ProxyService::CreateSystemProxyConfigService(io_task_runner_, + file_task_runner_); +} + +scoped_ptr<net::ProxyService> +HeadlessURLRequestContextGetter::GetProxyService() { + return net::ProxyService::CreateUsingSystemProxyResolver( + std::move(proxy_config_service_), 0, url_request_context_->net_log()); +} + +net::URLRequestContext* +HeadlessURLRequestContextGetter::GetURLRequestContext() { + DCHECK_CURRENTLY_ON(content::BrowserThread::IO); + + if (!url_request_context_) { + const base::CommandLine& command_line = + *base::CommandLine::ForCurrentProcess(); + + url_request_context_.reset(new net::URLRequestContext()); + url_request_context_->set_net_log(net_log_); + network_delegate_ = CreateNetworkDelegate(); + url_request_context_->set_network_delegate(network_delegate_.get()); + storage_.reset( + new net::URLRequestContextStorage(url_request_context_.get())); + storage_->set_cookie_store( + content::CreateCookieStore(content::CookieStoreConfig())); + storage_->set_channel_id_service(make_scoped_ptr( + new net::ChannelIDService(new net::DefaultChannelIDStore(nullptr), + base::WorkerPool::GetTaskRunner(true)))); + // TODO(skyostil): Make language settings configurable. + storage_->set_http_user_agent_settings(make_scoped_ptr( + new net::StaticHttpUserAgentSettings("en-us,en", options_.user_agent))); + + scoped_ptr<net::HostResolver> host_resolver( + net::HostResolver::CreateDefaultResolver( + url_request_context_->net_log())); + + storage_->set_cert_verifier(net::CertVerifier::CreateDefault()); + storage_->set_transport_security_state( + make_scoped_ptr(new net::TransportSecurityState)); + storage_->set_proxy_service(GetProxyService()); + storage_->set_ssl_config_service(new net::SSLConfigServiceDefaults); + storage_->set_http_auth_handler_factory( + net::HttpAuthHandlerFactory::CreateDefault(host_resolver.get())); + storage_->set_http_server_properties( + make_scoped_ptr(new net::HttpServerPropertiesImpl())); + + base::FilePath cache_path = base_path_.Append(FILE_PATH_LITERAL("Cache")); + scoped_ptr<net::HttpCache::DefaultBackend> main_backend( + new net::HttpCache::DefaultBackend( + net::DISK_CACHE, net::CACHE_BACKEND_DEFAULT, cache_path, 0, + content::BrowserThread::GetMessageLoopProxyForThread( + content::BrowserThread::CACHE))); + + net::HttpNetworkSession::Params network_session_params; + network_session_params.cert_verifier = + url_request_context_->cert_verifier(); + network_session_params.transport_security_state = + url_request_context_->transport_security_state(); + network_session_params.channel_id_service = + url_request_context_->channel_id_service(); + network_session_params.proxy_service = + url_request_context_->proxy_service(); + network_session_params.ssl_config_service = + url_request_context_->ssl_config_service(); + network_session_params.http_auth_handler_factory = + url_request_context_->http_auth_handler_factory(); + network_session_params.network_delegate = network_delegate_.get(); + network_session_params.http_server_properties = + url_request_context_->http_server_properties(); + network_session_params.net_log = url_request_context_->net_log(); + network_session_params.ignore_certificate_errors = + ignore_certificate_errors_; + if (command_line.HasSwitch(switches::kHostResolverRules)) { + scoped_ptr<net::MappedHostResolver> mapped_host_resolver( + new net::MappedHostResolver(std::move(host_resolver))); + mapped_host_resolver->SetRulesFromString( + command_line.GetSwitchValueASCII(switches::kHostResolverRules)); + host_resolver = std::move(mapped_host_resolver); + } + + // Give |storage_| ownership at the end in case it's |mapped_host_resolver|. + storage_->set_host_resolver(std::move(host_resolver)); + network_session_params.host_resolver = + url_request_context_->host_resolver(); + + storage_->set_http_network_session( + make_scoped_ptr(new net::HttpNetworkSession(network_session_params))); + storage_->set_http_transaction_factory(make_scoped_ptr(new net::HttpCache( + storage_->http_network_session(), std::move(main_backend), + true /* set_up_quic_server_info */))); + + scoped_ptr<net::URLRequestJobFactoryImpl> job_factory( + new net::URLRequestJobFactoryImpl()); + + InstallProtocolHandlers(job_factory.get(), &protocol_handlers_); + bool set_protocol = job_factory->SetProtocolHandler( + url::kDataScheme, make_scoped_ptr(new net::DataProtocolHandler)); + DCHECK(set_protocol); + set_protocol = job_factory->SetProtocolHandler( + url::kFileScheme, + make_scoped_ptr(new net::FileProtocolHandler( + content::BrowserThread::GetBlockingPool() + ->GetTaskRunnerWithShutdownBehavior( + base::SequencedWorkerPool::SKIP_ON_SHUTDOWN)))); + DCHECK(set_protocol); + + // Set up interceptors in the reverse order so that the last inceptor is at + // the end of the linked list of job factories. + scoped_ptr<net::URLRequestJobFactory> top_job_factory = + std::move(job_factory); + for (auto i = request_interceptors_.rbegin(); + i != request_interceptors_.rend(); ++i) { + top_job_factory.reset(new net::URLRequestInterceptingJobFactory( + std::move(top_job_factory), make_scoped_ptr(*i))); + } + request_interceptors_.weak_clear(); + // Save the head of the job factory list at storage_. + storage_->set_job_factory(std::move(top_job_factory)); + } + + return url_request_context_.get(); +} + +scoped_refptr<base::SingleThreadTaskRunner> +HeadlessURLRequestContextGetter::GetNetworkTaskRunner() const { + return content::BrowserThread::GetMessageLoopProxyForThread( + content::BrowserThread::IO); +} + +net::HostResolver* HeadlessURLRequestContextGetter::host_resolver() const { + return url_request_context_->host_resolver(); +} + +} // namespace headless
diff --git a/headless/lib/browser/headless_url_request_context_getter.h b/headless/lib/browser/headless_url_request_context_getter.h new file mode 100644 index 0000000..cfd927b --- /dev/null +++ b/headless/lib/browser/headless_url_request_context_getter.h
@@ -0,0 +1,81 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef HEADLESS_LIB_BROWSER_HEADLESS_URL_REQUEST_CONTEXT_GETTER_H_ +#define HEADLESS_LIB_BROWSER_HEADLESS_URL_REQUEST_CONTEXT_GETTER_H_ + +#include "base/compiler_specific.h" +#include "base/files/file_path.h" +#include "base/macros.h" +#include "base/memory/ref_counted.h" +#include "base/memory/scoped_ptr.h" +#include "content/public/browser/content_browser_client.h" +#include "headless/public/headless_browser.h" +#include "net/proxy/proxy_config_service.h" +#include "net/url_request/url_request_context_getter.h" +#include "net/url_request/url_request_job_factory.h" + +namespace base { +class MessageLoop; +} + +namespace net { +class HostResolver; +class MappedHostResolver; +class NetworkDelegate; +class NetLog; +class ProxyConfigService; +class ProxyService; +class URLRequestContextStorage; +} + +namespace headless { + +class HeadlessURLRequestContextGetter : public net::URLRequestContextGetter { + public: + HeadlessURLRequestContextGetter( + bool ignore_certificate_errors, + const base::FilePath& base_path, + scoped_refptr<base::SingleThreadTaskRunner> io_task_runner, + scoped_refptr<base::SingleThreadTaskRunner> file_task_runner, + content::ProtocolHandlerMap* protocol_handlers, + content::URLRequestInterceptorScopedVector request_interceptors, + net::NetLog* net_log, + const HeadlessBrowser::Options& options); + + // net::URLRequestContextGetter implementation: + net::URLRequestContext* GetURLRequestContext() override; + scoped_refptr<base::SingleThreadTaskRunner> GetNetworkTaskRunner() + const override; + + net::HostResolver* host_resolver() const; + + protected: + ~HeadlessURLRequestContextGetter() override; + + scoped_ptr<net::NetworkDelegate> CreateNetworkDelegate(); + scoped_ptr<net::ProxyConfigService> GetProxyConfigService(); + scoped_ptr<net::ProxyService> GetProxyService(); + + private: + bool ignore_certificate_errors_; + base::FilePath base_path_; + scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_; + scoped_refptr<base::SingleThreadTaskRunner> file_task_runner_; + net::NetLog* net_log_; + HeadlessBrowser::Options options_; + + scoped_ptr<net::ProxyConfigService> proxy_config_service_; + scoped_ptr<net::NetworkDelegate> network_delegate_; + scoped_ptr<net::URLRequestContextStorage> storage_; + scoped_ptr<net::URLRequestContext> url_request_context_; + content::ProtocolHandlerMap protocol_handlers_; + content::URLRequestInterceptorScopedVector request_interceptors_; + + DISALLOW_COPY_AND_ASSIGN(HeadlessURLRequestContextGetter); +}; + +} // namespace headless + +#endif // HEADLESS_LIB_BROWSER_HEADLESS_URL_REQUEST_CONTEXT_GETTER_H_
diff --git a/headless/lib/browser/headless_web_contents_impl.cc b/headless/lib/browser/headless_web_contents_impl.cc new file mode 100644 index 0000000..869b2b1 --- /dev/null +++ b/headless/lib/browser/headless_web_contents_impl.cc
@@ -0,0 +1,104 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "headless/lib/browser/headless_web_contents_impl.h" + +#include "base/bind.h" +#include "base/memory/weak_ptr.h" +#include "base/trace_event/trace_event.h" +#include "content/public/browser/render_frame_host.h" +#include "content/public/browser/render_process_host.h" +#include "content/public/browser/render_view_host.h" +#include "content/public/browser/render_widget_host_view.h" +#include "content/public/browser/web_contents.h" +#include "content/public/browser/web_contents_delegate.h" +#include "content/public/browser/web_contents_observer.h" +#include "content/public/common/bindings_policy.h" +#include "content/public/common/service_registry.h" +#include "content/public/renderer/render_frame.h" +#include "ui/aura/window.h" + +namespace headless { + +class WebContentsObserverAdapter : public content::WebContentsObserver { + public: + WebContentsObserverAdapter(content::WebContents* web_contents, + HeadlessWebContents::Observer* observer) + : content::WebContentsObserver(web_contents), observer_(observer) {} + + ~WebContentsObserverAdapter() override {} + + void DocumentOnLoadCompletedInMainFrame() override { + observer_->DocumentOnLoadCompletedInMainFrame(); + } + + private: + HeadlessWebContents::Observer* observer_; // Not owned. + + DISALLOW_COPY_AND_ASSIGN(WebContentsObserverAdapter); +}; + +class HeadlessWebContentsImpl::Delegate : public content::WebContentsDelegate { + public: + Delegate() {} + + private: + DISALLOW_COPY_AND_ASSIGN(Delegate); +}; + +HeadlessWebContentsImpl::HeadlessWebContentsImpl( + content::BrowserContext* browser_context, + aura::Window* parent_window, + const gfx::Size& initial_size) + : web_contents_delegate_(new HeadlessWebContentsImpl::Delegate()) { + content::WebContents::CreateParams create_params(browser_context, nullptr); + create_params.initial_size = initial_size; + + web_contents_.reset(content::WebContents::Create(create_params)); + web_contents_->SetDelegate(web_contents_delegate_.get()); + + aura::Window* contents = web_contents_->GetNativeView(); + DCHECK(!parent_window->Contains(contents)); + parent_window->AddChild(contents); + contents->Show(); + + contents->SetBounds(gfx::Rect(initial_size)); + content::RenderWidgetHostView* host_view = + web_contents_->GetRenderWidgetHostView(); + if (host_view) + host_view->SetSize(initial_size); +} + +HeadlessWebContentsImpl::~HeadlessWebContentsImpl() { + web_contents_->Close(); +} + +bool HeadlessWebContentsImpl::OpenURL(const GURL& url) { + if (!url.is_valid()) + return false; + content::NavigationController::LoadURLParams params(url); + params.transition_type = ui::PageTransitionFromInt( + ui::PAGE_TRANSITION_TYPED | ui::PAGE_TRANSITION_FROM_ADDRESS_BAR); + web_contents_->GetController().LoadURLWithParams(params); + web_contents_->Focus(); + return true; +} + +void HeadlessWebContentsImpl::AddObserver(Observer* observer) { + DCHECK(observer_map_.find(observer) == observer_map_.end()); + observer_map_[observer] = make_scoped_ptr( + new WebContentsObserverAdapter(web_contents_.get(), observer)); +} + +void HeadlessWebContentsImpl::RemoveObserver(Observer* observer) { + ObserverMap::iterator it = observer_map_.find(observer); + DCHECK(it != observer_map_.end()); + observer_map_.erase(it); +} + +content::WebContents* HeadlessWebContentsImpl::web_contents() const { + return web_contents_.get(); +} + +} // namespace headless
diff --git a/headless/lib/browser/headless_web_contents_impl.h b/headless/lib/browser/headless_web_contents_impl.h new file mode 100644 index 0000000..b272bfe --- /dev/null +++ b/headless/lib/browser/headless_web_contents_impl.h
@@ -0,0 +1,60 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef HEADLESS_LIB_BROWSER_HEADLESS_WEB_CONTENTS_IMPL_H_ +#define HEADLESS_LIB_BROWSER_HEADLESS_WEB_CONTENTS_IMPL_H_ + +#include "headless/public/headless_web_contents.h" + +#include <unordered_map> + +namespace aura { +class Window; +} + +namespace content { +class WebContents; +class BrowserContext; +} + +namespace gfx { +class Size; +} + +namespace headless { +class WebContentsObserverAdapter; + +class HeadlessWebContentsImpl : public HeadlessWebContents { + public: + ~HeadlessWebContentsImpl() override; + + // HeadlessWebContents implementation: + bool OpenURL(const GURL& url) override; + void AddObserver(Observer* observer) override; + void RemoveObserver(Observer* observer) override; + + content::WebContents* web_contents() const; + + private: + friend class HeadlessBrowserImpl; + + HeadlessWebContentsImpl(content::BrowserContext* context, + aura::Window* parent_window, + const gfx::Size& initial_size); + + class Delegate; + scoped_ptr<Delegate> web_contents_delegate_; + scoped_ptr<content::WebContents> web_contents_; + + using ObserverMap = + std::unordered_map<HeadlessWebContents::Observer*, + scoped_ptr<WebContentsObserverAdapter>>; + ObserverMap observer_map_; + + DISALLOW_COPY_AND_ASSIGN(HeadlessWebContentsImpl); +}; + +} // namespace headless + +#endif // HEADLESS_LIB_BROWSER_HEADLESS_WEB_CONTENTS_IMPL_H_
diff --git a/headless/lib/headless_browser_browsertest.cc b/headless/lib/headless_browser_browsertest.cc new file mode 100644 index 0000000..ffcd39b --- /dev/null +++ b/headless/lib/headless_browser_browsertest.cc
@@ -0,0 +1,22 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "content/public/test/browser_test.h" +#include "headless/public/headless_browser.h" +#include "headless/public/headless_web_contents.h" +#include "headless/test/headless_browser_test.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "ui/gfx/geometry/size.h" + +namespace headless { + +IN_PROC_BROWSER_TEST_F(HeadlessBrowserTest, CreateAndDestroyWebContents) { + scoped_ptr<HeadlessWebContents> web_contents = + browser()->CreateWebContents(gfx::Size(800, 600)); + EXPECT_TRUE(web_contents); + // TODO(skyostil): Verify viewport dimensions once we can. + web_contents.reset(); +} + +} // namespace headless
diff --git a/headless/lib/headless_content_client.cc b/headless/lib/headless_content_client.cc new file mode 100644 index 0000000..f6c96e5e --- /dev/null +++ b/headless/lib/headless_content_client.cc
@@ -0,0 +1,42 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "headless/lib/headless_content_client.h" + +#include "ui/base/l10n/l10n_util.h" +#include "ui/base/resource/resource_bundle.h" + +namespace headless { + +HeadlessContentClient::HeadlessContentClient( + const HeadlessBrowser::Options& options) + : options_(options) {} + +HeadlessContentClient::~HeadlessContentClient() {} + +std::string HeadlessContentClient::GetUserAgent() const { + return options_.user_agent; +} + +base::string16 HeadlessContentClient::GetLocalizedString(int message_id) const { + return l10n_util::GetStringUTF16(message_id); +} + +base::StringPiece HeadlessContentClient::GetDataResource( + int resource_id, + ui::ScaleFactor scale_factor) const { + return ResourceBundle::GetSharedInstance().GetRawDataResourceForScale( + resource_id, scale_factor); +} + +base::RefCountedStaticMemory* HeadlessContentClient::GetDataResourceBytes( + int resource_id) const { + return ResourceBundle::GetSharedInstance().LoadDataResourceBytes(resource_id); +} + +gfx::Image& HeadlessContentClient::GetNativeImageNamed(int resource_id) const { + return ResourceBundle::GetSharedInstance().GetNativeImageNamed(resource_id); +} + +} // namespace headless
diff --git a/headless/lib/headless_content_client.h b/headless/lib/headless_content_client.h new file mode 100644 index 0000000..2fc8163 --- /dev/null +++ b/headless/lib/headless_content_client.h
@@ -0,0 +1,36 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef HEADLESS_LIB_HEADLESS_CONTENT_CLIENT_H_ +#define HEADLESS_LIB_HEADLESS_CONTENT_CLIENT_H_ + +#include "content/public/common/content_client.h" +#include "headless/public/headless_browser.h" + +namespace headless { + +class HeadlessContentClient : public content::ContentClient { + public: + explicit HeadlessContentClient(const HeadlessBrowser::Options& options); + ~HeadlessContentClient() override; + + // content::ContentClient implementation: + std::string GetUserAgent() const override; + base::string16 GetLocalizedString(int message_id) const override; + base::StringPiece GetDataResource( + int resource_id, + ui::ScaleFactor scale_factor) const override; + base::RefCountedStaticMemory* GetDataResourceBytes( + int resource_id) const override; + gfx::Image& GetNativeImageNamed(int resource_id) const override; + + private: + HeadlessBrowser::Options options_; + + DISALLOW_COPY_AND_ASSIGN(HeadlessContentClient); +}; + +} // namespace headless + +#endif // HEADLESS_LIB_HEADLESS_CONTENT_CLIENT_H_
diff --git a/headless/lib/headless_content_main_delegate.cc b/headless/lib/headless_content_main_delegate.cc new file mode 100644 index 0000000..64e91c0 --- /dev/null +++ b/headless/lib/headless_content_main_delegate.cc
@@ -0,0 +1,124 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "headless/lib/headless_content_main_delegate.h" + +#include "base/command_line.h" +#include "base/path_service.h" +#include "base/run_loop.h" +#include "base/trace_event/trace_event.h" +#include "content/public/browser/browser_main_runner.h" +#include "content/public/common/content_switches.h" +#include "headless/lib/browser/headless_browser_impl.h" +#include "headless/lib/browser/headless_content_browser_client.h" +#include "headless/lib/renderer/headless_content_renderer_client.h" +#include "headless/lib/utility/headless_content_utility_client.h" +#include "ui/base/resource/resource_bundle.h" +#include "ui/ozone/public/ozone_switches.h" + +namespace headless { +namespace { +// Keep in sync with content/common/content_constants_internal.h. +// TODO(skyostil): Add a tracing test for this. +const int kTraceEventBrowserProcessSortIndex = -6; + +HeadlessContentMainDelegate* g_current_headless_content_main_delegate = nullptr; +} // namespace + +HeadlessContentMainDelegate::HeadlessContentMainDelegate( + scoped_ptr<HeadlessBrowserImpl> browser) + : content_client_(browser->options()), browser_(std::move(browser)) { + DCHECK(!g_current_headless_content_main_delegate); + g_current_headless_content_main_delegate = this; +} + +HeadlessContentMainDelegate::~HeadlessContentMainDelegate() { + DCHECK(g_current_headless_content_main_delegate == this); + g_current_headless_content_main_delegate = nullptr; +} + +bool HeadlessContentMainDelegate::BasicStartupComplete(int* exit_code) { + base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); + + command_line->AppendSwitch(switches::kNoSandbox); + command_line->AppendSwitch(switches::kSingleProcess); + + // The headless backend is automatically chosen for a headless build, but also + // adding it here allows us to run in a non-headless build too. + command_line->AppendSwitchASCII(switches::kOzonePlatform, "headless"); + + // TODO(skyostil): Investigate using Mesa/SwiftShader for output. + command_line->AppendSwitch(switches::kDisableGpu); + + SetContentClient(&content_client_); + return false; +} + +void HeadlessContentMainDelegate::PreSandboxStartup() { + InitializeResourceBundle(); +} + +int HeadlessContentMainDelegate::RunProcess( + const std::string& process_type, + const content::MainFunctionParams& main_function_params) { + if (!process_type.empty()) + return -1; + + base::trace_event::TraceLog::GetInstance()->SetProcessName("HeadlessBrowser"); + base::trace_event::TraceLog::GetInstance()->SetProcessSortIndex( + kTraceEventBrowserProcessSortIndex); + + scoped_ptr<content::BrowserMainRunner> browser_runner( + content::BrowserMainRunner::Create()); + + int exit_code = browser_runner->Initialize(main_function_params); + DCHECK_LT(exit_code, 0) << "content::BrowserMainRunner::Initialize failed in " + "HeadlessContentMainDelegate::RunProcess"; + + browser_->RunOnStartCallback(); + browser_runner->Run(); + browser_.reset(); + browser_runner->Shutdown(); + + // Return value >=0 here to disable calling content::BrowserMain. + return 0; +} + +void HeadlessContentMainDelegate::ZygoteForked() { + // TODO(skyostil): Disable the zygote host. +} + +// static +HeadlessContentMainDelegate* HeadlessContentMainDelegate::GetInstance() { + return g_current_headless_content_main_delegate; +} + +// static +void HeadlessContentMainDelegate::InitializeResourceBundle() { + base::FilePath pak_file; + bool result = PathService::Get(base::DIR_MODULE, &pak_file); + DCHECK(result); + pak_file = pak_file.Append(FILE_PATH_LITERAL("headless_lib.pak")); + ui::ResourceBundle::InitSharedInstanceWithPakPath(pak_file); +} + +content::ContentBrowserClient* +HeadlessContentMainDelegate::CreateContentBrowserClient() { + browser_client_.reset(new HeadlessContentBrowserClient(browser_.get())); + return browser_client_.get(); +} + +content::ContentRendererClient* +HeadlessContentMainDelegate::CreateContentRendererClient() { + renderer_client_.reset(new HeadlessContentRendererClient); + return renderer_client_.get(); +} + +content::ContentUtilityClient* +HeadlessContentMainDelegate::CreateContentUtilityClient() { + utility_client_.reset(new HeadlessContentUtilityClient); + return utility_client_.get(); +} + +} // namespace headless
diff --git a/headless/lib/headless_content_main_delegate.h b/headless/lib/headless_content_main_delegate.h new file mode 100644 index 0000000..b829d0e2 --- /dev/null +++ b/headless/lib/headless_content_main_delegate.h
@@ -0,0 +1,62 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef HEADLESS_LIB_HEADLESS_CONTENT_MAIN_DELEGATE_H_ +#define HEADLESS_LIB_HEADLESS_CONTENT_MAIN_DELEGATE_H_ + +#include "base/compiler_specific.h" +#include "base/macros.h" +#include "base/memory/scoped_ptr.h" +#include "content/public/app/content_main_delegate.h" +#include "headless/lib/headless_content_client.h" + +namespace content { +class BrowserContext; +} + +namespace headless { + +class HeadlessBrowserImpl; +class HeadlessContentBrowserClient; +class HeadlessContentUtilityClient; +class HeadlessContentRendererClient; + +class HeadlessContentMainDelegate : public content::ContentMainDelegate { + public: + explicit HeadlessContentMainDelegate(scoped_ptr<HeadlessBrowserImpl> browser); + ~HeadlessContentMainDelegate() override; + + // content::ContentMainDelegate implementation: + bool BasicStartupComplete(int* exit_code) override; + void PreSandboxStartup() override; + int RunProcess( + const std::string& process_type, + const content::MainFunctionParams& main_function_params) override; + void ZygoteForked() override; + content::ContentBrowserClient* CreateContentBrowserClient() override; + content::ContentRendererClient* CreateContentRendererClient() override; + content::ContentUtilityClient* CreateContentUtilityClient() override; + + HeadlessBrowserImpl* browser() const { return browser_.get(); } + + private: + friend class HeadlessBrowserTest; + + static void InitializeResourceBundle(); + + static HeadlessContentMainDelegate* GetInstance(); + + scoped_ptr<HeadlessContentBrowserClient> browser_client_; + scoped_ptr<HeadlessContentRendererClient> renderer_client_; + scoped_ptr<HeadlessContentUtilityClient> utility_client_; + HeadlessContentClient content_client_; + + scoped_ptr<HeadlessBrowserImpl> browser_; + + DISALLOW_COPY_AND_ASSIGN(HeadlessContentMainDelegate); +}; + +} // namespace headless + +#endif // HEADLESS_LIB_HEADLESS_CONTENT_MAIN_DELEGATE_H_
diff --git a/headless/lib/headless_web_contents_browsertest.cc b/headless/lib/headless_web_contents_browsertest.cc new file mode 100644 index 0000000..5771b69 --- /dev/null +++ b/headless/lib/headless_web_contents_browsertest.cc
@@ -0,0 +1,58 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/run_loop.h" +#include "content/public/test/browser_test.h" +#include "headless/public/headless_browser.h" +#include "headless/public/headless_web_contents.h" +#include "headless/test/headless_browser_test.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "ui/gfx/geometry/size.h" +#include "url/gurl.h" + +namespace headless { + +class HeadlessWebContentsTest : public HeadlessBrowserTest {}; + +class WaitForNavigationObserver : public HeadlessWebContents::Observer { + public: + WaitForNavigationObserver(base::RunLoop* run_loop, + HeadlessWebContents* web_contents) + : run_loop_(run_loop), web_contents_(web_contents) { + web_contents_->AddObserver(this); + } + + ~WaitForNavigationObserver() override { web_contents_->RemoveObserver(this); } + + void DocumentOnLoadCompletedInMainFrame() override { run_loop_->Quit(); } + + private: + base::RunLoop* run_loop_; // Not owned. + HeadlessWebContents* web_contents_; // Not owned. + + DISALLOW_COPY_AND_ASSIGN(WaitForNavigationObserver); +}; + +IN_PROC_BROWSER_TEST_F(HeadlessWebContentsTest, Navigation) { + EXPECT_TRUE(embedded_test_server()->Start()); + scoped_ptr<HeadlessWebContents> web_contents = + browser()->CreateWebContents(gfx::Size(800, 600)); + + base::RunLoop run_loop; + base::MessageLoop::ScopedNestableTaskAllower nestable_allower( + base::MessageLoop::current()); + WaitForNavigationObserver observer(&run_loop, web_contents.get()); + + web_contents->OpenURL(embedded_test_server()->GetURL("/hello.html")); + run_loop.Run(); +} + +IN_PROC_BROWSER_TEST_F(HeadlessWebContentsTest, NavigationWithBadURL) { + scoped_ptr<HeadlessWebContents> web_contents = + browser()->CreateWebContents(gfx::Size(800, 600)); + GURL bad_url("not_valid"); + EXPECT_FALSE(web_contents->OpenURL(bad_url)); +} + +} // namespace headless
diff --git a/headless/lib/renderer/headless_content_renderer_client.cc b/headless/lib/renderer/headless_content_renderer_client.cc new file mode 100644 index 0000000..5347d60 --- /dev/null +++ b/headless/lib/renderer/headless_content_renderer_client.cc
@@ -0,0 +1,13 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "headless/lib/renderer/headless_content_renderer_client.h" + +namespace headless { + +HeadlessContentRendererClient::HeadlessContentRendererClient() {} + +HeadlessContentRendererClient::~HeadlessContentRendererClient() {} + +} // namespace headless
diff --git a/headless/lib/renderer/headless_content_renderer_client.h b/headless/lib/renderer/headless_content_renderer_client.h new file mode 100644 index 0000000..a10ff81 --- /dev/null +++ b/headless/lib/renderer/headless_content_renderer_client.h
@@ -0,0 +1,22 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef HEADLESS_LIB_RENDERER_HEADLESS_CONTENT_RENDERER_CLIENT_H_ +#define HEADLESS_LIB_RENDERER_HEADLESS_CONTENT_RENDERER_CLIENT_H_ + +#include "content/public/renderer/content_renderer_client.h" + +namespace headless { + +class HeadlessContentRendererClient : public content::ContentRendererClient { + public: + HeadlessContentRendererClient(); + ~HeadlessContentRendererClient() override; + + DISALLOW_COPY_AND_ASSIGN(HeadlessContentRendererClient); +}; + +} // namespace headless + +#endif // HEADLESS_LIB_RENDERER_HEADLESS_CONTENT_RENDERER_CLIENT_H_
diff --git a/headless/lib/utility/headless_content_utility_client.cc b/headless/lib/utility/headless_content_utility_client.cc new file mode 100644 index 0000000..952e748 --- /dev/null +++ b/headless/lib/utility/headless_content_utility_client.cc
@@ -0,0 +1,13 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "headless/lib/utility/headless_content_utility_client.h" + +namespace headless { + +HeadlessContentUtilityClient::HeadlessContentUtilityClient() {} + +HeadlessContentUtilityClient::~HeadlessContentUtilityClient() {} + +} // namespace headless
diff --git a/headless/lib/utility/headless_content_utility_client.h b/headless/lib/utility/headless_content_utility_client.h new file mode 100644 index 0000000..0a522f2 --- /dev/null +++ b/headless/lib/utility/headless_content_utility_client.h
@@ -0,0 +1,22 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef HEADLESS_LIB_UTILITY_HEADLESS_CONTENT_UTILITY_CLIENT_H_ +#define HEADLESS_LIB_UTILITY_HEADLESS_CONTENT_UTILITY_CLIENT_H_ + +#include "content/public/utility/content_utility_client.h" + +namespace headless { + +class HeadlessContentUtilityClient : public content::ContentUtilityClient { + public: + HeadlessContentUtilityClient(); + ~HeadlessContentUtilityClient() override; + + DISALLOW_COPY_AND_ASSIGN(HeadlessContentUtilityClient); +}; + +} // namespace headless + +#endif // HEADLESS_LIB_UTILITY_HEADLESS_CONTENT_UTILITY_CLIENT_H_
diff --git a/headless/public/headless_browser.cc b/headless/public/headless_browser.cc index cb8a855..550d7169 100644 --- a/headless/public/headless_browser.cc +++ b/headless/public/headless_browser.cc
@@ -2,15 +2,25 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include "content/public/common/user_agent.h" #include "headless/public/headless_browser.h" +#include "net/url_request/url_request_context_getter.h" using Options = headless::HeadlessBrowser::Options; using Builder = headless::HeadlessBrowser::Options::Builder; namespace headless { +// Product name for building the default user agent string. +namespace { +const char kProductName[] = "HeadlessChrome"; +} + Options::Options(int argc, const char** argv) - : argc(argc), argv(argv), devtools_http_port(kInvalidPort) {} + : argc(argc), + argv(argv), + user_agent(content::BuildUserAgentFromProduct(kProductName)), + message_pump(nullptr) {} Options::~Options() {} @@ -23,14 +33,13 @@ return *this; } -Builder& Builder::EnableDevToolsServer(int port) { - options_.devtools_http_port = port; +Builder& Builder::EnableDevToolsServer(const net::IPEndPoint& endpoint) { + options_.devtools_endpoint = endpoint; return *this; } -Builder& Builder::SetURLRequestContextGetter( - scoped_refptr<net::URLRequestContextGetter> url_request_context_getter) { - options_.url_request_context_getter = url_request_context_getter; +Builder& Builder::SetMessagePump(base::MessagePump* message_pump) { + options_.message_pump = message_pump; return *this; }
diff --git a/headless/public/headless_browser.h b/headless/public/headless_browser.h index a94a90c..8302c0f 100644 --- a/headless/public/headless_browser.h +++ b/headless/public/headless_browser.h
@@ -5,65 +5,56 @@ #ifndef HEADLESS_PUBLIC_HEADLESS_BROWSER_H_ #define HEADLESS_PUBLIC_HEADLESS_BROWSER_H_ +#include <string> + #include "base/callback.h" #include "base/macros.h" #include "base/memory/ref_counted.h" #include "base/memory/scoped_ptr.h" #include "headless/public/headless_export.h" +#include "net/base/ip_endpoint.h" namespace base { +class MessagePump; class SingleThreadTaskRunner; - -namespace trace_event { -class TraceConfig; -} } namespace gfx { class Size; } -namespace net { -class URLRequestContextGetter; -} - namespace headless { -class WebContents; +class HeadlessWebContents; +// This class represents the global headless browser instance. To get a pointer +// to one, call |HeadlessBrowserMain| to initiate the browser main loop. An +// instance of |HeadlessBrowser| will be passed to the callback given to that +// function. class HEADLESS_EXPORT HeadlessBrowser { public: - static HeadlessBrowser* Get(); - struct Options; - // Main routine for running browser. - // Takes command line args and callback to run as soon as browser starts. - static int Run( - const Options& options, - const base::Callback<void(HeadlessBrowser*)>& on_browser_start_callback); + // Create a new browser tab. |size| is in physical pixels. + virtual scoped_ptr<HeadlessWebContents> CreateWebContents( + const gfx::Size& size) = 0; - // Create a new browser tab. - virtual scoped_ptr<WebContents> CreateWebContents(const gfx::Size& size) = 0; + // Returns a task runner for submitting work to the browser main thread. + virtual scoped_refptr<base::SingleThreadTaskRunner> BrowserMainThread() + const = 0; - virtual scoped_refptr<base::SingleThreadTaskRunner> BrowserMainThread() = 0; - virtual scoped_refptr<base::SingleThreadTaskRunner> RendererMainThread() = 0; - - // Requests browser to stop as soon as possible. - // |Run| will return as soon as browser stops. - virtual void Stop() = 0; - - virtual void StartTracing(const base::trace_event::TraceConfig& trace_config, - const base::Closure& on_tracing_started) = 0; - virtual void StopTracing(const std::string& log_file_name, - const base::Closure& on_tracing_stopped) = 0; + // Requests browser to stop as soon as possible. |Run| will return as soon as + // browser stops. + virtual void Shutdown() = 0; protected: + HeadlessBrowser() {} virtual ~HeadlessBrowser() {} private: DISALLOW_COPY_AND_ASSIGN(HeadlessBrowser); }; +// Embedding API overrides for the headless browser. struct HeadlessBrowser::Options { ~Options(); @@ -76,20 +67,10 @@ std::string user_agent; std::string navigator_platform; - static const int kInvalidPort = -1; - // If not null, create start devtools for remote debugging - // on specified port. - int devtools_http_port; + net::IPEndPoint devtools_endpoint; - // Optional URLRequestContextGetter for customizing network stack. - // Allows overriding: - // - Cookie storage - // - HTTP cache - // - SSL config - // - Proxy service - scoped_refptr<net::URLRequestContextGetter> url_request_context_getter; - - scoped_ptr<base::MessagePump> message_pump; + // Optional message pump that overrides the default. Must outlive the browser. + base::MessagePump* message_pump; private: Options(int argc, const char** argv); @@ -101,9 +82,8 @@ ~Builder(); Builder& SetUserAgent(const std::string& user_agent); - Builder& EnableDevToolsServer(int port); - Builder& SetURLRequestContextGetter( - scoped_refptr<net::URLRequestContextGetter> url_request_context_getter); + Builder& EnableDevToolsServer(const net::IPEndPoint& endpoint); + Builder& SetMessagePump(base::MessagePump* message_pump); Options Build(); @@ -113,6 +93,15 @@ DISALLOW_COPY_AND_ASSIGN(Builder); }; +// Main entry point for running the headless browser. This function constructs +// the headless browser instance, passing it to the given +// |on_browser_start_callback| callback. Note that since this function executes +// the main loop, it will only return after HeadlessBrowser::Shutdown() is +// called, returning the exit code for the process. +int HeadlessBrowserMain( + const HeadlessBrowser::Options& options, + const base::Callback<void(HeadlessBrowser*)>& on_browser_start_callback); + } // namespace headless #endif // HEADLESS_PUBLIC_HEADLESS_BROWSER_H_
diff --git a/headless/public/headless_web_contents.h b/headless/public/headless_web_contents.h new file mode 100644 index 0000000..2db82e9 --- /dev/null +++ b/headless/public/headless_web_contents.h
@@ -0,0 +1,53 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef HEADLESS_PUBLIC_HEADLESS_WEB_CONTENTS_H_ +#define HEADLESS_PUBLIC_HEADLESS_WEB_CONTENTS_H_ + +#include "base/callback.h" +#include "base/macros.h" +#include "base/memory/scoped_ptr.h" +#include "headless/public/headless_export.h" +#include "url/gurl.h" + +namespace headless { + +// Class representing contents of a browser tab. Should be accessed from browser +// main thread. +class HEADLESS_EXPORT HeadlessWebContents { + public: + virtual ~HeadlessWebContents() {} + + // TODO(skyostil): Replace this with an equivalent client API. + class Observer { + public: + // Will be called on browser thread. + virtual void DocumentOnLoadCompletedInMainFrame() = 0; + + protected: + Observer() {} + virtual ~Observer() {} + + private: + DISALLOW_COPY_AND_ASSIGN(Observer); + }; + + // TODO(skyostil): Replace this with an equivalent client API. + virtual bool OpenURL(const GURL& url) = 0; + + // Add or remove an observer to receive events from this WebContents. + // |observer| must outlive this class or be removed prior to being destroyed. + virtual void AddObserver(Observer* observer) = 0; + virtual void RemoveObserver(Observer* observer) = 0; + + private: + friend class HeadlessWebContentsImpl; + HeadlessWebContents() {} + + DISALLOW_COPY_AND_ASSIGN(HeadlessWebContents); +}; + +} // namespace headless + +#endif // HEADLESS_PUBLIC_HEADLESS_WEB_CONTENTS_H_
diff --git a/headless/public/network.h b/headless/public/network.h deleted file mode 100644 index efede2b..0000000 --- a/headless/public/network.h +++ /dev/null
@@ -1,36 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef HEADLESS_PUBLIC_NETWORK_H_ -#define HEADLESS_PUBLIC_NETWORK_H_ - -#include <base/macros.h> -#include <base/memory/ref_counted.h> -#include <base/memory/scoped_ptr.h> - -namespace net { -class URLRequestContextGetter; -class ClientSocketFactory; -class HttpTransactionFactory; -} - -namespace headless { - -class Network { - public: - static scoped_refptr<net::URLRequestContextGetter> - CreateURLRequestContextGetterUsingSocketFactory( - scoped_ptr<net::ClientSocketFactory> socket_factory); - - static scoped_refptr<net::URLRequestContextGetter> - CreateURLRequestContextGetterUsingHttpTransactionFactory( - scoped_ptr<net::HttpTransactionFactory> http_transaction_factory); - - private: - Network() = delete; -}; - -} // namespace headless - -#endif // HEADLESS_PUBLIC_NETWORK_H_
diff --git a/headless/public/web_contents.h b/headless/public/web_contents.h deleted file mode 100644 index 634cdb4f..0000000 --- a/headless/public/web_contents.h +++ /dev/null
@@ -1,99 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef HEADLESS_PUBLIC_WEB_CONTENTS_H_ -#define HEADLESS_PUBLIC_WEB_CONTENTS_H_ - -#include "base/callback.h" -#include "base/macros.h" -#include "base/memory/scoped_ptr.h" -#include "headless/public/headless_export.h" -#include "url/gurl.h" - -class SkBitmap; - -namespace content { -class WebContents; -} - -namespace headless { -class WebFrame; - -// Class representing contents of a browser tab. -// Should be accessed from browser main thread. -class HEADLESS_EXPORT WebContents { - public: - virtual ~WebContents() {} - - class Observer { - public: - // Will be called on browser thread. - virtual void DidNavigateMainFrame() = 0; - virtual void DocumentOnLoadCompletedInMainFrame() = 0; - - virtual void OnLoadProgressChanged(double progress) = 0; - virtual void AddMessageToConsole(const std::string& message) = 0; - virtual bool ShouldSuppressDialogs(WebContents* source) = 0; - virtual void OnModalAlertDialog(const std::string& message) = 0; - virtual bool OnModalConfirmDialog(const std::string& message) = 0; - virtual std::string OnModalPromptDialog( - const std::string& message, - const std::string& default_value) = 0; - - protected: - explicit Observer(WebContents* web_contents); - virtual ~Observer(); - - private: - class ObserverImpl; - scoped_ptr<ObserverImpl> observer_; - - DISALLOW_COPY_AND_ASSIGN(Observer); - }; - - class Settings { - virtual void SetWebSecurityEnabled(bool enabled) = 0; - virtual void SetLocalStorageEnabled(bool enabled) = 0; - virtual void SetJavaScriptCanOpenWindowsAutomatically(bool enabled) = 0; - virtual void SetAllowScriptsToCloseWindows(bool enabled) = 0; - virtual void SetImagesEnabled(bool enabled) = 0; - virtual void SetJavascriptEnabled(bool enabled) = 0; - virtual void SetXSSAuditorEnabled(bool enabled) = 0; - virtual void SetDefaultTextEncoding(const std::string& encoding) = 0; - }; - - virtual Settings* GetSettings() = 0; - virtual const Settings* GetSettings() const = 0; - - virtual NavigationController* GetController() = 0; - virtual const NavigationController* GetController() const = 0; - - virtual std::string GetTitle() const = 0; - virtual const GURL& GetVisibleURL() const = 0; - virtual const GURL& GetLastCommittedURL() const = 0; - virtual bool IsLoading() const = 0; - - virtual bool SetViewportSize(const gfx::Size& size) const = 0; - - // Returns main frame for web page. Note that the returned interface should - // only be used on the renderer main thread. - virtual WebFrame* GetMainFrame() = 0; - - // Requests browser tab to navigate to given url. - virtual void OpenURL(const GURL& url) = 0; - - using ScreenshotCallback = base::Callback<void(scoped_ptr<SkBitmap>)>; - // Requests an image of web contents. - virtual void GetScreenshot(const ScreenshotCallback& callback) = 0; - - protected: - virtual content::WebContents* web_contents() = 0; - - private: - DISALLOW_COPY_AND_ASSIGN(WebContents); -}; - -} // namespace headless - -#endif // HEADLESS_PUBLIC_WEB_CONTENTS_H_
diff --git a/headless/public/web_frame.h b/headless/public/web_frame.h deleted file mode 100644 index c8e53071..0000000 --- a/headless/public/web_frame.h +++ /dev/null
@@ -1,63 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef HEADLESS_PUBLIC_WEB_FRAME_H_ -#define HEADLESS_PUBLIC_WEB_FRAME_H_ - -#include "base/callback.h" -#include "base/macros.h" -#include "base/values.h" -#include "headless/public/headless_export.h" - -namespace headless { - -class WebDocument; - -// Class representing a frame in a web page (e.g. main frame or an iframe). -// Should be accessed from renderer main thread. -class HEADLESS_EXPORT WebFrame { - public: - virtual ~WebFrame() {} - - using ScriptExecutionCallback = - base::Callback<void(const std::vector<scoped_ptr<base::Value>>&)>; - - // Schedule given script for execution. - virtual void ExecuteScript(const std::string& source_code) = 0; - - // Execute given script and return its result. - // Returned value will be converted to json (base::Value). - // Special effects to bear in mind: - // - Boolean will be converted to base::FundamentalValue (no surprises here). - // - Number will be converted to base::FundamentalValue. - // - Array will be converted to base::ListValue. - // Note: All non-numerical properties will be omitted - // (e.g. "array = [1, 2, 3]; array['property'] = 'value'; return array" - // will return [1, 2, 3]). - // - Object will be converted to base::DictionaryValue - // Note: Only string can be key in base::DictionaryValue, so all non-string - // properties will be omitted - // (e.g. "obj = Object(); obj['key'] = 'value'; obj[0] = 42;" will return - // {"key":"value"}). - virtual void ExecuteScriptAndReturnValue( - const std::string& source_code, - const ScriptExecutionCallback& callback) = 0; - - virtual std::string ContentAsText(size_t max_chars) const = 0; - virtual std::string ContentAsMarkup() const = 0; - virtual proto::Document ContentAsProtobuf() const = 0; - - virtual gfx::Size GetScrollOffset() const = 0; - virtual void SetScrollOffset(const gfx::Size& offset) = 0; - - virtual float GetPageScaleFactor() const = 0; - virtual void SetPageScaleFactor(float page_scale_factor) = 0; - - private: - DISALLOW_COPY_AND_ASSIGN(WebFrame); -}; - -} // namespace headless - -#endif // HEADLESS_PUBLIC_WEB_FRAME_H_
diff --git a/headless/test/data/hello.html b/headless/test/data/hello.html new file mode 100644 index 0000000..0aa881e8 --- /dev/null +++ b/headless/test/data/hello.html
@@ -0,0 +1,2 @@ +<!doctype html> +<h1>Hello headless world!</h1>
diff --git a/headless/test/headless_browser_test.cc b/headless/test/headless_browser_test.cc new file mode 100644 index 0000000..555616a --- /dev/null +++ b/headless/test/headless_browser_test.cc
@@ -0,0 +1,50 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "headless/test/headless_browser_test.h" + +#include "base/files/file_path.h" +#include "base/message_loop/message_loop.h" +#include "content/public/browser/browser_thread.h" +#include "content/public/browser/render_process_host.h" +#include "headless/lib/browser/headless_browser_impl.h" +#include "headless/lib/headless_content_main_delegate.h" + +namespace headless { + +HeadlessBrowserTest::HeadlessBrowserTest() { + base::FilePath headless_test_data(FILE_PATH_LITERAL("headless/test/data")); + CreateTestServer(headless_test_data); +} + +HeadlessBrowserTest::~HeadlessBrowserTest() {} + +void HeadlessBrowserTest::SetUpOnMainThread() {} + +void HeadlessBrowserTest::TearDownOnMainThread() { + browser()->Shutdown(); +} + +void HeadlessBrowserTest::RunTestOnMainThreadLoop() { + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); + + // Pump startup related events. + base::MessageLoop::current()->RunUntilIdle(); + + SetUpOnMainThread(); + RunTestOnMainThread(); + TearDownOnMainThread(); + + for (content::RenderProcessHost::iterator i( + content::RenderProcessHost::AllHostsIterator()); + !i.IsAtEnd(); i.Advance()) { + i.GetCurrentValue()->FastShutdownIfPossible(); + } +} + +HeadlessBrowser* HeadlessBrowserTest::browser() const { + return HeadlessContentMainDelegate::GetInstance()->browser(); +} + +} // namespace headless
diff --git a/headless/test/headless_browser_test.h b/headless/test/headless_browser_test.h new file mode 100644 index 0000000..9b56234 --- /dev/null +++ b/headless/test/headless_browser_test.h
@@ -0,0 +1,34 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef HEADLESS_TEST_HEADLESS_BROWSER_TEST_H_ +#define HEADLESS_TEST_HEADLESS_BROWSER_TEST_H_ + +#include "content/public/test/browser_test_base.h" + +namespace headless { +class HeadlessBrowser; + +// Base class for tests which require a full instance of the headless browser. +class HeadlessBrowserTest : public content::BrowserTestBase { + protected: + HeadlessBrowserTest(); + ~HeadlessBrowserTest() override; + + // BrowserTestBase: + void RunTestOnMainThreadLoop() override; + void SetUpOnMainThread() override; + void TearDownOnMainThread() override; + + protected: + // Returns the browser for the test. + HeadlessBrowser* browser() const; + + private: + DISALLOW_COPY_AND_ASSIGN(HeadlessBrowserTest); +}; + +} // namespace headless + +#endif // HEADLESS_TEST_HEADLESS_BROWSER_TEST_H_
diff --git a/headless/test/headless_test_launcher.cc b/headless/test/headless_test_launcher.cc new file mode 100644 index 0000000..e08e297 --- /dev/null +++ b/headless/test/headless_test_launcher.cc
@@ -0,0 +1,66 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/bind.h" +#include "base/macros.h" +#include "base/sys_info.h" +#include "content/public/test/content_test_suite_base.h" +#include "content/public/test/test_launcher.h" +#include "headless/lib/browser/headless_browser_impl.h" +#include "headless/lib/headless_content_main_delegate.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace headless { +namespace { + +class HeadlessBrowserImplForTest : public HeadlessBrowserImpl { + public: + explicit HeadlessBrowserImplForTest(const HeadlessBrowser::Options& options) + : HeadlessBrowserImpl(base::Bind(&HeadlessBrowserImplForTest::OnStart, + base::Unretained(this)), + options) {} + + void OnStart(HeadlessBrowser* browser) { EXPECT_EQ(this, browser); } + + private: + DISALLOW_COPY_AND_ASSIGN(HeadlessBrowserImplForTest); +}; + +class HeadlessTestLauncherDelegate : public content::TestLauncherDelegate { + public: + HeadlessTestLauncherDelegate() {} + ~HeadlessTestLauncherDelegate() override {} + + // content::TestLauncherDelegate implementation: + int RunTestSuite(int argc, char** argv) override { + return base::TestSuite(argc, argv).Run(); + } + + bool AdjustChildProcessCommandLine( + base::CommandLine* command_line, + const base::FilePath& temp_data_dir) override { + return true; + } + + protected: + content::ContentMainDelegate* CreateContentMainDelegate() override { + // TODO(skyostil): Add a way to test custom options. + HeadlessBrowser::Options::Builder options_builder(0, nullptr); + scoped_ptr<HeadlessBrowserImpl> browser( + new HeadlessBrowserImplForTest(options_builder.Build())); + return new HeadlessContentMainDelegate(std::move(browser)); + } + + private: + DISALLOW_COPY_AND_ASSIGN(HeadlessTestLauncherDelegate); +}; + +} // namespace +} // namespace headless + +int main(int argc, char** argv) { + int default_jobs = std::max(1, base::SysInfo::NumberOfProcessors() / 2); + headless::HeadlessTestLauncherDelegate launcher_delegate; + return LaunchTests(&launcher_delegate, default_jobs, argc, argv); +}
diff --git a/ios/web/web_state/js/common_js_unittest.mm b/ios/web/web_state/js/common_js_unittest.mm index 9fced6e..421267b 100644 --- a/ios/web/web_state/js/common_js_unittest.mm +++ b/ios/web/web_state/js/common_js_unittest.mm
@@ -27,7 +27,7 @@ namespace web { // Test fixture to test common.js. -typedef web::WebTestWithWKWebViewWebController CommonJsTest; +typedef web::WebTestWithWebController CommonJsTest; // Tests __gCrWeb.common.isTextField JavaScript API. TEST_F(CommonJsTest, IsTestField) {
diff --git a/ios/web/web_state/js/core_js_unittest.mm b/ios/web/web_state/js/core_js_unittest.mm index 91d3a12..519cca5 100644 --- a/ios/web/web_state/js/core_js_unittest.mm +++ b/ios/web/web_state/js/core_js_unittest.mm
@@ -25,7 +25,7 @@ namespace web { // Test fixture to test core.js. -class CoreJsTest : public web::WebTestWithWKWebViewWebController { +class CoreJsTest : public web::WebTestWithWebController { protected: void ImageTesterHelper( NSString* htmlForImage,
diff --git a/ios/web/web_state/js/crw_js_injection_manager_unittest.mm b/ios/web/web_state/js/crw_js_injection_manager_unittest.mm index 3a5cfdc6..effc6c6b 100644 --- a/ios/web/web_state/js/crw_js_injection_manager_unittest.mm +++ b/ios/web/web_state/js/crw_js_injection_manager_unittest.mm
@@ -156,10 +156,10 @@ namespace web { // Test fixture to test web controller injection. -class JsInjectionManagerTest : public web::WebTestWithWKWebViewWebController { +class JsInjectionManagerTest : public web::WebTestWithWebController { protected: void SetUp() override { - web::WebTestWithWKWebViewWebController::SetUp(); + web::WebTestWithWebController::SetUp(); // Loads a dummy page to prepare JavaScript evaluation. NSString* const kPageContent = @"<html><body><div></div></body></html>"; LoadHtml(kPageContent);
diff --git a/ios/web/web_state/js/resources/core.js b/ios/web/web_state/js/resources/core.js index e9594ad..862b83e 100644 --- a/ios/web/web_state/js/resources/core.js +++ b/ios/web/web_state/js/resources/core.js
@@ -460,11 +460,6 @@ originalWindowScrollTo(x, y); }; - // Intercept window.close calls. - window.close = function() { - invokeOnHost_({'command': 'window.close.self'}); - }; - window.addEventListener('hashchange', function(evt) { invokeOnHost_({'command': 'window.hashchange'}); });
diff --git a/ios/web/web_state/ui/crw_web_controller.mm b/ios/web/web_state/ui/crw_web_controller.mm index 1fac1be..9b38ec1 100644 --- a/ios/web/web_state/ui/crw_web_controller.mm +++ b/ios/web/web_state/ui/crw_web_controller.mm
@@ -463,9 +463,6 @@ // Handles 'resetExternalRequest' message. - (BOOL)handleResetExternalRequestMessage:(base::DictionaryValue*)message context:(NSDictionary*)context; -// Handles 'window.close.self' message. -- (BOOL)handleWindowCloseSelfMessage:(base::DictionaryValue*)message - context:(NSDictionary*)context; // Handles 'window.error' message. - (BOOL)handleWindowErrorMessage:(base::DictionaryValue*)message context:(NSDictionary*)context; @@ -2079,8 +2076,6 @@ @selector(handleSignInFailedMessage:context:); (*handlers)["resetExternalRequest"] = @selector(handleResetExternalRequestMessage:context:); - (*handlers)["window.close.self"] = - @selector(handleWindowCloseSelfMessage:context:); (*handlers)["window.error"] = @selector(handleWindowErrorMessage:context:); (*handlers)["window.hashchange"] = @selector(handleWindowHashChangeMessage:context:); @@ -2405,12 +2400,6 @@ return YES; } -- (BOOL)handleWindowCloseSelfMessage:(base::DictionaryValue*)message - context:(NSDictionary*)context { - [self orderClose]; - return YES; -} - - (BOOL)handleWindowErrorMessage:(base::DictionaryValue*)message context:(NSDictionary*)context { std::string errorMessage;
diff --git a/ios/web/web_state/ui/crw_web_controller_observer_unittest.mm b/ios/web/web_state/ui/crw_web_controller_observer_unittest.mm index 6f077f3..e44a0d39e 100644 --- a/ios/web/web_state/ui/crw_web_controller_observer_unittest.mm +++ b/ios/web/web_state/ui/crw_web_controller_observer_unittest.mm
@@ -18,11 +18,10 @@ namespace web { // Test fixture to test web controller observing. -class CRWWebControllerObserverTest - : public web::WebTestWithWKWebViewWebController { +class CRWWebControllerObserverTest : public web::WebTestWithWebController { protected: void SetUp() override { - web::WebTestWithWKWebViewWebController::SetUp(); + web::WebTestWithWebController::SetUp(); fake_web_controller_observer_.reset( [[CRWFakeWebControllerObserver alloc] initWithCommandPrefix:@"test"]); [webController_ addObserver:fake_web_controller_observer_]; @@ -31,7 +30,7 @@ void TearDown() override { [webController_ removeObserver:fake_web_controller_observer_]; fake_web_controller_observer_.reset(); - web::WebTestWithWKWebViewWebController::TearDown(); + web::WebTestWithWebController::TearDown(); } base::scoped_nsobject<CRWFakeWebControllerObserver>
diff --git a/ios/web/web_state/ui/crw_web_controller_unittest.mm b/ios/web/web_state/ui/crw_web_controller_unittest.mm index 4e9274f..0c67d13c 100644 --- a/ios/web/web_state/ui/crw_web_controller_unittest.mm +++ b/ios/web/web_state/ui/crw_web_controller_unittest.mm
@@ -236,10 +236,10 @@ // Test fixture for testing CRWWebController. Stubs out web view and // child CRWWebController. -class CRWWebControllerTest : public web::WebTestWithWKWebViewWebController { +class CRWWebControllerTest : public web::WebTestWithWebController { protected: void SetUp() override { - web::WebTestWithWKWebViewWebController::SetUp(); + web::WebTestWithWebController::SetUp(); mockWebView_.reset(CreateMockWebView()); mockScrollView_.reset([[UIScrollView alloc] init]); [[[mockWebView_ stub] andReturn:mockScrollView_.get()] scrollView]; @@ -276,7 +276,7 @@ EXPECT_OCMOCK_VERIFY(mockWebView_); [webController_ resetInjectedWebViewContentView]; [webController_ setDelegate:nil]; - web::WebTestWithWKWebViewWebController::TearDown(); + web::WebTestWithWebController::TearDown(); } // The value for web view OCMock objects to expect for |-setFrame:|. @@ -425,8 +425,7 @@ } // None of the |CRWWKWebViewWebControllerTest| setup is needed; -typedef web::WebTestWithWKWebViewWebController - CRWWebControllerPageDialogsOpenPolicyTest; +typedef web::WebTestWithWebController CRWWebControllerPageDialogsOpenPolicyTest; TEST_F(CRWWebControllerPageDialogsOpenPolicyTest, SuppressPolicy) { LoadHtml(@"<html><body></body></html>"); @@ -445,7 +444,7 @@ // A separate test class, as none of the |CRWWebControllerTest| setup is // needed. class CRWWebControllerPageScrollStateTest - : public web::WebTestWithWKWebViewWebController { + : public web::WebTestWithWebController { protected: // Returns a web::PageDisplayState that will scroll a WKWebView to // |scrollOffset| and zoom the content by |relativeZoomScale|. @@ -554,7 +553,7 @@ }; // Real WKWebView is required for JSEvaluationTest. -typedef web::WebTestWithWKWebViewWebController CRWWebControllerJSEvaluationTest; +typedef web::WebTestWithWebController CRWWebControllerJSEvaluationTest; // Tests that a script correctly evaluates to string. TEST_F(CRWWebControllerJSEvaluationTest, Evaluation) { @@ -602,7 +601,7 @@ // A separate test class, as none of the |CRWUIWebViewWebControllerTest| setup // is needed; -typedef web::WebTestWithWKWebViewWebController CRWWebControllerObserversTest; +typedef web::WebTestWithWebController CRWWebControllerObserversTest; // Tests that CRWWebControllerObservers are called. TEST_F(CRWWebControllerObserversTest, Observers) { @@ -635,11 +634,10 @@ }; // Test fixture for window.open tests. -class CRWWebControllerWindowOpenTest - : public web::WebTestWithWKWebViewWebController { +class CRWWebControllerWindowOpenTest : public web::WebTestWithWebController { protected: void SetUp() override { - web::WebTestWithWKWebViewWebController::SetUp(); + web::WebTestWithWebController::SetUp(); // Configure web delegate. delegate_.reset([[MockInteractionLoader alloc] @@ -668,7 +666,7 @@ [webController_ setDelegate:nil]; [child_ close]; - web::WebTestWithWKWebViewWebController::TearDown(); + web::WebTestWithWebController::TearDown(); } // Executes JavaScript that opens a new window and returns evaluation result // as a string. @@ -765,11 +763,10 @@ }; // Fixture class to test WKWebView crashes. -class CRWWebControllerWebProcessTest - : public web::WebTestWithWKWebViewWebController { +class CRWWebControllerWebProcessTest : public web::WebTestWithWebController { protected: void SetUp() override { - web::WebTestWithWKWebViewWebController::SetUp(); + web::WebTestWithWebController::SetUp(); webView_.reset(web::CreateTerminatedWKWebView()); base::scoped_nsobject<TestWebViewContentView> webViewContentView( [[TestWebViewContentView alloc]
diff --git a/ios/web/web_state/ui/crw_wk_web_view_web_controller.mm b/ios/web/web_state/ui/crw_wk_web_view_web_controller.mm index 7442600ef..b209e197 100644 --- a/ios/web/web_state/ui/crw_wk_web_view_web_controller.mm +++ b/ios/web/web_state/ui/crw_wk_web_view_web_controller.mm
@@ -2004,6 +2004,10 @@ return [child webView]; } +- (void)webViewDidClose:(WKWebView*)webView { + [self orderClose]; +} + - (void)webView:(WKWebView*)webView runJavaScriptAlertPanelWithMessage:(NSString*)message initiatedByFrame:(WKFrameInfo*)frame
diff --git a/jingle/notifier/base/notifier_options.cc b/jingle/notifier/base/notifier_options.cc index 3cf02ed8..9a149a3c 100644 --- a/jingle/notifier/base/notifier_options.cc +++ b/jingle/notifier/base/notifier_options.cc
@@ -15,6 +15,8 @@ notification_method(kDefaultNotificationMethod), auth_mechanism(kDefaultGaiaAuthMechanism) {} +NotifierOptions::NotifierOptions(const NotifierOptions& other) = default; + NotifierOptions::~NotifierOptions() { } } // namespace notifier
diff --git a/jingle/notifier/base/notifier_options.h b/jingle/notifier/base/notifier_options.h index 0d7b471..08f03a8 100644 --- a/jingle/notifier/base/notifier_options.h +++ b/jingle/notifier/base/notifier_options.h
@@ -16,6 +16,7 @@ struct NotifierOptions { NotifierOptions(); + NotifierOptions(const NotifierOptions& other); ~NotifierOptions(); // Indicates that the SSLTCP port (443) is to be tried before the the XMPP
diff --git a/jingle/notifier/communicator/login_settings.cc b/jingle/notifier/communicator/login_settings.cc index 3f1d3dd..0c665d10 100644 --- a/jingle/notifier/communicator/login_settings.cc +++ b/jingle/notifier/communicator/login_settings.cc
@@ -28,6 +28,8 @@ DCHECK_GT(default_servers_.size(), 0u); } +LoginSettings::LoginSettings(const LoginSettings& other) = default; + LoginSettings::~LoginSettings() {} void LoginSettings::set_user_settings(
diff --git a/jingle/notifier/communicator/login_settings.h b/jingle/notifier/communicator/login_settings.h index 00a9589..c797bdd 100644 --- a/jingle/notifier/communicator/login_settings.h +++ b/jingle/notifier/communicator/login_settings.h
@@ -23,6 +23,8 @@ bool try_ssltcp_first, const std::string& auth_mechanism); + LoginSettings(const LoginSettings& other); + ~LoginSettings(); // Copy constructor and assignment operator welcome.
diff --git a/jingle/notifier/listener/notification_defines.cc b/jingle/notifier/listener/notification_defines.cc index f7c8f8fd..8220f8d 100644 --- a/jingle/notifier/listener/notification_defines.cc +++ b/jingle/notifier/listener/notification_defines.cc
@@ -55,6 +55,7 @@ } Notification::Notification() {} +Notification::Notification(const Notification& other) = default; Notification::~Notification() {} bool Notification::Equals(const Notification& other) const {
diff --git a/jingle/notifier/listener/notification_defines.h b/jingle/notifier/listener/notification_defines.h index 5d4a0c83..09d7e66 100644 --- a/jingle/notifier/listener/notification_defines.h +++ b/jingle/notifier/listener/notification_defines.h
@@ -47,6 +47,7 @@ struct Notification { Notification(); + Notification(const Notification& other); ~Notification(); // The channel the notification is coming in on.
diff --git a/media/BUILD.gn b/media/BUILD.gn index 18e1830f..b11b2d7 100644 --- a/media/BUILD.gn +++ b/media/BUILD.gn
@@ -101,76 +101,6 @@ component("media") { sources = [ - "capture/content/animated_content_sampler.cc", - "capture/content/animated_content_sampler.h", - "capture/content/capture_resolution_chooser.cc", - "capture/content/capture_resolution_chooser.h", - "capture/content/feedback_signal_accumulator.cc", - "capture/content/feedback_signal_accumulator.h", - "capture/content/screen_capture_device_core.cc", - "capture/content/screen_capture_device_core.h", - "capture/content/smooth_event_sampler.cc", - "capture/content/smooth_event_sampler.h", - "capture/content/thread_safe_capture_oracle.cc", - "capture/content/thread_safe_capture_oracle.h", - "capture/content/video_capture_oracle.cc", - "capture/content/video_capture_oracle.h", - "capture/device_monitor_mac.h", - "capture/device_monitor_mac.mm", - "capture/video/android/video_capture_device_android.cc", - "capture/video/android/video_capture_device_android.h", - "capture/video/android/video_capture_device_factory_android.cc", - "capture/video/android/video_capture_device_factory_android.h", - "capture/video/fake_video_capture_device.cc", - "capture/video/fake_video_capture_device.h", - "capture/video/fake_video_capture_device_factory.cc", - "capture/video/fake_video_capture_device_factory.h", - "capture/video/file_video_capture_device.cc", - "capture/video/file_video_capture_device.h", - "capture/video/file_video_capture_device_factory.cc", - "capture/video/file_video_capture_device_factory.h", - "capture/video/linux/v4l2_capture_delegate.cc", - "capture/video/linux/v4l2_capture_delegate.h", - "capture/video/linux/video_capture_device_chromeos.cc", - "capture/video/linux/video_capture_device_chromeos.h", - "capture/video/linux/video_capture_device_factory_linux.cc", - "capture/video/linux/video_capture_device_factory_linux.h", - "capture/video/linux/video_capture_device_linux.cc", - "capture/video/linux/video_capture_device_linux.h", - "capture/video/mac/platform_video_capturing_mac.h", - "capture/video/mac/video_capture_device_avfoundation_mac.h", - "capture/video/mac/video_capture_device_avfoundation_mac.mm", - "capture/video/mac/video_capture_device_decklink_mac.h", - "capture/video/mac/video_capture_device_decklink_mac.mm", - "capture/video/mac/video_capture_device_factory_mac.h", - "capture/video/mac/video_capture_device_factory_mac.mm", - "capture/video/mac/video_capture_device_mac.h", - "capture/video/mac/video_capture_device_mac.mm", - "capture/video/mac/video_capture_device_qtkit_mac.h", - "capture/video/mac/video_capture_device_qtkit_mac.mm", - "capture/video/video_capture_device.cc", - "capture/video/video_capture_device.h", - "capture/video/video_capture_device_factory.cc", - "capture/video/video_capture_device_factory.h", - "capture/video/video_capture_device_info.cc", - "capture/video/video_capture_device_info.h", - "capture/video/win/capability_list_win.cc", - "capture/video/win/capability_list_win.h", - "capture/video/win/filter_base_win.cc", - "capture/video/win/filter_base_win.h", - "capture/video/win/pin_base_win.cc", - "capture/video/win/pin_base_win.h", - "capture/video/win/sink_filter_observer_win.h", - "capture/video/win/sink_filter_win.cc", - "capture/video/win/sink_filter_win.h", - "capture/video/win/sink_input_pin_win.cc", - "capture/video/win/sink_input_pin_win.h", - "capture/video/win/video_capture_device_factory_win.cc", - "capture/video/win/video_capture_device_factory_win.h", - "capture/video/win/video_capture_device_mf_win.cc", - "capture/video/win/video_capture_device_mf_win.h", - "capture/video/win/video_capture_device_win.cc", - "capture/video/win/video_capture_device_win.h", "cdm/aes_decryptor.cc", "cdm/aes_decryptor.h", "cdm/cdm_adapter.cc", @@ -403,6 +333,7 @@ deps += [ "//media/base/android", "//media/base/android:media_jni_headers", + "//media/capture/video/android:capture_java", "//media/capture/video/android:capture_jni_headers", ] @@ -450,29 +381,10 @@ } if (is_mac) { - deps += [ - "//media/base/mac", - "//third_party/decklink", - ] + deps += [ "//media/base/mac" ] libs += [ "CoreVideo.framework", "OpenGL.framework", - "QTKit.framework", - ] - } - - if (use_udev) { - deps += [ "//device/udev_linux" ] - sources += [ - "capture/device_monitor_udev.cc", - "capture/device_monitor_udev.h", - ] - } - - if (is_openbsd) { - sources -= [ - "capture/video/linux/v4l2_capture_delegate_multi_plane.cc", - "capture/video/linux/v4l2_capture_delegate_multi_plane.h", ] } @@ -574,14 +486,10 @@ ":shared_memory_support", "//media/audio", "//media/base", + "//media/capture", "//third_party/opus", ] - # TODO(mcasas) Remove this after http://crbug.com/584797 - if (is_android) { - public_deps += [ "//media/capture/video/android" ] - } - deps += [ "//base", "//base:i18n", @@ -624,13 +532,6 @@ test("media_unittests") { sources = [ - "capture/content/animated_content_sampler_unittest.cc", - "capture/content/capture_resolution_chooser_unittest.cc", - "capture/content/feedback_signal_accumulator_unittest.cc", - "capture/content/smooth_event_sampler_unittest.cc", - "capture/content/video_capture_oracle_unittest.cc", - "capture/video/fake_video_capture_device_unittest.cc", - "capture/video/video_capture_device_unittest.cc", "cdm/aes_decryptor_unittest.cc", "cdm/external_clear_key_test_helper.cc", "cdm/external_clear_key_test_helper.h", @@ -704,6 +605,7 @@ "//media/audio:unittests", "//media/base:test_support", "//media/base:unittests", + "//media/capture:unittests", "//media/test:pipeline_integration_tests", "//skia", # Direct dependency required to inherit config. "//testing/gmock", @@ -807,11 +709,6 @@ deps += [ "//media/base/mac" ] } - if (is_mac) { - sources += - [ "capture/video/mac/video_capture_device_factory_mac_unittest.mm" ] - } - # include_dirs += [ # # Needed by media_drm_bridge.cc. # target_gen_dir,
diff --git a/media/OWNERS b/media/OWNERS index e65ac6fb..7209529 100644 --- a/media/OWNERS +++ b/media/OWNERS
@@ -8,10 +8,13 @@ # and to load balance. Only use OWNERS in this file for these subdirectories # when doing refactorings and general cleanups. +chcunningham@chromium.org dalecurtis@chromium.org ddorwin@chromium.org +hubbe@chromium.org jrummell@chromium.org sandersd@chromium.org +watk@chromium.org wolenetz@chromium.org xhwang@chromium.org
diff --git a/media/base/BUILD.gn b/media/base/BUILD.gn index 789b810c..0bfd455 100644 --- a/media/base/BUILD.gn +++ b/media/base/BUILD.gn
@@ -12,7 +12,10 @@ source_set("base") { # This is part of the media component. - visibility = [ "//media" ] + visibility = [ + "//media", + "//media/capture", + ] sources = [ "audio_block_fifo.cc", "audio_block_fifo.h",
diff --git a/media/base/audio_decoder_config.cc b/media/base/audio_decoder_config.cc index 9d3f672..3f279f2 100644 --- a/media/base/audio_decoder_config.cc +++ b/media/base/audio_decoder_config.cc
@@ -70,6 +70,9 @@ extra_data, is_encrypted, base::TimeDelta(), 0); } +AudioDecoderConfig::AudioDecoderConfig(const AudioDecoderConfig& other) = + default; + void AudioDecoderConfig::Initialize(AudioCodec codec, SampleFormat sample_format, ChannelLayout channel_layout,
diff --git a/media/base/audio_decoder_config.h b/media/base/audio_decoder_config.h index a0e262f..c3489cc2 100644 --- a/media/base/audio_decoder_config.h +++ b/media/base/audio_decoder_config.h
@@ -68,6 +68,8 @@ const std::vector<uint8_t>& extra_data, bool is_encrypted); + AudioDecoderConfig(const AudioDecoderConfig& other); + ~AudioDecoderConfig(); // Resets the internal state of this object. |codec_delay| is in frames.
diff --git a/media/base/audio_shifter.cc b/media/base/audio_shifter.cc index c88af3ac..6a268d3 100644 --- a/media/base/audio_shifter.cc +++ b/media/base/audio_shifter.cc
@@ -82,6 +82,9 @@ audio(audio_.release()) { } +AudioShifter::AudioQueueEntry::AudioQueueEntry(const AudioQueueEntry& other) = + default; + AudioShifter::AudioQueueEntry::~AudioQueueEntry() {} AudioShifter::AudioShifter(base::TimeDelta max_buffer_size,
diff --git a/media/base/audio_shifter.h b/media/base/audio_shifter.h index 0156269..3429a2f 100644 --- a/media/base/audio_shifter.h +++ b/media/base/audio_shifter.h
@@ -89,6 +89,7 @@ struct AudioQueueEntry { AudioQueueEntry(base::TimeTicks target_playout_time_, scoped_ptr<AudioBus> audio_); + AudioQueueEntry(const AudioQueueEntry& other); ~AudioQueueEntry(); base::TimeTicks target_playout_time; linked_ptr<AudioBus> audio;
diff --git a/media/base/audio_video_metadata_extractor.cc b/media/base/audio_video_metadata_extractor.cc index 0ba36e1..5b92c15 100644 --- a/media/base/audio_video_metadata_extractor.cc +++ b/media/base/audio_video_metadata_extractor.cc
@@ -54,6 +54,9 @@ AudioVideoMetadataExtractor::StreamInfo::StreamInfo() {} +AudioVideoMetadataExtractor::StreamInfo::StreamInfo(const StreamInfo& other) = + default; + AudioVideoMetadataExtractor::StreamInfo::~StreamInfo() {} AudioVideoMetadataExtractor::AudioVideoMetadataExtractor()
diff --git a/media/base/audio_video_metadata_extractor.h b/media/base/audio_video_metadata_extractor.h index 97f7a5b..4e5906d 100644 --- a/media/base/audio_video_metadata_extractor.h +++ b/media/base/audio_video_metadata_extractor.h
@@ -26,6 +26,7 @@ struct StreamInfo { StreamInfo(); + StreamInfo(const StreamInfo& other); ~StreamInfo(); std::string type; TagDictionary tags;
diff --git a/media/base/bitstream_buffer.cc b/media/base/bitstream_buffer.cc index 49caf5b..5732981 100644 --- a/media/base/bitstream_buffer.cc +++ b/media/base/bitstream_buffer.cc
@@ -23,6 +23,8 @@ size_(size), presentation_timestamp_(presentation_timestamp) {} +BitstreamBuffer::BitstreamBuffer(const BitstreamBuffer& other) = default; + BitstreamBuffer::~BitstreamBuffer() {} void BitstreamBuffer::SetDecryptConfig(const DecryptConfig& decrypt_config) {
diff --git a/media/base/bitstream_buffer.h b/media/base/bitstream_buffer.h index fe3c8da3..9ceeaf89 100644 --- a/media/base/bitstream_buffer.h +++ b/media/base/bitstream_buffer.h
@@ -28,6 +28,8 @@ size_t size, base::TimeDelta presentation_timestamp); + BitstreamBuffer(const BitstreamBuffer& other); + ~BitstreamBuffer(); void SetDecryptConfig(const DecryptConfig& decrypt_config);
diff --git a/media/base/cdm_key_information.cc b/media/base/cdm_key_information.cc index 70d4464..efaed61f 100644 --- a/media/base/cdm_key_information.cc +++ b/media/base/cdm_key_information.cc
@@ -32,6 +32,8 @@ status(status), system_code(system_code) {} +CdmKeyInformation::CdmKeyInformation(const CdmKeyInformation& other) = default; + CdmKeyInformation::~CdmKeyInformation() { }
diff --git a/media/base/cdm_key_information.h b/media/base/cdm_key_information.h index 89c8112..7ed8eff 100644 --- a/media/base/cdm_key_information.h +++ b/media/base/cdm_key_information.h
@@ -40,6 +40,7 @@ size_t key_id_length, KeyStatus status, uint32_t system_code); + CdmKeyInformation(const CdmKeyInformation& other); ~CdmKeyInformation(); std::vector<uint8_t> key_id;
diff --git a/media/base/key_system_info.cc b/media/base/key_system_info.cc index f36104a..da3586d 100644 --- a/media/base/key_system_info.cc +++ b/media/base/key_system_info.cc
@@ -9,6 +9,8 @@ KeySystemInfo::KeySystemInfo() { } +KeySystemInfo::KeySystemInfo(const KeySystemInfo& other) = default; + KeySystemInfo::~KeySystemInfo() { }
diff --git a/media/base/key_system_info.h b/media/base/key_system_info.h index 0a9ba67..fe4dae7a 100644 --- a/media/base/key_system_info.h +++ b/media/base/key_system_info.h
@@ -28,6 +28,7 @@ // the corresponding CDM. struct MEDIA_EXPORT KeySystemInfo { KeySystemInfo(); + KeySystemInfo(const KeySystemInfo& other); ~KeySystemInfo(); std::string key_system;
diff --git a/media/base/serial_runner.cc b/media/base/serial_runner.cc index 2e085e358..6cb89cb 100644 --- a/media/base/serial_runner.cc +++ b/media/base/serial_runner.cc
@@ -40,6 +40,7 @@ } SerialRunner::Queue::Queue() {} +SerialRunner::Queue::Queue(const Queue& other) = default; SerialRunner::Queue::~Queue() {} void SerialRunner::Queue::Push(const base::Closure& closure) {
diff --git a/media/base/serial_runner.h b/media/base/serial_runner.h index 4847e4c..3adfd64 100644 --- a/media/base/serial_runner.h +++ b/media/base/serial_runner.h
@@ -34,6 +34,7 @@ class MEDIA_EXPORT Queue { public: Queue(); + Queue(const Queue& other); ~Queue(); void Push(const base::Closure& closure);
diff --git a/media/base/text_track_config.cc b/media/base/text_track_config.cc index 0d4b11f6..dbd2b2d 100644 --- a/media/base/text_track_config.cc +++ b/media/base/text_track_config.cc
@@ -20,6 +20,8 @@ id_(id) { } +TextTrackConfig::TextTrackConfig(const TextTrackConfig& other) = default; + bool TextTrackConfig::Matches(const TextTrackConfig& config) const { return config.kind() == kind_ && config.label() == label_ &&
diff --git a/media/base/text_track_config.h b/media/base/text_track_config.h index 58efba4..33128df9 100644 --- a/media/base/text_track_config.h +++ b/media/base/text_track_config.h
@@ -23,6 +23,7 @@ class MEDIA_EXPORT TextTrackConfig { public: TextTrackConfig(); + TextTrackConfig(const TextTrackConfig& other); TextTrackConfig(TextKind kind, const std::string& label, const std::string& language,
diff --git a/media/base/video_decoder_config.cc b/media/base/video_decoder_config.cc index dfe7254e..930ffd9 100644 --- a/media/base/video_decoder_config.cc +++ b/media/base/video_decoder_config.cc
@@ -55,6 +55,9 @@ natural_size, extra_data, is_encrypted); } +VideoDecoderConfig::VideoDecoderConfig(const VideoDecoderConfig& other) = + default; + VideoDecoderConfig::~VideoDecoderConfig() {} void VideoDecoderConfig::Initialize(VideoCodec codec,
diff --git a/media/base/video_decoder_config.h b/media/base/video_decoder_config.h index ae9340af..4a192d6c 100644 --- a/media/base/video_decoder_config.h +++ b/media/base/video_decoder_config.h
@@ -40,6 +40,8 @@ const std::vector<uint8_t>& extra_data, bool is_encrypted); + VideoDecoderConfig(const VideoDecoderConfig& other); + ~VideoDecoderConfig(); // Resets the internal state of this object.
diff --git a/media/blink/webmediaplayer_impl.cc b/media/blink/webmediaplayer_impl.cc index 4f966eb..102c4324 100644 --- a/media/blink/webmediaplayer_impl.cc +++ b/media/blink/webmediaplayer_impl.cc
@@ -642,12 +642,12 @@ return pipeline_.GetMediaTime().InSecondsF(); } -WebMediaPlayer::NetworkState WebMediaPlayerImpl::networkState() const { +WebMediaPlayer::NetworkState WebMediaPlayerImpl::getNetworkState() const { DCHECK(main_task_runner_->BelongsToCurrentThread()); return network_state_; } -WebMediaPlayer::ReadyState WebMediaPlayerImpl::readyState() const { +WebMediaPlayer::ReadyState WebMediaPlayerImpl::getReadyState() const { DCHECK(main_task_runner_->BelongsToCurrentThread()); return ready_state_; } @@ -806,18 +806,11 @@ return; } - // Although unlikely, it is possible that multiple calls happen - // simultaneously, so fail this call if there is already one pending. - if (set_cdm_result_) { - result.completeWithError( - blink::WebContentDecryptionModuleExceptionInvalidStateError, 0, - "Unable to set MediaKeys object at this time."); - return; - } - // Create a local copy of |result| to avoid problems with the callback // getting passed to the media thread and causing |result| to be destructed - // on the wrong thread in some failure conditions. + // on the wrong thread in some failure conditions. Blink should prevent + // multiple simultaneous calls. + DCHECK(!set_cdm_result_); set_cdm_result_.reset(new blink::WebContentDecryptionModuleResult(result)); SetCdm(BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnCdmAttached),
diff --git a/media/blink/webmediaplayer_impl.h b/media/blink/webmediaplayer_impl.h index 73a1ce9e..ffd9c22 100644 --- a/media/blink/webmediaplayer_impl.h +++ b/media/blink/webmediaplayer_impl.h
@@ -133,8 +133,8 @@ // Internal states of loading and network. // TODO(hclam): Ask the pipeline about the state rather than having reading // them from members which would cause race conditions. - blink::WebMediaPlayer::NetworkState networkState() const override; - blink::WebMediaPlayer::ReadyState readyState() const override; + blink::WebMediaPlayer::NetworkState getNetworkState() const override; + blink::WebMediaPlayer::ReadyState getReadyState() const override; bool didLoadingProgress() override;
diff --git a/media/capture.gypi b/media/capture.gypi new file mode 100644 index 0000000..f326b1cf --- /dev/null +++ b/media/capture.gypi
@@ -0,0 +1,111 @@ +# Copyright 2016 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +{ + 'defines': [ + 'MEDIA_IMPLEMENTATION', + ], + 'variables': { + # GN version: //media/capture:capture + 'capture_sources': [ + 'capture/content/animated_content_sampler.cc', + 'capture/content/animated_content_sampler.h', + 'capture/content/capture_resolution_chooser.cc', + 'capture/content/capture_resolution_chooser.h', + 'capture/content/feedback_signal_accumulator.cc', + 'capture/content/feedback_signal_accumulator.h', + 'capture/content/screen_capture_device_core.cc', + 'capture/content/screen_capture_device_core.h', + 'capture/content/thread_safe_capture_oracle.cc', + 'capture/content/thread_safe_capture_oracle.h', + 'capture/content/smooth_event_sampler.cc', + 'capture/content/smooth_event_sampler.h', + 'capture/content/video_capture_oracle.cc', + 'capture/content/video_capture_oracle.h', + 'capture/device_monitor_mac.h', + 'capture/device_monitor_mac.mm', + 'capture/video/android/video_capture_device_android.cc', + 'capture/video/android/video_capture_device_android.h', + 'capture/video/android/video_capture_device_factory_android.cc', + 'capture/video/android/video_capture_device_factory_android.h', + 'capture/video/fake_video_capture_device.cc', + 'capture/video/fake_video_capture_device.h', + 'capture/video/fake_video_capture_device_factory.cc', + 'capture/video/fake_video_capture_device_factory.h', + 'capture/video/file_video_capture_device.cc', + 'capture/video/file_video_capture_device.h', + 'capture/video/file_video_capture_device_factory.cc', + 'capture/video/file_video_capture_device_factory.h', + 'capture/video/linux/v4l2_capture_delegate.cc', + 'capture/video/linux/v4l2_capture_delegate.h', + 'capture/video/linux/video_capture_device_chromeos.cc', + 'capture/video/linux/video_capture_device_chromeos.h', + 'capture/video/linux/video_capture_device_factory_linux.cc', + 'capture/video/linux/video_capture_device_factory_linux.h', + 'capture/video/linux/video_capture_device_linux.cc', + 'capture/video/linux/video_capture_device_linux.h', + 'capture/video/mac/platform_video_capturing_mac.h', + 'capture/video/mac/video_capture_device_avfoundation_mac.h', + 'capture/video/mac/video_capture_device_avfoundation_mac.mm', + 'capture/video/mac/video_capture_device_decklink_mac.h', + 'capture/video/mac/video_capture_device_decklink_mac.mm', + 'capture/video/mac/video_capture_device_factory_mac.h', + 'capture/video/mac/video_capture_device_factory_mac.mm', + 'capture/video/mac/video_capture_device_mac.h', + 'capture/video/mac/video_capture_device_mac.mm', + 'capture/video/mac/video_capture_device_qtkit_mac.h', + 'capture/video/mac/video_capture_device_qtkit_mac.mm', + 'capture/video/video_capture_device.cc', + 'capture/video/video_capture_device.h', + 'capture/video/video_capture_device_factory.cc', + 'capture/video/video_capture_device_factory.h', + 'capture/video/video_capture_device_info.cc', + 'capture/video/video_capture_device_info.h', + 'capture/video/win/capability_list_win.cc', + 'capture/video/win/capability_list_win.h', + 'capture/video/win/filter_base_win.cc', + 'capture/video/win/filter_base_win.h', + 'capture/video/win/pin_base_win.cc', + 'capture/video/win/pin_base_win.h', + 'capture/video/win/sink_filter_observer_win.h', + 'capture/video/win/sink_filter_win.cc', + 'capture/video/win/sink_filter_win.h', + 'capture/video/win/sink_input_pin_win.cc', + 'capture/video/win/sink_input_pin_win.h', + 'capture/video/win/video_capture_device_factory_win.cc', + 'capture/video/win/video_capture_device_factory_win.h', + 'capture/video/win/video_capture_device_mf_win.cc', + 'capture/video/win/video_capture_device_mf_win.h', + 'capture/video/win/video_capture_device_win.cc', + 'capture/video/win/video_capture_device_win.h' + ], + + # GN version: //media/capture:unittests + 'capture_unittests_sources': [ + 'capture/content/animated_content_sampler_unittest.cc', + 'capture/content/capture_resolution_chooser_unittest.cc', + 'capture/content/feedback_signal_accumulator_unittest.cc', + 'capture/content/smooth_event_sampler_unittest.cc', + 'capture/content/video_capture_oracle_unittest.cc', + 'capture/video/fake_video_capture_device_unittest.cc', + 'capture/video/video_capture_device_unittest.cc' + ], + + # The following files lack the correct platform suffixes. + 'conditions': [ + ['OS=="linux" and use_udev==1', { + 'capture_sources': [ + 'capture/device_monitor_udev.cc', + 'capture/device_monitor_udev.h', + ], + }], + + ['OS=="mac"', { + 'capture_unittests_sources': [ + 'capture/video/mac/video_capture_device_factory_mac_unittest.mm', + ] + }], + ], + }, +}
diff --git a/media/capture/BUILD.gn b/media/capture/BUILD.gn new file mode 100644 index 0000000..fa97b73 --- /dev/null +++ b/media/capture/BUILD.gn
@@ -0,0 +1,159 @@ +# Copyright 2016 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import("//build/config/features.gni") +import("//media/media_options.gni") +import("//testing/test.gni") + +source_set("capture") { + sources = [ + "content/animated_content_sampler.cc", + "content/animated_content_sampler.h", + "content/capture_resolution_chooser.cc", + "content/capture_resolution_chooser.h", + "content/feedback_signal_accumulator.cc", + "content/feedback_signal_accumulator.h", + "content/screen_capture_device_core.cc", + "content/screen_capture_device_core.h", + "content/smooth_event_sampler.cc", + "content/smooth_event_sampler.h", + "content/thread_safe_capture_oracle.cc", + "content/thread_safe_capture_oracle.h", + "content/video_capture_oracle.cc", + "content/video_capture_oracle.h", + "device_monitor_mac.h", + "device_monitor_mac.mm", + "video/android/video_capture_device_android.cc", + "video/android/video_capture_device_android.h", + "video/android/video_capture_device_factory_android.cc", + "video/android/video_capture_device_factory_android.h", + "video/fake_video_capture_device.cc", + "video/fake_video_capture_device.h", + "video/fake_video_capture_device_factory.cc", + "video/fake_video_capture_device_factory.h", + "video/file_video_capture_device.cc", + "video/file_video_capture_device.h", + "video/file_video_capture_device_factory.cc", + "video/file_video_capture_device_factory.h", + "video/linux/v4l2_capture_delegate.cc", + "video/linux/video_capture_device_chromeos.cc", + "video/linux/video_capture_device_chromeos.h", + "video/linux/video_capture_device_factory_linux.cc", + "video/linux/video_capture_device_factory_linux.h", + "video/linux/video_capture_device_linux.cc", + "video/linux/video_capture_device_linux.h", + "video/mac/platform_video_capturing_mac.h", + "video/mac/video_capture_device_avfoundation_mac.h", + "video/mac/video_capture_device_avfoundation_mac.mm", + "video/mac/video_capture_device_decklink_mac.h", + "video/mac/video_capture_device_decklink_mac.mm", + "video/mac/video_capture_device_factory_mac.h", + "video/mac/video_capture_device_factory_mac.mm", + "video/mac/video_capture_device_mac.h", + "video/mac/video_capture_device_mac.mm", + "video/mac/video_capture_device_qtkit_mac.h", + "video/mac/video_capture_device_qtkit_mac.mm", + "video/video_capture_device.cc", + "video/video_capture_device.h", + "video/video_capture_device_factory.cc", + "video/video_capture_device_factory.h", + "video/video_capture_device_info.cc", + "video/video_capture_device_info.h", + "video/win/capability_list_win.cc", + "video/win/capability_list_win.h", + "video/win/filter_base_win.cc", + "video/win/filter_base_win.h", + "video/win/pin_base_win.cc", + "video/win/pin_base_win.h", + "video/win/sink_filter_observer_win.h", + "video/win/sink_filter_win.cc", + "video/win/sink_filter_win.h", + "video/win/sink_input_pin_win.cc", + "video/win/sink_input_pin_win.h", + "video/win/video_capture_device_factory_win.cc", + "video/win/video_capture_device_factory_win.h", + "video/win/video_capture_device_mf_win.cc", + "video/win/video_capture_device_mf_win.h", + "video/win/video_capture_device_win.cc", + "video/win/video_capture_device_win.h", + ] + + public_deps = [] + deps = [ + "//base", + "//media/base", + "//skia", + ] + + configs += [ + "//media:media_implementation", + + # TODO(mcasas): Fix size_t to int truncation warning-treated-as-errors. + "//build/config/compiler:no_size_t_to_int_warning", + ] + + if (is_android) { + public_deps += [ "video/android" ] + deps += [ "video/android:capture_jni_headers" ] + } + + if (is_mac) { + deps += [ + "//media/base/mac", + "//third_party/decklink", + ] + libs = [ "QTKit.framework" ] + } + + if (use_udev) { + deps += [ "//device/udev_linux" ] + sources += [ + "device_monitor_udev.cc", + "device_monitor_udev.h", + ] + } + + if (is_win) { + public_deps += [ "//media/base/win" ] + libs = [ + "mf.lib", + "mfplat.lib", + "mfreadwrite.lib", + "mfuuid.lib", + ] + + ldflags = [ + "/DELAYLOAD:mf.dll", + "/DELAYLOAD:mfplat.dll", + "/DELAYLOAD:mfreadwrite.dll", + ] + } +} + +source_set("unittests") { + testonly = true + + sources = [ + "content/animated_content_sampler_unittest.cc", + "content/capture_resolution_chooser_unittest.cc", + "content/feedback_signal_accumulator_unittest.cc", + "content/smooth_event_sampler_unittest.cc", + "content/video_capture_oracle_unittest.cc", + "video/fake_video_capture_device_unittest.cc", + "video/video_capture_device_unittest.cc", + ] + + deps = [ + "//media/base:unittests", + "//testing/gmock", + "//testing/gtest", + ] + + # TODO(mcasas): Fix size_t to int truncation warning-treated-as-errors. + configs += [ "//build/config/compiler:no_size_t_to_int_warning" ] + + if (is_mac) { + sources += [ "video/mac/video_capture_device_factory_mac_unittest.mm" ] + } +}
diff --git a/media/capture/OWNERS b/media/capture/OWNERS new file mode 100644 index 0000000..000874b --- /dev/null +++ b/media/capture/OWNERS
@@ -0,0 +1,6 @@ +# These individual OWNERS also OWN the global capture/ folder. + +# For content/ +file://media/capture/content/OWNERS +# For video/ +file://media/capture/video/OWNERS
diff --git a/media/capture/video/video_capture_device_info.cc b/media/capture/video/video_capture_device_info.cc index 3bb4df2a..230c16b 100644 --- a/media/capture/video/video_capture_device_info.cc +++ b/media/capture/video/video_capture_device_info.cc
@@ -15,6 +15,9 @@ : name(name), supported_formats(supported_formats) { } +VideoCaptureDeviceInfo::VideoCaptureDeviceInfo( + const VideoCaptureDeviceInfo& other) = default; + VideoCaptureDeviceInfo::~VideoCaptureDeviceInfo() { }
diff --git a/media/capture/video/video_capture_device_info.h b/media/capture/video/video_capture_device_info.h index 3cdb1b5..c34b27951 100644 --- a/media/capture/video/video_capture_device_info.h +++ b/media/capture/video/video_capture_device_info.h
@@ -15,6 +15,7 @@ VideoCaptureDeviceInfo(); VideoCaptureDeviceInfo(const VideoCaptureDevice::Name& name, const VideoCaptureFormats& supported_formats); + VideoCaptureDeviceInfo(const VideoCaptureDeviceInfo& other); ~VideoCaptureDeviceInfo(); VideoCaptureDevice::Name name;
diff --git a/media/cast/cast_config.cc b/media/cast/cast_config.cc index f3b1612b..1a619fd 100644 --- a/media/cast/cast_config.cc +++ b/media/cast/cast_config.cc
@@ -58,6 +58,8 @@ codec(CODEC_VIDEO_VP8), number_of_encode_threads(1) {} +VideoSenderConfig::VideoSenderConfig(const VideoSenderConfig& other) = default; + VideoSenderConfig::~VideoSenderConfig() {} AudioSenderConfig::AudioSenderConfig() @@ -72,6 +74,8 @@ bitrate(kDefaultAudioEncoderBitrate), codec(CODEC_AUDIO_OPUS) {} +AudioSenderConfig::AudioSenderConfig(const AudioSenderConfig& other) = default; + AudioSenderConfig::~AudioSenderConfig() {} FrameReceiverConfig::FrameReceiverConfig() @@ -84,6 +88,9 @@ target_frame_rate(0), codec(CODEC_UNKNOWN) {} +FrameReceiverConfig::FrameReceiverConfig(const FrameReceiverConfig& other) = + default; + FrameReceiverConfig::~FrameReceiverConfig() {} } // namespace cast
diff --git a/media/cast/cast_config.h b/media/cast/cast_config.h index e6a0a62..465f924 100644 --- a/media/cast/cast_config.h +++ b/media/cast/cast_config.h
@@ -59,6 +59,7 @@ // http://crbug.com/530839 struct AudioSenderConfig { AudioSenderConfig(); + AudioSenderConfig(const AudioSenderConfig& other); ~AudioSenderConfig(); // Identifier referring to the sender, used by the receiver. @@ -97,6 +98,7 @@ struct VideoSenderConfig { VideoSenderConfig(); + VideoSenderConfig(const VideoSenderConfig& other); ~VideoSenderConfig(); // Identifier referring to the sender, used by the receiver. @@ -163,6 +165,7 @@ // TODO(miu): Naming and minor type changes are badly needed in a later CL. struct FrameReceiverConfig { FrameReceiverConfig(); + FrameReceiverConfig(const FrameReceiverConfig& other); ~FrameReceiverConfig(); // The receiver's SSRC identifier.
diff --git a/media/cast/logging/encoding_event_subscriber.cc b/media/cast/logging/encoding_event_subscriber.cc index 27e9405..27aae92d 100644 --- a/media/cast/logging/encoding_event_subscriber.cc +++ b/media/cast/logging/encoding_event_subscriber.cc
@@ -68,14 +68,18 @@ const RtpTimeDelta relative_rtp_timestamp = GetRelativeRtpTimestamp(frame_event.rtp_timestamp); + uint32_t lower_32_bits = relative_rtp_timestamp.lower_32_bits(); FrameEventMap::iterator it = frame_event_map_.find(relative_rtp_timestamp); linked_ptr<AggregatedFrameEvent> event_proto; // Look up existing entry. If not found, create a new entry and add to map. if (it == frame_event_map_.end()) { + if (!ShouldCreateNewProto(lower_32_bits)) + return; + + IncrementStoredProtoCount(lower_32_bits); event_proto.reset(new AggregatedFrameEvent); - event_proto->set_relative_rtp_timestamp( - relative_rtp_timestamp.lower_32_bits()); + event_proto->set_relative_rtp_timestamp(lower_32_bits); frame_event_map_.insert( std::make_pair(relative_rtp_timestamp, event_proto)); } else { @@ -84,9 +88,14 @@ DVLOG(2) << "Too many events in frame " << frame_event.rtp_timestamp << ". Using new frame event proto."; AddFrameEventToStorage(event_proto); + if (!ShouldCreateNewProto(lower_32_bits)) { + frame_event_map_.erase(it); + return; + } + + IncrementStoredProtoCount(lower_32_bits); event_proto.reset(new AggregatedFrameEvent); - event_proto->set_relative_rtp_timestamp( - relative_rtp_timestamp.lower_32_bits()); + event_proto->set_relative_rtp_timestamp(lower_32_bits); it->second = event_proto; } } @@ -137,6 +146,7 @@ const RtpTimeDelta relative_rtp_timestamp = GetRelativeRtpTimestamp(packet_event.rtp_timestamp); + uint32_t lower_32_bits = relative_rtp_timestamp.lower_32_bits(); PacketEventMap::iterator it = packet_event_map_.find(relative_rtp_timestamp); linked_ptr<AggregatedPacketEvent> event_proto; @@ -144,9 +154,12 @@ // Look up existing entry. If not found, create a new entry and add to map. if (it == packet_event_map_.end()) { + if (!ShouldCreateNewProto(lower_32_bits)) + return; + + IncrementStoredProtoCount(lower_32_bits); event_proto.reset(new AggregatedPacketEvent); - event_proto->set_relative_rtp_timestamp( - relative_rtp_timestamp.lower_32_bits()); + event_proto->set_relative_rtp_timestamp(lower_32_bits); packet_event_map_.insert( std::make_pair(relative_rtp_timestamp, event_proto)); base_packet_event_proto = GetNewBasePacketEvent( @@ -172,9 +185,14 @@ << packet_event.rtp_timestamp << ". " << "Using new packet event proto."; AddPacketEventToStorage(event_proto); + if (!ShouldCreateNewProto(lower_32_bits)) { + packet_event_map_.erase(it); + return; + } + + IncrementStoredProtoCount(lower_32_bits); event_proto.reset(new AggregatedPacketEvent); - event_proto->set_relative_rtp_timestamp( - relative_rtp_timestamp.lower_32_bits()); + event_proto->set_relative_rtp_timestamp(lower_32_bits); it->second = event_proto; } @@ -186,9 +204,14 @@ << packet_event.rtp_timestamp << ", " << packet_event.packet_id << ". Using new packet event proto."; AddPacketEventToStorage(event_proto); + if (!ShouldCreateNewProto(lower_32_bits)) { + packet_event_map_.erase(it); + return; + } + + IncrementStoredProtoCount(lower_32_bits); event_proto.reset(new AggregatedPacketEvent); - event_proto->set_relative_rtp_timestamp( - relative_rtp_timestamp.lower_32_bits()); + event_proto->set_relative_rtp_timestamp(lower_32_bits); it->second = event_proto; base_packet_event_proto = GetNewBasePacketEvent( event_proto.get(), packet_event.packet_id, packet_event.size); @@ -264,7 +287,9 @@ void EncodingEventSubscriber::AddFrameEventToStorage( const linked_ptr<AggregatedFrameEvent>& frame_event_proto) { if (frame_event_storage_.size() >= max_frames_) { - frame_event_storage_[frame_event_storage_index_] = frame_event_proto; + auto& entry = frame_event_storage_[frame_event_storage_index_]; + DecrementStoredProtoCount(entry->relative_rtp_timestamp()); + entry = frame_event_proto; } else { frame_event_storage_.push_back(frame_event_proto); } @@ -274,14 +299,47 @@ void EncodingEventSubscriber::AddPacketEventToStorage( const linked_ptr<AggregatedPacketEvent>& packet_event_proto) { - if (packet_event_storage_.size() >= max_frames_) - packet_event_storage_[packet_event_storage_index_] = packet_event_proto; - else + if (packet_event_storage_.size() >= max_frames_) { + auto& entry = packet_event_storage_[packet_event_storage_index_]; + DecrementStoredProtoCount(entry->relative_rtp_timestamp()); + entry = packet_event_proto; + } else { packet_event_storage_.push_back(packet_event_proto); + } packet_event_storage_index_ = (packet_event_storage_index_ + 1) % max_frames_; } +bool EncodingEventSubscriber::ShouldCreateNewProto( + uint32_t relative_rtp_timestamp_lower_32_bits) const { + auto it = stored_proto_counts_.find(relative_rtp_timestamp_lower_32_bits); + int proto_count = it == stored_proto_counts_.end() ? 0 : it->second; + DVLOG_IF(2, proto_count >= kMaxProtosPerFrame) + << relative_rtp_timestamp_lower_32_bits + << " already reached max number of protos."; + return proto_count < kMaxProtosPerFrame; +} + +void EncodingEventSubscriber::IncrementStoredProtoCount( + uint32_t relative_rtp_timestamp_lower_32_bits) { + stored_proto_counts_[relative_rtp_timestamp_lower_32_bits]++; + DCHECK_LE(stored_proto_counts_[relative_rtp_timestamp_lower_32_bits], + kMaxProtosPerFrame) + << relative_rtp_timestamp_lower_32_bits + << " exceeded max number of event protos."; +} + +void EncodingEventSubscriber::DecrementStoredProtoCount( + uint32_t relative_rtp_timestamp_lower_32_bits) { + auto it = stored_proto_counts_.find(relative_rtp_timestamp_lower_32_bits); + DCHECK(it != stored_proto_counts_.end()) + << "no event protos for " << relative_rtp_timestamp_lower_32_bits; + if (it->second > 1) + it->second--; + else + stored_proto_counts_.erase(it); +} + RtpTimeDelta EncodingEventSubscriber::GetRelativeRtpTimestamp( RtpTimeTicks rtp_timestamp) { if (!seen_first_rtp_timestamp_) { @@ -299,6 +357,7 @@ packet_event_map_.clear(); packet_event_storage_.clear(); packet_event_storage_index_ = 0; + stored_proto_counts_.clear(); seen_first_rtp_timestamp_ = false; first_rtp_timestamp_ = RtpTimeTicks(); }
diff --git a/media/cast/logging/encoding_event_subscriber.h b/media/cast/logging/encoding_event_subscriber.h index ba077c0..c638584 100644 --- a/media/cast/logging/encoding_event_subscriber.h +++ b/media/cast/logging/encoding_event_subscriber.h
@@ -22,11 +22,15 @@ // Number of packets per frame recorded by the subscriber. // Once the max number of packets has been reached, a new aggregated proto // will be created. -static const int kMaxPacketsPerFrame = 64; -// Number of events per proto recorded by the subscriber. +static const int kMaxPacketsPerFrame = 256; +// Number of events per frame/packet proto recorded by the subscriber. // Once the max number of events has been reached, a new aggregated proto // will be created. static const int kMaxEventsPerProto = 16; +// Max number of AggregatedFrameEvent / AggregatedPacketEvent protos stored for +// a frame. Once the max number of protos has been reached for that frame, +// further events for that frame will be dropped. +static const int kMaxProtosPerFrame = 10; typedef std::vector<linked_ptr<media::cast::proto::AggregatedFrameEvent> > FrameEventList; @@ -89,6 +93,11 @@ const linked_ptr<media::cast::proto::AggregatedPacketEvent>& packet_event_proto); + bool ShouldCreateNewProto( + uint32_t relative_rtp_timestamp_lower_32_bits) const; + void IncrementStoredProtoCount(uint32_t relative_rtp_timestamp_lower_32_bits); + void DecrementStoredProtoCount(uint32_t relative_rtp_timestamp_lower_32_bits); + // Returns the difference between |rtp_timestamp| and |first_rtp_timestamp_|. // Sets |first_rtp_timestamp_| if it is not already set. RtpTimeDelta GetRelativeRtpTimestamp(RtpTimeTicks rtp_timestamp); @@ -107,6 +116,11 @@ PacketEventList packet_event_storage_; int packet_event_storage_index_; + // Maps from the lower 32 bits of a RTP timestamp to the number of + // AggregatedFrameEvent / AggregatedPacketEvent protos that have been stored + // for that frame. + std::map<uint32_t, int> stored_proto_counts_; + // All functions must be called on the main thread. base::ThreadChecker thread_checker_;
diff --git a/media/cast/logging/encoding_event_subscriber_unittest.cc b/media/cast/logging/encoding_event_subscriber_unittest.cc index 6d711ff..2c14fbd 100644 --- a/media/cast/logging/encoding_event_subscriber_unittest.cc +++ b/media/cast/logging/encoding_event_subscriber_unittest.cc
@@ -152,6 +152,53 @@ EXPECT_EQ(1000u, packet_events_.back()->relative_rtp_timestamp()); } +TEST_F(EncodingEventSubscriberTest, TooManyProtos) { + Init(VIDEO_EVENT); + size_t num_frame_event_protos = 3; + size_t num_packet_event_protos = kMaxProtosPerFrame - num_frame_event_protos; + base::TimeTicks now(testing_clock_->NowTicks()); + + for (size_t i = 0; i < num_frame_event_protos; i++) { + for (int j = 0; j < kMaxEventsPerProto; j++) { + scoped_ptr<FrameEvent> capture_begin_event(new FrameEvent()); + capture_begin_event->timestamp = now; + capture_begin_event->type = FRAME_CAPTURE_BEGIN; + capture_begin_event->media_type = VIDEO_EVENT; + capture_begin_event->rtp_timestamp = RtpTimeTicks(); + cast_environment_->logger()->DispatchFrameEvent( + std::move(capture_begin_event)); + } + } + + for (size_t i = 0; i < num_packet_event_protos; i++) { + for (int j = 0; j < kMaxEventsPerProto; j++) { + scoped_ptr<PacketEvent> receive_event(new PacketEvent()); + receive_event->timestamp = now; + receive_event->type = PACKET_RECEIVED; + receive_event->media_type = VIDEO_EVENT; + receive_event->rtp_timestamp = RtpTimeTicks(); + receive_event->frame_id = 0; + receive_event->packet_id = 0; + receive_event->max_packet_id = 10; + receive_event->size = 123; + cast_environment_->logger()->DispatchPacketEvent( + std::move(receive_event)); + } + } + + scoped_ptr<FrameEvent> capture_begin_event(new FrameEvent()); + capture_begin_event->timestamp = now; + capture_begin_event->type = FRAME_CAPTURE_BEGIN; + capture_begin_event->media_type = VIDEO_EVENT; + capture_begin_event->rtp_timestamp = RtpTimeTicks(); + cast_environment_->logger()->DispatchFrameEvent( + std::move(capture_begin_event)); + + GetEventsAndReset(); + EXPECT_EQ(num_frame_event_protos, frame_events_.size()); + EXPECT_EQ(num_packet_event_protos, packet_events_.size()); +} + TEST_F(EncodingEventSubscriberTest, EventFiltering) { Init(VIDEO_EVENT);
diff --git a/media/cast/logging/logging_defines.cc b/media/cast/logging/logging_defines.cc index c3c872a..22f326a 100644 --- a/media/cast/logging/logging_defines.cc +++ b/media/cast/logging/logging_defines.cc
@@ -43,6 +43,7 @@ target_bitrate(0), encoder_cpu_utilization(-1.0), idealized_bitrate_utilization(-1.0) {} +FrameEvent::FrameEvent(const FrameEvent& other) = default; FrameEvent::~FrameEvent() {} PacketEvent::PacketEvent()
diff --git a/media/cast/logging/logging_defines.h b/media/cast/logging/logging_defines.h index 00425be7..257652d 100644 --- a/media/cast/logging/logging_defines.h +++ b/media/cast/logging/logging_defines.h
@@ -54,6 +54,7 @@ struct FrameEvent { FrameEvent(); + FrameEvent(const FrameEvent& other); ~FrameEvent(); RtpTimeTicks rtp_timestamp;
diff --git a/media/cast/net/pacing/paced_sender.cc b/media/cast/net/pacing/paced_sender.cc index 6de39560..59ed0b1 100644 --- a/media/cast/net/pacing/paced_sender.cc +++ b/media/cast/net/pacing/paced_sender.cc
@@ -41,7 +41,7 @@ } PacedSender::PacketSendRecord::PacketSendRecord() - : last_byte_sent(0), last_byte_sent_for_audio(0) {} + : last_byte_sent(0), last_byte_sent_for_audio(0), cancel_count(0) {} PacedSender::PacedSender( size_t target_burst_size, @@ -100,6 +100,19 @@ } const bool high_priority = IsHighPriority(packets.begin()->first); for (size_t i = 0; i < packets.size(); i++) { + if (VLOG_IS_ON(2)) { + PacketSendHistory::const_iterator history_it = + send_history_.find(packets[i].first); + if (history_it != send_history_.end() && + history_it->second.cancel_count > 0) { + VLOG(2) << "PacedSender::SendPackets() called for packet CANCELED " + << history_it->second.cancel_count << " times: " + << "ssrc=" << packets[i].first.ssrc + << ", frame_id=" << packets[i].first.frame_id + << ", packet_id=" << packets[i].first.packet_id; + } + } + DCHECK(IsHighPriority(packets[i].first) == high_priority); if (high_priority) { priority_packet_list_[packets[i].first] = @@ -128,6 +141,9 @@ // packet Y sent just before X. Reject retransmission of X if ACK for // Y has not been received. // Only do this for video packets. + // + // TODO(miu): This sounds wrong. Audio packets are always transmitted first + // (because they are put in |priority_packet_list_|, see PopNextPacket()). if (packet_key.ssrc == video_ssrc_) { if (dedup_info.last_byte_acked_for_audio && it->second.last_byte_sent_for_audio && @@ -150,6 +166,19 @@ const bool high_priority = IsHighPriority(packets.begin()->first); const base::TimeTicks now = clock_->NowTicks(); for (size_t i = 0; i < packets.size(); i++) { + if (VLOG_IS_ON(2)) { + PacketSendHistory::const_iterator history_it = + send_history_.find(packets[i].first); + if (history_it != send_history_.end() && + history_it->second.cancel_count > 0) { + VLOG(2) << "PacedSender::ReendPackets() called for packet CANCELED " + << history_it->second.cancel_count << " times: " + << "ssrc=" << packets[i].first.ssrc + << ", frame_id=" << packets[i].first.frame_id + << ", packet_id=" << packets[i].first.packet_id; + } + } + if (!ShouldResend(packets[i].first, dedup_info, now)) { LogPacketEvent(packets[i].second->data, PACKET_RTX_REJECTED); continue; @@ -190,18 +219,67 @@ void PacedSender::CancelSendingPacket(const PacketKey& packet_key) { packet_list_.erase(packet_key); priority_packet_list_.erase(packet_key); + + if (VLOG_IS_ON(2)) { + PacketSendHistory::iterator history_it = send_history_.find(packet_key); + if (history_it != send_history_.end()) + ++history_it->second.cancel_count; + } } PacketRef PacedSender::PopNextPacket(PacketType* packet_type, PacketKey* packet_key) { + // Always pop from the priority list first. PacketList* list = !priority_packet_list_.empty() ? &priority_packet_list_ : &packet_list_; DCHECK(!list->empty()); - PacketList::iterator i = list->begin(); - *packet_type = i->second.first; - *packet_key = i->first; - PacketRef ret = i->second.second; - list->erase(i); + + // Determine which packet in the frame should be popped by examining the + // |send_history_| for prior transmission attempts. Packets that have never + // been transmitted will be popped first. If all packets have transmitted + // before, pop the one that has not been re-attempted for the longest time. + PacketList::iterator it = list->begin(); + PacketKey last_key = it->first; + last_key.packet_id = UINT16_C(0xffff); + PacketSendHistory::const_iterator history_it = + send_history_.lower_bound(it->first); + base::TimeTicks earliest_send_time = + base::TimeTicks() + base::TimeDelta::Max(); + PacketList::iterator found_it = it; + while (true) { + if (history_it == send_history_.end() || it->first < history_it->first) { + // There is no send history for this packet, which means it has not been + // transmitted yet. + found_it = it; + break; + } + + DCHECK(it->first == history_it->first); + if (history_it->second.time < earliest_send_time) { + earliest_send_time = history_it->second.time; + found_it = it; + } + + // Advance to next packet for the current frame, or break if there are no + // more. + ++it; + if (it == list->end() || last_key < it->first) + break; + + // Advance to next history entry. Since there may be "holes" in the packet + // list (e.g., due to packets canceled for retransmission), it's possible + // |history_it| will have to be advanced more than once even though |it| was + // only advanced once. + do { + ++history_it; + } while (history_it != send_history_.end() && + history_it->first < it->first); + } + + *packet_type = found_it->second.first; + *packet_key = found_it->first; + PacketRef ret = found_it->second.second; + list->erase(found_it); return ret; } @@ -280,8 +358,16 @@ PacketType packet_type; PacketKey packet_key; PacketRef packet = PopNextPacket(&packet_type, &packet_key); - PacketSendRecord send_record; - send_record.time = now; + PacketSendRecord* const send_record = &(send_history_[packet_key]); + send_record->time = now; + + if (send_record->cancel_count > 0 && packet_type != PacketType_RTCP) { + VLOG(2) << "PacedSender is sending a packet known to have been CANCELED " + << send_record->cancel_count << " times: " + << "ssrc=" << packet_key.ssrc + << ", frame_id=" << packet_key.frame_id + << ", packet_id=" << packet_key.packet_id; + } switch (packet_type) { case PacketType_Resend: @@ -297,11 +383,10 @@ const bool socket_blocked = !transport_->SendPacket(packet, cb); // Save the send record. - send_record.last_byte_sent = transport_->GetBytesSent(); - send_record.last_byte_sent_for_audio = GetLastByteSentForSsrc(audio_ssrc_); - send_history_[packet_key] = send_record; - send_history_buffer_[packet_key] = send_record; - last_byte_sent_[packet_key.ssrc] = send_record.last_byte_sent; + send_record->last_byte_sent = transport_->GetBytesSent(); + send_record->last_byte_sent_for_audio = GetLastByteSentForSsrc(audio_ssrc_); + send_history_buffer_[packet_key] = *send_record; + last_byte_sent_[packet_key.ssrc] = send_record->last_byte_sent; if (socket_blocked) { state_ = State_TransportBlocked; @@ -311,6 +396,9 @@ } // Keep ~0.5 seconds of data (1000 packets). + // + // TODO(miu): This has no relation to the actual size of the frames, and so + // there's no way to reason whether 1000 is enough or too much, or whatever. if (send_history_buffer_.size() >= max_burst_size_ * kMaxDedupeWindowMs / kPacingIntervalMs) { send_history_.swap(send_history_buffer_);
diff --git a/media/cast/net/pacing/paced_sender.h b/media/cast/net/pacing/paced_sender.h index 8d45cc43..b76d883 100644 --- a/media/cast/net/pacing/paced_sender.h +++ b/media/cast/net/pacing/paced_sender.h
@@ -42,6 +42,11 @@ uint32_t frame_id; uint16_t packet_id; + bool operator==(const PacketKey& key) const { + return std::tie(capture_time, ssrc, frame_id, packet_id) == + std::tie(key.capture_time, key.ssrc, key.frame_id, key.packet_id); + } + bool operator<(const PacketKey& key) const { return std::tie(capture_time, ssrc, frame_id, packet_id) < std::tie(key.capture_time, key.ssrc, key.frame_id, key.packet_id); @@ -178,9 +183,12 @@ bool empty() const; size_t size() const; - // Returns the next packet to send. RTCP packets have highest priority, - // resend packets have second highest priority and then comes everything - // else. + // Returns the next packet to send. RTCP packets have highest priority, then + // high-priority RTP packets, then normal-priority RTP packets. Packets + // within a frame are selected based on fairness to ensure all have an equal + // chance of being sent. Therefore, it is up to client code to ensure that + // packets acknowledged in NACK messages are removed from PacedSender (see + // CancelSendingPacket()), to avoid wasteful retransmission. PacketRef PopNextPacket(PacketType* packet_type, PacketKey* packet_key); @@ -210,6 +218,7 @@ // packet was sent. int64_t last_byte_sent_for_audio; // Number of bytes sent to network from // audio stream just before this packet. + int cancel_count; // Number of times the packet was canceled (debugging). }; typedef std::map<PacketKey, PacketSendRecord> PacketSendHistory; PacketSendHistory send_history_;
diff --git a/media/cast/net/pacing/paced_sender_unittest.cc b/media/cast/net/pacing/paced_sender_unittest.cc index 89c341f..da3e6148 100644 --- a/media/cast/net/pacing/paced_sender_unittest.cc +++ b/media/cast/net/pacing/paced_sender_unittest.cc
@@ -5,7 +5,8 @@ #include <stddef.h> #include <stdint.h> -#include <list> +#include <algorithm> +#include <deque> #include "base/big_endian.h" #include "base/macros.h" @@ -20,28 +21,46 @@ namespace cast { namespace { -static const uint8_t kValue = 123; -static const size_t kSize1 = 101; -static const size_t kSize2 = 102; -static const size_t kSize3 = 103; -static const size_t kSize4 = 104; -static const size_t kNackSize = 105; -static const int64_t kStartMillisecond = INT64_C(12345678900000); -static const uint32_t kVideoSsrc = 0x1234; -static const uint32_t kAudioSsrc = 0x5678; -static const uint32_t kVideoFrameRtpTimestamp = 12345; -static const uint32_t kAudioFrameRtpTimestamp = 23456; +const uint8_t kValue = 123; +const size_t kSize1 = 101; +const size_t kSize2 = 102; +const size_t kSize3 = 103; +const size_t kSize4 = 104; +const size_t kNackSize = 105; +const int64_t kStartMillisecond = INT64_C(12345678900000); +const uint32_t kVideoSsrc = 0x1234; +const uint32_t kAudioSsrc = 0x5678; +const uint32_t kVideoFrameRtpTimestamp = 12345; +const uint32_t kAudioFrameRtpTimestamp = 23456; + +// RTCP packets don't really have a packet ID. However, the bytes where +// TestPacketSender checks for the ID should be set to 31611, so we'll just +// check that. +const uint16_t kRtcpPacketIdMagic = UINT16_C(31611); class TestPacketSender : public PacketSender { public: TestPacketSender() : bytes_sent_(0) {} bool SendPacket(PacketRef packet, const base::Closure& cb) final { - EXPECT_FALSE(expected_packet_size_.empty()); - size_t expected_packet_size = expected_packet_size_.front(); - expected_packet_size_.pop_front(); + EXPECT_FALSE(expected_packet_sizes_.empty()); + size_t expected_packet_size = expected_packet_sizes_.front(); + expected_packet_sizes_.pop_front(); EXPECT_EQ(expected_packet_size, packet->data.size()); bytes_sent_ += packet->data.size(); + + // Parse for the packet ID and confirm it is the next one we expect. + EXPECT_LE(kSize1, packet->data.size()); + base::BigEndianReader reader(reinterpret_cast<char*>(&packet->data[0]), + packet->data.size()); + bool success = reader.Skip(14); + uint16_t packet_id = 0xffff; + success &= reader.ReadU16(&packet_id); + EXPECT_TRUE(success); + const uint16_t expected_packet_id = expected_packet_ids_.front(); + expected_packet_ids_.pop_front(); + EXPECT_EQ(expected_packet_id, packet_id); + return true; } @@ -52,14 +71,20 @@ void StopReceiving() final {} - void AddExpectedSize(int expected_packet_size, int repeat_count) { - for (int i = 0; i < repeat_count; ++i) { - expected_packet_size_.push_back(expected_packet_size); + void AddExpectedSizesAndPacketIds(int packet_size, + uint16_t first_packet_id, + int sequence_length) { + for (int i = 0; i < sequence_length; ++i) { + expected_packet_sizes_.push_back(packet_size); + expected_packet_ids_.push_back(first_packet_id++); } } - public: - std::list<int> expected_packet_size_; + bool expecting_nothing_else() const { return expected_packet_sizes_.empty(); } + + private: + std::deque<int> expected_packet_sizes_; + std::deque<uint16_t> expected_packet_ids_; int64_t bytes_sent_; DISALLOW_COPY_AND_ASSIGN(TestPacketSender); @@ -116,17 +141,29 @@ return packets; } + void SendWithoutBursting(const SendPacketVector& packets) { + const size_t kBatchSize = 10; + for (size_t i = 0; i < packets.size(); i += kBatchSize) { + const SendPacketVector next_batch( + packets.begin() + i, + packets.begin() + i + std::min(packets.size() - i, kBatchSize)); + ASSERT_TRUE(paced_sender_->SendPackets(next_batch)); + testing_clock_.Advance(base::TimeDelta::FromMilliseconds(10)); + task_runner_->RunTasks(); + } + } + // Use this function to drain the packet list in PacedSender without having // to test the pacing implementation details. bool RunUntilEmpty(int max_tries) { for (int i = 0; i < max_tries; i++) { testing_clock_.Advance(base::TimeDelta::FromMilliseconds(10)); task_runner_->RunTasks(); - if (mock_transport_.expected_packet_size_.empty()) + if (mock_transport_.expecting_nothing_else()) return true; } - return mock_transport_.expected_packet_size_.empty(); + return mock_transport_.expecting_nothing_else(); } std::vector<PacketEvent> packet_events_; @@ -141,13 +178,14 @@ } // namespace TEST_F(PacedSenderTest, PassThroughRtcp) { - mock_transport_.AddExpectedSize(kSize1, 2); SendPacketVector packets = CreateSendPacketVector(kSize1, 1, true); + mock_transport_.AddExpectedSizesAndPacketIds(kSize1, UINT16_C(0), 1); + mock_transport_.AddExpectedSizesAndPacketIds(kSize1, UINT16_C(0), 1); EXPECT_TRUE(paced_sender_->SendPackets(packets)); EXPECT_TRUE(paced_sender_->ResendPackets(packets, DedupInfo())); - mock_transport_.AddExpectedSize(kSize2, 1); + mock_transport_.AddExpectedSizesAndPacketIds(kSize2, kRtcpPacketIdMagic, 1); Packet tmp(kSize2, kValue); EXPECT_TRUE(paced_sender_->SendRtcpPacket( 1, @@ -161,11 +199,11 @@ false); const base::TimeTicks earliest_event_timestamp = testing_clock_.NowTicks(); - mock_transport_.AddExpectedSize(kSize1, 10); + mock_transport_.AddExpectedSizesAndPacketIds(kSize1, UINT16_C(0), 10); EXPECT_TRUE(paced_sender_->SendPackets(packets)); // Check that we get the next burst. - mock_transport_.AddExpectedSize(kSize1, 10); + mock_transport_.AddExpectedSizesAndPacketIds(kSize1, UINT16_C(10), 10); base::TimeDelta timeout = base::TimeDelta::FromMilliseconds(10); testing_clock_.Advance(timeout); @@ -177,7 +215,7 @@ task_runner_->RunTasks(); // Check that we get the next burst. - mock_transport_.AddExpectedSize(kSize1, 7); + mock_transport_.AddExpectedSizesAndPacketIds(kSize1, UINT16_C(20), 7); testing_clock_.Advance(timeout); task_runner_->RunTasks(); @@ -216,14 +254,14 @@ CreateSendPacketVector(kSize2, num_of_packets_in_frame, true); // Check that the first burst of the frame go out on the wire. - mock_transport_.AddExpectedSize(kSize1, 10); + mock_transport_.AddExpectedSizesAndPacketIds(kSize1, UINT16_C(0), 10); EXPECT_TRUE(paced_sender_->SendPackets(first_frame_packets)); // Add first NACK request. EXPECT_TRUE(paced_sender_->ResendPackets(nack_packets, DedupInfo())); // Check that we get the first NACK burst. - mock_transport_.AddExpectedSize(kNackSize, 10); + mock_transport_.AddExpectedSizesAndPacketIds(kNackSize, UINT16_C(0), 10); base::TimeDelta timeout = base::TimeDelta::FromMilliseconds(10); testing_clock_.Advance(timeout); task_runner_->RunTasks(); @@ -232,24 +270,25 @@ EXPECT_TRUE(paced_sender_->ResendPackets(nack_packets, DedupInfo())); // Check that we get the next NACK burst. - mock_transport_.AddExpectedSize(kNackSize, 10); + mock_transport_.AddExpectedSizesAndPacketIds(kNackSize, UINT16_C(10), 2); + mock_transport_.AddExpectedSizesAndPacketIds(kNackSize, UINT16_C(0), 8); testing_clock_.Advance(timeout); task_runner_->RunTasks(); // End of NACK plus two packets from the oldest frame. // Note that two of the NACKs have been de-duped. - mock_transport_.AddExpectedSize(kNackSize, 2); - mock_transport_.AddExpectedSize(kSize1, 2); + mock_transport_.AddExpectedSizesAndPacketIds(kNackSize, UINT16_C(8), 2); + mock_transport_.AddExpectedSizesAndPacketIds(kSize1, UINT16_C(10), 2); testing_clock_.Advance(timeout); task_runner_->RunTasks(); // Add second frame. // Make sure we don't delay the second frame due to the previous packets. - mock_transport_.AddExpectedSize(kSize2, 10); + mock_transport_.AddExpectedSizesAndPacketIds(kSize2, UINT16_C(0), 10); EXPECT_TRUE(paced_sender_->SendPackets(second_frame_packets)); // Last packets of frame 2. - mock_transport_.AddExpectedSize(kSize2, 2); + mock_transport_.AddExpectedSizesAndPacketIds(kSize2, UINT16_C(10), 2); testing_clock_.Advance(timeout); task_runner_->RunTasks(); @@ -306,47 +345,47 @@ base::TimeDelta timeout_10ms = base::TimeDelta::FromMilliseconds(10); // Check that the first burst of the frame go out on the wire. - mock_transport_.AddExpectedSize(kSize1, 10); + mock_transport_.AddExpectedSizesAndPacketIds(kSize1, UINT16_C(0), 10); EXPECT_TRUE(paced_sender_->SendPackets(first_frame_packets)); - mock_transport_.AddExpectedSize(kSize1, 7); + mock_transport_.AddExpectedSizesAndPacketIds(kSize1, UINT16_C(10), 7); testing_clock_.Advance(timeout_10ms); task_runner_->RunTasks(); testing_clock_.Advance(base::TimeDelta::FromMilliseconds(6)); // Add second frame, after 16 ms. - mock_transport_.AddExpectedSize(kSize2, 3); + mock_transport_.AddExpectedSizesAndPacketIds(kSize2, UINT16_C(0), 3); EXPECT_TRUE(paced_sender_->SendPackets(second_frame_packets)); testing_clock_.Advance(base::TimeDelta::FromMilliseconds(4)); - mock_transport_.AddExpectedSize(kSize2, 10); + mock_transport_.AddExpectedSizesAndPacketIds(kSize2, UINT16_C(3), 10); testing_clock_.Advance(timeout_10ms); task_runner_->RunTasks(); - mock_transport_.AddExpectedSize(kSize2, 4); + mock_transport_.AddExpectedSizesAndPacketIds(kSize2, UINT16_C(13), 4); testing_clock_.Advance(timeout_10ms); task_runner_->RunTasks(); testing_clock_.Advance(base::TimeDelta::FromMilliseconds(3)); // Add third frame, after 33 ms. - mock_transport_.AddExpectedSize(kSize3, 6); + mock_transport_.AddExpectedSizesAndPacketIds(kSize3, UINT16_C(0), 6); EXPECT_TRUE(paced_sender_->SendPackets(third_frame_packets)); - mock_transport_.AddExpectedSize(kSize3, 10); + mock_transport_.AddExpectedSizesAndPacketIds(kSize3, UINT16_C(6), 10); testing_clock_.Advance(base::TimeDelta::FromMilliseconds(7)); task_runner_->RunTasks(); // Add fourth frame, after 50 ms. EXPECT_TRUE(paced_sender_->SendPackets(fourth_frame_packets)); - mock_transport_.AddExpectedSize(kSize3, 1); - mock_transport_.AddExpectedSize(kSize4, 9); + mock_transport_.AddExpectedSizesAndPacketIds(kSize3, UINT16_C(16), 1); + mock_transport_.AddExpectedSizesAndPacketIds(kSize4, UINT16_C(0), 9); testing_clock_.Advance(timeout_10ms); task_runner_->RunTasks(); - mock_transport_.AddExpectedSize(kSize4, 8); + mock_transport_.AddExpectedSizesAndPacketIds(kSize4, UINT16_C(9), 8); testing_clock_.Advance(timeout_10ms); task_runner_->RunTasks(); @@ -367,11 +406,11 @@ // 3. Audio packet x 1. // 4. Video retransmission packet x 10. // 5. Video packet x 10. - mock_transport_.AddExpectedSize(kSize2, 10); // Normal video packets. - mock_transport_.AddExpectedSize(kSize3, 1); // RTCP packet. - mock_transport_.AddExpectedSize(kSize1, 1); // Audio packet. - mock_transport_.AddExpectedSize(kSize4, 10); // Resend video packets. - mock_transport_.AddExpectedSize(kSize2, 10); // Normal video packets. + mock_transport_.AddExpectedSizesAndPacketIds(kSize2, UINT16_C(0), 10); + mock_transport_.AddExpectedSizesAndPacketIds(kSize3, kRtcpPacketIdMagic, 1); + mock_transport_.AddExpectedSizesAndPacketIds(kSize1, UINT16_C(0), 1); + mock_transport_.AddExpectedSizesAndPacketIds(kSize4, UINT16_C(0), 10); + mock_transport_.AddExpectedSizesAndPacketIds(kSize2, UINT16_C(10), 10); paced_sender_->RegisterPrioritySsrc(kAudioSsrc); @@ -411,11 +450,10 @@ } TEST_F(PacedSenderTest, GetLastByteSent) { - mock_transport_.AddExpectedSize(kSize1, 4); - SendPacketVector packets1 = CreateSendPacketVector(kSize1, 1, true); SendPacketVector packets2 = CreateSendPacketVector(kSize1, 1, false); + mock_transport_.AddExpectedSizesAndPacketIds(kSize1, UINT16_C(0), 1); EXPECT_TRUE(paced_sender_->SendPackets(packets1)); EXPECT_EQ(static_cast<int64_t>(kSize1), paced_sender_->GetLastByteSentForPacket(packets1[0].first)); @@ -423,6 +461,7 @@ paced_sender_->GetLastByteSentForSsrc(kAudioSsrc)); EXPECT_EQ(0, paced_sender_->GetLastByteSentForSsrc(kVideoSsrc)); + mock_transport_.AddExpectedSizesAndPacketIds(kSize1, UINT16_C(0), 1); EXPECT_TRUE(paced_sender_->SendPackets(packets2)); EXPECT_EQ(static_cast<int64_t>(2 * kSize1), paced_sender_->GetLastByteSentForPacket(packets2[0].first)); @@ -431,6 +470,7 @@ EXPECT_EQ(static_cast<int64_t>(2 * kSize1), paced_sender_->GetLastByteSentForSsrc(kVideoSsrc)); + mock_transport_.AddExpectedSizesAndPacketIds(kSize1, UINT16_C(0), 1); EXPECT_TRUE(paced_sender_->ResendPackets(packets1, DedupInfo())); EXPECT_EQ(static_cast<int64_t>(3 * kSize1), paced_sender_->GetLastByteSentForPacket(packets1[0].first)); @@ -439,6 +479,7 @@ EXPECT_EQ(static_cast<int64_t>(2 * kSize1), paced_sender_->GetLastByteSentForSsrc(kVideoSsrc)); + mock_transport_.AddExpectedSizesAndPacketIds(kSize1, UINT16_C(0), 1); EXPECT_TRUE(paced_sender_->ResendPackets(packets2, DedupInfo())); EXPECT_EQ(static_cast<int64_t>(4 * kSize1), paced_sender_->GetLastByteSentForPacket(packets2[0].first)); @@ -449,9 +490,8 @@ } TEST_F(PacedSenderTest, DedupWithResendInterval) { - mock_transport_.AddExpectedSize(kSize1, 2); - SendPacketVector packets = CreateSendPacketVector(kSize1, 1, true); + mock_transport_.AddExpectedSizesAndPacketIds(kSize1, UINT16_C(0), 1); EXPECT_TRUE(paced_sender_->SendPackets(packets)); testing_clock_.Advance(base::TimeDelta::FromMilliseconds(10)); @@ -463,9 +503,42 @@ EXPECT_EQ(static_cast<int64_t>(kSize1), mock_transport_.GetBytesSent()); dedup_info.resend_interval = base::TimeDelta::FromMilliseconds(5); + mock_transport_.AddExpectedSizesAndPacketIds(kSize1, UINT16_C(0), 1); EXPECT_TRUE(paced_sender_->ResendPackets(packets, dedup_info)); EXPECT_EQ(static_cast<int64_t>(2 * kSize1), mock_transport_.GetBytesSent()); } +TEST_F(PacedSenderTest, AllPacketsInSameFrameAreResentFairly) { + const int kNumPackets = 400; + SendPacketVector packets = CreateSendPacketVector(kSize1, kNumPackets, false); + + // Send a large frame (400 packets, yeah!). Confirm that the paced sender + // sends each packet in the frame exactly once. + mock_transport_.AddExpectedSizesAndPacketIds(kSize1, UINT16_C(0), + kNumPackets); + SendWithoutBursting(packets); + ASSERT_TRUE(mock_transport_.expecting_nothing_else()); + + // Resend packets 2 and 3. Confirm that the paced sender sends them. Then, + // resend all of the first 10 packets. The paced sender should send packets + // 0, 1, and 4 through 9 first, and then 2 and 3. + SendPacketVector couple_of_packets; + couple_of_packets.push_back(packets[2]); + couple_of_packets.push_back(packets[3]); + + mock_transport_.AddExpectedSizesAndPacketIds(kSize1, UINT16_C(2), 2); + SendWithoutBursting(couple_of_packets); + ASSERT_TRUE(mock_transport_.expecting_nothing_else()); + + SendPacketVector first_ten_packets; + for (size_t i = 0; i < 10; ++i) + first_ten_packets.push_back(packets[i]); + mock_transport_.AddExpectedSizesAndPacketIds(kSize1, UINT16_C(0), 2); + mock_transport_.AddExpectedSizesAndPacketIds(kSize1, UINT16_C(4), 6); + mock_transport_.AddExpectedSizesAndPacketIds(kSize1, UINT16_C(2), 2); + SendWithoutBursting(first_ten_packets); + ASSERT_TRUE(mock_transport_.expecting_nothing_else()); +} + } // namespace cast } // namespace media
diff --git a/media/cast/net/rtcp/rtcp_defines.cc b/media/cast/net/rtcp/rtcp_defines.cc index b4f363e..f7a1a6c 100644 --- a/media/cast/net/rtcp/rtcp_defines.cc +++ b/media/cast/net/rtcp/rtcp_defines.cc
@@ -21,6 +21,8 @@ RtcpReceiverFrameLogMessage::RtcpReceiverFrameLogMessage(RtpTimeTicks timestamp) : rtp_timestamp_(timestamp) {} +RtcpReceiverFrameLogMessage::RtcpReceiverFrameLogMessage( + const RtcpReceiverFrameLogMessage& other) = default; RtcpReceiverFrameLogMessage::~RtcpReceiverFrameLogMessage() {} RtcpReceiverReferenceTimeReport::RtcpReceiverReferenceTimeReport()
diff --git a/media/cast/net/rtcp/rtcp_defines.h b/media/cast/net/rtcp/rtcp_defines.h index 69a81bf8..98d69bb 100644 --- a/media/cast/net/rtcp/rtcp_defines.h +++ b/media/cast/net/rtcp/rtcp_defines.h
@@ -69,6 +69,7 @@ struct RtcpReceiverFrameLogMessage { explicit RtcpReceiverFrameLogMessage(RtpTimeTicks rtp_timestamp); + RtcpReceiverFrameLogMessage(const RtcpReceiverFrameLogMessage& other); ~RtcpReceiverFrameLogMessage(); const RtpTimeTicks rtp_timestamp_;
diff --git a/media/cdm/player_tracker_impl.cc b/media/cdm/player_tracker_impl.cc index 98f2050..7d5cda3 100644 --- a/media/cdm/player_tracker_impl.cc +++ b/media/cdm/player_tracker_impl.cc
@@ -15,6 +15,9 @@ const base::Closure& cdm_unset_cb) : new_key_cb(new_key_cb), cdm_unset_cb(cdm_unset_cb) {} +PlayerTrackerImpl::PlayerCallbacks::PlayerCallbacks( + const PlayerCallbacks& other) = default; + PlayerTrackerImpl::PlayerCallbacks::~PlayerCallbacks() { }
diff --git a/media/cdm/player_tracker_impl.h b/media/cdm/player_tracker_impl.h index e2dc4a5..299593d 100644 --- a/media/cdm/player_tracker_impl.h +++ b/media/cdm/player_tracker_impl.h
@@ -35,6 +35,7 @@ struct PlayerCallbacks { PlayerCallbacks(const base::Closure& new_key_cb, const base::Closure& cdm_unset_cb); + PlayerCallbacks(const PlayerCallbacks& other); ~PlayerCallbacks(); base::Closure new_key_cb;
diff --git a/media/filters/ffmpeg_demuxer.cc b/media/filters/ffmpeg_demuxer.cc index 18863e6..20adebe9 100644 --- a/media/filters/ffmpeg_demuxer.cc +++ b/media/filters/ffmpeg_demuxer.cc
@@ -163,16 +163,15 @@ AVCOL_RANGE_NB); // PRESUBMIT_IGNORE_UMA_MAX } -static int32_t GetCodecHash(const AVCodecContext* context) { +static const char kCodecNone[] = "none"; + +static const char* GetCodecName(const AVCodecContext* context) { if (context->codec_descriptor) - return HashCodecName(context->codec_descriptor->name); + return context->codec_descriptor->name; const AVCodecDescriptor* codec_descriptor = avcodec_descriptor_get(context->codec_id); - if (codec_descriptor) - return HashCodecName(codec_descriptor->name); - // If the codec name can't be determined, return none for tracking. - return HashCodecName("none"); + return codec_descriptor ? codec_descriptor->name : kCodecNone; } scoped_ptr<FFmpegDemuxerStream> FFmpegDemuxerStream::Create( @@ -1074,7 +1073,7 @@ // Log the codec detected, whether it is supported or not. UMA_HISTOGRAM_SPARSE_SLOWLY("Media.DetectedAudioCodecHash", - GetCodecHash(codec_context)); + HashCodecName(GetCodecName(codec_context))); } else if (codec_type == AVMEDIA_TYPE_VIDEO) { if (video_stream) continue; @@ -1102,7 +1101,7 @@ #endif // Log the codec detected, whether it is supported or not. UMA_HISTOGRAM_SPARSE_SLOWLY("Media.DetectedVideoCodecHash", - GetCodecHash(codec_context)); + HashCodecName(GetCodecName(codec_context))); } else if (codec_type == AVMEDIA_TYPE_SUBTITLE) { if (codec_context->codec_id != AV_CODEC_ID_WEBVTT || !text_enabled_) { continue; @@ -1270,12 +1269,8 @@ std::string sample_name = SampleFormatToString(sample_format); media_log_->SetStringProperty("audio_sample_format", sample_name); - - AVCodec* codec = avcodec_find_decoder(audio_codec->codec_id); - if (codec) { - media_log_->SetStringProperty("audio_codec_name", codec->name); - } - + media_log_->SetStringProperty("audio_codec_name", + GetCodecName(audio_codec)); media_log_->SetIntegerProperty("audio_channels_count", audio_codec->channels); media_log_->SetIntegerProperty("audio_samples_per_second", @@ -1288,26 +1283,15 @@ if (video_stream) { AVCodecContext* video_codec = video_stream->codec; media_log_->SetBooleanProperty("found_video_stream", true); - - AVCodec* codec = avcodec_find_decoder(video_codec->codec_id); - if (codec) { - media_log_->SetStringProperty("video_codec_name", codec->name); - } else if (video_codec->codec_id == AV_CODEC_ID_VP9) { - // ffmpeg doesn't know about VP9 decoder. So we need to log it explicitly. - media_log_->SetStringProperty("video_codec_name", "vp9"); - } - + media_log_->SetStringProperty("video_codec_name", + GetCodecName(video_codec)); media_log_->SetIntegerProperty("width", video_codec->width); media_log_->SetIntegerProperty("height", video_codec->height); - media_log_->SetIntegerProperty("coded_width", - video_codec->coded_width); - media_log_->SetIntegerProperty("coded_height", - video_codec->coded_height); + media_log_->SetIntegerProperty("coded_width", video_codec->coded_width); + media_log_->SetIntegerProperty("coded_height", video_codec->coded_height); media_log_->SetStringProperty( - "time_base", - base::StringPrintf("%d/%d", - video_codec->time_base.num, - video_codec->time_base.den)); + "time_base", base::StringPrintf("%d/%d", video_codec->time_base.num, + video_codec->time_base.den)); media_log_->SetStringProperty( "video_format", VideoPixelFormatToString(video_config.format())); media_log_->SetBooleanProperty("video_is_encrypted",
diff --git a/media/filters/gpu_video_decoder.cc b/media/filters/gpu_video_decoder.cc index 6801aaf..260bfaab 100644 --- a/media/filters/gpu_video_decoder.cc +++ b/media/filters/gpu_video_decoder.cc
@@ -53,6 +53,9 @@ : shm_buffer(s), buffer(b), done_cb(done_cb) { } +GpuVideoDecoder::PendingDecoderBuffer::PendingDecoderBuffer( + const PendingDecoderBuffer& other) = default; + GpuVideoDecoder::PendingDecoderBuffer::~PendingDecoderBuffer() {} GpuVideoDecoder::BufferData::BufferData(int32_t bbid,
diff --git a/media/filters/gpu_video_decoder.h b/media/filters/gpu_video_decoder.h index eb82db67..c615684 100644 --- a/media/filters/gpu_video_decoder.h +++ b/media/filters/gpu_video_decoder.h
@@ -102,6 +102,7 @@ PendingDecoderBuffer(SHMBuffer* s, const scoped_refptr<DecoderBuffer>& b, const DecodeCB& done_cb); + PendingDecoderBuffer(const PendingDecoderBuffer& other); ~PendingDecoderBuffer(); SHMBuffer* shm_buffer; scoped_refptr<DecoderBuffer> buffer;
diff --git a/media/filters/video_renderer_algorithm.cc b/media/filters/video_renderer_algorithm.cc index 230c464..2a98367 100644 --- a/media/filters/video_renderer_algorithm.cc +++ b/media/filters/video_renderer_algorithm.cc
@@ -22,6 +22,9 @@ drop_count(0) { } +VideoRendererAlgorithm::ReadyFrame::ReadyFrame(const ReadyFrame& other) = + default; + VideoRendererAlgorithm::ReadyFrame::~ReadyFrame() { }
diff --git a/media/filters/video_renderer_algorithm.h b/media/filters/video_renderer_algorithm.h index 3eea86b..5d1169f 100644 --- a/media/filters/video_renderer_algorithm.h +++ b/media/filters/video_renderer_algorithm.h
@@ -159,6 +159,7 @@ // Metadata container for enqueued frames. See |frame_queue_| below. struct ReadyFrame { ReadyFrame(const scoped_refptr<VideoFrame>& frame); + ReadyFrame(const ReadyFrame& other); ~ReadyFrame(); // For use with std::lower_bound.
diff --git a/media/formats/webm/tracks_builder.cc b/media/formats/webm/tracks_builder.cc index 6b2aaea..458f522 100644 --- a/media/formats/webm/tracks_builder.cc +++ b/media/formats/webm/tracks_builder.cc
@@ -294,6 +294,8 @@ } } +TracksBuilder::Track::Track(const Track& other) = default; + int TracksBuilder::Track::GetSize() const { return MasterElementSize(kWebMIdTrackEntry, GetPayloadSize()); }
diff --git a/media/formats/webm/tracks_builder.h b/media/formats/webm/tracks_builder.h index dc0283e..41d0938 100644 --- a/media/formats/webm/tracks_builder.h +++ b/media/formats/webm/tracks_builder.h
@@ -83,6 +83,7 @@ int audio_channels, double audio_sampling_frequency, bool allow_invalid_values); + Track(const Track& other); int GetSize() const; void Write(uint8_t** buf, int* buf_size) const;
diff --git a/media/formats/webm/webm_cluster_parser.cc b/media/formats/webm/webm_cluster_parser.cc index e4fb5bb..21c1895d 100644 --- a/media/formats/webm/webm_cluster_parser.cc +++ b/media/formats/webm/webm_cluster_parser.cc
@@ -598,6 +598,8 @@ default_duration_ > base::TimeDelta()); } +WebMClusterParser::Track::Track(const Track& other) = default; + WebMClusterParser::Track::~Track() {} DecodeTimestamp WebMClusterParser::Track::GetReadyUpperBound() {
diff --git a/media/formats/webm/webm_cluster_parser.h b/media/formats/webm/webm_cluster_parser.h index 3976cfa..c719515 100644 --- a/media/formats/webm/webm_cluster_parser.h +++ b/media/formats/webm/webm_cluster_parser.h
@@ -55,6 +55,7 @@ bool is_video, base::TimeDelta default_duration, const scoped_refptr<MediaLog>& media_log); + Track(const Track& other); ~Track(); int track_num() const { return track_num_; }
diff --git a/media/media.gyp b/media/media.gyp index 5104c172..329f0c79 100644 --- a/media/media.gyp +++ b/media/media.gyp
@@ -49,6 +49,7 @@ ], }, 'includes': [ + 'capture.gypi', 'media_cdm.gypi', 'media_variables.gypi', ], @@ -96,7 +97,11 @@ 'include_dirs': [ '..', ], + 'includes': [ + 'capture.gypi', + ], 'sources': [ + '<@(capture_sources)', 'audio/agc_audio_stream.h', 'audio/alsa/alsa_input.cc', 'audio/alsa/alsa_input.h', @@ -446,76 +451,6 @@ 'base/win/mf_initializer.h', 'base/yuv_convert.cc', 'base/yuv_convert.h', - 'capture/content/animated_content_sampler.cc', - 'capture/content/animated_content_sampler.h', - 'capture/content/capture_resolution_chooser.cc', - 'capture/content/capture_resolution_chooser.h', - 'capture/content/feedback_signal_accumulator.cc', - 'capture/content/feedback_signal_accumulator.h', - 'capture/content/screen_capture_device_core.cc', - 'capture/content/screen_capture_device_core.h', - 'capture/content/smooth_event_sampler.cc', - 'capture/content/smooth_event_sampler.h', - 'capture/content/thread_safe_capture_oracle.cc', - 'capture/content/thread_safe_capture_oracle.h', - 'capture/content/video_capture_oracle.cc', - 'capture/content/video_capture_oracle.h', - 'capture/video/android/video_capture_device_android.cc', - 'capture/video/android/video_capture_device_android.h', - 'capture/video/android/video_capture_device_factory_android.cc', - 'capture/video/android/video_capture_device_factory_android.h', - 'capture/video/fake_video_capture_device.cc', - 'capture/video/fake_video_capture_device.h', - 'capture/video/fake_video_capture_device_factory.cc', - 'capture/video/fake_video_capture_device_factory.h', - 'capture/video/file_video_capture_device.cc', - 'capture/video/file_video_capture_device.h', - 'capture/video/file_video_capture_device_factory.cc', - 'capture/video/file_video_capture_device_factory.h', - 'capture/video/linux/v4l2_capture_delegate.cc', - 'capture/video/linux/v4l2_capture_delegate.h', - 'capture/video/linux/video_capture_device_chromeos.cc', - 'capture/video/linux/video_capture_device_chromeos.h', - 'capture/video/linux/video_capture_device_factory_linux.cc', - 'capture/video/linux/video_capture_device_factory_linux.h', - 'capture/video/linux/video_capture_device_linux.cc', - 'capture/video/linux/video_capture_device_linux.h', - 'capture/video/mac/platform_video_capturing_mac.h', - 'capture/video/mac/video_capture_device_avfoundation_mac.h', - 'capture/video/mac/video_capture_device_avfoundation_mac.mm', - 'capture/video/mac/video_capture_device_decklink_mac.h', - 'capture/video/mac/video_capture_device_decklink_mac.mm', - 'capture/video/mac/video_capture_device_factory_mac.h', - 'capture/video/mac/video_capture_device_factory_mac.mm', - 'capture/video/mac/video_capture_device_mac.h', - 'capture/video/mac/video_capture_device_mac.mm', - 'capture/video/mac/video_capture_device_qtkit_mac.h', - 'capture/video/mac/video_capture_device_qtkit_mac.mm', - 'capture/video/video_capture_device.cc', - 'capture/video/video_capture_device.h', - 'capture/video/video_capture_device_factory.cc', - 'capture/video/video_capture_device_factory.h', - 'capture/video/video_capture_device_info.cc', - 'capture/video/video_capture_device_info.h', - 'capture/video/win/capability_list_win.cc', - 'capture/video/win/capability_list_win.h', - 'capture/video/win/filter_base_win.cc', - 'capture/video/win/filter_base_win.h', - 'capture/video/win/pin_base_win.cc', - 'capture/video/win/pin_base_win.h', - 'capture/video/win/sink_filter_observer_win.h', - 'capture/video/win/sink_filter_win.cc', - 'capture/video/win/sink_filter_win.h', - 'capture/video/win/sink_input_pin_win.cc', - 'capture/video/win/sink_input_pin_win.h', - 'capture/video/win/video_capture_device_factory_win.cc', - 'capture/video/win/video_capture_device_factory_win.h', - 'capture/video/win/video_capture_device_mf_win.cc', - 'capture/video/win/video_capture_device_mf_win.h', - 'capture/video/win/video_capture_device_win.cc', - 'capture/video/win/video_capture_device_win.h', - 'capture/device_monitor_mac.h', - 'capture/device_monitor_mac.mm', 'cdm/aes_decryptor.cc', 'cdm/aes_decryptor.h', 'cdm/cdm_adapter.cc', @@ -810,12 +745,6 @@ ['exclude', '_alsa\\.(h|cc)$'], ], }], - ['OS=="openbsd"', { - 'sources!': [ - 'capture/video/linux/v4l2_capture_delegate_multi_plane.cc', - 'capture/video/linux/v4l2_capture_delegate_multi_plane.h', - ], - }], ['OS=="linux"', { 'conditions': [ ['use_x11==1', { @@ -860,11 +789,13 @@ 'audio/cras/cras_unified.h', ], }], + ['use_udev==1', { 'dependencies': [ - '../device/udev_linux/udev.gyp:udev_linux', + '<(DEPTH)/device/udev_linux/udev.gyp:udev_linux', ], - 'sources': [ + + 'capture_sources': [ 'capture/device_monitor_udev.cc', 'capture/device_monitor_udev.h', ], @@ -1015,8 +946,9 @@ }], ['OS=="mac"', { 'dependencies': [ - '../third_party/decklink/decklink.gyp:decklink', + '<(DEPTH)/third_party/decklink/decklink.gyp:decklink', ], + 'link_settings': { 'libraries': [ '$(SDKROOT)/System/Library/Frameworks/AudioToolbox.framework', @@ -1223,6 +1155,7 @@ '../url/url.gyp:url_lib', ], 'sources': [ + '<@(capture_unittests_sources)', 'base/android/access_unit_queue_unittest.cc', 'base/android/media_codec_decoder_unittest.cc', 'base/android/media_codec_player_unittest.cc', @@ -1290,13 +1223,6 @@ 'base/video_util_unittest.cc', 'base/wall_clock_time_source_unittest.cc', 'base/yuv_convert_unittest.cc', - 'capture/content/animated_content_sampler_unittest.cc', - 'capture/content/capture_resolution_chooser_unittest.cc', - 'capture/content/feedback_signal_accumulator_unittest.cc', - 'capture/content/smooth_event_sampler_unittest.cc', - 'capture/content/video_capture_oracle_unittest.cc', - 'capture/video/fake_video_capture_device_unittest.cc', - 'capture/video/video_capture_device_unittest.cc', 'cdm/aes_decryptor_unittest.cc', 'cdm/external_clear_key_test_helper.cc', 'cdm/external_clear_key_test_helper.h', @@ -1469,11 +1395,6 @@ 'formats/mp2t/timestamp_unroller_unittest.cc', ], }], - ['OS=="mac"', { - 'sources': [ - 'capture/video/mac/video_capture_device_factory_mac_unittest.mm', - ] - }], ['use_x11==1', { 'dependencies': [ '../tools/xdisplaycheck/xdisplaycheck.gyp:xdisplaycheck',
diff --git a/media/video/video_decode_accelerator.cc b/media/video/video_decode_accelerator.cc index 0d3887d0..4275d5f 100644 --- a/media/video/video_decode_accelerator.cc +++ b/media/video/video_decode_accelerator.cc
@@ -51,6 +51,9 @@ VideoDecodeAccelerator::Capabilities::Capabilities() : flags(NO_FLAGS) {} +VideoDecodeAccelerator::Capabilities::Capabilities(const Capabilities& other) = + default; + VideoDecodeAccelerator::Capabilities::~Capabilities() {} std::string VideoDecodeAccelerator::Capabilities::AsHumanReadableString()
diff --git a/media/video/video_decode_accelerator.h b/media/video/video_decode_accelerator.h index 2b5f211..c0f6b1e 100644 --- a/media/video/video_decode_accelerator.h +++ b/media/video/video_decode_accelerator.h
@@ -38,6 +38,7 @@ struct MEDIA_EXPORT Capabilities { Capabilities(); + Capabilities(const Capabilities& other); ~Capabilities(); std::string AsHumanReadableString() const;
diff --git a/mojo/edk/system/node_channel.cc b/mojo/edk/system/node_channel.cc index 0277d46..0e2ef52 100644 --- a/mojo/edk/system/node_channel.cc +++ b/mojo/edk/system/node_channel.cc
@@ -58,8 +58,19 @@ // This message may include a process handle on plaforms that require it. struct AddBrokerClientData { ports::NodeName client_name; +#if !defined(OS_WIN) + uint32_t process_handle; + uint32_t padding; +#endif }; +#if !defined(OS_WIN) +static_assert(sizeof(base::ProcessHandle) == sizeof(uint32_t), + "Unexpected pid size"); +static_assert(sizeof(AddBrokerClientData) % kChannelMessageAlignment == 0, + "Invalid AddBrokerClientData size."); +#endif + // This data is followed by a platform channel handle to the broker. struct BrokerClientAddedData { ports::NodeName client_name; @@ -155,25 +166,19 @@ } void NodeChannel::SetRemoteProcessHandle(base::ProcessHandle process_handle) { -#if defined(OS_WIN) DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); base::AutoLock lock(remote_process_handle_lock_); remote_process_handle_ = process_handle; -#endif } bool NodeChannel::HasRemoteProcessHandle() { -#if defined(OS_WIN) base::AutoLock lock(remote_process_handle_lock_); return remote_process_handle_ != base::kNullProcessHandle; -#else - return false; -#endif } -ScopedPlatformHandle NodeChannel::CopyRemoteProcessHandle() { -#if defined(OS_WIN) +base::ProcessHandle NodeChannel::CopyRemoteProcessHandle() { base::AutoLock lock(remote_process_handle_lock_); +#if defined(OS_WIN) if (remote_process_handle_ != base::kNullProcessHandle) { // Privileged nodes use this to pass their childrens' process handles to the // broker on launch. @@ -183,10 +188,12 @@ base::GetCurrentProcessHandle(), &handle, 0, FALSE, DUPLICATE_SAME_ACCESS); DCHECK(result); - return ScopedPlatformHandle(PlatformHandle(handle)); + return handle; } + return base::kNullProcessHandle; +#else + return remote_process_handle_; #endif - return ScopedPlatformHandle(); } void NodeChannel::SetRemoteNodeName(const ports::NodeName& name) { @@ -215,17 +222,20 @@ } void NodeChannel::AddBrokerClient(const ports::NodeName& client_name, - ScopedPlatformHandle process_handle) { + base::ProcessHandle process_handle) { AddBrokerClientData* data; ScopedPlatformHandleVectorPtr handles(new PlatformHandleVector()); #if defined(OS_WIN) - handles->push_back(process_handle.release()); + handles->push_back(PlatformHandle(process_handle)); #endif Channel::MessagePtr message = CreateMessage( MessageType::ADD_BROKER_CLIENT, sizeof(AddBrokerClientData), handles->size(), &data); message->SetHandles(std::move(handles)); data->client_name = client_name; +#if !defined(OS_WIN) + data->process_handle = process_handle; +#endif WriteChannelMessage(std::move(message)); } @@ -382,14 +392,16 @@ } process_handle = ScopedPlatformHandle(handles->at(0)); handles->clear(); + delegate_->OnAddBrokerClient(remote_node_name_, data->client_name, + process_handle.release().handle); #else if (handles && handles->size() != 0) { DLOG(ERROR) << "Dropping invalid AddBrokerClient message."; break; } -#endif delegate_->OnAddBrokerClient(remote_node_name_, data->client_name, - std::move(process_handle)); + data->process_handle); +#endif break; }
diff --git a/mojo/edk/system/node_channel.h b/mojo/edk/system/node_channel.h index e08dc47..7dc10500 100644 --- a/mojo/edk/system/node_channel.h +++ b/mojo/edk/system/node_channel.h
@@ -36,7 +36,7 @@ const ports::NodeName& child_name) = 0; virtual void OnAddBrokerClient(const ports::NodeName& from_node, const ports::NodeName& client_name, - ScopedPlatformHandle process_handle) = 0; + base::ProcessHandle process_handle) = 0; virtual void OnBrokerClientAdded(const ports::NodeName& from_node, const ports::NodeName& client_name, ScopedPlatformHandle broker_channel) = 0; @@ -82,7 +82,9 @@ void SetRemoteProcessHandle(base::ProcessHandle process_handle); bool HasRemoteProcessHandle(); - ScopedPlatformHandle CopyRemoteProcessHandle(); + // Note: The returned |ProcessHandle| is owned by the caller and should be + // freed if necessary. + base::ProcessHandle CopyRemoteProcessHandle(); // Used for context in Delegate calls (via |from_node| arguments.) void SetRemoteNodeName(const ports::NodeName& name); @@ -92,7 +94,7 @@ void AcceptParent(const ports::NodeName& token, const ports::NodeName& child_name); void AddBrokerClient(const ports::NodeName& client_name, - ScopedPlatformHandle process_handle); + base::ProcessHandle process_handle); void BrokerClientAdded(const ports::NodeName& client_name, ScopedPlatformHandle broker_channel); void AcceptBrokerClient(const ports::NodeName& broker_name, @@ -138,10 +140,8 @@ // Must only be accessed from |io_task_runner_|'s thread. ports::NodeName remote_node_name_; -#if defined(OS_WIN) base::Lock remote_process_handle_lock_; base::ProcessHandle remote_process_handle_ = base::kNullProcessHandle; -#endif DISALLOW_COPY_AND_ASSIGN(NodeChannel); };
diff --git a/mojo/edk/system/node_controller.cc b/mojo/edk/system/node_controller.cc index 4c211ac..01fd33b 100644 --- a/mojo/edk/system/node_controller.cc +++ b/mojo/edk/system/node_controller.cc
@@ -577,7 +577,12 @@ void NodeController::OnAddBrokerClient(const ports::NodeName& from_node, const ports::NodeName& client_name, - ScopedPlatformHandle process_handle) { + base::ProcessHandle process_handle) { +#if defined(OS_WIN) + // Scoped handle to avoid leaks on error. + ScopedPlatformHandle scoped_process_handle = + ScopedPlatformHandle(PlatformHandle(process_handle)); +#endif scoped_refptr<NodeChannel> sender = GetPeerChannel(from_node); if (!sender) { DLOG(ERROR) << "Ignoring AddBrokerClient from unknown sender."; @@ -597,11 +602,13 @@ #if defined(OS_WIN) // The broker must have a working handle to the client process in order to // properly copy other handles to and from the client. - if(!process_handle.is_valid()) { + if (!scoped_process_handle.is_valid()) { DLOG(ERROR) << "Broker rejecting client with invalid process handle."; return; } - client->SetRemoteProcessHandle(process_handle.release().handle); + client->SetRemoteProcessHandle(scoped_process_handle.release().handle); +#else + client->SetRemoteProcessHandle(process_handle); #endif AddPeer(client_name, client, true /* start_channel */);
diff --git a/mojo/edk/system/node_controller.h b/mojo/edk/system/node_controller.h index 0675e97..c103e03 100644 --- a/mojo/edk/system/node_controller.h +++ b/mojo/edk/system/node_controller.h
@@ -143,7 +143,7 @@ const ports::NodeName& child_name) override; void OnAddBrokerClient(const ports::NodeName& from_node, const ports::NodeName& client_name, - ScopedPlatformHandle process_handle) override; + base::ProcessHandle process_handle) override; void OnBrokerClientAdded(const ports::NodeName& from_node, const ports::NodeName& client_name, ScopedPlatformHandle broker_channel) override;
diff --git a/net/android/java/src/org/chromium/net/NetworkChangeNotifier.java b/net/android/java/src/org/chromium/net/NetworkChangeNotifier.java index 6b023d3..ee916b4f 100644 --- a/net/android/java/src/org/chromium/net/NetworkChangeNotifier.java +++ b/net/android/java/src/org/chromium/net/NetworkChangeNotifier.java
@@ -76,6 +76,13 @@ } @CalledByNative + public int getCurrentConnectionSubtype() { + return mAutoDetector == null + ? ConnectionSubtype.SUBTYPE_UNKNOWN + : mAutoDetector.getCurrentConnectionSubtype(mAutoDetector.getCurrentNetworkState()); + } + + @CalledByNative public double getCurrentMaxBandwidthInMbps() { return mCurrentMaxBandwidth; }
diff --git a/net/android/java/src/org/chromium/net/NetworkChangeNotifierAutoDetect.java b/net/android/java/src/org/chromium/net/NetworkChangeNotifierAutoDetect.java index 24ab74d..6ec243c1 100644 --- a/net/android/java/src/org/chromium/net/NetworkChangeNotifierAutoDetect.java +++ b/net/android/java/src/org/chromium/net/NetworkChangeNotifierAutoDetect.java
@@ -546,6 +546,9 @@ return mConnectivityManagerDelegate.getDefaultNetId(); } + /** + * Returns the connection type for the given NetworkState. + */ public int getCurrentConnectionType(NetworkState networkState) { if (!networkState.isConnected()) { return ConnectionType.CONNECTION_NONE; @@ -589,25 +592,10 @@ } } - /* - * Returns the bandwidth of the current connection in Mbps. The result is - * derived from the NetInfo v3 specification's mapping from network type to - * max link speed. In cases where more information is available, such as wifi, - * that is used instead. For more on NetInfo, see http://w3c.github.io/netinfo/. + /** + * Returns the connection subtype for the given NetworkState. */ - public double getCurrentMaxBandwidthInMbps(NetworkState networkState) { - if (getCurrentConnectionType(networkState) == ConnectionType.CONNECTION_WIFI) { - final int link_speed = mWifiManagerDelegate.getLinkSpeedInMbps(); - if (link_speed != UNKNOWN_LINK_SPEED) { - return link_speed; - } - } - - return NetworkChangeNotifier.getMaxBandwidthForConnectionSubtype( - getCurrentConnectionSubtype(networkState)); - } - - private int getCurrentConnectionSubtype(NetworkState networkState) { + public int getCurrentConnectionSubtype(NetworkState networkState) { if (!networkState.isConnected()) { return ConnectionSubtype.SUBTYPE_NONE; } @@ -659,6 +647,24 @@ } } + /** + * Returns the bandwidth of the current connection in Mbps. The result is + * derived from the NetInfo v3 specification's mapping from network type to + * max link speed. In cases where more information is available, such as wifi, + * that is used instead. For more on NetInfo, see http://w3c.github.io/netinfo/. + */ + public double getCurrentMaxBandwidthInMbps(NetworkState networkState) { + if (getCurrentConnectionType(networkState) == ConnectionType.CONNECTION_WIFI) { + final int link_speed = mWifiManagerDelegate.getLinkSpeedInMbps(); + if (link_speed != UNKNOWN_LINK_SPEED) { + return link_speed; + } + } + + return NetworkChangeNotifier.getMaxBandwidthForConnectionSubtype( + getCurrentConnectionSubtype(networkState)); + } + private String getCurrentWifiSSID(NetworkState networkState) { if (getCurrentConnectionType(networkState) != ConnectionType.CONNECTION_WIFI) return ""; return mWifiManagerDelegate.getWifiSSID();
diff --git a/net/android/network_change_notifier_android.cc b/net/android/network_change_notifier_android.cc index a7655adb..74d47936 100644 --- a/net/android/network_change_notifier_android.cc +++ b/net/android/network_change_notifier_android.cc
@@ -61,6 +61,7 @@ #include "base/android/build_info.h" #include "base/macros.h" +#include "base/metrics/histogram_macros.h" #include "base/threading/thread.h" #include "net/base/address_tracker_linux.h" #include "net/dns/dns_config_service_posix.h" @@ -84,7 +85,7 @@ : public base::Thread, public NetworkChangeNotifier::NetworkChangeObserver { public: - DnsConfigServiceThread(const DnsConfig* dns_config_for_testing) + explicit DnsConfigServiceThread(const DnsConfig* dns_config_for_testing) : base::Thread("DnsConfigService"), dns_config_for_testing_(dns_config_for_testing), creation_time_(base::Time::Now()), @@ -263,4 +264,19 @@ return params; } +void NetworkChangeNotifierAndroid::OnFinalizingMetricsLogRecord() { + // Metrics logged here will be included in every metrics log record. It's not + // yet clear if these metrics are generally useful enough to warrant being + // added to the SystemProfile proto, so they are logged here as histograms for + // now. + const NetworkChangeNotifier::ConnectionType type = + NetworkChangeNotifier::GetConnectionType(); + NetworkChangeNotifier::LogOperatorCodeHistogram(type); + if (NetworkChangeNotifier::IsConnectionCellular(type)) { + UMA_HISTOGRAM_ENUMERATION("NCN.CellularConnectionSubtype", + delegate_->GetCurrentConnectionSubtype(), + SUBTYPE_LAST + 1); + } +} + } // namespace net
diff --git a/net/android/network_change_notifier_android.h b/net/android/network_change_notifier_android.h index 89e7f19e..203daf3 100644 --- a/net/android/network_change_notifier_android.h +++ b/net/android/network_change_notifier_android.h
@@ -73,6 +73,9 @@ // delegate class. using NetworkChangeNotifier::GetMaxBandwidthForConnectionSubtype; + protected: + void OnFinalizingMetricsLogRecord() override; + private: friend class NetworkChangeNotifierAndroidTest; friend class NetworkChangeNotifierFactoryAndroid;
diff --git a/net/android/network_change_notifier_delegate_android.cc b/net/android/network_change_notifier_delegate_android.cc index ff072979..429a576 100644 --- a/net/android/network_change_notifier_delegate_android.cc +++ b/net/android/network_change_notifier_delegate_android.cc
@@ -109,6 +109,15 @@ return connection_type_; } +NetworkChangeNotifier::ConnectionSubtype +NetworkChangeNotifierDelegateAndroid::GetCurrentConnectionSubtype() const { + DCHECK(thread_checker_.CalledOnValidThread()); + return ConvertConnectionSubtype( + Java_NetworkChangeNotifier_getCurrentConnectionSubtype( + base::android::AttachCurrentThread(), + java_network_change_notifier_.obj())); +} + void NetworkChangeNotifierDelegateAndroid:: GetCurrentMaxBandwidthAndConnectionType( double* max_bandwidth_mbps,
diff --git a/net/android/network_change_notifier_delegate_android.h b/net/android/network_change_notifier_delegate_android.h index a9f18d5..719be5b 100644 --- a/net/android/network_change_notifier_delegate_android.h +++ b/net/android/network_change_notifier_delegate_android.h
@@ -107,6 +107,9 @@ NetworkHandle GetCurrentDefaultNetwork() const; void GetCurrentlyConnectedNetworks(NetworkList* network_list) const; + // Can only be called from the main (Java) thread. + NetworkChangeNotifier::ConnectionSubtype GetCurrentConnectionSubtype() const; + // Initializes JNI bindings. static bool Register(JNIEnv* env); @@ -153,4 +156,4 @@ } // namespace net -#endif // NET_ANDROID_NETWORK_CHANGE_NOTIFIER_DELEGATE_H_ +#endif // NET_ANDROID_NETWORK_CHANGE_NOTIFIER_DELEGATE_ANDROID_H_
diff --git a/net/base/dir_header.html b/net/base/dir_header.html index c75637b..8bb1f1e 100644 --- a/net/base/dir_header.html +++ b/net/base/dir_header.html
@@ -7,7 +7,8 @@ <meta name="google" value="notranslate"> <script> -function addRow(name, url, isdir, size, date_modified) { +function addRow(name, url, isdir, + size, size_string, date_modified, date_modified_string) { if (name == ".") return; @@ -15,7 +16,7 @@ if (root.substr(-1) !== "/") root += "/"; - var table = document.getElementById("table"); + var tbody = document.getElementById("tbody"); var row = document.createElement("tr"); var file_cell = document.createElement("td"); var link = document.createElement("a"); @@ -26,13 +27,16 @@ link.href = root + ".."; link.innerText = document.getElementById("parentDirText").innerText; link.className = "icon up"; - size = ""; - date_modified = ""; + size = 0; + size_string = ""; + date_modified = 0; + date_modified_string = ""; } else { if (isdir) { name = name + "/"; url = url + "/"; - size = ""; + size = 0; + size_string = ""; } else { link.draggable = "true"; link.addEventListener("dragstart", onDragStart, false); @@ -40,13 +44,14 @@ link.innerText = name; link.href = root + url; } + file_cell.dataset.value = name; file_cell.appendChild(link); row.appendChild(file_cell); - row.appendChild(createCell(size)); - row.appendChild(createCell(date_modified)); + row.appendChild(createCell(size, size_string)); + row.appendChild(createCell(date_modified, date_modified_string)); - table.appendChild(row); + tbody.appendChild(row); } function onDragStart(e) { @@ -57,9 +62,10 @@ e.dataTransfer.effectAllowed = "copy"; } -function createCell(text) { +function createCell(value, text) { var cell = document.createElement("td"); cell.setAttribute("class", "detailsColumn"); + cell.dataset.value = value; cell.innerText = text; return cell; } @@ -77,6 +83,46 @@ + "?raw"); box.style.display = "block"; } + +function sortTable(column) { + var theader = document.getElementById("theader"); + var oldOrder = theader.cells[column].dataset.order || '1'; + oldOrder = parseInt(oldOrder, 10) + var newOrder = 0 - oldOrder; + theader.cells[column].dataset.order = newOrder; + + var tbody = document.getElementById("tbody"); + var rows = tbody.rows; + var list = [], i; + for (i = 0; i < rows.length; i++) { + list.push(rows[i]); + } + + list.sort(function(row1, row2) { + var a = row1.cells[column].dataset.value; + var b = row2.cells[column].dataset.value; + if (column) { + a = parseInt(a, 10); + b = parseInt(b, 10); + return a > b ? newOrder : a < b ? oldOrder : 0; + } + + // Column 0 is text. + // Also the parent directory should always be sorted at one of the ends. + if (b == ".." | a > b) { + return newOrder; + } else if (a == ".." | a < b) { + return oldOrder; + } else { + return 0; + } + }); + + // Appending an existing child again just moves it. + for (i = 0; i < list.length; i++) { + tbody.appendChild(list[i]); + } +} </script> <style> @@ -92,8 +138,8 @@ border-collapse: collapse; } - tr.header { - font-weight: bold; + th { + cursor: pointer; } td.detailsColumn { @@ -147,12 +193,16 @@ <h1 id="header" i18n-content="header"></h1> -<table id="table"> - <tr class="header"> - <td i18n-content="headerName"></td> - <td class="detailsColumn" i18n-content="headerSize"></td> - <td class="detailsColumn" i18n-content="headerDateModified"></td> - </tr> +<table> + <thead> + <tr class="header" id="theader"> + <th i18n-content="headerName" onclick="javascript:sortTable(0);"></th> + <th class="detailsColumn" i18n-content="headerSize" onclick="javascript:sortTable(1);"></th> + <th class="detailsColumn" i18n-content="headerDateModified" onclick="javascript:sortTable(2);"></th> + </tr> + </thead> + <tbody id="tbody"> + </tbody> </table> </body>
diff --git a/net/base/directory_listing.cc b/net/base/directory_listing.cc index 25d98bc..e563547 100644 --- a/net/base/directory_listing.cc +++ b/net/base/directory_listing.cc
@@ -57,6 +57,10 @@ } // Negative size means unknown or not applicable (e.g. directory). + std::stringstream raw_size_string_stream; + raw_size_string_stream << size << ","; + result.append(raw_size_string_stream.str()); + base::string16 size_string; if (size >= 0) size_string = base::FormatBytesUnlocalized(size); @@ -64,12 +68,23 @@ result.append(","); - base::string16 modified_str; // |modified| can be NULL in FTP listings. - if (!modified.is_null()) - modified_str = base::TimeFormatShortDateAndTime(modified); - base::EscapeJSONString(modified_str, true, &result); + base::string16 modified_str; + if (modified.is_null()) { + result.append("0,"); + } else { + std::stringstream raw_time_string_stream; + // Certain access paths can only get up to seconds resolution, so here we + // output the raw time value in seconds for consistency. + raw_time_string_stream << modified.ToJavaTime() / + base::Time::kMillisecondsPerSecond + << ","; + result.append(raw_time_string_stream.str()); + modified_str = base::TimeFormatShortDateAndTime(modified); + } + + base::EscapeJSONString(modified_str, true, &result); result.append(");</script>\n"); return result;
diff --git a/net/base/directory_listing_unittest.cc b/net/base/directory_listing_unittest.cc index 7470c2a..4f888c0 100644 --- a/net/base/directory_listing_unittest.cc +++ b/net/base/directory_listing_unittest.cc
@@ -23,44 +23,24 @@ TEST(DirectoryListingTest, GetDirectoryListingEntry) { const GetDirectoryListingEntryCase test_cases[] = { - {L"Foo", - "", - false, - 10000, - base::Time(), - "<script>addRow(\"Foo\",\"Foo\",0,\"9.8 kB\",\"\");</script>\n"}, - {L"quo\"tes", - "", - false, - 10000, - base::Time(), - "<script>addRow(\"quo\\\"tes\",\"quo%22tes\",0,\"9.8 kB\",\"\");</script>" - "\n"}, - {L"quo\"tes", - "quo\"tes", - false, - 10000, - base::Time(), - "<script>addRow(\"quo\\\"tes\",\"quo%22tes\",0,\"9.8 kB\",\"\");</script>" - "\n"}, - // U+D55C0 U+AE00. raw_bytes is empty (either a local file with - // UTF-8/UTF-16 encoding or a remote file on an ftp server using UTF-8 - {L"\xD55C\xAE00.txt", - "", - false, - 10000, - base::Time(), - "<script>addRow(\"\xED\x95\x9C\xEA\xB8\x80.txt\"," - "\"%ED%95%9C%EA%B8%80.txt\",0,\"9.8 kB\",\"\");</script>\n"}, - // U+D55C0 U+AE00. raw_bytes is the corresponding EUC-KR sequence: - // a local or remote file in EUC-KR. - {L"\xD55C\xAE00.txt", - "\xC7\xD1\xB1\xDB.txt", - false, - 10000, - base::Time(), - "<script>addRow(\"\xED\x95\x9C\xEA\xB8\x80.txt\",\"%C7%D1%B1%DB.txt\"" - ",0,\"9.8 kB\",\"\");</script>\n"}, + {L"Foo", "", false, 10000, base::Time(), + "<script>addRow(\"Foo\",\"Foo\",0,10000,\"9.8 kB\",0,\"\");</script>\n"}, + {L"quo\"tes", "", false, 10000, base::Time(), + "<script>addRow(\"quo\\\"tes\",\"quo%22tes\",0,10000,\"9.8 kB\",0,\"\"" + ");</script>\n"}, + {L"quo\"tes", "quo\"tes", false, 10000, base::Time(), + "<script>addRow(\"quo\\\"tes\",\"quo%22tes\",0,10000,\"9.8 kB\",0,\"\"" + ");</script>\n"}, + // U+D55C0 U+AE00. raw_bytes is empty (either a local file with + // UTF-8/UTF-16 encoding or a remote file on an ftp server using UTF-8 + {L"\xD55C\xAE00.txt", "", false, 10000, base::Time(), + "<script>addRow(\"\xED\x95\x9C\xEA\xB8\x80.txt\"," + "\"%ED%95%9C%EA%B8%80.txt\",0,10000,\"9.8 kB\",0,\"\");</script>\n"}, + // U+D55C0 U+AE00. raw_bytes is the corresponding EUC-KR sequence: + // a local or remote file in EUC-KR. + {L"\xD55C\xAE00.txt", "\xC7\xD1\xB1\xDB.txt", false, 10000, base::Time(), + "<script>addRow(\"\xED\x95\x9C\xEA\xB8\x80.txt\",\"%C7%D1%B1%DB.txt\"" + ",0,10000,\"9.8 kB\",0,\"\");</script>\n"}, }; for (size_t i = 0; i < arraysize(test_cases); ++i) {
diff --git a/net/base/ip_address.cc b/net/base/ip_address.cc index f9565e5ad..170be40 100644 --- a/net/base/ip_address.cc +++ b/net/base/ip_address.cc
@@ -17,6 +17,8 @@ IPAddress::IPAddress(const IPAddressNumber& address) : ip_address_(address) {} +IPAddress::IPAddress(const IPAddress& other) = default; + IPAddress::IPAddress(const uint8_t* address, size_t address_len) : ip_address_(address, address + address_len) {}
diff --git a/net/base/ip_address.h b/net/base/ip_address.h index f46eadb..f1f7480 100644 --- a/net/base/ip_address.h +++ b/net/base/ip_address.h
@@ -29,6 +29,8 @@ // Creates an IP address from a deprecated IPAddressNumber. explicit IPAddress(const IPAddressNumber& address); + IPAddress(const IPAddress& other); + // Copies the input address to |ip_address_|. The input is expected to be in // network byte order. template <size_t N>
diff --git a/net/base/load_timing_info.cc b/net/base/load_timing_info.cc index ce4df2d..309e7b3 100644 --- a/net/base/load_timing_info.cc +++ b/net/base/load_timing_info.cc
@@ -16,6 +16,8 @@ socket_log_id(NetLog::Source::kInvalidId) { } +LoadTimingInfo::LoadTimingInfo(const LoadTimingInfo& other) = default; + LoadTimingInfo::~LoadTimingInfo() {} } // namespace net
diff --git a/net/base/load_timing_info.h b/net/base/load_timing_info.h index 22a59082..8ee5a22 100644 --- a/net/base/load_timing_info.h +++ b/net/base/load_timing_info.h
@@ -93,6 +93,7 @@ }; LoadTimingInfo(); + LoadTimingInfo(const LoadTimingInfo& other); ~LoadTimingInfo(); // True if the socket was reused. When true, DNS, connect, and SSL times
diff --git a/net/base/net_error_details.h b/net/base/net_error_details.h index 940394e..47efebe 100644 --- a/net/base/net_error_details.h +++ b/net/base/net_error_details.h
@@ -5,6 +5,7 @@ #ifndef NET_BASE_NET_ERROR_DETAILS_H_ #define NET_BASE_NET_ERROR_DETAILS_H_ +#include "net/http/http_response_info.h" #include "net/quic/quic_protocol.h" namespace net { @@ -13,16 +14,23 @@ // net stack. struct NET_EXPORT NetErrorDetails { NetErrorDetails() - : quic_broken(false), quic_connection_error(QUIC_NO_ERROR) {} + : quic_broken(false), + quic_connection_error(QUIC_NO_ERROR), + connection_info(HttpResponseInfo::CONNECTION_INFO_UNKNOWN) {} NetErrorDetails(bool quic_broken, QuicErrorCode quic_connection_error) : quic_broken(quic_broken), - quic_connection_error(quic_connection_error) {} + quic_connection_error(quic_connection_error), + connection_info(HttpResponseInfo::CONNECTION_INFO_UNKNOWN) {} // True if all QUIC alternative services are marked broken for the origin. bool quic_broken; // QUIC granular error info. QuicErrorCode quic_connection_error; + // Early prediction of the connection type that this request attempts to use. + // Will be discarded by upper layers if the connection type can be fetched + // from response header from the server. + HttpResponseInfo::ConnectionInfo connection_info; }; } // namespace net
diff --git a/net/base/network_change_notifier.cc b/net/base/network_change_notifier.cc index 17c91f59..93ca8ba 100644 --- a/net/base/network_change_notifier.cc +++ b/net/base/network_change_notifier.cc
@@ -420,7 +420,7 @@ : public ConnectionTypeObserver, public IPAddressObserver { public: - NetworkChangeCalculator(const NetworkChangeCalculatorParams& params) + explicit NetworkChangeCalculator(const NetworkChangeCalculatorParams& params) : params_(params), have_announced_(false), last_announced_connection_type_(CONNECTION_NONE), @@ -730,14 +730,19 @@ } // static +void NetworkChangeNotifier::FinalizingMetricsLogRecord() { + if (!g_network_change_notifier) + return; + g_network_change_notifier->OnFinalizingMetricsLogRecord(); +} + +// static void NetworkChangeNotifier::LogOperatorCodeHistogram(ConnectionType type) { #if defined(OS_ANDROID) - // On a connection type change to 2/3/4G, log the network operator MCC/MNC. + // On a connection type change to cellular, log the network operator MCC/MNC. // Log zero in other cases. unsigned mcc_mnc = 0; - if (type == NetworkChangeNotifier::CONNECTION_2G || - type == NetworkChangeNotifier::CONNECTION_3G || - type == NetworkChangeNotifier::CONNECTION_4G) { + if (NetworkChangeNotifier::IsConnectionCellular(type)) { // Log zero if not perfectly converted. if (!base::StringToUint(android::GetTelephonyNetworkOperator(), &mcc_mnc)) { mcc_mnc = 0; @@ -758,7 +763,7 @@ // static bool NetworkChangeNotifier::IsOffline() { - return GetConnectionType() == CONNECTION_NONE; + return GetConnectionType() == CONNECTION_NONE; } // static
diff --git a/net/base/network_change_notifier.h b/net/base/network_change_notifier.h index 214fb57..a420a24 100644 --- a/net/base/network_change_notifier.h +++ b/net/base/network_change_notifier.h
@@ -60,8 +60,10 @@ }; // This is the NetInfo v3 set of connection technologies as seen in - // http://w3c.github.io/netinfo/. This enum is copied in - // NetworkChangeNotifier.java so be sure to change both at once. + // http://w3c.github.io/netinfo/. This enum is duplicated in histograms.xml + // so be sure to change both at once. Additionally, since this enum is used in + // a UMA histogram, it should not be re-ordered and any new values should be + // added to the end. // // A Java counterpart will be generated for this enum. // GENERATED_JAVA_ENUM_PACKAGE: org.chromium.net @@ -420,6 +422,12 @@ // should be called from the network thread to avoid race conditions. static void ShutdownHistogramWatcher(); + // Invoked at the time a new user metrics log record is being finalized, on + // the main thread. NCN Histograms that want to be logged once per record + // should be logged in this method. Platform-specific histograms should be + // logged in an overridden implementaton of OnFinalizingMetricsLogRecord. + static void FinalizingMetricsLogRecord(); + // Log the |NCN.NetworkOperatorMCCMNC| histogram. static void LogOperatorCodeHistogram(ConnectionType type); @@ -497,6 +505,10 @@ NetworkHandle network) const; virtual NetworkHandle GetCurrentDefaultNetwork() const; + // Hook that allows derived implementations to log histograms at the time a + // new histogram record is being finalized. + virtual void OnFinalizingMetricsLogRecord() {} + // Broadcasts a notification to all registered observers. Note that this // happens asynchronously, even for observers on the current thread, even in // tests.
diff --git a/net/base/network_interfaces.cc b/net/base/network_interfaces.cc index 6792fca..96a9ef4d 100644 --- a/net/base/network_interfaces.cc +++ b/net/base/network_interfaces.cc
@@ -37,6 +37,8 @@ ip_address_attributes(ip_address_attributes) { } +NetworkInterface::NetworkInterface(const NetworkInterface& other) = default; + NetworkInterface::~NetworkInterface() { }
diff --git a/net/base/network_interfaces.h b/net/base/network_interfaces.h index 09a085f..a4246e2 100644 --- a/net/base/network_interfaces.h +++ b/net/base/network_interfaces.h
@@ -47,6 +47,7 @@ const IPAddressNumber& address, uint32_t prefix_length, int ip_address_attributes); + NetworkInterface(const NetworkInterface& other); ~NetworkInterface(); std::string name;
diff --git a/net/base/prioritized_dispatcher.cc b/net/base/prioritized_dispatcher.cc index b72f7a50..a6125a0 100644 --- a/net/base/prioritized_dispatcher.cc +++ b/net/base/prioritized_dispatcher.cc
@@ -12,6 +12,8 @@ size_t total_jobs) : total_jobs(total_jobs), reserved_slots(num_priorities) {} +PrioritizedDispatcher::Limits::Limits(const Limits& other) = default; + PrioritizedDispatcher::Limits::~Limits() {} PrioritizedDispatcher::PrioritizedDispatcher(const Limits& limits)
diff --git a/net/base/prioritized_dispatcher.h b/net/base/prioritized_dispatcher.h index 8da8a1a..a0716cc 100644 --- a/net/base/prioritized_dispatcher.h +++ b/net/base/prioritized_dispatcher.h
@@ -40,6 +40,7 @@ // for priority 3 or above. struct NET_EXPORT_PRIVATE Limits { Limits(Priority num_priorities, size_t total_jobs); + Limits(const Limits& other); ~Limits(); // Total allowed running jobs.
diff --git a/net/cert/cert_verify_proc_whitelist.cc b/net/cert/cert_verify_proc_whitelist.cc index c2437f8..3560f102 100644 --- a/net/cert/cert_verify_proc_whitelist.cc +++ b/net/cert/cert_verify_proc_whitelist.cc
@@ -22,18 +22,6 @@ 0xa0, 0xa8, 0xbb, 0xa5, 0x0a, 0x72, 0xd4, 0xe1, 0x83, 0x9a, 0x94, 0xfb, 0x1a, 0x58, 0x5a, 0xd7, 0x2a, 0x7a, 0xac, 0x3c, 0x72, 0x56, 0x1f, 0xc0 }, - { 0x00, 0xde, 0xff, 0x68, 0x2e, 0x35, 0x10, 0x22, - 0xcc, 0x3b, 0xbb, 0x4e, 0xb5, 0x88, 0x0a, 0x97, - 0x27, 0x88, 0x0a, 0xf3, 0x52, 0xfb, 0xbe, 0x2f, - 0x91, 0x24, 0xbe, 0x92, 0x88, 0x4b, 0x18, 0xfd }, - { 0x00, 0xf8, 0x4a, 0x82, 0x67, 0xb3, 0xda, 0xee, - 0x1e, 0x16, 0x90, 0x75, 0x1c, 0x86, 0xbd, 0x78, - 0x94, 0x08, 0x65, 0x94, 0x3e, 0xee, 0x52, 0xe9, - 0x7d, 0x98, 0x50, 0x1a, 0xc8, 0xe1, 0x58, 0x94 }, - { 0x01, 0x5f, 0x9b, 0x68, 0xd6, 0x4b, 0x86, 0x0d, - 0x5e, 0xd0, 0x40, 0x50, 0x66, 0xa3, 0xf2, 0xfd, - 0x9d, 0x6d, 0xde, 0x3a, 0x9b, 0x35, 0x73, 0x17, - 0x34, 0x10, 0xe6, 0xce, 0x63, 0x9b, 0x77, 0x91 }, { 0x01, 0x84, 0xb8, 0x58, 0xc0, 0x22, 0x4a, 0x51, 0x52, 0x41, 0x5c, 0x77, 0x68, 0x30, 0xa4, 0x42, 0x29, 0xf6, 0x44, 0xa3, 0x9e, 0xe5, 0x3e, 0x76, @@ -46,34 +34,14 @@ 0xa9, 0xd9, 0x04, 0x79, 0x1a, 0x63, 0xf6, 0x4d, 0x05, 0xf9, 0xe2, 0x03, 0xa1, 0xf1, 0x2b, 0x06, 0xd6, 0x55, 0x94, 0x01, 0x41, 0x0e, 0x73, 0x36 }, - { 0x02, 0x08, 0x22, 0xab, 0x1b, 0x8c, 0xc0, 0xd8, - 0x22, 0x03, 0x60, 0xa1, 0xaf, 0x8b, 0xb4, 0xd9, - 0xbe, 0x60, 0xe8, 0x43, 0x9e, 0x2b, 0xa3, 0x07, - 0x8d, 0x61, 0xf4, 0x01, 0xe1, 0x5b, 0x41, 0xbc }, { 0x02, 0x35, 0x38, 0xe2, 0x48, 0x15, 0x28, 0x75, 0x29, 0x2f, 0x2c, 0x83, 0x9a, 0xb3, 0x2b, 0xc7, 0x35, 0x1e, 0x2b, 0x29, 0x99, 0x1d, 0x66, 0xae, 0xa6, 0x16, 0xcb, 0x0b, 0x26, 0xa5, 0xe3, 0x75 }, - { 0x02, 0xc4, 0x8c, 0x3a, 0xdc, 0xf9, 0x9f, 0x28, - 0xf4, 0x79, 0xb8, 0xf6, 0x79, 0x88, 0x77, 0x78, - 0xb9, 0x3a, 0x06, 0xaf, 0xf1, 0x6e, 0x35, 0x8f, - 0x40, 0x9b, 0xc6, 0xfe, 0x54, 0x03, 0x04, 0xc6 }, { 0x02, 0xec, 0x35, 0xf5, 0x83, 0x4c, 0xd2, 0xc3, 0x43, 0x33, 0x39, 0x9a, 0xea, 0x6b, 0xda, 0x84, 0x68, 0xab, 0x8d, 0x74, 0xef, 0x6c, 0xa5, 0x2d, 0x33, 0x7a, 0x30, 0x69, 0x4c, 0x3f, 0x95, 0xa4 }, - { 0x03, 0x2a, 0x7e, 0x55, 0xfe, 0xc3, 0x74, 0xc6, - 0xd7, 0x9c, 0xff, 0xdb, 0x46, 0x7c, 0x5c, 0xcd, - 0x56, 0xf5, 0x49, 0x0a, 0xae, 0x9a, 0xf1, 0xbc, - 0xcc, 0x7e, 0x54, 0xda, 0xfa, 0x6d, 0x8a, 0x3f }, - { 0x03, 0x83, 0xf9, 0xc1, 0xf5, 0xc8, 0x4c, 0x02, - 0x64, 0xe6, 0x3b, 0x2a, 0x96, 0x21, 0x21, 0x37, - 0x58, 0x70, 0x0d, 0x1a, 0xfb, 0x61, 0xf8, 0x00, - 0x1f, 0x3e, 0xff, 0x81, 0x44, 0xe6, 0xfe, 0x73 }, - { 0x03, 0xd9, 0x9f, 0x24, 0xf8, 0x64, 0x4b, 0x80, - 0x4d, 0x8e, 0x3b, 0xc9, 0xc8, 0x7c, 0x02, 0x4e, - 0x4b, 0xb7, 0x0d, 0xc6, 0x30, 0x1b, 0xcd, 0xe3, - 0x24, 0x12, 0xb4, 0xce, 0x8c, 0x0c, 0x14, 0x58 }, { 0x03, 0xe0, 0x6e, 0x0b, 0x7a, 0x2c, 0xba, 0xe4, 0xb6, 0x8b, 0xce, 0x5f, 0x83, 0xe7, 0xa9, 0x31, 0x6e, 0xd7, 0x82, 0x3e, 0x8d, 0x94, 0x85, 0x38, @@ -186,10 +154,6 @@ 0x18, 0x68, 0x8e, 0xc6, 0x2f, 0x1c, 0x17, 0x30, 0xdc, 0xa2, 0x20, 0x48, 0x57, 0xce, 0x5f, 0xad, 0xb6, 0x6c, 0xe6, 0x6b, 0xda, 0xb1, 0x70, 0x3d }, - { 0x0b, 0x3d, 0x17, 0x8d, 0x8a, 0x68, 0x43, 0x73, - 0x19, 0x35, 0x9f, 0xa3, 0x54, 0x28, 0x65, 0xad, - 0xe1, 0x20, 0x02, 0x9a, 0xbe, 0x5b, 0x02, 0xba, - 0xff, 0xbe, 0x98, 0x8b, 0x2a, 0x14, 0x46, 0x3d }, { 0x0b, 0x48, 0xd5, 0x5c, 0xac, 0x84, 0xfd, 0xee, 0x15, 0xd8, 0x1a, 0xff, 0x99, 0x07, 0xbb, 0x9a, 0x57, 0x11, 0xa9, 0x5c, 0xe2, 0x3a, 0x8d, 0x4d, @@ -226,14 +190,6 @@ 0xaf, 0x69, 0x65, 0x29, 0x28, 0x9a, 0xae, 0x25, 0xd9, 0xc4, 0x2a, 0x1b, 0xbb, 0x03, 0x5a, 0x2b, 0x8c, 0x61, 0x14, 0x7e, 0x1b, 0x8b, 0x90, 0x52 }, - { 0x0d, 0xab, 0xae, 0xcb, 0x0d, 0x12, 0x9b, 0xc6, - 0x36, 0xe8, 0x4a, 0x4b, 0x23, 0x93, 0x46, 0x03, - 0x06, 0xab, 0x49, 0xbd, 0x03, 0xe2, 0x22, 0xee, - 0x79, 0x2a, 0x36, 0x9e, 0x6e, 0x4f, 0x70, 0x72 }, - { 0x0e, 0x4f, 0xd8, 0x53, 0xd6, 0x0f, 0xd7, 0x69, - 0x90, 0xd7, 0x77, 0xaf, 0x09, 0x79, 0xd4, 0x65, - 0x16, 0xbd, 0xc9, 0x09, 0xa8, 0xd9, 0xd5, 0xef, - 0x70, 0x15, 0x59, 0xbf, 0x74, 0x62, 0xc4, 0xaf }, { 0x0e, 0xfd, 0x68, 0x73, 0xd6, 0x0e, 0x77, 0x96, 0x2d, 0xf6, 0x00, 0x16, 0xdc, 0x3b, 0xaf, 0x9c, 0xa7, 0x1e, 0x7d, 0x86, 0x19, 0xe7, 0xeb, 0xaa, @@ -242,26 +198,14 @@ 0x23, 0x4a, 0x86, 0xc7, 0x0d, 0x49, 0x8c, 0x62, 0x60, 0x7f, 0x37, 0x44, 0xea, 0x71, 0xf1, 0x83, 0x1d, 0xcf, 0xca, 0xf3, 0xaf, 0x15, 0x56, 0x9c }, - { 0x0f, 0x57, 0xed, 0x67, 0x2b, 0xac, 0x50, 0x14, - 0x89, 0xe4, 0xf4, 0xab, 0x4b, 0x1d, 0xb1, 0x75, - 0x81, 0xfe, 0xb8, 0x76, 0x0f, 0xfb, 0xc0, 0x8a, - 0x82, 0x83, 0xe0, 0xf8, 0x41, 0xae, 0x01, 0x3c }, { 0x10, 0x83, 0x6d, 0xa0, 0xcd, 0x6a, 0xc0, 0x95, 0xdd, 0x7a, 0xc3, 0x4d, 0x99, 0x01, 0x90, 0x9a, 0x8e, 0xf8, 0x4d, 0x6e, 0xe0, 0x5b, 0x83, 0x43, 0x03, 0xd4, 0x7f, 0xc0, 0xa5, 0xf9, 0x14, 0xfa }, - { 0x11, 0x65, 0x97, 0x60, 0x44, 0x7f, 0xb6, 0x8d, - 0x4f, 0xbb, 0x37, 0x6e, 0x3b, 0x66, 0xb1, 0x94, - 0xda, 0x3e, 0xe0, 0x42, 0x5a, 0x0b, 0xc2, 0x13, - 0x88, 0x06, 0xb2, 0x78, 0x43, 0x79, 0xd3, 0xb8 }, { 0x11, 0xa4, 0x02, 0x7b, 0x45, 0xfc, 0x9a, 0x6f, 0x40, 0x21, 0x25, 0xc3, 0xca, 0x22, 0x68, 0xe0, 0x15, 0xa3, 0x1b, 0xa4, 0xfd, 0xb0, 0x05, 0x9d, 0x66, 0x6b, 0x73, 0xc8, 0x51, 0xd5, 0x35, 0x92 }, - { 0x11, 0xb7, 0x69, 0xde, 0xde, 0x8b, 0xd6, 0x15, - 0xfc, 0x71, 0x20, 0x0b, 0x20, 0xb9, 0xa3, 0x1d, - 0x70, 0x93, 0x15, 0x16, 0xec, 0x54, 0x42, 0xc3, - 0xdd, 0xc9, 0xc8, 0xd1, 0x90, 0x21, 0x9d, 0xe1 }, { 0x11, 0xde, 0x20, 0x2a, 0x3e, 0x34, 0x13, 0xa2, 0x33, 0x3e, 0xc1, 0x67, 0x8e, 0xbb, 0x50, 0x6d, 0xd9, 0x55, 0x7c, 0x06, 0x81, 0xce, 0x5f, 0xed, @@ -314,10 +258,6 @@ 0x06, 0x78, 0xdc, 0x5b, 0xa8, 0x03, 0x84, 0x7a, 0xbd, 0xb5, 0xea, 0x64, 0x31, 0x65, 0x3e, 0xc2, 0x5f, 0xdc, 0x8d, 0x2b, 0xb3, 0x3d, 0x12, 0x23 }, - { 0x15, 0xea, 0x55, 0xf0, 0x2c, 0x49, 0x02, 0xec, - 0x77, 0x72, 0x64, 0xe0, 0x81, 0x71, 0x41, 0x24, - 0x7c, 0x52, 0x00, 0xe1, 0x16, 0x56, 0xfd, 0xc2, - 0x72, 0x9d, 0x59, 0x5c, 0x37, 0x79, 0x95, 0x6c }, { 0x16, 0x21, 0xec, 0x14, 0xe0, 0xb4, 0x13, 0xfa, 0xb7, 0xd0, 0x27, 0x5a, 0x9a, 0xc3, 0xc3, 0xc9, 0x85, 0x13, 0xfe, 0x18, 0xa2, 0x02, 0x86, 0xf6, @@ -326,22 +266,10 @@ 0x1d, 0xb5, 0x84, 0x6c, 0xca, 0x8e, 0xb7, 0x19, 0x12, 0x3d, 0x4b, 0x06, 0xb3, 0xff, 0x98, 0x66, 0xd7, 0x4d, 0x6e, 0x18, 0x7c, 0x1e, 0xf9, 0x70 }, - { 0x16, 0xe7, 0x66, 0x47, 0xb3, 0x97, 0xeb, 0x4e, - 0xfd, 0x9a, 0x79, 0xf2, 0xfb, 0xba, 0x9a, 0xca, - 0x46, 0xce, 0xad, 0x95, 0x43, 0x05, 0xfe, 0xe5, - 0xb1, 0x3b, 0x5d, 0x53, 0xdb, 0x7c, 0x1d, 0xb1 }, { 0x17, 0x3d, 0xe2, 0x60, 0xe2, 0x2d, 0x76, 0x9d, 0x2d, 0x54, 0x99, 0xc8, 0x22, 0x0d, 0x86, 0xed, 0xe3, 0x48, 0xda, 0x1e, 0x57, 0xc1, 0xe7, 0xc8, 0x15, 0x07, 0xfb, 0x3e, 0x6b, 0xd7, 0x3b, 0x7f }, - { 0x17, 0x59, 0x7e, 0x00, 0x45, 0x6c, 0x38, 0x32, - 0xe1, 0x85, 0x1c, 0x30, 0x0c, 0xd5, 0x52, 0xc2, - 0xe7, 0x73, 0x35, 0x8c, 0xf0, 0xf6, 0x88, 0x58, - 0xf3, 0x4f, 0xca, 0x34, 0x45, 0xc6, 0x4d, 0xb7 }, - { 0x17, 0xd1, 0xf6, 0xe5, 0x1c, 0xb3, 0xaf, 0x91, - 0x23, 0xd4, 0xfc, 0xb3, 0x84, 0x18, 0x39, 0x4d, - 0xe3, 0xe6, 0xc3, 0x33, 0x3f, 0x80, 0x20, 0xd5, - 0x13, 0x48, 0xde, 0xba, 0xcc, 0x74, 0x70, 0x14 }, { 0x17, 0xf7, 0x25, 0xac, 0x12, 0xce, 0xa5, 0xe0, 0x86, 0x6f, 0xcc, 0x3e, 0x83, 0x4e, 0x9c, 0xb6, 0x34, 0x14, 0x5c, 0xed, 0xc5, 0x6b, 0x61, 0x3d, @@ -370,10 +298,6 @@ 0x0c, 0x95, 0x34, 0xe6, 0x84, 0xbb, 0x04, 0x9f, 0xf1, 0xe2, 0x3b, 0x66, 0xa1, 0x33, 0x01, 0x2f, 0xc3, 0x99, 0xeb, 0x4f, 0xb5, 0xd3, 0xaa, 0x35 }, - { 0x1a, 0xfa, 0xb3, 0x15, 0x5b, 0x57, 0x17, 0xc0, - 0x89, 0x82, 0xf9, 0x0c, 0x88, 0xa7, 0xaa, 0xc3, - 0x6b, 0xeb, 0x00, 0x03, 0xfa, 0xc4, 0x9b, 0xca, - 0x74, 0xa1, 0xcc, 0x52, 0x09, 0xb7, 0x04, 0x39 }, { 0x1b, 0x56, 0xba, 0x1e, 0xff, 0xac, 0x97, 0x36, 0x60, 0x74, 0xce, 0x07, 0x24, 0xe7, 0x04, 0x59, 0xdf, 0x99, 0x82, 0x1c, 0x3f, 0xaf, 0x20, 0xde, @@ -402,10 +326,6 @@ 0x38, 0x5d, 0xe1, 0xde, 0x16, 0xb2, 0x22, 0x6e, 0x88, 0x3d, 0x9c, 0x34, 0x66, 0x3e, 0x1b, 0x64, 0xe8, 0x5b, 0x98, 0x0e, 0xaf, 0xf0, 0xb9, 0xd3 }, - { 0x1c, 0x76, 0xbb, 0xca, 0x37, 0x71, 0x77, 0x5b, - 0xb9, 0xb0, 0xc3, 0x33, 0x71, 0x70, 0x32, 0x69, - 0x06, 0x16, 0x77, 0xca, 0x7b, 0x18, 0x99, 0xef, - 0x8c, 0x77, 0xe4, 0x15, 0x22, 0x2b, 0x56, 0xb6 }, { 0x1d, 0x9e, 0xc0, 0x06, 0xa5, 0x26, 0xfa, 0xb5, 0xce, 0x2e, 0x71, 0xfd, 0xfc, 0x07, 0xc0, 0x11, 0xf7, 0x65, 0x7b, 0xf8, 0x5f, 0x5d, 0x03, 0x52, @@ -414,10 +334,6 @@ 0xa5, 0xad, 0x1e, 0xe8, 0x35, 0x88, 0xac, 0xdb, 0x18, 0x4a, 0x4a, 0x6e, 0x87, 0x56, 0x5b, 0xf5, 0x03, 0xb5, 0x69, 0x7a, 0xbf, 0xae, 0x64, 0xa4 }, - { 0x1f, 0x00, 0x4b, 0x82, 0x0c, 0xf6, 0x8b, 0x00, - 0x7b, 0xb5, 0x72, 0xa0, 0xed, 0x42, 0x9c, 0x79, - 0x8f, 0x79, 0x44, 0x4f, 0x6f, 0x13, 0x29, 0x32, - 0xee, 0x5f, 0x8e, 0x28, 0xa4, 0x0a, 0xb9, 0x86 }, { 0x1f, 0x11, 0x85, 0xa5, 0x21, 0xe2, 0x8e, 0x95, 0x17, 0x1c, 0xf3, 0x86, 0x07, 0x8a, 0x76, 0x4a, 0x9a, 0x3e, 0x71, 0xc2, 0x59, 0xbc, 0xdc, 0x5f, @@ -426,10 +342,6 @@ 0x09, 0x99, 0x64, 0xe0, 0xfa, 0x01, 0x72, 0x1c, 0x06, 0xcc, 0xeb, 0x8e, 0xa2, 0x98, 0xbf, 0xd0, 0x04, 0x8e, 0x13, 0x8d, 0x98, 0xfc, 0x36, 0x24 }, - { 0x1f, 0x68, 0x40, 0x10, 0xc1, 0x92, 0xab, 0xfa, - 0x85, 0xa7, 0x9b, 0xba, 0x45, 0xce, 0x76, 0x4b, - 0x2d, 0xa8, 0x1f, 0x99, 0x1f, 0x5f, 0x01, 0xd9, - 0xeb, 0x7e, 0x3c, 0x99, 0x9b, 0x78, 0x75, 0x0e }, { 0x1f, 0xc7, 0xf8, 0x10, 0x4e, 0x27, 0xff, 0x2a, 0x45, 0x56, 0xf9, 0x1e, 0x05, 0x42, 0x17, 0xc5, 0x8f, 0x69, 0x3f, 0x70, 0x36, 0x25, 0x9e, 0x39, @@ -442,22 +354,10 @@ 0x6e, 0xa3, 0xa9, 0x98, 0x8f, 0xb1, 0x0b, 0x24, 0xc7, 0x01, 0xef, 0xdd, 0xab, 0xe4, 0x74, 0x05, 0x63, 0x43, 0xa1, 0x36, 0x11, 0xd5, 0x4d, 0x7d }, - { 0x21, 0x03, 0x9f, 0x99, 0x3d, 0xae, 0x79, 0x03, - 0xa0, 0xa7, 0xaa, 0x93, 0x5b, 0x96, 0x70, 0x1a, - 0xdd, 0x7e, 0xc5, 0xca, 0x99, 0xe1, 0x7e, 0x65, - 0x1c, 0x21, 0x29, 0x5b, 0x3b, 0x65, 0x70, 0x49 }, { 0x21, 0x09, 0xf3, 0x10, 0x7d, 0x97, 0xf8, 0x70, 0x48, 0x70, 0x8e, 0xc8, 0x7c, 0xa2, 0xdc, 0x31, 0x8b, 0x2f, 0x2b, 0x57, 0x47, 0xc3, 0x38, 0xbd, 0x9c, 0x6d, 0xbc, 0xd6, 0x0f, 0xd6, 0xbe, 0xa2 }, - { 0x21, 0x4a, 0xbc, 0x84, 0x5d, 0x66, 0x68, 0x76, - 0xc4, 0x78, 0x12, 0x84, 0x14, 0x16, 0xc6, 0xfb, - 0xff, 0x4a, 0x38, 0x32, 0x20, 0x61, 0xb6, 0x5d, - 0x9c, 0x5f, 0x6b, 0x74, 0x98, 0x2b, 0xc6, 0xea }, - { 0x21, 0x62, 0xab, 0xc2, 0x7d, 0x0c, 0x3d, 0xa0, - 0xf6, 0xaf, 0xf9, 0x76, 0x95, 0xfb, 0x3d, 0x47, - 0x7f, 0x4c, 0x63, 0x34, 0xff, 0xb3, 0xe5, 0xbc, - 0xd0, 0xe3, 0x05, 0x49, 0xd5, 0xfe, 0xeb, 0x47 }, { 0x21, 0x78, 0xe8, 0x28, 0x3a, 0x73, 0x39, 0x6e, 0x08, 0xc0, 0xa1, 0x1a, 0x88, 0x72, 0xfa, 0x4a, 0x9f, 0xcc, 0x05, 0x67, 0x0c, 0xee, 0xff, 0xb8, @@ -474,10 +374,6 @@ 0x62, 0x5d, 0xe5, 0xf4, 0x25, 0x2b, 0xf0, 0x29, 0xab, 0x83, 0x05, 0xeb, 0xf2, 0x2f, 0xa2, 0x3e, 0x99, 0x73, 0x04, 0x66, 0xde, 0x24, 0xd6, 0xc3 }, - { 0x23, 0x3f, 0xc6, 0xf9, 0x15, 0x1f, 0x05, 0x00, - 0xbb, 0x38, 0xad, 0x20, 0x7a, 0xf2, 0x42, 0x21, - 0x3a, 0x6a, 0x51, 0xce, 0xb3, 0x8c, 0x73, 0x0f, - 0xf1, 0xbf, 0xa1, 0x0a, 0x82, 0x4a, 0x71, 0xc7 }, { 0x23, 0x8a, 0x80, 0xcc, 0x9b, 0x58, 0x9a, 0xdc, 0x89, 0xb7, 0xa8, 0xf3, 0x4d, 0xdf, 0x12, 0x48, 0x73, 0x4b, 0x9f, 0x7f, 0x78, 0x20, 0xb6, 0x04, @@ -486,10 +382,6 @@ 0x16, 0x2a, 0x9c, 0xa0, 0x6e, 0x88, 0x01, 0xe1, 0x19, 0xbd, 0xff, 0x54, 0x35, 0x4a, 0x3f, 0x68, 0x43, 0xcf, 0x2a, 0x2f, 0xa6, 0x01, 0x75, 0x8e }, - { 0x23, 0xf7, 0xe4, 0xa3, 0x5b, 0xcc, 0xe7, 0x40, - 0x36, 0xd9, 0xc8, 0x6f, 0x7f, 0x61, 0x1d, 0x85, - 0xf3, 0x7c, 0xb6, 0x2c, 0x43, 0x24, 0x7d, 0x13, - 0x52, 0x22, 0x4e, 0xc3, 0xdc, 0x89, 0xed, 0x37 }, { 0x24, 0x62, 0x52, 0x48, 0x32, 0xc1, 0x54, 0xd8, 0x4d, 0xf5, 0x8e, 0xd7, 0x75, 0x22, 0x3b, 0xbe, 0x25, 0x7d, 0xea, 0xf7, 0x0e, 0xf9, 0xd2, 0x08, @@ -518,14 +410,6 @@ 0x3b, 0xd3, 0x7c, 0x2b, 0xc8, 0x23, 0xee, 0x27, 0x1a, 0x23, 0xf8, 0xf5, 0xc0, 0x9e, 0x1b, 0x71, 0x68, 0x7a, 0xec, 0x17, 0xe3, 0x8e, 0x46, 0x91 }, - { 0x26, 0xb2, 0x11, 0xcc, 0x34, 0x6d, 0x60, 0x37, - 0x1b, 0x24, 0xbd, 0x0d, 0xba, 0xb3, 0xf4, 0x3d, - 0x5d, 0xe3, 0xf2, 0x05, 0x47, 0xc1, 0x4c, 0x0b, - 0xa1, 0xe0, 0xb2, 0xed, 0xdd, 0x73, 0x02, 0x64 }, - { 0x26, 0xb9, 0x4c, 0xa0, 0x1e, 0x63, 0x4e, 0xd0, - 0xcb, 0x4f, 0xf3, 0xc9, 0xbc, 0xc2, 0x8a, 0x5e, - 0x8f, 0x49, 0xca, 0xcd, 0xe7, 0xeb, 0xa2, 0x63, - 0x2d, 0x3d, 0x30, 0x3f, 0xb2, 0xed, 0xe8, 0x63 }, { 0x27, 0x50, 0x11, 0x93, 0xe4, 0x61, 0xca, 0xce, 0x55, 0x32, 0xfa, 0xd5, 0xd5, 0xb2, 0x7e, 0x01, 0x16, 0x57, 0x92, 0xe0, 0x4f, 0x24, 0x21, 0x93, @@ -546,10 +430,6 @@ 0x36, 0x15, 0xdf, 0x12, 0x2e, 0x95, 0x21, 0x17, 0x42, 0x15, 0xee, 0x68, 0xf7, 0x44, 0xb2, 0xfa, 0x35, 0xd2, 0x9c, 0x5d, 0xf1, 0x08, 0xf5, 0x5b }, - { 0x29, 0x4a, 0x2b, 0xf8, 0x7b, 0x50, 0x1d, 0x28, - 0x4f, 0x37, 0x80, 0x96, 0x0e, 0x8e, 0x72, 0xa1, - 0x8a, 0xf1, 0xc6, 0x3b, 0xd7, 0xde, 0x4c, 0x4d, - 0xde, 0xa3, 0x7b, 0xf0, 0x27, 0xd4, 0x2c, 0xb8 }, { 0x29, 0x74, 0x8a, 0x69, 0xe9, 0x42, 0xa0, 0x67, 0xe6, 0xa6, 0xa3, 0x5a, 0x9d, 0x40, 0x00, 0x0a, 0x31, 0x8d, 0x7d, 0xdf, 0x5f, 0x5a, 0x2f, 0x4d, @@ -582,10 +462,6 @@ 0xe9, 0xaa, 0x52, 0x1e, 0xaa, 0x76, 0xac, 0x7e, 0x55, 0x73, 0x7b, 0xf4, 0x3e, 0x2b, 0x0c, 0x30, 0xdd, 0xcf, 0x59, 0x87, 0x2e, 0xab, 0xe7, 0x7b }, - { 0x2c, 0xf2, 0x6d, 0xa5, 0x76, 0x7e, 0xde, 0x07, - 0xc3, 0x73, 0x58, 0xcd, 0x5f, 0x71, 0xd1, 0x23, - 0xbb, 0x19, 0x77, 0x28, 0x85, 0x87, 0xc7, 0x3f, - 0x84, 0xb0, 0x8f, 0xf8, 0xaa, 0x01, 0x9a, 0x69 }, { 0x2d, 0xd5, 0xe6, 0xd3, 0x73, 0x36, 0x34, 0x2f, 0x01, 0x1e, 0xb9, 0x7a, 0x2b, 0x77, 0x38, 0x9d, 0xe6, 0xd2, 0x23, 0x8d, 0x87, 0x69, 0x65, 0x08, @@ -602,10 +478,6 @@ 0xb3, 0xd7, 0xdf, 0x24, 0xca, 0x74, 0xa7, 0x7d, 0xdc, 0x12, 0x06, 0x01, 0x52, 0x7b, 0x0f, 0x51, 0x06, 0x91, 0x05, 0xca, 0x88, 0x37, 0x6e, 0x20 }, - { 0x2f, 0x39, 0xbb, 0x30, 0xaa, 0x5c, 0xbb, 0x62, - 0x01, 0x7c, 0x6c, 0x79, 0x90, 0xe3, 0xf9, 0xa4, - 0x0d, 0x46, 0x9f, 0x76, 0x50, 0x59, 0x81, 0xc8, - 0x6f, 0x95, 0x55, 0x4f, 0x48, 0x7a, 0x52, 0x76 }, { 0x2f, 0xef, 0xa7, 0xcb, 0x12, 0x6b, 0x81, 0xc9, 0x47, 0x4d, 0x3e, 0x2c, 0x9b, 0x97, 0x3a, 0x83, 0x69, 0xbb, 0x08, 0x43, 0x41, 0xd3, 0x82, 0xd3, @@ -630,10 +502,6 @@ 0x74, 0x2d, 0x6b, 0xe8, 0x40, 0x0a, 0xde, 0x51, 0xb2, 0x09, 0x83, 0xf6, 0x83, 0xa2, 0xaa, 0xee, 0xb2, 0x5f, 0x58, 0xdf, 0x98, 0x1b, 0xde, 0x0d }, - { 0x32, 0x36, 0x98, 0x50, 0x9d, 0x8f, 0x8b, 0xfb, - 0xd4, 0xf9, 0x04, 0xbd, 0x1d, 0x84, 0x64, 0x12, - 0xc5, 0x27, 0xb7, 0x70, 0x06, 0x2a, 0xad, 0xdf, - 0x9e, 0x91, 0x9d, 0x84, 0x10, 0xea, 0xa4, 0x9f }, { 0x32, 0x8b, 0x9a, 0x45, 0xef, 0xef, 0x20, 0xb5, 0xd1, 0x57, 0x39, 0xdd, 0xfa, 0xc1, 0x0c, 0x7e, 0xfe, 0x5f, 0xa7, 0x96, 0xbf, 0xe0, 0x1e, 0xd1, @@ -670,10 +538,6 @@ 0xc8, 0x68, 0x5e, 0xea, 0xac, 0x57, 0x87, 0x2d, 0x3b, 0x47, 0xe6, 0x02, 0xf4, 0x97, 0xe9, 0xf0, 0x28, 0x54, 0x12, 0x32, 0x59, 0xfb, 0xe1, 0x69 }, - { 0x34, 0xe6, 0xf1, 0x7a, 0x14, 0xd3, 0xd2, 0x8a, - 0xfd, 0x51, 0xcf, 0x40, 0x49, 0x3a, 0xb2, 0xcf, - 0xe0, 0x18, 0xef, 0x98, 0x1e, 0x23, 0xf1, 0xfc, - 0x91, 0x60, 0xfb, 0x91, 0x2c, 0xdc, 0x5c, 0xb9 }, { 0x35, 0x49, 0xb6, 0xec, 0xbd, 0x8d, 0x25, 0x2b, 0xe7, 0x17, 0xb9, 0x22, 0x73, 0x27, 0x38, 0x08, 0x0b, 0xaf, 0xd5, 0x60, 0xb4, 0x5a, 0x05, 0x40, @@ -730,10 +594,6 @@ 0x43, 0x61, 0xa6, 0xc9, 0x72, 0xf0, 0xc5, 0x7c, 0xc0, 0x87, 0x74, 0x01, 0x06, 0x12, 0x78, 0x3f, 0xba, 0xbc, 0xb8, 0xd6, 0xf6, 0x03, 0x9e, 0x2c }, - { 0x39, 0xd7, 0x44, 0x77, 0x31, 0x72, 0x8b, 0xba, - 0x92, 0x36, 0x72, 0x7d, 0xbd, 0x7c, 0x7e, 0xe1, - 0x70, 0xe5, 0x9f, 0x3b, 0x53, 0x73, 0x79, 0x6d, - 0x7d, 0xe1, 0xc6, 0xa2, 0xbe, 0x31, 0x22, 0x18 }, { 0x39, 0xff, 0x6e, 0x31, 0x69, 0x9f, 0x5d, 0x68, 0x92, 0x97, 0x6d, 0x11, 0xdd, 0xbb, 0x14, 0x24, 0xed, 0x0c, 0xec, 0x48, 0x36, 0x3e, 0x94, 0xea, @@ -754,10 +614,6 @@ 0xc9, 0x69, 0xa7, 0xfb, 0xd5, 0x11, 0x33, 0xa2, 0xb3, 0xc4, 0xdf, 0xb6, 0xba, 0x38, 0x5d, 0xce, 0x3f, 0xb8, 0x4d, 0x73, 0x6b, 0xea, 0xb1, 0xd9 }, - { 0x3b, 0x93, 0xac, 0x19, 0x6e, 0xc6, 0x7b, 0xf2, - 0x78, 0x7f, 0x42, 0x40, 0xc0, 0xd1, 0x11, 0x37, - 0xef, 0x79, 0xa4, 0xed, 0x1f, 0x5d, 0x1f, 0x3d, - 0x04, 0x24, 0x1f, 0x03, 0xdc, 0x2d, 0xa3, 0x70 }, { 0x3b, 0xaa, 0x31, 0x31, 0x70, 0x68, 0xac, 0xe0, 0x89, 0xae, 0xb4, 0xa8, 0x8d, 0x7e, 0xde, 0xbe, 0x94, 0xab, 0x4a, 0xce, 0x46, 0xbb, 0xd2, 0x68, @@ -774,10 +630,6 @@ 0x27, 0x6c, 0x81, 0x47, 0x97, 0xc7, 0xbc, 0x7a, 0x6c, 0x14, 0xf7, 0x95, 0x3e, 0x7e, 0x9f, 0xea, 0x69, 0x51, 0x04, 0x0f, 0x2d, 0xaf, 0xbe, 0x9a }, - { 0x3d, 0x45, 0xbf, 0x0f, 0x64, 0x9b, 0xf5, 0xd1, - 0xf8, 0x91, 0x85, 0x31, 0xa7, 0x7c, 0xf9, 0xbf, - 0x5c, 0xa1, 0x85, 0x0c, 0x82, 0x02, 0x69, 0xd7, - 0xb2, 0xc8, 0xec, 0xd0, 0x54, 0x3a, 0x61, 0x65 }, { 0x3e, 0x8e, 0x9b, 0xad, 0x8e, 0xd9, 0xb5, 0x72, 0x38, 0x2e, 0x59, 0x8d, 0x2d, 0x73, 0x67, 0xe1, 0xfd, 0x6a, 0xf6, 0x95, 0x25, 0x00, 0x9d, 0x67, @@ -790,18 +642,10 @@ 0x0a, 0xf0, 0xad, 0x46, 0xa4, 0xa2, 0x57, 0x84, 0x19, 0xd8, 0x68, 0x6e, 0x38, 0x98, 0x8b, 0x91, 0x47, 0x01, 0x8c, 0x36, 0x29, 0x31, 0xe4, 0xf9 }, - { 0x3f, 0x3f, 0x08, 0x2f, 0xab, 0x0c, 0xbd, 0x83, - 0x16, 0xea, 0x9d, 0xc1, 0xc7, 0x7e, 0xc6, 0x4c, - 0x32, 0x4d, 0x9c, 0x3d, 0x86, 0x08, 0xc7, 0x79, - 0x56, 0xf1, 0x27, 0xa9, 0xb8, 0xf4, 0x9c, 0x46 }, { 0x3f, 0x4f, 0x28, 0x8b, 0xaf, 0x5b, 0xde, 0x86, 0x72, 0xd6, 0xad, 0xd1, 0x50, 0xe3, 0x23, 0x79, 0x49, 0x9a, 0x16, 0xc5, 0x81, 0xfb, 0x77, 0x37, 0xec, 0x49, 0x80, 0xe4, 0xf9, 0xc3, 0x3d, 0x4d }, - { 0x3f, 0x5c, 0xfc, 0xab, 0x44, 0x1a, 0x30, 0xd8, - 0xf0, 0x1a, 0xc1, 0xae, 0x9e, 0x08, 0xa2, 0xdb, - 0x70, 0xc4, 0xc1, 0x6d, 0xed, 0x03, 0xa4, 0x21, - 0xd4, 0x1b, 0x8f, 0x42, 0xd5, 0xc1, 0x89, 0x6e }, { 0x3f, 0x92, 0x54, 0x89, 0x64, 0xcc, 0xde, 0xfb, 0x29, 0x96, 0x5a, 0x27, 0xc1, 0x6c, 0x2f, 0xed, 0x28, 0xd9, 0xb9, 0x14, 0x0e, 0x4f, 0xb5, 0x5b, @@ -826,10 +670,6 @@ 0x09, 0x84, 0x85, 0xbf, 0x6f, 0x87, 0x24, 0x5f, 0x4e, 0xc0, 0x54, 0x71, 0xda, 0x59, 0xd0, 0x81, 0x06, 0x01, 0x53, 0xa2, 0x22, 0x25, 0x23, 0x7f }, - { 0x41, 0xab, 0x57, 0x74, 0x49, 0xa7, 0x50, 0xef, - 0x45, 0x0d, 0x86, 0x4d, 0xb0, 0x6b, 0x7c, 0xba, - 0x1f, 0x63, 0xe1, 0x1d, 0x1d, 0x86, 0xb7, 0x8c, - 0x70, 0x5b, 0xb4, 0x27, 0x34, 0xf5, 0x05, 0x2d }, { 0x42, 0x08, 0x71, 0xd8, 0xac, 0x49, 0x3c, 0xf9, 0x46, 0x8b, 0xb3, 0x76, 0x97, 0x6d, 0x65, 0x5e, 0xf0, 0xaf, 0xaa, 0xc2, 0x3d, 0x77, 0x00, 0x92, @@ -910,10 +750,6 @@ 0xd4, 0x53, 0xbc, 0x68, 0x9c, 0x2c, 0x63, 0x10, 0x6f, 0xff, 0xc2, 0xb1, 0x86, 0x23, 0xaa, 0x0b, 0xde, 0xaa, 0xb4, 0xf9, 0xeb, 0x7c, 0x0e, 0x42 }, - { 0x4a, 0xa7, 0xd5, 0xcd, 0xb1, 0x8e, 0x5e, 0xae, - 0x05, 0x9d, 0x54, 0x10, 0xfd, 0x5b, 0x44, 0xa5, - 0x9e, 0xba, 0x0d, 0xe9, 0x66, 0x3c, 0x42, 0x2f, - 0x42, 0x35, 0x87, 0x04, 0xc3, 0x2c, 0x90, 0x2d }, { 0x4a, 0xcf, 0x9d, 0xa9, 0x05, 0x2f, 0x0b, 0x8c, 0xff, 0xf7, 0x37, 0xcd, 0xa3, 0x39, 0x11, 0xc2, 0x9e, 0xfc, 0xbf, 0xfd, 0x4b, 0xf4, 0xb7, 0x24, @@ -922,10 +758,6 @@ 0xc5, 0xde, 0xb8, 0x6a, 0xff, 0x27, 0x63, 0x55, 0x23, 0x59, 0xda, 0x5b, 0x59, 0x82, 0xe5, 0x38, 0xba, 0xb7, 0xc9, 0x2a, 0x15, 0x9c, 0xb8, 0x3c }, - { 0x4a, 0xe5, 0xe5, 0x1e, 0x7f, 0xf1, 0x67, 0x47, - 0x77, 0x5e, 0x2b, 0x2c, 0x05, 0x72, 0x1d, 0x95, - 0xeb, 0xeb, 0x8c, 0x46, 0x01, 0xfd, 0xdc, 0xdc, - 0x90, 0xfb, 0xce, 0x69, 0x7e, 0x35, 0x01, 0x2c }, { 0x4b, 0x1f, 0xc8, 0x2d, 0x24, 0x72, 0x92, 0x7a, 0xc1, 0x7c, 0x58, 0x43, 0x07, 0xcb, 0x96, 0xd6, 0xfd, 0xdb, 0x8d, 0x50, 0xa5, 0x29, 0x53, 0x07, @@ -954,14 +786,6 @@ 0x1b, 0x02, 0x04, 0xba, 0x9f, 0x27, 0xc0, 0xda, 0xcb, 0x2e, 0x47, 0x37, 0x72, 0x64, 0xcd, 0x31, 0xc4, 0xfe, 0xa4, 0xa4, 0x58, 0x5a, 0x99, 0x60 }, - { 0x4c, 0x3c, 0x7c, 0xbc, 0x42, 0x1c, 0xe0, 0xd1, - 0x84, 0x4e, 0xa7, 0xb4, 0x6f, 0x61, 0xd7, 0x87, - 0xe0, 0x4f, 0x94, 0x01, 0x71, 0x49, 0xbe, 0xa3, - 0x28, 0xed, 0xc3, 0x6c, 0x20, 0xe3, 0x2f, 0xaa }, - { 0x4c, 0x4b, 0xb6, 0x05, 0x65, 0xb5, 0xca, 0x7f, - 0x02, 0xf8, 0xf5, 0x9b, 0xfa, 0x1d, 0x1d, 0x62, - 0x71, 0xb2, 0xf1, 0x4d, 0x5c, 0xd3, 0xa0, 0x43, - 0x51, 0xc3, 0xc4, 0x9d, 0x3f, 0xa0, 0x43, 0xb4 }, { 0x4c, 0x8a, 0x29, 0xb5, 0x81, 0x7d, 0x90, 0x99, 0xa4, 0xfe, 0xd1, 0xe7, 0x93, 0xb2, 0x8e, 0x2f, 0xaf, 0x6e, 0x87, 0x14, 0xee, 0x77, 0x60, 0xa7, @@ -970,14 +794,6 @@ 0xc2, 0x63, 0x4e, 0x7a, 0x73, 0x76, 0x12, 0xf6, 0x3a, 0x17, 0xff, 0x51, 0x0a, 0x77, 0xa8, 0x04, 0xbb, 0x33, 0x1b, 0x2b, 0xe5, 0x8d, 0xfe, 0x0c }, - { 0x4c, 0xd8, 0x6a, 0xa6, 0x0c, 0xb3, 0x69, 0x00, - 0xa9, 0xaa, 0x3b, 0x7b, 0x02, 0x7d, 0x71, 0x4c, - 0x0f, 0x76, 0x07, 0xc3, 0x56, 0x73, 0x3b, 0xa2, - 0x21, 0xaa, 0xe4, 0x09, 0x47, 0xf7, 0xfa, 0xcb }, - { 0x4d, 0x54, 0x4d, 0x4e, 0x41, 0xc0, 0xfb, 0x15, - 0x5f, 0x04, 0x7d, 0x7f, 0xb1, 0xef, 0x29, 0xd1, - 0x1b, 0xdf, 0xec, 0xa9, 0xd4, 0x11, 0xaf, 0x8b, - 0x12, 0x54, 0x1f, 0x11, 0x50, 0xc0, 0xb4, 0x44 }, { 0x4d, 0xcf, 0xeb, 0xdc, 0x15, 0x4b, 0x0c, 0x85, 0x46, 0x7f, 0x6f, 0x52, 0xad, 0x80, 0x4e, 0x19, 0x1d, 0x5b, 0xc8, 0x13, 0x51, 0x72, 0x0e, 0xc0, @@ -994,22 +810,6 @@ 0x4f, 0x82, 0xc0, 0x56, 0xc7, 0xd4, 0x2b, 0xac, 0x43, 0xd0, 0x13, 0x3a, 0xaf, 0x89, 0xc1, 0xef, 0xdc, 0xfa, 0x3c, 0x3e, 0x47, 0x09, 0x7d, 0x59 }, - { 0x4f, 0x23, 0xc6, 0x87, 0x0c, 0x7c, 0xfa, 0x6d, - 0x31, 0x92, 0x70, 0x3d, 0xca, 0xfd, 0x8f, 0x46, - 0xb7, 0xbc, 0xc3, 0x72, 0xdc, 0x6d, 0x1c, 0x61, - 0x00, 0x9a, 0x01, 0x75, 0x20, 0xe9, 0xf3, 0xdf }, - { 0x4f, 0x54, 0x31, 0xa9, 0xa1, 0x5e, 0x08, 0x9b, - 0x70, 0x53, 0xb6, 0x61, 0x47, 0xe2, 0xb6, 0x23, - 0xd5, 0x87, 0x6f, 0x9a, 0x04, 0x56, 0x44, 0x67, - 0xae, 0x16, 0x13, 0xf6, 0xa8, 0x15, 0x98, 0x38 }, - { 0x4f, 0x9a, 0xcc, 0x0b, 0x75, 0xce, 0xaa, 0x7c, - 0xb3, 0x88, 0x47, 0x09, 0x52, 0xc9, 0x98, 0x08, - 0xe4, 0xf3, 0xcb, 0x99, 0xa7, 0x73, 0xa6, 0x00, - 0xcd, 0xdf, 0x2c, 0xf3, 0x1a, 0xe7, 0xec, 0x72 }, - { 0x4f, 0xaf, 0xae, 0xbc, 0x7e, 0x20, 0x21, 0xc8, - 0x43, 0x86, 0xec, 0x9d, 0x82, 0xa4, 0x9c, 0x24, - 0xdb, 0xef, 0xeb, 0x71, 0x2e, 0xa7, 0x2c, 0x0d, - 0x64, 0x73, 0x51, 0x86, 0x13, 0x53, 0xcd, 0x69 }, { 0x4f, 0xe9, 0xf1, 0x68, 0x70, 0x6a, 0x07, 0x5d, 0xa9, 0x6c, 0x71, 0x3d, 0xa4, 0x32, 0x61, 0xe3, 0x39, 0xa9, 0x93, 0x6e, 0xdd, 0xd5, 0x88, 0x8b, @@ -1022,10 +822,6 @@ 0x4c, 0x99, 0x15, 0x38, 0xdd, 0xd5, 0x1d, 0x01, 0x49, 0xcd, 0x9f, 0xf3, 0x60, 0x49, 0xf3, 0xd8, 0xa0, 0xb2, 0xd2, 0x92, 0x23, 0xf7, 0x91, 0x38 }, - { 0x50, 0x81, 0x1d, 0x6e, 0x9d, 0xaf, 0x31, 0x2a, - 0x6a, 0xc2, 0xaf, 0x6b, 0x52, 0x13, 0xc9, 0x56, - 0x20, 0xe0, 0x24, 0xe0, 0x87, 0xae, 0x5e, 0xb0, - 0xcc, 0x8a, 0xa2, 0x6f, 0xbe, 0xd9, 0xd9, 0x85 }, { 0x50, 0xf4, 0x78, 0x1e, 0xb1, 0xc1, 0x46, 0x70, 0xd9, 0xa5, 0x52, 0xc3, 0x49, 0x5f, 0xb9, 0xf6, 0xae, 0x86, 0x8a, 0xb1, 0xc9, 0xd9, 0x83, 0xe0, @@ -1074,18 +870,10 @@ 0xe0, 0x3b, 0x48, 0x2f, 0x51, 0x95, 0x1c, 0x7e, 0xf0, 0x73, 0x45, 0x53, 0xce, 0xc7, 0x80, 0xfb, 0xdc, 0xfa, 0x30, 0x0c, 0xc1, 0x79, 0x0d, 0x66 }, - { 0x54, 0xa5, 0x1f, 0x64, 0xd6, 0x28, 0x61, 0x49, - 0xf2, 0x3a, 0x43, 0xcc, 0x73, 0x67, 0x00, 0x0e, - 0xf0, 0x16, 0x03, 0x89, 0x9c, 0xbc, 0x94, 0xa1, - 0xa4, 0xe3, 0xbe, 0xec, 0xfe, 0xe8, 0x40, 0x66 }, { 0x55, 0x21, 0xf9, 0x63, 0x57, 0x81, 0x58, 0xb8, 0xd0, 0xe7, 0xc4, 0x91, 0xcd, 0xb8, 0x5c, 0x3d, 0xe9, 0xd5, 0x2e, 0xa5, 0x1f, 0xfc, 0xb0, 0x93, 0xd3, 0x12, 0x28, 0x11, 0x13, 0x14, 0x97, 0xeb }, - { 0x55, 0x54, 0xec, 0x61, 0xf2, 0x57, 0x6e, 0x34, - 0xe7, 0x21, 0x56, 0xa6, 0xf6, 0xfd, 0x5e, 0xe8, - 0xf4, 0x26, 0x2a, 0xb5, 0x3f, 0x7b, 0xc9, 0xf1, - 0x8b, 0xb6, 0xd7, 0xeb, 0x3e, 0x16, 0x28, 0xde }, { 0x55, 0xb2, 0x84, 0x5f, 0x48, 0x44, 0xa7, 0x72, 0x46, 0x36, 0x41, 0x78, 0xa1, 0x71, 0xc2, 0x26, 0xfc, 0xfd, 0x75, 0xc7, 0x63, 0xba, 0xd0, 0x87, @@ -1094,14 +882,6 @@ 0x58, 0x4d, 0x9e, 0x7b, 0x57, 0x92, 0xa4, 0x03, 0xc2, 0x1d, 0x39, 0xd6, 0xe1, 0xf5, 0xe8, 0xed, 0x37, 0xb9, 0x3f, 0xa6, 0x1d, 0x88, 0x35, 0x16 }, - { 0x56, 0x96, 0x18, 0xd5, 0x4e, 0x3c, 0x61, 0x1b, - 0x79, 0x7e, 0xeb, 0x01, 0xdf, 0x9c, 0x1c, 0x5c, - 0x14, 0x6d, 0x87, 0xb3, 0xb1, 0x29, 0xba, 0x42, - 0x29, 0x88, 0x88, 0x82, 0x10, 0x04, 0xfd, 0xcb }, - { 0x57, 0xc1, 0x4c, 0x78, 0x2c, 0xf5, 0x8c, 0x3b, - 0x72, 0x28, 0x0f, 0xef, 0x7d, 0xa9, 0xe2, 0xd9, - 0x71, 0xe5, 0x25, 0x03, 0xc4, 0x15, 0x99, 0x59, - 0x68, 0xb6, 0x04, 0x37, 0x2a, 0x18, 0x96, 0xbf }, { 0x58, 0x0c, 0x45, 0xd6, 0xe2, 0x55, 0x8e, 0x7c, 0x7d, 0xa8, 0x19, 0xa5, 0x99, 0xd5, 0xb1, 0x6f, 0x0e, 0x18, 0x79, 0xf0, 0xcb, 0x58, 0x31, 0xdf, @@ -1110,10 +890,6 @@ 0x62, 0x9c, 0x3c, 0x7c, 0x78, 0xef, 0xbe, 0xf2, 0x75, 0x06, 0x56, 0x65, 0xb2, 0x41, 0x1c, 0x0e, 0x5f, 0xcf, 0xbc, 0x7e, 0xb4, 0xbe, 0x34, 0x0b }, - { 0x59, 0x43, 0x09, 0x51, 0x02, 0x8b, 0x87, 0x78, - 0x01, 0x67, 0xc9, 0x56, 0x47, 0x9a, 0x81, 0x5f, - 0x91, 0xbc, 0x6c, 0x00, 0xc2, 0xe5, 0x0c, 0x35, - 0xf0, 0x5f, 0xcf, 0xf5, 0x27, 0x68, 0xc7, 0x37 }, { 0x59, 0xc9, 0xe8, 0xdf, 0x03, 0x0b, 0x1c, 0xd5, 0x89, 0xa8, 0xb3, 0x4f, 0xe7, 0x42, 0x51, 0xea, 0xd5, 0xa5, 0xfb, 0xe9, 0xe6, 0x13, 0x67, 0xca, @@ -1126,10 +902,6 @@ 0x28, 0x33, 0xc6, 0x40, 0xf5, 0x05, 0xfa, 0x24, 0x09, 0xeb, 0x88, 0x93, 0x32, 0x57, 0xc1, 0x93, 0xb0, 0x07, 0xd3, 0xa2, 0x89, 0x6a, 0x98, 0x50 }, - { 0x59, 0xee, 0x2c, 0xb6, 0x0c, 0x80, 0xe7, 0x37, - 0x33, 0x72, 0x1c, 0xa6, 0xcd, 0x0c, 0x88, 0x63, - 0xdd, 0x9a, 0xf6, 0xb8, 0x2f, 0x35, 0x0c, 0xe9, - 0x88, 0x72, 0xf2, 0x2e, 0x23, 0x89, 0x5a, 0x55 }, { 0x59, 0xee, 0x9b, 0x36, 0x80, 0xae, 0x20, 0x56, 0x83, 0x9c, 0x0b, 0xf6, 0x9e, 0xe6, 0x63, 0x26, 0x57, 0x16, 0xa8, 0xe2, 0x4c, 0xc6, 0x49, 0x95, @@ -1138,10 +910,6 @@ 0x13, 0xb1, 0xb6, 0xae, 0xdf, 0xd3, 0xae, 0x8f, 0xe5, 0xfc, 0x42, 0x2f, 0xdb, 0x3b, 0xa7, 0x9e, 0xf7, 0x17, 0xa9, 0xbe, 0x19, 0xfa, 0x89, 0xdc }, - { 0x5a, 0x6b, 0xb1, 0x1f, 0x2e, 0xfd, 0x5e, 0x60, - 0x25, 0xc6, 0x06, 0xf5, 0x58, 0x81, 0x30, 0xe1, - 0x7c, 0x88, 0xed, 0xae, 0xdc, 0x2a, 0xa9, 0x41, - 0xe2, 0x54, 0x3a, 0xdd, 0x77, 0x25, 0x31, 0xbe }, { 0x5a, 0x84, 0xaf, 0xe6, 0x74, 0x05, 0xab, 0xe8, 0x4a, 0x0c, 0xd4, 0x2c, 0x2b, 0xa2, 0xe4, 0xc8, 0x8f, 0x35, 0xe0, 0xa5, 0x95, 0xe5, 0x69, 0xa3, @@ -1154,18 +922,10 @@ 0xa9, 0x38, 0x1a, 0x5c, 0xd8, 0x7b, 0x80, 0xd1, 0x10, 0xf2, 0x6e, 0xe8, 0x39, 0x27, 0x1b, 0xc2, 0x70, 0x60, 0x8f, 0xd1, 0x43, 0x7f, 0x55, 0xb0 }, - { 0x5b, 0x1f, 0x32, 0x78, 0x8d, 0xd9, 0xd7, 0xe9, - 0x06, 0x80, 0x7d, 0x03, 0x01, 0x45, 0xc8, 0xad, - 0x20, 0x11, 0x03, 0x0c, 0xdb, 0xf0, 0xa6, 0x03, - 0x08, 0x14, 0x93, 0x7e, 0x54, 0xd1, 0x54, 0x68 }, { 0x5b, 0x29, 0x3d, 0x30, 0x9f, 0x64, 0x24, 0xbc, 0x26, 0x4f, 0x4b, 0xb0, 0x18, 0xae, 0xf5, 0x0e, 0x63, 0xe3, 0x37, 0xd1, 0x4d, 0xf0, 0x64, 0xc5, 0x7a, 0x23, 0x52, 0x83, 0x42, 0x16, 0x1c, 0x68 }, - { 0x5c, 0x06, 0x2f, 0x0d, 0x7e, 0x21, 0x91, 0xdf, - 0xc1, 0x60, 0xe4, 0xc0, 0x59, 0xae, 0xd4, 0xd1, - 0x83, 0xbd, 0x2d, 0x0f, 0x40, 0x98, 0x3d, 0x03, - 0xb4, 0xe8, 0xda, 0xa1, 0x1f, 0xf5, 0xe8, 0x95 }, { 0x5c, 0x7f, 0xf0, 0x55, 0xc2, 0xfd, 0x03, 0x3f, 0x34, 0xc4, 0xc4, 0xf7, 0xc4, 0xfb, 0x7d, 0xda, 0xaa, 0xfb, 0x43, 0x56, 0xc5, 0x60, 0xc9, 0x9e, @@ -1182,10 +942,6 @@ 0x5f, 0x61, 0x6a, 0x95, 0x17, 0xa1, 0x30, 0xd8, 0x66, 0xa8, 0xcb, 0x0b, 0x18, 0x96, 0x3d, 0x54, 0xe7, 0xed, 0xae, 0xe2, 0x61, 0xcb, 0x1c, 0x19 }, - { 0x5e, 0xae, 0xd7, 0x13, 0x5c, 0x21, 0x69, 0x76, - 0xad, 0x4e, 0xdc, 0x4d, 0xbb, 0x3f, 0x1f, 0xa1, - 0xf7, 0xc2, 0x85, 0x54, 0xf1, 0x4f, 0x1a, 0xd1, - 0xc6, 0x2a, 0xba, 0xbb, 0x00, 0xcf, 0x7b, 0x66 }, { 0x5f, 0x5c, 0xca, 0x19, 0x1e, 0xc9, 0x2f, 0x4d, 0xad, 0x96, 0x6d, 0xaa, 0xfd, 0x6d, 0xe7, 0x56, 0x34, 0x44, 0x18, 0x60, 0x4d, 0x8a, 0xd5, 0x0a, @@ -1198,10 +954,6 @@ 0x5a, 0x91, 0x72, 0x90, 0xac, 0xa6, 0x5a, 0xfd, 0x6e, 0xbd, 0xae, 0x05, 0xa0, 0x2a, 0xaf, 0x04, 0x29, 0xe9, 0x72, 0xec, 0x01, 0x90, 0xec, 0xfc }, - { 0x60, 0x1a, 0xf7, 0x2f, 0xb0, 0x6f, 0xe6, 0x68, - 0x79, 0x92, 0xc5, 0x8f, 0xac, 0x32, 0xe3, 0x0c, - 0x01, 0x9e, 0xaf, 0x41, 0xe0, 0xb3, 0x85, 0x7e, - 0xa9, 0x00, 0xa1, 0x61, 0x08, 0xeb, 0x34, 0xde }, { 0x60, 0xca, 0x81, 0xe3, 0x5b, 0x9a, 0x6f, 0x07, 0xe1, 0x3c, 0x02, 0xae, 0x41, 0x15, 0xb0, 0x00, 0x54, 0x30, 0xcf, 0x46, 0x0e, 0xfc, 0x7d, 0xba, @@ -1218,18 +970,10 @@ 0xaa, 0x0c, 0x8e, 0xc9, 0x65, 0x54, 0x64, 0xe6, 0x5e, 0x7f, 0x96, 0xcf, 0xa3, 0x82, 0x73, 0x97, 0x41, 0x35, 0x66, 0xaa, 0x2c, 0xc1, 0xe5, 0x72 }, - { 0x63, 0x35, 0x8c, 0x6d, 0xeb, 0xdf, 0x48, 0x2b, - 0xb2, 0xd3, 0x21, 0x13, 0xd3, 0xf0, 0xb1, 0x73, - 0x77, 0xe2, 0xf7, 0xc9, 0x25, 0xb9, 0xfe, 0xb3, - 0x47, 0x8b, 0xd9, 0x94, 0x56, 0x31, 0x3e, 0x78 }, { 0x63, 0x64, 0x15, 0x61, 0x77, 0xdc, 0xdf, 0x60, 0x4d, 0xf9, 0x1e, 0x31, 0x32, 0x2e, 0x57, 0x74, 0x69, 0x1e, 0x0c, 0x41, 0xfa, 0x0d, 0x2f, 0x25, 0x7a, 0xd7, 0xf9, 0xf0, 0x25, 0x98, 0x14, 0x45 }, - { 0x63, 0x6a, 0x25, 0xbd, 0xdb, 0xb6, 0x5e, 0x7c, - 0xc0, 0xe6, 0x1f, 0x91, 0xca, 0xfe, 0xb1, 0xfe, - 0x5d, 0xd2, 0x67, 0xac, 0x67, 0x32, 0x25, 0xcc, - 0x81, 0x8e, 0xa0, 0x2b, 0x9c, 0xc9, 0x4b, 0xe2 }, { 0x64, 0xd4, 0x92, 0x41, 0x6e, 0xe0, 0x55, 0x57, 0x9c, 0x46, 0x3b, 0x21, 0x1a, 0xfe, 0xf7, 0x46, 0xc3, 0x30, 0xca, 0x05, 0xf4, 0x4d, 0x85, 0x90, @@ -1290,18 +1034,10 @@ 0xe6, 0xfa, 0x4a, 0x4e, 0x46, 0xfa, 0x51, 0x74, 0x05, 0xf3, 0x77, 0xc0, 0xde, 0xe3, 0xd4, 0x29, 0x91, 0x4e, 0x6b, 0x7e, 0xa0, 0x8c, 0xb1, 0xa6 }, - { 0x69, 0xd3, 0x38, 0xe5, 0xd8, 0xc0, 0x69, 0xe7, - 0xdc, 0x10, 0xd3, 0x82, 0x1f, 0x7a, 0x83, 0x0d, - 0xeb, 0x5d, 0x95, 0x7c, 0x8e, 0xc6, 0xec, 0xd2, - 0x5a, 0xf7, 0x24, 0x3e, 0xd0, 0xe4, 0xdc, 0x26 }, { 0x6a, 0xac, 0xc5, 0x09, 0x2f, 0x12, 0xbc, 0x94, 0xa0, 0xad, 0x0e, 0x9e, 0xf6, 0x36, 0x43, 0x7d, 0x36, 0x0d, 0xc7, 0xc9, 0xf1, 0x40, 0x44, 0x17, 0xa3, 0x36, 0x91, 0x94, 0x4e, 0x76, 0x31, 0x36 }, - { 0x6a, 0xc3, 0x2d, 0xa9, 0x16, 0x8f, 0x70, 0xd0, - 0x9f, 0xe9, 0xf7, 0x55, 0x3e, 0x67, 0x0f, 0xa4, - 0xaa, 0xac, 0xe8, 0x7b, 0x5a, 0x0b, 0x9a, 0x3f, - 0x22, 0x2d, 0x7a, 0x8b, 0xba, 0x76, 0xd2, 0xf2 }, { 0x6a, 0xe7, 0x98, 0xd7, 0xde, 0x07, 0x84, 0x90, 0xa5, 0x0f, 0x73, 0x89, 0x86, 0xd4, 0x03, 0x39, 0x42, 0x97, 0x9d, 0xe2, 0x42, 0x6a, 0xfa, 0x95, @@ -1330,10 +1066,6 @@ 0x86, 0x70, 0xd1, 0xc2, 0x01, 0x76, 0x57, 0xb0, 0xc5, 0xd6, 0x1a, 0x26, 0xc9, 0xcb, 0xd1, 0xea, 0x75, 0x5c, 0x68, 0x20, 0xb5, 0xf6, 0xd6, 0x7d }, - { 0x6c, 0xc8, 0x0f, 0x47, 0x96, 0x4e, 0x0d, 0xcb, - 0x39, 0xe4, 0xd0, 0x1b, 0x3b, 0x3e, 0xbc, 0x8b, - 0x9c, 0x77, 0xb4, 0x08, 0x59, 0xbb, 0x5d, 0x5c, - 0x31, 0x27, 0x4d, 0xa5, 0x39, 0xfa, 0xca, 0x8d }, { 0x6d, 0x32, 0xf4, 0x93, 0x40, 0x56, 0xee, 0x17, 0x14, 0xca, 0x72, 0x70, 0x3f, 0x64, 0x46, 0x9b, 0x98, 0x58, 0xfc, 0x39, 0x96, 0x4b, 0x4c, 0x03, @@ -1342,10 +1074,6 @@ 0x3c, 0x6b, 0x7c, 0xb7, 0xe4, 0xe4, 0x25, 0xc8, 0xe2, 0x1f, 0x79, 0xff, 0x4d, 0x40, 0x00, 0xb9, 0x65, 0x3f, 0xa1, 0x27, 0xe1, 0x41, 0xd3, 0x50 }, - { 0x6d, 0x4e, 0xe5, 0x3b, 0xf9, 0x9f, 0xfa, 0xbb, - 0x1c, 0x9b, 0x77, 0x96, 0x66, 0xef, 0xc4, 0x5e, - 0x6a, 0xb3, 0xfa, 0x74, 0xab, 0x37, 0x30, 0x9f, - 0x8c, 0xde, 0xf7, 0x2c, 0x94, 0x39, 0x23, 0xee }, { 0x6d, 0xc9, 0x87, 0x5c, 0xd3, 0x46, 0xa2, 0x2b, 0x47, 0xb2, 0x80, 0xb1, 0xb1, 0x45, 0x0d, 0x87, 0x8e, 0x09, 0x8b, 0xb2, 0xe2, 0xa9, 0xe3, 0xc2, @@ -1366,10 +1094,6 @@ 0xfb, 0x06, 0x04, 0x56, 0xee, 0xe8, 0x74, 0xed, 0xd9, 0xfa, 0x71, 0x3f, 0x26, 0x95, 0xee, 0x5e, 0xe8, 0x59, 0x84, 0x83, 0xe3, 0x02, 0x8f, 0x0b }, - { 0x6e, 0x8d, 0x55, 0xee, 0x2f, 0x72, 0x5a, 0x0b, - 0xa5, 0xdf, 0x43, 0x43, 0xa0, 0x6f, 0xd3, 0x71, - 0x54, 0x25, 0x6b, 0xcf, 0xf7, 0xce, 0xe0, 0xb7, - 0x00, 0xac, 0xdd, 0x91, 0x56, 0x49, 0x79, 0x99 }, { 0x6e, 0x99, 0x8d, 0xdd, 0xf2, 0x93, 0x9b, 0xfe, 0x8c, 0xc5, 0x2a, 0x48, 0x0a, 0xc0, 0x6d, 0x69, 0x71, 0xc5, 0xa3, 0xda, 0x97, 0xcf, 0x3e, 0xf0, @@ -1414,18 +1138,10 @@ 0x67, 0x46, 0xe4, 0x9a, 0x96, 0xdf, 0x55, 0xcc, 0x6f, 0xad, 0xf7, 0xa6, 0x31, 0xc7, 0xae, 0x3f, 0x3e, 0x9e, 0x18, 0x72, 0x3d, 0xe5, 0x2a, 0x6e }, - { 0x73, 0x29, 0x62, 0x43, 0xc0, 0xdd, 0x61, 0xb1, - 0x7f, 0x5c, 0x58, 0x89, 0x4c, 0x31, 0x3e, 0xf7, - 0xa8, 0x48, 0xae, 0xe3, 0x1b, 0x08, 0x96, 0xe0, - 0xb3, 0xe1, 0x51, 0x7f, 0x6e, 0x6d, 0x9f, 0x2f }, { 0x73, 0x3b, 0x42, 0x24, 0x25, 0x8d, 0xee, 0x07, 0x0e, 0xdf, 0xa3, 0x41, 0x1f, 0xbc, 0x9b, 0xad, 0x31, 0x65, 0xbe, 0x66, 0x0f, 0x34, 0x0a, 0xa2, 0x30, 0x8a, 0x5a, 0x33, 0x23, 0xfa, 0xbf, 0xa7 }, - { 0x73, 0x9d, 0x17, 0x23, 0x23, 0xf2, 0xb2, 0x84, - 0x07, 0x0a, 0xce, 0x43, 0x09, 0x8c, 0x8b, 0x21, - 0xc4, 0x7a, 0x53, 0xf9, 0x98, 0x5f, 0x2f, 0xad, - 0x5f, 0x8b, 0x2e, 0xb7, 0x03, 0x4f, 0xdb, 0x21 }, { 0x74, 0x54, 0x0f, 0xa5, 0x0a, 0x36, 0x2e, 0x68, 0x6d, 0x99, 0x17, 0x98, 0x18, 0x35, 0x09, 0x83, 0x6c, 0x95, 0xa3, 0xfb, 0x04, 0x58, 0x00, 0x22, @@ -1434,18 +1150,10 @@ 0x04, 0x10, 0xbe, 0x70, 0x80, 0xbf, 0xe7, 0xee, 0x63, 0x1f, 0xc0, 0x4d, 0x1f, 0xdb, 0x50, 0x72, 0x04, 0x4b, 0xfa, 0x55, 0x7a, 0xdf, 0x6e, 0x5a }, - { 0x74, 0xa9, 0x27, 0xe7, 0xb2, 0xf1, 0xf6, 0x48, - 0x3d, 0xc2, 0x59, 0x21, 0xab, 0xbe, 0x2f, 0x97, - 0x74, 0xa2, 0x0c, 0xb8, 0x96, 0xba, 0xb5, 0x64, - 0x8c, 0x2a, 0xb0, 0xf9, 0xdb, 0xda, 0x3d, 0xa6 }, { 0x74, 0xe2, 0xcc, 0xcf, 0x62, 0xd5, 0xb9, 0xf9, 0x00, 0xb4, 0x14, 0x73, 0xca, 0x44, 0xe6, 0x87, 0x96, 0x38, 0x74, 0x3d, 0x8f, 0xee, 0x66, 0xee, 0x71, 0x8c, 0x18, 0xd8, 0xf1, 0x12, 0x15, 0xd1 }, - { 0x75, 0xe9, 0xa1, 0x5d, 0x94, 0x88, 0x0c, 0x66, - 0x14, 0x82, 0xcf, 0xc1, 0x96, 0x4c, 0xbc, 0xe2, - 0xb1, 0xca, 0x7a, 0x9f, 0x81, 0xd4, 0x07, 0x30, - 0x12, 0x47, 0x1f, 0x27, 0x23, 0xcb, 0x72, 0x8a }, { 0x76, 0x73, 0x18, 0x0f, 0x9d, 0x9a, 0x85, 0x48, 0x4b, 0x5c, 0x16, 0x99, 0xa2, 0xdc, 0x17, 0xfc, 0x61, 0x13, 0xa3, 0xed, 0x5b, 0xc9, 0xc0, 0x55, @@ -1458,10 +1166,6 @@ 0x83, 0x98, 0x71, 0x0f, 0x02, 0x20, 0xfa, 0xf3, 0x30, 0x1d, 0x54, 0x49, 0x38, 0xfb, 0x24, 0x19, 0x2d, 0xec, 0x32, 0xf7, 0x44, 0xe4, 0x22, 0x10 }, - { 0x77, 0x95, 0x6b, 0x48, 0xcd, 0xd9, 0x15, 0x0b, - 0xd8, 0x7d, 0x8d, 0x81, 0x50, 0x60, 0xac, 0x8c, - 0x84, 0x81, 0x3a, 0x53, 0x87, 0x1a, 0x58, 0x6a, - 0x69, 0x8b, 0x18, 0x79, 0x89, 0x13, 0xd3, 0xb8 }, { 0x77, 0xac, 0x72, 0x54, 0x6a, 0x39, 0xca, 0x2f, 0x24, 0xe2, 0xd1, 0x3c, 0x0d, 0x74, 0x91, 0x5f, 0x67, 0xbc, 0xd4, 0x37, 0x09, 0xa9, 0xe5, 0xdb, @@ -1478,10 +1182,6 @@ 0x39, 0x04, 0xd7, 0x6a, 0x68, 0x58, 0xbc, 0xd1, 0x01, 0x7f, 0x52, 0xda, 0x59, 0x9d, 0x36, 0xda, 0xe6, 0x66, 0xc0, 0x4e, 0x41, 0xaf, 0x8d, 0xcd }, - { 0x78, 0x41, 0x36, 0x37, 0x9b, 0xa0, 0xdb, 0xd7, - 0xb3, 0xba, 0xdc, 0x52, 0xdc, 0xe6, 0xbb, 0x81, - 0x07, 0xa3, 0x56, 0xc8, 0x48, 0x3f, 0x13, 0xe1, - 0x69, 0x75, 0x0b, 0xc2, 0x07, 0x0a, 0x67, 0xd9 }, { 0x78, 0xc9, 0x30, 0x40, 0x5a, 0x72, 0x0d, 0x9f, 0x00, 0x66, 0xdd, 0x88, 0xa2, 0xa8, 0xda, 0xfb, 0xbe, 0x6c, 0xd6, 0x5d, 0x54, 0xb7, 0x76, 0x06, @@ -1502,18 +1202,10 @@ 0x8a, 0xda, 0x2d, 0xdf, 0xbd, 0x06, 0x8a, 0xc3, 0x5d, 0x0f, 0x9d, 0xfa, 0xe6, 0x70, 0xf3, 0xe3, 0x95, 0xd4, 0x03, 0x7c, 0x3f, 0x8c, 0x4d, 0xd0 }, - { 0x7a, 0x31, 0xb7, 0x14, 0x7a, 0x27, 0x75, 0x33, - 0x8b, 0xfa, 0x3d, 0x0b, 0xbb, 0x68, 0x56, 0x33, - 0xfe, 0xb8, 0x5e, 0x2a, 0xf9, 0x4d, 0x71, 0xbf, - 0x2b, 0x64, 0x0b, 0xe1, 0xe7, 0x1c, 0xe8, 0x34 }, { 0x7a, 0x42, 0xd5, 0x7b, 0x05, 0x32, 0x4e, 0x85, 0x83, 0x55, 0x05, 0x58, 0x26, 0xb1, 0x55, 0x17, 0x42, 0x5b, 0x5a, 0x18, 0x9c, 0x17, 0xb4, 0x7c, 0x18, 0x4c, 0xac, 0xe7, 0xac, 0x63, 0x18, 0xd0 }, - { 0x7a, 0x5b, 0x68, 0x1e, 0x54, 0x45, 0x1d, 0xcb, - 0x0a, 0xa6, 0x0d, 0x9f, 0x02, 0xfd, 0x13, 0x7f, - 0xa5, 0xc1, 0x9e, 0x2b, 0xf7, 0x30, 0xc8, 0x9f, - 0x36, 0xc9, 0x1c, 0xc6, 0xe7, 0x8c, 0xc6, 0xfb }, { 0x7b, 0x2c, 0x84, 0x1f, 0x5a, 0x96, 0x35, 0x28, 0xc8, 0x79, 0x9f, 0x4b, 0x71, 0x48, 0xf9, 0xf2, 0xa5, 0x05, 0x15, 0x76, 0x06, 0x9d, 0xef, 0xd9, @@ -1526,14 +1218,6 @@ 0x94, 0x5a, 0x88, 0xd8, 0xef, 0x18, 0x91, 0xc9, 0x89, 0x97, 0x8a, 0xbf, 0x12, 0x2e, 0xc5, 0xe0, 0x51, 0x4b, 0xe3, 0x6c, 0x3a, 0x7f, 0x22, 0x9b }, - { 0x7c, 0x30, 0xff, 0x35, 0xe7, 0x8a, 0xba, 0x08, - 0xf8, 0xa9, 0xb4, 0xd9, 0x8e, 0xa2, 0x9a, 0xe4, - 0xa5, 0xa4, 0x24, 0x72, 0xf5, 0x91, 0xca, 0x11, - 0xfb, 0x5e, 0x11, 0x21, 0x06, 0x28, 0x63, 0x96 }, - { 0x7c, 0xf9, 0x2f, 0x75, 0xbb, 0xe7, 0xa1, 0x4d, - 0x86, 0x93, 0xf9, 0x93, 0xc3, 0xd1, 0xa6, 0x08, - 0xdb, 0xe0, 0xd1, 0x8f, 0x80, 0x8e, 0x21, 0x2d, - 0xc8, 0xe1, 0xf5, 0xda, 0x58, 0x04, 0xb3, 0x07 }, { 0x7d, 0x20, 0xc7, 0xa9, 0x27, 0x26, 0x2b, 0xe7, 0x38, 0xd2, 0x58, 0xd0, 0xfd, 0x97, 0x6e, 0x9a, 0xf3, 0x6e, 0xf7, 0x99, 0x5f, 0x05, 0xe2, 0x87, @@ -1586,10 +1270,6 @@ 0x66, 0x36, 0x4a, 0x19, 0x8a, 0x26, 0x08, 0x58, 0x30, 0xc2, 0xa4, 0x16, 0xe4, 0x9e, 0x22, 0x4c, 0xe8, 0x09, 0x66, 0xfc, 0xc4, 0x99, 0xd6, 0x36 }, - { 0x82, 0x2e, 0xbe, 0x7b, 0x2e, 0x8a, 0xf1, 0x78, - 0x8a, 0x36, 0x08, 0x83, 0x84, 0xf4, 0xc0, 0x6a, - 0x6d, 0x65, 0x9d, 0x95, 0x56, 0x83, 0xf0, 0x99, - 0xe2, 0x54, 0x2d, 0x97, 0x58, 0xe1, 0xa6, 0x21 }, { 0x82, 0x56, 0x8b, 0x3b, 0xb3, 0xc6, 0x55, 0xd7, 0xf2, 0x2d, 0x8c, 0x97, 0xa5, 0x66, 0x9c, 0xc8, 0x34, 0xa2, 0xdd, 0x7c, 0xda, 0xe7, 0x5a, 0x26, @@ -1602,14 +1282,6 @@ 0x18, 0x02, 0x3a, 0xb7, 0x85, 0xfa, 0x3c, 0xde, 0xd6, 0x6f, 0x42, 0x5d, 0xe1, 0xf3, 0x2f, 0xcd, 0x72, 0x1b, 0x49, 0x46, 0x3a, 0x5a, 0x5f, 0x5b }, - { 0x82, 0xc0, 0x7b, 0x94, 0x4b, 0xba, 0xc1, 0xb2, - 0x95, 0xe2, 0x5f, 0x91, 0xa5, 0xfb, 0x0f, 0x2a, - 0xfc, 0xba, 0x7e, 0x09, 0xb2, 0x17, 0x27, 0xee, - 0xd8, 0x13, 0x0c, 0xde, 0x8f, 0x08, 0x0f, 0xca }, - { 0x82, 0xe1, 0xbd, 0xb3, 0xdc, 0x4f, 0x02, 0x36, - 0x3a, 0x79, 0x6b, 0x60, 0xa8, 0x8e, 0x4e, 0x71, - 0xbd, 0x33, 0xb0, 0xbe, 0x4c, 0xc5, 0xb8, 0x33, - 0x25, 0x2b, 0x83, 0x27, 0xb8, 0x0b, 0xd7, 0xe2 }, { 0x83, 0x25, 0x41, 0x78, 0xae, 0x2c, 0x8b, 0xaa, 0x1a, 0xcb, 0xb9, 0x99, 0x82, 0x63, 0x8c, 0x79, 0x9b, 0x9b, 0x37, 0x9d, 0xa4, 0xd0, 0x2b, 0x28, @@ -1626,10 +1298,6 @@ 0x2d, 0x39, 0xa8, 0xcf, 0xb7, 0x87, 0xe7, 0x72, 0x77, 0xd5, 0xcf, 0xa3, 0xe3, 0x6f, 0xda, 0xcb, 0xab, 0x4d, 0x18, 0xb2, 0xb0, 0x4e, 0x32, 0x94 }, - { 0x83, 0xf8, 0x00, 0xb3, 0xe5, 0x28, 0x52, 0xde, - 0xbc, 0xc5, 0x04, 0xc2, 0x5b, 0x63, 0x58, 0x34, - 0x30, 0x7b, 0x14, 0x5e, 0x38, 0x87, 0x50, 0xaa, - 0xc1, 0x63, 0x90, 0x9d, 0x30, 0x4b, 0xe3, 0xd2 }, { 0x84, 0x23, 0xb3, 0xf1, 0xcc, 0x85, 0x2b, 0x49, 0xcf, 0x81, 0xb7, 0xd5, 0xff, 0x51, 0xa7, 0xa5, 0x6a, 0x84, 0x78, 0x3a, 0x2d, 0xf7, 0x43, 0x61, @@ -1642,10 +1310,6 @@ 0x6f, 0xff, 0x73, 0xf8, 0x2e, 0x6c, 0x75, 0x7c, 0x43, 0x35, 0xae, 0x5d, 0x3a, 0x1f, 0x52, 0xc4, 0xb6, 0x24, 0x08, 0xdb, 0x51, 0xdf, 0x9e, 0xb2 }, - { 0x85, 0x04, 0x81, 0x97, 0xf0, 0x2b, 0xf1, 0xa0, - 0x38, 0x81, 0x27, 0xe3, 0x2b, 0x5f, 0x0a, 0xd5, - 0xbc, 0xd9, 0x39, 0x89, 0x14, 0x1e, 0x2c, 0xf3, - 0x2b, 0x04, 0x6f, 0x19, 0x01, 0x50, 0x59, 0xc8 }, { 0x85, 0x31, 0xb2, 0xbf, 0xc5, 0x45, 0x79, 0xe8, 0xf1, 0x8f, 0x27, 0xb2, 0xe6, 0xec, 0xc0, 0xf8, 0x90, 0x64, 0xee, 0x86, 0x87, 0x0e, 0xcc, 0x8b, @@ -1690,10 +1354,6 @@ 0x9f, 0xd1, 0xb8, 0x1d, 0x5d, 0x5d, 0xc4, 0x99, 0xd3, 0x97, 0x65, 0x62, 0x1f, 0x7f, 0x43, 0x0c, 0x73, 0x46, 0xa7, 0x7b, 0x23, 0x39, 0x43, 0x82 }, - { 0x89, 0x76, 0xb5, 0x94, 0xac, 0xdd, 0xc1, 0xb2, - 0xab, 0xd7, 0x5f, 0xa1, 0xa1, 0xea, 0x24, 0x59, - 0x92, 0x9a, 0x7e, 0x81, 0x4c, 0x9e, 0xe3, 0xf7, - 0xba, 0x21, 0xb3, 0x80, 0x82, 0x88, 0xbe, 0xbb }, { 0x89, 0xaf, 0x0e, 0x54, 0xc7, 0x62, 0x77, 0x86, 0x93, 0x52, 0x9d, 0x0a, 0x95, 0x0b, 0x78, 0x33, 0xf5, 0xea, 0xba, 0xf3, 0x42, 0x79, 0x72, 0x60, @@ -1734,10 +1394,6 @@ 0x57, 0x0e, 0x5d, 0xe7, 0x04, 0x29, 0x38, 0x70, 0x8a, 0x1b, 0x0f, 0xce, 0xb4, 0x59, 0x86, 0x2a, 0x38, 0x67, 0xb7, 0x34, 0xcd, 0xcb, 0x97, 0x94 }, - { 0x8b, 0x59, 0x74, 0x2d, 0xff, 0xf2, 0xd5, 0xbf, - 0x70, 0x92, 0x6d, 0x1f, 0xe8, 0x00, 0x7d, 0x35, - 0x57, 0x91, 0x63, 0xfa, 0x4e, 0xee, 0x1d, 0x03, - 0x38, 0xf4, 0x4e, 0xd8, 0xd9, 0xfb, 0x67, 0x28 }, { 0x8c, 0x3e, 0x7c, 0x1d, 0xcc, 0x7d, 0xd8, 0xe7, 0xd8, 0xbf, 0x7b, 0x5b, 0x3a, 0xe5, 0xe0, 0x27, 0x2e, 0x81, 0x1a, 0xb9, 0xf3, 0xc3, 0xc5, 0x38, @@ -1754,10 +1410,6 @@ 0x5d, 0x6a, 0xe9, 0x75, 0x3e, 0x4d, 0x48, 0xb1, 0x79, 0x23, 0xb9, 0x36, 0x5a, 0x6b, 0x4b, 0x97, 0xc4, 0xec, 0xac, 0x4a, 0x4b, 0x37, 0x03, 0x4b }, - { 0x8c, 0xfa, 0x92, 0x51, 0xb4, 0xda, 0xef, 0x50, - 0x81, 0x0d, 0x6e, 0x19, 0xf5, 0xf8, 0x8e, 0xa2, - 0xc6, 0x5d, 0xb7, 0xa2, 0xe8, 0xa5, 0x06, 0xf7, - 0xdf, 0x99, 0x55, 0x81, 0x7d, 0xdd, 0xeb, 0xc8 }, { 0x8d, 0x85, 0xda, 0x44, 0x6f, 0x5c, 0x79, 0x54, 0xbd, 0xf7, 0x6c, 0x09, 0x0c, 0xd2, 0x46, 0x68, 0xff, 0x23, 0x3c, 0xcd, 0xf6, 0x6b, 0x94, 0xda, @@ -1766,10 +1418,6 @@ 0x35, 0xfa, 0xf5, 0x01, 0x5b, 0xe7, 0xda, 0xf4, 0x63, 0xb5, 0xc4, 0x14, 0xea, 0xbc, 0x8b, 0x89, 0xf3, 0xdb, 0xa2, 0x05, 0xab, 0x09, 0xa6, 0x43 }, - { 0x8e, 0x38, 0x31, 0x6e, 0x38, 0x8b, 0x56, 0x17, - 0x8e, 0x60, 0x10, 0xad, 0xc2, 0xca, 0xbb, 0x40, - 0x24, 0x92, 0x64, 0xb3, 0x34, 0x42, 0x20, 0xce, - 0xd9, 0xf6, 0xec, 0xbc, 0xf0, 0x71, 0x1c, 0x34 }, { 0x8e, 0x57, 0x12, 0xc7, 0x5e, 0xc1, 0xe0, 0x31, 0x73, 0x15, 0x96, 0x35, 0x60, 0xf2, 0x6c, 0x8e, 0xcb, 0x29, 0xa7, 0xa0, 0x28, 0x7f, 0x84, 0xe7, @@ -1786,10 +1434,6 @@ 0xbd, 0xc3, 0x5b, 0x04, 0xa7, 0x28, 0xe9, 0xd3, 0x1b, 0x7e, 0x4d, 0x37, 0x89, 0xaa, 0x2c, 0x46, 0xd8, 0xa3, 0x1b, 0x3d, 0xfa, 0x81, 0xa9, 0x7e }, - { 0x8f, 0x93, 0xc5, 0xa7, 0xc0, 0x96, 0x66, 0x8b, - 0xd4, 0x51, 0x56, 0xba, 0xd5, 0x6f, 0x06, 0x12, - 0x04, 0x5d, 0x63, 0x65, 0xb6, 0xbb, 0xaa, 0x63, - 0xba, 0xcb, 0xf2, 0xbe, 0x01, 0xb5, 0x2c, 0xd3 }, { 0x8f, 0x94, 0x15, 0x92, 0x6f, 0x40, 0x49, 0xea, 0x41, 0x8a, 0x30, 0x7c, 0x76, 0x36, 0xe4, 0x9b, 0x14, 0x4f, 0xa5, 0x3e, 0x52, 0xe1, 0x04, 0x15, @@ -1814,10 +1458,6 @@ 0xea, 0x1f, 0x0f, 0x4f, 0x31, 0xc9, 0x48, 0x9d, 0x38, 0x45, 0x0f, 0x08, 0xca, 0x8b, 0xcc, 0x21, 0x87, 0xf6, 0x90, 0xb4, 0x4f, 0x37, 0x30, 0x17 }, - { 0x91, 0x31, 0x4f, 0xf3, 0xfb, 0x23, 0xd3, 0x41, - 0x44, 0x63, 0x17, 0xf1, 0xc6, 0xca, 0x9d, 0x6c, - 0x6d, 0xcb, 0x7a, 0x95, 0x65, 0x1d, 0xa7, 0xe3, - 0xf1, 0x56, 0x00, 0xf4, 0x3a, 0x25, 0x8a, 0xf3 }, { 0x91, 0x6b, 0x1a, 0x6b, 0x61, 0x6c, 0x6d, 0x8a, 0xc1, 0x49, 0xa3, 0x31, 0x04, 0x83, 0x51, 0x1a, 0xf7, 0xa7, 0xd5, 0x3c, 0x60, 0x17, 0x9e, 0x7f, @@ -1838,10 +1478,6 @@ 0x07, 0xe9, 0x40, 0x7f, 0x7f, 0xff, 0x6a, 0x64, 0x63, 0x5d, 0x7c, 0xe9, 0x06, 0x66, 0xd4, 0x29, 0x94, 0x09, 0x7a, 0xf4, 0x0c, 0x31, 0x36, 0xfb }, - { 0x92, 0x83, 0x70, 0x07, 0x63, 0x1b, 0x8f, 0xfa, - 0x02, 0x91, 0xd9, 0xe9, 0xc4, 0xb0, 0x8a, 0x5b, - 0xfa, 0x84, 0x5b, 0xa1, 0x7e, 0x79, 0xa2, 0x2d, - 0x9d, 0x9d, 0x44, 0xb9, 0x02, 0x23, 0x3d, 0x16 }, { 0x93, 0x03, 0x43, 0xb5, 0xe8, 0xc1, 0x5d, 0x6d, 0x93, 0x9d, 0x0f, 0x39, 0xf0, 0x53, 0x7a, 0xa6, 0x23, 0x3f, 0x61, 0x17, 0x93, 0x79, 0xce, 0xbc, @@ -1906,18 +1542,6 @@ 0xc0, 0xa8, 0x3e, 0xd4, 0x9e, 0x65, 0x0a, 0xdf, 0xd9, 0xbc, 0x0b, 0x3c, 0x50, 0x04, 0x9d, 0x7b, 0x93, 0x24, 0x5a, 0xcc, 0x3a, 0x0c, 0x16, 0xaf }, - { 0x98, 0x57, 0x02, 0xc0, 0x55, 0x05, 0xd9, 0xba, - 0xe0, 0xce, 0x23, 0xab, 0x2c, 0xb8, 0x65, 0xa1, - 0xd1, 0x3f, 0x7b, 0xe0, 0x4f, 0xab, 0xc1, 0x19, - 0x49, 0x4b, 0x4c, 0xc1, 0x0a, 0x7d, 0x9a, 0xdb }, - { 0x98, 0x76, 0x8d, 0x66, 0x7e, 0x4d, 0xfc, 0x1d, - 0x99, 0x5e, 0x42, 0xc7, 0x1e, 0x31, 0x93, 0x31, - 0x6c, 0xef, 0x8c, 0x2a, 0xf5, 0x9a, 0x0e, 0xa6, - 0x19, 0x81, 0xfb, 0x42, 0x00, 0x72, 0x57, 0xc7 }, - { 0x98, 0x7a, 0xd4, 0x70, 0x5f, 0x65, 0x65, 0xaf, - 0x64, 0x53, 0x0d, 0x09, 0x60, 0xb8, 0x82, 0x74, - 0x0a, 0xfb, 0x8a, 0x74, 0xd5, 0xcc, 0x3c, 0x68, - 0x19, 0x34, 0x69, 0x83, 0xf2, 0x51, 0x33, 0x37 }, { 0x98, 0xaa, 0xb4, 0xed, 0x43, 0x89, 0xf3, 0x5e, 0x74, 0x23, 0x74, 0x90, 0x68, 0x01, 0x15, 0x3d, 0xc7, 0xc8, 0xe3, 0x2d, 0x18, 0xb4, 0xd7, 0x81, @@ -1998,14 +1622,6 @@ 0x39, 0xcd, 0x01, 0xec, 0x4b, 0x33, 0xa1, 0x2f, 0x47, 0x51, 0x2f, 0x54, 0x09, 0xff, 0x09, 0x5d, 0x40, 0xaa, 0xd6, 0x20, 0x84, 0xef, 0x15, 0xbe }, - { 0x9d, 0xac, 0x9d, 0x66, 0xde, 0xd0, 0xc1, 0x5d, - 0x23, 0x24, 0x1a, 0x90, 0x78, 0xa9, 0x1e, 0xc1, - 0xe9, 0x40, 0x70, 0xa1, 0x5c, 0x70, 0x29, 0x45, - 0x02, 0xfe, 0x73, 0x8d, 0x12, 0x1c, 0xca, 0xac }, - { 0x9e, 0x80, 0xd0, 0x33, 0xe6, 0x10, 0x90, 0x7b, - 0xfe, 0x1f, 0xd8, 0xdf, 0x2d, 0x36, 0xdd, 0xef, - 0x00, 0xc8, 0xfc, 0x7b, 0xf7, 0xb7, 0xfd, 0x7e, - 0x8d, 0x45, 0x92, 0xab, 0xf3, 0xc4, 0x21, 0xde }, { 0x9e, 0x98, 0xf7, 0xda, 0x04, 0x74, 0xd4, 0x86, 0x5a, 0xc7, 0x05, 0xd4, 0xd7, 0xab, 0xbe, 0xb7, 0x1a, 0xef, 0xba, 0x2c, 0xf2, 0xe0, 0x82, 0xf0, @@ -2030,10 +1646,6 @@ 0x06, 0x76, 0x2e, 0x02, 0xe4, 0x20, 0xf1, 0xa9, 0xc4, 0xab, 0x73, 0x29, 0xae, 0x29, 0x5f, 0x01, 0x5f, 0x74, 0x7d, 0xa1, 0x82, 0xa9, 0xc3, 0x9c }, - { 0xa0, 0xab, 0x9f, 0x42, 0xd0, 0x9d, 0x06, 0x44, - 0x23, 0x8c, 0x63, 0xf2, 0x19, 0x26, 0x52, 0x8f, - 0xa5, 0x3e, 0x56, 0x6d, 0x83, 0x3e, 0xf1, 0xb0, - 0x8d, 0x9e, 0xe7, 0xf3, 0x4d, 0x2b, 0x6d, 0x8e }, { 0xa0, 0xc2, 0xd2, 0x07, 0xa4, 0x7e, 0x18, 0xd0, 0x37, 0x14, 0xd5, 0xb3, 0x44, 0x5d, 0x88, 0xbe, 0x81, 0xff, 0x5e, 0x1d, 0x16, 0x07, 0x3d, 0xc1, @@ -2070,26 +1682,10 @@ 0x12, 0x0b, 0xd2, 0x57, 0x94, 0xf8, 0xca, 0x20, 0xb0, 0x94, 0x3f, 0xbd, 0x13, 0x6e, 0x4b, 0x36, 0x77, 0x30, 0xf0, 0x5e, 0x71, 0x21, 0xf8, 0x97 }, - { 0xa5, 0x60, 0x81, 0x15, 0x27, 0xb1, 0xfc, 0x3e, - 0x25, 0xaf, 0x12, 0xc6, 0x10, 0xd3, 0x58, 0x18, - 0x43, 0x32, 0x10, 0xd3, 0x15, 0x27, 0x56, 0x45, - 0x67, 0xdb, 0x9f, 0xf1, 0xa2, 0xed, 0x66, 0x90 }, - { 0xa5, 0x61, 0x59, 0x83, 0x9a, 0x9e, 0x88, 0xa6, - 0x18, 0xed, 0xb3, 0xce, 0x3b, 0x8f, 0x16, 0x52, - 0x35, 0x22, 0xaf, 0x8b, 0x0c, 0x53, 0xee, 0x1e, - 0xa0, 0x85, 0x38, 0xb8, 0x88, 0x29, 0xc9, 0x2d }, { 0xa5, 0x67, 0x98, 0x6c, 0xe0, 0xe3, 0x36, 0xf8, 0x4f, 0xdc, 0x08, 0x15, 0xb8, 0x6e, 0xa3, 0x03, 0x34, 0x3c, 0xf8, 0xc1, 0x0f, 0x37, 0x27, 0x83, 0x27, 0x14, 0x86, 0xb9, 0xc9, 0x3b, 0x63, 0x67 }, - { 0xa6, 0x21, 0xae, 0x36, 0x54, 0xac, 0xfd, 0x17, - 0x23, 0x30, 0x70, 0xe9, 0xb1, 0x8d, 0xfd, 0x91, - 0x6a, 0x55, 0x2e, 0x6a, 0x8b, 0x82, 0x42, 0xbd, - 0x57, 0xbb, 0xcd, 0xf4, 0xe6, 0x5e, 0x99, 0x76 }, - { 0xa6, 0x33, 0x5d, 0xf3, 0xab, 0xa5, 0xea, 0xdf, - 0xbd, 0xc9, 0xc2, 0xdc, 0x9d, 0x6b, 0xe6, 0x0b, - 0xb6, 0x2d, 0xf2, 0xfe, 0x24, 0xec, 0x7b, 0xa7, - 0x67, 0xbe, 0x65, 0xd3, 0x7f, 0x3c, 0x90, 0xf8 }, { 0xa6, 0x62, 0xfc, 0x81, 0xc9, 0x09, 0x34, 0xb9, 0xb4, 0xd6, 0x30, 0xb5, 0xd8, 0x2e, 0x86, 0xf2, 0x36, 0x3e, 0xc1, 0x5c, 0xcf, 0xcd, 0xaf, 0xa7, @@ -2098,10 +1694,6 @@ 0x70, 0xb4, 0x58, 0xb7, 0xc3, 0x7c, 0x05, 0x2e, 0xad, 0x1e, 0xb2, 0x0b, 0x85, 0x67, 0xe3, 0x51, 0xad, 0x8e, 0x6f, 0xba, 0x49, 0xc2, 0x69, 0x2c }, - { 0xa6, 0xb6, 0xda, 0xd4, 0x51, 0x5b, 0x1c, 0xfc, - 0x70, 0x37, 0x1c, 0xfc, 0xfc, 0x32, 0x30, 0x71, - 0x0e, 0x30, 0xef, 0xe4, 0x0f, 0x95, 0xd5, 0x20, - 0xaf, 0xc8, 0x65, 0x31, 0xe8, 0xc8, 0xf8, 0x41 }, { 0xa6, 0xde, 0x6c, 0x3b, 0x8c, 0x14, 0x05, 0xcb, 0xe1, 0x2d, 0xb4, 0x09, 0x97, 0x61, 0x71, 0xac, 0xb5, 0x1f, 0xb3, 0xdc, 0xfb, 0xb7, 0x6e, 0xe3, @@ -2118,10 +1710,6 @@ 0x6a, 0x7a, 0x48, 0x94, 0x3c, 0xbd, 0x2d, 0x99, 0x0e, 0x40, 0xfa, 0xa6, 0xd8, 0x56, 0x87, 0x7f, 0x45, 0x5b, 0xf0, 0x15, 0xf5, 0x45, 0x11, 0x3c }, - { 0xa7, 0x36, 0xb1, 0x97, 0xe6, 0xfb, 0x3b, 0x62, - 0x32, 0xed, 0xb3, 0xc8, 0xd6, 0x8c, 0xe1, 0x35, - 0x1a, 0x48, 0xb5, 0x6f, 0x70, 0x11, 0xbb, 0x99, - 0x20, 0xcf, 0xca, 0x75, 0x7e, 0x57, 0xc6, 0xc4 }, { 0xa8, 0x53, 0xad, 0xc1, 0xc2, 0x18, 0x59, 0xaf, 0x7c, 0x46, 0x2b, 0x4a, 0xa0, 0xa5, 0x74, 0xca, 0x9f, 0xee, 0xfb, 0x18, 0x5a, 0x1f, 0xdb, 0xb6, @@ -2146,10 +1734,6 @@ 0xa5, 0x7d, 0xc1, 0xf0, 0xf8, 0x6d, 0xe1, 0x07, 0xb5, 0xe2, 0xf0, 0x36, 0x09, 0x53, 0xf1, 0xed, 0x12, 0x5e, 0x37, 0x07, 0x59, 0x47, 0x1d, 0x09 }, - { 0xa9, 0x94, 0xc9, 0x09, 0x10, 0x60, 0x9a, 0xf5, - 0x0a, 0x4c, 0x09, 0x22, 0x97, 0xc9, 0xb4, 0xc7, - 0xf1, 0x03, 0x96, 0xaf, 0x73, 0x95, 0xe9, 0xe1, - 0xbf, 0xb8, 0x99, 0x53, 0xfa, 0x15, 0x25, 0x9b }, { 0xaa, 0x0e, 0x12, 0x52, 0x43, 0x6d, 0xef, 0x79, 0x07, 0xfb, 0x99, 0xf7, 0x64, 0x15, 0x50, 0xd8, 0x0f, 0xaf, 0xfb, 0xf3, 0x01, 0x71, 0x1c, 0x7b, @@ -2186,10 +1770,6 @@ 0xc1, 0x40, 0x30, 0xdb, 0xce, 0xdd, 0x63, 0xd1, 0xd1, 0x7c, 0x33, 0x8e, 0xbd, 0x1d, 0x7d, 0xe5, 0x6c, 0x79, 0xd2, 0x1a, 0x6f, 0x2e, 0x47, 0xa7 }, - { 0xad, 0x4b, 0x2f, 0x8e, 0xf2, 0xde, 0xfb, 0x01, - 0x92, 0x3c, 0x9c, 0x0f, 0xe2, 0x5a, 0x9a, 0xce, - 0x41, 0xfa, 0x9e, 0x69, 0x75, 0x85, 0xfc, 0x3d, - 0xdf, 0x8d, 0x34, 0xe7, 0x45, 0xff, 0x0f, 0x12 }, { 0xad, 0x69, 0x54, 0x5f, 0x9f, 0x85, 0x25, 0x5f, 0xe4, 0x16, 0x51, 0x3d, 0x94, 0xdb, 0x31, 0x50, 0x5f, 0x38, 0x4b, 0x52, 0x3c, 0x2c, 0xa2, 0x6e, @@ -2198,10 +1778,6 @@ 0xe8, 0x54, 0xb5, 0x15, 0x50, 0xea, 0x44, 0x4f, 0xa3, 0xb8, 0xbb, 0x50, 0xae, 0x93, 0x74, 0x01, 0x3c, 0xfe, 0xf3, 0x88, 0x73, 0x5d, 0x0b, 0xd3 }, - { 0xae, 0x2f, 0x15, 0xea, 0x4a, 0xa5, 0x39, 0x81, - 0x41, 0x0f, 0x98, 0x93, 0x81, 0xa4, 0x41, 0x5a, - 0xf1, 0x84, 0x3d, 0x19, 0xe4, 0x39, 0x07, 0xaf, - 0x53, 0xb2, 0x0f, 0x7f, 0xa7, 0x73, 0x2a, 0x93 }, { 0xae, 0x4d, 0xf3, 0x97, 0x9b, 0x74, 0x27, 0x34, 0xa3, 0x39, 0xc4, 0x70, 0x1d, 0x5e, 0x13, 0x21, 0x26, 0x3f, 0xf4, 0x4e, 0x67, 0x56, 0x49, 0x05, @@ -2218,10 +1794,6 @@ 0x41, 0x81, 0xd8, 0x6a, 0x7e, 0x8f, 0x07, 0x69, 0xb6, 0x1d, 0x46, 0xd7, 0xb6, 0xfa, 0xc6, 0xe6, 0xf9, 0x59, 0x6d, 0xe9, 0x4a, 0xa8, 0xe2, 0xe8 }, - { 0xaf, 0xe7, 0xb8, 0xee, 0xfd, 0xf5, 0x4e, 0x7f, - 0x1c, 0x5a, 0x6b, 0xed, 0xf7, 0x54, 0xce, 0x97, - 0x0f, 0xa1, 0x19, 0x59, 0xe7, 0x80, 0x38, 0xcc, - 0x36, 0x8a, 0xc7, 0x78, 0xb7, 0x5c, 0x92, 0x4b }, { 0xb0, 0x1e, 0xb1, 0x82, 0x68, 0x1a, 0xa9, 0x5d, 0x7b, 0xea, 0xaf, 0x53, 0xba, 0x75, 0x5b, 0x7f, 0x3d, 0x0f, 0xb7, 0x97, 0x76, 0xd5, 0x62, 0xb9, @@ -2230,38 +1802,14 @@ 0x52, 0xfd, 0x76, 0xa5, 0xff, 0xa4, 0x87, 0x2d, 0xd4, 0x2e, 0xa0, 0x60, 0xae, 0x40, 0xa3, 0x83, 0x13, 0xb7, 0xb5, 0x4a, 0xec, 0x06, 0x73, 0xc2 }, - { 0xb0, 0x62, 0x43, 0x51, 0xfd, 0x68, 0x51, 0x23, - 0x01, 0x38, 0x56, 0xec, 0x40, 0x63, 0x25, 0xfc, - 0xcb, 0x16, 0x45, 0x76, 0x50, 0xa8, 0x71, 0xf5, - 0xfb, 0x91, 0x5d, 0xdd, 0x75, 0x4a, 0x3b, 0xc9 }, - { 0xb0, 0xb6, 0x32, 0x1c, 0x45, 0x9b, 0xdb, 0x78, - 0x91, 0x8e, 0xc3, 0x16, 0xbd, 0x36, 0xec, 0x5f, - 0x30, 0x55, 0x8e, 0xe0, 0x2e, 0xcc, 0x51, 0xe3, - 0x77, 0xc5, 0xf8, 0xab, 0xa4, 0x1d, 0xba, 0x6d }, { 0xb0, 0xe0, 0xe1, 0x6c, 0x5f, 0x69, 0x1f, 0x66, 0xa9, 0x57, 0x3b, 0xd3, 0xcf, 0x43, 0xf9, 0xdf, 0xd2, 0xad, 0x3e, 0x56, 0x15, 0x54, 0x63, 0x7f, 0x1e, 0x7b, 0x71, 0x91, 0x4d, 0x62, 0x73, 0x38 }, - { 0xb1, 0x61, 0xd6, 0x09, 0x5b, 0x6e, 0x9b, 0x1d, - 0xb5, 0x16, 0xda, 0x1c, 0x2d, 0xef, 0x9c, 0xe9, - 0x11, 0xc7, 0xa5, 0xbb, 0x55, 0xef, 0xf5, 0x05, - 0x66, 0xd5, 0xd1, 0xe0, 0xdc, 0x4f, 0x45, 0xcd }, - { 0xb1, 0x91, 0x9d, 0x6c, 0xfa, 0xc2, 0x0d, 0x03, - 0x47, 0x76, 0x87, 0x1a, 0xb0, 0xa2, 0x57, 0x8a, - 0xc0, 0xb2, 0xdd, 0xb6, 0x8b, 0xe1, 0xdc, 0x75, - 0x91, 0x80, 0x44, 0x1f, 0x05, 0x3a, 0x27, 0x2c }, { 0xb1, 0x92, 0x30, 0x7c, 0xfa, 0xee, 0x42, 0x7b, 0x76, 0x7b, 0xc2, 0xf9, 0x9b, 0xc2, 0x26, 0x74, 0x26, 0x0a, 0x4e, 0x8e, 0x1e, 0x6b, 0x36, 0x19, 0x8c, 0x2f, 0x4e, 0xea, 0x67, 0xca, 0x85, 0xef }, - { 0xb1, 0xa5, 0x89, 0x8e, 0x3b, 0x0d, 0x0a, 0x7a, - 0x80, 0x76, 0x79, 0x3d, 0x6c, 0x63, 0xa3, 0x22, - 0xea, 0xb7, 0x1f, 0x7e, 0x28, 0x74, 0x5d, 0xef, - 0xf5, 0xa0, 0xc3, 0x3a, 0x8e, 0xec, 0xe4, 0xfa }, - { 0xb2, 0xc6, 0xf7, 0xc6, 0x2f, 0xa5, 0x6a, 0x4e, - 0x57, 0xb7, 0x62, 0xa8, 0x9c, 0x3c, 0x55, 0xdd, - 0x81, 0xc1, 0x82, 0x7e, 0xdf, 0xb0, 0xd4, 0x41, - 0x80, 0xe4, 0xfa, 0xdc, 0xeb, 0x23, 0x72, 0x73 }, { 0xb2, 0xdc, 0x86, 0x25, 0x6c, 0xcf, 0xf4, 0xbb, 0x14, 0xfd, 0x70, 0x27, 0x9f, 0xcc, 0x3c, 0xe9, 0x25, 0xc5, 0x1f, 0xb7, 0x17, 0xe5, 0x87, 0x6f, @@ -2274,10 +1822,6 @@ 0x72, 0x32, 0xbb, 0x9b, 0xac, 0xb9, 0x94, 0xc5, 0xba, 0xe9, 0x3a, 0x46, 0xfc, 0x87, 0xf1, 0x51, 0x29, 0xc9, 0x74, 0x69, 0xa5, 0x81, 0x4e, 0xca }, - { 0xb3, 0x19, 0xaf, 0x08, 0x28, 0x68, 0x1f, 0x97, - 0x35, 0xa4, 0x8d, 0x11, 0x17, 0x39, 0xb8, 0x62, - 0x89, 0xae, 0xf7, 0xfb, 0x81, 0x7c, 0x04, 0x7f, - 0x12, 0x75, 0xa5, 0x87, 0xa7, 0x32, 0x2c, 0x0b }, { 0xb3, 0x1a, 0xf0, 0xc2, 0xe5, 0x1e, 0xa2, 0x1c, 0x91, 0x04, 0xf9, 0x4f, 0xaa, 0x66, 0xe0, 0xcc, 0xc0, 0x41, 0x34, 0xd5, 0x80, 0x9a, 0x2a, 0x26, @@ -2314,38 +1858,10 @@ 0x17, 0xf0, 0x6f, 0xe1, 0xd7, 0xac, 0x9c, 0x62, 0x33, 0xd4, 0x38, 0x22, 0xe9, 0xfd, 0x14, 0xdb, 0x98, 0xf7, 0xf8, 0x4e, 0x32, 0x79, 0x6d, 0x08 }, - { 0xb4, 0xf1, 0xef, 0x4a, 0xa5, 0x1f, 0x02, 0x1e, - 0xd2, 0x66, 0x26, 0x44, 0xce, 0xda, 0x31, 0x1d, - 0x86, 0xf5, 0x64, 0x0d, 0xaf, 0xe9, 0xa4, 0x39, - 0x18, 0x89, 0x37, 0xd8, 0x09, 0x13, 0x90, 0x75 }, - { 0xb5, 0x25, 0x36, 0x2f, 0x68, 0x54, 0x4a, 0xc1, - 0x8c, 0x2f, 0x5c, 0x19, 0x51, 0x47, 0x94, 0x40, - 0x45, 0x8c, 0x59, 0xd7, 0xbb, 0x00, 0x5f, 0x19, - 0x91, 0x17, 0x51, 0xb4, 0xd3, 0x97, 0x1d, 0x5c }, - { 0xb5, 0xb8, 0xd0, 0x08, 0x69, 0xdd, 0x78, 0x64, - 0x9d, 0xab, 0xd4, 0x41, 0x14, 0x08, 0xa8, 0xff, - 0x1a, 0xc5, 0x43, 0xec, 0xa8, 0x80, 0xae, 0xed, - 0xb5, 0x83, 0x28, 0xed, 0xda, 0x47, 0x1b, 0xfc }, - { 0xb5, 0xe2, 0xaa, 0x4c, 0x7f, 0xa4, 0x65, 0xa9, - 0x72, 0xaf, 0x17, 0x0e, 0x21, 0x76, 0xd1, 0x83, - 0x51, 0xe6, 0x8d, 0x94, 0x95, 0x0d, 0x87, 0x55, - 0x9c, 0x65, 0x20, 0x43, 0xfe, 0xcb, 0x05, 0x2d }, { 0xb5, 0xe5, 0xdc, 0xde, 0xcb, 0x8d, 0xeb, 0x27, 0x13, 0x4f, 0x02, 0xa5, 0x18, 0x79, 0x43, 0x16, 0xf0, 0x8f, 0xaf, 0x9c, 0x2b, 0x1f, 0xda, 0xd6, 0xd4, 0x86, 0x61, 0xf5, 0x7e, 0xa6, 0x45, 0xd9 }, - { 0xb6, 0x60, 0x21, 0xde, 0x5d, 0xe8, 0x81, 0x36, - 0xbb, 0x09, 0x49, 0x1a, 0x46, 0xe0, 0xfc, 0x6b, - 0x69, 0x33, 0x9b, 0xd9, 0xac, 0xc9, 0xa4, 0xea, - 0x84, 0xcc, 0x76, 0x4c, 0x39, 0xf5, 0x70, 0xa3 }, - { 0xb6, 0x8d, 0x56, 0xb6, 0x8c, 0xc0, 0x99, 0xff, - 0xde, 0xe7, 0xd5, 0x70, 0x1f, 0x1e, 0x1e, 0x97, - 0x26, 0xdc, 0x75, 0x7c, 0x22, 0x22, 0xb0, 0xa0, - 0x1e, 0x4a, 0x32, 0x72, 0xf8, 0xb3, 0x84, 0xf2 }, - { 0xb6, 0x90, 0x8f, 0xab, 0x0c, 0xa2, 0xd7, 0xd6, - 0x5d, 0xca, 0x8b, 0x10, 0xd0, 0x1f, 0x08, 0x48, - 0x13, 0x1c, 0x1c, 0x32, 0x10, 0xa2, 0x5b, 0x47, - 0xc7, 0x9e, 0x33, 0xc4, 0xac, 0x09, 0x5f, 0x7e }, { 0xb7, 0x06, 0xde, 0x1b, 0xd1, 0xee, 0x2f, 0x4c, 0xec, 0x6c, 0xe0, 0x92, 0x02, 0x2b, 0x49, 0x32, 0x81, 0xe2, 0x9a, 0x21, 0x73, 0x50, 0x8c, 0x9b, @@ -2366,10 +1882,6 @@ 0x71, 0x0f, 0x38, 0xd0, 0xca, 0x3e, 0x01, 0xff, 0xab, 0xde, 0x0f, 0xc2, 0x48, 0x3e, 0x21, 0xb8, 0xf1, 0xa5, 0xff, 0x48, 0x3b, 0x2d, 0x60, 0xce }, - { 0xb9, 0x42, 0x94, 0x19, 0xf2, 0x9f, 0xe3, 0x5c, - 0xd8, 0xcf, 0x94, 0x92, 0xd5, 0xa9, 0xb5, 0xd2, - 0x24, 0x1d, 0xda, 0x4e, 0x12, 0x15, 0x6f, 0x37, - 0x4c, 0xec, 0x78, 0x4f, 0x44, 0x5b, 0x43, 0xf2 }, { 0xb9, 0x8d, 0x83, 0x38, 0x55, 0xc3, 0x67, 0x88, 0x62, 0xb6, 0x2f, 0x36, 0x50, 0xdb, 0x00, 0xa3, 0x45, 0xf4, 0x6a, 0x0e, 0x8e, 0x01, 0x1a, 0x20, @@ -2386,10 +1898,6 @@ 0x34, 0xa2, 0xb3, 0x3a, 0x83, 0xe3, 0xad, 0xfd, 0x12, 0xd7, 0x9c, 0xa6, 0x05, 0x90, 0x9d, 0x96, 0x03, 0x3e, 0x32, 0xa5, 0xcf, 0x2f, 0x71, 0xf6 }, - { 0xbb, 0x0b, 0xd1, 0xe6, 0x9f, 0xf4, 0xa3, 0x89, - 0x51, 0x61, 0x13, 0x55, 0x2c, 0x17, 0xab, 0x77, - 0x82, 0xa7, 0xeb, 0xba, 0xea, 0x0b, 0xe3, 0x9f, - 0x58, 0x92, 0x84, 0x1f, 0x1f, 0x74, 0xd2, 0x98 }, { 0xbb, 0x5c, 0xb3, 0x78, 0xb7, 0xb9, 0x48, 0x7f, 0xa6, 0x1b, 0xc0, 0x91, 0x3d, 0xa1, 0xdf, 0x26, 0xa1, 0xcf, 0xef, 0xf7, 0x45, 0x2d, 0x9b, 0xa3, @@ -2414,10 +1922,6 @@ 0x2a, 0xa7, 0xa7, 0x5f, 0x77, 0x63, 0xa8, 0x38, 0xcf, 0x4b, 0xa1, 0x7f, 0xb3, 0x64, 0x72, 0xba, 0x12, 0x69, 0x8c, 0x45, 0xdf, 0x88, 0xe8, 0x46 }, - { 0xbe, 0x41, 0x0a, 0x51, 0xd3, 0x44, 0x17, 0x76, - 0x91, 0xb3, 0x42, 0x64, 0x10, 0xa4, 0x41, 0xaf, - 0xd1, 0xc9, 0x40, 0xb1, 0xb2, 0x7c, 0xf5, 0x29, - 0xee, 0x87, 0xa1, 0x40, 0x3b, 0xb0, 0x16, 0xf4 }, { 0xbe, 0x68, 0x35, 0x4f, 0x7c, 0x36, 0x24, 0x2d, 0xb6, 0x20, 0x4f, 0x20, 0x13, 0x1b, 0x01, 0xff, 0x28, 0xb7, 0xdd, 0xff, 0x36, 0x2e, 0x42, 0x9b, @@ -2426,10 +1930,6 @@ 0x5a, 0xf3, 0x91, 0x5a, 0x39, 0xcc, 0x2a, 0xfa, 0x9f, 0x6a, 0x8a, 0x6f, 0xbe, 0xd4, 0xfe, 0x54, 0xd9, 0xde, 0x32, 0x49, 0x23, 0xb3, 0x93, 0x5a }, - { 0xbe, 0xd5, 0xb6, 0xad, 0xe6, 0xc9, 0xc2, 0x15, - 0xe4, 0x14, 0x53, 0x21, 0x9a, 0xf2, 0x9a, 0x8b, - 0x8d, 0x76, 0x9d, 0x36, 0x43, 0x8c, 0x3f, 0x96, - 0x61, 0x76, 0xe3, 0xbc, 0xc9, 0x1f, 0x2e, 0xe8 }, { 0xbe, 0xd6, 0xf8, 0x1a, 0xd8, 0x5e, 0x71, 0x6b, 0x60, 0xd3, 0xe9, 0x7d, 0x8b, 0x90, 0x81, 0xe9, 0xc1, 0xb9, 0xec, 0x3b, 0xe8, 0xf3, 0xfd, 0x5b, @@ -2510,10 +2010,6 @@ 0xbd, 0x47, 0x59, 0x1d, 0x93, 0x04, 0x71, 0xe6, 0x17, 0x4c, 0x93, 0x85, 0xf5, 0xdc, 0x32, 0xb7, 0x62, 0x31, 0x65, 0x5f, 0xc8, 0x5e, 0x22, 0xe2 }, - { 0xc2, 0xe8, 0x7a, 0xf9, 0xfe, 0x26, 0x55, 0x64, - 0xe1, 0x09, 0xa3, 0x9d, 0x73, 0xbc, 0xd4, 0x7a, - 0x4e, 0x98, 0x75, 0x6f, 0x76, 0xeb, 0xdf, 0xb7, - 0xa6, 0x57, 0x0a, 0xda, 0xb9, 0xdd, 0xdd, 0xfb }, { 0xc3, 0x79, 0x03, 0xc5, 0x3a, 0xe6, 0x02, 0xec, 0x96, 0x9e, 0xc3, 0x3f, 0x63, 0xfe, 0x9a, 0xb2, 0x0c, 0x39, 0x5f, 0x83, 0x0d, 0x30, 0xe4, 0xee, @@ -2542,10 +2038,6 @@ 0x33, 0x8c, 0xef, 0x77, 0x73, 0xc6, 0xdf, 0xca, 0x6c, 0xe4, 0xfa, 0x96, 0x41, 0xbe, 0xab, 0x38, 0x05, 0xa8, 0xef, 0xb6, 0xcd, 0xc3, 0xcf, 0x0a }, - { 0xc4, 0xf4, 0x79, 0x81, 0xf4, 0x5d, 0x90, 0x3b, - 0x56, 0x2f, 0x39, 0xf6, 0x17, 0x45, 0xf4, 0xe1, - 0x90, 0x48, 0x1c, 0x4b, 0x56, 0xa4, 0xbd, 0xf5, - 0xa0, 0xe1, 0x61, 0xe3, 0xe9, 0x42, 0x83, 0x89 }, { 0xc5, 0x00, 0xb8, 0x3f, 0x3e, 0x06, 0x6c, 0xd1, 0xdd, 0x0e, 0xbc, 0xd7, 0x3d, 0xd4, 0x01, 0x61, 0xb9, 0x25, 0x9a, 0xa7, 0x7a, 0xb8, 0xa6, 0x47, @@ -2562,14 +2054,6 @@ 0x21, 0xaf, 0x00, 0x82, 0x25, 0xca, 0xbe, 0x40, 0x4f, 0x73, 0x8c, 0x27, 0x8a, 0x4a, 0x42, 0x87, 0xf1, 0xee, 0x38, 0x01, 0x27, 0xc5, 0x61, 0xfa }, - { 0xc6, 0x41, 0x82, 0xd6, 0x05, 0xc1, 0xcb, 0xe1, - 0x9b, 0xd3, 0xb7, 0xfe, 0x55, 0x7f, 0x58, 0xcd, - 0x52, 0x10, 0x30, 0x97, 0xa3, 0x3b, 0xf8, 0x4a, - 0xf2, 0x22, 0xc8, 0xce, 0x72, 0x52, 0x61, 0x15 }, - { 0xc6, 0x67, 0x05, 0xfc, 0xa8, 0x55, 0x10, 0xfd, - 0x14, 0x58, 0xe2, 0xf4, 0x51, 0xd4, 0x54, 0x43, - 0x55, 0xd0, 0xb1, 0x03, 0xfe, 0x6d, 0xb4, 0x73, - 0x78, 0xe7, 0x28, 0x37, 0xed, 0x9a, 0x2e, 0x6f }, { 0xc6, 0x89, 0xb9, 0x95, 0x6c, 0x73, 0x11, 0xd7, 0x34, 0x6a, 0x7f, 0xa3, 0x8b, 0x2c, 0xcd, 0xe3, 0xef, 0xee, 0x85, 0x3d, 0x7c, 0x2c, 0x41, 0x4f, @@ -2582,10 +2066,6 @@ 0x2d, 0x31, 0xfb, 0xc1, 0x06, 0x16, 0xbf, 0x1c, 0xa2, 0xfb, 0x5b, 0x02, 0xe8, 0x46, 0xb5, 0x9e, 0x63, 0x34, 0x6b, 0x31, 0x92, 0xa7, 0x52, 0x92 }, - { 0xc6, 0xc6, 0xb0, 0x9a, 0xfa, 0x64, 0x6e, 0x4e, - 0x1d, 0x75, 0xc9, 0x23, 0xae, 0xb0, 0x2b, 0x39, - 0xf8, 0xf0, 0x7a, 0x74, 0x33, 0x59, 0xdd, 0x22, - 0xb4, 0xb5, 0x32, 0x41, 0xb7, 0xb0, 0x3d, 0x63 }, { 0xc7, 0x01, 0x83, 0x64, 0x38, 0xf3, 0x7b, 0xea, 0x8a, 0x88, 0x16, 0x10, 0x63, 0x70, 0x86, 0xf8, 0x8d, 0x9a, 0x11, 0x5e, 0x00, 0x92, 0x46, 0xd2, @@ -2606,10 +2086,6 @@ 0x42, 0xed, 0x3c, 0x79, 0xbe, 0xd9, 0x44, 0x1e, 0x92, 0x50, 0xbd, 0x05, 0x20, 0x25, 0xad, 0x8a, 0xf4, 0x40, 0x41, 0xac, 0x19, 0xef, 0xbb, 0x4c }, - { 0xc8, 0xc6, 0x92, 0x81, 0xbe, 0x05, 0xc4, 0x14, - 0xea, 0xa3, 0x1c, 0x61, 0xb6, 0x52, 0x93, 0xbe, - 0x72, 0xb5, 0x89, 0xd1, 0xd5, 0xe4, 0xb7, 0x59, - 0xd5, 0xed, 0xaf, 0x54, 0x63, 0x99, 0xa2, 0xef }, { 0xc9, 0x43, 0x10, 0x03, 0xbb, 0xea, 0xb5, 0x8e, 0x35, 0x2f, 0xde, 0xb4, 0x5b, 0x7f, 0xcf, 0x15, 0xc7, 0x3f, 0x07, 0x34, 0xa0, 0x7d, 0x6c, 0xbd, @@ -2626,18 +2102,10 @@ 0xf3, 0x55, 0x7d, 0x3e, 0x2d, 0x88, 0xaf, 0x92, 0xed, 0x25, 0x9c, 0x20, 0xff, 0xd1, 0xdd, 0xe9, 0xf7, 0x9d, 0x6b, 0x92, 0xc6, 0x1e, 0xe1, 0xb9 }, - { 0xca, 0x6c, 0xc4, 0xba, 0x92, 0x04, 0x14, 0x20, - 0x7a, 0xa0, 0xe0, 0xf3, 0x3f, 0x27, 0x44, 0xc3, - 0x1a, 0x37, 0x78, 0x27, 0x50, 0x89, 0x24, 0x6e, - 0x9e, 0x98, 0x4c, 0xb7, 0x2c, 0x58, 0x72, 0xfc }, { 0xca, 0xbe, 0x25, 0x56, 0xf1, 0xbb, 0x56, 0x57, 0x0c, 0xef, 0x3a, 0x87, 0x03, 0x32, 0x71, 0xa1, 0xf2, 0x1d, 0x09, 0xb7, 0xfd, 0x04, 0x12, 0x83, 0x18, 0xe5, 0xe7, 0xbc, 0xe3, 0xa2, 0x01, 0xe2 }, - { 0xca, 0xc4, 0xbb, 0x2c, 0x3d, 0x5f, 0xc7, 0xcb, - 0x19, 0xc5, 0x41, 0x06, 0x79, 0x59, 0xd7, 0x20, - 0xef, 0x4c, 0xbf, 0x52, 0x98, 0x01, 0xbe, 0xe1, - 0xc8, 0xde, 0xbf, 0x42, 0x75, 0xfc, 0x08, 0x3b }, { 0xca, 0xdc, 0xd5, 0xae, 0x1b, 0x75, 0x6a, 0xb7, 0x41, 0xb3, 0x56, 0x9c, 0x42, 0xa5, 0x41, 0x1f, 0x09, 0x3e, 0x4e, 0x1f, 0x01, 0x2e, 0xc5, 0x79, @@ -2674,10 +2142,6 @@ 0x0f, 0x2d, 0x3a, 0xe8, 0x6a, 0xca, 0xc7, 0xfb, 0x25, 0x35, 0x4b, 0x02, 0x23, 0x5b, 0x09, 0x33, 0xaa, 0x81, 0xa3, 0x13, 0xb5, 0xfd, 0xfe, 0xec }, - { 0xce, 0x2c, 0xf2, 0x55, 0x72, 0x57, 0x21, 0x30, - 0x71, 0x73, 0x68, 0x19, 0xb7, 0xd2, 0x88, 0xa9, - 0x30, 0x77, 0x2b, 0x9b, 0x78, 0x2e, 0x61, 0x60, - 0x03, 0x8f, 0xc6, 0x7a, 0x76, 0x0d, 0x7c, 0xdc }, { 0xce, 0x4c, 0x2f, 0x8f, 0x16, 0x46, 0x8a, 0x58, 0x88, 0xe9, 0x0f, 0x73, 0x4e, 0x4d, 0x22, 0x02, 0xdf, 0xad, 0xbf, 0xa6, 0x6f, 0x5b, 0x35, 0x75, @@ -2694,22 +2158,10 @@ 0x85, 0xf5, 0xb6, 0x4e, 0x65, 0x22, 0x8d, 0x03, 0xfc, 0x77, 0x93, 0xd9, 0x49, 0x42, 0xf8, 0x8a, 0x1c, 0x72, 0xbb, 0x7b, 0x61, 0x14, 0x51, 0xd5 }, - { 0xcf, 0x92, 0x77, 0xce, 0xea, 0x50, 0x1a, 0x49, - 0x66, 0x04, 0x3e, 0xf2, 0xb0, 0xf8, 0x86, 0x2a, - 0xc9, 0x00, 0x93, 0x89, 0x78, 0x08, 0x26, 0x22, - 0xc5, 0x7a, 0x50, 0x07, 0xc9, 0xc6, 0x53, 0x9d }, { 0xcf, 0xa0, 0xc0, 0x0c, 0xb2, 0xfb, 0x4b, 0x85, 0x7a, 0xad, 0x22, 0xb1, 0x3a, 0x90, 0xe3, 0x46, 0xa0, 0x3e, 0x6b, 0x79, 0xab, 0xd5, 0xd2, 0x75, 0xb5, 0x43, 0x24, 0x68, 0x17, 0x92, 0xd6, 0xd1 }, - { 0xd0, 0x71, 0x14, 0xb2, 0x97, 0xb2, 0x9f, 0xa2, - 0xe0, 0xec, 0xcd, 0xf1, 0x58, 0x7c, 0x0f, 0x03, - 0xf8, 0x81, 0x63, 0x95, 0x46, 0x1d, 0x01, 0x1c, - 0x47, 0x7b, 0xd7, 0xfe, 0x83, 0x8a, 0x3d, 0x0b }, - { 0xd0, 0xc4, 0x74, 0xe4, 0x47, 0xe3, 0x38, 0xa5, - 0x4d, 0x31, 0xb3, 0xa0, 0xf4, 0x47, 0x43, 0x75, - 0x1e, 0x45, 0xcb, 0x92, 0x87, 0xa0, 0x1f, 0x2b, - 0x0a, 0x51, 0xe6, 0x4f, 0x16, 0xc9, 0xa7, 0x5c }, { 0xd0, 0xf5, 0x93, 0xc1, 0xa8, 0x1b, 0x1e, 0xf8, 0x51, 0x69, 0x81, 0xee, 0x56, 0xf1, 0xd5, 0x98, 0xa2, 0xa6, 0x03, 0x48, 0x8c, 0x67, 0x8c, 0x1b, @@ -2726,10 +2178,6 @@ 0x01, 0x71, 0xcc, 0x4a, 0x43, 0xb3, 0xca, 0xe0, 0x09, 0xb7, 0x47, 0xb9, 0xf4, 0xf8, 0x48, 0x72, 0x92, 0x27, 0xbf, 0x59, 0x02, 0xf2, 0x3e, 0x47 }, - { 0xd2, 0xc7, 0x0a, 0x4c, 0x52, 0xfb, 0xfc, 0x7b, - 0x4c, 0x2d, 0xfe, 0x94, 0xcb, 0x44, 0x50, 0x37, - 0x1e, 0x72, 0x36, 0xbd, 0xbd, 0x1c, 0x81, 0x13, - 0xff, 0x36, 0x0f, 0xa4, 0xa1, 0x58, 0x1e, 0xfc }, { 0xd2, 0xe8, 0xa1, 0x23, 0x7a, 0x93, 0xf5, 0x78, 0xd1, 0xba, 0x8f, 0x09, 0xe4, 0xff, 0x10, 0x7b, 0x62, 0x35, 0x78, 0x85, 0x42, 0xaa, 0x61, 0x83, @@ -2738,14 +2186,6 @@ 0x00, 0x13, 0x01, 0xa6, 0x32, 0xa1, 0x1d, 0x50, 0x6e, 0xa9, 0x17, 0xde, 0xed, 0xca, 0x8e, 0xd0, 0x5f, 0x9e, 0x7a, 0xf0, 0xb6, 0x08, 0x55, 0x8b }, - { 0xd3, 0xff, 0x14, 0xad, 0xd8, 0x86, 0x5f, 0xaa, - 0x9c, 0x30, 0x3a, 0xed, 0xf9, 0x34, 0x53, 0x85, - 0x49, 0x8d, 0x44, 0xe1, 0xcd, 0xe0, 0x45, 0x6f, - 0x1f, 0x33, 0xb4, 0x54, 0xc3, 0x95, 0x04, 0x58 }, - { 0xd4, 0xc3, 0xfd, 0x99, 0x41, 0x39, 0x82, 0x2a, - 0xf3, 0x4d, 0xed, 0xf2, 0xc0, 0xe6, 0x2a, 0xe5, - 0xec, 0x67, 0x28, 0xaa, 0x6e, 0xae, 0x4b, 0x65, - 0x8d, 0x93, 0xbd, 0xaf, 0x3e, 0x4a, 0x7c, 0x0c }, { 0xd5, 0x04, 0x88, 0x96, 0x86, 0x07, 0x29, 0xa8, 0xfa, 0x5d, 0x23, 0x57, 0x81, 0x2b, 0xa5, 0x6c, 0xbe, 0x84, 0xc9, 0xab, 0x7d, 0x14, 0xdf, 0x47, @@ -2770,18 +2210,10 @@ 0xaa, 0x7e, 0x87, 0x8e, 0x6a, 0x85, 0x09, 0x1b, 0xaa, 0x07, 0x8d, 0x26, 0x8b, 0xbd, 0xb4, 0x9f, 0x09, 0x67, 0x94, 0x08, 0x61, 0x2d, 0x1e, 0xfe }, - { 0xd6, 0x83, 0xd0, 0x6e, 0xb9, 0x28, 0x74, 0x43, - 0xe5, 0x01, 0xec, 0xf7, 0x1d, 0xad, 0xa6, 0x80, - 0x35, 0x88, 0x71, 0xd1, 0x2a, 0x53, 0xfb, 0xcc, - 0x44, 0x09, 0x2e, 0x76, 0x4e, 0xe5, 0xba, 0x08 }, { 0xd6, 0xd1, 0xb3, 0x5c, 0xbc, 0x12, 0xfb, 0x1c, 0x70, 0xa0, 0xb4, 0x3b, 0xa5, 0x9a, 0xb3, 0xd3, 0x22, 0x5f, 0x37, 0x32, 0x64, 0xdd, 0x87, 0xfb, 0xca, 0x00, 0x61, 0xec, 0x1c, 0x4d, 0xa1, 0x1a }, - { 0xd7, 0x0e, 0xb9, 0xb3, 0xfe, 0xad, 0xd3, 0x05, - 0x3f, 0x5b, 0xbc, 0xd5, 0xbb, 0xde, 0x27, 0x48, - 0xcc, 0xcf, 0xb3, 0xe4, 0x41, 0x36, 0x7c, 0xe9, - 0x3b, 0x76, 0xcc, 0x46, 0xcc, 0xe3, 0x76, 0xc8 }, { 0xd7, 0x2c, 0x0e, 0x02, 0xa8, 0x71, 0xa9, 0xc2, 0x86, 0x7d, 0xb5, 0x13, 0x63, 0x62, 0x56, 0x98, 0x32, 0xdc, 0x3b, 0x85, 0xaa, 0x05, 0x4a, 0x6c, @@ -2794,30 +2226,10 @@ 0x4c, 0x8c, 0xef, 0xbc, 0x28, 0xf7, 0x6d, 0x93, 0x0b, 0x6c, 0x0d, 0xae, 0x09, 0xd9, 0x3d, 0x24, 0x20, 0xeb, 0x7c, 0xde, 0x20, 0x59, 0xad, 0xba }, - { 0xd8, 0x29, 0xd3, 0x8a, 0xf1, 0xc4, 0x45, 0x73, - 0x8b, 0xd8, 0x12, 0xe2, 0x8e, 0x38, 0x26, 0xb3, - 0x32, 0x27, 0x32, 0xab, 0xe0, 0x02, 0x32, 0x89, - 0xfe, 0x5a, 0x9e, 0xa6, 0x15, 0xf4, 0xf8, 0x97 }, - { 0xd8, 0x32, 0x8d, 0x2f, 0xf8, 0x7e, 0xc3, 0xe9, - 0x0b, 0x84, 0xd9, 0xa1, 0x7b, 0x1e, 0x90, 0x24, - 0xf6, 0x27, 0xc1, 0xec, 0xc3, 0x5e, 0xc7, 0xe6, - 0x71, 0xc1, 0x42, 0x92, 0xa7, 0xb8, 0x8b, 0x43 }, - { 0xd8, 0x7a, 0x9d, 0xf7, 0x19, 0x1e, 0x29, 0xc8, - 0x04, 0x1e, 0x4c, 0x19, 0x3c, 0x03, 0xa8, 0xa7, - 0x12, 0x5f, 0x16, 0x6e, 0xa6, 0xcb, 0x21, 0x1f, - 0xff, 0x4b, 0xee, 0x45, 0x0d, 0x72, 0x58, 0x09 }, - { 0xd8, 0x83, 0xdd, 0x00, 0x1c, 0x4e, 0x5c, 0x22, - 0x6e, 0xe2, 0xc1, 0xf1, 0x0a, 0x66, 0x6f, 0xa1, - 0x6e, 0x5a, 0xa9, 0x12, 0x30, 0x58, 0x38, 0xed, - 0x9c, 0xdd, 0xc1, 0x56, 0x4d, 0xc6, 0x49, 0x64 }, { 0xd9, 0x2e, 0x3e, 0xe3, 0x82, 0xc8, 0xdc, 0xaf, 0xa0, 0x39, 0x3d, 0x9f, 0x9a, 0x00, 0xbf, 0x4c, 0xd9, 0xd5, 0x64, 0x26, 0x2b, 0x18, 0x0f, 0x68, 0x16, 0x0b, 0x20, 0x34, 0xc5, 0x44, 0xd1, 0x0a }, - { 0xd9, 0x41, 0x01, 0xb0, 0xdf, 0x02, 0xcd, 0xfe, - 0xea, 0xd5, 0x21, 0xd0, 0xe2, 0xcf, 0x3a, 0x69, - 0x46, 0x1f, 0x82, 0x6b, 0xb7, 0xa4, 0xab, 0x50, - 0xba, 0x36, 0xa3, 0xc1, 0xf8, 0x3a, 0x52, 0xc4 }, { 0xd9, 0x65, 0xf7, 0x41, 0x62, 0x04, 0xda, 0x83, 0x1a, 0xf6, 0x6b, 0xfa, 0x8f, 0x90, 0xd1, 0x41, 0xe9, 0x93, 0xf0, 0x00, 0x21, 0x33, 0xf2, 0x8d, @@ -2842,18 +2254,10 @@ 0x8e, 0x3c, 0x4d, 0x3d, 0x11, 0x84, 0x99, 0x42, 0x26, 0x17, 0x93, 0x49, 0xda, 0xf1, 0x79, 0x5b, 0x77, 0x39, 0x3e, 0x2d, 0xd9, 0x87, 0xbb, 0x43 }, - { 0xdb, 0x57, 0x78, 0x2a, 0x14, 0xe1, 0x3c, 0x3b, - 0xe5, 0x38, 0x9a, 0x26, 0x08, 0x1c, 0x99, 0x8b, - 0x5f, 0xfa, 0x67, 0xdd, 0x45, 0x97, 0xf8, 0xca, - 0x67, 0xef, 0x10, 0x6a, 0xd7, 0x5f, 0x34, 0x9f }, { 0xdb, 0xa2, 0x21, 0xc2, 0xab, 0x44, 0xb5, 0x2c, 0x0b, 0x83, 0x36, 0xc4, 0x69, 0xfa, 0xa8, 0x56, 0xd6, 0xc3, 0xec, 0xdc, 0x6c, 0x24, 0x6b, 0xe3, 0xca, 0xc7, 0xe0, 0xf6, 0x28, 0x4b, 0x5b, 0xda }, - { 0xdc, 0x90, 0x90, 0x55, 0x0c, 0x93, 0x42, 0xe2, - 0xfa, 0xe2, 0x42, 0x26, 0xa4, 0xf9, 0xb3, 0xf6, - 0x93, 0xf4, 0xd1, 0x46, 0x52, 0x79, 0xc3, 0x7b, - 0x46, 0x14, 0x38, 0xf4, 0xf5, 0x3c, 0x0e, 0x0b }, { 0xdc, 0xb2, 0x1d, 0xef, 0x3c, 0x26, 0x0b, 0x20, 0x50, 0xf3, 0x4c, 0x5f, 0x51, 0xbe, 0x30, 0x9c, 0x3c, 0x76, 0x36, 0x30, 0x6d, 0x51, 0xb9, 0xbe, @@ -2882,22 +2286,10 @@ 0x22, 0x5c, 0x1b, 0xba, 0x5f, 0xb4, 0xd8, 0x90, 0xc8, 0xe5, 0xc0, 0x35, 0xe4, 0x85, 0x27, 0x52, 0xb6, 0x69, 0xb0, 0x40, 0x0f, 0x24, 0xf1, 0x74 }, - { 0xdf, 0x12, 0x39, 0x4e, 0x73, 0xcb, 0x8c, 0x95, - 0xc5, 0x7e, 0x49, 0x8b, 0x96, 0xff, 0x65, 0x2c, - 0x06, 0xac, 0x62, 0xa9, 0xa8, 0xed, 0x83, 0x85, - 0x39, 0x93, 0xdc, 0xbd, 0xeb, 0xc0, 0x16, 0xaa }, { 0xdf, 0x30, 0xbf, 0x8d, 0x1b, 0xf9, 0x37, 0x8e, 0x43, 0x3e, 0xf9, 0xe1, 0xb3, 0xa2, 0x28, 0xa0, 0x7e, 0x36, 0x58, 0xa5, 0xbc, 0x43, 0x88, 0x23, 0x45, 0x4d, 0xb0, 0x6a, 0x67, 0x94, 0x4c, 0x6e }, - { 0xdf, 0x51, 0x6d, 0xa3, 0xc8, 0x2d, 0x2d, 0x71, - 0x17, 0x77, 0x76, 0x59, 0xcc, 0x9d, 0xbe, 0x7c, - 0xec, 0x22, 0x70, 0x8f, 0x22, 0x59, 0x47, 0x6f, - 0xfc, 0x48, 0x60, 0x34, 0x94, 0xfc, 0x87, 0xd3 }, - { 0xdf, 0xfb, 0x15, 0x21, 0xaa, 0x2d, 0x83, 0x65, - 0x9a, 0x85, 0x8e, 0x14, 0x62, 0x82, 0x43, 0xd7, - 0x23, 0x14, 0x5e, 0xa8, 0x13, 0x77, 0xde, 0xd7, - 0x99, 0x1a, 0x3c, 0x00, 0xa3, 0x88, 0x9b, 0xf5 }, { 0xe0, 0x0b, 0xd7, 0x86, 0xd1, 0xf2, 0xf4, 0x46, 0xc4, 0xba, 0x83, 0x99, 0xd4, 0xd8, 0xd5, 0xa0, 0xd1, 0x98, 0x57, 0x8f, 0x42, 0x99, 0xfd, 0xfd, @@ -2906,10 +2298,6 @@ 0x1a, 0x33, 0x01, 0x7a, 0x9a, 0xc2, 0x5d, 0xda, 0xfb, 0x5e, 0xa1, 0x12, 0xc9, 0x56, 0xb0, 0x02, 0xfe, 0x6c, 0x79, 0x80, 0x14, 0xaa, 0x90, 0x65 }, - { 0xe0, 0xa9, 0xd9, 0x63, 0x6e, 0xfa, 0x36, 0xa7, - 0x72, 0xac, 0xb5, 0xd0, 0x22, 0xfc, 0xa9, 0x73, - 0x71, 0xb4, 0x4f, 0x7b, 0x80, 0x4b, 0x03, 0x97, - 0xfb, 0x6c, 0x37, 0x1a, 0x22, 0x5b, 0xda, 0x78 }, { 0xe0, 0xdd, 0xe1, 0x29, 0xd2, 0x60, 0xc3, 0xda, 0xb6, 0x91, 0xd8, 0x1d, 0xab, 0xad, 0x73, 0x4c, 0x9a, 0xdc, 0x61, 0xd2, 0x0c, 0x1a, 0xe1, 0xb6, @@ -2938,10 +2326,6 @@ 0xd7, 0xb0, 0xca, 0x1f, 0x89, 0xf0, 0x8e, 0x25, 0xa7, 0x95, 0xe8, 0xb6, 0x04, 0x36, 0x8b, 0xa0, 0x78, 0x69, 0x68, 0x46, 0x8c, 0x18, 0xc3, 0xf0 }, - { 0xe2, 0xde, 0x18, 0x3e, 0xae, 0x35, 0x4c, 0xcf, - 0x68, 0xf2, 0x52, 0x56, 0x76, 0xd7, 0x26, 0x46, - 0x06, 0x01, 0x38, 0x43, 0xac, 0xb1, 0xfb, 0xff, - 0xa0, 0x22, 0x99, 0xa7, 0x4e, 0xa0, 0xdf, 0x62 }, { 0xe2, 0xf3, 0x9a, 0x9d, 0x48, 0xa3, 0x22, 0x10, 0x55, 0xb3, 0xc8, 0xa3, 0xeb, 0x14, 0x39, 0xd6, 0xb8, 0x73, 0x01, 0x3e, 0xe4, 0xd0, 0x97, 0x12, @@ -2958,18 +2342,10 @@ 0xb1, 0xaa, 0xfd, 0x10, 0x81, 0x27, 0xa2, 0xf0, 0xa8, 0xfb, 0x6d, 0xa8, 0x5a, 0x04, 0x14, 0xad, 0x24, 0x99, 0x47, 0xc4, 0x8d, 0x24, 0x92, 0xc5 }, - { 0xe5, 0x3c, 0x7e, 0xa6, 0xb1, 0x2d, 0x3e, 0xca, - 0xbf, 0xb0, 0x2f, 0xe4, 0x88, 0x56, 0xe6, 0x38, - 0xbd, 0x0c, 0x6f, 0xeb, 0x35, 0x75, 0x7c, 0x19, - 0xae, 0xfa, 0x3d, 0x51, 0x92, 0x17, 0xe2, 0x9e }, { 0xe5, 0xf1, 0x20, 0xb8, 0x78, 0x63, 0x43, 0x1a, 0xd8, 0x34, 0xd8, 0x47, 0x94, 0x86, 0x4a, 0x90, 0x0e, 0x39, 0x30, 0xe0, 0xce, 0xce, 0xa1, 0x4b, 0x0d, 0x31, 0x33, 0xa9, 0x87, 0x74, 0x48, 0x89 }, - { 0xe6, 0x17, 0x7c, 0x86, 0xb8, 0x35, 0x58, 0x0a, - 0x7a, 0x09, 0x50, 0x34, 0x78, 0x98, 0xab, 0x63, - 0xaf, 0x11, 0xec, 0x99, 0x60, 0x64, 0x45, 0x4c, - 0x04, 0x62, 0xbe, 0x5d, 0x4e, 0xd5, 0x22, 0x48 }, { 0xe6, 0x44, 0xd1, 0x1c, 0x37, 0x07, 0x0f, 0x89, 0x69, 0x33, 0x08, 0x17, 0x8d, 0x6b, 0xe4, 0x95, 0x94, 0x96, 0x92, 0xc1, 0xfb, 0xeb, 0x30, 0xed, @@ -2978,10 +2354,6 @@ 0xbb, 0xa3, 0x7a, 0x2b, 0xf2, 0xe2, 0xc7, 0x2a, 0x1e, 0x53, 0x9c, 0x60, 0x30, 0xf3, 0xcf, 0x9b, 0xbe, 0x5e, 0x79, 0x72, 0x8d, 0x68, 0x64, 0x78 }, - { 0xe6, 0xc9, 0x32, 0x43, 0x98, 0x7b, 0x3b, 0xb2, - 0x8a, 0xb8, 0x6f, 0xdd, 0x6b, 0xf4, 0xd9, 0xa5, - 0x94, 0xf8, 0xd5, 0xbc, 0xe3, 0xb2, 0xf6, 0xaf, - 0x51, 0x97, 0x15, 0x53, 0x08, 0xc6, 0x03, 0x2d }, { 0xe6, 0xe5, 0x4d, 0xe7, 0xb4, 0x97, 0x54, 0xd3, 0x57, 0xb0, 0xa8, 0xd9, 0x4a, 0x4d, 0x4f, 0x80, 0xac, 0xd1, 0x99, 0x4c, 0xcc, 0x1c, 0x99, 0x08, @@ -3002,10 +2374,6 @@ 0x36, 0x37, 0x3d, 0xcd, 0x2d, 0x4b, 0x21, 0xb7, 0x6a, 0x7c, 0x06, 0x6d, 0xf5, 0x52, 0x6e, 0x88, 0x8b, 0x6e, 0xed, 0x09, 0xa9, 0xee, 0xd0, 0x62 }, - { 0xe8, 0xa6, 0x09, 0xec, 0x44, 0xf9, 0x3c, 0x12, - 0xe0, 0x81, 0xe5, 0x94, 0x3b, 0x5e, 0xa0, 0x48, - 0x68, 0x14, 0x48, 0x33, 0x32, 0x5d, 0xaa, 0x64, - 0x4f, 0x3f, 0x9f, 0xb7, 0x6a, 0xa2, 0x77, 0xc8 }, { 0xe9, 0xd4, 0x98, 0x51, 0xbf, 0x78, 0x37, 0x6d, 0x54, 0x08, 0x2d, 0x1e, 0xb8, 0x2b, 0xd2, 0xdc, 0x96, 0x82, 0x07, 0x09, 0xb7, 0x77, 0x2d, 0x3f, @@ -3082,18 +2450,10 @@ 0x5f, 0x7f, 0x0f, 0x5b, 0xf8, 0x72, 0xb1, 0xac, 0x56, 0x5e, 0xc6, 0xf1, 0x9d, 0xb5, 0x17, 0xba, 0x4e, 0xd7, 0x55, 0xc4, 0x18, 0x5f, 0x69, 0xe8 }, - { 0xee, 0x35, 0x71, 0x37, 0x61, 0x52, 0x7a, 0xe4, - 0x8e, 0x7e, 0x40, 0x94, 0xb2, 0xb9, 0x1d, 0x3d, - 0xd2, 0x64, 0x3f, 0x38, 0xe2, 0x6d, 0x34, 0x36, - 0x36, 0x52, 0xfe, 0x5c, 0x2b, 0xbc, 0x41, 0x6b }, { 0xef, 0x36, 0xa2, 0x29, 0x89, 0x65, 0xe4, 0x98, 0x84, 0x59, 0xb9, 0x21, 0x6a, 0xb3, 0x3c, 0x3c, 0xa8, 0x42, 0xd2, 0x16, 0x83, 0xb6, 0x2a, 0x2b, 0xf1, 0x53, 0x0d, 0x30, 0xb0, 0xae, 0x78, 0x25 }, - { 0xef, 0x6d, 0xe0, 0xc4, 0x85, 0x70, 0xbd, 0x71, - 0x51, 0x6b, 0xf6, 0x39, 0x5d, 0xbd, 0x29, 0x33, - 0x7c, 0xfc, 0xb7, 0xd4, 0x26, 0x64, 0x10, 0xa1, - 0xf5, 0xda, 0x08, 0x08, 0xe0, 0x96, 0xf4, 0x55 }, { 0xef, 0xaf, 0xca, 0x84, 0x90, 0x30, 0x7b, 0x0f, 0x62, 0x2b, 0xf4, 0x3a, 0x0e, 0xb3, 0xc5, 0x1a, 0xcb, 0xdd, 0xde, 0xdc, 0x23, 0x92, 0xf1, 0x61, @@ -3126,22 +2486,10 @@ 0x97, 0xe1, 0x84, 0xea, 0x7d, 0x22, 0xf8, 0xee, 0x4a, 0x81, 0xd0, 0x56, 0x95, 0xab, 0x08, 0xd2, 0x5d, 0x4a, 0x73, 0x3b, 0x60, 0xb4, 0x70, 0xdf }, - { 0xf1, 0x4b, 0xf7, 0x41, 0x19, 0x15, 0xef, 0x83, - 0x96, 0xcc, 0x04, 0x0a, 0x6f, 0x30, 0x12, 0xbd, - 0x81, 0x8c, 0x11, 0x9d, 0x03, 0x98, 0xce, 0xd6, - 0x1d, 0x80, 0x9e, 0xf9, 0x4b, 0xd8, 0x62, 0xd8 }, { 0xf1, 0x9a, 0xe4, 0x7d, 0x93, 0x67, 0x16, 0x52, 0x78, 0xe1, 0x66, 0xed, 0x44, 0xff, 0xc3, 0x7e, 0x5b, 0x28, 0x19, 0x6c, 0x01, 0x4b, 0xf1, 0x18, 0xcf, 0xc6, 0x4e, 0xd5, 0xfa, 0x18, 0x19, 0x4d }, - { 0xf1, 0xb5, 0xf4, 0xb2, 0x1e, 0xa3, 0x2d, 0x06, - 0x26, 0xaa, 0x5a, 0x6b, 0xf5, 0xc4, 0xde, 0x59, - 0x1c, 0xf1, 0x65, 0x0f, 0xa8, 0x22, 0xf1, 0x34, - 0xd9, 0x2d, 0x54, 0x8f, 0x15, 0x77, 0x73, 0xd6 }, - { 0xf2, 0x54, 0x76, 0xf3, 0xab, 0x8e, 0x5e, 0x0b, - 0x9b, 0xb6, 0x1d, 0x4c, 0xe4, 0x50, 0x7f, 0xa3, - 0x52, 0x93, 0xc6, 0x64, 0x15, 0xd7, 0xd1, 0x91, - 0x9b, 0x29, 0xbb, 0x8c, 0xbf, 0xfd, 0xa5, 0x00 }, { 0xf2, 0xb1, 0x95, 0x84, 0x6e, 0xe2, 0xb9, 0xab, 0x5f, 0x18, 0xe6, 0x80, 0x21, 0xf8, 0xdf, 0x7c, 0x0b, 0x60, 0x58, 0xde, 0xde, 0x86, 0xc5, 0xd5, @@ -3158,22 +2506,10 @@ 0x5f, 0x07, 0x09, 0x6a, 0xf4, 0xb8, 0xbe, 0xdc, 0x16, 0x3c, 0x0f, 0x6e, 0xd5, 0x34, 0x6e, 0xfc, 0x28, 0xe8, 0xcf, 0xaf, 0x84, 0x2f, 0xa5, 0xd9 }, - { 0xf3, 0x25, 0x58, 0x52, 0x53, 0xd2, 0x8e, 0x72, - 0x02, 0x3f, 0x04, 0xda, 0x0a, 0x2c, 0xb5, 0x0f, - 0xbd, 0x4b, 0x75, 0xc2, 0x5a, 0x3a, 0x80, 0x25, - 0x3f, 0x70, 0x36, 0xce, 0x71, 0x74, 0x1b, 0x9b }, - { 0xf3, 0x5f, 0xe6, 0x61, 0xd1, 0x88, 0x65, 0x29, - 0x35, 0xe2, 0xc0, 0xe5, 0x19, 0x11, 0x8f, 0x7c, - 0x4e, 0x45, 0x7b, 0x0c, 0x65, 0xc8, 0xe1, 0x4b, - 0xce, 0xdc, 0x7d, 0x4c, 0xc5, 0x1e, 0x81, 0xd0 }, { 0xf4, 0x2a, 0x12, 0xa1, 0x43, 0x57, 0xc0, 0xcf, 0x12, 0x2b, 0xbd, 0x82, 0x77, 0x69, 0xfb, 0x56, 0xdb, 0xf5, 0xb6, 0xee, 0x89, 0x4f, 0x02, 0x5b, 0x9a, 0xde, 0x25, 0x88, 0xa9, 0xb5, 0x5d, 0x9b }, - { 0xf4, 0x91, 0x32, 0x07, 0xad, 0xc7, 0x68, 0xec, - 0x7c, 0xa6, 0xb1, 0xfe, 0x03, 0xef, 0x9c, 0xf1, - 0x0b, 0x7d, 0xb6, 0x01, 0xd7, 0xf6, 0x6c, 0x10, - 0x2c, 0x84, 0xe4, 0x70, 0x92, 0x9e, 0xe4, 0xa1 }, { 0xf5, 0x82, 0xf1, 0x66, 0xb8, 0x2b, 0xed, 0x47, 0xef, 0xe3, 0x66, 0x1a, 0xa8, 0x02, 0x32, 0xfa, 0x81, 0x67, 0xd2, 0xe8, 0x97, 0x96, 0xa3, 0x66, @@ -3190,18 +2526,6 @@ 0xf5, 0xbf, 0x9f, 0xe7, 0x84, 0xe6, 0x31, 0xf7, 0x9a, 0xf3, 0x9c, 0xb1, 0x4f, 0x3a, 0xc5, 0x16, 0x11, 0xf6, 0xfe, 0x1d, 0x9d, 0x1e, 0x1c, 0xe9 }, - { 0xf6, 0x93, 0x79, 0x9b, 0xbd, 0xf1, 0xff, 0x89, - 0xba, 0x48, 0xf2, 0xbf, 0xe2, 0x8f, 0x89, 0x36, - 0x6a, 0xc3, 0xb4, 0x13, 0x54, 0x7d, 0xb8, 0x06, - 0x0d, 0xb5, 0x07, 0xab, 0xc9, 0x42, 0x0b, 0xa8 }, - { 0xf6, 0x9d, 0x95, 0x42, 0xdb, 0x97, 0xec, 0x65, - 0xbf, 0xf8, 0x45, 0x23, 0x0a, 0xdc, 0x76, 0xb0, - 0x3c, 0x15, 0x91, 0x2f, 0x6f, 0x09, 0x97, 0x32, - 0x9d, 0x5c, 0x2d, 0x14, 0xf6, 0xb2, 0x5e, 0xdf }, - { 0xf6, 0xa8, 0x1f, 0x59, 0xb1, 0x13, 0xba, 0xb9, - 0x52, 0xd6, 0x2b, 0xda, 0xb9, 0x70, 0xc8, 0xee, - 0xd9, 0xf7, 0x26, 0x22, 0xfa, 0x8a, 0xc6, 0xd8, - 0x48, 0xc3, 0xe2, 0xc6, 0x14, 0x62, 0xef, 0x95 }, { 0xf6, 0xaa, 0xef, 0x12, 0xfc, 0x25, 0x2d, 0xd9, 0xe7, 0xf7, 0x75, 0x2c, 0x2f, 0x74, 0x5d, 0x59, 0xd6, 0x37, 0x57, 0xc6, 0xcc, 0x14, 0xd2, 0x25, @@ -3210,18 +2534,6 @@ 0xa5, 0xbf, 0xd9, 0x4b, 0xb5, 0x77, 0x12, 0xa4, 0x14, 0x1e, 0xb8, 0xd0, 0x92, 0xbb, 0x2d, 0x5d, 0xd1, 0x64, 0xf6, 0x74, 0xa2, 0xe5, 0xb0, 0x64 }, - { 0xf7, 0x76, 0x3b, 0xe8, 0x7e, 0x67, 0x8b, 0x31, - 0x18, 0x66, 0x11, 0x9a, 0xd5, 0xac, 0xdf, 0x8f, - 0xdb, 0x3b, 0xbb, 0x46, 0x5b, 0x83, 0x40, 0x61, - 0x64, 0xac, 0x21, 0x30, 0x34, 0xe8, 0xad, 0x0e }, - { 0xf7, 0xd9, 0x10, 0xbc, 0xe2, 0xab, 0x1a, 0xca, - 0xa6, 0x7b, 0x66, 0x3a, 0x8a, 0xdd, 0xbd, 0xa2, - 0x93, 0xb5, 0x1c, 0xed, 0xe7, 0x86, 0x8b, 0x69, - 0xa3, 0xce, 0xa7, 0xff, 0xd0, 0x10, 0xb3, 0xa8 }, - { 0xf8, 0x0c, 0x71, 0x5b, 0x84, 0x49, 0x5d, 0xbe, - 0xda, 0xbf, 0xeb, 0x1b, 0x05, 0x7f, 0xa0, 0x80, - 0x93, 0x10, 0x5d, 0x74, 0x6f, 0x8d, 0x4f, 0x10, - 0x35, 0xd4, 0xe1, 0xd8, 0x6b, 0xe2, 0xb4, 0x80 }, { 0xf8, 0x64, 0x44, 0x3e, 0x2f, 0x63, 0x9e, 0x7c, 0xff, 0xd2, 0x42, 0x21, 0xf6, 0x1b, 0xbf, 0xf0, 0x7c, 0xce, 0x5c, 0x61, 0xdd, 0xb1, 0x68, 0xb3, @@ -3242,22 +2554,10 @@ 0xad, 0x25, 0x74, 0x25, 0xaa, 0xe7, 0x20, 0x01, 0x40, 0x05, 0xb4, 0x15, 0x91, 0x2d, 0xbb, 0x8c, 0x0b, 0xc9, 0x99, 0xaf, 0x48, 0x48, 0xcf, 0xe5 }, - { 0xf9, 0xa7, 0xdd, 0xd3, 0xff, 0x51, 0xaf, 0x30, - 0x7f, 0x95, 0x4f, 0x7b, 0x44, 0xdb, 0xd2, 0x42, - 0x83, 0xcf, 0x97, 0xb6, 0x25, 0xbe, 0x76, 0x6b, - 0x43, 0x5e, 0x6c, 0x26, 0xd9, 0xcc, 0xac, 0xc3 }, { 0xfa, 0x2a, 0x2f, 0x77, 0x8c, 0xbe, 0xf9, 0xf1, 0xb4, 0xa8, 0xfc, 0x57, 0xbf, 0x79, 0x5f, 0x1f, 0x8c, 0xf6, 0x23, 0xdb, 0x15, 0xbe, 0x65, 0x81, 0xeb, 0xa3, 0x6b, 0x2a, 0x86, 0x49, 0xd2, 0x1e }, - { 0xfa, 0x95, 0xb3, 0xf9, 0x6f, 0xc9, 0xc2, 0xd3, - 0xa7, 0x9b, 0x05, 0x48, 0x67, 0x6c, 0x18, 0x48, - 0x5a, 0xf1, 0x10, 0x4c, 0xca, 0x9b, 0xb6, 0xb8, - 0xdd, 0x9b, 0x5a, 0x54, 0x3c, 0xb6, 0xc6, 0x2e }, - { 0xfb, 0x44, 0x15, 0x70, 0x4c, 0x1d, 0x61, 0x55, - 0x10, 0x6d, 0x88, 0xf3, 0xb2, 0x0f, 0xec, 0x9f, - 0x6e, 0x82, 0x0c, 0x82, 0x24, 0xfe, 0xe3, 0x5e, - 0x45, 0x22, 0x85, 0x19, 0x05, 0xf3, 0x28, 0xd7 }, { 0xfb, 0x9a, 0xf7, 0x9d, 0xea, 0x18, 0xaf, 0x62, 0x99, 0x85, 0x0e, 0x25, 0x15, 0x9b, 0x4f, 0xb2, 0x24, 0xcb, 0xb0, 0xf1, 0x4e, 0xad, 0x7e, 0x85, @@ -3278,10 +2578,6 @@ 0x7c, 0xa2, 0xea, 0xb0, 0x84, 0x60, 0xc2, 0x8d, 0x1d, 0x6c, 0xd8, 0x9c, 0x57, 0x59, 0x94, 0x05, 0xd5, 0x37, 0x4b, 0x91, 0xaa, 0xeb, 0xc8, 0x79 }, - { 0xfc, 0x2f, 0x1e, 0x84, 0x29, 0x82, 0xc9, 0x3b, - 0x85, 0xd2, 0x79, 0xa8, 0x3d, 0xf2, 0x13, 0xc1, - 0xa3, 0x33, 0x29, 0x7d, 0x42, 0xa3, 0x1a, 0x8c, - 0xc7, 0x8a, 0x3f, 0x73, 0xcd, 0xf8, 0xaf, 0x9a }, { 0xfc, 0x4d, 0x9a, 0x37, 0xe5, 0xf7, 0x32, 0x72, 0xd0, 0xa9, 0xdf, 0xcc, 0xe9, 0x03, 0x12, 0xc7, 0x52, 0xe1, 0xb5, 0x2e, 0xb6, 0x54, 0xc4, 0x2c, @@ -3298,10 +2594,6 @@ 0x51, 0x50, 0x78, 0x57, 0xb4, 0xf0, 0x08, 0xdf, 0xd5, 0x27, 0x04, 0x2c, 0xe0, 0x45, 0x01, 0xaa, 0xe2, 0x9d, 0xd2, 0x05, 0xbb, 0xef, 0xce, 0x0d }, - { 0xfc, 0xe5, 0x47, 0xe1, 0x43, 0x54, 0x87, 0x7f, - 0xed, 0x93, 0x0b, 0x19, 0xfd, 0xe7, 0xc6, 0xf9, - 0xcb, 0xf5, 0xd4, 0xb5, 0x7b, 0xa5, 0x34, 0x4a, - 0x0d, 0x40, 0x10, 0xff, 0x70, 0x5a, 0x03, 0xde }, { 0xfc, 0xe7, 0x34, 0xe1, 0x2b, 0x8e, 0xfb, 0x43, 0x12, 0x71, 0xbf, 0xf6, 0x7a, 0x7a, 0x0a, 0x93, 0xb2, 0x19, 0xdd, 0x5e, 0x5d, 0xcc, 0x12, 0x58, @@ -3310,14 +2602,6 @@ 0xa4, 0x86, 0x15, 0xe4, 0x44, 0xce, 0xd6, 0x90, 0xfa, 0x60, 0xeb, 0xfd, 0x0a, 0x06, 0x0a, 0x49, 0x93, 0x89, 0x98, 0x8a, 0x2c, 0x2c, 0x05, 0xce }, - { 0xfd, 0x44, 0x89, 0xf0, 0x27, 0x27, 0xdb, 0x36, - 0xc1, 0x84, 0x35, 0xe5, 0xc4, 0xa9, 0xf8, 0x63, - 0xac, 0xd8, 0x04, 0xae, 0x1b, 0x39, 0x7f, 0xbb, - 0x83, 0xd4, 0x27, 0x5a, 0xf5, 0x6d, 0xf8, 0x9f }, - { 0xfd, 0x85, 0xcc, 0x72, 0x1b, 0x77, 0xc4, 0x41, - 0xc8, 0xb1, 0xf1, 0x4a, 0xde, 0x34, 0x8a, 0x3e, - 0xc9, 0xfa, 0xa6, 0x26, 0x4a, 0x91, 0x3f, 0xb8, - 0xd3, 0x4c, 0x98, 0x3b, 0x43, 0x60, 0xe9, 0x7b }, { 0xfd, 0x9c, 0xfe, 0x14, 0xda, 0xd8, 0x97, 0x8c, 0x5b, 0xc8, 0x88, 0x93, 0x8f, 0x16, 0xf3, 0xb3, 0x98, 0xf7, 0x63, 0xa3, 0xad, 0xaf, 0xaa, 0x4a, @@ -3364,34 +2648,6 @@ 0xaf, 0x3f, 0x5c, 0xf4, 0x22, 0x5a, 0x8e, 0xaf }, }; const uint8_t kCNNICEVWhitelist[][crypto::kSHA256Length] = { - { 0x23, 0x86, 0x51, 0xab, 0x70, 0xb7, 0x11, 0xa0, - 0x65, 0x55, 0x4e, 0x5d, 0x63, 0x6a, 0x34, 0x2c, - 0x8a, 0x6b, 0xfe, 0x46, 0x0e, 0x4e, 0x7b, 0x4c, - 0x9e, 0xaf, 0xb4, 0x75, 0xd5, 0x68, 0x51, 0xd8 }, - { 0x29, 0x0c, 0x79, 0x6f, 0x6d, 0x23, 0xde, 0x2a, - 0xae, 0x80, 0x77, 0xab, 0xcc, 0xfc, 0x52, 0xee, - 0x5c, 0x71, 0x35, 0x3f, 0x9a, 0xb6, 0xbd, 0x56, - 0x5c, 0x6a, 0xbd, 0x26, 0x9f, 0xf5, 0xe9, 0xba }, - { 0x34, 0x9b, 0x72, 0x1d, 0x0b, 0xb9, 0xa4, 0xc4, - 0xaa, 0x33, 0x43, 0x60, 0xa6, 0x6a, 0xc3, 0xa7, - 0x3f, 0xa8, 0xd8, 0xd3, 0x60, 0x0d, 0x89, 0x4e, - 0xb0, 0xc7, 0xd2, 0x84, 0x23, 0xc6, 0x78, 0x57 }, - { 0x63, 0x80, 0x65, 0xec, 0x95, 0xf1, 0xea, 0x81, - 0xd9, 0x5b, 0xa4, 0xdb, 0x9e, 0xa9, 0xa2, 0xef, - 0xe2, 0xd6, 0xcd, 0x78, 0x75, 0x88, 0x67, 0x04, - 0x5c, 0x06, 0xb6, 0x48, 0xa5, 0xda, 0x89, 0xb2 }, - { 0x80, 0xf3, 0xeb, 0x58, 0xea, 0x6a, 0xa2, 0x85, - 0x11, 0xb0, 0x9b, 0x68, 0xf2, 0xde, 0xf9, 0xb4, - 0xaf, 0xa9, 0x9c, 0x97, 0x44, 0xc0, 0xbe, 0x4e, - 0x23, 0x94, 0x89, 0xf0, 0x4f, 0x75, 0xa3, 0xa5 }, - { 0x82, 0x33, 0xde, 0x42, 0x18, 0xe4, 0xef, 0x19, - 0x38, 0xe6, 0xa8, 0xa3, 0x8a, 0xb0, 0xbc, 0x1a, - 0x96, 0x4b, 0xa5, 0x76, 0x1a, 0x52, 0x99, 0x50, - 0x22, 0x15, 0x0c, 0x86, 0x02, 0x6b, 0x90, 0xc9 }, - { 0x8c, 0xcd, 0x79, 0x41, 0x63, 0x00, 0xca, 0x61, - 0xee, 0x56, 0xa6, 0x0d, 0xa1, 0xc8, 0x09, 0x35, - 0xb8, 0x6e, 0x27, 0x91, 0x93, 0xad, 0x3d, 0x05, - 0x65, 0x72, 0x9d, 0x69, 0xe0, 0x8c, 0x86, 0x96 }, { 0x9f, 0xfa, 0x4e, 0xf4, 0xfc, 0xf2, 0xcf, 0xd1, 0xb2, 0x7c, 0x6a, 0x62, 0xe3, 0xc4, 0x23, 0x5b, 0xd8, 0x3c, 0xc5, 0xe0, 0x06, 0xe9, 0x2a, 0x55,
diff --git a/net/cert/cert_verify_result.cc b/net/cert/cert_verify_result.cc index 2a41893..7a1082e 100644 --- a/net/cert/cert_verify_result.cc +++ b/net/cert/cert_verify_result.cc
@@ -12,6 +12,8 @@ Reset(); } +CertVerifyResult::CertVerifyResult(const CertVerifyResult& other) = default; + CertVerifyResult::~CertVerifyResult() { }
diff --git a/net/cert/cert_verify_result.h b/net/cert/cert_verify_result.h index 1f81da2..1cfb8fa5 100644 --- a/net/cert/cert_verify_result.h +++ b/net/cert/cert_verify_result.h
@@ -20,6 +20,7 @@ class NET_EXPORT CertVerifyResult { public: CertVerifyResult(); + CertVerifyResult(const CertVerifyResult& other); ~CertVerifyResult(); void Reset();
diff --git a/net/cert/ct_verify_result.cc b/net/cert/ct_verify_result.cc index b323040a..de5bea0d 100644 --- a/net/cert/ct_verify_result.cc +++ b/net/cert/ct_verify_result.cc
@@ -16,6 +16,8 @@ ct::CertPolicyCompliance::CERT_POLICY_COMPLIES_VIA_SCTS), ev_policy_compliance(ct::EVPolicyCompliance::EV_POLICY_DOES_NOT_APPLY) {} +CTVerifyResult::CTVerifyResult(const CTVerifyResult& other) = default; + CTVerifyResult::~CTVerifyResult() {} } // namespace ct
diff --git a/net/cert/ct_verify_result.h b/net/cert/ct_verify_result.h index f2cdd13..ca16358 100644 --- a/net/cert/ct_verify_result.h +++ b/net/cert/ct_verify_result.h
@@ -24,6 +24,7 @@ // connection. struct NET_EXPORT CTVerifyResult { CTVerifyResult(); + CTVerifyResult(const CTVerifyResult& other); ~CTVerifyResult(); // SCTs from known logs where the signature verified correctly.
diff --git a/net/cert/multi_threaded_cert_verifier.cc b/net/cert/multi_threaded_cert_verifier.cc index 23f1d87..714b291 100644 --- a/net/cert/multi_threaded_cert_verifier.cc +++ b/net/cert/multi_threaded_cert_verifier.cc
@@ -497,6 +497,9 @@ hash_values.push_back(additional_trust_anchors[i]->fingerprint()); } +MultiThreadedCertVerifier::RequestParams::RequestParams( + const RequestParams& other) = default; + MultiThreadedCertVerifier::RequestParams::~RequestParams() {} bool MultiThreadedCertVerifier::RequestParams::operator<(
diff --git a/net/cert/multi_threaded_cert_verifier.h b/net/cert/multi_threaded_cert_verifier.h index 30234ff9..83d00dd 100644 --- a/net/cert/multi_threaded_cert_verifier.h +++ b/net/cert/multi_threaded_cert_verifier.h
@@ -92,6 +92,7 @@ const std::string& ocsp_response_arg, int flags_arg, const CertificateList& additional_trust_anchors); + RequestParams(const RequestParams& other); ~RequestParams(); bool operator<(const RequestParams& other) const;
diff --git a/net/cert/nss_cert_database.cc b/net/cert/nss_cert_database.cc index 53ea7c7..e85ce3ba 100644 --- a/net/cert/nss_cert_database.cc +++ b/net/cert/nss_cert_database.cc
@@ -78,6 +78,9 @@ int err) : certificate(cert), net_error(err) {} +NSSCertDatabase::ImportCertFailure::ImportCertFailure( + const ImportCertFailure& other) = default; + NSSCertDatabase::ImportCertFailure::~ImportCertFailure() {} NSSCertDatabase::NSSCertDatabase(crypto::ScopedPK11Slot public_slot,
diff --git a/net/cert/nss_cert_database.h b/net/cert/nss_cert_database.h index ff96af0..de783eb4 100644 --- a/net/cert/nss_cert_database.h +++ b/net/cert/nss_cert_database.h
@@ -65,6 +65,7 @@ struct NET_EXPORT ImportCertFailure { public: ImportCertFailure(const scoped_refptr<X509Certificate>& cert, int err); + ImportCertFailure(const ImportCertFailure& other); ~ImportCertFailure(); scoped_refptr<X509Certificate> certificate;
diff --git a/net/cookies/canonical_cookie.cc b/net/cookies/canonical_cookie.cc index cdd011f..fff3fa44 100644 --- a/net/cookies/canonical_cookie.cc +++ b/net/cookies/canonical_cookie.cc
@@ -176,6 +176,8 @@ domain_ = cookie_domain; } +CanonicalCookie::CanonicalCookie(const CanonicalCookie& other) = default; + CanonicalCookie::~CanonicalCookie() { }
diff --git a/net/cookies/canonical_cookie.h b/net/cookies/canonical_cookie.h index fbca57fa..6f43d9e 100644 --- a/net/cookies/canonical_cookie.h +++ b/net/cookies/canonical_cookie.h
@@ -46,6 +46,8 @@ // in which pre-validation of the ParsedCookie has not been done. CanonicalCookie(const GURL& url, const ParsedCookie& pc); + CanonicalCookie(const CanonicalCookie& other); + ~CanonicalCookie(); // Supports the default copy constructor.
diff --git a/net/disk_cache/blockfile/index_table_v3.cc b/net/disk_cache/blockfile/index_table_v3.cc index 9c24e80..9dca3de 100644 --- a/net/disk_cache/blockfile/index_table_v3.cc +++ b/net/disk_cache/blockfile/index_table_v3.cc
@@ -403,6 +403,8 @@ EntrySet::EntrySet() : evicted_count(0), current(0) { } +EntrySet::EntrySet(const EntrySet& other) = default; + EntrySet::~EntrySet() { }
diff --git a/net/disk_cache/blockfile/index_table_v3.h b/net/disk_cache/blockfile/index_table_v3.h index 78122c8..001b438 100644 --- a/net/disk_cache/blockfile/index_table_v3.h +++ b/net/disk_cache/blockfile/index_table_v3.h
@@ -110,6 +110,7 @@ // Keeps a collection of EntryCells in order to be processed. struct NET_EXPORT_PRIVATE EntrySet { EntrySet(); + EntrySet(const EntrySet& other); ~EntrySet(); int evicted_count; // The numebr of evicted entries in this set.
diff --git a/net/dns/dns_config_service.cc b/net/dns/dns_config_service.cc index 83c8944e..e58fdfad 100644 --- a/net/dns/dns_config_service.cc +++ b/net/dns/dns_config_service.cc
@@ -107,6 +107,8 @@ edns0(false), use_local_ipv6(false) {} +DnsConfig::DnsConfig(const DnsConfig& other) = default; + DnsConfig::~DnsConfig() {} bool DnsConfig::Equals(const DnsConfig& d) const {
diff --git a/net/dns/dns_config_service.h b/net/dns/dns_config_service.h index fbbdb41..1053e86 100644 --- a/net/dns/dns_config_service.h +++ b/net/dns/dns_config_service.h
@@ -66,6 +66,7 @@ // DnsConfig stores configuration of the system resolver. struct NET_EXPORT_PRIVATE DnsConfig { DnsConfig(); + DnsConfig(const DnsConfig& other); virtual ~DnsConfig(); bool Equals(const DnsConfig& d) const;
diff --git a/net/dns/host_resolver_impl.cc b/net/dns/host_resolver_impl.cc index 93750ffc..af91b09 100644 --- a/net/dns/host_resolver_impl.cc +++ b/net/dns/host_resolver_impl.cc
@@ -1854,6 +1854,9 @@ max_retry_attempts = kDefaultMaxRetryAttempts; } +HostResolverImpl::ProcTaskParams::ProcTaskParams(const ProcTaskParams& other) = + default; + HostResolverImpl::ProcTaskParams::~ProcTaskParams() {} HostResolverImpl::HostResolverImpl(const Options& options, NetLog* net_log)
diff --git a/net/dns/host_resolver_impl.h b/net/dns/host_resolver_impl.h index 245bde2..aa76363 100644 --- a/net/dns/host_resolver_impl.h +++ b/net/dns/host_resolver_impl.h
@@ -82,6 +82,8 @@ // Sets up defaults. ProcTaskParams(HostResolverProc* resolver_proc, size_t max_retry_attempts); + ProcTaskParams(const ProcTaskParams& other); + ~ProcTaskParams(); // The procedure to use for resolving host names. This will be NULL, except
diff --git a/net/ftp/ftp_ctrl_response_buffer.cc b/net/ftp/ftp_ctrl_response_buffer.cc index 064068e..8dd631b 100644 --- a/net/ftp/ftp_ctrl_response_buffer.cc +++ b/net/ftp/ftp_ctrl_response_buffer.cc
@@ -20,6 +20,8 @@ FtpCtrlResponse::FtpCtrlResponse() : status_code(kInvalidStatusCode) {} +FtpCtrlResponse::FtpCtrlResponse(const FtpCtrlResponse& other) = default; + FtpCtrlResponse::~FtpCtrlResponse() {} FtpCtrlResponseBuffer::FtpCtrlResponseBuffer(const BoundNetLog& net_log) @@ -112,6 +114,9 @@ status_code(FtpCtrlResponse::kInvalidStatusCode) { } +FtpCtrlResponseBuffer::ParsedLine::ParsedLine(const ParsedLine& other) = + default; + // static FtpCtrlResponseBuffer::ParsedLine FtpCtrlResponseBuffer::ParseLine( const std::string& line) {
diff --git a/net/ftp/ftp_ctrl_response_buffer.h b/net/ftp/ftp_ctrl_response_buffer.h index ae90fea5..b53b7a91 100644 --- a/net/ftp/ftp_ctrl_response_buffer.h +++ b/net/ftp/ftp_ctrl_response_buffer.h
@@ -19,6 +19,7 @@ static const int kInvalidStatusCode; FtpCtrlResponse(); + FtpCtrlResponse(const FtpCtrlResponse& other); ~FtpCtrlResponse(); int status_code; // Three-digit status code. @@ -44,6 +45,7 @@ private: struct ParsedLine { ParsedLine(); + ParsedLine(const ParsedLine& other); // Indicates that this line begins with a valid 3-digit status code. bool has_status_code;
diff --git a/net/http/OWNERS b/net/http/OWNERS new file mode 100644 index 0000000..60482fc1 --- /dev/null +++ b/net/http/OWNERS
@@ -0,0 +1,2 @@ +per-file transport_security_state_static.*=lgarron@chromium.org +per-file transport_security_state_static.*=palmer@chromium.org \ No newline at end of file
diff --git a/net/http/http_auth_cache.cc b/net/http/http_auth_cache.cc index d76d3ed40..7a3a4e0 100644 --- a/net/http/http_auth_cache.cc +++ b/net/http/http_auth_cache.cc
@@ -180,6 +180,8 @@ return entry; } +HttpAuthCache::Entry::Entry(const Entry& other) = default; + HttpAuthCache::Entry::~Entry() { }
diff --git a/net/http/http_auth_cache.h b/net/http/http_auth_cache.h index 53b998f..9190e42 100644 --- a/net/http/http_auth_cache.h +++ b/net/http/http_auth_cache.h
@@ -31,6 +31,7 @@ public: class NET_EXPORT_PRIVATE Entry { public: + Entry(const Entry& other); ~Entry(); const GURL& origin() const {
diff --git a/net/http/http_basic_stream.cc b/net/http/http_basic_stream.cc index 6b08d13e..0dd7a9e 100644 --- a/net/http/http_basic_stream.cc +++ b/net/http/http_basic_stream.cc
@@ -122,7 +122,8 @@ // |drainer| will delete itself. } -void HttpBasicStream::PopulateNetErrorDetails(NetErrorDetails* /*details*/) { +void HttpBasicStream::PopulateNetErrorDetails(NetErrorDetails* details) { + details->connection_info = HttpResponseInfo::CONNECTION_INFO_HTTP1; return; }
diff --git a/net/http/http_network_session.cc b/net/http/http_network_session.cc index 7337d4f8..509a0a74 100644 --- a/net/http/http_network_session.cc +++ b/net/http/http_network_session.cc
@@ -136,6 +136,8 @@ quic_supported_versions.push_back(QUIC_VERSION_27); } +HttpNetworkSession::Params::Params(const Params& other) = default; + HttpNetworkSession::Params::~Params() {} // TODO(mbelshe): Move the socket factories into HttpStreamFactory.
diff --git a/net/http/http_network_session.h b/net/http/http_network_session.h index 5e4ac4e..30cec77 100644 --- a/net/http/http_network_session.h +++ b/net/http/http_network_session.h
@@ -64,6 +64,7 @@ public: struct NET_EXPORT Params { Params(); + Params(const Params& other); ~Params(); ClientSocketFactory* client_socket_factory;
diff --git a/net/http/http_request_headers.cc b/net/http/http_request_headers.cc index 4e2ae0e..71710cd 100644 --- a/net/http/http_request_headers.cc +++ b/net/http/http_request_headers.cc
@@ -70,6 +70,8 @@ } HttpRequestHeaders::HttpRequestHeaders() {} +HttpRequestHeaders::HttpRequestHeaders(const HttpRequestHeaders& other) = + default; HttpRequestHeaders::~HttpRequestHeaders() {} bool HttpRequestHeaders::GetHeader(const base::StringPiece& key,
diff --git a/net/http/http_request_headers.h b/net/http/http_request_headers.h index db70004..c500d8c3 100644 --- a/net/http/http_request_headers.h +++ b/net/http/http_request_headers.h
@@ -81,6 +81,7 @@ static const char kUserAgent[]; HttpRequestHeaders(); + HttpRequestHeaders(const HttpRequestHeaders& other); ~HttpRequestHeaders(); bool IsEmpty() const { return headers_.empty(); }
diff --git a/net/http/http_request_info.cc b/net/http/http_request_info.cc index 794aa1c..d51d3d0 100644 --- a/net/http/http_request_info.cc +++ b/net/http/http_request_info.cc
@@ -13,6 +13,8 @@ privacy_mode(PRIVACY_MODE_DISABLED) { } +HttpRequestInfo::HttpRequestInfo(const HttpRequestInfo& other) = default; + HttpRequestInfo::~HttpRequestInfo() {} } // namespace net
diff --git a/net/http/http_request_info.h b/net/http/http_request_info.h index 0c4c09d..2079f19 100644 --- a/net/http/http_request_info.h +++ b/net/http/http_request_info.h
@@ -28,6 +28,7 @@ }; HttpRequestInfo(); + HttpRequestInfo(const HttpRequestInfo& other); ~HttpRequestInfo(); // The requested URL.
diff --git a/net/http/http_util.cc b/net/http/http_util.cc index 6192c89..940ee80 100644 --- a/net/http/http_util.cc +++ b/net/http/http_util.cc
@@ -867,6 +867,8 @@ values_.set_quote_chars("\'\""); } +HttpUtil::ValuesIterator::ValuesIterator(const ValuesIterator& other) = default; + HttpUtil::ValuesIterator::~ValuesIterator() { } @@ -903,6 +905,9 @@ char delimiter) : NameValuePairsIterator(begin, end, delimiter, VALUES_NOT_OPTIONAL) {} +HttpUtil::NameValuePairsIterator::NameValuePairsIterator( + const NameValuePairsIterator& other) = default; + HttpUtil::NameValuePairsIterator::~NameValuePairsIterator() {} // We expect properties to be formatted as one of:
diff --git a/net/http/http_util.h b/net/http/http_util.h index 13209b8..7e713103 100644 --- a/net/http/http_util.h +++ b/net/http/http_util.h
@@ -291,6 +291,7 @@ ValuesIterator(std::string::const_iterator values_begin, std::string::const_iterator values_end, char delimiter); + ValuesIterator(const ValuesIterator& other); ~ValuesIterator(); // Advances the iterator to the next value, if any. Returns true if there @@ -338,6 +339,8 @@ std::string::const_iterator end, char delimiter); + NameValuePairsIterator(const NameValuePairsIterator& other); + ~NameValuePairsIterator(); // Advances the iterator to the next pair, if any. Returns true if there
diff --git a/net/http/mock_gssapi_library_posix.cc b/net/http/mock_gssapi_library_posix.cc index b4d6514..ce21159 100644 --- a/net/http/mock_gssapi_library_posix.cc +++ b/net/http/mock_gssapi_library_posix.cc
@@ -226,6 +226,9 @@ } } +MockGSSAPILibrary::SecurityContextQuery::SecurityContextQuery( + const SecurityContextQuery& other) = default; + MockGSSAPILibrary::SecurityContextQuery::~SecurityContextQuery() {} MockGSSAPILibrary::MockGSSAPILibrary() {
diff --git a/net/http/mock_gssapi_library_posix.h b/net/http/mock_gssapi_library_posix.h index 3d5f248..07f2542 100644 --- a/net/http/mock_gssapi_library_posix.h +++ b/net/http/mock_gssapi_library_posix.h
@@ -52,6 +52,7 @@ const test::GssContextMockImpl& context_info, const char* expected_input_token, const char* output_token); + SecurityContextQuery(const SecurityContextQuery& other); ~SecurityContextQuery(); std::string expected_package;
diff --git a/net/http/transport_security_state.cc b/net/http/transport_security_state.cc index 4475b0df..dc6fd93 100644 --- a/net/http/transport_security_state.cc +++ b/net/http/transport_security_state.cc
@@ -1256,6 +1256,8 @@ TransportSecurityState::PKPState::PKPState() : include_subdomains(false) { } +TransportSecurityState::PKPState::PKPState(const PKPState& other) = default; + TransportSecurityState::PKPState::~PKPState() { }
diff --git a/net/http/transport_security_state.h b/net/http/transport_security_state.h index a4c52e7..bb79c8e 100644 --- a/net/http/transport_security_state.h +++ b/net/http/transport_security_state.h
@@ -110,6 +110,7 @@ class NET_EXPORT PKPState { public: PKPState(); + PKPState(const PKPState& other); ~PKPState(); // The absolute time (UTC) when the |spki_hashes| (and other state) were
diff --git a/net/http/transport_security_state_static.h b/net/http/transport_security_state_static.h index 3d215fa..99b246f 100644 --- a/net/http/transport_security_state_static.h +++ b/net/http/transport_security_state_static.h
@@ -3139,3832 +3139,3829 @@ 0xfd, 0xdf, 0x66, 0xf7, 0x21, 0xe7, 0xeb, 0x2a, 0x13, 0xcc, 0xd8, 0x9b, 0x21, 0x28, 0x64, 0x4e, 0x29, 0xf8, 0xe1, 0x0b, 0x74, 0x9c, 0x28, 0x77, 0x75, 0xab, 0x2f, 0xd9, 0xe3, 0x79, 0x2c, 0xbe, 0xe7, 0xc5, 0xa5, 0x97, - 0xc1, 0xec, 0x79, 0x65, 0xff, 0xf6, 0x19, 0x64, 0xd1, 0xb3, 0xec, 0xd3, - 0xd9, 0x65, 0x4c, 0x7e, 0x5c, 0x22, 0xa8, 0x47, 0xaf, 0x05, 0xfa, 0x4c, - 0x18, 0x4a, 0xdf, 0xfa, 0x3a, 0xfc, 0xcf, 0x78, 0xda, 0xb2, 0xfc, 0x51, - 0xb4, 0x6c, 0xb2, 0x86, 0x7c, 0xb3, 0x1e, 0xdf, 0xc3, 0x87, 0xd7, 0xe1, - 0x59, 0x76, 0x79, 0x65, 0x6c, 0x78, 0x9b, 0xcb, 0xaf, 0xff, 0xb0, 0xda, - 0x7f, 0xbf, 0x4b, 0x36, 0xd4, 0x2c, 0xbf, 0xb7, 0x33, 0x79, 0x64, 0x96, - 0x5c, 0x73, 0x2c, 0xa3, 0x3c, 0x8e, 0x98, 0xdf, 0xe3, 0x61, 0xe5, 0xc3, - 0x1a, 0xca, 0x84, 0xdd, 0xb1, 0x9f, 0xc4, 0xbc, 0x84, 0xb7, 0x48, 0x6e, - 0x0c, 0x96, 0x5f, 0xde, 0x3d, 0x6b, 0x3a, 0xb2, 0xb6, 0x3c, 0x40, 0x0b, - 0xdf, 0xe3, 0xe7, 0x9d, 0xb1, 0xb8, 0xb2, 0xff, 0xf4, 0xd2, 0x3d, 0xf1, - 0xac, 0x39, 0x07, 0x4b, 0x2b, 0x48, 0x81, 0x73, 0x5b, 0xed, 0xc3, 0x14, - 0x0b, 0x2e, 0x39, 0x2c, 0xa8, 0x37, 0x9d, 0x26, 0xbf, 0xec, 0x6f, 0x0e, - 0x7f, 0x35, 0x0b, 0x2a, 0x1b, 0xe8, 0xad, 0xa1, 0x37, 0x28, 0xd2, 0x47, - 0x2a, 0xff, 0x21, 0x7e, 0x08, 0x42, 0xfc, 0x42, 0x73, 0xda, 0xdb, 0x90, - 0xdd, 0x9a, 0x1c, 0x1a, 0x94, 0x46, 0xd9, 0x52, 0xfe, 0x94, 0x14, 0xf0, - 0x98, 0xfe, 0x14, 0x65, 0x29, 0xc3, 0x91, 0xbb, 0x76, 0x50, 0xe0, 0x61, - 0x25, 0xbe, 0x14, 0x82, 0x2f, 0x6e, 0x90, 0x5c, 0xc7, 0x56, 0x5f, 0xff, - 0xf4, 0xf1, 0x9e, 0xe3, 0x19, 0x56, 0xa7, 0xb6, 0x53, 0x7e, 0xe4, 0xf0, - 0x0c, 0xe9, 0xde, 0x9f, 0x59, 0x71, 0xc2, 0xcb, 0xd3, 0x08, 0xd5, 0x97, - 0xfd, 0x9d, 0xe6, 0x77, 0xd9, 0xfa, 0xcb, 0xfc, 0x6c, 0x39, 0x77, 0x09, - 0x65, 0x30, 0x89, 0xe7, 0x15, 0x21, 0xfe, 0x9c, 0xdc, 0xe4, 0xb2, 0xb4, - 0x7a, 0x2d, 0x3c, 0xbe, 0x8e, 0xe3, 0x56, 0x5f, 0xbb, 0x04, 0x7f, 0xac, - 0xbb, 0xef, 0x96, 0x5f, 0xb4, 0x1d, 0xff, 0x8a, 0xb2, 0xe2, 0xe2, 0xcb, - 0xfb, 0x05, 0x7f, 0xdb, 0x8b, 0x2a, 0x72, 0x34, 0xb0, 0x87, 0xe2, 0x7f, - 0x0c, 0xfe, 0x5a, 0x42, 0xd7, 0xfe, 0x86, 0x9f, 0xdc, 0x0c, 0xc1, 0x61, - 0x65, 0xf8, 0xbb, 0xec, 0x92, 0xcb, 0xb9, 0x8b, 0x28, 0xcd, 0xeb, 0x93, - 0xdf, 0xe2, 0x81, 0x67, 0xf3, 0x50, 0xb2, 0xf8, 0x87, 0x1b, 0xab, 0x2c, - 0x2c, 0xe4, 0x7b, 0xc9, 0xfc, 0x63, 0xee, 0x6b, 0x7d, 0xb4, 0x77, 0x8b, - 0x2f, 0x47, 0xfc, 0x59, 0x5a, 0x3c, 0x02, 0x23, 0xbe, 0x7d, 0x3c, 0x96, - 0x5b, 0x58, 0x78, 0x44, 0x43, 0x78, 0x51, 0x45, 0x59, 0x7d, 0xb1, 0x1c, - 0x24, 0x66, 0x68, 0x2f, 0xfb, 0x73, 0xce, 0x52, 0x1c, 0x6c, 0xb2, 0xf9, - 0xfb, 0x03, 0x59, 0x77, 0xd2, 0x59, 0x7f, 0x98, 0x8e, 0xf3, 0xce, 0x15, - 0x97, 0xe3, 0xdb, 0x3e, 0xea, 0xcb, 0x7e, 0xb2, 0xc0, 0x59, 0x58, 0x68, - 0xcc, 0x4a, 0xa1, 0x16, 0xec, 0x0c, 0x34, 0xd3, 0xa9, 0x97, 0xfd, 0x2f, - 0xb8, 0x7a, 0x07, 0xb1, 0x65, 0xf9, 0x87, 0xe6, 0xf9, 0x2c, 0xaf, 0x91, - 0x45, 0xa3, 0xde, 0x9d, 0x5f, 0x9c, 0xa4, 0x6d, 0x59, 0x7b, 0x03, 0x3e, - 0xb2, 0x99, 0x2b, 0xe9, 0xac, 0xa0, 0xc4, 0x47, 0x0a, 0x38, 0x7a, 0x64, - 0x6a, 0x07, 0x0c, 0x7f, 0x23, 0x39, 0x99, 0x1e, 0x06, 0x37, 0xad, 0xe6, - 0x33, 0xe4, 0xd7, 0xa7, 0xa6, 0x57, 0x64, 0x2c, 0xbf, 0xef, 0x3c, 0xc5, - 0x19, 0xa9, 0x2c, 0xbf, 0xf3, 0x90, 0x93, 0x70, 0xcb, 0xe9, 0x2c, 0xbf, - 0xf0, 0xb9, 0xc2, 0x38, 0xd6, 0x6c, 0xb2, 0xb7, 0x11, 0x6c, 0x13, 0x8d, - 0xe8, 0x17, 0xff, 0xff, 0xfe, 0xdc, 0x9d, 0xec, 0xfa, 0x5e, 0x6c, 0xe0, - 0x78, 0x3d, 0xee, 0x17, 0xb3, 0xb0, 0x39, 0xd3, 0xbd, 0x3e, 0xb2, 0xff, - 0x87, 0x81, 0x65, 0x9f, 0x9d, 0xab, 0x2f, 0xd0, 0xd2, 0xc9, 0x96, 0x61, - 0xbc, 0xbd, 0xa8, 0xde, 0xb2, 0xf6, 0xfc, 0x1a, 0xcb, 0xfb, 0xc7, 0x04, - 0x18, 0x59, 0x7f, 0xa3, 0x71, 0x8c, 0xe3, 0xee, 0x2c, 0xa6, 0x0f, 0x93, - 0xc5, 0x77, 0xec, 0x18, 0x9f, 0xf1, 0x65, 0x4e, 0x47, 0x6f, 0x87, 0x9e, - 0x10, 0x44, 0x47, 0x7d, 0xe8, 0x13, 0xcb, 0x28, 0x69, 0xc4, 0x72, 0x32, - 0x3e, 0xa1, 0x5f, 0xd1, 0x2f, 0x46, 0xf3, 0x59, 0x7f, 0x8e, 0x51, 0xff, - 0xa5, 0x0b, 0x2f, 0xcd, 0x09, 0x43, 0x56, 0x58, 0x6b, 0x2e, 0x7e, 0x2c, - 0xb6, 0x9a, 0x69, 0xc2, 0x23, 0x50, 0x7e, 0xae, 0x9d, 0x74, 0xba, 0xb2, - 0xfa, 0x68, 0xeb, 0xac, 0xbe, 0x0f, 0xf8, 0x40, 0x37, 0x21, 0x17, 0xb4, - 0x96, 0x56, 0xc7, 0x93, 0xe3, 0x8b, 0xff, 0xa3, 0xc2, 0x0f, 0xa7, 0x93, - 0x43, 0x56, 0x5f, 0xfb, 0xa6, 0x28, 0x3c, 0x7b, 0xcc, 0x6b, 0x2f, 0xf6, - 0xa5, 0xec, 0xdf, 0x0d, 0x59, 0x7c, 0x16, 0x5f, 0x31, 0x65, 0x7c, 0x89, - 0xc3, 0x41, 0x73, 0x5b, 0xf3, 0xcb, 0x87, 0xbd, 0x65, 0xff, 0x66, 0xb2, - 0x76, 0x6a, 0x06, 0xb2, 0xf3, 0x43, 0xbd, 0x65, 0xfd, 0x92, 0xfa, 0x59, - 0xd5, 0x96, 0xec, 0x91, 0x0d, 0x87, 0x3e, 0x1f, 0xbd, 0xd0, 0xb5, 0x65, - 0xf7, 0xd2, 0xf1, 0xac, 0xa8, 0x3c, 0x07, 0x1d, 0xa5, 0x44, 0x1c, 0xbf, - 0x9f, 0x6f, 0xdc, 0x86, 0x8a, 0xc1, 0xab, 0x70, 0x07, 0xa9, 0x3e, 0x31, - 0x4d, 0x44, 0xff, 0x5d, 0x2f, 0xf8, 0xf3, 0xbc, 0xd6, 0x0f, 0x16, 0x5f, - 0xde, 0x76, 0x94, 0x7c, 0xb2, 0xf9, 0xbc, 0x79, 0x78, 0xf9, 0x04, 0x37, - 0xbf, 0xbf, 0xf1, 0x67, 0x78, 0xb2, 0xfe, 0x2c, 0xde, 0x59, 0xc5, 0x96, - 0x8d, 0x1e, 0xdf, 0x4b, 0xaa, 0x13, 0x43, 0xc8, 0x43, 0xf2, 0x12, 0xb6, - 0xe2, 0xcb, 0xf7, 0xa3, 0x70, 0x32, 0x59, 0x50, 0x6f, 0x1c, 0x46, 0xa4, - 0xbc, 0x8a, 0xc1, 0x70, 0x21, 0x51, 0xa8, 0x51, 0x34, 0x8f, 0xd0, 0xe1, - 0xfc, 0xbc, 0xa1, 0x5f, 0xd9, 0x4a, 0xfb, 0xdd, 0x6f, 0xe9, 0x16, 0x7d, - 0xdc, 0x59, 0x7f, 0xfe, 0x13, 0xff, 0xe3, 0xec, 0xd8, 0x6e, 0xe0, 0x71, - 0xac, 0xa8, 0x44, 0x36, 0x8b, 0x6f, 0xe2, 0xec, 0xb3, 0x58, 0xb2, 0xe9, - 0xf7, 0x59, 0x4e, 0x78, 0xa2, 0x16, 0x5f, 0xed, 0x6d, 0xc7, 0x06, 0xb1, - 0x65, 0xfe, 0xf6, 0x01, 0xfd, 0x1e, 0x59, 0x7f, 0xf3, 0x9f, 0x60, 0x81, - 0x9d, 0xf1, 0xac, 0xbf, 0x88, 0xff, 0xe7, 0x8d, 0x65, 0xda, 0x1a, 0xcb, - 0x85, 0x15, 0x65, 0x48, 0xd8, 0x0a, 0x2f, 0x7a, 0x0f, 0x7a, 0x46, 0x66, - 0x8a, 0xff, 0x8c, 0x8f, 0xfe, 0x67, 0x9d, 0x65, 0x62, 0x6b, 0x1e, 0x32, - 0x74, 0x1e, 0x3f, 0xf4, 0xbe, 0xfe, 0x82, 0xef, 0xb2, 0x4b, 0x2e, 0xff, - 0x8b, 0x2f, 0xe3, 0xf1, 0xb0, 0xc4, 0x2c, 0xb0, 0x83, 0x3c, 0x6e, 0x8c, - 0x56, 0x91, 0x37, 0xc7, 0x2a, 0x85, 0x52, 0x67, 0x1c, 0x60, 0x90, 0xe4, - 0xbf, 0xb7, 0x32, 0x46, 0x4e, 0xb2, 0xf0, 0xa2, 0x8a, 0x92, 0x92, 0x33, - 0x34, 0x17, 0xc6, 0x29, 0xcc, 0x92, 0x80, 0x78, 0x06, 0x3b, 0x7d, 0xa8, - 0xdf, 0x8b, 0x2f, 0x4d, 0x9e, 0x59, 0x58, 0x78, 0x0e, 0x47, 0x7d, 0x9d, - 0x0b, 0xac, 0xbb, 0x19, 0x6b, 0x2a, 0x79, 0x67, 0xeb, 0xc4, 0x38, 0xf6, - 0x35, 0xc9, 0x4d, 0xe7, 0x3c, 0xf9, 0xa8, 0xcc, 0x9a, 0xcf, 0xe9, 0x56, - 0xae, 0x78, 0x50, 0x8e, 0xe3, 0x0f, 0x48, 0x05, 0x21, 0xbe, 0xd4, 0x83, - 0x8b, 0x2f, 0xf1, 0x7d, 0xd1, 0x3c, 0xff, 0xac, 0xbc, 0x47, 0xc5, 0x97, - 0x8f, 0x36, 0x59, 0x7c, 0x37, 0x2f, 0xd6, 0x5f, 0xfd, 0x05, 0xf9, 0x47, - 0xd3, 0x41, 0x7e, 0xb2, 0xb1, 0x1a, 0x86, 0x6d, 0xe1, 0xbf, 0xc7, 0x38, - 0x45, 0x7d, 0x2f, 0xe4, 0x4b, 0x2f, 0xd3, 0x4f, 0xff, 0x3f, 0x8b, 0x2f, - 0xa3, 0xaf, 0xe5, 0x97, 0xed, 0x66, 0xf7, 0xf2, 0xcb, 0x1a, 0xcb, 0xfe, - 0x76, 0x01, 0xe3, 0x1b, 0xc9, 0x65, 0xf6, 0xdb, 0x3f, 0xcb, 0x2d, 0xc3, - 0x3e, 0xe2, 0x10, 0x10, 0xe6, 0x98, 0x46, 0x5f, 0xf0, 0x97, 0xbe, 0xcd, - 0x78, 0xd6, 0x5f, 0xfe, 0x79, 0x16, 0x6f, 0x79, 0xa3, 0x3b, 0xc5, 0x95, - 0x07, 0xd6, 0xe4, 0x37, 0xec, 0x1b, 0x98, 0xd6, 0x5f, 0xec, 0xd8, 0x4f, - 0x7b, 0x37, 0x16, 0x5f, 0xfd, 0xff, 0xb3, 0x36, 0x3c, 0xdf, 0x1f, 0x2c, - 0xa8, 0x3f, 0xf1, 0x4e, 0x2f, 0xff, 0x7f, 0x0d, 0xd6, 0xa3, 0x6e, 0xbb, - 0xb0, 0xb2, 0xf8, 0x3c, 0xf6, 0x2c, 0xbc, 0xd8, 0x02, 0xcb, 0xfe, 0x79, - 0x73, 0xf7, 0xdf, 0x83, 0x59, 0x76, 0x7b, 0x0f, 0x5f, 0xc3, 0x97, 0xff, - 0xe3, 0xd7, 0x83, 0xe7, 0x3e, 0xc4, 0x82, 0x3c, 0x59, 0x7e, 0xd1, 0xec, - 0xed, 0x59, 0x70, 0xa2, 0xac, 0xac, 0x3c, 0x11, 0x4a, 0x2c, 0x14, 0x8c, - 0xcd, 0x15, 0x35, 0x1b, 0x5e, 0x85, 0xbd, 0xe9, 0x08, 0xd5, 0x97, 0xcf, - 0xf0, 0xc6, 0xb2, 0xa4, 0x9b, 0x79, 0xc6, 0x0c, 0xe5, 0x1c, 0x1e, 0xbd, - 0x8d, 0xdc, 0x59, 0x7f, 0xe7, 0xdf, 0x82, 0x14, 0x78, 0xf6, 0x59, 0x7f, - 0xb3, 0x85, 0x9d, 0xf1, 0xac, 0xa1, 0xa2, 0x43, 0x43, 0xe4, 0x81, 0x58, - 0xb9, 0x63, 0x34, 0x25, 0x74, 0x41, 0xe8, 0x52, 0xfe, 0x44, 0x49, 0x9d, - 0x8f, 0xa3, 0x7c, 0x34, 0xad, 0x0b, 0x2f, 0xa5, 0xfe, 0x7e, 0xb2, 0xfe, - 0xee, 0x4c, 0x50, 0xd5, 0xc4, 0x04, 0xbe, 0x21, 0xfa, 0x15, 0x10, 0x11, - 0x99, 0xba, 0xaf, 0x91, 0x3c, 0xeb, 0xd7, 0xfe, 0xfa, 0x44, 0x7b, 0x75, - 0xe5, 0xc5, 0x97, 0xfd, 0xc1, 0xe1, 0x41, 0x06, 0x16, 0x58, 0xd8, 0x3f, - 0x6f, 0x90, 0x2f, 0xec, 0x6f, 0xfa, 0xcf, 0x96, 0x5f, 0xb4, 0x61, 0x65, - 0xc2, 0xcb, 0xfd, 0xac, 0xfb, 0x9f, 0xbf, 0x56, 0x54, 0x1f, 0x03, 0x05, - 0x76, 0x0e, 0xc8, 0xb1, 0x04, 0x23, 0xef, 0xd1, 0x27, 0xf8, 0x55, 0x97, - 0xfd, 0x3b, 0x5a, 0xcf, 0x7d, 0x2e, 0x2c, 0xbf, 0xff, 0xd9, 0xc0, 0xbf, - 0xd9, 0x84, 0xc7, 0x39, 0x85, 0xde, 0x2c, 0xa0, 0x22, 0x77, 0xe3, 0xdb, - 0xf3, 0x8a, 0x36, 0x37, 0xac, 0xac, 0x54, 0x3e, 0x70, 0xda, 0xd1, 0x7b, - 0xc3, 0x18, 0x89, 0x2f, 0xbb, 0xc0, 0xc9, 0x65, 0xf8, 0x33, 0xf9, 0xaf, - 0xd6, 0x53, 0x9e, 0x7f, 0x08, 0xed, 0xb2, 0xcb, 0xf4, 0xec, 0x98, 0xda, - 0xb2, 0xff, 0xd1, 0xf7, 0x72, 0x46, 0x5f, 0x9a, 0xcb, 0xff, 0xc1, 0x89, - 0xdb, 0xbd, 0x3e, 0x7b, 0xe7, 0x15, 0x65, 0x6c, 0x8b, 0x93, 0x2a, 0xe1, - 0xf5, 0xff, 0xb0, 0x7e, 0x76, 0x71, 0xe8, 0xf9, 0x65, 0x32, 0x53, 0x3b, - 0xd4, 0x32, 0xda, 0x61, 0x7f, 0xc4, 0xc6, 0x88, 0xc0, 0x12, 0x59, 0x7e, - 0xec, 0x61, 0x42, 0xca, 0x33, 0xdd, 0x23, 0x8b, 0xc2, 0x17, 0x56, 0x5e, - 0x36, 0xba, 0xca, 0xd8, 0xdc, 0x30, 0x3b, 0x7e, 0x06, 0x1f, 0x1a, 0xb2, - 0xff, 0xee, 0x41, 0x74, 0x49, 0xbc, 0x7d, 0xe2, 0xcb, 0xec, 0xd4, 0x6f, - 0x59, 0x6f, 0xbe, 0x3e, 0x9e, 0xa3, 0x53, 0x51, 0x74, 0xf0, 0x90, 0xa8, - 0x4f, 0xcf, 0x21, 0x2e, 0x6b, 0x01, 0x86, 0xed, 0xed, 0xd8, 0xf9, 0x65, - 0xfe, 0x2c, 0xff, 0x82, 0x3f, 0x56, 0x5e, 0x8c, 0x6a, 0xcb, 0xfd, 0xdc, - 0xd6, 0x8e, 0x6e, 0x2c, 0xbc, 0xdd, 0xa1, 0x65, 0x30, 0x7a, 0x20, 0x34, - 0xbe, 0xce, 0x48, 0x0b, 0x2f, 0x7e, 0xde, 0xac, 0xa9, 0x26, 0x46, 0x64, - 0x0d, 0x34, 0x76, 0xcf, 0xc8, 0xc8, 0x8a, 0xff, 0xd8, 0xd8, 0x01, 0xf7, - 0x41, 0x6a, 0xcb, 0xf6, 0xc1, 0x99, 0xc6, 0xb2, 0xf1, 0xfd, 0xc5, 0x97, - 0xff, 0x72, 0x36, 0xcd, 0x4c, 0x51, 0xff, 0x16, 0x5f, 0xe3, 0xf6, 0x6b, - 0x59, 0xf2, 0xcb, 0xf4, 0xc5, 0x1a, 0x92, 0xcb, 0x44, 0x8f, 0x6f, 0x0c, - 0xea, 0x49, 0xa6, 0x39, 0xf7, 0xe5, 0x5d, 0x1d, 0x16, 0x14, 0x37, 0xda, - 0x79, 0x4c, 0xb2, 0xfd, 0xce, 0x47, 0xf3, 0xd2, 0xca, 0x60, 0xf4, 0x45, - 0x23, 0xbe, 0xf6, 0x7e, 0xeb, 0x2a, 0x11, 0xd0, 0xf0, 0xa2, 0xe1, 0x25, - 0xfe, 0xd4, 0xdc, 0x32, 0xe9, 0xac, 0xbf, 0xf4, 0x8d, 0xa2, 0xe1, 0x0f, - 0xd0, 0xb2, 0xff, 0x31, 0x9a, 0xfd, 0xa7, 0xc5, 0x95, 0xf1, 0xf9, 0x91, - 0xf5, 0xfe, 0xf1, 0xfd, 0xfe, 0x9c, 0x6b, 0x2f, 0xbe, 0xff, 0x50, 0x92, - 0xe1, 0x45, 0x49, 0x50, 0x6f, 0x45, 0x24, 0xb8, 0x8d, 0x23, 0x33, 0x43, - 0x7f, 0xff, 0xf1, 0x33, 0xcc, 0xdd, 0x89, 0x8d, 0xb1, 0x34, 0xe2, 0xfa, - 0x5e, 0x0f, 0xeb, 0x2e, 0x30, 0x2c, 0xa5, 0x97, 0x6a, 0x53, 0x93, 0x56, - 0x94, 0x24, 0xfe, 0x27, 0xd3, 0xdf, 0xe2, 0xd5, 0x09, 0xec, 0x3c, 0x6f, - 0x17, 0xe2, 0x90, 0x03, 0xb2, 0xcb, 0xd1, 0xa9, 0x96, 0x53, 0x9e, 0x30, - 0x4a, 0x6f, 0xe1, 0x1a, 0x4f, 0xde, 0x2c, 0xa9, 0xe5, 0xb6, 0x70, 0x88, - 0x7b, 0x6c, 0x93, 0x22, 0x31, 0x98, 0x64, 0xec, 0xef, 0xd0, 0x8b, 0x38, - 0x57, 0x6a, 0x55, 0xc3, 0x61, 0x43, 0xe9, 0x69, 0xef, 0x1b, 0x41, 0x4a, - 0x8a, 0xe9, 0x98, 0x65, 0x3f, 0x0a, 0xdc, 0x21, 0x0d, 0xee, 0x98, 0xab, - 0x2f, 0xed, 0xa7, 0xc3, 0xe3, 0xd2, 0xcb, 0xfc, 0x52, 0xe0, 0xfc, 0x62, - 0xac, 0xbd, 0xb3, 0xb5, 0x65, 0xdf, 0x12, 0xcb, 0xf7, 0xd2, 0xf0, 0x9c, - 0x59, 0x67, 0xc3, 0xc2, 0x21, 0x7b, 0x8c, 0x6b, 0x2f, 0x74, 0xc5, 0x5c, - 0x61, 0x0b, 0xc1, 0x71, 0x15, 0x10, 0x3b, 0xe3, 0x55, 0x52, 0x45, 0x07, - 0x89, 0x7a, 0x81, 0x50, 0x9c, 0xa9, 0x99, 0x39, 0xa0, 0x61, 0xff, 0x78, - 0xb4, 0xcb, 0x59, 0x7f, 0x61, 0x7f, 0x98, 0x35, 0x97, 0xff, 0xfe, 0x90, - 0x3c, 0x7a, 0xd9, 0xb0, 0x0f, 0x41, 0x8e, 0x3d, 0x12, 0x59, 0x7b, 0xd0, - 0xc2, 0xca, 0xf9, 0x11, 0x3b, 0xdb, 0x2f, 0xf6, 0x02, 0x36, 0x28, 0x02, - 0xcb, 0xf0, 0x0a, 0x3e, 0x92, 0xcb, 0x7e, 0xb2, 0xdb, 0x93, 0x8f, 0xb3, - 0x0c, 0x8c, 0xa2, 0xe8, 0x0a, 0xcb, 0xf0, 0x4b, 0xf1, 0x24, 0xb2, 0xff, - 0xf8, 0xb3, 0x93, 0x84, 0xf4, 0x7e, 0xd7, 0x94, 0xec, 0x3c, 0x0e, 0x0b, - 0x53, 0xa6, 0xea, 0x18, 0x49, 0x6f, 0x78, 0xbf, 0xfb, 0x47, 0xf0, 0x9d, - 0xc3, 0x93, 0xf1, 0x65, 0xff, 0x07, 0x68, 0x9d, 0x1d, 0x81, 0xac, 0xad, - 0x22, 0x03, 0xc8, 0xb7, 0x9f, 0x5b, 0x2c, 0xb8, 0x51, 0x56, 0x5f, 0xed, - 0x1e, 0x6f, 0x12, 0x4c, 0xc0, 0x6d, 0x85, 0x1d, 0xbf, 0xf1, 0xb1, 0x3b, - 0x81, 0xfd, 0xb1, 0x25, 0x97, 0xfb, 0x99, 0xd7, 0x6e, 0x12, 0xca, 0x1a, - 0x63, 0x9a, 0x59, 0xf2, 0x7f, 0x50, 0xef, 0xfd, 0xcc, 0x2c, 0xf6, 0x03, - 0x09, 0x65, 0xff, 0xe3, 0xe6, 0x14, 0xe1, 0x35, 0x36, 0x60, 0xab, 0x2f, - 0xfa, 0x5c, 0xef, 0xb1, 0xb9, 0x25, 0x97, 0xfe, 0xc6, 0x3c, 0xf2, 0x11, - 0xfe, 0x85, 0x95, 0x24, 0xc0, 0x46, 0x76, 0x69, 0xa4, 0x73, 0x50, 0x9b, - 0xde, 0x46, 0x7f, 0x7f, 0xb7, 0x8b, 0x84, 0x3f, 0x42, 0xcb, 0xe0, 0x3b, - 0x81, 0x51, 0x0c, 0x2f, 0xf1, 0xc6, 0xa4, 0x18, 0xc5, 0x97, 0xe6, 0xb5, - 0xe5, 0x9a, 0x3d, 0xf2, 0x2e, 0xbf, 0xff, 0xe2, 0xc0, 0x7a, 0x3e, 0x94, - 0xfe, 0x78, 0x07, 0x84, 0xec, 0x2c, 0xb8, 0x1f, 0xac, 0xb9, 0xf9, 0x88, - 0x80, 0x6b, 0x45, 0x62, 0x3a, 0x83, 0x0b, 0xdb, 0xfb, 0x59, 0x34, 0x10, - 0xd6, 0x54, 0x2f, 0xc9, 0x48, 0x80, 0xe5, 0x15, 0x7a, 0x5a, 0x73, 0x94, - 0x14, 0x6f, 0xc1, 0x27, 0xbf, 0x14, 0x7f, 0xf7, 0xeb, 0x2f, 0xd9, 0x28, - 0xd7, 0xeb, 0x2e, 0x81, 0x16, 0x5f, 0x9f, 0x62, 0x89, 0x24, 0xa9, 0x8d, - 0xf7, 0x85, 0xef, 0xfd, 0xdf, 0x39, 0xf6, 0x35, 0x1f, 0xac, 0xbf, 0x79, - 0xc8, 0x4d, 0x96, 0x54, 0x93, 0x19, 0x60, 0xa9, 0xac, 0xc4, 0x44, 0x29, - 0xf5, 0xff, 0x8c, 0x11, 0xc7, 0xd6, 0x8c, 0x55, 0x97, 0xfd, 0xb4, 0x9b, - 0x1e, 0x73, 0x61, 0x65, 0xff, 0xba, 0x65, 0xb6, 0x7d, 0xdf, 0x3a, 0xcb, - 0xff, 0x8f, 0x4c, 0x03, 0xc7, 0xe2, 0x0e, 0xcb, 0x2b, 0x11, 0x0b, 0xf9, - 0xfd, 0x12, 0x38, 0xb9, 0x0b, 0xfb, 0xe0, 0xe7, 0x0d, 0x65, 0xdc, 0x0a, - 0xcb, 0xfa, 0x5e, 0x77, 0x28, 0x59, 0x68, 0x01, 0xe1, 0x7c, 0x2f, 0x7f, - 0xf6, 0x76, 0x3c, 0x78, 0xc3, 0x11, 0x25, 0x97, 0xed, 0x01, 0xdc, 0x0a, - 0x88, 0x29, 0x7b, 0xd0, 0xd5, 0x97, 0xfe, 0x8d, 0x9f, 0xba, 0xc9, 0x4f, - 0xe2, 0xcb, 0xdb, 0x1e, 0x96, 0x50, 0xd1, 0xe5, 0x88, 0x86, 0x68, 0x43, - 0x9c, 0x41, 0xbf, 0x7a, 0x1a, 0x1f, 0x96, 0x5e, 0xe4, 0x7c, 0xb2, 0xfb, - 0xbc, 0x8f, 0xd2, 0x5e, 0x7d, 0x6c, 0x92, 0xf8, 0x24, 0xec, 0x24, 0xbf, - 0xc7, 0xb6, 0x77, 0x91, 0xfa, 0x4a, 0x49, 0x7f, 0x60, 0x23, 0xd0, 0xd4, - 0x97, 0x0a, 0x2a, 0x4b, 0xf8, 0xa0, 0xb6, 0x3d, 0x24, 0xac, 0x4c, 0x48, - 0x04, 0x6d, 0x1d, 0xf1, 0x17, 0xe6, 0x84, 0x16, 0x29, 0x60, 0x83, 0x36, - 0xd2, 0x46, 0x67, 0xe7, 0x5f, 0x27, 0x8c, 0x71, 0xd1, 0x54, 0x95, 0x30, - 0x4c, 0x8f, 0xe8, 0xfb, 0xef, 0xff, 0x85, 0xe1, 0x67, 0xdd, 0x72, 0xdb, - 0x3e, 0xea, 0xcb, 0xfb, 0x7c, 0xe7, 0x94, 0xb1, 0x65, 0x42, 0x20, 0xf1, - 0x4a, 0xff, 0xfb, 0xa7, 0xe0, 0x43, 0x44, 0xdb, 0x07, 0x0d, 0x59, 0x50, - 0xbd, 0x3d, 0x89, 0x87, 0x19, 0x06, 0x89, 0xfc, 0xc6, 0xf2, 0xde, 0x8a, - 0x17, 0x81, 0x21, 0xbc, 0xd7, 0x1a, 0xcb, 0xff, 0xfe, 0x2c, 0xef, 0x63, - 0xe9, 0x4e, 0xf4, 0x34, 0x3f, 0x73, 0xd0, 0xb2, 0xfe, 0xc2, 0xe1, 0x96, - 0x2c, 0xbf, 0x9b, 0x83, 0xf6, 0x6c, 0xb2, 0xff, 0xf1, 0x3b, 0x1c, 0xff, - 0xbd, 0xfb, 0xb8, 0x05, 0x95, 0x07, 0xf6, 0xc1, 0x75, 0xef, 0x05, 0xab, - 0x29, 0x84, 0xda, 0xb7, 0x07, 0x3c, 0xd4, 0x50, 0xa5, 0xdd, 0x22, 0xbf, - 0x8b, 0x39, 0xa8, 0xe2, 0xcb, 0xc1, 0x96, 0x2c, 0xa7, 0x3c, 0x8f, 0xcb, - 0x2f, 0xd8, 0x4f, 0xde, 0x2c, 0xbf, 0x67, 0x89, 0xe6, 0x59, 0x43, 0x3c, - 0xd2, 0x26, 0xa9, 0x22, 0x43, 0x8d, 0xf7, 0xcf, 0x36, 0x79, 0x65, 0xff, - 0x41, 0x93, 0xf6, 0x63, 0x15, 0x65, 0xb5, 0x38, 0xf6, 0xb8, 0x45, 0x50, - 0x8a, 0x73, 0x7d, 0xbf, 0x6b, 0xe9, 0x67, 0x56, 0x5f, 0xff, 0x39, 0xff, - 0xcc, 0x61, 0xdb, 0xa8, 0xc2, 0x59, 0x7d, 0x00, 0x13, 0xf5, 0x97, 0xde, - 0x8f, 0xb8, 0xb2, 0xf8, 0xf3, 0xee, 0xac, 0xac, 0x3c, 0x5e, 0x91, 0xdf, - 0xff, 0xf7, 0x8f, 0x58, 0x37, 0x6e, 0x17, 0x4a, 0x05, 0xce, 0xf1, 0x65, - 0xa1, 0x65, 0xf4, 0x6f, 0x1c, 0x00, 0xfd, 0x3f, 0x64, 0xbf, 0xf3, 0xcb, - 0xcf, 0xde, 0x61, 0x49, 0x65, 0x78, 0xfe, 0x3a, 0x77, 0x5a, 0x54, 0x1f, - 0xe2, 0x92, 0x4e, 0xe3, 0x4f, 0x63, 0x0d, 0xbf, 0xfd, 0x9a, 0xff, 0xba, - 0xcd, 0xbb, 0x19, 0xc5, 0x97, 0x81, 0x8d, 0x59, 0x7f, 0x0d, 0xfb, 0xc0, - 0xc9, 0x65, 0xd2, 0x9f, 0x83, 0xca, 0x10, 0x72, 0xfe, 0x7d, 0x47, 0x4f, - 0x7a, 0xca, 0xf8, 0xf7, 0xc8, 0xc6, 0xff, 0xff, 0xda, 0xd4, 0x7d, 0x2f, - 0xb8, 0x7a, 0x07, 0xb0, 0x4d, 0x1c, 0x0d, 0x65, 0xff, 0x3e, 0xb3, 0xe9, - 0x47, 0xf0, 0xb2, 0xa1, 0x19, 0x58, 0x44, 0x16, 0xfb, 0xfe, 0xfa, 0x5d, - 0xce, 0x77, 0x37, 0x16, 0x5f, 0xff, 0x80, 0xc3, 0xf3, 0x35, 0x23, 0xf3, - 0x97, 0xd2, 0x59, 0x7f, 0xe0, 0x47, 0x79, 0x9d, 0x3f, 0x85, 0x59, 0x58, - 0x89, 0x66, 0x15, 0xaa, 0x11, 0xec, 0xf0, 0xd3, 0xa8, 0x56, 0xb2, 0x35, - 0x1f, 0x47, 0x7c, 0x51, 0x92, 0x5f, 0xb8, 0x41, 0xdf, 0x25, 0x97, 0xec, - 0x2f, 0x61, 0x2c, 0xbd, 0xb0, 0x80, 0x59, 0x7c, 0x47, 0x36, 0xe2, 0xca, - 0x84, 0x49, 0xf8, 0xa9, 0xc9, 0x78, 0x3f, 0x73, 0xfe, 0xb2, 0xa4, 0x7a, - 0x5d, 0x3b, 0xbf, 0xe9, 0x67, 0x5b, 0x18, 0x43, 0x59, 0x7f, 0xfe, 0x77, - 0x93, 0xfa, 0x76, 0x6c, 0x1e, 0x85, 0xc4, 0x54, 0x5f, 0x6b, 0xdb, 0xc3, - 0xd5, 0x97, 0x40, 0xd6, 0x54, 0x1b, 0x5f, 0xc7, 0xef, 0xe7, 0x04, 0x14, - 0x7e, 0xb2, 0xff, 0xdc, 0x32, 0xfa, 0x5a, 0x0c, 0x71, 0x65, 0xfb, 0x35, - 0x83, 0x85, 0x95, 0xf2, 0x70, 0x73, 0x1b, 0xea, 0x13, 0x5e, 0x21, 0xe9, - 0x66, 0xf3, 0xfb, 0xf7, 0xb2, 0x68, 0xdc, 0x59, 0x7e, 0x1e, 0xb5, 0x82, - 0xac, 0xad, 0x8f, 0x50, 0x8a, 0xef, 0xe3, 0x2c, 0xec, 0x4c, 0xb2, 0xff, - 0xe9, 0x72, 0x1b, 0x80, 0x27, 0xc0, 0x2c, 0xbe, 0x82, 0x60, 0x6b, 0x2f, - 0x3f, 0xf0, 0xb2, 0xa1, 0x19, 0xd2, 0x22, 0xf8, 0xb3, 0xc8, 0x5c, 0x22, - 0xba, 0x5c, 0x59, 0x7e, 0x91, 0x81, 0xf4, 0xb2, 0xff, 0xf3, 0x96, 0x76, - 0x0f, 0x46, 0xc3, 0x10, 0xb2, 0xb8, 0x7d, 0xe2, 0x13, 0xd8, 0x0b, 0x2f, - 0xff, 0xf7, 0xe7, 0xa6, 0x3d, 0x0d, 0x9a, 0x46, 0x5e, 0x8d, 0x42, 0xcb, - 0x77, 0x0f, 0xcf, 0x82, 0x37, 0x8f, 0x58, 0xb2, 0xf1, 0x64, 0x96, 0x50, - 0x0d, 0xb7, 0x46, 0xef, 0x14, 0x35, 0x65, 0x42, 0x26, 0x4d, 0x77, 0x84, - 0x37, 0xfe, 0x23, 0x97, 0x7d, 0x9a, 0x3e, 0x2c, 0xbf, 0x48, 0xb3, 0x36, - 0x59, 0x76, 0xb6, 0x59, 0x7f, 0xd3, 0x32, 0x7a, 0x63, 0x1e, 0x12, 0xca, - 0x83, 0xfc, 0xc2, 0x73, 0x18, 0xbf, 0xce, 0x38, 0xfe, 0x05, 0xe2, 0xca, - 0xf1, 0xf0, 0x39, 0x65, 0xfd, 0x3e, 0xca, 0xa7, 0x4e, 0xf4, 0xfa, 0xe2, - 0x01, 0x5f, 0xee, 0xfe, 0x21, 0x4b, 0xd8, 0xb8, 0x80, 0x57, 0x9f, 0x52, - 0x5c, 0x40, 0x2a, 0xc3, 0xeb, 0x0a, 0x15, 0xcf, 0x25, 0xc4, 0x02, 0xbe, - 0x72, 0xfa, 0x4b, 0x88, 0x05, 0x7f, 0x8c, 0x1e, 0xcf, 0xff, 0x85, 0xc4, - 0x02, 0xbc, 0x64, 0x35, 0xc4, 0x02, 0xa1, 0xa2, 0xed, 0xa4, 0x7e, 0x2f, - 0xde, 0x83, 0x66, 0x17, 0x10, 0x0a, 0xf6, 0xa3, 0xab, 0x88, 0x05, 0x4b, - 0x88, 0x05, 0x7a, 0x7c, 0xff, 0x5c, 0x40, 0x2b, 0xa1, 0xab, 0x88, 0x05, - 0x43, 0x3e, 0x8c, 0x18, 0x32, 0xdb, 0xe3, 0x68, 0xe1, 0x71, 0x00, 0xaf, - 0x75, 0xc0, 0xb8, 0x80, 0x57, 0xfe, 0x27, 0x93, 0x3f, 0x18, 0x1f, 0x4b, - 0x88, 0x05, 0x7f, 0xf3, 0xf4, 0x3b, 0x19, 0x77, 0xcf, 0x25, 0xc4, 0x02, - 0xb9, 0xc6, 0xb8, 0x80, 0x57, 0xf8, 0x9c, 0x5e, 0x72, 0x3f, 0x5c, 0x40, - 0x2b, 0xf1, 0xb0, 0xe5, 0xfa, 0xe2, 0x01, 0x5c, 0x7c, 0x5c, 0x40, 0x2a, - 0xd1, 0xec, 0x74, 0xd6, 0xff, 0xf7, 0x8f, 0xbd, 0xce, 0x4e, 0xd1, 0xc3, - 0x57, 0x10, 0x0a, 0xfd, 0xd2, 0x8f, 0xa4, 0xa8, 0x80, 0x57, 0x7f, 0x0b, - 0x88, 0x04, 0xcc, 0xda, 0xdf, 0x8e, 0x1a, 0xe3, 0x5c, 0x40, 0x2b, 0xe0, - 0xb9, 0x01, 0x71, 0x00, 0xaf, 0x46, 0x80, 0xb8, 0x80, 0x57, 0xfe, 0xcf, - 0xb8, 0x38, 0xc2, 0xff, 0x8b, 0x88, 0x05, 0x7e, 0x0b, 0xca, 0x50, 0xb8, - 0x80, 0x57, 0xe7, 0x07, 0xa3, 0xe5, 0xc4, 0x02, 0xac, 0x45, 0xaf, 0x93, - 0x02, 0x69, 0x76, 0xbf, 0x5c, 0x40, 0x2a, 0x92, 0xb3, 0x41, 0x91, 0xe4, - 0x26, 0x40, 0x44, 0x70, 0x8d, 0xf1, 0xb7, 0xe6, 0x7c, 0x2e, 0xec, 0x37, - 0x82, 0x5f, 0x7e, 0xce, 0xf1, 0xfe, 0x5c, 0x40, 0x2b, 0xfc, 0x38, 0x04, - 0xda, 0x8e, 0xae, 0x20, 0x10, 0xcd, 0xad, 0xed, 0x40, 0xab, 0x88, 0x05, - 0x40, 0x3f, 0xbd, 0x28, 0xdf, 0xe0, 0xbc, 0xa5, 0x02, 0x35, 0x71, 0x00, - 0xaf, 0x8c, 0xa5, 0xc5, 0xc4, 0x02, 0xbf, 0x9e, 0x69, 0x67, 0xd2, 0x5c, - 0x40, 0x2a, 0xc4, 0x66, 0xf8, 0x8b, 0xf4, 0x10, 0x97, 0x5f, 0xf7, 0xa3, - 0x8c, 0xf8, 0x1d, 0x7e, 0xb8, 0x80, 0x56, 0x35, 0xc4, 0x02, 0xb9, 0xf6, - 0x19, 0xf3, 0xf9, 0x2a, 0xed, 0x7e, 0xb8, 0x80, 0x57, 0xe7, 0xef, 0x0f, - 0xe5, 0xc4, 0x02, 0xbf, 0x8c, 0x83, 0x2c, 0xe2, 0xe2, 0x01, 0x54, 0x22, - 0x4c, 0x89, 0x7a, 0x6b, 0x50, 0xca, 0x82, 0x1c, 0x2d, 0xf2, 0x1b, 0x86, - 0x7f, 0x30, 0xfe, 0xa1, 0x23, 0xe2, 0xd7, 0x2e, 0xfc, 0xa4, 0x93, 0x39, - 0x2e, 0x17, 0xb2, 0x86, 0x27, 0xe1, 0x48, 0x24, 0x30, 0x6f, 0x74, 0xc5, - 0x5c, 0x61, 0x2b, 0xce, 0xe0, 0x54, 0x40, 0x26, 0x69, 0x8a, 0xfd, 0x0e, - 0xbb, 0xcc, 0xae, 0x36, 0xac, 0xbf, 0xba, 0x59, 0xfc, 0xfe, 0x2c, 0xa6, - 0x0f, 0x51, 0xa4, 0x97, 0xfa, 0x47, 0xd6, 0x18, 0xcd, 0xc5, 0x97, 0xd1, - 0xd8, 0x1a, 0xcb, 0x6c, 0xb2, 0xa4, 0x6c, 0xf7, 0x90, 0xdf, 0xdb, 0x46, - 0xbc, 0xfb, 0x8b, 0x2d, 0xc5, 0x97, 0xc5, 0x03, 0xf2, 0xca, 0xf1, 0xb2, - 0xde, 0x23, 0x50, 0x8a, 0x9c, 0x23, 0x36, 0x3b, 0xff, 0x16, 0x03, 0xc7, - 0xff, 0xe1, 0x99, 0x65, 0xff, 0x0f, 0x18, 0x2c, 0xec, 0x0a, 0xb2, 0xa4, - 0x7f, 0x5f, 0xa0, 0xdf, 0xbb, 0x83, 0x7f, 0x2c, 0xbb, 0xf8, 0x49, 0x66, - 0x12, 0x5e, 0xf4, 0x6c, 0xb2, 0xe1, 0x45, 0x49, 0x46, 0x7b, 0xfb, 0x82, - 0xf3, 0x09, 0x0a, 0x3b, 0x6e, 0x24, 0x66, 0x78, 0x15, 0x88, 0xea, 0x38, - 0x63, 0x5f, 0xfd, 0x9f, 0xc8, 0xfb, 0x0d, 0x82, 0x1a, 0xca, 0x69, 0xf4, - 0xb9, 0x35, 0xfd, 0xde, 0x60, 0xbe, 0x35, 0x96, 0xea, 0xca, 0xe9, 0xbf, - 0x09, 0x75, 0xfa, 0x36, 0xe3, 0x64, 0xb2, 0x8c, 0xf2, 0xba, 0x43, 0x7f, - 0xfe, 0xfa, 0x5c, 0x2f, 0xa1, 0x8e, 0x47, 0xd2, 0x36, 0xac, 0xbf, 0xfd, - 0xde, 0x63, 0x07, 0xa1, 0x3f, 0xfe, 0x3e, 0x59, 0x53, 0xdb, 0x68, 0x3f, - 0x10, 0x86, 0xda, 0x32, 0xf9, 0x17, 0x0e, 0x31, 0x90, 0x52, 0xee, 0x0e, - 0x14, 0x93, 0x11, 0xea, 0x31, 0x47, 0x85, 0x3f, 0xf1, 0xbb, 0x76, 0x15, - 0x41, 0x21, 0x11, 0x66, 0xff, 0xb2, 0x46, 0x37, 0x07, 0x24, 0xb2, 0xff, - 0x9a, 0x64, 0x03, 0xd1, 0xfe, 0xb2, 0x80, 0x7e, 0x1e, 0x38, 0xbf, 0xba, - 0x3f, 0x05, 0xc9, 0x65, 0xe0, 0x78, 0x96, 0x5f, 0xfd, 0xd9, 0xfc, 0x9a, - 0x4f, 0xad, 0x87, 0x0b, 0x2b, 0xe4, 0x49, 0x34, 0xb4, 0x87, 0x2f, 0xe8, - 0xfa, 0x09, 0xfa, 0xb2, 0xe2, 0xfd, 0x65, 0xd1, 0xc5, 0x94, 0x66, 0xb7, - 0x78, 0xbd, 0xdd, 0x13, 0xc7, 0xf7, 0xbd, 0x66, 0xff, 0x67, 0xdd, 0xeb, - 0xcb, 0x8b, 0x2f, 0x49, 0x97, 0x25, 0x97, 0x7d, 0x25, 0xc6, 0x00, 0xbf, - 0xfd, 0x82, 0xc7, 0x72, 0x69, 0x1f, 0x78, 0xeb, 0x2f, 0xa6, 0xd4, 0x75, - 0x65, 0x7c, 0x8b, 0x32, 0x21, 0xe1, 0x2f, 0x52, 0xaf, 0xff, 0xd1, 0x9e, - 0xe1, 0x3f, 0x43, 0xd1, 0xf8, 0xd8, 0x59, 0x7f, 0xff, 0xff, 0xff, 0xb8, - 0x1d, 0xc2, 0x7c, 0xf3, 0x88, 0x59, 0xbf, 0x09, 0xd8, 0x9a, 0x41, 0xe7, - 0x05, 0x71, 0xf8, 0xc5, 0xe6, 0x38, 0xd6, 0x54, 0x2b, 0xcb, 0xc8, 0x5a, - 0x1c, 0x2a, 0xf4, 0x62, 0xf0, 0xe7, 0x23, 0xde, 0xaa, 0xdf, 0xff, 0x88, - 0x83, 0xf6, 0x7d, 0xd1, 0xe9, 0xfe, 0xcd, 0x96, 0x5f, 0xb3, 0xba, 0x8e, - 0x2c, 0xa3, 0x3f, 0xf2, 0x58, 0xbf, 0x4d, 0x28, 0xd6, 0xcb, 0x2f, 0xa1, - 0x88, 0x6a, 0xca, 0x91, 0xf6, 0x68, 0x81, 0xa5, 0x57, 0xfe, 0x97, 0x27, - 0x16, 0x36, 0x34, 0xc2, 0xcb, 0xf4, 0xe9, 0xd9, 0xe7, 0x59, 0x7f, 0xee, - 0x79, 0xcf, 0xb2, 0xf0, 0x58, 0x59, 0x7f, 0x4a, 0x35, 0xf8, 0x8d, 0x59, - 0x7f, 0xf1, 0xb0, 0xc1, 0x90, 0x27, 0x6d, 0xe6, 0x16, 0x5f, 0xfd, 0xbc, - 0xb3, 0x9d, 0xc2, 0x96, 0x71, 0x65, 0xf3, 0x60, 0x3d, 0x59, 0x58, 0x7c, - 0xce, 0x89, 0x7d, 0xde, 0xbe, 0x96, 0x5f, 0xb2, 0x6f, 0x46, 0xcb, 0x29, - 0xcf, 0x2c, 0x88, 0xaf, 0x75, 0xc9, 0x65, 0x9e, 0x72, 0x78, 0xd8, 0x81, - 0xe3, 0x02, 0x85, 0x87, 0x1a, 0xf7, 0x48, 0x2a, 0x72, 0xa5, 0x6f, 0x47, - 0xe3, 0x7f, 0xd1, 0xb8, 0x3f, 0x46, 0xce, 0x4b, 0x2f, 0xfa, 0x01, 0x0d, - 0x36, 0xfe, 0x6b, 0x2b, 0x48, 0xa0, 0xf1, 0x6e, 0xe9, 0xdd, 0xfc, 0x20, - 0xba, 0x3c, 0xf2, 0x4b, 0xfc, 0xfd, 0x89, 0x04, 0x78, 0xb2, 0xfb, 0xd1, - 0x9b, 0x2c, 0xa2, 0x3d, 0x4e, 0x19, 0x5f, 0x4d, 0x98, 0x2a, 0xcb, 0xe9, - 0x1e, 0xb8, 0xb2, 0xff, 0xef, 0xc8, 0xf3, 0xee, 0xcd, 0x27, 0xd2, 0xcb, - 0xe9, 0xbc, 0xf3, 0x2c, 0xbe, 0x03, 0xeb, 0x65, 0x97, 0xec, 0x9a, 0x51, - 0xf2, 0xcb, 0x8e, 0x65, 0x97, 0x8e, 0x09, 0x65, 0xfb, 0x34, 0x3f, 0x62, - 0xca, 0x19, 0xe0, 0xf0, 0x6a, 0xbc, 0x7f, 0x5c, 0x58, 0xbc, 0x51, 0x24, - 0x97, 0xfe, 0x2f, 0xcf, 0x77, 0x74, 0x32, 0x8d, 0xc5, 0x96, 0x6a, 0xca, - 0xc3, 0xf4, 0x71, 0xb1, 0x12, 0x2a, 0x72, 0xa5, 0xa1, 0x90, 0xe1, 0x1f, - 0xc4, 0x5a, 0x46, 0xf1, 0x21, 0x11, 0xf6, 0x14, 0x7b, 0xb0, 0x96, 0xa8, - 0x5f, 0x04, 0xc2, 0xf3, 0x96, 0x6f, 0xe3, 0x37, 0x95, 0xbb, 0x7f, 0x7d, - 0xcd, 0x6a, 0x3a, 0xb2, 0xfd, 0xc6, 0x34, 0xe0, 0x59, 0x77, 0x24, 0xb2, - 0xa4, 0x78, 0x1b, 0xca, 0x6f, 0x17, 0x78, 0xb2, 0xf1, 0x1c, 0x96, 0x5f, - 0xb5, 0xe7, 0x76, 0xac, 0xbe, 0x09, 0x04, 0x0b, 0x29, 0xcf, 0x27, 0x84, - 0xf7, 0xf7, 0x66, 0x96, 0x7d, 0x25, 0x95, 0x08, 0xf5, 0x32, 0x47, 0x1c, - 0x0b, 0x20, 0x84, 0x37, 0xff, 0x78, 0x58, 0xd7, 0x30, 0x57, 0xd3, 0x0b, - 0x2f, 0xf0, 0xb9, 0xf7, 0x7b, 0x0d, 0x59, 0x7e, 0x2c, 0xfc, 0x3c, 0x59, - 0x7f, 0xc0, 0x3c, 0x2c, 0xde, 0xfc, 0x59, 0x5b, 0x1f, 0x07, 0x8a, 0x29, - 0xd1, 0x71, 0xc8, 0x4a, 0xdf, 0x0c, 0x78, 0xd5, 0x97, 0x7f, 0x09, 0x2e, - 0x14, 0x54, 0x94, 0x66, 0xc0, 0x51, 0x7b, 0xf0, 0xc2, 0xfa, 0x92, 0x46, - 0x66, 0x86, 0xb1, 0x15, 0xac, 0x39, 0xdf, 0xfe, 0xef, 0xc0, 0x3f, 0x4f, - 0xc7, 0x7c, 0x27, 0x16, 0x5f, 0xe8, 0x91, 0xf6, 0x51, 0xd5, 0x97, 0x32, - 0xf8, 0xb3, 0x46, 0xca, 0xff, 0xbc, 0xfd, 0xe0, 0x0b, 0x36, 0x59, 0x70, - 0x0d, 0x65, 0xf1, 0x1f, 0xd2, 0x59, 0x7f, 0xc7, 0xf7, 0xb0, 0x7a, 0x70, - 0x2c, 0xa8, 0x3d, 0xbd, 0x11, 0x5f, 0xee, 0x61, 0xf5, 0x83, 0xf2, 0xcb, - 0xfe, 0xf4, 0x6a, 0x00, 0x64, 0x05, 0x97, 0x98, 0x7e, 0x01, 0x1f, 0x9a, - 0x71, 0xe9, 0x0e, 0xe9, 0x9d, 0x62, 0x70, 0xfd, 0x8c, 0xd6, 0xa4, 0xb8, - 0xa7, 0xf4, 0x3f, 0xf5, 0x0d, 0x46, 0x91, 0x86, 0x10, 0x42, 0xc7, 0x65, - 0x7f, 0x0a, 0xc3, 0xf4, 0xa1, 0x65, 0xe6, 0x87, 0x4b, 0x2f, 0x00, 0xf8, - 0xb2, 0xf8, 0x2d, 0xc1, 0xac, 0xaf, 0x91, 0x12, 0x65, 0xde, 0x1d, 0xdd, - 0x1c, 0xbf, 0xff, 0xb5, 0x20, 0xc6, 0x78, 0x07, 0xcc, 0x1e, 0xd8, 0x2a, - 0xcb, 0xff, 0x7b, 0x37, 0x5c, 0x98, 0xcf, 0xba, 0xb2, 0xfe, 0xf1, 0x8f, - 0xc1, 0x61, 0x65, 0xf8, 0xa2, 0x63, 0xf9, 0x65, 0xb0, 0x07, 0xae, 0x65, - 0xf7, 0xbb, 0x80, 0x59, 0x4d, 0x3c, 0x2e, 0x13, 0x5e, 0x93, 0x7f, 0x59, - 0x50, 0x9b, 0xbb, 0x0b, 0x9f, 0xc3, 0x6f, 0xa4, 0x57, 0xd8, 0x46, 0xc2, - 0xcb, 0xfe, 0x61, 0xe7, 0x43, 0x48, 0xd8, 0x59, 0x7f, 0xe7, 0xe3, 0x60, - 0xf5, 0xa3, 0x15, 0x65, 0xb8, 0xc1, 0xfc, 0xf8, 0xee, 0xf9, 0xe4, 0xfa, - 0x59, 0x79, 0x88, 0xe2, 0xcb, 0xfe, 0xce, 0xf4, 0xd8, 0xee, 0x01, 0x65, - 0xfd, 0x1f, 0x73, 0x3e, 0xea, 0xcb, 0xb5, 0x0b, 0x28, 0x67, 0x8b, 0xd2, - 0xfb, 0xff, 0xee, 0xea, 0x33, 0xe9, 0xf2, 0x68, 0x7b, 0xfb, 0xac, 0xbf, - 0xdd, 0x30, 0x18, 0xe3, 0xab, 0x2f, 0xdc, 0x80, 0x63, 0x56, 0x54, 0x1e, - 0xcf, 0x0c, 0xad, 0xc9, 0x27, 0x16, 0x31, 0xdc, 0x7e, 0xf8, 0x8b, 0x50, - 0xad, 0xa9, 0x2a, 0xc5, 0xfa, 0x13, 0x4d, 0x29, 0xec, 0x75, 0x97, 0xfd, - 0xd3, 0xda, 0x3e, 0xff, 0x50, 0xb2, 0xf7, 0x3b, 0x8b, 0x2e, 0xce, 0x4e, - 0x3d, 0x71, 0x0e, 0xef, 0xf7, 0x80, 0x7c, 0x0c, 0x8d, 0x65, 0xff, 0xd9, - 0xd3, 0xfa, 0x45, 0x13, 0xdc, 0xf1, 0x9f, 0x59, 0x7f, 0xf8, 0x32, 0xf3, - 0x9f, 0x4c, 0xba, 0x1f, 0x2c, 0xbf, 0xcc, 0x77, 0xe0, 0x1e, 0xb8, 0xb2, - 0xfd, 0x9d, 0xfd, 0xfa, 0xb2, 0xa1, 0x32, 0xc9, 0x19, 0xe9, 0x48, 0x29, - 0x33, 0xe6, 0xd7, 0xff, 0xe8, 0xf3, 0xe1, 0x46, 0x98, 0x18, 0x5f, 0x52, - 0x59, 0x52, 0x4f, 0xf7, 0xb1, 0xae, 0x6e, 0xa6, 0xd4, 0x32, 0x24, 0xf2, - 0x1f, 0x47, 0x1d, 0xbb, 0xcb, 0x09, 0x0c, 0xa9, 0xfb, 0xef, 0x1b, 0xc9, - 0x65, 0xfe, 0xc2, 0x96, 0x70, 0x46, 0xac, 0xbf, 0x37, 0x9f, 0xbb, 0xac, - 0xae, 0x9e, 0xd8, 0x86, 0x77, 0xfb, 0x0a, 0x77, 0xb3, 0xe1, 0x56, 0x5f, - 0xd1, 0xe3, 0xdf, 0x93, 0x2c, 0xad, 0x1f, 0x2f, 0xe6, 0xd7, 0xfd, 0x22, - 0x0f, 0xf3, 0x80, 0xdf, 0xd6, 0x56, 0xc9, 0xb2, 0xc9, 0xf3, 0x21, 0x11, - 0xf1, 0x1d, 0xff, 0x67, 0xd2, 0xf6, 0xee, 0xec, 0x6e, 0x2c, 0xbf, 0xf9, - 0xfd, 0xc3, 0x91, 0xf6, 0x3b, 0xc5, 0x97, 0xd1, 0xac, 0xde, 0xb2, 0xfd, - 0xe3, 0x9f, 0x7d, 0x96, 0x57, 0x0f, 0x3b, 0xa4, 0x77, 0xfb, 0xfe, 0x61, - 0x67, 0x02, 0xb2, 0xb0, 0xf5, 0x5c, 0x8a, 0xff, 0x8a, 0x33, 0xee, 0xe6, - 0xa1, 0x65, 0xff, 0xa3, 0xc2, 0x70, 0xb3, 0xbe, 0xc5, 0x97, 0xed, 0xfe, - 0xcf, 0xdd, 0x65, 0xf7, 0xa3, 0xfc, 0x59, 0x58, 0x79, 0x81, 0x2a, 0xa8, - 0x54, 0xdf, 0x88, 0x86, 0x87, 0xe8, 0x73, 0x39, 0x07, 0xe6, 0xe5, 0x08, - 0xab, 0xf3, 0xef, 0x18, 0xe1, 0x65, 0xff, 0xfd, 0xa9, 0x4e, 0x1f, 0xa2, - 0x71, 0x67, 0xdd, 0x8c, 0x15, 0x65, 0xdc, 0xe2, 0xcb, 0xc2, 0x8a, 0x2a, - 0xcb, 0xbf, 0x74, 0x8c, 0xcd, 0x05, 0x1a, 0x30, 0x34, 0xc1, 0xc3, 0x7b, - 0xff, 0x67, 0x09, 0xd8, 0x98, 0x8e, 0x65, 0x97, 0xf7, 0xf1, 0x2f, 0x09, - 0xc5, 0x97, 0xfc, 0x7f, 0x89, 0x9b, 0xc8, 0x3c, 0x59, 0x7f, 0x19, 0x7e, - 0x00, 0x1a, 0xcb, 0xcf, 0xfe, 0x24, 0xa9, 0x2a, 0x0c, 0x6c, 0x3a, 0x7c, - 0x5f, 0xf9, 0xf9, 0x18, 0x6f, 0x3c, 0x9f, 0x2d, 0xbe, 0x81, 0x98, 0xd6, - 0x5f, 0xdc, 0xf1, 0x81, 0xf4, 0xb2, 0xfc, 0x3d, 0x18, 0x76, 0x59, 0x7e, - 0xce, 0xf1, 0xfe, 0x59, 0x7f, 0x85, 0xc2, 0xcd, 0xe7, 0xa5, 0x97, 0xf1, - 0x67, 0xdf, 0x89, 0x25, 0x97, 0xff, 0xdc, 0xee, 0x78, 0x46, 0xe0, 0x23, - 0xd0, 0xd5, 0x96, 0xe2, 0xca, 0xc4, 0xd0, 0xe6, 0x2d, 0xd1, 0x49, 0x14, - 0x74, 0xd0, 0x26, 0x02, 0xa8, 0x5f, 0xb3, 0x3b, 0xec, 0x59, 0x73, 0xb5, - 0x65, 0xff, 0x07, 0x9d, 0x89, 0x83, 0xf7, 0x16, 0x5f, 0x1e, 0xb5, 0x0b, - 0x2f, 0xf6, 0x6f, 0xc6, 0x62, 0x8a, 0x2a, 0x4b, 0xf4, 0xd1, 0x9e, 0xe2, - 0xca, 0x9c, 0x8b, 0xff, 0x1e, 0x11, 0x08, 0x87, 0x57, 0xf9, 0x97, 0x01, - 0x07, 0x8f, 0x4b, 0x2f, 0x35, 0xfa, 0xb2, 0xa6, 0x4d, 0x9f, 0xd0, 0xd5, - 0x09, 0xfe, 0xf3, 0x7a, 0x59, 0x7d, 0xf0, 0x0f, 0x4b, 0x2d, 0xfb, 0x20, - 0xd7, 0x74, 0x2e, 0xfd, 0xbd, 0xda, 0x6d, 0x59, 0x50, 0x7a, 0xa4, 0x59, - 0x7e, 0xc9, 0xa5, 0x12, 0x59, 0x7f, 0x6c, 0x38, 0xc2, 0x1a, 0xca, 0x85, - 0xd0, 0x49, 0x38, 0x1c, 0x6c, 0x9e, 0x65, 0x78, 0xe3, 0x79, 0x0c, 0x9e, - 0x90, 0x08, 0x51, 0x79, 0xff, 0x35, 0x97, 0xfc, 0x32, 0x0f, 0x33, 0x6c, - 0xd9, 0x65, 0xe8, 0xd1, 0x2c, 0xbf, 0xd8, 0x32, 0x7e, 0x18, 0xd6, 0x5b, - 0xcb, 0x2f, 0x05, 0xf6, 0x23, 0xc2, 0xe1, 0x8d, 0x69, 0x12, 0x1d, 0x5d, - 0xbe, 0x6f, 0x31, 0xab, 0x28, 0xcf, 0x15, 0xc8, 0xef, 0xe8, 0xd7, 0x7b, - 0x9b, 0x8b, 0x29, 0xa9, 0xbd, 0xb8, 0xe3, 0x2e, 0x30, 0xf2, 0x20, 0xbf, - 0x84, 0x19, 0x46, 0x6c, 0xb2, 0xc4, 0xb2, 0xfa, 0x36, 0x89, 0x2c, 0xa1, - 0x9f, 0x03, 0x97, 0x10, 0x85, 0xfd, 0xe3, 0xe9, 0x43, 0x56, 0x5f, 0xfe, - 0xc1, 0xbb, 0x73, 0xe9, 0x67, 0xf8, 0x35, 0x97, 0x79, 0xd6, 0x5d, 0x37, - 0x16, 0x5f, 0xb3, 0x79, 0x90, 0xf0, 0xd7, 0x08, 0x2d, 0x7f, 0x4e, 0xee, - 0x73, 0x90, 0xb2, 0xfb, 0x3e, 0xec, 0x2c, 0xbf, 0xf9, 0xf5, 0x8c, 0x1e, - 0xb3, 0x7b, 0xe9, 0x65, 0x78, 0xf9, 0xf7, 0x91, 0x5f, 0xb7, 0x5f, 0x61, - 0x24, 0xb2, 0xa7, 0x27, 0x3a, 0xcd, 0xe2, 0x0f, 0xb2, 0x12, 0xc1, 0x24, - 0xbe, 0x1e, 0x79, 0xd6, 0x5f, 0xf1, 0x4b, 0xd8, 0x45, 0x02, 0xac, 0xbf, - 0xfc, 0xfb, 0x46, 0xb4, 0xf2, 0x9d, 0xf8, 0xf1, 0x65, 0x62, 0x21, 0x08, - 0xde, 0xff, 0xd9, 0xad, 0x3c, 0xa7, 0x6f, 0x8d, 0xc5, 0x95, 0x07, 0xcd, - 0x22, 0x1a, 0xd2, 0x6f, 0xc4, 0xa5, 0xd8, 0xc2, 0xef, 0xf6, 0xb9, 0xec, - 0x23, 0xe2, 0xca, 0x85, 0x7b, 0x98, 0x5a, 0x72, 0xd1, 0xdc, 0xda, 0xff, - 0xb0, 0x78, 0x50, 0x41, 0x85, 0x96, 0x15, 0x65, 0xff, 0xf1, 0x7f, 0x9f, - 0x76, 0x3e, 0x97, 0x7f, 0x89, 0x2c, 0xa8, 0x3e, 0x53, 0x12, 0xa8, 0x7e, - 0x36, 0xbd, 0xa3, 0xb2, 0x94, 0xfe, 0x90, 0xe9, 0x05, 0xd9, 0x1f, 0x5b, - 0x11, 0xea, 0x82, 0x76, 0x27, 0xe8, 0xcb, 0x8e, 0x3a, 0x59, 0xa3, 0x83, - 0xd5, 0x68, 0xd2, 0xd9, 0xd3, 0xaf, 0x52, 0x17, 0xdd, 0x5f, 0xf8, 0xd9, - 0x0a, 0x9a, 0x5d, 0xc9, 0xc3, 0x7e, 0xcf, 0xbe, 0x06, 0x3f, 0xed, 0xf3, - 0x90, 0x42, 0x21, 0x6e, 0xc2, 0x6a, 0xff, 0xb3, 0x45, 0x1d, 0x96, 0x79, - 0x65, 0xfd, 0x22, 0xc0, 0x1f, 0x56, 0x5f, 0xfc, 0x40, 0x61, 0xf9, 0x92, - 0x82, 0x02, 0xcb, 0xf7, 0xf8, 0x37, 0x92, 0xca, 0xf9, 0x12, 0xe6, 0x58, - 0x48, 0x77, 0xfd, 0xde, 0x78, 0xe1, 0xae, 0x35, 0x97, 0xc3, 0xd3, 0xc9, - 0x65, 0xf1, 0x7a, 0x18, 0x59, 0x78, 0x48, 0xfd, 0x65, 0xff, 0xbc, 0x65, - 0x1f, 0x70, 0xdb, 0x0b, 0x2f, 0x72, 0x34, 0xb2, 0xee, 0xf0, 0x07, 0xb3, - 0xf1, 0xed, 0x42, 0x64, 0x4c, 0x1c, 0x19, 0x13, 0x91, 0x05, 0xde, 0xff, - 0x00, 0xb2, 0x52, 0x7e, 0x2c, 0xbf, 0x9c, 0x5c, 0xfc, 0x4e, 0xac, 0xb8, - 0x66, 0xb2, 0xfb, 0xee, 0x47, 0xcb, 0x2e, 0x79, 0x4e, 0x37, 0x46, 0x2d, - 0x79, 0x8f, 0x1a, 0xcb, 0xff, 0xa6, 0xd4, 0x6f, 0xf4, 0x1e, 0x8e, 0x65, - 0x95, 0x23, 0xe4, 0xf8, 0x76, 0xff, 0x38, 0xfd, 0x9d, 0xe3, 0xac, 0xbf, - 0xb9, 0x83, 0x3e, 0x6c, 0xb2, 0xf4, 0xa3, 0xf5, 0x97, 0xe1, 0x26, 0x94, - 0x6e, 0x24, 0xa8, 0x5c, 0x62, 0xc8, 0x67, 0x31, 0x1a, 0x89, 0xa4, 0xe8, - 0xcb, 0xcd, 0x4f, 0x09, 0x12, 0x23, 0xe1, 0x97, 0x4b, 0x84, 0x1d, 0xb0, - 0x16, 0x5f, 0xfc, 0xc1, 0x05, 0xc4, 0xce, 0x1c, 0x12, 0xcb, 0xd3, 0xe6, - 0x35, 0x95, 0xa3, 0xe2, 0x6a, 0x1d, 0xe8, 0x7d, 0x2c, 0xbf, 0x9b, 0xdf, - 0x46, 0xf8, 0x59, 0x7d, 0x84, 0x0f, 0xd6, 0x5f, 0xfb, 0xa1, 0x6f, 0xa0, - 0xc9, 0xc6, 0xb2, 0xfa, 0x52, 0x7e, 0xac, 0xaf, 0x8f, 0x7d, 0xcf, 0x6f, - 0x98, 0xd3, 0x8a, 0xb2, 0xe0, 0x6f, 0x59, 0x61, 0x15, 0x10, 0x2a, 0xdd, - 0x55, 0x02, 0x8a, 0xd1, 0xeb, 0x74, 0x64, 0x51, 0xfa, 0xc4, 0x55, 0x1b, - 0xd5, 0xfc, 0x03, 0xdb, 0xae, 0x35, 0x97, 0xf1, 0xb2, 0xc1, 0xe8, 0x15, - 0x65, 0xfe, 0xf1, 0x88, 0xcf, 0xff, 0xe1, 0x25, 0x68, 0xfa, 0xa7, 0xcc, - 0xaf, 0xd8, 0xd7, 0x7d, 0x96, 0x5f, 0xa0, 0x1e, 0x8d, 0x2c, 0xbd, 0xe0, - 0xb0, 0xb2, 0xf6, 0xeb, 0x2f, 0x8b, 0x2b, 0xc7, 0x84, 0x43, 0xd5, 0xb2, - 0x6d, 0xc7, 0x09, 0x82, 0x25, 0xe9, 0x38, 0x8d, 0x37, 0xfc, 0x5f, 0x8f, - 0xce, 0x26, 0x6c, 0xb2, 0xfd, 0x81, 0x65, 0xe7, 0x16, 0x51, 0x9f, 0x37, - 0x8e, 0xef, 0xf8, 0xbb, 0xc0, 0xfd, 0xd3, 0x15, 0x65, 0xff, 0xfb, 0x05, - 0x86, 0x85, 0xc7, 0xdf, 0x80, 0x64, 0x2a, 0xcb, 0xff, 0x7d, 0xd0, 0x78, - 0xc7, 0xec, 0xd9, 0x65, 0xfe, 0xfc, 0xfe, 0xe7, 0x8c, 0x55, 0x95, 0x87, - 0xef, 0xa4, 0x1b, 0xf9, 0xf9, 0x98, 0x4c, 0x2c, 0xac, 0x3c, 0xd0, 0x90, - 0xde, 0x77, 0x15, 0x65, 0x42, 0x72, 0x63, 0x3b, 0xf4, 0x63, 0x64, 0x43, - 0x7f, 0xbb, 0xc9, 0xd8, 0xd3, 0x1a, 0xcb, 0xfe, 0x7d, 0x4c, 0x51, 0xff, - 0x02, 0xb2, 0xa0, 0xfb, 0xc6, 0x6b, 0x7f, 0xa1, 0xe5, 0xc1, 0x23, 0x71, - 0x65, 0xff, 0xa7, 0x13, 0xb1, 0x3b, 0x9f, 0xff, 0x0b, 0x2f, 0xff, 0x6c, - 0x1f, 0xf9, 0x23, 0xe7, 0x23, 0x52, 0x59, 0x63, 0x61, 0x12, 0x5a, 0x45, - 0xbf, 0xcf, 0xef, 0xb9, 0x05, 0xd5, 0x95, 0x24, 0xc9, 0x39, 0x0c, 0x8e, - 0x94, 0xdf, 0xff, 0xe1, 0xfa, 0x01, 0xe3, 0x99, 0xde, 0x4c, 0x38, 0x8f, - 0xb8, 0xb2, 0xf8, 0xb3, 0x7e, 0x2c, 0xad, 0x91, 0x0e, 0x2b, 0x2d, 0xfe, - 0xf1, 0xcd, 0x28, 0x29, 0x2c, 0xbf, 0xff, 0xa3, 0xbc, 0x10, 0xbb, 0xe0, - 0xbc, 0xbb, 0xcc, 0x15, 0x65, 0xff, 0xa0, 0x5e, 0x32, 0x5c, 0x19, 0xf7, - 0x56, 0x54, 0x23, 0xe4, 0x04, 0xba, 0x33, 0xea, 0xed, 0xf4, 0xbd, 0x9b, - 0x2c, 0xbe, 0x3d, 0x81, 0x25, 0x97, 0xfd, 0x1f, 0x35, 0xfb, 0x9f, 0x75, - 0x65, 0xcf, 0xb2, 0xca, 0xf9, 0x12, 0xfa, 0x23, 0x22, 0x31, 0x4e, 0xaf, - 0xf3, 0x5f, 0x85, 0x18, 0xc2, 0xcb, 0xfe, 0x08, 0x7c, 0x7d, 0xf3, 0xc9, - 0x65, 0xf8, 0x3e, 0xd4, 0x0a, 0xb2, 0xe9, 0xf7, 0x59, 0x74, 0x03, 0x11, - 0x5a, 0xd3, 0x2e, 0x9c, 0x88, 0x53, 0x76, 0x9d, 0x65, 0xff, 0xdb, 0xcf, - 0x9c, 0xc2, 0x03, 0x97, 0xeb, 0x2f, 0xf7, 0x8c, 0x63, 0xc1, 0x66, 0x59, - 0x7c, 0xc1, 0xfd, 0xc5, 0x96, 0xff, 0x11, 0x3c, 0x04, 0x5e, 0x9a, 0xdf, - 0x09, 0xe7, 0xea, 0xcb, 0x46, 0x8f, 0x65, 0xa6, 0xd5, 0xa4, 0xcd, 0x3d, - 0x18, 0x6d, 0xff, 0x9f, 0xee, 0x67, 0x4d, 0xaf, 0x25, 0x96, 0xea, 0xca, - 0xfc, 0xf3, 0xc4, 0x3e, 0xbf, 0xfb, 0x3c, 0x60, 0xf6, 0x77, 0x18, 0x92, - 0xcb, 0xff, 0xff, 0x3e, 0x98, 0x1f, 0xa3, 0x9e, 0xcf, 0xa5, 0xd3, 0x9a, - 0x38, 0x15, 0x95, 0x88, 0xb3, 0x74, 0x4b, 0xe2, 0x9c, 0x09, 0x96, 0x5f, - 0xff, 0xe9, 0x8a, 0x1b, 0xa8, 0x06, 0x6b, 0x3c, 0x7a, 0xf3, 0xac, 0xbf, - 0xfe, 0x7d, 0x7f, 0x3f, 0x9a, 0x89, 0x1f, 0xdd, 0xc5, 0x97, 0xff, 0xff, - 0x07, 0x9e, 0x79, 0x72, 0x47, 0xd1, 0x35, 0x1e, 0x8e, 0xf1, 0xfe, 0x59, - 0x7e, 0x8c, 0x2e, 0xcf, 0xac, 0xbf, 0x8f, 0xef, 0xf4, 0xe3, 0x59, 0x66, - 0xac, 0xa6, 0x9f, 0x4f, 0x8a, 0x48, 0xbe, 0xfd, 0xe8, 0xd7, 0x0d, 0x65, - 0xda, 0xdc, 0x59, 0x7a, 0x41, 0x1a, 0xcb, 0x9f, 0xe9, 0xc8, 0x8c, 0x19, - 0x74, 0xc4, 0xee, 0x35, 0x50, 0xaa, 0x2f, 0x09, 0x4d, 0x7f, 0x4a, 0x7c, - 0x8d, 0xa6, 0xfe, 0x3d, 0x4f, 0x7c, 0xe9, 0xac, 0xbf, 0xff, 0xb0, 0xb6, - 0xe7, 0x23, 0xfc, 0xf1, 0xe9, 0xc5, 0xea, 0xcb, 0xf8, 0x78, 0x4c, 0x6a, - 0x16, 0x54, 0x99, 0xb4, 0x03, 0x8e, 0xd0, 0x10, 0xb1, 0xfa, 0x34, 0x59, - 0xa3, 0xb6, 0xd4, 0x34, 0xdb, 0x0e, 0xbf, 0x46, 0xf9, 0xfb, 0xc9, 0x43, - 0x5f, 0xb2, 0xab, 0x37, 0xa7, 0x8a, 0x65, 0x3e, 0xb9, 0x73, 0x2f, 0x75, - 0x65, 0xe3, 0x6e, 0x2c, 0xaf, 0x8d, 0xce, 0x87, 0xaf, 0xff, 0xf1, 0x60, - 0xfd, 0x02, 0x96, 0x1e, 0xd3, 0xe1, 0xf1, 0xe9, 0x65, 0x43, 0x60, 0x24, - 0x74, 0xe5, 0x67, 0x8c, 0xdc, 0x24, 0x57, 0xd0, 0x03, 0x02, 0xcb, 0xe1, - 0xe8, 0xc5, 0x59, 0x7b, 0xd9, 0xfa, 0xcb, 0x42, 0xcb, 0xff, 0xe9, 0x9d, - 0xe5, 0xc8, 0x68, 0xfd, 0x04, 0x05, 0x95, 0x07, 0xbe, 0x62, 0x17, 0xfd, - 0x93, 0x4a, 0x3e, 0xcf, 0xba, 0xb2, 0xdb, 0x42, 0x35, 0xf1, 0xf0, 0x88, - 0x2a, 0x49, 0xa7, 0x8c, 0x87, 0x50, 0xfa, 0xbe, 0x1f, 0x83, 0xb2, 0xcb, - 0xf9, 0xe5, 0x9b, 0x04, 0x96, 0x5d, 0x83, 0x59, 0x43, 0x3c, 0x30, 0x16, - 0xdf, 0xfb, 0x59, 0xb9, 0x37, 0x9d, 0xa7, 0xc5, 0x96, 0xda, 0x11, 0x97, - 0x8c, 0xfa, 0x22, 0xb1, 0xac, 0xb9, 0x97, 0x8b, 0x2b, 0x0f, 0x7f, 0x46, - 0xae, 0x21, 0x7f, 0xed, 0xe7, 0xd9, 0x44, 0xee, 0xc0, 0x56, 0x5a, 0x65, - 0x97, 0xe9, 0xf0, 0xfb, 0x00, 0xb2, 0xb0, 0xff, 0xe6, 0x42, 0xe8, 0x95, - 0xfd, 0x1d, 0x3f, 0xe2, 0x4b, 0x2e, 0x93, 0xac, 0xad, 0x1e, 0x1b, 0x96, - 0xdf, 0xdf, 0x6c, 0xf2, 0x8d, 0xc5, 0x97, 0x14, 0x96, 0x54, 0x1e, 0x46, - 0xc6, 0x54, 0xc9, 0x6e, 0x1c, 0xe1, 0xce, 0x44, 0x4c, 0x0d, 0x80, 0xbc, - 0xe1, 0x02, 0xd8, 0x66, 0x7a, 0xb1, 0xa1, 0x78, 0xe7, 0x4a, 0x36, 0x0e, - 0x42, 0xb3, 0xae, 0x41, 0x69, 0xbf, 0xf3, 0x24, 0x48, 0x68, 0x3c, 0xff, - 0x7e, 0xb2, 0xff, 0x4a, 0x6c, 0x27, 0xf6, 0x2c, 0xbe, 0xfa, 0x50, 0xd5, - 0x97, 0xfd, 0x05, 0xb7, 0x31, 0xb1, 0xb8, 0xb2, 0xe8, 0xf2, 0xcb, 0xf9, - 0xe6, 0x1c, 0x16, 0xcb, 0x2b, 0x64, 0x51, 0x0c, 0x8c, 0x8e, 0xf7, 0x8b, - 0x5f, 0x44, 0xc7, 0xe5, 0x97, 0xb7, 0x61, 0xab, 0x29, 0xcf, 0x07, 0x74, - 0x8a, 0xfc, 0x43, 0xf4, 0x49, 0x65, 0xfb, 0xd1, 0x2c, 0xe2, 0xcb, 0xed, - 0xd8, 0x20, 0x2c, 0xbf, 0xbd, 0x8c, 0x3c, 0x6c, 0xb2, 0xfa, 0x26, 0xd4, - 0x2c, 0xb9, 0xb8, 0xb2, 0x9a, 0x6e, 0x3c, 0x45, 0x7d, 0x01, 0x65, 0x9a, - 0xcb, 0xee, 0x14, 0x0a, 0xb2, 0xfc, 0x3f, 0x61, 0x49, 0x65, 0x61, 0xe4, - 0xb9, 0x15, 0xe9, 0x1f, 0xeb, 0x2f, 0xcf, 0xce, 0x9c, 0xcb, 0x2f, 0xf1, - 0xea, 0x36, 0x7d, 0x01, 0x65, 0xc0, 0x99, 0x65, 0xbb, 0x39, 0x51, 0xdc, - 0x12, 0x0c, 0x9f, 0x09, 0xc0, 0x48, 0x6c, 0xda, 0x21, 0xf3, 0x73, 0x90, - 0x70, 0x77, 0xa5, 0x13, 0xe6, 0x77, 0xff, 0xb4, 0x02, 0xcd, 0xe5, 0x91, - 0xa8, 0xe2, 0xcb, 0xfc, 0xf3, 0x7b, 0x1b, 0x9c, 0x59, 0x58, 0x7f, 0x9b, - 0xd2, 0x6f, 0x4f, 0xc7, 0x56, 0x5f, 0x46, 0xf3, 0xde, 0xb2, 0xec, 0x6a, - 0xcb, 0x31, 0x38, 0xdd, 0x99, 0x2d, 0x6c, 0x88, 0x32, 0x5a, 0xbf, 0x31, - 0xdc, 0xc6, 0xac, 0xbf, 0xf4, 0xa4, 0x60, 0x86, 0xcd, 0xc8, 0x59, 0x58, - 0x88, 0xa3, 0x23, 0x72, 0x8b, 0xff, 0xd3, 0x16, 0x30, 0xc3, 0xf7, 0x86, - 0x53, 0x2c, 0xbe, 0xf6, 0x6c, 0x4b, 0x2f, 0xd8, 0x33, 0xd7, 0x16, 0x5f, - 0x84, 0x91, 0xff, 0xc5, 0x97, 0xed, 0x02, 0x33, 0x65, 0x97, 0xbb, 0xdf, - 0x96, 0x5f, 0xfd, 0xf0, 0x0f, 0xd3, 0xb7, 0x73, 0xc6, 0xd5, 0x95, 0xf9, - 0xf4, 0x74, 0x7a, 0xe0, 0xe9, 0x65, 0x62, 0x32, 0xb9, 0x09, 0x09, 0xf2, - 0x3b, 0x46, 0xc9, 0xa9, 0x34, 0x9c, 0x58, 0x7a, 0x54, 0x2f, 0x9f, 0xe4, - 0xab, 0xb3, 0x8c, 0xab, 0xd1, 0x98, 0x39, 0x6f, 0x13, 0x3b, 0x1b, 0xa5, - 0xff, 0x88, 0xc4, 0xfb, 0x37, 0xfd, 0x02, 0x2c, 0xb4, 0x96, 0x5f, 0xfe, - 0x3c, 0xd0, 0xe0, 0x5c, 0xf4, 0x7d, 0xc5, 0x97, 0xc2, 0x46, 0xbf, 0x59, - 0x7f, 0xe8, 0xfb, 0xde, 0x8d, 0xa0, 0x2d, 0x59, 0x7f, 0xf6, 0xb4, 0xff, - 0xe7, 0x8f, 0x5e, 0x75, 0x96, 0x92, 0xca, 0xe1, 0xea, 0x88, 0x89, 0x73, - 0xe9, 0x65, 0xff, 0xf9, 0x8c, 0xe9, 0xf3, 0xc1, 0xce, 0xfe, 0xe3, 0x85, - 0x97, 0xf7, 0x4f, 0x66, 0xc0, 0x16, 0x50, 0xd1, 0x35, 0xa1, 0x6f, 0x2b, - 0x5f, 0x48, 0xf5, 0x25, 0x97, 0xf7, 0xf3, 0x48, 0xf5, 0x25, 0x93, 0x1a, - 0x2b, 0xfd, 0xec, 0xf6, 0x01, 0xc0, 0xb2, 0xe3, 0xd9, 0x65, 0x00, 0xf2, - 0x7a, 0x65, 0x5f, 0x22, 0xb3, 0x50, 0x8a, 0xbf, 0xc0, 0x98, 0xda, 0x17, - 0xe2, 0xcb, 0xec, 0x0e, 0xb6, 0x59, 0x5f, 0x1e, 0xbb, 0x4d, 0x2f, 0x40, - 0xc6, 0xb2, 0xec, 0xdd, 0x59, 0x7d, 0xf8, 0x85, 0x25, 0x96, 0x72, 0x37, - 0xbd, 0x19, 0xbf, 0x73, 0x98, 0x5f, 0xac, 0xaf, 0xcf, 0x34, 0x89, 0x6a, - 0x15, 0x34, 0x9c, 0x3f, 0x9e, 0x10, 0x1d, 0x23, 0x0c, 0x29, 0xad, 0x32, - 0xcb, 0xfe, 0x0b, 0x89, 0x34, 0xb3, 0xe9, 0x2c, 0xaf, 0x8f, 0x38, 0x84, - 0xaf, 0xc2, 0x77, 0xf6, 0xe2, 0xca, 0x69, 0xe6, 0x7e, 0x45, 0x74, 0x71, - 0x65, 0xf4, 0x7a, 0x06, 0xb2, 0x80, 0x6d, 0xe6, 0x16, 0xbf, 0xe9, 0x3e, - 0xba, 0x50, 0xde, 0x2c, 0xbf, 0xd0, 0x38, 0xd0, 0x63, 0xf5, 0x97, 0x8b, - 0x3e, 0x59, 0x73, 0x79, 0x32, 0x21, 0xda, 0x70, 0x46, 0x77, 0xff, 0xd1, - 0x9f, 0x77, 0xd8, 0x72, 0x36, 0x18, 0xc5, 0x97, 0xe2, 0x8d, 0xd2, 0x85, - 0x97, 0xff, 0xf3, 0x8a, 0x37, 0x7d, 0x6d, 0xe7, 0xef, 0x8f, 0x52, 0x59, - 0x7f, 0xce, 0x59, 0xde, 0x98, 0xbd, 0x59, 0x7f, 0xff, 0xf4, 0xd2, 0x32, - 0xec, 0x7f, 0xbb, 0xd3, 0x63, 0x59, 0x1f, 0x48, 0xda, 0xb2, 0xa1, 0x15, - 0xe4, 0x71, 0x50, 0xab, 0x8f, 0x16, 0x8e, 0x15, 0x3a, 0x3c, 0x75, 0x02, - 0x28, 0x0c, 0x61, 0x75, 0x3d, 0xb6, 0x32, 0x70, 0x8d, 0x2a, 0x40, 0x9e, - 0x3e, 0x30, 0x86, 0x01, 0x19, 0x92, 0xbc, 0x49, 0xfc, 0x25, 0x79, 0x2c, - 0x9b, 0xb2, 0xf5, 0x6f, 0xc6, 0x20, 0x5f, 0x8b, 0x2f, 0xfe, 0xef, 0xd2, - 0xce, 0x9e, 0xf8, 0x20, 0x2c, 0xbf, 0xa0, 0x3f, 0x1f, 0xdb, 0xab, 0x2f, - 0xd8, 0x2e, 0x7d, 0xd5, 0x95, 0x38, 0xf6, 0xcc, 0xca, 0xff, 0x7d, 0x2c, - 0x1f, 0xb3, 0x65, 0x94, 0x34, 0xc8, 0x7e, 0x28, 0xd4, 0x28, 0x48, 0x8e, - 0xfd, 0x1a, 0xfa, 0x5c, 0x59, 0x7f, 0xff, 0xda, 0x99, 0xfc, 0x7c, 0x89, - 0x8f, 0xbd, 0xcf, 0x7e, 0x7b, 0xd6, 0x56, 0xc8, 0x93, 0x09, 0x4d, 0xed, - 0x67, 0x16, 0x5f, 0x8c, 0xb7, 0xe4, 0x96, 0x5e, 0xc3, 0xd9, 0x65, 0x30, - 0x7c, 0x0d, 0x1c, 0xf1, 0x45, 0xfd, 0x1b, 0x67, 0x71, 0xab, 0x2f, 0xfe, - 0xc2, 0x08, 0x3d, 0x8d, 0x99, 0xc0, 0xb2, 0x8d, 0x14, 0x3a, 0x30, 0xe1, - 0x6d, 0xf3, 0x4e, 0x06, 0xb2, 0xff, 0x13, 0x1e, 0x86, 0xb4, 0x96, 0x5f, - 0xdb, 0x87, 0x1b, 0xa1, 0xea, 0xcb, 0xf4, 0x4d, 0x98, 0x05, 0x95, 0x08, - 0xae, 0xc2, 0x13, 0x33, 0xf1, 0x9d, 0xf1, 0x35, 0xfa, 0xb2, 0xf1, 0x1c, - 0x96, 0x5f, 0xfb, 0xd9, 0x31, 0xcc, 0x1d, 0xd0, 0xf1, 0x65, 0xe3, 0xd3, - 0x0b, 0x2f, 0xba, 0x71, 0xf2, 0xca, 0x34, 0x41, 0x92, 0x27, 0x07, 0x6f, - 0xfa, 0x26, 0x8e, 0xfb, 0x34, 0x05, 0x97, 0xbd, 0x13, 0x2c, 0xb4, 0x7c, - 0x7a, 0xdb, 0xa7, 0x35, 0x24, 0x57, 0xf2, 0x10, 0x97, 0x88, 0xcd, 0x65, - 0xcf, 0xb2, 0xcb, 0xf9, 0xdb, 0x9b, 0xdf, 0x4b, 0x2b, 0x63, 0xc5, 0x68, - 0xbd, 0xff, 0xa6, 0x3f, 0x47, 0xd2, 0x89, 0xa1, 0x65, 0x19, 0xf1, 0x84, - 0x8e, 0xf9, 0xb1, 0xd6, 0xac, 0xbf, 0x0d, 0xca, 0x3c, 0xb2, 0xfe, 0x94, - 0x7d, 0xdc, 0xf2, 0xcb, 0xff, 0xdd, 0xe1, 0xff, 0x12, 0xe6, 0x67, 0xdd, - 0x59, 0x53, 0x1f, 0xcf, 0x0b, 0xab, 0xc8, 0xc2, 0x16, 0x13, 0xf7, 0xfb, - 0xcf, 0x36, 0x1e, 0xe8, 0xd6, 0x54, 0x26, 0x86, 0x70, 0xe4, 0xe1, 0x4d, - 0xf9, 0xbb, 0xa4, 0x1d, 0x96, 0x5f, 0xee, 0x1f, 0x8e, 0x63, 0xd9, 0x65, - 0xfd, 0xf4, 0xb0, 0x3a, 0xd9, 0x65, 0xff, 0xed, 0x6a, 0x0b, 0x18, 0x3f, - 0x7b, 0x04, 0x59, 0x46, 0x7f, 0x41, 0x30, 0xa8, 0x47, 0xde, 0x16, 0x6a, - 0x15, 0xd7, 0x81, 0xe8, 0x59, 0x76, 0xa1, 0x65, 0x7c, 0x6c, 0xa6, 0x1c, - 0xbf, 0x41, 0xf6, 0x7a, 0x9e, 0x0b, 0x2f, 0xce, 0x63, 0x82, 0x59, 0x74, - 0x05, 0x65, 0x42, 0x24, 0x3c, 0x46, 0x46, 0x5c, 0x25, 0xbe, 0xda, 0x37, - 0x61, 0x65, 0xf7, 0xbf, 0x7e, 0xac, 0xb7, 0x96, 0x5b, 0x7b, 0x9b, 0x40, - 0x91, 0xdf, 0xfc, 0x6d, 0x3e, 0x7a, 0x0f, 0x41, 0xdc, 0x59, 0x50, 0x8c, - 0x73, 0x59, 0x72, 0x8b, 0xf8, 0xb8, 0x7b, 0xe0, 0x6b, 0x2f, 0xfb, 0xf3, - 0x2e, 0xc7, 0x03, 0xe5, 0x97, 0x88, 0xd8, 0x59, 0x7e, 0x7d, 0x6a, 0x36, - 0x59, 0x7f, 0x74, 0xf4, 0x7d, 0x0a, 0xca, 0x9c, 0x8a, 0xa6, 0x9c, 0xf4, - 0x70, 0x42, 0x8b, 0xdc, 0x7f, 0xd6, 0x54, 0x1e, 0xef, 0x50, 0x2f, 0xe0, - 0x89, 0xec, 0xfb, 0x8b, 0x2f, 0xff, 0xff, 0xa3, 0xa4, 0xe0, 0x3e, 0x4c, - 0x7a, 0x04, 0x73, 0xb1, 0xf4, 0x09, 0x9c, 0x59, 0x7f, 0xb9, 0x9a, 0x8d, - 0xf1, 0xb8, 0xb2, 0xb4, 0x8b, 0x4e, 0xbe, 0xdf, 0xef, 0x67, 0xd1, 0xa3, - 0x6a, 0xcb, 0xee, 0xc3, 0x61, 0x65, 0xff, 0xff, 0xff, 0x73, 0x3b, 0xe7, - 0x6f, 0x35, 0xa3, 0xfb, 0xae, 0xec, 0x66, 0x4c, 0x1e, 0xc0, 0xbf, 0x42, - 0xcb, 0xf0, 0x66, 0xc9, 0xfc, 0x59, 0x5c, 0x46, 0x17, 0x61, 0x2f, 0x7f, - 0xdf, 0x70, 0x8d, 0xbd, 0xcd, 0xc5, 0x97, 0x66, 0x96, 0x54, 0x1e, 0x97, - 0x8f, 0x2f, 0xee, 0x93, 0xff, 0x84, 0xb2, 0xfc, 0x4f, 0xfe, 0x12, 0xca, - 0x9c, 0x7a, 0x5d, 0x2c, 0xa8, 0x54, 0x94, 0x32, 0x3c, 0x33, 0x78, 0x71, - 0xf5, 0xe8, 0x2e, 0x77, 0xfe, 0xe9, 0xf0, 0x9f, 0xb3, 0x38, 0xd6, 0x5f, - 0x7e, 0xff, 0x71, 0x65, 0xc2, 0x8a, 0xb2, 0xb8, 0x6f, 0x45, 0x24, 0xbe, - 0xf3, 0xe7, 0x92, 0x33, 0x34, 0x55, 0x88, 0xd0, 0x38, 0x4e, 0xdf, 0x84, - 0xc6, 0x9e, 0x96, 0x5f, 0x80, 0x7c, 0xf1, 0xac, 0xb9, 0xae, 0xb2, 0xff, - 0x76, 0x08, 0x13, 0xcf, 0xed, 0x59, 0x5e, 0x3c, 0xf0, 0x8b, 0x5c, 0x7f, - 0x2c, 0xbd, 0xe8, 0xfd, 0x65, 0xed, 0xdd, 0xd8, 0x59, 0x7f, 0xc3, 0xf1, - 0xe8, 0xfe, 0x9a, 0x16, 0x53, 0x9e, 0xe0, 0x48, 0xae, 0x64, 0x6f, 0x59, - 0x58, 0x9c, 0x77, 0xc5, 0x06, 0xed, 0xa2, 0x27, 0x17, 0x27, 0x9e, 0x90, - 0xde, 0xf4, 0xed, 0xc5, 0x97, 0x88, 0x06, 0xb2, 0xfd, 0xe8, 0x2c, 0xd9, - 0x65, 0x41, 0xf2, 0x19, 0x13, 0x8d, 0xdf, 0xd1, 0xd0, 0xb4, 0x3d, 0x59, - 0x7f, 0xa0, 0xbc, 0xff, 0x86, 0x65, 0x95, 0xe3, 0xe2, 0xdd, 0x2e, 0xa8, - 0x6c, 0xbf, 0x76, 0x86, 0xb4, 0xa3, 0x25, 0x1c, 0x37, 0x70, 0xe9, 0x82, - 0x1f, 0xa3, 0x4d, 0x32, 0x8d, 0xc8, 0x61, 0x4d, 0x1b, 0x26, 0xa3, 0x2f, - 0x6c, 0x3d, 0x7d, 0x18, 0x13, 0x96, 0xff, 0x19, 0xab, 0x2c, 0x84, 0xa5, - 0x97, 0x72, 0x32, 0xbe, 0xc7, 0x69, 0xbe, 0x18, 0xdb, 0xb0, 0x8e, 0xbf, - 0xc0, 0xf1, 0xf7, 0x8f, 0xf2, 0xcb, 0xd9, 0xad, 0xeb, 0x2f, 0x8f, 0x42, - 0x4c, 0xb2, 0xff, 0xc5, 0xfb, 0x5e, 0x45, 0x1d, 0xe2, 0xcb, 0xb3, 0x16, - 0x5f, 0x03, 0xc6, 0x22, 0xca, 0x61, 0x1d, 0x86, 0x69, 0xe1, 0xe7, 0x24, - 0x65, 0x9f, 0x08, 0x2b, 0x7e, 0x9a, 0x26, 0xf4, 0x2c, 0xbf, 0xfc, 0x5d, - 0xe0, 0x9d, 0x32, 0x0c, 0xb3, 0x8b, 0x2e, 0x12, 0x16, 0x5e, 0x14, 0x51, - 0x52, 0x5f, 0x4b, 0xb8, 0x04, 0x8c, 0xcd, 0x05, 0xfb, 0x06, 0x7f, 0xf1, - 0x77, 0x7f, 0x2b, 0x47, 0xd2, 0x46, 0x97, 0xa3, 0x92, 0x59, 0x7b, 0x1b, - 0x3e, 0xb2, 0xa1, 0x36, 0xfc, 0x29, 0xd2, 0x53, 0xc2, 0x83, 0xf2, 0x12, - 0x1c, 0xbe, 0x68, 0xf0, 0x96, 0x5d, 0xde, 0x2c, 0xbf, 0xfc, 0x3c, 0xc6, - 0x27, 0x67, 0x4f, 0x9e, 0x35, 0x97, 0xfb, 0xbe, 0x8e, 0xf3, 0xc6, 0xb2, - 0xe7, 0x92, 0xcb, 0xf4, 0xec, 0x98, 0xf6, 0x59, 0x53, 0x8f, 0xd1, 0xa6, - 0x7c, 0x16, 0xb7, 0x16, 0x5f, 0xee, 0xfd, 0x2f, 0x41, 0x6c, 0x92, 0xff, - 0xd9, 0xf4, 0x8f, 0x08, 0xb0, 0x6b, 0x2f, 0x9a, 0x1f, 0xba, 0xb2, 0xfb, - 0x3d, 0x1b, 0xd6, 0x56, 0xc7, 0x8f, 0xc2, 0x4a, 0x84, 0xfc, 0xf6, 0x17, - 0xfa, 0x17, 0xfa, 0x31, 0x21, 0x1e, 0x1a, 0xf6, 0x10, 0x77, 0xf8, 0x1e, - 0x31, 0xc3, 0xe9, 0x65, 0xe3, 0xe1, 0xac, 0xb1, 0xac, 0xbe, 0x71, 0x1c, - 0x6b, 0x2d, 0x2f, 0x1e, 0x6b, 0x8d, 0x84, 0x42, 0x86, 0x8b, 0x3f, 0x9f, - 0xef, 0xf8, 0xa0, 0x5e, 0x19, 0x7d, 0x25, 0x97, 0xff, 0xfe, 0xe7, 0xe7, - 0xa1, 0xe1, 0x78, 0xc1, 0xe3, 0xeb, 0x10, 0x52, 0x59, 0x74, 0x01, 0x65, - 0x12, 0x2e, 0xfa, 0x73, 0xbd, 0xb2, 0xf0, 0x91, 0xb8, 0xb2, 0xf3, 0x1e, - 0x35, 0x95, 0xb1, 0xbd, 0x32, 0x0b, 0xf1, 0x40, 0xb8, 0x4b, 0x2f, 0xfb, - 0xdf, 0x43, 0x13, 0x4a, 0x37, 0x16, 0x5b, 0x83, 0x3e, 0x5c, 0x26, 0xad, - 0x22, 0xb7, 0xb0, 0x86, 0xa5, 0x97, 0xe9, 0x68, 0xe1, 0xab, 0x2b, 0x63, - 0x65, 0xf0, 0x5d, 0x42, 0xb9, 0x9c, 0x8c, 0x88, 0xe1, 0xbe, 0xf1, 0x8d, - 0x85, 0x6a, 0xff, 0x4b, 0xd1, 0xf7, 0x63, 0xcb, 0x2f, 0xff, 0x4b, 0xa1, - 0xf6, 0xa0, 0x59, 0x1f, 0xf8, 0xb2, 0xe7, 0x6a, 0xca, 0xf9, 0x12, 0xc4, - 0x69, 0xbd, 0x32, 0xff, 0xfd, 0xd7, 0xd6, 0x1f, 0xfc, 0xcf, 0x1e, 0xbc, - 0xeb, 0x2f, 0x41, 0x0d, 0x65, 0xfb, 0xee, 0x4d, 0x9d, 0x59, 0x58, 0x8c, - 0xbf, 0x8c, 0xbc, 0xa8, 0x43, 0x77, 0xf1, 0xf4, 0x9f, 0xfe, 0x2c, 0xbf, - 0x43, 0x7b, 0x9e, 0x59, 0x7d, 0xc3, 0x80, 0x2c, 0xbf, 0xfa, 0x6c, 0xd6, - 0x3b, 0x63, 0xc6, 0x35, 0x95, 0x87, 0xc9, 0xd2, 0x1b, 0xf8, 0x2d, 0xcf, - 0x7c, 0xeb, 0x29, 0x84, 0xc1, 0xc0, 0x5a, 0x50, 0x8b, 0xe1, 0x0d, 0xff, - 0xe3, 0x19, 0x3f, 0xc5, 0x9d, 0xc3, 0xfd, 0x65, 0xf6, 0xdb, 0x3e, 0xe2, - 0xcb, 0xe0, 0x0c, 0x3b, 0x2c, 0xbd, 0x2e, 0x05, 0x65, 0xfc, 0x5d, 0x3f, - 0x48, 0x96, 0x5f, 0xff, 0xff, 0xbd, 0x19, 0xb4, 0x8f, 0xbc, 0x8d, 0x63, - 0x33, 0xfe, 0x23, 0x7c, 0x41, 0x01, 0x65, 0xbb, 0x88, 0xf1, 0xf1, 0x23, - 0x8e, 0xf0, 0xb2, 0xf0, 0xa2, 0x8a, 0xb2, 0xff, 0xf9, 0xb9, 0xf7, 0x4b, - 0x36, 0x6e, 0x37, 0x09, 0x23, 0x33, 0x41, 0x50, 0x8c, 0x23, 0x61, 0xbf, - 0x79, 0xf5, 0x9a, 0x59, 0x7f, 0xfa, 0x36, 0x20, 0xec, 0x1e, 0x77, 0x98, - 0x2a, 0xcb, 0x82, 0xeb, 0x28, 0x08, 0x8a, 0xf1, 0x39, 0x26, 0xde, 0xec, - 0x0d, 0x65, 0xf4, 0xba, 0x11, 0xac, 0xbf, 0x41, 0xc9, 0xf8, 0xb2, 0xa0, - 0xf9, 0x7e, 0x1c, 0xd1, 0x1d, 0xfd, 0x9d, 0xf0, 0x63, 0xe5, 0x97, 0xdd, - 0x3d, 0x62, 0xcb, 0xef, 0xb8, 0x6c, 0x0c, 0xf3, 0xf0, 0xba, 0xb6, 0x4d, - 0x30, 0xa1, 0x29, 0xd7, 0xeb, 0xfd, 0x9c, 0x2c, 0xdf, 0xe3, 0x59, 0x7f, - 0xe6, 0xc7, 0xc5, 0x9f, 0xf2, 0x37, 0x16, 0x56, 0x8f, 0xd5, 0xa6, 0x77, - 0xf8, 0x65, 0x9b, 0xcf, 0x4e, 0xb2, 0xa1, 0x30, 0x03, 0x85, 0x58, 0x48, - 0xaf, 0xdb, 0x6e, 0x1e, 0x7c, 0xb2, 0xfc, 0x7c, 0x8d, 0x9a, 0xbb, 0x3f, - 0x57, 0xe8, 0x7d, 0x7e, 0x15, 0xd9, 0xfa, 0xb9, 0xe4, 0xbb, 0x3f, 0x57, - 0xc1, 0x96, 0x71, 0x76, 0x7e, 0xa8, 0x67, 0xa4, 0x44, 0x77, 0xe8, 0xce, - 0x61, 0x2e, 0xcf, 0xd5, 0x2e, 0xcf, 0xd5, 0xcf, 0xd5, 0xd9, 0xfa, 0x69, - 0x71, 0x69, 0x11, 0xfe, 0x05, 0x2a, 0xfb, 0x27, 0xcf, 0xf5, 0xd9, 0xfa, - 0xa5, 0xd9, 0xfa, 0xbb, 0xf8, 0x5d, 0x9f, 0xab, 0xfe, 0xcf, 0xdf, 0x59, - 0xbf, 0x06, 0xbb, 0x3f, 0x57, 0xf6, 0x78, 0xf8, 0x1d, 0x97, 0x67, 0xea, - 0xbf, 0x45, 0x31, 0x12, 0x71, 0x1e, 0xfb, 0x5b, 0x47, 0x57, 0x67, 0xea, - 0x97, 0x67, 0xeb, 0x0d, 0x85, 0xc2, 0x8a, 0xbb, 0x3f, 0x55, 0x25, 0x63, - 0xa3, 0x35, 0xc8, 0x43, 0xfd, 0x09, 0xdd, 0x13, 0xb4, 0xcb, 0x90, 0xbe, - 0xeb, 0x00, 0xa4, 0xf7, 0x43, 0x09, 0xb3, 0xf4, 0x66, 0x89, 0x0b, 0xfe, - 0xda, 0x37, 0xe1, 0xeb, 0x36, 0x59, 0x7f, 0xf3, 0xf8, 0x1e, 0x32, 0x7d, - 0x3c, 0x96, 0x54, 0x91, 0x6d, 0xa3, 0x9e, 0x9d, 0xdf, 0xd1, 0x82, 0x44, - 0xa4, 0xb2, 0xff, 0x73, 0x25, 0x28, 0xef, 0xcb, 0x2b, 0x11, 0x22, 0x46, - 0x1c, 0x2d, 0xbf, 0xf6, 0x00, 0x79, 0xa1, 0x5f, 0xd3, 0x2c, 0xa5, 0x97, - 0xfe, 0x2c, 0x9a, 0x36, 0xfd, 0xfe, 0xe2, 0xca, 0x83, 0xcc, 0xe0, 0x5d, - 0xd2, 0xd9, 0x25, 0xf4, 0xce, 0xfa, 0x59, 0x5b, 0x26, 0x2b, 0xf1, 0x77, - 0xa1, 0x18, 0x44, 0x3b, 0xa3, 0x17, 0x1e, 0xcb, 0x2b, 0x4b, 0xd4, 0x0f, - 0x3c, 0x6b, 0xd5, 0x4b, 0xfb, 0x85, 0x1e, 0x0e, 0x96, 0x5f, 0xdc, 0x2c, - 0xee, 0x7e, 0xb2, 0xbe, 0x3d, 0xa6, 0x96, 0xdf, 0xf4, 0xc5, 0x9b, 0xfd, - 0xf3, 0xee, 0x2c, 0xbf, 0xbb, 0x9e, 0x8d, 0x7e, 0xb2, 0xff, 0xb4, 0x6d, - 0xe0, 0x91, 0x93, 0x2c, 0xbf, 0xe0, 0x47, 0xe3, 0x0b, 0xea, 0x4b, 0x2f, - 0xfc, 0xef, 0xb6, 0x35, 0xcb, 0xe9, 0x2c, 0xbc, 0xec, 0x73, 0x0f, 0xe2, - 0x63, 0xab, 0xff, 0xb3, 0xd3, 0xbb, 0xec, 0x68, 0x91, 0xfa, 0xcb, 0x0b, - 0x39, 0x35, 0xcd, 0x17, 0x14, 0x2c, 0xba, 0x69, 0x50, 0xa8, 0x27, 0x08, - 0xde, 0x39, 0xbb, 0xe3, 0x60, 0xc5, 0x59, 0x7d, 0xdf, 0x66, 0xcb, 0x29, - 0xa7, 0x8c, 0x44, 0x77, 0x0c, 0x55, 0x97, 0xf8, 0x62, 0x6f, 0x77, 0x20, - 0x2c, 0xa8, 0x3e, 0xec, 0x21, 0x31, 0x8b, 0xcd, 0xff, 0x4b, 0x2f, 0x0f, - 0xa4, 0xb2, 0xff, 0xf7, 0xdd, 0xf1, 0x88, 0x3c, 0xc2, 0xe1, 0xac, 0xbf, - 0xff, 0x4b, 0x51, 0xbd, 0xe6, 0x81, 0xfa, 0x1a, 0xf3, 0x2c, 0xbf, 0xdb, - 0xaf, 0xc3, 0xe4, 0xd8, 0xb2, 0xa7, 0x26, 0x24, 0xcc, 0x7b, 0x07, 0x3e, - 0x4a, 0xd2, 0xc5, 0xff, 0x47, 0xd1, 0x9c, 0xe3, 0x7e, 0x59, 0x78, 0xca, - 0x4b, 0x2a, 0x1b, 0xa9, 0xcd, 0x96, 0xa5, 0x3b, 0x5b, 0x91, 0xdd, 0x1c, - 0x68, 0x7b, 0x88, 0x73, 0x24, 0x6a, 0x3d, 0xaf, 0x4a, 0xf7, 0x79, 0xed, - 0x42, 0x95, 0x3b, 0xc8, 0x74, 0x86, 0x33, 0xe1, 0x53, 0xf7, 0x4e, 0xaf, - 0x81, 0xfe, 0xd8, 0xb2, 0x96, 0x59, 0xf4, 0x6b, 0xda, 0x49, 0x7f, 0x63, - 0x66, 0x77, 0x92, 0xcb, 0xff, 0xf9, 0xfd, 0x12, 0x67, 0x9f, 0xc4, 0xb8, - 0x3f, 0x46, 0x96, 0x58, 0xc6, 0x88, 0xaf, 0x16, 0xdf, 0xf9, 0x88, 0xf8, - 0xa3, 0xde, 0x08, 0x16, 0x5f, 0xfd, 0xa8, 0xc2, 0xc9, 0x1f, 0xb3, 0x7a, - 0xcb, 0xff, 0xe2, 0x76, 0x39, 0x9b, 0xe3, 0xee, 0xf0, 0x2d, 0x59, 0x43, - 0x44, 0xb1, 0x21, 0xdf, 0xe2, 0x8e, 0xfd, 0x33, 0xb5, 0x65, 0xfb, 0xa1, - 0xee, 0x0d, 0x65, 0xb1, 0x65, 0x39, 0xb8, 0xde, 0x51, 0x4d, 0x44, 0x71, - 0x36, 0x5f, 0xfd, 0xe8, 0xdb, 0x99, 0xaf, 0xdf, 0x3f, 0x59, 0x7f, 0x13, - 0xb1, 0xe7, 0x92, 0xcb, 0xff, 0x34, 0xb3, 0xa5, 0x00, 0x39, 0x2c, 0xb6, - 0x96, 0x51, 0x9e, 0x6b, 0x9e, 0x5f, 0x81, 0x8d, 0x8e, 0x2c, 0xbc, 0x28, - 0xa2, 0xa4, 0xbc, 0x24, 0x7e, 0x91, 0x99, 0xa0, 0xbf, 0xe7, 0x90, 0x9a, - 0xcd, 0xef, 0xa5, 0x96, 0xd2, 0xcb, 0xff, 0x11, 0x66, 0xd3, 0x4a, 0x35, - 0xb2, 0xcb, 0xde, 0xc9, 0x41, 0xe8, 0x88, 0x23, 0x44, 0x8b, 0xfe, 0xc2, - 0x32, 0xff, 0x14, 0x8d, 0xb9, 0xf7, 0x56, 0x5f, 0x7c, 0x03, 0x25, 0x94, - 0xe7, 0xab, 0xd3, 0x3a, 0x59, 0x77, 0xf1, 0x23, 0x58, 0xcb, 0x21, 0xbf, - 0x4e, 0x80, 0x66, 0x96, 0x5f, 0xfa, 0x74, 0x10, 0x5b, 0x02, 0xc7, 0x16, - 0x5b, 0x06, 0x7d, 0x24, 0x53, 0x7f, 0xdd, 0x72, 0xce, 0x6a, 0x38, 0xb2, - 0xfa, 0x51, 0xff, 0xcb, 0x2f, 0xef, 0xe0, 0xb3, 0xee, 0xac, 0xb9, 0xff, - 0x9c, 0x7a, 0x42, 0x12, 0x5f, 0xfe, 0x10, 0xa6, 0x61, 0xc7, 0xec, 0x06, - 0x69, 0x65, 0x1a, 0x78, 0xde, 0x84, 0xd3, 0x93, 0x14, 0x22, 0x78, 0x63, - 0x7b, 0x7c, 0x69, 0x65, 0xe0, 0xe7, 0x96, 0x56, 0xcb, 0xf2, 0x12, 0x85, - 0x80, 0xca, 0x32, 0x1a, 0xc7, 0x0b, 0x09, 0x88, 0x9a, 0x8d, 0xe7, 0xa7, - 0x20, 0xfd, 0x1c, 0xa1, 0xdf, 0xd9, 0x4d, 0xdb, 0xd4, 0x85, 0x1e, 0xb8, - 0xf6, 0x59, 0x7f, 0x88, 0x03, 0x3d, 0xf0, 0x35, 0x94, 0x33, 0xcb, 0x08, - 0xbd, 0xbf, 0x59, 0x7f, 0xf4, 0xde, 0x8d, 0x84, 0xef, 0x82, 0xf2, 0x59, - 0x7f, 0xd9, 0x1b, 0x93, 0xbc, 0xf9, 0xa5, 0x96, 0x99, 0x65, 0x9a, 0xb2, - 0xcd, 0x33, 0x46, 0xe2, 0x57, 0xec, 0xff, 0x91, 0x25, 0x97, 0xe3, 0x68, - 0xc7, 0x8b, 0x2d, 0xf9, 0x1e, 0x7c, 0xf9, 0x45, 0xff, 0x77, 0xd9, 0xc9, - 0xdd, 0x3d, 0x96, 0x5f, 0xd9, 0x36, 0x68, 0x66, 0xb2, 0xa1, 0x12, 0x86, - 0x56, 0x47, 0x97, 0xfc, 0x46, 0x16, 0x5f, 0x27, 0xe3, 0xab, 0x2f, 0xf7, - 0xfa, 0x3c, 0xf0, 0x78, 0xb2, 0xf6, 0x7c, 0xd5, 0x97, 0xf6, 0x7f, 0xbb, - 0xd3, 0x6a, 0xca, 0x84, 0x41, 0x11, 0xa7, 0x47, 0x6f, 0x3e, 0xbf, 0x59, - 0x52, 0x55, 0xf4, 0x31, 0x29, 0x92, 0x1a, 0xbf, 0xe8, 0xc2, 0x08, 0xb7, - 0xb0, 0xc1, 0x9f, 0x2e, 0xbe, 0xce, 0x89, 0xb2, 0xcb, 0xc2, 0x8a, 0x2a, - 0x62, 0x10, 0x2f, 0x80, 0xee, 0x04, 0xc4, 0x20, 0x33, 0x35, 0xd7, 0xcf, - 0xac, 0x15, 0x65, 0x68, 0xf8, 0xf7, 0xa0, 0xde, 0x14, 0x51, 0x53, 0x10, - 0x79, 0x49, 0x88, 0x3c, 0x66, 0x6b, 0xaf, 0xee, 0xbb, 0x5b, 0x0d, 0x59, - 0x7e, 0x7e, 0xb9, 0x7e, 0xb2, 0xfe, 0xce, 0xf8, 0x2f, 0x25, 0x97, 0x85, - 0x14, 0x55, 0x97, 0xb9, 0x0c, 0x24, 0x66, 0x68, 0x2b, 0x13, 0x4d, 0x02, - 0x97, 0xc5, 0x7e, 0x2d, 0x22, 0x7e, 0xa6, 0xd6, 0xe2, 0xa5, 0x96, 0xca, - 0x02, 0xbc, 0x2c, 0x12, 0xcb, 0xff, 0xbd, 0x12, 0x3e, 0xe7, 0x81, 0x0d, - 0x59, 0x50, 0x88, 0xe7, 0x2f, 0xde, 0x39, 0x7b, 0xb1, 0xc5, 0x97, 0xfe, - 0xf1, 0x8e, 0x0b, 0xb9, 0xf7, 0x56, 0x5f, 0xe2, 0x86, 0xf3, 0x81, 0x25, - 0x94, 0x03, 0xf0, 0xe1, 0xf5, 0xff, 0xde, 0x3d, 0x79, 0xf3, 0x86, 0xfb, - 0x2c, 0xbf, 0xf4, 0x77, 0x35, 0x9c, 0xcf, 0xba, 0xb2, 0xb1, 0x10, 0x24, - 0x87, 0x7f, 0xed, 0x9b, 0x8d, 0xc2, 0xee, 0x01, 0x65, 0xf4, 0x76, 0x1a, - 0xb2, 0xa7, 0xb4, 0xeb, 0xfe, 0x84, 0x63, 0x61, 0x46, 0x44, 0x3d, 0x3e, - 0xbf, 0xef, 0x41, 0x03, 0xee, 0x3e, 0xe2, 0xcb, 0xf4, 0x88, 0x3b, 0x12, - 0xcb, 0xf8, 0x7c, 0xc6, 0xc6, 0xe2, 0xcb, 0xc1, 0x71, 0x16, 0x5d, 0xb7, - 0xcb, 0x2c, 0xe3, 0x36, 0xdf, 0x8e, 0xd4, 0x91, 0xe3, 0xf1, 0xe3, 0x94, - 0x0a, 0xcd, 0x7e, 0x2e, 0xfb, 0x24, 0xb2, 0xf1, 0xc3, 0x0b, 0x29, 0xcf, - 0x0c, 0x89, 0xef, 0xfb, 0x0a, 0x3d, 0xe8, 0x14, 0xd6, 0x5e, 0x12, 0x3f, - 0x59, 0x5b, 0x1f, 0xab, 0x04, 0x0d, 0x37, 0xbf, 0x02, 0x3d, 0x0d, 0x49, - 0x7e, 0x27, 0x22, 0xc4, 0x97, 0x60, 0x12, 0x5c, 0x28, 0xa9, 0x2b, 0x0f, - 0xeb, 0x84, 0xfd, 0x24, 0x14, 0x5a, 0xff, 0x10, 0x91, 0xff, 0xb3, 0x75, - 0x23, 0x33, 0x79, 0x7f, 0xfb, 0x61, 0xe9, 0xc0, 0x59, 0xbf, 0x47, 0xc5, - 0x95, 0x0a, 0xef, 0x72, 0x34, 0xb3, 0x87, 0xb3, 0xc3, 0x9c, 0x29, 0x37, - 0xff, 0x47, 0xfc, 0xcc, 0x1b, 0x93, 0xb0, 0xb2, 0xff, 0x8b, 0xff, 0x3f, - 0x7a, 0x7f, 0xac, 0xbf, 0xff, 0x78, 0xf7, 0x99, 0x0f, 0x91, 0xa3, 0xcf, - 0xb8, 0xb2, 0xfe, 0x28, 0xcd, 0x3f, 0xeb, 0x2f, 0xfd, 0x1a, 0xf4, 0x1f, - 0xa0, 0x8d, 0x65, 0xd2, 0xe6, 0x23, 0xdc, 0x07, 0x5d, 0x56, 0x14, 0xb2, - 0xff, 0x41, 0x63, 0x4f, 0xe9, 0x2c, 0xbf, 0xfe, 0xe1, 0x67, 0xdf, 0xbf, - 0x1f, 0x47, 0xf7, 0xeb, 0x2b, 0xe4, 0x66, 0xf5, 0x24, 0x53, 0x2a, 0xf2, - 0xa3, 0x97, 0x94, 0x0f, 0x7b, 0x78, 0x8d, 0x59, 0x7d, 0xed, 0xb0, 0x55, - 0x97, 0xc3, 0x09, 0x49, 0x65, 0xb8, 0xe7, 0x8c, 0x21, 0x25, 0xfc, 0x60, - 0x1e, 0x3f, 0xeb, 0x2f, 0xff, 0xdd, 0xe7, 0xd3, 0x87, 0x83, 0x87, 0xd6, - 0x17, 0xeb, 0x2f, 0xff, 0xfd, 0x3b, 0xb2, 0xcf, 0xe7, 0xf2, 0x70, 0xf0, - 0x70, 0xfa, 0xc2, 0xfd, 0x08, 0x5f, 0xfd, 0x9d, 0x9c, 0x0f, 0x1f, 0xbc, - 0x7f, 0xaa, 0x10, 0xb5, 0x49, 0x19, 0x7c, 0x77, 0xbd, 0x1b, 0x33, 0xe2, - 0x68, 0xdd, 0x8c, 0x8e, 0xfc, 0xde, 0x0a, 0xff, 0x2c, 0xb7, 0x06, 0x7d, - 0x02, 0x1f, 0x5f, 0xd9, 0x34, 0x8f, 0x5c, 0x59, 0x7f, 0x47, 0xc2, 0x72, - 0x31, 0x65, 0xff, 0xff, 0xcf, 0xb0, 0x83, 0xf4, 0x4b, 0xb9, 0x82, 0xf0, - 0xb3, 0xbd, 0x3d, 0x96, 0x5f, 0xcf, 0xad, 0x3f, 0xf0, 0xb2, 0xa1, 0xb3, - 0x95, 0x1c, 0x65, 0x59, 0x2c, 0x70, 0xe5, 0xb4, 0x6a, 0x76, 0x71, 0xe5, - 0x48, 0xfe, 0x56, 0xcb, 0x66, 0x22, 0x8e, 0x47, 0xb7, 0xd2, 0x90, 0x97, - 0x0a, 0x5c, 0x23, 0xa5, 0xe1, 0x45, 0x15, 0x25, 0xe7, 0x21, 0xa4, 0x66, - 0x68, 0x2f, 0xb3, 0x59, 0xd5, 0x95, 0xf9, 0xe7, 0x70, 0xb6, 0xfb, 0xc6, - 0xf2, 0x59, 0x7f, 0xf8, 0x42, 0x2c, 0xda, 0x3e, 0x94, 0xa1, 0xab, 0x2f, - 0x14, 0x49, 0x65, 0xf6, 0xb4, 0x6d, 0x59, 0x6e, 0x0c, 0xde, 0x98, 0xdd, - 0x49, 0x15, 0xdd, 0x84, 0x45, 0xe6, 0xec, 0x35, 0x94, 0x47, 0x8d, 0xd2, - 0x8b, 0xf6, 0xb0, 0x11, 0xe5, 0x97, 0xa7, 0x31, 0x3e, 0xb2, 0xf7, 0x5c, - 0x6b, 0x2b, 0x46, 0xff, 0x84, 0x77, 0xf9, 0x8f, 0xbb, 0xa8, 0xcf, 0x96, - 0x5f, 0xc0, 0x8f, 0xcf, 0x4c, 0x24, 0xbf, 0x84, 0xcd, 0x66, 0x4c, 0xb2, - 0xfc, 0xfe, 0x9c, 0x38, 0x59, 0x52, 0x55, 0x38, 0x32, 0x3c, 0x8c, 0x55, - 0x82, 0x13, 0x66, 0x72, 0x12, 0x36, 0xe1, 0x7f, 0x4b, 0xaf, 0xcf, 0xad, - 0x67, 0xcb, 0x2f, 0xff, 0x77, 0xc6, 0xff, 0xe6, 0x87, 0x05, 0x25, 0x97, - 0xff, 0xbe, 0x9d, 0xf7, 0xf0, 0x40, 0x7d, 0x89, 0xd6, 0x54, 0x22, 0xff, - 0x0a, 0x09, 0x26, 0xfd, 0x1c, 0x10, 0xa4, 0xb2, 0xfa, 0x70, 0x0e, 0x4b, - 0x2f, 0xfc, 0x0c, 0xd6, 0x1f, 0x3d, 0x1b, 0xd6, 0x5f, 0xa3, 0x77, 0x6c, - 0x15, 0x65, 0xff, 0xff, 0xce, 0x7d, 0x3f, 0x00, 0xe7, 0x48, 0xfc, 0xe5, - 0xd9, 0x66, 0xb1, 0x65, 0xd9, 0xe5, 0x97, 0x66, 0xea, 0xca, 0x98, 0xd7, - 0xf8, 0x5a, 0xbc, 0x8c, 0x17, 0x84, 0xfd, 0xff, 0x14, 0x7d, 0xc8, 0xec, - 0x0d, 0x65, 0xee, 0x09, 0xc9, 0xc7, 0xbf, 0x84, 0xf4, 0x34, 0xf9, 0x7e, - 0x24, 0xf1, 0xff, 0x63, 0x4c, 0xbf, 0xed, 0x44, 0x8f, 0xa6, 0x52, 0x59, - 0x7f, 0xff, 0xff, 0xd1, 0xc8, 0xee, 0xd8, 0x2e, 0xb3, 0xce, 0x27, 0x31, - 0x87, 0x2f, 0xe0, 0xa2, 0x6f, 0x42, 0xcb, 0xf7, 0x3c, 0xe0, 0x85, 0x97, - 0xe7, 0xd8, 0x57, 0x92, 0xca, 0x84, 0xc7, 0x08, 0xdc, 0x58, 0x4a, 0x88, - 0x4f, 0x7f, 0xdc, 0xf4, 0x3e, 0xb5, 0x9f, 0x2c, 0xbf, 0xff, 0xf3, 0x1f, - 0x4b, 0xb8, 0x5d, 0xe4, 0xee, 0x73, 0x35, 0x84, 0xf2, 0x59, 0x58, 0x8a, - 0x83, 0x39, 0xbf, 0x47, 0xfd, 0xcd, 0x96, 0x5f, 0xfc, 0xcc, 0x65, 0x01, - 0x06, 0x30, 0x7a, 0x59, 0x7b, 0x4f, 0xc5, 0x97, 0x60, 0xab, 0x2a, 0x0f, - 0xe4, 0x68, 0xdc, 0x1c, 0xbd, 0xdf, 0x42, 0xca, 0xc3, 0xca, 0x72, 0xeb, - 0xf7, 0xa0, 0x9f, 0xcb, 0x2f, 0xed, 0xbc, 0xfd, 0xd4, 0x2c, 0xbf, 0xc3, - 0xf4, 0x4c, 0xef, 0xf2, 0xcb, 0xde, 0xff, 0x7a, 0xca, 0xd1, 0xea, 0x6e, - 0x9a, 0x5c, 0x7b, 0x2c, 0xbd, 0xf3, 0xee, 0x2c, 0xad, 0x1b, 0x7f, 0x0b, - 0xd4, 0x93, 0x45, 0x19, 0x06, 0x89, 0x9e, 0x10, 0x44, 0xb9, 0x7f, 0xf6, - 0x6b, 0xf6, 0x9f, 0x04, 0xe4, 0x62, 0xcb, 0xd1, 0xf6, 0xe2, 0xcb, 0xee, - 0x11, 0xb0, 0xb2, 0xc3, 0xd1, 0xe1, 0x74, 0x82, 0xff, 0xe6, 0x05, 0x8d, - 0x7a, 0x0d, 0xfb, 0xc5, 0x97, 0xcd, 0x28, 0x99, 0x65, 0xff, 0xf7, 0x8e, - 0x47, 0xa7, 0xff, 0xa5, 0x0d, 0xe2, 0xcb, 0xee, 0xc6, 0xbf, 0x83, 0xf1, - 0x01, 0x15, 0xdb, 0x9c, 0x59, 0x7f, 0xdc, 0x07, 0x9c, 0x6c, 0x86, 0x4c, - 0xf6, 0xb2, 0x98, 0x44, 0xd3, 0x9c, 0xf4, 0x6a, 0xa4, 0xa8, 0xbf, 0x21, - 0x0e, 0x65, 0x0f, 0x1a, 0x85, 0xe9, 0xe8, 0xbf, 0x59, 0x7e, 0x81, 0x09, - 0xe4, 0xb2, 0xff, 0xf6, 0x9c, 0xbb, 0x9f, 0xcf, 0xc0, 0xc7, 0x0b, 0x2f, - 0xe9, 0x6a, 0x24, 0xfa, 0x59, 0x76, 0x35, 0x65, 0xff, 0xd8, 0x5f, 0xce, - 0x13, 0x5f, 0xb4, 0xf8, 0xb2, 0xfe, 0x3f, 0x1e, 0x7d, 0xd5, 0x94, 0x34, - 0x46, 0x34, 0x5b, 0xa9, 0x34, 0xb2, 0xfb, 0xfe, 0xe7, 0xeb, 0x2f, 0xd1, - 0xce, 0x1e, 0xf5, 0x97, 0xcd, 0x22, 0x85, 0x97, 0xfc, 0x63, 0xf4, 0x4b, - 0x3e, 0xea, 0xcb, 0xfe, 0x04, 0x6f, 0x8e, 0x1f, 0xff, 0x2c, 0xb9, 0xd8, - 0x84, 0x4a, 0x8c, 0x83, 0x0e, 0x68, 0x6a, 0xa0, 0xf0, 0x9f, 0xe4, 0xc3, - 0x85, 0xcc, 0xc6, 0x1a, 0x0b, 0xf1, 0x21, 0x42, 0xfa, 0xf4, 0xff, 0xd0, - 0xb2, 0xff, 0x81, 0xe2, 0x8f, 0x8e, 0x3c, 0xb2, 0xa1, 0x9c, 0xaf, 0x28, - 0xd0, 0x86, 0x5b, 0x92, 0x83, 0x4e, 0x36, 0x1d, 0x43, 0xad, 0xa4, 0x2f, - 0x28, 0xc4, 0xa5, 0x3e, 0xf1, 0x1c, 0x32, 0xa9, 0x67, 0xdf, 0x04, 0x20, - 0xbf, 0xf3, 0x98, 0xc3, 0xde, 0x6d, 0x82, 0xac, 0xba, 0x7a, 0x25, 0x97, - 0xee, 0x63, 0x11, 0xc5, 0x97, 0xf4, 0x7c, 0xd7, 0x2f, 0xd6, 0x5f, 0xdb, - 0x9c, 0x32, 0xfa, 0x4b, 0x2f, 0xfc, 0xfa, 0x9f, 0x3f, 0x63, 0xfd, 0xfa, - 0xcb, 0xfb, 0xf1, 0x0b, 0xd9, 0xf2, 0xcb, 0xff, 0xf1, 0xf6, 0x1b, 0x9f, - 0x76, 0x1a, 0x26, 0x9f, 0xf5, 0x97, 0xc6, 0x4e, 0x35, 0x97, 0xfd, 0xc8, - 0xd7, 0x61, 0x98, 0xcd, 0x65, 0x49, 0x16, 0x23, 0x57, 0xe1, 0x05, 0xff, - 0xfd, 0x9e, 0x9d, 0x8d, 0x3f, 0x44, 0xee, 0x73, 0x0b, 0xf5, 0x97, 0xff, - 0x1e, 0xa2, 0x5e, 0x89, 0x88, 0x2c, 0x2c, 0xaf, 0x22, 0x8f, 0x8b, 0xd7, - 0xfe, 0xda, 0x26, 0x28, 0xe6, 0x44, 0x96, 0x5c, 0x09, 0xf5, 0x97, 0xf3, - 0x1d, 0x8f, 0x47, 0x16, 0x5f, 0xf7, 0x0b, 0x3b, 0xc8, 0xd6, 0xcb, 0x2f, - 0xef, 0x1f, 0xdc, 0x7f, 0x96, 0x5f, 0xec, 0x1e, 0x6a, 0x51, 0xa5, 0x97, - 0xbc, 0x7d, 0x59, 0x50, 0x99, 0xe4, 0x8f, 0x8c, 0x6a, 0x62, 0xef, 0xce, - 0x78, 0x5e, 0x21, 0x95, 0xf9, 0xfd, 0x9f, 0x75, 0x65, 0xfb, 0xa0, 0xf4, - 0x05, 0x65, 0xff, 0x9c, 0xb6, 0x17, 0x08, 0x7e, 0x85, 0x97, 0x1e, 0xcb, - 0x2b, 0x0f, 0x54, 0x8f, 0xaf, 0xf0, 0x7e, 0x97, 0x04, 0x8d, 0xc5, 0x97, - 0x81, 0x1b, 0x8b, 0x2f, 0xf4, 0xde, 0x7d, 0x68, 0xc6, 0xb2, 0xb0, 0xf4, - 0xdc, 0x7e, 0xff, 0x3f, 0xc2, 0x68, 0xdb, 0x8b, 0x2f, 0xe7, 0x2d, 0x9a, - 0xfd, 0x59, 0x44, 0x7c, 0x3c, 0x34, 0xbe, 0x3f, 0x3b, 0x56, 0x5f, 0xf1, - 0x16, 0x6d, 0xde, 0xc3, 0x56, 0x54, 0x95, 0x26, 0x61, 0x44, 0xcf, 0xba, - 0x20, 0x28, 0x46, 0x72, 0x10, 0x3d, 0x21, 0x10, 0x86, 0xfd, 0xac, 0xe1, - 0x8a, 0xb2, 0xf9, 0xb1, 0xae, 0x2c, 0xbf, 0xfd, 0x03, 0xf0, 0x58, 0x12, - 0x07, 0xe0, 0xf1, 0x65, 0xd1, 0xb8, 0x33, 0xef, 0x10, 0x8a, 0xf4, 0x4f, - 0x17, 0x59, 0x7f, 0x09, 0x01, 0x00, 0x5a, 0xb2, 0xe3, 0x25, 0x97, 0xd2, - 0x82, 0x02, 0xca, 0x19, 0xb6, 0xc1, 0x5b, 0x4c, 0xb2, 0xf9, 0x92, 0xf1, - 0xf2, 0xcb, 0x41, 0x1b, 0x8e, 0x89, 0x54, 0xe3, 0xfd, 0x35, 0x8b, 0xe8, - 0xff, 0x09, 0x65, 0x49, 0x92, 0x34, 0x32, 0x8c, 0x2e, 0x01, 0x8f, 0xc8, - 0x47, 0x0e, 0x19, 0xa1, 0xa7, 0xa8, 0xd7, 0xdb, 0x2a, 0xc9, 0xdf, 0x7f, - 0x84, 0xbf, 0x0c, 0x42, 0x42, 0x2c, 0x38, 0xa7, 0xc8, 0xef, 0x9a, 0xca, - 0x4f, 0x19, 0xe5, 0x65, 0xdd, 0xe2, 0xca, 0x33, 0xca, 0x98, 0xce, 0xf8, - 0x48, 0x17, 0x8b, 0x2e, 0xff, 0xab, 0x2e, 0xff, 0xcb, 0x2f, 0xb5, 0xac, - 0xe2, 0xcb, 0xb2, 0x65, 0x96, 0x94, 0xe4, 0x46, 0xec, 0x48, 0xd1, 0x87, - 0x18, 0x10, 0x8a, 0xfc, 0x7d, 0x72, 0xc5, 0x97, 0xed, 0x0f, 0x30, 0x96, - 0x5f, 0x31, 0xa7, 0x15, 0x65, 0xff, 0x8f, 0x3d, 0x1b, 0xf9, 0xe8, 0xf9, - 0x65, 0x61, 0xf2, 0x6e, 0x12, 0x5f, 0xdf, 0x68, 0x3f, 0x76, 0x4b, 0x29, - 0xd1, 0xbf, 0xc8, 0x45, 0x04, 0x92, 0xfc, 0x2f, 0x7b, 0x9b, 0x2c, 0xbf, - 0x9e, 0x3f, 0xcf, 0xa4, 0xb2, 0x96, 0x5f, 0xe2, 0xd6, 0x73, 0x0f, 0xcb, - 0x29, 0x92, 0x6f, 0x30, 0x2e, 0xff, 0xfa, 0x5d, 0x2c, 0x7e, 0x96, 0x77, - 0xb8, 0x2a, 0xcb, 0xfd, 0xad, 0x1f, 0x7d, 0x92, 0x59, 0x7a, 0x4f, 0xba, - 0xb2, 0xff, 0xfb, 0x06, 0x7d, 0xc6, 0xfa, 0x20, 0x0d, 0x75, 0x97, 0x66, - 0xf5, 0x97, 0xfc, 0x0f, 0x60, 0xda, 0x7a, 0xc5, 0x95, 0x08, 0x9d, 0xd9, - 0x37, 0x06, 0x2f, 0xe8, 0x8d, 0x7a, 0x37, 0xac, 0xbf, 0x7e, 0x65, 0x36, - 0xe2, 0xcb, 0xfa, 0x37, 0xe7, 0xbd, 0x0b, 0x2f, 0xbb, 0xcc, 0x99, 0x67, - 0x8d, 0x75, 0xfd, 0xe1, 0x9e, 0xf8, 0x1a, 0xca, 0xc3, 0xe2, 0x73, 0x3b, - 0xed, 0x1b, 0xec, 0xb2, 0xf1, 0xe7, 0xeb, 0x2b, 0x0d, 0xf7, 0x08, 0xaf, - 0xf1, 0x87, 0x5e, 0xcd, 0xfc, 0x59, 0x7f, 0xff, 0xb3, 0xa7, 0xf4, 0x8a, - 0x27, 0x74, 0xf3, 0x74, 0x7e, 0xc5, 0x97, 0xd9, 0xd3, 0xe2, 0xcb, 0xfa, - 0x7a, 0x98, 0xa7, 0x9d, 0x82, 0xb2, 0xb7, 0x11, 0xe9, 0x31, 0xaf, 0x19, - 0x3a, 0x43, 0x7f, 0xe0, 0xbb, 0x78, 0x64, 0xfa, 0x61, 0x65, 0x49, 0x78, - 0xdc, 0x71, 0x82, 0x61, 0xa3, 0x05, 0x40, 0x6a, 0xf8, 0x90, 0xd3, 0xa6, - 0x33, 0xd4, 0x2f, 0x3c, 0x5f, 0xf9, 0x71, 0x42, 0xf3, 0x8b, 0xdd, 0x8c, - 0x50, 0x54, 0x1b, 0xee, 0xf4, 0xe4, 0xb2, 0xfe, 0xc1, 0x4b, 0x7e, 0xa4, - 0xb2, 0xff, 0xfd, 0xd3, 0xe6, 0xd8, 0x2f, 0x0f, 0x62, 0x7f, 0xba, 0xb2, - 0xff, 0xa5, 0x9d, 0xc1, 0x99, 0x7e, 0xb2, 0xf0, 0xb9, 0xe5, 0x97, 0xf6, - 0x6b, 0x41, 0x63, 0x4b, 0x2f, 0xe2, 0x90, 0xaf, 0xee, 0x2c, 0xbf, 0x31, - 0xe7, 0x23, 0x59, 0x6e, 0x61, 0xea, 0x99, 0x75, 0xf0, 0xc9, 0xd8, 0x59, - 0x7f, 0xf1, 0xc9, 0xf5, 0x9b, 0xfe, 0x01, 0xfc, 0xb2, 0xb6, 0x3e, 0x9e, - 0x91, 0x5f, 0x1f, 0x30, 0x70, 0xa8, 0xd7, 0x62, 0x2c, 0x30, 0xf9, 0x61, - 0xce, 0x08, 0x77, 0xb0, 0x84, 0x12, 0x11, 0xf7, 0xfe, 0x7d, 0xcf, 0xc3, - 0xc3, 0x2f, 0xa4, 0xb2, 0xdf, 0xac, 0xbf, 0xc3, 0xc2, 0x31, 0x7c, 0x15, - 0x97, 0xff, 0xde, 0x38, 0xe9, 0xff, 0x12, 0x66, 0x28, 0xa2, 0xa4, 0xbf, - 0xf8, 0xe3, 0xbf, 0xc4, 0x99, 0x8a, 0x28, 0xa9, 0x2b, 0x11, 0x3f, 0xe5, - 0x5a, 0xd9, 0x1e, 0x9d, 0x86, 0x95, 0xfe, 0xf0, 0x5d, 0xa3, 0x76, 0xac, - 0xa2, 0x3d, 0xce, 0x94, 0xdf, 0x0f, 0x31, 0x84, 0x97, 0xcf, 0xfb, 0xf5, - 0x65, 0xff, 0x69, 0xc1, 0x3b, 0xd0, 0x21, 0x2c, 0xbc, 0x18, 0xd2, 0xcb, - 0xbb, 0xc1, 0x9e, 0xbc, 0xc7, 0x77, 0xcc, 0x07, 0xfe, 0x2c, 0xb8, 0x82, - 0xa8, 0x86, 0x57, 0xf4, 0x36, 0x39, 0xac, 0x59, 0x52, 0x3c, 0xf9, 0x88, - 0xef, 0x7a, 0x36, 0x59, 0x7e, 0xec, 0x49, 0x86, 0xac, 0xbc, 0x28, 0xa2, - 0xa4, 0xbd, 0x84, 0x04, 0x8c, 0xcd, 0x05, 0xff, 0xb3, 0x6c, 0x1b, 0xc8, - 0xa3, 0x65, 0x95, 0x08, 0xb4, 0xfd, 0x24, 0x8b, 0x6f, 0xdd, 0xf3, 0x93, - 0x0b, 0x2f, 0xef, 0xa5, 0xc2, 0x70, 0x2c, 0xbc, 0x4c, 0xaa, 0x7b, 0x59, - 0x58, 0x7a, 0xae, 0x5d, 0x73, 0x2a, 0x65, 0x4b, 0x2f, 0xd9, 0xde, 0x87, - 0x65, 0x97, 0xfe, 0x3d, 0xbc, 0x6f, 0x2e, 0x9e, 0xcb, 0x2d, 0x26, 0x54, - 0x88, 0xb2, 0x23, 0xe9, 0x4d, 0xe7, 0xdc, 0x85, 0x97, 0xec, 0x1f, 0x9f, - 0x71, 0x65, 0xf8, 0xb0, 0x70, 0xd5, 0x95, 0x3c, 0xae, 0xda, 0xc4, 0x6c, - 0x5b, 0x10, 0x8c, 0x8b, 0x1e, 0x58, 0x2f, 0xf9, 0xd2, 0x62, 0x3d, 0x43, - 0x45, 0xa5, 0xfe, 0x7d, 0x78, 0x55, 0x84, 0xef, 0x78, 0xf0, 0xa5, 0x57, - 0xf3, 0x70, 0xf5, 0x34, 0x96, 0x5f, 0xff, 0x30, 0x23, 0x97, 0x9e, 0x5c, - 0xc6, 0xc6, 0xe2, 0xca, 0x84, 0x40, 0x99, 0x75, 0xee, 0x9c, 0x2c, 0xbb, - 0x09, 0x65, 0x19, 0xb0, 0x08, 0xdd, 0xf8, 0xa3, 0xe8, 0xe2, 0xcb, 0xff, - 0x61, 0x93, 0xf7, 0x82, 0xc1, 0x2c, 0xbd, 0xe7, 0xd4, 0x1f, 0x1f, 0x09, - 0xef, 0x8f, 0x51, 0xd5, 0x97, 0xdc, 0xc8, 0x92, 0xca, 0x19, 0xe1, 0x11, - 0x0d, 0xfa, 0x25, 0xec, 0xf9, 0x65, 0xf4, 0x8e, 0x00, 0xb2, 0xef, 0xbf, - 0x59, 0x7f, 0x36, 0x39, 0xf9, 0x81, 0x65, 0xee, 0x43, 0x1f, 0x9e, 0x3f, - 0x06, 0x6f, 0xf0, 0x73, 0x5f, 0xfe, 0x64, 0xb2, 0xdc, 0x59, 0x74, 0xf3, - 0xb2, 0xca, 0x91, 0xae, 0x71, 0x1b, 0xff, 0x63, 0x4c, 0x7a, 0xc1, 0xbb, - 0x56, 0x5f, 0x63, 0x44, 0x1a, 0xca, 0xf1, 0xf0, 0x11, 0xed, 0xff, 0xbc, - 0x27, 0x33, 0x40, 0x77, 0x02, 0xa2, 0x0c, 0x5f, 0xfd, 0xb4, 0x31, 0x9a, - 0xef, 0x63, 0x38, 0xb2, 0xc6, 0x34, 0x48, 0x92, 0x65, 0xff, 0xbc, 0x17, - 0x63, 0x3b, 0xdc, 0xf2, 0xcb, 0xfd, 0xe8, 0x2e, 0xfe, 0xfd, 0x59, 0x7f, - 0xfa, 0x5a, 0x89, 0x03, 0xc7, 0xe2, 0x76, 0xac, 0xae, 0x1f, 0xe0, 0x4c, - 0xef, 0xf8, 0x06, 0xd6, 0x9c, 0xee, 0x05, 0x65, 0xff, 0xb9, 0xfb, 0xfd, - 0xc1, 0x35, 0xe7, 0x59, 0x7c, 0x1f, 0x60, 0x16, 0x54, 0x93, 0xa3, 0x19, - 0x3e, 0xa1, 0x76, 0x44, 0x5d, 0x3b, 0x9f, 0x42, 0xbf, 0xfb, 0xbc, 0xda, - 0x04, 0x28, 0xf1, 0xec, 0xb2, 0xff, 0x72, 0x35, 0x20, 0x1e, 0xcb, 0x28, - 0x8f, 0xeb, 0x88, 0xd7, 0xf0, 0x58, 0x2c, 0xd8, 0x2b, 0x2a, 0x0f, 0x43, - 0xc4, 0x37, 0xbc, 0x1d, 0xc5, 0x97, 0xff, 0xb4, 0xfb, 0xf0, 0x81, 0xe3, - 0xfc, 0x4e, 0xac, 0xa8, 0x4e, 0xde, 0x51, 0x94, 0xb2, 0xc8, 0x42, 0x41, - 0x7d, 0x98, 0x4c, 0x2c, 0xaf, 0x97, 0x62, 0xfc, 0x6a, 0x4c, 0x5c, 0x84, - 0x07, 0x67, 0x03, 0x37, 0x51, 0xef, 0x14, 0x0a, 0xb2, 0xf8, 0xc0, 0x63, - 0x59, 0x58, 0x6f, 0x7a, 0x39, 0x7d, 0x1d, 0x39, 0x96, 0x5f, 0xc1, 0x71, - 0x02, 0xe2, 0x2c, 0xa9, 0x8f, 0x47, 0x44, 0x57, 0x6f, 0xc5, 0x95, 0x86, - 0xed, 0xc8, 0xef, 0xfe, 0x79, 0x4e, 0xce, 0xe7, 0xa3, 0x5f, 0xac, 0xbb, - 0xff, 0xd6, 0x5f, 0xf0, 0x3c, 0x7a, 0x23, 0xef, 0x16, 0x54, 0x91, 0x2e, - 0xd4, 0x6f, 0xc6, 0x6f, 0xf7, 0xe7, 0xef, 0x67, 0xee, 0xb2, 0xff, 0x70, - 0xf0, 0xb3, 0xe1, 0x56, 0x5f, 0xff, 0xec, 0xef, 0x5f, 0x45, 0x1f, 0x48, - 0x4d, 0x7e, 0xd3, 0xe2, 0xca, 0xdc, 0x44, 0xb3, 0x4c, 0xef, 0xc1, 0xf8, - 0x18, 0xd5, 0x97, 0xfc, 0xd3, 0x17, 0x08, 0x7e, 0x85, 0x97, 0xff, 0xa3, - 0xbc, 0x08, 0x27, 0x79, 0xca, 0x21, 0x65, 0xde, 0x0a, 0xcb, 0xff, 0xf4, - 0x8c, 0x87, 0xec, 0xf8, 0x47, 0x2e, 0x90, 0xd6, 0x5f, 0xec, 0x1f, 0xb3, - 0xec, 0xe2, 0xcb, 0xc6, 0x2e, 0xe2, 0xcb, 0xfd, 0x9b, 0xf9, 0xde, 0xc3, - 0x56, 0x56, 0x8f, 0x57, 0xc4, 0x15, 0x09, 0xf3, 0x8c, 0x9b, 0x0a, 0x58, - 0x38, 0x34, 0xa9, 0x85, 0xc9, 0x57, 0x90, 0x88, 0xb8, 0x53, 0x59, 0x7e, - 0x68, 0x30, 0x80, 0xb2, 0xa0, 0xdf, 0x18, 0xbd, 0xff, 0xcf, 0xb7, 0x1c, - 0x71, 0xb4, 0x4a, 0x16, 0x5f, 0xd9, 0xc9, 0xfc, 0xd4, 0x2c, 0xad, 0x22, - 0x4b, 0x83, 0xf3, 0xe8, 0x97, 0xc7, 0x05, 0x32, 0xca, 0x93, 0x36, 0xdc, - 0x70, 0x83, 0xc7, 0x40, 0x10, 0xfc, 0x50, 0x73, 0xbe, 0x73, 0x42, 0x9d, - 0xb0, 0xac, 0x78, 0x5b, 0x7e, 0x63, 0xc9, 0x56, 0x3d, 0x8d, 0x14, 0x53, - 0x3b, 0xfd, 0xce, 0x61, 0x7f, 0x3f, 0x8b, 0x2f, 0x88, 0xf7, 0x61, 0x65, - 0xf0, 0x85, 0x9c, 0x59, 0x69, 0x96, 0x5f, 0xdc, 0xc2, 0xfe, 0x7f, 0x16, - 0x54, 0xe4, 0x5e, 0xe1, 0xb3, 0x91, 0xfe, 0x45, 0xc1, 0x2b, 0xee, 0xbb, - 0x92, 0xca, 0xde, 0x7d, 0x62, 0xa5, 0xdf, 0xfe, 0xfa, 0x47, 0x9e, 0x7f, - 0x7a, 0x3e, 0xe2, 0xcb, 0xfd, 0xdf, 0xc2, 0xd8, 0xce, 0xac, 0xa7, 0x3f, - 0xf0, 0xa5, 0xdf, 0xfe, 0x2d, 0xa7, 0x4c, 0x65, 0x83, 0xc2, 0x61, 0x65, - 0xfc, 0x7f, 0x6e, 0xfa, 0x3a, 0xb2, 0xfc, 0x1e, 0x19, 0xfc, 0xb2, 0xfc, - 0x59, 0xdf, 0x1a, 0xcb, 0xc2, 0x64, 0x2c, 0xbd, 0xe0, 0xb0, 0xb2, 0xf7, - 0x60, 0x45, 0x97, 0xfb, 0x07, 0xa7, 0x07, 0x7f, 0x59, 0x7e, 0xc2, 0x1f, - 0xa1, 0x65, 0x61, 0xfb, 0xf8, 0x74, 0x53, 0x4a, 0x84, 0xea, 0xf7, 0x13, - 0x26, 0x31, 0xd1, 0x43, 0x93, 0x10, 0xe7, 0x21, 0x2b, 0x7c, 0x3d, 0x3c, - 0x96, 0x5f, 0xff, 0xec, 0x27, 0xef, 0x33, 0x5f, 0xff, 0x19, 0xf7, 0x78, - 0x6b, 0x2e, 0xc9, 0xf5, 0x94, 0x33, 0xfa, 0xeb, 0x0d, 0x42, 0x2f, 0x9e, - 0x13, 0x97, 0xa3, 0x53, 0x2c, 0xa9, 0xce, 0xc3, 0xa1, 0x90, 0x81, 0x14, - 0x93, 0x5d, 0xa3, 0x3f, 0x1c, 0x2b, 0xf2, 0x7a, 0x28, 0x12, 0xc7, 0x3e, - 0x84, 0x91, 0xce, 0xfc, 0x7a, 0x36, 0x97, 0xa7, 0x04, 0x7f, 0x28, 0x20, - 0xa1, 0x48, 0x18, 0xf3, 0x05, 0x8c, 0xa6, 0x7c, 0x9a, 0xf7, 0xdb, 0x6f, - 0x59, 0x7e, 0x07, 0xa3, 0xed, 0xd5, 0x97, 0x05, 0x96, 0xb2, 0xfd, 0xe7, - 0xd3, 0x4d, 0x65, 0xe1, 0x23, 0x71, 0x65, 0xfc, 0x20, 0x3d, 0x1f, 0x6e, - 0xac, 0xa9, 0xc8, 0xc1, 0x91, 0x60, 0x06, 0xf8, 0x4e, 0x12, 0x0b, 0xc6, - 0x58, 0xb2, 0xfe, 0xf1, 0xb2, 0xfd, 0x1b, 0x2c, 0xb0, 0xe4, 0x79, 0x80, - 0x1a, 0xbb, 0xf1, 0x56, 0x5f, 0xde, 0x83, 0xdc, 0x69, 0xac, 0xa9, 0xc7, - 0x90, 0x01, 0x9a, 0xf9, 0x32, 0xc3, 0x84, 0xc7, 0x5c, 0x2f, 0xec, 0x17, - 0x30, 0x98, 0x59, 0x71, 0xec, 0xb2, 0xf3, 0xe7, 0x16, 0x5f, 0x9f, 0x63, - 0x0c, 0x96, 0x5e, 0xff, 0xf8, 0x59, 0x4d, 0x3e, 0x1f, 0x0d, 0x91, 0x45, - 0xec, 0x26, 0x16, 0x51, 0xa3, 0xbd, 0xa5, 0xae, 0xf1, 0xba, 0x5d, 0x7f, - 0xfa, 0x39, 0xc8, 0x6e, 0x74, 0xf9, 0xe7, 0x59, 0x78, 0xcb, 0xab, 0x28, - 0x07, 0xc7, 0xe4, 0x8b, 0xff, 0x9b, 0x1d, 0xe3, 0xe6, 0xbf, 0x6e, 0x2c, - 0xbf, 0x8a, 0x24, 0xd8, 0x35, 0x95, 0xf9, 0xf7, 0x92, 0x25, 0xfb, 0x4e, - 0xd8, 0x02, 0xcb, 0xf6, 0x6f, 0x2c, 0xe2, 0xcb, 0xfd, 0xd3, 0xde, 0x7d, - 0x94, 0x24, 0xb3, 0x56, 0x5f, 0xd8, 0x4c, 0x6a, 0x19, 0x99, 0xe2, 0x88, - 0x69, 0x76, 0x30, 0xb2, 0xb1, 0x3a, 0x43, 0x84, 0x8b, 0x91, 0x11, 0x3f, - 0x1b, 0x67, 0xd1, 0xaf, 0xff, 0x3e, 0xf8, 0xc1, 0xbc, 0xb3, 0xc6, 0x2a, - 0xcb, 0xc1, 0xfa, 0x4b, 0x2f, 0xa5, 0xa7, 0xde, 0xb2, 0xa4, 0x88, 0xcd, - 0x25, 0x10, 0xf5, 0xfe, 0x29, 0x16, 0x36, 0x00, 0xb2, 0xfc, 0x7e, 0x28, - 0x92, 0xcb, 0xcf, 0xc3, 0x59, 0x6c, 0x59, 0x7b, 0x31, 0x85, 0x96, 0x68, - 0xcd, 0x66, 0xe8, 0x85, 0x42, 0x3d, 0xf0, 0xbf, 0x46, 0x3e, 0x26, 0x74, - 0x7b, 0xfe, 0x3d, 0xf9, 0xa0, 0x3b, 0x81, 0x51, 0x86, 0xaf, 0x4f, 0x87, - 0xab, 0x2e, 0x3d, 0xeb, 0x2f, 0x9f, 0x4e, 0x22, 0xcb, 0xb1, 0x85, 0x97, - 0xff, 0x43, 0x4c, 0x78, 0x4c, 0x7a, 0x1a, 0xb2, 0xbc, 0x7b, 0x5d, 0x17, - 0xa1, 0xa6, 0x38, 0x04, 0x66, 0x90, 0x70, 0x63, 0xaf, 0x97, 0x09, 0xe5, - 0x97, 0xf8, 0xe6, 0x27, 0x14, 0x46, 0xac, 0xa6, 0x0f, 0x37, 0xc3, 0x17, - 0xff, 0xc7, 0xdf, 0x47, 0x23, 0xd0, 0x7b, 0x43, 0x0b, 0x2f, 0xf7, 0xa2, - 0x69, 0x1e, 0xa4, 0xb2, 0xfc, 0x53, 0x14, 0x35, 0x65, 0xfe, 0xe9, 0x8b, - 0x31, 0x38, 0xab, 0x2f, 0xfb, 0x37, 0xc0, 0xfd, 0x87, 0xd5, 0x97, 0xb8, - 0xff, 0xac, 0xb7, 0x48, 0xf5, 0xba, 0x73, 0x7f, 0x04, 0x4f, 0xff, 0x8f, - 0x96, 0x5f, 0xa1, 0xbd, 0xc0, 0x2c, 0xbf, 0x44, 0xbf, 0x2c, 0x59, 0x71, - 0xec, 0xb2, 0xa1, 0x3f, 0x31, 0xa7, 0xe1, 0xa7, 0xc4, 0xe7, 0x08, 0xb9, - 0x89, 0xfc, 0x64, 0x44, 0xfd, 0x27, 0xbf, 0x3f, 0x75, 0x1b, 0xd6, 0x5f, - 0x47, 0xc1, 0xdc, 0x59, 0x7f, 0xfe, 0x00, 0x7c, 0xc1, 0x94, 0x7a, 0x05, - 0x82, 0xc5, 0x95, 0x31, 0xfd, 0x11, 0x35, 0xf1, 0x8f, 0x74, 0xd6, 0x54, - 0x23, 0xa5, 0xe1, 0x46, 0x29, 0x15, 0xff, 0x7a, 0x24, 0x65, 0x8d, 0x85, - 0x97, 0xce, 0x39, 0x6c, 0xb2, 0xff, 0xb3, 0xbe, 0xc6, 0x93, 0xf5, 0x65, - 0xfd, 0xbc, 0xf5, 0xf4, 0x6e, 0x2c, 0xa1, 0x9f, 0x56, 0x1b, 0xd7, 0x91, - 0x5c, 0x50, 0x8d, 0xb8, 0xbf, 0x59, 0x7e, 0x6c, 0x03, 0x61, 0xac, 0xbe, - 0x94, 0x35, 0xd6, 0x5f, 0xb5, 0xfb, 0x4f, 0x8b, 0x2e, 0xef, 0x19, 0x28, - 0x8a, 0xc1, 0x77, 0x29, 0x10, 0x86, 0xa1, 0x1f, 0xa1, 0x85, 0x8d, 0xb8, - 0xb2, 0xfe, 0x8d, 0xb0, 0x8d, 0x85, 0x95, 0xa3, 0x7d, 0xc1, 0x1b, 0xff, - 0xa0, 0x9f, 0xd1, 0xfb, 0x3d, 0x73, 0x89, 0x2f, 0x60, 0x21, 0x65, 0x6c, - 0xab, 0x20, 0x71, 0xf0, 0xe3, 0x2b, 0x48, 0x77, 0xa3, 0x5e, 0x6c, 0x01, - 0x65, 0xf9, 0xe6, 0x3c, 0xe2, 0xcb, 0xee, 0x46, 0xa4, 0xb2, 0xc3, 0x9c, - 0x79, 0x3c, 0x27, 0xa8, 0x44, 0x7b, 0xb2, 0xdf, 0xf1, 0x0f, 0xd1, 0xde, - 0xc3, 0x56, 0x5c, 0x1d, 0x96, 0x5f, 0xef, 0xa5, 0xf7, 0x0f, 0xb0, 0xb2, - 0xf1, 0xfd, 0xc5, 0x95, 0x87, 0xa4, 0x66, 0xb5, 0x88, 0xc2, 0x33, 0x8f, - 0x35, 0x5d, 0x80, 0x59, 0x76, 0x71, 0x67, 0x4b, 0x6b, 0xdd, 0xcf, 0x2c, - 0xad, 0x1e, 0x08, 0x49, 0x6f, 0xff, 0x87, 0x39, 0xcf, 0x39, 0x1b, 0x61, - 0x1b, 0x0b, 0x2f, 0xf6, 0x9b, 0x1f, 0x75, 0xc0, 0xb2, 0xff, 0xfe, 0x2c, - 0xef, 0xb2, 0x58, 0x08, 0x07, 0x49, 0xda, 0xb2, 0xb1, 0x1b, 0x86, 0xa1, - 0xc3, 0x4b, 0xff, 0x68, 0xe4, 0x7c, 0xfa, 0x46, 0x4b, 0x2f, 0x8d, 0xb1, - 0x32, 0xcb, 0xff, 0xb8, 0x7f, 0x16, 0x4d, 0xa8, 0xef, 0x16, 0x5f, 0x66, - 0xc1, 0x92, 0xca, 0x34, 0x64, 0x4c, 0x7d, 0xf9, 0x10, 0xa8, 0xb7, 0xfb, - 0x91, 0x27, 0xd9, 0xda, 0xb2, 0xf9, 0xf4, 0xff, 0x2c, 0xbf, 0xbf, 0xd9, - 0xe5, 0x1b, 0x8b, 0x2f, 0x0c, 0x70, 0xb2, 0x98, 0x3f, 0x0f, 0x88, 0x82, - 0x65, 0x50, 0x98, 0x99, 0x9f, 0xbc, 0x28, 0xef, 0xb5, 0x18, 0xd5, 0x97, - 0x60, 0xab, 0x29, 0x38, 0x86, 0x17, 0xf7, 0x04, 0x8d, 0x43, 0x53, 0x88, - 0x61, 0x49, 0xc4, 0x30, 0xa4, 0xe2, 0x18, 0x52, 0x71, 0x0c, 0x29, 0x38, - 0x86, 0x15, 0x24, 0x5c, 0x98, 0xcf, 0xe7, 0x81, 0x19, 0x9f, 0x19, 0xdd, - 0x19, 0xbb, 0xd8, 0x9c, 0x43, 0x0b, 0xf9, 0xdf, 0xb3, 0x43, 0x53, 0x88, - 0x61, 0x38, 0xd2, 0x59, 0x96, 0x9c, 0x43, 0x0a, 0x4e, 0x21, 0x85, 0x27, - 0x10, 0xc2, 0xa4, 0x6c, 0x8c, 0x66, 0x93, 0x88, 0x61, 0x49, 0xc4, 0x30, - 0xa4, 0xe2, 0x18, 0x52, 0x71, 0x0c, 0x29, 0x38, 0x86, 0x14, 0x9c, 0x43, - 0x0a, 0xd9, 0x12, 0xc3, 0x19, 0x31, 0x9f, 0xc6, 0x78, 0x33, 0xbc, 0x66, - 0x93, 0x88, 0x61, 0x49, 0xc4, 0x30, 0xa9, 0x1b, 0x2e, 0x0c, 0xd2, 0x71, - 0x0c, 0x29, 0x38, 0x86, 0x14, 0x9c, 0x43, 0x0a, 0x4e, 0x21, 0x85, 0x48, - 0xf9, 0x3f, 0x19, 0xe8, 0xce, 0xe8, 0xcd, 0x27, 0x10, 0xc2, 0x93, 0x88, - 0x61, 0x49, 0xc4, 0x30, 0xa4, 0xe2, 0x18, 0x56, 0xc7, 0xc8, 0xc0, 0xce, - 0x86, 0x7c, 0x33, 0x66, 0x13, 0x88, 0x61, 0x49, 0xc4, 0x30, 0xa4, 0xe2, - 0x18, 0x52, 0x71, 0x0c, 0x29, 0x38, 0x86, 0x14, 0x33, 0xe4, 0xf8, 0x67, - 0xf1, 0x90, 0x8c, 0xd2, 0x71, 0x0c, 0x29, 0x38, 0x86, 0x14, 0x9c, 0x43, - 0x0b, 0xf7, 0xa3, 0xfe, 0x62, 0x71, 0x0c, 0x29, 0x38, 0x86, 0x15, 0x24, - 0x4d, 0x00, 0x67, 0xc3, 0x2e, 0x33, 0xf9, 0xb5, 0x80, 0x9c, 0x43, 0x0a, - 0x4e, 0x21, 0x85, 0x27, 0x10, 0xc2, 0x93, 0x88, 0x61, 0x49, 0xc4, 0x30, - 0xa9, 0x1f, 0x27, 0xc3, 0x26, 0x33, 0xbc, 0x66, 0x93, 0x88, 0x61, 0x49, - 0xc4, 0x30, 0xa4, 0xe2, 0x18, 0x52, 0x71, 0x0c, 0x2a, 0x47, 0xc8, 0x31, - 0x9f, 0x0c, 0x90, 0xcd, 0xbc, 0x9c, 0x43, 0x0a, 0x4e, 0x21, 0x85, 0x27, - 0x10, 0xc2, 0xd2, 0x4e, 0x21, 0x85, 0x27, 0x10, 0xc3, 0xe2, 0xfe, 0x93, - 0x88, 0x61, 0x49, 0xc4, 0x30, 0xa4, 0xe2, 0x18, 0x52, 0x71, 0x0c, 0x2b, - 0x64, 0x6f, 0x48, 0x65, 0x83, 0x80, 0x14, 0xcc, 0x33, 0xf8, 0xcf, 0x46, - 0x6d, 0x89, 0xc4, 0x30, 0xa4, 0xe2, 0x18, 0x52, 0x71, 0x0c, 0x2d, 0x24, - 0xe2, 0x18, 0x52, 0x71, 0x0c, 0x3e, 0x2f, 0xe9, 0x38, 0x86, 0x14, 0x9c, - 0x43, 0x0a, 0x84, 0x56, 0x48, 0x64, 0xce, 0x34, 0x52, 0xd1, 0x9a, 0x4e, - 0x21, 0x85, 0x27, 0x10, 0xc2, 0x93, 0x88, 0x61, 0x49, 0xc4, 0x30, 0xa4, - 0xe2, 0x18, 0x54, 0x1f, 0xef, 0xc3, 0x3a, 0x19, 0x68, 0xc9, 0x0c, 0xd2, - 0x71, 0x0c, 0x29, 0x38, 0x86, 0x14, 0x9c, 0x43, 0x0a, 0xd1, 0xe5, 0xf0, - 0x67, 0xa3, 0x34, 0x9c, 0x43, 0x0a, 0x4e, 0x21, 0x85, 0x27, 0x10, 0xc2, - 0x9a, 0x79, 0x64, 0x33, 0xd1, 0x9b, 0x35, 0x38, 0x86, 0x14, 0x9c, 0x43, - 0x0a, 0x4e, 0x21, 0x85, 0x7e, 0x6c, 0x82, 0x33, 0x49, 0xc4, 0x30, 0xa4, - 0xe2, 0x18, 0x52, 0x71, 0x0c, 0x29, 0x38, 0x86, 0x15, 0x07, 0xc9, 0x30, - 0xcf, 0x86, 0x42, 0x33, 0x50, 0xcc, 0x14, 0xda, 0x10, 0x32, 0x4d, 0x1a, - 0xae, 0x42, 0xd8, 0x10, 0x8c, 0xfa, 0x10, 0xa7, 0x0a, 0x4d, 0xc3, 0xe9, - 0xa1, 0x09, 0xa8, 0x6c, 0x35, 0x2b, 0xd0, 0x83, 0x78, 0x51, 0x7e, 0x76, - 0x50, 0xfd, 0xe3, 0x47, 0x61, 0x94, 0x18, 0x62, 0xef, 0x84, 0x98, 0xaf, - 0x53, 0xe5, 0xc2, 0x28, 0xee, 0xc2, 0x1a, 0xfd, 0x22, 0x8c, 0xe2, 0x71, - 0x0c, 0x19, 0xa7, 0x2f, 0x78, 0xe1, 0xa9, 0xc4, 0x30, 0xbe, 0x30, 0x3e, - 0x97, 0x88, 0x62, 0xf1, 0x8f, 0x17, 0x88, 0x62, 0xcc, 0xfe, 0x46, 0x46, - 0x92, 0x7c, 0x53, 0xd2, 0xeb, 0x46, 0xf6, 0x7c, 0x48, 0x94, 0xf4, 0x3b, - 0xc6, 0x5b, 0x2c, 0xbf, 0x8c, 0x51, 0xea, 0x36, 0x59, 0x52, 0x3c, 0xbf, - 0x0e, 0x5c, 0xff, 0x2c, 0xbe, 0x89, 0xf8, 0xea, 0xcb, 0xc7, 0xbd, 0x96, - 0xb2, 0xe3, 0xdd, 0x59, 0x40, 0x6c, 0x31, 0x7e, 0xa7, 0xd5, 0x4d, 0x08, - 0x3f, 0x11, 0x10, 0xbf, 0x49, 0x37, 0x48, 0xaf, 0xb2, 0x67, 0x11, 0x65, - 0xff, 0xff, 0xb3, 0x08, 0x3d, 0x3f, 0x10, 0x58, 0x2c, 0xfb, 0xb1, 0x9a, - 0x59, 0x58, 0x88, 0xd9, 0xf2, 0x3b, 0xdf, 0x87, 0x8b, 0x2f, 0xf3, 0x90, - 0x93, 0x48, 0xc9, 0x65, 0xdf, 0xc2, 0xcb, 0xfb, 0x4e, 0x42, 0x47, 0xeb, - 0x2e, 0x7d, 0x2c, 0xb1, 0xac, 0x01, 0x6d, 0x60, 0x2c, 0xb3, 0x56, 0x59, - 0x99, 0xa2, 0x73, 0x42, 0xfe, 0x44, 0x71, 0xf1, 0x04, 0x6f, 0xef, 0xa5, - 0xe8, 0x2d, 0x96, 0x53, 0x53, 0x4f, 0x9f, 0x86, 0x7e, 0xea, 0x8d, 0xed, - 0x1e, 0xcb, 0x2f, 0xf4, 0x37, 0x26, 0x82, 0xd9, 0x65, 0x2c, 0xad, 0x1e, - 0xdf, 0x87, 0x7f, 0x33, 0xbf, 0x63, 0x7d, 0x1f, 0xac, 0xbf, 0xfa, 0x73, - 0x80, 0x7e, 0x8f, 0xf0, 0xbf, 0x59, 0x77, 0xf0, 0xb2, 0xb0, 0xf7, 0xbf, - 0x47, 0xa9, 0x2a, 0xdc, 0xc8, 0xdb, 0x7f, 0x84, 0xbf, 0x4c, 0x03, 0x08, - 0x6b, 0xff, 0x88, 0xa3, 0x62, 0xc3, 0xdf, 0x13, 0xeb, 0x2f, 0x47, 0xdc, - 0x59, 0x4e, 0x7c, 0x7c, 0x46, 0xbc, 0xfa, 0x85, 0x97, 0xe3, 0x9f, 0x72, - 0xfd, 0x65, 0xf8, 0xfe, 0xe3, 0xfc, 0xb2, 0xa4, 0x7d, 0xcd, 0x1b, 0xe1, - 0x55, 0xf6, 0xf6, 0xc1, 0xac, 0xbf, 0xe1, 0x1c, 0x7c, 0xc6, 0xc6, 0xe2, - 0xcb, 0xd9, 0xf0, 0xab, 0x2e, 0xff, 0x34, 0x7b, 0x44, 0x79, 0x7f, 0xf8, - 0xf7, 0x02, 0xc1, 0xfd, 0xcc, 0x9a, 0x3a, 0xb2, 0xbe, 0x3f, 0xc6, 0x96, - 0xdc, 0x18, 0x59, 0x7b, 0x35, 0x25, 0x94, 0x33, 0x65, 0xbc, 0x5a, 0xf0, - 0xdc, 0x96, 0x51, 0x9b, 0xe7, 0x23, 0xbf, 0x40, 0x1c, 0x98, 0x59, 0x7f, - 0xf3, 0xeb, 0x4f, 0xfc, 0x33, 0x14, 0x51, 0x56, 0x5e, 0x91, 0xfe, 0xb2, - 0xff, 0xcc, 0x67, 0xdd, 0x3e, 0xe8, 0x2d, 0x59, 0x68, 0x9c, 0x8a, 0x87, - 0x4a, 0xe8, 0xed, 0x42, 0xad, 0xfc, 0x2f, 0x78, 0x7c, 0xf2, 0x12, 0x7d, - 0x1f, 0x0c, 0x33, 0xef, 0xfe, 0x2c, 0x3f, 0x47, 0xdf, 0xe7, 0x78, 0xb2, - 0xff, 0xe0, 0x89, 0x34, 0xe8, 0x11, 0xc1, 0x1e, 0x59, 0x7f, 0xf6, 0xec, - 0x68, 0xdb, 0xcc, 0x6c, 0x6e, 0x2c, 0xa6, 0x4b, 0xaf, 0x8a, 0x89, 0x41, - 0xdb, 0x46, 0x4b, 0x29, 0x48, 0xa3, 0x8f, 0x7f, 0x23, 0x63, 0x62, 0x13, - 0x00, 0x94, 0x2d, 0xf4, 0x6d, 0x67, 0x2b, 0xf3, 0x72, 0x1c, 0x73, 0x43, - 0x8f, 0x50, 0x85, 0x6c, 0x3f, 0xbd, 0x28, 0x25, 0xeb, 0x0f, 0x8f, 0xe3, - 0x08, 0x29, 0x60, 0x3c, 0x85, 0xff, 0x65, 0xb7, 0x4f, 0xb2, 0x88, 0x89, - 0xba, 0x93, 0x7b, 0xfd, 0xb1, 0x65, 0xe6, 0xf0, 0x0b, 0x2f, 0x10, 0x21, - 0x65, 0xf6, 0x75, 0xfe, 0x59, 0x53, 0x8f, 0x68, 0xc7, 0x74, 0x37, 0x7d, - 0x2c, 0xd4, 0x2c, 0xbf, 0x85, 0x7d, 0x69, 0xfe, 0x59, 0x7f, 0xfe, 0xe6, - 0xb4, 0x73, 0x73, 0x51, 0xd3, 0x01, 0x8d, 0x65, 0x35, 0x1a, 0xdf, 0x98, - 0x11, 0x08, 0xa5, 0xf7, 0xbb, 0x1c, 0x59, 0x7b, 0xf9, 0xf2, 0x59, 0x4d, - 0x37, 0x84, 0x39, 0x7b, 0x63, 0x1a, 0xcb, 0x05, 0x65, 0xbf, 0x33, 0x5c, - 0x43, 0xb6, 0x64, 0xac, 0xbe, 0xd1, 0x93, 0x0b, 0x2f, 0xf7, 0x60, 0x20, - 0xf1, 0xe9, 0x65, 0xfd, 0x80, 0xf4, 0x7d, 0x25, 0x97, 0xf3, 0x78, 0x6c, - 0x74, 0x55, 0x97, 0xe8, 0xfb, 0xd1, 0x25, 0x95, 0x3d, 0xa3, 0xc3, 0x42, - 0xa4, 0x45, 0xd3, 0x31, 0x0b, 0xb7, 0x4c, 0x2f, 0xfb, 0x3e, 0x2c, 0xef, - 0x73, 0x65, 0x97, 0x7d, 0xd5, 0x97, 0xec, 0x2d, 0x8f, 0x4b, 0x2f, 0xdd, - 0x72, 0x0e, 0x2c, 0xbf, 0xdc, 0xc6, 0x9f, 0x7c, 0xeb, 0x2d, 0x18, 0x89, - 0x7d, 0x0c, 0x11, 0x3f, 0x49, 0xaf, 0x4e, 0x69, 0xac, 0xbf, 0xb2, 0x6d, - 0x47, 0x78, 0xb2, 0xe2, 0x6a, 0xca, 0x91, 0xf1, 0x10, 0xf7, 0x0b, 0xaf, - 0x6e, 0xea, 0x16, 0x5f, 0xf7, 0x8f, 0x5e, 0x76, 0x48, 0xa2, 0xac, 0xbf, - 0xfc, 0x4e, 0x2f, 0x0b, 0x3e, 0x97, 0x43, 0xb2, 0xcb, 0xfd, 0xa3, 0x98, - 0xb3, 0x7b, 0xac, 0xb7, 0x27, 0x26, 0x19, 0x05, 0xd8, 0x3f, 0x31, 0xfe, - 0x93, 0x2f, 0xf6, 0x8b, 0x07, 0xec, 0x25, 0x97, 0xce, 0x41, 0xc5, 0x97, - 0xe1, 0xf3, 0x90, 0xd5, 0x95, 0xf2, 0x32, 0xdd, 0x4b, 0xf3, 0x12, 0x20, - 0xbf, 0xe2, 0x87, 0xdb, 0xd1, 0xaf, 0xd6, 0x5f, 0xe3, 0xd1, 0x77, 0xb9, - 0xb2, 0xcb, 0x9f, 0x7a, 0xcb, 0xfa, 0x44, 0x72, 0xf6, 0x2c, 0xbf, 0x6c, - 0x7a, 0x89, 0x2c, 0xa6, 0x11, 0x3f, 0x31, 0x9e, 0x86, 0x08, 0xb2, 0xfc, - 0x1e, 0xcf, 0xe7, 0x56, 0x5e, 0x19, 0xb0, 0xb2, 0xa0, 0xf2, 0x30, 0xae, - 0xfe, 0x7f, 0x09, 0xa7, 0xfd, 0x65, 0xed, 0x7e, 0x22, 0xcb, 0xff, 0x8f, - 0xb1, 0xde, 0x79, 0xcf, 0xc1, 0x59, 0x50, 0x7c, 0x4e, 0x3f, 0x7c, 0x44, - 0x19, 0x2c, 0xbf, 0xc4, 0x1e, 0x63, 0x60, 0x0b, 0x2f, 0xfd, 0xe8, 0xd7, - 0xe5, 0x82, 0xbf, 0xeb, 0x2f, 0x66, 0x4c, 0xb2, 0xd8, 0xc2, 0x23, 0xbc, - 0x65, 0xfa, 0x05, 0xe8, 0xf8, 0x55, 0x97, 0xed, 0x05, 0xae, 0x4b, 0x2b, - 0xa7, 0x8a, 0x11, 0xeb, 0xe6, 0xc6, 0x6c, 0xb2, 0xfd, 0x9b, 0xca, 0x3e, - 0x59, 0x46, 0x79, 0x7c, 0x22, 0xbe, 0x82, 0xe8, 0x16, 0x50, 0xd7, 0x02, - 0x72, 0x1b, 0x1a, 0x84, 0x33, 0x48, 0x3d, 0x09, 0x17, 0x20, 0x28, 0x57, - 0xf1, 0xf3, 0xad, 0xb3, 0xe4, 0x37, 0xe9, 0xff, 0x67, 0xee, 0xb2, 0xff, - 0x7e, 0x26, 0x10, 0xfd, 0x0b, 0x2a, 0x13, 0x01, 0x6c, 0x28, 0x9c, 0xae, - 0xfe, 0xe6, 0x34, 0xfd, 0x0b, 0x2f, 0x7d, 0x2e, 0x2c, 0xaf, 0x8f, 0x2b, - 0x45, 0x97, 0xb9, 0xf8, 0xab, 0x2f, 0xbe, 0xe4, 0x7c, 0xb2, 0xfe, 0x79, - 0x77, 0x90, 0xc2, 0xcb, 0x48, 0xcf, 0x49, 0xa4, 0x95, 0x08, 0xbb, 0xc2, - 0x37, 0x71, 0xbf, 0xe1, 0x4b, 0x35, 0xcf, 0x60, 0x16, 0x5f, 0xfc, 0x59, - 0xcc, 0x1c, 0xd2, 0x8d, 0x6c, 0xb2, 0x8c, 0xff, 0xba, 0x73, 0x7d, 0x83, - 0x32, 0x59, 0x7c, 0x17, 0xd4, 0x96, 0x5f, 0x40, 0x59, 0x7c, 0x49, 0x7e, - 0x93, 0x31, 0x45, 0x15, 0x65, 0x11, 0xea, 0x04, 0x9a, 0xff, 0xfb, 0xc6, - 0xc3, 0x11, 0xde, 0x41, 0x16, 0x75, 0x65, 0xf1, 0x63, 0x61, 0x65, 0xfe, - 0x8e, 0xbf, 0xef, 0x9a, 0x59, 0x7f, 0xff, 0x74, 0xb3, 0xf7, 0x2f, 0xfa, - 0x4f, 0xf8, 0xb9, 0xe5, 0x97, 0x10, 0x00, 0x8f, 0xd3, 0x4f, 0x69, 0x00, - 0x86, 0x57, 0xba, 0xde, 0xac, 0xbf, 0x04, 0xc8, 0xf8, 0xb2, 0x9c, 0xf0, - 0xf8, 0x3b, 0x7e, 0xe6, 0xa1, 0xc0, 0xb2, 0xfd, 0x04, 0x08, 0xde, 0xb2, - 0xb0, 0xf3, 0xfc, 0x4f, 0x53, 0x95, 0x68, 0x0c, 0x83, 0x1d, 0x9e, 0x31, - 0xef, 0xe1, 0x17, 0xd7, 0x0b, 0xfd, 0xf9, 0x66, 0xfd, 0x1f, 0x16, 0x5f, - 0xe1, 0x08, 0x9c, 0x57, 0xf2, 0xca, 0x64, 0xb6, 0x37, 0xb1, 0x1a, 0x76, - 0x3d, 0x7c, 0x9c, 0x71, 0x8b, 0x69, 0x7d, 0xb0, 0xd0, 0x79, 0x4f, 0x3f, - 0xce, 0xa3, 0x94, 0x67, 0x3c, 0x85, 0x58, 0x65, 0x78, 0xef, 0x65, 0x14, - 0xd6, 0xf3, 0x22, 0x78, 0xb2, 0x56, 0x5e, 0x91, 0x3a, 0xcb, 0xfd, 0xd8, - 0x6f, 0xd2, 0xce, 0xac, 0xb7, 0xcc, 0x83, 0xfa, 0x82, 0xbc, 0x1b, 0xbf, - 0x6e, 0xc4, 0xb5, 0x0b, 0x2f, 0x75, 0xff, 0x59, 0x7e, 0xd6, 0xd1, 0xad, - 0x96, 0x5f, 0xd9, 0xde, 0x04, 0xba, 0xb2, 0xa0, 0xf5, 0xf0, 0xaa, 0xff, - 0xd0, 0x5d, 0xf0, 0x5e, 0x52, 0x85, 0x96, 0xd9, 0x65, 0xfb, 0x51, 0xe3, - 0x61, 0x65, 0x30, 0x6e, 0x80, 0x25, 0x7e, 0x0f, 0xf8, 0x40, 0x59, 0x7b, - 0x51, 0x32, 0xcb, 0xc4, 0xf3, 0x2c, 0xbf, 0x70, 0x57, 0xfb, 0x8b, 0x28, - 0xcf, 0x19, 0xc7, 0x2f, 0xb9, 0xd8, 0x6a, 0xcb, 0xff, 0x14, 0x31, 0xe7, - 0xe8, 0x99, 0xfa, 0xcb, 0xdc, 0xd6, 0x2c, 0xbc, 0x59, 0x25, 0x97, 0xed, - 0x7e, 0x41, 0xfd, 0x65, 0x41, 0xe2, 0xe0, 0xdd, 0x1a, 0x20, 0x78, 0xc3, - 0x6d, 0xc5, 0x97, 0xf6, 0x09, 0x13, 0x1f, 0x16, 0x51, 0x1e, 0x17, 0x45, - 0x2a, 0x15, 0xb5, 0x6c, 0x55, 0x27, 0x41, 0x90, 0x63, 0xbe, 0x88, 0x9a, - 0x51, 0xe6, 0x3f, 0xc8, 0x08, 0x8b, 0xb0, 0xc1, 0xde, 0xc9, 0x7f, 0xd0, - 0x7e, 0x86, 0xed, 0x82, 0xac, 0xbf, 0xf7, 0x20, 0xc6, 0x51, 0x23, 0xfd, - 0x65, 0xfb, 0xc7, 0xb3, 0x92, 0xcb, 0xf0, 0x58, 0x72, 0xfd, 0x65, 0xfd, - 0xcd, 0x46, 0x0c, 0xd6, 0x5d, 0xe3, 0x59, 0x50, 0x89, 0x2f, 0x13, 0xef, - 0x29, 0xdd, 0x2c, 0xbf, 0xed, 0x8b, 0x25, 0xec, 0xff, 0x8b, 0x2f, 0xfa, - 0x08, 0x13, 0x86, 0x4e, 0x2a, 0xcb, 0xff, 0x61, 0x7d, 0x2e, 0x68, 0x31, - 0xfa, 0xcb, 0xdc, 0xc6, 0x16, 0x5c, 0xed, 0x59, 0x6c, 0xe9, 0xb3, 0xde, - 0x3b, 0x5b, 0x23, 0x54, 0xce, 0x9a, 0xe7, 0x7f, 0xed, 0x78, 0x57, 0x1e, - 0xfe, 0xe0, 0x16, 0x5e, 0xf6, 0x6e, 0xac, 0xbe, 0x93, 0xf7, 0x8b, 0x2d, - 0xd9, 0xc7, 0x83, 0x30, 0xfd, 0x3a, 0x2b, 0x8a, 0x10, 0x77, 0x87, 0x1b, - 0xd6, 0x5d, 0x13, 0x2c, 0xbf, 0xf8, 0xa0, 0x51, 0x94, 0x7d, 0x23, 0x25, - 0x95, 0xa3, 0xda, 0x21, 0x7b, 0xf3, 0x73, 0xcf, 0xba, 0xb2, 0xb0, 0xf2, - 0xcc, 0x86, 0xfd, 0xf0, 0x0f, 0xbc, 0x59, 0x7f, 0xf4, 0xe9, 0xa5, 0x1a, - 0xda, 0x70, 0xb9, 0xe5, 0x95, 0x07, 0xea, 0xe5, 0x35, 0x09, 0xcf, 0x0c, - 0x9b, 0xd0, 0xc3, 0x28, 0x4a, 0xdf, 0xef, 0x67, 0x70, 0x3a, 0xd9, 0x65, - 0xf7, 0xc0, 0x3f, 0x96, 0x53, 0x4f, 0x63, 0x86, 0x97, 0xf8, 0xa2, 0x53, - 0x7a, 0x36, 0x59, 0x70, 0x0d, 0x65, 0xff, 0x19, 0x4d, 0x00, 0xd6, 0x7c, - 0xb2, 0x9c, 0xf3, 0xf8, 0x2d, 0x43, 0x45, 0x27, 0x61, 0x07, 0x7e, 0x1b, - 0x0c, 0x07, 0xe5, 0x96, 0x61, 0xcf, 0x50, 0x25, 0x17, 0xfd, 0x1d, 0xcd, - 0x01, 0xdc, 0x0a, 0x8b, 0xe1, 0x7e, 0xcd, 0x47, 0xd2, 0x59, 0x74, 0x34, - 0x07, 0xd9, 0xd4, 0x4b, 0xfe, 0x76, 0x38, 0x7c, 0x3f, 0xba, 0xb2, 0xbc, - 0x7c, 0xe4, 0x5b, 0x7f, 0xfe, 0x20, 0x4e, 0xf4, 0x1e, 0x8d, 0xa7, 0x3f, - 0x0d, 0x59, 0x79, 0xf5, 0xb2, 0xa2, 0xff, 0x5f, 0xfd, 0x85, 0xf8, 0xb9, - 0xf7, 0x7b, 0x0d, 0x59, 0x7f, 0xe2, 0xee, 0xb2, 0x3e, 0x91, 0xb5, 0x65, - 0xec, 0xdb, 0x75, 0x65, 0x42, 0x68, 0xf8, 0x42, 0x05, 0x8f, 0x15, 0x3a, - 0x31, 0x1f, 0x5e, 0xe9, 0x8a, 0xb2, 0xfe, 0x7d, 0x84, 0x1b, 0xee, 0x2c, - 0xae, 0x9e, 0x78, 0x47, 0x6f, 0xf6, 0xb5, 0x93, 0x36, 0x38, 0xb2, 0xff, - 0x9f, 0xbc, 0x32, 0xfa, 0x4d, 0x59, 0x7f, 0xc7, 0xad, 0x83, 0xff, 0xf1, - 0xd5, 0x97, 0xfd, 0x19, 0xa9, 0xd2, 0x3f, 0xa4, 0xb2, 0xa4, 0x98, 0x36, - 0x11, 0x7e, 0x69, 0xc3, 0x9e, 0x9e, 0x5f, 0xff, 0xef, 0x3f, 0x0e, 0x39, - 0x3b, 0xbe, 0xc6, 0xe0, 0x1f, 0x4b, 0x2e, 0x8d, 0xd5, 0x97, 0xdc, 0xe3, - 0xb5, 0x65, 0x79, 0x13, 0x9f, 0xb0, 0xf4, 0x66, 0xff, 0x7d, 0xd1, 0x3d, - 0xec, 0xdc, 0x59, 0x7e, 0xc3, 0xda, 0x18, 0x59, 0x6d, 0xb0, 0xf8, 0x7c, - 0x73, 0x7d, 0xf4, 0xba, 0xeb, 0x2f, 0xff, 0x86, 0x0f, 0x19, 0x66, 0xf7, - 0x97, 0x0c, 0x6b, 0x2f, 0xee, 0x74, 0xa3, 0x3e, 0x59, 0x58, 0x8a, 0x07, - 0x23, 0x0a, 0x85, 0xff, 0xec, 0xe7, 0x9c, 0xfb, 0x0d, 0x27, 0x61, 0x65, - 0xfb, 0xfe, 0x77, 0x3c, 0xb2, 0xfe, 0x17, 0xb9, 0xe9, 0x62, 0xca, 0x83, - 0xd7, 0x72, 0x9a, 0x84, 0xed, 0x65, 0x0c, 0x8c, 0x2e, 0x28, 0x4f, 0xdf, - 0xd3, 0x87, 0x99, 0xff, 0x16, 0x5f, 0xff, 0xbb, 0x9a, 0xd8, 0xf8, 0x7b, - 0xfc, 0x79, 0xf7, 0x56, 0x5a, 0x1a, 0x88, 0x82, 0x30, 0xbf, 0x73, 0x1a, - 0xff, 0x2c, 0xbc, 0xdd, 0x6c, 0xb2, 0xb0, 0xf1, 0x8c, 0xa2, 0xff, 0xdd, - 0x8e, 0x72, 0x0f, 0x67, 0xea, 0xcb, 0xfe, 0x3c, 0x21, 0xb0, 0x79, 0xa5, - 0x94, 0x69, 0x81, 0x69, 0xb7, 0xa4, 0x1b, 0xa7, 0xd7, 0xfd, 0xcc, 0xdb, - 0x86, 0x4f, 0xb2, 0xcb, 0xb3, 0xe5, 0x95, 0x87, 0xa1, 0xd3, 0x9b, 0xf9, - 0xf5, 0xf4, 0xb3, 0xab, 0x2f, 0xfd, 0xde, 0x1e, 0xba, 0x41, 0x79, 0x2c, - 0xbf, 0xff, 0x1f, 0x30, 0x7e, 0xce, 0x9e, 0x73, 0x6c, 0x15, 0x65, 0xff, - 0xe6, 0xc4, 0xfe, 0x04, 0xb3, 0x37, 0xc7, 0xcb, 0x2f, 0xfd, 0x19, 0xac, - 0xd7, 0xed, 0x3e, 0x2c, 0xbc, 0xff, 0x6e, 0xac, 0xbf, 0x9f, 0xbc, 0x8c, - 0xd9, 0x65, 0x42, 0x73, 0x38, 0x5c, 0x03, 0xe3, 0x55, 0x24, 0xdd, 0xe7, - 0xc2, 0x90, 0x5f, 0xbf, 0x7f, 0xa5, 0x8b, 0x2f, 0xf4, 0x7d, 0xc3, 0x2f, - 0xa4, 0xb2, 0xa0, 0xf7, 0x5a, 0x53, 0x7f, 0xc1, 0x86, 0xf3, 0x1b, 0x1b, - 0x8b, 0x2f, 0xfd, 0xad, 0xb0, 0x79, 0xef, 0x66, 0xe2, 0xcb, 0x30, 0xb2, - 0xff, 0x77, 0x82, 0x6f, 0x8c, 0xf9, 0x65, 0x41, 0xe4, 0x90, 0x95, 0xff, - 0xb5, 0xc6, 0x89, 0x9a, 0x38, 0x99, 0x65, 0x61, 0xf0, 0x04, 0x82, 0xb1, - 0x30, 0xce, 0x43, 0xae, 0xfe, 0xe3, 0xc8, 0xa1, 0xab, 0x2f, 0x14, 0x6e, - 0x2c, 0xbf, 0xfe, 0x94, 0x6b, 0x6e, 0x9b, 0x1c, 0xe3, 0x94, 0x96, 0x5f, - 0xdb, 0x73, 0x1b, 0x1b, 0x8b, 0x2a, 0x64, 0x41, 0x08, 0xa3, 0x5a, 0x47, - 0x8f, 0x0b, 0x05, 0x85, 0x05, 0xe3, 0xf1, 0xac, 0xb8, 0x72, 0x59, 0x78, - 0xb2, 0x4b, 0x2d, 0x2d, 0x1b, 0x2e, 0x8b, 0xdf, 0x37, 0xa7, 0xb2, 0xca, - 0xc3, 0xca, 0x32, 0x7b, 0xff, 0xb7, 0xf5, 0x88, 0x29, 0x67, 0x8d, 0xab, - 0x2e, 0xdb, 0xab, 0x2f, 0xf6, 0xff, 0x3c, 0xa3, 0x09, 0x65, 0x41, 0xe5, - 0xe0, 0xc5, 0xf4, 0x9f, 0x52, 0x59, 0x7f, 0xfa, 0x34, 0xfd, 0x0f, 0x4f, - 0xbc, 0xf1, 0xac, 0xb4, 0xa6, 0x3e, 0xbf, 0x11, 0x5f, 0xd8, 0x28, 0x9e, - 0x7e, 0xac, 0xbf, 0xa4, 0xde, 0x90, 0x66, 0x59, 0x7f, 0xfc, 0x24, 0xa3, - 0x79, 0x97, 0xfa, 0x38, 0x6e, 0x24, 0xad, 0x22, 0x03, 0xa5, 0xf7, 0xde, - 0x13, 0xee, 0xac, 0xbf, 0x63, 0x70, 0xf7, 0xac, 0xbd, 0xb4, 0xdb, 0x8b, - 0x2c, 0x2a, 0xca, 0x84, 0xdf, 0x36, 0x29, 0xc8, 0x57, 0x80, 0x8c, 0xc9, - 0x42, 0x51, 0x3e, 0x45, 0x77, 0x71, 0x65, 0xfb, 0x47, 0xb3, 0xb5, 0x53, - 0x09, 0xaf, 0xba, 0x18, 0x75, 0x4c, 0x26, 0xbb, 0xf8, 0x55, 0x02, 0x6b, - 0xfc, 0x4e, 0xc7, 0x63, 0x5f, 0xaa, 0x81, 0x35, 0xfe, 0xe6, 0x78, 0xf8, - 0x1d, 0x95, 0x30, 0x9a, 0xec, 0x1a, 0xa6, 0x13, 0x5c, 0x28, 0xab, 0x98, - 0x4d, 0x58, 0x9a, 0x97, 0xc6, 0xa6, 0x5c, 0xd2, 0x4e, 0x20, 0xef, 0x41, - 0x14, 0x8e, 0xdd, 0x4c, 0xc2, 0x63, 0x33, 0xe7, 0xaf, 0x95, 0x00, 0x8b, - 0x1e, 0x7d, 0xf6, 0x0c, 0x24, 0xb2, 0x8c, 0xf3, 0x9c, 0xb6, 0xff, 0xfd, - 0xfb, 0x5e, 0x5c, 0xf4, 0x6f, 0xc1, 0x06, 0xf2, 0x59, 0x50, 0xbd, 0x70, - 0x66, 0xde, 0x84, 0xbb, 0x90, 0x14, 0x24, 0x79, 0x28, 0x1f, 0xb2, 0xae, - 0x82, 0x41, 0x7f, 0xf6, 0xa4, 0x4e, 0xc4, 0xd2, 0x3d, 0x49, 0x65, 0xf3, - 0xef, 0xc1, 0x56, 0x5f, 0xff, 0xbc, 0xf2, 0xf4, 0x41, 0xf7, 0x86, 0x5f, - 0x49, 0x65, 0xe9, 0xa3, 0x8b, 0x2f, 0x17, 0xed, 0x59, 0x7f, 0xd0, 0x1e, - 0x91, 0xef, 0x11, 0xab, 0x2e, 0x86, 0xac, 0xbb, 0x39, 0x08, 0x8b, 0xc1, - 0xdd, 0x0e, 0xcf, 0x9d, 0xd6, 0x27, 0x25, 0xa4, 0x67, 0x24, 0x28, 0x6f, - 0xdf, 0xdd, 0x0b, 0xf3, 0x9d, 0x59, 0x7e, 0xe4, 0x67, 0xf0, 0xb2, 0xfc, - 0xff, 0xf8, 0xb3, 0xe3, 0xd5, 0xe9, 0x75, 0xf6, 0x1e, 0x98, 0x59, 0x76, - 0xda, 0x59, 0x77, 0xf3, 0x2c, 0xbf, 0xf9, 0xb3, 0x49, 0xcb, 0x61, 0xc1, - 0x6c, 0xb2, 0xa0, 0xfd, 0xc6, 0x31, 0x83, 0x37, 0xb3, 0x92, 0x59, 0x7c, - 0x7e, 0x76, 0xac, 0xbe, 0xd4, 0x73, 0x65, 0x95, 0xa3, 0xe0, 0xe8, 0xe0, - 0x84, 0x35, 0x0d, 0xf5, 0x9e, 0xd1, 0x87, 0x8e, 0x53, 0xe6, 0x42, 0x79, - 0x88, 0xc6, 0x81, 0x29, 0x0b, 0xe8, 0xea, 0x4e, 0x1c, 0xf3, 0x4a, 0x47, - 0xd4, 0x79, 0xed, 0x84, 0x87, 0xa3, 0xba, 0xfe, 0x18, 0x24, 0x43, 0xc8, - 0xd1, 0xfb, 0x3f, 0xa3, 0xbe, 0x50, 0xd0, 0xb0, 0x95, 0x9f, 0x3f, 0x12, - 0x13, 0x3b, 0xb0, 0x8d, 0xbe, 0xd9, 0xbd, 0xe2, 0xcb, 0xd1, 0x84, 0xb2, - 0xec, 0xe2, 0xca, 0x91, 0xb0, 0xfc, 0x6a, 0xfe, 0x94, 0xd2, 0x82, 0xea, - 0xcb, 0xfb, 0x24, 0x41, 0x7e, 0x2c, 0xbe, 0xfb, 0x87, 0x0b, 0x2f, 0xf6, - 0x16, 0xef, 0x4c, 0x98, 0x59, 0x5f, 0x22, 0xc7, 0x45, 0xde, 0x2c, 0xfc, - 0x8a, 0xfb, 0x34, 0x6c, 0x2c, 0xbc, 0x2e, 0xcd, 0x59, 0x7f, 0xde, 0x86, - 0x93, 0xcb, 0x3c, 0xb2, 0xa1, 0x16, 0xe3, 0x3f, 0xc2, 0x2e, 0x0f, 0xdf, - 0xde, 0x81, 0x0b, 0xef, 0xd6, 0x5d, 0x9b, 0xab, 0x2f, 0xa3, 0xc2, 0x71, - 0x65, 0x4f, 0x26, 0xf2, 0x43, 0x37, 0xb3, 0x05, 0x59, 0x71, 0xb0, 0xb2, - 0xb6, 0x36, 0x66, 0x39, 0x7e, 0xee, 0x4c, 0x6d, 0x59, 0x7e, 0x8f, 0xbf, - 0xfe, 0x16, 0x54, 0x1e, 0x91, 0x14, 0x5f, 0xa3, 0x7c, 0x17, 0x56, 0x5f, - 0x8f, 0x7f, 0x4f, 0x65, 0x97, 0xee, 0xfa, 0x35, 0x25, 0x97, 0xfe, 0xc6, - 0xc1, 0x47, 0xed, 0x79, 0x2c, 0xbf, 0xf3, 0x48, 0xd8, 0x8e, 0xf0, 0xf4, - 0xb2, 0xfa, 0x5d, 0xc0, 0x2c, 0xac, 0x3e, 0x07, 0x3e, 0xb8, 0xa1, 0x65, - 0xff, 0x79, 0xe5, 0x13, 0x14, 0x35, 0x65, 0xf8, 0xb0, 0x4c, 0x99, 0x65, - 0xff, 0xfd, 0xec, 0x07, 0xf0, 0xdc, 0xe9, 0xf3, 0x30, 0x98, 0x59, 0x7f, - 0xf1, 0xb4, 0x61, 0x7d, 0x4b, 0x3e, 0xea, 0xcb, 0x16, 0x22, 0x7c, 0x0b, - 0x57, 0xfe, 0x72, 0xff, 0xee, 0xea, 0x30, 0x55, 0x97, 0xfe, 0xe7, 0x8e, - 0x77, 0xd2, 0x8c, 0xd9, 0x65, 0xb3, 0x71, 0x10, 0x5f, 0xa0, 0x5f, 0xf7, - 0x9d, 0xbe, 0x38, 0xfa, 0x4b, 0x2f, 0xbc, 0xee, 0xd5, 0x97, 0xcf, 0xef, - 0x1a, 0xca, 0x23, 0xc2, 0xde, 0x43, 0x7e, 0x29, 0x4f, 0xbe, 0xcb, 0x2a, - 0x0f, 0x38, 0x42, 0x3a, 0x84, 0xf0, 0x25, 0x0a, 0x93, 0x2c, 0xfe, 0x19, - 0x37, 0x30, 0x6b, 0x2b, 0x65, 0xc8, 0x91, 0x90, 0x00, 0xa3, 0xe2, 0xad, - 0xc2, 0x8d, 0x42, 0x75, 0xa4, 0x1e, 0x15, 0x23, 0x8e, 0xca, 0x87, 0x9f, - 0x47, 0xbf, 0xde, 0xfa, 0x5c, 0xf6, 0x6c, 0xb2, 0xff, 0x9f, 0xd3, 0x19, - 0x7b, 0x3e, 0x59, 0x50, 0x7d, 0xf8, 0x6d, 0x78, 0x3f, 0x6c, 0xb2, 0xfd, - 0x34, 0xa3, 0xbc, 0x59, 0x77, 0x3f, 0x59, 0x5e, 0x3e, 0x0f, 0xc7, 0xe7, - 0xca, 0x6f, 0xff, 0xff, 0xbd, 0x85, 0xfe, 0x17, 0x7d, 0x9e, 0x8c, 0x98, - 0xf5, 0x37, 0x8f, 0xee, 0xac, 0xbf, 0xb4, 0x60, 0xf6, 0x4c, 0xb2, 0xff, - 0xf8, 0xb2, 0x67, 0xff, 0x3b, 0x1b, 0xcc, 0xbf, 0x59, 0x4d, 0x3f, 0xfe, - 0x97, 0x56, 0x26, 0x3e, 0xf0, 0xfd, 0xbe, 0x28, 0xc1, 0x56, 0x5e, 0xfb, - 0x8e, 0xb2, 0xfb, 0x91, 0xa8, 0x59, 0x50, 0x6f, 0xba, 0x3b, 0x50, 0xeb, - 0x6b, 0x76, 0x85, 0x6c, 0x8e, 0x47, 0x0c, 0xfc, 0xaf, 0xbd, 0x01, 0x1c, - 0xaf, 0xca, 0x87, 0x1c, 0x56, 0xe1, 0xdc, 0xcd, 0x9a, 0x59, 0x79, 0xcf, - 0xc2, 0x8c, 0x77, 0xb0, 0x80, 0x0c, 0x6a, 0x5b, 0xc9, 0xc4, 0x5f, 0xbf, - 0xfe, 0x32, 0xc6, 0xc0, 0x84, 0x19, 0x16, 0x35, 0x65, 0xff, 0x0c, 0xf0, - 0x83, 0x2c, 0xe2, 0xcb, 0xfe, 0xd6, 0xa0, 0x1e, 0xf9, 0xf7, 0x16, 0x5e, - 0x28, 0xe2, 0xcb, 0xec, 0x2c, 0x6a, 0xca, 0x59, 0x50, 0x78, 0xd2, 0x1b, - 0x09, 0x05, 0xfc, 0x00, 0xb8, 0xdb, 0x0b, 0x2f, 0xfb, 0xc7, 0x2f, 0x3c, - 0x8d, 0xab, 0x2f, 0xfd, 0xc3, 0x2f, 0xa5, 0xd3, 0xe1, 0xac, 0xac, 0x3f, - 0x6e, 0x9c, 0x5f, 0xcf, 0xdf, 0x40, 0x59, 0x6b, 0x2f, 0xfc, 0x6d, 0xc1, - 0xf8, 0xf8, 0x58, 0xb2, 0xf9, 0xb0, 0x38, 0x59, 0x44, 0x7b, 0xbc, 0x3c, - 0xa9, 0x2a, 0xa8, 0xc4, 0xd3, 0x37, 0x9a, 0x10, 0x7a, 0x2e, 0x6c, 0x28, - 0xc8, 0x87, 0xb0, 0x8e, 0xbe, 0xf6, 0x7e, 0xeb, 0x2f, 0x8a, 0x35, 0x25, - 0x97, 0xfd, 0xe8, 0x91, 0x91, 0x07, 0xe5, 0x97, 0xfd, 0x12, 0x3e, 0xca, - 0x0b, 0xf5, 0x97, 0xfd, 0x19, 0xd1, 0x3f, 0xfe, 0x3e, 0x59, 0x7b, 0x09, - 0x85, 0x96, 0xd4, 0x23, 0xa7, 0x08, 0x74, 0x70, 0xd3, 0x86, 0x59, 0xe5, - 0xfc, 0x50, 0x0d, 0x44, 0x96, 0x5f, 0xfe, 0x73, 0xec, 0x82, 0x5d, 0xe7, - 0x9e, 0x4b, 0x04, 0x35, 0x97, 0x47, 0x96, 0x57, 0x8f, 0xc3, 0x7a, 0xd5, - 0xff, 0xb8, 0x27, 0x4c, 0x83, 0x2c, 0xe2, 0xcb, 0x87, 0xc5, 0x95, 0xb8, - 0x7f, 0x5e, 0x24, 0x23, 0xfb, 0xff, 0xfb, 0x3e, 0xce, 0x39, 0x78, 0xe3, - 0xbe, 0x0b, 0xb5, 0x65, 0x4e, 0x55, 0xfb, 0x11, 0x85, 0xbc, 0x6d, 0x04, - 0x63, 0x79, 0xa7, 0x8b, 0x2f, 0xc1, 0x69, 0xfa, 0x16, 0x5f, 0xb3, 0x40, - 0x8c, 0x59, 0x44, 0x79, 0xa2, 0x13, 0xdf, 0xf6, 0x37, 0x34, 0x7b, 0x3b, - 0x56, 0x5f, 0xba, 0xee, 0xde, 0x2c, 0xbb, 0x36, 0x59, 0x7f, 0xc5, 0x1f, - 0x4f, 0xb1, 0xdc, 0xf2, 0xcb, 0xbb, 0x3e, 0xb2, 0xce, 0xd3, 0xd7, 0x23, - 0xdb, 0xff, 0xf3, 0x97, 0x5d, 0xfc, 0x51, 0xde, 0x0b, 0x9e, 0x59, 0x7f, - 0x84, 0xd6, 0x6f, 0x82, 0x92, 0xcb, 0xff, 0x9b, 0xc7, 0x96, 0xa3, 0x90, - 0x5b, 0x2c, 0xbf, 0xe8, 0xef, 0xb1, 0xb9, 0xac, 0x59, 0x7e, 0xef, 0x8e, - 0x38, 0xb2, 0xf6, 0xce, 0x5a, 0x3d, 0xee, 0x1b, 0xdf, 0xf4, 0x7f, 0xc1, - 0x85, 0xf5, 0x25, 0x97, 0xb5, 0xce, 0x2e, 0x20, 0x35, 0xf0, 0x1d, 0xc0, - 0xa8, 0x80, 0xcc, 0xcd, 0x55, 0xb2, 0x48, 0xa4, 0xd3, 0x25, 0xff, 0x47, - 0x80, 0x7c, 0x73, 0xd9, 0x65, 0xa2, 0x71, 0xf0, 0x68, 0xa2, 0xf3, 0x5e, - 0x4b, 0x2b, 0xc7, 0x8b, 0xf9, 0x4d, 0xcf, 0xfa, 0xca, 0x83, 0x75, 0xd2, - 0x3b, 0x01, 0x65, 0x68, 0xd8, 0x91, 0x05, 0x62, 0xaa, 0x97, 0x85, 0x10, - 0x91, 0xf3, 0xd0, 0xd7, 0x18, 0x3e, 0x38, 0xd1, 0x3f, 0x9b, 0xbf, 0x26, - 0x25, 0x3e, 0xca, 0xde, 0xbe, 0x1f, 0xa2, 0x7d, 0x65, 0xff, 0xfc, 0x63, - 0x2c, 0xe4, 0x6a, 0x77, 0x3c, 0xe3, 0x81, 0xac, 0xbd, 0xbe, 0x3c, 0xb2, - 0xa1, 0x77, 0xdf, 0x1a, 0x0e, 0x72, 0x09, 0xdb, 0xf8, 0x4a, 0x22, 0xdd, - 0xff, 0x16, 0xdc, 0x86, 0xbf, 0xdd, 0x59, 0x73, 0xfc, 0xb2, 0xf7, 0x9f, - 0x71, 0x65, 0xf4, 0x7f, 0x3f, 0x8b, 0x2f, 0x9a, 0xd7, 0xea, 0xca, 0xc4, - 0x5b, 0xb4, 0xeb, 0xf1, 0x7e, 0x8f, 0x88, 0x4b, 0x7f, 0x66, 0xeb, 0xbf, - 0xb8, 0xb2, 0xff, 0xec, 0xe7, 0x5f, 0xe1, 0x37, 0x60, 0xa4, 0xb2, 0xff, - 0xff, 0x18, 0x76, 0x99, 0xdf, 0x6e, 0xe4, 0xc5, 0x0d, 0xf3, 0xac, 0xbf, - 0xc5, 0xb0, 0xcf, 0x51, 0xbd, 0x65, 0xf1, 0x77, 0xf0, 0xac, 0xbf, 0x35, - 0x90, 0xc8, 0x64, 0x4f, 0x4b, 0x2f, 0xff, 0xe9, 0x67, 0x0f, 0x5a, 0x36, - 0x89, 0xdf, 0x60, 0xbd, 0x59, 0x50, 0x8e, 0xfc, 0x35, 0x32, 0x37, 0x3a, - 0xbf, 0x6d, 0xe7, 0xf4, 0x2c, 0xbf, 0xf4, 0x1f, 0xbd, 0x9d, 0xf6, 0x49, - 0x65, 0xfe, 0xc2, 0x96, 0x70, 0x46, 0xac, 0xbb, 0x0b, 0x47, 0xe1, 0xd3, - 0xda, 0x74, 0x62, 0x0b, 0x09, 0x8b, 0xff, 0xd2, 0xcf, 0xa4, 0x24, 0x7e, - 0xcc, 0x51, 0x45, 0x49, 0x7e, 0x68, 0xb8, 0x7b, 0xd6, 0x5e, 0x96, 0x14, - 0xc7, 0xfa, 0x22, 0x9d, 0x42, 0x36, 0x5e, 0x14, 0xb7, 0xff, 0xe7, 0xd4, - 0x87, 0xe8, 0xe1, 0x60, 0xaf, 0xa6, 0x16, 0x54, 0x2e, 0x32, 0x8d, 0x2f, - 0x0b, 0xf4, 0x91, 0xe8, 0xd4, 0x4a, 0x3d, 0x60, 0x93, 0x5f, 0xf1, 0x94, - 0xb8, 0xca, 0xa7, 0xa6, 0x44, 0xf4, 0xb2, 0xfa, 0x6e, 0x64, 0xcb, 0x2f, - 0xdf, 0xc7, 0x73, 0x71, 0x65, 0xff, 0x0e, 0x7c, 0xd8, 0x62, 0x0b, 0xab, - 0x2f, 0xee, 0x6b, 0x47, 0x37, 0x16, 0x5f, 0xe8, 0xcd, 0x01, 0xdc, 0x0a, - 0x88, 0x25, 0x7f, 0xd1, 0xdc, 0xd0, 0x1d, 0xc0, 0xa8, 0xbe, 0x57, 0xe7, - 0x1f, 0xa1, 0x85, 0x97, 0xff, 0xfd, 0x87, 0xac, 0x1f, 0xa3, 0xe9, 0x6a, - 0x3b, 0xc1, 0x0a, 0x4b, 0x2f, 0xfc, 0x59, 0xde, 0x9f, 0x3b, 0x9f, 0xac, - 0xbb, 0x38, 0xc9, 0x4d, 0xf8, 0x65, 0xe0, 0x3e, 0x6a, 0x21, 0x14, 0x71, - 0x9e, 0xb1, 0x51, 0x09, 0x47, 0x77, 0x44, 0xa9, 0xd7, 0x7c, 0xa4, 0xcb, - 0xff, 0xa3, 0xc6, 0xc6, 0x6b, 0x66, 0x87, 0xe5, 0x97, 0xfc, 0x3d, 0x63, - 0x72, 0x4e, 0x35, 0x97, 0xff, 0xe0, 0xbf, 0x30, 0x81, 0xe3, 0x1f, 0xb3, - 0xed, 0xd5, 0x95, 0x8a, 0xe7, 0x4e, 0x54, 0xcf, 0x8b, 0x5d, 0x1c, 0x8e, - 0x2f, 0xd2, 0xcf, 0xc4, 0xea, 0xcb, 0xfb, 0xd3, 0xfe, 0x30, 0x79, 0x65, - 0x39, 0xed, 0x84, 0xaa, 0xfd, 0xfc, 0x4b, 0x98, 0xb2, 0xff, 0xfe, 0x80, - 0x83, 0xd1, 0xac, 0xe1, 0x05, 0xe4, 0xc3, 0xac, 0xbf, 0xf7, 0x61, 0xbc, - 0x83, 0xd9, 0xfa, 0xb2, 0xff, 0xdb, 0x3f, 0xd3, 0xf9, 0xd2, 0x7d, 0xeb, - 0x2f, 0xff, 0xb3, 0xb0, 0x5d, 0xe6, 0x63, 0x0c, 0x3c, 0x96, 0x5f, 0xcc, - 0x67, 0x7b, 0x83, 0x59, 0x7f, 0xec, 0x1c, 0x4a, 0x3d, 0x9f, 0xba, 0xcb, - 0xf9, 0xe4, 0x19, 0x38, 0xd6, 0x5f, 0xff, 0xf7, 0x82, 0xfb, 0x6a, 0x3c, - 0xe7, 0xce, 0x63, 0x0e, 0x5f, 0xac, 0xbf, 0x1e, 0xdc, 0xe3, 0xac, 0xa1, - 0xa2, 0x3f, 0xcc, 0xf7, 0x85, 0x14, 0x54, 0x97, 0xef, 0x60, 0x1f, 0x49, - 0x19, 0x9a, 0x0b, 0xff, 0xfd, 0x36, 0xa3, 0x7c, 0xe6, 0x1e, 0x70, 0x93, - 0x72, 0x76, 0x7d, 0xd5, 0x95, 0x08, 0xeb, 0xea, 0x18, 0x87, 0x37, 0xfd, - 0xe3, 0x17, 0xb3, 0x6a, 0x3a, 0xb2, 0xff, 0xc7, 0xd0, 0xe7, 0x5d, 0xb8, - 0x4b, 0x2c, 0x72, 0x3f, 0x7d, 0x1d, 0xd6, 0xca, 0xdc, 0xc0, 0x89, 0xa4, - 0xf6, 0x97, 0x7e, 0x7a, 0x51, 0xd3, 0xf6, 0x14, 0xf4, 0xb2, 0x96, 0x5d, - 0x2e, 0x0a, 0x5b, 0x6e, 0x85, 0xdf, 0xf9, 0xb1, 0xf7, 0x0b, 0x36, 0x12, - 0x4b, 0x2f, 0xff, 0xf1, 0xf9, 0xcb, 0xe9, 0x09, 0x28, 0x29, 0x3b, 0x70, - 0x6b, 0x2f, 0xff, 0x66, 0x78, 0x7e, 0x8e, 0x67, 0x8f, 0xf5, 0x97, 0xe9, - 0xa5, 0x1a, 0xe2, 0xcb, 0xfd, 0x84, 0x19, 0x73, 0x67, 0x59, 0x66, 0x27, - 0x1e, 0xe0, 0xca, 0x6f, 0xfc, 0x7d, 0xd8, 0x3c, 0x9d, 0xad, 0x42, 0xca, - 0x84, 0xf8, 0xf6, 0x30, 0x92, 0x08, 0xd8, 0x0e, 0x14, 0xbd, 0x2b, 0xbe, - 0x9c, 0x7e, 0x0a, 0xcb, 0xf6, 0x4b, 0xd1, 0xa5, 0x94, 0x03, 0xcb, 0xdc, - 0x24, 0xbf, 0x1f, 0x98, 0x8f, 0x96, 0x5f, 0xb0, 0x65, 0x1f, 0x2c, 0xb7, - 0x60, 0xf4, 0x08, 0xa6, 0xff, 0xff, 0xfd, 0xf7, 0x4a, 0x1b, 0xc1, 0xfa, - 0x39, 0x92, 0x36, 0x18, 0x7e, 0x94, 0x37, 0x8b, 0x2f, 0xfe, 0xef, 0x1e, - 0x5c, 0xc0, 0x43, 0x4d, 0x65, 0xff, 0xef, 0x8a, 0x70, 0x3c, 0x7f, 0xff, - 0x1a, 0x92, 0xca, 0x84, 0xec, 0x4d, 0xd5, 0xc9, 0x83, 0x08, 0x41, 0x10, - 0xef, 0xfd, 0xb7, 0xd0, 0x6d, 0xc2, 0xcd, 0xc5, 0x97, 0xed, 0xbd, 0x01, - 0xc5, 0x97, 0xf1, 0xf3, 0x06, 0x26, 0x2c, 0xbf, 0x6e, 0x99, 0x66, 0xf5, - 0x97, 0xf6, 0x0c, 0xc2, 0x0f, 0x00, 0xf6, 0x1c, 0xb6, 0xfe, 0xe4, 0x8d, - 0xaf, 0x25, 0x95, 0x08, 0xf0, 0xd4, 0x20, 0x3f, 0x43, 0xbf, 0xdc, 0x2c, - 0xdf, 0xe7, 0x92, 0xcb, 0xdc, 0x96, 0xf5, 0x94, 0x67, 0xa7, 0xb8, 0x69, - 0x7f, 0xfa, 0x36, 0x13, 0xd1, 0xf7, 0x73, 0x62, 0x1a, 0xca, 0xc5, 0x45, - 0x47, 0x19, 0x8b, 0xc2, 0x20, 0x89, 0x2f, 0xfe, 0x79, 0x60, 0xc8, 0xdf, - 0xd0, 0xd5, 0x97, 0x3f, 0x96, 0x57, 0x8f, 0x5f, 0xa8, 0x37, 0xfa, 0x30, - 0xba, 0xc9, 0x14, 0x0b, 0x2f, 0xf7, 0xb3, 0x7c, 0xee, 0x48, 0x0b, 0x2b, - 0x87, 0xdf, 0xd3, 0x7a, 0xea, 0x2c, 0xc3, 0x09, 0x1b, 0xff, 0xf8, 0xbf, - 0x2c, 0xef, 0xb3, 0xc4, 0xff, 0x48, 0xf1, 0x65, 0xfc, 0x53, 0x84, 0xd7, - 0x9d, 0x65, 0xff, 0x82, 0xf2, 0x9d, 0x06, 0x3c, 0x6a, 0xca, 0x34, 0x64, - 0x3a, 0xc9, 0x18, 0x5f, 0xfb, 0x47, 0xfe, 0xde, 0x8e, 0x07, 0x8b, 0x2f, - 0xd9, 0xa7, 0xf8, 0x55, 0x96, 0x92, 0xcb, 0xff, 0xf0, 0xa5, 0x83, 0xd1, - 0x87, 0x61, 0xfa, 0x0b, 0x65, 0x96, 0xda, 0x0f, 0xa3, 0x04, 0x6b, 0x64, - 0x5c, 0x72, 0x12, 0x37, 0xfa, 0x62, 0x71, 0x7b, 0x9e, 0x59, 0x7b, 0xd8, - 0x05, 0x97, 0x85, 0x14, 0x54, 0x97, 0xf7, 0xf0, 0x59, 0xf7, 0x52, 0x33, - 0x34, 0x15, 0x39, 0x16, 0x13, 0xe6, 0x82, 0x1e, 0x5f, 0xff, 0xcc, 0xb9, - 0xc0, 0xf1, 0x8c, 0x78, 0x2c, 0xee, 0xf3, 0x36, 0x59, 0x5e, 0x44, 0xe0, - 0x4d, 0xaa, 0x15, 0x48, 0x9c, 0x3e, 0x5e, 0x37, 0x5b, 0xfe, 0x12, 0x39, - 0x82, 0x88, 0x5d, 0x59, 0x5b, 0x36, 0xb2, 0xd2, 0x97, 0xd4, 0x38, 0x55, - 0x61, 0x08, 0x0a, 0x3e, 0x5a, 0x39, 0x76, 0x3a, 0x94, 0xd6, 0xd9, 0x4b, - 0x1e, 0x94, 0xf0, 0x51, 0xa8, 0x72, 0x1e, 0x1d, 0x95, 0x7c, 0x21, 0xd5, - 0xff, 0xb0, 0xcb, 0x67, 0x2e, 0xe3, 0x56, 0x5f, 0xfc, 0xc0, 0x9d, 0x3e, - 0x16, 0x6f, 0x31, 0xac, 0xbf, 0x8b, 0x07, 0xe7, 0x15, 0x65, 0x68, 0xfd, - 0x1a, 0x8f, 0x78, 0x9d, 0xab, 0x2f, 0xe1, 0xfb, 0x3b, 0x3f, 0x8b, 0x2c, - 0x7e, 0x3c, 0xb1, 0x46, 0xea, 0x11, 0x2b, 0xe6, 0xdb, 0xe2, 0x7f, 0xba, - 0xb2, 0xf6, 0x17, 0xeb, 0x2f, 0xb3, 0xb3, 0x49, 0x65, 0xff, 0xdb, 0xa5, - 0x1b, 0xbc, 0x72, 0x13, 0xfe, 0x2c, 0xaf, 0x1f, 0x73, 0x91, 0xdf, 0xfb, - 0x3b, 0x1a, 0xe7, 0xa0, 0xba, 0xb8, 0x82, 0x17, 0xf6, 0x68, 0x0e, 0xe0, - 0x54, 0x41, 0x06, 0x67, 0x95, 0x7a, 0x06, 0x6b, 0x2a, 0x0f, 0x9f, 0x89, - 0x97, 0x6f, 0x1a, 0xcb, 0xdb, 0xe1, 0xab, 0x2f, 0xdb, 0x66, 0xa2, 0x4b, - 0x2f, 0xb5, 0xa3, 0x15, 0x65, 0x9d, 0xa7, 0x97, 0xe2, 0x8b, 0xfb, 0x70, - 0x62, 0xb9, 0x49, 0x65, 0x6c, 0x8d, 0xac, 0x19, 0x26, 0x90, 0x93, 0xdf, - 0xfe, 0x9a, 0x46, 0x5d, 0x8f, 0xe6, 0x23, 0x99, 0x65, 0xc5, 0x32, 0xcb, - 0x40, 0xcf, 0x8f, 0x13, 0x2b, 0x65, 0x67, 0xcc, 0x11, 0x7a, 0x11, 0x5f, - 0xc3, 0x48, 0xa1, 0xf7, 0xbe, 0x13, 0xf7, 0xef, 0x1c, 0x6b, 0xf5, 0x97, - 0xfd, 0x9a, 0xf1, 0xe8, 0xb3, 0x65, 0x97, 0xf7, 0xb3, 0xbd, 0x36, 0xac, - 0xbf, 0xfb, 0x83, 0x23, 0xd8, 0x4d, 0x14, 0x62, 0xcb, 0xfb, 0xa2, 0x67, - 0x9f, 0xe5, 0x95, 0xf2, 0x28, 0x3c, 0x5a, 0x48, 0x97, 0xfc, 0x5b, 0x66, - 0xbf, 0x20, 0xfe, 0xb2, 0xfe, 0xcf, 0xbb, 0xad, 0x42, 0xcb, 0xff, 0xb8, - 0x4f, 0xd7, 0x68, 0x91, 0xb6, 0x2c, 0xa1, 0x9f, 0x97, 0x0b, 0xaa, 0x11, - 0xfe, 0x66, 0x01, 0x85, 0x6d, 0xfd, 0x80, 0x13, 0x7f, 0xb1, 0x65, 0xfb, - 0x78, 0xfd, 0x1c, 0x59, 0x66, 0xac, 0xbf, 0xd1, 0xd1, 0xf8, 0x2f, 0xc5, - 0x82, 0x16, 0x37, 0xfd, 0xb3, 0xca, 0x0b, 0xb3, 0xf8, 0xb2, 0xff, 0xfc, - 0x43, 0xd6, 0x03, 0xd1, 0xec, 0xd6, 0xa1, 0x85, 0x95, 0x08, 0x90, 0x33, - 0xbb, 0xa1, 0x85, 0x97, 0xfb, 0x34, 0x7f, 0xb5, 0xe4, 0xb2, 0xe3, 0x25, - 0x96, 0x15, 0x65, 0x0c, 0xd3, 0x88, 0x2b, 0x78, 0x83, 0xb2, 0xcb, 0xdb, - 0x14, 0x2c, 0xbf, 0x79, 0xe5, 0x84, 0xb2, 0xfe, 0x3e, 0x96, 0x78, 0xd6, - 0x5d, 0x9e, 0x9c, 0x7a, 0x30, 0x4d, 0x73, 0x8b, 0x39, 0x34, 0xb1, 0x8b, - 0xe2, 0xd7, 0x88, 0x9c, 0x77, 0xad, 0xb7, 0xf4, 0x6d, 0xde, 0x67, 0x56, - 0x54, 0x2e, 0xa3, 0x4a, 0x3d, 0x7c, 0x33, 0x33, 0x0d, 0x1d, 0xfa, 0x1a, - 0x65, 0x1b, 0x60, 0xac, 0x97, 0xf7, 0x0c, 0x63, 0xc2, 0x59, 0x7f, 0xff, - 0xf6, 0x76, 0x1a, 0x3c, 0xec, 0x61, 0x48, 0xb3, 0xe9, 0x46, 0x75, 0x65, - 0xff, 0xfb, 0xd9, 0xce, 0x66, 0x07, 0x5b, 0x60, 0x4b, 0xab, 0x28, 0x91, - 0x87, 0xd6, 0xeb, 0xfe, 0xf4, 0x6b, 0xa5, 0x19, 0xf2, 0xcb, 0xff, 0xfe, - 0x3d, 0xa2, 0x5c, 0xd6, 0x8f, 0xe9, 0xa4, 0xfa, 0x6e, 0x7c, 0xb2, 0xff, - 0x43, 0xec, 0xfa, 0x71, 0x16, 0x5e, 0xf6, 0x10, 0xd1, 0xab, 0xe3, 0x8e, - 0xb5, 0x56, 0x2a, 0x26, 0x38, 0x77, 0xf6, 0x1e, 0xf7, 0xe8, 0xd4, 0xdc, - 0xd9, 0x65, 0xff, 0x7a, 0x33, 0x52, 0xe0, 0x5a, 0xb2, 0xb6, 0x3e, 0x30, - 0x15, 0x5c, 0x7c, 0x59, 0x7f, 0xd9, 0xb3, 0xf7, 0xf1, 0x0a, 0x4b, 0x2f, - 0xe7, 0xec, 0xe8, 0x93, 0x0b, 0x2f, 0xe1, 0x1b, 0xc1, 0x5f, 0xe5, 0x95, - 0x09, 0xb9, 0x64, 0x27, 0x58, 0x23, 0xd0, 0xb3, 0x9d, 0xf4, 0xc2, 0xf6, - 0xb3, 0xcb, 0x2f, 0x70, 0xda, 0xb2, 0xb4, 0x6e, 0x3a, 0x39, 0x71, 0xec, - 0xb2, 0xa0, 0xdc, 0x6e, 0x90, 0xdf, 0xfd, 0xe3, 0x82, 0x9c, 0xe5, 0x23, - 0x6a, 0xcb, 0xe3, 0x98, 0xc5, 0x59, 0x7f, 0xf3, 0x5f, 0xe1, 0x3a, 0x7a, - 0x80, 0xb2, 0xd6, 0x5d, 0xbf, 0x4b, 0x2f, 0xff, 0xc1, 0xd8, 0xa3, 0x3c, - 0xce, 0x3b, 0x9e, 0x0e, 0x96, 0x5f, 0x77, 0x82, 0x72, 0x72, 0x64, 0x03, - 0x43, 0xc2, 0x32, 0x4a, 0x10, 0x66, 0xe2, 0x15, 0x65, 0xfb, 0x8d, 0xce, - 0xf1, 0x65, 0xff, 0xc6, 0xc6, 0x74, 0xfd, 0x9d, 0x8d, 0x2c, 0xbf, 0x3c, - 0x88, 0xe1, 0x65, 0xf9, 0xcb, 0xb8, 0x4b, 0x2f, 0xfc, 0xc1, 0x3f, 0x79, - 0x9b, 0xfc, 0x6b, 0x2a, 0x0f, 0x95, 0xc9, 0x6f, 0xfd, 0x31, 0x38, 0xb3, - 0x49, 0xf5, 0x25, 0x97, 0xf1, 0xeb, 0x51, 0x84, 0xb2, 0xff, 0xa2, 0x5c, - 0xc0, 0x14, 0x69, 0x65, 0x30, 0x7c, 0x5a, 0x2b, 0xb1, 0xac, 0xbf, 0xb8, - 0x7a, 0x07, 0xb1, 0x65, 0xe2, 0x76, 0x30, 0xf8, 0x00, 0x47, 0xf0, 0x85, - 0x49, 0x70, 0x5f, 0x23, 0x43, 0x03, 0x29, 0x8b, 0xe8, 0xa1, 0xa8, 0x65, - 0x08, 0xae, 0x10, 0x06, 0x30, 0x3b, 0xef, 0x80, 0x63, 0x59, 0x7e, 0xf1, - 0xcf, 0x9b, 0x0b, 0x2f, 0xb3, 0xf3, 0xde, 0xb2, 0xfb, 0xff, 0xc3, 0xfa, - 0xca, 0x01, 0xfa, 0x91, 0x58, 0x84, 0x97, 0xc1, 0xd7, 0x4d, 0x65, 0xf8, - 0xa5, 0xcd, 0xbf, 0x59, 0x7f, 0xff, 0x4b, 0xa7, 0x30, 0x3c, 0x7f, 0x74, - 0x42, 0xcd, 0xf8, 0xb2, 0xff, 0xef, 0xe3, 0x8d, 0x83, 0xd6, 0x8c, 0x55, - 0x97, 0x9d, 0xe4, 0xb2, 0x86, 0x98, 0x5e, 0x11, 0x7c, 0x54, 0x6b, 0xff, - 0xa2, 0xdf, 0x9a, 0x7d, 0xec, 0x2c, 0xbc, 0x78, 0x2a, 0xcb, 0xe3, 0xe6, - 0x0c, 0xcf, 0x0c, 0x89, 0xef, 0xe2, 0xe6, 0x36, 0x37, 0x16, 0x5f, 0x6e, - 0x7b, 0x36, 0x59, 0x7f, 0xa0, 0x79, 0xd3, 0xf0, 0x56, 0x54, 0x1e, 0xc0, - 0xc9, 0xaf, 0x98, 0x3f, 0xb8, 0xb2, 0xa1, 0x19, 0x8d, 0x84, 0x3f, 0x48, - 0x6f, 0xfd, 0xd1, 0x3f, 0x81, 0x23, 0xf8, 0xfd, 0x65, 0xff, 0x04, 0x6e, - 0x5f, 0xb2, 0xfc, 0xeb, 0x2f, 0xff, 0xfc, 0xd7, 0x2f, 0xe4, 0x7c, 0x0b, - 0x7c, 0x71, 0xdf, 0x05, 0xda, 0xb2, 0xff, 0xf8, 0x83, 0xd9, 0x1f, 0xfe, - 0x73, 0xeb, 0xb5, 0x65, 0xd3, 0xb7, 0x16, 0x5f, 0xff, 0x9c, 0xfa, 0x63, - 0xc1, 0xe7, 0x4d, 0xa7, 0xa5, 0x97, 0xff, 0xa0, 0x03, 0xc1, 0x3a, 0x7a, - 0x80, 0xb2, 0xd6, 0x5e, 0x0e, 0x0d, 0x65, 0xed, 0x3f, 0x31, 0x32, 0x7d, - 0x27, 0xf8, 0x70, 0x94, 0xa7, 0xd3, 0xad, 0xd9, 0x2a, 0x2d, 0x73, 0xd0, - 0xc7, 0x27, 0x5f, 0x2a, 0xad, 0x39, 0x4e, 0x17, 0x4a, 0x16, 0x5f, 0xfe, - 0xd8, 0x7e, 0x8f, 0x67, 0xdf, 0xe7, 0x78, 0xb2, 0x9c, 0xf8, 0xc2, 0x2d, - 0x50, 0xbd, 0xe6, 0x38, 0x4c, 0x64, 0x67, 0x40, 0x84, 0x71, 0xc6, 0x04, - 0xf2, 0xb8, 0x4a, 0x11, 0xf7, 0xb5, 0xa8, 0x59, 0x7f, 0x6a, 0x36, 0x32, - 0xea, 0xcb, 0xc3, 0x11, 0xab, 0x2f, 0xc5, 0x03, 0xc9, 0x96, 0x5f, 0x70, - 0x3a, 0x61, 0x65, 0xfa, 0x3d, 0xd8, 0x92, 0xcb, 0xe1, 0x87, 0xbc, 0x83, - 0xf2, 0xf8, 0x9f, 0xf2, 0x4b, 0xde, 0x13, 0x4b, 0x2f, 0xf4, 0x13, 0xf8, - 0x25, 0xb2, 0xcb, 0xff, 0xf7, 0x8f, 0x5e, 0x78, 0x26, 0x1e, 0x67, 0x7d, - 0x96, 0x5f, 0x61, 0xff, 0xc5, 0x97, 0xc7, 0xc8, 0x96, 0x1f, 0xbe, 0x95, - 0x6f, 0x6c, 0x38, 0x59, 0x79, 0xb1, 0xe5, 0x97, 0xa2, 0x4c, 0x95, 0x96, - 0xff, 0x0d, 0xe1, 0x0e, 0x5f, 0xf4, 0x72, 0x3b, 0xcc, 0x29, 0x2c, 0xbf, - 0xff, 0xfd, 0x9b, 0x72, 0x18, 0x7e, 0x76, 0x58, 0xc3, 0x19, 0xf7, 0x75, - 0x19, 0xf2, 0xcb, 0xf4, 0x4e, 0xd1, 0x49, 0x65, 0x79, 0x1b, 0x9c, 0x37, - 0x0b, 0xe5, 0xe6, 0x5f, 0xb1, 0x65, 0x4f, 0x6a, 0xf2, 0x86, 0x39, 0x85, - 0xa7, 0x09, 0x09, 0x92, 0x1a, 0x3d, 0xe8, 0x54, 0xb9, 0xb9, 0x2c, 0xf6, - 0x30, 0x20, 0x98, 0x5e, 0xd0, 0x9c, 0x59, 0x7e, 0xc1, 0x7a, 0x23, 0x56, - 0x5f, 0xff, 0xf7, 0x04, 0x8f, 0xc7, 0xe8, 0xd6, 0x11, 0xbc, 0xb9, 0x9d, - 0x59, 0x77, 0x36, 0x59, 0x7f, 0x14, 0x0b, 0xa8, 0x6a, 0xca, 0x19, 0xe2, - 0xe0, 0xc5, 0x69, 0x19, 0x9d, 0x85, 0x5d, 0xff, 0xa2, 0x5c, 0x0e, 0xbf, - 0xcf, 0x3a, 0xcb, 0xfd, 0xbf, 0x06, 0xe4, 0xfb, 0xd6, 0x5f, 0xf7, 0xa3, - 0xee, 0xc7, 0x9f, 0x71, 0x65, 0x2c, 0xa9, 0xc7, 0x8e, 0xca, 0xe7, 0x96, - 0xf9, 0x65, 0xd8, 0x2a, 0xcb, 0xbb, 0xd3, 0x35, 0x3d, 0x12, 0xa8, 0x44, - 0x01, 0xaa, 0x5f, 0xf9, 0xc8, 0x19, 0xa0, 0x3b, 0x81, 0x51, 0x08, 0xae, - 0x96, 0xcb, 0x2a, 0x15, 0x7c, 0xe0, 0xf1, 0xc3, 0xd9, 0xa5, 0x0e, 0x7f, - 0xfc, 0x3f, 0x02, 0x43, 0xbd, 0x26, 0xfb, 0x6e, 0x7e, 0xeb, 0x2f, 0xfb, - 0x4e, 0x3c, 0x3d, 0xee, 0xd5, 0x95, 0x87, 0xbb, 0xa2, 0x4b, 0xff, 0xff, - 0xde, 0xc0, 0xe9, 0x8f, 0x1f, 0xd1, 0xd0, 0xf8, 0xb3, 0xee, 0x85, 0xf8, - 0xb2, 0xff, 0xec, 0xf8, 0x4e, 0x99, 0x06, 0x59, 0xc5, 0x97, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xec, 0x2d, 0x89, 0xc7, 0x05, 0xb4, 0x68, 0x78, 0x59, - 0xde, 0x18, 0x30, 0x84, 0xdb, 0x35, 0x1c, 0x27, 0x63, 0x98, 0x7f, 0xfe, - 0x1f, 0xc9, 0xc7, 0x05, 0xb4, 0x69, 0x65, 0xf9, 0xf7, 0x73, 0xee, 0xac, - 0xbf, 0xa4, 0x59, 0x81, 0x65, 0xac, 0xbf, 0xcf, 0xd9, 0x66, 0xb3, 0x8b, - 0x2a, 0x13, 0xdc, 0xc4, 0x5f, 0x46, 0x14, 0xe5, 0x64, 0x61, 0x7f, 0xe7, - 0x2c, 0x3d, 0x14, 0x7d, 0x25, 0x97, 0xff, 0x75, 0xcb, 0x6f, 0xa4, 0x51, - 0x9c, 0x59, 0x7f, 0xfe, 0x8f, 0xe6, 0x94, 0x6c, 0x4e, 0xc7, 0x0a, 0x24, - 0xb2, 0xff, 0xc2, 0x67, 0x9d, 0xac, 0xc5, 0x14, 0x55, 0x97, 0xff, 0xec, - 0x07, 0xa0, 0x86, 0x47, 0xb6, 0x11, 0xb0, 0xb2, 0xcf, 0xb2, 0x26, 0x24, - 0x8b, 0x52, 0x4c, 0x61, 0xe1, 0xdf, 0x7f, 0xff, 0x4c, 0x51, 0xff, 0x01, - 0xe3, 0xd4, 0xc5, 0x1f, 0xf1, 0x65, 0xff, 0xfd, 0xde, 0x43, 0x12, 0x3f, - 0x39, 0x76, 0x59, 0xac, 0x59, 0x7f, 0xe3, 0xe6, 0x0e, 0x73, 0xff, 0x3f, - 0x8b, 0x2e, 0x0e, 0xf5, 0x97, 0xfa, 0x1b, 0xf7, 0x63, 0x3e, 0x59, 0x7f, - 0xef, 0x1e, 0xff, 0x3c, 0xb5, 0x0c, 0x2c, 0xac, 0x4c, 0xac, 0x0b, 0x5a, - 0x43, 0xf0, 0xcf, 0x4d, 0x2f, 0xe0, 0xf4, 0xc2, 0x4c, 0x2c, 0xbf, 0xb0, - 0x5c, 0x20, 0xfe, 0xb2, 0xfd, 0x2c, 0xec, 0x7e, 0xb2, 0xe8, 0x6e, 0xc7, - 0xad, 0xf1, 0x75, 0xff, 0xff, 0xdf, 0xb5, 0xe5, 0xe7, 0x3e, 0x98, 0xf0, - 0x79, 0xd3, 0x69, 0xe9, 0x65, 0x71, 0x13, 0xe1, 0x2f, 0xbf, 0xff, 0x16, - 0x73, 0x3c, 0xfb, 0xa0, 0xf1, 0xb6, 0x00, 0xb2, 0xfd, 0xb3, 0x60, 0x70, - 0xb2, 0xa4, 0xbf, 0xf4, 0x39, 0x4a, 0xc0, 0x4d, 0xf8, 0xf2, 0x68, 0xd7, - 0x34, 0x51, 0xe8, 0xe2, 0x78, 0x95, 0xd8, 0xc8, 0xf7, 0x91, 0x88, 0xad, - 0x7f, 0xe8, 0x61, 0x88, 0x2c, 0xef, 0x8d, 0x65, 0xfe, 0x8e, 0x72, 0x36, - 0xc1, 0x56, 0x5f, 0xff, 0x0f, 0xa1, 0x7f, 0xbb, 0xfe, 0x0e, 0x77, 0x8d, - 0x65, 0xfe, 0xf6, 0x37, 0x3c, 0x12, 0x59, 0x43, 0x45, 0xd3, 0x9a, 0x75, - 0x52, 0xfb, 0x34, 0xc1, 0xac, 0xa8, 0x65, 0x0e, 0xe5, 0x20, 0x6c, 0xe1, - 0x72, 0xf0, 0xf8, 0x09, 0x7d, 0xe1, 0x45, 0x15, 0x25, 0xff, 0x67, 0xef, - 0xac, 0xdf, 0x83, 0x48, 0xcc, 0xd0, 0x5c, 0x28, 0xa9, 0x2f, 0x0a, 0x28, - 0xa9, 0x2f, 0xe7, 0xd8, 0x7e, 0x8e, 0x24, 0x66, 0x68, 0x28, 0x91, 0x8a, - 0x2a, 0x64, 0xf9, 0xcd, 0xf8, 0x06, 0x31, 0x1a, 0x91, 0x99, 0xb3, 0xbc, - 0x28, 0xa2, 0xa4, 0xbd, 0xc8, 0xd2, 0x46, 0x66, 0x82, 0xf9, 0xcb, 0xee, - 0xac, 0xb7, 0xe6, 0x8a, 0xbe, 0xad, 0x8a, 0x5d, 0x74, 0xfc, 0xf4, 0xb2, - 0xfc, 0x51, 0x27, 0x02, 0xcb, 0xd9, 0x31, 0xac, 0xa1, 0x9e, 0x10, 0x84, - 0xd7, 0xee, 0x07, 0x69, 0xf2, 0x59, 0x7e, 0x19, 0xef, 0x81, 0xac, 0xbe, - 0xc2, 0xcd, 0xc5, 0x95, 0xa3, 0xcc, 0x69, 0x4d, 0x1a, 0x26, 0x84, 0x78, - 0xbf, 0xfb, 0xcf, 0x22, 0x76, 0x26, 0x23, 0x99, 0x65, 0xff, 0x6d, 0x1f, - 0x70, 0xcb, 0x3f, 0x59, 0x7c, 0xf2, 0x3f, 0xd6, 0x56, 0x8f, 0x73, 0xc7, - 0x57, 0xec, 0xd9, 0xb8, 0xd5, 0x97, 0xf4, 0x6c, 0x3f, 0x47, 0x16, 0x5f, - 0xe8, 0xc0, 0x66, 0xf3, 0x1a, 0xcb, 0x60, 0x0f, 0x84, 0x8b, 0xab, 0x11, - 0xa2, 0x44, 0x53, 0xf0, 0x89, 0xbf, 0xbd, 0x9b, 0xf3, 0xbc, 0x59, 0x40, - 0x4f, 0x5f, 0xf8, 0xdc, 0xba, 0x6d, 0x52, 0x56, 0xa1, 0xa6, 0x1f, 0x42, - 0xf4, 0xa3, 0xfa, 0xbe, 0xdb, 0xf0, 0xfe, 0xb2, 0xed, 0xba, 0xb2, 0xa1, - 0x70, 0x3b, 0x25, 0xc3, 0xba, 0x49, 0x13, 0x5f, 0xb6, 0x9f, 0xf6, 0x01, - 0x65, 0xcc, 0xaa, 0x7a, 0x59, 0x7b, 0x91, 0xd5, 0x97, 0x7e, 0x2a, 0xcb, - 0x72, 0x63, 0x6a, 0xe3, 0x95, 0x88, 0xaa, 0xf8, 0xb3, 0xaa, 0xf7, 0xe0, - 0x47, 0xa1, 0xab, 0x2e, 0x7e, 0xac, 0xbe, 0xdc, 0x72, 0xff, 0x0d, 0xe9, - 0x13, 0xdf, 0xfe, 0x1b, 0x97, 0xe4, 0xee, 0x3e, 0x85, 0xd6, 0x56, 0x22, - 0x04, 0x27, 0x37, 0xfd, 0x05, 0x22, 0x1f, 0xa3, 0x65, 0x97, 0xf0, 0xf3, - 0x53, 0xed, 0x1a, 0xcb, 0xde, 0x39, 0x92, 0x56, 0x8f, 0x3b, 0x86, 0x37, - 0xfc, 0xff, 0x77, 0x26, 0x0e, 0x98, 0x59, 0x60, 0x19, 0xef, 0x04, 0x8a, - 0xff, 0x16, 0x7d, 0x2e, 0x1b, 0x0b, 0x2f, 0x68, 0x3b, 0x2c, 0xbc, 0xfa, - 0x61, 0x65, 0x68, 0xdd, 0xb8, 0xf5, 0x98, 0x59, 0x7f, 0xf6, 0x03, 0xd1, - 0xec, 0xd6, 0xa1, 0x85, 0x97, 0x8f, 0xfe, 0x41, 0xeb, 0x68, 0x4a, 0xa7, - 0x26, 0x31, 0xb3, 0x79, 0x3b, 0x5f, 0xf6, 0x60, 0x3f, 0x8c, 0xfa, 0x4b, - 0x2f, 0xfe, 0xee, 0x83, 0xcf, 0x3c, 0xbf, 0x31, 0xac, 0xbe, 0x87, 0x6e, - 0xf4, 0x97, 0xff, 0x78, 0xdf, 0xff, 0xe3, 0xf8, 0xf7, 0x16, 0x5f, 0xde, - 0xc6, 0xb5, 0xe4, 0xb2, 0xf0, 0xa2, 0x8a, 0x92, 0xff, 0x17, 0x7c, 0x70, - 0x5b, 0x24, 0x66, 0x68, 0x2f, 0x47, 0xf9, 0x24, 0x48, 0xe2, 0x6d, 0x75, - 0x30, 0xa1, 0x21, 0xaf, 0x7f, 0x64, 0xee, 0xbf, 0xfc, 0x59, 0x40, 0x4e, - 0x1d, 0xb1, 0x96, 0xef, 0x2a, 0xbf, 0xe7, 0xfc, 0xb2, 0x69, 0x47, 0xcb, - 0x2a, 0x15, 0x20, 0x64, 0x79, 0xa6, 0x73, 0x7f, 0x9c, 0x84, 0xd1, 0x06, - 0x4b, 0x2f, 0xff, 0xe9, 0x79, 0xe4, 0x0f, 0x1f, 0x65, 0x9e, 0xf3, 0xc9, - 0x65, 0xfa, 0x3f, 0x8f, 0x71, 0x65, 0x62, 0x20, 0xff, 0x5b, 0xbf, 0xf0, - 0x91, 0xaf, 0xfb, 0xe7, 0x19, 0xac, 0xbf, 0x6b, 0x47, 0xde, 0x2c, 0xa1, - 0x9f, 0x40, 0x88, 0x17, 0xff, 0xdf, 0xcf, 0xe4, 0x73, 0xd1, 0xf7, 0x58, - 0x0e, 0x96, 0x5f, 0xfb, 0xf9, 0xfc, 0x89, 0x1f, 0x4a, 0x16, 0x54, 0x22, - 0xe7, 0x08, 0xdd, 0x5a, 0xfd, 0x12, 0x39, 0x71, 0x65, 0x43, 0x21, 0x8a, - 0x50, 0xee, 0x60, 0x8b, 0xe8, 0x72, 0x1c, 0x67, 0xf3, 0x19, 0xfa, 0x53, - 0xcb, 0x9a, 0xff, 0x0b, 0x62, 0x8d, 0x13, 0x85, 0xb7, 0xff, 0xf7, 0x4d, - 0xb8, 0x5d, 0xe4, 0x31, 0xc0, 0x8f, 0xc6, 0xb2, 0xfd, 0xfe, 0x1f, 0x98, - 0x59, 0x7f, 0xfd, 0x80, 0x82, 0x7e, 0xf0, 0x61, 0x7d, 0x49, 0x65, 0x7c, - 0x7e, 0xed, 0x29, 0xbf, 0xa0, 0x80, 0xc8, 0x9e, 0x33, 0xca, 0xcb, 0xf4, - 0x37, 0x51, 0xbd, 0x65, 0xe9, 0x41, 0x2c, 0xbf, 0xfa, 0x01, 0xd2, 0x81, - 0x73, 0xbc, 0xe2, 0xcb, 0xff, 0x3f, 0xb5, 0x1d, 0x30, 0x18, 0xd6, 0x5f, - 0xf7, 0x7d, 0x87, 0xa9, 0x08, 0xd5, 0x95, 0xe3, 0xf7, 0xe1, 0xed, 0x69, - 0x1b, 0xbf, 0xc2, 0xee, 0xff, 0xff, 0xe2, 0x76, 0xc6, 0x80, 0x3f, 0x47, - 0x02, 0xe7, 0x2e, 0x79, 0xe4, 0xb2, 0xf0, 0x7b, 0xc5, 0x97, 0xe1, 0x5f, - 0xd0, 0xd5, 0x97, 0x81, 0x1c, 0x59, 0x7f, 0xf0, 0x92, 0xcf, 0x3f, 0x8f, - 0x5a, 0x85, 0x95, 0x08, 0x88, 0xc2, 0x8f, 0xc7, 0x2f, 0xef, 0x64, 0x9c, - 0xbf, 0x59, 0x7b, 0x9b, 0xf1, 0x65, 0xd1, 0xa5, 0x95, 0xd3, 0x69, 0x3e, - 0x3d, 0x7f, 0x66, 0xdc, 0xdc, 0x30, 0x2c, 0xa8, 0x3d, 0x52, 0x24, 0xbf, - 0x07, 0x4c, 0x78, 0xd6, 0x54, 0xe5, 0xcb, 0xe8, 0x86, 0x90, 0xc8, 0xc0, - 0x78, 0x65, 0x3a, 0x87, 0xc3, 0x94, 0xfe, 0xe0, 0x50, 0xa5, 0xe1, 0x7f, - 0x61, 0x6d, 0x3e, 0x41, 0x76, 0x85, 0x59, 0x7f, 0x89, 0xc5, 0xc2, 0x76, - 0x16, 0x5f, 0xfd, 0x9d, 0xe0, 0x9c, 0x69, 0x46, 0xa1, 0x65, 0xed, 0xf8, - 0x43, 0x3f, 0x66, 0x99, 0x5f, 0xfc, 0x2c, 0x68, 0x9f, 0x68, 0xd4, 0x49, - 0x65, 0x19, 0xfc, 0x78, 0xd2, 0xff, 0xff, 0x78, 0xc5, 0xcd, 0xd3, 0x6b, - 0xf7, 0x81, 0x96, 0x7d, 0xd5, 0x97, 0xff, 0x68, 0xff, 0x13, 0xd0, 0xd7, - 0x7e, 0xac, 0xa1, 0xa2, 0xab, 0x4c, 0xb5, 0x09, 0xfa, 0x64, 0x60, 0xcf, - 0x0c, 0xbb, 0xfe, 0x98, 0x1e, 0x36, 0xc6, 0x98, 0x59, 0x7f, 0x8f, 0x53, - 0x67, 0x62, 0x65, 0x97, 0xed, 0xdd, 0xd3, 0x20, 0x2c, 0xbf, 0x6d, 0x38, - 0x31, 0x32, 0xcb, 0x49, 0x65, 0xe1, 0x0a, 0x65, 0x95, 0x23, 0x5f, 0xf8, - 0x8d, 0x62, 0x63, 0x20, 0x3b, 0xd1, 0xa3, 0x96, 0xf1, 0x6e, 0xa1, 0xfb, - 0x5b, 0xb6, 0x96, 0xfb, 0x29, 0xe4, 0x11, 0xce, 0xbd, 0xe5, 0x6c, 0x0c, - 0xc4, 0x3f, 0x81, 0x1a, 0x29, 0xcb, 0x60, 0xdc, 0x71, 0x9a, 0x75, 0xbb, - 0x53, 0x83, 0x4d, 0x9c, 0xe2, 0xf4, 0xfc, 0x13, 0xce, 0x27, 0x7f, 0x2e, - 0x94, 0xa9, 0x5e, 0xdc, 0x9e, 0x2e, 0xed, 0x25, 0x3c, 0x33, 0xaf, 0x82, - 0xca, 0xb2, 0x12, 0x35, 0x2b, 0xe1, 0xfb, 0x38, 0xb2, 0xf6, 0xe9, 0xef, - 0x59, 0x71, 0xf9, 0x65, 0xf6, 0x61, 0x75, 0x65, 0xd0, 0x4b, 0x2b, 0xc7, - 0x97, 0xc1, 0x6d, 0xe4, 0x17, 0xff, 0xd8, 0x4c, 0xfa, 0xc1, 0xfd, 0xcf, - 0x67, 0xee, 0xb2, 0xa4, 0x88, 0x41, 0x98, 0xde, 0x77, 0x15, 0x65, 0xdf, - 0xc2, 0xcb, 0xf0, 0x33, 0xbe, 0x35, 0x96, 0x71, 0x9e, 0xd1, 0x8e, 0x10, - 0xbd, 0xff, 0xff, 0x67, 0x9c, 0x4e, 0x63, 0x0e, 0x5f, 0xc1, 0x44, 0xde, - 0x85, 0x96, 0x85, 0x97, 0xff, 0xe8, 0xd7, 0xa1, 0xbb, 0xa1, 0x82, 0x89, - 0xbd, 0x0b, 0x2f, 0xc7, 0xa9, 0xa3, 0xda, 0x46, 0x6f, 0xec, 0xc4, 0x21, - 0x52, 0x55, 0xb7, 0x84, 0x5f, 0x43, 0xc1, 0xaf, 0xa2, 0x43, 0xfe, 0xfd, - 0x37, 0xa3, 0x6c, 0x59, 0x6f, 0x2c, 0xa9, 0x1b, 0xa1, 0x94, 0xd9, 0x95, - 0xd6, 0x5f, 0xfb, 0xbe, 0x79, 0x76, 0x62, 0x86, 0xac, 0xbf, 0xf3, 0x97, - 0xf3, 0x86, 0x17, 0xd4, 0x96, 0x5f, 0x19, 0x6d, 0x0b, 0x2f, 0x77, 0x50, - 0xb2, 0xff, 0x8a, 0x1a, 0x65, 0x8d, 0x85, 0x97, 0xbc, 0x72, 0x59, 0x71, - 0x8f, 0x0f, 0xb6, 0x61, 0xce, 0x9a, 0xd6, 0xe2, 0x61, 0x3a, 0x41, 0x28, - 0x47, 0x5f, 0xfc, 0x5d, 0xe7, 0x9e, 0x53, 0xb3, 0xee, 0xac, 0xa9, 0xe2, - 0x9e, 0xfc, 0x0c, 0x64, 0x69, 0x01, 0x38, 0xbf, 0xe7, 0xdc, 0x9b, 0x91, - 0xe7, 0xdc, 0x59, 0x7f, 0xc2, 0x44, 0xc2, 0x46, 0x9e, 0x65, 0x97, 0xa0, - 0xb6, 0x59, 0x7c, 0x7e, 0x36, 0xac, 0xb7, 0x8c, 0xde, 0xcc, 0x39, 0x7b, - 0x9d, 0x35, 0x97, 0x4c, 0x15, 0x97, 0x40, 0x20, 0xda, 0x10, 0xe5, 0xff, - 0x47, 0x7c, 0xff, 0xbf, 0xdc, 0x59, 0x43, 0x3e, 0x42, 0x2a, 0xbf, 0xff, - 0xc4, 0x17, 0x07, 0x02, 0xe7, 0x28, 0x20, 0x67, 0xdd, 0x59, 0x7f, 0xdf, - 0xce, 0xf1, 0x80, 0x3a, 0xfd, 0x65, 0xed, 0xd8, 0xdc, 0x59, 0x5a, 0x3e, - 0x0d, 0xd3, 0xeb, 0xd3, 0x07, 0x4b, 0x2f, 0x61, 0xf5, 0x65, 0xff, 0x1e, - 0xb3, 0xe6, 0x62, 0x8a, 0x2a, 0xca, 0xf1, 0xed, 0x38, 0xdd, 0x42, 0x2f, - 0x9c, 0x97, 0x8f, 0x17, 0xff, 0xc5, 0x12, 0x9c, 0x27, 0x4c, 0x83, 0x2c, - 0xe2, 0xcb, 0xff, 0xf7, 0x83, 0xc6, 0xc7, 0xc0, 0xf1, 0xb4, 0x8f, 0x65, - 0x94, 0x35, 0x75, 0x98, 0xf2, 0x08, 0x5f, 0xb4, 0x87, 0xd1, 0xbe, 0xfe, - 0x5d, 0xc5, 0x1b, 0xb8, 0x15, 0x97, 0xf7, 0x8d, 0xa0, 0x31, 0xac, 0xbd, - 0xfb, 0xb5, 0x65, 0xd9, 0xfa, 0xca, 0x83, 0x69, 0x83, 0xb7, 0x9f, 0x1a, - 0xb2, 0xe2, 0x96, 0xc8, 0xb2, 0xc1, 0x72, 0x61, 0xdd, 0x1f, 0xbe, 0x8f, - 0x07, 0x4b, 0x2f, 0xee, 0x16, 0x0c, 0x9d, 0x65, 0x11, 0xe6, 0x8a, 0x45, - 0x70, 0x0d, 0x65, 0xf8, 0xa3, 0x68, 0xf9, 0x65, 0xb8, 0x03, 0x7c, 0x62, - 0xd5, 0x09, 0x8e, 0x9c, 0x25, 0xdd, 0x82, 0xfb, 0x85, 0x1b, 0x2c, 0xbf, - 0xed, 0x9f, 0xce, 0x32, 0x70, 0x2c, 0xad, 0x1e, 0xd1, 0x11, 0x5f, 0xff, - 0x0b, 0x80, 0xe6, 0x76, 0x6c, 0x60, 0xb3, 0xf5, 0x95, 0x87, 0xe6, 0x64, - 0x37, 0xfd, 0x82, 0xe6, 0x80, 0xee, 0x05, 0x46, 0x1c, 0xbf, 0xf8, 0x3c, - 0x1f, 0x9d, 0xbf, 0x48, 0xc9, 0x65, 0xfb, 0xbe, 0x72, 0xfd, 0x65, 0x6c, - 0x8b, 0x2f, 0x22, 0xba, 0x2d, 0xff, 0x9f, 0xb9, 0x33, 0xc1, 0x44, 0xcb, - 0x2f, 0xfd, 0xe3, 0xc1, 0x32, 0x61, 0x63, 0xe5, 0x96, 0x3d, 0x22, 0xbb, - 0xc6, 0x1c, 0x3d, 0xb8, 0x00, 0x54, 0x60, 0x8a, 0x92, 0x7b, 0x20, 0x8e, - 0x03, 0xf3, 0x5b, 0xfd, 0x3d, 0x70, 0x65, 0x9e, 0x64, 0xac, 0xbb, 0x09, - 0x65, 0x2c, 0xbf, 0xfa, 0x08, 0x19, 0xdf, 0x1e, 0xbf, 0x02, 0xca, 0x23, - 0xcf, 0xe8, 0x5d, 0xf1, 0xf3, 0xc6, 0xb2, 0xf6, 0x7d, 0xd5, 0x94, 0x33, - 0x7c, 0xd2, 0x1b, 0xf8, 0xcb, 0x3b, 0xe3, 0x59, 0x68, 0xc3, 0xcc, 0xe1, - 0x0d, 0x0d, 0x33, 0x5c, 0x64, 0x0c, 0x2a, 0xef, 0xff, 0x78, 0xe6, 0xf1, - 0xfd, 0xd2, 0xcd, 0xee, 0xb2, 0xff, 0xde, 0x3d, 0xfe, 0xcd, 0x68, 0xf7, - 0xac, 0xbf, 0xfd, 0x85, 0xde, 0x43, 0x1c, 0x08, 0xfc, 0x6b, 0x2f, 0xe6, - 0xf3, 0x8e, 0x5b, 0x2c, 0xb9, 0xad, 0x59, 0x50, 0x78, 0xae, 0x5d, 0x7f, - 0xdf, 0xf2, 0x47, 0xe7, 0x3d, 0x96, 0x5f, 0x73, 0x0b, 0xab, 0x2f, 0x6e, - 0xc6, 0x96, 0x51, 0x9f, 0xd3, 0x9d, 0x04, 0x86, 0xf7, 0x9f, 0xab, 0x2f, - 0x75, 0xf7, 0x16, 0x5f, 0xee, 0xf8, 0xd9, 0xfe, 0xe6, 0xb2, 0xff, 0x31, - 0xe8, 0x90, 0x5f, 0x4b, 0x2c, 0x4b, 0x28, 0xcf, 0x10, 0x26, 0x97, 0x09, - 0x8b, 0x2b, 0x65, 0xc7, 0x61, 0xc6, 0xe2, 0x03, 0x59, 0x93, 0x1a, 0x85, - 0xe8, 0x47, 0x94, 0x26, 0xb8, 0x5b, 0xd1, 0xc0, 0x8f, 0xcf, 0xbc, 0x88, - 0x43, 0x7e, 0x63, 0xf3, 0x9b, 0x8b, 0x2f, 0xbc, 0x6f, 0x25, 0x97, 0x86, - 0xf2, 0x59, 0x50, 0x6f, 0x70, 0x86, 0xc1, 0x84, 0x43, 0xfe, 0xd1, 0x7f, - 0xfa, 0x71, 0x3f, 0x63, 0x41, 0x96, 0xa2, 0x4b, 0x2f, 0xd1, 0xdf, 0x44, - 0xcb, 0x2e, 0xef, 0x16, 0x5f, 0x9d, 0x81, 0x63, 0x4b, 0x28, 0xd1, 0x67, - 0xe4, 0xb7, 0x28, 0x21, 0x7b, 0xfc, 0x65, 0xd9, 0x66, 0xb1, 0x65, 0xff, - 0xc6, 0x02, 0xc6, 0xc4, 0xc3, 0x8d, 0x96, 0x5f, 0xfd, 0x22, 0xc6, 0xb9, - 0x67, 0x9d, 0xab, 0x2f, 0xf6, 0x76, 0x37, 0x99, 0x7e, 0xb2, 0xff, 0xfb, - 0xf6, 0xbc, 0xa5, 0x9f, 0x89, 0xdd, 0xb8, 0x15, 0x94, 0x04, 0x44, 0xe8, - 0xd2, 0xff, 0x6a, 0x0c, 0x64, 0xf2, 0x59, 0x7f, 0xd9, 0xbe, 0x33, 0xef, - 0xba, 0xca, 0x96, 0x5f, 0xc1, 0x8e, 0xf3, 0x0a, 0x71, 0xf9, 0xf8, 0xc6, - 0xfc, 0x0f, 0x7c, 0xfb, 0x8b, 0x2f, 0xf7, 0x22, 0x4c, 0x31, 0x9b, 0x8b, - 0x2f, 0xfc, 0x32, 0x0f, 0x79, 0x05, 0x1c, 0x59, 0x50, 0x7e, 0xa6, 0x71, - 0x52, 0x55, 0xb6, 0x03, 0x1f, 0x91, 0x0e, 0x19, 0x45, 0x09, 0x60, 0xa2, - 0xef, 0x85, 0x0d, 0xff, 0x9f, 0x59, 0xbf, 0x07, 0xa2, 0x15, 0x65, 0xff, - 0xf8, 0x25, 0x2c, 0x2e, 0x9c, 0xfe, 0x74, 0x9e, 0x4b, 0x2f, 0xf4, 0x7f, - 0x1e, 0xcf, 0xa4, 0xb2, 0x8d, 0x11, 0x24, 0xab, 0x5f, 0xa3, 0xab, 0xb0, - 0xc9, 0xbe, 0x99, 0xe6, 0x75, 0x97, 0xcf, 0xd0, 0xc9, 0x65, 0x4e, 0x3c, - 0x52, 0x23, 0xbf, 0xef, 0x39, 0x64, 0xd2, 0x8f, 0x96, 0x5f, 0xfd, 0xe3, - 0xd6, 0x70, 0xb3, 0x7f, 0x8d, 0x65, 0xf8, 0xb3, 0x81, 0x9d, 0x87, 0xfb, - 0x31, 0xcd, 0xfb, 0x40, 0x77, 0x02, 0xa2, 0x06, 0x5f, 0xcf, 0xb7, 0xee, - 0x43, 0x45, 0x60, 0xf5, 0xec, 0xe0, 0x70, 0xfc, 0x27, 0xcd, 0x2f, 0x79, - 0xe5, 0x39, 0x1c, 0xa5, 0x0b, 0x0b, 0xfe, 0xf1, 0xe1, 0x60, 0x07, 0x8b, - 0x29, 0xaa, 0x98, 0xc9, 0xbb, 0xb1, 0xc2, 0xef, 0x3a, 0xbd, 0xd0, 0xc2, - 0xcb, 0xef, 0xf5, 0xce, 0x2c, 0xbf, 0xdf, 0xf4, 0xf6, 0x6c, 0x01, 0x65, - 0x7c, 0x7e, 0xae, 0x38, 0x44, 0x97, 0xe1, 0xcf, 0x2e, 0x39, 0xe5, 0x65, - 0xfc, 0x0f, 0xbd, 0xf3, 0xee, 0x2c, 0xbf, 0xd1, 0xa7, 0xd7, 0x70, 0x0b, - 0x2f, 0xfe, 0x31, 0xce, 0xcc, 0xfb, 0xf7, 0x2e, 0xac, 0xb4, 0xa4, 0x7f, - 0x1c, 0x32, 0xa8, 0x46, 0x9b, 0xc2, 0xae, 0xa1, 0x77, 0x5f, 0x25, 0xe1, - 0x9c, 0x2e, 0xdc, 0xb8, 0x31, 0x82, 0xdc, 0x72, 0x59, 0x7f, 0x7d, 0xd1, - 0xe6, 0x30, 0xb2, 0xfb, 0x26, 0x36, 0xac, 0xa1, 0x9f, 0x3e, 0x0b, 0x08, - 0x5f, 0x68, 0x59, 0x7d, 0x04, 0x7f, 0xac, 0xb6, 0x78, 0xd8, 0xf4, 0x42, - 0xff, 0x68, 0x9c, 0x51, 0x3e, 0x15, 0x65, 0xdf, 0xef, 0x59, 0x43, 0x3d, - 0x1f, 0x1b, 0xdf, 0xfe, 0x3f, 0xc1, 0xe3, 0xf1, 0x46, 0x6b, 0x16, 0x5f, - 0xf7, 0xc3, 0x8e, 0x18, 0xfd, 0x0b, 0x2f, 0x3e, 0xb6, 0x54, 0x60, 0xab, - 0xff, 0x3e, 0xb0, 0xbf, 0xe7, 0x79, 0xf2, 0xcb, 0xff, 0xff, 0xfb, 0x3b, - 0xe7, 0x26, 0x27, 0x73, 0x4e, 0xfd, 0xdf, 0x83, 0x9d, 0x8d, 0x72, 0xfa, - 0x4b, 0x88, 0x2d, 0x7f, 0xe7, 0x76, 0x00, 0xe3, 0x9c, 0xc0, 0xab, 0x88, - 0x2d, 0x7f, 0xf7, 0x8f, 0xc7, 0x05, 0xd9, 0xcc, 0x0a, 0xb8, 0x82, 0xd7, - 0xfa, 0x0c, 0xbb, 0x39, 0x81, 0x57, 0x10, 0x5a, 0xfe, 0x6e, 0x0e, 0x73, - 0x02, 0xae, 0x20, 0xb5, 0xff, 0xff, 0x39, 0x11, 0xb6, 0x77, 0x01, 0xe3, - 0xd1, 0xb1, 0xb6, 0x0a, 0xb8, 0x82, 0xd7, 0x7d, 0x38, 0x69, 0xce, 0x01, - 0x43, 0x4a, 0x8e, 0x86, 0x47, 0xf5, 0x0a, 0xb3, 0xfc, 0x80, 0x52, 0x8d, - 0xef, 0xf1, 0xc3, 0x1c, 0xef, 0x3e, 0x59, 0x7c, 0xfa, 0xfd, 0xd6, 0x5f, - 0xfd, 0xe3, 0xf1, 0xc1, 0x76, 0x73, 0x02, 0xae, 0x20, 0xb5, 0xff, 0x4d, - 0xc0, 0x1e, 0xd3, 0x98, 0x15, 0x71, 0x05, 0xaf, 0xdd, 0xe4, 0x36, 0x70, - 0x11, 0x42, 0x22, 0xa5, 0xff, 0xe9, 0xc0, 0xf1, 0x82, 0x3b, 0xc9, 0xcc, - 0x0a, 0xb8, 0x82, 0xd7, 0xff, 0xff, 0x11, 0x1b, 0x67, 0x07, 0x27, 0x70, - 0x1e, 0x3d, 0x1b, 0x1b, 0x60, 0xab, 0x88, 0x2d, 0x58, 0x99, 0x2f, 0xc8, - 0x6e, 0xbd, 0x7f, 0xde, 0x3d, 0x1b, 0x1b, 0x60, 0xab, 0x88, 0x2d, 0x7f, - 0xfc, 0xef, 0xf4, 0xb9, 0xe3, 0x18, 0xe3, 0x50, 0x92, 0xff, 0xd9, 0x29, - 0x07, 0x9a, 0x2d, 0xa7, 0xd7, 0x10, 0x5a, 0x80, 0x8e, 0x7d, 0x24, 0x71, - 0x3e, 0xff, 0xc0, 0x3d, 0x75, 0xff, 0xe4, 0xe1, 0x57, 0x10, 0x5a, 0xfe, - 0xf1, 0xfb, 0xc7, 0xfa, 0xa0, 0x0b, 0x5f, 0xb3, 0xf9, 0xcc, 0x0a, 0xb8, - 0x82, 0xd7, 0x67, 0x40, 0x7e, 0xbe, 0x3b, 0xaf, 0x91, 0xe5, 0xc8, 0x62, - 0xdf, 0xcd, 0xc1, 0xce, 0x60, 0x55, 0xc4, 0x16, 0xbf, 0xf0, 0x3c, 0x7a, - 0x36, 0x36, 0xc1, 0x57, 0x10, 0x5a, 0xec, 0x9c, 0xe8, 0x8d, 0xe1, 0xfd, - 0xfe, 0x09, 0xb5, 0xcb, 0xe9, 0x2e, 0x20, 0xb5, 0xff, 0xb0, 0xf7, 0xe1, - 0x60, 0xde, 0x4b, 0x88, 0x2c, 0xd3, 0xc0, 0xa1, 0xaf, 0x06, 0xe8, 0xdf, - 0xf3, 0x52, 0x8f, 0xa3, 0x91, 0x8b, 0xf6, 0x32, 0x20, 0xc2, 0xd8, 0x56, - 0xfb, 0xbf, 0x85, 0x44, 0x16, 0x66, 0x88, 0xcb, 0x9c, 0x0b, 0x2d, 0xc1, - 0xb2, 0x86, 0x40, 0x73, 0xfd, 0x26, 0x4b, 0xa7, 0x17, 0x4b, 0x75, 0x65, - 0xe8, 0x96, 0xea, 0xca, 0x83, 0x72, 0x43, 0x55, 0xb3, 0x30, 0x0c, 0x6c, - 0x1f, 0x3b, 0xe8, 0x8b, 0xfa, 0x53, 0x09, 0x42, 0x2a, 0xff, 0xec, 0x91, - 0x67, 0x7c, 0x79, 0xf7, 0x56, 0x5f, 0xe8, 0xf1, 0x8b, 0xf4, 0xb8, 0xb2, - 0xfd, 0x1d, 0xe7, 0x8d, 0x65, 0xff, 0xb5, 0x8c, 0x7b, 0x1a, 0x1d, 0x6c, - 0xb2, 0xff, 0xbe, 0x2c, 0x36, 0xe1, 0x7e, 0xb2, 0xff, 0xff, 0xfc, 0xf3, - 0x13, 0x8b, 0x9b, 0xcf, 0x9e, 0xcf, 0xe7, 0xf3, 0xbc, 0x76, 0xe7, 0xdd, - 0x59, 0x7e, 0x97, 0x79, 0x84, 0xb2, 0xff, 0xf3, 0x82, 0x08, 0x65, 0x9b, - 0xf4, 0x7c, 0x59, 0x7f, 0xee, 0x4d, 0x20, 0x8e, 0x69, 0x04, 0x6b, 0x2b, - 0x65, 0x42, 0x32, 0x35, 0x19, 0x3e, 0x20, 0xb0, 0x71, 0xf4, 0x22, 0x7c, - 0x4f, 0xd4, 0x9b, 0xfe, 0xce, 0x8b, 0x84, 0x3f, 0x42, 0xcb, 0xff, 0xa3, - 0xe9, 0x08, 0xde, 0x76, 0x3e, 0x15, 0x65, 0xfa, 0x5b, 0xbb, 0xa1, 0xd9, - 0x65, 0xbc, 0x67, 0xf2, 0xe9, 0x37, 0xdd, 0x28, 0x6a, 0xcb, 0xf6, 0xa3, - 0xe9, 0x71, 0x65, 0x6c, 0x99, 0x0c, 0xa1, 0x62, 0x64, 0xda, 0x21, 0xbc, - 0xd7, 0xea, 0xcb, 0x9f, 0x8b, 0x2f, 0xff, 0xc4, 0x27, 0x4c, 0x83, 0x2c, - 0xe7, 0xfd, 0xef, 0xcb, 0x2f, 0xfc, 0x1e, 0x4f, 0xe6, 0xbf, 0x69, 0xf1, - 0x65, 0xec, 0xd3, 0x0b, 0x2f, 0xfe, 0xdf, 0xbe, 0x38, 0xfe, 0xfa, 0x59, - 0xd5, 0x95, 0x89, 0x80, 0xfe, 0xb1, 0x3e, 0x86, 0x20, 0xed, 0xfe, 0xfc, - 0x3d, 0x28, 0xef, 0x16, 0x54, 0x93, 0xa9, 0x60, 0x73, 0xf8, 0xc5, 0xf8, - 0x85, 0x50, 0xaf, 0x37, 0x23, 0x9b, 0x78, 0xfb, 0x2f, 0x34, 0xf8, 0xb2, - 0xfd, 0x28, 0xde, 0xfe, 0x59, 0x5b, 0x1e, 0x2b, 0x8e, 0x5f, 0xfd, 0x9f, - 0x77, 0x86, 0x51, 0xfb, 0xb5, 0x65, 0xff, 0xfb, 0x3b, 0xe3, 0x9c, 0xc3, - 0xce, 0x2c, 0x15, 0xff, 0x59, 0x7f, 0xb8, 0xfe, 0x3e, 0x44, 0x96, 0x5f, - 0xf9, 0x97, 0x84, 0x58, 0x24, 0x17, 0xeb, 0x2f, 0xf6, 0x78, 0xf8, 0x61, - 0x92, 0xca, 0xd9, 0x34, 0x32, 0x44, 0xea, 0xd0, 0x4c, 0xb7, 0x50, 0x6f, - 0xbe, 0xe4, 0x7c, 0xb2, 0xff, 0xd2, 0xcf, 0xa5, 0xa8, 0xeb, 0xf5, 0x65, - 0xe6, 0xc4, 0x96, 0x5f, 0xb0, 0x7e, 0x08, 0xab, 0x2a, 0x72, 0x2a, 0x26, - 0x24, 0x73, 0xf2, 0x1c, 0xbf, 0xe0, 0x78, 0xc7, 0xe8, 0xef, 0x16, 0x5e, - 0x1b, 0xf5, 0x65, 0xff, 0xfe, 0x28, 0xfb, 0xbd, 0xc9, 0xa5, 0x9b, 0x7d, - 0x05, 0x1c, 0x59, 0x7f, 0xee, 0x41, 0x44, 0xbb, 0xec, 0x25, 0x95, 0xa4, - 0xcc, 0x5a, 0x7c, 0xe7, 0x3f, 0x8e, 0x71, 0x8a, 0xf1, 0xcf, 0xe2, 0xcb, - 0xfb, 0x05, 0xe1, 0xfd, 0xd5, 0x97, 0xf7, 0x0c, 0x78, 0x2f, 0x16, 0x5f, - 0xcf, 0xa7, 0x19, 0xe2, 0xcb, 0xb5, 0xfa, 0xcb, 0xb0, 0x55, 0x94, 0xe6, - 0xbf, 0xa3, 0x16, 0xfa, 0x11, 0xeb, 0xb0, 0xf7, 0xc5, 0xfe, 0x2e, 0xea, - 0xd5, 0xf0, 0xb9, 0xe7, 0x59, 0x7c, 0xc6, 0x8c, 0x55, 0x97, 0xed, 0x9f, - 0xd1, 0xb8, 0xb2, 0xfd, 0xb7, 0x67, 0xf3, 0xab, 0x2a, 0x7a, 0x3f, 0xbc, - 0x24, 0x09, 0x5d, 0xfc, 0xc7, 0xa3, 0xee, 0xe2, 0xcb, 0xfc, 0x58, 0x3f, - 0x40, 0xa4, 0xb2, 0xa0, 0xf8, 0x74, 0x5f, 0x50, 0xbc, 0xe1, 0x91, 0xb2, - 0x9c, 0xa2, 0x77, 0x8d, 0x03, 0xf5, 0x22, 0x84, 0xe8, 0x61, 0x29, 0x7c, - 0x53, 0x73, 0x16, 0x5f, 0xa5, 0x9b, 0x76, 0x16, 0x5f, 0xfc, 0x51, 0xb3, - 0x7c, 0x7a, 0xd3, 0xc9, 0x65, 0x2c, 0xa3, 0x44, 0xcc, 0xc4, 0x44, 0x51, - 0x3e, 0x89, 0x7f, 0xb6, 0xda, 0x0b, 0xec, 0xea, 0xcb, 0xf0, 0xf3, 0x08, - 0x0b, 0x2f, 0xdf, 0x74, 0x9f, 0xcb, 0x2e, 0x89, 0x96, 0x56, 0xc7, 0xcb, - 0x22, 0x6f, 0xca, 0x2b, 0x13, 0x0a, 0x33, 0xf0, 0xc2, 0x6a, 0xff, 0xed, - 0x10, 0x7e, 0xe9, 0x66, 0xce, 0x4b, 0x2f, 0xff, 0xe1, 0xf8, 0x3b, 0x1e, - 0x6b, 0x59, 0x1f, 0x48, 0xda, 0xb2, 0xff, 0x3c, 0xc4, 0x1e, 0x94, 0x2c, - 0xbf, 0xce, 0x31, 0x3b, 0xd3, 0x15, 0x65, 0xe7, 0xd6, 0xcb, 0x2e, 0xfe, - 0x16, 0x5f, 0x1c, 0x37, 0x16, 0x52, 0xcb, 0xf9, 0xd8, 0xec, 0x6b, 0xf5, - 0x94, 0x33, 0x74, 0x41, 0x77, 0xff, 0xfa, 0x0c, 0x65, 0x01, 0x07, 0x70, - 0x03, 0x80, 0x08, 0xd5, 0x97, 0x7f, 0x0b, 0x2e, 0x86, 0x16, 0x5f, 0xf6, - 0x77, 0x90, 0xd1, 0x32, 0x65, 0x97, 0xfb, 0x99, 0xe3, 0xe0, 0x76, 0x59, - 0x70, 0xa2, 0xa4, 0xbf, 0xe2, 0xcd, 0xef, 0x2e, 0x18, 0xd6, 0x50, 0x13, - 0xfc, 0x31, 0xdd, 0x0b, 0xb5, 0x6b, 0xc4, 0x1f, 0xb0, 0x32, 0xc5, 0xc8, - 0x5f, 0x87, 0x42, 0x9a, 0x08, 0x33, 0x78, 0x51, 0x45, 0x49, 0x66, 0xa4, - 0x66, 0x68, 0x2f, 0xa6, 0x77, 0xd2, 0x46, 0x68, 0xe1, 0x12, 0x17, 0xd5, - 0xb2, 0xe1, 0x68, 0x11, 0x3e, 0x5c, 0xf1, 0x93, 0xcb, 0x12, 0xbf, 0xbb, - 0x19, 0xec, 0xd9, 0x65, 0xd8, 0xd5, 0x95, 0xf1, 0xe1, 0xf0, 0xb6, 0xe3, - 0xe2, 0xca, 0x87, 0x7a, 0x5b, 0xb4, 0x24, 0x65, 0x28, 0x00, 0x69, 0x19, - 0x2f, 0xad, 0x89, 0x48, 0x1f, 0x4a, 0xd9, 0x39, 0xca, 0xed, 0x46, 0x88, - 0xd8, 0x6e, 0x7a, 0x91, 0xd8, 0xf4, 0xcc, 0x5f, 0xda, 0xca, 0x78, 0x87, - 0x93, 0xde, 0x1d, 0x94, 0x46, 0x19, 0xc6, 0x1d, 0xf0, 0x98, 0x9f, 0x23, - 0xb8, 0x4e, 0xac, 0xbf, 0xb3, 0xff, 0xcf, 0x52, 0x59, 0x70, 0x31, 0x65, - 0x0c, 0xf1, 0x5c, 0xbe, 0xff, 0xd0, 0xd9, 0xf7, 0xdb, 0x06, 0x62, 0xac, - 0xbb, 0x05, 0x59, 0x74, 0x75, 0x65, 0x6c, 0x6b, 0x40, 0x2f, 0x66, 0xac, - 0xa9, 0x22, 0x8b, 0x1b, 0xfa, 0x45, 0x7f, 0xa4, 0x65, 0x8d, 0x0f, 0x96, - 0x5f, 0xbc, 0xe6, 0x4e, 0xb2, 0xff, 0xd9, 0xde, 0x78, 0xda, 0xf9, 0xa5, - 0x95, 0x08, 0x94, 0x60, 0xc8, 0x89, 0x6f, 0xd9, 0x3b, 0x3f, 0xea, 0xcb, - 0xe9, 0xdd, 0x8d, 0xeb, 0x2f, 0xd8, 0x08, 0x69, 0xac, 0xbe, 0xc6, 0xe7, - 0x56, 0x5f, 0xde, 0x81, 0x0e, 0x36, 0x59, 0x7f, 0xc7, 0xbf, 0x59, 0x36, - 0x7d, 0xd5, 0x94, 0x03, 0xea, 0xf1, 0x75, 0xce, 0xc2, 0xca, 0xd1, 0xb9, - 0xe9, 0x15, 0xf3, 0xb5, 0xe6, 0x59, 0x7e, 0x38, 0x16, 0x26, 0x59, 0x7c, - 0xfd, 0xfb, 0x8b, 0x28, 0xcf, 0x2c, 0x8a, 0x2f, 0xff, 0xfc, 0xf3, 0x06, - 0x41, 0x04, 0xef, 0x1f, 0x7b, 0x1f, 0x46, 0xd1, 0xc5, 0x97, 0xe2, 0x7d, - 0xcd, 0xa6, 0x59, 0x7d, 0x37, 0x23, 0xab, 0x28, 0x08, 0xc0, 0x99, 0xc4, - 0x25, 0x96, 0x15, 0x65, 0xff, 0xfe, 0x27, 0x7d, 0xf1, 0x2f, 0x46, 0xb6, - 0x8e, 0xf1, 0xe4, 0xb2, 0xfe, 0x80, 0x77, 0x8f, 0xf2, 0xcb, 0xec, 0x6b, - 0xfc, 0xb2, 0xb7, 0x11, 0x62, 0x4c, 0x22, 0x17, 0x5e, 0x3f, 0xa6, 0x59, - 0x7c, 0x16, 0x5b, 0x4d, 0x65, 0xfb, 0x33, 0x60, 0xf1, 0x65, 0xf6, 0x88, - 0xff, 0x59, 0x7c, 0x60, 0x7d, 0x2c, 0xba, 0x3f, 0x59, 0x7c, 0x1d, 0x82, - 0xcf, 0xc6, 0xe0, 0x42, 0x1a, 0x34, 0x4b, 0xf9, 0x6a, 0xdf, 0xac, 0xbb, - 0x00, 0xb2, 0xfd, 0x9a, 0xd1, 0xe9, 0x65, 0x6e, 0x1e, 0x7f, 0x84, 0xbf, - 0x16, 0xbf, 0x3c, 0x7d, 0x80, 0x59, 0x7f, 0xde, 0x7e, 0x78, 0xf6, 0x72, - 0x59, 0x7c, 0xfb, 0x09, 0x25, 0x94, 0xc9, 0x64, 0x05, 0xcf, 0x6b, 0xb1, - 0x0c, 0x39, 0x43, 0x0c, 0x65, 0xf8, 0x54, 0xc1, 0x37, 0xc4, 0xc7, 0x0c, - 0x4d, 0xc2, 0x19, 0x9b, 0x75, 0x0e, 0x0f, 0x18, 0xbc, 0x30, 0xff, 0x33, - 0x65, 0x8f, 0x70, 0x9b, 0xb0, 0xbf, 0x0b, 0x88, 0xa6, 0x62, 0x13, 0xee, - 0x9c, 0x5f, 0xc4, 0x11, 0xb5, 0xe4, 0xb2, 0xf1, 0xec, 0x15, 0x97, 0xe8, - 0xfc, 0xfe, 0xc5, 0x97, 0x34, 0x2b, 0x2f, 0xcf, 0xdf, 0x04, 0x96, 0x5c, - 0xdd, 0xeb, 0x2c, 0x38, 0x3f, 0xf3, 0x28, 0xf0, 0xb9, 0x13, 0xdf, 0xfe, - 0x91, 0x44, 0xe6, 0x94, 0x31, 0xd3, 0xd9, 0x65, 0xf9, 0xdb, 0x9e, 0x6a, - 0xca, 0xf8, 0xfc, 0xfa, 0x99, 0x61, 0x56, 0x5e, 0xee, 0xa1, 0x65, 0xf6, - 0x6c, 0x24, 0x96, 0x5e, 0x10, 0xbf, 0x59, 0x44, 0x78, 0x5d, 0x24, 0xbf, - 0xbb, 0xbf, 0x0b, 0x06, 0xb2, 0xa6, 0x3c, 0xfe, 0x10, 0xdf, 0xd9, 0xcc, - 0x91, 0xe9, 0x65, 0xe0, 0xee, 0x6e, 0xac, 0xb6, 0xf5, 0x97, 0xfd, 0xaf, - 0x38, 0x8f, 0xe3, 0xfd, 0x65, 0x41, 0xe6, 0x98, 0x9d, 0xfc, 0x65, 0xb7, - 0x83, 0xc5, 0x95, 0xe3, 0xce, 0xe9, 0x05, 0xf6, 0xb6, 0x8e, 0xac, 0xbd, - 0xc9, 0x6c, 0xb2, 0xb6, 0x4c, 0x87, 0x21, 0x7c, 0xe4, 0x42, 0x11, 0xd4, - 0x2e, 0x08, 0x48, 0xb7, 0x21, 0x38, 0x70, 0xb2, 0x98, 0x8d, 0xa2, 0x4f, - 0x0a, 0xd2, 0x23, 0xec, 0x69, 0xb7, 0x9e, 0x70, 0x8b, 0x2f, 0x4c, 0x7e, - 0x59, 0x7f, 0x46, 0x9e, 0x63, 0xf2, 0xcb, 0xf7, 0x07, 0x05, 0xb3, 0x9e, - 0x57, 0x07, 0x6f, 0xec, 0xda, 0x3d, 0xe8, 0x59, 0x7e, 0xc9, 0xbd, 0x84, - 0xb2, 0xfe, 0x8c, 0x10, 0x83, 0xfa, 0xca, 0xd2, 0x20, 0xbc, 0x5a, 0x44, - 0xf7, 0x9b, 0x0d, 0x59, 0x5f, 0x26, 0x17, 0xa8, 0x60, 0x34, 0xbe, 0xff, - 0xf8, 0xa5, 0x3b, 0x06, 0x7c, 0xfb, 0xa1, 0x7e, 0x2c, 0xbf, 0x78, 0x25, - 0x1b, 0xd6, 0x5f, 0xc4, 0xfd, 0x94, 0x30, 0xb2, 0xa0, 0xf5, 0x84, 0x29, - 0xbf, 0xfd, 0xc8, 0xd0, 0x3b, 0xc3, 0xef, 0xb0, 0x6b, 0x2f, 0xb3, 0x3e, - 0x92, 0xcb, 0xdc, 0x39, 0x96, 0x59, 0x82, 0x37, 0xfc, 0x22, 0xbf, 0xed, - 0x1c, 0x77, 0x37, 0xb8, 0xd6, 0x5f, 0xfb, 0x62, 0x8f, 0x8c, 0x65, 0x1b, - 0x2c, 0xbf, 0xdf, 0xf3, 0xa5, 0x0d, 0xe2, 0xcb, 0xfc, 0xd8, 0xf3, 0xf2, - 0x37, 0x16, 0x54, 0x1f, 0x4b, 0x9a, 0x53, 0xa3, 0x20, 0xa1, 0x51, 0x40, - 0x4f, 0x5f, 0x50, 0x89, 0xf1, 0x39, 0x46, 0x03, 0x7e, 0x9d, 0xe8, 0xd4, - 0x96, 0x54, 0xe5, 0xcb, 0xe8, 0x8d, 0xd3, 0x0d, 0xc1, 0x0a, 0x87, 0x8f, - 0xe4, 0x54, 0x8b, 0xcd, 0xe4, 0x2c, 0xbf, 0xb6, 0x9a, 0x53, 0xde, 0xb6, - 0x59, 0x7c, 0xdc, 0x7f, 0x2c, 0xb6, 0xcb, 0x2f, 0xdd, 0xf1, 0xb7, 0x4b, - 0x2a, 0x46, 0xeb, 0x42, 0x57, 0xbc, 0x33, 0x59, 0x7e, 0xf6, 0x1c, 0xb8, - 0xb2, 0xff, 0xfb, 0xd0, 0x23, 0x3e, 0x93, 0xff, 0xce, 0x47, 0xe9, 0x2f, - 0xd9, 0xd7, 0x0b, 0x2d, 0x65, 0xfb, 0x40, 0x77, 0x02, 0xe2, 0x04, 0x5e, - 0xe4, 0x7c, 0xb2, 0xf8, 0xf9, 0xa9, 0x2c, 0xb7, 0xf8, 0x7e, 0x7f, 0x1a, - 0x34, 0x76, 0xf8, 0xb0, 0x5d, 0xd5, 0x97, 0x1e, 0xcb, 0x28, 0xcd, 0xe7, - 0x49, 0x6f, 0x04, 0x80, 0xb2, 0xfb, 0x62, 0x76, 0xac, 0xb9, 0xc9, 0x65, - 0x41, 0xb7, 0xd8, 0x8a, 0xa4, 0xa8, 0x7c, 0x64, 0xff, 0x2a, 0x6a, 0x13, - 0xcd, 0x72, 0xf1, 0x07, 0x54, 0xef, 0xe7, 0xd6, 0x6f, 0xc1, 0xac, 0xbf, - 0x01, 0xd8, 0xf1, 0xac, 0xaf, 0xcf, 0x58, 0x8b, 0xaf, 0x0d, 0xe4, 0xb2, - 0xd2, 0x59, 0x50, 0x6b, 0x77, 0x47, 0x2f, 0xbb, 0xb3, 0x92, 0xcb, 0xcd, - 0x80, 0x2c, 0xb9, 0xd8, 0x59, 0x58, 0x6c, 0xc8, 0x72, 0xd2, 0x59, 0x7f, - 0x66, 0xc1, 0xee, 0xfe, 0xac, 0xa8, 0x3c, 0x26, 0x04, 0x6f, 0xf9, 0xe5, - 0xa8, 0xd9, 0xf4, 0x05, 0x96, 0x35, 0x97, 0x98, 0x3e, 0xac, 0xbd, 0xc7, - 0xea, 0xca, 0x83, 0xc9, 0x60, 0x43, 0xe1, 0xdb, 0xa7, 0x79, 0x65, 0xfc, - 0xde, 0x98, 0xc3, 0x0b, 0x2f, 0x37, 0xa0, 0x59, 0x6e, 0xc1, 0xe5, 0x61, - 0x6d, 0xfd, 0x0d, 0xc6, 0x23, 0x8b, 0x2b, 0x65, 0x4c, 0x78, 0x46, 0x05, - 0x5d, 0x30, 0xb4, 0x8b, 0xd0, 0x82, 0xfc, 0xc0, 0x98, 0xfa, 0x4d, 0x7c, - 0xdc, 0xd6, 0x2c, 0xbf, 0xef, 0xfd, 0x9f, 0x4b, 0xa7, 0x32, 0xca, 0xc3, - 0xdd, 0x09, 0x0d, 0xd9, 0xb2, 0xcb, 0x05, 0x65, 0x0c, 0xd4, 0x68, 0x5e, - 0xff, 0x13, 0x8b, 0xce, 0x47, 0xeb, 0x2f, 0x43, 0xe9, 0x65, 0xff, 0x6b, - 0x47, 0xf4, 0xba, 0xff, 0x2c, 0xbd, 0x3e, 0xec, 0x2c, 0xbf, 0xe8, 0x6c, - 0xb3, 0x6c, 0x0b, 0x2d, 0x65, 0xff, 0x47, 0xe7, 0x2f, 0x19, 0x7e, 0xb2, - 0xdb, 0x2c, 0xb9, 0xfb, 0xa3, 0xcb, 0x65, 0x9c, 0xd6, 0x23, 0x64, 0xc8, - 0x1e, 0x11, 0x17, 0x85, 0x81, 0x16, 0x5e, 0x72, 0x1a, 0xea, 0xfa, 0x5f, - 0x48, 0x30, 0xc2, 0xcb, 0x7e, 0xb2, 0xb0, 0xda, 0xb9, 0x1d, 0x42, 0xa5, - 0x01, 0x90, 0xb0, 0x68, 0x63, 0x7a, 0x8c, 0x53, 0xc6, 0x5f, 0x8f, 0x75, - 0x76, 0xff, 0x77, 0xd9, 0x2f, 0x1e, 0xf5, 0x97, 0xcd, 0xd0, 0x76, 0x59, - 0x7f, 0xfc, 0x46, 0xc3, 0x3e, 0x77, 0xc1, 0x79, 0x4a, 0x16, 0x54, 0x1f, - 0xb6, 0x12, 0x5f, 0xbd, 0x9d, 0xe4, 0x2c, 0xbf, 0x17, 0x43, 0x9e, 0x59, - 0x74, 0xe0, 0xac, 0xa8, 0x3c, 0x0d, 0x89, 0xeb, 0x64, 0xf3, 0x64, 0xf2, - 0xc4, 0x2a, 0xc0, 0x41, 0xa6, 0x7b, 0xc3, 0x79, 0x2c, 0xb8, 0xf4, 0xb2, - 0xb0, 0xd9, 0x78, 0x72, 0xfc, 0xe4, 0x46, 0xd5, 0x97, 0xb3, 0x78, 0x8b, - 0x2e, 0x3f, 0x2c, 0xbc, 0x37, 0x92, 0xcb, 0xe7, 0x6e, 0x35, 0x65, 0xf1, - 0xb6, 0x37, 0x16, 0x5c, 0x7a, 0x9c, 0x78, 0xb8, 0x43, 0x43, 0x45, 0x2e, - 0x0b, 0x79, 0x86, 0xfc, 0x6d, 0x72, 0xc5, 0x97, 0x8e, 0x24, 0xb2, 0xa7, - 0x33, 0x70, 0x99, 0x03, 0x90, 0x6f, 0x25, 0xb1, 0x90, 0xe4, 0xa3, 0xb6, - 0x21, 0x84, 0x72, 0xac, 0xbd, 0x0e, 0x27, 0x9c, 0x66, 0xfe, 0x10, 0x84, - 0x41, 0xc2, 0x50, 0xc3, 0x12, 0x7c, 0xbf, 0x74, 0x96, 0xff, 0xee, 0xc1, - 0xf9, 0xf5, 0x0c, 0x64, 0xcb, 0x2f, 0xc3, 0x8f, 0x40, 0x8b, 0x29, 0xcf, - 0xb0, 0x28, 0x97, 0xf6, 0x7b, 0x00, 0x1c, 0x59, 0x76, 0x9a, 0xb2, 0xf8, - 0xfb, 0x12, 0x59, 0x7f, 0x82, 0xe7, 0x28, 0x20, 0x2c, 0xac, 0x3e, 0x9f, - 0x0b, 0xf0, 0x86, 0xff, 0xc7, 0xaf, 0x3f, 0x18, 0xd7, 0x40, 0xb2, 0xfc, - 0x7d, 0x8e, 0xf1, 0x25, 0xf0, 0x23, 0xbc, 0x49, 0x70, 0xa2, 0xa4, 0xa9, - 0x1f, 0x16, 0x13, 0x8a, 0x45, 0x49, 0x19, 0x9a, 0xfa, 0xf2, 0x3b, 0x85, - 0x86, 0x8d, 0xe7, 0x2f, 0xd6, 0x5e, 0x7f, 0x3a, 0xca, 0xc3, 0xe0, 0x60, - 0xa7, 0xc3, 0x97, 0xd3, 0x13, 0x8a, 0xb2, 0xf4, 0xde, 0x35, 0x97, 0xff, - 0xdd, 0x80, 0x66, 0x17, 0x7c, 0x70, 0x5b, 0x2c, 0xbf, 0xfc, 0x2b, 0xf3, - 0xa7, 0xe3, 0xc6, 0x0f, 0x4b, 0x29, 0x65, 0x62, 0x28, 0xbc, 0x9b, 0xc4, - 0xaa, 0x1a, 0xb7, 0x29, 0x88, 0x5b, 0x09, 0x5f, 0xe3, 0x7c, 0x22, 0xfe, - 0x11, 0x8b, 0x0b, 0xfb, 0xff, 0xc5, 0x1f, 0x7f, 0x85, 0x12, 0xd6, 0xa1, - 0x65, 0xff, 0xbb, 0xcc, 0x07, 0x9c, 0xbb, 0xc5, 0x97, 0x8c, 0xbf, 0x59, - 0x38, 0xdf, 0x53, 0x51, 0x6b, 0xbe, 0x10, 0xf7, 0xff, 0xa1, 0x86, 0x9e, - 0x37, 0xbc, 0x09, 0x75, 0x65, 0x41, 0xfa, 0x78, 0xaa, 0xfe, 0x8f, 0x47, - 0xa3, 0x65, 0x97, 0xbb, 0x03, 0x59, 0x7f, 0xf4, 0x8d, 0xfe, 0x97, 0x78, - 0x46, 0xc2, 0xca, 0x83, 0xe1, 0xc1, 0xca, 0xd9, 0x15, 0xd2, 0x84, 0x75, - 0xcf, 0xc5, 0x96, 0xf4, 0x1b, 0xf7, 0x29, 0xbf, 0x4b, 0xc1, 0x8d, 0x2c, - 0xbf, 0xd1, 0xbc, 0xf7, 0x90, 0x78, 0xb2, 0xfe, 0x3e, 0x3f, 0xd2, 0xc5, - 0x97, 0x3b, 0x74, 0x7c, 0x73, 0xe6, 0xd7, 0xf8, 0xe3, 0xa5, 0x0d, 0xe2, - 0xca, 0xf9, 0x1d, 0x9e, 0x84, 0x59, 0x18, 0x5f, 0xb0, 0x2d, 0x8e, 0x2c, - 0xa5, 0x97, 0x64, 0xda, 0x36, 0x5c, 0x27, 0xbf, 0xe3, 0x0b, 0x2f, 0xd0, - 0x21, 0x6c, 0xb2, 0xff, 0xa3, 0x68, 0xfb, 0xa5, 0x9b, 0x2c, 0xbd, 0xba, - 0x62, 0xac, 0xac, 0x46, 0x28, 0x0b, 0x4c, 0xfb, 0x74, 0xea, 0xff, 0xe1, - 0x38, 0x7c, 0x98, 0xc7, 0x85, 0xfa, 0xcb, 0xd2, 0x27, 0x59, 0x7c, 0xfd, - 0xcd, 0x96, 0x5d, 0x1f, 0x2c, 0xb8, 0xa1, 0x65, 0x9b, 0x07, 0xd3, 0xe1, - 0xb2, 0x22, 0xe8, 0xbd, 0xff, 0xf8, 0x2f, 0xb8, 0x21, 0x47, 0x9c, 0xfb, - 0x1d, 0xe2, 0xca, 0x1a, 0x68, 0xcf, 0x0a, 0xf2, 0x40, 0xbe, 0x01, 0xeb, - 0x16, 0x54, 0xca, 0xc1, 0x75, 0x19, 0x67, 0xa3, 0x84, 0x23, 0x4b, 0xec, - 0xf6, 0x6c, 0xb2, 0xf4, 0x9f, 0x4b, 0x2f, 0xef, 0xda, 0xf2, 0xc1, 0xac, - 0xb0, 0x56, 0x5f, 0xb9, 0xe8, 0x2e, 0xac, 0xb6, 0x70, 0xdc, 0x6f, 0x11, - 0xbe, 0xce, 0xe0, 0xd2, 0x5f, 0xf3, 0x93, 0x18, 0x4f, 0xde, 0x2c, 0xbe, - 0x76, 0x3f, 0x15, 0x65, 0x48, 0xff, 0x7c, 0x42, 0x46, 0xf7, 0xd0, 0x45, - 0x0b, 0x2a, 0x64, 0xdd, 0x34, 0x38, 0x4c, 0xdd, 0x85, 0x28, 0x85, 0xd7, - 0xf3, 0x8a, 0xfd, 0x76, 0x16, 0x5f, 0x7f, 0xc6, 0xe9, 0x65, 0x30, 0xa8, - 0xe4, 0xe3, 0x96, 0xd2, 0x8f, 0x4b, 0xaf, 0xff, 0xef, 0xa5, 0x9d, 0x64, - 0xcf, 0x78, 0x30, 0xf4, 0xfb, 0x1a, 0x59, 0x7f, 0x74, 0xf5, 0x01, 0x65, - 0xac, 0xbb, 0x4f, 0xe4, 0x4b, 0x08, 0xcb, 0x7f, 0xb3, 0xd9, 0x3b, 0xd9, - 0xb2, 0xca, 0x73, 0xe4, 0x22, 0xfb, 0xff, 0xba, 0x7b, 0x77, 0x81, 0xdc, - 0xeb, 0xf9, 0x65, 0xff, 0xf1, 0x67, 0x4f, 0x0b, 0xd9, 0xdf, 0x18, 0x16, - 0x5f, 0xf7, 0x4d, 0xbc, 0xf4, 0x08, 0x4b, 0x2f, 0xfa, 0x08, 0x0f, 0xd7, - 0xfb, 0xf9, 0xc8, 0x85, 0xf9, 0x32, 0xa4, 0x99, 0x17, 0xf0, 0xce, 0xbf, - 0x82, 0xcb, 0x3d, 0x6b, 0x16, 0x5f, 0xef, 0x63, 0x0f, 0x07, 0x3e, 0xb2, - 0xff, 0x67, 0x33, 0x73, 0xd0, 0x35, 0x97, 0x46, 0xcb, 0x2f, 0x7a, 0x26, - 0x59, 0x7f, 0xa0, 0xcb, 0x36, 0x12, 0x4b, 0x2d, 0xf0, 0xcf, 0x9f, 0x05, - 0xfc, 0x3b, 0x6e, 0x01, 0x30, 0x6f, 0x1a, 0x86, 0x13, 0x97, 0xdd, 0x63, - 0x3c, 0xb2, 0xed, 0x49, 0x65, 0xff, 0x8b, 0x3b, 0xd0, 0xed, 0xdc, 0x02, - 0xcb, 0xf0, 0xc2, 0xfa, 0x92, 0xcb, 0xc5, 0x82, 0xac, 0xbe, 0x6f, 0x04, - 0x6a, 0xca, 0x83, 0xc0, 0xc1, 0xcb, 0x71, 0x65, 0x85, 0x59, 0x71, 0xfe, - 0xb2, 0xf8, 0x57, 0x29, 0x2c, 0xbb, 0xc6, 0xb2, 0xdc, 0x9c, 0x79, 0xe3, - 0x17, 0x98, 0x8a, 0x8d, 0x13, 0x21, 0x61, 0xa7, 0x46, 0x67, 0xf0, 0xaa, - 0xbb, 0xf8, 0x59, 0x77, 0xf0, 0xb2, 0xfc, 0x19, 0x61, 0x33, 0x33, 0x5d, - 0xf8, 0xbd, 0x42, 0xa6, 0x21, 0x91, 0xb0, 0x2e, 0x67, 0xfa, 0x68, 0xfe, - 0x1d, 0x84, 0xad, 0x7f, 0xf8, 0x9f, 0xee, 0x30, 0xc3, 0xce, 0x03, 0x7f, - 0x59, 0x7d, 0x1a, 0x8f, 0x2c, 0xac, 0x3f, 0x17, 0x50, 0xbf, 0xec, 0x3f, - 0xbb, 0xa8, 0xcf, 0x96, 0x5f, 0xfd, 0xdf, 0x63, 0x44, 0x8f, 0xf3, 0xee, - 0xac, 0xbf, 0xdf, 0x00, 0xf4, 0x24, 0x0d, 0x65, 0xf7, 0xed, 0x79, 0x4e, - 0x46, 0xa9, 0x10, 0x70, 0xe7, 0xa8, 0xf7, 0x07, 0xab, 0x2f, 0xef, 0xda, - 0x27, 0x04, 0xd9, 0x65, 0xfd, 0xc3, 0x22, 0x8f, 0x96, 0x5d, 0x9f, 0x2c, - 0xaf, 0x8f, 0xdb, 0xa6, 0x73, 0xe5, 0x97, 0xff, 0x84, 0x81, 0x62, 0x69, - 0x39, 0x67, 0xdd, 0x59, 0x7d, 0xfe, 0x8f, 0x4b, 0x2a, 0x13, 0x85, 0x92, - 0xb3, 0xc2, 0x37, 0x86, 0x62, 0xa6, 0x5f, 0xdc, 0xe4, 0x4a, 0x34, 0xb2, - 0xff, 0xb5, 0x0d, 0x39, 0xa1, 0xf7, 0x16, 0x56, 0x1f, 0x40, 0x0b, 0x6f, - 0x07, 0xee, 0xac, 0xb3, 0xac, 0xba, 0x6e, 0x2c, 0xa2, 0x3e, 0x7e, 0x10, - 0xf4, 0x78, 0x41, 0x0b, 0xb0, 0x55, 0x97, 0xfd, 0x1f, 0x67, 0xf1, 0xbf, - 0x36, 0x59, 0x7f, 0x16, 0x77, 0x8f, 0xfa, 0xca, 0xd2, 0x20, 0x3f, 0x17, - 0xe1, 0xe5, 0xfe, 0x2d, 0x8f, 0x5f, 0x7b, 0x65, 0x97, 0xfd, 0x1b, 0x73, - 0x58, 0x08, 0xd9, 0x65, 0xfe, 0xc2, 0xdb, 0x06, 0xfe, 0x59, 0x53, 0x1f, - 0x60, 0xa7, 0x57, 0xf6, 0x37, 0x06, 0x62, 0xac, 0xb9, 0xb0, 0xb2, 0x9a, - 0x78, 0x6e, 0x5b, 0x7f, 0x16, 0x4d, 0xe3, 0xea, 0xcb, 0xec, 0xcf, 0x71, - 0x65, 0x42, 0x6f, 0x19, 0x0a, 0x27, 0x67, 0xe9, 0x0e, 0xe9, 0x6d, 0xe1, - 0x45, 0x15, 0x25, 0xfb, 0x18, 0x20, 0xf1, 0x23, 0x33, 0x41, 0x7c, 0xcc, - 0x51, 0x45, 0x59, 0x76, 0x7e, 0xb2, 0xb0, 0xdf, 0xf4, 0xa2, 0xa1, 0x13, - 0x3d, 0x79, 0xbf, 0xfe, 0x39, 0x3f, 0x1a, 0xd7, 0x93, 0xb1, 0xe3, 0x59, - 0x7c, 0x7a, 0xff, 0x8b, 0x2f, 0xfc, 0x16, 0x5e, 0x4f, 0x96, 0x0a, 0xff, - 0xac, 0xbf, 0xfb, 0x68, 0xfe, 0x25, 0x1a, 0xd6, 0x0a, 0xb2, 0xa1, 0x11, - 0x86, 0x8d, 0x7f, 0xdc, 0xd4, 0x07, 0xa4, 0x7b, 0xd6, 0x5f, 0xf8, 0xb3, - 0x80, 0xf1, 0x82, 0x09, 0x65, 0xff, 0xfe, 0x60, 0x57, 0xd3, 0x0c, 0xf9, - 0x92, 0x20, 0xbf, 0x30, 0x96, 0x54, 0x23, 0x6b, 0x0e, 0x8c, 0xf2, 0xfe, - 0xd0, 0x41, 0xe3, 0xe2, 0xcb, 0xe1, 0x5c, 0xa4, 0xb2, 0xff, 0xbb, 0x1f, - 0x7e, 0xfe, 0xf1, 0xac, 0xb7, 0x96, 0x56, 0x1e, 0x58, 0x0e, 0xaf, 0xb8, - 0x6d, 0x85, 0x97, 0xe2, 0xce, 0xc6, 0x96, 0x5e, 0x14, 0x51, 0x52, 0x5f, - 0x9d, 0x8f, 0x1f, 0x52, 0x33, 0x34, 0x15, 0x08, 0x80, 0x34, 0x6b, 0xe6, - 0xf2, 0x3a, 0xb2, 0xf6, 0xf8, 0x6a, 0xcb, 0xdd, 0x31, 0x56, 0x5e, 0xe3, - 0xe9, 0x65, 0x7c, 0x6e, 0x7a, 0x3b, 0x7b, 0xd0, 0x35, 0x95, 0x08, 0xb7, - 0xc2, 0x23, 0x57, 0x72, 0x2b, 0xef, 0xf3, 0x26, 0x59, 0x7d, 0xcc, 0x2e, - 0xac, 0xac, 0x3c, 0x47, 0x23, 0xb7, 0x27, 0x2a, 0x37, 0xf8, 0x87, 0x50, - 0xa1, 0xf4, 0x36, 0x09, 0xf6, 0xf4, 0xfe, 0x7c, 0xb2, 0xd2, 0x1a, 0xb2, - 0x2c, 0x95, 0x48, 0x6b, 0xd5, 0x3d, 0xab, 0x8d, 0x0c, 0xb5, 0x0b, 0xfa, - 0x1b, 0x1e, 0x8f, 0xd6, 0x5e, 0x8d, 0x82, 0xb2, 0xcc, 0xbc, 0x3c, 0xaf, - 0x16, 0xdf, 0xfc, 0x7d, 0x8d, 0x61, 0x75, 0xdc, 0x96, 0x54, 0xcb, 0xc9, - 0x5a, 0x85, 0x7f, 0xa1, 0xf6, 0x52, 0xee, 0x82, 0xf7, 0xbc, 0xae, 0xff, - 0xe8, 0xc2, 0xc1, 0xbc, 0x8a, 0x36, 0x59, 0x7c, 0x0d, 0x44, 0x96, 0x5d, - 0xbe, 0x16, 0x5f, 0xf8, 0xf4, 0x0f, 0x18, 0x3c, 0x64, 0xb2, 0xff, 0xff, - 0xf3, 0x97, 0xfd, 0xf6, 0x37, 0xbc, 0xcd, 0xfe, 0x30, 0x78, 0xc4, 0x0e, - 0xcb, 0x2b, 0x64, 0x5c, 0xfe, 0x7b, 0x50, 0x8f, 0x6c, 0x86, 0x8d, 0x63, - 0x22, 0x14, 0xe7, 0xa6, 0x74, 0xda, 0xe8, 0x25, 0x18, 0xc5, 0xe2, 0x8d, - 0xeb, 0x2f, 0xfe, 0xd4, 0x03, 0xc4, 0xfd, 0x28, 0x15, 0x65, 0xcc, 0xb3, - 0x59, 0x71, 0xf9, 0x65, 0x6c, 0x6c, 0x34, 0x35, 0x50, 0x89, 0x57, 0x73, - 0xbd, 0x33, 0xec, 0xb2, 0xf7, 0x03, 0xb8, 0xb2, 0xb0, 0xdf, 0x74, 0x7a, - 0xff, 0x41, 0x48, 0x8e, 0x3e, 0x59, 0x50, 0xe8, 0x7a, 0xe5, 0x1d, 0x08, - 0xe3, 0x0e, 0xc9, 0xc1, 0x66, 0x25, 0x42, 0x02, 0x33, 0xff, 0xa3, 0x42, - 0x32, 0xa9, 0xa3, 0x37, 0xd4, 0xa9, 0xef, 0x4b, 0x35, 0x78, 0xc7, 0xbf, - 0x85, 0xe1, 0x47, 0x53, 0xc8, 0xc2, 0x7b, 0x48, 0xa7, 0xde, 0xb1, 0x3f, - 0x0b, 0x21, 0x17, 0xf7, 0x48, 0x2f, 0xc7, 0x34, 0x8c, 0x96, 0x5d, 0x3d, - 0x1a, 0xcb, 0xfe, 0x9b, 0xbb, 0xbc, 0x89, 0x83, 0xa5, 0x97, 0xf8, 0x70, - 0x4d, 0x81, 0xc2, 0xca, 0x83, 0xf0, 0x73, 0xfb, 0xfe, 0xf4, 0x6d, 0xa8, - 0x93, 0xe9, 0x65, 0xf8, 0x98, 0x12, 0x3f, 0x59, 0x7f, 0xe2, 0x7f, 0xbb, - 0xe8, 0x06, 0x4c, 0xb2, 0xf0, 0x8e, 0x4b, 0x2b, 0x11, 0x0a, 0x45, 0x5b, - 0xa7, 0xf7, 0xf6, 0xd0, 0x46, 0xdc, 0x59, 0x7f, 0xe3, 0xf4, 0x0f, 0xc1, - 0x8f, 0xb8, 0xb2, 0xf1, 0x16, 0x2c, 0xac, 0x3d, 0x97, 0x3f, 0xbc, 0x36, - 0x3f, 0x59, 0x7e, 0x6e, 0xb4, 0xfd, 0x59, 0x7f, 0xe6, 0x8e, 0x0b, 0x37, - 0x96, 0x71, 0x65, 0x4e, 0x44, 0x2c, 0x0f, 0x99, 0x45, 0xff, 0xd3, 0x38, - 0x3d, 0x12, 0xe9, 0x63, 0x56, 0x5f, 0xda, 0xc2, 0x27, 0xd9, 0x65, 0x00, - 0xfc, 0x0d, 0x12, 0xff, 0xe8, 0x17, 0xe9, 0x72, 0x76, 0x7b, 0x09, 0x65, - 0xff, 0xe6, 0xfd, 0x2e, 0x4e, 0xc2, 0x2c, 0x3f, 0xd6, 0x5f, 0xcf, 0xa0, - 0xc7, 0xd2, 0x59, 0x46, 0x7f, 0x4e, 0x99, 0x7f, 0x35, 0xf0, 0x67, 0xbd, - 0x65, 0xe3, 0xf0, 0x56, 0x5f, 0xc6, 0x2e, 0x02, 0x3f, 0x59, 0x53, 0x97, - 0x41, 0x59, 0x04, 0xf2, 0x84, 0x58, 0xc8, 0x32, 0x17, 0xc6, 0x63, 0xa8, - 0x42, 0xfa, 0x14, 0xaf, 0x0a, 0x02, 0x21, 0xec, 0x30, 0x42, 0x41, 0xbc, - 0xbb, 0x74, 0x72, 0xcc, 0xd9, 0x12, 0xc0, 0x43, 0xe7, 0xa8, 0x7b, 0xb2, - 0x63, 0x8a, 0x9e, 0x63, 0xfd, 0x9e, 0xe1, 0xee, 0xca, 0xf1, 0xe8, 0xcf, - 0x18, 0xe3, 0xd9, 0x54, 0x35, 0x59, 0x48, 0x4f, 0x4f, 0x08, 0x45, 0x45, - 0xa0, 0x41, 0xda, 0x91, 0xd9, 0x2a, 0xc2, 0x90, 0x75, 0xba, 0x76, 0x5f, - 0x24, 0xc3, 0x13, 0xc4, 0x00, 0xae, 0x46, 0xfe, 0xac, 0x9c, 0x0e, 0xb4, - 0xdd, 0xdc, 0x94, 0xd9, 0x35, 0x78, 0xcd, 0xaa, 0xf1, 0x91, 0xb5, 0x92, - 0x87, 0xad, 0x8e, 0x53, 0xdb, 0x0c, 0x8f, 0xeb, 0x37, 0xc6, 0x5c, 0x6e, - 0x85, 0x6c, 0x53, 0xf9, 0x7e, 0x27, 0xfd, 0xbc, 0x1b, 0xe0, 0xd2, 0x5f, - 0xf7, 0xce, 0xb7, 0x0b, 0x3a, 0xa1, 0x3f, 0x4e, 0x2d, 0x12, 0xd3, 0x6c, - 0xee, 0xcf, 0x40, 0x53, 0x39, 0x60, 0xa9, 0x12, 0xd6, 0x03, 0xcb, 0x79, - 0xb9, 0xd5, 0x97, 0xf9, 0xdb, 0x1d, 0x3e, 0x1a, 0xcb, 0xf6, 0x68, 0x4e, - 0xf1, 0x65, 0x99, 0xfe, 0x7e, 0xc4, 0x39, 0xc3, 0x1b, 0xfc, 0xcf, 0x34, - 0x07, 0x70, 0x2a, 0x2e, 0x35, 0xfe, 0x67, 0x9a, 0x03, 0xb8, 0x15, 0x17, - 0x5a, 0xff, 0xe6, 0x6f, 0x26, 0x79, 0xa0, 0x3b, 0x81, 0x51, 0x28, 0xaa, - 0x25, 0x87, 0x25, 0xca, 0x15, 0xc3, 0x2a, 0x62, 0x18, 0xa0, 0x29, 0x39, - 0xc2, 0xdd, 0xc8, 0x7a, 0xbe, 0xb0, 0x5a, 0x2f, 0xe1, 0x69, 0xc3, 0x7e, - 0xa0, 0xee, 0xa0, 0xdf, 0xfe, 0x66, 0xd7, 0x93, 0x3c, 0xd0, 0x1d, 0xc0, - 0xa8, 0x96, 0x97, 0xfd, 0x3c, 0x3c, 0x7b, 0x8f, 0x1f, 0x6e, 0xac, 0xbf, - 0xff, 0xf8, 0x5d, 0xde, 0xcf, 0x63, 0x6c, 0xf6, 0x46, 0xca, 0xba, 0xcb, - 0xd4, 0xf3, 0x3a, 0x77, 0xa7, 0xd6, 0x5e, 0x77, 0x02, 0xa2, 0x37, 0x5f, - 0xbe, 0x98, 0xa0, 0x6b, 0x2d, 0xa0, 0x1e, 0x8b, 0x94, 0x5f, 0xed, 0x1b, - 0x2c, 0x1e, 0x81, 0x56, 0x5e, 0x0c, 0xf8, 0xab, 0x2f, 0xb4, 0x18, 0xfd, - 0x65, 0x19, 0xfe, 0x4c, 0x70, 0x21, 0x0d, 0xff, 0xff, 0xf6, 0xf2, 0xce, - 0x70, 0x71, 0x9a, 0x03, 0xb8, 0x19, 0xc8, 0xfb, 0x1d, 0xe2, 0xa3, 0x0f, - 0x5b, 0xd0, 0x8b, 0xc3, 0x30, 0xbf, 0xb8, 0xcc, 0x5e, 0x6e, 0x08, 0xb2, - 0xfd, 0xba, 0xcf, 0x4c, 0xb1, 0x56, 0x5f, 0x0c, 0xb3, 0xf5, 0x97, 0xd0, - 0x2b, 0x46, 0xb2, 0xb0, 0xf1, 0x74, 0x45, 0x7f, 0xe7, 0x93, 0x3c, 0xd0, - 0x1d, 0xc0, 0xa8, 0x97, 0xd6, 0xc5, 0x97, 0xbc, 0xfd, 0x59, 0x6e, 0xf0, - 0xd6, 0x08, 0x21, 0x7f, 0x08, 0x7f, 0x6e, 0xe8, 0x55, 0x95, 0x07, 0xb8, - 0x65, 0x17, 0xf4, 0x1e, 0xe6, 0x7d, 0x25, 0x97, 0xed, 0x31, 0xe0, 0xf1, - 0x65, 0x78, 0xf6, 0x84, 0x30, 0xbd, 0x1a, 0x85, 0x95, 0x86, 0xf8, 0xc8, - 0xef, 0x49, 0xfc, 0xb2, 0xf7, 0xf0, 0x2a, 0xcb, 0xfd, 0x87, 0xa9, 0x78, - 0xc5, 0x59, 0x5b, 0x87, 0xa3, 0xe1, 0xeb, 0xe0, 0xf8, 0xf4, 0xb2, 0xfb, - 0x9e, 0x8f, 0x2c, 0xbf, 0xd1, 0xb4, 0x16, 0xd9, 0xba, 0xb2, 0xee, 0x69, - 0x65, 0x41, 0xf7, 0xec, 0x45, 0x31, 0xb5, 0x99, 0xb2, 0xa5, 0xe8, 0x28, - 0x45, 0xc8, 0x75, 0x02, 0x35, 0xff, 0x89, 0xf7, 0x0d, 0xb4, 0xf0, 0xd2, - 0x1f, 0x43, 0x50, 0xa1, 0x71, 0xc1, 0xfe, 0xb6, 0xcf, 0x92, 0x89, 0x09, - 0x1b, 0xff, 0xf1, 0x40, 0x19, 0xf7, 0xe0, 0x1f, 0x0b, 0x37, 0xba, 0xcb, - 0xff, 0xa5, 0xd3, 0x99, 0x98, 0xcf, 0x7c, 0x0d, 0x65, 0xf8, 0x56, 0x66, - 0xc6, 0xcb, 0x2f, 0xf3, 0x3f, 0xdf, 0xef, 0xcf, 0xe5, 0x94, 0x34, 0xc1, - 0xfe, 0x58, 0x34, 0x92, 0x2d, 0xbf, 0xcc, 0xf3, 0x40, 0x77, 0x02, 0xa2, - 0xab, 0x5d, 0x3e, 0xc8, 0x59, 0x71, 0xee, 0xac, 0xbb, 0x34, 0xb2, 0xf6, - 0x7d, 0xd5, 0x97, 0xc6, 0xd7, 0xde, 0xb2, 0x98, 0x3e, 0xf7, 0x19, 0xfc, - 0x5b, 0xa3, 0xb7, 0x8b, 0x74, 0x55, 0x97, 0xf7, 0xa3, 0x78, 0x47, 0x8b, - 0x2f, 0xe7, 0xf4, 0xc5, 0x03, 0x59, 0x7f, 0xfd, 0xdf, 0xda, 0x11, 0xe6, - 0x77, 0xf6, 0x87, 0xe5, 0x97, 0xff, 0x77, 0xd1, 0xc2, 0x70, 0xb2, 0xcf, - 0x4b, 0x2f, 0x44, 0xb1, 0x65, 0xfc, 0x61, 0x01, 0x44, 0xcb, 0x2a, 0x49, - 0x9f, 0x8c, 0xbf, 0x0b, 0x7e, 0x54, 0x99, 0x1f, 0xc3, 0x77, 0xfc, 0xc6, - 0x16, 0x7d, 0xd7, 0x6a, 0xcb, 0xdb, 0xb1, 0xd5, 0x97, 0xf4, 0x34, 0x48, - 0x20, 0x2c, 0xba, 0x34, 0xb2, 0xb4, 0x78, 0x7c, 0x2d, 0xb9, 0xfe, 0x59, - 0x78, 0x48, 0xfd, 0x65, 0x7c, 0x6d, 0x7a, 0x2f, 0x7f, 0x63, 0x66, 0x77, - 0xd9, 0x65, 0xee, 0xbf, 0xcb, 0x2f, 0xff, 0xa5, 0xe7, 0x93, 0x0f, 0xcc, - 0x0f, 0x38, 0x6b, 0x29, 0x65, 0x61, 0xed, 0xee, 0xa8, 0x51, 0xa3, 0x29, - 0xcb, 0x89, 0xe2, 0xe1, 0x9a, 0xcb, 0xf6, 0x80, 0xee, 0x05, 0x44, 0x80, - 0xbe, 0xd6, 0x17, 0x56, 0x56, 0x1e, 0xae, 0x8d, 0x2a, 0x72, 0x23, 0x19, - 0xb5, 0xdf, 0xb8, 0xe4, 0xff, 0x2c, 0xbb, 0x09, 0x65, 0xc1, 0x85, 0x95, - 0x23, 0xf9, 0xf8, 0x9f, 0x70, 0x9f, 0x42, 0xb7, 0xf4, 0x6b, 0x68, 0xd6, - 0xcb, 0x2f, 0x8d, 0xb1, 0xc5, 0x95, 0x23, 0xd0, 0x60, 0xbe, 0xff, 0x6b, - 0x66, 0xc1, 0x4b, 0x8b, 0x2a, 0x0f, 0x5f, 0x08, 0xef, 0xff, 0x78, 0xe1, - 0xae, 0x31, 0x37, 0x60, 0xa4, 0xb2, 0xf6, 0xce, 0x35, 0x97, 0xf8, 0x07, - 0x82, 0x84, 0xba, 0xb2, 0xb0, 0xf4, 0x3e, 0x1d, 0xbf, 0x84, 0x9e, 0xf4, - 0x70, 0xd5, 0x97, 0x72, 0x4b, 0x29, 0xcf, 0x2b, 0x86, 0x77, 0x32, 0x7c, - 0xb2, 0xff, 0xe9, 0xbc, 0xed, 0xef, 0xa3, 0xa1, 0x6a, 0xcb, 0xff, 0xb0, - 0x71, 0x28, 0xc1, 0xc1, 0x75, 0x65, 0x62, 0x21, 0xda, 0x8d, 0x7b, 0x76, - 0x3a, 0xb2, 0xa1, 0x91, 0x4b, 0xb4, 0x23, 0x46, 0x7b, 0x91, 0xaf, 0xb0, - 0xb3, 0xb8, 0x73, 0x33, 0x13, 0x55, 0xfd, 0x0e, 0xc7, 0x8c, 0xc8, 0xa1, - 0xcf, 0xc2, 0x0e, 0xc2, 0x70, 0x2d, 0x93, 0xe4, 0x22, 0x42, 0x8b, 0x74, - 0x8a, 0xff, 0xd2, 0x8c, 0xff, 0xd9, 0x84, 0x05, 0x97, 0xe8, 0x22, 0xce, - 0xac, 0xbe, 0xd6, 0x8c, 0x0b, 0x2f, 0x8b, 0x36, 0x67, 0x88, 0x84, 0x9f, - 0x3d, 0x10, 0x96, 0xff, 0x33, 0xf3, 0xb7, 0x20, 0x6b, 0x29, 0x9a, 0xa1, - 0xcd, 0x47, 0x39, 0x3e, 0x99, 0x7f, 0x99, 0xe6, 0x80, 0xee, 0x05, 0x45, - 0x90, 0xbf, 0xff, 0xde, 0x7d, 0x33, 0xf3, 0xf4, 0x83, 0xb7, 0x31, 0xb1, - 0xb8, 0xb2, 0xfe, 0x3d, 0xec, 0xf9, 0x1f, 0x2c, 0xbf, 0xff, 0xf4, 0x48, - 0x23, 0xc6, 0x62, 0x67, 0x88, 0x2f, 0xb9, 0x8c, 0x47, 0x16, 0x57, 0x11, - 0x47, 0xd3, 0x2a, 0x1a, 0x65, 0x87, 0x18, 0x4d, 0xfe, 0x67, 0x9a, 0x03, - 0xb8, 0x15, 0x16, 0xba, 0xff, 0xf6, 0x09, 0x1b, 0x33, 0xc9, 0xba, 0x38, - 0x25, 0x97, 0xf9, 0x9e, 0x68, 0x0e, 0xe0, 0x54, 0x5c, 0x8b, 0xf6, 0x80, - 0xee, 0x05, 0x45, 0xd8, 0xbf, 0xf3, 0xc9, 0x9e, 0x68, 0x0e, 0xe0, 0x54, - 0x51, 0xcb, 0x33, 0xc4, 0x40, 0x34, 0xd2, 0xf8, 0xa2, 0x4d, 0x59, 0x7e, - 0x91, 0x97, 0xe6, 0xb2, 0xff, 0xd3, 0xdb, 0x25, 0xb1, 0xa9, 0x61, 0xef, - 0x59, 0x69, 0x2c, 0xbf, 0x68, 0x0e, 0xe0, 0x54, 0x52, 0xab, 0xfe, 0x07, - 0x8e, 0x6f, 0x46, 0xd8, 0xb2, 0xff, 0xf7, 0xa3, 0x68, 0xf1, 0xef, 0x71, - 0xf8, 0xd6, 0x33, 0x37, 0x57, 0x49, 0x9e, 0x23, 0x2e, 0x66, 0xea, 0xf9, - 0x30, 0xd7, 0x86, 0xe5, 0xff, 0x9c, 0xfb, 0x20, 0x8d, 0xcb, 0xf5, 0x97, - 0x78, 0x2b, 0x2c, 0xcc, 0x6a, 0x87, 0x30, 0x87, 0xe2, 0x76, 0xc6, 0xad, - 0xe2, 0x9e, 0x1f, 0x5f, 0xff, 0xfc, 0xfd, 0xcf, 0xe2, 0x4c, 0xc4, 0x6e, - 0x0e, 0x25, 0x03, 0x77, 0x61, 0x65, 0x6c, 0xdd, 0x2a, 0x4a, 0x7b, 0x73, - 0x23, 0xf6, 0xf8, 0xf4, 0xe9, 0x60, 0x4d, 0x3d, 0x78, 0xdb, 0x7f, 0x29, - 0x24, 0x1e, 0x26, 0xf6, 0x18, 0x3b, 0xe5, 0x23, 0x0a, 0xcf, 0x7f, 0xd2, - 0x67, 0x9a, 0x03, 0xb8, 0x15, 0x11, 0xc2, 0xff, 0x8d, 0x9e, 0x68, 0x0e, - 0xe0, 0x54, 0x56, 0xab, 0x33, 0x74, 0x46, 0xf5, 0x1e, 0xff, 0xf3, 0x36, - 0xbc, 0x99, 0xe6, 0x80, 0xee, 0x05, 0x44, 0xb6, 0xb0, 0x16, 0x5e, 0x0e, - 0xbf, 0x59, 0x76, 0x7c, 0xb2, 0xfc, 0xd6, 0xc1, 0xf1, 0x65, 0xfd, 0x1a, - 0xfd, 0xfe, 0xe2, 0xcb, 0x0f, 0x0f, 0x5b, 0xc4, 0xf7, 0xee, 0xc7, 0x84, - 0xe2, 0xcb, 0xdb, 0xc3, 0x25, 0x94, 0xc9, 0x4c, 0x2c, 0x02, 0x3f, 0x0f, - 0x1b, 0x69, 0x13, 0xef, 0x29, 0xbd, 0xe1, 0xc9, 0x65, 0xf8, 0xf7, 0x47, - 0x1f, 0x2c, 0xbf, 0xec, 0xf8, 0xb3, 0xff, 0xde, 0x4b, 0x2e, 0x68, 0x16, - 0x5f, 0xc7, 0xf7, 0x07, 0x84, 0xb2, 0xfe, 0xfb, 0x25, 0x1a, 0xfd, 0x65, - 0x61, 0xee, 0x39, 0x6d, 0xff, 0xf4, 0x16, 0xdc, 0x0b, 0x9c, 0xb9, 0xe7, - 0x92, 0xca, 0x84, 0xc7, 0x24, 0x75, 0xa7, 0x3f, 0x10, 0x5f, 0x14, 0x7d, - 0x25, 0x97, 0xfe, 0x32, 0xef, 0x06, 0x17, 0xd4, 0x96, 0x5f, 0xdb, 0x40, - 0x1f, 0x5f, 0xac, 0xbf, 0xff, 0x3f, 0xdf, 0x8f, 0xcf, 0x2c, 0xe1, 0x05, - 0xc4, 0x59, 0x7d, 0xfe, 0x6a, 0x65, 0x97, 0xe3, 0xf4, 0x09, 0x32, 0xcb, - 0xdd, 0x86, 0xac, 0xa0, 0x26, 0x9f, 0x31, 0x16, 0x8f, 0xbc, 0x5f, 0xfa, - 0xbf, 0x49, 0x37, 0x4a, 0x6f, 0xfe, 0x62, 0x0b, 0xb9, 0xa3, 0xd9, 0xda, - 0xb2, 0xf9, 0xe4, 0xc1, 0xac, 0xb3, 0x0b, 0x3c, 0x68, 0xaf, 0xe3, 0xd1, - 0x1f, 0x78, 0xb2, 0xfd, 0xa7, 0x2c, 0x85, 0x94, 0xa8, 0x86, 0xc6, 0x7e, - 0x7e, 0x22, 0x72, 0xcb, 0xa0, 0x96, 0x5e, 0xc3, 0x1a, 0xcb, 0xc3, 0xc6, - 0xac, 0xb8, 0xc8, 0x66, 0xdc, 0xc6, 0xea, 0x0f, 0xda, 0x49, 0x97, 0xf0, - 0x3c, 0x7a, 0x81, 0xac, 0xbe, 0xc9, 0xa5, 0x8b, 0x2f, 0xfc, 0xf2, 0x67, - 0x9a, 0x03, 0xb8, 0x15, 0x13, 0x02, 0xfc, 0x17, 0xe9, 0xf5, 0x65, 0xfe, - 0xd9, 0xfb, 0xf8, 0x85, 0x25, 0x96, 0x85, 0x97, 0x6c, 0x6b, 0x2b, 0x0d, - 0x39, 0x08, 0x5d, 0xc8, 0x59, 0x50, 0x8b, 0x93, 0x27, 0x75, 0xd0, 0x8f, - 0xde, 0x14, 0xff, 0x59, 0x7d, 0xc7, 0x2f, 0xd6, 0x54, 0xc7, 0x81, 0xf8, - 0xf5, 0xfe, 0x0f, 0xda, 0x38, 0x6e, 0x2c, 0xbf, 0x78, 0xe0, 0xb6, 0x59, - 0x7f, 0xd1, 0xb7, 0x4a, 0x03, 0xde, 0x2c, 0xaf, 0x22, 0x4f, 0x86, 0x73, - 0xe4, 0xf7, 0xc5, 0x9c, 0x85, 0x95, 0xd3, 0xd3, 0xde, 0x67, 0x7a, 0x47, - 0xfa, 0xcb, 0xf1, 0x16, 0x74, 0xd6, 0x5f, 0x7c, 0x03, 0x61, 0x65, 0xf9, - 0xd8, 0xcf, 0x3a, 0xca, 0xc4, 0x58, 0xcc, 0x48, 0xe3, 0xbd, 0x25, 0x09, - 0x25, 0xff, 0xe9, 0x7b, 0x08, 0x51, 0x35, 0xe3, 0x86, 0xac, 0xbf, 0x8f, - 0xb8, 0xd8, 0xf2, 0xcb, 0xfe, 0x3f, 0xf6, 0xf4, 0x70, 0x3c, 0x59, 0x7f, - 0xa4, 0xfd, 0xe1, 0x94, 0x2c, 0xb4, 0x68, 0xfb, 0x08, 0xee, 0xbe, 0x4c, - 0x27, 0x49, 0x7d, 0x84, 0xc5, 0xff, 0xb1, 0xb9, 0xac, 0xfa, 0x59, 0xd5, - 0x97, 0xf1, 0xf8, 0xdb, 0x8c, 0x2c, 0xaf, 0x1f, 0x5f, 0x0f, 0xaf, 0xff, - 0x3e, 0xde, 0x38, 0x2c, 0x98, 0xf4, 0x6b, 0x2b, 0x13, 0x0c, 0xec, 0x28, - 0x85, 0x22, 0xb1, 0x2c, 0xb4, 0xfa, 0xcb, 0xe0, 0x1e, 0x0d, 0x65, 0xc0, - 0xc5, 0x97, 0x07, 0xf4, 0x94, 0xc8, 0x3f, 0x3d, 0x84, 0x3e, 0x14, 0x32, - 0x1d, 0x0b, 0x5f, 0x98, 0x89, 0x60, 0xd6, 0x5f, 0xec, 0x19, 0x67, 0x7d, - 0x8b, 0x2e, 0x9e, 0xc0, 0xb8, 0xc2, 0x97, 0x77, 0xf5, 0x97, 0x6e, 0xc9, - 0x65, 0x6c, 0x6c, 0xb4, 0x31, 0x7e, 0x12, 0x7d, 0xcb, 0xf5, 0x97, 0xf6, - 0x79, 0xc4, 0x2e, 0xac, 0xad, 0x8f, 0x64, 0x65, 0x97, 0x9d, 0xc0, 0xb2, - 0xfe, 0xce, 0xf6, 0x35, 0xc5, 0x97, 0xf3, 0x97, 0xfb, 0x7f, 0xd5, 0x95, - 0x08, 0x9b, 0xd8, 0x8c, 0x86, 0xe7, 0xcb, 0x6c, 0xce, 0x19, 0xc9, 0xfb, - 0x2e, 0xc8, 0x74, 0x71, 0xa3, 0xe4, 0x71, 0x8c, 0x35, 0x02, 0x1b, 0x3f, - 0x42, 0xde, 0x62, 0x1d, 0x16, 0xb4, 0x8b, 0xd1, 0x82, 0xbb, 0xd1, 0x47, - 0x77, 0xc9, 0x4b, 0xdd, 0x85, 0x48, 0x53, 0xb7, 0x94, 0x0a, 0x63, 0x3e, - 0xb6, 0x24, 0x62, 0xd7, 0x9a, 0x1d, 0x24, 0xbf, 0xf3, 0xc9, 0x9e, 0x68, - 0x0e, 0xe0, 0x54, 0x4c, 0x6b, 0xa3, 0x75, 0x65, 0xda, 0xc5, 0x96, 0x8d, - 0x1a, 0xff, 0x0c, 0xd9, 0x99, 0xa2, 0xf9, 0xa3, 0xbe, 0x7b, 0xbf, 0xe1, - 0x9e, 0xf6, 0x7f, 0x7e, 0x24, 0x96, 0x5f, 0xcc, 0x96, 0x44, 0xf1, 0x94, - 0xbc, 0xb2, 0xf3, 0x2b, 0xc8, 0x6b, 0x29, 0x90, 0x7c, 0x2c, 0xa1, 0xed, - 0xfd, 0xad, 0x04, 0xb3, 0xcb, 0x2f, 0xa3, 0x68, 0xd2, 0xcb, 0xdd, 0x89, - 0x96, 0x5f, 0xb2, 0x26, 0x36, 0xac, 0xbe, 0xd8, 0x23, 0xdc, 0x59, 0x7f, - 0xdb, 0xa7, 0xfc, 0xec, 0x9a, 0x1a, 0xb2, 0x8d, 0x19, 0x93, 0x11, 0x68, - 0x74, 0x42, 0x7d, 0xd2, 0x7b, 0x49, 0x65, 0xf9, 0xb1, 0x9d, 0xe2, 0xca, - 0x9e, 0x4d, 0xc0, 0xc4, 0x6f, 0xf7, 0xa3, 0x5b, 0x08, 0x1f, 0xd6, 0x5f, - 0x07, 0x67, 0x25, 0x97, 0x3f, 0x16, 0x5f, 0x4e, 0xee, 0x79, 0x65, 0xa3, - 0xc6, 0xeb, 0x82, 0xd7, 0xa0, 0xb6, 0x59, 0x7f, 0xff, 0xfd, 0x2e, 0x7b, - 0x02, 0x2f, 0x3d, 0x80, 0xce, 0x4e, 0xcf, 0xa5, 0xc3, 0x23, 0x59, 0x79, - 0xdc, 0x0a, 0x8a, 0xc5, 0x7c, 0xe2, 0x43, 0x0b, 0x28, 0x07, 0x97, 0xa2, - 0x8b, 0xf7, 0x8d, 0xb1, 0xa5, 0x97, 0xff, 0x82, 0xfb, 0x6b, 0x1b, 0xe8, - 0xd8, 0x82, 0xb2, 0x8c, 0xfc, 0x88, 0x9e, 0xff, 0xd3, 0xf9, 0xd2, 0xc0, - 0xc1, 0x75, 0x65, 0xfe, 0x2c, 0xe7, 0xf9, 0x83, 0x59, 0x4c, 0x2a, 0x32, - 0x01, 0x37, 0xc3, 0x9a, 0x86, 0x5f, 0xa1, 0x29, 0xd2, 0x0d, 0xe7, 0xf7, - 0xff, 0x30, 0x1e, 0xf0, 0xb3, 0x79, 0x67, 0x16, 0x5f, 0xfc, 0x5d, 0x60, - 0x30, 0x58, 0x08, 0xd2, 0xcb, 0xfd, 0xad, 0xbb, 0xc7, 0xf8, 0x0b, 0x2a, - 0x0f, 0xe5, 0xd0, 0xef, 0xfa, 0x59, 0xdc, 0x28, 0x16, 0x7d, 0x65, 0xff, - 0xbd, 0x1b, 0xdf, 0x40, 0xf3, 0xee, 0xac, 0xbf, 0xd0, 0x5d, 0xf6, 0x7e, - 0xeb, 0x2f, 0xa1, 0xaf, 0xd5, 0x95, 0x23, 0xd3, 0xe1, 0x95, 0xfb, 0x77, - 0xb9, 0xf4, 0xcb, 0x2f, 0xb9, 0x31, 0xb0, 0xb2, 0xff, 0xff, 0xff, 0x3f, - 0x7b, 0x9e, 0xe3, 0xc8, 0xcb, 0xb2, 0xcd, 0x67, 0x33, 0xcf, 0xb1, 0x44, - 0x96, 0x5e, 0xec, 0x4c, 0xb2, 0xa1, 0x1f, 0x38, 0x5b, 0xc2, 0x41, 0x21, - 0x17, 0x7f, 0x06, 0x7c, 0x1e, 0x36, 0x5a, 0xcb, 0xef, 0xa5, 0x1e, 0x59, - 0x7f, 0xb8, 0x3f, 0x60, 0x03, 0xb8, 0xb2, 0xd9, 0xc3, 0xda, 0x09, 0x1d, - 0xd1, 0xbd, 0x65, 0x78, 0xdf, 0x91, 0x3d, 0xfd, 0xe3, 0x19, 0x60, 0x56, - 0x5f, 0xe9, 0x9f, 0x0e, 0x42, 0x35, 0x65, 0x0d, 0x10, 0x00, 0x20, 0x32, - 0xcb, 0xfd, 0xf4, 0xa6, 0x93, 0xeb, 0x65, 0x97, 0xd2, 0xe9, 0xec, 0xb2, - 0xa0, 0xf6, 0x9c, 0xde, 0xa1, 0x3f, 0x7c, 0x8d, 0x38, 0xe1, 0x13, 0x74, - 0xba, 0xb2, 0xfe, 0xcd, 0xb0, 0xb2, 0x4b, 0x2a, 0x0f, 0x0f, 0x42, 0xf7, - 0xff, 0x73, 0xd9, 0xba, 0x7d, 0x39, 0x70, 0x2b, 0x2f, 0xe6, 0xf4, 0x2f, - 0xb4, 0x2c, 0xb1, 0xfc, 0x7e, 0xa2, 0x23, 0xdf, 0xed, 0x18, 0x76, 0xff, - 0x92, 0x59, 0x78, 0xe3, 0x65, 0x94, 0x33, 0xd2, 0x98, 0xda, 0xfc, 0x0f, - 0x41, 0x30, 0xb2, 0xb0, 0xf2, 0xdc, 0x8e, 0xf9, 0xaf, 0xf7, 0x56, 0x5f, - 0xfd, 0xb4, 0x76, 0x70, 0x80, 0x13, 0x74, 0x4e, 0x2c, 0xbf, 0xf9, 0xf7, - 0x30, 0x9c, 0x6f, 0x9f, 0x75, 0x65, 0xff, 0x6a, 0x38, 0xfa, 0x28, 0x92, - 0xca, 0xd2, 0x32, 0xfc, 0x9f, 0xbd, 0x16, 0xf4, 0x9f, 0x65, 0x97, 0xa7, - 0x6c, 0xd5, 0x97, 0xf1, 0x46, 0xc5, 0x1b, 0x2c, 0xb7, 0x56, 0x5f, 0xf9, - 0x8e, 0x73, 0x3c, 0x7c, 0x0e, 0xcb, 0x28, 0x67, 0xa4, 0x11, 0x1a, 0x9e, - 0xd3, 0xfe, 0xc8, 0x77, 0x7c, 0x64, 0x63, 0xae, 0x40, 0x4f, 0xf7, 0xfe, - 0x27, 0x1f, 0xa3, 0x7f, 0x9c, 0x96, 0x5d, 0x1b, 0x8b, 0x2f, 0xff, 0xfc, - 0x1d, 0xb0, 0x13, 0x88, 0x3b, 0xb3, 0xb3, 0xe9, 0x60, 0x4b, 0xfe, 0x2c, - 0xbf, 0xfd, 0xb6, 0x7d, 0xde, 0x19, 0x47, 0xee, 0xd5, 0x97, 0xfb, 0xe2, - 0xc1, 0xf9, 0xc5, 0x59, 0x58, 0x7f, 0xee, 0x97, 0x43, 0x4d, 0xb1, 0xcf, - 0x88, 0x67, 0x90, 0xf5, 0xbe, 0xec, 0xa0, 0xd6, 0x5f, 0xf6, 0x0f, 0x6c, - 0x17, 0x3c, 0xeb, 0x2f, 0xed, 0xa6, 0x94, 0xf7, 0xad, 0x96, 0x5f, 0x11, - 0x67, 0x56, 0x5f, 0x8f, 0x73, 0x5a, 0x35, 0x94, 0xc8, 0x44, 0x0c, 0x1b, - 0xf8, 0x82, 0xfe, 0xd8, 0x49, 0xf7, 0x2f, 0xd6, 0x5f, 0x6e, 0x47, 0x09, - 0x65, 0xff, 0xbc, 0xed, 0xef, 0xa3, 0xa1, 0x6a, 0xca, 0xc3, 0xe3, 0x98, - 0x92, 0xff, 0xec, 0xc6, 0x1b, 0x07, 0xad, 0x18, 0xab, 0x2f, 0x3b, 0xe9, - 0x65, 0xff, 0x1c, 0x8f, 0xc1, 0x6b, 0x4d, 0x65, 0xd9, 0xd5, 0x95, 0x09, - 0xb2, 0xe4, 0x25, 0xb4, 0x45, 0xe4, 0x4e, 0x8d, 0xcf, 0x9c, 0x5e, 0x27, - 0xdd, 0x59, 0x7b, 0xc6, 0xcd, 0x95, 0xdb, 0x2f, 0xd6, 0x54, 0x57, 0x10, - 0xf9, 0xda, 0x10, 0xd2, 0x26, 0x19, 0xbe, 0x4a, 0x8e, 0x61, 0xd0, 0x10, - 0xbf, 0xf8, 0x80, 0xce, 0xe6, 0x84, 0xb6, 0xa3, 0x1b, 0xf4, 0xa3, 0x87, - 0x7c, 0xfe, 0x12, 0xc5, 0x0c, 0x6e, 0x4a, 0x1e, 0xec, 0x79, 0x61, 0x41, - 0xde, 0x43, 0x3f, 0x0b, 0xa1, 0x23, 0x98, 0xdd, 0x5e, 0xbd, 0x3c, 0x27, - 0xd9, 0x0b, 0x2e, 0x91, 0x2c, 0xbf, 0xb5, 0xa8, 0x1e, 0x35, 0x65, 0xb7, - 0x16, 0x5c, 0x7b, 0xab, 0x2f, 0xb6, 0xd4, 0x6c, 0xb2, 0xe1, 0x3f, 0x59, - 0x77, 0xfc, 0x59, 0x7b, 0xc6, 0xd5, 0x96, 0x99, 0x65, 0x19, 0xe3, 0x38, - 0xc0, 0x47, 0x2f, 0xce, 0x5b, 0x07, 0x8b, 0x2f, 0xd8, 0x3d, 0x38, 0x16, - 0x5f, 0x3e, 0xd1, 0xa5, 0x97, 0x40, 0xfc, 0x79, 0x24, 0x4f, 0x46, 0x9d, - 0x3c, 0xc5, 0xad, 0x14, 0x71, 0x9f, 0xc9, 0x09, 0x7f, 0x85, 0xbd, 0x71, - 0xb7, 0x96, 0x5e, 0xe0, 0x9c, 0x59, 0x7d, 0xf6, 0xd0, 0xc2, 0xca, 0xd8, - 0xf5, 0x06, 0x22, 0x11, 0xeb, 0xbb, 0x0b, 0x2f, 0xf7, 0xda, 0x83, 0x93, - 0xf1, 0x65, 0xf6, 0x14, 0x49, 0x65, 0x61, 0xe9, 0xb4, 0xce, 0xd3, 0xeb, - 0x2f, 0xdc, 0xce, 0x9e, 0x96, 0x5e, 0xcf, 0xba, 0xb2, 0xd9, 0xf9, 0xe2, - 0x70, 0x9e, 0xe7, 0x1a, 0xcb, 0xdd, 0xce, 0x2c, 0xa9, 0x1b, 0x20, 0x8b, - 0x5c, 0x5b, 0x8b, 0x2f, 0x69, 0xc9, 0x65, 0x2c, 0xbf, 0xc2, 0x96, 0x6f, - 0xd1, 0xf1, 0x65, 0xbe, 0x59, 0x50, 0x7d, 0xb8, 0x36, 0x61, 0x61, 0x35, - 0xbf, 0x66, 0xa5, 0x0d, 0x59, 0x7f, 0x1e, 0xd8, 0x46, 0xc2, 0xcb, 0xfc, - 0xfa, 0x97, 0xe7, 0xf7, 0x16, 0x5f, 0x73, 0x91, 0xfa, 0xca, 0x85, 0x4b, - 0xe3, 0x21, 0xc5, 0x83, 0x5a, 0x69, 0x0f, 0xa1, 0x0c, 0xe7, 0x24, 0x4e, - 0x12, 0xd1, 0x4d, 0x6f, 0xfd, 0x85, 0x8c, 0x16, 0x77, 0xc6, 0xb2, 0xfe, - 0x76, 0x30, 0x6f, 0x25, 0x95, 0xe3, 0xe9, 0x23, 0xcb, 0xf8, 0xc8, 0xb3, - 0x7b, 0xac, 0xbd, 0x21, 0x3a, 0xb2, 0xf6, 0xb4, 0xeb, 0x2f, 0xa5, 0xf8, - 0x64, 0xb2, 0xfb, 0x42, 0x47, 0xeb, 0x2a, 0x0f, 0x20, 0xc9, 0x2f, 0xf1, - 0xec, 0xed, 0xff, 0xf8, 0x59, 0x71, 0x8d, 0x65, 0xcf, 0xf2, 0xcb, 0xfb, - 0xd9, 0x31, 0x40, 0xd6, 0x5f, 0xf4, 0xa1, 0xbc, 0xcd, 0x47, 0x16, 0x50, - 0x0f, 0x97, 0xe2, 0xda, 0x1a, 0x27, 0xcd, 0xf2, 0xf7, 0x4f, 0xf5, 0x97, - 0xdf, 0xc1, 0x01, 0x65, 0x99, 0x6b, 0x29, 0x83, 0xd4, 0xf8, 0x74, 0x24, - 0x57, 0xd2, 0xee, 0x08, 0xb2, 0xf0, 0x23, 0xf5, 0x97, 0xb5, 0x0d, 0x59, - 0x46, 0x88, 0xd7, 0x31, 0x09, 0x18, 0xa3, 0xb7, 0xdb, 0x09, 0x93, 0x2c, - 0xbd, 0x1a, 0xd9, 0x65, 0x41, 0xe1, 0x19, 0x2d, 0x2c, 0xbc, 0x08, 0xfd, - 0x65, 0xd0, 0x52, 0x35, 0x18, 0x17, 0x7d, 0xd2, 0x3d, 0xd5, 0x97, 0x07, - 0x8b, 0x2f, 0xc1, 0x97, 0x3c, 0x35, 0x95, 0x07, 0x80, 0x42, 0xf5, 0x25, - 0xc5, 0x01, 0x90, 0xfc, 0x58, 0x63, 0xd3, 0x32, 0x68, 0x81, 0xa6, 0xbe, - 0x85, 0xa9, 0x46, 0x07, 0xc7, 0xee, 0xa4, 0x04, 0xab, 0x7b, 0x25, 0xfc, - 0xf2, 0xdd, 0xdd, 0x0e, 0xcb, 0x2c, 0x4b, 0x2e, 0x96, 0xe2, 0xca, 0xf1, - 0xef, 0xf0, 0xd7, 0xa2, 0x16, 0x9f, 0x59, 0x7f, 0x66, 0xc3, 0xf1, 0xe9, - 0x65, 0x78, 0xf0, 0x88, 0x52, 0xff, 0xd1, 0x9c, 0x9d, 0x06, 0x31, 0x24, - 0xb2, 0xfe, 0x31, 0x79, 0xb6, 0x0a, 0xb2, 0x88, 0xfc, 0x3a, 0x81, 0x71, - 0x42, 0xcb, 0xf4, 0x0f, 0xb8, 0x05, 0x97, 0xa0, 0x80, 0xb2, 0xff, 0xfe, - 0x71, 0x46, 0xef, 0xad, 0xbc, 0xfd, 0xf1, 0xea, 0x4b, 0x2f, 0xc0, 0x07, - 0xa3, 0x4b, 0x2b, 0xc8, 0x9f, 0x21, 0xb0, 0xae, 0x54, 0x93, 0x2b, 0x01, - 0x0f, 0x05, 0x7b, 0x0c, 0x6b, 0xe7, 0x27, 0x99, 0x65, 0xf8, 0xfa, 0x59, - 0x25, 0x97, 0xd0, 0x2c, 0x4c, 0xb2, 0xff, 0xdc, 0xde, 0xfe, 0x86, 0x33, - 0xbc, 0x59, 0x70, 0x8d, 0x59, 0x7e, 0x2c, 0xd0, 0x71, 0x65, 0xe7, 0xf8, - 0x96, 0x5f, 0xdd, 0x27, 0xff, 0x09, 0x65, 0xf8, 0x9f, 0xfc, 0x25, 0x95, - 0x38, 0xf4, 0xba, 0x59, 0x43, 0x44, 0x90, 0x5b, 0xab, 0x64, 0xe7, 0x98, - 0x21, 0x32, 0x69, 0x88, 0xfc, 0x83, 0xf8, 0xc1, 0x42, 0xe2, 0xfb, 0x98, - 0x40, 0x59, 0x7f, 0x41, 0x74, 0x01, 0xd9, 0x65, 0xfe, 0x81, 0x46, 0x17, - 0xd4, 0x96, 0x5e, 0xe4, 0x49, 0x65, 0xfb, 0xd9, 0xa3, 0xe2, 0xcb, 0x8f, - 0x5f, 0x1e, 0x1f, 0x47, 0x2d, 0xbd, 0x65, 0x42, 0x60, 0xf2, 0x21, 0xd1, - 0x77, 0x9d, 0xf7, 0x4b, 0xaf, 0x11, 0xb0, 0xb2, 0xfb, 0x06, 0x7b, 0xd6, - 0x5d, 0x0d, 0xc3, 0x7e, 0xe3, 0x97, 0xe9, 0x74, 0xdb, 0xd5, 0x97, 0xf3, - 0xfd, 0xe8, 0x10, 0x96, 0x5b, 0x3e, 0x3d, 0x61, 0x4a, 0x2f, 0xe7, 0x93, - 0x96, 0x6e, 0xac, 0xbe, 0xe7, 0x9e, 0x4b, 0x28, 0xd1, 0xf3, 0xa8, 0x40, - 0x39, 0x48, 0x4b, 0xaf, 0x61, 0x4c, 0xb2, 0xdf, 0x2c, 0xbb, 0xf8, 0x49, - 0x70, 0xa2, 0xa4, 0xa3, 0x36, 0x02, 0x8b, 0xdf, 0x8b, 0x3b, 0xe3, 0x48, - 0xcc, 0xd0, 0xdf, 0x30, 0x59, 0xc5, 0x95, 0x23, 0xda, 0x19, 0xc5, 0xfe, - 0x76, 0x20, 0x8b, 0x3a, 0xb2, 0xf1, 0xfe, 0xeb, 0x2a, 0x13, 0x48, 0x18, - 0xe3, 0xc2, 0xf4, 0x88, 0x82, 0x63, 0x7b, 0xd0, 0x2a, 0xcb, 0xcf, 0xf7, - 0x16, 0x5b, 0x8b, 0x2f, 0x84, 0xf3, 0xf5, 0x65, 0x6c, 0x7d, 0xc3, 0x1d, - 0xf8, 0x77, 0xa2, 0x37, 0xa0, 0xa6, 0x59, 0x71, 0x42, 0xca, 0x59, 0x4b, - 0x2a, 0x62, 0xd9, 0xa1, 0x77, 0x7a, 0x65, 0x97, 0x1f, 0xeb, 0x2a, 0x0d, - 0x7f, 0xe3, 0x15, 0x32, 0x2e, 0x34, 0x38, 0xe5, 0x7f, 0xa8, 0x5f, 0xfc, - 0xc1, 0x90, 0x39, 0x0d, 0x7f, 0xba, 0xb2, 0xf7, 0xf9, 0xba, 0xb2, 0xff, - 0xf8, 0xb3, 0xfc, 0x68, 0x63, 0x5a, 0x30, 0x81, 0x65, 0xf1, 0x43, 0x66, - 0x59, 0x4c, 0x23, 0x5b, 0x48, 0xa4, 0x41, 0xd4, 0xfb, 0xe6, 0xf0, 0x2d, - 0x59, 0x66, 0x16, 0x5a, 0x7d, 0x65, 0xda, 0x61, 0x65, 0x41, 0xf0, 0x99, - 0x18, 0x44, 0x84, 0x14, 0xbf, 0xfe, 0xf6, 0x4b, 0x91, 0xd9, 0x66, 0xe3, - 0x97, 0xeb, 0x2f, 0xf8, 0xfb, 0xec, 0xfb, 0xa1, 0x85, 0x97, 0xc2, 0x46, - 0xbf, 0x59, 0x52, 0x3d, 0xdf, 0x1c, 0xdd, 0x9c, 0x59, 0x50, 0x6e, 0x24, - 0x45, 0x5c, 0x4c, 0x1f, 0xb0, 0xe7, 0xba, 0x38, 0xb2, 0xdf, 0xac, 0xbf, - 0x1c, 0x36, 0x1a, 0xb2, 0xd8, 0xb2, 0x8d, 0x10, 0xfa, 0x29, 0x71, 0x6e, - 0x09, 0x4f, 0x93, 0x59, 0x85, 0x95, 0x0b, 0x99, 0xd9, 0x0f, 0x63, 0x8c, - 0x53, 0xd0, 0x9e, 0x78, 0xf2, 0x77, 0x52, 0xef, 0xa0, 0x50, 0xcc, 0xb2, - 0xf7, 0x22, 0x65, 0x97, 0xf6, 0x0f, 0x37, 0x9e, 0x96, 0x52, 0xcb, 0x35, - 0x65, 0x74, 0xbc, 0xde, 0x17, 0x7c, 0x37, 0x7f, 0x96, 0x5f, 0xbf, 0x3d, - 0x1b, 0x0b, 0x2e, 0x76, 0x16, 0x5d, 0x9f, 0x2c, 0xa0, 0x26, 0x4d, 0x31, - 0x23, 0x47, 0x7c, 0x94, 0xe4, 0x5f, 0x91, 0x11, 0x4c, 0xf8, 0xbd, 0xd9, - 0xe5, 0x97, 0x66, 0x96, 0x52, 0xca, 0x59, 0x68, 0x59, 0x4c, 0xb3, 0x4c, - 0x41, 0x7d, 0x0b, 0xbd, 0x9b, 0xdd, 0x65, 0xf7, 0xbd, 0x9f, 0xac, 0xb4, - 0x78, 0xf0, 0x04, 0x1d, 0xa8, 0x47, 0x5b, 0x45, 0x9c, 0xf3, 0xf7, 0x1b, - 0xf8, 0xfb, 0x9e, 0x76, 0x16, 0x5f, 0xdd, 0x19, 0xff, 0x04, 0xb2, 0xf6, - 0xde, 0x35, 0x97, 0x78, 0x3f, 0x1e, 0x53, 0x96, 0xde, 0x14, 0x51, 0x52, - 0x5f, 0xe8, 0xd8, 0x4c, 0xf3, 0xfc, 0x91, 0x99, 0xa0, 0xbf, 0xc6, 0x37, - 0x2f, 0xa5, 0xc5, 0x94, 0x33, 0xfa, 0xf2, 0x3d, 0xd9, 0xb2, 0xcb, 0xf3, - 0x44, 0x8d, 0x7e, 0xb2, 0x96, 0x52, 0xcb, 0x43, 0x4b, 0x6f, 0xc2, 0xea, - 0x0f, 0x9a, 0x48, 0x17, 0xfe, 0xe4, 0x4b, 0xd9, 0x85, 0x2e, 0x2c, 0xa1, - 0xa7, 0x8a, 0x08, 0x64, 0x19, 0x14, 0xcf, 0xbd, 0x21, 0xbd, 0x0d, 0x35, - 0x97, 0xa5, 0x80, 0x59, 0x58, 0x88, 0x70, 0x28, 0x7c, 0x37, 0x7c, 0x7a, - 0xdd, 0x1a, 0xcb, 0xf7, 0xa3, 0xe7, 0xdc, 0x59, 0x7f, 0xfd, 0x1d, 0xe0, - 0xf3, 0xa7, 0xe0, 0xe7, 0xdd, 0x59, 0x5e, 0x3f, 0xbe, 0x95, 0xde, 0x2c, - 0xf2, 0xcb, 0x69, 0x65, 0xfe, 0xcc, 0x00, 0x9b, 0xfd, 0x8b, 0x2f, 0xfa, - 0x0b, 0xa5, 0x9d, 0x81, 0x56, 0x5f, 0xec, 0x17, 0x86, 0x5f, 0x49, 0x65, - 0x2c, 0xa3, 0x3f, 0x6d, 0x1b, 0xb9, 0xa5, 0xee, 0xe8, 0x2b, 0x2d, 0xc5, - 0x94, 0x46, 0xb8, 0x23, 0xb7, 0xf9, 0xf7, 0xe0, 0xf6, 0xc1, 0x56, 0x5f, - 0xff, 0xb0, 0x71, 0x9f, 0x09, 0xd3, 0x20, 0xcb, 0x38, 0xb2, 0xe6, 0xfe, - 0xb2, 0xe7, 0x25, 0x95, 0xe3, 0x5a, 0xe3, 0x17, 0xe6, 0x9f, 0x7f, 0x75, - 0x95, 0xb2, 0xb1, 0x4c, 0x85, 0x01, 0x91, 0x6e, 0x0d, 0xcc, 0x23, 0xa8, - 0x55, 0xba, 0xdf, 0xe4, 0x04, 0x6d, 0xd8, 0x41, 0x04, 0x82, 0xed, 0x30, - 0xb2, 0xfa, 0x1a, 0xfe, 0x59, 0x7b, 0xbd, 0x75, 0x97, 0xda, 0x0c, 0x6f, - 0x59, 0x7e, 0xcd, 0xc7, 0x2f, 0xc6, 0x7c, 0x2e, 0x43, 0xd1, 0xcb, 0xef, - 0x74, 0xf6, 0x59, 0x7f, 0x80, 0x7c, 0x2c, 0xde, 0xeb, 0x2f, 0xa3, 0x67, - 0x92, 0xcb, 0xee, 0xf3, 0xc6, 0xb2, 0xfe, 0x27, 0xee, 0xd8, 0x2a, 0xca, - 0x59, 0x44, 0x6e, 0x7a, 0x5d, 0x50, 0x7f, 0x78, 0xb7, 0x7e, 0xcd, 0x8b, - 0x3e, 0x59, 0x7d, 0xd3, 0x2e, 0x2c, 0xbe, 0x9d, 0x9f, 0x75, 0x65, 0xfd, - 0xc8, 0xfa, 0x59, 0xd5, 0x94, 0x03, 0xd3, 0xe1, 0x2d, 0xf6, 0x74, 0xf8, - 0xb2, 0x96, 0x57, 0xc6, 0xb1, 0xc8, 0x6b, 0x11, 0xc6, 0x6e, 0x8e, 0x9d, - 0x50, 0xac, 0x46, 0x4f, 0x38, 0x9b, 0xf1, 0x1e, 0x8c, 0xfd, 0x09, 0xd2, - 0x20, 0xe4, 0x61, 0x77, 0x84, 0x08, 0x8b, 0x2f, 0x11, 0xee, 0x2c, 0xbe, - 0x1c, 0xfb, 0xb0, 0xb2, 0xa0, 0xf1, 0x30, 0x7a, 0xd3, 0xeb, 0x2e, 0x81, - 0xac, 0xa6, 0x49, 0xaa, 0xf0, 0xa5, 0xb8, 0xb2, 0xcd, 0x59, 0x6d, 0x2c, - 0xa7, 0x34, 0x41, 0x11, 0xad, 0x1e, 0x9f, 0x8c, 0xe9, 0x61, 0x9a, 0x2b, - 0xfd, 0x05, 0x27, 0x6e, 0x0d, 0x65, 0xf7, 0x5a, 0xdd, 0x2c, 0xbf, 0xfb, - 0xf8, 0x20, 0x3f, 0x7f, 0x10, 0xa4, 0xb2, 0xf4, 0x8f, 0xcb, 0x2f, 0xba, - 0x59, 0x25, 0x97, 0xc1, 0x65, 0xf1, 0xd6, 0x5f, 0xb6, 0x1b, 0xb8, 0xab, - 0x2b, 0x0f, 0x3c, 0x24, 0xd7, 0xff, 0x8f, 0x9e, 0xc1, 0x96, 0x6f, 0x2c, - 0xe2, 0xca, 0x92, 0x72, 0x0c, 0x18, 0xfc, 0x47, 0x32, 0x36, 0x87, 0x09, - 0xc3, 0xa4, 0x37, 0x08, 0x05, 0x94, 0xc8, 0x75, 0x60, 0x73, 0xd9, 0x54, - 0x47, 0x7b, 0xb4, 0x31, 0x64, 0x60, 0x39, 0x59, 0x19, 0x3a, 0x8e, 0xc4, - 0x64, 0x20, 0x71, 0xfa, 0x3b, 0xc3, 0x8f, 0x86, 0x68, 0xdc, 0xf5, 0x1c, - 0x2b, 0x63, 0x88, 0xf4, 0xec, 0x4b, 0xc7, 0x2b, 0xfc, 0x6c, 0x0c, 0xb3, - 0xc2, 0x95, 0x87, 0xc9, 0x68, 0x9d, 0x97, 0x78, 0x17, 0xcd, 0xec, 0x62, - 0xa5, 0x4f, 0xc2, 0x68, 0x48, 0xea, 0xb7, 0x59, 0xef, 0xf9, 0x9f, 0x4f, - 0x37, 0x78, 0x18, 0x59, 0x7f, 0xff, 0xc1, 0x86, 0x7d, 0xe1, 0xf9, 0xcf, - 0xb9, 0xaf, 0xda, 0xf2, 0x59, 0x4c, 0xd5, 0x4e, 0x6d, 0x1f, 0xb8, 0xcf, - 0x6f, 0xda, 0x03, 0xb8, 0x15, 0x15, 0xba, 0xff, 0xcf, 0x26, 0x79, 0xa0, - 0x3b, 0x81, 0x51, 0x38, 0x2c, 0xcf, 0x11, 0x00, 0xd3, 0x4b, 0xa7, 0xb1, - 0xac, 0xb7, 0x96, 0x5b, 0x8b, 0x28, 0x26, 0x8a, 0x7c, 0x46, 0xfd, 0x82, - 0xf0, 0xc5, 0x59, 0x7a, 0x5c, 0xe2, 0xcb, 0xe0, 0x3b, 0x81, 0x51, 0x68, - 0xaf, 0xff, 0x60, 0xfc, 0xec, 0x4d, 0x31, 0xf0, 0x2d, 0x59, 0x5a, 0x3f, - 0xbf, 0x17, 0x5f, 0x01, 0xcb, 0xf5, 0x97, 0xdf, 0xc1, 0x01, 0x65, 0xfe, - 0xcd, 0xce, 0x6b, 0x4f, 0xd5, 0x97, 0xf4, 0x6c, 0xfe, 0x76, 0xac, 0xa9, - 0x8f, 0x8f, 0xc6, 0xd7, 0x7b, 0x8b, 0x2f, 0xe8, 0x72, 0x08, 0xf1, 0x65, - 0xfb, 0x43, 0x0f, 0x78, 0xb2, 0xff, 0xa3, 0x6f, 0x67, 0x3d, 0x9b, 0x8b, - 0x2f, 0xfe, 0x80, 0x73, 0x00, 0x51, 0xff, 0x21, 0x65, 0xff, 0x6f, 0xe6, - 0x7b, 0x08, 0x41, 0xac, 0xa8, 0x3f, 0xec, 0x43, 0xaf, 0x23, 0x68, 0xa1, - 0x75, 0x7f, 0xb3, 0x5f, 0xe4, 0xc2, 0x71, 0x65, 0x98, 0x59, 0x7f, 0xd9, - 0x1b, 0x64, 0xda, 0x3e, 0x2c, 0xa3, 0x3c, 0xb9, 0x84, 0xaf, 0xff, 0xdb, - 0x47, 0x60, 0x7a, 0x8f, 0x3f, 0x0b, 0x3f, 0x59, 0x7f, 0xe8, 0xf9, 0xf7, - 0x3c, 0x4f, 0xb9, 0xb2, 0xcb, 0xff, 0x46, 0xbf, 0xc3, 0xcd, 0x74, 0x2b, - 0x2a, 0x11, 0xb1, 0xe5, 0x5e, 0x22, 0xd0, 0xd3, 0xd1, 0x32, 0x79, 0xa1, - 0x03, 0xc8, 0x7d, 0x5f, 0xb8, 0xd3, 0x29, 0x2c, 0xa8, 0x56, 0x87, 0x92, - 0xb5, 0x1d, 0x22, 0x96, 0x5e, 0xd4, 0x30, 0xb2, 0xfc, 0x7d, 0x28, 0x6a, - 0xca, 0x64, 0x1e, 0x74, 0xc1, 0x7e, 0x1d, 0xbf, 0xd0, 0xdd, 0x68, 0xff, - 0xe2, 0xcb, 0xc0, 0xc1, 0x56, 0x5b, 0x26, 0x3d, 0x1f, 0x1a, 0x58, 0x55, - 0x97, 0xfb, 0x51, 0xdf, 0xa5, 0x9d, 0x59, 0x76, 0x0d, 0x65, 0xed, 0x9d, - 0xab, 0x2f, 0x47, 0xfa, 0x83, 0x66, 0x62, 0xd7, 0xff, 0x7d, 0xce, 0x96, - 0x6f, 0xef, 0x4c, 0x6b, 0x28, 0xd1, 0xe3, 0x30, 0x97, 0x19, 0xc2, 0x63, - 0x71, 0xc9, 0x65, 0xfd, 0x9b, 0xfa, 0x18, 0x02, 0xcb, 0xfd, 0xef, 0x05, - 0x86, 0xc7, 0x16, 0x5f, 0xff, 0x8f, 0x85, 0x9b, 0xdf, 0xa5, 0x9c, 0xf3, - 0xcc, 0xb2, 0xfd, 0x1d, 0xe0, 0x9e, 0x59, 0x50, 0x8f, 0x81, 0x8b, 0x61, - 0x7c, 0xc6, 0xa4, 0xab, 0x7c, 0x47, 0xf4, 0x96, 0x5e, 0xfd, 0xfc, 0xb2, - 0xff, 0x6d, 0x86, 0x37, 0x76, 0x16, 0x56, 0x1e, 0x83, 0x8e, 0xdf, 0xda, - 0x81, 0xc1, 0x4c, 0xb2, 0xdc, 0x59, 0x5b, 0x1b, 0xef, 0x16, 0xd9, 0x9b, - 0x25, 0x94, 0x4b, 0x3c, 0x9f, 0x6c, 0x48, 0x32, 0x9c, 0x84, 0xc0, 0x08, - 0xbe, 0x22, 0x9a, 0x10, 0xba, 0x23, 0x68, 0xbf, 0xa5, 0xb7, 0x7f, 0x08, - 0x42, 0x84, 0x2f, 0x23, 0x19, 0xec, 0x66, 0xa1, 0x48, 0x9f, 0x72, 0x11, - 0x7a, 0xf7, 0x1b, 0xc5, 0x97, 0xf9, 0x93, 0x07, 0xd9, 0x67, 0x16, 0x5f, - 0xff, 0x1f, 0x4f, 0x4f, 0xfc, 0x78, 0xc1, 0x1f, 0xac, 0xba, 0x52, 0x59, - 0x7f, 0xf6, 0x14, 0x63, 0x11, 0x2e, 0xe6, 0xcb, 0x2f, 0xfc, 0xfe, 0x9d, - 0x19, 0xdf, 0x1b, 0x56, 0x5f, 0xff, 0xe3, 0xec, 0x78, 0xb3, 0xba, 0x8f, - 0x16, 0x6f, 0x08, 0x16, 0x5f, 0xff, 0x46, 0x77, 0xcf, 0x2d, 0x04, 0x70, - 0x50, 0xb2, 0xa4, 0x9c, 0xae, 0xe2, 0x7f, 0x85, 0xc2, 0x87, 0xbc, 0xff, - 0x75, 0x82, 0xff, 0x8a, 0x25, 0x9c, 0xc3, 0x85, 0x96, 0xd9, 0x65, 0x41, - 0xe3, 0x91, 0xad, 0xff, 0xff, 0x47, 0xed, 0x79, 0x4e, 0xef, 0xb1, 0xb8, - 0x08, 0xf4, 0x35, 0x65, 0xff, 0xf1, 0x97, 0x43, 0xe3, 0xe4, 0xfb, 0xf7, - 0x06, 0xb2, 0xbc, 0x8b, 0x9e, 0xb4, 0x5f, 0xc7, 0xb4, 0xe7, 0x2f, 0xd6, - 0x5f, 0x01, 0xdc, 0x0a, 0x8b, 0x69, 0x7f, 0xff, 0x43, 0xf6, 0x3d, 0x1c, - 0x33, 0x91, 0xeb, 0x06, 0xb2, 0xfe, 0xf4, 0x36, 0x0c, 0x6b, 0x28, 0xd3, - 0x04, 0x98, 0x8f, 0x46, 0x1c, 0x2e, 0xea, 0xbd, 0xfc, 0xf2, 0x1f, 0x8d, - 0xab, 0x2f, 0xf6, 0x4c, 0x50, 0xd9, 0xc0, 0x59, 0x77, 0x8c, 0x67, 0xc5, - 0xd2, 0xdb, 0xff, 0xde, 0xc9, 0x39, 0x75, 0xe4, 0x6c, 0x42, 0xcb, 0xfe, - 0xcc, 0x04, 0xf8, 0x7c, 0x7a, 0x59, 0x7f, 0xf7, 0xb3, 0x6e, 0x1e, 0xa3, - 0x75, 0xc9, 0x65, 0xd8, 0x6b, 0x2d, 0x00, 0x3d, 0xbd, 0xe8, 0xd6, 0x9e, - 0x96, 0x5f, 0xfd, 0x9d, 0x86, 0x93, 0xb0, 0x59, 0xfa, 0xcb, 0x7e, 0xb2, - 0xa6, 0x3e, 0xb2, 0x16, 0xea, 0x1d, 0xff, 0x8c, 0x87, 0x10, 0xdd, 0xd7, - 0x92, 0xcb, 0xfe, 0x8f, 0xfd, 0x1b, 0x16, 0x71, 0x65, 0x41, 0xfc, 0x04, - 0xfe, 0xfb, 0xd1, 0xa6, 0x16, 0x5f, 0xfe, 0x3d, 0x46, 0x78, 0x27, 0xcf, - 0x67, 0xeb, 0x2f, 0xff, 0x86, 0x1e, 0xf0, 0x79, 0x2f, 0x46, 0xf1, 0xc2, - 0xca, 0x92, 0x2f, 0x86, 0x46, 0x69, 0x37, 0xfd, 0x12, 0x8d, 0x6d, 0x1a, - 0xd9, 0x65, 0xff, 0xe8, 0x97, 0xa0, 0x98, 0x2c, 0xd8, 0x49, 0x2c, 0xbf, - 0xff, 0xd0, 0x64, 0xfd, 0x0f, 0x70, 0x70, 0xd1, 0xfa, 0x3e, 0x59, 0x7f, - 0x8d, 0xa3, 0x8e, 0x09, 0xc5, 0x97, 0xbb, 0x80, 0x59, 0x7f, 0xfc, 0x47, - 0xbc, 0xfb, 0xe8, 0xef, 0x23, 0x7c, 0x2c, 0xa3, 0x4d, 0x2f, 0x49, 0x7e, - 0x5f, 0xe9, 0xa0, 0x47, 0x2f, 0xf0, 0xf0, 0xa4, 0x7e, 0x0a, 0xcb, 0x0d, - 0x65, 0xf3, 0xfd, 0xcf, 0x2c, 0xa3, 0x3e, 0x67, 0x32, 0xe0, 0x8d, 0xff, - 0xdd, 0x73, 0xc8, 0xd3, 0xc8, 0xfc, 0xb2, 0xfc, 0xe3, 0xc2, 0xfd, 0x65, - 0x48, 0xfa, 0x0d, 0x06, 0xff, 0xa3, 0x53, 0xb9, 0x1e, 0x73, 0x59, 0x7f, - 0xbc, 0x6f, 0x2e, 0x9e, 0xcb, 0x2f, 0xc3, 0x8c, 0x23, 0x59, 0x53, 0xd3, - 0x2f, 0xa5, 0x92, 0x3b, 0x11, 0xe5, 0x8e, 0x14, 0xf9, 0x1e, 0xe8, 0x21, - 0x5a, 0x65, 0xb3, 0x24, 0x6a, 0x12, 0xcd, 0x84, 0xa7, 0xa1, 0x4e, 0xf0, - 0xdf, 0x22, 0xfe, 0x47, 0x0b, 0xd8, 0x58, 0x06, 0x12, 0xa2, 0x90, 0xcf, - 0x9c, 0x88, 0x67, 0x7f, 0x43, 0x3d, 0x66, 0x30, 0xb2, 0xff, 0xfe, 0xd4, - 0x74, 0xc0, 0x63, 0x83, 0xd1, 0xc8, 0xf8, 0xb2, 0xfe, 0x61, 0xf4, 0x30, - 0x92, 0xcb, 0xfe, 0x8e, 0x98, 0x0c, 0x7f, 0x12, 0xcb, 0xff, 0xff, 0xff, - 0x0c, 0xa0, 0x1f, 0x00, 0xfe, 0x6b, 0x93, 0x18, 0x4f, 0xf0, 0xa0, 0xf1, - 0xcc, 0x46, 0xde, 0x2c, 0xbf, 0xf1, 0xf6, 0x3a, 0x7b, 0xe0, 0x80, 0xb2, - 0xef, 0xa4, 0xb2, 0xb1, 0x1e, 0x4f, 0x09, 0xc0, 0x9f, 0x5f, 0xc5, 0x3e, - 0x7a, 0xc6, 0x16, 0x5d, 0xdf, 0x2c, 0xbf, 0xec, 0xef, 0x04, 0xe7, 0x73, - 0xcb, 0x2b, 0x63, 0xd1, 0x68, 0xbd, 0xf8, 0xf6, 0x6c, 0x01, 0x65, 0xf9, - 0xfe, 0x90, 0x9c, 0x59, 0x7f, 0xe3, 0x9b, 0x9b, 0xdc, 0xb6, 0x08, 0xd6, - 0x59, 0x9e, 0x2b, 0x1b, 0x61, 0x63, 0x45, 0xde, 0x8c, 0xa8, 0x8c, 0xf9, - 0x08, 0x1e, 0x91, 0xef, 0x28, 0x10, 0xaa, 0x99, 0xae, 0x93, 0xe4, 0x69, - 0x1f, 0xcb, 0x4a, 0xb9, 0xbe, 0x59, 0x7e, 0xd0, 0x1d, 0xc0, 0xa8, 0xb9, - 0x57, 0xf3, 0x8f, 0xd0, 0x5b, 0x2c, 0xb9, 0x8f, 0x2c, 0xb3, 0x31, 0xa2, - 0x43, 0x05, 0xfc, 0x68, 0xe5, 0xb7, 0xed, 0x01, 0xdc, 0x0a, 0x8b, 0xb5, - 0x7b, 0x6c, 0x15, 0x65, 0xff, 0x1c, 0xa4, 0x65, 0xfc, 0x49, 0x65, 0xcd, - 0x9f, 0x59, 0x7c, 0x7a, 0x7f, 0xd6, 0x5e, 0x7d, 0xa1, 0x65, 0x99, 0xe2, - 0x38, 0x9a, 0x68, 0xe3, 0xc4, 0x71, 0xc1, 0xa0, 0x91, 0x54, 0x3f, 0xa6, - 0x6e, 0xc5, 0x52, 0xa7, 0xda, 0x0e, 0x50, 0xfe, 0x1b, 0xb1, 0x59, 0xcf, - 0x9d, 0xaf, 0x58, 0xdc, 0x85, 0xdf, 0xa9, 0x49, 0xe5, 0x59, 0x22, 0xf2, - 0x1a, 0x5d, 0x8c, 0x96, 0xff, 0x33, 0xcd, 0x01, 0xdc, 0x0a, 0x8a, 0x9d, - 0x7e, 0x26, 0x7a, 0xe7, 0x16, 0x5d, 0xb6, 0x2c, 0xbe, 0xe1, 0x7b, 0xab, - 0x2f, 0xf7, 0xa3, 0x90, 0xd0, 0xcc, 0xb2, 0xa4, 0x7a, 0xc3, 0x22, 0xbf, - 0x83, 0xf3, 0x5d, 0xc9, 0x65, 0xba, 0xb2, 0xfb, 0xee, 0x40, 0xd6, 0x58, - 0x2b, 0x2f, 0x43, 0xed, 0x38, 0xda, 0x7e, 0x47, 0x46, 0x7f, 0x44, 0x8b, - 0x7c, 0x07, 0x70, 0x2a, 0x2b, 0x95, 0xcd, 0x85, 0x97, 0xed, 0x01, 0xdc, - 0x0a, 0x8b, 0x39, 0x66, 0x70, 0x79, 0x58, 0x2d, 0x73, 0xc9, 0x65, 0xfd, - 0x2e, 0xfc, 0x03, 0xe2, 0xca, 0x73, 0xc5, 0x08, 0xb5, 0xfc, 0x7c, 0xc2, - 0x71, 0x56, 0x5e, 0x0c, 0xa1, 0x65, 0x69, 0x34, 0xef, 0x3c, 0x13, 0x6f, - 0x48, 0x77, 0x96, 0x5f, 0xfe, 0xec, 0x72, 0x70, 0x79, 0xd8, 0x9a, 0x63, - 0x59, 0x7f, 0xfe, 0x7f, 0x63, 0x61, 0xb3, 0xb3, 0x18, 0x61, 0xe4, 0xb2, - 0xfe, 0x36, 0xec, 0x1d, 0x49, 0x65, 0xf9, 0xb9, 0x33, 0xfe, 0xb2, 0xfb, - 0x6f, 0x3f, 0x56, 0x53, 0x9e, 0x60, 0x4a, 0x6f, 0xf4, 0x7a, 0x73, 0x67, - 0x96, 0x4f, 0x56, 0x56, 0x27, 0x01, 0x32, 0x77, 0x95, 0xc9, 0xef, 0x79, - 0x0d, 0xff, 0x14, 0x37, 0x81, 0x93, 0xb0, 0xb2, 0xfd, 0xac, 0xe9, 0xb5, - 0x65, 0xcd, 0xde, 0xb2, 0xf1, 0x40, 0xd6, 0x56, 0x1b, 0x47, 0x19, 0xbf, - 0x4d, 0x0d, 0x81, 0x16, 0x5d, 0x26, 0xac, 0xac, 0x3c, 0x02, 0x29, 0xbf, - 0xfd, 0xe3, 0x9d, 0xe7, 0x3e, 0xc6, 0x0c, 0xd6, 0x5f, 0xf8, 0xf5, 0x3a, - 0x1a, 0x7b, 0x8f, 0x32, 0xcb, 0xe0, 0x3b, 0x81, 0x51, 0x21, 0x29, 0x83, - 0xf1, 0xd2, 0x1d, 0xff, 0x67, 0x78, 0x19, 0x46, 0xd0, 0xb2, 0xff, 0xfc, - 0x7a, 0x07, 0xb2, 0x76, 0xb5, 0x82, 0xcf, 0xc3, 0x56, 0x54, 0x91, 0x29, - 0xc3, 0x9b, 0xee, 0xe8, 0xfe, 0x59, 0x7f, 0xec, 0x6e, 0x3e, 0xb6, 0x9d, - 0xf3, 0x56, 0x5f, 0xef, 0xb9, 0xd2, 0x86, 0xf1, 0x65, 0xff, 0xe7, 0x20, - 0x4e, 0x19, 0x3c, 0xbc, 0xf2, 0x59, 0x46, 0x7f, 0xc1, 0x34, 0xbf, 0xb0, - 0x8f, 0xfe, 0x42, 0xcb, 0x33, 0x92, 0xac, 0x4c, 0x85, 0xd7, 0xd0, 0xb7, - 0x32, 0x3f, 0x11, 0xff, 0x0c, 0x0e, 0x10, 0xdc, 0x7e, 0x59, 0x7f, 0xe7, - 0x12, 0x62, 0x3e, 0x94, 0x7e, 0xb2, 0xa4, 0x8d, 0x2f, 0x9f, 0x7a, 0x2d, - 0x7f, 0xf7, 0x8d, 0xb9, 0xc9, 0xdf, 0x4b, 0x3a, 0xb2, 0xfa, 0x5e, 0x13, - 0x8b, 0x2e, 0x9e, 0x33, 0xca, 0xcb, 0xe8, 0x30, 0xf1, 0x65, 0x99, 0xb2, - 0xb9, 0xe1, 0xf8, 0x8a, 0xa1, 0x1b, 0xf8, 0x8e, 0xec, 0xf7, 0xd3, 0xcf, - 0xa1, 0xab, 0x2f, 0xef, 0x73, 0x99, 0xad, 0x96, 0x5d, 0x02, 0xac, 0xbf, - 0xef, 0xf0, 0x64, 0xff, 0xc6, 0xf5, 0x95, 0x88, 0x81, 0x32, 0xf7, 0x17, - 0xbc, 0xdd, 0xf2, 0x59, 0x7f, 0xfb, 0xd1, 0xfb, 0x5e, 0x5c, 0xee, 0x63, - 0x56, 0x5e, 0x99, 0xb3, 0x2c, 0xb3, 0x36, 0x54, 0xcb, 0xff, 0x86, 0xdd, - 0x88, 0x87, 0x0a, 0x7c, 0x8d, 0xb8, 0xe3, 0xcc, 0x99, 0x33, 0x47, 0x2d, - 0x5b, 0xf2, 0xfb, 0xcb, 0xb6, 0x28, 0xc4, 0x38, 0x5b, 0xd8, 0x54, 0x04, - 0xb4, 0x41, 0xfd, 0xd4, 0xab, 0xff, 0xd9, 0xf3, 0x31, 0x85, 0xf5, 0x2f, - 0x0a, 0xeb, 0x2f, 0xfe, 0x67, 0xe7, 0xe1, 0x67, 0x7b, 0x1f, 0xac, 0xbf, - 0xfc, 0xcd, 0xaf, 0x26, 0x79, 0xa0, 0x3b, 0x81, 0x51, 0x3e, 0x2f, 0xff, - 0x49, 0x9e, 0x6f, 0x36, 0x39, 0xc8, 0x68, 0x56, 0x5f, 0x07, 0x51, 0xc5, - 0x97, 0xe6, 0x1f, 0xb8, 0x2a, 0xcb, 0x33, 0x19, 0xe5, 0x84, 0x8a, 0x9d, - 0x18, 0x9d, 0x84, 0xd5, 0x01, 0x9e, 0xbe, 0x68, 0x3b, 0x94, 0xc2, 0x9d, - 0x46, 0x38, 0xd4, 0xef, 0x23, 0x3c, 0x63, 0xd7, 0xff, 0xf0, 0x49, 0xd8, - 0x9d, 0xd6, 0x20, 0xa5, 0x9e, 0x36, 0xac, 0xb8, 0xfe, 0x59, 0x7f, 0xfd, - 0x2d, 0x99, 0x48, 0x9e, 0x76, 0x06, 0xa7, 0x4e, 0xf4, 0xfa, 0xca, 0x91, - 0xfe, 0x7e, 0x2f, 0x7f, 0xf8, 0xb6, 0xf4, 0x1f, 0x78, 0x65, 0xf4, 0x96, - 0x5f, 0xfb, 0xac, 0x41, 0x4b, 0x3c, 0x6d, 0x59, 0x7f, 0xcc, 0x41, 0x4b, - 0x3c, 0x6d, 0x59, 0x7c, 0x12, 0x76, 0x27, 0x1f, 0xb7, 0x4f, 0xaf, 0xda, - 0xfc, 0xfd, 0x0b, 0x29, 0xa7, 0xc6, 0x13, 0xbb, 0xf6, 0x6b, 0x32, 0x65, - 0x96, 0x66, 0xd5, 0x4d, 0x1e, 0x86, 0xcb, 0x91, 0xf2, 0x32, 0x31, 0x08, - 0xaf, 0xda, 0x03, 0xb8, 0x15, 0x15, 0x92, 0xff, 0xcf, 0x26, 0x79, 0xa0, - 0x3b, 0x81, 0x51, 0x37, 0x2c, 0xcf, 0x11, 0x00, 0xd3, 0x4a, 0x02, 0x61, - 0x27, 0x0d, 0xfb, 0xe0, 0x3b, 0x81, 0x51, 0x2b, 0x2f, 0xff, 0xb5, 0xb1, - 0x46, 0x9c, 0x64, 0xfa, 0x8d, 0xeb, 0x2b, 0x47, 0xfc, 0x12, 0xeb, 0xf1, - 0x40, 0xdf, 0xcb, 0x2f, 0xf4, 0x19, 0x44, 0xa3, 0x75, 0x65, 0xf3, 0x5e, - 0x4c, 0xf0, 0xfe, 0xcc, 0x8b, 0x84, 0xd7, 0xe6, 0x6f, 0x37, 0x31, 0x65, - 0xf9, 0x9e, 0x4a, 0x3f, 0x59, 0x4c, 0xd1, 0x35, 0xb2, 0x34, 0x8a, 0xaf, - 0xfd, 0xdc, 0x67, 0x9a, 0x3d, 0x9d, 0xab, 0x2f, 0xff, 0x4f, 0x4c, 0x86, - 0x4f, 0x31, 0xe4, 0x79, 0xac, 0x59, 0x7f, 0xe3, 0xe0, 0x5a, 0x47, 0xbc, - 0x2e, 0xb2, 0xff, 0xfb, 0xd1, 0x23, 0xff, 0x59, 0xe7, 0x27, 0x92, 0xcb, - 0xfa, 0x09, 0xc0, 0xfb, 0x8b, 0x2f, 0xfa, 0x01, 0x1a, 0x3e, 0xc0, 0x16, - 0x54, 0x91, 0xe5, 0xf1, 0xfb, 0x53, 0xba, 0x5d, 0x70, 0xf4, 0xb2, 0xfd, - 0xa0, 0x3b, 0x81, 0x51, 0x2e, 0x2f, 0xf3, 0xcb, 0xa5, 0x0d, 0xe2, 0xcb, - 0xff, 0x8f, 0x81, 0x63, 0x98, 0xd3, 0xf4, 0x2c, 0xa3, 0x3f, 0x67, 0x32, - 0xbf, 0x4a, 0x7c, 0xfc, 0xeb, 0x2f, 0x44, 0xfc, 0x2c, 0xbf, 0xff, 0xb0, - 0x20, 0xf4, 0x14, 0x49, 0xc7, 0x1f, 0x68, 0xd6, 0x5f, 0xfb, 0x86, 0x41, - 0xec, 0xf9, 0xef, 0x6a, 0xcb, 0xc6, 0x50, 0xb2, 0xa4, 0x8f, 0xe1, 0x95, - 0x6e, 0x0f, 0x35, 0x67, 0x7a, 0x1d, 0xff, 0xc4, 0x19, 0x79, 0xe5, 0x9f, - 0x4a, 0x16, 0x5f, 0xfc, 0x19, 0x11, 0xca, 0x3a, 0x41, 0x92, 0xcb, 0xf4, - 0x73, 0xf6, 0xf5, 0x65, 0x19, 0xf6, 0x79, 0x0e, 0xb8, 0x8d, 0x1e, 0xc2, - 0xc2, 0xc0, 0x59, 0x4e, 0x6e, 0x7f, 0x28, 0xbf, 0xa5, 0xec, 0x2c, 0x02, - 0xcb, 0xd2, 0xf7, 0x56, 0x5d, 0xe8, 0x33, 0xc9, 0xf1, 0x65, 0xff, 0xc4, - 0x7f, 0xf3, 0x50, 0x72, 0x7e, 0x2c, 0xb8, 0xf8, 0xb2, 0xb1, 0x10, 0xa6, - 0x59, 0x3e, 0x87, 0x7f, 0x68, 0xda, 0x4f, 0x25, 0x97, 0xfe, 0xfa, 0x59, - 0xdc, 0xd0, 0x23, 0x16, 0x5e, 0x79, 0x33, 0x9e, 0x2b, 0xc8, 0xf1, 0x1a, - 0x3c, 0x8f, 0xb0, 0x5f, 0xd0, 0xaa, 0x78, 0xc7, 0xb9, 0x1a, 0xcf, 0x61, - 0xde, 0x13, 0x1d, 0xd2, 0xcb, 0xff, 0x05, 0xac, 0xf9, 0x05, 0xdc, 0xd2, - 0xcb, 0xfe, 0x1e, 0x33, 0x8d, 0x1f, 0x82, 0xb2, 0xff, 0xe1, 0xc3, 0x3d, - 0xdc, 0xfa, 0x5e, 0x8e, 0x2c, 0xb3, 0x33, 0x64, 0x07, 0x36, 0x7a, 0x1f, - 0x90, 0xc3, 0x0a, 0x06, 0xf3, 0xab, 0xff, 0x99, 0xbc, 0x99, 0xe6, 0x80, - 0xee, 0x05, 0x44, 0x76, 0xbf, 0xfe, 0x0c, 0x7d, 0x23, 0x68, 0xb8, 0x43, - 0xf4, 0x2c, 0xbf, 0x37, 0xee, 0x98, 0xab, 0x2e, 0xd9, 0x98, 0xcf, 0xe8, - 0x45, 0x0b, 0xfd, 0xec, 0x93, 0x37, 0x2e, 0x2c, 0xac, 0x3e, 0x6e, 0x99, - 0x5f, 0xf3, 0x26, 0x7f, 0x18, 0x3e, 0x94, 0x2c, 0xbf, 0xa7, 0xb2, 0x80, - 0x61, 0x2c, 0xb8, 0x3e, 0x59, 0x7f, 0x32, 0x4b, 0x3c, 0xfd, 0x59, 0x7d, - 0x8d, 0xd4, 0x2c, 0xbf, 0x61, 0x1f, 0xe2, 0x2c, 0xa2, 0x3c, 0x9e, 0x10, - 0xde, 0xcd, 0x42, 0xcb, 0xff, 0xf4, 0x8c, 0x7e, 0x3d, 0xf3, 0xb0, 0x7a, - 0x30, 0x81, 0x65, 0xf4, 0x6a, 0x34, 0xb2, 0x8d, 0x16, 0xda, 0x21, 0xe8, - 0xd8, 0x8b, 0x37, 0xa6, 0x8d, 0x96, 0x5f, 0x41, 0x77, 0x8b, 0x2e, 0xc1, - 0x60, 0xdf, 0xf0, 0x7a, 0xff, 0xec, 0xe7, 0x73, 0xd0, 0x5d, 0xf1, 0xac, - 0xba, 0x7a, 0xe2, 0xcb, 0xfb, 0xf2, 0xcf, 0xbb, 0x8b, 0x2e, 0xdb, 0x71, - 0x65, 0xf9, 0xd8, 0xf6, 0x7e, 0xb2, 0xfe, 0x2f, 0xdf, 0x4e, 0x22, 0xca, - 0x9e, 0x51, 0x79, 0x03, 0x9b, 0x17, 0x68, 0x6d, 0xca, 0x6f, 0xff, 0xfe, - 0xf3, 0x8c, 0x9e, 0x77, 0x3d, 0x1c, 0x9c, 0x17, 0x9d, 0x2c, 0xdf, 0x0b, - 0x2f, 0x98, 0x2c, 0x92, 0xcb, 0xbd, 0x1e, 0x44, 0xd1, 0x3c, 0x5f, 0xb5, - 0xa8, 0xdf, 0xc5, 0x97, 0xfe, 0x3d, 0x4e, 0xe1, 0x63, 0x60, 0x0b, 0x2f, - 0xf0, 0x7a, 0x6f, 0xbd, 0xe4, 0xb2, 0xfe, 0x7d, 0xe3, 0xc2, 0x61, 0x65, - 0xa0, 0x8f, 0x8c, 0x43, 0x4b, 0xff, 0xff, 0xbf, 0x82, 0x03, 0xf5, 0xfe, - 0xfe, 0x76, 0x11, 0xc0, 0x7d, 0xe8, 0x59, 0x7f, 0xe2, 0x0c, 0xa7, 0x61, - 0x94, 0x35, 0x65, 0xfd, 0xc9, 0x18, 0x1f, 0x4b, 0x2f, 0x3b, 0x81, 0x51, - 0x50, 0xaf, 0xd8, 0x1e, 0x85, 0xab, 0x2a, 0x0f, 0xf4, 0x05, 0xba, 0x28, - 0xbf, 0xa2, 0x69, 0x07, 0xe9, 0x2c, 0xbf, 0xf1, 0xff, 0xc9, 0xdc, 0xfd, - 0xf2, 0x65, 0x97, 0xf0, 0x40, 0x6c, 0x38, 0x16, 0x5f, 0xf6, 0x7b, 0x09, - 0xf5, 0xa3, 0x59, 0x52, 0x56, 0xa7, 0x85, 0xac, 0x15, 0x02, 0x14, 0x5f, - 0x13, 0x9b, 0x9e, 0xa1, 0x76, 0xd2, 0xef, 0x18, 0x12, 0x1f, 0x0b, 0xaf, - 0x6e, 0x3c, 0x2c, 0xb6, 0x2c, 0xbf, 0xfe, 0x36, 0xc0, 0x27, 0x03, 0xc7, - 0xbb, 0x0d, 0x85, 0x97, 0xff, 0x05, 0xf6, 0xe6, 0x18, 0x01, 0x9b, 0xd6, - 0x54, 0x91, 0x53, 0xe1, 0x02, 0x53, 0xbf, 0xe9, 0x74, 0xf4, 0xe0, 0x32, - 0x59, 0x7b, 0xfe, 0x62, 0xcb, 0xfd, 0xc0, 0xcc, 0xe3, 0x79, 0x96, 0x5f, - 0xff, 0xdc, 0x15, 0xf7, 0x78, 0x7a, 0x9b, 0x90, 0xd7, 0xfb, 0xab, 0x2f, - 0x68, 0xfe, 0x59, 0x52, 0x46, 0x87, 0xc3, 0xb3, 0x1a, 0xf5, 0x86, 0xfd, - 0x22, 0x86, 0xb0, 0xb2, 0xff, 0xe6, 0xe6, 0x8b, 0x0f, 0x79, 0xe9, 0xd6, - 0x57, 0xc7, 0xd6, 0xe5, 0x17, 0xff, 0xe3, 0xd4, 0xec, 0xe8, 0x63, 0x36, - 0xf6, 0x1c, 0x96, 0x5f, 0xf8, 0xb2, 0x6e, 0xfb, 0x34, 0x7c, 0x59, 0x7f, - 0xf3, 0xb6, 0x73, 0x5f, 0xb3, 0xbd, 0xdd, 0x2c, 0xaf, 0x22, 0x1c, 0x8f, - 0xaf, 0xdf, 0x11, 0xb4, 0xd6, 0x5f, 0xa2, 0x7b, 0xdb, 0x05, 0x59, 0x7d, - 0x3e, 0x1d, 0xd8, 0x59, 0x50, 0x9c, 0xf0, 0xc8, 0xb2, 0x1b, 0xa6, 0x45, - 0xa2, 0x70, 0x97, 0x5f, 0xdd, 0x7f, 0x4e, 0x1c, 0x2c, 0xbf, 0xee, 0xf0, - 0x4e, 0x3f, 0xd2, 0xc5, 0x97, 0xf9, 0xe5, 0x3b, 0x81, 0xfd, 0xd6, 0x5f, - 0x47, 0xa3, 0x65, 0x96, 0x31, 0x9e, 0xc7, 0x8d, 0xaa, 0x11, 0xd3, 0x85, - 0xe1, 0x84, 0x9d, 0xfb, 0x87, 0xec, 0x1a, 0xcb, 0xf4, 0xa3, 0xb9, 0xb2, - 0xca, 0xdc, 0x3c, 0xfd, 0x13, 0xde, 0xfb, 0xb8, 0xb2, 0xfe, 0xe1, 0x90, - 0x3d, 0x0b, 0x2b, 0x0f, 0xbb, 0x44, 0xbd, 0x1d, 0xbf, 0xf6, 0x77, 0x9a, - 0xc9, 0xbc, 0x6c, 0x2c, 0xbf, 0xff, 0x8f, 0x9f, 0xe4, 0x8a, 0x3f, 0x7f, - 0x7d, 0x2c, 0xea, 0xcb, 0xfe, 0xc6, 0x31, 0xa7, 0x3f, 0x0d, 0x59, 0x5a, - 0x44, 0xb9, 0x2e, 0x5f, 0xf4, 0xe7, 0x2c, 0xdd, 0x9d, 0xe0, 0xac, 0xbf, - 0x0a, 0x7a, 0xc6, 0x16, 0x54, 0x27, 0x1e, 0x65, 0xcf, 0x0d, 0x70, 0x91, - 0x08, 0x7f, 0x7f, 0xdd, 0x3e, 0x18, 0x59, 0x63, 0x85, 0x97, 0x47, 0xcb, - 0x2f, 0xe8, 0xee, 0x13, 0xee, 0x2c, 0xa3, 0x44, 0x0e, 0x8f, 0x3f, 0x17, - 0xbf, 0xa3, 0x5b, 0x46, 0xb6, 0x59, 0x7c, 0x1d, 0xa2, 0x4b, 0x2a, 0x47, - 0xa5, 0xc2, 0xfb, 0xff, 0x73, 0x0b, 0xbc, 0xc9, 0x1f, 0x96, 0x5f, 0xdc, - 0xcd, 0xe5, 0x1f, 0x2c, 0xb8, 0x3e, 0x59, 0x5c, 0x44, 0x1f, 0x4f, 0x67, - 0xcb, 0xef, 0xff, 0xa3, 0xfc, 0x29, 0xcf, 0xd9, 0xde, 0xcf, 0xdd, 0x65, - 0xc5, 0xb2, 0xca, 0x84, 0xd0, 0xb2, 0x14, 0xa6, 0x66, 0x4a, 0x77, 0xfc, - 0x63, 0xc6, 0xce, 0xe3, 0xf9, 0x65, 0xff, 0xef, 0x43, 0x49, 0xd8, 0x2c, - 0xff, 0xef, 0xd6, 0x5f, 0xdb, 0xdd, 0xbe, 0x15, 0xd6, 0x5f, 0xff, 0xe3, - 0x8e, 0xbf, 0x99, 0xf3, 0xd8, 0x5d, 0x9d, 0xfc, 0xb8, 0xb2, 0xa4, 0x8e, - 0x13, 0x4c, 0x23, 0x0b, 0xdc, 0x0e, 0x96, 0x5e, 0x3f, 0x1a, 0xcb, 0xfb, - 0x4e, 0x5f, 0xff, 0x0b, 0x2a, 0x13, 0xaf, 0xc8, 0xc6, 0xcc, 0xb9, 0xc7, - 0x44, 0x1b, 0xbf, 0xe9, 0x16, 0x77, 0x9f, 0x9f, 0xcb, 0x2f, 0xd0, 0xd7, - 0xfb, 0xab, 0x2e, 0xcd, 0x96, 0x5f, 0xfc, 0x3e, 0x66, 0x8b, 0x3f, 0xe6, - 0x69, 0x65, 0x71, 0x10, 0x7d, 0x28, 0x08, 0xbd, 0xfb, 0x00, 0x17, 0xd9, - 0x65, 0x78, 0xf6, 0x08, 0xc2, 0xff, 0xfb, 0x44, 0x1f, 0x8b, 0x0f, 0x40, - 0xf4, 0x71, 0x65, 0xff, 0xfc, 0x07, 0xf6, 0x4a, 0x35, 0x1f, 0xea, 0x04, - 0x72, 0x59, 0x50, 0x8a, 0x9c, 0x4f, 0xbf, 0x66, 0xce, 0x5b, 0xd6, 0x5f, - 0xff, 0xff, 0xe8, 0x94, 0xee, 0xf8, 0xe3, 0x93, 0xb0, 0x20, 0x8d, 0xf3, - 0xb3, 0x5a, 0xcd, 0xe1, 0x7f, 0x2c, 0xbe, 0xf1, 0x3e, 0xea, 0xca, 0x85, - 0x5c, 0x99, 0x18, 0xaf, 0xa1, 0x94, 0x44, 0x3c, 0x29, 0xec, 0x25, 0xef, - 0xf3, 0xfd, 0xc3, 0x6c, 0x01, 0x65, 0xf6, 0xcf, 0x1a, 0x59, 0x78, 0x49, - 0xf7, 0x59, 0x7f, 0xff, 0x6e, 0x1e, 0xde, 0x73, 0xec, 0x78, 0xfb, 0xcc, - 0x1a, 0xca, 0xf1, 0xfe, 0xb9, 0x05, 0x3a, 0x30, 0x03, 0x09, 0xfb, 0xff, - 0x6f, 0x79, 0x61, 0x0c, 0xa2, 0x4b, 0x2e, 0xda, 0x16, 0x58, 0xb0, 0xf5, - 0x42, 0x7d, 0x7f, 0xe7, 0x7f, 0x1f, 0x38, 0x17, 0xfd, 0x65, 0x99, 0xcf, - 0x4d, 0xd1, 0x63, 0x24, 0xfe, 0x79, 0x30, 0x9e, 0xc5, 0xe2, 0x32, 0xfd, - 0x9f, 0x24, 0x58, 0x38, 0x7f, 0x64, 0xe1, 0xdb, 0x10, 0xa3, 0x04, 0x31, - 0xfe, 0x2f, 0x38, 0xc1, 0xf5, 0x29, 0x21, 0xb1, 0xa1, 0xfa, 0x53, 0xfb, - 0xc3, 0x3c, 0xa3, 0xc4, 0xe4, 0x7d, 0xdd, 0x96, 0x64, 0x16, 0x69, 0xf8, - 0x79, 0x88, 0xf9, 0xba, 0x4d, 0x7c, 0x07, 0x70, 0x2a, 0x2a, 0x85, 0xfe, - 0xd4, 0x6f, 0xfa, 0x59, 0xd5, 0x95, 0xa3, 0xe4, 0x09, 0x75, 0xfe, 0x62, - 0x3b, 0xcd, 0xf8, 0x35, 0x97, 0xfe, 0x79, 0x33, 0xcd, 0x01, 0xdc, 0x0a, - 0x89, 0xad, 0x7f, 0xde, 0x86, 0xf3, 0x8e, 0x40, 0x59, 0x7d, 0x1a, 0x8e, - 0xac, 0xb9, 0xfa, 0xb2, 0x86, 0x6d, 0xda, 0x43, 0x66, 0x78, 0x99, 0xa3, - 0x04, 0x4d, 0x36, 0xf2, 0x63, 0xb7, 0xdf, 0xff, 0x6e, 0x18, 0xf1, 0xb3, - 0xbb, 0x9b, 0x87, 0xbf, 0x8b, 0x2f, 0xda, 0x03, 0xb8, 0x15, 0x15, 0x62, - 0xf6, 0xa1, 0xab, 0x2f, 0xfa, 0x25, 0x1a, 0xda, 0x35, 0xb2, 0xcb, 0x33, - 0x84, 0x71, 0xe2, 0xce, 0x8d, 0x08, 0x72, 0xf8, 0xb0, 0x2c, 0xb5, 0x97, - 0xf7, 0xdd, 0x8f, 0x3e, 0xe2, 0xcb, 0xf3, 0xfb, 0x35, 0x8b, 0x2a, 0x0f, - 0x5d, 0xcc, 0x6f, 0xed, 0x06, 0x6e, 0x47, 0x56, 0x54, 0x23, 0x2f, 0xcf, - 0x81, 0x20, 0xbf, 0xfb, 0xfc, 0x26, 0x72, 0xff, 0x9b, 0x39, 0x2c, 0xa6, - 0x67, 0xef, 0x05, 0xf7, 0xf1, 0xb4, 0xfb, 0xe8, 0x59, 0x7d, 0x13, 0x47, - 0xcb, 0x2b, 0xc7, 0x9f, 0xc2, 0xcb, 0xfe, 0x93, 0x3c, 0xd0, 0x1d, 0xc0, - 0xa8, 0x91, 0x17, 0xf6, 0xd1, 0xaf, 0x39, 0xac, 0xb3, 0x3c, 0x44, 0xb3, - 0x91, 0x71, 0x1e, 0xfd, 0xa0, 0x3b, 0x81, 0x51, 0x69, 0x2f, 0xfc, 0xf2, - 0x67, 0x9a, 0x03, 0xb8, 0x15, 0x13, 0xea, 0xcc, 0xf1, 0x10, 0x0d, 0x34, - 0xbf, 0xfc, 0xcd, 0xaf, 0x26, 0x79, 0xa0, 0x3b, 0x81, 0x51, 0x42, 0x2f, - 0xfe, 0xc1, 0x59, 0xf5, 0x87, 0xe1, 0xf6, 0x16, 0x5f, 0xba, 0x10, 0x3f, - 0x16, 0x5f, 0x1e, 0xd1, 0xa5, 0x94, 0xd3, 0xca, 0xf1, 0x45, 0xfb, 0x40, - 0x77, 0x02, 0xa2, 0x8f, 0x5f, 0xf4, 0x4a, 0x35, 0xb4, 0x6b, 0x65, 0x97, - 0xff, 0xff, 0xf8, 0x43, 0xd4, 0xd1, 0xed, 0x67, 0x9c, 0x4e, 0x63, 0x0e, - 0x5f, 0xc1, 0x44, 0xde, 0x85, 0x97, 0xe7, 0xe1, 0xf6, 0x16, 0x5f, 0xf4, - 0x4d, 0x05, 0x13, 0x7a, 0x16, 0x54, 0x23, 0xb9, 0x88, 0x48, 0x11, 0x35, - 0xff, 0xfd, 0x83, 0xf4, 0x08, 0xcf, 0xa4, 0xff, 0xf3, 0x91, 0xfa, 0x4b, - 0xcf, 0x26, 0x70, 0xa8, 0x47, 0x08, 0x88, 0xd3, 0xb1, 0x94, 0x4f, 0x9a, - 0x5f, 0xfd, 0x9e, 0x67, 0xd6, 0x1f, 0x87, 0xd8, 0x59, 0x66, 0x7b, 0x2b, - 0x4d, 0x6c, 0xaa, 0x2e, 0xb2, 0xd4, 0x3b, 0x00, 0x2d, 0xa9, 0x08, 0x32, - 0x64, 0xc8, 0xcd, 0x18, 0xae, 0x93, 0x41, 0x2d, 0x4b, 0xe8, 0xcd, 0x4e, - 0x38, 0x49, 0xa3, 0x08, 0xf4, 0x2d, 0xbf, 0x2a, 0xec, 0xba, 0x7b, 0xff, - 0xe1, 0x41, 0x3d, 0x32, 0x7f, 0x65, 0xea, 0x79, 0x9d, 0x3b, 0xd3, 0xeb, - 0x2f, 0xff, 0xfd, 0xbb, 0xd9, 0xec, 0x6d, 0x9e, 0xc8, 0xd9, 0x57, 0x59, - 0x7a, 0x9e, 0x67, 0x4e, 0xf4, 0xfa, 0xca, 0xf2, 0x60, 0x02, 0xb7, 0x5f, - 0xfd, 0xe8, 0x3d, 0x1b, 0x2c, 0x1e, 0x81, 0x56, 0x5f, 0xfb, 0x8c, 0xb3, - 0x62, 0x74, 0xef, 0x4f, 0xb3, 0x83, 0xed, 0x01, 0x2d, 0xfb, 0x40, 0x77, - 0x02, 0xa2, 0x22, 0x5f, 0xee, 0x06, 0x26, 0xe9, 0xef, 0x59, 0x66, 0x78, - 0x7d, 0x53, 0x1a, 0x5f, 0xd9, 0xa0, 0x3b, 0x81, 0x51, 0x15, 0xaf, 0xfb, - 0x71, 0x9e, 0x68, 0x0e, 0xe0, 0x54, 0x57, 0x0a, 0x66, 0x88, 0x37, 0x39, - 0xbe, 0xf3, 0xe8, 0xd6, 0x5f, 0xbb, 0xf8, 0x85, 0x25, 0x97, 0xef, 0xe0, - 0x80, 0xce, 0x0f, 0x2d, 0xc8, 0x6f, 0x99, 0xed, 0x36, 0xe2, 0xcb, 0x1f, - 0xc7, 0xd3, 0xf9, 0xfd, 0xfe, 0x64, 0xcf, 0x45, 0x00, 0x7f, 0x96, 0x5f, - 0x67, 0x9f, 0xab, 0x2f, 0xf6, 0x1e, 0xbf, 0xfc, 0x3c, 0x59, 0x66, 0x49, - 0x1e, 0xb7, 0x08, 0x6f, 0xed, 0x47, 0x5c, 0xb1, 0x65, 0xff, 0xfb, 0x87, - 0xe7, 0x39, 0x19, 0x74, 0x3e, 0xd6, 0x2c, 0xa3, 0x3f, 0xee, 0x95, 0xdf, - 0xd1, 0xff, 0x3a, 0x50, 0xb2, 0xf8, 0x0e, 0xe0, 0x54, 0x53, 0xcb, 0xff, - 0x14, 0x6f, 0x3e, 0xca, 0x30, 0x96, 0x56, 0x8f, 0xaf, 0xa5, 0xd7, 0xf8, - 0x7f, 0xce, 0x8d, 0xc8, 0x92, 0xcb, 0xfc, 0xd3, 0x18, 0x5f, 0x52, 0x59, - 0x73, 0x4d, 0x65, 0x41, 0xe4, 0x80, 0xce, 0xff, 0xfe, 0x8e, 0xf0, 0x2d, - 0x01, 0xff, 0x19, 0xe3, 0x08, 0x16, 0x5f, 0xd0, 0xde, 0x41, 0xec, 0xb2, - 0xa4, 0x88, 0x8e, 0xad, 0xdf, 0xff, 0xcf, 0xa7, 0xf7, 0xd2, 0xce, 0xe1, - 0x07, 0xa1, 0x61, 0x65, 0xf4, 0xa3, 0x36, 0x59, 0x7f, 0xfe, 0xd0, 0x75, - 0xa8, 0x2c, 0x60, 0xfd, 0xec, 0x11, 0x65, 0xed, 0x1f, 0xcb, 0x28, 0x08, - 0xf1, 0xf9, 0x73, 0x44, 0x5d, 0x56, 0xbc, 0x65, 0xd5, 0x97, 0xff, 0x3c, - 0x99, 0xb8, 0xf2, 0x5e, 0x80, 0x2c, 0xbf, 0xf1, 0xe9, 0xf6, 0x18, 0x5f, - 0x52, 0x59, 0x7f, 0xd8, 0x5f, 0xc3, 0x4f, 0x52, 0x59, 0x7f, 0x8f, 0x86, - 0x16, 0x58, 0xe1, 0x65, 0x48, 0xfb, 0xba, 0x71, 0x67, 0x59, 0x7f, 0xfc, - 0xdc, 0x3e, 0x87, 0xb1, 0x23, 0x1e, 0x0d, 0x65, 0x1a, 0x20, 0x3c, 0x45, - 0xf8, 0x85, 0xfd, 0x1a, 0xda, 0x35, 0xb2, 0xcb, 0xfa, 0x36, 0x71, 0xbf, - 0x56, 0x54, 0x8f, 0x73, 0x74, 0xbe, 0xfa, 0x71, 0x3c, 0x96, 0x5f, 0x9f, - 0x3c, 0x6d, 0x59, 0x5c, 0x3c, 0x9d, 0xe4, 0x75, 0x08, 0x92, 0xc6, 0xeb, - 0xfe, 0xde, 0xed, 0x9c, 0x3f, 0x1b, 0x56, 0x5f, 0xf1, 0x43, 0x62, 0x45, - 0x8d, 0x59, 0x7f, 0xf9, 0xb1, 0xad, 0xa3, 0xec, 0x0b, 0x2f, 0x06, 0xb2, - 0xb1, 0x18, 0x46, 0x7a, 0xe6, 0xd7, 0xe0, 0x61, 0x94, 0xcb, 0x2f, 0xf1, - 0x03, 0x37, 0xe7, 0x78, 0xb2, 0xe7, 0x61, 0x65, 0x41, 0xe5, 0xe8, 0xd2, - 0xfc, 0xfb, 0x46, 0x82, 0xb2, 0xa7, 0x96, 0x48, 0x4c, 0xf7, 0x09, 0x28, - 0x85, 0x4c, 0x88, 0x72, 0x13, 0x0c, 0x11, 0x02, 0x10, 0x5f, 0x42, 0xa4, - 0xe3, 0x14, 0x98, 0xf9, 0xa3, 0x7e, 0x45, 0x78, 0xcb, 0x4a, 0x31, 0xee, - 0x43, 0x8f, 0xa5, 0xbb, 0xdc, 0xa7, 0xc8, 0x6f, 0xff, 0x3c, 0x99, 0x8c, - 0x9c, 0x5e, 0x72, 0x3f, 0x59, 0x7f, 0xfb, 0xff, 0xc3, 0xc6, 0x62, 0x13, - 0xb4, 0xa1, 0x65, 0xff, 0xc5, 0x9f, 0xb9, 0x7e, 0xcd, 0xa6, 0xd5, 0x95, - 0xa4, 0x4a, 0x75, 0x3a, 0xfc, 0xfe, 0xf1, 0xcc, 0xb2, 0xff, 0xec, 0xe1, - 0x97, 0xe5, 0x9d, 0xf6, 0x2c, 0xbf, 0xf1, 0x97, 0xe5, 0x9d, 0xf6, 0x33, - 0xf1, 0xf5, 0x08, 0x51, 0x4c, 0xd5, 0x7c, 0x8e, 0x33, 0x43, 0x87, 0x0f, - 0x21, 0x1b, 0x6c, 0x59, 0x7e, 0x28, 0x0b, 0x2f, 0x8b, 0x2f, 0xe6, 0x34, - 0xe3, 0x72, 0x59, 0x43, 0x3e, 0x8c, 0x10, 0x72, 0xbb, 0xff, 0x8c, 0x7a, - 0x7f, 0x99, 0xeb, 0x51, 0xb2, 0xca, 0x66, 0x7e, 0xbe, 0x2d, 0xb4, 0x2c, - 0xbf, 0xb9, 0x00, 0x28, 0x1a, 0xca, 0x19, 0xbc, 0x31, 0x0b, 0xff, 0xf7, - 0xa3, 0x59, 0x23, 0x7e, 0xe0, 0xcc, 0x20, 0x49, 0x7e, 0x89, 0x7e, 0x19, - 0x2c, 0xbe, 0x03, 0xb8, 0x15, 0x15, 0x9a, 0xa6, 0x3d, 0x7d, 0x14, 0xdf, - 0x74, 0xdb, 0xc5, 0x97, 0x71, 0x85, 0x97, 0xb8, 0x10, 0x2c, 0xa6, 0x0d, - 0xaf, 0x06, 0x2f, 0xb9, 0xa8, 0xde, 0xb2, 0xfe, 0xde, 0x45, 0x1b, 0x93, - 0x2c, 0xbf, 0x36, 0x0a, 0x5c, 0x59, 0x50, 0x7b, 0x3b, 0x19, 0x5f, 0x77, - 0x82, 0x71, 0x65, 0xf7, 0x39, 0x02, 0xac, 0xb3, 0xac, 0xac, 0x3d, 0x73, - 0x24, 0xe1, 0x1d, 0xdb, 0x1a, 0xcb, 0xfd, 0xc9, 0x8c, 0xbd, 0x9f, 0x2c, - 0xa8, 0x3c, 0xbc, 0x17, 0xb9, 0xfa, 0xb2, 0xfb, 0xf1, 0x0a, 0x4b, 0x28, - 0x66, 0xeb, 0xa2, 0xd7, 0xff, 0xd0, 0xde, 0xe6, 0x17, 0x79, 0xec, 0xfd, - 0xd6, 0x5f, 0xe6, 0xc7, 0xdc, 0xd4, 0x6f, 0x59, 0x73, 0xf1, 0x65, 0x41, - 0xe6, 0x04, 0xda, 0xff, 0x48, 0xc3, 0xb9, 0x3c, 0xfe, 0xd5, 0x97, 0xe2, - 0x8f, 0x1e, 0x2c, 0xac, 0x3e, 0x27, 0x3d, 0xb1, 0xac, 0xbf, 0xbd, 0x84, - 0x4f, 0xd5, 0x9c, 0x2c, 0x2f, 0xc5, 0xdf, 0x46, 0xf5, 0x97, 0x9d, 0xda, - 0xb2, 0xfd, 0x93, 0x6c, 0x1f, 0xd6, 0x5f, 0xdd, 0x8d, 0x7f, 0x13, 0x2c, - 0xb3, 0x38, 0x5d, 0x74, 0x19, 0x06, 0x42, 0xab, 0xe2, 0x33, 0x57, 0x98, - 0x8b, 0x4f, 0xad, 0x79, 0xf3, 0xc3, 0xad, 0x7e, 0x42, 0x50, 0x9a, 0xe4, - 0x20, 0xfa, 0x60, 0x13, 0xad, 0xe5, 0x22, 0x0d, 0xee, 0x95, 0xdf, 0xf1, - 0xf5, 0xf5, 0xb4, 0x18, 0xd6, 0x5f, 0xd0, 0xdd, 0x83, 0xa9, 0x2c, 0xaf, - 0x1f, 0x3f, 0x4e, 0x2f, 0xf6, 0xde, 0xc0, 0x7a, 0x34, 0xb2, 0xff, 0xa0, - 0xa5, 0xc6, 0xb9, 0x30, 0xb2, 0xa0, 0xfb, 0x3a, 0x69, 0x74, 0x0d, 0x65, - 0xff, 0x05, 0xb8, 0x0d, 0x7c, 0xe2, 0xac, 0xa9, 0x1f, 0x97, 0x08, 0x7a, - 0x2d, 0x7f, 0xb5, 0x0c, 0x61, 0x1b, 0x0b, 0x2f, 0xff, 0xd8, 0x3f, 0x47, - 0x27, 0x61, 0xe8, 0xdb, 0x0c, 0x2c, 0xbf, 0xfd, 0x02, 0x88, 0xd2, 0xcf, - 0xbb, 0x18, 0x2a, 0xcb, 0xf7, 0x4c, 0xb1, 0xab, 0x2f, 0xa4, 0xe4, 0xcf, - 0x15, 0x15, 0x7d, 0x18, 0x06, 0x8b, 0xc8, 0xcc, 0x45, 0x6d, 0xd4, 0xcb, - 0xff, 0x3c, 0x99, 0xe6, 0x80, 0xee, 0x05, 0x44, 0x8a, 0xbf, 0xff, 0x77, - 0xd8, 0x4c, 0xfa, 0xef, 0xf7, 0x18, 0x61, 0xd6, 0x5f, 0xf9, 0xfa, 0xce, - 0x0f, 0x47, 0xd0, 0xac, 0xa6, 0x68, 0xe4, 0x84, 0xc7, 0x59, 0xbf, 0xed, - 0x68, 0xc5, 0xc9, 0x8d, 0xab, 0x2f, 0x81, 0x1e, 0x85, 0x94, 0x67, 0xb6, - 0x47, 0x57, 0xed, 0x01, 0xdc, 0x0a, 0x8b, 0x25, 0x50, 0x7a, 0x98, 0x41, - 0x7e, 0xd8, 0xca, 0x5c, 0x59, 0x7f, 0x83, 0xb7, 0xa3, 0xbc, 0x35, 0x97, - 0xf0, 0x46, 0x7a, 0x7e, 0x2c, 0xb8, 0xfa, 0xb2, 0xfd, 0xde, 0x09, 0xc6, - 0x78, 0x89, 0xfd, 0x14, 0x70, 0xd3, 0xa5, 0xb4, 0xcd, 0x31, 0xcc, 0x85, - 0xfd, 0xf6, 0x0b, 0xcf, 0x2c, 0xbf, 0xdb, 0xa6, 0xd8, 0xf0, 0x83, 0x59, - 0x7f, 0x78, 0xf5, 0x12, 0xe2, 0xcb, 0xf9, 0xbd, 0x3f, 0x3b, 0x56, 0x5f, - 0xfe, 0x3e, 0xfb, 0x3b, 0x85, 0x1d, 0x81, 0xac, 0xa8, 0x3f, 0x47, 0x2d, - 0xbf, 0xe7, 0x3e, 0x87, 0x4f, 0xc6, 0x7b, 0x26, 0x37, 0x84, 0x60, 0x37, - 0xf4, 0x28, 0x6f, 0xff, 0xf7, 0x5f, 0xef, 0xd9, 0x8c, 0xa3, 0xe9, 0x74, - 0xcb, 0xfe, 0x2c, 0xbf, 0xb3, 0x40, 0x77, 0x02, 0xa2, 0xd8, 0x5f, 0xff, - 0xbd, 0x38, 0xb3, 0x5d, 0xe7, 0xa6, 0x9d, 0x3b, 0xd3, 0xeb, 0x2f, 0xde, - 0x7d, 0x1b, 0x56, 0x53, 0x25, 0x11, 0x00, 0x61, 0xbd, 0xa0, 0xf9, 0x65, - 0xdd, 0x67, 0x07, 0x89, 0xa2, 0x7a, 0x66, 0x99, 0xa1, 0xc6, 0x0b, 0x7b, - 0x39, 0x8b, 0x2f, 0x80, 0xee, 0x05, 0x45, 0xb6, 0xb9, 0xf4, 0xb2, 0xd2, - 0x59, 0x6e, 0x6c, 0x69, 0xc2, 0x2d, 0x5a, 0x3f, 0xde, 0xaa, 0xdf, 0xbd, - 0xd3, 0xfc, 0x2b, 0x2f, 0xff, 0x46, 0xdd, 0x31, 0xe1, 0x48, 0xfc, 0x15, - 0x94, 0x67, 0xe5, 0xe2, 0x9b, 0xfe, 0x89, 0x46, 0xb6, 0x8d, 0x6c, 0xb2, - 0xfa, 0x26, 0xe1, 0xac, 0xa9, 0x27, 0x53, 0x90, 0x98, 0x9a, 0x12, 0x84, - 0x43, 0xba, 0x75, 0x7f, 0xe1, 0xe8, 0xc3, 0xb3, 0x3e, 0x6b, 0xab, 0x29, - 0x9a, 0x26, 0xb1, 0x5e, 0xf7, 0xb3, 0x65, 0x97, 0xf3, 0x8f, 0x30, 0x98, - 0x59, 0x7d, 0x85, 0xfb, 0x39, 0x8f, 0x25, 0xa3, 0xb7, 0x4f, 0x64, 0xb2, - 0xf4, 0xf7, 0xe1, 0xac, 0xbd, 0xb7, 0x8d, 0x65, 0xff, 0xa7, 0xb9, 0xed, - 0x95, 0xfb, 0xec, 0x28, 0xfd, 0x65, 0xe9, 0xe3, 0x3c, 0x27, 0x8a, 0xcb, - 0xf7, 0x63, 0xcf, 0x32, 0xcb, 0xfa, 0x0a, 0x43, 0x0b, 0x56, 0x5f, 0xef, - 0x18, 0x93, 0x70, 0x3f, 0x2c, 0xbf, 0xec, 0xd6, 0xa2, 0x4f, 0xf0, 0xab, - 0x2f, 0x80, 0xee, 0x05, 0x45, 0xe0, 0xbf, 0x77, 0xe0, 0x1e, 0x96, 0x5f, - 0xf8, 0xff, 0xe4, 0xee, 0x7e, 0xf9, 0x32, 0xcb, 0xff, 0x3f, 0x63, 0x7e, - 0xb5, 0x9f, 0x71, 0x65, 0xff, 0xcf, 0xa1, 0x3a, 0x7e, 0x2c, 0xee, 0x2c, - 0xad, 0x26, 0x3c, 0xd2, 0xef, 0x14, 0x92, 0x1e, 0xf4, 0x1b, 0xf6, 0xba, - 0xca, 0xb2, 0x65, 0x97, 0x3f, 0x16, 0x5e, 0x9f, 0xcf, 0x2c, 0xaf, 0xcd, - 0xaf, 0x45, 0xaf, 0xcd, 0x82, 0x93, 0xac, 0xbf, 0xa0, 0xbb, 0xbd, 0xc0, - 0xb2, 0xfe, 0x94, 0x6f, 0x8d, 0x7c, 0xb2, 0xff, 0xfe, 0x7d, 0xa6, 0x94, - 0x6b, 0x6e, 0xcb, 0x37, 0x1c, 0xbf, 0x59, 0x52, 0x45, 0xfe, 0x17, 0x39, - 0x85, 0xf7, 0x8b, 0x26, 0x59, 0x7f, 0x75, 0xfd, 0x38, 0x70, 0xb2, 0xff, - 0x9f, 0xbc, 0x83, 0x1e, 0x35, 0x65, 0x41, 0xf3, 0x11, 0x7d, 0xf1, 0x61, - 0xb0, 0xb2, 0xff, 0x9b, 0xf4, 0xbb, 0x85, 0xde, 0x2c, 0xa6, 0x9e, 0xd8, - 0x84, 0x37, 0x63, 0x0b, 0x2f, 0xcf, 0x2e, 0x9e, 0xcb, 0x2f, 0xff, 0x1f, - 0x60, 0x80, 0x6d, 0x69, 0xf0, 0x2b, 0x2a, 0x11, 0x55, 0x84, 0x66, 0x2e, - 0xe5, 0x17, 0x63, 0x56, 0x5f, 0x8f, 0xc3, 0x3e, 0x2c, 0xb1, 0xec, 0x6f, - 0x64, 0x2d, 0x7e, 0xc2, 0xff, 0x76, 0x16, 0x5f, 0x08, 0x17, 0xe2, 0xcb, - 0xf4, 0xda, 0x3d, 0x9a, 0xb2, 0xa0, 0xf3, 0x70, 0x8e, 0xe9, 0x86, 0xb2, - 0xff, 0xe6, 0xc0, 0x27, 0x61, 0x06, 0x59, 0xc5, 0x97, 0xfb, 0xc6, 0x2b, - 0x1a, 0x71, 0x56, 0x5f, 0xff, 0xf9, 0xcf, 0xae, 0xd7, 0x2f, 0xc1, 0xe3, - 0xd4, 0x84, 0x96, 0x12, 0xcb, 0xfa, 0x3e, 0xfa, 0x4f, 0xf2, 0xca, 0x1a, - 0x65, 0xd8, 0x30, 0x04, 0x5f, 0x1b, 0x05, 0xae, 0xff, 0x39, 0x7f, 0xd9, - 0xfc, 0xf2, 0xcb, 0xfe, 0xf3, 0xc9, 0xa7, 0x1a, 0x92, 0xcb, 0x66, 0xe1, - 0xf7, 0x78, 0xda, 0xe6, 0xf1, 0x65, 0xf4, 0x14, 0xb7, 0x16, 0x5f, 0xfe, - 0xfb, 0xf7, 0x2f, 0xcb, 0x37, 0xfb, 0x06, 0xb2, 0xff, 0xe3, 0x7f, 0xfa, - 0x7c, 0xf4, 0x17, 0x56, 0x5f, 0x67, 0x45, 0x02, 0xcb, 0xa3, 0xf5, 0x95, - 0x24, 0xcb, 0xf0, 0xa9, 0x81, 0x73, 0x24, 0xf2, 0x6f, 0x10, 0xfa, 0x47, - 0x7f, 0x9f, 0xce, 0x23, 0x73, 0x8b, 0x2c, 0x05, 0x97, 0x02, 0x4b, 0x28, - 0x06, 0xa3, 0xa2, 0x34, 0xc8, 0x65, 0xbc, 0x32, 0x46, 0xe7, 0xb2, 0x29, - 0xe2, 0x3b, 0x3c, 0x14, 0x20, 0xbf, 0x62, 0x89, 0x16, 0x8c, 0xdf, 0x23, - 0x58, 0x61, 0x33, 0xe6, 0x43, 0x22, 0x9a, 0x1c, 0xba, 0x2e, 0x6c, 0x22, - 0x3d, 0x19, 0x2b, 0xbb, 0x7e, 0x4e, 0x4e, 0xfc, 0x8d, 0x3b, 0xb1, 0xf3, - 0xef, 0x64, 0x9f, 0x5b, 0xbd, 0xd8, 0x1a, 0xcb, 0xef, 0xdf, 0x5c, 0x59, - 0x77, 0xcc, 0xe0, 0xdf, 0xe0, 0xe5, 0xfe, 0xfd, 0x9c, 0xd2, 0x82, 0xea, - 0xca, 0x66, 0xa8, 0xa6, 0x23, 0xc4, 0xd1, 0x75, 0xf1, 0x0c, 0x4f, 0x96, - 0x5d, 0x9f, 0x2c, 0xbe, 0x7e, 0x07, 0x65, 0x94, 0x66, 0xeb, 0x42, 0xf7, - 0xc0, 0x77, 0x02, 0xa2, 0xf4, 0x5f, 0xf8, 0xfb, 0xe2, 0x79, 0x7e, 0xff, - 0xac, 0xad, 0x1f, 0x6b, 0x4b, 0xaf, 0xd9, 0xd2, 0x8d, 0x96, 0x5f, 0xf9, - 0xcf, 0xa1, 0xd3, 0xef, 0xc1, 0xac, 0xbc, 0x30, 0xf1, 0x65, 0xfa, 0x1a, - 0xfe, 0x85, 0x97, 0x9a, 0x7d, 0x59, 0x7f, 0xcf, 0xd9, 0x43, 0x1d, 0x3d, - 0x96, 0x56, 0x8f, 0xf1, 0xa4, 0xc4, 0x39, 0x7e, 0xc6, 0xf9, 0xc6, 0xb2, - 0xa1, 0x53, 0x08, 0xd7, 0xb2, 0x11, 0xba, 0x22, 0xf1, 0x3b, 0x9f, 0x89, - 0x09, 0x9d, 0xd2, 0xeb, 0xff, 0xb0, 0x7e, 0xc6, 0xb5, 0xe5, 0x84, 0xb2, - 0xf0, 0x63, 0xf5, 0x97, 0xdb, 0xf0, 0x99, 0x8c, 0xf7, 0xf4, 0x85, 0x7f, - 0x99, 0xf7, 0x26, 0x93, 0x8d, 0x65, 0x19, 0xf9, 0x78, 0xf2, 0x99, 0xa6, - 0xe1, 0x91, 0xa7, 0xd3, 0x28, 0xed, 0x2e, 0x22, 0x19, 0xdb, 0x42, 0xb6, - 0x50, 0xd8, 0xca, 0x61, 0x58, 0x23, 0x2d, 0x39, 0xdd, 0x49, 0xa5, 0xd1, - 0x6a, 0x35, 0xe6, 0xc7, 0xf7, 0xe8, 0xd1, 0x5d, 0xcb, 0xf8, 0xe6, 0x8a, - 0x53, 0x77, 0x1b, 0x43, 0x4d, 0xdd, 0x16, 0x70, 0x2a, 0xe0, 0xf9, 0x65, - 0xff, 0xc1, 0x89, 0x8b, 0x37, 0xbb, 0x5a, 0x6b, 0x2f, 0xb3, 0xcf, 0xd5, - 0x97, 0xfb, 0x0f, 0x5f, 0xfe, 0x1e, 0x2c, 0xb3, 0x25, 0x84, 0x4d, 0x92, - 0x2f, 0x08, 0x6f, 0xff, 0x77, 0x81, 0x8e, 0x67, 0x4d, 0xaf, 0x25, 0x97, - 0xa3, 0xed, 0x96, 0x51, 0x1f, 0x3f, 0x52, 0x6f, 0xfb, 0xbc, 0xcf, 0xa5, - 0xe0, 0xb0, 0xb2, 0xf7, 0x22, 0x65, 0x94, 0x67, 0xf4, 0x44, 0x3c, 0x3c, - 0xbc, 0x4f, 0xe5, 0x97, 0xb7, 0xc4, 0x96, 0x5e, 0xf6, 0x71, 0x65, 0xff, - 0x11, 0xb1, 0xdf, 0x80, 0x7e, 0x59, 0x50, 0x7e, 0x83, 0x1e, 0xc1, 0xcb, - 0xf9, 0xf5, 0x22, 0x0b, 0xac, 0xb8, 0xda, 0xb2, 0x82, 0x78, 0x5b, 0xa5, - 0x97, 0xcd, 0x09, 0x0d, 0x65, 0xed, 0xef, 0xf2, 0xcb, 0xce, 0xe0, 0x54, - 0x44, 0x6b, 0xe6, 0x00, 0xfa, 0x59, 0x40, 0x3c, 0xb3, 0x28, 0xbf, 0x4f, - 0x7d, 0xe3, 0xfe, 0xb2, 0xfc, 0x6e, 0xdc, 0xd2, 0xcb, 0xc0, 0x11, 0xab, - 0x2f, 0xff, 0xfa, 0x26, 0xec, 0x73, 0x51, 0xd3, 0x01, 0x8e, 0x73, 0x04, - 0xeb, 0x2a, 0x11, 0x0c, 0x43, 0xd7, 0xff, 0x1f, 0x3d, 0x8c, 0x30, 0xf3, - 0x87, 0xf2, 0xca, 0xd9, 0x3f, 0x13, 0x22, 0xd3, 0x53, 0x48, 0x7c, 0x5d, - 0xd8, 0x56, 0x6f, 0x21, 0xbf, 0xe1, 0xe9, 0xfe, 0xf6, 0x18, 0xab, 0x2f, - 0xfe, 0xe7, 0x31, 0xa5, 0x9b, 0xe7, 0x44, 0xf4, 0xb2, 0xde, 0x34, 0x43, - 0x04, 0xea, 0xff, 0x6d, 0xac, 0xef, 0x4f, 0xab, 0x29, 0x65, 0xff, 0xde, - 0xce, 0x94, 0x4d, 0x39, 0x82, 0x75, 0x97, 0x06, 0x26, 0x3d, 0x1e, 0x85, - 0xd4, 0x22, 0xcf, 0x90, 0x85, 0xbc, 0x51, 0xf2, 0xca, 0x91, 0xe1, 0x8c, - 0x9e, 0xe7, 0xf2, 0xcb, 0xfd, 0xac, 0xe6, 0x39, 0x6c, 0xb2, 0x86, 0x79, - 0x18, 0x2d, 0x70, 0xda, 0xb2, 0xfc, 0xfb, 0x08, 0x63, 0x59, 0x7f, 0xf6, - 0x0a, 0x18, 0xdb, 0xa3, 0x8e, 0xf1, 0x65, 0x62, 0x21, 0x9c, 0x5c, 0x8a, - 0x6f, 0xff, 0x48, 0xd8, 0x61, 0xf9, 0x07, 0xb3, 0xf5, 0x65, 0xff, 0xfc, - 0xe7, 0xd8, 0xf1, 0x67, 0x7c, 0x7e, 0xc3, 0x15, 0x65, 0x1a, 0x28, 0xfc, - 0x97, 0x7f, 0xff, 0xfb, 0xbd, 0x36, 0xe8, 0xf3, 0xe2, 0x0f, 0x63, 0xd3, - 0xb7, 0x9f, 0x66, 0x85, 0x97, 0xfb, 0x0c, 0x8f, 0x5a, 0xc5, 0x97, 0xfd, - 0x8e, 0x5f, 0xe8, 0x31, 0xfa, 0xca, 0x84, 0xc1, 0xf0, 0x8b, 0xe7, 0xcd, - 0x18, 0x5f, 0xff, 0x9b, 0xb8, 0x6e, 0xf3, 0x77, 0xd9, 0x2f, 0x1e, 0xf5, - 0x97, 0xf7, 0xd2, 0xd0, 0x63, 0xf5, 0x97, 0xee, 0xc6, 0xa3, 0xf5, 0x97, - 0xf3, 0x73, 0x52, 0x86, 0xac, 0xa8, 0x46, 0xfe, 0x2d, 0x19, 0x83, 0x94, - 0x5d, 0xb3, 0x52, 0x5c, 0x28, 0xa9, 0x2f, 0xfc, 0xcc, 0x1e, 0x39, 0xbd, - 0x1b, 0x33, 0xfc, 0xd8, 0x8a, 0x31, 0x7d, 0xbe, 0x3b, 0x0b, 0x2f, 0xdc, - 0xcf, 0x16, 0x2c, 0xa9, 0x22, 0x98, 0xd7, 0x7a, 0x47, 0x7e, 0x76, 0xe7, - 0xdd, 0x59, 0x7b, 0x8f, 0xb8, 0xb2, 0xb0, 0xf1, 0xcc, 0xa2, 0xf6, 0xd1, - 0xb8, 0xb2, 0xff, 0xfb, 0xc6, 0xc7, 0x0f, 0x0b, 0xf1, 0xe9, 0xc0, 0xb2, - 0xff, 0x47, 0xb2, 0x69, 0x3e, 0xcb, 0x2f, 0xfe, 0x2c, 0xfa, 0x5c, 0x19, - 0xef, 0x81, 0xac, 0xad, 0x91, 0xd4, 0x32, 0x00, 0xa8, 0x6e, 0x9a, 0x5f, - 0xe7, 0xfb, 0x8e, 0x41, 0xc5, 0x97, 0xc7, 0xa7, 0xfd, 0x65, 0x7e, 0x7a, - 0x9c, 0x32, 0xbf, 0xdf, 0xc6, 0xf7, 0xf7, 0x8d, 0x65, 0x33, 0x3d, 0x8e, - 0x91, 0xdf, 0xf7, 0x03, 0xad, 0x1c, 0x1e, 0x96, 0x56, 0x26, 0x92, 0xf0, - 0xed, 0xe9, 0x25, 0xb7, 0x16, 0x5f, 0x17, 0xd3, 0x42, 0xcb, 0xfe, 0x8c, - 0xfa, 0x1e, 0x4f, 0x25, 0x97, 0xf6, 0x7f, 0x38, 0xb3, 0xf5, 0x97, 0x34, - 0x0b, 0x28, 0x67, 0x8e, 0xe6, 0x17, 0xfe, 0xc1, 0x67, 0x38, 0xce, 0x63, - 0x85, 0x97, 0xcd, 0xef, 0xee, 0xb2, 0xf8, 0xb1, 0xf7, 0x16, 0x5f, 0xa0, - 0x51, 0x3d, 0x0b, 0x29, 0x90, 0x9c, 0x2c, 0x0a, 0x0c, 0x8f, 0x1f, 0xb4, - 0x42, 0xe8, 0x1c, 0x23, 0x10, 0x8e, 0xfc, 0x59, 0xe7, 0xea, 0xcb, 0xd3, - 0xb8, 0x05, 0x95, 0xb8, 0x78, 0xbe, 0x26, 0xbf, 0xc6, 0xff, 0xeb, 0x41, - 0xf2, 0xcb, 0xfa, 0x18, 0xc2, 0x36, 0x16, 0x5f, 0xd9, 0xdd, 0xde, 0xe7, - 0x96, 0x56, 0x22, 0xdb, 0xc4, 0xa4, 0x69, 0xc2, 0xdb, 0xff, 0xf8, 0x0c, - 0xf4, 0xe4, 0x7d, 0x67, 0xa8, 0xe9, 0x3f, 0xeb, 0x2f, 0xfe, 0xe9, 0x47, - 0xef, 0xdf, 0xc4, 0x29, 0x2c, 0xbf, 0x0c, 0xe6, 0x38, 0x59, 0x7e, 0xce, - 0xcf, 0xe7, 0x56, 0x5f, 0x78, 0xf5, 0x39, 0xcf, 0x44, 0x89, 0xea, 0x79, - 0x6c, 0xe3, 0x27, 0xb8, 0x59, 0x44, 0x63, 0x7b, 0x16, 0xca, 0x11, 0xe3, - 0x6f, 0xc9, 0x42, 0xc0, 0x87, 0x97, 0xd1, 0x8f, 0x1b, 0x54, 0xd0, 0xa7, - 0xd4, 0x7a, 0xfe, 0x8c, 0x71, 0xe3, 0x10, 0xfd, 0xd8, 0xa5, 0x29, 0xf2, - 0x3b, 0x9e, 0xc6, 0xdf, 0xbc, 0xec, 0x45, 0xed, 0xd8, 0x4b, 0xde, 0x13, - 0xde, 0x59, 0x76, 0xef, 0x96, 0x5f, 0xb4, 0x07, 0x70, 0x2a, 0x22, 0xe5, - 0xfb, 0xbf, 0x88, 0x52, 0x49, 0x7e, 0xe7, 0x7d, 0x1f, 0xac, 0xbf, 0x3e, - 0xd1, 0xa0, 0xac, 0xb3, 0x38, 0x47, 0x3e, 0xc3, 0xd8, 0x34, 0xe6, 0x81, - 0x2a, 0x9f, 0x29, 0xa6, 0x6a, 0xb1, 0xa5, 0x29, 0x9a, 0xff, 0xe6, 0xbc, - 0x99, 0xe6, 0x80, 0xee, 0x05, 0x44, 0xcc, 0xbf, 0xf8, 0x6c, 0xc8, 0x2e, - 0x20, 0xfc, 0x6c, 0x2c, 0xbd, 0xe3, 0xe2, 0xcb, 0xe6, 0x4f, 0x23, 0xab, - 0x2f, 0xe8, 0xe1, 0x47, 0x78, 0xb2, 0x99, 0x5c, 0xf4, 0x9a, 0x4d, 0x53, - 0xca, 0x25, 0xd9, 0x46, 0xeb, 0xec, 0x0e, 0xb6, 0x59, 0x74, 0xfb, 0x21, - 0x65, 0x4f, 0x67, 0x82, 0xca, 0xe4, 0x77, 0xf3, 0x2a, 0x64, 0x32, 0x19, - 0x3c, 0x85, 0x97, 0x47, 0x16, 0x53, 0x2b, 0x9e, 0xb7, 0xc8, 0x17, 0xff, - 0x99, 0x3d, 0x96, 0x7b, 0xcf, 0x23, 0x32, 0x59, 0x78, 0x06, 0xd5, 0x97, - 0xfc, 0xc8, 0xfd, 0xa2, 0x68, 0xf6, 0x85, 0x97, 0xd3, 0xdf, 0x5c, 0x96, - 0x5f, 0x4f, 0x53, 0xc3, 0x90, 0xb2, 0xc1, 0x59, 0x4c, 0xa8, 0xdf, 0x19, - 0x6d, 0xd3, 0xec, 0x85, 0x97, 0x60, 0x56, 0x5f, 0xfd, 0x0d, 0x7e, 0xe7, - 0xdf, 0xb4, 0x4f, 0x2c, 0xbf, 0xfc, 0x0d, 0x07, 0x6f, 0xb8, 0x7a, 0x07, - 0xb1, 0x65, 0xf1, 0xef, 0x7f, 0xd6, 0x54, 0x1f, 0x8f, 0x53, 0x6b, 0xc8, - 0xd9, 0x28, 0x5c, 0x5f, 0x1e, 0xc1, 0x25, 0x97, 0xec, 0xdb, 0x3f, 0x99, - 0x65, 0x4e, 0x3c, 0xce, 0x91, 0x5f, 0xda, 0x3d, 0xd6, 0x0c, 0x0b, 0x2f, - 0xf4, 0xec, 0x27, 0xd7, 0xf3, 0xeb, 0x2e, 0x29, 0x2c, 0xbf, 0xfe, 0x7f, - 0x67, 0xdf, 0xf8, 0x57, 0xf4, 0xde, 0x0a, 0xca, 0x33, 0xea, 0x68, 0xb5, - 0xfd, 0x9c, 0x81, 0x0a, 0x16, 0x50, 0xd1, 0xdf, 0x90, 0xa2, 0xf1, 0x0d, - 0xb1, 0x65, 0xce, 0xd5, 0x95, 0xc3, 0x4d, 0xba, 0x21, 0x76, 0xef, 0x56, - 0x59, 0x96, 0xb2, 0xdf, 0xc1, 0xaf, 0x08, 0xd5, 0xfa, 0x31, 0xaf, 0xd5, - 0x97, 0xff, 0xfc, 0x50, 0x02, 0x86, 0xce, 0x8d, 0x68, 0xf7, 0xe9, 0xdf, - 0xf5, 0x97, 0xf1, 0x8a, 0x7c, 0xc0, 0x2c, 0xa3, 0x44, 0xaf, 0x1a, 0x2f, - 0x8f, 0xb1, 0x25, 0x97, 0xdd, 0xe3, 0xcc, 0xb2, 0x99, 0x0b, 0x97, 0x20, - 0x1e, 0x38, 0x77, 0xcc, 0xe7, 0xa2, 0x4f, 0x46, 0x40, 0xeb, 0x5f, 0xa9, - 0x91, 0x3f, 0x61, 0x77, 0xbc, 0x88, 0x42, 0x1b, 0xce, 0x40, 0x59, 0x7b, - 0xa5, 0x0b, 0x2f, 0x88, 0xb3, 0xab, 0x29, 0x92, 0x6e, 0xe0, 0x6e, 0xb8, - 0x7f, 0x42, 0xab, 0x5f, 0x3f, 0x8e, 0x65, 0x97, 0xc5, 0x34, 0x0d, 0x65, - 0xdf, 0x75, 0x65, 0xf7, 0xa6, 0x81, 0xac, 0xac, 0x45, 0x10, 0x08, 0xcc, - 0x8a, 0x62, 0x27, 0x18, 0xbf, 0x43, 0x4b, 0x26, 0x59, 0x7f, 0x1e, 0x10, - 0xfd, 0x0b, 0x2c, 0xd5, 0x94, 0x33, 0xe3, 0x01, 0x3e, 0xe1, 0x5d, 0x2c, - 0xbf, 0xb5, 0x04, 0x1c, 0xf2, 0xcb, 0xed, 0x46, 0x12, 0xcb, 0xe7, 0xec, - 0xbf, 0x59, 0x60, 0xac, 0xbf, 0xc6, 0x07, 0xcd, 0x67, 0x56, 0x57, 0xe7, - 0x85, 0xc1, 0x1b, 0xfc, 0xfa, 0x38, 0xdc, 0x36, 0xac, 0xa0, 0x26, 0x10, - 0xd2, 0xcf, 0x10, 0x75, 0x97, 0x79, 0x1d, 0xff, 0x6a, 0x32, 0x51, 0xe8, - 0xfd, 0x65, 0xff, 0xe9, 0xde, 0x73, 0xef, 0xe1, 0x22, 0x79, 0x2c, 0xbf, - 0xe1, 0x1b, 0x9c, 0x77, 0xfa, 0x4b, 0x2f, 0x4f, 0x16, 0x43, 0x25, 0x65, - 0x62, 0xa7, 0xa0, 0x19, 0x1c, 0x62, 0x7a, 0x4d, 0x69, 0xc7, 0xe9, 0x64, - 0x75, 0x7f, 0xff, 0xff, 0xff, 0xfa, 0x78, 0xb2, 0x72, 0x78, 0xcf, 0x6c, - 0xae, 0xca, 0xe0, 0x65, 0xc4, 0xf0, 0x9e, 0xf5, 0xb6, 0xee, 0x04, 0x6c, - 0xaa, 0x27, 0xfe, 0x13, 0xd3, 0xdc, 0x44, 0xf7, 0xb8, 0xca, 0x76, 0x74, - 0xef, 0x4f, 0xac, 0xbf, 0xff, 0x7f, 0xf4, 0xbc, 0x18, 0xd3, 0x3f, 0x18, - 0x1f, 0x4b, 0x2f, 0xfd, 0xec, 0x2c, 0x63, 0x0b, 0x06, 0xb2, 0xff, 0xef, - 0x85, 0x8e, 0x8c, 0xf7, 0x39, 0x0d, 0x59, 0x7d, 0xcc, 0xfb, 0xab, 0x2f, - 0xc3, 0xf4, 0x16, 0xcb, 0x2f, 0x8c, 0xbb, 0xc5, 0x97, 0xff, 0xfc, 0xd3, - 0xd7, 0x83, 0xc9, 0x46, 0xfd, 0x41, 0x77, 0xd9, 0x25, 0x95, 0x24, 0x44, - 0x99, 0x0d, 0xff, 0x8f, 0xa6, 0x03, 0x1f, 0x70, 0x0b, 0x2a, 0x49, 0xdc, - 0x61, 0xe6, 0x92, 0x48, 0x8f, 0xb0, 0xb1, 0xdd, 0x22, 0xbf, 0xc0, 0x2c, - 0xf7, 0xb3, 0xf5, 0x97, 0xce, 0x2b, 0xee, 0x2c, 0xa7, 0x3d, 0x82, 0x33, - 0xbe, 0xec, 0xfe, 0x79, 0x65, 0xff, 0xfe, 0x72, 0x01, 0x60, 0xfc, 0x19, - 0xde, 0x89, 0x6a, 0x36, 0x59, 0x58, 0x88, 0x70, 0x92, 0xdf, 0xc2, 0x14, - 0x7a, 0x24, 0xb2, 0xff, 0xfe, 0x60, 0xb3, 0xf0, 0xf2, 0x74, 0x8f, 0xd0, - 0x02, 0x75, 0x94, 0xd4, 0x45, 0x39, 0x6d, 0xf0, 0xb0, 0xde, 0xac, 0xbf, - 0xd8, 0x2c, 0x74, 0x9f, 0x8b, 0x2f, 0x1f, 0x8d, 0x65, 0x41, 0xf8, 0x19, - 0x1f, 0x4c, 0xaf, 0xf9, 0xf5, 0x29, 0xd8, 0x01, 0xe2, 0xca, 0x9e, 0xd7, - 0x91, 0x62, 0x33, 0x1c, 0x94, 0x25, 0xa8, 0x5b, 0x7a, 0x14, 0xef, 0x0a, - 0xc2, 0x84, 0x90, 0x4b, 0x6f, 0x3e, 0xfd, 0xc5, 0x94, 0xb2, 0xff, 0xfb, - 0x87, 0x3f, 0x80, 0xf1, 0x91, 0x07, 0x5b, 0x2c, 0xad, 0x1e, 0xef, 0x42, - 0xef, 0xee, 0xe3, 0x7e, 0xc6, 0xac, 0xac, 0x3d, 0x03, 0x22, 0xbf, 0xcd, - 0x6b, 0xcb, 0x87, 0x25, 0x97, 0xf9, 0x89, 0xd1, 0xf7, 0xfa, 0x85, 0x95, - 0x87, 0xd6, 0xe6, 0x74, 0x69, 0xbc, 0xfa, 0x19, 0xc5, 0x08, 0xbb, 0xff, - 0xec, 0xdf, 0x83, 0xf4, 0x6f, 0x6c, 0x13, 0x88, 0xb2, 0xfe, 0x1b, 0xcb, - 0x87, 0x25, 0x95, 0xa3, 0xff, 0x0a, 0x95, 0xf0, 0x4b, 0xbc, 0x59, 0x7d, - 0xe8, 0xd4, 0x2c, 0xa0, 0x1e, 0x1e, 0x88, 0xaf, 0x4a, 0x7c, 0x55, 0x97, - 0x7e, 0x6b, 0x2f, 0xcd, 0x97, 0x84, 0xe2, 0xcb, 0x6a, 0x71, 0xe0, 0x88, - 0x2f, 0x7e, 0x71, 0x4b, 0x06, 0xb2, 0xa1, 0x16, 0x86, 0xc5, 0xa2, 0xbb, - 0xff, 0x14, 0x01, 0x87, 0xcd, 0x1f, 0xeb, 0x2f, 0xee, 0x61, 0xeb, 0x4e, - 0xb2, 0xfd, 0xc9, 0xdf, 0xbf, 0x56, 0x56, 0xc8, 0x95, 0xfc, 0xfb, 0xa5, - 0x97, 0x46, 0x96, 0x5f, 0xfd, 0xb6, 0x70, 0xdf, 0xcc, 0xc5, 0x14, 0x54, - 0x96, 0x3f, 0xcf, 0x80, 0x85, 0xaf, 0xf8, 0x2f, 0xa9, 0xf0, 0xf8, 0xf4, - 0xb2, 0xa1, 0x1e, 0xa3, 0x84, 0x97, 0x89, 0xef, 0xef, 0xb3, 0xc1, 0xfb, - 0xf5, 0x97, 0xef, 0x46, 0xde, 0x0a, 0xcb, 0xf1, 0x84, 0x07, 0xb2, 0xca, - 0xc4, 0x41, 0x74, 0xc6, 0x7c, 0xa6, 0xff, 0x8b, 0x21, 0x87, 0xeb, 0xb0, - 0xb2, 0xff, 0x37, 0x00, 0x4f, 0x80, 0x59, 0x70, 0x66, 0x59, 0x74, 0xb9, - 0x07, 0x93, 0xf9, 0x8d, 0xe0, 0x04, 0x0b, 0x2b, 0xe3, 0xcb, 0x09, 0x75, - 0xff, 0x6d, 0x9f, 0x8c, 0x2f, 0xa9, 0x2c, 0xbf, 0x9d, 0xc7, 0xbf, 0x06, - 0xb2, 0xf3, 0xb8, 0x15, 0x16, 0x7a, 0xff, 0x41, 0x31, 0xa0, 0xc1, 0x2c, - 0xbf, 0xbf, 0x72, 0x91, 0xb5, 0x65, 0x6c, 0x8f, 0x01, 0x9d, 0x80, 0xb8, - 0xca, 0x3f, 0x32, 0xbf, 0xde, 0xef, 0x1f, 0xe1, 0x1a, 0xb2, 0xff, 0x44, - 0x8f, 0xb1, 0xde, 0x2c, 0xbe, 0xfc, 0x4f, 0x42, 0xca, 0xf1, 0xeb, 0x11, - 0x95, 0x42, 0x2b, 0x4e, 0x11, 0x97, 0xfc, 0xc3, 0x96, 0x6f, 0x2c, 0xe2, - 0xcb, 0xff, 0x3c, 0xec, 0xde, 0x59, 0xcc, 0x25, 0x96, 0xd3, 0x07, 0xf1, - 0xe3, 0x9b, 0xfc, 0x63, 0xc6, 0x8b, 0x9e, 0x59, 0x7e, 0xe0, 0xce, 0x09, - 0x65, 0x41, 0xec, 0xf4, 0xce, 0xff, 0xee, 0x74, 0xe6, 0x15, 0xc7, 0x1f, - 0x71, 0x65, 0x1a, 0x3a, 0x9e, 0x10, 0x41, 0x21, 0xbc, 0x28, 0xa2, 0xa4, - 0xbf, 0xf3, 0xcb, 0x85, 0x80, 0x1e, 0x69, 0x23, 0x33, 0x41, 0x7e, 0xdd, - 0x0b, 0x70, 0x6b, 0x2f, 0xf7, 0x7d, 0x9b, 0xe7, 0x49, 0xab, 0x2b, 0x0f, - 0x8c, 0x25, 0x77, 0xfe, 0xfa, 0x44, 0x1f, 0xe7, 0x01, 0xbf, 0xac, 0xba, - 0x18, 0x59, 0x7f, 0xc3, 0x82, 0x8f, 0xe5, 0xe3, 0x59, 0x50, 0x89, 0x4d, - 0x91, 0x4c, 0x5e, 0xff, 0x78, 0xc6, 0x4e, 0xf3, 0x2c, 0xbf, 0xc3, 0xf0, - 0x5f, 0xf9, 0xfc, 0x59, 0x50, 0x7d, 0x26, 0x65, 0x7f, 0xa2, 0x77, 0x73, - 0x9c, 0x85, 0x97, 0xf0, 0xc4, 0x18, 0x7b, 0xc5, 0x95, 0xa3, 0xe4, 0x23, - 0x4b, 0xfb, 0x39, 0x2f, 0x09, 0xc5, 0x94, 0x67, 0xa0, 0x44, 0x37, 0xa0, - 0x98, 0x59, 0x52, 0x66, 0x2a, 0x0e, 0x17, 0x18, 0xca, 0xc4, 0x35, 0x81, - 0x1d, 0xc7, 0xd0, 0xb6, 0x33, 0x29, 0xa1, 0x99, 0xa8, 0xc4, 0xdb, 0x0f, - 0x8f, 0x47, 0x11, 0xfa, 0x99, 0x42, 0xcb, 0x90, 0xb5, 0xec, 0x26, 0x37, - 0xc3, 0x50, 0x42, 0x0b, 0xbf, 0xe2, 0xcb, 0xf1, 0x77, 0x3f, 0x6a, 0xcb, - 0xed, 0x1c, 0x75, 0x65, 0xfd, 0xc2, 0xc9, 0xa1, 0xab, 0x2b, 0xf3, 0xce, - 0xe9, 0x0d, 0x3a, 0x26, 0x42, 0xed, 0x74, 0x75, 0x65, 0xf7, 0xee, 0x2f, - 0x56, 0x5f, 0xe7, 0x17, 0xc7, 0x1a, 0x85, 0x97, 0xe3, 0xdf, 0x05, 0xd5, - 0x94, 0x34, 0xd9, 0xd8, 0x85, 0x8f, 0xc4, 0x46, 0x2d, 0xa2, 0x4e, 0x19, - 0x5f, 0xfb, 0x47, 0xc9, 0x09, 0xe8, 0x28, 0x59, 0x7d, 0xa3, 0x86, 0xac, - 0xbf, 0xff, 0x75, 0x80, 0xc6, 0x0f, 0xd9, 0xcf, 0xa5, 0x1e, 0x59, 0x5a, - 0x45, 0xb3, 0x4f, 0x88, 0x86, 0xfb, 0xf0, 0xeb, 0x65, 0x97, 0x3c, 0x96, - 0x5f, 0xff, 0xff, 0xc4, 0xe2, 0xf7, 0x3c, 0x59, 0xd0, 0xfe, 0xd7, 0x93, - 0x8e, 0x09, 0xf4, 0xf2, 0x59, 0x7f, 0xb3, 0xde, 0x0f, 0x5c, 0x96, 0x5c, - 0x63, 0x59, 0x7f, 0x78, 0x0f, 0xa7, 0x92, 0xcb, 0x02, 0x47, 0x87, 0x82, - 0xd7, 0x8e, 0x6e, 0x2c, 0xa8, 0x3c, 0x46, 0x93, 0xdf, 0xfd, 0xd3, 0xf3, - 0xb6, 0x7c, 0x3e, 0x3d, 0x2c, 0xbf, 0x9f, 0xad, 0x8c, 0xea, 0xca, 0x73, - 0xf3, 0x0a, 0x3d, 0xef, 0x47, 0x16, 0x58, 0xc6, 0xa8, 0x9a, 0x61, 0x6d, - 0x42, 0x19, 0xb0, 0xb9, 0x28, 0x4a, 0x74, 0x86, 0xfc, 0x7e, 0x76, 0x9a, - 0xcb, 0xce, 0x5f, 0xac, 0xa9, 0xc7, 0x84, 0x02, 0x6b, 0xdb, 0xf0, 0x6b, - 0x2d, 0xad, 0x8f, 0x0a, 0x62, 0x4b, 0xda, 0x7f, 0x2c, 0xbf, 0xdb, 0xba, - 0xcd, 0xd2, 0x08, 0xab, 0x2b, 0x63, 0xd6, 0x14, 0x72, 0xf6, 0xe9, 0x8d, - 0x65, 0x61, 0xe1, 0xb9, 0x25, 0x42, 0xe2, 0x71, 0x97, 0xfa, 0x52, 0x5b, - 0xc3, 0xc4, 0xa1, 0x87, 0x7f, 0xff, 0xfd, 0xff, 0x33, 0x09, 0x81, 0x34, - 0x51, 0x9e, 0x67, 0xc2, 0xcd, 0x9b, 0x8d, 0x59, 0x76, 0xb1, 0x65, 0xdc, - 0x35, 0x95, 0xb1, 0xac, 0xd0, 0xb5, 0xf4, 0x10, 0x8d, 0x59, 0x58, 0x78, - 0x82, 0x11, 0x56, 0x26, 0x25, 0xd8, 0x78, 0x5d, 0xff, 0x16, 0x5f, 0x3f, - 0xa0, 0x45, 0x95, 0x86, 0xeb, 0x78, 0xc5, 0xf4, 0x0b, 0x83, 0x59, 0x7f, - 0xfc, 0x1f, 0xa5, 0xc1, 0xfa, 0x34, 0x37, 0x71, 0x56, 0x56, 0x23, 0xe0, - 0xd8, 0xb4, 0x44, 0x44, 0x57, 0x89, 0xa6, 0xb2, 0xf8, 0x58, 0xfb, 0x8b, - 0x2f, 0x74, 0x4c, 0x59, 0x74, 0x6c, 0xb2, 0x9c, 0xda, 0x70, 0x76, 0xf0, - 0xe2, 0x4b, 0x2f, 0xfa, 0x30, 0x1e, 0x3d, 0xef, 0xa5, 0x97, 0x67, 0x96, - 0x53, 0x9f, 0x59, 0x0e, 0x4f, 0x9c, 0xdd, 0x83, 0x59, 0x77, 0x59, 0x6b, - 0x2a, 0x49, 0xcc, 0xe1, 0xd7, 0x86, 0xf8, 0xb1, 0xd8, 0x45, 0xef, 0x30, - 0x9f, 0x16, 0xbf, 0xb3, 0x5f, 0xb4, 0xf8, 0xb2, 0xf7, 0x82, 0x2a, 0xcb, - 0xf7, 0x3a, 0x71, 0xf2, 0xcb, 0x82, 0x05, 0x95, 0x23, 0x7f, 0xf9, 0x45, - 0xee, 0xe0, 0x8b, 0x2f, 0xe6, 0x87, 0x9d, 0xce, 0xac, 0xbf, 0x3f, 0xbe, - 0x97, 0x16, 0x54, 0x1e, 0xb8, 0x4b, 0xaf, 0xd9, 0xcf, 0xe2, 0x65, 0x97, - 0xf4, 0x7d, 0xc9, 0xda, 0x85, 0x97, 0x86, 0x10, 0x2c, 0xbe, 0x19, 0x44, - 0x96, 0x51, 0x9b, 0xe7, 0x1d, 0xbf, 0xfc, 0x24, 0xef, 0xba, 0x51, 0x93, - 0xb3, 0xee, 0xac, 0xa8, 0x54, 0x90, 0x32, 0xef, 0x97, 0x4c, 0x8a, 0x67, - 0x4d, 0x10, 0xb4, 0xa7, 0xcd, 0xc1, 0x1f, 0xbf, 0xc7, 0x33, 0x91, 0xfd, - 0xc5, 0x97, 0x60, 0x16, 0x5f, 0xe2, 0xef, 0x0a, 0x3b, 0xc5, 0x97, 0xfb, - 0xc5, 0x87, 0xfc, 0x7e, 0xb2, 0xfc, 0x7b, 0xf0, 0xb8, 0xb2, 0xb1, 0x11, - 0xa6, 0x65, 0xa3, 0x3b, 0xfb, 0xee, 0xe7, 0x83, 0xb8, 0xb2, 0xfe, 0xd6, - 0x7b, 0xc1, 0xea, 0xcb, 0xf7, 0x8a, 0x33, 0x4a, 0x2f, 0xec, 0xd6, 0xc1, - 0x71, 0xaa, 0x20, 0xd3, 0x33, 0x4d, 0x6d, 0x6c, 0x8a, 0x19, 0x2a, 0x5f, - 0x17, 0xb3, 0xe5, 0x95, 0x09, 0x8f, 0x9c, 0x34, 0xdc, 0xaa, 0xfc, 0xe0, - 0x36, 0xc2, 0xcb, 0xfa, 0x5e, 0x27, 0xfb, 0xab, 0x28, 0x07, 0xa8, 0x44, - 0xd7, 0xc2, 0x13, 0xec, 0xb2, 0xb0, 0xf1, 0x38, 0x43, 0x7e, 0x8e, 0xce, - 0x68, 0xab, 0x2f, 0x36, 0x00, 0xb2, 0xf8, 0xbf, 0x0f, 0x16, 0x58, 0xf0, - 0xdf, 0xe8, 0x72, 0xff, 0x87, 0xce, 0x66, 0x87, 0xec, 0x59, 0x7f, 0xdc, - 0x72, 0x89, 0x8c, 0x7b, 0x2c, 0xbf, 0xd2, 0x36, 0xc7, 0x84, 0x1a, 0xcb, - 0xff, 0xd1, 0x85, 0xf7, 0x73, 0x47, 0xb3, 0xb5, 0x65, 0xd9, 0xe9, 0xc8, - 0xb6, 0xe1, 0xcf, 0x4d, 0x2e, 0xce, 0x2c, 0xb0, 0xbd, 0x3d, 0x39, 0xf3, - 0xda, 0x84, 0xdb, 0x9e, 0x34, 0x2a, 0x9c, 0xba, 0x69, 0x3c, 0x99, 0xc4, - 0x28, 0xe5, 0x1a, 0x6e, 0x43, 0x2f, 0x44, 0x3e, 0x6a, 0x28, 0xe4, 0xee, - 0xc9, 0x2c, 0xbf, 0xff, 0x18, 0x0c, 0x7d, 0x90, 0x4b, 0xbc, 0xf3, 0xc9, - 0x65, 0x70, 0xfa, 0xfa, 0x2d, 0x76, 0x08, 0xb2, 0xfb, 0xff, 0x40, 0xd6, - 0x5f, 0xde, 0x31, 0x4a, 0x06, 0xb2, 0xff, 0xa3, 0xf6, 0xc6, 0x17, 0x78, - 0xb2, 0xff, 0xb9, 0x82, 0xf9, 0xda, 0x7c, 0x59, 0x7e, 0xcd, 0x6c, 0x1e, - 0x2c, 0xa3, 0x47, 0x54, 0xc4, 0x7e, 0x2d, 0xe1, 0xc6, 0xf3, 0x9b, 0xf1, - 0xfd, 0x23, 0x25, 0x97, 0x8f, 0xd8, 0xb2, 0xfe, 0xeb, 0xb5, 0xb0, 0xd5, - 0x95, 0x87, 0xde, 0x02, 0x7f, 0x86, 0xe9, 0x65, 0xa1, 0xa6, 0xe8, 0x52, - 0xfb, 0xdc, 0x09, 0x2c, 0xbf, 0xf0, 0x58, 0x68, 0x7b, 0xe8, 0x0b, 0x2d, - 0x65, 0x7c, 0x7c, 0x24, 0x39, 0x7c, 0xd8, 0xd3, 0x0b, 0x2f, 0xb3, 0xff, - 0xdd, 0x65, 0x61, 0xe3, 0x11, 0x1d, 0x6c, 0x88, 0x81, 0x5a, 0x2f, 0x87, - 0xcf, 0x42, 0xcb, 0xf1, 0x68, 0x57, 0xd9, 0x65, 0x41, 0xf8, 0x61, 0x2b, - 0x91, 0x5f, 0xb3, 0xbc, 0x36, 0xac, 0xb8, 0x24, 0xb2, 0xf1, 0x66, 0xcb, - 0x2a, 0x17, 0x07, 0x64, 0x45, 0x91, 0x80, 0x9c, 0x3d, 0x75, 0x1c, 0x01, - 0x16, 0x70, 0x9c, 0x41, 0x6b, 0xbd, 0x25, 0x97, 0xbd, 0x84, 0xb2, 0xff, - 0x61, 0x67, 0xdd, 0x93, 0x56, 0x5d, 0xd8, 0x59, 0x50, 0x79, 0x2e, 0x67, - 0x7f, 0xcf, 0x21, 0x98, 0x59, 0x67, 0xa5, 0x97, 0xec, 0x22, 0x81, 0xac, - 0xbe, 0xf3, 0xfa, 0x16, 0x5f, 0xd1, 0xb3, 0x5e, 0x68, 0x59, 0x6d, 0x2c, - 0xa9, 0x1f, 0x04, 0xc4, 0x21, 0x2e, 0xbf, 0xfe, 0x76, 0x3b, 0x1a, 0xff, - 0x51, 0xd2, 0x7f, 0xd6, 0x5f, 0xe8, 0x00, 0xfc, 0x17, 0xe2, 0xcb, 0xe0, - 0x09, 0xde, 0x2c, 0xbf, 0x8b, 0x3f, 0xc2, 0x92, 0xcb, 0xff, 0xe6, 0x27, - 0x08, 0x4f, 0xde, 0x1f, 0xde, 0x31, 0x56, 0x56, 0x22, 0x05, 0xcb, 0x28, - 0xd1, 0x8c, 0x50, 0xa5, 0xa8, 0x55, 0xf9, 0x82, 0xfa, 0x64, 0x69, 0x07, - 0x8f, 0x1e, 0x10, 0xa4, 0x61, 0xc5, 0x10, 0xc3, 0xe6, 0xee, 0x6f, 0x59, - 0x71, 0xf5, 0x65, 0xf1, 0x93, 0x8d, 0x65, 0xff, 0x9b, 0x9d, 0xe0, 0x9c, - 0x79, 0x62, 0xcb, 0xf7, 0x23, 0x5d, 0x85, 0x8c, 0xcd, 0xfd, 0x0d, 0x13, - 0x1c, 0x5f, 0xb8, 0xd9, 0x6b, 0x2f, 0x85, 0xc9, 0x1a, 0xcb, 0xd8, 0x6c, - 0x2c, 0xbe, 0x99, 0xdf, 0x4b, 0x29, 0xcf, 0x80, 0x88, 0x84, 0x1c, 0xbd, - 0x87, 0xbd, 0x65, 0xe9, 0x08, 0xd5, 0x95, 0xe3, 0x76, 0xe3, 0xb7, 0xf7, - 0x0f, 0x58, 0x1d, 0x2c, 0xbf, 0xff, 0xa6, 0x9c, 0x60, 0x0e, 0xb8, 0x19, - 0xcd, 0x3e, 0xf8, 0xd6, 0x5d, 0x0c, 0x2c, 0xa8, 0x3f, 0x83, 0x61, 0xac, - 0x55, 0x64, 0xc0, 0xc9, 0xc2, 0xba, 0x62, 0x36, 0xbd, 0x79, 0xa7, 0xa4, - 0x1b, 0xb0, 0xa5, 0xb9, 0xac, 0x95, 0x45, 0xf8, 0xbf, 0x6d, 0xf4, 0xa0, - 0x6b, 0x2f, 0xd8, 0x47, 0xf4, 0x96, 0x5e, 0xd6, 0x62, 0xca, 0x64, 0x1f, - 0x61, 0x95, 0x70, 0x9e, 0xff, 0xe9, 0x74, 0x32, 0x93, 0x7b, 0xd8, 0x6a, - 0xcb, 0xfd, 0xde, 0x46, 0xd9, 0xc1, 0xac, 0xbb, 0xd8, 0xb2, 0xff, 0xfb, - 0xd0, 0x3c, 0x04, 0xec, 0x2c, 0x1f, 0xa1, 0x65, 0xff, 0x6a, 0x3c, 0x7b, - 0xf5, 0x12, 0x59, 0x7f, 0xf1, 0xe1, 0x66, 0x72, 0x74, 0xb8, 0xd5, 0x97, - 0xfe, 0x78, 0xfa, 0x53, 0xb9, 0xf0, 0xe1, 0x65, 0x0d, 0x3d, 0x1f, 0x8c, - 0x8d, 0x1b, 0x70, 0xd2, 0x61, 0x6d, 0x27, 0xf0, 0xeb, 0xa8, 0x97, 0x98, - 0x8d, 0x2c, 0xbf, 0xbc, 0x6d, 0x77, 0xdd, 0x59, 0x7b, 0x47, 0xb2, 0xcb, - 0xf8, 0x71, 0xfe, 0xb3, 0xe5, 0x96, 0x9f, 0x59, 0x4c, 0xd1, 0x58, 0x01, - 0xdd, 0x17, 0xb4, 0x75, 0x96, 0x5f, 0x7f, 0xc6, 0xc4, 0x68, 0xb0, 0xd8, - 0x59, 0x70, 0x36, 0x59, 0x7f, 0xa1, 0xb8, 0x7a, 0x9a, 0x4b, 0x2e, 0x39, - 0x96, 0x5f, 0xed, 0x43, 0x03, 0x28, 0xf9, 0x65, 0xf4, 0x16, 0x30, 0xb2, - 0xf7, 0x21, 0x85, 0x97, 0xff, 0x04, 0x79, 0xa8, 0x91, 0x8e, 0x09, 0x65, - 0xff, 0x13, 0xed, 0x1a, 0xd3, 0xc9, 0x65, 0x48, 0xfe, 0xbc, 0x85, 0x7f, - 0xfd, 0xa7, 0xe1, 0x66, 0xc2, 0x48, 0x30, 0x64, 0xb2, 0xa0, 0xfc, 0x42, - 0x45, 0x5f, 0x26, 0x53, 0xd8, 0xc2, 0x2f, 0x74, 0xf6, 0x59, 0x7e, 0xfd, - 0xfe, 0x89, 0x96, 0x5e, 0x28, 0x02, 0xcb, 0xff, 0x86, 0x73, 0x7a, 0x35, - 0xf4, 0xa3, 0x4b, 0x2f, 0xb3, 0xb0, 0x35, 0x97, 0xff, 0x8c, 0x9f, 0xee, - 0x73, 0x34, 0x3f, 0x62, 0xca, 0x9c, 0xab, 0x4a, 0x42, 0xe0, 0x34, 0x38, - 0xd2, 0x9a, 0x56, 0xe3, 0xa4, 0x55, 0xc1, 0xb1, 0x51, 0xb7, 0x48, 0x6d, - 0x0b, 0x29, 0x65, 0xec, 0xcf, 0xd6, 0x5e, 0xf1, 0xf5, 0x65, 0xb7, 0xe1, - 0xe9, 0x98, 0x81, 0x05, 0x88, 0x39, 0x7f, 0x66, 0xb6, 0x0b, 0x8d, 0x65, - 0xe8, 0xdd, 0xe2, 0xca, 0x60, 0xf3, 0x40, 0x5d, 0x7e, 0xd6, 0xb3, 0x72, - 0x65, 0x97, 0x0b, 0xc5, 0x95, 0x0c, 0x98, 0xb1, 0xc2, 0x03, 0x25, 0x32, - 0x9c, 0x64, 0x5b, 0x8a, 0x0d, 0x38, 0xf0, 0xc3, 0xcb, 0x05, 0xfe, 0x1d, - 0x21, 0x84, 0x7e, 0xf2, 0x31, 0x0b, 0x2f, 0x35, 0xc4, 0x59, 0x7f, 0xd8, - 0x52, 0x2c, 0x6c, 0x01, 0x65, 0xfb, 0xc7, 0xbf, 0x06, 0xb2, 0xff, 0xc3, - 0x82, 0xc2, 0x0c, 0xb3, 0x8b, 0x2e, 0x9d, 0xf2, 0xcb, 0xf3, 0xb4, 0xf7, - 0x71, 0x65, 0xfd, 0x9e, 0x7e, 0xbc, 0xcb, 0x2e, 0x8f, 0x96, 0x57, 0xc7, - 0x89, 0xd2, 0xda, 0xc4, 0x48, 0x3b, 0x6d, 0xff, 0x60, 0x4b, 0x3a, 0x4e, - 0xd5, 0x97, 0x1c, 0xcb, 0x2e, 0xc6, 0x16, 0x54, 0x1a, 0xef, 0x0b, 0xdd, - 0xac, 0x59, 0x78, 0x99, 0x1b, 0xab, 0x2f, 0x8f, 0x51, 0x25, 0x97, 0xdb, - 0x36, 0x38, 0xb2, 0xb6, 0x3c, 0x4c, 0x21, 0xbf, 0xf4, 0x75, 0xc3, 0xd7, - 0xfb, 0x3a, 0xb2, 0xff, 0xb5, 0x3a, 0x07, 0xec, 0x04, 0x2c, 0xaf, 0x1f, - 0xc3, 0x9f, 0x5f, 0x80, 0xf0, 0x73, 0xeb, 0x2f, 0x16, 0x71, 0x65, 0xff, - 0xff, 0xa3, 0xc6, 0xd6, 0x73, 0x49, 0xf4, 0x27, 0x8f, 0xee, 0x00, 0xf6, - 0x59, 0x5b, 0x2b, 0xf5, 0x18, 0xeb, 0x06, 0xc6, 0x53, 0xb8, 0x79, 0x34, - 0x2a, 0xb4, 0x43, 0xe6, 0x4f, 0xc8, 0x08, 0x5b, 0x8c, 0xfd, 0x84, 0xd0, - 0x48, 0x44, 0x29, 0xdd, 0x1b, 0xb7, 0x16, 0x5f, 0xe0, 0x7e, 0xff, 0x99, - 0x01, 0x65, 0x8f, 0xc7, 0x8a, 0x42, 0x37, 0xfb, 0x61, 0xe7, 0x78, 0xff, - 0x2c, 0xbe, 0x9c, 0xf2, 0x9e, 0x96, 0x5f, 0x9e, 0x5c, 0x1b, 0x56, 0x5f, - 0xfd, 0x9b, 0xf0, 0x78, 0x41, 0x96, 0x71, 0x65, 0xfb, 0x51, 0xe1, 0x06, - 0xb2, 0xb4, 0x7d, 0xae, 0x89, 0x7d, 0x07, 0xb4, 0x2c, 0xbe, 0x15, 0xf3, - 0x8b, 0x2f, 0xe1, 0xc7, 0xe5, 0x9f, 0x2c, 0xbf, 0xe9, 0x35, 0xe5, 0xde, - 0x43, 0x0b, 0x2a, 0x11, 0x15, 0x84, 0x4e, 0x5d, 0x7b, 0x86, 0x4b, 0x2f, - 0xc4, 0x09, 0xdc, 0xf9, 0x65, 0xfe, 0x12, 0x51, 0xbc, 0xcb, 0xf5, 0x97, - 0xcf, 0xbb, 0x84, 0xb2, 0xb1, 0x13, 0xee, 0x36, 0x45, 0x7c, 0x36, 0xac, - 0x55, 0xd6, 0x02, 0x6d, 0xc3, 0x56, 0x94, 0xbc, 0x25, 0x7f, 0x21, 0x28, - 0x55, 0x86, 0x19, 0x97, 0x6d, 0x25, 0x97, 0x8f, 0xc6, 0xb2, 0xbe, 0x36, - 0x7d, 0x18, 0xbe, 0xcf, 0xa5, 0x0b, 0x2f, 0x05, 0xf8, 0xb2, 0xbc, 0x6f, - 0x84, 0x22, 0xbf, 0xe3, 0x62, 0x07, 0x1b, 0xf3, 0xcb, 0x2f, 0xf1, 0x8b, - 0xf4, 0xb9, 0x80, 0x59, 0x7f, 0x48, 0x4f, 0xff, 0x8f, 0x96, 0x57, 0x8f, - 0x9d, 0xcd, 0x6f, 0xe0, 0xf2, 0x26, 0x0e, 0x96, 0x5e, 0x0e, 0x7c, 0xb2, - 0xbc, 0x79, 0x9d, 0x2f, 0xbf, 0xb1, 0xba, 0xd4, 0x0d, 0x65, 0xfb, 0xee, - 0x74, 0xf6, 0x59, 0x7f, 0x04, 0xb6, 0xe1, 0xfc, 0xb2, 0xff, 0xe8, 0xd8, - 0x57, 0xfb, 0x98, 0x33, 0xe2, 0xca, 0x84, 0x4f, 0xc8, 0xa8, 0x8b, 0xef, - 0xbf, 0xff, 0x3e, 0x59, 0x7f, 0x83, 0x1b, 0x16, 0x1e, 0xcb, 0x2f, 0xff, - 0xd1, 0xaf, 0xf3, 0x84, 0x17, 0x97, 0x82, 0xfb, 0x2c, 0xbf, 0x77, 0x1c, - 0x80, 0xb2, 0xbc, 0x7f, 0x9b, 0xaa, 0xd7, 0xff, 0x87, 0xe8, 0xfa, 0x45, - 0x8d, 0xcf, 0xba, 0xb2, 0xfc, 0xdc, 0xf6, 0x12, 0xca, 0x33, 0xf1, 0x74, - 0xbb, 0xfe, 0x0b, 0xc8, 0x79, 0x9f, 0xf1, 0x65, 0xf9, 0xb9, 0xa7, 0x25, - 0x97, 0xfe, 0xfa, 0x5e, 0x86, 0xbf, 0xd2, 0xc5, 0x97, 0xf1, 0xfd, 0xf4, - 0xb3, 0xab, 0x2a, 0x11, 0x2b, 0x84, 0xdf, 0xa0, 0x57, 0x91, 0xfb, 0xc8, - 0x67, 0x5f, 0xbe, 0xe3, 0x4f, 0x71, 0x65, 0xff, 0xde, 0x73, 0xef, 0xe1, - 0x22, 0x79, 0x2c, 0xbe, 0x82, 0x0b, 0x2d, 0x65, 0xd9, 0xc9, 0xc7, 0xd1, - 0xe4, 0x3a, 0x84, 0x61, 0x94, 0x25, 0x2f, 0xe7, 0xdb, 0xf7, 0x21, 0xac, - 0xad, 0x97, 0x7c, 0x07, 0x0a, 0x10, 0x36, 0x99, 0x14, 0xd0, 0xcc, 0xd1, - 0x73, 0x49, 0x7d, 0x0a, 0xfe, 0x42, 0x5b, 0xb1, 0x8e, 0xef, 0x87, 0x5c, - 0xf9, 0x35, 0xfd, 0x1f, 0xe4, 0xc6, 0xd5, 0x97, 0xbb, 0x84, 0xb2, 0xf7, - 0x9f, 0x71, 0x65, 0xfe, 0x12, 0x01, 0x3f, 0x9a, 0x85, 0x97, 0xfc, 0x3c, - 0x0e, 0xb6, 0x01, 0xec, 0xb2, 0xff, 0xfb, 0x37, 0xe1, 0x0c, 0x9c, 0x5e, - 0x72, 0x3f, 0x59, 0x7c, 0x7a, 0x86, 0xac, 0xad, 0x1f, 0x97, 0x94, 0x6f, - 0xff, 0x81, 0xe0, 0x96, 0x7d, 0x23, 0xe1, 0x66, 0xf5, 0x97, 0xef, 0x47, - 0x8d, 0x85, 0x97, 0x3c, 0xdc, 0x3f, 0x9d, 0xd5, 0x1a, 0x84, 0x66, 0x7a, - 0x13, 0x75, 0x25, 0x42, 0x0c, 0x0d, 0xf8, 0x7d, 0xcd, 0xbb, 0x1b, 0xcd, - 0x43, 0x25, 0xbf, 0x27, 0x84, 0x8e, 0x19, 0xaf, 0x28, 0xfa, 0xe9, 0x82, - 0xb2, 0xcd, 0x59, 0x5f, 0x1a, 0x96, 0x58, 0xc5, 0xfe, 0xef, 0xe1, 0x2e, - 0x18, 0xd6, 0x5f, 0xa5, 0xfe, 0x60, 0xd6, 0x5b, 0x79, 0x9e, 0xe3, 0x9a, - 0x5f, 0xbc, 0x7a, 0xfc, 0x2b, 0x2e, 0x8d, 0x61, 0xe8, 0xcc, 0x51, 0x7f, - 0xfa, 0x62, 0x8e, 0xf3, 0xbf, 0x00, 0xcb, 0x65, 0x97, 0xe3, 0x68, 0x93, - 0x71, 0x65, 0xfc, 0xff, 0x48, 0xa0, 0x6b, 0x2f, 0xfa, 0x3e, 0x91, 0x93, - 0x5f, 0xab, 0x28, 0xd1, 0xb7, 0xe4, 0xc7, 0x2a, 0x22, 0xdb, 0xf3, 0xcb, - 0x36, 0x85, 0x97, 0xff, 0x47, 0x39, 0x8d, 0xe9, 0x43, 0x78, 0xb2, 0xfe, - 0x62, 0x76, 0x36, 0x00, 0xb2, 0xff, 0xe8, 0xfa, 0x5d, 0x0c, 0x6c, 0x7f, - 0x75, 0x65, 0xfe, 0x3f, 0x38, 0x20, 0x86, 0xb2, 0x8d, 0x15, 0x04, 0x61, - 0xc4, 0x7b, 0xfa, 0x01, 0xfb, 0x43, 0xfa, 0xcb, 0xf6, 0x6f, 0x32, 0x1a, - 0xcb, 0xfc, 0x3e, 0x1f, 0xbd, 0x83, 0x59, 0x7f, 0xf1, 0xc7, 0x09, 0xe5, - 0x3b, 0x99, 0xa5, 0x97, 0x89, 0xf4, 0xb2, 0xf9, 0xdd, 0xf7, 0x56, 0x5f, - 0xff, 0xd8, 0x39, 0xc7, 0xfc, 0x4e, 0xef, 0xb3, 0xbe, 0x79, 0x2c, 0xbf, - 0xfc, 0x7c, 0xdb, 0x05, 0xc2, 0x0e, 0xec, 0x33, 0xc4, 0x4e, 0xb4, 0x6f, - 0x79, 0x1d, 0xfe, 0xfa, 0x5c, 0x9a, 0x51, 0xb2, 0xca, 0x1a, 0xb5, 0x80, - 0x13, 0xea, 0x1d, 0x6d, 0x2e, 0xf1, 0x83, 0x94, 0x11, 0x9f, 0x61, 0xc2, - 0x17, 0x5b, 0xff, 0xfb, 0xb9, 0xf7, 0x75, 0xa8, 0xef, 0xe2, 0x14, 0xbd, - 0x8b, 0x2e, 0x3d, 0xeb, 0x2f, 0xa0, 0xa5, 0xc5, 0x96, 0x3f, 0x91, 0x2f, - 0x32, 0xf7, 0xe3, 0x17, 0xfb, 0x5b, 0x14, 0x00, 0xe4, 0xb2, 0xbc, 0x7d, - 0x6e, 0x71, 0x7e, 0xf4, 0x6f, 0x1c, 0x2c, 0xbc, 0x37, 0x25, 0x96, 0xde, - 0xb2, 0xfd, 0xf7, 0x4a, 0x3c, 0xb2, 0xda, 0x83, 0x76, 0xe2, 0x77, 0xdf, - 0x4d, 0x1a, 0x59, 0x6d, 0x2c, 0xac, 0x36, 0xa1, 0x24, 0xa9, 0x23, 0xe4, - 0x65, 0x3a, 0x56, 0xe2, 0xd5, 0xfe, 0x2e, 0xe8, 0xf7, 0xe0, 0xd6, 0x5f, - 0xb5, 0x27, 0xf8, 0x55, 0x95, 0x07, 0xbc, 0x66, 0x97, 0xf8, 0x3f, 0x4b, - 0xbc, 0x0e, 0xe2, 0xcb, 0xf9, 0xc5, 0xfe, 0x3d, 0xc5, 0x95, 0x24, 0x44, - 0x78, 0x80, 0x8e, 0x6f, 0xe7, 0x7e, 0x8f, 0xc3, 0x59, 0x7f, 0xbe, 0xd4, - 0x1c, 0x9f, 0x8b, 0x2f, 0xfb, 0xbc, 0x0c, 0x84, 0x19, 0xf5, 0x65, 0x41, - 0xf7, 0x39, 0x9d, 0xfb, 0xd1, 0x92, 0x75, 0x97, 0xb0, 0xf8, 0xb2, 0xfd, - 0xde, 0xe0, 0x76, 0x59, 0x7f, 0xfd, 0xb3, 0xfb, 0x07, 0x3b, 0x08, 0xb0, - 0xff, 0x59, 0x5b, 0x22, 0x50, 0x03, 0x7a, 0x29, 0xbf, 0xef, 0x00, 0xde, - 0x77, 0x1f, 0xcb, 0x28, 0x69, 0x92, 0xe4, 0x2e, 0x9c, 0xc6, 0xf8, 0xa2, - 0x46, 0xb2, 0xfc, 0xe5, 0xf4, 0x8d, 0x65, 0xe0, 0xc1, 0x2c, 0xbf, 0xff, - 0xc7, 0xd8, 0x27, 0x96, 0x0f, 0x8f, 0xa3, 0xf1, 0xef, 0x59, 0x5a, 0x46, - 0x0f, 0x88, 0x08, 0x9f, 0x78, 0xdd, 0xff, 0xfb, 0x85, 0x3b, 0xce, 0x7d, - 0xfc, 0x24, 0x4f, 0x25, 0x97, 0xff, 0xff, 0x46, 0xb2, 0x68, 0x6e, 0x00, - 0xc7, 0xe8, 0xef, 0x18, 0xd6, 0x6e, 0xac, 0xbf, 0xde, 0x36, 0x27, 0xc3, - 0xa6, 0x16, 0x5f, 0xf3, 0x60, 0x80, 0xe5, 0xfb, 0x25, 0x65, 0xfe, 0x36, - 0xeb, 0x27, 0xcf, 0xf5, 0x97, 0xfd, 0x1f, 0xeb, 0x50, 0x28, 0xfe, 0x59, - 0x7f, 0x85, 0x6f, 0xa0, 0xcb, 0x65, 0x97, 0xff, 0x9e, 0x47, 0xac, 0xfa, - 0x69, 0x46, 0xb6, 0x59, 0x50, 0x88, 0x0f, 0xcd, 0x2f, 0xff, 0x8b, 0x39, - 0x8d, 0x80, 0x67, 0x4f, 0x58, 0xb2, 0x80, 0x9e, 0xb3, 0x4e, 0x7c, 0x79, - 0xf9, 0xb7, 0x61, 0x79, 0xbc, 0x8e, 0xff, 0xd3, 0x73, 0xa1, 0xfb, 0x06, - 0xe4, 0xb2, 0xa1, 0x57, 0x5e, 0x4a, 0x4b, 0x76, 0x0b, 0xfb, 0x6c, 0xd1, - 0x82, 0x16, 0x5f, 0x10, 0xe1, 0xab, 0x2f, 0xff, 0x82, 0x5d, 0xe7, 0x8e, - 0x62, 0x86, 0xbc, 0x96, 0x5f, 0x61, 0x05, 0xd6, 0x53, 0x4f, 0xbf, 0x7a, - 0x7d, 0xfc, 0xff, 0xe0, 0xde, 0x4b, 0x2a, 0x11, 0xc3, 0x90, 0x90, 0x32, - 0x4b, 0xef, 0xf8, 0xca, 0x32, 0x56, 0x51, 0xa6, 0xdb, 0xe8, 0xc3, 0x9c, - 0xca, 0xfc, 0x7e, 0x00, 0x92, 0x59, 0x50, 0xd8, 0xdc, 0x6d, 0x0d, 0x31, - 0xc6, 0x11, 0x92, 0xe4, 0x81, 0x1c, 0x51, 0xc6, 0x35, 0x34, 0x64, 0x7a, - 0x2f, 0x6c, 0x26, 0xfd, 0x1a, 0x2b, 0xc3, 0xd7, 0xf3, 0xe2, 0x96, 0x83, - 0xd8, 0xe8, 0xc2, 0x6b, 0x7f, 0xf6, 0x17, 0xf9, 0x9a, 0xe7, 0x63, 0x16, - 0x5f, 0xf7, 0xdd, 0xcd, 0x1e, 0xce, 0xd5, 0x97, 0xb3, 0x7e, 0x2c, 0xb6, - 0x7e, 0x89, 0x92, 0x42, 0xe1, 0xd5, 0xe6, 0x5c, 0x8d, 0x65, 0xf4, 0x13, - 0xc9, 0x65, 0xfb, 0x37, 0x1c, 0xbf, 0x9c, 0x78, 0x1a, 0x20, 0xbf, 0xb7, - 0xf8, 0xe3, 0x5c, 0x59, 0x7f, 0xfe, 0x97, 0x0b, 0x3b, 0xc3, 0xc6, 0xf7, - 0x58, 0x2a, 0xcb, 0xff, 0x78, 0xda, 0x3c, 0x9a, 0x33, 0x4b, 0x2f, 0x4a, - 0x3e, 0x59, 0x7e, 0x09, 0x06, 0x3e, 0x59, 0x7d, 0x1f, 0xbb, 0x56, 0x5a, - 0x58, 0x8a, 0x59, 0x8f, 0x9a, 0x3a, 0x45, 0x15, 0xf2, 0x67, 0x85, 0x0f, - 0xab, 0xee, 0x1f, 0x61, 0x65, 0x41, 0xe5, 0x39, 0x4d, 0xf8, 0xb3, 0xf0, - 0xf1, 0x65, 0xfe, 0x9c, 0x4f, 0xb1, 0x47, 0xcb, 0x2e, 0x01, 0xe1, 0xee, - 0xe8, 0xa2, 0xf8, 0x1e, 0x39, 0x96, 0x5f, 0xff, 0x8b, 0x18, 0x60, 0xc7, - 0xe3, 0x9b, 0xc7, 0xf7, 0x56, 0x54, 0x1f, 0xde, 0x11, 0xdc, 0x1d, 0x2c, - 0xbc, 0x07, 0xd2, 0xcb, 0xff, 0x6d, 0x84, 0xdc, 0xef, 0x04, 0xe2, 0xcb, - 0xf7, 0x01, 0x1a, 0x61, 0x65, 0xfc, 0x7f, 0xfd, 0x2c, 0xea, 0xca, 0xd9, - 0x19, 0x7e, 0x17, 0x71, 0xcf, 0xd0, 0x37, 0x94, 0xdf, 0x4b, 0xb9, 0xfa, - 0xcb, 0xdc, 0x39, 0x96, 0x57, 0xc7, 0x81, 0xc2, 0x3b, 0xee, 0xf8, 0x20, - 0x59, 0x7e, 0xc3, 0x1f, 0x8d, 0x65, 0x6c, 0x79, 0x32, 0x23, 0xbc, 0xfa, - 0x61, 0x65, 0x42, 0x2b, 0x31, 0xb1, 0xc8, 0xef, 0xfe, 0xcf, 0xbb, 0xc3, - 0x28, 0xfd, 0xda, 0xb2, 0xf4, 0x9b, 0xe5, 0x95, 0xb1, 0xf0, 0xf5, 0x12, - 0xff, 0xff, 0xd3, 0xf9, 0xdf, 0x38, 0xd9, 0x96, 0x6f, 0x2c, 0xe7, 0x0f, - 0xee, 0xac, 0xbf, 0xbe, 0xe6, 0x36, 0x37, 0x16, 0x5e, 0x60, 0xc5, 0x59, - 0x7e, 0x14, 0xf0, 0x98, 0x59, 0x46, 0x78, 0xc1, 0x1e, 0xac, 0x4c, 0xb4, - 0xc8, 0xdd, 0xc8, 0x9d, 0xef, 0xe7, 0x07, 0x9f, 0x77, 0x8b, 0x2d, 0x8b, - 0x2f, 0xcf, 0x37, 0x8f, 0x4b, 0x2a, 0x71, 0xb8, 0xf0, 0x85, 0xf7, 0x0a, - 0x1a, 0xb2, 0xa0, 0xf1, 0x3e, 0x23, 0xbd, 0xe9, 0x35, 0x65, 0xde, 0x35, - 0x95, 0x86, 0xcf, 0xa3, 0xb5, 0x0c, 0x8c, 0xb9, 0x3a, 0xe2, 0x1b, 0x11, - 0xda, 0xfc, 0xfb, 0xe8, 0x53, 0xbc, 0x3a, 0xca, 0x33, 0x9e, 0x47, 0x77, - 0xd3, 0xa0, 0xc2, 0xb2, 0x7d, 0x56, 0xff, 0x44, 0xc7, 0xf7, 0x02, 0xd5, - 0x97, 0x34, 0x0b, 0x2b, 0x63, 0xcc, 0x19, 0xad, 0xfc, 0x31, 0x06, 0x59, - 0xe5, 0x97, 0xec, 0xe0, 0x75, 0xb2, 0xca, 0xc3, 0xd7, 0x22, 0xeb, 0xa5, - 0xd5, 0x97, 0xf0, 0x06, 0x7b, 0xe0, 0x6b, 0x2d, 0xe5, 0x96, 0xfd, 0x65, - 0xdc, 0x92, 0xca, 0x1a, 0x20, 0x1c, 0x5f, 0xf2, 0xfe, 0x08, 0x84, 0x4a, - 0xfe, 0xda, 0x69, 0x4f, 0x7a, 0xd9, 0x65, 0xe7, 0xcd, 0x2c, 0xbc, 0x59, - 0xd5, 0x97, 0xbd, 0x8d, 0x59, 0x5e, 0x3d, 0x22, 0x1b, 0xe8, 0xdd, 0xdd, - 0x25, 0x97, 0xa3, 0xee, 0x2c, 0xbe, 0x32, 0x96, 0x2c, 0xbd, 0xb3, 0x92, - 0xca, 0x19, 0xec, 0xb4, 0x77, 0xa4, 0x17, 0xd0, 0x37, 0x92, 0xcb, 0xf6, - 0x77, 0xc7, 0xd5, 0x97, 0xe7, 0xfb, 0x3e, 0xea, 0xca, 0xf1, 0xe8, 0x74, - 0x9e, 0xf0, 0x4b, 0x65, 0x95, 0xb2, 0x2c, 0x18, 0x71, 0xf1, 0x15, 0xb6, - 0x59, 0x6d, 0x2c, 0xad, 0x8d, 0x19, 0x89, 0x5f, 0xdb, 0x4e, 0xd9, 0xdf, - 0xcb, 0x2e, 0xfb, 0xab, 0x2f, 0xff, 0xf7, 0x8f, 0x58, 0xd7, 0xf9, 0x98, - 0xc2, 0xfa, 0x93, 0xfe, 0xb2, 0xfd, 0x84, 0x3f, 0x42, 0xca, 0x64, 0x2b, - 0x4e, 0x88, 0x44, 0xc8, 0xbb, 0x1b, 0xce, 0x1b, 0xfe, 0x55, 0x72, 0x12, - 0x31, 0x08, 0xc0, 0xac, 0x97, 0xfd, 0x83, 0x19, 0xfd, 0x9f, 0x75, 0x65, - 0xf0, 0x0a, 0x24, 0xb2, 0xbc, 0x7b, 0x6e, 0x75, 0x7f, 0xa3, 0x3b, 0x1e, - 0x71, 0xac, 0xbd, 0x1f, 0x49, 0x65, 0x6c, 0x7d, 0xe3, 0x21, 0xdd, 0x31, - 0xbe, 0xcc, 0x2e, 0xac, 0xbf, 0xfd, 0xbc, 0xcb, 0xff, 0x1b, 0xcb, 0xa7, - 0xb2, 0xcb, 0xe0, 0xbe, 0xa4, 0xb2, 0xa0, 0xfb, 0x86, 0x99, 0x7f, 0xf0, - 0xe0, 0x7a, 0x8e, 0x98, 0x0c, 0x6b, 0x2f, 0xa6, 0x8d, 0xd9, 0x2c, 0xbf, - 0xba, 0x01, 0x8d, 0xba, 0x59, 0x7e, 0xe9, 0x94, 0x7e, 0xb2, 0xff, 0xa6, - 0xe6, 0xf7, 0x2d, 0x82, 0x35, 0x97, 0xf3, 0x8b, 0xff, 0xed, 0x9f, 0x59, - 0x7d, 0x9d, 0xc6, 0xac, 0xb8, 0x98, 0x59, 0x4e, 0x6e, 0x02, 0x43, 0x52, - 0x44, 0x67, 0x1b, 0x2f, 0xfc, 0x51, 0xd9, 0x66, 0xe3, 0x97, 0xeb, 0x2f, - 0x7e, 0x7f, 0xac, 0xbe, 0xda, 0x6f, 0x1a, 0xcb, 0x7b, 0x0f, 0x08, 0x23, - 0xd7, 0xfe, 0x0e, 0xe7, 0x8e, 0x73, 0x1a, 0xce, 0x2c, 0xbf, 0xf1, 0x3b, - 0x1e, 0x79, 0x70, 0xc6, 0xb2, 0xfd, 0xe3, 0x27, 0xd9, 0x65, 0x80, 0xb2, - 0xf8, 0x32, 0xce, 0x00, 0xdc, 0x11, 0x3d, 0x35, 0x15, 0xa4, 0xed, 0x78, - 0xb3, 0xab, 0x2e, 0x11, 0xab, 0x28, 0xcf, 0x54, 0x88, 0xba, 0x37, 0x77, - 0xc3, 0x59, 0x50, 0xb9, 0x85, 0xb1, 0x9c, 0xa1, 0x1c, 0x32, 0x1c, 0x43, - 0x60, 0x9b, 0xe2, 0xf3, 0x27, 0x9a, 0x19, 0x2d, 0x23, 0xf4, 0x20, 0x88, - 0x9f, 0xb1, 0xa3, 0x84, 0xb6, 0xfe, 0x9d, 0x34, 0x74, 0xb7, 0xac, 0xbf, - 0xfa, 0x37, 0xea, 0x35, 0x87, 0xe8, 0x1a, 0xcb, 0xa3, 0x16, 0x51, 0x1e, - 0xcf, 0x11, 0x2e, 0x76, 0xac, 0xba, 0x69, 0xf5, 0x94, 0x46, 0xc7, 0x78, - 0xb5, 0xc1, 0xea, 0xca, 0x92, 0x62, 0xd9, 0x08, 0xb3, 0x52, 0x9f, 0x22, - 0xb3, 0x36, 0x44, 0x22, 0x3a, 0x59, 0x2d, 0xd3, 0xcc, 0x21, 0x27, 0xb2, - 0xa6, 0x57, 0x4c, 0x9e, 0x23, 0x8c, 0xa9, 0x01, 0x94, 0x64, 0x89, 0xcd, - 0xfd, 0xa3, 0xda, 0x94, 0xb2, 0x51, 0xcf, 0x57, 0xe5, 0x39, 0x8d, 0x89, - 0x52, 0x80, 0x9d, 0x62, 0xfa, 0x5f, 0xe9, 0xca, 0xb6, 0x9a, 0x76, 0xd3, - 0x53, 0xa2, 0xcd, 0x96, 0xfd, 0xea, 0x66, 0x1b, 0xce, 0x62, 0x7f, 0x38, - 0x22, 0xcb, 0x85, 0xb1, 0x52, 0x73, 0xf9, 0x59, 0x19, 0x76, 0x94, 0xe8, - 0x18, 0xc5, 0xf7, 0xbd, 0x0b, 0x0a, 0x09, 0xf9, 0x73, 0x02, 0x4f, 0x11, - 0xee, 0xc7, 0xdb, 0x4c, 0xe1, 0x19, 0xa2, 0x6a, 0x5e, 0xc4, 0x4e, 0x45, - 0xff, 0xe6, 0x6d, 0x79, 0x33, 0xcd, 0x01, 0xdc, 0x0a, 0x89, 0xb1, 0x7e, - 0xd0, 0x1d, 0xc0, 0xa8, 0xab, 0x57, 0x7f, 0xbd, 0x65, 0xdc, 0x9f, 0x59, - 0x66, 0x78, 0x7d, 0x1e, 0x34, 0xe0, 0xd5, 0xdb, 0xf4, 0xb2, 0xe7, 0x85, - 0x97, 0xfa, 0x52, 0x0f, 0x4a, 0x24, 0xb2, 0xfb, 0x3c, 0xfd, 0x59, 0x66, - 0x4e, 0x1e, 0xa1, 0x19, 0xdf, 0xff, 0xfa, 0x51, 0xbe, 0x0f, 0x40, 0x36, - 0xbc, 0x8c, 0xb0, 0x78, 0xc2, 0xcb, 0xff, 0xda, 0x39, 0x64, 0xb1, 0xe4, - 0x50, 0xd5, 0x97, 0xfb, 0x58, 0x08, 0xfc, 0x46, 0xac, 0xbf, 0xde, 0x8d, - 0xb5, 0x18, 0x35, 0x97, 0xff, 0xe8, 0xda, 0x35, 0x0d, 0x88, 0xef, 0x8f, - 0xf6, 0xac, 0xa8, 0x44, 0x47, 0x8c, 0xef, 0x40, 0xe6, 0x59, 0x52, 0x4e, - 0xb8, 0xda, 0xf4, 0x8f, 0xe8, 0x5e, 0xf4, 0x8a, 0xfb, 0x4d, 0xf0, 0xd6, - 0x5f, 0xfd, 0xa9, 0x16, 0x77, 0x90, 0xde, 0x81, 0x65, 0x41, 0xf3, 0x84, - 0x8e, 0xf0, 0xf0, 0x96, 0x5f, 0xdc, 0x91, 0x81, 0xf4, 0xb2, 0xf3, 0xb8, - 0x15, 0x15, 0xa2, 0xfc, 0xc7, 0xdc, 0x0f, 0xcb, 0x2a, 0x11, 0x02, 0x02, - 0xd3, 0x28, 0xbf, 0x82, 0x6c, 0x6a, 0x06, 0xb2, 0xff, 0xf1, 0xf6, 0x50, - 0x0f, 0x1f, 0x78, 0xff, 0x2c, 0xad, 0x22, 0x99, 0xa5, 0xdb, 0xcb, 0xaf, - 0xef, 0xe7, 0x66, 0x8d, 0x85, 0x97, 0xfd, 0x83, 0x3e, 0x4c, 0x50, 0x35, - 0x94, 0x33, 0xe9, 0x73, 0x1b, 0xfe, 0x80, 0x63, 0x70, 0xbb, 0x3e, 0xb2, - 0xff, 0x7a, 0x35, 0xff, 0x73, 0x65, 0x97, 0x78, 0xda, 0x7d, 0xfe, 0x3a, - 0xbd, 0x2f, 0xa4, 0xb2, 0xf0, 0x79, 0xd5, 0x97, 0xff, 0xe9, 0x39, 0x1f, - 0x63, 0xc0, 0xc1, 0x94, 0x71, 0x65, 0xff, 0xf8, 0xf7, 0x60, 0x83, 0x23, - 0xe7, 0x22, 0x73, 0x40, 0xb2, 0x8d, 0x15, 0x6e, 0xa5, 0x71, 0xfc, 0xb2, - 0xff, 0xf8, 0x11, 0xac, 0xfd, 0xda, 0xf2, 0x83, 0x02, 0xcb, 0xff, 0xe9, - 0x73, 0x0a, 0x1a, 0xf9, 0xde, 0xc3, 0x56, 0x54, 0x22, 0x6d, 0xd3, 0xab, - 0x48, 0xd3, 0xec, 0x2c, 0xa9, 0xa9, 0xf2, 0x7a, 0x19, 0x1d, 0x87, 0xa5, - 0xff, 0xff, 0xdb, 0xcf, 0xbc, 0xc6, 0x01, 0xe3, 0xee, 0x4c, 0x50, 0xdd, - 0xb0, 0x55, 0x97, 0xff, 0xdd, 0x7c, 0xe0, 0xf2, 0x5e, 0x8d, 0xe3, 0x85, - 0x97, 0xff, 0xff, 0xf1, 0xf4, 0x78, 0x1e, 0x4e, 0xf6, 0x03, 0xc1, 0xd8, - 0xf0, 0xbe, 0x97, 0x38, 0x18, 0x59, 0x4e, 0x8d, 0xc2, 0x50, 0xa8, 0x4d, - 0xcd, 0xe3, 0x52, 0xbf, 0xd1, 0xd7, 0xf4, 0xe1, 0xc2, 0xcb, 0xe9, 0x74, - 0xf6, 0x59, 0x7e, 0xe7, 0x1c, 0xb6, 0x59, 0x7e, 0x13, 0xa5, 0x1f, 0xac, - 0xb7, 0x96, 0x57, 0xc8, 0x85, 0x69, 0x1e, 0xf2, 0x81, 0x0a, 0x6f, 0xff, - 0xbf, 0x7c, 0xf3, 0x9e, 0xec, 0x34, 0x9d, 0x85, 0x97, 0xfe, 0x3e, 0x60, - 0xfe, 0xe4, 0x6b, 0x8b, 0x2f, 0xf3, 0xcb, 0xa7, 0xb7, 0x8d, 0x65, 0x42, - 0x60, 0x98, 0x82, 0x05, 0x13, 0x3f, 0xbf, 0x67, 0x8f, 0x1a, 0xb2, 0xfc, - 0x7f, 0xb4, 0xf4, 0xb2, 0xff, 0xff, 0x9f, 0xb0, 0x4f, 0xb4, 0x6a, 0x0e, - 0x50, 0xd2, 0x86, 0x16, 0x5f, 0xe3, 0xe1, 0x85, 0x96, 0x38, 0x59, 0x44, - 0x89, 0x9e, 0xb1, 0xdf, 0xde, 0x80, 0x13, 0xb5, 0x65, 0xff, 0x9c, 0xc1, - 0xe7, 0x0e, 0xda, 0x35, 0x94, 0x67, 0xd4, 0x45, 0x97, 0xfe, 0xc7, 0xda, - 0x30, 0x87, 0xe8, 0x59, 0x5b, 0x27, 0x9e, 0x32, 0x63, 0x86, 0x0f, 0xa1, - 0x18, 0x44, 0x17, 0xfa, 0x51, 0xad, 0xa3, 0x5b, 0x2c, 0xbe, 0x96, 0xb1, - 0xab, 0x2f, 0x66, 0xbf, 0x59, 0x7e, 0x9b, 0x06, 0xdd, 0xc5, 0x97, 0xf1, - 0x40, 0xbf, 0x4b, 0x8b, 0x2b, 0xe4, 0x4d, 0x19, 0x14, 0xc3, 0xbb, 0xa5, - 0x97, 0x98, 0x08, 0x16, 0x54, 0x26, 0x5d, 0x90, 0xcf, 0x61, 0x06, 0xff, - 0xff, 0xfc, 0x60, 0xce, 0xc1, 0x77, 0x93, 0xa0, 0xc7, 0x8d, 0x9d, 0xa8, - 0x39, 0x3f, 0x16, 0x5f, 0xff, 0x6b, 0xfe, 0x7f, 0xe7, 0x91, 0xf4, 0xa3, - 0xf5, 0x95, 0x88, 0xd5, 0x0c, 0x20, 0xef, 0xec, 0xeb, 0x97, 0xe1, 0x59, - 0x7f, 0x7a, 0x71, 0xec, 0xe4, 0xb2, 0xfe, 0x6f, 0x06, 0x4e, 0x2a, 0xcb, - 0xf7, 0xfc, 0x65, 0x19, 0x46, 0x51, 0x65, 0x41, 0xf3, 0xb9, 0x75, 0xf3, - 0xfe, 0xe3, 0x59, 0x52, 0x4c, 0x17, 0x0b, 0x4a, 0x12, 0xdc, 0x20, 0xbf, - 0xf6, 0x6a, 0x62, 0xc1, 0xfa, 0x37, 0xac, 0xb3, 0x36, 0x43, 0x63, 0x46, - 0xc9, 0x19, 0x9e, 0xda, 0x62, 0x3d, 0x8d, 0xa1, 0x6c, 0x32, 0x1c, 0x8d, - 0x09, 0x88, 0x4d, 0x82, 0x12, 0x1f, 0x16, 0x9c, 0xa0, 0x2d, 0x47, 0x5c, - 0xd2, 0x8f, 0x47, 0x7a, 0xf2, 0x82, 0x8a, 0x38, 0x2e, 0x46, 0x15, 0xd8, - 0xcb, 0x04, 0x41, 0xbf, 0x68, 0x0e, 0xe0, 0x54, 0x58, 0x0b, 0xfc, 0xd3, - 0xe0, 0x63, 0x53, 0x2c, 0xbe, 0x00, 0x9e, 0x99, 0x65, 0x41, 0xec, 0xb9, - 0xa5, 0xef, 0xc4, 0xfd, 0x65, 0xf8, 0x79, 0x9f, 0xf1, 0x65, 0x99, 0xe2, - 0x3d, 0x79, 0x08, 0xde, 0x90, 0x08, 0x41, 0x7e, 0xd0, 0x1d, 0xc0, 0xa8, - 0x9d, 0x57, 0xff, 0xfb, 0xd1, 0xb0, 0xf1, 0xac, 0xf9, 0xcc, 0xf1, 0xf0, - 0x3b, 0x2c, 0xbf, 0x33, 0x6b, 0xc9, 0x9e, 0x22, 0x66, 0x63, 0x4b, 0xff, - 0xf8, 0x83, 0x1d, 0xe6, 0x13, 0x3f, 0xff, 0x8f, 0x3e, 0xcb, 0x2f, 0xe2, - 0x67, 0x33, 0xcc, 0xeb, 0x2a, 0x11, 0x1d, 0x8b, 0xd7, 0x98, 0x86, 0xac, - 0xbf, 0x66, 0xdb, 0x40, 0x16, 0x5f, 0x38, 0x04, 0x6a, 0xcb, 0xd2, 0xe3, - 0x36, 0x0f, 0xa4, 0x87, 0x77, 0x94, 0xdf, 0xb4, 0x07, 0x70, 0x2a, 0x2d, - 0x95, 0xff, 0xde, 0x3e, 0xf8, 0x3f, 0x63, 0x5f, 0xe5, 0x97, 0xf7, 0x5f, - 0xd3, 0x87, 0x0b, 0x2f, 0xff, 0xe9, 0x33, 0xe4, 0x1e, 0x0c, 0xf3, 0x99, - 0xd2, 0x85, 0x95, 0x08, 0x88, 0x72, 0xfb, 0xf4, 0xa0, 0xf7, 0xc2, 0xcb, - 0xfe, 0x8e, 0x33, 0xf1, 0x81, 0xf4, 0xb2, 0xa0, 0xf8, 0xbf, 0x28, 0xbf, - 0xe8, 0x94, 0x6b, 0x68, 0xd6, 0xcb, 0x2c, 0xcf, 0x13, 0xe1, 0x01, 0xa3, - 0x61, 0x9c, 0xf0, 0x83, 0x22, 0x2b, 0xff, 0x13, 0x36, 0x84, 0xfa, 0x4f, - 0xba, 0xb2, 0xff, 0xe0, 0xf1, 0x9e, 0x69, 0xf9, 0xe7, 0x92, 0xcb, 0x9f, - 0xfc, 0x44, 0x47, 0xe8, 0x57, 0x7c, 0x05, 0x97, 0xc0, 0x77, 0x02, 0xa2, - 0xe6, 0x59, 0xab, 0x2b, 0x46, 0xfc, 0x52, 0xeb, 0xf8, 0xb3, 0xef, 0xce, - 0x4b, 0x2c, 0xcb, 0x59, 0x5a, 0x3c, 0x3d, 0xe5, 0xd7, 0x4c, 0xd5, 0x94, - 0xb2, 0xcc, 0xe1, 0x30, 0x3c, 0x57, 0x36, 0x51, 0x49, 0x27, 0xc6, 0x2f, - 0xda, 0x03, 0xb8, 0x15, 0x17, 0x7a, 0xff, 0x49, 0x9f, 0x35, 0xa3, 0x15, - 0x65, 0x99, 0xe1, 0xf5, 0xb9, 0xa5, 0xff, 0x14, 0x3e, 0xdf, 0x72, 0x06, - 0xb2, 0xe1, 0xfe, 0xb2, 0xf1, 0x66, 0xcb, 0x2c, 0xcc, 0x67, 0xda, 0xc1, - 0xc9, 0x0c, 0x54, 0x42, 0xa8, 0xe7, 0x31, 0x19, 0xfe, 0x04, 0x6f, 0xa1, - 0x84, 0x75, 0x8e, 0xce, 0xa5, 0x2a, 0xb6, 0x1c, 0x7e, 0x86, 0x93, 0xc2, - 0x2b, 0xf9, 0x44, 0xc5, 0x0e, 0x2e, 0x46, 0x65, 0xd8, 0x5f, 0x89, 0x09, - 0x5b, 0xff, 0x0a, 0xe5, 0xb7, 0x0c, 0xbe, 0x92, 0xcb, 0xff, 0xb3, 0x6c, - 0x17, 0xd9, 0xcc, 0x32, 0x59, 0x7f, 0xe3, 0x22, 0xc6, 0x00, 0x17, 0x1a, - 0xcb, 0xf6, 0x78, 0x6e, 0x4b, 0x2e, 0x36, 0x7e, 0x47, 0x31, 0x20, 0x71, - 0x0c, 0x43, 0xdb, 0xf7, 0x38, 0xd7, 0x92, 0xcb, 0xff, 0xff, 0xff, 0x78, - 0xfc, 0x70, 0x5d, 0x27, 0x63, 0x3a, 0x1e, 0x9f, 0x79, 0xe3, 0xd4, 0x6c, - 0xfa, 0x02, 0xcb, 0xb9, 0x0b, 0x2f, 0xfe, 0xf8, 0x01, 0x7f, 0xbb, 0x98, - 0x4c, 0x2c, 0xbc, 0x4e, 0xce, 0x13, 0x1c, 0x01, 0x47, 0x21, 0x31, 0xd1, - 0x6b, 0xf9, 0x91, 0x3c, 0xc7, 0xda, 0xd9, 0x65, 0xe0, 0xbb, 0x56, 0x5f, - 0xb3, 0x77, 0xb0, 0xc2, 0xcb, 0x6e, 0xac, 0xad, 0x8d, 0xfe, 0x15, 0xd6, - 0x8f, 0xf0, 0x96, 0xef, 0xfd, 0xc7, 0x63, 0xc7, 0x04, 0x18, 0x59, 0x7f, - 0xef, 0x3f, 0x5f, 0xdf, 0x4b, 0x3a, 0xb2, 0xb0, 0xff, 0x0c, 0xf6, 0xe7, - 0xfd, 0x65, 0xff, 0xff, 0xe2, 0x71, 0x4b, 0x3b, 0xdc, 0xda, 0x09, 0xd8, - 0xe3, 0x63, 0x08, 0x6b, 0x2f, 0x60, 0x9c, 0x59, 0x58, 0x8a, 0x9d, 0x0b, - 0xee, 0xba, 0xdf, 0xff, 0xfc, 0x41, 0xe7, 0x8f, 0x59, 0xbe, 0x0b, 0xb8, - 0x51, 0xfb, 0x5e, 0x4b, 0x2f, 0xc3, 0x3d, 0xfa, 0xc5, 0x96, 0xf4, 0x22, - 0x6b, 0x1c, 0x6f, 0xf3, 0xcb, 0x59, 0x3e, 0x7f, 0xac, 0xbc, 0xee, 0x05, - 0x44, 0xae, 0xbf, 0xcc, 0x39, 0x7f, 0xdc, 0xf2, 0xca, 0x01, 0xee, 0x19, - 0x45, 0xfc, 0xff, 0x67, 0xb0, 0x0b, 0x2f, 0xf7, 0xc4, 0xec, 0x3f, 0x64, - 0xb2, 0xff, 0xef, 0x64, 0x81, 0xe3, 0x1c, 0x17, 0x56, 0x51, 0x9f, 0xbf, - 0x4d, 0x2a, 0x49, 0xcf, 0x8c, 0x9f, 0x50, 0x92, 0x69, 0x09, 0x42, 0x92, - 0xff, 0x46, 0x9e, 0x4f, 0xf4, 0x96, 0x5f, 0x77, 0x47, 0xf2, 0xcb, 0xfc, - 0x50, 0xd1, 0xe9, 0xc0, 0xb2, 0xff, 0xff, 0xfb, 0x4e, 0x42, 0x47, 0xf9, - 0x2f, 0x46, 0xf1, 0xc3, 0x3c, 0x20, 0xcb, 0x38, 0xb2, 0xdb, 0x2c, 0xb6, - 0xcb, 0x2a, 0x0d, 0x24, 0x84, 0xaf, 0xd8, 0x07, 0x96, 0x2c, 0xbf, 0xff, - 0xcf, 0xf7, 0x33, 0x5d, 0xeb, 0xec, 0x23, 0x47, 0xe3, 0x61, 0x65, 0xf6, - 0xf7, 0x94, 0xf4, 0xb2, 0xff, 0xb0, 0xf7, 0x94, 0x66, 0xa4, 0xb2, 0xff, - 0xfd, 0xd9, 0x66, 0xe3, 0x97, 0xff, 0x77, 0x51, 0x82, 0xac, 0x14, 0xdc, - 0x5f, 0xbe, 0xef, 0xa3, 0xf5, 0x95, 0x88, 0xf6, 0x76, 0x10, 0xb5, 0xdf, - 0xfe, 0x98, 0xa3, 0xbc, 0xef, 0xc0, 0x32, 0xd9, 0x65, 0xff, 0x38, 0xa3, - 0xf4, 0x6d, 0x82, 0xac, 0xa3, 0x44, 0x39, 0x26, 0x5f, 0xff, 0xb0, 0xff, - 0xc6, 0x9f, 0x79, 0x0d, 0x7f, 0xba, 0xb2, 0xff, 0xff, 0x01, 0xf4, 0xfe, - 0xfa, 0x59, 0xdc, 0xec, 0x05, 0x97, 0x8b, 0x2f, 0xfe, 0x7f, 0xa4, 0x7d, - 0xf4, 0x6b, 0xb0, 0xb2, 0xff, 0xa1, 0xbd, 0xc9, 0xa4, 0x7d, 0x59, 0x52, - 0x4c, 0xd8, 0xd5, 0x5a, 0xc9, 0xd4, 0x4b, 0xff, 0xfd, 0xe3, 0x18, 0xf0, - 0x5f, 0xba, 0x17, 0xe7, 0x85, 0x71, 0xac, 0xbe, 0x0b, 0xea, 0x4b, 0x2f, - 0xe2, 0x8d, 0xbf, 0x7e, 0xac, 0xbf, 0xce, 0x31, 0x37, 0x60, 0xa4, 0xb2, - 0xd0, 0x03, 0xe4, 0x69, 0x75, 0xff, 0xfe, 0x3e, 0xbb, 0x5c, 0xbf, 0xf0, - 0xae, 0x5b, 0x00, 0xf6, 0x59, 0x43, 0x4c, 0x3c, 0xe1, 0x0c, 0xe4, 0xf7, - 0xfc, 0x1f, 0xda, 0xf2, 0xe6, 0x86, 0xb2, 0xff, 0xff, 0x61, 0x97, 0x70, - 0xa7, 0x13, 0x8e, 0x0b, 0x68, 0xd2, 0xcb, 0x67, 0x51, 0x33, 0xbc, 0xee, - 0xff, 0xff, 0xf7, 0xb1, 0xbf, 0xbe, 0xb3, 0x7e, 0x0f, 0x38, 0x17, 0xfb, - 0xc2, 0xbf, 0x56, 0x5f, 0xfb, 0x3e, 0xef, 0x61, 0xbe, 0xcd, 0x96, 0x5f, - 0xf4, 0xc0, 0xf1, 0xb6, 0x34, 0xc2, 0xcb, 0xfd, 0xfe, 0x6b, 0x33, 0xbc, - 0x59, 0x58, 0x7d, 0xdf, 0x1d, 0xd0, 0xd7, 0x52, 0x72, 0x35, 0x70, 0x1e, - 0xfa, 0x37, 0x32, 0x86, 0x6f, 0x4a, 0x85, 0x7b, 0x12, 0x15, 0xd7, 0xfb, - 0xcf, 0x2f, 0xf5, 0x9f, 0x2c, 0xbf, 0xff, 0x18, 0xfc, 0xe7, 0xd8, 0x20, - 0x1b, 0x5a, 0x6b, 0x2d, 0x9e, 0x44, 0x39, 0x1a, 0xdf, 0xf6, 0x7d, 0xc1, - 0xc3, 0x96, 0xcb, 0x2f, 0xfe, 0x01, 0xeb, 0xd9, 0x37, 0x8f, 0x5b, 0x2c, - 0xbf, 0xe7, 0x97, 0x3d, 0x1a, 0x10, 0x6b, 0x2a, 0x48, 0xe0, 0xc2, 0x7f, - 0x8e, 0x7a, 0x8d, 0x7f, 0xff, 0xbd, 0x80, 0x2c, 0x6e, 0x16, 0x74, 0x3f, - 0xb5, 0xe4, 0xb2, 0xff, 0xc5, 0x9e, 0xc9, 0xa4, 0x7a, 0x92, 0xcb, 0xff, - 0xff, 0xef, 0xe0, 0x80, 0xfd, 0x7f, 0xbf, 0xcd, 0xe7, 0xd9, 0x78, 0xfb, - 0xc3, 0x1a, 0xcb, 0xff, 0x1e, 0xf3, 0xec, 0xd2, 0x82, 0xea, 0xca, 0x92, - 0x6b, 0xa0, 0x5f, 0xf8, 0xfb, 0xb0, 0x80, 0xbf, 0xfc, 0xf9, 0x2f, 0x61, - 0x96, 0x7f, 0x3f, 0x8b, 0x2f, 0x3c, 0x99, 0xcf, 0x2d, 0x8d, 0xf4, 0x42, - 0xd6, 0x50, 0x9d, 0x1c, 0x32, 0x72, 0x53, 0x5f, 0xca, 0x86, 0x67, 0x31, - 0x1e, 0x8c, 0x9b, 0x0a, 0x4f, 0x10, 0x7e, 0x4c, 0x51, 0xad, 0xf2, 0x77, - 0xfb, 0xb1, 0xf8, 0x89, 0x1c, 0xd6, 0xea, 0x25, 0xcc, 0xbc, 0x59, 0x7e, - 0xec, 0x05, 0x97, 0x8b, 0x2f, 0xd8, 0x07, 0x96, 0x2c, 0xbf, 0xd8, 0x33, - 0x2e, 0xe7, 0x96, 0x5e, 0xcf, 0x33, 0x65, 0x11, 0x39, 0x83, 0x5e, 0x2b, - 0x22, 0x6b, 0xc7, 0x0e, 0xb2, 0xf7, 0x60, 0x69, 0x2f, 0xff, 0x79, 0xcf, - 0xb1, 0x23, 0xd6, 0xc1, 0xfd, 0x25, 0xed, 0x32, 0xd9, 0xc1, 0xf3, 0xf0, - 0x72, 0xf3, 0x81, 0x9c, 0x91, 0x74, 0x38, 0x40, 0xd9, 0x98, 0xdb, 0x69, - 0x70, 0x46, 0xcc, 0xda, 0xc8, 0x4b, 0xb1, 0xeb, 0xef, 0x8c, 0x36, 0xff, - 0xf3, 0x36, 0xbc, 0x99, 0xe6, 0x80, 0xee, 0x05, 0x44, 0xc2, 0xbe, 0x83, - 0x13, 0xcb, 0x2f, 0xf0, 0x23, 0xee, 0x94, 0x49, 0x65, 0xe3, 0x13, 0xcb, - 0x2f, 0xff, 0xec, 0xde, 0xe3, 0xf4, 0x33, 0xef, 0xb0, 0x61, 0xef, 0x16, - 0x5d, 0x92, 0x59, 0x7f, 0xfb, 0x4f, 0xfb, 0x36, 0x3b, 0x21, 0x63, 0x92, - 0x59, 0x76, 0x33, 0x1a, 0x66, 0xf8, 0x45, 0xf9, 0x99, 0x0e, 0x85, 0x7c, - 0x41, 0x6b, 0x9b, 0xbd, 0x65, 0xf8, 0xfd, 0xec, 0xd9, 0x65, 0xe9, 0xef, - 0xc3, 0x59, 0x7f, 0xf3, 0x27, 0x3e, 0x90, 0x5f, 0xa5, 0x12, 0x59, 0x7c, - 0xca, 0xf9, 0x26, 0xac, 0xbf, 0x4f, 0x33, 0xcc, 0xf5, 0x3e, 0xc8, 0x59, - 0x7e, 0xc6, 0xce, 0xfb, 0x71, 0x65, 0xfd, 0x0d, 0xcf, 0xe3, 0x7a, 0xca, - 0x19, 0xee, 0xf8, 0xba, 0xff, 0x6b, 0x01, 0x1f, 0x88, 0xd5, 0x97, 0xee, - 0xbe, 0xcf, 0xc5, 0x97, 0xd0, 0xd3, 0xd2, 0xcb, 0x44, 0xc7, 0x93, 0xa2, - 0x8b, 0xe8, 0x23, 0x99, 0x65, 0xff, 0xfb, 0x36, 0x9d, 0x98, 0x5d, 0xf3, - 0x9f, 0x0f, 0x7a, 0xcb, 0xf7, 0xa0, 0x66, 0xc2, 0xca, 0x34, 0xda, 0x34, - 0x44, 0xd7, 0xe2, 0x28, 0xe9, 0x0e, 0xea, 0xbd, 0xcc, 0x8e, 0xac, 0xbd, - 0xbd, 0xf8, 0xb2, 0xff, 0xdc, 0x1e, 0x89, 0xc5, 0xcf, 0xba, 0xb2, 0xff, - 0x0a, 0x59, 0xf7, 0x73, 0xcb, 0x2b, 0x0f, 0xd0, 0xd0, 0x2f, 0xf4, 0x3e, - 0xdd, 0x61, 0xf4, 0xb2, 0xfc, 0xfa, 0x93, 0xb5, 0x65, 0x0d, 0x32, 0x8c, - 0x1b, 0xf4, 0x24, 0x88, 0x80, 0x26, 0x97, 0xfb, 0xbe, 0x73, 0xe1, 0xef, - 0x59, 0x66, 0x42, 0xca, 0x23, 0xc9, 0x9f, 0x34, 0xbf, 0xdc, 0x8c, 0x21, - 0xfa, 0x16, 0x5f, 0xd1, 0x84, 0x3f, 0x42, 0xcb, 0xc1, 0xd4, 0xd3, 0x8f, - 0x73, 0x86, 0x37, 0xff, 0xb4, 0x61, 0xc6, 0x33, 0xa1, 0x8f, 0x86, 0xb2, - 0xff, 0xfc, 0x7a, 0xf3, 0xce, 0x1e, 0x4b, 0xd1, 0xbc, 0x70, 0xb2, 0xff, - 0x85, 0x13, 0xd0, 0x0f, 0x1c, 0xcb, 0x2f, 0x82, 0xdc, 0x1a, 0xcb, 0x67, - 0xc7, 0xbd, 0xba, 0x79, 0x7e, 0xd4, 0x4b, 0x98, 0xb2, 0xf8, 0xfb, 0x9b, - 0xd6, 0x5f, 0xec, 0x17, 0xa4, 0xff, 0xf1, 0x65, 0x41, 0xff, 0x78, 0x9f, - 0xa4, 0x75, 0x8a, 0xa3, 0xc1, 0x08, 0x0d, 0x1b, 0xf9, 0x2c, 0xa1, 0x6d, - 0xd8, 0x54, 0xdf, 0xff, 0x41, 0x77, 0x50, 0x72, 0x2c, 0x6b, 0xc9, 0x65, - 0xff, 0xe8, 0x07, 0x03, 0xd3, 0xf1, 0xb1, 0xe3, 0x59, 0x7f, 0x36, 0x30, - 0xbb, 0x3e, 0xb2, 0xdc, 0x59, 0x7e, 0x8c, 0x2e, 0xcf, 0xac, 0xbd, 0xc7, - 0xfa, 0x71, 0xf4, 0xcc, 0x5e, 0xd1, 0x1a, 0x1a, 0x68, 0x6d, 0x4c, 0xec, - 0x2c, 0xef, 0xfb, 0x73, 0x07, 0xe8, 0xdc, 0x28, 0x59, 0x46, 0x7e, 0x6e, - 0x6d, 0x7f, 0xda, 0xd8, 0x1e, 0x3f, 0x07, 0xab, 0x2b, 0xc7, 0xb6, 0xe4, - 0x17, 0xf8, 0xd8, 0xd6, 0x6d, 0x1b, 0x2c, 0xbf, 0x43, 0x77, 0xff, 0x25, - 0x95, 0xc3, 0xe0, 0xe9, 0xad, 0xdd, 0x35, 0x97, 0x07, 0x16, 0x54, 0x8f, - 0x39, 0x82, 0x2f, 0xc5, 0xaf, 0xc0, 0x3e, 0x78, 0xd6, 0x5f, 0xd8, 0x65, - 0xd0, 0xf9, 0x65, 0xbb, 0xf1, 0xe9, 0xf8, 0x9e, 0xfe, 0xd6, 0x1f, 0xa0, - 0x6b, 0x2f, 0x68, 0x3c, 0x59, 0x7f, 0xfd, 0xe8, 0x2c, 0xef, 0xb3, 0xbe, - 0x80, 0xb2, 0xd6, 0x5f, 0xc7, 0xa9, 0xce, 0x5f, 0xac, 0xbd, 0xec, 0xf9, - 0x65, 0xff, 0xfe, 0x17, 0x77, 0xb9, 0xe9, 0xc5, 0x9b, 0x1e, 0x17, 0xd2, - 0xe2, 0xcb, 0xf0, 0xbd, 0xcf, 0x01, 0x65, 0x62, 0x24, 0x1d, 0x9e, 0x86, - 0x9c, 0xc6, 0x16, 0x18, 0xef, 0x94, 0x9c, 0xbc, 0xa1, 0x5b, 0x7f, 0xfb, - 0xa4, 0xff, 0xfb, 0x0c, 0x61, 0xef, 0x16, 0x5f, 0x6f, 0xc1, 0xc2, 0xcb, - 0xfe, 0x8d, 0x84, 0x97, 0x82, 0xfb, 0x2c, 0xa8, 0x45, 0x4e, 0x25, 0x68, - 0x8e, 0xff, 0xdf, 0x4a, 0x77, 0x9c, 0x10, 0x43, 0x59, 0x7c, 0x1d, 0x7e, - 0xd5, 0x95, 0x87, 0xcb, 0xc4, 0x1b, 0xe2, 0xc3, 0x61, 0x65, 0xf1, 0xc7, - 0xdc, 0x59, 0x7e, 0x13, 0xa5, 0x1f, 0xac, 0xa6, 0x9f, 0x67, 0x48, 0x77, - 0x91, 0x5f, 0x77, 0xb8, 0x2a, 0xcb, 0xff, 0xd1, 0xdf, 0xe2, 0x59, 0xf7, - 0x76, 0x08, 0xab, 0x2f, 0xd0, 0xdd, 0x3c, 0xcb, 0x2f, 0x71, 0xff, 0x59, - 0x50, 0x8e, 0x7c, 0x31, 0x32, 0x3f, 0x27, 0x74, 0xa2, 0x96, 0x5f, 0x43, - 0x4e, 0x4b, 0x2e, 0xf4, 0x48, 0xd6, 0x68, 0x2e, 0xe7, 0x92, 0xcb, 0xf4, - 0x00, 0x9d, 0xab, 0x2f, 0xfd, 0x12, 0x9d, 0x9e, 0x3d, 0x79, 0xd6, 0x58, - 0xfc, 0x7c, 0xbc, 0x26, 0xa1, 0xa3, 0x3b, 0x70, 0xb3, 0xcf, 0x77, 0xe9, - 0xb8, 0x30, 0xec, 0xb2, 0xfe, 0x7f, 0xf5, 0xa3, 0xd2, 0xcb, 0xdd, 0x9d, - 0x8b, 0x2a, 0x0f, 0xdf, 0xf2, 0xb1, 0x0b, 0xaf, 0xbc, 0x1f, 0xba, 0xb2, - 0xff, 0xef, 0x64, 0x68, 0xb1, 0xad, 0x0c, 0xcb, 0x2f, 0xee, 0x89, 0xff, - 0xf1, 0xf2, 0xcb, 0xfe, 0x3e, 0x9e, 0x34, 0xb3, 0x65, 0x94, 0x67, 0xd3, - 0xe3, 0x2b, 0xfb, 0x86, 0xc3, 0x5f, 0xab, 0x2f, 0xfd, 0xbe, 0x18, 0x91, - 0x94, 0x6a, 0x16, 0x5f, 0xff, 0xfb, 0x59, 0xbe, 0x0b, 0xb3, 0x84, 0x28, - 0xf3, 0x9f, 0x63, 0xbc, 0x59, 0x70, 0x27, 0xb5, 0x97, 0xb6, 0x0c, 0x96, - 0x5e, 0x2c, 0xe4, 0xe3, 0x75, 0x83, 0x94, 0x35, 0x42, 0xa0, 0x85, 0x6f, - 0xc4, 0x26, 0x5d, 0xa3, 0xfd, 0xf0, 0xa8, 0xbe, 0x9d, 0xbf, 0x77, 0x65, - 0x94, 0x35, 0x59, 0x39, 0x28, 0xe5, 0x86, 0x5b, 0x6e, 0x2c, 0xb6, 0xe2, - 0xcb, 0xd8, 0x3e, 0xac, 0xb3, 0x4c, 0xd8, 0x68, 0x52, 0xee, 0xe2, 0xcb, - 0xfd, 0x05, 0x1f, 0xbb, 0xee, 0xac, 0xbd, 0xa7, 0x92, 0xcb, 0xfc, 0x3f, - 0x60, 0x3d, 0x1a, 0x59, 0x43, 0x44, 0x1e, 0x8d, 0x08, 0x72, 0xfd, 0xcc, - 0xee, 0xa1, 0x65, 0xff, 0xe6, 0x59, 0x43, 0x5c, 0xfc, 0xfd, 0xf4, 0x2c, - 0xa8, 0x4c, 0xe8, 0xe1, 0x33, 0xc2, 0xf0, 0x93, 0xdc, 0xe0, 0x59, 0x7f, - 0x1c, 0xce, 0x0e, 0x49, 0x65, 0x00, 0xf1, 0x3c, 0x2d, 0x7f, 0xff, 0xbc, - 0x64, 0x3d, 0x60, 0x3d, 0x1e, 0xcd, 0x6a, 0x18, 0x59, 0x7e, 0x0e, 0xe9, - 0xe3, 0x56, 0x5f, 0xba, 0xed, 0x3e, 0xac, 0xa6, 0x0f, 0x44, 0x8a, 0xaf, - 0xde, 0x8c, 0x93, 0xac, 0xbf, 0xf1, 0xf4, 0x3a, 0x7e, 0x4e, 0x6f, 0x56, - 0x54, 0x22, 0x24, 0x64, 0x4e, 0x4d, 0x7f, 0xd8, 0x78, 0xd2, 0xcd, 0x9d, - 0x65, 0xfa, 0x3b, 0xcf, 0xc2, 0xb2, 0xfe, 0xf1, 0xf4, 0xa1, 0xab, 0x2f, - 0xa3, 0x79, 0x42, 0xca, 0x98, 0xf3, 0x9a, 0x59, 0x4c, 0x85, 0xc8, 0x38, - 0x44, 0xc8, 0xd8, 0x01, 0x08, 0x59, 0x88, 0xbd, 0x19, 0xd1, 0x17, 0x74, - 0xd8, 0x2e, 0xf7, 0xff, 0xce, 0xd1, 0xfa, 0x3d, 0x0d, 0x0f, 0xd2, 0xe2, - 0xcb, 0xff, 0xd9, 0xdf, 0x1e, 0x7d, 0xdc, 0xdf, 0x1c, 0x59, 0x6f, 0x79, - 0x13, 0x84, 0xa3, 0x7c, 0xfc, 0xee, 0xcb, 0x2f, 0xfe, 0x72, 0xf4, 0x18, - 0xcf, 0x99, 0x25, 0x97, 0xa3, 0xf1, 0x16, 0x5f, 0xd9, 0xbf, 0xc7, 0xfc, - 0xcb, 0x2b, 0x11, 0xb6, 0xc1, 0x43, 0x91, 0x92, 0x0f, 0x07, 0xae, 0x28, - 0x59, 0x7d, 0xe8, 0xe4, 0x2c, 0xbc, 0x20, 0xf1, 0x65, 0xe6, 0x5f, 0x27, - 0xb5, 0x95, 0xb1, 0xfc, 0x8c, 0x55, 0xc8, 0x78, 0x3b, 0x7b, 0x87, 0xc5, - 0x97, 0xd3, 0x9b, 0x38, 0x0b, 0x2f, 0x60, 0x06, 0xb2, 0xfb, 0xb8, 0x5f, - 0xac, 0xbf, 0x9c, 0x58, 0xee, 0x6c, 0xb2, 0xb0, 0xfb, 0x0c, 0x70, 0x88, - 0xaf, 0xb6, 0x10, 0x3b, 0x2c, 0xbe, 0x9a, 0x51, 0xb2, 0xca, 0x83, 0xca, - 0xc2, 0x6b, 0xf8, 0xfb, 0xf8, 0x85, 0x25, 0x97, 0xc2, 0xcd, 0xc8, 0x59, - 0x7c, 0x70, 0xdc, 0x59, 0x7e, 0x86, 0x33, 0xbc, 0x59, 0x7f, 0xe7, 0xef, - 0x07, 0xa7, 0xef, 0x82, 0xb2, 0xff, 0xf8, 0xc8, 0x32, 0xce, 0x4e, 0xe9, - 0xcf, 0xe6, 0xcb, 0x2b, 0x64, 0xd3, 0x98, 0x20, 0xf8, 0xbf, 0x44, 0x9e, - 0x20, 0x22, 0x8e, 0x9f, 0xd9, 0x9b, 0x21, 0xbf, 0x95, 0x9e, 0x86, 0x59, - 0x25, 0x13, 0xd9, 0x13, 0x2b, 0xa4, 0x32, 0xa2, 0x98, 0x94, 0x08, 0x38, - 0xe0, 0x72, 0x59, 0x30, 0x25, 0x3b, 0xfd, 0x0c, 0xf3, 0x84, 0x24, 0xd1, - 0xe0, 0xea, 0x30, 0x26, 0xc2, 0x4f, 0xd1, 0xba, 0x3c, 0x68, 0x3f, 0xc2, - 0xa8, 0xa5, 0x7c, 0xf2, 0x72, 0xf3, 0xb2, 0x82, 0xc3, 0x0c, 0x1d, 0xe7, - 0x82, 0x8e, 0x4f, 0xc2, 0x4c, 0x48, 0xf1, 0x2f, 0xf4, 0xc7, 0xdc, 0xd7, - 0x61, 0x65, 0xff, 0xf6, 0x8f, 0xe9, 0x70, 0xfb, 0xe8, 0xd7, 0x61, 0x65, - 0xfe, 0x8d, 0x3c, 0xcf, 0xc9, 0x2c, 0xbc, 0xee, 0x05, 0x45, 0x5c, 0xbf, - 0x9c, 0x4f, 0x79, 0xda, 0xb2, 0x80, 0x7a, 0xde, 0x28, 0xbf, 0x8f, 0x5e, - 0x71, 0x1a, 0xb2, 0x86, 0x8d, 0x9d, 0x42, 0x27, 0xc4, 0x57, 0xc5, 0xbb, - 0xc7, 0x59, 0x6d, 0xc5, 0x97, 0xff, 0xa3, 0x6e, 0x98, 0xf0, 0xa4, 0x7e, - 0x0a, 0xca, 0x69, 0xee, 0xf8, 0x52, 0xf6, 0xa1, 0xab, 0x2f, 0xf4, 0x6b, - 0xb0, 0x51, 0xfa, 0xcb, 0xfc, 0xcf, 0x34, 0x07, 0x70, 0x2a, 0x23, 0xc5, - 0xfb, 0xc7, 0xaf, 0x3a, 0xcb, 0xc5, 0xd7, 0x59, 0x76, 0x0f, 0x0f, 0x0b, - 0x84, 0xf5, 0x24, 0x57, 0xb6, 0x10, 0x77, 0xfa, 0x51, 0xad, 0xa3, 0x5b, - 0x2c, 0xbf, 0xd3, 0xef, 0xe8, 0x28, 0xfd, 0x65, 0xff, 0xdb, 0x46, 0x81, - 0x9c, 0xe6, 0x0f, 0x16, 0x54, 0x22, 0xbb, 0x0d, 0x5c, 0xd6, 0xff, 0xba, - 0x61, 0x65, 0xe4, 0xb6, 0x99, 0x65, 0xfc, 0x59, 0xde, 0x60, 0xab, 0x2a, - 0x0f, 0xb1, 0xcf, 0xef, 0xf0, 0x0f, 0x9e, 0x3e, 0x9a, 0xcb, 0xf6, 0x6c, - 0xe5, 0xf2, 0xca, 0xf8, 0xf6, 0x88, 0xca, 0xfd, 0xde, 0xe1, 0x7e, 0xb2, - 0xff, 0x6e, 0xb8, 0xe3, 0x06, 0x6b, 0x2c, 0xce, 0x17, 0x66, 0x06, 0x67, - 0x91, 0x94, 0x99, 0xac, 0xd0, 0x81, 0xd1, 0x17, 0x87, 0x1e, 0x1c, 0x25, - 0x0d, 0x6e, 0x42, 0x67, 0xaf, 0x42, 0x11, 0x6e, 0x94, 0x5f, 0xb4, 0x07, - 0x70, 0x2a, 0x2c, 0x15, 0xe6, 0x23, 0x65, 0x97, 0xff, 0xf1, 0x05, 0xf6, - 0x6e, 0x4f, 0x87, 0x59, 0xa9, 0x09, 0x25, 0x97, 0xec, 0x2c, 0xef, 0x16, - 0x5f, 0xed, 0x3b, 0x44, 0xd3, 0xfc, 0xb2, 0xcc, 0xf1, 0x30, 0xd6, 0x0d, - 0x00, 0x3c, 0xec, 0x02, 0x13, 0x5f, 0xe6, 0x79, 0xa0, 0x3b, 0x81, 0x51, - 0x65, 0x2f, 0xfd, 0x9d, 0x96, 0x7f, 0x3f, 0x9e, 0x0a, 0xcb, 0xf6, 0x80, - 0xee, 0x05, 0x45, 0xa6, 0xbf, 0xc3, 0xf3, 0xcd, 0xe3, 0x6a, 0xca, 0x58, - 0xe6, 0xd2, 0xff, 0x43, 0x70, 0x65, 0x1f, 0x2c, 0xbf, 0x07, 0x34, 0xfc, - 0x59, 0x66, 0x63, 0x4c, 0x77, 0x10, 0x9a, 0xd1, 0xe1, 0xae, 0x19, 0x5f, - 0xa7, 0xa6, 0x44, 0xf1, 0x9e, 0x33, 0xc5, 0x65, 0xf4, 0xf1, 0x64, 0x32, - 0x27, 0x95, 0x95, 0x3d, 0x1f, 0xd3, 0x2b, 0xa2, 0x5f, 0xf4, 0xf7, 0xe3, - 0x14, 0x6e, 0xe0, 0x59, 0x7e, 0x65, 0x76, 0x4f, 0x32, 0x16, 0x5f, 0xe1, - 0x1b, 0x9d, 0xe1, 0xf1, 0x65, 0x8d, 0x65, 0x4f, 0x67, 0x89, 0x3e, 0x69, - 0x7f, 0xa3, 0x6d, 0x38, 0xf6, 0x75, 0x97, 0xff, 0xef, 0x39, 0x76, 0x59, - 0xac, 0x82, 0x2c, 0xea, 0xca, 0x92, 0x21, 0x4c, 0xd2, 0xfd, 0xbd, 0xc7, - 0x8d, 0x59, 0x7e, 0x9c, 0xff, 0xcf, 0xe2, 0xcb, 0xb3, 0x7a, 0xcb, 0x72, - 0x0f, 0x14, 0x8b, 0x6f, 0x9b, 0x1f, 0x71, 0x65, 0xfe, 0x36, 0x9e, 0xec, - 0x11, 0xac, 0xbf, 0x41, 0x03, 0xd0, 0xb2, 0xff, 0xec, 0xef, 0x8d, 0xb9, - 0xde, 0x09, 0xc5, 0x97, 0xfe, 0xc7, 0xfe, 0x25, 0xa8, 0xc2, 0x59, 0x40, - 0x44, 0x09, 0xa2, 0xdf, 0x1e, 0xff, 0x6f, 0x59, 0x7d, 0xc8, 0x29, 0x96, - 0x5f, 0x46, 0xec, 0xd8, 0xb2, 0x9c, 0xf1, 0xc8, 0x8a, 0xff, 0x6e, 0x9f, - 0xf3, 0x9f, 0xc1, 0x59, 0x52, 0x55, 0x37, 0x84, 0x46, 0xdd, 0x31, 0x37, - 0x88, 0xff, 0x33, 0x28, 0x53, 0xf0, 0x8b, 0xad, 0xbb, 0xa4, 0x17, 0xf9, - 0xa2, 0x37, 0xf6, 0x9f, 0xeb, 0x2f, 0xd3, 0xb5, 0xa0, 0xf9, 0x65, 0xf8, - 0xd8, 0x82, 0x02, 0xca, 0xe1, 0xe9, 0x74, 0xae, 0xa1, 0x15, 0x79, 0x08, - 0x9b, 0xc7, 0x9b, 0x2c, 0xbf, 0xfc, 0x0f, 0x1f, 0x8f, 0x51, 0x30, 0xb9, - 0xe5, 0x95, 0xe3, 0xe7, 0x21, 0xcb, 0xdf, 0x96, 0x2c, 0xb8, 0xb1, 0x65, - 0x4e, 0x36, 0x3f, 0x8e, 0x5f, 0xfb, 0x87, 0x3b, 0xcf, 0xa8, 0xdf, 0x0b, - 0x2f, 0xf9, 0xaf, 0x29, 0xf0, 0xf8, 0xf4, 0xb2, 0xb6, 0x45, 0x0e, 0x89, - 0x1a, 0x83, 0x7e, 0x7e, 0x76, 0x06, 0xb2, 0xa0, 0xf6, 0x02, 0x63, 0x7f, - 0x9f, 0x52, 0x7e, 0xb8, 0x16, 0x5f, 0xfe, 0xcc, 0x2c, 0xfc, 0xb3, 0xbe, - 0xc9, 0x2c, 0xa8, 0x4f, 0x97, 0xd1, 0xa5, 0x84, 0x87, 0x74, 0xca, 0xfd, - 0x12, 0xe3, 0x64, 0xb2, 0xfa, 0x04, 0x8f, 0x2c, 0xb8, 0xf6, 0x59, 0x79, - 0xdc, 0x0a, 0x8b, 0x71, 0x5b, 0x1b, 0xf0, 0x0b, 0xdf, 0xf8, 0xf5, 0xe7, - 0xcd, 0x6c, 0x7b, 0x2c, 0xbe, 0x9a, 0x07, 0x8b, 0x2f, 0xfd, 0x9a, 0xc2, - 0x9d, 0xec, 0xf8, 0x55, 0x97, 0xe2, 0xfd, 0xfe, 0xe2, 0xca, 0x83, 0xea, - 0x74, 0x1a, 0x61, 0x39, 0x6f, 0x8a, 0x34, 0xc3, 0xe2, 0x27, 0x3f, 0xe4, - 0x23, 0x2f, 0xfc, 0xe3, 0x27, 0xdf, 0xe8, 0x9b, 0x8b, 0x2f, 0xb7, 0xc0, - 0x09, 0x65, 0xfc, 0x5f, 0xcc, 0x50, 0xd5, 0x94, 0xc2, 0x24, 0x5a, 0x80, - 0xe4, 0x77, 0x9a, 0x46, 0xb2, 0xc4, 0xb2, 0xff, 0xbc, 0x17, 0xe6, 0x61, - 0x30, 0xb2, 0xfd, 0xc7, 0xf9, 0xc6, 0xb2, 0xc6, 0x33, 0xe0, 0xe9, 0xc5, - 0x42, 0x2c, 0xb0, 0x6f, 0xce, 0x17, 0xfd, 0x0e, 0x5e, 0xcc, 0x20, 0x2c, - 0xbf, 0xdd, 0xe9, 0xec, 0xd8, 0x25, 0x95, 0x23, 0xe8, 0xc3, 0x5b, 0xfc, - 0x41, 0x6c, 0x73, 0xa6, 0xb2, 0xfd, 0x1a, 0xd6, 0x6e, 0xac, 0xbd, 0xa3, - 0xf9, 0x65, 0x41, 0xfc, 0x91, 0x97, 0x4a, 0xaf, 0xf0, 0x46, 0x59, 0xbd, - 0xe4, 0xb2, 0xff, 0xf4, 0x6d, 0xd3, 0x1e, 0x14, 0x8f, 0xc1, 0x59, 0x7f, - 0xd2, 0x3d, 0xf9, 0xe7, 0x2d, 0x96, 0x5e, 0x8c, 0xd2, 0xcb, 0xfd, 0xe8, - 0x91, 0xcf, 0xe3, 0x56, 0x50, 0xcf, 0x43, 0x83, 0x77, 0xe9, 0xdf, 0x70, - 0xd8, 0x59, 0x5b, 0x1e, 0x77, 0xc4, 0x55, 0xf2, 0x3f, 0x1e, 0x1b, 0x17, - 0xfe, 0xcf, 0x1e, 0x87, 0xe8, 0x20, 0x2c, 0xbf, 0xf1, 0x67, 0x79, 0x13, - 0xbb, 0x80, 0x59, 0x52, 0x3f, 0xc3, 0x3d, 0xbf, 0xdf, 0x4a, 0x0b, 0xb9, - 0xfa, 0xcb, 0xee, 0x7e, 0x7d, 0x59, 0x52, 0x55, 0x2b, 0xe3, 0x47, 0x8d, - 0x17, 0x90, 0xa4, 0x09, 0x08, 0x86, 0x97, 0xe7, 0xd7, 0x73, 0xcb, 0x2f, - 0xfc, 0x7f, 0xc4, 0x87, 0xe8, 0x20, 0x2c, 0xa9, 0x1f, 0x2f, 0x49, 0xef, - 0xee, 0xcb, 0x35, 0x9c, 0x59, 0x4b, 0x2f, 0x05, 0xfa, 0xb2, 0xe0, 0xc2, - 0xca, 0x91, 0xb2, 0xe8, 0xe5, 0x2c, 0xbe, 0xf8, 0x07, 0xa5, 0x97, 0x35, - 0x9e, 0x22, 0x33, 0xe3, 0xd6, 0x90, 0xf4, 0x2e, 0xfb, 0x06, 0x43, 0x59, - 0x50, 0x7d, 0x9b, 0xd2, 0xef, 0xf8, 0xbb, 0xe7, 0x90, 0x5c, 0x45, 0x95, - 0x09, 0xd1, 0xe1, 0x11, 0xc6, 0x4a, 0xe4, 0x77, 0xcc, 0x39, 0xec, 0xb2, - 0xc6, 0xb2, 0xd3, 0xeb, 0x2c, 0x5f, 0x9a, 0x4e, 0x88, 0x5e, 0x9d, 0x3c, - 0xcf, 0x2b, 0x2f, 0xfa, 0x4c, 0xf3, 0x40, 0x77, 0x02, 0xa2, 0x87, 0x54, - 0x23, 0x78, 0xd1, 0xe6, 0x27, 0x72, 0x9b, 0xf7, 0xf0, 0x0c, 0x6a, 0xcb, - 0xe8, 0x9b, 0x06, 0xb2, 0xb4, 0x79, 0x5c, 0x28, 0xbf, 0xb9, 0xc7, 0xf6, - 0x01, 0x65, 0xff, 0x64, 0x0f, 0xd1, 0xbb, 0x13, 0x2c, 0xbf, 0xdf, 0x9f, - 0xbd, 0x9f, 0xba, 0xca, 0x69, 0xf7, 0xfe, 0x77, 0x7f, 0xe2, 0xdd, 0x72, - 0x76, 0x8f, 0x06, 0xb2, 0xa1, 0x32, 0x0c, 0x22, 0x78, 0x4e, 0x6e, 0x91, - 0xdf, 0xf9, 0xc7, 0x03, 0xf1, 0x91, 0xb5, 0x65, 0xff, 0xb7, 0xbe, 0xb8, - 0xfe, 0xe4, 0x6c, 0xb2, 0xff, 0x70, 0x20, 0xce, 0x94, 0x2c, 0xa6, 0xa2, - 0xbf, 0xc7, 0x9d, 0x41, 0xbd, 0xdc, 0x02, 0xcb, 0xb0, 0x0b, 0x2d, 0x93, - 0x8d, 0x97, 0x47, 0x2f, 0xfd, 0x2f, 0x3e, 0xbe, 0xec, 0x1e, 0xcb, 0x28, - 0x8f, 0xa0, 0x25, 0x17, 0xfa, 0x51, 0xad, 0xa3, 0x5b, 0x2c, 0xbf, 0xef, - 0x00, 0xf9, 0x83, 0x70, 0x2c, 0xbf, 0x3f, 0x37, 0xe7, 0x16, 0x54, 0x22, - 0x5b, 0x0d, 0x7f, 0x38, 0xbf, 0x4e, 0xf6, 0x7e, 0xeb, 0x2f, 0xf6, 0xa3, - 0xce, 0x39, 0x35, 0x65, 0xff, 0x34, 0xfb, 0x3f, 0x84, 0xec, 0x2c, 0xbf, - 0xa4, 0xfa, 0xcf, 0xba, 0xb2, 0xfe, 0x1b, 0xb7, 0xc6, 0x2a, 0xca, 0x83, - 0xdc, 0xc2, 0xeb, 0xfe, 0xce, 0xf0, 0x4e, 0x69, 0xf8, 0xb2, 0xf0, 0xf6, - 0xd9, 0x65, 0xf8, 0xfb, 0xc7, 0x35, 0x97, 0xfd, 0xaf, 0xf4, 0xe5, 0xdc, - 0xfd, 0x65, 0x6c, 0x9e, 0x68, 0xca, 0xb0, 0xcf, 0x50, 0x97, 0x69, 0x03, - 0x9d, 0x7e, 0x3e, 0x12, 0x6b, 0xc2, 0x6a, 0x4b, 0x2f, 0xe1, 0x3a, 0x18, - 0xcd, 0x96, 0x5f, 0xdf, 0xf9, 0xcf, 0xc1, 0x59, 0x52, 0x3f, 0xb9, 0x87, - 0xb4, 0x5f, 0x7f, 0xf0, 0x0a, 0x3a, 0x59, 0xbf, 0x35, 0x25, 0x97, 0xe7, - 0xe7, 0x36, 0xe2, 0xcb, 0xdc, 0x6b, 0xac, 0xbf, 0xc4, 0xc0, 0x9e, 0xf0, - 0x78, 0xb2, 0xa6, 0x3d, 0x20, 0x8e, 0x5f, 0xfc, 0x1e, 0x79, 0xe5, 0x04, - 0x3c, 0xf2, 0xcb, 0xfe, 0x12, 0x3f, 0x9a, 0x51, 0xad, 0x96, 0x5f, 0xc4, - 0xfd, 0x12, 0x00, 0xb2, 0x9a, 0x7d, 0x44, 0x7b, 0x7c, 0x5f, 0xed, 0xfa, - 0xcb, 0xff, 0xfd, 0x37, 0x0c, 0x73, 0xa6, 0x32, 0xde, 0xf3, 0x3f, 0x43, - 0x0b, 0x2b, 0x11, 0x58, 0x64, 0x2e, 0x4b, 0x7f, 0xb9, 0x3b, 0xb3, 0x87, - 0x84, 0xb2, 0xdf, 0xac, 0xb1, 0xfc, 0x79, 0x3a, 0x37, 0xbf, 0x3f, 0xdc, - 0xe9, 0xac, 0xa8, 0x56, 0x63, 0x86, 0x0c, 0x22, 0x1b, 0xde, 0x88, 0xfd, - 0x1a, 0xc9, 0x3b, 0x70, 0xa2, 0xfc, 0xe1, 0x62, 0x04, 0x59, 0x7e, 0x9e, - 0xf3, 0x51, 0xc5, 0x95, 0x31, 0xea, 0x91, 0x4d, 0xfd, 0x9d, 0x31, 0xe3, - 0x56, 0x5f, 0x14, 0x8d, 0xab, 0x2d, 0x3a, 0x63, 0xcd, 0x72, 0xcb, 0xf8, - 0xcb, 0x7b, 0xcc, 0xca, 0x96, 0x5f, 0xd1, 0x37, 0xd2, 0xcd, 0xeb, 0x2a, - 0x63, 0xe6, 0xe1, 0xad, 0x0d, 0x16, 0x6f, 0x09, 0x0b, 0xff, 0xf0, 0xfd, - 0x02, 0x33, 0xe9, 0x3f, 0xfc, 0xe4, 0x7e, 0x92, 0xe1, 0xe2, 0xcb, 0xf6, - 0xd1, 0xb3, 0xf1, 0x65, 0x62, 0x26, 0x4d, 0x69, 0xc5, 0xaf, 0xed, 0xd7, - 0xfd, 0xb1, 0xc5, 0x97, 0x47, 0xeb, 0x2c, 0x15, 0x82, 0x16, 0xf5, 0xe3, - 0xe9, 0xfd, 0x22, 0xff, 0xdc, 0xde, 0xf3, 0x6c, 0xe4, 0xf3, 0x2c, 0xbf, - 0xf6, 0x0e, 0x25, 0x1a, 0x6f, 0x7e, 0x59, 0x7f, 0x3f, 0xf3, 0x14, 0x0d, - 0x65, 0xff, 0x16, 0x6c, 0x3f, 0x61, 0x75, 0x65, 0xee, 0x9f, 0x16, 0x54, - 0x26, 0x4d, 0x31, 0x1b, 0x50, 0xbc, 0x7e, 0x45, 0xdc, 0x38, 0xa9, 0xe9, - 0xd0, 0xfe, 0xcf, 0x25, 0xd3, 0xc4, 0xf9, 0x94, 0x76, 0x89, 0x69, 0x52, - 0x8c, 0xfc, 0x72, 0x9c, 0xb2, 0x3d, 0xc6, 0x21, 0xde, 0x08, 0x71, 0x7d, - 0x09, 0x63, 0x84, 0xd4, 0xd2, 0xb0, 0xb5, 0x29, 0xb1, 0xb1, 0x8f, 0x7a, - 0x3a, 0x57, 0x87, 0x97, 0xf0, 0xca, 0x28, 0x5b, 0xf2, 0x3f, 0xce, 0xce, - 0x11, 0x86, 0x19, 0x7b, 0xe3, 0x22, 0x9f, 0x86, 0x00, 0x91, 0xde, 0x5f, - 0xff, 0x80, 0xcf, 0xfd, 0x67, 0xc0, 0xf1, 0xf7, 0x8f, 0xf2, 0xca, 0x66, - 0xa9, 0x10, 0x31, 0xf4, 0xdf, 0x46, 0xa4, 0xd5, 0x97, 0xdf, 0x71, 0xf7, - 0x16, 0x5f, 0xb0, 0x61, 0xef, 0x16, 0x5e, 0x7d, 0x30, 0xb2, 0xcc, 0xf6, - 0x44, 0x69, 0x91, 0x11, 0x30, 0xa5, 0x17, 0xf9, 0x9e, 0x68, 0x0e, 0xe0, - 0x54, 0x5e, 0x6a, 0x87, 0xd3, 0x73, 0x93, 0xa8, 0xe3, 0x91, 0xca, 0xff, - 0xeb, 0xe9, 0xf9, 0x1d, 0x47, 0xc8, 0xd5, 0x3f, 0x46, 0xbc, 0x56, 0x94, - 0x37, 0x90, 0xba, 0xde, 0x8b, 0x7f, 0x99, 0xe6, 0x80, 0xee, 0x05, 0x45, - 0x2c, 0xb9, 0x90, 0xca, 0x2c, 0xbf, 0x1b, 0x3e, 0x61, 0xac, 0xbf, 0x68, - 0x0e, 0xe0, 0x54, 0x58, 0x4b, 0xee, 0xc0, 0xf1, 0x65, 0xff, 0xf6, 0x10, - 0xe3, 0xd1, 0xf7, 0x70, 0x9d, 0xab, 0x2f, 0x10, 0x40, 0xb2, 0xa0, 0xfa, - 0x5d, 0x36, 0xdc, 0x59, 0x7f, 0x07, 0x47, 0xb3, 0xb5, 0x65, 0x99, 0xb2, - 0x89, 0xb2, 0x8c, 0x83, 0x0a, 0x0c, 0xd1, 0xb0, 0x8a, 0xe1, 0x04, 0xf8, - 0x8d, 0xfe, 0x67, 0x9a, 0x03, 0xb8, 0x15, 0x16, 0x5a, 0xd2, 0x59, 0x76, - 0x98, 0x59, 0x7c, 0xcd, 0x86, 0x52, 0x7a, 0x59, 0x49, 0x2f, 0x33, 0x11, - 0xab, 0x28, 0x07, 0xb7, 0xc3, 0x00, 0x85, 0xd3, 0x08, 0xb3, 0x21, 0x1e, - 0x39, 0xdd, 0x1e, 0x59, 0x6f, 0xd6, 0x5c, 0xc6, 0xcb, 0x2d, 0xa9, 0x1a, - 0xbc, 0x12, 0xa0, 0x1f, 0x3b, 0xa0, 0xdc, 0x7f, 0xac, 0xbf, 0xe7, 0xf8, - 0xb3, 0xee, 0xc3, 0x0b, 0x2f, 0xf6, 0xdf, 0x72, 0x07, 0xd3, 0x59, 0x7e, - 0x8c, 0xdf, 0x1c, 0x59, 0x68, 0x73, 0xdd, 0x14, 0xd6, 0x9d, 0x17, 0xc5, - 0x09, 0x7b, 0xe7, 0x94, 0x86, 0xb2, 0xfe, 0x7d, 0x47, 0x5f, 0xcb, 0x2f, - 0x0a, 0x28, 0xa9, 0x2f, 0xfa, 0x25, 0xf7, 0x75, 0x19, 0xf2, 0x46, 0x66, - 0x82, 0xff, 0x82, 0xff, 0x67, 0x4f, 0xe1, 0x56, 0x5d, 0x1c, 0x59, 0x43, - 0x4c, 0x2f, 0xc4, 0x44, 0x99, 0xc4, 0xcd, 0xe7, 0x77, 0x32, 0x93, 0xd2, - 0xcb, 0xf8, 0xdf, 0x9f, 0xf0, 0x2b, 0x2f, 0xfe, 0x39, 0x3f, 0x1c, 0x82, - 0x0c, 0xe2, 0x4b, 0xff, 0xfb, 0xc7, 0xdf, 0x67, 0x0b, 0x1a, 0x1e, 0x79, - 0xe4, 0xb2, 0xff, 0x44, 0xba, 0xfe, 0x71, 0xac, 0xbe, 0x7e, 0xb1, 0xc5, - 0x95, 0x08, 0xf1, 0xc4, 0x2d, 0x2d, 0x39, 0x95, 0xa4, 0xb2, 0xd2, 0x59, - 0x69, 0x2c, 0xbc, 0x28, 0xa2, 0xac, 0xb0, 0x12, 0x33, 0x34, 0x15, 0x07, - 0xec, 0xc0, 0x89, 0x88, 0xfe, 0x63, 0x7f, 0x07, 0x9e, 0x79, 0x62, 0xcb, - 0xff, 0xee, 0x18, 0x30, 0xb5, 0x05, 0x83, 0xc6, 0x16, 0x53, 0x4f, 0xeb, - 0xa5, 0xb6, 0xf9, 0x65, 0x98, 0x59, 0x60, 0xac, 0xa2, 0x34, 0x7c, 0x12, - 0xac, 0x3f, 0x7e, 0x11, 0x74, 0xd6, 0xee, 0x30, 0xb2, 0xd8, 0xb2, 0xe0, - 0xff, 0x06, 0xa0, 0x63, 0x17, 0x1c, 0x2c, 0xbf, 0x8a, 0x1a, 0x51, 0x8b, - 0x2f, 0xfe, 0x87, 0xd7, 0x7d, 0x83, 0x0f, 0x78, 0xb2, 0xe9, 0x42, 0xcb, - 0xdc, 0x1b, 0x0b, 0x2b, 0x64, 0x72, 0x0c, 0xb6, 0x61, 0x5f, 0x15, 0x05, - 0x10, 0x41, 0x6b, 0xff, 0xff, 0xef, 0x47, 0x78, 0x7c, 0xe4, 0x77, 0xc7, - 0x1a, 0xfd, 0xaf, 0x29, 0x75, 0x85, 0x97, 0x1f, 0xcb, 0x2e, 0x86, 0xac, - 0xbf, 0xff, 0x41, 0x06, 0x52, 0x8e, 0xfb, 0x1a, 0x24, 0x7e, 0xb2, 0xff, - 0xf8, 0xc8, 0x32, 0xce, 0x6a, 0x0e, 0x4f, 0xc4, 0x95, 0x24, 0x51, 0xf5, - 0x5a, 0xe0, 0x33, 0x86, 0x49, 0x6e, 0xd0, 0x97, 0x91, 0x08, 0xe1, 0xab, - 0x91, 0x98, 0xb0, 0x98, 0x02, 0x1d, 0x46, 0x3e, 0xf0, 0xb0, 0x28, 0xcb, - 0x79, 0x19, 0xd7, 0x56, 0xb7, 0xbf, 0xcf, 0x8b, 0x89, 0x0b, 0x9b, 0xff, - 0xcc, 0xda, 0xf2, 0x67, 0x9a, 0x03, 0xb8, 0x15, 0x14, 0x62, 0xf8, 0xfa, - 0xf3, 0xeb, 0x2f, 0xe7, 0xd7, 0xed, 0x8f, 0xd6, 0x5f, 0x46, 0xa3, 0xf5, - 0x95, 0x31, 0xfa, 0xf8, 0x93, 0x79, 0x7d, 0xfc, 0x4f, 0xdf, 0x1c, 0xcb, - 0x2f, 0xde, 0x8d, 0xb0, 0x6b, 0x2f, 0xc4, 0xff, 0xc0, 0x8b, 0x2f, 0xfc, - 0x7f, 0x4b, 0x85, 0x9d, 0xf0, 0x56, 0x5f, 0xf1, 0xeb, 0xd9, 0x85, 0x2e, - 0x2c, 0xa9, 0x1f, 0xb0, 0x0f, 0xef, 0x9f, 0x7e, 0x12, 0xca, 0xf8, 0xf1, - 0x34, 0x45, 0x76, 0xe6, 0xea, 0xcb, 0xff, 0x3c, 0x81, 0xe3, 0x6c, 0x69, - 0x85, 0x96, 0x67, 0x09, 0xf4, 0x61, 0x94, 0xc5, 0xbe, 0x28, 0xec, 0x38, - 0x82, 0x46, 0x28, 0xed, 0x49, 0xb0, 0x76, 0xd4, 0x74, 0xcd, 0x78, 0x7a, - 0x51, 0x0f, 0x23, 0x0e, 0xec, 0xab, 0x7b, 0xff, 0x99, 0xbc, 0x99, 0xe6, - 0x80, 0xee, 0x05, 0x44, 0x72, 0xbf, 0xfc, 0xcd, 0xaf, 0x26, 0x79, 0xa0, - 0x3b, 0x81, 0x51, 0x39, 0x2f, 0xf3, 0x3c, 0xd0, 0x1d, 0xc0, 0xa8, 0xb3, - 0x17, 0x77, 0xf5, 0x97, 0xec, 0xf1, 0x66, 0x96, 0x5e, 0xda, 0x34, 0xb2, - 0xfd, 0x2e, 0x3b, 0x59, 0xf8, 0xf6, 0xc8, 0x63, 0x84, 0xd7, 0xd3, 0xc2, - 0x7a, 0x9e, 0xa7, 0x82, 0xcb, 0xfc, 0x3c, 0x6c, 0x7d, 0x0d, 0x59, 0x53, - 0xd1, 0xf6, 0x4f, 0x03, 0x9b, 0xfd, 0xa8, 0xef, 0x9f, 0xe9, 0x2c, 0xbf, - 0xff, 0xfe, 0x89, 0xbd, 0x1d, 0x81, 0x0f, 0x53, 0x47, 0xb3, 0x7e, 0x7b, - 0x07, 0xbf, 0x16, 0x57, 0xe8, 0xb5, 0x23, 0x4b, 0xfe, 0xce, 0x3f, 0x7f, - 0x10, 0xa4, 0xb2, 0xdf, 0xac, 0xbf, 0xb9, 0xad, 0x67, 0xdc, 0x59, 0x53, - 0xd1, 0xe0, 0xe0, 0x95, 0xed, 0x63, 0x56, 0x5f, 0x19, 0x67, 0x16, 0x5b, - 0x3a, 0x6f, 0x37, 0x47, 0x2f, 0xff, 0xfd, 0xe8, 0x20, 0xf3, 0x90, 0x27, - 0x4c, 0x83, 0x2c, 0xe7, 0x4d, 0x65, 0xf7, 0x7a, 0x7a, 0x59, 0x52, 0x44, - 0x6e, 0x9a, 0xef, 0x39, 0x01, 0x65, 0xee, 0x47, 0x16, 0x5e, 0xda, 0x7f, - 0x8b, 0x2e, 0x9e, 0xfc, 0xb2, 0xc6, 0xb2, 0xff, 0x47, 0x23, 0xbb, 0x60, - 0xab, 0x2c, 0x6d, 0x3c, 0x42, 0x10, 0xbf, 0xf1, 0x0f, 0xd1, 0xce, 0x66, - 0xa1, 0x65, 0xdf, 0xba, 0xcb, 0xf6, 0x7d, 0xdc, 0x85, 0x97, 0x4e, 0x11, - 0x65, 0xf8, 0x1e, 0x73, 0x65, 0xac, 0xbf, 0x07, 0x91, 0xc8, 0x59, 0x5a, - 0x3d, 0x27, 0x2b, 0xbf, 0x8b, 0xff, 0x67, 0xee, 0xb2, 0xf8, 0xa3, 0x78, - 0x56, 0x51, 0x9e, 0x8b, 0x97, 0x5d, 0xf3, 0x56, 0x5f, 0xfd, 0x3e, 0xe5, - 0xfe, 0x76, 0x08, 0xff, 0x59, 0x66, 0x73, 0xd2, 0xeb, 0x84, 0x43, 0x8b, - 0x62, 0x39, 0x3d, 0x8d, 0x8b, 0x21, 0x6c, 0x02, 0x3f, 0x86, 0xe6, 0x1c, - 0xd1, 0x0b, 0x58, 0x1c, 0x99, 0x96, 0x7a, 0x42, 0xfc, 0x27, 0x0b, 0x66, - 0xf7, 0x29, 0xf2, 0x01, 0x06, 0x2f, 0xec, 0xd0, 0x1d, 0xc0, 0xa8, 0xb7, - 0x57, 0xe6, 0x63, 0xf4, 0x69, 0x65, 0x33, 0x3e, 0x3f, 0x1c, 0xdf, 0xc4, - 0xec, 0xf5, 0xb7, 0x96, 0x5e, 0x3f, 0xbf, 0x59, 0x7e, 0xfa, 0x5e, 0x3f, - 0xd6, 0x5f, 0xfd, 0xa7, 0x07, 0xe1, 0xe7, 0x63, 0xe1, 0x56, 0x5c, 0x4c, - 0x2c, 0xbe, 0x03, 0xb8, 0x15, 0x14, 0x82, 0xb0, 0xf1, 0x74, 0x2f, 0x7f, - 0xa5, 0xd3, 0x17, 0x9f, 0x9a, 0xcb, 0xff, 0x67, 0x8f, 0x7f, 0xb3, 0x08, - 0x0b, 0x2f, 0xec, 0xf6, 0x78, 0xd8, 0x59, 0x7e, 0xec, 0x6f, 0x3d, 0xeb, - 0x2f, 0x3c, 0x99, 0xc2, 0x74, 0x63, 0x2a, 0xc8, 0x46, 0xfc, 0x43, 0xc3, - 0x5e, 0x9f, 0x6f, 0x2d, 0xbf, 0x66, 0x73, 0xc1, 0x59, 0x7f, 0x8c, 0x61, - 0xef, 0x1a, 0x4b, 0x2f, 0x85, 0x6c, 0x71, 0x65, 0xe7, 0x29, 0x2c, 0xb3, - 0x30, 0x2b, 0x07, 0xd1, 0x83, 0x63, 0xc1, 0xf3, 0xf3, 0x93, 0x84, 0xcc, - 0x52, 0x3b, 0xff, 0x99, 0xbc, 0x99, 0xe6, 0x80, 0xee, 0x05, 0x44, 0xa4, - 0xad, 0x99, 0x9d, 0x93, 0x2a, 0x35, 0x69, 0xe1, 0x39, 0xfc, 0xf1, 0x49, - 0x47, 0x0d, 0xd9, 0x65, 0x7b, 0xae, 0x97, 0x99, 0xb8, 0x16, 0x5f, 0xc6, - 0x59, 0xec, 0x02, 0xcb, 0xf8, 0xcb, 0xb8, 0x63, 0x59, 0x74, 0xba, 0xb2, - 0xf1, 0x40, 0xab, 0x2e, 0x86, 0x7a, 0x36, 0x64, 0x2f, 0x52, 0x44, 0x5f, - 0x57, 0xaf, 0x70, 0x2d, 0x59, 0x66, 0x42, 0xcb, 0x33, 0x92, 0x61, 0x7f, - 0x42, 0xd8, 0xc8, 0xe7, 0xc7, 0x6f, 0x13, 0xc9, 0x65, 0xff, 0xe3, 0xfb, - 0xfd, 0x60, 0xe3, 0x47, 0xf7, 0xeb, 0x2f, 0xda, 0x03, 0xb8, 0x15, 0x13, - 0xb2, 0xfe, 0xd9, 0xf4, 0x0d, 0x62, 0xcb, 0xff, 0xb3, 0xc4, 0xf2, 0x0f, - 0xed, 0x79, 0x2c, 0xbc, 0xf2, 0x67, 0x08, 0xf3, 0xc4, 0xd7, 0x34, 0x22, - 0xeb, 0xb6, 0xdc, 0x59, 0x7f, 0xfe, 0x31, 0x85, 0xb1, 0xba, 0xe3, 0x28, - 0x2c, 0x02, 0xcb, 0xfd, 0x28, 0xd6, 0xd1, 0xad, 0x96, 0x5f, 0xfb, 0xc4, - 0xf2, 0x0f, 0xed, 0x79, 0x2c, 0xa8, 0x3f, 0x4c, 0x35, 0xbf, 0xff, 0x67, - 0xd2, 0xf4, 0x71, 0xf5, 0x1b, 0xbe, 0x70, 0x2c, 0xb3, 0x3c, 0x55, 0x6c, - 0xd8, 0xc3, 0xbc, 0x98, 0xe3, 0x65, 0x0c, 0x9d, 0xd2, 0x0b, 0xe3, 0xd4, - 0x6f, 0x59, 0x76, 0x79, 0x65, 0xff, 0xd3, 0xee, 0x5f, 0xe7, 0x60, 0x8f, - 0xf5, 0x96, 0x67, 0xc3, 0xff, 0x9f, 0x23, 0x10, 0x5a, 0xff, 0xe7, 0x6f, - 0xb0, 0x0f, 0xe8, 0x12, 0x4b, 0x2f, 0x18, 0xdd, 0x65, 0xff, 0xc5, 0x9e, - 0x7d, 0xb3, 0x84, 0xff, 0x2c, 0xba, 0x7d, 0x98, 0xd1, 0x45, 0xe4, 0x4e, - 0x0d, 0xd4, 0x2f, 0x1b, 0x4a, 0x32, 0x96, 0xcb, 0x04, 0xe4, 0x3a, 0xe7, - 0xe1, 0xbb, 0x7f, 0xee, 0x41, 0x7d, 0xff, 0x39, 0x1f, 0xac, 0xbf, 0xff, - 0xff, 0xef, 0x1f, 0x5d, 0xfe, 0xe7, 0x39, 0x0d, 0x8f, 0x66, 0x6d, 0x85, - 0x9f, 0x77, 0x91, 0xf2, 0xcb, 0xfd, 0x12, 0x3e, 0x99, 0x49, 0x65, 0xff, - 0xff, 0x80, 0x1d, 0xb3, 0x7c, 0x7d, 0x83, 0x79, 0x08, 0xde, 0x63, 0x8d, - 0x65, 0xf0, 0xdf, 0xac, 0xf1, 0x37, 0x60, 0x20, 0xea, 0x12, 0x9c, 0x31, - 0xbf, 0xfa, 0x6f, 0xb8, 0x6d, 0x9c, 0x26, 0xb3, 0x65, 0x97, 0xc0, 0x77, - 0x02, 0xa2, 0x2c, 0x5f, 0xc7, 0xa7, 0x20, 0x42, 0xca, 0xd1, 0xec, 0xf8, - 0xba, 0xff, 0xcf, 0x26, 0x79, 0xa0, 0x3b, 0x81, 0x51, 0x2e, 0xaf, 0xff, - 0xec, 0x1f, 0xa0, 0x46, 0x7d, 0x27, 0xff, 0x9c, 0x8f, 0xd2, 0x59, 0x9c, - 0x26, 0xe3, 0x90, 0xa4, 0x69, 0x14, 0xfa, 0x65, 0xff, 0xcd, 0x79, 0x33, - 0xcd, 0x01, 0xdc, 0x0a, 0x89, 0x89, 0x7f, 0x7a, 0x0b, 0xe9, 0x9d, 0x65, - 0xfe, 0x73, 0x9f, 0x3f, 0xf0, 0x6b, 0x2f, 0xb0, 0x10, 0xce, 0x0f, 0x8f, - 0xc5, 0xd4, 0xcd, 0x1d, 0xde, 0x85, 0xad, 0xfb, 0x40, 0x77, 0x02, 0xa2, - 0xa9, 0x5b, 0x16, 0x56, 0x1e, 0x23, 0x06, 0x97, 0xfe, 0x0b, 0xea, 0x45, - 0x82, 0xbf, 0xeb, 0x2f, 0xfe, 0x7e, 0x68, 0xc5, 0xef, 0x8f, 0x52, 0x59, - 0x7f, 0xda, 0x7f, 0x7d, 0x2c, 0xeb, 0x31, 0xa2, 0x13, 0xc7, 0xf4, 0xcd, - 0x1f, 0x4f, 0x0a, 0x6b, 0xff, 0x3c, 0x99, 0xe6, 0x80, 0xee, 0x05, 0x44, - 0xe8, 0xbe, 0xe1, 0xfc, 0x2a, 0xca, 0x69, 0xf8, 0x7e, 0x99, 0x7c, 0xe5, - 0xde, 0x2c, 0xbe, 0xd8, 0xa3, 0x65, 0x97, 0xcd, 0x86, 0x19, 0xb4, 0xf1, - 0x02, 0x43, 0x4c, 0xd1, 0x46, 0x6c, 0xf7, 0xf8, 0xdf, 0x51, 0x27, 0xde, - 0xb2, 0xf8, 0xcb, 0xf3, 0x59, 0x7e, 0x9a, 0x26, 0x8e, 0x2c, 0xbf, 0x85, - 0xc3, 0xdf, 0x84, 0xb2, 0x8c, 0xf5, 0xf8, 0x53, 0x78, 0xfd, 0x0b, 0x19, - 0x9a, 0x1b, 0xff, 0x83, 0xce, 0xc7, 0xcc, 0xc3, 0x31, 0xb5, 0x65, 0x49, - 0x30, 0xf6, 0xc2, 0x67, 0xc5, 0xb7, 0xfe, 0x79, 0x33, 0xcd, 0x01, 0xdc, - 0x0a, 0x89, 0xdd, 0x7e, 0xe8, 0x5d, 0xa6, 0x92, 0xff, 0xc5, 0x1d, 0xce, - 0x66, 0x7d, 0x25, 0x94, 0x35, 0x45, 0x19, 0x1a, 0x13, 0x4d, 0x9d, 0x33, - 0xa4, 0xf7, 0xfc, 0x38, 0x94, 0x33, 0x17, 0x9f, 0xac, 0xbf, 0x70, 0xa3, - 0xfe, 0x2c, 0xbc, 0x58, 0x35, 0x97, 0x43, 0x38, 0x3c, 0x3f, 0xca, 0x29, - 0x9a, 0x3f, 0xf1, 0x40, 0xa1, 0x01, 0x7e, 0xe3, 0x30, 0x76, 0x16, 0x5f, - 0xfe, 0x66, 0xd7, 0x93, 0x3c, 0xd0, 0x1d, 0xc0, 0xa8, 0xa1, 0x57, 0xff, - 0xcf, 0xd9, 0x61, 0x18, 0xd9, 0xf3, 0x68, 0xd2, 0xcb, 0xf3, 0x3d, 0x9a, - 0xe2, 0xac, 0xbf, 0xff, 0xf8, 0x2d, 0x6b, 0xc9, 0x98, 0x3c, 0x1e, 0xc1, - 0x66, 0xcc, 0x06, 0x26, 0x59, 0x52, 0x45, 0x1f, 0x8b, 0x2f, 0xc1, 0xfb, - 0xa6, 0x05, 0x97, 0xec, 0xff, 0x1c, 0x96, 0x5f, 0x70, 0xc5, 0xea, 0xcb, - 0xd1, 0xfb, 0x3d, 0x8f, 0xc8, 0x8a, 0x7a, 0x4d, 0x46, 0x8d, 0x82, 0x84, - 0xad, 0xff, 0x35, 0xf9, 0x82, 0xc1, 0x0d, 0x65, 0xff, 0x9e, 0x4c, 0xf3, - 0x40, 0x77, 0x02, 0xa2, 0x92, 0x5f, 0xec, 0xf1, 0x60, 0xfc, 0x15, 0x97, - 0xa0, 0x86, 0xb2, 0xcc, 0xf1, 0x1a, 0x2d, 0x38, 0xea, 0x60, 0xa6, 0x57, - 0xff, 0xfd, 0x84, 0x1e, 0x46, 0x17, 0x49, 0xd8, 0xc9, 0xa0, 0x86, 0xb2, - 0xe6, 0x92, 0xcb, 0xff, 0xa6, 0xf3, 0xb7, 0xbe, 0x8e, 0x85, 0xab, 0x2f, - 0xb0, 0xa3, 0x65, 0x95, 0x87, 0xcf, 0xa4, 0x6b, 0xd9, 0xc6, 0x64, 0x98, - 0x0f, 0x18, 0xc4, 0x7d, 0xa8, 0x66, 0xfd, 0xed, 0x1e, 0x64, 0xa3, 0x3a, - 0x04, 0x6d, 0x1a, 0x8c, 0xf1, 0xb2, 0xd2, 0xdc, 0xd7, 0xf2, 0xa2, 0x5a, - 0xec, 0x79, 0x81, 0x87, 0xbc, 0xfc, 0x68, 0xd7, 0xf9, 0x9e, 0x68, 0x0e, - 0xe0, 0x54, 0x44, 0x8b, 0xda, 0x7d, 0x2c, 0xbf, 0xf3, 0xc9, 0x9e, 0x68, - 0x0e, 0xe0, 0x54, 0x4b, 0xcb, 0x33, 0x33, 0xe8, 0x68, 0xe5, 0xff, 0xd1, - 0xbd, 0xe6, 0x3d, 0x7d, 0x28, 0x99, 0x65, 0xe9, 0xe9, 0xbf, 0xac, 0xba, - 0x62, 0x59, 0x7f, 0xfb, 0xd1, 0xc1, 0x07, 0x1a, 0x9b, 0x0b, 0xf5, 0x97, - 0xda, 0x0f, 0x78, 0xb2, 0xfd, 0xaf, 0xda, 0x7c, 0x59, 0x7a, 0x0b, 0xe5, - 0x97, 0xee, 0x88, 0xd2, 0x85, 0x96, 0x3f, 0x1e, 0x21, 0x0e, 0x5f, 0xfe, - 0xf6, 0xf8, 0x2f, 0xf7, 0x30, 0x79, 0xaf, 0x96, 0x5f, 0xe3, 0xd3, 0x8c, - 0xc9, 0x85, 0x97, 0x47, 0x56, 0x5f, 0xf3, 0xed, 0xa8, 0xfa, 0x46, 0xd5, - 0x97, 0xff, 0x82, 0x33, 0xd0, 0x93, 0x6e, 0x85, 0xca, 0x65, 0x95, 0x24, - 0xd2, 0x0c, 0x9b, 0xca, 0x1f, 0x99, 0x10, 0xb7, 0x0e, 0xaf, 0xef, 0xfd, - 0x1a, 0x36, 0xac, 0xbf, 0xf4, 0xdc, 0x8d, 0xef, 0xe8, 0xfa, 0x65, 0x95, - 0x07, 0xe2, 0xe5, 0xd7, 0xc7, 0xba, 0x23, 0x56, 0x5f, 0xb3, 0x6c, 0xe3, - 0x56, 0x5f, 0xcf, 0xb3, 0xf1, 0xff, 0x59, 0x7f, 0xf4, 0xd3, 0x84, 0x28, - 0xde, 0xfb, 0xe2, 0x65, 0x94, 0xb2, 0xfb, 0xb9, 0xa9, 0x96, 0x5e, 0xeb, - 0xef, 0x59, 0x69, 0x61, 0xe0, 0xb9, 0x1d, 0xf9, 0xf9, 0x1b, 0xf1, 0x65, - 0x4c, 0x79, 0xdb, 0xc9, 0xaa, 0x13, 0x0b, 0xc4, 0xc7, 0x84, 0xd5, 0xda, - 0x85, 0x95, 0x25, 0xcd, 0xc1, 0xa6, 0x19, 0x1c, 0xd1, 0xda, 0xea, 0x19, - 0x1e, 0x20, 0x22, 0x6e, 0x94, 0x6f, 0x8c, 0xe7, 0x74, 0xce, 0xec, 0x25, - 0x97, 0xf4, 0xee, 0x7b, 0x0f, 0xab, 0x28, 0x67, 0x88, 0x62, 0xb7, 0x0f, - 0xe5, 0x97, 0xf1, 0x07, 0xb3, 0x43, 0x0b, 0x2f, 0x32, 0xcf, 0x4b, 0x2c, - 0x6e, 0x79, 0xe1, 0x2f, 0xbf, 0xc1, 0xef, 0x8a, 0x33, 0x4b, 0x2f, 0xc5, - 0x9b, 0x09, 0xbd, 0x65, 0xf6, 0x6c, 0x26, 0xf5, 0x97, 0xe1, 0xc7, 0xc3, - 0x79, 0xc7, 0xa2, 0x45, 0x77, 0xff, 0xc7, 0xa9, 0xde, 0x83, 0xef, 0x02, - 0x00, 0xc2, 0xcb, 0xe3, 0xdb, 0xfd, 0xc5, 0x97, 0x9d, 0xc0, 0xa8, 0xa5, - 0xd4, 0xb2, 0x80, 0x6c, 0xe6, 0x28, 0xbe, 0x2e, 0xc6, 0x96, 0x5f, 0xf6, - 0x6b, 0x73, 0x07, 0x9a, 0xf9, 0x65, 0x19, 0xee, 0xef, 0x21, 0xbf, 0xf4, - 0x4b, 0xce, 0x7f, 0x72, 0x18, 0x59, 0x5b, 0x2a, 0x4f, 0x94, 0x20, 0xd8, - 0x40, 0x99, 0x47, 0x4b, 0x5e, 0x7f, 0x22, 0x3b, 0xd1, 0xae, 0xac, 0xbf, - 0x87, 0xf4, 0x68, 0xfe, 0x59, 0x7d, 0xdd, 0xb0, 0x55, 0x95, 0x23, 0xef, - 0x31, 0xc2, 0x2f, 0xbf, 0x1b, 0x1a, 0xce, 0x2c, 0xbf, 0xf4, 0x14, 0x7a, - 0x70, 0x48, 0x20, 0x59, 0x78, 0x2f, 0xc5, 0x97, 0xd3, 0x05, 0xe6, 0x59, - 0x7e, 0x8f, 0xdf, 0xee, 0x2c, 0xbc, 0x47, 0xfa, 0xcb, 0xd9, 0xde, 0x2c, - 0xa8, 0x37, 0x1c, 0x1c, 0xa9, 0x26, 0x50, 0x32, 0x89, 0x8f, 0xfc, 0x39, - 0xf9, 0x27, 0x58, 0x6f, 0xdb, 0x8e, 0x43, 0xdd, 0x59, 0x4b, 0x2f, 0xdc, - 0xee, 0xa3, 0x8b, 0x2d, 0x1f, 0x1b, 0x3e, 0x85, 0xdf, 0xf7, 0xfc, 0xd4, - 0x7d, 0x23, 0x6a, 0xcb, 0xdd, 0x7d, 0xeb, 0x2f, 0xdb, 0x06, 0x68, 0xdc, - 0x59, 0x7c, 0x19, 0xa3, 0x71, 0x65, 0xcf, 0xb4, 0xe3, 0xd3, 0xd8, 0xb6, - 0xa1, 0x1b, 0xae, 0x76, 0x17, 0x1b, 0xfe, 0x83, 0xff, 0x90, 0xd7, 0xea, - 0xcb, 0xfe, 0x3e, 0x4c, 0x65, 0xd8, 0xfd, 0x65, 0xff, 0xc5, 0xdd, 0xf1, - 0xae, 0x39, 0x46, 0xe2, 0xca, 0x92, 0x39, 0xb4, 0x5c, 0xd3, 0x8e, 0x1c, - 0xdf, 0xe8, 0xdc, 0xe4, 0x35, 0xfa, 0xb2, 0xe7, 0x25, 0x97, 0xfd, 0x1f, - 0xce, 0xf4, 0x35, 0xc9, 0x65, 0x7c, 0x79, 0xfb, 0xc5, 0x6f, 0xff, 0xb0, - 0x62, 0x4d, 0xce, 0xfb, 0x06, 0x1e, 0xf1, 0x65, 0x49, 0x1f, 0x9a, 0x84, - 0x27, 0x89, 0x6f, 0xe8, 0x14, 0xfc, 0x1d, 0xc5, 0x97, 0xf7, 0xd2, 0xe3, - 0x97, 0xcb, 0x2a, 0x17, 0x06, 0x24, 0xc1, 0x91, 0xf5, 0x1c, 0x67, 0x3a, - 0x35, 0x10, 0xc6, 0xff, 0xc5, 0x34, 0xed, 0x47, 0xd2, 0x36, 0xac, 0xbf, - 0xfd, 0xbe, 0x0b, 0xbd, 0xf6, 0x0c, 0x3d, 0xe2, 0xcb, 0xa1, 0xab, 0x2a, - 0x11, 0x49, 0x88, 0x5a, 0x4c, 0xbf, 0xa0, 0xa6, 0xe9, 0xb0, 0xb2, 0xff, - 0xa5, 0x9a, 0x9b, 0x0a, 0x1a, 0xb2, 0xfd, 0xfc, 0x03, 0x1a, 0xb2, 0xff, - 0x66, 0xdc, 0x89, 0x83, 0xa5, 0x94, 0x68, 0x95, 0xd1, 0xc1, 0x14, 0x5d, - 0x2c, 0x59, 0x7e, 0xe3, 0x1a, 0x71, 0x56, 0x5e, 0x28, 0x6a, 0xca, 0x19, - 0xe2, 0xe8, 0xaa, 0xfb, 0xed, 0xcc, 0x92, 0xcb, 0xfc, 0xfa, 0x9b, 0x3b, - 0xbb, 0xbd, 0x65, 0xe8, 0xff, 0x8b, 0x2a, 0x13, 0x27, 0x19, 0x76, 0x2d, - 0xb9, 0x10, 0x49, 0x85, 0x39, 0xbe, 0x7f, 0x3e, 0xcb, 0x2f, 0xde, 0x0b, - 0x18, 0x4b, 0x2f, 0xf0, 0xa4, 0xfd, 0x93, 0x8d, 0x65, 0xfb, 0xa2, 0x6d, - 0x1e, 0x59, 0x7f, 0xd1, 0xee, 0x3f, 0x63, 0x5b, 0xab, 0x2f, 0xfc, 0xd7, - 0x18, 0x93, 0x4a, 0x0b, 0xe5, 0x94, 0x33, 0xfc, 0x33, 0xbb, 0xf8, 0x3e, - 0x8d, 0x67, 0xeb, 0x2f, 0xb5, 0xf8, 0x9b, 0xd6, 0x5e, 0x31, 0x7a, 0xb2, - 0xa4, 0x7e, 0x5e, 0x2e, 0xe1, 0x3d, 0x6c, 0x9f, 0x28, 0xc8, 0xbe, 0x28, - 0x98, 0xcf, 0xd0, 0xa6, 0xec, 0x24, 0xef, 0xf1, 0x77, 0x38, 0x6f, 0xe5, - 0x97, 0xdc, 0x97, 0x1d, 0x65, 0xff, 0x7e, 0x7e, 0xcd, 0x3c, 0xdc, 0x59, - 0x7f, 0xfd, 0x22, 0x8d, 0x84, 0x9b, 0x9e, 0xcd, 0xdd, 0x7e, 0xb2, 0xf4, - 0x87, 0xbd, 0x65, 0x41, 0xfb, 0x3a, 0xbd, 0xfd, 0x39, 0xb9, 0xd7, 0xea, - 0xcb, 0xfb, 0xc6, 0x33, 0xd0, 0x16, 0x58, 0x0b, 0x2d, 0xcc, 0x3e, 0xd0, - 0x17, 0xb9, 0x6d, 0xef, 0xa6, 0xe2, 0xca, 0xf8, 0xf4, 0x9c, 0xce, 0xf4, - 0x18, 0xd6, 0x54, 0x2a, 0x1f, 0x19, 0x8f, 0xc4, 0x4d, 0x85, 0x83, 0xc3, - 0x7f, 0x84, 0x57, 0xfb, 0x05, 0x91, 0xf0, 0x2d, 0x59, 0x76, 0xfe, 0x2c, - 0xbf, 0x83, 0xc8, 0x98, 0x3a, 0x59, 0x7e, 0xcd, 0xb3, 0xdc, 0x59, 0x50, - 0x7e, 0x1e, 0x19, 0x22, 0xfb, 0xd9, 0xae, 0x2c, 0xa0, 0x1e, 0x4e, 0xf2, - 0xdb, 0xfe, 0xfe, 0x3f, 0x13, 0x7c, 0x16, 0xea, 0xcb, 0xff, 0xf6, 0xd1, - 0xd8, 0xf1, 0xf6, 0x47, 0xa0, 0x7a, 0x16, 0x54, 0x27, 0x4d, 0x90, 0xed, - 0x32, 0x47, 0x40, 0xbf, 0xff, 0xed, 0x7c, 0x03, 0xfa, 0x73, 0x0f, 0x3b, - 0x9e, 0x70, 0x41, 0x0d, 0x65, 0xff, 0x3f, 0x04, 0xef, 0xc0, 0x36, 0xac, - 0xb7, 0xa1, 0x15, 0x01, 0x6d, 0xbe, 0x36, 0x27, 0xf1, 0x65, 0xfc, 0x27, - 0x63, 0x62, 0xf9, 0x65, 0xe2, 0x36, 0xac, 0xad, 0x1f, 0x87, 0xe4, 0xbd, - 0x30, 0xbf, 0xc5, 0x0e, 0x5d, 0xc2, 0x59, 0x7f, 0xa3, 0xee, 0x6e, 0x46, - 0x98, 0x59, 0x7f, 0xbc, 0xf3, 0x1e, 0xa3, 0x65, 0x97, 0xf6, 0x6e, 0xb6, - 0x33, 0xab, 0x2e, 0xc6, 0xac, 0xa1, 0xa7, 0x51, 0x90, 0x98, 0x69, 0x87, - 0x8b, 0xdc, 0xe0, 0x26, 0x9b, 0xcb, 0xef, 0xdb, 0xa6, 0xd8, 0xe2, 0xcb, - 0xf3, 0xef, 0xcd, 0x71, 0x65, 0x0c, 0xf4, 0xda, 0x55, 0x7e, 0xf3, 0x91, - 0xb5, 0x65, 0xf3, 0x13, 0x72, 0x16, 0x5f, 0xdf, 0xfd, 0xfe, 0x6b, 0x16, - 0x5f, 0xc0, 0x83, 0xe9, 0xc9, 0x65, 0xfc, 0xff, 0xb6, 0x33, 0xab, 0x2a, - 0x11, 0x13, 0x86, 0x06, 0x59, 0x7c, 0x3f, 0x3f, 0xcb, 0x2f, 0xef, 0xf9, - 0x1e, 0x8e, 0x2c, 0xa8, 0x3d, 0x17, 0x23, 0xbf, 0x7d, 0xde, 0x66, 0xcb, - 0x2e, 0xcd, 0x96, 0x53, 0x9e, 0x09, 0x15, 0x54, 0x27, 0xe9, 0x84, 0x46, - 0x4d, 0xe8, 0x56, 0x93, 0xf7, 0x18, 0x6e, 0xfc, 0x0b, 0x2d, 0xc5, 0x97, - 0x1b, 0x1c, 0x35, 0x21, 0x18, 0xbd, 0xfb, 0x81, 0x65, 0xf0, 0xb3, 0x72, - 0x16, 0x5f, 0x3e, 0xd1, 0xd5, 0x97, 0xe7, 0x23, 0xdc, 0xde, 0xb2, 0xdc, - 0x23, 0xcd, 0xde, 0x45, 0x7e, 0xd9, 0xf9, 0x92, 0x59, 0x7f, 0xfc, 0x3c, - 0xde, 0xfa, 0x98, 0x49, 0x3f, 0x5d, 0xab, 0x2e, 0xcd, 0xc5, 0x95, 0x08, - 0x94, 0x32, 0x8d, 0x29, 0xdf, 0xcf, 0xf7, 0xed, 0x3e, 0x2c, 0xa8, 0x4e, - 0xa3, 0xe1, 0xd9, 0x9c, 0x75, 0x0b, 0xdf, 0x17, 0x5f, 0xc6, 0x2b, 0xcd, - 0x0d, 0x59, 0x7b, 0x76, 0x38, 0xb2, 0xba, 0x79, 0xa1, 0x2e, 0xb3, 0x36, - 0x4b, 0xa2, 0x23, 0x9e, 0x52, 0x27, 0x89, 0x1c, 0x4e, 0x79, 0xed, 0x0e, - 0x79, 0x10, 0x8d, 0x9f, 0x25, 0x3a, 0xfd, 0x0d, 0xc3, 0x8d, 0x56, 0x69, - 0xc7, 0x2d, 0x46, 0x10, 0xd2, 0xef, 0x47, 0xd4, 0xf2, 0x8e, 0xff, 0x95, - 0x08, 0x52, 0x82, 0x39, 0x2a, 0x3f, 0xb2, 0xac, 0x67, 0xe1, 0x04, 0x24, - 0x7a, 0xbb, 0xb0, 0x9e, 0xbf, 0x68, 0x0e, 0xe0, 0x54, 0x53, 0x8b, 0xfb, - 0xc6, 0xd2, 0x76, 0x16, 0x59, 0x9e, 0x1f, 0x09, 0x9a, 0x5f, 0xd0, 0xdc, - 0xdd, 0x8e, 0xac, 0xbe, 0xf4, 0x13, 0x0b, 0x29, 0xa7, 0xa3, 0xd2, 0xfb, - 0xec, 0xe0, 0x92, 0x59, 0x7f, 0xe3, 0xd3, 0xf3, 0xd9, 0x84, 0x05, 0x97, - 0xe6, 0xeb, 0x59, 0xc5, 0x97, 0xff, 0xef, 0x07, 0xba, 0x8e, 0xf3, 0x01, - 0xc8, 0xd0, 0x16, 0x5f, 0xf7, 0x0d, 0x8c, 0x94, 0x7f, 0xc5, 0x97, 0xfa, - 0x3a, 0x60, 0x31, 0xc2, 0xcb, 0xff, 0xf6, 0x4c, 0x47, 0xce, 0xc0, 0x87, - 0xa9, 0xa3, 0xcb, 0x2b, 0x48, 0x87, 0xe9, 0x8d, 0xfd, 0xf4, 0xa1, 0xa1, - 0x99, 0x65, 0xfc, 0xd1, 0xc7, 0x02, 0x4b, 0x2f, 0x77, 0xc6, 0xb2, 0xa0, - 0xfe, 0x4c, 0xc1, 0xcb, 0x6f, 0xe7, 0xfb, 0x93, 0xb8, 0x22, 0xcb, 0xf7, - 0x7e, 0x94, 0x0a, 0xb2, 0xfe, 0x71, 0x33, 0x7c, 0x71, 0x65, 0x61, 0xec, - 0x84, 0xaa, 0xff, 0xc7, 0xf7, 0x0b, 0x07, 0xe7, 0x15, 0x65, 0xff, 0xf6, - 0x6d, 0x9f, 0x77, 0x86, 0x51, 0xfb, 0xb5, 0x65, 0x30, 0x88, 0xfe, 0x1f, - 0xdf, 0xfb, 0x3d, 0x1a, 0xc6, 0x62, 0x8a, 0x2a, 0x4b, 0x8c, 0x55, 0x97, - 0x6c, 0xce, 0x17, 0x10, 0x64, 0x44, 0x32, 0x3c, 0x3c, 0x01, 0x47, 0xca, - 0xc7, 0x0c, 0x1f, 0x42, 0x73, 0xf2, 0xc2, 0x84, 0x5f, 0x61, 0x61, 0x3e, - 0x49, 0xba, 0x87, 0x7e, 0xd0, 0x1d, 0xc0, 0xa8, 0xaf, 0x17, 0xff, 0xf6, - 0x0f, 0xd0, 0x23, 0x3e, 0x93, 0xff, 0xce, 0x47, 0xe9, 0x2c, 0xcf, 0x11, - 0x27, 0x3e, 0x69, 0x7f, 0xf3, 0x37, 0x93, 0x3c, 0xd0, 0x1d, 0xc0, 0xa8, - 0x91, 0xd7, 0x63, 0x56, 0x5d, 0xdc, 0x59, 0x40, 0x35, 0x9f, 0x0b, 0x5f, - 0xff, 0xf8, 0x9d, 0x9e, 0xfe, 0xc0, 0xe0, 0x2c, 0xbd, 0x47, 0x4f, 0xf8, - 0x92, 0xcb, 0xc7, 0xfc, 0x2c, 0xbc, 0x0c, 0x6a, 0x46, 0x65, 0xe5, 0xf6, - 0x3f, 0xdf, 0xac, 0xbe, 0x03, 0xb8, 0x15, 0x12, 0x42, 0xb6, 0x3d, 0x1d, - 0x11, 0xdf, 0xff, 0x8f, 0x47, 0xbb, 0x05, 0xb4, 0x74, 0xfc, 0xfb, 0x2c, - 0xbf, 0x3c, 0xba, 0x7b, 0x2c, 0xa8, 0x3f, 0xf3, 0x57, 0xbf, 0xfc, 0xfd, - 0x9b, 0x98, 0x31, 0x85, 0xf5, 0x25, 0x97, 0xff, 0xcf, 0xf7, 0x33, 0xce, - 0x59, 0xb3, 0x43, 0xe5, 0x97, 0xff, 0x78, 0xfe, 0xee, 0x7d, 0xdd, 0x6a, - 0x16, 0x5f, 0xfc, 0x70, 0xd7, 0x18, 0x9b, 0xb0, 0x52, 0x59, 0x58, 0x8d, - 0xc0, 0x28, 0x79, 0x1a, 0xff, 0xf1, 0x67, 0xf3, 0xf9, 0xa8, 0xd9, 0xf4, - 0x05, 0x97, 0xfb, 0x3c, 0xed, 0x28, 0xf9, 0x65, 0xd2, 0x67, 0x0a, 0xc5, - 0x71, 0xfb, 0xd0, 0xa2, 0xfc, 0x83, 0x91, 0x93, 0xf4, 0xbc, 0x44, 0xdb, - 0xf0, 0x7e, 0x01, 0xf1, 0x65, 0xfb, 0x3c, 0xcf, 0x1a, 0xb2, 0xcc, 0xe1, - 0x72, 0x5c, 0x04, 0x4f, 0x2e, 0x93, 0xf7, 0xfe, 0x94, 0xdf, 0xfc, 0xcd, - 0xe4, 0xcf, 0x34, 0x07, 0x70, 0x2a, 0x24, 0xa5, 0xfb, 0x40, 0x77, 0x02, - 0xa2, 0xf1, 0x5f, 0xf4, 0x99, 0xe6, 0x80, 0xee, 0x05, 0x44, 0x9a, 0xb3, - 0x3c, 0x3f, 0xb7, 0x34, 0xbe, 0x07, 0x8c, 0x96, 0x5f, 0xb9, 0xcc, 0x2c, - 0x59, 0x7f, 0xda, 0x04, 0x6d, 0x98, 0x5d, 0x59, 0x7f, 0x47, 0x0d, 0xb1, - 0x32, 0xcb, 0xe7, 0x3f, 0xb8, 0xb2, 0xde, 0x59, 0x58, 0x8b, 0xe3, 0x26, - 0x69, 0xc7, 0x8b, 0x45, 0x22, 0xbf, 0xc7, 0xfe, 0x14, 0x7d, 0xc5, 0x97, - 0xb7, 0xc4, 0x96, 0x5f, 0xa3, 0xbc, 0xce, 0xac, 0xbc, 0xe4, 0x3c, 0x3c, - 0x5f, 0x0f, 0x5f, 0xf3, 0xea, 0x5c, 0xc0, 0xeb, 0x65, 0x94, 0x67, 0xd6, - 0x13, 0x1b, 0xfe, 0xcf, 0xc7, 0xe8, 0x28, 0x15, 0x65, 0xf7, 0xfc, 0xc2, - 0x59, 0x50, 0x7b, 0x66, 0x73, 0x7f, 0xe0, 0x83, 0x9c, 0x7d, 0x76, 0x18, - 0x59, 0x7e, 0xf7, 0x79, 0x9d, 0x59, 0x46, 0x7d, 0x0e, 0x81, 0x7f, 0xfe, - 0xf3, 0x9f, 0xfc, 0xc6, 0x1d, 0xba, 0x8c, 0x25, 0x97, 0x18, 0xd6, 0x54, - 0x1f, 0x57, 0x95, 0x2f, 0xa4, 0x18, 0xf9, 0x65, 0xff, 0x6c, 0x7c, 0xe3, - 0xff, 0xe0, 0xac, 0xbf, 0x8f, 0x43, 0x28, 0xf9, 0x65, 0xff, 0xf0, 0x5f, - 0xec, 0xc6, 0x18, 0x79, 0x67, 0xdd, 0x59, 0x7f, 0x7b, 0x33, 0xbe, 0xc5, - 0x97, 0xfd, 0x12, 0xe6, 0xb4, 0xe5, 0xd5, 0x95, 0x25, 0x4e, 0x83, 0x84, - 0x40, 0x21, 0x15, 0x31, 0x0e, 0x88, 0xfc, 0x77, 0xc2, 0xde, 0xa9, 0x6f, - 0x2c, 0xbf, 0xb3, 0xbd, 0x82, 0xd9, 0x65, 0xfb, 0x06, 0xca, 0xe5, 0xb8, - 0xb2, 0xfe, 0x72, 0xfd, 0x95, 0xcb, 0x71, 0x65, 0xce, 0x3d, 0xe7, 0xd1, - 0x3e, 0x63, 0x5e, 0x46, 0x38, 0x61, 0x2b, 0x79, 0xc8, 0x0b, 0x2f, 0x7a, - 0x04, 0x59, 0x5d, 0x37, 0x02, 0x8d, 0xdf, 0xc4, 0xff, 0x93, 0xb5, 0x65, - 0xfd, 0x03, 0xf6, 0xe1, 0x92, 0xcb, 0xfe, 0x86, 0xfb, 0x06, 0x33, 0xf9, - 0x65, 0x61, 0xf4, 0x19, 0x7d, 0xf6, 0xe9, 0xc3, 0x0b, 0x2f, 0x4b, 0xe6, - 0x16, 0x5f, 0xcd, 0xef, 0x83, 0xde, 0x2c, 0xbc, 0x11, 0xfc, 0xb2, 0xff, - 0xe7, 0xfc, 0x1e, 0x3d, 0x11, 0xf7, 0x8b, 0x2f, 0xf6, 0xfc, 0x97, 0xa0, - 0x98, 0x59, 0x71, 0x6c, 0xb2, 0xa1, 0x32, 0x11, 0x92, 0xe0, 0xf9, 0x97, - 0xb8, 0xf7, 0xe8, 0x82, 0x1a, 0xdb, 0xab, 0x2e, 0xd6, 0x2c, 0xbd, 0xf8, - 0x9b, 0x2c, 0xad, 0x1e, 0x3f, 0xe2, 0x24, 0x2d, 0x76, 0x35, 0x65, 0xed, - 0x6f, 0xf2, 0xcb, 0xf6, 0x69, 0xe0, 0x6b, 0x2a, 0x0f, 0x6d, 0xc5, 0x88, - 0x7e, 0xff, 0xda, 0x0b, 0x7c, 0x70, 0xd7, 0x25, 0x97, 0xfd, 0xc8, 0x69, - 0x64, 0xa0, 0x96, 0x56, 0x8f, 0xcf, 0xa7, 0xb7, 0x14, 0x96, 0x5d, 0x3d, - 0x8a, 0xb2, 0x82, 0x6c, 0xe7, 0xc5, 0xab, 0x0f, 0xe7, 0x75, 0x56, 0xff, - 0xe0, 0x05, 0xc7, 0xbf, 0x06, 0xca, 0xe5, 0xb8, 0xb2, 0xf8, 0xfd, 0x1b, - 0xd6, 0x56, 0x8f, 0xcf, 0xaa, 0x17, 0xfa, 0x35, 0x1f, 0x7f, 0xa8, 0x59, - 0x71, 0x6c, 0xb2, 0xf7, 0x83, 0xb8, 0xb2, 0xfe, 0x28, 0xef, 0x9e, 0x4b, - 0x2a, 0x0f, 0x32, 0x62, 0x0b, 0xdd, 0x8d, 0x2c, 0xa8, 0x47, 0xbe, 0xc4, - 0x53, 0x1a, 0x3b, 0x18, 0x48, 0xae, 0x70, 0x2c, 0xbf, 0x80, 0x30, 0xec, - 0x23, 0x56, 0x5f, 0xdf, 0x73, 0x1a, 0xfc, 0x59, 0x7c, 0x3c, 0xf4, 0x2c, - 0xbf, 0xb3, 0x6d, 0x47, 0xda, 0x59, 0x7f, 0x82, 0x3c, 0x94, 0x7f, 0xc5, - 0x95, 0x08, 0xf9, 0xc1, 0x63, 0x31, 0x72, 0xe2, 0x21, 0xe1, 0x7d, 0xfa, - 0x6e, 0x70, 0xda, 0xb2, 0xf7, 0x03, 0xf2, 0xcb, 0xff, 0xed, 0x85, 0x79, - 0x73, 0x99, 0xa1, 0x63, 0x4c, 0x2c, 0xb1, 0x2c, 0xbf, 0x9f, 0xbc, 0xdb, - 0x05, 0x59, 0x7f, 0xff, 0x1f, 0x1e, 0x5c, 0x3d, 0xfc, 0x0b, 0x9c, 0x8f, - 0x7a, 0xcb, 0x84, 0x11, 0x65, 0x62, 0x6a, 0x13, 0x14, 0xb8, 0xf7, 0xea, - 0x84, 0x21, 0xd2, 0xf1, 0x17, 0x6f, 0xd9, 0xaf, 0xff, 0x85, 0x97, 0x4f, - 0xb3, 0x64, 0x33, 0xfc, 0xe2, 0x1b, 0xf2, 0x49, 0x1c, 0x38, 0xf2, 0x57, - 0x80, 0x23, 0x54, 0xf9, 0x82, 0x62, 0x2d, 0x42, 0x53, 0xd1, 0xa0, 0xbc, - 0x2a, 0xbf, 0x84, 0x51, 0x46, 0x31, 0xc8, 0xe3, 0xbb, 0x1a, 0x18, 0x91, - 0xd1, 0x6e, 0xb2, 0xdf, 0xe0, 0xec, 0xcf, 0x77, 0x74, 0xd8, 0x59, 0x50, - 0xf8, 0x67, 0x9b, 0x42, 0xa6, 0x56, 0x89, 0x30, 0x72, 0x84, 0x4e, 0x72, - 0xea, 0x68, 0xdb, 0xda, 0x5b, 0xe9, 0xd1, 0x7e, 0xad, 0x86, 0x19, 0xe2, - 0x56, 0x03, 0x7b, 0xb1, 0xa3, 0x53, 0x2b, 0x52, 0x45, 0x93, 0x22, 0xd4, - 0xa7, 0x6d, 0x39, 0xaf, 0x2a, 0x59, 0xf0, 0xe9, 0x1b, 0x59, 0x9a, 0x46, - 0xd3, 0x14, 0xa4, 0xd0, 0x62, 0x91, 0xcf, 0xeb, 0x52, 0x72, 0x75, 0xa0, - 0xf6, 0xe4, 0xa5, 0x09, 0xaf, 0xb7, 0x2b, 0x57, 0xcf, 0x1e, 0xdd, 0x62, - 0x18, 0xde, 0xae, 0xcc, 0xde, 0xfd, 0x8f, 0x3f, 0xac, 0x15, 0x19, 0x72, - 0xfb, 0xca, 0xd8, 0xde, 0xf2, 0xdb, 0x88, 0x77, 0x18, 0x3b, 0x01, 0xbe, - 0xc0, 0x3d, 0xf5, 0x8a, 0x48, 0xb4, 0xd6, 0x39, 0xf9, 0xec, 0x91, 0x29, - 0xfa, 0xfb, 0xb7, 0x88, 0x2f, 0x40, + 0xff, 0xee, 0x61, 0x96, 0x4d, 0x1b, 0x3e, 0xcd, 0x3d, 0x96, 0x54, 0x22, + 0xdb, 0x82, 0xfd, 0x26, 0x09, 0x1d, 0xff, 0xa3, 0xaf, 0xcc, 0xf7, 0x8d, + 0xab, 0x2f, 0xc5, 0x1b, 0x46, 0xcb, 0x28, 0x67, 0xcb, 0x31, 0xed, 0xfc, + 0x38, 0x7d, 0x7e, 0x15, 0x97, 0x67, 0x96, 0x56, 0xc7, 0x89, 0xbc, 0xba, + 0xff, 0xfb, 0x0d, 0xa7, 0xfb, 0xf4, 0xb3, 0x6d, 0x42, 0xcb, 0xfb, 0x73, + 0x37, 0x96, 0x49, 0x65, 0xc7, 0x32, 0xca, 0x33, 0xc8, 0xe9, 0x8d, 0xfe, + 0x36, 0x1e, 0x5c, 0x31, 0xac, 0xa8, 0x4d, 0xdb, 0x19, 0xfc, 0x4b, 0xc8, + 0x4b, 0x74, 0x86, 0xe0, 0xc9, 0x65, 0xfd, 0xe3, 0xd6, 0xb3, 0xab, 0x2b, + 0x63, 0xc4, 0x00, 0xbd, 0xfe, 0x3e, 0x79, 0xdb, 0x1b, 0x8b, 0x2f, 0xff, + 0x4d, 0x23, 0xdf, 0x1a, 0xc3, 0x90, 0x74, 0xb2, 0xb4, 0x88, 0x17, 0x35, + 0xbe, 0xdc, 0x31, 0x40, 0xb2, 0xe3, 0x92, 0xca, 0x83, 0x79, 0xd2, 0x6b, + 0xfe, 0xc6, 0xf0, 0xe7, 0xf3, 0x50, 0xb2, 0xa1, 0xbe, 0x46, 0xda, 0x13, + 0x72, 0x8d, 0x24, 0x72, 0xaf, 0xf2, 0x17, 0xe0, 0x84, 0x2f, 0xc4, 0x27, + 0x3d, 0xad, 0xb9, 0x0d, 0xd9, 0xa1, 0xc1, 0xa9, 0x44, 0x6d, 0x95, 0x2f, + 0xe9, 0x41, 0x4f, 0x09, 0x8f, 0xe1, 0x46, 0x52, 0x9c, 0x39, 0x19, 0xbf, + 0x65, 0x0b, 0x86, 0x12, 0x5b, 0xe1, 0x48, 0x22, 0xf6, 0xe9, 0x05, 0xcc, + 0x75, 0x65, 0xff, 0xff, 0x4f, 0x19, 0xee, 0x31, 0x95, 0x6a, 0x7b, 0x65, + 0x37, 0xee, 0x4f, 0x00, 0xce, 0x9d, 0xe9, 0xf5, 0x97, 0x1c, 0x2c, 0xbd, + 0x30, 0x8d, 0x59, 0x7f, 0xd9, 0xde, 0x67, 0x7d, 0x9f, 0xac, 0xbf, 0xc6, + 0xc3, 0x97, 0x70, 0x96, 0x53, 0x08, 0x9e, 0x71, 0x52, 0x1f, 0xe9, 0xcd, + 0xce, 0x4b, 0x2b, 0x47, 0xa2, 0xd3, 0xcb, 0xe8, 0xee, 0x35, 0x65, 0xfb, + 0xb0, 0x47, 0xfa, 0xcb, 0xbe, 0xf9, 0x65, 0xfb, 0x41, 0xdf, 0xf8, 0xab, + 0x2e, 0x2e, 0x2c, 0xbf, 0xb0, 0x57, 0xfd, 0xb8, 0xb2, 0xa7, 0x23, 0x4b, + 0x08, 0x7e, 0x27, 0xf0, 0xcf, 0xe5, 0xa4, 0x2d, 0x7f, 0xe8, 0x69, 0xfd, + 0xc0, 0xcc, 0x16, 0x16, 0x5f, 0x8b, 0xbe, 0xc9, 0x2c, 0xbb, 0x98, 0xb2, + 0x8c, 0xde, 0xb9, 0x3d, 0xfe, 0x28, 0x16, 0x7f, 0x35, 0x0b, 0x2f, 0x88, + 0x71, 0xba, 0xb2, 0xc2, 0xce, 0x47, 0xbc, 0x9f, 0xc6, 0x3e, 0xe6, 0xb7, + 0xdb, 0x47, 0x78, 0xb2, 0xf4, 0x7f, 0xc5, 0x95, 0xa3, 0xc0, 0x22, 0x3b, + 0xe7, 0xd3, 0xc9, 0x65, 0xb5, 0x87, 0x84, 0x44, 0x37, 0x85, 0x14, 0x55, + 0x97, 0xdb, 0x11, 0xc2, 0x46, 0x66, 0x82, 0xff, 0xb7, 0x3c, 0xe5, 0x21, + 0xc6, 0xcb, 0x2f, 0x9f, 0xb0, 0x35, 0x97, 0x7d, 0x25, 0x97, 0xf9, 0x88, + 0xef, 0x3c, 0xe1, 0x59, 0x7e, 0x3d, 0xb3, 0xee, 0xac, 0xb7, 0xeb, 0x2c, + 0x05, 0x95, 0x86, 0x8c, 0xc4, 0xaa, 0x11, 0x6e, 0xc0, 0xc3, 0x4d, 0x3a, + 0x99, 0x7f, 0xd2, 0xfb, 0x87, 0xa0, 0x7b, 0x16, 0x5f, 0x98, 0x7e, 0x6f, + 0x92, 0xca, 0xf9, 0x14, 0x5a, 0x3d, 0xe9, 0xd5, 0xf9, 0xca, 0x46, 0xd5, + 0x97, 0xb0, 0x33, 0xeb, 0x29, 0x92, 0xbe, 0x9a, 0xca, 0x0c, 0x44, 0x70, + 0xa3, 0x87, 0xa6, 0x46, 0xa0, 0x70, 0xc7, 0xf2, 0x33, 0x99, 0x91, 0xe0, + 0x63, 0x7a, 0xde, 0x63, 0x3e, 0x4d, 0x7a, 0x7a, 0x65, 0x76, 0x42, 0xcb, + 0xfe, 0xf3, 0xcc, 0x51, 0x9a, 0x92, 0xcb, 0xff, 0x39, 0x09, 0x37, 0x0c, + 0xbe, 0x92, 0xcb, 0xff, 0x0b, 0x9c, 0x23, 0x8d, 0x66, 0xcb, 0x2b, 0x71, + 0x16, 0xc1, 0x38, 0xde, 0x81, 0x7f, 0xff, 0xff, 0xed, 0xc9, 0xde, 0xcf, + 0xa5, 0xe6, 0xce, 0x07, 0x83, 0xde, 0xe1, 0x7b, 0x3b, 0x03, 0x9d, 0x3b, + 0xd3, 0xeb, 0x2f, 0xf8, 0x78, 0x16, 0x59, 0xf9, 0xda, 0xb2, 0xfd, 0x0d, + 0x2c, 0x99, 0x66, 0x1b, 0xcb, 0xda, 0x8d, 0xeb, 0x2f, 0x6f, 0xc1, 0xac, + 0xbf, 0xbc, 0x70, 0x41, 0x85, 0x97, 0xfa, 0x37, 0x18, 0xce, 0x3e, 0xe2, + 0xca, 0x60, 0xf9, 0x3c, 0x57, 0x7e, 0xc1, 0x89, 0xff, 0x16, 0x54, 0xe4, + 0x76, 0xf8, 0x79, 0xe1, 0x04, 0x44, 0x77, 0xde, 0x81, 0x3c, 0xb2, 0x86, + 0x9c, 0x47, 0x23, 0x23, 0xea, 0x15, 0xfd, 0x12, 0xf4, 0x6f, 0x35, 0x97, + 0xf8, 0xe5, 0x1f, 0xfa, 0x50, 0xb2, 0xfc, 0xd0, 0x94, 0x35, 0x65, 0x86, + 0xb2, 0xe7, 0xe2, 0xcb, 0x69, 0xa6, 0x9c, 0x22, 0x35, 0x07, 0xea, 0xe9, + 0xd7, 0x4b, 0xab, 0x2f, 0xa6, 0x8e, 0xba, 0xcb, 0xe0, 0xff, 0x84, 0x03, + 0x72, 0x11, 0x7b, 0x49, 0x65, 0x6c, 0x79, 0x3e, 0x38, 0xbf, 0xfa, 0x3c, + 0x20, 0xfa, 0x79, 0x34, 0x35, 0x65, 0xff, 0xba, 0x62, 0x83, 0xc7, 0xbc, + 0xc6, 0xb2, 0xff, 0x6a, 0x5e, 0xcd, 0xf0, 0xd5, 0x97, 0xc1, 0x65, 0xf3, + 0x16, 0x57, 0xc8, 0x9c, 0x34, 0x17, 0x35, 0xbf, 0x3c, 0xb8, 0x7b, 0xd6, + 0x5f, 0xf6, 0x6b, 0x27, 0x66, 0xa0, 0x6b, 0x2f, 0x34, 0x3b, 0xd6, 0x5f, + 0xd9, 0x2f, 0xa5, 0x9d, 0x59, 0x6e, 0xc9, 0x10, 0xd8, 0x73, 0xe1, 0xfb, + 0xdd, 0x0b, 0x56, 0x5f, 0x7d, 0x2f, 0x1a, 0xca, 0x83, 0xc0, 0x71, 0xda, + 0x54, 0x41, 0xcb, 0xf9, 0xf6, 0xfd, 0xc8, 0x68, 0xac, 0x1a, 0xb7, 0x00, + 0x7a, 0x93, 0xe3, 0x14, 0xd4, 0x4f, 0xf5, 0xd2, 0xff, 0x8f, 0x3b, 0xcd, + 0x60, 0xf1, 0x65, 0xfd, 0xe7, 0x69, 0x47, 0xcb, 0x2f, 0x9b, 0xc7, 0x97, + 0x8f, 0x90, 0x43, 0x7b, 0xfb, 0xff, 0x16, 0x77, 0x8b, 0x2f, 0xe2, 0xcd, + 0xe5, 0x9c, 0x59, 0x68, 0xd1, 0xed, 0xf4, 0xba, 0xa1, 0x34, 0x3c, 0x84, + 0x3f, 0x21, 0x2b, 0x6e, 0x2c, 0xbf, 0x7a, 0x37, 0x03, 0x25, 0x95, 0x06, + 0xf1, 0xc4, 0x6a, 0x4b, 0xc8, 0xac, 0x17, 0x02, 0x15, 0x1a, 0x85, 0x13, + 0x48, 0xfd, 0x0e, 0x1f, 0xcb, 0xca, 0x15, 0xfd, 0x94, 0xaf, 0xbd, 0xd6, + 0xfe, 0x91, 0x67, 0xdd, 0xc5, 0x97, 0xff, 0xe1, 0x3f, 0xfe, 0x3e, 0xcd, + 0x86, 0xee, 0x07, 0x1a, 0xca, 0x84, 0x43, 0x68, 0xb6, 0xfe, 0x2e, 0xcb, + 0x35, 0x8b, 0x2e, 0x9f, 0x75, 0x94, 0xe7, 0x8a, 0x21, 0x65, 0xfe, 0xd6, + 0xdc, 0x70, 0x6b, 0x16, 0x5f, 0xef, 0x60, 0x1f, 0xd1, 0xe5, 0x97, 0xff, + 0x39, 0xf6, 0x08, 0x19, 0xdf, 0x1a, 0xcb, 0xf8, 0x8f, 0xfe, 0x78, 0xd6, + 0x5d, 0xa1, 0xac, 0xb8, 0x51, 0x56, 0x54, 0x8d, 0x80, 0xa2, 0xf7, 0xa0, + 0xf7, 0xa4, 0x66, 0x68, 0xaf, 0xf8, 0xc8, 0xff, 0xe6, 0x79, 0xd6, 0x56, + 0x26, 0xb1, 0xe3, 0x27, 0x41, 0xe3, 0xff, 0x4b, 0xef, 0xe8, 0x2e, 0xfb, + 0x24, 0xb2, 0xef, 0xf8, 0xb2, 0xfe, 0x3f, 0x1b, 0x0c, 0x42, 0xcb, 0x08, + 0x33, 0xc6, 0xe8, 0xc5, 0x69, 0x13, 0x7c, 0x72, 0xa8, 0x55, 0x26, 0x71, + 0xc6, 0x09, 0x0e, 0x4b, 0xfb, 0x73, 0x24, 0x64, 0xeb, 0x2f, 0x0a, 0x28, + 0xa9, 0x29, 0x23, 0x33, 0x41, 0x7c, 0x62, 0x9c, 0xc9, 0x28, 0x07, 0x80, + 0x63, 0xb7, 0xda, 0x8d, 0xf8, 0xb2, 0xf4, 0xd9, 0xe5, 0x95, 0x87, 0x80, + 0xe4, 0x77, 0xd9, 0xd0, 0xba, 0xcb, 0xb1, 0x96, 0xb2, 0xa7, 0x96, 0x7e, + 0xbc, 0x43, 0x8f, 0x63, 0x5c, 0x94, 0xde, 0x73, 0xcf, 0x9a, 0x8c, 0xc9, + 0xac, 0xfe, 0x95, 0x6a, 0xe7, 0x85, 0x08, 0xee, 0x30, 0xf4, 0x80, 0x52, + 0x1b, 0xed, 0x48, 0x38, 0xb2, 0xff, 0x17, 0xdd, 0x13, 0xcf, 0xfa, 0xcb, + 0xc4, 0x7c, 0x59, 0x78, 0xf3, 0x65, 0x97, 0xc3, 0x72, 0xfd, 0x65, 0xff, + 0xd0, 0x5f, 0x94, 0x7d, 0x34, 0x17, 0xeb, 0x2b, 0x11, 0xa8, 0x66, 0xde, + 0x1b, 0xfc, 0x73, 0x84, 0x57, 0xd2, 0xfe, 0x44, 0xb2, 0xfd, 0x34, 0xff, + 0xf3, 0xf8, 0xb2, 0xfa, 0x3a, 0xfe, 0x59, 0x7e, 0xd6, 0x6f, 0x7f, 0x2c, + 0xb1, 0xac, 0xbf, 0xe7, 0x60, 0x1e, 0x31, 0xbc, 0x96, 0x5f, 0x6d, 0xb3, + 0xfc, 0xb2, 0xdc, 0x33, 0xee, 0x21, 0x01, 0x0e, 0x69, 0x84, 0x65, 0xff, + 0x09, 0x7b, 0xec, 0xd7, 0x8d, 0x65, 0xff, 0xe7, 0x91, 0x66, 0xf7, 0x9a, + 0x33, 0xbc, 0x59, 0x50, 0x7d, 0x6e, 0x43, 0x7e, 0xc1, 0xb9, 0x8d, 0x65, + 0xfe, 0xcd, 0x84, 0xf7, 0xb3, 0x71, 0x65, 0xff, 0xdf, 0xfb, 0x33, 0x63, + 0xcd, 0xf1, 0xf2, 0xca, 0x83, 0xff, 0x14, 0xe2, 0xff, 0xf7, 0xf0, 0xdd, + 0x6a, 0x36, 0xeb, 0xbb, 0x0b, 0x2f, 0x83, 0xcf, 0x62, 0xcb, 0xcd, 0x80, + 0x2c, 0xbf, 0xe7, 0x97, 0x3f, 0x7d, 0xf8, 0x35, 0x97, 0x67, 0xb0, 0xf5, + 0xfc, 0x39, 0x7f, 0xfe, 0x3d, 0x78, 0x3e, 0x73, 0xec, 0x48, 0x23, 0xc5, + 0x97, 0xed, 0x1e, 0xce, 0xd5, 0x97, 0x0a, 0x2a, 0xca, 0xc3, 0xc1, 0x14, + 0xa2, 0xc1, 0x48, 0xcc, 0xd1, 0x53, 0x51, 0xb5, 0xe8, 0x5b, 0xde, 0x90, + 0x8d, 0x59, 0x7c, 0xff, 0x0c, 0x6b, 0x2a, 0x49, 0xb7, 0x9c, 0x60, 0xce, + 0x51, 0xc1, 0xeb, 0xd8, 0xdd, 0xc5, 0x97, 0xfe, 0x7d, 0xf8, 0x21, 0x47, + 0x8f, 0x65, 0x97, 0xfb, 0x38, 0x59, 0xdf, 0x1a, 0xca, 0x1a, 0x24, 0x34, + 0x3e, 0x48, 0x15, 0x8b, 0x96, 0x33, 0x42, 0x57, 0x44, 0x1e, 0x85, 0x2f, + 0xe4, 0x44, 0x99, 0xd8, 0xfa, 0x37, 0xc3, 0x4a, 0xd0, 0xb2, 0xfa, 0x5f, + 0xe7, 0xeb, 0x2f, 0xee, 0xe4, 0xc5, 0x0d, 0x5c, 0x40, 0x4b, 0xe2, 0x1f, + 0xa1, 0x51, 0x01, 0x19, 0x9b, 0xaa, 0xf9, 0x13, 0xce, 0xbd, 0x7f, 0xef, + 0xa4, 0x47, 0xb7, 0x5e, 0x5c, 0x59, 0x7f, 0xdc, 0x1e, 0x14, 0x10, 0x61, + 0x65, 0x8d, 0x83, 0xf6, 0xf9, 0x02, 0xfe, 0xc6, 0xff, 0xac, 0xf9, 0x65, + 0xfb, 0x46, 0x16, 0x5c, 0x2c, 0xbf, 0xda, 0xcf, 0xb9, 0xfb, 0xf5, 0x65, + 0x41, 0xf0, 0x30, 0x57, 0x60, 0xec, 0x8b, 0x10, 0x42, 0x3e, 0xfd, 0x12, + 0x7f, 0x85, 0x59, 0x7f, 0xd3, 0xb5, 0xac, 0xf7, 0xd2, 0xe2, 0xcb, 0xff, + 0xfd, 0x9c, 0x0b, 0xfd, 0x98, 0x4c, 0x73, 0x98, 0x5d, 0xe2, 0xca, 0x02, + 0x27, 0x7e, 0x3d, 0xbf, 0x38, 0xa3, 0x63, 0x7a, 0xca, 0xc5, 0x43, 0xe7, + 0x0d, 0xad, 0x17, 0xbc, 0x31, 0x88, 0x92, 0xfb, 0xbc, 0x0c, 0x96, 0x5f, + 0x83, 0x3f, 0x9a, 0xfd, 0x65, 0x39, 0xe7, 0xf0, 0x8e, 0xdb, 0x2c, 0xbf, + 0x4e, 0xc9, 0x8d, 0xab, 0x2f, 0xfd, 0x1f, 0x77, 0x24, 0x65, 0xf9, 0xac, + 0xbf, 0xfc, 0x18, 0x9d, 0xbb, 0xd3, 0xe7, 0xbe, 0x71, 0x56, 0x56, 0xc8, + 0xb9, 0x32, 0xae, 0x1f, 0x5f, 0xfb, 0x07, 0xe7, 0x67, 0x1e, 0x8f, 0x96, + 0x53, 0x25, 0x33, 0xbd, 0x43, 0x2d, 0xa6, 0x17, 0xfc, 0x4c, 0x68, 0x8c, + 0x01, 0x25, 0x97, 0xee, 0xc6, 0x14, 0x2c, 0xa3, 0x3d, 0xd2, 0x38, 0xbc, + 0x21, 0x75, 0x65, 0xe3, 0x6b, 0xac, 0xad, 0x8d, 0xc3, 0x03, 0xb7, 0xe0, + 0x61, 0xf1, 0xab, 0x2f, 0xfe, 0xe4, 0x17, 0x44, 0x9b, 0xc7, 0xde, 0x2c, + 0xbe, 0xcd, 0x46, 0xf5, 0x96, 0xfb, 0xe3, 0xe9, 0xea, 0x35, 0x35, 0x17, + 0x4f, 0x09, 0x0a, 0x84, 0xfc, 0xf2, 0x12, 0xe6, 0xb0, 0x18, 0x6e, 0xde, + 0xdd, 0x8f, 0x96, 0x5f, 0xe2, 0xcf, 0xf8, 0x23, 0xf5, 0x65, 0xe8, 0xc6, + 0xac, 0xbf, 0xdd, 0xcd, 0x68, 0xe6, 0xe2, 0xcb, 0xcd, 0xda, 0x16, 0x53, + 0x07, 0xa2, 0x03, 0x4b, 0xec, 0xe4, 0x80, 0xb2, 0xf7, 0xed, 0xea, 0xca, + 0x92, 0x64, 0x66, 0x40, 0xd3, 0x47, 0x6c, 0xfc, 0x8c, 0x88, 0xaf, 0xfd, + 0x8d, 0x80, 0x1f, 0x74, 0x16, 0xac, 0xbf, 0x6c, 0x19, 0x9c, 0x6b, 0x2f, + 0x1f, 0xdc, 0x59, 0x7f, 0xf7, 0x23, 0x6c, 0xd4, 0xc5, 0x1f, 0xf1, 0x65, + 0xfe, 0x3f, 0x66, 0xb5, 0x9f, 0x2c, 0xbf, 0x4c, 0x51, 0xa9, 0x2c, 0xb4, + 0x48, 0xf6, 0xf0, 0xce, 0xa4, 0x9a, 0x63, 0x9f, 0x7e, 0x55, 0xd1, 0xd1, + 0x61, 0x43, 0x7d, 0xa7, 0x94, 0xcb, 0x2f, 0xdc, 0xe4, 0x7f, 0x3d, 0x2c, + 0xa6, 0x0f, 0x44, 0x52, 0x3b, 0xef, 0x67, 0xee, 0xb2, 0xa1, 0x1d, 0x0f, + 0x0a, 0x2e, 0x12, 0x5f, 0xed, 0x4d, 0xc3, 0x2e, 0x9a, 0xcb, 0xff, 0x48, + 0xda, 0x2e, 0x10, 0xfd, 0x0b, 0x2f, 0xf3, 0x19, 0xaf, 0xda, 0x7c, 0x59, + 0x5f, 0x1f, 0x99, 0x1f, 0x5f, 0xef, 0x1f, 0xdf, 0xe9, 0xc6, 0xb2, 0xfb, + 0xef, 0xf5, 0x09, 0x2e, 0x14, 0x54, 0x95, 0x06, 0xf4, 0x52, 0x4b, 0x88, + 0xd2, 0x33, 0x34, 0x37, 0xff, 0xff, 0x13, 0x3c, 0xcd, 0xd8, 0x98, 0xdb, + 0x13, 0x4e, 0x2f, 0xa5, 0xe0, 0xfe, 0xb2, 0xe3, 0x02, 0xca, 0x59, 0x76, + 0xa5, 0x39, 0x35, 0x69, 0x42, 0x4f, 0xe2, 0x7d, 0x3d, 0xfe, 0x2d, 0x50, + 0x9e, 0xc3, 0xc6, 0xf1, 0x7e, 0x29, 0x00, 0x3b, 0x2c, 0xbd, 0x1a, 0x99, + 0x65, 0x39, 0xe3, 0x04, 0xa6, 0xfe, 0x11, 0xa4, 0xfd, 0xe2, 0xca, 0x9e, + 0x5b, 0x67, 0x08, 0x87, 0xb6, 0xc9, 0x32, 0x23, 0x19, 0x86, 0x4e, 0xce, + 0xfd, 0x08, 0xb3, 0x85, 0x76, 0xa5, 0x5c, 0x36, 0x14, 0x3e, 0x96, 0x9e, + 0xf1, 0xb4, 0x14, 0xa8, 0xae, 0x99, 0x86, 0x53, 0xf0, 0xad, 0xc2, 0x10, + 0xde, 0xe9, 0x8a, 0xb2, 0xfe, 0xda, 0x7c, 0x3e, 0x3d, 0x2c, 0xbf, 0xc5, + 0x2e, 0x0f, 0xc6, 0x2a, 0xcb, 0xdb, 0x3b, 0x56, 0x5d, 0xf1, 0x2c, 0xbf, + 0x7d, 0x2f, 0x09, 0xc5, 0x96, 0x7c, 0x3c, 0x22, 0x17, 0xb8, 0xc6, 0xb2, + 0xf7, 0x4c, 0x55, 0xc6, 0x10, 0xbc, 0x17, 0x11, 0x51, 0x03, 0xbe, 0x35, + 0x55, 0x24, 0x50, 0x78, 0x97, 0xa8, 0x15, 0x09, 0xca, 0x99, 0x93, 0x9a, + 0x06, 0x1f, 0xf7, 0x8b, 0x4c, 0xb5, 0x97, 0xf6, 0x17, 0xf9, 0x83, 0x59, + 0x7f, 0xff, 0xe9, 0x03, 0xc7, 0xad, 0x9b, 0x00, 0xf4, 0x18, 0xe3, 0xd1, + 0x25, 0x97, 0xbd, 0x0c, 0x2c, 0xaf, 0x91, 0x13, 0xbd, 0xb2, 0xff, 0x60, + 0x23, 0x62, 0x80, 0x2c, 0xbf, 0x00, 0xa3, 0xe9, 0x2c, 0xb7, 0xeb, 0x2d, + 0xb9, 0x38, 0xfb, 0x30, 0xc8, 0xca, 0x2e, 0x80, 0xac, 0xbf, 0x04, 0xbf, + 0x12, 0x4b, 0x2f, 0xff, 0x8b, 0x39, 0x38, 0x4f, 0x47, 0xed, 0x79, 0x4e, + 0xc3, 0xc0, 0xe0, 0xb5, 0x3a, 0x6e, 0xa1, 0x84, 0x96, 0xf7, 0x8b, 0xff, + 0xb4, 0x7f, 0x09, 0xdc, 0x39, 0x3f, 0x16, 0x5f, 0xf0, 0x76, 0x89, 0xd1, + 0xd8, 0x1a, 0xca, 0xd2, 0x20, 0x3c, 0x8b, 0x79, 0xf5, 0xb2, 0xcb, 0x85, + 0x15, 0x65, 0xfe, 0xd1, 0xe6, 0xf1, 0x24, 0xcc, 0x06, 0xd8, 0x51, 0xdb, + 0xff, 0x1b, 0x13, 0xb8, 0x1f, 0xdb, 0x12, 0x59, 0x7f, 0xb9, 0x9d, 0x76, + 0xe1, 0x2c, 0xa1, 0xa6, 0x39, 0xa5, 0x9f, 0x27, 0xf5, 0x0e, 0xff, 0xdc, + 0xc2, 0xcf, 0x60, 0x30, 0x96, 0x5f, 0xfe, 0x3e, 0x61, 0x4e, 0x13, 0x53, + 0x66, 0x0a, 0xb2, 0xff, 0xa5, 0xce, 0xfb, 0x1b, 0x92, 0x59, 0x7f, 0xec, + 0x63, 0xcf, 0x21, 0x1f, 0xe8, 0x59, 0x52, 0x4c, 0x04, 0x67, 0x66, 0x9a, + 0x47, 0x35, 0x09, 0xbd, 0xe4, 0x67, 0xf7, 0xfb, 0x78, 0xb8, 0x43, 0xf4, + 0x2c, 0xbe, 0x03, 0xb8, 0x15, 0x10, 0xc2, 0xff, 0x1c, 0x6a, 0x41, 0x8c, + 0x59, 0x7e, 0x6b, 0x5e, 0x59, 0xa3, 0xdf, 0x22, 0xeb, 0xff, 0xfe, 0x2c, + 0x07, 0xa3, 0xe9, 0x4f, 0xe7, 0x80, 0x78, 0x4e, 0xc2, 0xcb, 0x81, 0xfa, + 0xcb, 0x9f, 0x98, 0x88, 0x06, 0xb4, 0x56, 0x23, 0xa8, 0x30, 0xbd, 0xbf, + 0xb5, 0x93, 0x41, 0x0d, 0x65, 0x42, 0xfc, 0x94, 0x88, 0x0e, 0x51, 0x57, + 0xa5, 0xa7, 0x39, 0x41, 0x46, 0xfc, 0x12, 0x7b, 0xf1, 0x47, 0xff, 0x7e, + 0xb2, 0xfd, 0x92, 0x8d, 0x7e, 0xb2, 0xe8, 0x11, 0x65, 0xf9, 0xf6, 0x28, + 0x92, 0x4a, 0x98, 0xdf, 0x78, 0x5e, 0xff, 0xdd, 0xf3, 0x9f, 0x63, 0x51, + 0xfa, 0xcb, 0xf7, 0x9c, 0x84, 0xd9, 0x65, 0x49, 0x31, 0x96, 0x0a, 0x9a, + 0xcc, 0x44, 0x42, 0x9f, 0x5f, 0xf8, 0xc1, 0x1c, 0x7d, 0x68, 0xc5, 0x59, + 0x7f, 0xdb, 0x49, 0xb1, 0xe7, 0x36, 0x16, 0x5f, 0xfb, 0xa6, 0x5b, 0x67, + 0xdd, 0xf3, 0xac, 0xbf, 0xf8, 0xf4, 0xc0, 0x3c, 0x7e, 0x20, 0xec, 0xb2, + 0xb1, 0x10, 0xbf, 0x9f, 0xd1, 0x23, 0x8b, 0x90, 0xbf, 0xbe, 0x0e, 0x70, + 0xd6, 0x5d, 0xc0, 0xac, 0xbf, 0xa5, 0xe7, 0x72, 0x85, 0x96, 0x80, 0x1e, + 0x17, 0xc2, 0xf7, 0xff, 0x67, 0x63, 0xc7, 0x8c, 0x31, 0x12, 0x59, 0x7e, + 0xd0, 0x1d, 0xc0, 0xa8, 0x82, 0x97, 0xbd, 0x0d, 0x59, 0x7f, 0xe8, 0xd9, + 0xfb, 0xac, 0x94, 0xfe, 0x2c, 0xbd, 0xb1, 0xe9, 0x65, 0x0d, 0x1e, 0x58, + 0x88, 0x66, 0x84, 0x39, 0xc4, 0x1b, 0xf7, 0xa1, 0xa1, 0xf9, 0x65, 0xee, + 0x47, 0xcb, 0x2f, 0xbb, 0xc8, 0xfd, 0x25, 0xe7, 0xd6, 0xc9, 0x2f, 0x82, + 0x4e, 0xc2, 0x4b, 0xfc, 0x7b, 0x67, 0x79, 0x1f, 0xa4, 0xa4, 0x97, 0xf6, + 0x02, 0x3d, 0x0d, 0x49, 0x70, 0xa2, 0xa4, 0xbf, 0x8a, 0x0b, 0x63, 0xd2, + 0x4a, 0xc4, 0xc4, 0x80, 0x46, 0xd1, 0xdf, 0x11, 0x7e, 0x68, 0x41, 0x62, + 0x96, 0x08, 0x33, 0x6d, 0x24, 0x66, 0x7e, 0x75, 0xf2, 0x78, 0xc7, 0x1d, + 0x15, 0x49, 0x53, 0x04, 0xc8, 0xfe, 0x8f, 0xbe, 0xff, 0xf8, 0x5e, 0x16, + 0x7d, 0xd7, 0x2d, 0xb3, 0xee, 0xac, 0xbf, 0xb7, 0xce, 0x79, 0x4b, 0x16, + 0x54, 0x22, 0x0f, 0x14, 0xaf, 0xff, 0xba, 0x7e, 0x04, 0x34, 0x4d, 0xb0, + 0x70, 0xd5, 0x95, 0x0b, 0xd3, 0xd8, 0x98, 0x71, 0x90, 0x68, 0x9f, 0xcc, + 0x6f, 0x2d, 0xe8, 0xa1, 0x78, 0x12, 0x1b, 0xcd, 0x71, 0xac, 0xbf, 0xff, + 0xe2, 0xce, 0xf6, 0x3e, 0x94, 0xef, 0x43, 0x43, 0xf7, 0x3d, 0x0b, 0x2f, + 0xec, 0x2e, 0x19, 0x62, 0xcb, 0xf9, 0xb8, 0x3f, 0x66, 0xcb, 0x2f, 0xff, + 0x13, 0xb1, 0xcf, 0xfb, 0xdf, 0xbb, 0x80, 0x59, 0x50, 0x7f, 0x6c, 0x17, + 0x5e, 0xf0, 0x5a, 0xb2, 0x98, 0x4d, 0xab, 0x70, 0x73, 0xcd, 0x45, 0x0a, + 0x5d, 0xd2, 0x2b, 0xf8, 0xb3, 0x9a, 0x8e, 0x2c, 0xbc, 0x19, 0x62, 0xca, + 0x73, 0xc8, 0xfc, 0xb2, 0xfd, 0x84, 0xfd, 0xe2, 0xcb, 0xf6, 0x78, 0x9e, + 0x65, 0x94, 0x33, 0xcd, 0x22, 0x6a, 0x92, 0x24, 0x38, 0xdf, 0x7c, 0xf3, + 0x67, 0x96, 0x5f, 0xf4, 0x19, 0x3f, 0x66, 0x31, 0x56, 0x5b, 0x53, 0x8f, + 0x6b, 0x84, 0x55, 0x08, 0xa7, 0x37, 0xdb, 0xf6, 0xbe, 0x96, 0x75, 0x65, + 0xff, 0xf3, 0x9f, 0xfc, 0xc6, 0x1d, 0xba, 0x8c, 0x25, 0x97, 0xd0, 0x01, + 0x3f, 0x59, 0x7d, 0xe8, 0xfb, 0x8b, 0x2f, 0x8f, 0x3e, 0xea, 0xca, 0xc3, + 0xc5, 0xe9, 0x1d, 0xff, 0xff, 0x78, 0xf5, 0x83, 0x76, 0xe1, 0x74, 0xa0, + 0x5c, 0xef, 0x16, 0x5a, 0x16, 0x5f, 0x46, 0xf1, 0xc0, 0x0f, 0xd3, 0xf6, + 0x4b, 0xff, 0x3c, 0xbc, 0xfd, 0xe6, 0x14, 0x96, 0x57, 0x8f, 0xe3, 0xa7, + 0x75, 0xa5, 0x41, 0xfe, 0x29, 0x24, 0xee, 0x34, 0xf6, 0x30, 0xdb, 0xff, + 0xd9, 0xaf, 0xfb, 0xac, 0xdb, 0xb1, 0x9c, 0x59, 0x78, 0x18, 0xd5, 0x97, + 0xf0, 0xdf, 0xbc, 0x0c, 0x96, 0x5d, 0x29, 0xf8, 0x3c, 0xa1, 0x07, 0x2f, + 0xe7, 0xd4, 0x74, 0xf7, 0xac, 0xaf, 0x8f, 0x7c, 0x8c, 0x6f, 0xff, 0xfd, + 0xad, 0x47, 0xd2, 0xfb, 0x87, 0xa0, 0x7b, 0x04, 0xd1, 0xc0, 0xd6, 0x5f, + 0xf3, 0xeb, 0x3e, 0x94, 0x7f, 0x0b, 0x2a, 0x11, 0x95, 0x84, 0x41, 0x6f, + 0xbf, 0xef, 0xa5, 0xdc, 0xe7, 0x73, 0x71, 0x65, 0xff, 0xf8, 0x0c, 0x3f, + 0x33, 0x52, 0x3f, 0x39, 0x7d, 0x25, 0x97, 0xfe, 0x04, 0x77, 0x99, 0xd3, + 0xf8, 0x55, 0x95, 0x88, 0x96, 0x61, 0x5a, 0xa1, 0x1e, 0xcf, 0x0d, 0x3a, + 0x85, 0x6b, 0x23, 0x51, 0xf4, 0x77, 0xc5, 0x19, 0x25, 0xfb, 0x84, 0x1d, + 0xf2, 0x59, 0x7e, 0xc2, 0xf6, 0x12, 0xcb, 0xdb, 0x08, 0x05, 0x97, 0xc4, + 0x73, 0x6e, 0x2c, 0xa8, 0x44, 0x9f, 0x8a, 0x9c, 0x97, 0x83, 0xf7, 0x3f, + 0xeb, 0x2a, 0x47, 0xa5, 0xd3, 0xbb, 0xfe, 0x96, 0x75, 0xb1, 0x84, 0x35, + 0x97, 0xff, 0xe7, 0x79, 0x3f, 0xa7, 0x66, 0xc1, 0xe8, 0x5c, 0x45, 0x45, + 0xf6, 0xbd, 0xbc, 0x3d, 0x59, 0x74, 0x0d, 0x65, 0x41, 0xb5, 0xfc, 0x7e, + 0xfe, 0x70, 0x41, 0x47, 0xeb, 0x2f, 0xfd, 0xc3, 0x2f, 0xa5, 0xa0, 0xc7, + 0x16, 0x5f, 0xb3, 0x58, 0x38, 0x59, 0x5f, 0x27, 0x07, 0x31, 0xbe, 0xa1, + 0x35, 0xe2, 0x1e, 0x96, 0x6f, 0x3f, 0xbf, 0x7b, 0x26, 0x8d, 0xc5, 0x97, + 0xe1, 0xeb, 0x58, 0x2a, 0xca, 0xd8, 0xf5, 0x08, 0xae, 0xfe, 0x32, 0xce, + 0xc4, 0xcb, 0x2f, 0xfe, 0x97, 0x21, 0xb8, 0x02, 0x7c, 0x02, 0xcb, 0xe8, + 0x26, 0x06, 0xb2, 0xf3, 0xff, 0x0b, 0x2a, 0x11, 0x9d, 0x22, 0x2f, 0x8b, + 0x3c, 0x85, 0xc2, 0x2b, 0xa5, 0xc5, 0x97, 0xe9, 0x18, 0x1f, 0x4b, 0x2f, + 0xff, 0x39, 0x67, 0x60, 0xf4, 0x6c, 0x31, 0x0b, 0x2b, 0x87, 0xde, 0x21, + 0x3d, 0x80, 0xb2, 0xff, 0xff, 0x7e, 0x7a, 0x63, 0xd0, 0xd9, 0xa4, 0x65, + 0xe8, 0xd4, 0x2c, 0xb7, 0x70, 0xfc, 0xf8, 0x23, 0x78, 0xf5, 0x8b, 0x2f, + 0x16, 0x49, 0x65, 0x00, 0xdb, 0x74, 0x6e, 0xf1, 0x43, 0x56, 0x54, 0x22, + 0x64, 0xd7, 0x78, 0x43, 0x7f, 0xe2, 0x39, 0x77, 0xd9, 0xa3, 0xe2, 0xcb, + 0xf4, 0x8b, 0x33, 0x65, 0x97, 0x6b, 0x65, 0x97, 0xfd, 0x33, 0x27, 0xa6, + 0x31, 0xe1, 0x2c, 0xa8, 0x3f, 0xcc, 0x27, 0x31, 0x8b, 0xfc, 0xe3, 0x8f, + 0xe0, 0x5e, 0x2c, 0xaf, 0x1f, 0x03, 0x96, 0x5f, 0xd3, 0xec, 0xaa, 0x74, + 0xef, 0x4f, 0xae, 0x20, 0x15, 0xfe, 0xef, 0xe2, 0x14, 0xbd, 0x8b, 0x88, + 0x05, 0x79, 0xf5, 0x25, 0xc4, 0x02, 0xac, 0x3e, 0xb0, 0xa1, 0x5c, 0xf2, + 0x5c, 0x40, 0x2b, 0xe7, 0x2f, 0xa4, 0xb8, 0x80, 0x57, 0xf8, 0xc1, 0xec, + 0xff, 0xf8, 0x5c, 0x40, 0x2b, 0xc6, 0x43, 0x5c, 0x40, 0x2a, 0x1a, 0x2e, + 0xda, 0x47, 0xe2, 0xfd, 0xe8, 0x36, 0x61, 0x71, 0x00, 0xaf, 0x6a, 0x3a, + 0xb8, 0x80, 0x54, 0xb8, 0x80, 0x57, 0xa7, 0xcf, 0xf5, 0xc4, 0x02, 0xba, + 0x1a, 0xb8, 0x80, 0x54, 0x33, 0xe8, 0xc1, 0x83, 0x2d, 0xbe, 0x36, 0x8e, + 0x17, 0x10, 0x0a, 0xf7, 0x5c, 0x0b, 0x88, 0x05, 0x7f, 0xe2, 0x79, 0x33, + 0xf1, 0x81, 0xf4, 0xb8, 0x80, 0x57, 0xff, 0x3f, 0x43, 0xb1, 0x97, 0x7c, + 0xf2, 0x5c, 0x40, 0x2b, 0x9c, 0x6b, 0x88, 0x05, 0x7f, 0x89, 0xc5, 0xe7, + 0x23, 0xf5, 0xc4, 0x02, 0xbf, 0x1b, 0x0e, 0x5f, 0xae, 0x20, 0x15, 0xc7, + 0xc5, 0xc4, 0x02, 0xad, 0x1e, 0xc7, 0x4d, 0x6f, 0xff, 0x78, 0xfb, 0xdc, + 0xe4, 0xed, 0x1c, 0x35, 0x71, 0x00, 0xaf, 0xdd, 0x28, 0xfa, 0x4a, 0x88, + 0x05, 0x77, 0xf0, 0xb8, 0x80, 0x4c, 0xcd, 0xad, 0xf8, 0xe1, 0xae, 0x35, + 0xc4, 0x02, 0xbe, 0x0b, 0x90, 0x17, 0x10, 0x0a, 0xf4, 0x68, 0x0b, 0x88, + 0x05, 0x7f, 0xec, 0xfb, 0x83, 0x8c, 0x2f, 0xf8, 0xb8, 0x80, 0x57, 0xe0, + 0xbc, 0xa5, 0x0b, 0x88, 0x05, 0x7e, 0x70, 0x7a, 0x3e, 0x5c, 0x40, 0x2a, + 0xc4, 0x5a, 0xf9, 0x30, 0x26, 0x97, 0x6b, 0xf5, 0xc4, 0x02, 0xa9, 0x2b, + 0x34, 0x19, 0x1e, 0x42, 0x64, 0x04, 0x47, 0x08, 0xdf, 0x1b, 0x7e, 0x67, + 0xc2, 0xee, 0xc3, 0x78, 0x25, 0xf7, 0xec, 0xef, 0x1f, 0xe5, 0xc4, 0x02, + 0xbf, 0xc3, 0x80, 0x4d, 0xa8, 0xea, 0xe2, 0x01, 0x0c, 0xda, 0xde, 0xd4, + 0x0a, 0xb8, 0x80, 0x54, 0x03, 0xfb, 0xd2, 0x8d, 0xfe, 0x0b, 0xca, 0x50, + 0x23, 0x57, 0x10, 0x0a, 0xf8, 0xca, 0x5c, 0x5c, 0x40, 0x2b, 0xf9, 0xe6, + 0x96, 0x7d, 0x25, 0xc4, 0x02, 0xac, 0x46, 0x6f, 0x88, 0xbf, 0x41, 0x09, + 0x75, 0xff, 0x7a, 0x38, 0xcf, 0x81, 0xd7, 0xeb, 0x88, 0x05, 0x63, 0x5c, + 0x40, 0x2b, 0x9f, 0x61, 0x9f, 0x3f, 0x92, 0xae, 0xd7, 0xeb, 0x88, 0x05, + 0x7e, 0x7e, 0xf0, 0xfe, 0x5c, 0x40, 0x2b, 0xf8, 0xc8, 0x32, 0xce, 0x2e, + 0x20, 0x15, 0x42, 0x24, 0xc8, 0x97, 0xa6, 0xb5, 0x0c, 0xa8, 0x21, 0xc2, + 0xdf, 0x21, 0xb8, 0x67, 0xf3, 0x0f, 0xea, 0x12, 0x3e, 0x2d, 0x72, 0xef, + 0xca, 0x49, 0x33, 0x92, 0xe1, 0x7b, 0x28, 0x62, 0x7e, 0x14, 0x82, 0x43, + 0x06, 0xf7, 0x4c, 0x55, 0xc6, 0x12, 0xbc, 0xee, 0x05, 0x44, 0x02, 0x66, + 0x98, 0xaf, 0xd0, 0xeb, 0xbc, 0xca, 0xe3, 0x6a, 0xcb, 0xfb, 0xa5, 0x9f, + 0xcf, 0xe2, 0xca, 0x60, 0xf5, 0x1a, 0x49, 0x7f, 0xa4, 0x7d, 0x61, 0x8c, + 0xdc, 0x59, 0x7d, 0x1d, 0x81, 0xac, 0xb6, 0xcb, 0x2a, 0x46, 0xcf, 0x79, + 0x0d, 0xfd, 0xb4, 0x6b, 0xcf, 0xb8, 0xb2, 0xdc, 0x59, 0x7c, 0x50, 0x3f, + 0x2c, 0xaf, 0x1b, 0x2d, 0xe2, 0x35, 0x08, 0xa9, 0xc2, 0x33, 0x63, 0xbf, + 0xf1, 0x60, 0x3c, 0x7f, 0xfe, 0x19, 0x96, 0x5f, 0xf0, 0xf1, 0x82, 0xce, + 0xc0, 0xab, 0x2a, 0x47, 0xf5, 0xfa, 0x0d, 0xfb, 0xb8, 0x37, 0xf2, 0xcb, + 0xbf, 0x84, 0x96, 0x61, 0x25, 0xef, 0x46, 0xcb, 0x2e, 0x14, 0x54, 0x94, + 0x67, 0xbf, 0xb8, 0x2f, 0x30, 0x90, 0xa3, 0xb6, 0xe2, 0x46, 0x67, 0x81, + 0x58, 0x8e, 0xa3, 0x86, 0x35, 0xff, 0xd9, 0xfc, 0x8f, 0xb0, 0xd8, 0x21, + 0xac, 0xa6, 0x9f, 0x4b, 0x93, 0x5f, 0xdd, 0xe6, 0x0b, 0xe3, 0x59, 0x6e, + 0xac, 0xae, 0x9b, 0xf0, 0x97, 0x5f, 0xa3, 0x6e, 0x36, 0x4b, 0x28, 0xcf, + 0x2b, 0xa4, 0x37, 0xff, 0xef, 0xa5, 0xc2, 0xfa, 0x18, 0xe4, 0x7d, 0x23, + 0x6a, 0xcb, 0xff, 0xdd, 0xe6, 0x30, 0x7a, 0x13, 0xff, 0xe3, 0xe5, 0x95, + 0x3d, 0xb6, 0x83, 0xf1, 0x08, 0x6d, 0xa3, 0x2f, 0x91, 0x70, 0xe3, 0x19, + 0x05, 0x2e, 0xe0, 0xe1, 0x49, 0x31, 0x1e, 0xa3, 0x14, 0x78, 0x53, 0xff, + 0x1b, 0xb7, 0x61, 0x54, 0x12, 0x11, 0x16, 0x6f, 0xfb, 0x24, 0x63, 0x70, + 0x72, 0x4b, 0x2f, 0xf9, 0xa6, 0x40, 0x3d, 0x1f, 0xeb, 0x28, 0x07, 0xe1, + 0xe3, 0x8b, 0xfb, 0xa3, 0xf0, 0x5c, 0x96, 0x5e, 0x07, 0x89, 0x65, 0xff, + 0xdd, 0x9f, 0xc9, 0xa4, 0xfa, 0xd8, 0x70, 0xb2, 0xbe, 0x44, 0x93, 0x4b, + 0x48, 0x72, 0xfe, 0x8f, 0xa0, 0x9f, 0xab, 0x2e, 0x2f, 0xd6, 0x5d, 0x1c, + 0x59, 0x46, 0x6b, 0x77, 0x8b, 0xdd, 0xd1, 0x3c, 0x7f, 0x7b, 0xd6, 0x6f, + 0xf6, 0x7d, 0xde, 0xbc, 0xb8, 0xb2, 0xf4, 0x99, 0x72, 0x59, 0x77, 0xd2, + 0x5c, 0x60, 0x0b, 0xff, 0xd8, 0x2c, 0x77, 0x26, 0x91, 0xf7, 0x8e, 0xb2, + 0xfa, 0x6d, 0x47, 0x56, 0x57, 0xc8, 0xb3, 0x22, 0x1e, 0x12, 0xf5, 0x2a, + 0xff, 0xfd, 0x19, 0xee, 0x13, 0xf4, 0x3d, 0x1f, 0x8d, 0x85, 0x97, 0xff, + 0xff, 0xff, 0xfb, 0x81, 0xdc, 0x27, 0xcf, 0x38, 0x85, 0x9b, 0xf0, 0x9d, + 0x89, 0xa4, 0x1e, 0x70, 0x57, 0x1f, 0x8c, 0x5e, 0x63, 0x8d, 0x65, 0x42, + 0xbc, 0xbc, 0x85, 0xa1, 0xc2, 0xaf, 0x46, 0x2f, 0x0e, 0x72, 0x3d, 0xea, + 0xad, 0xff, 0xf8, 0x88, 0x3f, 0x67, 0xdd, 0x1e, 0x9f, 0xec, 0xd9, 0x65, + 0xfb, 0x3b, 0xa8, 0xe2, 0xca, 0x33, 0xff, 0x25, 0x8b, 0xf4, 0xd2, 0x8d, + 0x6c, 0xb2, 0xfa, 0x18, 0x86, 0xac, 0xa9, 0x1f, 0x66, 0x88, 0x1a, 0x55, + 0x7f, 0xe9, 0x72, 0x71, 0x63, 0x63, 0x4c, 0x2c, 0xbf, 0x4e, 0x9d, 0x9e, + 0x75, 0x97, 0xfe, 0xe7, 0x9c, 0xfb, 0x2f, 0x05, 0x85, 0x97, 0xf4, 0xa3, + 0x5f, 0x88, 0xd5, 0x97, 0xff, 0x1b, 0x0c, 0x19, 0x02, 0x76, 0xde, 0x61, + 0x65, 0xff, 0xdb, 0xcb, 0x39, 0xdc, 0x29, 0x67, 0x16, 0x5f, 0x36, 0x03, + 0xd5, 0x95, 0x87, 0xcc, 0xe8, 0x97, 0xdd, 0xeb, 0xe9, 0x65, 0xfb, 0x26, + 0xf4, 0x6c, 0xb2, 0x9c, 0xf2, 0xc8, 0x8a, 0xf7, 0x5c, 0x96, 0x59, 0xe7, + 0x27, 0x8d, 0x88, 0x1e, 0x30, 0x28, 0x58, 0x71, 0xaf, 0x74, 0x82, 0xa7, + 0x2a, 0x56, 0xf4, 0x7e, 0x37, 0xfd, 0x1b, 0x83, 0xf4, 0x6c, 0xe4, 0xb2, + 0xff, 0xa0, 0x10, 0xd3, 0x6f, 0xe6, 0xb2, 0xb4, 0x8a, 0x0f, 0x16, 0xee, + 0x9d, 0xdf, 0xc2, 0x0b, 0xa3, 0xcf, 0x24, 0xbf, 0xcf, 0xd8, 0x90, 0x47, + 0x8b, 0x2f, 0xbd, 0x19, 0xb2, 0xca, 0x23, 0xd4, 0xe1, 0x95, 0xf4, 0xd9, + 0x82, 0xac, 0xbe, 0x91, 0xeb, 0x8b, 0x2f, 0xfe, 0xfc, 0x8f, 0x3e, 0xec, + 0xd2, 0x7d, 0x2c, 0xbe, 0x9b, 0xcf, 0x32, 0xcb, 0xe0, 0x3e, 0xb6, 0x59, + 0x7e, 0xc9, 0xa5, 0x1f, 0x2c, 0xb8, 0xe6, 0x59, 0x78, 0xe0, 0x96, 0x5f, + 0xb3, 0x43, 0xf6, 0x2c, 0xa1, 0x9e, 0x0f, 0x06, 0xab, 0xc7, 0xf5, 0xc5, + 0x8b, 0xc5, 0x12, 0x49, 0x7f, 0xe2, 0xfc, 0xf7, 0x77, 0x43, 0x28, 0xdc, + 0x59, 0x66, 0xac, 0xac, 0x3f, 0x47, 0x1b, 0x11, 0x22, 0xa7, 0x2a, 0x5a, + 0x19, 0x0e, 0x11, 0xfc, 0x45, 0xa4, 0x6f, 0x12, 0x11, 0x1f, 0x61, 0x47, + 0xbb, 0x09, 0x6a, 0x85, 0xf0, 0x4c, 0x2f, 0x39, 0x66, 0xfe, 0x33, 0x79, + 0x5b, 0xb7, 0xf7, 0xdc, 0xd6, 0xa3, 0xab, 0x2f, 0xdc, 0x63, 0x4e, 0x05, + 0x97, 0x72, 0x4b, 0x2a, 0x47, 0x81, 0xbc, 0xa6, 0xf1, 0x77, 0x8b, 0x2f, + 0x11, 0xc9, 0x65, 0xfb, 0x5e, 0x77, 0x6a, 0xcb, 0xe0, 0x90, 0x40, 0xb2, + 0x9c, 0xf2, 0x78, 0x4f, 0x7f, 0x76, 0x69, 0x67, 0xd2, 0x59, 0x50, 0x8f, + 0x53, 0x24, 0x71, 0xc0, 0xb2, 0x08, 0x43, 0x7f, 0xf7, 0x85, 0x8d, 0x73, + 0x05, 0x7d, 0x30, 0xb2, 0xff, 0x0b, 0x9f, 0x77, 0xb0, 0xd5, 0x97, 0xe2, + 0xcf, 0xc3, 0xc5, 0x97, 0xfc, 0x03, 0xc2, 0xcd, 0xef, 0xc5, 0x95, 0xb1, + 0xf0, 0x78, 0xa2, 0x9d, 0x17, 0x1c, 0x84, 0xad, 0xf0, 0xc7, 0x8d, 0x59, + 0x77, 0xf0, 0x92, 0xe1, 0x45, 0x49, 0x46, 0x6c, 0x05, 0x17, 0xbf, 0x0c, + 0x2f, 0xa9, 0x24, 0x66, 0x68, 0x6b, 0x11, 0x5a, 0xc3, 0x9d, 0xff, 0xee, + 0xfc, 0x03, 0xf4, 0xfc, 0x77, 0xc2, 0x71, 0x65, 0xfe, 0x89, 0x1f, 0x65, + 0x1d, 0x59, 0x73, 0x2f, 0x8b, 0x34, 0x6c, 0xaf, 0xfb, 0xcf, 0xde, 0x00, + 0xb3, 0x65, 0x97, 0x00, 0xd6, 0x5f, 0x11, 0xfd, 0x25, 0x97, 0xfc, 0x7f, + 0x7b, 0x07, 0xa7, 0x02, 0xca, 0x83, 0xdb, 0xd1, 0x15, 0xfe, 0xe6, 0x1f, + 0x58, 0x3f, 0x2c, 0xbf, 0xef, 0x46, 0xa0, 0x06, 0x40, 0x59, 0x79, 0x87, + 0xe0, 0x11, 0xf9, 0xa7, 0x1e, 0x90, 0xee, 0x99, 0xd6, 0x27, 0x0f, 0xd8, + 0xcd, 0x6a, 0x4b, 0x8a, 0x7f, 0x43, 0xff, 0x50, 0xd4, 0x69, 0x18, 0x61, + 0x04, 0x2c, 0x76, 0x57, 0xf0, 0xac, 0x3f, 0x4a, 0x16, 0x5e, 0x68, 0x74, + 0xb2, 0xf0, 0x0f, 0x8b, 0x2f, 0x82, 0xdc, 0x1a, 0xca, 0xf9, 0x11, 0x26, + 0x5d, 0xe1, 0xdd, 0xd1, 0xcb, 0xff, 0xfb, 0x52, 0x0c, 0x67, 0x80, 0x7c, + 0xc1, 0xed, 0x82, 0xac, 0xbf, 0xf7, 0xb3, 0x75, 0xc9, 0x8c, 0xfb, 0xab, + 0x2f, 0xef, 0x18, 0xfc, 0x16, 0x16, 0x5f, 0x8a, 0x26, 0x3f, 0x96, 0x5b, + 0x00, 0x7a, 0xe6, 0x5f, 0x7b, 0xb8, 0x05, 0x94, 0xd3, 0xc2, 0xe1, 0x35, + 0xe9, 0x37, 0xf5, 0x95, 0x09, 0xbb, 0xb0, 0xb9, 0xfc, 0x36, 0xfa, 0x45, + 0x7d, 0x84, 0x6c, 0x2c, 0xbf, 0xe6, 0x1e, 0x74, 0x34, 0x8d, 0x85, 0x97, + 0xfe, 0x7e, 0x36, 0x0f, 0x5a, 0x31, 0x56, 0x5b, 0x8c, 0x1f, 0xcf, 0x8e, + 0xef, 0x9e, 0x4f, 0xa5, 0x97, 0x98, 0x8e, 0x2c, 0xbf, 0xec, 0xef, 0x4d, + 0x8e, 0xe0, 0x16, 0x5f, 0xd1, 0xf7, 0x33, 0xee, 0xac, 0xbb, 0x50, 0xb2, + 0x86, 0x78, 0xbd, 0x2f, 0xbf, 0xfe, 0xee, 0xa3, 0x3e, 0x9f, 0x26, 0x87, + 0xbf, 0xba, 0xcb, 0xfd, 0xd3, 0x01, 0x8e, 0x3a, 0xb2, 0xfd, 0xc8, 0x06, + 0x35, 0x65, 0x41, 0xec, 0xf0, 0xca, 0xdc, 0x92, 0x71, 0x63, 0x1d, 0xc7, + 0xef, 0x88, 0xb5, 0x0a, 0xda, 0x92, 0xac, 0x5f, 0xa1, 0x34, 0xd2, 0x9e, + 0xc7, 0x59, 0x7f, 0xdd, 0x3d, 0xa3, 0xef, 0xf5, 0x0b, 0x2f, 0x73, 0xb8, + 0xb2, 0xec, 0xe4, 0xe3, 0xd7, 0x10, 0xee, 0xff, 0x78, 0x07, 0xc0, 0xc8, + 0xd6, 0x5f, 0xfd, 0x9d, 0x3f, 0xa4, 0x51, 0x3d, 0xcf, 0x19, 0xf5, 0x97, + 0xff, 0x83, 0x2f, 0x39, 0xf4, 0xcb, 0xa1, 0xf2, 0xcb, 0xfc, 0xc7, 0x7e, + 0x01, 0xeb, 0x8b, 0x2f, 0xd9, 0xdf, 0xdf, 0xab, 0x2a, 0x13, 0x2c, 0x91, + 0x9e, 0x94, 0x82, 0x93, 0x3e, 0x6d, 0x7f, 0xfe, 0x8f, 0x3e, 0x14, 0x69, + 0x81, 0x85, 0xf5, 0x25, 0x95, 0x24, 0xff, 0x7b, 0x1a, 0xe6, 0xea, 0x6d, + 0x43, 0x22, 0x4f, 0x21, 0xf4, 0x71, 0xdb, 0xbc, 0xb0, 0x90, 0xca, 0x9f, + 0xbe, 0xf1, 0xbc, 0x96, 0x5f, 0xec, 0x29, 0x67, 0x04, 0x6a, 0xcb, 0xf3, + 0x79, 0xfb, 0xba, 0xca, 0xe9, 0xed, 0x88, 0x67, 0x7f, 0xb0, 0xa7, 0x7b, + 0x3e, 0x15, 0x65, 0xfd, 0x1e, 0x3d, 0xf9, 0x32, 0xca, 0xd1, 0xf2, 0xfe, + 0x6d, 0x7f, 0xd2, 0x20, 0xff, 0x38, 0x0d, 0xfd, 0x65, 0x6c, 0x9b, 0x2c, + 0x9f, 0x32, 0x11, 0x1f, 0x11, 0xdf, 0xf6, 0x7d, 0x2f, 0x6e, 0xee, 0xc6, + 0xe2, 0xcb, 0xff, 0x9f, 0xdc, 0x39, 0x1f, 0x63, 0xbc, 0x59, 0x7d, 0x1a, + 0xcd, 0xeb, 0x2f, 0xde, 0x39, 0xf7, 0xd9, 0x65, 0x70, 0xf3, 0xba, 0x47, + 0x7f, 0xbf, 0xe6, 0x16, 0x70, 0x2b, 0x2b, 0x0f, 0x55, 0xc8, 0xaf, 0xf8, + 0xa3, 0x3e, 0xee, 0x6a, 0x16, 0x5f, 0xfa, 0x3c, 0x27, 0x0b, 0x3b, 0xec, + 0x59, 0x7e, 0xdf, 0xec, 0xfd, 0xd6, 0x5f, 0x7a, 0x3f, 0xc5, 0x95, 0x87, + 0x98, 0x12, 0xaa, 0x85, 0x4d, 0xf8, 0x88, 0x68, 0x7e, 0x87, 0x33, 0x90, + 0x7e, 0x6e, 0x50, 0x8a, 0xbf, 0x3e, 0xf1, 0x8e, 0x16, 0x5f, 0xff, 0xda, + 0x94, 0xe1, 0xfa, 0x27, 0x16, 0x7d, 0xd8, 0xc1, 0x56, 0x5d, 0xce, 0x2c, + 0xbc, 0x28, 0xa2, 0xac, 0xbb, 0xf7, 0x48, 0xcc, 0xd0, 0x51, 0xa3, 0x03, + 0x4c, 0x1c, 0x37, 0xbf, 0xf6, 0x70, 0x9d, 0x89, 0x88, 0xe6, 0x59, 0x7f, + 0x7f, 0x12, 0xf0, 0x9c, 0x59, 0x7f, 0xc7, 0xf8, 0x99, 0xbc, 0x83, 0xc5, + 0x97, 0xf1, 0x97, 0xe0, 0x01, 0xac, 0xbc, 0xff, 0xe2, 0x4a, 0x92, 0xa0, + 0xc6, 0xc3, 0xa7, 0xc5, 0xff, 0x9f, 0x91, 0x86, 0xf3, 0xc9, 0xf2, 0xdb, + 0xe8, 0x19, 0x8d, 0x65, 0xfd, 0xcf, 0x18, 0x1f, 0x4b, 0x2f, 0xc3, 0xd1, + 0x87, 0x65, 0x97, 0xec, 0xef, 0x1f, 0xe5, 0x97, 0xf8, 0x5c, 0x2c, 0xde, + 0x7a, 0x59, 0x7f, 0x16, 0x7d, 0xf8, 0x92, 0x59, 0x7f, 0xfd, 0xce, 0xe7, + 0x84, 0x6e, 0x02, 0x3d, 0x0d, 0x59, 0x6e, 0x2c, 0xac, 0x4d, 0x0e, 0x62, + 0xdd, 0x14, 0x91, 0x47, 0x4d, 0x02, 0x60, 0x2a, 0x85, 0xfb, 0x33, 0xbe, + 0xc5, 0x97, 0x3b, 0x56, 0x5f, 0xf0, 0x79, 0xd8, 0x98, 0x3f, 0x71, 0x65, + 0xf1, 0xeb, 0x50, 0xb2, 0xff, 0x66, 0xfc, 0x66, 0x28, 0xa2, 0xa4, 0xbf, + 0x4d, 0x19, 0xee, 0x2c, 0xa9, 0xc8, 0xbf, 0xf1, 0xe1, 0x10, 0x88, 0x75, + 0x7f, 0x99, 0x70, 0x10, 0x78, 0xf4, 0xb2, 0xf3, 0x5f, 0xab, 0x2a, 0x64, + 0xd9, 0xfd, 0x0d, 0x50, 0x9f, 0xef, 0x37, 0xa5, 0x97, 0xdf, 0x00, 0xf4, + 0xb2, 0xdf, 0xb2, 0x0d, 0x77, 0x42, 0xef, 0xdb, 0xdd, 0xa6, 0xd5, 0x95, + 0x07, 0xaa, 0x45, 0x97, 0xec, 0x9a, 0x51, 0x25, 0x97, 0xf6, 0xc3, 0x8c, + 0x21, 0xac, 0xa8, 0x5d, 0x04, 0x93, 0x81, 0xc6, 0xc9, 0xe6, 0x57, 0x8e, + 0x37, 0x90, 0xc9, 0xe9, 0x00, 0x85, 0x17, 0x9f, 0xf3, 0x59, 0x7f, 0xc3, + 0x20, 0xf3, 0x36, 0xcd, 0x96, 0x5e, 0x8d, 0x12, 0xcb, 0xfd, 0x83, 0x27, + 0xe1, 0x8d, 0x65, 0xbc, 0xb2, 0xf0, 0x5f, 0x62, 0x3c, 0x2e, 0x18, 0xd6, + 0x91, 0x21, 0xd5, 0xdb, 0xe6, 0xf3, 0x1a, 0xb2, 0x8c, 0xf1, 0x5c, 0x8e, + 0xfe, 0x8d, 0x77, 0xb9, 0xb8, 0xb2, 0x9a, 0x9b, 0xdb, 0x8e, 0x32, 0xe3, + 0x0f, 0x22, 0x0b, 0xf8, 0x41, 0x94, 0x66, 0xcb, 0x2c, 0x4b, 0x2f, 0xa3, + 0x68, 0x92, 0xca, 0x19, 0xf0, 0x39, 0x71, 0x08, 0x5f, 0xde, 0x3e, 0x94, + 0x35, 0x65, 0xff, 0xec, 0x1b, 0xb7, 0x3e, 0x96, 0x7f, 0x83, 0x59, 0x77, + 0x9d, 0x65, 0xd3, 0x71, 0x65, 0xfb, 0x37, 0x99, 0x0f, 0x0d, 0x70, 0x82, + 0xd7, 0xf4, 0xee, 0xe7, 0x39, 0x0b, 0x2f, 0xb3, 0xee, 0xc2, 0xcb, 0xff, + 0x9f, 0x58, 0xc1, 0xeb, 0x37, 0xbe, 0x96, 0x57, 0x8f, 0x9f, 0x79, 0x15, + 0xfb, 0x75, 0xf6, 0x12, 0x4b, 0x2a, 0x72, 0x73, 0xac, 0xde, 0x20, 0xfb, + 0x21, 0x2c, 0x12, 0x4b, 0xe1, 0xe7, 0x9d, 0x65, 0xff, 0x14, 0xbd, 0x84, + 0x50, 0x2a, 0xcb, 0xff, 0xcf, 0xb4, 0x6b, 0x4f, 0x29, 0xdf, 0x8f, 0x16, + 0x56, 0x22, 0x10, 0x8d, 0xef, 0xfd, 0x9a, 0xd3, 0xca, 0x76, 0xf8, 0xdc, + 0x59, 0x50, 0x7c, 0xd2, 0x21, 0xad, 0x26, 0xfc, 0x4a, 0x5d, 0x8c, 0x2e, + 0xff, 0x6b, 0x9e, 0xc2, 0x3e, 0x2c, 0xa8, 0x57, 0xb9, 0x85, 0xa7, 0x2d, + 0x1d, 0xcd, 0xaf, 0xfb, 0x07, 0x85, 0x04, 0x18, 0x59, 0x61, 0x56, 0x5f, + 0xff, 0x17, 0xf9, 0xf7, 0x63, 0xe9, 0x77, 0xf8, 0x92, 0xca, 0x83, 0xe5, + 0x31, 0x2a, 0x87, 0xe3, 0x6b, 0xda, 0x3b, 0x29, 0x4f, 0xe9, 0x0e, 0x90, + 0x5d, 0x91, 0xf5, 0xb1, 0x1e, 0xa8, 0x27, 0x62, 0x7e, 0x8c, 0xb8, 0xe3, + 0xa5, 0x9a, 0x38, 0x3d, 0x56, 0x8d, 0x2d, 0x9d, 0x3a, 0xf5, 0x21, 0x7d, + 0xd5, 0xff, 0x8d, 0x90, 0xa9, 0xa5, 0xdc, 0x9c, 0x37, 0xec, 0xfb, 0xe0, + 0x63, 0xfe, 0xdf, 0x39, 0x04, 0x22, 0x16, 0xec, 0x26, 0xaf, 0xfb, 0x34, + 0x51, 0xd9, 0x67, 0x96, 0x5f, 0xd2, 0x2c, 0x01, 0xf5, 0x65, 0xff, 0xc4, + 0x06, 0x1f, 0x99, 0x28, 0x20, 0x2c, 0xbf, 0x7f, 0x83, 0x79, 0x2c, 0xaf, + 0x91, 0x2e, 0x65, 0x84, 0x87, 0x7f, 0xdd, 0xe7, 0x8e, 0x1a, 0xe3, 0x59, + 0x7c, 0x3d, 0x3c, 0x96, 0x5e, 0x12, 0x3f, 0x59, 0x7f, 0xef, 0x19, 0x47, + 0xdc, 0x36, 0xc2, 0xcb, 0xdc, 0x8d, 0x2c, 0xbb, 0xbc, 0x01, 0xec, 0xfc, + 0x7b, 0x50, 0x98, 0x03, 0x07, 0x0e, 0x44, 0x17, 0x7b, 0xfc, 0x02, 0xc9, + 0x49, 0xf8, 0xb2, 0xfe, 0x71, 0x73, 0xf1, 0x3a, 0xb2, 0xe1, 0x9a, 0xcb, + 0xef, 0xb9, 0x1f, 0x2c, 0xb9, 0xe5, 0x38, 0xdd, 0x18, 0xb5, 0xe6, 0x3c, + 0x6b, 0x2f, 0xfe, 0x9b, 0x51, 0xbf, 0xd0, 0x7a, 0x39, 0x96, 0x54, 0x8f, + 0x93, 0xe1, 0xdb, 0xfc, 0xe3, 0xf6, 0x77, 0x8e, 0xb2, 0xfe, 0xe6, 0x0c, + 0xf9, 0xb2, 0xcb, 0xd2, 0x8f, 0xd6, 0x5f, 0x84, 0x9a, 0x51, 0xb8, 0x92, + 0xa1, 0x70, 0xd3, 0x21, 0x9c, 0xc4, 0x65, 0xe6, 0x7b, 0xa3, 0x2f, 0x35, + 0x3c, 0x24, 0x48, 0x8f, 0x86, 0x5d, 0x2e, 0x10, 0x76, 0xc0, 0x59, 0x7f, + 0xf3, 0x04, 0x17, 0x13, 0x38, 0x70, 0x4b, 0x2f, 0x4f, 0x98, 0xd6, 0x56, + 0x8f, 0x89, 0xa8, 0x77, 0xa1, 0xf4, 0xb2, 0xfe, 0x6f, 0x7d, 0x1b, 0xe1, + 0x65, 0xf6, 0x10, 0x3f, 0x59, 0x7f, 0xee, 0x85, 0xbe, 0x83, 0x27, 0x1a, + 0xcb, 0xe9, 0x49, 0xfa, 0xb2, 0xbe, 0x3d, 0xf7, 0x3d, 0xbe, 0x63, 0x4e, + 0x2a, 0xcb, 0x81, 0xbd, 0x65, 0x84, 0x54, 0x40, 0xab, 0x75, 0x54, 0x0a, + 0x2b, 0x47, 0xad, 0xd1, 0x91, 0x47, 0xeb, 0x11, 0x54, 0x6f, 0x57, 0xf0, + 0x0f, 0x6e, 0xb8, 0xd6, 0x5f, 0xc6, 0xcb, 0x07, 0xa0, 0x55, 0x97, 0xfb, + 0xc6, 0x23, 0x3f, 0xff, 0x84, 0x95, 0xa3, 0xea, 0x9f, 0x32, 0xbf, 0x63, + 0x5d, 0xf6, 0x59, 0x7e, 0x80, 0x7a, 0x34, 0xb2, 0xf7, 0x82, 0xc2, 0xcb, + 0xdb, 0xac, 0xbe, 0x2c, 0xaf, 0x1e, 0x11, 0x0f, 0x56, 0xc9, 0xb7, 0x1c, + 0x26, 0x08, 0x97, 0xa4, 0xe2, 0x34, 0xdf, 0xf1, 0x7e, 0x3f, 0x38, 0x99, + 0xb2, 0xcb, 0xf6, 0x05, 0x97, 0x9c, 0x59, 0x46, 0x7c, 0xde, 0x3b, 0xbf, + 0xe2, 0xef, 0x03, 0xf7, 0x4c, 0x55, 0x97, 0xff, 0xec, 0x16, 0x1a, 0x17, + 0x1f, 0x7e, 0x01, 0x90, 0xab, 0x2f, 0xfd, 0xf7, 0x41, 0xe3, 0x1f, 0xb3, + 0x65, 0x97, 0xfb, 0xf3, 0xfb, 0x9e, 0x31, 0x56, 0x56, 0x1f, 0xbe, 0x90, + 0x6f, 0xe7, 0xe6, 0x61, 0x30, 0xb2, 0xb0, 0xf3, 0x42, 0x43, 0x79, 0xdc, + 0x55, 0x95, 0x09, 0xc9, 0x8c, 0xef, 0xd1, 0x8d, 0x91, 0x0d, 0xfe, 0xef, + 0x27, 0x63, 0x4c, 0x6b, 0x2f, 0xf9, 0xf5, 0x31, 0x47, 0xfc, 0x0a, 0xca, + 0x83, 0xef, 0x19, 0xad, 0xfe, 0x87, 0x97, 0x04, 0x8d, 0xc5, 0x97, 0xfe, + 0x9c, 0x4e, 0xc4, 0xee, 0x7f, 0xfc, 0x2c, 0xbf, 0xfd, 0xb0, 0x7f, 0xe4, + 0x8f, 0x9c, 0x8d, 0x49, 0x65, 0x8d, 0x84, 0x49, 0x69, 0x16, 0xff, 0x3f, + 0xbe, 0xe4, 0x17, 0x56, 0x54, 0x93, 0x24, 0xe4, 0x32, 0x3a, 0x53, 0x7f, + 0xff, 0x87, 0xe8, 0x07, 0x8e, 0x67, 0x79, 0x30, 0xe2, 0x3e, 0xe2, 0xcb, + 0xe2, 0xcd, 0xf8, 0xb2, 0xb6, 0x44, 0x38, 0xac, 0xb7, 0xfb, 0xc7, 0x34, + 0xa0, 0xa4, 0xb2, 0xff, 0xfe, 0x8e, 0xf0, 0x42, 0xef, 0x82, 0xf2, 0xef, + 0x30, 0x55, 0x97, 0xfe, 0x81, 0x78, 0xc9, 0x70, 0x67, 0xdd, 0x59, 0x50, + 0x8f, 0x90, 0x12, 0xe8, 0xcf, 0xab, 0xb7, 0xd2, 0xf6, 0x6c, 0xb2, 0xf8, + 0xf6, 0x04, 0x96, 0x5f, 0xf4, 0x7c, 0xd7, 0xee, 0x7d, 0xd5, 0x97, 0x3e, + 0xcb, 0x2b, 0xe4, 0x4b, 0xe8, 0x8c, 0x88, 0xc5, 0x3a, 0xbf, 0xcd, 0x7e, + 0x14, 0x63, 0x0b, 0x2f, 0xf8, 0x21, 0xf1, 0xf7, 0xcf, 0x25, 0x97, 0xe0, + 0xfb, 0x50, 0x2a, 0xcb, 0xa7, 0xdd, 0x65, 0xd0, 0x0c, 0x45, 0x6b, 0x4c, + 0xba, 0x72, 0x21, 0x4d, 0xda, 0x75, 0x97, 0xff, 0x6f, 0x3e, 0x73, 0x08, + 0x0e, 0x5f, 0xac, 0xbf, 0xde, 0x31, 0x8f, 0x05, 0x99, 0x65, 0xf3, 0x07, + 0xf7, 0x16, 0x5b, 0xfc, 0x44, 0xf0, 0x11, 0x7a, 0x6b, 0x7c, 0x27, 0x9f, + 0xab, 0x2d, 0x1a, 0x3d, 0x96, 0x9b, 0x56, 0x93, 0x34, 0xf4, 0x61, 0xb7, + 0xfe, 0x7f, 0xb9, 0x9d, 0x36, 0xbc, 0x96, 0x5b, 0xab, 0x2b, 0xf3, 0xcf, + 0x10, 0xfa, 0xff, 0xec, 0xf1, 0x83, 0xd9, 0xdc, 0x62, 0x4b, 0x2f, 0xff, + 0xfc, 0xfa, 0x60, 0x7e, 0x8e, 0x7b, 0x3e, 0x97, 0x4e, 0x68, 0xe0, 0x56, + 0x56, 0x22, 0xcd, 0xd1, 0x2f, 0x8a, 0x70, 0x26, 0x59, 0x7f, 0xff, 0xa6, + 0x28, 0x6e, 0xa0, 0x19, 0xac, 0xf1, 0xeb, 0xce, 0xb2, 0xff, 0xf9, 0xf5, + 0xfc, 0xfe, 0x6a, 0x24, 0x7f, 0x77, 0x16, 0x5f, 0xff, 0xfc, 0x1e, 0x79, + 0xe5, 0xc9, 0x1f, 0x44, 0xd4, 0x7a, 0x3b, 0xc7, 0xf9, 0x65, 0xfa, 0x30, + 0xbb, 0x3e, 0xb2, 0xfe, 0x3f, 0xbf, 0xd3, 0x8d, 0x65, 0x9a, 0xb2, 0x9a, + 0x7d, 0x3e, 0x29, 0x22, 0xfb, 0xf7, 0xa3, 0x5c, 0x35, 0x97, 0x6b, 0x71, + 0x65, 0xe9, 0x04, 0x6b, 0x2e, 0x7f, 0xa7, 0x22, 0x30, 0x65, 0xd3, 0x13, + 0xb8, 0xd5, 0x42, 0xa8, 0xbc, 0x25, 0x35, 0xfd, 0x29, 0xf2, 0x36, 0x9b, + 0xf8, 0xf5, 0x3d, 0xf3, 0xa6, 0xb2, 0xff, 0xfe, 0xc2, 0xdb, 0x9c, 0x8f, + 0xf3, 0xc7, 0xa7, 0x17, 0xab, 0x2f, 0xe1, 0xe1, 0x31, 0xa8, 0x59, 0x52, + 0x66, 0xd0, 0x0e, 0x3b, 0x40, 0x42, 0xc7, 0xe8, 0xd1, 0x66, 0x8e, 0xdb, + 0x50, 0xd3, 0x6c, 0x3a, 0xfd, 0x1b, 0xe7, 0xef, 0x25, 0x0d, 0x7e, 0xca, + 0xac, 0xde, 0x9e, 0x29, 0x94, 0xfa, 0xe5, 0xcc, 0xbd, 0xd5, 0x97, 0x8d, + 0xb8, 0xb2, 0xbe, 0x37, 0x3a, 0x1e, 0xbf, 0xff, 0xc5, 0x83, 0xf4, 0x0a, + 0x58, 0x7b, 0x4f, 0x87, 0xc7, 0xa5, 0x95, 0x0d, 0x80, 0x91, 0xd3, 0x95, + 0x9e, 0x33, 0x70, 0x91, 0x5f, 0x40, 0x0c, 0x0b, 0x2f, 0x87, 0xa3, 0x15, + 0x65, 0xef, 0x67, 0xeb, 0x2d, 0x0b, 0x2f, 0xff, 0xa6, 0x77, 0x97, 0x21, + 0xa3, 0xf4, 0x10, 0x16, 0x54, 0x1e, 0xf9, 0x88, 0x5f, 0xf6, 0x4d, 0x28, + 0xfb, 0x3e, 0xea, 0xcb, 0x6d, 0x08, 0xd7, 0xc7, 0xc2, 0x20, 0xa9, 0x26, + 0x9e, 0x32, 0x1d, 0x43, 0xea, 0xf8, 0x7e, 0x0e, 0xcb, 0x2f, 0xe7, 0x96, + 0x6c, 0x12, 0x59, 0x76, 0x0d, 0x65, 0x0c, 0xf0, 0xc0, 0x5b, 0x7f, 0xed, + 0x66, 0xe4, 0xde, 0x76, 0x9f, 0x16, 0x5b, 0x68, 0x46, 0x5e, 0x33, 0xe8, + 0x8a, 0xc6, 0xb2, 0xe6, 0x5e, 0x2c, 0xac, 0x3d, 0xfd, 0x1a, 0xb8, 0x85, + 0xff, 0xb7, 0x9f, 0x65, 0x13, 0xbb, 0x01, 0x59, 0x69, 0x96, 0x5f, 0xa7, + 0xc3, 0xec, 0x02, 0xca, 0xc3, 0xff, 0x99, 0x0b, 0xa2, 0x57, 0xf4, 0x74, + 0xff, 0x89, 0x2c, 0xba, 0x4e, 0xb2, 0xb4, 0x78, 0x6e, 0x5b, 0x7f, 0x7d, + 0xb3, 0xca, 0x37, 0x16, 0x5c, 0x52, 0x59, 0x50, 0x79, 0x1b, 0x19, 0x53, + 0x25, 0xb8, 0x73, 0x87, 0x39, 0x11, 0x30, 0x36, 0x02, 0xf3, 0x84, 0x0b, + 0x61, 0x99, 0xea, 0xc6, 0x85, 0xe3, 0x9d, 0x28, 0xd8, 0x39, 0x0a, 0xce, + 0xb9, 0x05, 0xa6, 0xff, 0xcc, 0x91, 0x21, 0xa0, 0xf3, 0xfd, 0xfa, 0xcb, + 0xfd, 0x29, 0xb0, 0x9f, 0xd8, 0xb2, 0xfb, 0xe9, 0x43, 0x56, 0x5f, 0xf4, + 0x16, 0xdc, 0xc6, 0xc6, 0xe2, 0xcb, 0xa3, 0xcb, 0x2f, 0xe7, 0x98, 0x70, + 0x5b, 0x2c, 0xad, 0x91, 0x44, 0x32, 0x32, 0x3b, 0xde, 0x2d, 0x7d, 0x13, + 0x1f, 0x96, 0x5e, 0xdd, 0x86, 0xac, 0xa7, 0x3c, 0x1d, 0xd2, 0x2b, 0xf1, + 0x0f, 0xd1, 0x25, 0x97, 0xef, 0x44, 0xb3, 0x8b, 0x2f, 0xb7, 0x60, 0x80, + 0xb2, 0xfe, 0xf6, 0x30, 0xf1, 0xb2, 0xcb, 0xe8, 0x9b, 0x50, 0xb2, 0xe6, + 0xe2, 0xca, 0x69, 0xb8, 0xf1, 0x15, 0xf4, 0x05, 0x96, 0x6b, 0x2f, 0xb8, + 0x50, 0x2a, 0xcb, 0xf0, 0xfd, 0x85, 0x25, 0x95, 0x87, 0x92, 0xe4, 0x57, + 0xa4, 0x7f, 0xac, 0xbf, 0x3f, 0x3a, 0x73, 0x2c, 0xbf, 0xc7, 0xa8, 0xd9, + 0xf4, 0x05, 0x97, 0x02, 0x65, 0x96, 0xec, 0xe5, 0x47, 0x70, 0x48, 0x32, + 0x7c, 0x27, 0x01, 0x21, 0xb3, 0x68, 0x87, 0xcd, 0xce, 0x41, 0xc1, 0xde, + 0x94, 0x4f, 0x99, 0xdf, 0xfe, 0xd0, 0x0b, 0x37, 0x96, 0x46, 0xa3, 0x8b, + 0x2f, 0xf3, 0xcd, 0xec, 0x6e, 0x71, 0x65, 0x61, 0xfe, 0x6f, 0x49, 0xbd, + 0x3f, 0x1d, 0x59, 0x7d, 0x1b, 0xcf, 0x7a, 0xcb, 0xb1, 0xab, 0x2c, 0xc4, + 0xe3, 0x76, 0x64, 0xb5, 0xb2, 0x20, 0xc9, 0x6a, 0xfc, 0xc7, 0x73, 0x1a, + 0xb2, 0xff, 0xd2, 0x91, 0x82, 0x1b, 0x37, 0x21, 0x65, 0x62, 0x22, 0x8c, + 0x8d, 0xca, 0x2f, 0xff, 0x4c, 0x58, 0xc3, 0x0f, 0xde, 0x19, 0x4c, 0xb2, + 0xfb, 0xd9, 0xb1, 0x2c, 0xbf, 0x60, 0xcf, 0x5c, 0x59, 0x7e, 0x12, 0x47, + 0xff, 0x16, 0x5f, 0xb4, 0x08, 0xcd, 0x96, 0x5e, 0xef, 0x7e, 0x59, 0x7f, + 0xf7, 0xc0, 0x3f, 0x4e, 0xdd, 0xcf, 0x1b, 0x56, 0x57, 0xe7, 0xd1, 0xd1, + 0xeb, 0x83, 0xa5, 0x95, 0x88, 0xca, 0xe4, 0x24, 0x27, 0xc8, 0xed, 0x1b, + 0x26, 0xa4, 0xd2, 0x71, 0x61, 0xe9, 0x50, 0xbe, 0x7f, 0x92, 0xae, 0xce, + 0x32, 0xaf, 0x46, 0x60, 0xe5, 0xbc, 0x4c, 0xec, 0x6e, 0x97, 0xfe, 0x23, + 0x13, 0xec, 0xdf, 0xf4, 0x08, 0xb2, 0xd2, 0x59, 0x7f, 0xf8, 0xf3, 0x43, + 0x81, 0x73, 0xd1, 0xf7, 0x16, 0x5f, 0x09, 0x1a, 0xfd, 0x65, 0xff, 0xa3, + 0xef, 0x7a, 0x36, 0x80, 0xb5, 0x65, 0xff, 0xda, 0xd3, 0xff, 0x9e, 0x3d, + 0x79, 0xd6, 0x5a, 0x4b, 0x2b, 0x87, 0xaa, 0x22, 0x25, 0xcf, 0xa5, 0x97, + 0xff, 0xe6, 0x33, 0xa7, 0xcf, 0x07, 0x3b, 0xfb, 0x8e, 0x16, 0x5f, 0xdd, + 0x3d, 0x9b, 0x00, 0x59, 0x43, 0x44, 0xd6, 0x85, 0xbc, 0xad, 0x7d, 0x23, + 0xd4, 0x96, 0x5f, 0xdf, 0xcd, 0x23, 0xd4, 0x96, 0x4c, 0x68, 0xaf, 0xf7, + 0xb3, 0xd8, 0x07, 0x02, 0xcb, 0x8f, 0x65, 0x94, 0x03, 0xc9, 0xe9, 0x95, + 0x7c, 0x8a, 0xcd, 0x42, 0x2a, 0xff, 0x02, 0x63, 0x68, 0x5f, 0x8b, 0x2f, + 0xb0, 0x3a, 0xd9, 0x65, 0x7c, 0x7a, 0xed, 0x34, 0xbd, 0x03, 0x1a, 0xcb, + 0xb3, 0x75, 0x65, 0xf7, 0xe2, 0x14, 0x96, 0x59, 0xc8, 0xde, 0xf4, 0x66, + 0xfd, 0xce, 0x61, 0x7e, 0xb2, 0xbf, 0x3c, 0xd2, 0x25, 0xa8, 0x54, 0xd2, + 0x70, 0xfe, 0x78, 0x40, 0x74, 0x8c, 0x30, 0xa6, 0xb4, 0xcb, 0x2f, 0xf8, + 0x2e, 0x24, 0xd2, 0xcf, 0xa4, 0xb2, 0xbe, 0x3c, 0xe2, 0x12, 0xbf, 0x09, + 0xdf, 0xdb, 0x8b, 0x29, 0xa7, 0x99, 0xf9, 0x15, 0xd1, 0xc5, 0x97, 0xd1, + 0xe8, 0x1a, 0xca, 0x01, 0xb7, 0x98, 0x5a, 0xff, 0xa4, 0xfa, 0xe9, 0x43, + 0x78, 0xb2, 0xff, 0x40, 0xe3, 0x41, 0x8f, 0xd6, 0x5e, 0x2c, 0xf9, 0x65, + 0xcd, 0xe4, 0xc8, 0x87, 0x69, 0xc1, 0x19, 0xdf, 0xff, 0x46, 0x7d, 0xdf, + 0x61, 0xc8, 0xd8, 0x63, 0x16, 0x5f, 0x8a, 0x37, 0x4a, 0x16, 0x5f, 0xff, + 0xce, 0x28, 0xdd, 0xf5, 0xb7, 0x9f, 0xbe, 0x3d, 0x49, 0x65, 0xff, 0x39, + 0x67, 0x7a, 0x62, 0xf5, 0x65, 0xff, 0xff, 0xd3, 0x48, 0xcb, 0xb1, 0xfe, + 0xef, 0x4d, 0x8d, 0x64, 0x7d, 0x23, 0x6a, 0xca, 0x84, 0x57, 0x91, 0xc5, + 0x42, 0xae, 0x3c, 0x5a, 0x38, 0x54, 0xe8, 0xf1, 0xd4, 0x08, 0xa0, 0x31, + 0x85, 0xd4, 0xf6, 0xd8, 0xc9, 0xc2, 0x34, 0xa9, 0x02, 0x78, 0xf8, 0xc2, + 0x18, 0x04, 0x66, 0x4a, 0xf1, 0x27, 0xf0, 0x95, 0xe4, 0xb2, 0x6e, 0xcb, + 0xd5, 0xbf, 0x18, 0x81, 0x7e, 0x2c, 0xbf, 0xfb, 0xbf, 0x4b, 0x3a, 0x7b, + 0xe0, 0x80, 0xb2, 0xfe, 0x80, 0xfc, 0x7f, 0x6e, 0xac, 0xbf, 0x60, 0xb9, + 0xf7, 0x56, 0x54, 0xe3, 0xdb, 0x33, 0x2b, 0xfd, 0xf4, 0xb0, 0x7e, 0xcd, + 0x96, 0x50, 0xd3, 0x21, 0xf8, 0xa3, 0x50, 0xa1, 0x22, 0x3b, 0xf4, 0x6b, + 0xe9, 0x71, 0x65, 0xff, 0xff, 0x6a, 0x67, 0xf1, 0xf2, 0x26, 0x3e, 0xf7, + 0x3d, 0xf9, 0xef, 0x59, 0x5b, 0x22, 0x4c, 0x25, 0x37, 0xb5, 0x9c, 0x59, + 0x7e, 0x32, 0xdf, 0x92, 0x59, 0x7b, 0x0f, 0x65, 0x94, 0xc1, 0xf0, 0x34, + 0x73, 0xc5, 0x17, 0xf4, 0x6d, 0x9d, 0xc6, 0xac, 0xbf, 0xfb, 0x08, 0x20, + 0xf6, 0x36, 0x67, 0x02, 0xca, 0x34, 0x50, 0xe8, 0xc3, 0x85, 0xb7, 0xcd, + 0x38, 0x1a, 0xcb, 0xfc, 0x4c, 0x7a, 0x1a, 0xd2, 0x59, 0x7f, 0x6e, 0x1c, + 0x6e, 0x87, 0xab, 0x2f, 0xd1, 0x36, 0x60, 0x16, 0x54, 0x22, 0xbb, 0x08, + 0x4c, 0xcf, 0xc6, 0x77, 0xc4, 0xd7, 0xea, 0xcb, 0xc4, 0x72, 0x59, 0x7f, + 0xef, 0x64, 0xc7, 0x30, 0x77, 0x43, 0xc5, 0x97, 0x8f, 0x4c, 0x2c, 0xbe, + 0xe9, 0xc7, 0xcb, 0x28, 0xd1, 0x06, 0x48, 0x9c, 0x1d, 0xbf, 0xe8, 0x9a, + 0x3b, 0xec, 0xd0, 0x16, 0x5e, 0xf4, 0x4c, 0xb2, 0xd1, 0xf1, 0xeb, 0x6e, + 0x9c, 0xd4, 0x91, 0x5f, 0xc8, 0x42, 0x5e, 0x23, 0x35, 0x97, 0x3e, 0xcb, + 0x2f, 0xe7, 0x6e, 0x6f, 0x7d, 0x2c, 0xad, 0x8f, 0x15, 0xa2, 0xf7, 0xfe, + 0x98, 0xfd, 0x1f, 0x4a, 0x26, 0x85, 0x94, 0x67, 0xc6, 0x12, 0x3b, 0xe6, + 0xc7, 0x5a, 0xb2, 0xfc, 0x37, 0x28, 0xf2, 0xcb, 0xfa, 0x51, 0xf7, 0x73, + 0xcb, 0x2f, 0xff, 0x77, 0x87, 0xfc, 0x4b, 0x99, 0x9f, 0x75, 0x65, 0x4c, + 0x7f, 0x3c, 0x2e, 0xaf, 0x23, 0x08, 0x58, 0x4f, 0xdf, 0xef, 0x3c, 0xd8, + 0x7b, 0xa3, 0x59, 0x50, 0x9a, 0x19, 0xc3, 0x93, 0x85, 0x37, 0xe6, 0xee, + 0x90, 0x76, 0x59, 0x7f, 0xb8, 0x7e, 0x39, 0x8f, 0x65, 0x97, 0xf7, 0xd2, + 0xc0, 0xeb, 0x65, 0x97, 0xff, 0xb5, 0xa8, 0x2c, 0x60, 0xfd, 0xec, 0x11, + 0x65, 0x19, 0xfd, 0x04, 0xc2, 0xa1, 0x1f, 0x78, 0x59, 0xa8, 0x57, 0x5e, + 0x07, 0xa1, 0x65, 0xda, 0x85, 0x95, 0xf1, 0xb2, 0x98, 0x72, 0xfd, 0x07, + 0xd9, 0xea, 0x78, 0x2c, 0xbf, 0x39, 0x8e, 0x09, 0x65, 0xd0, 0x15, 0x95, + 0x08, 0x90, 0xf1, 0x19, 0x19, 0x70, 0x96, 0xfb, 0x68, 0xdd, 0x85, 0x97, + 0xde, 0xfd, 0xfa, 0xb2, 0xde, 0x59, 0x6d, 0xee, 0x6d, 0x02, 0x47, 0x7f, + 0xf1, 0xb4, 0xf9, 0xe8, 0x3d, 0x07, 0x71, 0x65, 0x42, 0x31, 0xcd, 0x65, + 0xca, 0x2f, 0xe2, 0xe1, 0xef, 0x81, 0xac, 0xbf, 0xef, 0xcc, 0xbb, 0x1c, + 0x0f, 0x96, 0x5e, 0x23, 0x61, 0x65, 0xf9, 0xf5, 0xa8, 0xd9, 0x65, 0xfd, + 0xd3, 0xd1, 0xf4, 0x2b, 0x2a, 0x72, 0x2a, 0x9a, 0x73, 0xd1, 0xc1, 0x0a, + 0x2f, 0x71, 0xff, 0x59, 0x50, 0x7b, 0xbd, 0x40, 0xbf, 0x82, 0x27, 0xb3, + 0xee, 0x2c, 0xbf, 0xff, 0xfe, 0x8e, 0x93, 0x80, 0xf9, 0x31, 0xe8, 0x11, + 0xce, 0xc7, 0xd0, 0x26, 0x71, 0x65, 0xfe, 0xe6, 0x6a, 0x37, 0xc6, 0xe2, + 0xca, 0xd2, 0x2d, 0x3a, 0xfb, 0x7f, 0xbd, 0x9f, 0x46, 0x8d, 0xab, 0x2f, + 0xbb, 0x0d, 0x85, 0x97, 0xff, 0xff, 0xfd, 0xcc, 0xef, 0x9d, 0xbc, 0xd6, + 0x8f, 0xee, 0xbb, 0xb1, 0x99, 0x30, 0x7b, 0x02, 0xfd, 0x0b, 0x2f, 0xc1, + 0x9b, 0x27, 0xf1, 0x65, 0x71, 0x18, 0x5d, 0x84, 0xbd, 0xff, 0x7d, 0xc2, + 0x36, 0xf7, 0x37, 0x16, 0x5d, 0x9a, 0x59, 0x50, 0x7a, 0x5e, 0x3c, 0xbf, + 0xba, 0x4f, 0xfe, 0x12, 0xcb, 0xf1, 0x3f, 0xf8, 0x4b, 0x2a, 0x71, 0xe9, + 0x74, 0xb2, 0xa1, 0x52, 0x50, 0xc8, 0xf0, 0xcd, 0xe1, 0xc7, 0xd7, 0xa0, + 0xb9, 0xdf, 0xfb, 0xa7, 0xc2, 0x7e, 0xcc, 0xe3, 0x59, 0x7d, 0xfb, 0xfd, + 0xc5, 0x97, 0x0a, 0x2a, 0xca, 0xe1, 0xbd, 0x14, 0x92, 0xfb, 0xcf, 0x9e, + 0x48, 0xcc, 0xd1, 0x56, 0x23, 0x40, 0xe1, 0x3b, 0x7e, 0x13, 0x1a, 0x7a, + 0x59, 0x7e, 0x01, 0xf3, 0xc6, 0xb2, 0xe6, 0xba, 0xcb, 0xfd, 0xd8, 0x20, + 0x4f, 0x3f, 0xb5, 0x65, 0x78, 0xf3, 0xc2, 0x2d, 0x71, 0xfc, 0xb2, 0xf7, + 0xa3, 0xf5, 0x97, 0xb7, 0x77, 0x61, 0x65, 0xff, 0x0f, 0xc7, 0xa3, 0xfa, + 0x68, 0x59, 0x4e, 0x7b, 0x81, 0x22, 0xb9, 0x91, 0xbd, 0x65, 0x62, 0x71, + 0xdf, 0x14, 0x1b, 0xb6, 0x88, 0x9c, 0x5c, 0x9e, 0x7a, 0x43, 0x7b, 0xd3, + 0xb7, 0x16, 0x5e, 0x20, 0x1a, 0xcb, 0xf7, 0xa0, 0xb3, 0x65, 0x95, 0x07, + 0xc8, 0x64, 0x4e, 0x37, 0x7f, 0x47, 0x42, 0xd0, 0xf5, 0x65, 0xfe, 0x82, + 0xf3, 0xfe, 0x19, 0x96, 0x57, 0x8f, 0x8b, 0x74, 0xba, 0xa1, 0xb2, 0xfd, + 0xda, 0x1a, 0xd2, 0x8c, 0x94, 0x70, 0xdd, 0xc3, 0xa6, 0x08, 0x7e, 0x8d, + 0x34, 0xca, 0x37, 0x21, 0x85, 0x34, 0x6c, 0x9a, 0x8c, 0xbd, 0xb0, 0xf5, + 0xf4, 0x60, 0x4e, 0x5b, 0xfc, 0x66, 0xac, 0xb2, 0x12, 0x96, 0x5d, 0xc8, + 0xca, 0xfb, 0x1d, 0xa6, 0xf8, 0x63, 0x6e, 0xc2, 0x3a, 0xff, 0x03, 0xc7, + 0xde, 0x3f, 0xcb, 0x2f, 0x66, 0xb7, 0xac, 0xbe, 0x3d, 0x09, 0x32, 0xcb, + 0xff, 0x17, 0xed, 0x79, 0x14, 0x77, 0x8b, 0x2e, 0xcc, 0x59, 0x7c, 0x0f, + 0x18, 0x8b, 0x29, 0x84, 0x76, 0x19, 0xa7, 0x87, 0x9c, 0x91, 0x96, 0x7c, + 0x20, 0xad, 0xfa, 0x68, 0x9b, 0xd0, 0xb2, 0xff, 0xf1, 0x77, 0x82, 0x74, + 0xc8, 0x32, 0xce, 0x2c, 0xb8, 0x48, 0x59, 0x78, 0x51, 0x45, 0x49, 0x7d, + 0x2e, 0xe0, 0x12, 0x33, 0x34, 0x17, 0xec, 0x19, 0xff, 0xc5, 0xdd, 0xfc, + 0xad, 0x1f, 0x49, 0x1a, 0x5e, 0x8e, 0x49, 0x65, 0xec, 0x6c, 0xfa, 0xca, + 0x84, 0xdb, 0xf0, 0xa7, 0x49, 0x4f, 0x0a, 0x0f, 0xc8, 0x48, 0x72, 0xf9, + 0xa3, 0xc2, 0x59, 0x77, 0x78, 0xb2, 0xff, 0xf0, 0xf3, 0x18, 0x9d, 0x9d, + 0x3e, 0x78, 0xd6, 0x5f, 0xee, 0xfa, 0x3b, 0xcf, 0x1a, 0xcb, 0x9e, 0x4b, + 0x2f, 0xd3, 0xb2, 0x63, 0xd9, 0x65, 0x4e, 0x3f, 0x46, 0x99, 0xf0, 0x5a, + 0xdc, 0x59, 0x7f, 0xbb, 0xf4, 0xbd, 0x05, 0xb2, 0x4b, 0xff, 0x67, 0xd2, + 0x3c, 0x22, 0xc1, 0xac, 0xbe, 0x68, 0x7e, 0xea, 0xcb, 0xec, 0xf4, 0x6f, + 0x59, 0x5b, 0x1e, 0x3f, 0x09, 0x2a, 0x13, 0xf3, 0xd8, 0x5f, 0xe8, 0x5f, + 0xe8, 0xc4, 0x84, 0x78, 0x6b, 0xd8, 0x41, 0xdf, 0xe0, 0x78, 0xc7, 0x0f, + 0xa5, 0x97, 0x8f, 0x86, 0xb2, 0xc6, 0xb2, 0xf9, 0xc4, 0x71, 0xac, 0xb4, + 0xbc, 0x79, 0xae, 0x36, 0x11, 0x0a, 0x1a, 0x2c, 0xfe, 0x7f, 0xbf, 0xe2, + 0x81, 0x78, 0x65, 0xf4, 0x96, 0x5f, 0xff, 0xfb, 0x9f, 0x9e, 0x87, 0x85, + 0xe3, 0x07, 0x8f, 0xac, 0x41, 0x49, 0x65, 0xd0, 0x05, 0x94, 0x48, 0xbb, + 0xe9, 0xce, 0xf6, 0xcb, 0xc2, 0x46, 0xe2, 0xcb, 0xcc, 0x78, 0xd6, 0x56, + 0xc6, 0xf4, 0xc8, 0x2f, 0xc5, 0x02, 0xe1, 0x2c, 0xbf, 0xef, 0x7d, 0x0c, + 0x4d, 0x28, 0xdc, 0x59, 0x6e, 0x0c, 0xf9, 0x70, 0x9a, 0xb4, 0x8a, 0xde, + 0xc2, 0x1a, 0x96, 0x5f, 0xa5, 0xa3, 0x86, 0xac, 0xad, 0x8d, 0x97, 0xc1, + 0x75, 0x0a, 0xe6, 0x72, 0x32, 0x23, 0x86, 0xfb, 0xc6, 0x36, 0x15, 0xab, + 0xfd, 0x2f, 0x47, 0xdd, 0x8f, 0x2c, 0xbf, 0xfd, 0x2e, 0x87, 0xda, 0x81, + 0x64, 0x7f, 0xe2, 0xcb, 0x9d, 0xab, 0x2b, 0xe4, 0x4b, 0x11, 0xa6, 0xf4, + 0xcb, 0xff, 0xf7, 0x5f, 0x58, 0x7f, 0xf3, 0x3c, 0x7a, 0xf3, 0xac, 0xbd, + 0x04, 0x35, 0x97, 0xef, 0xb9, 0x36, 0x75, 0x65, 0x62, 0x32, 0xfe, 0x32, + 0xf2, 0xa1, 0x0d, 0xdf, 0xc7, 0xd2, 0x7f, 0xf8, 0xb2, 0xfd, 0x0d, 0xee, + 0x79, 0x65, 0xf7, 0x0e, 0x00, 0xb2, 0xff, 0xe9, 0xb3, 0x58, 0xed, 0x8f, + 0x18, 0xd6, 0x56, 0x1f, 0x27, 0x48, 0x6f, 0xe0, 0xb7, 0x3d, 0xf3, 0xac, + 0xa6, 0x13, 0x07, 0x01, 0x69, 0x42, 0x2f, 0x84, 0x37, 0xff, 0x8c, 0x64, + 0xff, 0x16, 0x77, 0x0f, 0xf5, 0x97, 0xdb, 0x6c, 0xfb, 0x8b, 0x2f, 0x80, + 0x30, 0xec, 0xb2, 0xf4, 0xb8, 0x15, 0x97, 0xf1, 0x74, 0xfd, 0x22, 0x59, + 0x7f, 0xff, 0xfe, 0xf4, 0x66, 0xd2, 0x3e, 0xf2, 0x35, 0x8c, 0xcf, 0xf8, + 0x8d, 0xf1, 0x04, 0x05, 0x96, 0xee, 0x23, 0xc7, 0xc4, 0x8e, 0x3b, 0xc2, + 0xcb, 0xc2, 0x8a, 0x2a, 0xcb, 0xff, 0xe6, 0xe7, 0xdd, 0x2c, 0xd9, 0xb8, + 0xdc, 0x24, 0x8c, 0xcd, 0x05, 0x42, 0x30, 0x8d, 0x86, 0xfd, 0xe7, 0xd6, + 0x69, 0x65, 0xff, 0xe8, 0xd8, 0x83, 0xb0, 0x79, 0xde, 0x60, 0xab, 0x2e, + 0x0b, 0xac, 0xa0, 0x22, 0x2b, 0xc4, 0xe4, 0x9b, 0x7b, 0xb0, 0x35, 0x97, + 0xd2, 0xe8, 0x46, 0xb2, 0xfd, 0x07, 0x27, 0xe2, 0xca, 0x83, 0xe5, 0xf8, + 0x73, 0x44, 0x77, 0xf6, 0x77, 0xc1, 0x8f, 0x96, 0x5f, 0x74, 0xf5, 0x8b, + 0x2f, 0xbe, 0xe1, 0xb0, 0x33, 0xcf, 0xc2, 0xea, 0xd9, 0x34, 0xc2, 0x84, + 0xa7, 0x5f, 0xaf, 0xf6, 0x70, 0xb3, 0x7f, 0x8d, 0x65, 0xff, 0x9b, 0x1f, + 0x16, 0x7f, 0xc8, 0xdc, 0x59, 0x5a, 0x3f, 0x56, 0x99, 0xdf, 0xe1, 0x96, + 0x6f, 0x3d, 0x3a, 0xca, 0x84, 0xc0, 0x0e, 0x15, 0x61, 0x22, 0xbf, 0x6d, + 0xb8, 0x79, 0xf2, 0xcb, 0xf1, 0xf2, 0x36, 0x6a, 0xec, 0xfd, 0x5f, 0xa1, + 0xf5, 0xf8, 0x57, 0x67, 0xea, 0xe7, 0x92, 0xec, 0xfd, 0x5f, 0x06, 0x59, + 0xc5, 0xd9, 0xfa, 0xa1, 0x9e, 0x91, 0x11, 0xdf, 0xa3, 0x39, 0x84, 0xbb, + 0x3f, 0x54, 0xbb, 0x3f, 0x57, 0x3f, 0x57, 0x67, 0xe9, 0xa5, 0xc5, 0xa4, + 0x47, 0xf8, 0x14, 0xab, 0xec, 0x9f, 0x3f, 0xd7, 0x67, 0xea, 0x97, 0x67, + 0xea, 0xef, 0xe1, 0x76, 0x7e, 0xaf, 0xfb, 0x3f, 0x7d, 0x66, 0xfc, 0x1a, + 0xec, 0xfd, 0x5f, 0xd9, 0xe3, 0xe0, 0x76, 0x5d, 0x9f, 0xaa, 0xfd, 0x14, + 0xc4, 0x49, 0xc4, 0x7b, 0xed, 0x6d, 0x1d, 0x5d, 0x9f, 0xaa, 0x5d, 0x9f, + 0xac, 0x36, 0x17, 0x0a, 0x2a, 0xec, 0xfd, 0x54, 0x95, 0x8e, 0x8c, 0xd7, + 0x21, 0x0f, 0xf4, 0x27, 0x74, 0x4e, 0xd3, 0x2e, 0x42, 0xfb, 0xac, 0x02, + 0x93, 0xdd, 0x0c, 0x26, 0xcf, 0xd1, 0x9a, 0x24, 0x2f, 0xfb, 0x68, 0xdf, + 0x87, 0xac, 0xd9, 0x65, 0xff, 0xcf, 0xe0, 0x78, 0xc9, 0xf4, 0xf2, 0x59, + 0x52, 0x45, 0xb6, 0x8e, 0x7a, 0x77, 0x7f, 0x46, 0x09, 0x12, 0x92, 0xcb, + 0xfd, 0xcc, 0x94, 0xa3, 0xbf, 0x2c, 0xac, 0x44, 0x89, 0x18, 0x70, 0xb6, + 0xff, 0xd8, 0x01, 0xe6, 0x85, 0x7f, 0x4c, 0xb2, 0x96, 0x5f, 0xf8, 0xb2, + 0x68, 0xdb, 0xf7, 0xfb, 0x8b, 0x2a, 0x0f, 0x33, 0x81, 0x77, 0x4b, 0x64, + 0x97, 0xd3, 0x3b, 0xe9, 0x65, 0x6c, 0x98, 0xaf, 0xc5, 0xde, 0x84, 0x61, + 0x10, 0xee, 0x8c, 0x5c, 0x7b, 0x2c, 0xad, 0x2f, 0x50, 0x3c, 0xf1, 0xaf, + 0x55, 0x2f, 0xee, 0x14, 0x78, 0x3a, 0x59, 0x7f, 0x70, 0xb3, 0xb9, 0xfa, + 0xca, 0xf8, 0xf6, 0x9a, 0x5b, 0x7f, 0xd3, 0x16, 0x6f, 0xf7, 0xcf, 0xb8, + 0xb2, 0xfe, 0xee, 0x7a, 0x35, 0xfa, 0xcb, 0xfe, 0xd1, 0xb7, 0x82, 0x46, + 0x4c, 0xb2, 0xff, 0x81, 0x1f, 0x8c, 0x2f, 0xa9, 0x2c, 0xbf, 0xf3, 0xbe, + 0xd8, 0xd7, 0x2f, 0xa4, 0xb2, 0xf3, 0xb1, 0xcc, 0x3f, 0x89, 0x8e, 0xaf, + 0xfe, 0xcf, 0x4e, 0xef, 0xb1, 0xa2, 0x47, 0xeb, 0x2c, 0x2c, 0xe4, 0xd7, + 0x34, 0x5c, 0x50, 0xb2, 0xe9, 0xa5, 0x42, 0xa0, 0x9c, 0x23, 0x78, 0xe6, + 0xef, 0x8d, 0x83, 0x15, 0x65, 0xf7, 0x7d, 0x9b, 0x2c, 0xa6, 0x9e, 0x31, + 0x11, 0xdc, 0x31, 0x56, 0x5f, 0xe1, 0x89, 0xbd, 0xdc, 0x80, 0xb2, 0xa0, + 0xfb, 0xb0, 0x84, 0xc6, 0x2f, 0x37, 0xfd, 0x2c, 0xbc, 0x3e, 0x92, 0xcb, + 0xff, 0xdf, 0x77, 0xc6, 0x20, 0xf3, 0x0b, 0x86, 0xb2, 0xff, 0xfd, 0x2d, + 0x46, 0xf7, 0x9a, 0x07, 0xe8, 0x6b, 0xcc, 0xb2, 0xff, 0x6e, 0xbf, 0x0f, + 0x93, 0x62, 0xca, 0x9c, 0x98, 0x93, 0x31, 0xec, 0x1c, 0xf9, 0x2b, 0x4b, + 0x17, 0xfd, 0x1f, 0x46, 0x73, 0x8d, 0xf9, 0x65, 0xe3, 0x29, 0x2c, 0xa8, + 0x6e, 0xa7, 0x36, 0x5a, 0x94, 0xed, 0x6e, 0x47, 0x74, 0x71, 0xa1, 0xee, + 0x21, 0xcc, 0x91, 0xa8, 0xf6, 0xbd, 0x2b, 0xdd, 0xe7, 0xb5, 0x0a, 0x54, + 0xef, 0x21, 0xd2, 0x18, 0xcf, 0x85, 0x4f, 0xdd, 0x3a, 0xbe, 0x07, 0xfb, + 0x62, 0xca, 0x59, 0x67, 0xd1, 0xaf, 0x69, 0x25, 0xfd, 0x8d, 0x99, 0xde, + 0x4b, 0x2f, 0xff, 0xe7, 0xf4, 0x49, 0x9e, 0x7f, 0x12, 0xe0, 0xfd, 0x1a, + 0x59, 0x63, 0x1a, 0x22, 0xbc, 0x5b, 0x7f, 0xe6, 0x23, 0xe2, 0x8f, 0x78, + 0x20, 0x59, 0x7f, 0xf6, 0xa3, 0x0b, 0x24, 0x7e, 0xcd, 0xeb, 0x2f, 0xff, + 0x89, 0xd8, 0xe6, 0x6f, 0x8f, 0xbb, 0xc0, 0xb5, 0x65, 0x0d, 0x12, 0xc4, + 0x87, 0x7f, 0x8a, 0x3b, 0xf4, 0xce, 0xd5, 0x97, 0xee, 0x87, 0xb8, 0x35, + 0x96, 0xc5, 0x94, 0xe6, 0xe3, 0x79, 0x45, 0x35, 0x11, 0xc4, 0xd9, 0x7f, + 0xf7, 0xa3, 0x6e, 0x66, 0xbf, 0x7c, 0xfd, 0x65, 0xfc, 0x4e, 0xc7, 0x9e, + 0x4b, 0x2f, 0xfc, 0xd2, 0xce, 0x94, 0x00, 0xe4, 0xb2, 0xda, 0x59, 0x46, + 0x79, 0xae, 0x79, 0x7e, 0x06, 0x36, 0x38, 0xb2, 0xf0, 0xa2, 0x8a, 0x92, + 0xf0, 0x91, 0xfa, 0x46, 0x66, 0x82, 0xff, 0x9e, 0x42, 0x6b, 0x37, 0xbe, + 0x96, 0x5b, 0x4b, 0x2f, 0xfc, 0x45, 0x9b, 0x4d, 0x28, 0xd6, 0xcb, 0x2f, + 0x7b, 0x25, 0x07, 0xa2, 0x20, 0x8d, 0x12, 0x2f, 0xfb, 0x08, 0xcb, 0xfc, + 0x52, 0x36, 0xe7, 0xdd, 0x59, 0x7d, 0xf0, 0x0c, 0x96, 0x53, 0x9e, 0xaf, + 0x4c, 0xe9, 0x65, 0xdf, 0xc4, 0x8d, 0x63, 0x2c, 0x86, 0xfd, 0x3a, 0x01, + 0x9a, 0x59, 0x7f, 0xe9, 0xd0, 0x41, 0x6c, 0x0b, 0x1c, 0x59, 0x6c, 0x19, + 0xf4, 0x91, 0x4d, 0xff, 0x75, 0xcb, 0x39, 0xa8, 0xe2, 0xcb, 0xe9, 0x47, + 0xff, 0x2c, 0xbf, 0xbf, 0x82, 0xcf, 0xba, 0xb2, 0xe7, 0xfe, 0x71, 0xe9, + 0x08, 0x49, 0x7f, 0xf8, 0x42, 0x99, 0x87, 0x1f, 0xb0, 0x19, 0xa5, 0x94, + 0x69, 0xe3, 0x7a, 0x13, 0x4e, 0x4c, 0x50, 0x89, 0xe1, 0x8d, 0xed, 0xf1, + 0xa5, 0x97, 0x83, 0x9e, 0x59, 0x5b, 0x2f, 0xc8, 0x4a, 0x16, 0x03, 0x28, + 0xc8, 0x6b, 0x1c, 0x2c, 0x26, 0x22, 0x6a, 0x37, 0x9e, 0x9c, 0x83, 0xf4, + 0x72, 0x87, 0x7f, 0x65, 0x37, 0x6f, 0x52, 0x14, 0x7a, 0xe3, 0xd9, 0x65, + 0xfe, 0x20, 0x0c, 0xf7, 0xc0, 0xd6, 0x50, 0xcf, 0x2c, 0x22, 0xf6, 0xfd, + 0x65, 0xff, 0xd3, 0x7a, 0x36, 0x13, 0xbe, 0x0b, 0xc9, 0x65, 0xff, 0x64, + 0x6e, 0x4e, 0xf3, 0xe6, 0x96, 0x5a, 0x65, 0x96, 0x6a, 0xcb, 0x34, 0xcd, + 0x1b, 0x89, 0x5f, 0xb3, 0xfe, 0x44, 0x96, 0x5f, 0x8d, 0xa3, 0x1e, 0x2c, + 0xb7, 0xe4, 0x79, 0xf3, 0xe5, 0x17, 0xfd, 0xdf, 0x67, 0x27, 0x74, 0xf6, + 0x59, 0x7f, 0x64, 0xd9, 0xa1, 0x9a, 0xca, 0x84, 0x4a, 0x19, 0x59, 0x1e, + 0x5f, 0xf1, 0x18, 0x59, 0x7c, 0x9f, 0x8e, 0xac, 0xbf, 0xdf, 0xe8, 0xf3, + 0xc1, 0xe2, 0xcb, 0xd9, 0xf3, 0x56, 0x5f, 0xd9, 0xfe, 0xef, 0x4d, 0xab, + 0x2a, 0x11, 0x04, 0x46, 0x9d, 0x1d, 0xbc, 0xfa, 0xfd, 0x65, 0x49, 0x57, + 0xd0, 0xc4, 0xa6, 0x48, 0x6a, 0xff, 0xa3, 0x08, 0x22, 0xde, 0xc3, 0x06, + 0x7c, 0xba, 0xfb, 0x3a, 0x26, 0xcb, 0x2f, 0x0a, 0x28, 0xa9, 0x88, 0x40, + 0xbe, 0x03, 0xb8, 0x13, 0x10, 0x80, 0xcc, 0xd7, 0x5f, 0x3e, 0xb0, 0x55, + 0x95, 0xa3, 0xe3, 0xde, 0x83, 0x78, 0x51, 0x45, 0x4c, 0x41, 0xe5, 0x26, + 0x20, 0xf1, 0x99, 0xae, 0xbf, 0xba, 0xed, 0x6c, 0x35, 0x65, 0xf9, 0xfa, + 0xe5, 0xfa, 0xcb, 0xfb, 0x3b, 0xe0, 0xbc, 0x96, 0x5e, 0x14, 0x51, 0x56, + 0x5e, 0xe4, 0x30, 0x91, 0x99, 0xa0, 0xac, 0x4d, 0x34, 0x0a, 0x5f, 0x15, + 0xf8, 0xb4, 0x89, 0xfa, 0x9b, 0x5b, 0x8a, 0x96, 0x5b, 0x28, 0x0a, 0xf0, + 0xb0, 0x4b, 0x2f, 0xfe, 0xf4, 0x48, 0xfb, 0x9e, 0x04, 0x35, 0x65, 0x42, + 0x23, 0x9c, 0xbf, 0x78, 0xe5, 0xee, 0xc7, 0x16, 0x5f, 0xfb, 0xc6, 0x38, + 0x2e, 0xe7, 0xdd, 0x59, 0x7f, 0x8a, 0x1b, 0xce, 0x04, 0x96, 0x50, 0x0f, + 0xc3, 0x87, 0xd7, 0xff, 0x78, 0xf5, 0xe7, 0xce, 0x1b, 0xec, 0xb2, 0xff, + 0xd1, 0xdc, 0xd6, 0x73, 0x3e, 0xea, 0xca, 0xc4, 0x40, 0x92, 0x1d, 0xff, + 0xb6, 0x6e, 0x37, 0x0b, 0xb8, 0x05, 0x97, 0xd1, 0xd8, 0x6a, 0xca, 0x9e, + 0xd3, 0xaf, 0xfa, 0x11, 0x8d, 0x85, 0x19, 0x10, 0xf4, 0xfa, 0xff, 0xbd, + 0x04, 0x0f, 0xb8, 0xfb, 0x8b, 0x2f, 0xd2, 0x20, 0xec, 0x4b, 0x2f, 0xe1, + 0xf3, 0x1b, 0x1b, 0x8b, 0x2f, 0x05, 0xc4, 0x59, 0x76, 0xdf, 0x2c, 0xb3, + 0x8c, 0xdb, 0x7e, 0x3b, 0x52, 0x47, 0x8f, 0xc7, 0x8e, 0x50, 0x2b, 0x35, + 0xf8, 0xbb, 0xec, 0x92, 0xcb, 0xc7, 0x0c, 0x2c, 0xa7, 0x3c, 0x32, 0x27, + 0xbf, 0xec, 0x28, 0xf7, 0xa0, 0x53, 0x59, 0x78, 0x48, 0xfd, 0x65, 0x6c, + 0x7e, 0xac, 0x10, 0x34, 0xde, 0xfc, 0x08, 0xf4, 0x35, 0x25, 0xf8, 0x9c, + 0x8b, 0x12, 0x5d, 0x80, 0x49, 0x70, 0xa2, 0xa4, 0xac, 0x3f, 0xae, 0x13, + 0xf4, 0x90, 0x51, 0x6b, 0xfc, 0x42, 0x47, 0xfe, 0xcd, 0xd4, 0x8c, 0xcd, + 0xe5, 0xff, 0xed, 0x87, 0xa7, 0x01, 0x66, 0xfd, 0x1f, 0x16, 0x54, 0x2b, + 0xbd, 0xc8, 0xd2, 0xce, 0x1e, 0xcf, 0x0e, 0x70, 0xa4, 0xdf, 0xfd, 0x1f, + 0xf3, 0x30, 0x6e, 0x4e, 0xc2, 0xcb, 0xfe, 0x2f, 0xfc, 0xfd, 0xe9, 0xfe, + 0xb2, 0xff, 0xfd, 0xe3, 0xde, 0x64, 0x3e, 0x46, 0x8f, 0x3e, 0xe2, 0xcb, + 0xf8, 0xa3, 0x34, 0xff, 0xac, 0xbf, 0xf4, 0x6b, 0xd0, 0x7e, 0x82, 0x35, + 0x97, 0x4b, 0x98, 0x8f, 0x70, 0x1d, 0x75, 0x58, 0x52, 0xcb, 0xfd, 0x05, + 0x8d, 0x3f, 0xa4, 0xb2, 0xff, 0xfb, 0x85, 0x9f, 0x7e, 0xfc, 0x7d, 0x1f, + 0xdf, 0xac, 0xaf, 0x91, 0x9b, 0xd4, 0x91, 0x4c, 0xab, 0xca, 0x8e, 0x5e, + 0x50, 0x3d, 0xed, 0xe2, 0x35, 0x65, 0xf7, 0xb6, 0xc1, 0x56, 0x5f, 0x0c, + 0x25, 0x25, 0x96, 0xe3, 0x9e, 0x30, 0x84, 0x97, 0xf1, 0x80, 0x78, 0xff, + 0xac, 0xbf, 0xff, 0x77, 0x9f, 0x4e, 0x1e, 0x0e, 0x1f, 0x58, 0x5f, 0xac, + 0xbf, 0xff, 0xf4, 0xee, 0xcb, 0x3f, 0x9f, 0xc9, 0xc3, 0xc1, 0xc3, 0xeb, + 0x0b, 0xf4, 0x21, 0x7f, 0xf6, 0x76, 0x70, 0x3c, 0x7e, 0xf1, 0xfe, 0xa8, + 0x42, 0xd5, 0x24, 0x65, 0xf1, 0xde, 0xf4, 0x6c, 0xcf, 0x89, 0xa3, 0x76, + 0x32, 0x3b, 0xf3, 0x78, 0x2b, 0xfc, 0xb2, 0xdc, 0x19, 0xf4, 0x08, 0x7d, + 0x7f, 0x64, 0xd2, 0x3d, 0x71, 0x65, 0xfd, 0x1f, 0x09, 0xc8, 0xc5, 0x97, + 0xff, 0xff, 0x3e, 0xc2, 0x0f, 0xd1, 0x2e, 0xe6, 0x0b, 0xc2, 0xce, 0xf4, + 0xf6, 0x59, 0x7f, 0x3e, 0xb4, 0xff, 0xc2, 0xca, 0x86, 0xce, 0x54, 0x71, + 0x95, 0x64, 0xb1, 0xc3, 0x96, 0xd1, 0xa9, 0xd9, 0xc7, 0x95, 0x23, 0xf9, + 0x5b, 0x2d, 0x98, 0x8a, 0x39, 0x1e, 0xdf, 0x4a, 0x42, 0x5c, 0x29, 0x70, + 0x8e, 0x97, 0x85, 0x14, 0x54, 0x97, 0x9c, 0x86, 0x91, 0x99, 0xa0, 0xbe, + 0xcd, 0x67, 0x56, 0x57, 0xe7, 0x9d, 0xc2, 0xdb, 0xef, 0x1b, 0xc9, 0x65, + 0xff, 0xe1, 0x08, 0xb3, 0x68, 0xfa, 0x52, 0x86, 0xac, 0xbc, 0x51, 0x25, + 0x97, 0xda, 0xd1, 0xb5, 0x65, 0xb8, 0x33, 0x7a, 0x63, 0x75, 0x24, 0x57, + 0x76, 0x11, 0x17, 0x9b, 0xb0, 0xd6, 0x51, 0x1e, 0x37, 0x4a, 0x2f, 0xda, + 0xc0, 0x47, 0x96, 0x5e, 0x9c, 0xc4, 0xfa, 0xcb, 0xdd, 0x71, 0xac, 0xad, + 0x1b, 0xfe, 0x11, 0xdf, 0xe6, 0x3e, 0xee, 0xa3, 0x3e, 0x59, 0x7f, 0x02, + 0x3f, 0x3d, 0x30, 0x92, 0xfe, 0x13, 0x35, 0x99, 0x32, 0xcb, 0xf3, 0xfa, + 0x70, 0xe1, 0x65, 0x49, 0x54, 0xe0, 0xc8, 0xf2, 0x31, 0x56, 0x08, 0x4d, + 0x99, 0xc8, 0x48, 0xdb, 0x85, 0xfd, 0x2e, 0xbf, 0x3e, 0xb5, 0x9f, 0x2c, + 0xbf, 0xfd, 0xdf, 0x1b, 0xff, 0x9a, 0x1c, 0x14, 0x96, 0x5f, 0xfe, 0xfa, + 0x77, 0xdf, 0xc1, 0x01, 0xf6, 0x27, 0x59, 0x50, 0x8b, 0xfc, 0x28, 0x24, + 0x9b, 0xf4, 0x70, 0x42, 0x92, 0xcb, 0xe9, 0xc0, 0x39, 0x2c, 0xbf, 0xf0, + 0x33, 0x58, 0x7c, 0xf4, 0x6f, 0x59, 0x7e, 0x8d, 0xdd, 0xb0, 0x55, 0x97, + 0xff, 0xff, 0x39, 0xf4, 0xfc, 0x03, 0x9d, 0x23, 0xf3, 0x97, 0x65, 0x9a, + 0xc5, 0x97, 0x67, 0x96, 0x5d, 0x9b, 0xab, 0x2a, 0x63, 0x5f, 0xe1, 0x6a, + 0xf2, 0x30, 0x5e, 0x13, 0xf7, 0xfc, 0x51, 0xf7, 0x23, 0xb0, 0x35, 0x97, + 0xb8, 0x27, 0x27, 0x1e, 0xfe, 0x13, 0xd0, 0xd3, 0xe5, 0xf8, 0x93, 0xc7, + 0xfd, 0x8d, 0x32, 0xff, 0xb5, 0x12, 0x3e, 0x99, 0x49, 0x65, 0xff, 0xff, + 0xff, 0x47, 0x23, 0xbb, 0x60, 0xba, 0xcf, 0x38, 0x9c, 0xc6, 0x1c, 0xbf, + 0x82, 0x89, 0xbd, 0x0b, 0x2f, 0xdc, 0xf3, 0x82, 0x16, 0x5f, 0x9f, 0x61, + 0x5e, 0x4b, 0x2a, 0x13, 0x1c, 0x23, 0x71, 0x61, 0x2a, 0x21, 0x3d, 0xff, + 0x73, 0xd0, 0xfa, 0xd6, 0x7c, 0xb2, 0xff, 0xff, 0xcc, 0x7d, 0x2e, 0xe1, + 0x77, 0x93, 0xb9, 0xcc, 0xd6, 0x13, 0xc9, 0x65, 0x62, 0x2a, 0x0c, 0xe6, + 0xfd, 0x1f, 0xf7, 0x36, 0x59, 0x7f, 0xf3, 0x31, 0x94, 0x04, 0x18, 0xc1, + 0xe9, 0x65, 0xed, 0x3f, 0x16, 0x5d, 0x82, 0xac, 0xa8, 0x3f, 0x91, 0xa3, + 0x70, 0x72, 0xf7, 0x7d, 0x0b, 0x2b, 0x0f, 0x29, 0xcb, 0xaf, 0xde, 0x82, + 0x7f, 0x2c, 0xbf, 0xb6, 0xf3, 0xf7, 0x50, 0xb2, 0xff, 0x0f, 0xd1, 0x33, + 0xbf, 0xcb, 0x2f, 0x7b, 0xfd, 0xeb, 0x2b, 0x47, 0xa9, 0xba, 0x69, 0x71, + 0xec, 0xb2, 0xf7, 0xcf, 0xb8, 0xb2, 0xb4, 0x6d, 0xfc, 0x2f, 0x52, 0x4d, + 0x14, 0x64, 0x1a, 0x26, 0x78, 0x41, 0x12, 0xe5, 0xff, 0xd9, 0xaf, 0xda, + 0x7c, 0x13, 0x91, 0x8b, 0x2f, 0x47, 0xdb, 0x8b, 0x2f, 0xb8, 0x46, 0xc2, + 0xcb, 0x0f, 0x47, 0x85, 0xd2, 0x0b, 0xff, 0x98, 0x16, 0x35, 0xe8, 0x37, + 0xef, 0x16, 0x5f, 0x34, 0xa2, 0x65, 0x97, 0xff, 0xde, 0x39, 0x1e, 0x9f, + 0xfe, 0x94, 0x37, 0x8b, 0x2f, 0xbb, 0x1a, 0xfe, 0x0f, 0xc4, 0x04, 0x57, + 0x6e, 0x71, 0x65, 0xff, 0x70, 0x1e, 0x71, 0xb2, 0x19, 0x33, 0xda, 0xca, + 0x61, 0x13, 0x4e, 0x73, 0xd1, 0xaa, 0x92, 0xa2, 0xfc, 0x84, 0x39, 0x94, + 0x3c, 0x6a, 0x17, 0xa7, 0xa2, 0xfd, 0x65, 0xfa, 0x04, 0x27, 0x92, 0xcb, + 0xff, 0xda, 0x72, 0xee, 0x7f, 0x3f, 0x03, 0x1c, 0x2c, 0xbf, 0xa5, 0xa8, + 0x93, 0xe9, 0x65, 0xd8, 0xd5, 0x97, 0xff, 0x61, 0x7f, 0x38, 0x4d, 0x7e, + 0xd3, 0xe2, 0xcb, 0xf8, 0xfc, 0x79, 0xf7, 0x56, 0x50, 0xd1, 0x18, 0xd1, + 0x6e, 0xa4, 0xd2, 0xcb, 0xef, 0xfb, 0x9f, 0xac, 0xbf, 0x47, 0x38, 0x7b, + 0xd6, 0x5f, 0x34, 0x8a, 0x16, 0x5f, 0xf1, 0x8f, 0xd1, 0x2c, 0xfb, 0xab, + 0x2f, 0xf8, 0x11, 0xbe, 0x38, 0x7f, 0xfc, 0xb2, 0xe7, 0x62, 0x11, 0x2a, + 0x32, 0x0c, 0x39, 0xa1, 0xaa, 0x83, 0xc2, 0x7f, 0x93, 0x0e, 0x17, 0x33, + 0x18, 0x68, 0x2f, 0xc4, 0x85, 0x0b, 0xeb, 0xd3, 0xff, 0x42, 0xcb, 0xfe, + 0x07, 0x8a, 0x3e, 0x38, 0xf2, 0xca, 0x86, 0x72, 0xbc, 0xa3, 0x42, 0x19, + 0x6e, 0x4a, 0x0d, 0x38, 0xd8, 0x75, 0x0e, 0xb6, 0x90, 0xbc, 0xa3, 0x12, + 0x94, 0xfb, 0xc4, 0x70, 0xca, 0xa5, 0x9f, 0x7c, 0x10, 0x82, 0xff, 0xce, + 0x63, 0x0f, 0x79, 0xb6, 0x0a, 0xb2, 0xe9, 0xe8, 0x96, 0x5f, 0xb9, 0x8c, + 0x47, 0x16, 0x5f, 0xd1, 0xf3, 0x5c, 0xbf, 0x59, 0x7f, 0x6e, 0x70, 0xcb, + 0xe9, 0x2c, 0xbf, 0xf3, 0xea, 0x7c, 0xfd, 0x8f, 0xf7, 0xeb, 0x2f, 0xef, + 0xc4, 0x2f, 0x67, 0xcb, 0x2f, 0xff, 0xc7, 0xd8, 0x6e, 0x7d, 0xd8, 0x68, + 0x9a, 0x7f, 0xd6, 0x5f, 0x19, 0x38, 0xd6, 0x5f, 0xf7, 0x23, 0x5d, 0x86, + 0x63, 0x35, 0x95, 0x24, 0x58, 0x8d, 0x5f, 0x84, 0x17, 0xff, 0xf6, 0x7a, + 0x76, 0x34, 0xfd, 0x13, 0xb9, 0xcc, 0x2f, 0xd6, 0x5f, 0xfc, 0x7a, 0x89, + 0x7a, 0x26, 0x20, 0xb0, 0xb2, 0xbc, 0x8a, 0x3e, 0x2f, 0x5f, 0xfb, 0x68, + 0x98, 0xa3, 0x99, 0x12, 0x59, 0x70, 0x27, 0xd6, 0x5f, 0xcc, 0x76, 0x3d, + 0x1c, 0x59, 0x7f, 0xdc, 0x2c, 0xef, 0x23, 0x5b, 0x2c, 0xbf, 0xbc, 0x7f, + 0x71, 0xfe, 0x59, 0x7f, 0xb0, 0x79, 0xa9, 0x46, 0x96, 0x5e, 0xf1, 0xf5, + 0x65, 0x42, 0x67, 0x92, 0x3e, 0x31, 0xa9, 0x8b, 0xbf, 0x39, 0xe1, 0x78, + 0x86, 0x57, 0xe7, 0xf6, 0x7d, 0xd5, 0x97, 0xee, 0x83, 0xd0, 0x15, 0x97, + 0xfe, 0x72, 0xd8, 0x5c, 0x21, 0xfa, 0x16, 0x5c, 0x7b, 0x2c, 0xac, 0x3d, + 0x52, 0x3e, 0xbf, 0xc1, 0xfa, 0x5c, 0x12, 0x37, 0x16, 0x5e, 0x04, 0x6e, + 0x2c, 0xbf, 0xd3, 0x79, 0xf5, 0xa3, 0x1a, 0xca, 0xc3, 0xd3, 0x71, 0xfb, + 0xfc, 0xff, 0x09, 0xa3, 0x6e, 0x2c, 0xbf, 0x9c, 0xb6, 0x6b, 0xf5, 0x65, + 0x11, 0xf0, 0xf0, 0xd2, 0xf8, 0xfc, 0xed, 0x59, 0x7f, 0xc4, 0x59, 0xb7, + 0x7b, 0x0d, 0x59, 0x52, 0x54, 0x99, 0x85, 0x13, 0x3e, 0xe8, 0x80, 0xa1, + 0x19, 0xc8, 0x40, 0xf4, 0x84, 0x42, 0x1b, 0xf6, 0xb3, 0x86, 0x2a, 0xcb, + 0xe6, 0xc6, 0xb8, 0xb2, 0xff, 0xf4, 0x0f, 0xc1, 0x60, 0x48, 0x1f, 0x83, + 0xc5, 0x97, 0x46, 0xe0, 0xcf, 0xbc, 0x42, 0x2b, 0xd1, 0x3c, 0x5d, 0x65, + 0xfc, 0x24, 0x04, 0x01, 0x6a, 0xcb, 0x8c, 0x96, 0x5f, 0x4a, 0x08, 0x0b, + 0x28, 0x66, 0xdb, 0x05, 0x6d, 0x32, 0xcb, 0xe6, 0x4b, 0xc7, 0xcb, 0x2d, + 0x04, 0x6e, 0x3a, 0x25, 0x53, 0x8f, 0xf4, 0xd6, 0x2f, 0xa3, 0xfc, 0x25, + 0x95, 0x26, 0x48, 0xd0, 0xca, 0x30, 0xb8, 0x06, 0x3f, 0x21, 0x1c, 0x38, + 0x66, 0x86, 0x9e, 0xa3, 0x5f, 0x6c, 0xab, 0x27, 0x7d, 0xfe, 0x12, 0xfc, + 0x31, 0x09, 0x08, 0xb0, 0xe2, 0x9f, 0x23, 0xbe, 0x6b, 0x29, 0x3c, 0x67, + 0x95, 0x97, 0x77, 0x8b, 0x28, 0xcf, 0x2a, 0x63, 0x3b, 0xe1, 0x20, 0x5e, + 0x2c, 0xbb, 0xfe, 0xac, 0xbb, 0xff, 0x2c, 0xbe, 0xd6, 0xb3, 0x8b, 0x2e, + 0xc9, 0x96, 0x5a, 0x53, 0x91, 0x1b, 0xb1, 0x23, 0x46, 0x1c, 0x60, 0x42, + 0x2b, 0xf1, 0xf5, 0xcb, 0x16, 0x5f, 0xb4, 0x3c, 0xc2, 0x59, 0x7c, 0xc6, + 0x9c, 0x55, 0x97, 0xfe, 0x3c, 0xf4, 0x6f, 0xe7, 0xa3, 0xe5, 0x95, 0x87, + 0xc9, 0xb8, 0x49, 0x7f, 0x7d, 0xa0, 0xfd, 0xd9, 0x2c, 0xa7, 0x46, 0xff, + 0x21, 0x14, 0x12, 0x4b, 0xf0, 0xbd, 0xee, 0x6c, 0xb2, 0xfe, 0x78, 0xff, + 0x3e, 0x92, 0xca, 0x59, 0x7f, 0x8b, 0x59, 0xcc, 0x3f, 0x2c, 0xa6, 0x49, + 0xbc, 0xc0, 0xbb, 0xff, 0xe9, 0x74, 0xb1, 0xfa, 0x59, 0xde, 0xe0, 0xab, + 0x2f, 0xf6, 0xb4, 0x7d, 0xf6, 0x49, 0x65, 0xe9, 0x3e, 0xea, 0xcb, 0xff, + 0xec, 0x19, 0xf7, 0x1b, 0xe8, 0x80, 0x35, 0xd6, 0x5d, 0x9b, 0xd6, 0x5f, + 0xf0, 0x3d, 0x83, 0x69, 0xeb, 0x16, 0x54, 0x22, 0x77, 0x64, 0xdc, 0x18, + 0xbf, 0xa2, 0x35, 0xe8, 0xde, 0xb2, 0xfd, 0xf9, 0x94, 0xdb, 0x8b, 0x2f, + 0xe8, 0xdf, 0x9e, 0xf4, 0x2c, 0xbe, 0xef, 0x32, 0x65, 0x9e, 0x35, 0xd7, + 0xf7, 0x86, 0x7b, 0xe0, 0x6b, 0x2b, 0x0f, 0x89, 0xcc, 0xef, 0xb4, 0x6f, + 0xb2, 0xcb, 0xc7, 0x9f, 0xac, 0xac, 0x37, 0xdc, 0x22, 0xbf, 0xc6, 0x1d, + 0x7b, 0x37, 0xf1, 0x65, 0xff, 0xfe, 0xce, 0x9f, 0xd2, 0x28, 0x9d, 0xd3, + 0xcd, 0xd1, 0xfb, 0x16, 0x5f, 0x67, 0x4f, 0x8b, 0x2f, 0xe9, 0xea, 0x62, + 0x9e, 0x76, 0x0a, 0xca, 0xdc, 0x47, 0xa4, 0xc6, 0xbc, 0x64, 0xe9, 0x0d, + 0xff, 0x82, 0xed, 0xe1, 0x93, 0xe9, 0x85, 0x95, 0x25, 0xe3, 0x71, 0xc6, + 0x09, 0x86, 0x8c, 0x15, 0x01, 0xab, 0xe2, 0x43, 0x4e, 0x98, 0xcf, 0x50, + 0xbc, 0xf1, 0x7f, 0xe5, 0xc5, 0x0b, 0xce, 0x2f, 0x76, 0x31, 0x41, 0x50, + 0x6f, 0xbb, 0xd3, 0x92, 0xcb, 0xfb, 0x05, 0x2d, 0xfa, 0x92, 0xcb, 0xff, + 0xf7, 0x4f, 0x9b, 0x60, 0xbc, 0x3d, 0x89, 0xfe, 0xea, 0xcb, 0xfe, 0x96, + 0x77, 0x06, 0x65, 0xfa, 0xcb, 0xc2, 0xe7, 0x96, 0x5f, 0xd9, 0xad, 0x05, + 0x8d, 0x2c, 0xbf, 0x8a, 0x42, 0xbf, 0xb8, 0xb2, 0xfc, 0xc7, 0x9c, 0x8d, + 0x65, 0xb9, 0x87, 0xaa, 0x65, 0xd7, 0xc3, 0x27, 0x61, 0x65, 0xff, 0xc7, + 0x27, 0xd6, 0x6f, 0xf8, 0x07, 0xf2, 0xca, 0xd8, 0xfa, 0x7a, 0x45, 0x7c, + 0x7c, 0xc1, 0xc2, 0xa3, 0x5d, 0x88, 0xb0, 0xc3, 0xe5, 0x87, 0x38, 0x21, + 0xde, 0xc2, 0x10, 0x48, 0x47, 0xdf, 0xf9, 0xf7, 0x3f, 0x0f, 0x0c, 0xbe, + 0x92, 0xcb, 0x7e, 0xb2, 0xff, 0x0f, 0x08, 0xc5, 0xf0, 0x56, 0x5f, 0xff, + 0x78, 0xe3, 0xa7, 0xfc, 0x49, 0x98, 0xa2, 0x8a, 0x92, 0xff, 0xe3, 0x8e, + 0xff, 0x12, 0x66, 0x28, 0xa2, 0xa4, 0xac, 0x44, 0xff, 0x95, 0x6b, 0x64, + 0x7a, 0x76, 0x1a, 0x57, 0xfb, 0xc1, 0x76, 0x8d, 0xda, 0xb2, 0x88, 0xf7, + 0x3a, 0x53, 0x7c, 0x3c, 0xc6, 0x12, 0x5f, 0x3f, 0xef, 0xd5, 0x97, 0xfd, + 0xa7, 0x04, 0xef, 0x40, 0x84, 0xb2, 0xf0, 0x63, 0x4b, 0x2e, 0xef, 0x06, + 0x7a, 0xf3, 0x1d, 0xdf, 0x30, 0x1f, 0xf8, 0xb2, 0xe2, 0x0a, 0xa2, 0x19, + 0x5f, 0xd0, 0xd8, 0xe6, 0xb1, 0x65, 0x48, 0xf3, 0xe6, 0x23, 0xbd, 0xe8, + 0xd9, 0x65, 0xfb, 0xb1, 0x26, 0x1a, 0xb2, 0xf0, 0xa2, 0x8a, 0x92, 0xf6, + 0x10, 0x12, 0x33, 0x34, 0x17, 0xfe, 0xcd, 0xb0, 0x6f, 0x22, 0x8d, 0x96, + 0x54, 0x22, 0xd3, 0xf4, 0x92, 0x2d, 0xbf, 0x77, 0xce, 0x4c, 0x2c, 0xbf, + 0xbe, 0x97, 0x09, 0xc0, 0xb2, 0xf1, 0x32, 0xa9, 0xed, 0x65, 0x61, 0xea, + 0xb9, 0x75, 0xcc, 0xa9, 0x95, 0x2c, 0xbf, 0x67, 0x7a, 0x1d, 0x96, 0x5f, + 0xf8, 0xf6, 0xf1, 0xbc, 0xba, 0x7b, 0x2c, 0xb4, 0x99, 0x52, 0x22, 0xc8, + 0x8f, 0xa5, 0x37, 0x9f, 0x72, 0x16, 0x5f, 0xb0, 0x7e, 0x7d, 0xc5, 0x97, + 0xe2, 0xc1, 0xc3, 0x56, 0x54, 0xf2, 0xbb, 0x6b, 0x11, 0xb1, 0x6c, 0x42, + 0x32, 0x2c, 0x79, 0x60, 0xbf, 0xe7, 0x49, 0x88, 0xf5, 0x0d, 0x16, 0x97, + 0xf9, 0xf5, 0xe1, 0x56, 0x13, 0xbd, 0xe3, 0xc2, 0x95, 0x5f, 0xcd, 0xc3, + 0xd4, 0xd2, 0x59, 0x7f, 0xfc, 0xc0, 0x8e, 0x5e, 0x79, 0x73, 0x1b, 0x1b, + 0x8b, 0x2a, 0x11, 0x02, 0x65, 0xd7, 0xba, 0x70, 0xb2, 0xec, 0x25, 0x94, + 0x66, 0xc0, 0x23, 0x77, 0xe2, 0x8f, 0xa3, 0x8b, 0x2f, 0xfd, 0x86, 0x4f, + 0xde, 0x0b, 0x04, 0xb2, 0xf7, 0x9f, 0x50, 0x7c, 0x7c, 0x27, 0xbe, 0x3d, + 0x47, 0x56, 0x5f, 0x73, 0x22, 0x4b, 0x28, 0x67, 0x84, 0x44, 0x37, 0xe8, + 0x97, 0xb3, 0xe5, 0x97, 0xd2, 0x38, 0x02, 0xcb, 0xbe, 0xfd, 0x65, 0xfc, + 0xd8, 0xe7, 0xe6, 0x05, 0x97, 0xb9, 0x0c, 0x7e, 0x78, 0xfc, 0x19, 0xbf, + 0xc1, 0xcd, 0x7f, 0xf9, 0x92, 0xcb, 0x71, 0x65, 0xd3, 0xce, 0xcb, 0x2a, + 0x46, 0xb9, 0xc4, 0x6f, 0xfd, 0x8d, 0x31, 0xeb, 0x06, 0xed, 0x59, 0x7d, + 0x8d, 0x10, 0x6b, 0x2b, 0xc7, 0xc0, 0x47, 0xb7, 0xfe, 0xf0, 0x9c, 0xcd, + 0x01, 0xdc, 0x0a, 0x88, 0x31, 0x7f, 0xf6, 0xd0, 0xc6, 0x6b, 0xbd, 0x8c, + 0xe2, 0xcb, 0x18, 0xd1, 0x22, 0x49, 0x97, 0xfe, 0xf0, 0x5d, 0x8c, 0xef, + 0x73, 0xcb, 0x2f, 0xf7, 0xa0, 0xbb, 0xfb, 0xf5, 0x65, 0xff, 0xe9, 0x6a, + 0x24, 0x0f, 0x1f, 0x89, 0xda, 0xb2, 0xb8, 0x7f, 0x81, 0x33, 0xbf, 0xe0, + 0x1b, 0x5a, 0x73, 0xb8, 0x15, 0x97, 0xfe, 0xe7, 0xef, 0xf7, 0x04, 0xd7, + 0x9d, 0x65, 0xf0, 0x7d, 0x80, 0x59, 0x52, 0x4e, 0x8c, 0x64, 0xfa, 0x85, + 0xd9, 0x11, 0x74, 0xee, 0x7d, 0x0a, 0xff, 0xee, 0xf3, 0x68, 0x10, 0xa3, + 0xc7, 0xb2, 0xcb, 0xfd, 0xc8, 0xd4, 0x80, 0x7b, 0x2c, 0xa2, 0x3f, 0xae, + 0x23, 0x5f, 0xc1, 0x60, 0xb3, 0x60, 0xac, 0xa8, 0x3d, 0x0f, 0x10, 0xde, + 0xf0, 0x77, 0x16, 0x5f, 0xfe, 0xd3, 0xef, 0xc2, 0x07, 0x8f, 0xf1, 0x3a, + 0xb2, 0xa1, 0x3b, 0x79, 0x46, 0x52, 0xcb, 0x21, 0x09, 0x05, 0xf6, 0x61, + 0x30, 0xb2, 0xbe, 0x5d, 0x8b, 0xf1, 0xa9, 0x31, 0x72, 0x10, 0x1d, 0x9c, + 0x0c, 0xdd, 0x47, 0xbc, 0x50, 0x2a, 0xcb, 0xe3, 0x01, 0x8d, 0x65, 0x61, + 0xbd, 0xe8, 0xe5, 0xf4, 0x74, 0xe6, 0x59, 0x7f, 0x05, 0xc4, 0x0b, 0x88, + 0xb2, 0xa6, 0x3d, 0x1d, 0x11, 0x5d, 0xbf, 0x16, 0x56, 0x1b, 0xb7, 0x23, + 0xbf, 0xf9, 0xe5, 0x3b, 0x3b, 0x9e, 0x8d, 0x7e, 0xb2, 0xef, 0xff, 0x59, + 0x7f, 0xc0, 0xf1, 0xe8, 0x8f, 0xbc, 0x59, 0x52, 0x44, 0xbb, 0x51, 0xbf, + 0x19, 0xbf, 0xdf, 0x9f, 0xbd, 0x9f, 0xba, 0xcb, 0xfd, 0xc3, 0xc2, 0xcf, + 0x85, 0x59, 0x7f, 0xff, 0xb3, 0xbd, 0x7d, 0x14, 0x7d, 0x21, 0x35, 0xfb, + 0x4f, 0x8b, 0x2b, 0x71, 0x12, 0xcd, 0x33, 0xbf, 0x07, 0xe0, 0x63, 0x56, + 0x5f, 0xf3, 0x4c, 0x5c, 0x21, 0xfa, 0x16, 0x5f, 0xfe, 0x8e, 0xf0, 0x20, + 0x9d, 0xe7, 0x28, 0x85, 0x97, 0x78, 0x2b, 0x2f, 0xff, 0xd2, 0x32, 0x1f, + 0xb3, 0xe1, 0x1c, 0xba, 0x43, 0x59, 0x7f, 0xb0, 0x7e, 0xcf, 0xb3, 0x8b, + 0x2f, 0x18, 0xbb, 0x8b, 0x2f, 0xf6, 0x6f, 0xe7, 0x7b, 0x0d, 0x59, 0x5a, + 0x3d, 0x5f, 0x10, 0x54, 0x27, 0xce, 0x32, 0x6c, 0x29, 0x60, 0xe0, 0xd2, + 0xa6, 0x17, 0x25, 0x5e, 0x42, 0x22, 0xe1, 0x4d, 0x65, 0xf9, 0xa0, 0xc2, + 0x02, 0xca, 0x83, 0x7c, 0x62, 0xf7, 0xff, 0x3e, 0xdc, 0x71, 0xc6, 0xd1, + 0x28, 0x59, 0x7f, 0x67, 0x27, 0xf3, 0x50, 0xb2, 0xb4, 0x89, 0x2e, 0x0f, + 0xcf, 0xa2, 0x5f, 0x1c, 0x14, 0xcb, 0x2a, 0x4c, 0xdb, 0x71, 0xc2, 0x0f, + 0x1d, 0x00, 0x43, 0xf1, 0x41, 0xce, 0xf9, 0xcd, 0x0a, 0x76, 0xc2, 0xb1, + 0xe1, 0x6d, 0xf9, 0x8f, 0x25, 0x58, 0xf6, 0x34, 0x51, 0x4c, 0xef, 0xf7, + 0x39, 0x85, 0xfc, 0xfe, 0x2c, 0xbe, 0x23, 0xdd, 0x85, 0x97, 0xc2, 0x16, + 0x71, 0x65, 0xa6, 0x59, 0x7f, 0x73, 0x0b, 0xf9, 0xfc, 0x59, 0x53, 0x91, + 0x7b, 0x86, 0xce, 0x47, 0xf9, 0x17, 0x04, 0xaf, 0xba, 0xee, 0x4b, 0x2b, + 0x79, 0xf5, 0x8a, 0x97, 0x7f, 0xfb, 0xe9, 0x1e, 0x79, 0xfd, 0xe8, 0xfb, + 0x8b, 0x2f, 0xf7, 0x7f, 0x0b, 0x63, 0x3a, 0xb2, 0x9c, 0xff, 0xc2, 0x97, + 0x7f, 0xf8, 0xb6, 0x9d, 0x31, 0x96, 0x0f, 0x09, 0x85, 0x97, 0xf1, 0xfd, + 0xbb, 0xe8, 0xea, 0xcb, 0xf0, 0x78, 0x67, 0xf2, 0xcb, 0xf1, 0x67, 0x7c, + 0x6b, 0x2f, 0x09, 0x90, 0xb2, 0xf7, 0x82, 0xc2, 0xcb, 0xdd, 0x81, 0x16, + 0x5f, 0xec, 0x1e, 0x9c, 0x1d, 0xfd, 0x65, 0xfb, 0x08, 0x7e, 0x85, 0x95, + 0x87, 0xef, 0xe1, 0xd1, 0x4d, 0x2a, 0x13, 0xab, 0xdc, 0x4c, 0x98, 0xc7, + 0x45, 0x0e, 0x4c, 0x43, 0x9c, 0x84, 0xad, 0xf0, 0xf4, 0xf2, 0x59, 0x7f, + 0xff, 0xb0, 0x9f, 0xbc, 0xcd, 0x7f, 0xfc, 0x67, 0xdd, 0xe1, 0xac, 0xbb, + 0x27, 0xd6, 0x50, 0xcf, 0xeb, 0xac, 0x35, 0x08, 0xbe, 0x78, 0x4e, 0x5e, + 0x8d, 0x4c, 0xb2, 0xa7, 0x3b, 0x0e, 0x86, 0x42, 0x04, 0x52, 0x4d, 0x76, + 0x8c, 0xfc, 0x70, 0xaf, 0xc9, 0xe8, 0xa0, 0x4b, 0x1c, 0xfa, 0x12, 0x47, + 0x3b, 0xf1, 0xe8, 0xda, 0x5e, 0x9c, 0x11, 0xfc, 0xa0, 0x82, 0x85, 0x20, + 0x63, 0xcc, 0x16, 0x32, 0x99, 0xf2, 0x6b, 0xdf, 0x6d, 0xbd, 0x65, 0xf8, + 0x1e, 0x8f, 0xb7, 0x56, 0x5c, 0x16, 0x5a, 0xcb, 0xf7, 0x9f, 0x4d, 0x35, + 0x97, 0x84, 0x8d, 0xc5, 0x97, 0xf0, 0x80, 0xf4, 0x7d, 0xba, 0xb2, 0xa7, + 0x23, 0x06, 0x45, 0x80, 0x1b, 0xe1, 0x38, 0x48, 0x2f, 0x19, 0x62, 0xcb, + 0xfb, 0xc6, 0xcb, 0xf4, 0x6c, 0xb2, 0xc3, 0x91, 0xe6, 0x00, 0x6a, 0xef, + 0xc5, 0x59, 0x7f, 0x7a, 0x0f, 0x71, 0xa6, 0xb2, 0xa7, 0x1e, 0x40, 0x06, + 0x6b, 0xe4, 0xcb, 0x0e, 0x13, 0x1d, 0x70, 0xbf, 0xb0, 0x5c, 0xc2, 0x61, + 0x65, 0xc7, 0xb2, 0xcb, 0xcf, 0x9c, 0x59, 0x7e, 0x7d, 0x8c, 0x32, 0x59, + 0x7b, 0xff, 0xe1, 0x65, 0x34, 0xf8, 0x7c, 0x36, 0x45, 0x17, 0xb0, 0x98, + 0x59, 0x46, 0x8e, 0xf6, 0x96, 0xbb, 0xc6, 0xe9, 0x75, 0xff, 0xe8, 0xe7, + 0x21, 0xb9, 0xd3, 0xe7, 0x9d, 0x65, 0xe3, 0x2e, 0xac, 0xa0, 0x1f, 0x1f, + 0x92, 0x2f, 0xfe, 0x6c, 0x77, 0x8f, 0x9a, 0xfd, 0xb8, 0xb2, 0xfe, 0x28, + 0x93, 0x60, 0xd6, 0x57, 0xe7, 0xde, 0x48, 0x97, 0xed, 0x3b, 0x60, 0x0b, + 0x2f, 0xd9, 0xbc, 0xb3, 0x8b, 0x2f, 0xf7, 0x4f, 0x79, 0xf6, 0x50, 0x92, + 0xcd, 0x59, 0x7f, 0x61, 0x31, 0xa8, 0x66, 0x67, 0x8a, 0x21, 0xa5, 0xd8, + 0xc2, 0xca, 0xc4, 0xe9, 0x0e, 0x12, 0x2e, 0x44, 0x44, 0xfc, 0x6d, 0x9f, + 0x46, 0xbf, 0xfc, 0xfb, 0xe3, 0x06, 0xf2, 0xcf, 0x18, 0xab, 0x2f, 0x07, + 0xe9, 0x2c, 0xbe, 0x96, 0x9f, 0x7a, 0xca, 0x92, 0x23, 0x34, 0x94, 0x43, + 0xd7, 0xf8, 0xa4, 0x58, 0xd8, 0x02, 0xcb, 0xf1, 0xf8, 0xa2, 0x4b, 0x2f, + 0x3f, 0x0d, 0x65, 0xb1, 0x65, 0xec, 0xc6, 0x16, 0x59, 0xa3, 0x35, 0x9b, + 0xa2, 0x15, 0x08, 0xf7, 0xc2, 0xfd, 0x18, 0xf8, 0x99, 0xd1, 0xef, 0xf8, + 0xf7, 0xe6, 0x80, 0xee, 0x05, 0x46, 0x1a, 0xbd, 0x3e, 0x1e, 0xac, 0xb8, + 0xf7, 0xac, 0xbe, 0x7d, 0x38, 0x8b, 0x2e, 0xc6, 0x16, 0x5f, 0xfd, 0x0d, + 0x31, 0xe1, 0x31, 0xe8, 0x6a, 0xca, 0xf1, 0xed, 0x74, 0x5e, 0x86, 0x98, + 0xe0, 0x11, 0x9a, 0x41, 0xc1, 0x8e, 0xbe, 0x5c, 0x27, 0x96, 0x5f, 0xe3, + 0x98, 0x9c, 0x51, 0x1a, 0xb2, 0x98, 0x3c, 0xdf, 0x0c, 0x5f, 0xff, 0x1f, + 0x7d, 0x1c, 0x8f, 0x41, 0xed, 0x0c, 0x2c, 0xbf, 0xde, 0x89, 0xa4, 0x7a, + 0x92, 0xcb, 0xf1, 0x4c, 0x50, 0xd5, 0x97, 0xfb, 0xa6, 0x2c, 0xc4, 0xe2, + 0xac, 0xbf, 0xec, 0xdf, 0x03, 0xf6, 0x1f, 0x56, 0x5e, 0xe3, 0xfe, 0xb2, + 0xdd, 0x23, 0xd6, 0xe9, 0xcd, 0xfc, 0x11, 0x3f, 0xfe, 0x3e, 0x59, 0x7e, + 0x86, 0xf7, 0x00, 0xb2, 0xfd, 0x12, 0xfc, 0xb1, 0x65, 0xc7, 0xb2, 0xca, + 0x84, 0xfc, 0xc6, 0x9f, 0x86, 0x9f, 0x13, 0x9c, 0x22, 0xe6, 0x27, 0xf1, + 0x91, 0x13, 0xf4, 0x9e, 0xfc, 0xfd, 0xd4, 0x6f, 0x59, 0x7d, 0x1f, 0x07, + 0x71, 0x65, 0xff, 0xf8, 0x01, 0xf3, 0x06, 0x51, 0xe8, 0x16, 0x0b, 0x16, + 0x54, 0xc7, 0xf4, 0x44, 0xd7, 0xc6, 0x3d, 0xd3, 0x59, 0x50, 0x8e, 0x97, + 0x85, 0x18, 0xa4, 0x57, 0xfd, 0xe8, 0x91, 0x96, 0x36, 0x16, 0x5f, 0x38, + 0xe5, 0xb2, 0xcb, 0xfe, 0xce, 0xfb, 0x1a, 0x4f, 0xd5, 0x97, 0xf6, 0xf3, + 0xd7, 0xd1, 0xb8, 0xb2, 0x86, 0x7d, 0x58, 0x6f, 0x5e, 0x45, 0x71, 0x42, + 0x36, 0xe2, 0xfd, 0x65, 0xf9, 0xb0, 0x0d, 0x86, 0xb2, 0xfa, 0x50, 0xd7, + 0x59, 0x7e, 0xd7, 0xed, 0x3e, 0x2c, 0xbb, 0xbc, 0x64, 0xa2, 0x2b, 0x05, + 0xdc, 0xa4, 0x42, 0x1a, 0x84, 0x7e, 0x86, 0x16, 0x36, 0xe2, 0xcb, 0xfa, + 0x36, 0xc2, 0x36, 0x16, 0x56, 0x8d, 0xf7, 0x04, 0x6f, 0xfe, 0x82, 0x7f, + 0x47, 0xec, 0xf5, 0xce, 0x24, 0xbd, 0x80, 0x85, 0x95, 0xb2, 0xac, 0x81, + 0xc7, 0xc3, 0x8c, 0xad, 0x21, 0xde, 0x8d, 0x79, 0xb0, 0x05, 0x97, 0xe7, + 0x98, 0xf3, 0x8b, 0x2f, 0xb9, 0x1a, 0x92, 0xcb, 0x0e, 0x71, 0xe4, 0xf0, + 0x9e, 0xa1, 0x11, 0xee, 0xcb, 0x7f, 0xc4, 0x3f, 0x47, 0x7b, 0x0d, 0x59, + 0x70, 0x76, 0x59, 0x7f, 0xbe, 0x97, 0xdc, 0x3e, 0xc2, 0xcb, 0xc7, 0xf7, + 0x16, 0x56, 0x1e, 0x91, 0x9a, 0xd6, 0x23, 0x08, 0xce, 0x3c, 0xd5, 0x76, + 0x01, 0x65, 0xd9, 0xc5, 0x9d, 0x2d, 0xaf, 0x77, 0x3c, 0xb2, 0xb4, 0x78, + 0x21, 0x25, 0xbf, 0xfe, 0x1c, 0xe7, 0x3c, 0xe4, 0x6d, 0x84, 0x6c, 0x2c, + 0xbf, 0xda, 0x6c, 0x7d, 0xd7, 0x02, 0xcb, 0xff, 0xf8, 0xb3, 0xbe, 0xc9, + 0x60, 0x20, 0x1d, 0x27, 0x6a, 0xca, 0xc4, 0x6e, 0x1a, 0x87, 0x0d, 0x2f, + 0xfd, 0xa3, 0x91, 0xf3, 0xe9, 0x19, 0x2c, 0xbe, 0x36, 0xc4, 0xcb, 0x2f, + 0xfe, 0xe1, 0xfc, 0x59, 0x36, 0xa3, 0xbc, 0x59, 0x7d, 0x9b, 0x06, 0x4b, + 0x28, 0xd1, 0x91, 0x31, 0xf7, 0xe4, 0x42, 0xa2, 0xdf, 0xee, 0x44, 0x9f, + 0x67, 0x6a, 0xcb, 0xe7, 0xd3, 0xfc, 0xb2, 0xfe, 0xff, 0x67, 0x94, 0x6e, + 0x2c, 0xbc, 0x31, 0xc2, 0xca, 0x60, 0xfc, 0x3e, 0x22, 0x09, 0x95, 0x42, + 0x62, 0x66, 0x7e, 0xf0, 0xa3, 0xbe, 0xd4, 0x63, 0x56, 0x5d, 0x82, 0xac, + 0xa4, 0xe2, 0x18, 0x5f, 0xdc, 0x12, 0x35, 0x0d, 0x4e, 0x21, 0x85, 0x27, + 0x10, 0xc2, 0x93, 0x88, 0x61, 0x49, 0xc4, 0x30, 0xa4, 0xe2, 0x18, 0x54, + 0x91, 0x72, 0x63, 0x3f, 0x9e, 0x04, 0x66, 0x7c, 0x67, 0x74, 0x66, 0xef, + 0x62, 0x71, 0x0c, 0x2f, 0xe7, 0x7e, 0xcd, 0x0d, 0x4e, 0x21, 0x84, 0xe3, + 0x49, 0x66, 0x5a, 0x71, 0x0c, 0x29, 0x38, 0x86, 0x14, 0x9c, 0x43, 0x0a, + 0x91, 0xb2, 0x31, 0x9a, 0x4e, 0x21, 0x85, 0x27, 0x10, 0xc2, 0x93, 0x88, + 0x61, 0x49, 0xc4, 0x30, 0xa4, 0xe2, 0x18, 0x52, 0x71, 0x0c, 0x2b, 0x64, + 0x4b, 0x0c, 0x64, 0xc6, 0x7f, 0x19, 0xe0, 0xce, 0xf1, 0x9a, 0x4e, 0x21, + 0x85, 0x27, 0x10, 0xc2, 0xa4, 0x6c, 0xb8, 0x33, 0x49, 0xc4, 0x30, 0xa4, + 0xe2, 0x18, 0x52, 0x71, 0x0c, 0x29, 0x38, 0x86, 0x15, 0x23, 0xe4, 0xfc, + 0x67, 0xa3, 0x3b, 0xa3, 0x34, 0x9c, 0x43, 0x0a, 0x4e, 0x21, 0x85, 0x27, + 0x10, 0xc2, 0x93, 0x88, 0x61, 0x5b, 0x1f, 0x23, 0x03, 0x3a, 0x19, 0xf0, + 0xcd, 0x98, 0x4e, 0x21, 0x85, 0x27, 0x10, 0xc2, 0x93, 0x88, 0x61, 0x49, + 0xc4, 0x30, 0xa4, 0xe2, 0x18, 0x50, 0xcf, 0x93, 0xe1, 0x9f, 0xc6, 0x42, + 0x33, 0x49, 0xc4, 0x30, 0xa4, 0xe2, 0x18, 0x52, 0x71, 0x0c, 0x2f, 0xde, + 0x8f, 0xf9, 0x89, 0xc4, 0x30, 0xa4, 0xe2, 0x18, 0x54, 0x91, 0x34, 0x01, + 0x9f, 0x0c, 0xb8, 0xcf, 0xe6, 0xd6, 0x02, 0x71, 0x0c, 0x29, 0x38, 0x86, + 0x14, 0x9c, 0x43, 0x0a, 0x4e, 0x21, 0x85, 0x27, 0x10, 0xc2, 0xa4, 0x7c, + 0x9f, 0x0c, 0x98, 0xce, 0xf1, 0x9a, 0x4e, 0x21, 0x85, 0x27, 0x10, 0xc2, + 0x93, 0x88, 0x61, 0x49, 0xc4, 0x30, 0xa9, 0x1f, 0x20, 0xc6, 0x7c, 0x32, + 0x43, 0x36, 0xf2, 0x71, 0x0c, 0x29, 0x38, 0x86, 0x14, 0x9c, 0x43, 0x0b, + 0x49, 0x38, 0x86, 0x14, 0x9c, 0x43, 0x0f, 0x8b, 0xfa, 0x4e, 0x21, 0x85, + 0x27, 0x10, 0xc2, 0x93, 0x88, 0x61, 0x49, 0xc4, 0x30, 0xad, 0x91, 0xbd, + 0x21, 0x96, 0x0e, 0x00, 0x53, 0x30, 0xcf, 0xe3, 0x3d, 0x19, 0xb6, 0x27, + 0x10, 0xc2, 0x93, 0x88, 0x61, 0x49, 0xc4, 0x30, 0xb4, 0x93, 0x88, 0x61, + 0x49, 0xc4, 0x30, 0xf8, 0xbf, 0xa4, 0xe2, 0x18, 0x52, 0x71, 0x0c, 0x2a, + 0x11, 0x59, 0x21, 0x93, 0x38, 0xd1, 0x4b, 0x46, 0x69, 0x38, 0x86, 0x14, + 0x9c, 0x43, 0x0a, 0x4e, 0x21, 0x85, 0x27, 0x10, 0xc2, 0x93, 0x88, 0x61, + 0x50, 0x7f, 0xbf, 0x0c, 0xe8, 0x65, 0xa3, 0x24, 0x33, 0x49, 0xc4, 0x30, + 0xa4, 0xe2, 0x18, 0x52, 0x71, 0x0c, 0x2b, 0x47, 0x97, 0xc1, 0x9e, 0x8c, + 0xd2, 0x71, 0x0c, 0x29, 0x38, 0x86, 0x14, 0x9c, 0x43, 0x0a, 0x69, 0xe5, + 0x90, 0xcf, 0x46, 0x6c, 0xd4, 0xe2, 0x18, 0x52, 0x71, 0x0c, 0x29, 0x38, + 0x86, 0x15, 0xf9, 0xb2, 0x08, 0xcd, 0x27, 0x10, 0xc2, 0x93, 0x88, 0x61, + 0x49, 0xc4, 0x30, 0xa4, 0xe2, 0x18, 0x54, 0x1f, 0x24, 0xc3, 0x3e, 0x19, + 0x08, 0xcd, 0x43, 0x30, 0x53, 0x68, 0x40, 0xc9, 0x34, 0x6a, 0xb9, 0x0b, + 0x60, 0x42, 0x33, 0xe8, 0x42, 0x9c, 0x29, 0x37, 0x0f, 0xa6, 0x84, 0x26, + 0xa1, 0xb0, 0xd4, 0xaf, 0x42, 0x0d, 0xe1, 0x45, 0xf9, 0xd9, 0x43, 0xf7, + 0x8d, 0x1d, 0x86, 0x50, 0x61, 0x8b, 0xbe, 0x12, 0x62, 0xbd, 0x4f, 0x97, + 0x08, 0xa3, 0xbb, 0x08, 0x6b, 0xf4, 0x8a, 0x33, 0x89, 0xc4, 0x30, 0x66, + 0x9c, 0xbd, 0xe3, 0x86, 0xa7, 0x10, 0xc2, 0xf8, 0xc0, 0xfa, 0x5e, 0x21, + 0x8b, 0xc6, 0x3c, 0x5e, 0x21, 0x8b, 0x33, 0xf9, 0x19, 0x1a, 0x49, 0xf1, + 0x4f, 0x4b, 0xad, 0x1b, 0xd9, 0xf1, 0x22, 0x53, 0xd0, 0xef, 0x19, 0x6c, + 0xb2, 0xfe, 0x31, 0x47, 0xa8, 0xd9, 0x65, 0x48, 0xf2, 0xfc, 0x39, 0x73, + 0xfc, 0xb2, 0xfa, 0x27, 0xe3, 0xab, 0x2f, 0x1e, 0xf6, 0x5a, 0xcb, 0x8f, + 0x75, 0x65, 0x01, 0xb0, 0xc5, 0xfa, 0x9f, 0x55, 0x34, 0x20, 0xfc, 0x44, + 0x42, 0xfd, 0x24, 0xdd, 0x22, 0xbe, 0xc9, 0x9c, 0x45, 0x97, 0xff, 0xfe, + 0xcc, 0x20, 0xf4, 0xfc, 0x41, 0x60, 0xb3, 0xee, 0xc6, 0x69, 0x65, 0x62, + 0x23, 0x67, 0xc8, 0xef, 0x7e, 0x1e, 0x2c, 0xbf, 0xce, 0x42, 0x4d, 0x23, + 0x25, 0x97, 0x7f, 0x0b, 0x2f, 0xed, 0x39, 0x09, 0x1f, 0xac, 0xb9, 0xf4, + 0xb2, 0xc6, 0xb0, 0x05, 0xb5, 0x80, 0xb2, 0xcd, 0x59, 0x66, 0x66, 0x89, + 0xcd, 0x0b, 0xf9, 0x11, 0xc7, 0xc4, 0x11, 0xbf, 0xbe, 0x97, 0xa0, 0xb6, + 0x59, 0x4d, 0x4d, 0x3e, 0x7e, 0x19, 0xfb, 0xaa, 0x37, 0xb4, 0x7b, 0x2c, + 0xbf, 0xd0, 0xdc, 0x9a, 0x0b, 0x65, 0x94, 0xb2, 0xb4, 0x7b, 0x7e, 0x1d, + 0xfc, 0xce, 0xfd, 0x8d, 0xf4, 0x7e, 0xb2, 0xff, 0xe9, 0xce, 0x01, 0xfa, + 0x3f, 0xc2, 0xfd, 0x65, 0xdf, 0xc2, 0xca, 0xc3, 0xde, 0xfd, 0x1e, 0xa4, + 0xab, 0x73, 0x23, 0x6d, 0xfe, 0x12, 0xfd, 0x30, 0x0c, 0x21, 0xaf, 0xfe, + 0x22, 0x8d, 0x8b, 0x0f, 0x7c, 0x4f, 0xac, 0xbd, 0x1f, 0x71, 0x65, 0x39, + 0xf1, 0xf1, 0x1a, 0xf3, 0xea, 0x16, 0x5f, 0x8e, 0x7d, 0xcb, 0xf5, 0x97, + 0xe3, 0xfb, 0x8f, 0xf2, 0xca, 0x91, 0xf7, 0x34, 0x6f, 0x85, 0x57, 0xdb, + 0xdb, 0x06, 0xb2, 0xff, 0x84, 0x71, 0xf3, 0x1b, 0x1b, 0x8b, 0x2f, 0x67, + 0xc2, 0xac, 0xbb, 0xfc, 0xd1, 0xed, 0x11, 0xe5, 0xff, 0xe3, 0xdc, 0x0b, + 0x07, 0xf7, 0x32, 0x68, 0xea, 0xca, 0xf8, 0xff, 0x1a, 0x5b, 0x70, 0x61, + 0x65, 0xec, 0xd4, 0x96, 0x50, 0xcd, 0x96, 0xf1, 0x6b, 0xc3, 0x72, 0x59, + 0x46, 0x6f, 0x9c, 0x8e, 0xfd, 0x00, 0x72, 0x61, 0x65, 0xff, 0xcf, 0xad, + 0x3f, 0xf0, 0xcc, 0x51, 0x45, 0x59, 0x7a, 0x47, 0xfa, 0xcb, 0xff, 0x31, + 0x9f, 0x74, 0xfb, 0xa0, 0xb5, 0x65, 0xa2, 0x72, 0x2a, 0x1d, 0x2b, 0xa3, + 0xb5, 0x0a, 0xb7, 0xf0, 0xbd, 0xe1, 0xf3, 0xc8, 0x49, 0xf4, 0x7c, 0x30, + 0xcf, 0xbf, 0xf8, 0xb0, 0xfd, 0x1f, 0x7f, 0x9d, 0xe2, 0xcb, 0xff, 0x82, + 0x24, 0xd3, 0xa0, 0x47, 0x04, 0x79, 0x65, 0xff, 0xdb, 0xb1, 0xa3, 0x6f, + 0x31, 0xb1, 0xb8, 0xb2, 0x99, 0x2e, 0xbe, 0x2a, 0x25, 0x07, 0x6d, 0x19, + 0x2c, 0xa5, 0x22, 0x8e, 0x3d, 0xfc, 0x8d, 0x8d, 0x88, 0x4c, 0x02, 0x50, + 0xb7, 0xd1, 0xb5, 0x9c, 0xaf, 0xcd, 0xc8, 0x71, 0xcd, 0x0e, 0x3d, 0x42, + 0x15, 0xb0, 0xfe, 0xf4, 0xa0, 0x97, 0xac, 0x3e, 0x3f, 0x8c, 0x20, 0xa5, + 0x80, 0xf2, 0x17, 0xfd, 0x96, 0xdd, 0x3e, 0xca, 0x22, 0x26, 0xea, 0x4d, + 0xef, 0xf6, 0xc5, 0x97, 0x9b, 0xc0, 0x2c, 0xbc, 0x40, 0x85, 0x97, 0xd9, + 0xd7, 0xf9, 0x65, 0x4e, 0x3d, 0xa3, 0x1d, 0xd0, 0xdd, 0xf4, 0xb3, 0x50, + 0xb2, 0xfe, 0x15, 0xf5, 0xa7, 0xf9, 0x65, 0xff, 0xfb, 0x9a, 0xd1, 0xcd, + 0xcd, 0x47, 0x4c, 0x06, 0x35, 0x94, 0xd4, 0x6b, 0x7e, 0x60, 0x44, 0x22, + 0x97, 0xde, 0xec, 0x71, 0x65, 0xef, 0xe7, 0xc9, 0x65, 0x34, 0xde, 0x10, + 0xe5, 0xed, 0x8c, 0x6b, 0x2c, 0x15, 0x96, 0xfc, 0xcd, 0x71, 0x0e, 0xd9, + 0x92, 0xb2, 0xfb, 0x46, 0x4c, 0x2c, 0xbf, 0xdd, 0x80, 0x83, 0xc7, 0xa5, + 0x97, 0xf6, 0x03, 0xd1, 0xf4, 0x96, 0x5f, 0xcd, 0xe1, 0xb1, 0xd1, 0x56, + 0x5f, 0xa3, 0xef, 0x44, 0x96, 0x54, 0xf6, 0x8f, 0x0d, 0x0a, 0x91, 0x17, + 0x4c, 0xc4, 0x2e, 0xdd, 0x30, 0xbf, 0xec, 0xf8, 0xb3, 0xbd, 0xcd, 0x96, + 0x5d, 0xf7, 0x56, 0x5f, 0xb0, 0xb6, 0x3d, 0x2c, 0xbf, 0x75, 0xc8, 0x38, + 0xb2, 0xff, 0x73, 0x1a, 0x7d, 0xf3, 0xac, 0xb4, 0x62, 0x25, 0xf4, 0x30, + 0x44, 0xfd, 0x26, 0xbd, 0x39, 0xa6, 0xb2, 0xfe, 0xc9, 0xb5, 0x1d, 0xe2, + 0xcb, 0x89, 0xab, 0x2a, 0x47, 0xc4, 0x43, 0xdc, 0x2e, 0xbd, 0xbb, 0xa8, + 0x59, 0x7f, 0xde, 0x3d, 0x79, 0xd9, 0x22, 0x8a, 0xb2, 0xff, 0xf1, 0x38, + 0xbc, 0x2c, 0xfa, 0x5d, 0x0e, 0xcb, 0x2f, 0xf6, 0x8e, 0x62, 0xcd, 0xee, + 0xb2, 0xdc, 0x9c, 0x98, 0x64, 0x17, 0x60, 0xfc, 0xc7, 0xfa, 0x4c, 0xbf, + 0xda, 0x2c, 0x1f, 0xb0, 0x96, 0x5f, 0x39, 0x07, 0x16, 0x5f, 0x87, 0xce, + 0x43, 0x56, 0x57, 0xc8, 0xcb, 0x75, 0x2f, 0xcc, 0x48, 0x82, 0xff, 0x8a, + 0x1f, 0x6f, 0x46, 0xbf, 0x59, 0x7f, 0x8f, 0x45, 0xde, 0xe6, 0xcb, 0x2e, + 0x7d, 0xeb, 0x2f, 0xe9, 0x11, 0xcb, 0xd8, 0xb2, 0xfd, 0xb1, 0xea, 0x24, + 0xb2, 0x98, 0x44, 0xfc, 0xc6, 0x7a, 0x18, 0x22, 0xcb, 0xf0, 0x7b, 0x3f, + 0x9d, 0x59, 0x78, 0x66, 0xc2, 0xca, 0x83, 0xc8, 0xc2, 0xbb, 0xf9, 0xfc, + 0x26, 0x9f, 0xf5, 0x97, 0xb5, 0xf8, 0x8b, 0x2f, 0xfe, 0x3e, 0xc7, 0x79, + 0xe7, 0x3f, 0x05, 0x65, 0x41, 0xf1, 0x38, 0xfd, 0xf1, 0x10, 0x64, 0xb2, + 0xff, 0x10, 0x79, 0x8d, 0x80, 0x2c, 0xbf, 0xf7, 0xa3, 0x5f, 0x96, 0x0a, + 0xff, 0xac, 0xbd, 0x99, 0x32, 0xcb, 0x63, 0x08, 0x8e, 0xf1, 0x97, 0xe8, + 0x17, 0xa3, 0xe1, 0x56, 0x5f, 0xb4, 0x16, 0xb9, 0x2c, 0xae, 0x9e, 0x28, + 0x47, 0xaf, 0x9b, 0x19, 0xb2, 0xcb, 0xf6, 0x6f, 0x28, 0xf9, 0x65, 0x19, + 0xe5, 0xf0, 0x8a, 0xfa, 0x0b, 0xa0, 0x59, 0x43, 0x5c, 0x09, 0xc8, 0x6c, + 0x6a, 0x10, 0xcd, 0x20, 0xf4, 0x24, 0x5c, 0x80, 0xa1, 0x5f, 0xc7, 0xce, + 0xb6, 0xcf, 0x90, 0xdf, 0xa7, 0xfd, 0x9f, 0xba, 0xcb, 0xfd, 0xf8, 0x98, + 0x43, 0xf4, 0x2c, 0xa8, 0x4c, 0x05, 0xb0, 0xa2, 0x72, 0xbb, 0xfb, 0x98, + 0xd3, 0xf4, 0x2c, 0xbd, 0xf4, 0xb8, 0xb2, 0xbe, 0x3c, 0xad, 0x16, 0x5e, + 0xe7, 0xe2, 0xac, 0xbe, 0xfb, 0x91, 0xf2, 0xcb, 0xf9, 0xe5, 0xde, 0x43, + 0x0b, 0x2d, 0x23, 0x3d, 0x26, 0x92, 0x54, 0x22, 0xef, 0x08, 0xdd, 0xc6, + 0xff, 0x85, 0x2c, 0xd7, 0x3d, 0x80, 0x59, 0x7f, 0xf1, 0x67, 0x30, 0x73, + 0x4a, 0x35, 0xb2, 0xca, 0x33, 0xfe, 0xe9, 0xcd, 0xf6, 0x0c, 0xc9, 0x65, + 0xf0, 0x5f, 0x52, 0x59, 0x7d, 0x01, 0x65, 0xf1, 0x25, 0xfa, 0x4c, 0xc5, + 0x14, 0x55, 0x94, 0x47, 0xa8, 0x12, 0x6b, 0xff, 0xef, 0x1b, 0x0c, 0x47, + 0x79, 0x04, 0x59, 0xd5, 0x97, 0xc5, 0x8d, 0x85, 0x97, 0xfa, 0x3a, 0xff, + 0xbe, 0x69, 0x65, 0xff, 0xfd, 0xd2, 0xcf, 0xdc, 0xbf, 0xe9, 0x3f, 0xe2, + 0xe7, 0x96, 0x5c, 0x40, 0x02, 0x3f, 0x4d, 0x3d, 0xa4, 0x02, 0x19, 0x5e, + 0xeb, 0x7a, 0xb2, 0xfc, 0x13, 0x23, 0xe2, 0xca, 0x73, 0xc3, 0xe0, 0xed, + 0xfb, 0x9a, 0x87, 0x02, 0xcb, 0xf4, 0x10, 0x23, 0x7a, 0xca, 0xc3, 0xcf, + 0xf1, 0x3d, 0x4e, 0x55, 0xa0, 0x32, 0x0c, 0x76, 0x78, 0xc7, 0xbf, 0x84, + 0x5f, 0x5c, 0x2f, 0xf7, 0xe5, 0x9b, 0xf4, 0x7c, 0x59, 0x7f, 0x84, 0x22, + 0x71, 0x5f, 0xcb, 0x29, 0x92, 0xd8, 0xde, 0xc4, 0x69, 0xd8, 0xf5, 0xf2, + 0x71, 0xc6, 0x2d, 0xa5, 0xf6, 0xc3, 0x41, 0xe5, 0x3c, 0xff, 0x3a, 0x8e, + 0x51, 0x9c, 0xf2, 0x15, 0x61, 0x95, 0xe3, 0xbd, 0x94, 0x53, 0x5b, 0xcc, + 0x89, 0xe2, 0xc9, 0x59, 0x7a, 0x44, 0xeb, 0x2f, 0xf7, 0x61, 0xbf, 0x4b, + 0x3a, 0xb2, 0xdf, 0x32, 0x0f, 0xea, 0x0a, 0xf0, 0x6e, 0xfd, 0xbb, 0x12, + 0xd4, 0x2c, 0xbd, 0xd7, 0xfd, 0x65, 0xfb, 0x5b, 0x46, 0xb6, 0x59, 0x7f, + 0x67, 0x78, 0x12, 0xea, 0xca, 0x83, 0xd7, 0xc2, 0xab, 0xff, 0x41, 0x77, + 0xc1, 0x79, 0x4a, 0x16, 0x5b, 0x65, 0x97, 0xed, 0x47, 0x8d, 0x85, 0x94, + 0xc1, 0xba, 0x00, 0x95, 0xf8, 0x3f, 0xe1, 0x01, 0x65, 0xed, 0x44, 0xcb, + 0x2f, 0x13, 0xcc, 0xb2, 0xfd, 0xc1, 0x5f, 0xee, 0x2c, 0xa3, 0x3c, 0x67, + 0x1c, 0xbe, 0xe7, 0x61, 0xab, 0x2f, 0xfc, 0x50, 0xc7, 0x9f, 0xa2, 0x67, + 0xeb, 0x2f, 0x73, 0x58, 0xb2, 0xf1, 0x64, 0x96, 0x5f, 0xb5, 0xf9, 0x07, + 0xf5, 0x95, 0x07, 0x8b, 0x83, 0x74, 0x68, 0x81, 0xe3, 0x0d, 0xb7, 0x16, + 0x5f, 0xd8, 0x24, 0x4c, 0x7c, 0x59, 0x44, 0x78, 0x5d, 0x14, 0xa8, 0x56, + 0xd5, 0xb1, 0x54, 0x9d, 0x06, 0x41, 0x8e, 0xfa, 0x22, 0x69, 0x47, 0x98, + 0xff, 0x20, 0x22, 0x2e, 0xc3, 0x07, 0x7b, 0x25, 0xff, 0x41, 0xfa, 0x1b, + 0xb6, 0x0a, 0xb2, 0xff, 0xdc, 0x83, 0x19, 0x44, 0x8f, 0xf5, 0x97, 0xef, + 0x1e, 0xce, 0x4b, 0x2f, 0xc1, 0x61, 0xcb, 0xf5, 0x97, 0xf7, 0x35, 0x18, + 0x33, 0x59, 0x77, 0x8d, 0x65, 0x42, 0x24, 0xbc, 0x4f, 0xbc, 0xa7, 0x74, + 0xb2, 0xff, 0xb6, 0x2c, 0x97, 0xb3, 0xfe, 0x2c, 0xbf, 0xe8, 0x20, 0x4e, + 0x19, 0x38, 0xab, 0x2f, 0xfd, 0x85, 0xf4, 0xb9, 0xa0, 0xc7, 0xeb, 0x2f, + 0x73, 0x18, 0x59, 0x73, 0xb5, 0x65, 0xb3, 0xa6, 0xcf, 0x78, 0xed, 0x6c, + 0x8d, 0x53, 0x3a, 0x6b, 0x9d, 0xff, 0xb5, 0xe1, 0x5c, 0x7b, 0xfb, 0x80, + 0x59, 0x7b, 0xd9, 0xba, 0xb2, 0xfa, 0x4f, 0xde, 0x2c, 0xb7, 0x67, 0x1e, + 0x0c, 0xc3, 0xf4, 0xe8, 0xae, 0x28, 0x41, 0xde, 0x1c, 0x6f, 0x59, 0x74, + 0x4c, 0xb2, 0xff, 0xe2, 0x81, 0x46, 0x51, 0xf4, 0x8c, 0x96, 0x56, 0x8f, + 0x68, 0x85, 0xef, 0xcd, 0xcf, 0x3e, 0xea, 0xca, 0xc3, 0xcb, 0x32, 0x1b, + 0xf7, 0xc0, 0x3e, 0xf1, 0x65, 0xff, 0xd3, 0xa6, 0x94, 0x6b, 0x69, 0xc2, + 0xe7, 0x96, 0x54, 0x1f, 0xab, 0x94, 0xd4, 0x27, 0x3c, 0x32, 0x6f, 0x43, + 0x0c, 0xa1, 0x2b, 0x7f, 0xbd, 0x9d, 0xc0, 0xeb, 0x65, 0x97, 0xdf, 0x00, + 0xfe, 0x59, 0x4d, 0x3d, 0x8e, 0x1a, 0x5f, 0xe2, 0x89, 0x4d, 0xe8, 0xd9, + 0x65, 0xc0, 0x35, 0x97, 0xfc, 0x65, 0x34, 0x03, 0x59, 0xf2, 0xca, 0x73, + 0xcf, 0xe0, 0xb5, 0x0d, 0x14, 0x9d, 0x84, 0x1d, 0xf8, 0x6c, 0x30, 0x1f, + 0x96, 0x59, 0x87, 0x3d, 0x40, 0x94, 0x5f, 0xf4, 0x77, 0x34, 0x07, 0x70, + 0x2a, 0x2f, 0x85, 0xfb, 0x35, 0x1f, 0x49, 0x65, 0xd0, 0xd0, 0x1f, 0x67, + 0x51, 0x2f, 0xf9, 0xd8, 0xe1, 0xf0, 0xfe, 0xea, 0xca, 0xf1, 0xf3, 0x91, + 0x6d, 0xff, 0xf8, 0x81, 0x3b, 0xd0, 0x7a, 0x36, 0x9c, 0xfc, 0x35, 0x65, + 0xe7, 0xd6, 0xca, 0x8b, 0xfd, 0x7f, 0xf6, 0x17, 0xe2, 0xe7, 0xdd, 0xec, + 0x35, 0x65, 0xff, 0x8b, 0xba, 0xc8, 0xfa, 0x46, 0xd5, 0x97, 0xb3, 0x6d, + 0xd5, 0x95, 0x09, 0xa3, 0xe1, 0x08, 0x16, 0x3c, 0x54, 0xe8, 0xc4, 0x7d, + 0x7b, 0xa6, 0x2a, 0xcb, 0xf9, 0xf6, 0x10, 0x6f, 0xb8, 0xb2, 0xba, 0x79, + 0xe1, 0x1d, 0xbf, 0xda, 0xd6, 0x4c, 0xd8, 0xe2, 0xcb, 0xfe, 0x7e, 0xf0, + 0xcb, 0xe9, 0x35, 0x65, 0xff, 0x1e, 0xb6, 0x0f, 0xff, 0xc7, 0x56, 0x5f, + 0xf4, 0x66, 0xa7, 0x48, 0xfe, 0x92, 0xca, 0x92, 0x60, 0xd8, 0x45, 0xf9, + 0xa7, 0x0e, 0x7a, 0x79, 0x7f, 0xff, 0xbc, 0xfc, 0x38, 0xe4, 0xee, 0xfb, + 0x1b, 0x80, 0x7d, 0x2c, 0xba, 0x37, 0x56, 0x5f, 0x73, 0x8e, 0xd5, 0x95, + 0xe4, 0x4e, 0x7e, 0xc3, 0xd1, 0x9b, 0xfd, 0xf7, 0x44, 0xf7, 0xb3, 0x71, + 0x65, 0xfb, 0x0f, 0x68, 0x61, 0x65, 0xb6, 0xc3, 0xe1, 0xf1, 0xcd, 0xf7, + 0xd2, 0xeb, 0xac, 0xbf, 0xfe, 0x18, 0x3c, 0x65, 0x9b, 0xde, 0x5c, 0x31, + 0xac, 0xbf, 0xb9, 0xd2, 0x8c, 0xf9, 0x65, 0x62, 0x28, 0x1c, 0x8c, 0x2a, + 0x17, 0xff, 0xb3, 0x9e, 0x73, 0xec, 0x34, 0x9d, 0x85, 0x97, 0xef, 0xf9, + 0xdc, 0xf2, 0xcb, 0xf8, 0x5e, 0xe7, 0xa5, 0x8b, 0x2a, 0x0f, 0x5d, 0xca, + 0x6a, 0x13, 0xb5, 0x94, 0x32, 0x30, 0xb8, 0xa1, 0x3f, 0x7f, 0x4e, 0x1e, + 0x67, 0xfc, 0x59, 0x7f, 0xfe, 0xee, 0x6b, 0x63, 0xe1, 0xef, 0xf1, 0xe7, + 0xdd, 0x59, 0x68, 0x6a, 0x22, 0x08, 0xc2, 0xfd, 0xcc, 0x6b, 0xfc, 0xb2, + 0xf3, 0x75, 0xb2, 0xca, 0xc3, 0xc6, 0x32, 0x8b, 0xff, 0x76, 0x39, 0xc8, + 0x3d, 0x9f, 0xab, 0x2f, 0xf8, 0xf0, 0x86, 0xc1, 0xe6, 0x96, 0x51, 0xa6, + 0x05, 0xa6, 0xde, 0x90, 0x6e, 0x9f, 0x5f, 0xf7, 0x33, 0x6e, 0x19, 0x3e, + 0xcb, 0x2e, 0xcf, 0x96, 0x56, 0x1e, 0x87, 0x4e, 0x6f, 0xe7, 0xd7, 0xd2, + 0xce, 0xac, 0xbf, 0xf7, 0x78, 0x7a, 0xe9, 0x05, 0xe4, 0xb2, 0xff, 0xfc, + 0x7c, 0xc1, 0xfb, 0x3a, 0x79, 0xcd, 0xb0, 0x55, 0x97, 0xff, 0x9b, 0x13, + 0xf8, 0x12, 0xcc, 0xdf, 0x1f, 0x2c, 0xbf, 0xf4, 0x66, 0xb3, 0x5f, 0xb4, + 0xf8, 0xb2, 0xf3, 0xfd, 0xba, 0xb2, 0xfe, 0x7e, 0xf2, 0x33, 0x65, 0x95, + 0x09, 0xcc, 0xe1, 0x70, 0x0f, 0x8d, 0x54, 0x93, 0x77, 0x9f, 0x0a, 0x41, + 0x7e, 0xfd, 0xfe, 0x96, 0x2c, 0xbf, 0xd1, 0xf7, 0x0c, 0xbe, 0x92, 0xca, + 0x83, 0xdd, 0x69, 0x4d, 0xff, 0x06, 0x1b, 0xcc, 0x6c, 0x6e, 0x2c, 0xbf, + 0xf6, 0xb6, 0xc1, 0xe7, 0xbd, 0x9b, 0x8b, 0x2c, 0xc2, 0xcb, 0xfd, 0xde, + 0x09, 0xbe, 0x33, 0xe5, 0x95, 0x07, 0x92, 0x42, 0x57, 0xfe, 0xd7, 0x1a, + 0x26, 0x68, 0xe2, 0x65, 0x95, 0x87, 0xc0, 0x12, 0x0a, 0xc4, 0xc3, 0x39, + 0x0e, 0xbb, 0xfb, 0x8f, 0x22, 0x86, 0xac, 0xbc, 0x51, 0xb8, 0xb2, 0xff, + 0xfa, 0x51, 0xad, 0xba, 0x6c, 0x73, 0x8e, 0x52, 0x59, 0x7f, 0x6d, 0xcc, + 0x6c, 0x6e, 0x2c, 0xa9, 0x91, 0x04, 0x22, 0x8d, 0x69, 0x1e, 0x3c, 0x2c, + 0x16, 0x14, 0x17, 0x8f, 0xc6, 0xb2, 0xe1, 0xc9, 0x65, 0xe2, 0xc9, 0x2c, + 0xb4, 0xb4, 0x6c, 0xba, 0x2f, 0x7c, 0xde, 0x9e, 0xcb, 0x2b, 0x0f, 0x28, + 0xc9, 0xef, 0xfe, 0xdf, 0xd6, 0x20, 0xa5, 0x9e, 0x36, 0xac, 0xbb, 0x6e, + 0xac, 0xbf, 0xdb, 0xfc, 0xf2, 0x8c, 0x25, 0x95, 0x07, 0x97, 0x83, 0x17, + 0xd2, 0x7d, 0x49, 0x65, 0xff, 0xe8, 0xd3, 0xf4, 0x3d, 0x3e, 0xf3, 0xc6, + 0xb2, 0xd2, 0x98, 0xfa, 0xfc, 0x45, 0x7f, 0x60, 0xa2, 0x79, 0xfa, 0xb2, + 0xfe, 0x93, 0x7a, 0x41, 0x99, 0x65, 0xff, 0xf0, 0x92, 0x8d, 0xe6, 0x5f, + 0xe8, 0xe1, 0xb8, 0x92, 0xb4, 0x88, 0x0e, 0x97, 0xdf, 0x78, 0x4f, 0xba, + 0xb2, 0xfd, 0x8d, 0xc3, 0xde, 0xb2, 0xf6, 0xd3, 0x6e, 0x2c, 0xb0, 0xab, + 0x2a, 0x13, 0x7c, 0xd8, 0xa7, 0x21, 0x5e, 0x02, 0x33, 0x25, 0x09, 0x44, + 0xf9, 0x15, 0xdd, 0xc5, 0x97, 0xed, 0x1e, 0xce, 0xd5, 0x4c, 0x26, 0xbe, + 0xe8, 0x61, 0xd5, 0x30, 0x9a, 0xef, 0xe1, 0x54, 0x09, 0xaf, 0xf1, 0x3b, + 0x1d, 0x8d, 0x7e, 0xaa, 0x04, 0xd7, 0xfb, 0x99, 0xe3, 0xe0, 0x76, 0x54, + 0xc2, 0x6b, 0xb0, 0x6a, 0x98, 0x4d, 0x70, 0xa2, 0xae, 0x61, 0x35, 0x62, + 0x6a, 0x5f, 0x1a, 0x99, 0x73, 0x49, 0x38, 0x83, 0xbd, 0x04, 0x52, 0x3b, + 0x75, 0x33, 0x09, 0x8c, 0xcf, 0x9e, 0xbe, 0x54, 0x02, 0x2c, 0x79, 0xf7, + 0xd8, 0x30, 0x92, 0xca, 0x33, 0xce, 0x72, 0xdb, 0xff, 0xf7, 0xed, 0x79, + 0x73, 0xd1, 0xbf, 0x04, 0x1b, 0xc9, 0x65, 0x42, 0xf5, 0xc1, 0x9b, 0x7a, + 0x12, 0xee, 0x40, 0x50, 0x91, 0xe4, 0xa0, 0x7e, 0xca, 0xba, 0x09, 0x05, + 0xff, 0xda, 0x91, 0x3b, 0x13, 0x48, 0xf5, 0x25, 0x97, 0xcf, 0xbf, 0x05, + 0x59, 0x7f, 0xfe, 0xf3, 0xcb, 0xd1, 0x07, 0xde, 0x19, 0x7d, 0x25, 0x97, + 0xa6, 0x8e, 0x2c, 0xbc, 0x5f, 0xb5, 0x65, 0xff, 0x40, 0x7a, 0x47, 0xbc, + 0x46, 0xac, 0xba, 0x1a, 0xb2, 0xec, 0xe4, 0x22, 0x2f, 0x07, 0x74, 0x3b, + 0x3e, 0x77, 0x58, 0x9c, 0x96, 0x91, 0x9c, 0x90, 0xa1, 0xbf, 0x7f, 0x74, + 0x2f, 0xce, 0x75, 0x65, 0xfb, 0x91, 0x9f, 0xc2, 0xcb, 0xf3, 0xff, 0xe2, + 0xcf, 0x8f, 0x57, 0xa5, 0xd7, 0xd8, 0x7a, 0x61, 0x65, 0xdb, 0x69, 0x65, + 0xdf, 0xcc, 0xb2, 0xff, 0xe6, 0xcd, 0x27, 0x2d, 0x87, 0x05, 0xb2, 0xca, + 0x83, 0xf7, 0x18, 0xc6, 0x0c, 0xde, 0xce, 0x49, 0x65, 0xf1, 0xf9, 0xda, + 0xb2, 0xfb, 0x51, 0xcd, 0x96, 0x56, 0x8f, 0x83, 0xa3, 0x82, 0x10, 0xd4, + 0x37, 0xd6, 0x7b, 0x46, 0x1e, 0x39, 0x4f, 0x99, 0x09, 0xe6, 0x23, 0x1a, + 0x04, 0xa4, 0x2f, 0xa3, 0xa9, 0x38, 0x73, 0xcd, 0x29, 0x1f, 0x51, 0xe7, + 0xb6, 0x12, 0x1e, 0x8e, 0xeb, 0xf8, 0x60, 0x91, 0x0f, 0x23, 0x47, 0xec, + 0xfe, 0x8e, 0xf9, 0x43, 0x42, 0xc2, 0x56, 0x7c, 0xfc, 0x48, 0x4c, 0xee, + 0xc2, 0x36, 0xfb, 0x66, 0xf7, 0x8b, 0x2f, 0x46, 0x12, 0xcb, 0xb3, 0x8b, + 0x2a, 0x46, 0xc3, 0xf1, 0xab, 0xfa, 0x53, 0x4a, 0x0b, 0xab, 0x2f, 0xec, + 0x91, 0x05, 0xf8, 0xb2, 0xfb, 0xee, 0x1c, 0x2c, 0xbf, 0xd8, 0x5b, 0xbd, + 0x32, 0x61, 0x65, 0x7c, 0x8b, 0x1d, 0x17, 0x78, 0xb3, 0xf2, 0x2b, 0xec, + 0xd1, 0xb0, 0xb2, 0xf0, 0xbb, 0x35, 0x65, 0xff, 0x7a, 0x1a, 0x4f, 0x2c, + 0xf2, 0xca, 0x84, 0x5b, 0x8c, 0xff, 0x08, 0xb8, 0x3f, 0x7f, 0x7a, 0x04, + 0x2f, 0xbf, 0x59, 0x76, 0x6e, 0xac, 0xbe, 0x8f, 0x09, 0xc5, 0x95, 0x3c, + 0x9b, 0xc9, 0x0c, 0xde, 0xcc, 0x15, 0x65, 0xc6, 0xc2, 0xca, 0xd8, 0xd9, + 0x98, 0xe5, 0xfb, 0xb9, 0x31, 0xb5, 0x65, 0xfa, 0x3e, 0xff, 0xf8, 0x59, + 0x50, 0x7a, 0x44, 0x51, 0x7e, 0x8d, 0xf0, 0x5d, 0x59, 0x7e, 0x3d, 0xfd, + 0x3d, 0x96, 0x5f, 0xbb, 0xe8, 0xd4, 0x96, 0x5f, 0xfb, 0x1b, 0x05, 0x1f, + 0xb5, 0xe4, 0xb2, 0xff, 0xcd, 0x23, 0x62, 0x3b, 0xc3, 0xd2, 0xcb, 0xe9, + 0x77, 0x00, 0xb2, 0xb0, 0xf8, 0x1c, 0xfa, 0xe2, 0x85, 0x97, 0xfd, 0xe7, + 0x94, 0x4c, 0x50, 0xd5, 0x97, 0xe2, 0xc1, 0x32, 0x65, 0x97, 0xff, 0xf7, + 0xb0, 0x1f, 0xc3, 0x73, 0xa7, 0xcc, 0xc2, 0x61, 0x65, 0xff, 0xc6, 0xd1, + 0x85, 0xf5, 0x2c, 0xfb, 0xab, 0x2c, 0x58, 0x89, 0xf0, 0x2d, 0x5f, 0xf9, + 0xcb, 0xff, 0xbb, 0xa8, 0xc1, 0x56, 0x5f, 0xfb, 0x9e, 0x39, 0xdf, 0x4a, + 0x33, 0x65, 0x96, 0xcd, 0xc4, 0x41, 0x7e, 0x81, 0x7f, 0xde, 0x76, 0xf8, + 0xe3, 0xe9, 0x2c, 0xbe, 0xf3, 0xbb, 0x56, 0x5f, 0x3f, 0xbc, 0x6b, 0x28, + 0x8f, 0x0b, 0x79, 0x0d, 0xf8, 0xa5, 0x3e, 0xfb, 0x2c, 0xa8, 0x3c, 0xe1, + 0x08, 0xea, 0x13, 0xc0, 0x94, 0x2a, 0x4c, 0xb3, 0xf8, 0x64, 0xdc, 0xc1, + 0xac, 0xad, 0x97, 0x22, 0x46, 0x40, 0x02, 0x8f, 0x8a, 0xb7, 0x0a, 0x35, + 0x09, 0xd6, 0x90, 0x78, 0x54, 0x8e, 0x3b, 0x2a, 0x1e, 0x7d, 0x1e, 0xff, + 0x7b, 0xe9, 0x73, 0xd9, 0xb2, 0xcb, 0xfe, 0x7f, 0x4c, 0x65, 0xec, 0xf9, + 0x65, 0x41, 0xf7, 0xe1, 0xb5, 0xe0, 0xfd, 0xb2, 0xcb, 0xf4, 0xd2, 0x8e, + 0xf1, 0x65, 0xdc, 0xfd, 0x65, 0x78, 0xf8, 0x3f, 0x1f, 0x9f, 0x29, 0xbf, + 0xff, 0xfe, 0xf6, 0x17, 0xf8, 0x5d, 0xf6, 0x7a, 0x32, 0x63, 0xd4, 0xde, + 0x3f, 0xba, 0xb2, 0xfe, 0xd1, 0x83, 0xd9, 0x32, 0xcb, 0xff, 0xe2, 0xc9, + 0x9f, 0xfc, 0xec, 0x6f, 0x32, 0xfd, 0x65, 0x34, 0xff, 0xfa, 0x5d, 0x58, + 0x98, 0xfb, 0xc3, 0xf6, 0xf8, 0xa3, 0x05, 0x59, 0x7b, 0xee, 0x3a, 0xcb, + 0xee, 0x46, 0xa1, 0x65, 0x41, 0xbe, 0xe8, 0xed, 0x43, 0xad, 0xad, 0xda, + 0x15, 0xb2, 0x39, 0x1c, 0x33, 0xf2, 0xbe, 0xf4, 0x04, 0x72, 0xbf, 0x2a, + 0x1c, 0x71, 0x5b, 0x87, 0x73, 0x36, 0x69, 0x65, 0xe7, 0x3f, 0x0a, 0x31, + 0xde, 0xc2, 0x00, 0x31, 0xa9, 0x6f, 0x27, 0x11, 0x7e, 0xff, 0xf8, 0xcb, + 0x1b, 0x02, 0x10, 0x64, 0x58, 0xd5, 0x97, 0xfc, 0x33, 0xc2, 0x0c, 0xb3, + 0x8b, 0x2f, 0xfb, 0x5a, 0x80, 0x7b, 0xe7, 0xdc, 0x59, 0x78, 0xa3, 0x8b, + 0x2f, 0xb0, 0xb1, 0xab, 0x29, 0x65, 0x41, 0xe3, 0x48, 0x6c, 0x24, 0x17, + 0xf0, 0x02, 0xe3, 0x6c, 0x2c, 0xbf, 0xef, 0x1c, 0xbc, 0xf2, 0x36, 0xac, + 0xbf, 0xf7, 0x0c, 0xbe, 0x97, 0x4f, 0x86, 0xb2, 0xb0, 0xfd, 0xba, 0x71, + 0x7f, 0x3f, 0x7d, 0x01, 0x65, 0xac, 0xbf, 0xf1, 0xb7, 0x07, 0xe3, 0xe1, + 0x62, 0xcb, 0xe6, 0xc0, 0xe1, 0x65, 0x11, 0xee, 0xf0, 0xf2, 0xa4, 0xaa, + 0xa3, 0x13, 0x4c, 0xde, 0x68, 0x41, 0xe8, 0xb9, 0xb0, 0xa3, 0x22, 0x1e, + 0xc2, 0x3a, 0xfb, 0xd9, 0xfb, 0xac, 0xbe, 0x28, 0xd4, 0x96, 0x5f, 0xf7, + 0xa2, 0x46, 0x44, 0x1f, 0x96, 0x5f, 0xf4, 0x48, 0xfb, 0x28, 0x2f, 0xd6, + 0x5f, 0xf4, 0x67, 0x44, 0xff, 0xf8, 0xf9, 0x65, 0xec, 0x26, 0x16, 0x5b, + 0x50, 0x8e, 0x9c, 0x21, 0xd1, 0xc3, 0x4e, 0x19, 0x67, 0x97, 0xf1, 0x40, + 0x35, 0x12, 0x59, 0x7f, 0xf9, 0xcf, 0xb2, 0x09, 0x77, 0x9e, 0x79, 0x2c, + 0x10, 0xd6, 0x5d, 0x1e, 0x59, 0x5e, 0x3f, 0x0d, 0xeb, 0x57, 0xfe, 0xe0, + 0x9d, 0x32, 0x0c, 0xb3, 0x8b, 0x2e, 0x1f, 0x16, 0x56, 0xe1, 0xfd, 0x78, + 0x90, 0x8f, 0xef, 0xff, 0xec, 0xfb, 0x38, 0xe5, 0xe3, 0x8e, 0xf8, 0x2e, + 0xd5, 0x95, 0x39, 0x57, 0xec, 0x46, 0x16, 0xf1, 0xb4, 0x11, 0x8d, 0xe6, + 0x9e, 0x2c, 0xbf, 0x05, 0xa7, 0xe8, 0x59, 0x7e, 0xcd, 0x02, 0x31, 0x65, + 0x11, 0xe6, 0x88, 0x4f, 0x7f, 0xd8, 0xdc, 0xd1, 0xec, 0xed, 0x59, 0x7e, + 0xeb, 0xbb, 0x78, 0xb2, 0xec, 0xd9, 0x65, 0xff, 0x14, 0x7d, 0x3e, 0xc7, + 0x73, 0xcb, 0x2e, 0xec, 0xfa, 0xcb, 0x3b, 0x4f, 0x5c, 0x8f, 0x6f, 0xff, + 0xce, 0x5d, 0x77, 0xf1, 0x47, 0x78, 0x2e, 0x79, 0x65, 0xfe, 0x13, 0x59, + 0xbe, 0x0a, 0x4b, 0x2f, 0xfe, 0x6f, 0x1e, 0x5a, 0x8e, 0x41, 0x6c, 0xb2, + 0xff, 0xa3, 0xbe, 0xc6, 0xe6, 0xb1, 0x65, 0xfb, 0xbe, 0x38, 0xe2, 0xcb, + 0xdb, 0x39, 0x68, 0xf7, 0xb8, 0x6f, 0x7f, 0xd1, 0xff, 0x06, 0x17, 0xd4, + 0x96, 0x5e, 0xd7, 0x38, 0xb8, 0x80, 0xd7, 0xc0, 0x77, 0x02, 0xa2, 0x03, + 0x33, 0x35, 0x56, 0xc9, 0x22, 0x93, 0x4c, 0x97, 0xfd, 0x1e, 0x01, 0xf1, + 0xcf, 0x65, 0x96, 0x89, 0xc7, 0xc1, 0xa2, 0x8b, 0xcd, 0x79, 0x2c, 0xaf, + 0x1e, 0x2f, 0xe5, 0x37, 0x3f, 0xeb, 0x2a, 0x0d, 0xd7, 0x48, 0xec, 0x05, + 0x95, 0xa3, 0x62, 0x44, 0x15, 0x8a, 0xaa, 0x5e, 0x14, 0x42, 0x47, 0xcf, + 0x43, 0x5c, 0x60, 0xf8, 0xe3, 0x44, 0xfe, 0x6e, 0xfc, 0x98, 0x94, 0xfb, + 0x2b, 0x7a, 0xf8, 0x7e, 0x89, 0xf5, 0x97, 0xff, 0xf1, 0x8c, 0xb3, 0x91, + 0xa9, 0xdc, 0xf3, 0x8e, 0x06, 0xb2, 0xf6, 0xf8, 0xf2, 0xca, 0x85, 0xdf, + 0x7c, 0x68, 0x39, 0xc8, 0x27, 0x6f, 0xe1, 0x28, 0x8b, 0x77, 0xfc, 0x5b, + 0x72, 0x1a, 0xff, 0x75, 0x65, 0xcf, 0xf2, 0xcb, 0xde, 0x7d, 0xc5, 0x97, + 0xd1, 0xfc, 0xfe, 0x2c, 0xbe, 0x6b, 0x5f, 0xab, 0x2b, 0x11, 0x6e, 0xd3, + 0xaf, 0xc5, 0xfa, 0x3e, 0x21, 0x2d, 0xfd, 0x9b, 0xae, 0xfe, 0xe2, 0xcb, + 0xff, 0xb3, 0x9d, 0x7f, 0x84, 0xdd, 0x82, 0x92, 0xcb, 0xff, 0xfc, 0x61, + 0xda, 0x67, 0x7d, 0xbb, 0x93, 0x14, 0x37, 0xce, 0xb2, 0xff, 0x16, 0xc3, + 0x3d, 0x46, 0xf5, 0x97, 0xc5, 0xdf, 0xc2, 0xb2, 0xfc, 0xd6, 0x43, 0x21, + 0x91, 0x3d, 0x2c, 0xbf, 0xff, 0xa5, 0x9c, 0x3d, 0x68, 0xda, 0x27, 0x7d, + 0x82, 0xf5, 0x65, 0x42, 0x3b, 0xf0, 0xd4, 0xc8, 0xdc, 0xea, 0xfd, 0xb7, + 0x9f, 0xd0, 0xb2, 0xff, 0xd0, 0x7e, 0xf6, 0x77, 0xd9, 0x25, 0x97, 0xfb, + 0x0a, 0x59, 0xc1, 0x1a, 0xb2, 0xec, 0x2d, 0x1f, 0x87, 0x4f, 0x69, 0xd1, + 0x88, 0x2c, 0x26, 0x2f, 0xff, 0x4b, 0x3e, 0x90, 0x91, 0xfb, 0x31, 0x45, + 0x15, 0x25, 0xf9, 0xa2, 0xe1, 0xef, 0x59, 0x7a, 0x58, 0x53, 0x1f, 0xe8, + 0x8a, 0x75, 0x08, 0xd9, 0x78, 0x52, 0xdf, 0xff, 0x9f, 0x52, 0x1f, 0xa3, + 0x85, 0x82, 0xbe, 0x98, 0x59, 0x50, 0xb8, 0xca, 0x34, 0xbc, 0x2f, 0xd2, + 0x47, 0xa3, 0x51, 0x28, 0xf5, 0x82, 0x4d, 0x7f, 0xc6, 0x52, 0xe3, 0x2a, + 0x9e, 0x99, 0x13, 0xd2, 0xcb, 0xe9, 0xb9, 0x93, 0x2c, 0xbf, 0x7f, 0x1d, + 0xcd, 0xc5, 0x97, 0xfc, 0x39, 0xf3, 0x61, 0x88, 0x2e, 0xac, 0xbf, 0xb9, + 0xad, 0x1c, 0xdc, 0x59, 0x7f, 0xa3, 0x34, 0x07, 0x70, 0x2a, 0x20, 0x95, + 0xff, 0x47, 0x73, 0x40, 0x77, 0x02, 0xa2, 0xf9, 0x5f, 0x9c, 0x7e, 0x86, + 0x16, 0x5f, 0xff, 0xf6, 0x1e, 0xb0, 0x7e, 0x8f, 0xa5, 0xa8, 0xef, 0x04, + 0x29, 0x2c, 0xbf, 0xf1, 0x67, 0x7a, 0x7c, 0xee, 0x7e, 0xb2, 0xec, 0xe3, + 0x25, 0x37, 0xe1, 0x97, 0x80, 0xf9, 0xa8, 0x84, 0x51, 0xc6, 0x7a, 0xc5, + 0x44, 0x25, 0x1d, 0xdd, 0x12, 0xa7, 0x5d, 0xf2, 0x93, 0x2f, 0xfe, 0x8f, + 0x1b, 0x19, 0xad, 0x9a, 0x1f, 0x96, 0x5f, 0xf0, 0xf5, 0x8d, 0xc9, 0x38, + 0xd6, 0x5f, 0xff, 0x82, 0xfc, 0xc2, 0x07, 0x8c, 0x7e, 0xcf, 0xb7, 0x56, + 0x56, 0x2b, 0x9d, 0x39, 0x53, 0x3e, 0x2d, 0x74, 0x72, 0x38, 0xbf, 0x4b, + 0x3f, 0x13, 0xab, 0x2f, 0xef, 0x4f, 0xf8, 0xc1, 0xe5, 0x94, 0xe7, 0xb6, + 0x12, 0xab, 0xf7, 0xf1, 0x2e, 0x62, 0xcb, 0xff, 0xfa, 0x02, 0x0f, 0x46, + 0xb3, 0x84, 0x17, 0x93, 0x0e, 0xb2, 0xff, 0xdd, 0x86, 0xf2, 0x0f, 0x67, + 0xea, 0xcb, 0xff, 0x6c, 0xff, 0x4f, 0xe7, 0x49, 0xf7, 0xac, 0xbf, 0xfe, + 0xce, 0xc1, 0x77, 0x99, 0x8c, 0x30, 0xf2, 0x59, 0x7f, 0x31, 0x9d, 0xee, + 0x0d, 0x65, 0xff, 0xb0, 0x71, 0x28, 0xf6, 0x7e, 0xeb, 0x2f, 0xe7, 0x90, + 0x64, 0xe3, 0x59, 0x7f, 0xff, 0xde, 0x0b, 0xed, 0xa8, 0xf3, 0x9f, 0x39, + 0x8c, 0x39, 0x7e, 0xb2, 0xfc, 0x7b, 0x73, 0x8e, 0xb2, 0x86, 0x88, 0xff, + 0x33, 0xde, 0x14, 0x51, 0x52, 0x5f, 0xbd, 0x80, 0x7d, 0x24, 0x66, 0x68, + 0x2f, 0xff, 0xf4, 0xda, 0x8d, 0xf3, 0x98, 0x79, 0xc2, 0x4d, 0xc9, 0xd9, + 0xf7, 0x56, 0x54, 0x23, 0xaf, 0xa8, 0x62, 0x1c, 0xdf, 0xf7, 0x8c, 0x5e, + 0xcd, 0xa8, 0xea, 0xcb, 0xff, 0x1f, 0x43, 0x9d, 0x76, 0xe1, 0x2c, 0xb1, + 0xc8, 0xfd, 0xf4, 0x77, 0x5b, 0x2b, 0x73, 0x02, 0x26, 0x93, 0xda, 0x5d, + 0xf9, 0xe9, 0x47, 0x4f, 0xd8, 0x53, 0xd2, 0xca, 0x59, 0x74, 0xb8, 0x29, + 0x6d, 0xba, 0x17, 0x7f, 0xe6, 0xc7, 0xdc, 0x2c, 0xd8, 0x49, 0x2c, 0xbf, + 0xff, 0xc7, 0xe7, 0x2f, 0xa4, 0x24, 0xa0, 0xa4, 0xed, 0xc1, 0xac, 0xbf, + 0xfd, 0x99, 0xe1, 0xfa, 0x39, 0x9e, 0x3f, 0xd6, 0x5f, 0xa6, 0x94, 0x6b, + 0x8b, 0x2f, 0xf6, 0x10, 0x65, 0xcd, 0x9d, 0x65, 0x98, 0x9c, 0x7b, 0x83, + 0x29, 0xbf, 0xf1, 0xf7, 0x60, 0xf2, 0x76, 0xb5, 0x0b, 0x2a, 0x13, 0xe3, + 0xd8, 0xc2, 0x48, 0x23, 0x60, 0x38, 0x52, 0xf4, 0xae, 0xfa, 0x71, 0xf8, + 0x2b, 0x2f, 0xd9, 0x2f, 0x46, 0x96, 0x50, 0x0f, 0x2f, 0x70, 0x92, 0xfc, + 0x7e, 0x62, 0x3e, 0x59, 0x7e, 0xc1, 0x94, 0x7c, 0xb2, 0xdd, 0x83, 0xd0, + 0x22, 0x9b, 0xff, 0xff, 0xf7, 0xdd, 0x28, 0x6f, 0x07, 0xe8, 0xe6, 0x48, + 0xd8, 0x61, 0xfa, 0x50, 0xde, 0x2c, 0xbf, 0xfb, 0xbc, 0x79, 0x73, 0x01, + 0x0d, 0x35, 0x97, 0xff, 0xbe, 0x29, 0xc0, 0xf1, 0xff, 0xfc, 0x6a, 0x4b, + 0x2a, 0x13, 0xb1, 0x37, 0x57, 0x26, 0x0c, 0x21, 0x04, 0x43, 0xbf, 0xf6, + 0xdf, 0x41, 0xb7, 0x0b, 0x37, 0x16, 0x5f, 0xb6, 0xf4, 0x07, 0x16, 0x5f, + 0xc7, 0xcc, 0x18, 0x98, 0xb2, 0xfd, 0xba, 0x65, 0x9b, 0xd6, 0x5f, 0xd8, + 0x33, 0x08, 0x3c, 0x03, 0xd8, 0x72, 0xdb, 0xfb, 0x92, 0x36, 0xbc, 0x96, + 0x54, 0x23, 0xc3, 0x50, 0x80, 0xfd, 0x0e, 0xff, 0x70, 0xb3, 0x7f, 0x9e, + 0x4b, 0x2f, 0x72, 0x5b, 0xd6, 0x51, 0x9e, 0x9e, 0xe1, 0xa5, 0xff, 0xe8, + 0xd8, 0x4f, 0x47, 0xdd, 0xcd, 0x88, 0x6b, 0x2b, 0x15, 0x15, 0x1c, 0x66, + 0x2f, 0x08, 0x82, 0x24, 0xbf, 0xf9, 0xe5, 0x83, 0x23, 0x7f, 0x43, 0x56, + 0x5c, 0xfe, 0x59, 0x5e, 0x3d, 0x7e, 0xa0, 0xdf, 0xe8, 0xc2, 0xeb, 0x24, + 0x50, 0x2c, 0xbf, 0xde, 0xcd, 0xf3, 0xb9, 0x20, 0x2c, 0xae, 0x1f, 0x7f, + 0x4d, 0xeb, 0xa8, 0xb3, 0x0c, 0x24, 0x6f, 0xff, 0xe2, 0xfc, 0xb3, 0xbe, + 0xcf, 0x13, 0xfd, 0x23, 0xc5, 0x97, 0xf1, 0x4e, 0x13, 0x5e, 0x75, 0x97, + 0xfe, 0x0b, 0xca, 0x74, 0x18, 0xf1, 0xab, 0x28, 0xd1, 0x90, 0xeb, 0x24, + 0x61, 0x7f, 0xed, 0x1f, 0xfb, 0x7a, 0x38, 0x1e, 0x2c, 0xbf, 0x66, 0x9f, + 0xe1, 0x56, 0x5a, 0x4b, 0x2f, 0xff, 0xc2, 0x96, 0x0f, 0x46, 0x1d, 0x87, + 0xe8, 0x2d, 0x96, 0x5b, 0x68, 0x3e, 0x8c, 0x11, 0xad, 0x91, 0x71, 0xc8, + 0x48, 0xdf, 0xe9, 0x89, 0xc5, 0xee, 0x79, 0x65, 0xef, 0x60, 0x16, 0x5e, + 0x14, 0x51, 0x52, 0x5f, 0xdf, 0xc1, 0x67, 0xdd, 0x48, 0xcc, 0xd0, 0x54, + 0xe4, 0x58, 0x4f, 0x9a, 0x08, 0x79, 0x7f, 0xff, 0x32, 0xe7, 0x03, 0xc6, + 0x31, 0xe0, 0xb3, 0xbb, 0xcc, 0xd9, 0x65, 0x79, 0x13, 0x81, 0x36, 0xa8, + 0x55, 0x22, 0x70, 0xf9, 0x78, 0xdd, 0x6f, 0xf8, 0x48, 0xe6, 0x0a, 0x21, + 0x75, 0x65, 0x6c, 0xda, 0xcb, 0x4a, 0x5f, 0x50, 0xe1, 0x55, 0x84, 0x20, + 0x28, 0xf9, 0x68, 0xe5, 0xd8, 0xea, 0x53, 0x5b, 0x65, 0x2c, 0x7a, 0x53, + 0xc1, 0x46, 0xa1, 0xc8, 0x78, 0x76, 0x55, 0xf0, 0x87, 0x57, 0xfe, 0xc3, + 0x2d, 0x9c, 0xbb, 0x8d, 0x59, 0x7f, 0xf3, 0x02, 0x74, 0xf8, 0x59, 0xbc, + 0xc6, 0xb2, 0xfe, 0x2c, 0x1f, 0x9c, 0x55, 0x95, 0xa3, 0xf4, 0x6a, 0x3d, + 0xe2, 0x76, 0xac, 0xbf, 0x87, 0xec, 0xec, 0xfe, 0x2c, 0xb1, 0xf8, 0xf2, + 0xc5, 0x1b, 0xa8, 0x44, 0xaf, 0x9b, 0x6f, 0x89, 0xfe, 0xea, 0xcb, 0xd8, + 0x5f, 0xac, 0xbe, 0xce, 0xcd, 0x25, 0x97, 0xff, 0x6e, 0x94, 0x6e, 0xf1, + 0xc8, 0x4f, 0xf8, 0xb2, 0xbc, 0x7d, 0xce, 0x47, 0x7f, 0xec, 0xec, 0x6b, + 0x9e, 0x82, 0xea, 0xe2, 0x08, 0x5f, 0xd9, 0xa0, 0x3b, 0x81, 0x51, 0x04, + 0x19, 0x9e, 0x55, 0xe8, 0x19, 0xac, 0xa8, 0x3e, 0x7e, 0x26, 0x5d, 0xbc, + 0x6b, 0x2f, 0x6f, 0x86, 0xac, 0xbf, 0x6d, 0x9a, 0x89, 0x2c, 0xbe, 0xd6, + 0x8c, 0x55, 0x96, 0x76, 0x9e, 0x5f, 0x8a, 0x2f, 0xed, 0xc1, 0x8a, 0xe5, + 0x25, 0x95, 0xb2, 0x36, 0xb0, 0x64, 0x9a, 0x42, 0x4f, 0x7f, 0xfa, 0x69, + 0x19, 0x76, 0x3f, 0x98, 0x8e, 0x65, 0x97, 0x14, 0xcb, 0x2d, 0x03, 0x3e, + 0x3c, 0x4c, 0xad, 0x95, 0x9f, 0x30, 0x45, 0xe8, 0x45, 0x7f, 0x0d, 0x22, + 0x87, 0xde, 0xf8, 0x4f, 0xdf, 0xbc, 0x71, 0xaf, 0xd6, 0x5f, 0xf6, 0x6b, + 0xc7, 0xa2, 0xcd, 0x96, 0x5f, 0xde, 0xce, 0xf4, 0xda, 0xb2, 0xff, 0xee, + 0x0c, 0x8f, 0x61, 0x34, 0x51, 0x8b, 0x2f, 0xee, 0x89, 0x9e, 0x7f, 0x96, + 0x57, 0xc8, 0xa0, 0xf1, 0x69, 0x22, 0x5f, 0xf1, 0x6d, 0x9a, 0xfc, 0x83, + 0xfa, 0xcb, 0xfb, 0x3e, 0xee, 0xb5, 0x0b, 0x2f, 0xfe, 0xe1, 0x3f, 0x5d, + 0xa2, 0x46, 0xd8, 0xb2, 0x86, 0x7e, 0x5c, 0x2e, 0xa8, 0x47, 0xf9, 0x98, + 0x06, 0x15, 0xb7, 0xf6, 0x00, 0x4d, 0xfe, 0xc5, 0x97, 0xed, 0xe3, 0xf4, + 0x71, 0x65, 0x9a, 0xb2, 0xff, 0x47, 0x47, 0xe0, 0xbf, 0x16, 0x08, 0x58, + 0xdf, 0xf6, 0xcf, 0x28, 0x2e, 0xcf, 0xe2, 0xcb, 0xff, 0xf1, 0x0f, 0x58, + 0x0f, 0x47, 0xb3, 0x5a, 0x86, 0x16, 0x54, 0x22, 0x40, 0xce, 0xee, 0x86, + 0x16, 0x5f, 0xec, 0xd1, 0xfe, 0xd7, 0x92, 0xcb, 0x8c, 0x96, 0x58, 0x55, + 0x94, 0x33, 0x4e, 0x20, 0xad, 0xe2, 0x0e, 0xcb, 0x2f, 0x6c, 0x50, 0xb2, + 0xfd, 0xe7, 0x96, 0x12, 0xcb, 0xf8, 0xfa, 0x59, 0xe3, 0x59, 0x76, 0x7a, + 0x71, 0xe8, 0xc1, 0x35, 0xce, 0x2c, 0xe4, 0xd2, 0xc6, 0x2f, 0x8b, 0x5e, + 0x22, 0x71, 0xde, 0xb6, 0xdf, 0xd1, 0xb7, 0x79, 0x9d, 0x59, 0x50, 0xba, + 0x8d, 0x28, 0xf5, 0xf0, 0xcc, 0xcc, 0x34, 0x77, 0xe8, 0x69, 0x94, 0x6d, + 0x82, 0xb2, 0x5f, 0xdc, 0x31, 0x8f, 0x09, 0x65, 0xff, 0xff, 0xd9, 0xd8, + 0x68, 0xf3, 0xb1, 0x85, 0x22, 0xcf, 0xa5, 0x19, 0xd5, 0x97, 0xff, 0xef, + 0x67, 0x39, 0x98, 0x1d, 0x6d, 0x81, 0x2e, 0xac, 0xa2, 0x46, 0x1f, 0x5b, + 0xaf, 0xfb, 0xd1, 0xae, 0x94, 0x67, 0xcb, 0x2f, 0xff, 0xf8, 0xf6, 0x89, + 0x73, 0x5a, 0x3f, 0xa6, 0x93, 0xe9, 0xb9, 0xf2, 0xcb, 0xfd, 0x0f, 0xb3, + 0xe9, 0xc4, 0x59, 0x7b, 0xd8, 0x43, 0x46, 0xaf, 0x8e, 0x3a, 0xd5, 0x58, + 0xa8, 0x98, 0xe1, 0xdf, 0xd8, 0x7b, 0xdf, 0xa3, 0x53, 0x73, 0x65, 0x97, + 0xfd, 0xe8, 0xcd, 0x4b, 0x81, 0x6a, 0xca, 0xd8, 0xf8, 0xc0, 0x55, 0x71, + 0xf1, 0x65, 0xff, 0x66, 0xcf, 0xdf, 0xc4, 0x29, 0x2c, 0xbf, 0x9f, 0xb3, + 0xa2, 0x4c, 0x2c, 0xbf, 0x84, 0x6f, 0x05, 0x7f, 0x96, 0x54, 0x26, 0xe5, + 0x90, 0x9d, 0x60, 0x8f, 0x42, 0xce, 0x77, 0xd3, 0x0b, 0xda, 0xcf, 0x2c, + 0xbd, 0xc3, 0x6a, 0xca, 0xd1, 0xb8, 0xe8, 0xe5, 0xc7, 0xb2, 0xca, 0x83, + 0x71, 0xba, 0x43, 0x7f, 0xf7, 0x8e, 0x0a, 0x73, 0x94, 0x8d, 0xab, 0x2f, + 0x8e, 0x63, 0x15, 0x65, 0xff, 0xcd, 0x7f, 0x84, 0xe9, 0xea, 0x02, 0xcb, + 0x59, 0x76, 0xfd, 0x2c, 0xbf, 0xff, 0x07, 0x62, 0x8c, 0xf3, 0x38, 0xee, + 0x78, 0x3a, 0x59, 0x7d, 0xde, 0x09, 0xc9, 0xc9, 0x90, 0x0d, 0x0f, 0x08, + 0xc9, 0x28, 0x41, 0x9b, 0x88, 0x55, 0x97, 0xee, 0x37, 0x3b, 0xc5, 0x97, + 0xff, 0x1b, 0x19, 0xd3, 0xf6, 0x76, 0x34, 0xb2, 0xfc, 0xf2, 0x23, 0x85, + 0x97, 0xe7, 0x2e, 0xe1, 0x2c, 0xbf, 0xf3, 0x04, 0xfd, 0xe6, 0x6f, 0xf1, + 0xac, 0xa8, 0x3e, 0x57, 0x25, 0xbf, 0xf4, 0xc4, 0xe2, 0xcd, 0x27, 0xd4, + 0x96, 0x5f, 0xc7, 0xad, 0x46, 0x12, 0xcb, 0xfe, 0x89, 0x73, 0x00, 0x51, + 0xa5, 0x94, 0xc1, 0xf1, 0x68, 0xae, 0xc6, 0xb2, 0xfe, 0xe1, 0xe8, 0x1e, + 0xc5, 0x97, 0x89, 0xd8, 0xc3, 0xe0, 0x01, 0x1f, 0xc2, 0x15, 0x25, 0xc1, + 0x7c, 0x8d, 0x0c, 0x0c, 0xa6, 0x2f, 0xa2, 0x86, 0xa1, 0x94, 0x22, 0xb8, + 0x40, 0x18, 0xc0, 0xef, 0xbe, 0x01, 0x8d, 0x65, 0xfb, 0xc7, 0x3e, 0x6c, + 0x2c, 0xbe, 0xcf, 0xcf, 0x7a, 0xcb, 0xef, 0xff, 0x0f, 0xeb, 0x28, 0x07, + 0xea, 0x45, 0x62, 0x12, 0x5f, 0x07, 0x5d, 0x35, 0x97, 0xe2, 0x97, 0x36, + 0xfd, 0x65, 0xff, 0xfd, 0x2e, 0x9c, 0xc0, 0xf1, 0xfd, 0xd1, 0x0b, 0x37, + 0xe2, 0xcb, 0xff, 0xbf, 0x8e, 0x36, 0x0f, 0x5a, 0x31, 0x56, 0x5e, 0x77, + 0x92, 0xca, 0x1a, 0x61, 0x78, 0x45, 0xf1, 0x51, 0xaf, 0xfe, 0x8b, 0x7e, + 0x69, 0xf7, 0xb0, 0xb2, 0xf1, 0xe0, 0xab, 0x2f, 0x8f, 0x98, 0x33, 0x3c, + 0x32, 0x27, 0xbf, 0x8b, 0x98, 0xd8, 0xdc, 0x59, 0x7d, 0xb9, 0xec, 0xd9, + 0x65, 0xfe, 0x81, 0xe7, 0x4f, 0xc1, 0x59, 0x50, 0x7b, 0x03, 0x26, 0xbe, + 0x60, 0xfe, 0xe2, 0xca, 0x84, 0x66, 0x36, 0x10, 0xfd, 0x21, 0xbf, 0xf7, + 0x44, 0xfe, 0x04, 0x8f, 0xe3, 0xf5, 0x97, 0xfc, 0x11, 0xb9, 0x7e, 0xcb, + 0xf3, 0xac, 0xbf, 0xff, 0xf3, 0x5c, 0xbf, 0x91, 0xf0, 0x2d, 0xf1, 0xc7, + 0x7c, 0x17, 0x6a, 0xcb, 0xff, 0xe2, 0x0f, 0x64, 0x7f, 0xf9, 0xcf, 0xae, + 0xd5, 0x97, 0x4e, 0xdc, 0x59, 0x7f, 0xfe, 0x73, 0xe9, 0x8f, 0x07, 0x9d, + 0x36, 0x9e, 0x96, 0x5f, 0xfe, 0x80, 0x0f, 0x04, 0xe9, 0xea, 0x02, 0xcb, + 0x59, 0x78, 0x38, 0x35, 0x97, 0xb4, 0xfc, 0xc4, 0xc9, 0xf4, 0x9f, 0xe1, + 0xc2, 0x52, 0x9f, 0x4e, 0xb7, 0x64, 0xa8, 0xb5, 0xcf, 0x43, 0x1c, 0x9d, + 0x7c, 0xaa, 0xb4, 0xe5, 0x38, 0x5d, 0x28, 0x59, 0x7f, 0xfb, 0x61, 0xfa, + 0x3d, 0x9f, 0x7f, 0x9d, 0xe2, 0xca, 0x73, 0xe3, 0x08, 0xb5, 0x42, 0xf7, + 0x98, 0xe1, 0x31, 0x91, 0x9d, 0x02, 0x11, 0xc7, 0x18, 0x13, 0xca, 0xe1, + 0x28, 0x47, 0xde, 0xd6, 0xa1, 0x65, 0xfd, 0xa8, 0xd8, 0xcb, 0xab, 0x2f, + 0x0c, 0x46, 0xac, 0xbf, 0x14, 0x0f, 0x26, 0x59, 0x7d, 0xc0, 0xe9, 0x85, + 0x97, 0xe8, 0xf7, 0x62, 0x4b, 0x2f, 0x86, 0x1e, 0xf2, 0x0f, 0xcb, 0xe2, + 0x7f, 0xc9, 0x2f, 0x78, 0x4d, 0x2c, 0xbf, 0xd0, 0x4f, 0xe0, 0x96, 0xcb, + 0x2f, 0xff, 0xde, 0x3d, 0x79, 0xe0, 0x98, 0x79, 0x9d, 0xf6, 0x59, 0x7d, + 0x87, 0xff, 0x16, 0x5f, 0x1f, 0x22, 0x58, 0x7e, 0xfa, 0x55, 0xbd, 0xb0, + 0xe1, 0x65, 0xe6, 0xc7, 0x96, 0x5e, 0x89, 0x32, 0x56, 0x5b, 0xfc, 0x37, + 0x84, 0x39, 0x7f, 0xd1, 0xc8, 0xef, 0x30, 0xa4, 0xb2, 0xff, 0xff, 0xf6, + 0x6d, 0xc8, 0x61, 0xf9, 0xd9, 0x63, 0x0c, 0x67, 0xdd, 0xd4, 0x67, 0xcb, + 0x2f, 0xd1, 0x3b, 0x45, 0x25, 0x95, 0xe4, 0x6e, 0x70, 0xdc, 0x2f, 0x97, + 0x99, 0x7e, 0xc5, 0x95, 0x3d, 0xab, 0xca, 0x18, 0xe6, 0x16, 0x9c, 0x24, + 0x26, 0x48, 0x68, 0xf7, 0xa1, 0x52, 0xe6, 0xe4, 0xb3, 0xd8, 0xc0, 0x82, + 0x61, 0x7b, 0x42, 0x71, 0x65, 0xfb, 0x05, 0xe8, 0x8d, 0x59, 0x7f, 0xff, + 0xdc, 0x12, 0x3f, 0x1f, 0xa3, 0x58, 0x46, 0xf2, 0xe6, 0x75, 0x65, 0xdc, + 0xd9, 0x65, 0xfc, 0x50, 0x2e, 0xa1, 0xab, 0x28, 0x67, 0x8b, 0x83, 0x15, + 0xa4, 0x66, 0x76, 0x15, 0x77, 0xfe, 0x89, 0x70, 0x3a, 0xff, 0x3c, 0xeb, + 0x2f, 0xf6, 0xfc, 0x1b, 0x93, 0xef, 0x59, 0x7f, 0xde, 0x8f, 0xbb, 0x1e, + 0x7d, 0xc5, 0x94, 0xb2, 0xa7, 0x1e, 0x3b, 0x2b, 0x9e, 0x5b, 0xe5, 0x97, + 0x60, 0xab, 0x2e, 0xef, 0x4c, 0xd4, 0xf4, 0x4a, 0xa1, 0x10, 0x06, 0xa9, + 0x7f, 0xe7, 0x20, 0x66, 0x80, 0xee, 0x05, 0x44, 0x22, 0xba, 0x5b, 0x2c, + 0xa8, 0x55, 0xf3, 0x83, 0xc7, 0x0f, 0x66, 0x94, 0x39, 0xff, 0xf0, 0xfc, + 0x09, 0x0e, 0xf4, 0x9b, 0xed, 0xb9, 0xfb, 0xac, 0xbf, 0xed, 0x38, 0xf0, + 0xf7, 0xbb, 0x56, 0x56, 0x1e, 0xee, 0x89, 0x2f, 0xff, 0xff, 0x7b, 0x03, + 0xa6, 0x3c, 0x7f, 0x47, 0x43, 0xe2, 0xcf, 0xba, 0x17, 0xe2, 0xcb, 0xff, + 0xb3, 0xe1, 0x3a, 0x64, 0x19, 0x67, 0x16, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0xb6, 0x27, 0x1c, 0x16, 0xd1, 0xa1, 0xe1, 0x67, 0x78, 0x60, + 0xc2, 0x13, 0x6c, 0xd4, 0x70, 0x9d, 0x8e, 0x61, 0xff, 0xf8, 0x7f, 0x27, + 0x1c, 0x16, 0xd1, 0xa5, 0x97, 0xe7, 0xdd, 0xcf, 0xba, 0xb2, 0xfe, 0x91, + 0x66, 0x05, 0x96, 0xb2, 0xff, 0x3f, 0x65, 0x9a, 0xce, 0x2c, 0xa8, 0x4f, + 0x73, 0x11, 0x7d, 0x18, 0x53, 0x95, 0x91, 0x85, 0xff, 0x9c, 0xb0, 0xf4, + 0x51, 0xf4, 0x96, 0x5f, 0xfd, 0xd7, 0x2d, 0xbe, 0x91, 0x46, 0x71, 0x65, + 0xff, 0xfa, 0x3f, 0x9a, 0x51, 0xb1, 0x3b, 0x1c, 0x28, 0x92, 0xcb, 0xff, + 0x09, 0x9e, 0x76, 0xb3, 0x14, 0x51, 0x56, 0x5f, 0xff, 0xb0, 0x1e, 0x82, + 0x19, 0x1e, 0xd8, 0x46, 0xc2, 0xcb, 0x3e, 0xc8, 0x98, 0x92, 0x2d, 0x49, + 0x31, 0x87, 0x87, 0x7d, 0xff, 0xfd, 0x31, 0x47, 0xfc, 0x07, 0x8f, 0x53, + 0x14, 0x7f, 0xc5, 0x97, 0xff, 0xf7, 0x79, 0x0c, 0x48, 0xfc, 0xe5, 0xd9, + 0x66, 0xb1, 0x65, 0xff, 0x8f, 0x98, 0x39, 0xcf, 0xfc, 0xfe, 0x2c, 0xb8, + 0x3b, 0xd6, 0x5f, 0xe8, 0x6f, 0xdd, 0x8c, 0xf9, 0x65, 0xff, 0xbc, 0x7b, + 0xfc, 0xf2, 0xd4, 0x30, 0xb2, 0xb1, 0x32, 0xb0, 0x2d, 0x69, 0x0f, 0xc3, + 0x3d, 0x34, 0xbf, 0x83, 0xd3, 0x09, 0x30, 0xb2, 0xfe, 0xc1, 0x70, 0x83, + 0xfa, 0xcb, 0xf4, 0xb3, 0xb1, 0xfa, 0xcb, 0xa1, 0xbb, 0x1e, 0xb7, 0xc5, + 0xd7, 0xff, 0xff, 0x7e, 0xd7, 0x97, 0x9c, 0xfa, 0x63, 0xc1, 0xe7, 0x4d, + 0xa7, 0xa5, 0x95, 0xc4, 0x4f, 0x84, 0xbe, 0xff, 0xfc, 0x59, 0xcc, 0xf3, + 0xee, 0x83, 0xc6, 0xd8, 0x02, 0xcb, 0xf6, 0xcd, 0x81, 0xc2, 0xca, 0x92, + 0xff, 0xd0, 0xe5, 0x2b, 0x01, 0x37, 0xe3, 0xc9, 0xa3, 0x5c, 0xd1, 0x47, + 0xa3, 0x89, 0xe2, 0x57, 0x63, 0x23, 0xde, 0x46, 0x22, 0xb5, 0xff, 0xa1, + 0x86, 0x20, 0xb3, 0xbe, 0x35, 0x97, 0xfa, 0x39, 0xc8, 0xdb, 0x05, 0x59, + 0x7f, 0xfc, 0x3e, 0x85, 0xfe, 0xef, 0xf8, 0x39, 0xde, 0x35, 0x97, 0xfb, + 0xd8, 0xdc, 0xf0, 0x49, 0x65, 0x0d, 0x17, 0x4e, 0x69, 0xd5, 0x4b, 0xec, + 0xd3, 0x06, 0xb2, 0xa1, 0x94, 0x3b, 0x94, 0x81, 0xb3, 0x85, 0xcb, 0xc3, + 0xe0, 0x25, 0xf7, 0x85, 0x14, 0x54, 0x97, 0xfd, 0x9f, 0xbe, 0xb3, 0x7e, + 0x0d, 0x23, 0x33, 0x41, 0x70, 0xa2, 0xa4, 0xbc, 0x28, 0xa2, 0xa4, 0xbf, + 0x9f, 0x61, 0xfa, 0x38, 0x91, 0x99, 0xa0, 0xa2, 0x46, 0x28, 0xa9, 0x93, + 0xe7, 0x37, 0xe0, 0x18, 0xc4, 0x6a, 0x46, 0x66, 0xce, 0xf0, 0xa2, 0x8a, + 0x92, 0xf7, 0x23, 0x49, 0x19, 0x9a, 0x0b, 0xe7, 0x2f, 0xba, 0xb2, 0xdf, + 0x9a, 0x2a, 0xfa, 0xb6, 0x29, 0x75, 0xd3, 0xf3, 0xd2, 0xcb, 0xf1, 0x44, + 0x9c, 0x0b, 0x2f, 0x64, 0xc6, 0xb2, 0x86, 0x78, 0x42, 0x13, 0x5f, 0xb8, + 0x1d, 0xa7, 0xc9, 0x65, 0xf8, 0x67, 0xbe, 0x06, 0xb2, 0xfb, 0x0b, 0x37, + 0x16, 0x56, 0x8f, 0x31, 0xa5, 0x34, 0x68, 0x9a, 0x11, 0xe2, 0xff, 0xef, + 0x3c, 0x89, 0xd8, 0x98, 0x8e, 0x65, 0x97, 0xfd, 0xb4, 0x7d, 0xc3, 0x2c, + 0xfd, 0x65, 0xf3, 0xc8, 0xff, 0x59, 0x5a, 0x3d, 0xcf, 0x1d, 0x5f, 0xb3, + 0x66, 0xe3, 0x56, 0x5f, 0xd1, 0xb0, 0xfd, 0x1c, 0x59, 0x7f, 0xa3, 0x01, + 0x9b, 0xcc, 0x6b, 0x2d, 0x80, 0x3e, 0x12, 0x2e, 0xac, 0x46, 0x89, 0x11, + 0x4f, 0xc2, 0x26, 0xfe, 0xf6, 0x6f, 0xce, 0xf1, 0x65, 0x01, 0x3d, 0x7f, + 0xe3, 0x72, 0xe9, 0xb5, 0x49, 0x5a, 0x86, 0x98, 0x7d, 0x0b, 0xd2, 0x8f, + 0xea, 0xfb, 0x6f, 0xc3, 0xfa, 0xcb, 0xb6, 0xea, 0xca, 0x85, 0xc0, 0xec, + 0x97, 0x0e, 0xe9, 0x24, 0x4d, 0x7e, 0xda, 0x7f, 0xd8, 0x05, 0x97, 0x32, + 0xa9, 0xe9, 0x65, 0xee, 0x47, 0x56, 0x5d, 0xf8, 0xab, 0x2d, 0xc9, 0x8d, + 0xab, 0x8e, 0x56, 0x22, 0xab, 0xe2, 0xce, 0xab, 0xdf, 0x81, 0x1e, 0x86, + 0xac, 0xb9, 0xfa, 0xb2, 0xfb, 0x71, 0xcb, 0xfc, 0x37, 0xa4, 0x4f, 0x7f, + 0xf8, 0x6e, 0x5f, 0x93, 0xb8, 0xfa, 0x17, 0x59, 0x58, 0x88, 0x10, 0x9c, + 0xdf, 0xf4, 0x14, 0x88, 0x7e, 0x8d, 0x96, 0x5f, 0xc3, 0xcd, 0x4f, 0xb4, + 0x6b, 0x2f, 0x78, 0xe6, 0x49, 0x5a, 0x3c, 0xee, 0x18, 0xdf, 0xf3, 0xfd, + 0xdc, 0x98, 0x3a, 0x61, 0x65, 0x80, 0x67, 0xbc, 0x12, 0x2b, 0xfc, 0x59, + 0xf4, 0xb8, 0x6c, 0x2c, 0xbd, 0xa0, 0xec, 0xb2, 0xf3, 0xe9, 0x85, 0x95, + 0xa3, 0x76, 0xe3, 0xd6, 0x61, 0x65, 0xff, 0xd8, 0x0f, 0x47, 0xb3, 0x5a, + 0x86, 0x16, 0x5e, 0x3f, 0xf9, 0x07, 0xad, 0xa1, 0x2a, 0x9c, 0x98, 0xc6, + 0xcd, 0xe4, 0xed, 0x7f, 0xd9, 0x80, 0xfe, 0x33, 0xe9, 0x2c, 0xbf, 0xfb, + 0xba, 0x0f, 0x3c, 0xf2, 0xfc, 0xc6, 0xb2, 0xfa, 0x1d, 0xbb, 0xd2, 0x5f, + 0xfd, 0xe3, 0x7f, 0xff, 0x8f, 0xe3, 0xdc, 0x59, 0x7f, 0x7b, 0x1a, 0xd7, + 0x92, 0xcb, 0xc2, 0x8a, 0x2a, 0x4b, 0xfc, 0x5d, 0xf1, 0xc1, 0x6c, 0x91, + 0x99, 0xa0, 0xbd, 0x1f, 0xe4, 0x91, 0x23, 0x89, 0xb5, 0xd4, 0xc2, 0x84, + 0x86, 0xbd, 0xfd, 0x93, 0xba, 0xff, 0xf1, 0x65, 0x01, 0x38, 0x76, 0xc6, + 0x5b, 0xbc, 0xaa, 0xff, 0x9f, 0xf2, 0xc9, 0xa5, 0x1f, 0x2c, 0xa8, 0x54, + 0x81, 0x91, 0xe6, 0x99, 0xcd, 0xfe, 0x72, 0x13, 0x44, 0x19, 0x2c, 0xbf, + 0xff, 0xa5, 0xe7, 0x90, 0x3c, 0x7d, 0x96, 0x7b, 0xcf, 0x25, 0x97, 0xe8, + 0xfe, 0x3d, 0xc5, 0x95, 0x88, 0x83, 0xfd, 0x6e, 0xff, 0xc2, 0x46, 0xbf, + 0xef, 0x9c, 0x66, 0xb2, 0xfd, 0xad, 0x1f, 0x78, 0xb2, 0x86, 0x7d, 0x02, + 0x20, 0x5f, 0xff, 0x7f, 0x3f, 0x91, 0xcf, 0x47, 0xdd, 0x60, 0x3a, 0x59, + 0x7f, 0xef, 0xe7, 0xf2, 0x24, 0x7d, 0x28, 0x59, 0x50, 0x8b, 0x9c, 0x23, + 0x75, 0x6b, 0xf4, 0x48, 0xe5, 0xc5, 0x95, 0x0c, 0x86, 0x29, 0x43, 0xb9, + 0x82, 0x2f, 0xa1, 0xc8, 0x71, 0x9f, 0xcc, 0x67, 0xe9, 0x4f, 0x2e, 0x6b, + 0xfc, 0x2d, 0x8a, 0x34, 0x4e, 0x16, 0xdf, 0xff, 0xdd, 0x36, 0xe1, 0x77, + 0x90, 0xc7, 0x02, 0x3f, 0x1a, 0xcb, 0xf7, 0xf8, 0x7e, 0x61, 0x65, 0xff, + 0xf6, 0x02, 0x09, 0xfb, 0xc1, 0x85, 0xf5, 0x25, 0x95, 0xf1, 0xfb, 0xb4, + 0xa6, 0xfe, 0x82, 0x03, 0x22, 0x78, 0xcf, 0x2b, 0x2f, 0xd0, 0xdd, 0x46, + 0xf5, 0x97, 0xa5, 0x04, 0xb2, 0xff, 0xe8, 0x07, 0x4a, 0x05, 0xce, 0xf3, + 0x8b, 0x2f, 0xfc, 0xfe, 0xd4, 0x74, 0xc0, 0x63, 0x59, 0x7f, 0xdd, 0xf6, + 0x1e, 0xa4, 0x23, 0x56, 0x57, 0x8f, 0xdf, 0x87, 0xb5, 0xa4, 0x6e, 0xff, + 0x0b, 0xbb, 0xff, 0xff, 0x89, 0xdb, 0x1a, 0x00, 0xfd, 0x1c, 0x0b, 0x9c, + 0xb9, 0xe7, 0x92, 0xcb, 0xc1, 0xef, 0x16, 0x5f, 0x85, 0x7f, 0x43, 0x56, + 0x5e, 0x04, 0x71, 0x65, 0xff, 0xc2, 0x4b, 0x3c, 0xfe, 0x3d, 0x6a, 0x16, + 0x54, 0x22, 0x23, 0x0a, 0x3f, 0x1c, 0xbf, 0xbd, 0x92, 0x72, 0xfd, 0x65, + 0xee, 0x6f, 0xc5, 0x97, 0x46, 0x96, 0x57, 0x4d, 0xa4, 0xf8, 0xf5, 0xfd, + 0x9b, 0x73, 0x70, 0xc0, 0xb2, 0xa0, 0xf5, 0x48, 0x92, 0xfc, 0x1d, 0x31, + 0xe3, 0x59, 0x53, 0x97, 0x2f, 0xa2, 0x1a, 0x43, 0x23, 0x01, 0xe1, 0x94, + 0xea, 0x1f, 0x0e, 0x53, 0xfb, 0x81, 0x42, 0x97, 0x85, 0xfd, 0x85, 0xb4, + 0xf9, 0x05, 0xda, 0x15, 0x65, 0xfe, 0x27, 0x17, 0x09, 0xd8, 0x59, 0x7f, + 0xf6, 0x77, 0x82, 0x71, 0xa5, 0x1a, 0x85, 0x97, 0xb7, 0xe1, 0x0c, 0xfd, + 0x9a, 0x65, 0x7f, 0xf0, 0xb1, 0xa2, 0x7d, 0xa3, 0x51, 0x25, 0x94, 0x67, + 0xf1, 0xe3, 0x4b, 0xff, 0xfd, 0xe3, 0x17, 0x37, 0x4d, 0xaf, 0xde, 0x06, + 0x59, 0xf7, 0x56, 0x5f, 0xfd, 0xa3, 0xfc, 0x4f, 0x43, 0x5d, 0xfa, 0xb2, + 0x86, 0x8a, 0xad, 0x32, 0xd4, 0x27, 0xe9, 0x91, 0x83, 0x3c, 0x32, 0xef, + 0xfa, 0x60, 0x78, 0xdb, 0x1a, 0x61, 0x65, 0xfe, 0x3d, 0x4d, 0x9d, 0x89, + 0x96, 0x5f, 0xb7, 0x77, 0x4c, 0x80, 0xb2, 0xfd, 0xb4, 0xe0, 0xc4, 0xcb, + 0x2d, 0x25, 0x97, 0x84, 0x29, 0x96, 0x54, 0x8d, 0x7f, 0xe2, 0x35, 0x89, + 0x8c, 0x80, 0xef, 0x46, 0x8e, 0x5b, 0xc5, 0xba, 0x87, 0xed, 0x6e, 0xda, + 0x5b, 0xec, 0xa7, 0x90, 0x47, 0x3a, 0xf7, 0x95, 0xb0, 0x33, 0x10, 0xfe, + 0x04, 0x68, 0xa7, 0x2d, 0x83, 0x71, 0xc6, 0x69, 0xd6, 0xed, 0x4e, 0x0d, + 0x36, 0x73, 0x8b, 0xd3, 0xf0, 0x4f, 0x38, 0x9d, 0xfc, 0xba, 0x52, 0xa5, + 0x7b, 0x72, 0x78, 0xbb, 0xb4, 0x94, 0xf0, 0xce, 0xbe, 0x0b, 0x2a, 0xc8, + 0x48, 0xd4, 0xaf, 0x87, 0xec, 0xe2, 0xcb, 0xdb, 0xa7, 0xbd, 0x65, 0xc7, + 0xe5, 0x97, 0xd9, 0x85, 0xd5, 0x97, 0x41, 0x2c, 0xaf, 0x1e, 0x5f, 0x05, + 0xb7, 0x90, 0x5f, 0xff, 0x61, 0x33, 0xeb, 0x07, 0xf7, 0x3d, 0x9f, 0xba, + 0xca, 0x92, 0x21, 0x06, 0x63, 0x79, 0xdc, 0x55, 0x97, 0x7f, 0x0b, 0x2f, + 0xc0, 0xce, 0xf8, 0xd6, 0x59, 0xc6, 0x7b, 0x46, 0x38, 0x42, 0xf7, 0xff, + 0xfd, 0x9e, 0x71, 0x39, 0x8c, 0x39, 0x7f, 0x05, 0x13, 0x7a, 0x16, 0x5a, + 0x16, 0x5f, 0xff, 0xa3, 0x5e, 0x86, 0xee, 0x86, 0x0a, 0x26, 0xf4, 0x2c, + 0xbf, 0x1e, 0xa6, 0x8f, 0x69, 0x19, 0xbf, 0xb3, 0x10, 0x85, 0x49, 0x56, + 0xde, 0x11, 0x7d, 0x0f, 0x06, 0xbe, 0x89, 0x0f, 0xfb, 0xf4, 0xde, 0x8d, + 0xb1, 0x65, 0xbc, 0xb2, 0xa4, 0x6e, 0x86, 0x53, 0x66, 0x57, 0x59, 0x7f, + 0xee, 0xf9, 0xe5, 0xd9, 0x8a, 0x1a, 0xb2, 0xff, 0xce, 0x5f, 0xce, 0x18, + 0x5f, 0x52, 0x59, 0x7c, 0x65, 0xb4, 0x2c, 0xbd, 0xdd, 0x42, 0xcb, 0xfe, + 0x28, 0x69, 0x96, 0x36, 0x16, 0x5e, 0xf1, 0xc9, 0x65, 0xc6, 0x3c, 0x3e, + 0xd9, 0x87, 0x3a, 0x6b, 0x5b, 0x89, 0x84, 0xe9, 0x04, 0xa1, 0x1d, 0x7f, + 0xf1, 0x77, 0x9e, 0x79, 0x4e, 0xcf, 0xba, 0xb2, 0xa7, 0x8a, 0x7b, 0xf0, + 0x31, 0x91, 0xa4, 0x04, 0xe2, 0xff, 0x9f, 0x72, 0x6e, 0x47, 0x9f, 0x71, + 0x65, 0xff, 0x09, 0x13, 0x09, 0x1a, 0x79, 0x96, 0x5e, 0x82, 0xd9, 0x65, + 0xf1, 0xf8, 0xda, 0xb2, 0xde, 0x33, 0x7b, 0x30, 0xe5, 0xee, 0x74, 0xd6, + 0x5d, 0x30, 0x56, 0x5d, 0x00, 0x83, 0x68, 0x43, 0x97, 0xfd, 0x1d, 0xf3, + 0xfe, 0xff, 0x71, 0x65, 0x0c, 0xf9, 0x08, 0xaa, 0xff, 0xff, 0x10, 0x5c, + 0x1c, 0x0b, 0x9c, 0xa0, 0x81, 0x9f, 0x75, 0x65, 0xff, 0x7f, 0x3b, 0xc6, + 0x00, 0xeb, 0xf5, 0x97, 0xb7, 0x63, 0x71, 0x65, 0x68, 0xf8, 0x37, 0x4f, + 0xaf, 0x4c, 0x1d, 0x2c, 0xbd, 0x87, 0xd5, 0x97, 0xfc, 0x7a, 0xcf, 0x99, + 0x8a, 0x28, 0xab, 0x2b, 0xc7, 0xb4, 0xe3, 0x75, 0x08, 0xbe, 0x72, 0x5e, + 0x3c, 0x5f, 0xff, 0x14, 0x4a, 0x70, 0x9d, 0x32, 0x0c, 0xb3, 0x8b, 0x2f, + 0xff, 0xde, 0x0f, 0x1b, 0x1f, 0x03, 0xc6, 0xd2, 0x3d, 0x96, 0x50, 0xd5, + 0xd6, 0x63, 0xc8, 0x21, 0x7e, 0xd2, 0x1f, 0x46, 0xfb, 0xf9, 0x77, 0x14, + 0x6e, 0xe0, 0x56, 0x5f, 0xde, 0x36, 0x80, 0xc6, 0xb2, 0xf7, 0xee, 0xd5, + 0x97, 0x67, 0xeb, 0x2a, 0x0d, 0xa6, 0x0e, 0xde, 0x7c, 0x6a, 0xcb, 0x8a, + 0x5b, 0x22, 0xcb, 0x05, 0xc9, 0x87, 0x74, 0x7e, 0xfa, 0x3c, 0x1d, 0x2c, + 0xbf, 0xb8, 0x58, 0x32, 0x75, 0x94, 0x47, 0x9a, 0x29, 0x15, 0xc0, 0x35, + 0x97, 0xe2, 0x8d, 0xa3, 0xe5, 0x96, 0xe0, 0x0d, 0xf1, 0x8b, 0x54, 0x26, + 0x3a, 0x70, 0x97, 0x76, 0x0b, 0xee, 0x14, 0x6c, 0xb2, 0xff, 0xb6, 0x7f, + 0x38, 0xc9, 0xc0, 0xb2, 0xb4, 0x7b, 0x44, 0x45, 0x7f, 0xfc, 0x2e, 0x03, + 0x99, 0xd9, 0xb1, 0x82, 0xcf, 0xd6, 0x56, 0x1f, 0x99, 0x90, 0xdf, 0xf6, + 0x0b, 0x9a, 0x03, 0xb8, 0x15, 0x18, 0x72, 0xff, 0xe0, 0xf0, 0x7e, 0x76, + 0xfd, 0x23, 0x25, 0x97, 0xee, 0xf9, 0xcb, 0xf5, 0x95, 0xb2, 0x2c, 0xbc, + 0x8a, 0xe8, 0xb7, 0xfe, 0x7e, 0xe4, 0xcf, 0x05, 0x13, 0x2c, 0xbf, 0xf7, + 0x8f, 0x04, 0xc9, 0x85, 0x8f, 0x96, 0x58, 0xf4, 0x8a, 0xef, 0x18, 0x70, + 0xf6, 0xe0, 0x01, 0x51, 0x82, 0x2a, 0x49, 0xec, 0x82, 0x38, 0x0f, 0xcd, + 0x6f, 0xf4, 0xf5, 0xc1, 0x96, 0x79, 0x92, 0xb2, 0xec, 0x25, 0x94, 0xb2, + 0xff, 0xe8, 0x20, 0x67, 0x7c, 0x7a, 0xfc, 0x0b, 0x28, 0x8f, 0x3f, 0xa1, + 0x77, 0xc7, 0xcf, 0x1a, 0xcb, 0xd9, 0xf7, 0x56, 0x50, 0xcd, 0xf3, 0x48, + 0x6f, 0xe3, 0x2c, 0xef, 0x8d, 0x65, 0xa3, 0x0f, 0x33, 0x84, 0x34, 0x34, + 0xcd, 0x71, 0x90, 0x30, 0xab, 0xbf, 0xfd, 0xe3, 0x9b, 0xc7, 0xf7, 0x4b, + 0x37, 0xba, 0xcb, 0xff, 0x78, 0xf7, 0xfb, 0x35, 0xa3, 0xde, 0xb2, 0xff, + 0xf6, 0x17, 0x79, 0x0c, 0x70, 0x23, 0xf1, 0xac, 0xbf, 0x9b, 0xce, 0x39, + 0x6c, 0xb2, 0xe6, 0xb5, 0x65, 0x41, 0xe2, 0xb9, 0x75, 0xff, 0x7f, 0xc9, + 0x1f, 0x9c, 0xf6, 0x59, 0x7d, 0xcc, 0x2e, 0xac, 0xbd, 0xbb, 0x1a, 0x59, + 0x46, 0x7f, 0x4e, 0x74, 0x12, 0x1b, 0xde, 0x7e, 0xac, 0xbd, 0xd7, 0xdc, + 0x59, 0x7f, 0xbb, 0xe3, 0x67, 0xfb, 0x9a, 0xcb, 0xfc, 0xc7, 0xa2, 0x41, + 0x7d, 0x2c, 0xb1, 0x2c, 0xa3, 0x3c, 0x40, 0x9a, 0x5c, 0x26, 0x2c, 0xad, + 0x97, 0x1d, 0x87, 0x1b, 0x88, 0x0d, 0x66, 0x4c, 0x6a, 0x17, 0xa1, 0x1e, + 0x50, 0x9a, 0xe1, 0x6f, 0x47, 0x02, 0x3f, 0x3e, 0xf2, 0x21, 0x0d, 0xf9, + 0x8f, 0xce, 0x6e, 0x2c, 0xbe, 0xf1, 0xbc, 0x96, 0x5e, 0x1b, 0xc9, 0x65, + 0x41, 0xbd, 0xc2, 0x1b, 0x06, 0x11, 0x0f, 0xfb, 0x45, 0xff, 0xe9, 0xc4, + 0xfd, 0x8d, 0x06, 0x5a, 0x89, 0x2c, 0xbf, 0x47, 0x7d, 0x13, 0x2c, 0xbb, + 0xbc, 0x59, 0x7e, 0x76, 0x05, 0x8d, 0x2c, 0xa3, 0x45, 0x9f, 0x92, 0xdc, + 0xa0, 0x85, 0xef, 0xf1, 0x97, 0x65, 0x9a, 0xc5, 0x97, 0xff, 0x18, 0x0b, + 0x1b, 0x13, 0x0e, 0x36, 0x59, 0x7f, 0xf4, 0x8b, 0x1a, 0xe5, 0x9e, 0x76, + 0xac, 0xbf, 0xd9, 0xd8, 0xde, 0x65, 0xfa, 0xcb, 0xff, 0xef, 0xda, 0xf2, + 0x96, 0x7e, 0x27, 0x76, 0xe0, 0x56, 0x50, 0x11, 0x13, 0xa3, 0x4b, 0xfd, + 0xa8, 0x31, 0x93, 0xc9, 0x65, 0xff, 0x66, 0xf8, 0xcf, 0xbe, 0xeb, 0x2a, + 0x59, 0x7f, 0x06, 0x3b, 0xcc, 0x29, 0xc7, 0xe7, 0xe3, 0x1b, 0xf0, 0x3d, + 0xf3, 0xee, 0x2c, 0xbf, 0xdc, 0x89, 0x30, 0xc6, 0x6e, 0x2c, 0xbf, 0xf0, + 0xc8, 0x3d, 0xe4, 0x14, 0x71, 0x65, 0x41, 0xfa, 0x99, 0xc5, 0x49, 0x56, + 0xd8, 0x0c, 0x7e, 0x44, 0x38, 0x65, 0x14, 0x25, 0x82, 0x8b, 0xbe, 0x14, + 0x37, 0xfe, 0x7d, 0x66, 0xfc, 0x1e, 0x88, 0x55, 0x97, 0xff, 0xe0, 0x94, + 0xb0, 0xba, 0x73, 0xf9, 0xd2, 0x79, 0x2c, 0xbf, 0xd1, 0xfc, 0x7b, 0x3e, + 0x92, 0xca, 0x34, 0x44, 0x92, 0xad, 0x7e, 0x8e, 0xae, 0xc3, 0x26, 0xfa, + 0x67, 0x99, 0xd6, 0x5f, 0x3f, 0x43, 0x25, 0x95, 0x38, 0xf1, 0x48, 0x8e, + 0xff, 0xbc, 0xe5, 0x93, 0x4a, 0x3e, 0x59, 0x7f, 0xf7, 0x8f, 0x59, 0xc2, + 0xcd, 0xfe, 0x35, 0x97, 0xe2, 0xce, 0x06, 0x76, 0x1f, 0xec, 0xc7, 0x37, + 0xed, 0x01, 0xdc, 0x0a, 0x88, 0x19, 0x7f, 0x3e, 0xdf, 0xb9, 0x0d, 0x15, + 0x83, 0xd7, 0xb3, 0x81, 0xc3, 0xf0, 0x9f, 0x34, 0xbd, 0xe7, 0x94, 0xe4, + 0x72, 0x94, 0x2c, 0x2f, 0xfb, 0xc7, 0x85, 0x80, 0x1e, 0x2c, 0xa6, 0xaa, + 0x63, 0x26, 0xee, 0xc7, 0x0b, 0xbc, 0xea, 0xf7, 0x43, 0x0b, 0x2f, 0xbf, + 0xd7, 0x38, 0xb2, 0xff, 0x7f, 0xd3, 0xd9, 0xb0, 0x05, 0x95, 0xf1, 0xfa, + 0xb8, 0xe1, 0x12, 0x5f, 0x87, 0x3c, 0xb8, 0xe7, 0x95, 0x97, 0xf0, 0x3e, + 0xf7, 0xcf, 0xb8, 0xb2, 0xff, 0x46, 0x9f, 0x5d, 0xc0, 0x2c, 0xbf, 0xf8, + 0xc7, 0x3b, 0x33, 0xef, 0xdc, 0xba, 0xb2, 0xd2, 0x91, 0xfc, 0x70, 0xca, + 0xa1, 0x1a, 0x6f, 0x0a, 0xba, 0x85, 0xdd, 0x7c, 0x97, 0x86, 0x70, 0xbb, + 0x72, 0xe0, 0xc6, 0x0b, 0x71, 0xc9, 0x65, 0xfd, 0xf7, 0x47, 0x98, 0xc2, + 0xcb, 0xec, 0x98, 0xda, 0xb2, 0x86, 0x7c, 0xf8, 0x2c, 0x21, 0x7d, 0xa1, + 0x65, 0xf4, 0x11, 0xfe, 0xb2, 0xd9, 0xe3, 0x63, 0xd1, 0x0b, 0xfd, 0xa2, + 0x71, 0x44, 0xf8, 0x55, 0x97, 0x7f, 0xbd, 0x65, 0x0c, 0xf4, 0x7c, 0x6f, + 0x7f, 0xf8, 0xff, 0x07, 0x8f, 0xc5, 0x19, 0xac, 0x59, 0x7f, 0xdf, 0x0e, + 0x38, 0x63, 0xf4, 0x2c, 0xbc, 0xfa, 0xd9, 0x51, 0x82, 0xaf, 0xfc, 0xfa, + 0xc2, 0xff, 0x9d, 0xe7, 0xcb, 0x2f, 0xff, 0xff, 0xec, 0xef, 0x9c, 0x98, + 0x9d, 0xcd, 0x3b, 0xf7, 0x7e, 0x0e, 0x76, 0x35, 0xcb, 0xe9, 0x2e, 0x20, + 0xb5, 0xff, 0x9d, 0xd8, 0x03, 0x8e, 0x73, 0x02, 0xae, 0x20, 0xb5, 0xff, + 0xde, 0x3f, 0x1c, 0x17, 0x67, 0x30, 0x2a, 0xe2, 0x0b, 0x5f, 0xe8, 0x32, + 0xec, 0xe6, 0x05, 0x5c, 0x41, 0x6b, 0xf9, 0xb8, 0x39, 0xcc, 0x0a, 0xb8, + 0x82, 0xd7, 0xff, 0xfc, 0xe4, 0x46, 0xd9, 0xdc, 0x07, 0x8f, 0x46, 0xc6, + 0xd8, 0x2a, 0xe2, 0x0b, 0x5d, 0xf4, 0xe1, 0xa7, 0x38, 0x05, 0x0d, 0x2a, + 0x3a, 0x19, 0x1f, 0xd4, 0x2a, 0xcf, 0xf2, 0x01, 0x4a, 0x37, 0xbf, 0xc7, + 0x0c, 0x73, 0xbc, 0xf9, 0x65, 0xf3, 0xeb, 0xf7, 0x59, 0x7f, 0xf7, 0x8f, + 0xc7, 0x05, 0xd9, 0xcc, 0x0a, 0xb8, 0x82, 0xd7, 0xfd, 0x37, 0x00, 0x7b, + 0x4e, 0x60, 0x55, 0xc4, 0x16, 0xbf, 0x77, 0x90, 0xd9, 0xc0, 0x45, 0x08, + 0x8a, 0x97, 0xff, 0xa7, 0x03, 0xc6, 0x08, 0xef, 0x27, 0x30, 0x2a, 0xe2, + 0x0b, 0x5f, 0xff, 0xfc, 0x44, 0x6d, 0x9c, 0x1c, 0x9d, 0xc0, 0x78, 0xf4, + 0x6c, 0x6d, 0x82, 0xae, 0x20, 0xb5, 0x62, 0x64, 0xbf, 0x21, 0xba, 0xf5, + 0xff, 0x78, 0xf4, 0x6c, 0x6d, 0x82, 0xae, 0x20, 0xb5, 0xff, 0xf3, 0xbf, + 0xd2, 0xe7, 0x8c, 0x63, 0x8d, 0x42, 0x4b, 0xff, 0x64, 0xa4, 0x1e, 0x68, + 0xb6, 0x9f, 0x5c, 0x41, 0x6a, 0x02, 0x39, 0xf4, 0x91, 0xc4, 0xfb, 0xff, + 0x00, 0xf5, 0xd7, 0xff, 0x93, 0x85, 0x5c, 0x41, 0x6b, 0xfb, 0xc7, 0xef, + 0x1f, 0xea, 0x80, 0x2d, 0x7e, 0xcf, 0xe7, 0x30, 0x2a, 0xe2, 0x0b, 0x5d, + 0x9d, 0x01, 0xfa, 0xf8, 0xee, 0xbe, 0x47, 0x97, 0x21, 0x8b, 0x7f, 0x37, + 0x07, 0x39, 0x81, 0x57, 0x10, 0x5a, 0xff, 0xc0, 0xf1, 0xe8, 0xd8, 0xdb, + 0x05, 0x5c, 0x41, 0x6b, 0xb2, 0x73, 0xa2, 0x37, 0x87, 0xf7, 0xf8, 0x26, + 0xd7, 0x2f, 0xa4, 0xb8, 0x82, 0xd7, 0xfe, 0xc3, 0xdf, 0x85, 0x83, 0x79, + 0x2e, 0x20, 0xb3, 0x4f, 0x02, 0x86, 0xbc, 0x1b, 0xa3, 0x7f, 0xcd, 0x4a, + 0x3e, 0x8e, 0x46, 0x2f, 0xd8, 0xc8, 0x83, 0x0b, 0x61, 0x5b, 0xee, 0xfe, + 0x15, 0x10, 0x59, 0x9a, 0x23, 0x2e, 0x70, 0x2c, 0xb7, 0x06, 0xca, 0x19, + 0x01, 0xcf, 0xf4, 0x99, 0x2e, 0x9c, 0x5d, 0x2d, 0xd5, 0x97, 0xa2, 0x5b, + 0xab, 0x2a, 0x0d, 0xc9, 0x0d, 0x56, 0xcc, 0xc0, 0x31, 0xb0, 0x7c, 0xef, + 0xa2, 0x2f, 0xe9, 0x4c, 0x25, 0x08, 0xab, 0xff, 0xb2, 0x45, 0x9d, 0xf1, + 0xe7, 0xdd, 0x59, 0x7f, 0xa3, 0xc6, 0x2f, 0xd2, 0xe2, 0xcb, 0xf4, 0x77, + 0x9e, 0x35, 0x97, 0xfe, 0xd6, 0x31, 0xec, 0x68, 0x75, 0xb2, 0xcb, 0xfe, + 0xf8, 0xb0, 0xdb, 0x85, 0xfa, 0xcb, 0xff, 0xff, 0xf3, 0xcc, 0x4e, 0x2e, + 0x6f, 0x3e, 0x7b, 0x3f, 0x9f, 0xce, 0xf1, 0xdb, 0x9f, 0x75, 0x65, 0xfa, + 0x5d, 0xe6, 0x12, 0xcb, 0xff, 0xce, 0x08, 0x21, 0x96, 0x6f, 0xd1, 0xf1, + 0x65, 0xff, 0xb9, 0x34, 0x82, 0x39, 0xa4, 0x11, 0xac, 0xad, 0x95, 0x08, + 0xc8, 0xd4, 0x64, 0xf8, 0x82, 0xc1, 0xc7, 0xd0, 0x89, 0xf1, 0x3f, 0x52, + 0x6f, 0xfb, 0x3a, 0x2e, 0x10, 0xfd, 0x0b, 0x2f, 0xfe, 0x8f, 0xa4, 0x23, + 0x79, 0xd8, 0xf8, 0x55, 0x97, 0xe9, 0x6e, 0xee, 0x87, 0x65, 0x96, 0xf1, + 0x9f, 0xcb, 0xa4, 0xdf, 0x74, 0xa1, 0xab, 0x2f, 0xda, 0x8f, 0xa5, 0xc5, + 0x95, 0xb2, 0x64, 0x32, 0x85, 0x89, 0x93, 0x68, 0x86, 0xf3, 0x5f, 0xab, + 0x2e, 0x7e, 0x2c, 0xbf, 0xff, 0x10, 0x9d, 0x32, 0x0c, 0xb3, 0x9f, 0xf7, + 0xbf, 0x2c, 0xbf, 0xf0, 0x79, 0x3f, 0x9a, 0xfd, 0xa7, 0xc5, 0x97, 0xb3, + 0x4c, 0x2c, 0xbf, 0xfb, 0x7e, 0xf8, 0xe3, 0xfb, 0xe9, 0x67, 0x56, 0x56, + 0x26, 0x03, 0xfa, 0xc4, 0xfa, 0x18, 0x83, 0xb7, 0xfb, 0xf0, 0xf4, 0xa3, + 0xbc, 0x59, 0x52, 0x4e, 0xa5, 0x81, 0xcf, 0xe3, 0x17, 0xe2, 0x15, 0x42, + 0xbc, 0xdc, 0x8e, 0x6d, 0xe3, 0xec, 0xbc, 0xd3, 0xe2, 0xcb, 0xf4, 0xa3, + 0x7b, 0xf9, 0x65, 0x6c, 0x78, 0xae, 0x39, 0x7f, 0xf6, 0x7d, 0xde, 0x19, + 0x47, 0xee, 0xd5, 0x97, 0xff, 0xec, 0xef, 0x8e, 0x73, 0x0f, 0x38, 0xb0, + 0x57, 0xfd, 0x65, 0xfe, 0xe3, 0xf8, 0xf9, 0x12, 0x59, 0x7f, 0xe6, 0x5e, + 0x11, 0x60, 0x90, 0x5f, 0xac, 0xbf, 0xd9, 0xe3, 0xe1, 0x86, 0x4b, 0x2b, + 0x64, 0xd0, 0xc9, 0x13, 0xab, 0x41, 0x32, 0xdd, 0x41, 0xbe, 0xfb, 0x91, + 0xf2, 0xcb, 0xff, 0x4b, 0x3e, 0x96, 0xa3, 0xaf, 0xd5, 0x97, 0x9b, 0x12, + 0x59, 0x7e, 0xc1, 0xf8, 0x22, 0xac, 0xa9, 0xc8, 0xa8, 0x98, 0x91, 0xcf, + 0xc8, 0x72, 0xff, 0x81, 0xe3, 0x1f, 0xa3, 0xbc, 0x59, 0x78, 0x6f, 0xd5, + 0x97, 0xff, 0xf8, 0xa3, 0xee, 0xf7, 0x26, 0x96, 0x6d, 0xf4, 0x14, 0x71, + 0x65, 0xff, 0xb9, 0x05, 0x12, 0xef, 0xb0, 0x96, 0x56, 0x93, 0x31, 0x69, + 0xf3, 0x9c, 0xfe, 0x39, 0xc6, 0x2b, 0xc7, 0x3f, 0x8b, 0x2f, 0xec, 0x17, + 0x87, 0xf7, 0x56, 0x5f, 0xdc, 0x31, 0xe0, 0xbc, 0x59, 0x7f, 0x3e, 0x9c, + 0x67, 0x8b, 0x2e, 0xd7, 0xeb, 0x2e, 0xc1, 0x56, 0x53, 0x9a, 0xfe, 0x8c, + 0x5b, 0xe8, 0x47, 0xae, 0xc3, 0xdf, 0x17, 0xf8, 0xbb, 0xab, 0x57, 0xc2, + 0xe7, 0x9d, 0x65, 0xf3, 0x1a, 0x31, 0x56, 0x5f, 0xb6, 0x7f, 0x46, 0xe2, + 0xcb, 0xf6, 0xdd, 0x9f, 0xce, 0xac, 0xa9, 0xe8, 0xfe, 0xf0, 0x90, 0x25, + 0x77, 0xf3, 0x1e, 0x8f, 0xbb, 0x8b, 0x2f, 0xf1, 0x60, 0xfd, 0x02, 0x92, + 0xca, 0x83, 0xe1, 0xd1, 0x7d, 0x42, 0xf3, 0x86, 0x46, 0xca, 0x72, 0x89, + 0xde, 0x34, 0x0f, 0xd4, 0x8a, 0x13, 0xa1, 0x84, 0xa5, 0xf1, 0x4d, 0xcc, + 0x59, 0x7e, 0x96, 0x6d, 0xd8, 0x59, 0x7f, 0xf1, 0x46, 0xcd, 0xf1, 0xeb, + 0x4f, 0x25, 0x94, 0xb2, 0x8d, 0x13, 0x33, 0x11, 0x11, 0x44, 0xfa, 0x25, + 0xfe, 0xdb, 0x68, 0x2f, 0xb3, 0xab, 0x2f, 0xc3, 0xcc, 0x20, 0x2c, 0xbf, + 0x7d, 0xd2, 0x7f, 0x2c, 0xba, 0x26, 0x59, 0x5b, 0x1f, 0x2c, 0x89, 0xbf, + 0x28, 0xac, 0x4c, 0x28, 0xcf, 0xc3, 0x09, 0xab, 0xff, 0xb4, 0x41, 0xfb, + 0xa5, 0x9b, 0x39, 0x2c, 0xbf, 0xff, 0x87, 0xe0, 0xec, 0x79, 0xad, 0x64, + 0x7d, 0x23, 0x6a, 0xcb, 0xfc, 0xf3, 0x10, 0x7a, 0x50, 0xb2, 0xff, 0x38, + 0xc4, 0xef, 0x4c, 0x55, 0x97, 0x9f, 0x5b, 0x2c, 0xbb, 0xf8, 0x59, 0x7c, + 0x70, 0xdc, 0x59, 0x4b, 0x2f, 0xe7, 0x63, 0xb1, 0xaf, 0xd6, 0x50, 0xcd, + 0xd1, 0x05, 0xdf, 0xff, 0xe8, 0x31, 0x94, 0x04, 0x1d, 0xc0, 0x0e, 0x00, + 0x23, 0x56, 0x5d, 0xfc, 0x2c, 0xba, 0x18, 0x59, 0x7f, 0xd9, 0xde, 0x43, + 0x44, 0xc9, 0x96, 0x5f, 0xee, 0x67, 0x8f, 0x81, 0xd9, 0x65, 0xc2, 0x8a, + 0x92, 0xff, 0x8b, 0x37, 0xbc, 0xb8, 0x63, 0x59, 0x40, 0x4f, 0xf0, 0xc7, + 0x74, 0x2e, 0xd5, 0xaf, 0x10, 0x7e, 0xc0, 0xcb, 0x17, 0x21, 0x7e, 0x1d, + 0x0a, 0x68, 0x20, 0xcd, 0xe1, 0x45, 0x15, 0x25, 0x9a, 0x91, 0x99, 0xa0, + 0xbe, 0x99, 0xdf, 0x49, 0x19, 0xa3, 0x84, 0x48, 0x5f, 0x56, 0xcb, 0x85, + 0xa0, 0x44, 0xf9, 0x73, 0xc6, 0x4f, 0x2c, 0x4a, 0xfe, 0xec, 0x67, 0xb3, + 0x65, 0x97, 0x63, 0x56, 0x57, 0xc7, 0x87, 0xc2, 0xdb, 0x8f, 0x8b, 0x2a, + 0x1d, 0xe9, 0x6e, 0xd0, 0x91, 0x94, 0xa0, 0x01, 0xa4, 0x64, 0xbe, 0xb6, + 0x25, 0x20, 0x7d, 0x2b, 0x64, 0xe7, 0x2b, 0xb5, 0x1a, 0x23, 0x61, 0xb9, + 0xea, 0x47, 0x63, 0xd3, 0x31, 0x7f, 0x6b, 0x29, 0xe2, 0x1e, 0x4f, 0x78, + 0x76, 0x51, 0x18, 0x67, 0x18, 0x77, 0xc2, 0x62, 0x7c, 0x8e, 0xe1, 0x3a, + 0xb2, 0xfe, 0xcf, 0xff, 0x3d, 0x49, 0x65, 0xc0, 0xc5, 0x94, 0x33, 0xc5, + 0x72, 0xfb, 0xff, 0x43, 0x67, 0xdf, 0x6c, 0x19, 0x8a, 0xb2, 0xec, 0x15, + 0x65, 0xd1, 0xd5, 0x95, 0xb1, 0xad, 0x00, 0xbd, 0x9a, 0xb2, 0xa4, 0x8a, + 0x2c, 0x6f, 0xe9, 0x15, 0xfe, 0x91, 0x96, 0x34, 0x3e, 0x59, 0x7e, 0xf3, + 0x99, 0x3a, 0xcb, 0xff, 0x67, 0x79, 0xe3, 0x6b, 0xe6, 0x96, 0x54, 0x22, + 0x51, 0x83, 0x22, 0x25, 0xbf, 0x64, 0xec, 0xff, 0xab, 0x2f, 0xa7, 0x76, + 0x37, 0xac, 0xbf, 0x60, 0x21, 0xa6, 0xb2, 0xfb, 0x1b, 0x9d, 0x59, 0x7f, + 0x7a, 0x04, 0x38, 0xd9, 0x65, 0xff, 0x1e, 0xfd, 0x64, 0xd9, 0xf7, 0x56, + 0x50, 0x0f, 0xab, 0xc5, 0xd7, 0x3b, 0x0b, 0x2b, 0x46, 0xe7, 0xa4, 0x57, + 0xce, 0xd7, 0x99, 0x65, 0xf8, 0xe0, 0x58, 0x99, 0x65, 0xf3, 0xf7, 0xee, + 0x2c, 0xa3, 0x3c, 0xb2, 0x28, 0xbf, 0xff, 0xf3, 0xcc, 0x19, 0x04, 0x13, + 0xbc, 0x7d, 0xec, 0x7d, 0x1b, 0x47, 0x16, 0x5f, 0x89, 0xf7, 0x36, 0x99, + 0x65, 0xf4, 0xdc, 0x8e, 0xac, 0xa0, 0x23, 0x02, 0x67, 0x10, 0x96, 0x58, + 0x55, 0x97, 0xff, 0xf8, 0x9d, 0xf7, 0xc4, 0xbd, 0x1a, 0xda, 0x3b, 0xc7, + 0x92, 0xcb, 0xfa, 0x01, 0xde, 0x3f, 0xcb, 0x2f, 0xb1, 0xaf, 0xf2, 0xca, + 0xdc, 0x45, 0x89, 0x30, 0x88, 0x5d, 0x78, 0xfe, 0x99, 0x65, 0xf0, 0x59, + 0x6d, 0x35, 0x97, 0xec, 0xcd, 0x83, 0xc5, 0x97, 0xda, 0x23, 0xfd, 0x65, + 0xf1, 0x81, 0xf4, 0xb2, 0xe8, 0xfd, 0x65, 0xf0, 0x76, 0x0b, 0x3f, 0x1b, + 0x81, 0x08, 0x68, 0xd1, 0x2f, 0xe5, 0xab, 0x7e, 0xb2, 0xec, 0x02, 0xcb, + 0xf6, 0x6b, 0x47, 0xa5, 0x95, 0xb8, 0x79, 0xfe, 0x12, 0xfc, 0x5a, 0xfc, + 0xf1, 0xf6, 0x01, 0x65, 0xff, 0x79, 0xf9, 0xe3, 0xd9, 0xc9, 0x65, 0xf3, + 0xec, 0x24, 0x96, 0x53, 0x25, 0x90, 0x17, 0x3d, 0xae, 0xc4, 0x30, 0xe5, + 0x0c, 0x31, 0x97, 0xe1, 0x53, 0x04, 0xdf, 0x13, 0x1c, 0x31, 0x37, 0x08, + 0x66, 0x6d, 0xd4, 0x38, 0x3c, 0x62, 0xf0, 0xc3, 0xfc, 0xcd, 0x96, 0x3d, + 0xc2, 0x6e, 0xc2, 0xfc, 0x2e, 0x22, 0x99, 0x88, 0x4f, 0xba, 0x71, 0x7f, + 0x10, 0x46, 0xd7, 0x92, 0xcb, 0xc7, 0xb0, 0x56, 0x5f, 0xa3, 0xf3, 0xfb, + 0x16, 0x5c, 0xd0, 0xac, 0xbf, 0x3f, 0x7c, 0x12, 0x59, 0x73, 0x77, 0xac, + 0xb0, 0xe0, 0xff, 0xcc, 0xa3, 0xc2, 0xe4, 0x4f, 0x7f, 0xfa, 0x45, 0x13, + 0x9a, 0x50, 0xc7, 0x4f, 0x65, 0x97, 0xe7, 0x6e, 0x79, 0xab, 0x2b, 0xe3, + 0xf3, 0xea, 0x65, 0x85, 0x59, 0x7b, 0xba, 0x85, 0x97, 0xd9, 0xb0, 0x92, + 0x59, 0x78, 0x42, 0xfd, 0x65, 0x11, 0xe1, 0x74, 0x92, 0xfe, 0xee, 0xfc, + 0x2c, 0x1a, 0xca, 0x98, 0xf3, 0xf8, 0x43, 0x7f, 0x67, 0x32, 0x47, 0xa5, + 0x97, 0x83, 0xb9, 0xba, 0xb2, 0xdb, 0xd6, 0x5f, 0xf6, 0xbc, 0xe2, 0x3f, + 0x8f, 0xf5, 0x95, 0x07, 0x9a, 0x62, 0x77, 0xf1, 0x96, 0xde, 0x0f, 0x16, + 0x57, 0x8f, 0x3b, 0xa4, 0x17, 0xda, 0xda, 0x3a, 0xb2, 0xf7, 0x25, 0xb2, + 0xca, 0xd9, 0x32, 0x1c, 0x85, 0xf3, 0x91, 0x08, 0x47, 0x50, 0xb8, 0x21, + 0x22, 0xdc, 0x84, 0xe1, 0xc2, 0xca, 0x62, 0x36, 0x89, 0x3c, 0x2b, 0x48, + 0x8f, 0xb1, 0xa6, 0xde, 0x79, 0xc2, 0x2c, 0xbd, 0x31, 0xf9, 0x65, 0xfd, + 0x1a, 0x79, 0x8f, 0xcb, 0x2f, 0xdc, 0x1c, 0x16, 0xce, 0x79, 0x5c, 0x1d, + 0xbf, 0xb3, 0x68, 0xf7, 0xa1, 0x65, 0xfb, 0x26, 0xf6, 0x12, 0xcb, 0xfa, + 0x30, 0x42, 0x0f, 0xeb, 0x2b, 0x48, 0x82, 0xf1, 0x69, 0x13, 0xde, 0x6c, + 0x35, 0x65, 0x7c, 0x98, 0x5e, 0xa1, 0x80, 0xd2, 0xfb, 0xff, 0xe2, 0x94, + 0xec, 0x19, 0xf3, 0xee, 0x85, 0xf8, 0xb2, 0xfd, 0xe0, 0x94, 0x6f, 0x59, + 0x7f, 0x13, 0xf6, 0x50, 0xc2, 0xca, 0x83, 0xd6, 0x10, 0xa6, 0xff, 0xf7, + 0x23, 0x40, 0xef, 0x0f, 0xbe, 0xc1, 0xac, 0xbe, 0xcc, 0xfa, 0x4b, 0x2f, + 0x70, 0xe6, 0x59, 0x66, 0x08, 0xdf, 0xf0, 0x8a, 0xff, 0xb4, 0x71, 0xdc, + 0xde, 0xe3, 0x59, 0x7f, 0xed, 0x8a, 0x3e, 0x31, 0x94, 0x6c, 0xb2, 0xff, + 0x7f, 0xce, 0x94, 0x37, 0x8b, 0x2f, 0xf3, 0x63, 0xcf, 0xc8, 0xdc, 0x59, + 0x50, 0x7d, 0x2e, 0x69, 0x4e, 0x8c, 0x82, 0x85, 0x45, 0x01, 0x3d, 0x7d, + 0x42, 0x27, 0xc4, 0xe5, 0x18, 0x0d, 0xfa, 0x77, 0xa3, 0x52, 0x59, 0x53, + 0x97, 0x2f, 0xa2, 0x37, 0x4c, 0x37, 0x04, 0x2a, 0x1e, 0x3f, 0x91, 0x52, + 0x2f, 0x37, 0x90, 0xb2, 0xfe, 0xda, 0x69, 0x4f, 0x7a, 0xd9, 0x65, 0xf3, + 0x71, 0xfc, 0xb2, 0xdb, 0x2c, 0xbf, 0x77, 0xc6, 0xdd, 0x2c, 0xa9, 0x1b, + 0xad, 0x09, 0x5e, 0xf0, 0xcd, 0x65, 0xfb, 0xd8, 0x72, 0xe2, 0xcb, 0xff, + 0xef, 0x40, 0x8c, 0xfa, 0x4f, 0xff, 0x39, 0x1f, 0xa4, 0xbf, 0x67, 0x5c, + 0x2c, 0xb5, 0x97, 0xed, 0x01, 0xdc, 0x0b, 0x88, 0x11, 0x7b, 0x91, 0xf2, + 0xcb, 0xe3, 0xe6, 0xa4, 0xb2, 0xdf, 0xe1, 0xf9, 0xfc, 0x68, 0xd1, 0xdb, + 0xe2, 0xc1, 0x77, 0x56, 0x5c, 0x7b, 0x2c, 0xa3, 0x37, 0x9d, 0x25, 0xbc, + 0x12, 0x02, 0xcb, 0xed, 0x89, 0xda, 0xb2, 0xe7, 0x25, 0x95, 0x06, 0xdf, + 0x62, 0x2a, 0x92, 0xa1, 0xf1, 0x93, 0xfc, 0xa9, 0xa8, 0x4f, 0x35, 0xcb, + 0xc4, 0x1d, 0x53, 0xbf, 0x9f, 0x59, 0xbf, 0x06, 0xb2, 0xfc, 0x07, 0x63, + 0xc6, 0xb2, 0xbf, 0x3d, 0x62, 0x2e, 0xbc, 0x37, 0x92, 0xcb, 0x49, 0x65, + 0x41, 0xad, 0xdd, 0x1c, 0xbe, 0xee, 0xce, 0x4b, 0x2f, 0x36, 0x00, 0xb2, + 0xe7, 0x61, 0x65, 0x61, 0xb3, 0x21, 0xcb, 0x49, 0x65, 0xfd, 0x9b, 0x07, + 0xbb, 0xfa, 0xb2, 0xa0, 0xf0, 0x98, 0x11, 0xbf, 0xe7, 0x96, 0xa3, 0x67, + 0xd0, 0x16, 0x58, 0xd6, 0x5e, 0x60, 0xfa, 0xb2, 0xf7, 0x1f, 0xab, 0x2a, + 0x0f, 0x25, 0x81, 0x0f, 0x87, 0x6e, 0x9d, 0xe5, 0x97, 0xf3, 0x7a, 0x63, + 0x0c, 0x2c, 0xbc, 0xde, 0x81, 0x65, 0xbb, 0x07, 0x95, 0x85, 0xb7, 0xf4, + 0x37, 0x18, 0x8e, 0x2c, 0xad, 0x95, 0x31, 0xe1, 0x18, 0x15, 0x74, 0xc2, + 0xd2, 0x2f, 0x42, 0x0b, 0xf3, 0x02, 0x63, 0xe9, 0x35, 0xf3, 0x73, 0x58, + 0xb2, 0xff, 0xbf, 0xf6, 0x7d, 0x2e, 0x9c, 0xcb, 0x2b, 0x0f, 0x74, 0x24, + 0x37, 0x66, 0xcb, 0x2c, 0x15, 0x94, 0x33, 0x51, 0xa1, 0x7b, 0xfc, 0x4e, + 0x2f, 0x39, 0x1f, 0xac, 0xbd, 0x0f, 0xa5, 0x97, 0xfd, 0xad, 0x1f, 0xd2, + 0xeb, 0xfc, 0xb2, 0xf4, 0xfb, 0xb0, 0xb2, 0xff, 0xa1, 0xb2, 0xcd, 0xb0, + 0x2c, 0xb5, 0x97, 0xfd, 0x1f, 0x9c, 0xbc, 0x65, 0xfa, 0xcb, 0x6c, 0xb2, + 0xe7, 0xee, 0x8f, 0x2d, 0x96, 0x73, 0x58, 0x8d, 0x93, 0x20, 0x78, 0x44, + 0x5e, 0x16, 0x04, 0x59, 0x79, 0xc8, 0x6b, 0xab, 0xe9, 0x7d, 0x20, 0xc3, + 0x0b, 0x2d, 0xfa, 0xca, 0xc3, 0x6a, 0xe4, 0x75, 0x0a, 0x94, 0x06, 0x42, + 0xc1, 0xa1, 0x8d, 0xea, 0x31, 0x4f, 0x19, 0x7e, 0x3d, 0xd5, 0xdb, 0xfd, + 0xdf, 0x64, 0xbc, 0x7b, 0xd6, 0x5f, 0x37, 0x41, 0xd9, 0x65, 0xff, 0xf1, + 0x1b, 0x0c, 0xf9, 0xdf, 0x05, 0xe5, 0x28, 0x59, 0x50, 0x7e, 0xd8, 0x49, + 0x7e, 0xf6, 0x77, 0x90, 0xb2, 0xfc, 0x5d, 0x0e, 0x79, 0x65, 0xd3, 0x82, + 0xb2, 0xa0, 0xf0, 0x36, 0x27, 0xad, 0x93, 0xcd, 0x93, 0xcb, 0x10, 0xab, + 0x01, 0x06, 0x99, 0xef, 0x0d, 0xe4, 0xb2, 0xe3, 0xd2, 0xca, 0xc3, 0x65, + 0xe1, 0xcb, 0xf3, 0x91, 0x1b, 0x56, 0x5e, 0xcd, 0xe2, 0x2c, 0xb8, 0xfc, + 0xb2, 0xf0, 0xde, 0x4b, 0x2f, 0x9d, 0xb8, 0xd5, 0x97, 0xc6, 0xd8, 0xdc, + 0x59, 0x71, 0xea, 0x71, 0xe2, 0xe1, 0x0d, 0x0d, 0x14, 0xb8, 0x2d, 0xe6, + 0x1b, 0xf1, 0xb5, 0xcb, 0x16, 0x5e, 0x38, 0x92, 0xca, 0x9c, 0xcd, 0xc2, + 0x64, 0x0e, 0x41, 0xbc, 0x96, 0xc6, 0x43, 0x92, 0x8e, 0xd8, 0x86, 0x11, + 0xca, 0xb2, 0xf4, 0x38, 0x9e, 0x71, 0x9b, 0xf8, 0x42, 0x11, 0x07, 0x09, + 0x43, 0x0c, 0x49, 0xf2, 0xfd, 0xd2, 0x5b, 0xff, 0xbb, 0x07, 0xe7, 0xd4, + 0x31, 0x93, 0x2c, 0xbf, 0x0e, 0x3d, 0x02, 0x2c, 0xa7, 0x3e, 0xc0, 0xa2, + 0x5f, 0xd9, 0xec, 0x00, 0x71, 0x65, 0xda, 0x6a, 0xcb, 0xe3, 0xec, 0x49, + 0x65, 0xfe, 0x0b, 0x9c, 0xa0, 0x80, 0xb2, 0xb0, 0xfa, 0x7c, 0x2f, 0xc2, + 0x1b, 0xff, 0x1e, 0xbc, 0xfc, 0x63, 0x5d, 0x02, 0xcb, 0xf1, 0xf6, 0x3b, + 0xc4, 0x97, 0xc0, 0x8e, 0xf1, 0x25, 0xc2, 0x8a, 0x92, 0xa4, 0x7c, 0x58, + 0x4e, 0x29, 0x15, 0x24, 0x66, 0x6b, 0xeb, 0xc8, 0xee, 0x16, 0x1a, 0x37, + 0x9c, 0xbf, 0x59, 0x79, 0xfc, 0xeb, 0x2b, 0x0f, 0x81, 0x82, 0x9f, 0x0e, + 0x5f, 0x4c, 0x4e, 0x2a, 0xcb, 0xd3, 0x78, 0xd6, 0x5f, 0xff, 0x76, 0x01, + 0x98, 0x5d, 0xf1, 0xc1, 0x6c, 0xb2, 0xff, 0xf0, 0xaf, 0xce, 0x9f, 0x8f, + 0x18, 0x3d, 0x2c, 0xa5, 0x95, 0x88, 0xa2, 0xf2, 0x6f, 0x12, 0xa8, 0x6a, + 0xdc, 0xa6, 0x21, 0x6c, 0x25, 0x7f, 0x8d, 0xf0, 0x8b, 0xf8, 0x46, 0x2c, + 0x2f, 0xef, 0xff, 0x14, 0x7d, 0xfe, 0x14, 0x4b, 0x5a, 0x85, 0x97, 0xfe, + 0xef, 0x30, 0x1e, 0x72, 0xef, 0x16, 0x5e, 0x32, 0xfd, 0x64, 0xe3, 0x7d, + 0x4d, 0x45, 0xae, 0xf8, 0x43, 0xdf, 0xfe, 0x86, 0x1a, 0x78, 0xde, 0xf0, + 0x25, 0xd5, 0x95, 0x07, 0xe9, 0xe2, 0xab, 0xfa, 0x3d, 0x1e, 0x8d, 0x96, + 0x5e, 0xec, 0x0d, 0x65, 0xff, 0xd2, 0x37, 0xfa, 0x5d, 0xe1, 0x1b, 0x0b, + 0x2a, 0x0f, 0x87, 0x07, 0x2b, 0x64, 0x57, 0x4a, 0x11, 0xd7, 0x3f, 0x16, + 0x5b, 0xd0, 0x6f, 0xdc, 0xa6, 0xfd, 0x2f, 0x06, 0x34, 0xb2, 0xff, 0x46, + 0xf3, 0xde, 0x41, 0xe2, 0xcb, 0xf8, 0xf8, 0xff, 0x4b, 0x16, 0x5c, 0xed, + 0xd1, 0xf1, 0xcf, 0x9b, 0x5f, 0xe3, 0x8e, 0x94, 0x37, 0x8b, 0x2b, 0xe4, + 0x76, 0x7a, 0x11, 0x64, 0x61, 0x7e, 0xc0, 0xb6, 0x38, 0xb2, 0x96, 0x5d, + 0x93, 0x68, 0xd9, 0x70, 0x9e, 0xff, 0x8c, 0x2c, 0xbf, 0x40, 0x85, 0xb2, + 0xcb, 0xfe, 0x8d, 0xa3, 0xee, 0x96, 0x6c, 0xb2, 0xf6, 0xe9, 0x8a, 0xb2, + 0xb1, 0x18, 0xa0, 0x2d, 0x33, 0xed, 0xd3, 0xab, 0xff, 0x84, 0xe1, 0xf2, + 0x63, 0x1e, 0x17, 0xeb, 0x2f, 0x48, 0x9d, 0x65, 0xf3, 0xf7, 0x36, 0x59, + 0x74, 0x7c, 0xb2, 0xe2, 0x85, 0x96, 0x6c, 0x1f, 0x4f, 0x86, 0xc8, 0x8b, + 0xa2, 0xf7, 0xff, 0xe0, 0xbe, 0xe0, 0x85, 0x1e, 0x73, 0xec, 0x77, 0x8b, + 0x28, 0x69, 0xa3, 0x3c, 0x2b, 0xc9, 0x02, 0xf8, 0x07, 0xac, 0x59, 0x53, + 0x2b, 0x05, 0xd4, 0x65, 0x9e, 0x8e, 0x10, 0x8d, 0x2f, 0xb3, 0xd9, 0xb2, + 0xcb, 0xd2, 0x7d, 0x2c, 0xbf, 0xbf, 0x6b, 0xcb, 0x06, 0xb2, 0xc1, 0x59, + 0x7e, 0xe7, 0xa0, 0xba, 0xb2, 0xd9, 0xc3, 0x71, 0xbc, 0x46, 0xfb, 0x3b, + 0x83, 0x49, 0x7f, 0xce, 0x4c, 0x61, 0x3f, 0x78, 0xb2, 0xf9, 0xd8, 0xfc, + 0x55, 0x95, 0x23, 0xfd, 0xf1, 0x09, 0x1b, 0xdf, 0x41, 0x14, 0x2c, 0xa9, + 0x93, 0x74, 0xd0, 0xe1, 0x33, 0x76, 0x14, 0xa2, 0x17, 0x5f, 0xce, 0x2b, + 0xf5, 0xd8, 0x59, 0x7d, 0xff, 0x1b, 0xa5, 0x94, 0xc2, 0xa3, 0x93, 0x8e, + 0x5b, 0x4a, 0x3d, 0x2e, 0xbf, 0xff, 0xbe, 0x96, 0x75, 0x93, 0x3d, 0xe0, + 0xc3, 0xd3, 0xec, 0x69, 0x65, 0xfd, 0xd3, 0xd4, 0x05, 0x96, 0xb2, 0xed, + 0x3f, 0x91, 0x2c, 0x23, 0x2d, 0xfe, 0xcf, 0x64, 0xef, 0x66, 0xcb, 0x29, + 0xcf, 0x90, 0x8b, 0xef, 0xfe, 0xe9, 0xed, 0xde, 0x07, 0x73, 0xaf, 0xe5, + 0x97, 0xff, 0xc5, 0x9d, 0x3c, 0x2f, 0x67, 0x7c, 0x60, 0x59, 0x7f, 0xdd, + 0x36, 0xf3, 0xd0, 0x21, 0x2c, 0xbf, 0xe8, 0x20, 0x3f, 0x5f, 0xef, 0xe7, + 0x22, 0x17, 0xe4, 0xca, 0x92, 0x64, 0x5f, 0xc3, 0x3a, 0xfe, 0x0b, 0x2c, + 0xf5, 0xac, 0x59, 0x7f, 0xbd, 0x8c, 0x3c, 0x1c, 0xfa, 0xcb, 0xfd, 0x9c, + 0xcd, 0xcf, 0x40, 0xd6, 0x5d, 0x1b, 0x2c, 0xbd, 0xe8, 0x99, 0x65, 0xfe, + 0x83, 0x2c, 0xd8, 0x49, 0x2c, 0xb7, 0xc3, 0x3e, 0x7c, 0x17, 0xf0, 0xed, + 0xb8, 0x04, 0xc1, 0xbc, 0x6a, 0x18, 0x4e, 0x5f, 0x75, 0x8c, 0xf2, 0xcb, + 0xb5, 0x25, 0x97, 0xfe, 0x2c, 0xef, 0x43, 0xb7, 0x70, 0x0b, 0x2f, 0xc3, + 0x0b, 0xea, 0x4b, 0x2f, 0x16, 0x0a, 0xb2, 0xf9, 0xbc, 0x11, 0xab, 0x2a, + 0x0f, 0x03, 0x07, 0x2d, 0xc5, 0x96, 0x15, 0x65, 0xc7, 0xfa, 0xcb, 0xe1, + 0x5c, 0xa4, 0xb2, 0xef, 0x1a, 0xcb, 0x72, 0x71, 0xe7, 0x8c, 0x5e, 0x62, + 0x2a, 0x34, 0x4c, 0x85, 0x86, 0x9d, 0x19, 0x9f, 0xc2, 0xaa, 0xef, 0xe1, + 0x65, 0xdf, 0xc2, 0xcb, 0xf0, 0x65, 0x84, 0xcc, 0xcd, 0x77, 0xe2, 0xf5, + 0x0a, 0x98, 0x86, 0x46, 0xc0, 0xb9, 0x9f, 0xe9, 0xa3, 0xf8, 0x76, 0x12, + 0xb5, 0xff, 0xe2, 0x7f, 0xb8, 0xc3, 0x0f, 0x38, 0x0d, 0xfd, 0x65, 0xf4, + 0x6a, 0x3c, 0xb2, 0xb0, 0xfc, 0x5d, 0x42, 0xff, 0xb0, 0xfe, 0xee, 0xa3, + 0x3e, 0x59, 0x7f, 0xf7, 0x7d, 0x8d, 0x12, 0x3f, 0xcf, 0xba, 0xb2, 0xff, + 0x7c, 0x03, 0xd0, 0x90, 0x35, 0x97, 0xdf, 0xb5, 0xe5, 0x39, 0x1a, 0xa4, + 0x41, 0xc3, 0x9e, 0xa3, 0xdc, 0x1e, 0xac, 0xbf, 0xbf, 0x68, 0x9c, 0x13, + 0x65, 0x97, 0xf7, 0x0c, 0x8a, 0x3e, 0x59, 0x76, 0x7c, 0xb2, 0xbe, 0x3f, + 0x6e, 0x99, 0xcf, 0x96, 0x5f, 0xfe, 0x12, 0x05, 0x89, 0xa4, 0xe5, 0x9f, + 0x75, 0x65, 0xf7, 0xfa, 0x3d, 0x2c, 0xa8, 0x4e, 0x16, 0x4a, 0xcf, 0x08, + 0xde, 0x19, 0x8a, 0x99, 0x7f, 0x73, 0x91, 0x28, 0xd2, 0xcb, 0xfe, 0xd4, + 0x34, 0xe6, 0x87, 0xdc, 0x59, 0x58, 0x7d, 0x00, 0x2d, 0xbc, 0x1f, 0xba, + 0xb2, 0xce, 0xb2, 0xe9, 0xb8, 0xb2, 0x88, 0xf9, 0xf8, 0x43, 0xd1, 0xe1, + 0x04, 0x2e, 0xc1, 0x56, 0x5f, 0xf4, 0x7d, 0x9f, 0xc6, 0xfc, 0xd9, 0x65, + 0xfc, 0x59, 0xde, 0x3f, 0xeb, 0x2b, 0x48, 0x80, 0xfc, 0x5f, 0x87, 0x97, + 0xf8, 0xb6, 0x3d, 0x7d, 0xed, 0x96, 0x5f, 0xf4, 0x6d, 0xcd, 0x60, 0x23, + 0x65, 0x97, 0xfb, 0x0b, 0x6c, 0x1b, 0xf9, 0x65, 0x4c, 0x7d, 0x82, 0x9d, + 0x5f, 0xd8, 0xdc, 0x19, 0x8a, 0xb2, 0xe6, 0xc2, 0xca, 0x69, 0xe1, 0xb9, + 0x6d, 0xfc, 0x59, 0x37, 0x8f, 0xab, 0x2f, 0xb3, 0x3d, 0xc5, 0x95, 0x09, + 0xbc, 0x64, 0x28, 0x9d, 0x9f, 0xa4, 0x3b, 0xa5, 0xb7, 0x85, 0x14, 0x54, + 0x97, 0xec, 0x60, 0x83, 0xc4, 0x8c, 0xcd, 0x05, 0xf3, 0x31, 0x45, 0x15, + 0x65, 0xd9, 0xfa, 0xca, 0xc3, 0x7f, 0xd2, 0x8a, 0x84, 0x4c, 0xf5, 0xe6, + 0xff, 0xf8, 0xe4, 0xfc, 0x6b, 0x5e, 0x4e, 0xc7, 0x8d, 0x65, 0xf1, 0xeb, + 0xfe, 0x2c, 0xbf, 0xf0, 0x59, 0x79, 0x3e, 0x58, 0x2b, 0xfe, 0xb2, 0xff, + 0xed, 0xa3, 0xf8, 0x94, 0x6b, 0x58, 0x2a, 0xca, 0x84, 0x46, 0x1a, 0x35, + 0xff, 0x73, 0x50, 0x1e, 0x91, 0xef, 0x59, 0x7f, 0xe2, 0xce, 0x03, 0xc6, + 0x08, 0x25, 0x97, 0xff, 0xf9, 0x81, 0x5f, 0x4c, 0x33, 0xe6, 0x48, 0x82, + 0xfc, 0xc2, 0x59, 0x50, 0x8d, 0xac, 0x3a, 0x33, 0xcb, 0xfb, 0x41, 0x07, + 0x8f, 0x8b, 0x2f, 0x85, 0x72, 0x92, 0xcb, 0xfe, 0xec, 0x7d, 0xfb, 0xfb, + 0xc6, 0xb2, 0xde, 0x59, 0x58, 0x79, 0x60, 0x3a, 0xbe, 0xe1, 0xb6, 0x16, + 0x5f, 0x8b, 0x3b, 0x1a, 0x59, 0x78, 0x51, 0x45, 0x49, 0x7e, 0x76, 0x3c, + 0x7d, 0x48, 0xcc, 0xd0, 0x54, 0x22, 0x00, 0xd1, 0xaf, 0x9b, 0xc8, 0xea, + 0xcb, 0xdb, 0xe1, 0xab, 0x2f, 0x74, 0xc5, 0x59, 0x7b, 0x8f, 0xa5, 0x95, + 0xf1, 0xb9, 0xe8, 0xed, 0xef, 0x40, 0xd6, 0x54, 0x22, 0xdf, 0x08, 0x8d, + 0x5d, 0xc8, 0xaf, 0xbf, 0xcc, 0x99, 0x65, 0xf7, 0x30, 0xba, 0xb2, 0xb0, + 0xf1, 0x1c, 0x8e, 0xdc, 0x9c, 0xa8, 0xdf, 0xe2, 0x1d, 0x42, 0x87, 0xd0, + 0xd8, 0x27, 0xdb, 0xd3, 0xf9, 0xf2, 0xcb, 0x48, 0x6a, 0xc8, 0xb2, 0x55, + 0x21, 0xaf, 0x54, 0xf6, 0xae, 0x34, 0x32, 0xd4, 0x2f, 0xe8, 0x6c, 0x7a, + 0x3f, 0x59, 0x7a, 0x36, 0x0a, 0xcb, 0x32, 0xf0, 0xf2, 0xbc, 0x5b, 0x7f, + 0xf1, 0xf6, 0x35, 0x85, 0xd7, 0x72, 0x59, 0x53, 0x2f, 0x25, 0x6a, 0x15, + 0xfe, 0x87, 0xd9, 0x4b, 0xba, 0x0b, 0xde, 0xf2, 0xbb, 0xff, 0xa3, 0x0b, + 0x06, 0xf2, 0x28, 0xd9, 0x65, 0xf0, 0x35, 0x12, 0x59, 0x76, 0xf8, 0x59, + 0x7f, 0xe3, 0xd0, 0x3c, 0x60, 0xf1, 0x92, 0xcb, 0xff, 0xff, 0xce, 0x5f, + 0xf7, 0xd8, 0xde, 0xf3, 0x37, 0xf8, 0xc1, 0xe3, 0x10, 0x3b, 0x2c, 0xad, + 0x91, 0x73, 0xf9, 0xed, 0x42, 0x3d, 0xb2, 0x1a, 0x35, 0x8c, 0x88, 0x53, + 0x9e, 0x99, 0xd3, 0x6b, 0xa0, 0x94, 0x63, 0x17, 0x8a, 0x37, 0xac, 0xbf, + 0xfb, 0x50, 0x0f, 0x13, 0xf4, 0xa0, 0x55, 0x97, 0x32, 0xcd, 0x65, 0xc7, + 0xe5, 0x95, 0xb1, 0xb0, 0xd0, 0xd5, 0x42, 0x25, 0x5d, 0xce, 0xf4, 0xcf, + 0xb2, 0xcb, 0xdc, 0x0e, 0xe2, 0xca, 0xc3, 0x7d, 0xd1, 0xeb, 0xfd, 0x05, + 0x22, 0x38, 0xf9, 0x65, 0x43, 0xa1, 0xeb, 0x94, 0x74, 0x23, 0x8c, 0x3b, + 0x27, 0x05, 0x98, 0x95, 0x08, 0x08, 0xcf, 0xfe, 0x8d, 0x08, 0xca, 0xa6, + 0x8c, 0xdf, 0x52, 0xa7, 0xbd, 0x2c, 0xd5, 0xe3, 0x1e, 0xfe, 0x17, 0x85, + 0x1d, 0x4f, 0x23, 0x09, 0xed, 0x22, 0x9f, 0x7a, 0xc4, 0xfc, 0x2c, 0x84, + 0x5f, 0xdd, 0x20, 0xbf, 0x1c, 0xd2, 0x32, 0x59, 0x74, 0xf4, 0x6b, 0x2f, + 0xfa, 0x6e, 0xee, 0xf2, 0x26, 0x0e, 0x96, 0x5f, 0xe1, 0xc1, 0x36, 0x07, + 0x0b, 0x2a, 0x0f, 0xc1, 0xcf, 0xef, 0xfb, 0xd1, 0xb6, 0xa2, 0x4f, 0xa5, + 0x97, 0xe2, 0x60, 0x48, 0xfd, 0x65, 0xff, 0x89, 0xfe, 0xef, 0xa0, 0x19, + 0x32, 0xcb, 0xc2, 0x39, 0x2c, 0xac, 0x44, 0x29, 0x15, 0x6e, 0x9f, 0xdf, + 0xdb, 0x41, 0x1b, 0x71, 0x65, 0xff, 0x8f, 0xd0, 0x3f, 0x06, 0x3e, 0xe2, + 0xcb, 0xc4, 0x58, 0xb2, 0xb0, 0xf6, 0x5c, 0xfe, 0xf0, 0xd8, 0xfd, 0x65, + 0xf9, 0xba, 0xd3, 0xf5, 0x65, 0xff, 0x9a, 0x38, 0x2c, 0xde, 0x59, 0xc5, + 0x95, 0x39, 0x10, 0xb0, 0x3e, 0x65, 0x17, 0xff, 0x4c, 0xe0, 0xf4, 0x4b, + 0xa5, 0x8d, 0x59, 0x7f, 0x6b, 0x08, 0x9f, 0x65, 0x94, 0x03, 0xf0, 0x34, + 0x4b, 0xff, 0xa0, 0x5f, 0xa5, 0xc9, 0xd9, 0xec, 0x25, 0x97, 0xff, 0x9b, + 0xf4, 0xb9, 0x3b, 0x08, 0xb0, 0xff, 0x59, 0x7f, 0x3e, 0x83, 0x1f, 0x49, + 0x65, 0x19, 0xfd, 0x3a, 0x65, 0xfc, 0xd7, 0xc1, 0x9e, 0xf5, 0x97, 0x8f, + 0xc1, 0x59, 0x7f, 0x18, 0xb8, 0x08, 0xfd, 0x65, 0x4e, 0x5d, 0x05, 0x64, + 0x13, 0xca, 0x11, 0x63, 0x20, 0xc8, 0x5f, 0x19, 0x8e, 0xa1, 0x0b, 0xe8, + 0x52, 0xbc, 0x28, 0x08, 0x87, 0xb0, 0xc1, 0x09, 0x06, 0xf2, 0xed, 0xd1, + 0xcb, 0x33, 0x64, 0x4b, 0x00, 0x9d, 0x9e, 0xa1, 0xee, 0xc9, 0x8e, 0x2a, + 0x79, 0x8f, 0xf6, 0x7b, 0x87, 0xbb, 0x2b, 0xc7, 0xa3, 0x3c, 0x63, 0x8f, + 0x65, 0x50, 0xd5, 0x65, 0x21, 0x3d, 0x3c, 0x21, 0x15, 0x15, 0xff, 0xee, + 0xd4, 0x8e, 0xc9, 0x56, 0x14, 0x83, 0xad, 0xd3, 0xb2, 0xf9, 0x26, 0x18, + 0x9d, 0xf2, 0x05, 0x72, 0x37, 0xf5, 0x64, 0xe0, 0x75, 0xa6, 0xee, 0xe4, + 0xa6, 0xc9, 0xab, 0xc6, 0x6d, 0x57, 0x8c, 0x8d, 0xac, 0x94, 0x3d, 0x6c, + 0x72, 0x9e, 0xd8, 0x64, 0x7f, 0x59, 0xbe, 0x32, 0xe3, 0x74, 0x2b, 0x62, + 0x9f, 0xcb, 0xf1, 0x3f, 0xed, 0xe0, 0xdf, 0x06, 0x92, 0xff, 0xbe, 0x75, + 0xb8, 0x59, 0xd5, 0x09, 0xfa, 0x71, 0x68, 0x96, 0x9b, 0x67, 0x76, 0x7a, + 0x02, 0x99, 0xcb, 0x04, 0xd5, 0x96, 0xb0, 0x17, 0x3b, 0xcd, 0xce, 0xac, + 0xbf, 0xce, 0xd8, 0xe9, 0xf0, 0xd6, 0x5f, 0xb3, 0x42, 0x77, 0x8b, 0x2c, + 0xcf, 0xf3, 0xf6, 0x21, 0xce, 0x18, 0xdf, 0xe6, 0x79, 0xa0, 0x3b, 0x81, + 0x51, 0x71, 0xaf, 0xf3, 0x3c, 0xd0, 0x1d, 0xc0, 0xa8, 0xba, 0xd7, 0xff, + 0x33, 0x79, 0x33, 0xcd, 0x01, 0xdc, 0x0a, 0x89, 0x45, 0x51, 0x2c, 0x37, + 0x62, 0x50, 0xae, 0x19, 0x53, 0x10, 0xc5, 0x01, 0x49, 0xce, 0x16, 0xee, + 0x43, 0xd5, 0xf5, 0x82, 0x97, 0xff, 0x0b, 0x4e, 0x1b, 0xf5, 0x07, 0x75, + 0x06, 0xff, 0xf3, 0x36, 0xbc, 0x99, 0xe6, 0x80, 0xee, 0x05, 0x44, 0xb4, + 0xbf, 0xe9, 0xe1, 0xe3, 0xdc, 0x78, 0xfb, 0x75, 0x65, 0xff, 0xff, 0xc2, + 0xee, 0xf6, 0x7b, 0x1b, 0x67, 0xb2, 0x36, 0x55, 0xd6, 0x5e, 0xa7, 0x99, + 0xd3, 0xbd, 0x3e, 0xb2, 0xf3, 0xb8, 0x15, 0x11, 0xba, 0xfd, 0xf4, 0xc5, + 0x03, 0x59, 0x6d, 0x00, 0xf4, 0x5c, 0xa2, 0xff, 0x68, 0xd9, 0x60, 0xf4, + 0x0a, 0xb2, 0xf0, 0x67, 0xc5, 0x59, 0x7d, 0xa0, 0xc7, 0xeb, 0x28, 0xcf, + 0xf2, 0x63, 0x81, 0x08, 0x6f, 0xff, 0xff, 0xb7, 0x96, 0x73, 0x83, 0x8c, + 0xd0, 0x1d, 0xc0, 0xce, 0x47, 0xd8, 0xef, 0x15, 0x18, 0x7a, 0xde, 0x84, + 0x5e, 0x19, 0x85, 0xfd, 0xc6, 0x62, 0xf3, 0x70, 0x45, 0x97, 0xed, 0xd6, + 0x7a, 0x65, 0x8a, 0xb2, 0xf8, 0x65, 0x9f, 0xac, 0xbe, 0x81, 0x5a, 0x35, + 0x95, 0x87, 0x8b, 0xa2, 0x2b, 0xff, 0x3c, 0x99, 0xe6, 0x80, 0xee, 0x05, + 0x44, 0xbe, 0xb6, 0x2c, 0xbd, 0xe7, 0xea, 0xcb, 0x77, 0x86, 0xb0, 0x41, + 0x0b, 0xf8, 0x43, 0xfb, 0x77, 0x42, 0xac, 0xa8, 0x3d, 0xc3, 0x28, 0xbf, + 0xa0, 0xf7, 0x33, 0xe9, 0x2c, 0xbf, 0x69, 0x8f, 0x07, 0x8b, 0x2b, 0xc7, + 0xb4, 0x21, 0x85, 0xe8, 0xd4, 0x2c, 0xac, 0x37, 0xc6, 0x47, 0x7a, 0x4f, + 0xe5, 0x97, 0xbf, 0x81, 0x56, 0x5f, 0xec, 0x3d, 0x4b, 0xc6, 0x2a, 0xca, + 0xdc, 0x3d, 0x1f, 0x0f, 0x5f, 0x07, 0xc7, 0xa5, 0x97, 0xdc, 0xf4, 0x79, + 0x65, 0xfe, 0x8d, 0xa0, 0xb6, 0xcd, 0xd5, 0x97, 0x73, 0x4b, 0x2a, 0x0f, + 0xbf, 0x62, 0x29, 0x8d, 0xac, 0xcd, 0x95, 0x2f, 0x41, 0x42, 0x2e, 0x43, + 0xa8, 0x11, 0xaf, 0xfc, 0x4f, 0xb8, 0x6d, 0xa7, 0x86, 0x90, 0xfa, 0x1a, + 0x85, 0x0b, 0x8e, 0x0f, 0xf5, 0xb6, 0x7c, 0x94, 0x48, 0x48, 0xdf, 0xff, + 0x8a, 0x00, 0xcf, 0xbf, 0x00, 0xf8, 0x59, 0xbd, 0xd6, 0x5f, 0xfd, 0x2e, + 0x9c, 0xcc, 0xc6, 0x7b, 0xe0, 0x6b, 0x2f, 0xc2, 0xb3, 0x36, 0x36, 0x59, + 0x7f, 0x99, 0xfe, 0xff, 0x7e, 0x7f, 0x2c, 0xa1, 0xa6, 0x0f, 0xf2, 0xc1, + 0xa4, 0x91, 0x6d, 0xfe, 0x67, 0x9a, 0x03, 0xb8, 0x15, 0x15, 0x5a, 0xe9, + 0xf6, 0x42, 0xcb, 0x8f, 0x75, 0x65, 0xd9, 0xa5, 0x97, 0xb3, 0xee, 0xac, + 0xbe, 0x36, 0xbe, 0xf5, 0x94, 0xc1, 0xf7, 0xb8, 0xcf, 0xe2, 0xdd, 0x1d, + 0xbc, 0x5b, 0xa2, 0xac, 0xbf, 0xbd, 0x1b, 0xc2, 0x3c, 0x59, 0x7f, 0x3f, + 0xa6, 0x28, 0x1a, 0xcb, 0xff, 0xee, 0xfe, 0xd0, 0x8f, 0x33, 0xbf, 0xb4, + 0x3f, 0x2c, 0xbf, 0xfb, 0xbe, 0x8e, 0x13, 0x85, 0x96, 0x7a, 0x59, 0x7a, + 0x25, 0x8b, 0x2f, 0xe3, 0x08, 0x0a, 0x26, 0x59, 0x52, 0x4c, 0xfc, 0x65, + 0xf8, 0x5b, 0xf2, 0xa4, 0xc8, 0xfe, 0x1b, 0xbf, 0xe6, 0x30, 0xb3, 0xee, + 0xbb, 0x56, 0x5e, 0xdd, 0x8e, 0xac, 0xbf, 0xa1, 0xa2, 0x41, 0x01, 0x65, + 0xd1, 0xa5, 0x95, 0xa3, 0xc3, 0xe1, 0x6d, 0xcf, 0xf2, 0xcb, 0xc2, 0x47, + 0xeb, 0x2b, 0xe3, 0x6b, 0xd1, 0x7b, 0xfb, 0x1b, 0x33, 0xbe, 0xcb, 0x2f, + 0x75, 0xfe, 0x59, 0x7f, 0xfd, 0x2f, 0x3c, 0x98, 0x7e, 0x60, 0x79, 0xc3, + 0x59, 0x4b, 0x2b, 0x0f, 0x6f, 0x75, 0x42, 0x8d, 0x19, 0x4e, 0x5c, 0x4f, + 0x17, 0x0c, 0xd6, 0x5f, 0xb4, 0x07, 0x70, 0x2a, 0x24, 0x05, 0xf6, 0xb0, + 0xba, 0xb2, 0xb0, 0xf5, 0x74, 0x69, 0x53, 0x91, 0x18, 0xcd, 0xae, 0xfd, + 0xc7, 0x27, 0xf9, 0x65, 0xd8, 0x4b, 0x2e, 0x0c, 0x2c, 0xa9, 0x1f, 0xcf, + 0xc4, 0xfb, 0x84, 0xfa, 0x15, 0xbf, 0xa3, 0x5b, 0x46, 0xb6, 0x59, 0x7c, + 0x6d, 0x8e, 0x2c, 0xa9, 0x1e, 0x83, 0x05, 0xf7, 0xfb, 0x5b, 0x36, 0x0a, + 0x5c, 0x59, 0x50, 0x7a, 0xf8, 0x47, 0x7f, 0xfb, 0xc7, 0x0d, 0x71, 0x89, + 0xbb, 0x05, 0x25, 0x97, 0xb6, 0x71, 0xac, 0xbf, 0xc0, 0x3c, 0x14, 0x25, + 0xd5, 0x95, 0x87, 0xa1, 0xf0, 0xed, 0xfc, 0x24, 0xf7, 0xa3, 0x86, 0xac, + 0xbb, 0x92, 0x59, 0x4e, 0x79, 0x5c, 0x33, 0xb9, 0x93, 0xe5, 0x97, 0xff, + 0x4d, 0xe7, 0x6f, 0x7d, 0x1d, 0x0b, 0x56, 0x5f, 0xfd, 0x83, 0x89, 0x46, + 0x0e, 0x0b, 0xab, 0x2b, 0x11, 0x0e, 0xd4, 0x6b, 0xdb, 0xb1, 0xd5, 0x95, + 0x0c, 0x8a, 0x5d, 0xa1, 0x1a, 0x33, 0xdc, 0x8d, 0x7d, 0x85, 0x9d, 0xc3, + 0x99, 0x98, 0x9a, 0xaf, 0xe8, 0x76, 0x3c, 0x66, 0x45, 0x0e, 0x7e, 0x10, + 0x76, 0x13, 0x81, 0x6c, 0x9f, 0x21, 0x12, 0x14, 0x5b, 0xa4, 0x57, 0xfe, + 0x94, 0x67, 0xfe, 0xcc, 0x20, 0x2c, 0xbf, 0x41, 0x16, 0x75, 0x65, 0xf6, + 0xb4, 0x60, 0x59, 0x7c, 0x59, 0xb3, 0x3c, 0x44, 0x24, 0xf9, 0xe8, 0x84, + 0xb7, 0xf9, 0x9f, 0x9d, 0xb9, 0x03, 0x59, 0x4c, 0xd5, 0x0e, 0x6a, 0x39, + 0xc9, 0xf4, 0xcb, 0xfc, 0xcf, 0x34, 0x07, 0x70, 0x2a, 0x2c, 0x85, 0xff, + 0xfe, 0xf3, 0xe9, 0x9f, 0x9f, 0xa4, 0x1d, 0xb9, 0x8d, 0x8d, 0xc5, 0x97, + 0xf1, 0xef, 0x67, 0xc8, 0xf9, 0x65, 0xff, 0xff, 0xa2, 0x41, 0x1e, 0x33, + 0x13, 0x3c, 0x41, 0x7d, 0xcc, 0x62, 0x38, 0xb2, 0xb8, 0x8a, 0x3e, 0x99, + 0x50, 0xd3, 0x2c, 0x38, 0xc2, 0x6f, 0xf3, 0x3c, 0xd0, 0x1d, 0xc0, 0xa8, + 0xb5, 0xd7, 0xff, 0xb0, 0x48, 0xd9, 0x9e, 0x4d, 0xd1, 0xc1, 0x2c, 0xbf, + 0xcc, 0xf3, 0x40, 0x77, 0x02, 0xa2, 0xe4, 0x5f, 0xb4, 0x07, 0x70, 0x2a, + 0x2e, 0xc5, 0xff, 0x9e, 0x4c, 0xf3, 0x40, 0x77, 0x02, 0xa2, 0x8e, 0x59, + 0x9e, 0x22, 0x01, 0xa6, 0x97, 0xc5, 0x12, 0x6a, 0xcb, 0xf4, 0x8c, 0xbf, + 0x35, 0x97, 0xfe, 0x9e, 0xd9, 0x2d, 0x8d, 0x4b, 0x0f, 0x7a, 0xcb, 0x49, + 0x65, 0xfb, 0x40, 0x77, 0x02, 0xa2, 0x95, 0x5f, 0xf0, 0x3c, 0x73, 0x7a, + 0x36, 0xc5, 0x97, 0xff, 0xbd, 0x1b, 0x47, 0x8f, 0x7b, 0x8f, 0xc6, 0xb1, + 0x99, 0xba, 0xba, 0x4c, 0xf1, 0x19, 0x73, 0x37, 0x57, 0xc9, 0x86, 0xbc, + 0x37, 0x2f, 0xfc, 0xe7, 0xd9, 0x04, 0x6e, 0x5f, 0xac, 0xbb, 0xc1, 0x59, + 0x66, 0x63, 0x54, 0x39, 0x84, 0x3f, 0x13, 0xb6, 0x35, 0x6f, 0x14, 0xf0, + 0xfa, 0xff, 0xff, 0xe7, 0xee, 0x7f, 0x12, 0x66, 0x23, 0x70, 0x71, 0x28, + 0x1b, 0xbb, 0x0b, 0x2b, 0x66, 0xe9, 0x52, 0x53, 0xdb, 0x99, 0x1f, 0xb7, + 0xc7, 0xa7, 0x4b, 0x02, 0x69, 0xeb, 0xc6, 0xdb, 0xf9, 0x49, 0x20, 0xf1, + 0x37, 0xb0, 0xc1, 0xdf, 0x29, 0x18, 0x56, 0x7b, 0xfe, 0x93, 0x3c, 0xd0, + 0x1d, 0xc0, 0xa8, 0x8e, 0x17, 0xfc, 0x6c, 0xf3, 0x40, 0x77, 0x02, 0xa2, + 0xb5, 0x59, 0x9b, 0xa2, 0x37, 0xa8, 0xf7, 0xff, 0x99, 0xb5, 0xe4, 0xcf, + 0x34, 0x07, 0x70, 0x2a, 0x25, 0xb5, 0x80, 0xb2, 0xf0, 0x75, 0xfa, 0xcb, + 0xb3, 0xe5, 0x97, 0xe6, 0xb6, 0x0f, 0x8b, 0x2f, 0xe8, 0xd7, 0xef, 0xf7, + 0x16, 0x58, 0x78, 0x7a, 0xde, 0x27, 0xbf, 0x76, 0x3c, 0x27, 0x16, 0x5e, + 0xde, 0x19, 0x2c, 0xa6, 0x4a, 0x61, 0x60, 0x11, 0xf8, 0x78, 0xdb, 0x48, + 0x9f, 0x79, 0x4d, 0xef, 0x0e, 0x4b, 0x2f, 0xc7, 0xba, 0x38, 0xf9, 0x65, + 0xff, 0x67, 0xc5, 0x9f, 0xfe, 0xf2, 0x59, 0x73, 0x40, 0xb2, 0xfe, 0x3f, + 0xb8, 0x3c, 0x25, 0x97, 0xf7, 0xd9, 0x28, 0xd7, 0xeb, 0x2b, 0x0f, 0x71, + 0xcb, 0x6f, 0xff, 0xa0, 0xb6, 0xe0, 0x5c, 0xe5, 0xcf, 0x3c, 0x96, 0x54, + 0x26, 0x39, 0x23, 0xad, 0x39, 0xf8, 0x82, 0xf8, 0xa3, 0xe9, 0x2c, 0xbf, + 0xf1, 0x97, 0x78, 0x30, 0xbe, 0xa4, 0xb2, 0xfe, 0xda, 0x00, 0xfa, 0xfd, + 0x65, 0xff, 0xf9, 0xfe, 0xfc, 0x7e, 0x79, 0x67, 0x08, 0x2e, 0x22, 0xcb, + 0xef, 0xf3, 0x53, 0x2c, 0xbf, 0x1f, 0xa0, 0x49, 0x96, 0x5e, 0xec, 0x35, + 0x65, 0x01, 0x34, 0xf9, 0x88, 0xb4, 0x7d, 0xe2, 0xff, 0xd5, 0xfa, 0x49, + 0xba, 0x53, 0x7f, 0xf3, 0x10, 0x5d, 0xcd, 0x1e, 0xce, 0xd5, 0x97, 0xcf, + 0x26, 0x0d, 0x65, 0x98, 0x59, 0xe3, 0x45, 0x7f, 0x1e, 0x88, 0xfb, 0xc5, + 0x97, 0xed, 0x39, 0x64, 0x2c, 0xa5, 0x44, 0x36, 0x33, 0xf3, 0xf1, 0x13, + 0x96, 0x5d, 0x04, 0xb2, 0xf6, 0x18, 0xd6, 0x5e, 0x1e, 0x35, 0x65, 0xc6, + 0x43, 0x36, 0xe6, 0x37, 0x50, 0x7e, 0xd2, 0x4c, 0xbf, 0x81, 0xe3, 0xd4, + 0x0d, 0x65, 0xf6, 0x4d, 0x2c, 0x59, 0x7f, 0xe7, 0x93, 0x3c, 0xd0, 0x1d, + 0xc0, 0xa8, 0x98, 0x17, 0xe0, 0xbf, 0x4f, 0xab, 0x2f, 0xf6, 0xcf, 0xdf, + 0xc4, 0x29, 0x2c, 0xb4, 0x2c, 0xbb, 0x63, 0x59, 0x58, 0x69, 0xc8, 0x42, + 0xee, 0x42, 0xca, 0x84, 0x5c, 0x99, 0x3b, 0xae, 0x84, 0x7e, 0xf0, 0xa7, + 0xfa, 0xcb, 0xee, 0x39, 0x7e, 0xb2, 0xa6, 0x3c, 0x0f, 0xc7, 0xaf, 0xf0, + 0x7e, 0xd1, 0xc3, 0x71, 0x65, 0xfb, 0xc7, 0x05, 0xb2, 0xcb, 0xfe, 0x8d, + 0xba, 0x50, 0x1e, 0xf1, 0x65, 0x79, 0x12, 0x7c, 0x33, 0x9f, 0x27, 0xbe, + 0x2c, 0xe4, 0x2c, 0xae, 0x9e, 0x9e, 0xf3, 0x3b, 0xd2, 0x3f, 0xd6, 0x5f, + 0x88, 0xb3, 0xa6, 0xb2, 0xfb, 0xe0, 0x1b, 0x0b, 0x2f, 0xce, 0xc6, 0x79, + 0xd6, 0x56, 0x22, 0xc6, 0x62, 0x47, 0x1d, 0xe9, 0x28, 0x49, 0x2f, 0xff, + 0x4b, 0xd8, 0x42, 0x89, 0xaf, 0x1c, 0x35, 0x65, 0xfc, 0x7d, 0xc6, 0xc7, + 0x96, 0x5f, 0xf1, 0xff, 0xb7, 0xa3, 0x81, 0xe2, 0xcb, 0xfd, 0x27, 0xef, + 0x0c, 0xa1, 0x65, 0xa3, 0x47, 0xd8, 0x47, 0x75, 0xf2, 0x61, 0x3a, 0x4b, + 0xec, 0x26, 0x2f, 0xfd, 0x8d, 0xcd, 0x67, 0xd2, 0xce, 0xac, 0xbf, 0x8f, + 0xc6, 0xdc, 0x61, 0x65, 0x78, 0xfa, 0xf8, 0x7d, 0x7f, 0xf9, 0xf6, 0xf1, + 0xc1, 0x64, 0xc7, 0xa3, 0x59, 0x58, 0x98, 0x67, 0x61, 0x44, 0x29, 0x15, + 0x89, 0x65, 0xa7, 0xd6, 0x5f, 0x00, 0xf0, 0x6b, 0x2e, 0x06, 0x2c, 0xb8, + 0x3f, 0xa4, 0xa6, 0x41, 0xf9, 0xec, 0x21, 0xf0, 0xa1, 0x90, 0xe8, 0x5a, + 0xfc, 0xc4, 0x4b, 0x06, 0xb2, 0xff, 0x60, 0xcb, 0x3b, 0xec, 0x59, 0x74, + 0xf6, 0x05, 0xc6, 0x14, 0xbb, 0xbf, 0xac, 0xbb, 0x76, 0x4b, 0x2b, 0x63, + 0x65, 0xa1, 0x8b, 0xf0, 0x93, 0xee, 0x5f, 0xac, 0xbf, 0xb3, 0xce, 0x21, + 0x75, 0x65, 0x6c, 0x7b, 0x23, 0x2c, 0xbc, 0xee, 0x05, 0x97, 0xf6, 0x77, + 0xb1, 0xae, 0x2c, 0xbf, 0x9c, 0xbf, 0xdb, 0xfe, 0xac, 0xa8, 0x44, 0xde, + 0xc4, 0x64, 0x37, 0x3e, 0x5b, 0x66, 0x70, 0xce, 0x4f, 0xd9, 0x76, 0x43, + 0xa3, 0x8d, 0x1f, 0x23, 0x8c, 0x61, 0xa8, 0x10, 0xd9, 0xfa, 0x16, 0xf3, + 0x10, 0xe8, 0xb5, 0xa4, 0x5e, 0x8c, 0x15, 0xde, 0x8a, 0x3b, 0xbe, 0x4a, + 0x5e, 0xec, 0x2a, 0x42, 0x9d, 0xbc, 0xa0, 0x53, 0x19, 0xf5, 0xb1, 0x23, + 0x16, 0xbc, 0xd0, 0xe9, 0x25, 0xff, 0x9e, 0x4c, 0xf3, 0x40, 0x77, 0x02, + 0xa2, 0x63, 0x5d, 0x1b, 0xab, 0x2e, 0xd6, 0x2c, 0xb4, 0x68, 0xd7, 0xf8, + 0x66, 0xcc, 0xcd, 0x17, 0xcd, 0x1d, 0xf3, 0xdd, 0xff, 0x0c, 0xf7, 0xb3, + 0xfb, 0xf1, 0x24, 0xb2, 0xfe, 0x64, 0xb2, 0x27, 0x8c, 0xa5, 0xe5, 0x97, + 0x99, 0x5e, 0x43, 0x59, 0x4c, 0x83, 0xe1, 0x65, 0x0f, 0x6f, 0xed, 0x68, + 0x25, 0x9e, 0x59, 0x7d, 0x1b, 0x46, 0x96, 0x5e, 0xec, 0x4c, 0xb2, 0xfd, + 0x91, 0x31, 0xb5, 0x65, 0xf6, 0xc1, 0x1e, 0xe2, 0xcb, 0xfe, 0xdd, 0x3f, + 0xe7, 0x64, 0xd0, 0xd5, 0x94, 0x68, 0xcc, 0x98, 0x8b, 0x43, 0xa2, 0x13, + 0xee, 0x93, 0xda, 0x4b, 0x2f, 0xcd, 0x8c, 0xef, 0x16, 0x54, 0xf2, 0x6e, + 0x06, 0x23, 0x7f, 0xbd, 0x1a, 0xd8, 0x40, 0xfe, 0xb2, 0xf8, 0x3b, 0x39, + 0x2c, 0xb9, 0xf8, 0xb2, 0xfa, 0x77, 0x73, 0xcb, 0x2d, 0x1e, 0x37, 0x5c, + 0x16, 0xbd, 0x05, 0xb2, 0xcb, 0xff, 0xff, 0xe9, 0x73, 0xd8, 0x11, 0x79, + 0xec, 0x06, 0x72, 0x76, 0x7d, 0x2e, 0x19, 0x1a, 0xcb, 0xce, 0xe0, 0x54, + 0x56, 0x2b, 0xe7, 0x12, 0x18, 0x59, 0x40, 0x3c, 0xbd, 0x14, 0x5f, 0xbc, + 0x6d, 0x8d, 0x2c, 0xbf, 0xfc, 0x17, 0xdb, 0x58, 0xdf, 0x46, 0xc4, 0x15, + 0x94, 0x67, 0xe4, 0x44, 0xf7, 0xfe, 0x9f, 0xce, 0x96, 0x06, 0x0b, 0xab, + 0x2f, 0xf1, 0x67, 0x3f, 0xcc, 0x1a, 0xca, 0x61, 0x51, 0x90, 0x09, 0xbe, + 0x1c, 0xd4, 0x32, 0xfd, 0x09, 0x4e, 0x90, 0x6f, 0x3f, 0xbf, 0xf9, 0x80, + 0xf7, 0x85, 0x9b, 0xcb, 0x38, 0xb2, 0xff, 0xe2, 0xeb, 0x01, 0x82, 0xc0, + 0x46, 0x96, 0x5f, 0xed, 0x6d, 0xde, 0x3f, 0xc0, 0x59, 0x50, 0x7f, 0x2e, + 0x87, 0x7f, 0xd2, 0xce, 0xe1, 0x40, 0xb3, 0xeb, 0x2f, 0xfd, 0xe8, 0xde, + 0xfa, 0x07, 0x9f, 0x75, 0x65, 0xfe, 0x82, 0xef, 0xb3, 0xf7, 0x59, 0x7d, + 0x0d, 0x7e, 0xac, 0xa9, 0x1e, 0x9f, 0x0c, 0xaf, 0xdb, 0xbd, 0xcf, 0xa6, + 0x59, 0x7d, 0xc9, 0x8d, 0x85, 0x97, 0xff, 0xff, 0xf9, 0xfb, 0xdc, 0xf7, + 0x1e, 0x46, 0x5d, 0x96, 0x6b, 0x39, 0x9e, 0x7d, 0x8a, 0x24, 0xb2, 0xf7, + 0x62, 0x65, 0x95, 0x08, 0xf9, 0xc2, 0xde, 0x12, 0x09, 0x08, 0xbb, 0xf8, + 0x33, 0xe0, 0xf1, 0xb2, 0xd6, 0x5f, 0x7d, 0x28, 0xf2, 0xcb, 0xfd, 0xc1, + 0xfb, 0x00, 0x1d, 0xc5, 0x96, 0xce, 0x1e, 0xd0, 0x48, 0xee, 0x8d, 0xeb, + 0x2b, 0xc6, 0xfc, 0x89, 0xef, 0xef, 0x18, 0xcb, 0x02, 0xb2, 0xff, 0x4c, + 0xf8, 0x72, 0x11, 0xab, 0x28, 0x68, 0x80, 0x01, 0x01, 0x96, 0x5f, 0xef, + 0xa5, 0x34, 0x9f, 0x5b, 0x2c, 0xbe, 0x97, 0x4f, 0x65, 0x95, 0x07, 0xb4, + 0xe6, 0xf5, 0x09, 0xfb, 0xe4, 0x69, 0xc7, 0x08, 0x9b, 0xa5, 0xd5, 0x97, + 0xf6, 0x6d, 0x85, 0x92, 0x59, 0x50, 0x78, 0x7a, 0x17, 0xbf, 0xfb, 0x9e, + 0xcd, 0xd3, 0xe9, 0xcb, 0x81, 0x59, 0x7f, 0x37, 0xa1, 0x7d, 0xa1, 0x65, + 0x8f, 0xe3, 0xf5, 0x11, 0x1e, 0xff, 0x68, 0xc3, 0xb7, 0xfc, 0x92, 0xcb, + 0xc7, 0x1b, 0x2c, 0xa1, 0x9e, 0x94, 0xc6, 0xd7, 0xe0, 0x7a, 0x09, 0x85, + 0x95, 0x87, 0x96, 0xe4, 0x77, 0xcd, 0x7f, 0xba, 0xb2, 0xff, 0xed, 0xa3, + 0xb3, 0x84, 0x00, 0x9b, 0xa2, 0x71, 0x65, 0xff, 0xcf, 0xb9, 0x84, 0xe3, + 0x7c, 0xfb, 0xab, 0x2f, 0xfb, 0x51, 0xc7, 0xd1, 0x44, 0x96, 0x56, 0x91, + 0x97, 0xe4, 0xfd, 0xe8, 0xb7, 0xa4, 0xfb, 0x2c, 0xbd, 0x3b, 0x66, 0xac, + 0xbf, 0x8a, 0x36, 0x28, 0xd9, 0x65, 0xba, 0xb2, 0xff, 0xcc, 0x73, 0x99, + 0xe3, 0xe0, 0x76, 0x59, 0x43, 0x3d, 0x20, 0x88, 0xd4, 0xf6, 0x9f, 0xf6, + 0x43, 0xbb, 0xe3, 0x23, 0x1d, 0x72, 0x02, 0x7f, 0xbf, 0xf1, 0x38, 0xfd, + 0x1b, 0xfc, 0xe4, 0xb2, 0xe8, 0xdc, 0x59, 0x7f, 0xff, 0xe0, 0xed, 0x80, + 0x9c, 0x41, 0xdd, 0x9d, 0x9f, 0x4b, 0x02, 0x5f, 0xf1, 0x65, 0xff, 0xed, + 0xb3, 0xee, 0xf0, 0xca, 0x3f, 0x76, 0xac, 0xbf, 0xdf, 0x16, 0x0f, 0xce, + 0x2a, 0xca, 0xc3, 0xff, 0x74, 0xba, 0x1a, 0x6d, 0x8e, 0x7c, 0x43, 0x3c, + 0x87, 0xad, 0xf7, 0x65, 0x06, 0xb2, 0xff, 0xb0, 0x7b, 0x60, 0xb9, 0xe7, + 0x59, 0x7f, 0x6d, 0x34, 0xa7, 0xbd, 0x6c, 0xb2, 0xf8, 0x8b, 0x3a, 0xb2, + 0xfc, 0x7b, 0x9a, 0xd1, 0xac, 0xa6, 0x42, 0x20, 0x60, 0xdf, 0xc4, 0x17, + 0xf6, 0xc2, 0x4f, 0xb9, 0x7e, 0xb2, 0xfb, 0x72, 0x38, 0x4b, 0x2f, 0xfd, + 0xe7, 0x6f, 0x7d, 0x1d, 0x0b, 0x56, 0x56, 0x1f, 0x1c, 0xc4, 0x97, 0xff, + 0x66, 0x30, 0xd8, 0x3d, 0x68, 0xc5, 0x59, 0x79, 0xdf, 0x4b, 0x2f, 0xf8, + 0xe4, 0x7e, 0x0b, 0x5a, 0x6b, 0x2e, 0xce, 0xac, 0xa8, 0x4d, 0x97, 0x21, + 0x2d, 0xa2, 0x2f, 0x22, 0x74, 0x6e, 0x7c, 0xe2, 0xf1, 0x3e, 0xea, 0xcb, + 0xde, 0x36, 0x6c, 0xae, 0xd9, 0x7e, 0xb2, 0xa2, 0xb8, 0x87, 0xce, 0xd0, + 0x86, 0x91, 0x30, 0xcd, 0xf2, 0x54, 0x73, 0x0e, 0x80, 0x85, 0xff, 0xc4, + 0x06, 0x77, 0x34, 0x25, 0xb5, 0x18, 0xdf, 0xa5, 0x1c, 0x3b, 0xe7, 0xf0, + 0x96, 0x28, 0x63, 0x72, 0x50, 0xf7, 0x63, 0xcb, 0x0a, 0x0e, 0xf2, 0x19, + 0xf8, 0x5d, 0x09, 0x1c, 0xc6, 0xea, 0xf5, 0xe9, 0xe1, 0x3e, 0xc8, 0x59, + 0x74, 0x89, 0x65, 0xfd, 0xad, 0x40, 0xf1, 0xab, 0x2d, 0xb8, 0xb2, 0xe3, + 0xdd, 0x59, 0x7d, 0xb6, 0xa3, 0x65, 0x97, 0x09, 0xfa, 0xcb, 0xde, 0x36, + 0xac, 0xb4, 0xcb, 0x29, 0xcd, 0x70, 0x47, 0x2f, 0xce, 0x5b, 0x07, 0x8b, + 0x2f, 0xd8, 0x3d, 0x38, 0x16, 0x5f, 0x3e, 0xd1, 0xa5, 0x97, 0x40, 0xfc, + 0x79, 0x24, 0x4f, 0x46, 0x9c, 0x14, 0xc5, 0xad, 0x14, 0x71, 0x9f, 0xc9, + 0x09, 0x1f, 0x84, 0x1d, 0x71, 0xb7, 0x96, 0x5e, 0xe0, 0x9c, 0x59, 0x7d, + 0xf6, 0xd0, 0xc2, 0xca, 0xd8, 0xf5, 0x06, 0x22, 0x11, 0xeb, 0xbb, 0x0b, + 0x2f, 0xf7, 0xda, 0x83, 0x93, 0xf1, 0x65, 0xf6, 0x14, 0x49, 0x65, 0x61, + 0xe9, 0xb4, 0xce, 0xd3, 0xeb, 0x2f, 0xdc, 0xce, 0x9e, 0x96, 0x5e, 0xcf, + 0xba, 0xb2, 0xd9, 0xf9, 0xe2, 0x70, 0x9e, 0xe7, 0x1a, 0xcb, 0xdd, 0xce, + 0x2c, 0xa9, 0x1b, 0x20, 0x8b, 0x5c, 0x5b, 0x8b, 0x2f, 0x69, 0xc9, 0x65, + 0x2c, 0xbf, 0xc2, 0x96, 0x6f, 0xd1, 0xf1, 0x65, 0xbe, 0x59, 0x50, 0x7d, + 0xb8, 0x36, 0x61, 0x61, 0x35, 0xbf, 0x66, 0xa5, 0x0d, 0x59, 0x7f, 0x1e, + 0xd8, 0x46, 0xc2, 0xcb, 0xfc, 0xfa, 0x97, 0xe7, 0xf7, 0x16, 0x5f, 0x73, + 0x91, 0xfa, 0xca, 0x85, 0x4b, 0xe3, 0x21, 0xc5, 0x83, 0x5a, 0x69, 0x0f, + 0xa1, 0x0c, 0xe7, 0x24, 0x4e, 0x12, 0xd1, 0x4d, 0x6f, 0xfd, 0x85, 0x8c, + 0x16, 0x77, 0xc6, 0xb2, 0xfe, 0x76, 0x30, 0x6f, 0x25, 0x95, 0xe3, 0xe9, + 0x23, 0xcb, 0xf8, 0xc8, 0xb3, 0x7b, 0xac, 0xbd, 0x21, 0x3a, 0xb2, 0xf6, + 0xb4, 0xeb, 0x2f, 0xa5, 0xf8, 0x64, 0xb2, 0xfb, 0x42, 0x47, 0xeb, 0x2a, + 0x0f, 0x20, 0xc9, 0x2f, 0xf1, 0xec, 0xed, 0xff, 0xf8, 0x59, 0x71, 0x8d, + 0x65, 0xcf, 0xf2, 0xcb, 0xfb, 0xd9, 0x31, 0x40, 0xd6, 0x5f, 0xf4, 0xa1, + 0xbc, 0xcd, 0x47, 0x16, 0x50, 0x0f, 0x97, 0xe2, 0xda, 0x1a, 0x27, 0xcd, + 0xf2, 0xf7, 0x4f, 0xf5, 0x97, 0xdf, 0xc1, 0x01, 0x65, 0x99, 0x6b, 0x29, + 0x83, 0xd4, 0xf8, 0x74, 0x24, 0x57, 0xd2, 0xee, 0x08, 0xb2, 0xf0, 0x23, + 0xf5, 0x97, 0xb5, 0x0d, 0x59, 0x46, 0x88, 0xd7, 0x31, 0x09, 0x18, 0xa3, + 0xb7, 0xdb, 0x09, 0x93, 0x2c, 0xbd, 0x1a, 0xd9, 0x65, 0x41, 0xe1, 0x19, + 0x2d, 0x2c, 0xbc, 0x08, 0xfd, 0x65, 0xd0, 0x52, 0x35, 0x18, 0x17, 0x7d, + 0xd2, 0x3d, 0xd5, 0x97, 0x07, 0x8b, 0x2f, 0xc1, 0x97, 0x3c, 0x35, 0x95, + 0x07, 0x80, 0x42, 0xf5, 0x25, 0xc5, 0x01, 0x90, 0xfc, 0x58, 0x63, 0xd3, + 0x32, 0x68, 0x81, 0xa6, 0xbe, 0x85, 0xa9, 0x46, 0x07, 0xc7, 0xee, 0xa4, + 0x04, 0xab, 0x7b, 0x25, 0xfc, 0xf2, 0xdd, 0xdd, 0x0e, 0xcb, 0x2c, 0x4b, + 0x2e, 0x96, 0xe2, 0xca, 0xf1, 0xef, 0xf0, 0xd7, 0xa2, 0x16, 0x9f, 0x59, + 0x7f, 0x66, 0xc3, 0xf1, 0xe9, 0x65, 0x78, 0xf0, 0x88, 0x52, 0xff, 0xd1, + 0x9c, 0x9d, 0x06, 0x31, 0x24, 0xb2, 0xfe, 0x31, 0x79, 0xb6, 0x0a, 0xb2, + 0x88, 0xfc, 0x3a, 0x81, 0x71, 0x42, 0xcb, 0xf4, 0x0f, 0xb8, 0x05, 0x97, + 0xa0, 0x80, 0xb2, 0xff, 0xfe, 0x71, 0x46, 0xef, 0xad, 0xbc, 0xfd, 0xf1, + 0xea, 0x4b, 0x2f, 0xc0, 0x07, 0xa3, 0x4b, 0x2b, 0xc8, 0x9f, 0x21, 0xb0, + 0xae, 0x54, 0x93, 0x2b, 0x01, 0x0f, 0x05, 0x7b, 0x0c, 0x6b, 0xe7, 0x27, + 0x99, 0x65, 0xf8, 0xfa, 0x59, 0x25, 0x97, 0xd0, 0x2c, 0x4c, 0xb2, 0xff, + 0xdc, 0xde, 0xfe, 0x86, 0x33, 0xbc, 0x59, 0x70, 0x8d, 0x59, 0x7e, 0x2c, + 0xd0, 0x71, 0x65, 0xe7, 0xf8, 0x96, 0x5f, 0xdd, 0x27, 0xff, 0x09, 0x65, + 0xf8, 0x9f, 0xfc, 0x25, 0x95, 0x38, 0xf4, 0xba, 0x59, 0x43, 0x44, 0x90, + 0x5b, 0xab, 0x64, 0xe7, 0x98, 0x21, 0x32, 0x69, 0x88, 0xfc, 0x83, 0xf8, + 0xc1, 0x42, 0xe2, 0xfb, 0x98, 0x40, 0x59, 0x7f, 0x41, 0x74, 0x01, 0xd9, + 0x65, 0xfe, 0x81, 0x46, 0x17, 0xd4, 0x96, 0x5e, 0xe4, 0x49, 0x65, 0xfb, + 0xd9, 0xa3, 0xe2, 0xcb, 0x8f, 0x5f, 0x1e, 0x1f, 0x47, 0x2d, 0xbd, 0x65, + 0x42, 0x60, 0xf2, 0x21, 0xd1, 0x77, 0x9d, 0xf7, 0x4b, 0xaf, 0x11, 0xb0, + 0xb2, 0xfb, 0x06, 0x7b, 0xd6, 0x5d, 0x0d, 0xc3, 0x7e, 0xe3, 0x97, 0xe9, + 0x74, 0xdb, 0xd5, 0x97, 0xf3, 0xfd, 0xe8, 0x10, 0x96, 0x5b, 0x3e, 0x3d, + 0x61, 0x4a, 0x2f, 0xe7, 0x93, 0x96, 0x6e, 0xac, 0xbe, 0xe7, 0x9e, 0x4b, + 0x28, 0xd1, 0xf3, 0xa8, 0x40, 0x39, 0x48, 0x4b, 0xaf, 0x61, 0x4c, 0xb2, + 0xdf, 0x2c, 0xbb, 0xf8, 0x49, 0x70, 0xa2, 0xa4, 0xa3, 0x36, 0x02, 0x8b, + 0xdf, 0x8b, 0x3b, 0xe3, 0x48, 0xcc, 0xd0, 0xdf, 0x30, 0x59, 0xc5, 0x95, + 0x23, 0xda, 0x19, 0xc5, 0xfe, 0x76, 0x20, 0x8b, 0x3a, 0xb2, 0xf1, 0xfe, + 0xeb, 0x2a, 0x13, 0x48, 0x18, 0xe3, 0xc2, 0xf4, 0x88, 0x82, 0x63, 0x7b, + 0xd0, 0x2a, 0xcb, 0xcf, 0xf7, 0x16, 0x5b, 0x8b, 0x2f, 0x84, 0xf3, 0xf5, + 0x65, 0x6c, 0x7d, 0xc3, 0x1d, 0xf8, 0x77, 0xa2, 0x37, 0xa0, 0xa6, 0x59, + 0x71, 0x42, 0xca, 0x59, 0x4b, 0x2a, 0x62, 0xd9, 0xa1, 0x77, 0x7a, 0x65, + 0x97, 0x1f, 0xeb, 0x2a, 0x0d, 0x7f, 0xe3, 0x15, 0x32, 0x2e, 0x34, 0x38, + 0xe5, 0x7f, 0xa8, 0x5f, 0xfc, 0xc1, 0x90, 0x39, 0x0d, 0x7f, 0xba, 0xb2, + 0xf7, 0xf9, 0xba, 0xb2, 0xff, 0xf8, 0xb3, 0xfc, 0x68, 0x63, 0x5a, 0x30, + 0x81, 0x65, 0xf1, 0x43, 0x66, 0x59, 0x4c, 0x23, 0x5b, 0x48, 0xa4, 0x41, + 0xd4, 0xfb, 0xe6, 0xf0, 0x2d, 0x59, 0x66, 0x16, 0x5a, 0x7d, 0x65, 0xda, + 0x61, 0x65, 0x41, 0xf0, 0x99, 0x18, 0x44, 0x84, 0x14, 0xbf, 0xfe, 0xf6, + 0x4b, 0x91, 0xd9, 0x66, 0xe3, 0x97, 0xeb, 0x2f, 0xf8, 0xfb, 0xec, 0xfb, + 0xa1, 0x85, 0x97, 0xc2, 0x46, 0xbf, 0x59, 0x52, 0x3d, 0xdf, 0x1c, 0xdd, + 0x9c, 0x59, 0x50, 0x6e, 0x24, 0x45, 0x5c, 0x4c, 0x1f, 0xb0, 0xe7, 0xba, + 0x38, 0xb2, 0xdf, 0xac, 0xbf, 0x1c, 0x36, 0x1a, 0xb2, 0xd8, 0xb2, 0x8d, + 0x10, 0xfa, 0x29, 0x71, 0x6e, 0x09, 0x4f, 0x93, 0x59, 0x85, 0x95, 0x0b, + 0x99, 0xd9, 0x0f, 0x63, 0x8c, 0x53, 0xd0, 0x9e, 0x78, 0xf2, 0x77, 0x52, + 0xef, 0xa0, 0x50, 0xcc, 0xb2, 0xf7, 0x22, 0x65, 0x97, 0xf6, 0x0f, 0x37, + 0x9e, 0x96, 0x52, 0xcb, 0x35, 0x65, 0x74, 0xbc, 0xde, 0x17, 0x7c, 0x37, + 0x7f, 0x96, 0x5f, 0xbf, 0x3d, 0x1b, 0x0b, 0x2e, 0x76, 0x16, 0x5d, 0x9f, + 0x2c, 0xa0, 0x26, 0x4d, 0x31, 0x23, 0x47, 0x7c, 0x94, 0xe4, 0x5f, 0x91, + 0x11, 0x4c, 0xf8, 0xbd, 0xd9, 0xe5, 0x97, 0x66, 0x96, 0x52, 0xca, 0x59, + 0x68, 0x59, 0x4c, 0xb3, 0x4c, 0x41, 0x7d, 0x0b, 0xbd, 0x9b, 0xdd, 0x65, + 0xf7, 0xbd, 0x9f, 0xac, 0xb4, 0x78, 0xf0, 0x04, 0x1d, 0xa8, 0x47, 0x5b, + 0x45, 0x9c, 0xf3, 0xf7, 0x1b, 0xf8, 0xfb, 0x9e, 0x76, 0x16, 0x5f, 0xdd, + 0x19, 0xff, 0x04, 0xb2, 0xf6, 0xde, 0x35, 0x97, 0x78, 0x3f, 0x1e, 0x53, + 0x96, 0xde, 0x14, 0x51, 0x52, 0x5f, 0xe8, 0xd8, 0x4c, 0xf3, 0xfc, 0x91, + 0x99, 0xa0, 0xbf, 0xc6, 0x37, 0x2f, 0xa5, 0xc5, 0x94, 0x33, 0xfa, 0xf2, + 0x3d, 0xd9, 0xb2, 0xcb, 0xf3, 0x44, 0x8d, 0x7e, 0xb2, 0x96, 0x52, 0xcb, + 0x43, 0x4b, 0x6f, 0xc2, 0xea, 0x0f, 0x9a, 0x48, 0x17, 0xfe, 0xe4, 0x4b, + 0xd9, 0x85, 0x2e, 0x2c, 0xa1, 0xa7, 0x8a, 0x08, 0x64, 0x19, 0x14, 0xcf, + 0xbd, 0x21, 0xbd, 0x0d, 0x35, 0x97, 0xa5, 0x80, 0x59, 0x58, 0x88, 0x70, + 0x28, 0x7c, 0x37, 0x7c, 0x7a, 0xdd, 0x1a, 0xcb, 0xf7, 0xa3, 0xe7, 0xdc, + 0x59, 0x7f, 0xfd, 0x1d, 0xe0, 0xf3, 0xa7, 0xe0, 0xe7, 0xdd, 0x59, 0x5e, + 0x3f, 0xbe, 0x95, 0xde, 0x2c, 0xf2, 0xcb, 0x69, 0x65, 0xfe, 0xcc, 0x00, + 0x9b, 0xfd, 0x8b, 0x2f, 0xfa, 0x0b, 0xa5, 0x9d, 0x81, 0x56, 0x5f, 0xec, + 0x17, 0x86, 0x5f, 0x49, 0x65, 0x2c, 0xa3, 0x3f, 0x6d, 0x1b, 0xb9, 0xa5, + 0xee, 0xe8, 0x2b, 0x2d, 0xc5, 0x94, 0x46, 0xb8, 0x23, 0xb7, 0xf9, 0xf7, + 0xe0, 0xf6, 0xc1, 0x56, 0x5f, 0xff, 0xb0, 0x71, 0x9f, 0x09, 0xd3, 0x20, + 0xcb, 0x38, 0xb2, 0xe6, 0xfe, 0xb2, 0xe7, 0x25, 0x95, 0xe3, 0x5a, 0xe3, + 0x17, 0xe6, 0x9f, 0x7f, 0x75, 0x95, 0xb2, 0xb1, 0x4c, 0x85, 0x01, 0x91, + 0x6e, 0x0d, 0xcc, 0x23, 0xa8, 0x55, 0xba, 0xdf, 0xe4, 0x04, 0x6d, 0xd8, + 0x41, 0x04, 0x82, 0xed, 0x30, 0xb2, 0xfa, 0x1a, 0xfe, 0x59, 0x7b, 0xbd, + 0x75, 0x97, 0xda, 0x0c, 0x6f, 0x59, 0x7e, 0xcd, 0xc7, 0x2f, 0xc6, 0x7c, + 0x2e, 0x43, 0xd1, 0xcb, 0xef, 0x74, 0xf6, 0x59, 0x7f, 0x80, 0x7c, 0x2c, + 0xde, 0xeb, 0x2f, 0xa3, 0x67, 0x92, 0xcb, 0xee, 0xf3, 0xc6, 0xb2, 0xfe, + 0x27, 0xee, 0xd8, 0x2a, 0xca, 0x59, 0x44, 0x6e, 0x7a, 0x5d, 0x50, 0x7f, + 0x78, 0xb7, 0x7e, 0xcd, 0x8b, 0x3e, 0x59, 0x7d, 0xd3, 0x2e, 0x2c, 0xbe, + 0x9d, 0x9f, 0x75, 0x65, 0xfd, 0xc8, 0xfa, 0x59, 0xd5, 0x94, 0x03, 0xd3, + 0xe1, 0x2d, 0xf6, 0x74, 0xf8, 0xb2, 0x96, 0x57, 0xc6, 0xb1, 0xc8, 0x6b, + 0x11, 0xc6, 0x6e, 0x8e, 0x9d, 0x50, 0xac, 0x46, 0x4f, 0x38, 0x9b, 0xf1, + 0x1e, 0x8c, 0xfd, 0x09, 0xd2, 0x20, 0xe4, 0x61, 0x77, 0x84, 0x08, 0x8b, + 0x2f, 0x11, 0xee, 0x2c, 0xbe, 0x1c, 0xfb, 0xb0, 0xb2, 0xa0, 0xf1, 0x30, + 0x7a, 0xd3, 0xeb, 0x2e, 0x81, 0xac, 0xa6, 0x49, 0xaa, 0xf0, 0xa5, 0xb8, + 0xb2, 0xcd, 0x59, 0x6d, 0x2c, 0xa7, 0x34, 0x41, 0x11, 0xad, 0x1e, 0x9f, + 0x8c, 0xe9, 0x61, 0x9a, 0x2b, 0xfd, 0x05, 0x27, 0x6e, 0x0d, 0x65, 0xf7, + 0x5a, 0xdd, 0x2c, 0xbf, 0xfb, 0xf8, 0x20, 0x3f, 0x7f, 0x10, 0xa4, 0xb2, + 0xf4, 0x8f, 0xcb, 0x2f, 0xba, 0x59, 0x25, 0x97, 0xc1, 0x65, 0xf1, 0xd6, + 0x5f, 0xb6, 0x1b, 0xb8, 0xab, 0x2b, 0x0f, 0x3c, 0x24, 0xd7, 0xff, 0x8f, + 0x9e, 0xc1, 0x96, 0x6f, 0x2c, 0xe2, 0xca, 0x92, 0x72, 0x0c, 0x18, 0xfc, + 0x47, 0x32, 0x36, 0x87, 0x09, 0xc3, 0xa4, 0x37, 0x08, 0x05, 0x94, 0xc8, + 0x75, 0x5b, 0xd3, 0xd9, 0x54, 0x47, 0x31, 0xb4, 0x31, 0x64, 0x60, 0x39, + 0x59, 0x19, 0x3a, 0x8e, 0xc4, 0x64, 0x20, 0x71, 0xfa, 0x3b, 0xc3, 0x8f, + 0x86, 0x68, 0xdc, 0xf5, 0x1c, 0x2b, 0x63, 0x88, 0xf4, 0xec, 0x4b, 0xc7, + 0x2b, 0xfc, 0x6c, 0x0c, 0xb3, 0xc2, 0x95, 0x87, 0xc9, 0x68, 0x9d, 0x97, + 0x78, 0x17, 0xcd, 0xec, 0x62, 0xa5, 0x4f, 0xc2, 0x68, 0x48, 0xea, 0xb7, + 0x59, 0xef, 0xf9, 0x9f, 0x4f, 0x37, 0x78, 0x18, 0x59, 0x7f, 0xff, 0xc1, + 0x86, 0x7d, 0xe1, 0xf9, 0xcf, 0xb9, 0xaf, 0xda, 0xf2, 0x59, 0x4c, 0xd5, + 0x4e, 0x6d, 0x1f, 0xb8, 0xcf, 0x6f, 0xda, 0x03, 0xb8, 0x15, 0x15, 0xba, + 0xff, 0xcf, 0x26, 0x79, 0xa0, 0x3b, 0x81, 0x51, 0x38, 0x2c, 0xcf, 0x11, + 0x00, 0xd3, 0x4b, 0xa7, 0xb1, 0xac, 0xb7, 0x96, 0x5b, 0x8b, 0x28, 0x26, + 0x8a, 0x7c, 0x46, 0xfd, 0x82, 0xf0, 0xc5, 0x59, 0x7a, 0x5c, 0xe2, 0xcb, + 0xe0, 0x3b, 0x81, 0x51, 0x68, 0xaf, 0xff, 0x60, 0xfc, 0xec, 0x4d, 0x31, + 0xf0, 0x2d, 0x59, 0x5a, 0x3f, 0xbf, 0x17, 0x5f, 0x01, 0xcb, 0xf5, 0x97, + 0xdf, 0xc1, 0x01, 0x65, 0xfe, 0xcd, 0xce, 0x6b, 0x4f, 0xd5, 0x97, 0xf4, + 0x6c, 0xfe, 0x76, 0xac, 0xa9, 0x8f, 0x8f, 0xc6, 0xd7, 0x7b, 0x8b, 0x2f, + 0xe8, 0x72, 0x08, 0xf1, 0x65, 0xfb, 0x43, 0x0f, 0x78, 0xb2, 0xff, 0xa3, + 0x6f, 0x67, 0x3d, 0x9b, 0x8b, 0x2f, 0xfe, 0x80, 0x73, 0x00, 0x51, 0xff, + 0x21, 0x65, 0xff, 0x6f, 0xe6, 0x7b, 0x08, 0x41, 0xac, 0xa8, 0x3f, 0xec, + 0x43, 0xaf, 0x23, 0x68, 0xa1, 0x75, 0x7f, 0xb3, 0x5f, 0xe4, 0xc2, 0x71, + 0x65, 0x98, 0x59, 0x7f, 0xd9, 0x1b, 0x64, 0xda, 0x3e, 0x2c, 0xa3, 0x3c, + 0xb9, 0x84, 0xaf, 0xff, 0xdb, 0x47, 0x60, 0x7a, 0x8f, 0x3f, 0x0b, 0x3f, + 0x59, 0x7f, 0xe8, 0xf9, 0xf7, 0x3c, 0x4f, 0xb9, 0xb2, 0xcb, 0xff, 0x46, + 0xbf, 0xc3, 0xcd, 0x74, 0x2b, 0x2a, 0x11, 0xb1, 0xe5, 0x5e, 0x22, 0xd0, + 0xd3, 0xd1, 0x32, 0x79, 0xa1, 0x03, 0xc8, 0x7d, 0x5f, 0xb8, 0xd3, 0x29, + 0x2c, 0xa8, 0x56, 0x87, 0x92, 0xb5, 0x1d, 0x22, 0x96, 0x5e, 0xd4, 0x30, + 0xb2, 0xfc, 0x7d, 0x28, 0x6a, 0xca, 0x64, 0x1e, 0x74, 0xc1, 0x7e, 0x1d, + 0xbf, 0xd0, 0xdd, 0x68, 0xff, 0xe2, 0xcb, 0xc0, 0xc1, 0x56, 0x5b, 0x26, + 0x3d, 0x1f, 0x1a, 0x58, 0x55, 0x97, 0xfb, 0x51, 0xdf, 0xa5, 0x9d, 0x59, + 0x76, 0x0d, 0x65, 0xed, 0x9d, 0xab, 0x2f, 0x47, 0xfa, 0x83, 0x66, 0x62, + 0xd7, 0xff, 0x7d, 0xce, 0x96, 0x6f, 0xef, 0x4c, 0x6b, 0x28, 0xd1, 0xe3, + 0x30, 0x97, 0x19, 0xc2, 0x63, 0x71, 0xc9, 0x65, 0xfd, 0x9b, 0xfa, 0x18, + 0x02, 0xcb, 0xfd, 0xef, 0x05, 0x86, 0xc7, 0x16, 0x5f, 0xff, 0x8f, 0x85, + 0x9b, 0xdf, 0xa5, 0x9c, 0xf3, 0xcc, 0xb2, 0xfd, 0x1d, 0xe0, 0x9e, 0x59, + 0x50, 0x8f, 0x81, 0x8b, 0x61, 0x7c, 0xc6, 0xa4, 0xab, 0x7c, 0x47, 0xf4, + 0x96, 0x5e, 0xfd, 0xfc, 0xb2, 0xff, 0x6d, 0x86, 0x37, 0x76, 0x16, 0x56, + 0x1e, 0x83, 0x8e, 0xdf, 0xda, 0x81, 0xc1, 0x4c, 0xb2, 0xdc, 0x59, 0x5b, + 0x1b, 0xef, 0x16, 0xd9, 0x9b, 0x25, 0x94, 0x4b, 0x3c, 0x9f, 0x6c, 0x48, + 0x32, 0x9c, 0x84, 0xc0, 0x08, 0xbe, 0x22, 0x9a, 0x10, 0xba, 0x23, 0x68, + 0xbf, 0xa5, 0xb7, 0x7f, 0x08, 0x42, 0x84, 0x2f, 0x23, 0x19, 0xec, 0x66, + 0xa1, 0x48, 0x9f, 0x72, 0x11, 0x7a, 0xf7, 0x1b, 0xc5, 0x97, 0xf9, 0x93, + 0x07, 0xd9, 0x67, 0x16, 0x5f, 0xff, 0x1f, 0x4f, 0x4f, 0xfc, 0x78, 0xc1, + 0x1f, 0xac, 0xba, 0x52, 0x59, 0x7f, 0xf6, 0x14, 0x63, 0x11, 0x2e, 0xe6, + 0xcb, 0x2f, 0xfc, 0xfe, 0x9d, 0x19, 0xdf, 0x1b, 0x56, 0x5f, 0xff, 0xe3, + 0xec, 0x78, 0xb3, 0xba, 0x8f, 0x16, 0x6f, 0x08, 0x16, 0x5f, 0xff, 0x46, + 0x77, 0xcf, 0x2d, 0x04, 0x70, 0x50, 0xb2, 0xa4, 0x9c, 0xae, 0xe2, 0x7f, + 0x85, 0xc2, 0x87, 0xbc, 0xff, 0x75, 0x82, 0xff, 0x8a, 0x25, 0x9c, 0xc3, + 0x85, 0x96, 0xd9, 0x65, 0x41, 0xe3, 0x91, 0xad, 0xff, 0xff, 0x47, 0xed, + 0x79, 0x4e, 0xef, 0xb1, 0xb8, 0x08, 0xf4, 0x35, 0x65, 0xff, 0xf1, 0x97, + 0x43, 0xe3, 0xe4, 0xfb, 0xf7, 0x06, 0xb2, 0xbc, 0x8b, 0x9e, 0xb4, 0x5f, + 0xc7, 0xb4, 0xe7, 0x2f, 0xd6, 0x5f, 0x01, 0xdc, 0x0a, 0x8b, 0x69, 0x7f, + 0xff, 0x43, 0xf6, 0x3d, 0x1c, 0x33, 0x91, 0xeb, 0x06, 0xb2, 0xfe, 0xf4, + 0x36, 0x0c, 0x6b, 0x28, 0xd3, 0x04, 0x98, 0x8f, 0x46, 0x1c, 0x2e, 0xea, + 0xbd, 0xfc, 0xf2, 0x1f, 0x8d, 0xab, 0x2f, 0xf6, 0x4c, 0x50, 0xd9, 0xc0, + 0x59, 0x77, 0x8c, 0x67, 0xc5, 0xd2, 0xdb, 0xff, 0xde, 0xc9, 0x39, 0x75, + 0xe4, 0x6c, 0x42, 0xcb, 0xfe, 0xcc, 0x04, 0xf8, 0x7c, 0x7a, 0x59, 0x7f, + 0xf7, 0xb3, 0x6e, 0x1e, 0xa3, 0x75, 0xc9, 0x65, 0xd8, 0x6b, 0x2d, 0x00, + 0x3d, 0xbd, 0xe8, 0xd6, 0x9e, 0x96, 0x5f, 0xfd, 0x9d, 0x86, 0x93, 0xb0, + 0x59, 0xfa, 0xcb, 0x7e, 0xb2, 0xa6, 0x3e, 0xb2, 0x16, 0xea, 0x1d, 0xff, + 0x8c, 0x87, 0x10, 0xdd, 0xd7, 0x92, 0xcb, 0xfe, 0x8f, 0xfd, 0x1b, 0x16, + 0x71, 0x65, 0x41, 0xfc, 0x04, 0xfe, 0xfb, 0xd1, 0xa6, 0x16, 0x5f, 0xfe, + 0x3d, 0x46, 0x78, 0x27, 0xcf, 0x67, 0xeb, 0x2f, 0xff, 0x86, 0x1e, 0xf0, + 0x79, 0x2f, 0x46, 0xf1, 0xc2, 0xca, 0x92, 0x2f, 0x86, 0x46, 0x69, 0x37, + 0xfd, 0x12, 0x8d, 0x6d, 0x1a, 0xd9, 0x65, 0xff, 0xe8, 0x97, 0xa0, 0x98, + 0x2c, 0xd8, 0x49, 0x2c, 0xbf, 0xff, 0xd0, 0x64, 0xfd, 0x0f, 0x70, 0x70, + 0xd1, 0xfa, 0x3e, 0x59, 0x7f, 0x8d, 0xa3, 0x8e, 0x09, 0xc5, 0x97, 0xbb, + 0x80, 0x59, 0x7f, 0xfc, 0x47, 0xbc, 0xfb, 0xe8, 0xef, 0x23, 0x7c, 0x2c, + 0xa3, 0x4d, 0x2f, 0x49, 0x7e, 0x5f, 0xe9, 0xa0, 0x47, 0x2f, 0xf0, 0xf0, + 0xa4, 0x7e, 0x0a, 0xcb, 0x0d, 0x65, 0xf3, 0xfd, 0xcf, 0x2c, 0xa3, 0x3e, + 0x67, 0x32, 0xe0, 0x8d, 0xff, 0xdd, 0x73, 0xc8, 0xd3, 0xc8, 0xfc, 0xb2, + 0xfc, 0xe3, 0xc2, 0xfd, 0x65, 0x48, 0xfa, 0x0d, 0x06, 0xff, 0xa3, 0x53, + 0xb9, 0x1e, 0x73, 0x59, 0x7f, 0xbc, 0x6f, 0x2e, 0x9e, 0xcb, 0x2f, 0xc3, + 0x8c, 0x23, 0x59, 0x53, 0xd3, 0x2f, 0xa5, 0x92, 0x3b, 0x11, 0xe5, 0x8e, + 0x14, 0xf9, 0x1e, 0xe8, 0x21, 0x5a, 0x65, 0xb3, 0x24, 0x6a, 0x12, 0xcd, + 0x84, 0xa7, 0xa1, 0x4e, 0xf0, 0xdf, 0x22, 0xfe, 0x47, 0x0b, 0xd8, 0x58, + 0x06, 0x12, 0xa2, 0x90, 0xcf, 0x9c, 0x88, 0x67, 0x7f, 0x43, 0x3d, 0x66, + 0x30, 0xb2, 0xff, 0xfe, 0xd4, 0x74, 0xc0, 0x63, 0x83, 0xd1, 0xc8, 0xf8, + 0xb2, 0xfe, 0x61, 0xf4, 0x30, 0x92, 0xcb, 0xfe, 0x8e, 0x98, 0x0c, 0x7f, + 0x12, 0xcb, 0xff, 0xff, 0xff, 0x0c, 0xa0, 0x1f, 0x00, 0xfe, 0x6b, 0x93, + 0x18, 0x4f, 0xf0, 0xa0, 0xf1, 0xcc, 0x46, 0xde, 0x2c, 0xbf, 0xf1, 0xf6, + 0x3a, 0x7b, 0xe0, 0x80, 0xb2, 0xef, 0xa4, 0xb2, 0xb1, 0x1e, 0x4f, 0x09, + 0xc0, 0x9f, 0x5f, 0xc5, 0x3e, 0x7a, 0xc6, 0x16, 0x5d, 0xdf, 0x2c, 0xbf, + 0xec, 0xef, 0x04, 0xe7, 0x73, 0xcb, 0x2b, 0x63, 0xd1, 0x68, 0xbd, 0xf8, + 0xf6, 0x6c, 0x01, 0x65, 0xf9, 0xfe, 0x90, 0x9c, 0x59, 0x7f, 0xe3, 0x9b, + 0x9b, 0xdc, 0xb6, 0x08, 0xd6, 0x59, 0x9e, 0x2b, 0x1b, 0x61, 0x63, 0x45, + 0xde, 0x8c, 0xa8, 0x8c, 0xf9, 0x08, 0x1e, 0x91, 0xef, 0x28, 0x10, 0xaa, + 0x99, 0xae, 0x93, 0xe4, 0x69, 0x1f, 0xcb, 0x4a, 0xb9, 0xbe, 0x59, 0x7e, + 0xd0, 0x1d, 0xc0, 0xa8, 0xb9, 0x57, 0xf3, 0x8f, 0xd0, 0x5b, 0x2c, 0xb9, + 0x8f, 0x2c, 0xb3, 0x31, 0xa2, 0x43, 0x05, 0xfc, 0x68, 0xe5, 0xb7, 0xed, + 0x01, 0xdc, 0x0a, 0x8b, 0xb5, 0x7b, 0x6c, 0x15, 0x65, 0xff, 0x1c, 0xa4, + 0x65, 0xfc, 0x49, 0x65, 0xcd, 0x9f, 0x59, 0x7c, 0x7a, 0x7f, 0xd6, 0x5e, + 0x7d, 0xa1, 0x65, 0x99, 0xe2, 0x38, 0x9a, 0x68, 0xe3, 0xc4, 0x71, 0xc1, + 0xa0, 0x91, 0x54, 0x3f, 0xa5, 0x46, 0xc5, 0x52, 0xa7, 0xda, 0x0e, 0x50, + 0xfe, 0x1b, 0xb1, 0x59, 0xcf, 0x9d, 0xaf, 0x33, 0xdc, 0x85, 0xdf, 0xa9, + 0x49, 0xe5, 0x59, 0x22, 0xf2, 0x1a, 0x5d, 0x8c, 0x96, 0xff, 0x33, 0xcd, + 0x01, 0xdc, 0x0a, 0x8a, 0x9d, 0x7e, 0x26, 0x7a, 0xe7, 0x16, 0x5d, 0xb6, + 0x2c, 0xbe, 0xe1, 0x7b, 0xab, 0x2f, 0xf7, 0xa3, 0x90, 0xd0, 0xcc, 0xb2, + 0xa4, 0x7a, 0xc3, 0x22, 0xbf, 0x83, 0xf3, 0x5d, 0xc9, 0x65, 0xba, 0xb2, + 0xfb, 0xee, 0x40, 0xd6, 0x58, 0x2b, 0x2f, 0x43, 0xed, 0x38, 0xda, 0x7e, + 0x47, 0x46, 0x7f, 0x44, 0x8b, 0x7c, 0x07, 0x70, 0x2a, 0x2b, 0x95, 0xcd, + 0x85, 0x97, 0xed, 0x01, 0xdc, 0x0a, 0x8b, 0x39, 0x66, 0x70, 0x79, 0x58, + 0x2d, 0x73, 0xc9, 0x65, 0xfd, 0x2e, 0xfc, 0x03, 0xe2, 0xca, 0x73, 0xc5, + 0x08, 0xb5, 0xfc, 0x7c, 0xc2, 0x71, 0x56, 0x5e, 0x0c, 0xa1, 0x65, 0x69, + 0x34, 0xef, 0x3c, 0x13, 0x6f, 0x48, 0x77, 0x96, 0x5f, 0xfe, 0xec, 0x72, + 0x70, 0x79, 0xd8, 0x9a, 0x63, 0x59, 0x7f, 0xfe, 0x7f, 0x63, 0x61, 0xb3, + 0xb3, 0x18, 0x61, 0xe4, 0xb2, 0xfe, 0x36, 0xec, 0x1d, 0x49, 0x65, 0xf9, + 0xb9, 0x33, 0xfe, 0xb2, 0xfb, 0x6f, 0x3f, 0x56, 0x53, 0x9e, 0x60, 0x4a, + 0x6f, 0xf4, 0x7a, 0x73, 0x67, 0x96, 0x4f, 0x56, 0x56, 0x27, 0x01, 0x32, + 0x77, 0x95, 0xc9, 0xef, 0x79, 0x0d, 0xff, 0x14, 0x37, 0x81, 0x93, 0xb0, + 0xb2, 0xfd, 0xac, 0xe9, 0xb5, 0x65, 0xcd, 0xde, 0xb2, 0xf1, 0x40, 0xd6, + 0x56, 0x1b, 0x47, 0x19, 0xbf, 0x4d, 0x0d, 0x81, 0x16, 0x5d, 0x26, 0xac, + 0xac, 0x3c, 0x02, 0x29, 0xbf, 0xfd, 0xe3, 0x9d, 0xe7, 0x3e, 0xc6, 0x0c, + 0xd6, 0x5f, 0xf8, 0xf5, 0x3a, 0x1a, 0x7b, 0x8f, 0x32, 0xcb, 0xe0, 0x3b, + 0x81, 0x51, 0x21, 0x29, 0x83, 0xf1, 0xd2, 0x1d, 0xff, 0x67, 0x78, 0x19, + 0x46, 0xd0, 0xb2, 0xff, 0xfc, 0x7a, 0x07, 0xb2, 0x76, 0xb5, 0x82, 0xcf, + 0xc3, 0x56, 0x54, 0x91, 0x29, 0xc3, 0x9b, 0xee, 0xe8, 0xfe, 0x59, 0x7f, + 0xec, 0x6e, 0x3e, 0xb6, 0x9d, 0xf3, 0x56, 0x5f, 0xef, 0xb9, 0xd2, 0x86, + 0xf1, 0x65, 0xff, 0xe7, 0x20, 0x4e, 0x19, 0x3c, 0xbc, 0xf2, 0x59, 0x46, + 0x7f, 0xc1, 0x34, 0xbf, 0xb0, 0x8f, 0xfe, 0x42, 0xcb, 0x33, 0x92, 0xac, + 0x4c, 0x85, 0xd7, 0xd0, 0xb7, 0x32, 0x3f, 0x11, 0xff, 0x0c, 0x0e, 0x10, + 0xdc, 0x7e, 0x59, 0x7f, 0xe7, 0x12, 0x62, 0x3e, 0x94, 0x7e, 0xb2, 0xa4, + 0x8d, 0x2f, 0x9f, 0x7a, 0x2d, 0x7f, 0xf7, 0x8d, 0xb9, 0xc9, 0xdf, 0x4b, + 0x3a, 0xb2, 0xfa, 0x5e, 0x13, 0x8b, 0x2e, 0x9e, 0x33, 0xca, 0xcb, 0xe8, + 0x30, 0xf1, 0x65, 0x99, 0xb2, 0xb9, 0xe1, 0xf8, 0x8a, 0xa1, 0x1b, 0xf8, + 0x8e, 0xec, 0xf7, 0xd3, 0xcf, 0xa1, 0xab, 0x2f, 0xef, 0x73, 0x99, 0xad, + 0x96, 0x5d, 0x02, 0xac, 0xbf, 0xef, 0xf0, 0x64, 0xff, 0xc6, 0xf5, 0x95, + 0x88, 0x81, 0x32, 0xf7, 0x17, 0xbc, 0xdd, 0xf2, 0x59, 0x7f, 0xfb, 0xd1, + 0xfb, 0x5e, 0x5c, 0xee, 0x63, 0x56, 0x5e, 0x99, 0xb3, 0x2c, 0xb3, 0x36, + 0x54, 0xcb, 0xff, 0x86, 0xdd, 0x88, 0x87, 0x0a, 0x7c, 0x8d, 0xb8, 0xe3, + 0xcc, 0x99, 0x33, 0x47, 0x2d, 0x5b, 0xf2, 0xfb, 0xcb, 0xb6, 0x28, 0xc4, + 0x38, 0x5b, 0xd8, 0x54, 0x04, 0xb4, 0x41, 0xfd, 0xd4, 0xab, 0xff, 0xd9, + 0xf3, 0x31, 0x85, 0xf5, 0x2f, 0x0a, 0xeb, 0x2f, 0xfe, 0x67, 0xe7, 0xe1, + 0x67, 0x7b, 0x1f, 0xac, 0xbf, 0xfc, 0xcd, 0xaf, 0x26, 0x79, 0xa0, 0x3b, + 0x81, 0x51, 0x3e, 0x2f, 0xff, 0x49, 0x9e, 0x6f, 0x36, 0x39, 0xc8, 0x68, + 0x56, 0x5f, 0x07, 0x51, 0xc5, 0x97, 0xe6, 0x1f, 0xb8, 0x2a, 0xcb, 0x33, + 0x19, 0xe5, 0x84, 0x8a, 0x9d, 0x18, 0x9d, 0x84, 0xd5, 0x01, 0x9e, 0xbe, + 0x68, 0x3b, 0x94, 0xc2, 0x9d, 0x46, 0x38, 0xd4, 0xef, 0x23, 0x3c, 0x63, + 0xd7, 0xff, 0xf0, 0x49, 0xd8, 0x9d, 0xd6, 0x20, 0xa5, 0x9e, 0x36, 0xac, + 0xb8, 0xfe, 0x59, 0x7f, 0xfd, 0x2d, 0x99, 0x48, 0x9e, 0x76, 0x06, 0xa7, + 0x4e, 0xf4, 0xfa, 0xca, 0x91, 0xfe, 0x7e, 0x2f, 0x7f, 0xf8, 0xb6, 0xf4, + 0x1f, 0x78, 0x65, 0xf4, 0x96, 0x5f, 0xfb, 0xac, 0x41, 0x4b, 0x3c, 0x6d, + 0x59, 0x7f, 0xcc, 0x41, 0x4b, 0x3c, 0x6d, 0x59, 0x7c, 0x12, 0x76, 0x27, + 0x1f, 0xb7, 0x4f, 0xaf, 0xda, 0xfc, 0xfd, 0x0b, 0x29, 0xa7, 0xc6, 0x13, + 0xbb, 0xf6, 0x6b, 0x32, 0x65, 0x96, 0x66, 0xd5, 0x4d, 0x1e, 0x86, 0xcb, + 0x91, 0xf2, 0x32, 0x31, 0x08, 0xaf, 0xda, 0x03, 0xb8, 0x15, 0x15, 0x92, + 0xff, 0xcf, 0x26, 0x79, 0xa0, 0x3b, 0x81, 0x51, 0x37, 0x2c, 0xcf, 0x11, + 0x00, 0xd3, 0x4a, 0x02, 0x61, 0x27, 0x0d, 0xfb, 0xe0, 0x3b, 0x81, 0x51, + 0x2b, 0x2f, 0xff, 0xb5, 0xb1, 0x46, 0x9c, 0x64, 0xfa, 0x8d, 0xeb, 0x2b, + 0x47, 0xfc, 0x12, 0xeb, 0xf1, 0x40, 0xdf, 0xcb, 0x2f, 0xf4, 0x19, 0x44, + 0xa3, 0x75, 0x65, 0xf3, 0x5e, 0x4c, 0xf0, 0xfe, 0xcc, 0x8b, 0x84, 0xd7, + 0xe6, 0x6f, 0x37, 0x31, 0x65, 0xf9, 0x9e, 0x4a, 0x3f, 0x59, 0x4c, 0xd1, + 0x35, 0xb2, 0x34, 0x8a, 0xaf, 0xfd, 0xdc, 0x67, 0x9a, 0x3d, 0x9d, 0xab, + 0x2f, 0xff, 0x4f, 0x4c, 0x86, 0x4f, 0x31, 0xe4, 0x79, 0xac, 0x59, 0x7f, + 0xe3, 0xe0, 0x5a, 0x47, 0xbc, 0x2e, 0xb2, 0xff, 0xfb, 0xd1, 0x23, 0xff, + 0x59, 0xe7, 0x27, 0x92, 0xcb, 0xfa, 0x09, 0xc0, 0xfb, 0x8b, 0x2f, 0xfa, + 0x01, 0x1a, 0x3e, 0xc0, 0x16, 0x54, 0x91, 0xe5, 0xf1, 0xfb, 0x53, 0xba, + 0x5d, 0x70, 0xf4, 0xb2, 0xfd, 0xa0, 0x3b, 0x81, 0x51, 0x2e, 0x2f, 0xf3, + 0xcb, 0xa5, 0x0d, 0xe2, 0xcb, 0xff, 0x8f, 0x81, 0x63, 0x98, 0xd3, 0xf4, + 0x2c, 0xa3, 0x3f, 0x67, 0x32, 0xbf, 0x4a, 0x7c, 0xfc, 0xeb, 0x2f, 0x44, + 0xfc, 0x2c, 0xbf, 0xff, 0xb0, 0x20, 0xf4, 0x14, 0x49, 0xc7, 0x1f, 0x68, + 0xd6, 0x5f, 0xfb, 0x86, 0x41, 0xec, 0xf9, 0xef, 0x6a, 0xcb, 0xc6, 0x50, + 0xb2, 0xa4, 0x8f, 0xe1, 0x95, 0x6e, 0x0f, 0x35, 0x67, 0x7a, 0x1d, 0xff, + 0xc4, 0x19, 0x79, 0xe5, 0x9f, 0x4a, 0x16, 0x5f, 0xfc, 0x19, 0x11, 0xca, + 0x3a, 0x41, 0x92, 0xcb, 0xf4, 0x73, 0xf6, 0xf5, 0x65, 0x19, 0xf6, 0x79, + 0x0e, 0xb8, 0x8d, 0x1e, 0xc2, 0xc2, 0xc0, 0x59, 0x4e, 0x6e, 0x7f, 0x28, + 0xbf, 0xa5, 0xec, 0x2c, 0x02, 0xcb, 0xd2, 0xf7, 0x56, 0x5d, 0xe8, 0x33, + 0xc9, 0xf1, 0x65, 0xff, 0xc4, 0x7f, 0xf3, 0x50, 0x72, 0x7e, 0x2c, 0xb8, + 0xf8, 0xb2, 0xb1, 0x10, 0xa6, 0x59, 0x3e, 0x87, 0x7f, 0x68, 0xda, 0x4f, + 0x25, 0x97, 0xfe, 0xfa, 0x59, 0xdc, 0xd0, 0x23, 0x16, 0x5e, 0x79, 0x33, + 0x9e, 0x2b, 0xc8, 0xf1, 0x1a, 0x3c, 0x8f, 0xb0, 0x5f, 0xd0, 0xaa, 0x78, + 0xc7, 0xb9, 0x1a, 0xcf, 0x61, 0xde, 0x13, 0x1d, 0xd2, 0xcb, 0xff, 0x05, + 0xac, 0xf9, 0x05, 0xdc, 0xd2, 0xcb, 0xfe, 0x1e, 0x33, 0x8d, 0x1f, 0x82, + 0xb2, 0xff, 0xe1, 0xc3, 0x3d, 0xdc, 0xfa, 0x5e, 0x8e, 0x2c, 0xb3, 0x33, + 0x64, 0x07, 0x36, 0x7a, 0x1f, 0x90, 0xc3, 0x0a, 0x06, 0xf3, 0xab, 0xff, + 0x99, 0xbc, 0x99, 0xe6, 0x80, 0xee, 0x05, 0x44, 0x76, 0xbf, 0xfe, 0x0c, + 0x7d, 0x23, 0x68, 0xb8, 0x43, 0xf4, 0x2c, 0xbf, 0x37, 0xee, 0x98, 0xab, + 0x2e, 0xd9, 0x98, 0xcf, 0xe8, 0x45, 0x0b, 0xfd, 0xec, 0x93, 0x37, 0x2e, + 0x2c, 0xac, 0x3e, 0x6e, 0x99, 0x5f, 0xf3, 0x26, 0x7f, 0x18, 0x3e, 0x94, + 0x2c, 0xbf, 0xa7, 0xb2, 0x80, 0x61, 0x2c, 0xb8, 0x3e, 0x59, 0x7f, 0x32, + 0x4b, 0x3c, 0xfd, 0x59, 0x7d, 0x8d, 0xd4, 0x2c, 0xbf, 0x61, 0x1f, 0xe2, + 0x2c, 0xa2, 0x3c, 0x9e, 0x10, 0xde, 0xcd, 0x42, 0xcb, 0xff, 0xf4, 0x8c, + 0x7e, 0x3d, 0xf3, 0xb0, 0x7a, 0x30, 0x81, 0x65, 0xf4, 0x6a, 0x34, 0xb2, + 0x8d, 0x16, 0xda, 0x21, 0xe8, 0xd8, 0x8b, 0x37, 0xa6, 0x8d, 0x96, 0x5f, + 0x41, 0x77, 0x8b, 0x2e, 0xc1, 0x60, 0xdf, 0xf0, 0x7a, 0xff, 0xec, 0xe7, + 0x73, 0xd0, 0x5d, 0xf1, 0xac, 0xba, 0x7a, 0xe2, 0xcb, 0xfb, 0xf2, 0xcf, + 0xbb, 0x8b, 0x2e, 0xdb, 0x71, 0x65, 0xf9, 0xd8, 0xf6, 0x7e, 0xb2, 0xfe, + 0x2f, 0xdf, 0x4e, 0x22, 0xca, 0x9e, 0x51, 0x79, 0x03, 0x9b, 0x17, 0x68, + 0x6d, 0xca, 0x6f, 0xff, 0xfe, 0xf3, 0x8c, 0x9e, 0x77, 0x3d, 0x1c, 0x9c, + 0x17, 0x9d, 0x2c, 0xdf, 0x0b, 0x2f, 0x98, 0x2c, 0x92, 0xcb, 0xbd, 0x1e, + 0x44, 0xd1, 0x3c, 0x5f, 0xb5, 0xa8, 0xdf, 0xc5, 0x97, 0xfe, 0x3d, 0x4e, + 0xe1, 0x63, 0x60, 0x0b, 0x2f, 0xf0, 0x7a, 0x6f, 0xbd, 0xe4, 0xb2, 0xfe, + 0x7d, 0xe3, 0xc2, 0x61, 0x65, 0xa0, 0x8f, 0x8c, 0x43, 0x4b, 0xff, 0xff, + 0xbf, 0x82, 0x03, 0xf5, 0xfe, 0xfe, 0x76, 0x11, 0xc0, 0x7d, 0xe8, 0x59, + 0x7f, 0xe2, 0x0c, 0xa7, 0x61, 0x94, 0x35, 0x65, 0xfd, 0xc9, 0x18, 0x1f, + 0x4b, 0x2f, 0x3b, 0x81, 0x51, 0x50, 0xaf, 0xd8, 0x1e, 0x85, 0xab, 0x2a, + 0x0f, 0xf4, 0x05, 0xba, 0x28, 0xbf, 0xa2, 0x69, 0x07, 0xe9, 0x2c, 0xbf, + 0xf1, 0xff, 0xc9, 0xdc, 0xfd, 0xf2, 0x65, 0x97, 0xf0, 0x40, 0x6c, 0x38, + 0x16, 0x5f, 0xf6, 0x7b, 0x09, 0xf5, 0xa3, 0x59, 0x52, 0x56, 0xa7, 0x85, + 0xac, 0x15, 0x02, 0x14, 0x5f, 0x13, 0x9b, 0x9e, 0xa1, 0x76, 0xd2, 0xef, + 0x18, 0x12, 0x1f, 0x0b, 0xaf, 0x6e, 0x3c, 0x2c, 0xb6, 0x2c, 0xbf, 0xfe, + 0x36, 0xc0, 0x27, 0x03, 0xc7, 0xbb, 0x0d, 0x85, 0x97, 0xff, 0x05, 0xf6, + 0xe6, 0x18, 0x01, 0x9b, 0xd6, 0x54, 0x91, 0x53, 0xe1, 0x02, 0x53, 0xbf, + 0xe9, 0x74, 0xf4, 0xe0, 0x32, 0x59, 0x7b, 0xfe, 0x62, 0xcb, 0xfd, 0xc0, + 0xcc, 0xe3, 0x79, 0x96, 0x5f, 0xff, 0xdc, 0x15, 0xf7, 0x78, 0x7a, 0x9b, + 0x90, 0xd7, 0xfb, 0xab, 0x2f, 0x68, 0xfe, 0x59, 0x52, 0x46, 0x87, 0xc3, + 0xb3, 0x1a, 0xf5, 0x86, 0xfd, 0x22, 0x86, 0xb0, 0xb2, 0xff, 0xe6, 0xe6, + 0x8b, 0x0f, 0x79, 0xe9, 0xd6, 0x57, 0xc7, 0xd6, 0xe5, 0x17, 0xff, 0xe3, + 0xd4, 0xec, 0xe8, 0x63, 0x36, 0xf6, 0x1c, 0x96, 0x5f, 0xf8, 0xb2, 0x6e, + 0xfb, 0x34, 0x7c, 0x59, 0x7f, 0xf3, 0xb6, 0x73, 0x5f, 0xb3, 0xbd, 0xdd, + 0x2c, 0xaf, 0x22, 0x1c, 0x8f, 0xaf, 0xdf, 0x11, 0xb4, 0xd6, 0x5f, 0xa2, + 0x7b, 0xdb, 0x05, 0x59, 0x7d, 0x3e, 0x1d, 0xd8, 0x59, 0x50, 0x9c, 0xf0, + 0xc8, 0xb2, 0x1b, 0xa6, 0x45, 0xa2, 0x70, 0x97, 0x5f, 0xdd, 0x7f, 0x4e, + 0x1c, 0x2c, 0xbf, 0xee, 0xf0, 0x4e, 0x3f, 0xd2, 0xc5, 0x97, 0xf9, 0xe5, + 0x3b, 0x81, 0xfd, 0xd6, 0x5f, 0x47, 0xa3, 0x65, 0x96, 0x31, 0x9e, 0xc7, + 0x8d, 0xaa, 0x11, 0xd3, 0x85, 0xe1, 0x84, 0x9d, 0xfb, 0x87, 0xec, 0x1a, + 0xcb, 0xf4, 0xa3, 0xb9, 0xb2, 0xca, 0xdc, 0x3c, 0xfd, 0x13, 0xde, 0xfb, + 0xb8, 0xb2, 0xfe, 0xe1, 0x90, 0x3d, 0x0b, 0x2b, 0x0f, 0xbb, 0x44, 0xbd, + 0x1d, 0xbf, 0xf6, 0x77, 0x9a, 0xc9, 0xbc, 0x6c, 0x2c, 0xbf, 0xff, 0x8f, + 0x9f, 0xe4, 0x8a, 0x3f, 0x7f, 0x7d, 0x2c, 0xea, 0xcb, 0xfe, 0xc6, 0x31, + 0xa7, 0x3f, 0x0d, 0x59, 0x5a, 0x44, 0xb9, 0x2e, 0x5f, 0xf4, 0xe7, 0x2c, + 0xdd, 0x9d, 0xe0, 0xac, 0xbf, 0x0a, 0x7a, 0xc6, 0x16, 0x54, 0x27, 0x1e, + 0x65, 0xcf, 0x0d, 0x70, 0x91, 0x08, 0x7f, 0x7f, 0xdd, 0x3e, 0x18, 0x59, + 0x63, 0x85, 0x97, 0x47, 0xcb, 0x2f, 0xe8, 0xee, 0x13, 0xee, 0x2c, 0xa3, + 0x44, 0x0e, 0x8f, 0x3f, 0x17, 0xbf, 0xa3, 0x5b, 0x46, 0xb6, 0x59, 0x7c, + 0x1d, 0xa2, 0x4b, 0x2a, 0x47, 0xa5, 0xc2, 0xfb, 0xff, 0x73, 0x0b, 0xbc, + 0xc9, 0x1f, 0x96, 0x5f, 0xdc, 0xcd, 0xe5, 0x1f, 0x2c, 0xb8, 0x3e, 0x59, + 0x5c, 0x44, 0x1f, 0x4f, 0x67, 0xcb, 0xef, 0xff, 0xa3, 0xfc, 0x29, 0xcf, + 0xd9, 0xde, 0xcf, 0xdd, 0x65, 0xc5, 0xb2, 0xca, 0x84, 0xd0, 0xb2, 0x14, + 0xa6, 0x66, 0x4a, 0x77, 0xfc, 0x63, 0xc6, 0xce, 0xe3, 0xf9, 0x65, 0xff, + 0xef, 0x43, 0x49, 0xd8, 0x2c, 0xff, 0xef, 0xd6, 0x5f, 0xdb, 0xdd, 0xbe, + 0x15, 0xd6, 0x5f, 0xff, 0xe3, 0x8e, 0xbf, 0x99, 0xf3, 0xd8, 0x5d, 0x9d, + 0xfc, 0xb8, 0xb2, 0xa4, 0x8e, 0x13, 0x4c, 0x23, 0x0b, 0xdc, 0x0e, 0x96, + 0x5e, 0x3f, 0x1a, 0xcb, 0xfb, 0x4e, 0x5f, 0xff, 0x0b, 0x2a, 0x13, 0xaf, + 0xc8, 0xc6, 0xcc, 0xb9, 0xc7, 0x44, 0x1b, 0xbf, 0xe9, 0x16, 0x77, 0x9f, + 0x9f, 0xcb, 0x2f, 0xd0, 0xd7, 0xfb, 0xab, 0x2e, 0xcd, 0x96, 0x5f, 0xfc, + 0x3e, 0x66, 0x8b, 0x3f, 0xe6, 0x69, 0x65, 0x71, 0x10, 0x7d, 0x28, 0x08, + 0xbd, 0xfb, 0x00, 0x17, 0xd9, 0x65, 0x78, 0xf6, 0x08, 0xc2, 0xff, 0xfb, + 0x44, 0x1f, 0x8b, 0x0f, 0x40, 0xf4, 0x71, 0x65, 0xff, 0xfc, 0x07, 0xf6, + 0x4a, 0x35, 0x1f, 0xea, 0x04, 0x72, 0x59, 0x50, 0x8a, 0x9c, 0x4f, 0xbf, + 0x66, 0xce, 0x5b, 0xd6, 0x5f, 0xff, 0xff, 0xe8, 0x94, 0xee, 0xf8, 0xe3, + 0x93, 0xb0, 0x20, 0x8d, 0xf3, 0xb3, 0x5a, 0xcd, 0xe1, 0x7f, 0x2c, 0xbe, + 0xf1, 0x3e, 0xea, 0xca, 0x85, 0x5c, 0x99, 0x18, 0xaf, 0xa1, 0x94, 0x44, + 0x3c, 0x29, 0xec, 0x25, 0xef, 0xf3, 0xfd, 0xc3, 0x6c, 0x01, 0x65, 0xf6, + 0xcf, 0x1a, 0x59, 0x78, 0x49, 0xf7, 0x59, 0x7f, 0xff, 0x6e, 0x1e, 0xde, + 0x73, 0xec, 0x78, 0xfb, 0xcc, 0x1a, 0xca, 0xf1, 0xfe, 0xb9, 0x05, 0x3a, + 0x30, 0x03, 0x09, 0xfb, 0xff, 0x6f, 0x79, 0x61, 0x0c, 0xa2, 0x4b, 0x2e, + 0xda, 0x16, 0x58, 0xb0, 0xf5, 0x42, 0x7d, 0x7f, 0xe7, 0x7f, 0x1f, 0x38, + 0x17, 0xfd, 0x65, 0x99, 0xcf, 0x4d, 0xd1, 0x63, 0x24, 0xfe, 0x79, 0x30, + 0x9e, 0xc5, 0xe2, 0x32, 0xfd, 0x9f, 0x24, 0x58, 0x38, 0x7f, 0x64, 0xe1, + 0xdb, 0x10, 0xa3, 0x04, 0x31, 0xfe, 0x2f, 0x38, 0xc1, 0xf5, 0x29, 0x21, + 0xb1, 0xa1, 0xfa, 0x53, 0xfb, 0xc3, 0x3c, 0xa3, 0xc4, 0xe4, 0x7d, 0xdd, + 0x96, 0x64, 0x16, 0x69, 0xf8, 0x79, 0x88, 0xf9, 0xba, 0x4d, 0x7c, 0x07, + 0x70, 0x2a, 0x2a, 0x85, 0xfe, 0xd4, 0x6f, 0xfa, 0x59, 0xd5, 0x95, 0xa3, + 0xe4, 0x09, 0x75, 0xfe, 0x62, 0x3b, 0xcd, 0xf8, 0x35, 0x97, 0xfe, 0x79, + 0x33, 0xcd, 0x01, 0xdc, 0x0a, 0x89, 0xad, 0x7f, 0xde, 0x86, 0xf3, 0x8e, + 0x40, 0x59, 0x7d, 0x1a, 0x8e, 0xac, 0xb9, 0xfa, 0xb2, 0x86, 0x6d, 0xda, + 0x43, 0x66, 0x78, 0x99, 0xa3, 0x04, 0x4d, 0x36, 0xf2, 0x63, 0xb7, 0xdf, + 0xff, 0x6e, 0x18, 0xf1, 0xb3, 0xbb, 0x9b, 0x87, 0xbf, 0x8b, 0x2f, 0xda, + 0x03, 0xb8, 0x15, 0x15, 0x62, 0xf6, 0xa1, 0xab, 0x2f, 0xfa, 0x25, 0x1a, + 0xda, 0x35, 0xb2, 0xcb, 0x33, 0x84, 0x71, 0xe2, 0xce, 0x8d, 0x08, 0x72, + 0xf8, 0xb0, 0x2c, 0xb5, 0x97, 0xf7, 0xdd, 0x8f, 0x3e, 0xe2, 0xcb, 0xf3, + 0xfb, 0x35, 0x8b, 0x2a, 0x0f, 0x5d, 0xcc, 0x6f, 0xed, 0x06, 0x6e, 0x47, + 0x56, 0x54, 0x23, 0x2f, 0xcf, 0x81, 0x20, 0xbf, 0xfb, 0xfc, 0x26, 0x72, + 0xff, 0x9b, 0x39, 0x2c, 0xa6, 0x67, 0xef, 0x05, 0xf7, 0xf1, 0xb4, 0xfb, + 0xe8, 0x59, 0x7d, 0x13, 0x47, 0xcb, 0x2b, 0xc7, 0x9f, 0xc2, 0xcb, 0xfe, + 0x93, 0x3c, 0xd0, 0x1d, 0xc0, 0xa8, 0x91, 0x17, 0xf6, 0xd1, 0xaf, 0x39, + 0xac, 0xb3, 0x3c, 0x44, 0xb3, 0x91, 0x71, 0x1e, 0xfd, 0xa0, 0x3b, 0x81, + 0x51, 0x69, 0x2f, 0xfc, 0xf2, 0x67, 0x9a, 0x03, 0xb8, 0x15, 0x13, 0xea, + 0xcc, 0xf1, 0x10, 0x0d, 0x34, 0xbf, 0xfc, 0xcd, 0xaf, 0x26, 0x79, 0xa0, + 0x3b, 0x81, 0x51, 0x42, 0x2f, 0xfe, 0xc1, 0x59, 0xf5, 0x87, 0xe1, 0xf6, + 0x16, 0x5f, 0xba, 0x10, 0x3f, 0x16, 0x5f, 0x1e, 0xd1, 0xa5, 0x94, 0xd3, + 0xca, 0xf1, 0x45, 0xfb, 0x40, 0x77, 0x02, 0xa2, 0x8f, 0x5f, 0xf4, 0x4a, + 0x35, 0xb4, 0x6b, 0x65, 0x97, 0xff, 0xff, 0xf8, 0x43, 0xd4, 0xd1, 0xed, + 0x67, 0x9c, 0x4e, 0x63, 0x0e, 0x5f, 0xc1, 0x44, 0xde, 0x85, 0x97, 0xe7, + 0xe1, 0xf6, 0x16, 0x5f, 0xf4, 0x4d, 0x05, 0x13, 0x7a, 0x16, 0x54, 0x23, + 0xb9, 0x88, 0x48, 0x11, 0x35, 0xff, 0xfd, 0x83, 0xf4, 0x08, 0xcf, 0xa4, + 0xff, 0xf3, 0x91, 0xfa, 0x4b, 0xcf, 0x26, 0x70, 0xa8, 0x47, 0x08, 0x88, + 0xd3, 0xb1, 0x94, 0x4f, 0x9a, 0x5f, 0xfd, 0x9e, 0x67, 0xd6, 0x1f, 0x87, + 0xd8, 0x59, 0x66, 0x7b, 0x2b, 0x4d, 0x6c, 0xaa, 0x2e, 0xb2, 0xd4, 0x3b, + 0x00, 0x2d, 0xa9, 0x08, 0x32, 0x64, 0xc8, 0xcd, 0x18, 0xae, 0x93, 0x41, + 0x2d, 0x4b, 0xe8, 0xcd, 0x4e, 0x38, 0x49, 0xa3, 0x08, 0xf4, 0x2d, 0xbf, + 0x2a, 0xec, 0xba, 0x7b, 0xff, 0xe1, 0x41, 0x3d, 0x32, 0x7f, 0x65, 0xea, + 0x79, 0x9d, 0x3b, 0xd3, 0xeb, 0x2f, 0xff, 0xfd, 0xbb, 0xd9, 0xec, 0x6d, + 0x9e, 0xc8, 0xd9, 0x57, 0x59, 0x7a, 0x9e, 0x67, 0x4e, 0xf4, 0xfa, 0xca, + 0xf2, 0x60, 0x02, 0xb7, 0x5f, 0xfd, 0xe8, 0x3d, 0x1b, 0x2c, 0x1e, 0x81, + 0x56, 0x5f, 0xfb, 0x8c, 0xb3, 0x62, 0x74, 0xef, 0x4f, 0xb3, 0x83, 0xed, + 0x01, 0x2d, 0xfb, 0x40, 0x77, 0x02, 0xa2, 0x22, 0x5f, 0xee, 0x06, 0x26, + 0xe9, 0xef, 0x59, 0x66, 0x78, 0x7d, 0x53, 0x1a, 0x5f, 0xd9, 0xa0, 0x3b, + 0x81, 0x51, 0x15, 0xaf, 0xfb, 0x71, 0x9e, 0x68, 0x0e, 0xe0, 0x54, 0x57, + 0x0a, 0x66, 0x88, 0x37, 0x39, 0xbe, 0xf3, 0xe8, 0xd6, 0x5f, 0xbb, 0xf8, + 0x85, 0x25, 0x97, 0xef, 0xe0, 0x80, 0xce, 0x0f, 0x2d, 0xc8, 0x6f, 0x99, + 0xed, 0x36, 0xe2, 0xcb, 0x1f, 0xc7, 0xd3, 0xf9, 0xfd, 0xfe, 0x64, 0xcf, + 0x45, 0x00, 0x7f, 0x96, 0x5f, 0x67, 0x9f, 0xab, 0x2f, 0xf6, 0x1e, 0xbf, + 0xfc, 0x3c, 0x59, 0x66, 0x49, 0x1e, 0xb7, 0x08, 0x6f, 0xed, 0x47, 0x5c, + 0xb1, 0x65, 0xff, 0xfb, 0x87, 0xe7, 0x39, 0x19, 0x74, 0x3e, 0xd6, 0x2c, + 0xa3, 0x3f, 0xee, 0x95, 0xdf, 0xd1, 0xff, 0x3a, 0x50, 0xb2, 0xf8, 0x0e, + 0xe0, 0x54, 0x53, 0xcb, 0xff, 0x14, 0x6f, 0x3e, 0xca, 0x30, 0x96, 0x56, + 0x8f, 0xaf, 0xa5, 0xd7, 0xf8, 0x7f, 0xce, 0x8d, 0xc8, 0x92, 0xcb, 0xfc, + 0xd3, 0x18, 0x5f, 0x52, 0x59, 0x73, 0x4d, 0x65, 0x41, 0xe4, 0x80, 0xce, + 0xff, 0xfe, 0x8e, 0xf0, 0x2d, 0x01, 0xff, 0x19, 0xe3, 0x08, 0x16, 0x5f, + 0xd0, 0xde, 0x41, 0xec, 0xb2, 0xa4, 0x88, 0x8e, 0xad, 0xdf, 0xff, 0xcf, + 0xa7, 0xf7, 0xd2, 0xce, 0xe1, 0x07, 0xa1, 0x61, 0x65, 0xf4, 0xa3, 0x36, + 0x59, 0x7f, 0xfe, 0xd0, 0x75, 0xa8, 0x2c, 0x60, 0xfd, 0xec, 0x11, 0x65, + 0xed, 0x1f, 0xcb, 0x28, 0x08, 0xf1, 0xf9, 0x73, 0x44, 0x5d, 0x56, 0xbc, + 0x65, 0xd5, 0x97, 0xff, 0x3c, 0x99, 0xb8, 0xf2, 0x5e, 0x80, 0x2c, 0xbf, + 0xf1, 0xe9, 0xf6, 0x18, 0x5f, 0x52, 0x59, 0x7f, 0xd8, 0x5f, 0xc3, 0x4f, + 0x52, 0x59, 0x7f, 0x8f, 0x86, 0x16, 0x58, 0xe1, 0x65, 0x48, 0xfb, 0xba, + 0x71, 0x67, 0x59, 0x7f, 0xfc, 0xdc, 0x3e, 0x87, 0xb1, 0x23, 0x1e, 0x0d, + 0x65, 0x1a, 0x20, 0x3c, 0x45, 0xf8, 0x85, 0xfd, 0x1a, 0xda, 0x35, 0xb2, + 0xcb, 0xfa, 0x36, 0x71, 0xbf, 0x56, 0x54, 0x8f, 0x73, 0x74, 0xbe, 0xfa, + 0x71, 0x3c, 0x96, 0x5f, 0x9f, 0x3c, 0x6d, 0x59, 0x5c, 0x3c, 0x9d, 0xe4, + 0x75, 0x08, 0x92, 0xc6, 0xeb, 0xfe, 0xde, 0xed, 0x9c, 0x3f, 0x1b, 0x56, + 0x5f, 0xf1, 0x43, 0x62, 0x45, 0x8d, 0x59, 0x7f, 0xf9, 0xb1, 0xad, 0xa3, + 0xec, 0x0b, 0x2f, 0x06, 0xb2, 0xb1, 0x18, 0x46, 0x7a, 0xe6, 0xd7, 0xe0, + 0x61, 0x94, 0xcb, 0x2f, 0xf1, 0x03, 0x37, 0xe7, 0x78, 0xb2, 0xe7, 0x61, + 0x65, 0x41, 0xe5, 0xe8, 0xd2, 0xfc, 0xfb, 0x46, 0x82, 0xb2, 0xa7, 0x96, + 0x48, 0x4c, 0xf7, 0x09, 0x28, 0x85, 0x4c, 0x88, 0x72, 0x13, 0x0c, 0x11, + 0x02, 0x10, 0x5f, 0x42, 0xa4, 0xe3, 0x14, 0x98, 0xf9, 0xa3, 0x7e, 0x45, + 0x78, 0xcb, 0x4a, 0x31, 0xee, 0x43, 0x8f, 0xa5, 0xbb, 0xdc, 0xa7, 0xc8, + 0x6f, 0xff, 0x3c, 0x99, 0x8c, 0x9c, 0x5e, 0x72, 0x3f, 0x59, 0x7f, 0xfb, + 0xff, 0xc3, 0xc6, 0x62, 0x13, 0xb4, 0xa1, 0x65, 0xff, 0xc5, 0x9f, 0xb9, + 0x7e, 0xcd, 0xa6, 0xd5, 0x95, 0xa4, 0x4a, 0x75, 0x3a, 0xfc, 0xfe, 0xf1, + 0xcc, 0xb2, 0xff, 0xec, 0xe1, 0x97, 0xe5, 0x9d, 0xf6, 0x2c, 0xbf, 0xf1, + 0x97, 0xe5, 0x9d, 0xf6, 0x33, 0xf1, 0xf5, 0x08, 0x51, 0x4c, 0xd5, 0x7c, + 0x8e, 0x33, 0x43, 0x87, 0x0f, 0x21, 0x1b, 0x6c, 0x59, 0x7e, 0x28, 0x0b, + 0x2f, 0x8b, 0x2f, 0xe6, 0x34, 0xe3, 0x72, 0x59, 0x43, 0x3e, 0x8c, 0x10, + 0x72, 0xbb, 0xff, 0x8c, 0x7a, 0x7f, 0x99, 0xeb, 0x51, 0xb2, 0xca, 0x66, + 0x7e, 0xbe, 0x2d, 0xb4, 0x2c, 0xbf, 0xb9, 0x00, 0x28, 0x1a, 0xca, 0x19, + 0xbc, 0x31, 0x0b, 0xff, 0xf7, 0xa3, 0x59, 0x23, 0x7e, 0xe0, 0xcc, 0x20, + 0x49, 0x7e, 0x89, 0x7e, 0x19, 0x2c, 0xbe, 0x03, 0xb8, 0x15, 0x15, 0x9a, + 0xa6, 0x3d, 0x7d, 0x14, 0xdf, 0x74, 0xdb, 0xc5, 0x97, 0x71, 0x85, 0x97, + 0xb8, 0x10, 0x2c, 0xa6, 0x0d, 0xaf, 0x06, 0x2f, 0xb9, 0xa8, 0xde, 0xb2, + 0xfe, 0xde, 0x45, 0x1b, 0x93, 0x2c, 0xbf, 0x36, 0x0a, 0x5c, 0x59, 0x50, + 0x7b, 0x3b, 0x19, 0x5f, 0x77, 0x82, 0x71, 0x65, 0xf7, 0x39, 0x02, 0xac, + 0xb3, 0xac, 0xac, 0x3d, 0x73, 0x24, 0xe1, 0x1d, 0xdb, 0x1a, 0xcb, 0xfd, + 0xc9, 0x8c, 0xbd, 0x9f, 0x2c, 0xa8, 0x3c, 0xbc, 0x17, 0xb9, 0xfa, 0xb2, + 0xfb, 0xf1, 0x0a, 0x4b, 0x28, 0x66, 0xeb, 0xa2, 0xd7, 0xff, 0xd0, 0xde, + 0xe6, 0x17, 0x79, 0xec, 0xfd, 0xd6, 0x5f, 0xe6, 0xc7, 0xdc, 0xd4, 0x6f, + 0x59, 0x73, 0xf1, 0x65, 0x41, 0xe6, 0x04, 0xda, 0xff, 0x48, 0xc3, 0xb9, + 0x3c, 0xfe, 0xd5, 0x97, 0xe2, 0x8f, 0x1e, 0x2c, 0xac, 0x3e, 0x27, 0x3d, + 0xb1, 0xac, 0xbf, 0xbd, 0x84, 0x4f, 0xd5, 0x9c, 0x2c, 0x2f, 0xc5, 0xdf, + 0x46, 0xf5, 0x97, 0x9d, 0xda, 0xb2, 0xfd, 0x93, 0x6c, 0x1f, 0xd6, 0x5f, + 0xdd, 0x8d, 0x7f, 0x13, 0x2c, 0xb3, 0x38, 0x5d, 0x74, 0x19, 0x06, 0x42, + 0xab, 0xe2, 0x33, 0x57, 0x98, 0x8b, 0x4f, 0xad, 0x79, 0xf3, 0xc3, 0xad, + 0x7e, 0x42, 0x50, 0x9a, 0xe4, 0x20, 0xfa, 0x60, 0x13, 0xad, 0xe5, 0x22, + 0x0d, 0xee, 0x95, 0xdf, 0xf1, 0xf5, 0xf5, 0xb4, 0x18, 0xd6, 0x5f, 0xd0, + 0xdd, 0x83, 0xa9, 0x2c, 0xaf, 0x1f, 0x3f, 0x4e, 0x2f, 0xf6, 0xde, 0xc0, + 0x7a, 0x34, 0xb2, 0xff, 0xa0, 0xa5, 0xc6, 0xb9, 0x30, 0xb2, 0xa0, 0xfb, + 0x3a, 0x69, 0x74, 0x0d, 0x65, 0xff, 0x05, 0xb8, 0x0d, 0x7c, 0xe2, 0xac, + 0xa9, 0x1f, 0x97, 0x08, 0x7a, 0x2d, 0x7f, 0xb5, 0x0c, 0x61, 0x1b, 0x0b, + 0x2f, 0xff, 0xd8, 0x3f, 0x47, 0x27, 0x61, 0xe8, 0xdb, 0x0c, 0x2c, 0xbf, + 0xfd, 0x02, 0x88, 0xd2, 0xcf, 0xbb, 0x18, 0x2a, 0xcb, 0xf7, 0x4c, 0xb1, + 0xab, 0x2f, 0xa4, 0xe4, 0xcf, 0x15, 0x15, 0x7d, 0x18, 0x06, 0x8b, 0xc8, + 0xcc, 0x45, 0x6d, 0xd4, 0xcb, 0xff, 0x3c, 0x99, 0xe6, 0x80, 0xee, 0x05, + 0x44, 0x8a, 0xbf, 0xff, 0x77, 0xd8, 0x4c, 0xfa, 0xef, 0xf7, 0x18, 0x61, + 0xd6, 0x5f, 0xf9, 0xfa, 0xce, 0x0f, 0x47, 0xd0, 0xac, 0xa6, 0x68, 0xe4, + 0x84, 0xc7, 0x59, 0xbf, 0xed, 0x68, 0xc5, 0xc9, 0x8d, 0xab, 0x2f, 0x81, + 0x1e, 0x85, 0x94, 0x67, 0xb6, 0x47, 0x57, 0xed, 0x01, 0xdc, 0x0a, 0x8b, + 0x25, 0x50, 0x7a, 0x98, 0x41, 0x7e, 0xd8, 0xca, 0x5c, 0x59, 0x7f, 0x83, + 0xb7, 0xa3, 0xbc, 0x35, 0x97, 0xf0, 0x46, 0x7a, 0x7e, 0x2c, 0xb8, 0xfa, + 0xb2, 0xfd, 0xde, 0x09, 0xc6, 0x78, 0x89, 0xfd, 0x14, 0x70, 0xd3, 0xa5, + 0xb4, 0xcd, 0x31, 0xcc, 0x85, 0xfd, 0xf6, 0x0b, 0xcf, 0x2c, 0xbf, 0xdb, + 0xa6, 0xd8, 0xf0, 0x83, 0x59, 0x7f, 0x78, 0xf5, 0x12, 0xe2, 0xcb, 0xf9, + 0xbd, 0x3f, 0x3b, 0x56, 0x5f, 0xfe, 0x3e, 0xfb, 0x3b, 0x85, 0x1d, 0x81, + 0xac, 0xa8, 0x3f, 0x47, 0x2d, 0xbf, 0xe7, 0x3e, 0x87, 0x4f, 0xc6, 0x7b, + 0x26, 0x37, 0x84, 0x60, 0x37, 0xf4, 0x28, 0x6f, 0xff, 0xf7, 0x5f, 0xef, + 0xd9, 0x8c, 0xa3, 0xe9, 0x74, 0xcb, 0xfe, 0x2c, 0xbf, 0xb3, 0x40, 0x77, + 0x02, 0xa2, 0xd8, 0x5f, 0xff, 0xbd, 0x38, 0xb3, 0x5d, 0xe7, 0xa6, 0x9d, + 0x3b, 0xd3, 0xeb, 0x2f, 0xde, 0x7d, 0x1b, 0x56, 0x53, 0x25, 0x11, 0x00, + 0x61, 0xbd, 0xa0, 0xf9, 0x65, 0xdd, 0x67, 0x07, 0x89, 0xa2, 0x7a, 0x66, + 0x99, 0xa1, 0xc6, 0x0b, 0x7b, 0x39, 0x8b, 0x2f, 0x80, 0xee, 0x05, 0x45, + 0xb6, 0xb9, 0xf4, 0xb2, 0xd2, 0x59, 0x6e, 0x6c, 0x69, 0xc2, 0x2d, 0x5a, + 0x3f, 0xde, 0xaa, 0xdf, 0xbd, 0xd3, 0xfc, 0x2b, 0x2f, 0xff, 0x46, 0xdd, + 0x31, 0xe1, 0x48, 0xfc, 0x15, 0x94, 0x67, 0xe5, 0xe2, 0x9b, 0xfe, 0x89, + 0x46, 0xb6, 0x8d, 0x6c, 0xb2, 0xfa, 0x26, 0xe1, 0xac, 0xa9, 0x27, 0x53, + 0x90, 0x98, 0x9a, 0x12, 0x84, 0x43, 0xba, 0x75, 0x7f, 0xe1, 0xe8, 0xc3, + 0xb3, 0x3e, 0x6b, 0xab, 0x29, 0x9a, 0x26, 0xb1, 0x5e, 0xf7, 0xb3, 0x65, + 0x97, 0xf3, 0x8f, 0x30, 0x98, 0x59, 0x7d, 0x85, 0xfb, 0x39, 0x8f, 0x25, + 0xa3, 0xb7, 0x4f, 0x64, 0xb2, 0xf4, 0xf7, 0xe1, 0xac, 0xbd, 0xb7, 0x8d, + 0x65, 0xff, 0xa7, 0xb9, 0xed, 0x95, 0xfb, 0xec, 0x28, 0xfd, 0x65, 0xe9, + 0xe3, 0x3c, 0x27, 0x8a, 0xcb, 0xf7, 0x63, 0xcf, 0x32, 0xcb, 0xfa, 0x0a, + 0x43, 0x0b, 0x56, 0x5f, 0xef, 0x18, 0x93, 0x70, 0x3f, 0x2c, 0xbf, 0xec, + 0xd6, 0xa2, 0x4f, 0xf0, 0xab, 0x2f, 0x80, 0xee, 0x05, 0x45, 0xe0, 0xbf, + 0x77, 0xe0, 0x1e, 0x96, 0x5f, 0xf8, 0xff, 0xe4, 0xee, 0x7e, 0xf9, 0x32, + 0xcb, 0xff, 0x3f, 0x63, 0x7e, 0xb5, 0x9f, 0x71, 0x65, 0xff, 0xcf, 0xa1, + 0x3a, 0x7e, 0x2c, 0xee, 0x2c, 0xad, 0x26, 0x3c, 0xd2, 0xef, 0x14, 0x92, + 0x1e, 0xf4, 0x1b, 0xf6, 0xba, 0xca, 0xb2, 0x65, 0x97, 0x3f, 0x16, 0x5e, + 0x9f, 0xcf, 0x2c, 0xaf, 0xcd, 0xaf, 0x45, 0xaf, 0xcd, 0x82, 0x93, 0xac, + 0xbf, 0xa0, 0xbb, 0xbd, 0xc0, 0xb2, 0xfe, 0x94, 0x6f, 0x8d, 0x7c, 0xb2, + 0xff, 0xfe, 0x7d, 0xa6, 0x94, 0x6b, 0x6e, 0xcb, 0x37, 0x1c, 0xbf, 0x59, + 0x52, 0x45, 0xfe, 0x17, 0x39, 0x85, 0xf7, 0x8b, 0x26, 0x59, 0x7f, 0x75, + 0xfd, 0x38, 0x70, 0xb2, 0xff, 0x9f, 0xbc, 0x83, 0x1e, 0x35, 0x65, 0x41, + 0xf3, 0x11, 0x7d, 0xf1, 0x61, 0xb0, 0xb2, 0xff, 0x9b, 0xf4, 0xbb, 0x85, + 0xde, 0x2c, 0xa6, 0x9e, 0xd8, 0x84, 0x37, 0x63, 0x0b, 0x2f, 0xcf, 0x2e, + 0x9e, 0xcb, 0x2f, 0xff, 0x1f, 0x60, 0x80, 0x6d, 0x69, 0xf0, 0x2b, 0x2a, + 0x11, 0x55, 0x84, 0x66, 0x2e, 0xe5, 0x17, 0x63, 0x56, 0x5f, 0x8f, 0xc3, + 0x3e, 0x2c, 0xb1, 0xec, 0x6f, 0x64, 0x2d, 0x7e, 0xc2, 0xff, 0x76, 0x16, + 0x5f, 0x08, 0x17, 0xe2, 0xcb, 0xf4, 0xda, 0x3d, 0x9a, 0xb2, 0xa0, 0xf3, + 0x70, 0x8e, 0xe9, 0x86, 0xb2, 0xff, 0xe6, 0xc0, 0x27, 0x61, 0x06, 0x59, + 0xc5, 0x97, 0xfb, 0xc6, 0x2b, 0x1a, 0x71, 0x56, 0x5f, 0xff, 0xf9, 0xcf, + 0xae, 0xd7, 0x2f, 0xc1, 0xe3, 0xd4, 0x84, 0x96, 0x12, 0xcb, 0xfa, 0x3e, + 0xfa, 0x4f, 0xf2, 0xca, 0x1a, 0x65, 0xd8, 0x30, 0x04, 0x5f, 0x1b, 0x05, + 0xae, 0xff, 0x39, 0x7f, 0xd9, 0xfc, 0xf2, 0xcb, 0xfe, 0xf3, 0xc9, 0xa7, + 0x1a, 0x92, 0xcb, 0x66, 0xe1, 0xf7, 0x78, 0xda, 0xe6, 0xf1, 0x65, 0xf4, + 0x14, 0xb7, 0x16, 0x5f, 0xfe, 0xfb, 0xf7, 0x2f, 0xcb, 0x37, 0xfb, 0x06, + 0xb2, 0xff, 0xe3, 0x7f, 0xfa, 0x7c, 0xf4, 0x17, 0x56, 0x5f, 0x67, 0x45, + 0x02, 0xcb, 0xa3, 0xf5, 0x95, 0x24, 0xcb, 0xf0, 0xa9, 0x81, 0x73, 0x24, + 0xf2, 0x6f, 0x10, 0xfa, 0x47, 0x7f, 0x9f, 0xce, 0x23, 0x73, 0x8b, 0x2c, + 0x05, 0x97, 0x02, 0x4b, 0x28, 0x06, 0xa3, 0xa2, 0x34, 0xc8, 0x65, 0xbc, + 0x32, 0x46, 0xe7, 0xb2, 0x29, 0xe2, 0x3b, 0x3c, 0x14, 0x20, 0xbf, 0x62, + 0x89, 0x16, 0x8c, 0xdf, 0x23, 0x58, 0x61, 0x33, 0xe6, 0x43, 0x22, 0x9a, + 0x1c, 0xba, 0x2e, 0x6c, 0x22, 0x3d, 0x19, 0x2b, 0xbb, 0x7e, 0x4e, 0x4e, + 0xfc, 0x8d, 0x3b, 0xb1, 0xf3, 0xef, 0x64, 0x9f, 0x5b, 0xbd, 0xd8, 0x1a, + 0xcb, 0xef, 0xdf, 0x5c, 0x59, 0x77, 0xcc, 0xe0, 0xdf, 0xe0, 0xe5, 0xfe, + 0xfd, 0x9c, 0xd2, 0x82, 0xea, 0xca, 0x66, 0xa8, 0xa6, 0x23, 0xc4, 0xd1, + 0x75, 0xf1, 0x0c, 0x4f, 0x96, 0x5d, 0x9f, 0x2c, 0xbe, 0x7e, 0x07, 0x65, + 0x94, 0x66, 0xeb, 0x42, 0xf7, 0xed, 0x01, 0xdc, 0x0a, 0x8b, 0xd1, 0x7e, + 0xce, 0x94, 0x6c, 0xb2, 0xff, 0xce, 0x7d, 0x0e, 0x9f, 0x7e, 0x0d, 0x65, + 0xe1, 0x87, 0x8b, 0x2f, 0xd0, 0xd7, 0xf4, 0x2c, 0xbc, 0xd3, 0xea, 0xcb, + 0xfe, 0x7e, 0xca, 0x18, 0xe9, 0xec, 0xb2, 0xb4, 0x7f, 0x8d, 0x26, 0x21, + 0xcb, 0xf6, 0x37, 0xce, 0x35, 0x95, 0x0a, 0x81, 0x86, 0xbd, 0x84, 0x1a, + 0x34, 0xf1, 0x3b, 0x9f, 0x89, 0x09, 0x9d, 0xd2, 0xeb, 0xff, 0xb0, 0x7e, + 0xc6, 0xb5, 0xe5, 0x84, 0xb2, 0xf0, 0x63, 0xf5, 0x97, 0xdb, 0xf0, 0x99, + 0x8c, 0xf7, 0xf4, 0x85, 0x7f, 0x99, 0xf7, 0x26, 0x93, 0x8d, 0x65, 0x19, + 0xf9, 0x78, 0xf2, 0x99, 0xa6, 0xd7, 0x91, 0xa5, 0x53, 0x28, 0xed, 0x16, + 0x22, 0x19, 0xdb, 0x42, 0xb6, 0x50, 0xd8, 0xca, 0x61, 0x58, 0x23, 0x2d, + 0x39, 0xdd, 0x49, 0xa5, 0xd1, 0x6a, 0x35, 0xe6, 0xc7, 0xf7, 0xe8, 0xd1, + 0x5d, 0xcb, 0xf8, 0xe6, 0x8a, 0x53, 0x77, 0x1b, 0x43, 0x4d, 0xdd, 0x16, + 0x5d, 0x55, 0xc1, 0xf2, 0xcb, 0xff, 0x83, 0x13, 0x16, 0x6f, 0x76, 0xb4, + 0xd6, 0x5f, 0x67, 0x9f, 0xab, 0x2f, 0xf6, 0x1e, 0xbf, 0xfc, 0x3c, 0x59, + 0x66, 0x4b, 0x08, 0x9b, 0x24, 0x5e, 0x10, 0xdf, 0xfe, 0xef, 0x03, 0x1c, + 0xce, 0x9b, 0x5e, 0x4b, 0x2f, 0x47, 0xdb, 0x2c, 0xa2, 0x3e, 0x7e, 0xa4, + 0xdf, 0xf7, 0x79, 0x9f, 0x4b, 0xc1, 0x61, 0x65, 0xee, 0x44, 0xcb, 0x28, + 0xcf, 0xe8, 0x88, 0x78, 0x79, 0x78, 0x9f, 0xcb, 0x2f, 0x6f, 0x89, 0x2c, + 0xbd, 0xec, 0xe2, 0xcb, 0xfe, 0x23, 0x63, 0xbf, 0x00, 0xfc, 0xb2, 0xa0, + 0xfd, 0x06, 0x3d, 0x83, 0x97, 0xf3, 0xea, 0x44, 0x17, 0x59, 0x71, 0xb5, + 0x65, 0x04, 0xf0, 0xb7, 0x4b, 0x2f, 0x9a, 0x12, 0x1a, 0xcb, 0xdb, 0xdf, + 0xe5, 0x97, 0x9d, 0xc0, 0xa8, 0x88, 0xd7, 0xcc, 0x01, 0xf4, 0xb2, 0x80, + 0x79, 0x66, 0x51, 0x7e, 0x9e, 0xfb, 0xc7, 0xfd, 0x65, 0xf8, 0xdd, 0xb9, + 0xa5, 0x97, 0x80, 0x23, 0x56, 0x5f, 0xff, 0xf4, 0x4d, 0xd8, 0xe6, 0xa3, + 0xa6, 0x03, 0x1c, 0xe6, 0x09, 0xd6, 0x54, 0x22, 0x18, 0x87, 0xaf, 0xfe, + 0x3e, 0x7b, 0x18, 0x61, 0xe7, 0x0f, 0xe5, 0x95, 0xb2, 0x7e, 0x26, 0x45, + 0xa6, 0xa6, 0x90, 0xf8, 0xbb, 0xb0, 0xac, 0xde, 0x43, 0x7f, 0xc3, 0xd3, + 0xfd, 0xec, 0x31, 0x56, 0x5f, 0xfd, 0xce, 0x63, 0x4b, 0x37, 0xce, 0x89, + 0xe9, 0x65, 0xbc, 0x68, 0x86, 0x09, 0xd5, 0xfe, 0xdb, 0x59, 0xde, 0x9f, + 0x56, 0x52, 0xcb, 0xff, 0xbd, 0x9d, 0x28, 0x9a, 0x73, 0x04, 0xeb, 0x2e, + 0x0c, 0x4c, 0x7a, 0x3d, 0x0b, 0xa8, 0x45, 0x9f, 0x21, 0x0b, 0x78, 0xa3, + 0xe5, 0x95, 0x23, 0xc3, 0x19, 0x3d, 0xcf, 0xe5, 0x97, 0xfb, 0x59, 0xcc, + 0x72, 0xd9, 0x65, 0x0c, 0xf2, 0x30, 0x5a, 0xe1, 0xb5, 0x65, 0xf9, 0xf6, + 0x10, 0xc6, 0xb2, 0xff, 0xec, 0x14, 0x31, 0xb7, 0x47, 0x1d, 0xe2, 0xca, + 0xc4, 0x43, 0x38, 0xb9, 0x14, 0xdf, 0xfe, 0x91, 0xb0, 0xc3, 0xf2, 0x0f, + 0x67, 0xea, 0xcb, 0xff, 0xf9, 0xcf, 0xb1, 0xe2, 0xce, 0xf8, 0xfd, 0x86, + 0x2a, 0xca, 0x34, 0x51, 0xf9, 0x2e, 0xff, 0xff, 0xf7, 0x7a, 0x6d, 0xd1, + 0xe7, 0xc4, 0x1e, 0xc7, 0xa7, 0x6f, 0x3e, 0xcd, 0x0b, 0x2f, 0xf6, 0x19, + 0x1e, 0xb5, 0x8b, 0x2f, 0xfb, 0x1c, 0xbf, 0xd0, 0x63, 0xf5, 0x95, 0x09, + 0x83, 0xe1, 0x17, 0xcf, 0x9a, 0x30, 0xbf, 0xff, 0x37, 0x70, 0xdd, 0xe6, + 0xef, 0xb2, 0x5e, 0x3d, 0xeb, 0x2f, 0xef, 0xa5, 0xa0, 0xc7, 0xeb, 0x2f, + 0xdd, 0x8d, 0x47, 0xeb, 0x2f, 0xe6, 0xe6, 0xa5, 0x0d, 0x59, 0x50, 0x8d, + 0xfc, 0x5a, 0x33, 0x07, 0x28, 0xbb, 0x66, 0xa4, 0xb8, 0x51, 0x52, 0x5f, + 0xf9, 0x98, 0x3c, 0x73, 0x7a, 0x36, 0x67, 0xf9, 0xb1, 0x14, 0x62, 0xfb, + 0x7c, 0x76, 0x16, 0x5f, 0xb9, 0x9e, 0x2c, 0x59, 0x52, 0x45, 0x31, 0xae, + 0xf4, 0x8e, 0xfc, 0xed, 0xcf, 0xba, 0xb2, 0xf7, 0x1f, 0x71, 0x65, 0x61, + 0xe3, 0x99, 0x45, 0xed, 0xa3, 0x71, 0x65, 0xff, 0xf7, 0x8d, 0x8e, 0x1e, + 0x17, 0xe3, 0xd3, 0x81, 0x65, 0xfe, 0x8f, 0x64, 0xd2, 0x7d, 0x96, 0x5f, + 0xfc, 0x59, 0xf4, 0xb8, 0x33, 0xdf, 0x03, 0x59, 0x5b, 0x23, 0xa8, 0x64, + 0x01, 0x50, 0xdd, 0x34, 0xbf, 0xcf, 0xf7, 0x1c, 0x83, 0x8b, 0x2f, 0x8f, + 0x4f, 0xfa, 0xca, 0xfc, 0xf5, 0x38, 0x65, 0x7f, 0xbf, 0x8d, 0xef, 0xef, + 0x1a, 0xca, 0x66, 0x7b, 0x1d, 0x23, 0xbf, 0xee, 0x07, 0x5a, 0x38, 0x3d, + 0x2c, 0xac, 0x4d, 0x25, 0xe1, 0xdb, 0xd2, 0x4b, 0x6e, 0x2c, 0xbe, 0x2f, + 0xa6, 0x85, 0x97, 0xfd, 0x19, 0xf4, 0x3c, 0x9e, 0x4b, 0x2f, 0xec, 0xfe, + 0x71, 0x67, 0xeb, 0x2e, 0x68, 0x16, 0x50, 0xcf, 0x1d, 0xcc, 0x2f, 0xfd, + 0x82, 0xce, 0x71, 0x9c, 0xc7, 0x0b, 0x2f, 0x9b, 0xdf, 0xdd, 0x65, 0xf1, + 0x63, 0xee, 0x2c, 0xbf, 0x40, 0xa2, 0x7a, 0x16, 0x53, 0x21, 0x38, 0x58, + 0x14, 0x19, 0x1e, 0x3f, 0x68, 0x85, 0xd0, 0x38, 0x46, 0x21, 0x1d, 0xf8, + 0xb3, 0xcf, 0xd5, 0x97, 0xa7, 0x70, 0x0b, 0x2b, 0x70, 0xf1, 0x7c, 0x4d, + 0x7f, 0x8d, 0xff, 0xd6, 0x83, 0xe5, 0x97, 0xf4, 0x31, 0x84, 0x6c, 0x2c, + 0xbf, 0xb3, 0xbb, 0xbd, 0xcf, 0x2c, 0xac, 0x45, 0xb7, 0x89, 0x48, 0xd3, + 0x85, 0xb7, 0xff, 0xf0, 0x19, 0xe9, 0xc8, 0xfa, 0xcf, 0x51, 0xd2, 0x7f, + 0xd6, 0x5f, 0xfd, 0xd2, 0x8f, 0xdf, 0xbf, 0x88, 0x52, 0x59, 0x7e, 0x19, + 0xcc, 0x70, 0xb2, 0xfd, 0x9d, 0x9f, 0xce, 0xac, 0xbe, 0xf1, 0xea, 0x73, + 0x9e, 0x89, 0x13, 0xd4, 0xf2, 0xd9, 0xc6, 0x4f, 0x70, 0xb2, 0x88, 0xc6, + 0xf6, 0x2d, 0x94, 0x23, 0xc6, 0xdf, 0x92, 0x85, 0x81, 0x0f, 0x2f, 0xa3, + 0x1e, 0x36, 0xa9, 0xa1, 0x4f, 0xa8, 0xf5, 0xfd, 0x18, 0xe3, 0xc6, 0x21, + 0xfb, 0xb1, 0x4a, 0x53, 0xe4, 0x77, 0x3d, 0x8d, 0xbf, 0x79, 0xd8, 0x8b, + 0xdb, 0xb0, 0x97, 0xbc, 0x27, 0xbc, 0xb2, 0xed, 0xdf, 0x2c, 0xbf, 0x68, + 0x0e, 0xe0, 0x54, 0x45, 0xcb, 0xf7, 0x7f, 0x10, 0xa4, 0x92, 0xfd, 0xce, + 0xfa, 0x3f, 0x59, 0x7e, 0x7d, 0xa3, 0x41, 0x59, 0x66, 0x70, 0x8e, 0x7d, + 0x87, 0xb0, 0x69, 0xcd, 0x02, 0x55, 0x3e, 0x53, 0x4c, 0xd5, 0x63, 0x4a, + 0x53, 0x35, 0xff, 0xcd, 0x79, 0x33, 0xcd, 0x01, 0xdc, 0x0a, 0x89, 0x99, + 0x7f, 0xf0, 0xd9, 0x90, 0x5c, 0x41, 0xf8, 0xd8, 0x59, 0x7b, 0xc7, 0xc5, + 0x97, 0xcc, 0x9e, 0x47, 0x56, 0x5f, 0xd1, 0xc2, 0x8e, 0xf1, 0x65, 0x32, + 0xb9, 0xe9, 0x34, 0x9a, 0xa7, 0x94, 0x4b, 0xb2, 0x8d, 0xd7, 0xd8, 0x1d, + 0x6c, 0xb2, 0xe9, 0xf6, 0x42, 0xca, 0x9e, 0xcf, 0x05, 0x95, 0xc8, 0xef, + 0xe6, 0x54, 0xc8, 0x64, 0x32, 0x79, 0x0b, 0x2e, 0x8e, 0x2c, 0xa6, 0x57, + 0x3d, 0x6f, 0x90, 0x2f, 0xff, 0x32, 0x7b, 0x2c, 0xf7, 0x9e, 0x46, 0x64, + 0xb2, 0xf0, 0x0d, 0xab, 0x2f, 0xf9, 0x91, 0xfb, 0x44, 0xd1, 0xed, 0x0b, + 0x2f, 0xa7, 0xbe, 0xb9, 0x2c, 0xbe, 0x9e, 0xa7, 0x87, 0x21, 0x65, 0x82, + 0xb2, 0x99, 0x51, 0xbe, 0x32, 0xdb, 0xa7, 0xd9, 0x0b, 0x2e, 0xc0, 0xac, + 0xbf, 0xfa, 0x1a, 0xfd, 0xcf, 0xbf, 0x68, 0x9e, 0x59, 0x7f, 0xf8, 0x1a, + 0x0e, 0xdf, 0x70, 0xf4, 0x0f, 0x62, 0xcb, 0xe3, 0xde, 0xff, 0xac, 0xa8, + 0x3f, 0x1e, 0xa6, 0xd7, 0x91, 0xb2, 0x50, 0xb8, 0xbe, 0x3d, 0x82, 0x4b, + 0x2f, 0xd9, 0xb6, 0x7f, 0x32, 0xca, 0x9c, 0x79, 0x9d, 0x22, 0xbf, 0xb4, + 0x7b, 0xac, 0x18, 0x16, 0x5f, 0xe9, 0xd8, 0x4f, 0xaf, 0xe7, 0xd6, 0x5c, + 0x52, 0x59, 0x7f, 0xfc, 0xfe, 0xcf, 0xbf, 0xf0, 0xaf, 0xe9, 0xbc, 0x15, + 0x94, 0x67, 0xd4, 0xd1, 0x6b, 0xfb, 0x39, 0x02, 0x14, 0x2c, 0xa1, 0xa3, + 0xbf, 0x21, 0x45, 0xe2, 0x1b, 0x62, 0xcb, 0x9d, 0xab, 0x2b, 0x86, 0x9b, + 0x74, 0x42, 0xed, 0xde, 0xac, 0xb3, 0x2d, 0x65, 0xbf, 0x83, 0x5e, 0x11, + 0xab, 0xf4, 0x63, 0x5f, 0xab, 0x2f, 0xff, 0xf8, 0xa0, 0x05, 0x0d, 0x9d, + 0x1a, 0xd1, 0xef, 0xd3, 0xbf, 0xeb, 0x2f, 0xe3, 0x14, 0xf9, 0x80, 0x59, + 0x46, 0x89, 0x5e, 0x34, 0x5f, 0x1f, 0x62, 0x4b, 0x2f, 0xbb, 0xc7, 0x99, + 0x65, 0x32, 0x17, 0x2e, 0x40, 0x3c, 0x70, 0xef, 0x99, 0xcf, 0x44, 0x9e, + 0x8c, 0x81, 0xd6, 0xbf, 0x53, 0x22, 0x7e, 0xc2, 0xef, 0x79, 0x10, 0x84, + 0x37, 0x9c, 0x80, 0xb2, 0xf7, 0x4a, 0x16, 0x5f, 0x11, 0x67, 0x56, 0x53, + 0x24, 0xdd, 0xc0, 0xdd, 0x70, 0xfe, 0x85, 0x56, 0xbe, 0x7f, 0x1c, 0xcb, + 0x2f, 0x8a, 0x68, 0x1a, 0xcb, 0xbe, 0xea, 0xcb, 0xef, 0x4d, 0x03, 0x59, + 0x58, 0x8a, 0x20, 0x11, 0x99, 0x14, 0xc4, 0x4e, 0x31, 0x7e, 0x86, 0x96, + 0x4c, 0xb2, 0xfe, 0x3c, 0x21, 0xfa, 0x16, 0x59, 0xab, 0x28, 0x67, 0xc6, + 0x02, 0x7d, 0xc2, 0xba, 0x59, 0x7f, 0x6a, 0x08, 0x39, 0xe5, 0x97, 0xda, + 0x8c, 0x25, 0x97, 0xcf, 0xd9, 0x7e, 0xb2, 0xc1, 0x59, 0x7f, 0x8c, 0x0f, + 0x9a, 0xce, 0xac, 0xaf, 0xcf, 0x0b, 0x82, 0x37, 0xf9, 0xf4, 0x71, 0xb8, + 0x6d, 0x59, 0x40, 0x4c, 0x21, 0xa5, 0x9e, 0x20, 0xeb, 0x2e, 0xf2, 0x3b, + 0xfe, 0xd4, 0x64, 0xa3, 0xd1, 0xfa, 0xcb, 0xff, 0xd3, 0xbc, 0xe7, 0xdf, + 0xc2, 0x44, 0xf2, 0x59, 0x7f, 0xc2, 0x37, 0x38, 0xef, 0xf4, 0x96, 0x5e, + 0x9e, 0x2c, 0x86, 0x4a, 0xca, 0xc5, 0x4f, 0x40, 0x32, 0x38, 0xc4, 0xf4, + 0x9a, 0xd3, 0x8f, 0xd2, 0xc8, 0xea, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xf1, + 0x64, 0xe4, 0xf1, 0x9e, 0xd9, 0x5d, 0x95, 0xc0, 0xcb, 0x89, 0xe1, 0x3d, + 0xeb, 0x6d, 0xdc, 0x08, 0xd9, 0x54, 0x4f, 0xfc, 0x27, 0xa7, 0xb8, 0x89, + 0xef, 0x71, 0x94, 0xec, 0xe9, 0xde, 0x9f, 0x59, 0x7f, 0xfe, 0xff, 0xe9, + 0x78, 0x31, 0xa6, 0x7e, 0x30, 0x3e, 0x96, 0x5f, 0xfb, 0xd8, 0x58, 0xc6, + 0x16, 0x0d, 0x65, 0xff, 0xdf, 0x0b, 0x1d, 0x19, 0xee, 0x72, 0x1a, 0xb2, + 0xfb, 0x99, 0xf7, 0x56, 0x5f, 0x87, 0xe8, 0x2d, 0x96, 0x5f, 0x19, 0x77, + 0x8b, 0x2f, 0xff, 0xf9, 0xa7, 0xaf, 0x07, 0x92, 0x8d, 0xfa, 0x82, 0xef, + 0xb2, 0x4b, 0x2a, 0x48, 0x89, 0x32, 0x1b, 0xff, 0x1f, 0x4c, 0x06, 0x3e, + 0xe0, 0x16, 0x54, 0x93, 0xb8, 0xc3, 0xcd, 0x24, 0x91, 0x1f, 0x61, 0x63, + 0xba, 0x45, 0x7f, 0x80, 0x59, 0xef, 0x67, 0xeb, 0x2f, 0x9c, 0x57, 0xdc, + 0x59, 0x4e, 0x7b, 0x04, 0x67, 0x7d, 0xd9, 0xfc, 0xf2, 0xcb, 0xff, 0xfc, + 0xe4, 0x02, 0xc1, 0xf8, 0x33, 0xbd, 0x12, 0xd4, 0x6c, 0xb2, 0xb1, 0x10, + 0xe1, 0x25, 0xbf, 0x84, 0x28, 0xf4, 0x49, 0x65, 0xff, 0xfc, 0xc1, 0x67, + 0xe1, 0xe4, 0xe9, 0x1f, 0xa0, 0x04, 0xeb, 0x29, 0xa8, 0x8a, 0x72, 0xdb, + 0xe1, 0x61, 0xbd, 0x59, 0x7f, 0xb0, 0x58, 0xe9, 0x3f, 0x16, 0x5e, 0x3f, + 0x1a, 0xca, 0x83, 0xf0, 0x32, 0x3e, 0x99, 0x5f, 0xf3, 0xea, 0x53, 0xb0, + 0x03, 0xc5, 0x95, 0x3d, 0xaf, 0x22, 0xc4, 0x66, 0x39, 0x28, 0x4b, 0x50, + 0xb6, 0xf4, 0x29, 0xde, 0x15, 0x85, 0x09, 0x20, 0x96, 0xde, 0x7d, 0xfb, + 0x8b, 0x29, 0x65, 0xff, 0xf7, 0x0e, 0x7f, 0x01, 0xe3, 0x22, 0x0e, 0xb6, + 0x59, 0x5a, 0x3d, 0xde, 0x85, 0xdf, 0xdd, 0xc6, 0xfd, 0x8d, 0x59, 0x58, + 0x7a, 0x06, 0x45, 0x7f, 0x9a, 0xd7, 0x97, 0x0e, 0x4b, 0x2f, 0xf3, 0x13, + 0xa3, 0xef, 0xf5, 0x0b, 0x2b, 0x0f, 0xad, 0xcc, 0xe8, 0xd3, 0x79, 0xf4, + 0x33, 0x8a, 0x11, 0x77, 0xff, 0xd9, 0xbf, 0x07, 0xe8, 0xde, 0xd8, 0x27, + 0x11, 0x65, 0xfc, 0x37, 0x97, 0x0e, 0x4b, 0x2b, 0x47, 0xfe, 0x15, 0x2b, + 0xe0, 0x97, 0x78, 0xb2, 0xfb, 0xd1, 0xa8, 0x59, 0x40, 0x3c, 0x3d, 0x11, + 0x5e, 0x94, 0xf8, 0xab, 0x2e, 0xfc, 0xd6, 0x5f, 0x9b, 0x2f, 0x09, 0xc5, + 0x96, 0xd4, 0xe3, 0xc1, 0x10, 0x5e, 0xfc, 0xe2, 0x96, 0x0d, 0x65, 0x42, + 0x2d, 0x0d, 0x8b, 0x45, 0x77, 0xfe, 0x28, 0x03, 0x0f, 0x9a, 0x3f, 0xd6, + 0x5f, 0xdc, 0xc3, 0xd6, 0x9d, 0x65, 0xfb, 0x93, 0xbf, 0x7e, 0xac, 0xad, + 0x91, 0x2b, 0xf9, 0xf7, 0x4b, 0x2e, 0x8d, 0x2c, 0xbf, 0xfb, 0x6c, 0xe1, + 0xbf, 0x99, 0x8a, 0x28, 0xa9, 0x2c, 0x7f, 0x9f, 0x01, 0x0b, 0x5f, 0xf0, + 0x5f, 0x53, 0xe1, 0xf1, 0xe9, 0x65, 0x42, 0x3d, 0x47, 0x09, 0x2f, 0x13, + 0xdf, 0xdf, 0x67, 0x83, 0xf7, 0xeb, 0x2f, 0xde, 0x8d, 0xbc, 0x15, 0x97, + 0xe3, 0x08, 0x0f, 0x65, 0x95, 0x88, 0x82, 0xe9, 0x8c, 0xf9, 0x4d, 0xff, + 0x16, 0x43, 0x0f, 0xd7, 0x61, 0x65, 0xfe, 0x6e, 0x00, 0x9f, 0x00, 0xb2, + 0xe0, 0xcc, 0xb2, 0xe9, 0x72, 0x0f, 0x27, 0xf3, 0x1b, 0xc0, 0x08, 0x16, + 0x57, 0xc7, 0x96, 0x12, 0xeb, 0xfe, 0xdb, 0x3f, 0x18, 0x5f, 0x52, 0x59, + 0x7f, 0x3b, 0x8f, 0x7e, 0x0d, 0x65, 0xe7, 0x70, 0x2a, 0x2c, 0xf5, 0xfe, + 0x82, 0x63, 0x41, 0x82, 0x59, 0x7f, 0x7e, 0xe5, 0x23, 0x6a, 0xca, 0xd9, + 0x1e, 0x03, 0x3b, 0x01, 0x71, 0x94, 0x7e, 0x65, 0x7f, 0xbd, 0xde, 0x3f, + 0xc2, 0x35, 0x65, 0xfe, 0x89, 0x1f, 0x63, 0xbc, 0x59, 0x7d, 0xf8, 0x9e, + 0x85, 0x95, 0xe3, 0xd6, 0x23, 0x2a, 0x84, 0x56, 0x9c, 0x23, 0x2f, 0xf9, + 0x87, 0x2c, 0xde, 0x59, 0xc5, 0x97, 0xfe, 0x79, 0xd9, 0xbc, 0xb3, 0x98, + 0x4b, 0x2d, 0xa6, 0x0f, 0xe3, 0xc7, 0x37, 0xf8, 0xc7, 0x8d, 0x17, 0x3c, + 0xb2, 0xfd, 0xc1, 0x9c, 0x12, 0xca, 0x83, 0xd9, 0xe9, 0x9d, 0xff, 0xdc, + 0xe9, 0xcc, 0x2b, 0x8e, 0x3e, 0xe2, 0xca, 0x34, 0x75, 0x3c, 0x20, 0x82, + 0x43, 0x78, 0x51, 0x45, 0x49, 0x7f, 0xe7, 0x97, 0x0b, 0x00, 0x3c, 0xd2, + 0x46, 0x66, 0x82, 0xfd, 0xba, 0x16, 0xe0, 0xd6, 0x5f, 0xee, 0xfb, 0x37, + 0xce, 0x93, 0x56, 0x56, 0x1f, 0x18, 0x4a, 0xef, 0xfd, 0xf4, 0x88, 0x3f, + 0xce, 0x03, 0x7f, 0x59, 0x74, 0x30, 0xb2, 0xff, 0x87, 0x05, 0x1f, 0xcb, + 0xc6, 0xb2, 0xa1, 0x12, 0x9b, 0x22, 0x98, 0xbd, 0xfe, 0xf1, 0x8c, 0x9d, + 0xe6, 0x59, 0x7f, 0x87, 0xe0, 0xbf, 0xf3, 0xf8, 0xb2, 0xa0, 0xfa, 0x4c, + 0xca, 0xff, 0x44, 0xee, 0xe7, 0x39, 0x0b, 0x2f, 0xe1, 0x88, 0x30, 0xf7, + 0x8b, 0x2b, 0x47, 0xc8, 0x46, 0x97, 0xf6, 0x72, 0x5e, 0x13, 0x8b, 0x28, + 0xcf, 0x40, 0x88, 0x6f, 0x41, 0x30, 0xb2, 0xa4, 0xcc, 0x54, 0x1c, 0x2e, + 0x31, 0x95, 0x88, 0x6b, 0x02, 0x3b, 0x8f, 0xa1, 0x6c, 0x66, 0x53, 0x43, + 0x33, 0x51, 0x89, 0xb6, 0x1f, 0x1e, 0x8e, 0x23, 0xf5, 0x32, 0x85, 0x97, + 0x21, 0x6b, 0xd8, 0x4c, 0x6f, 0x86, 0xa0, 0x84, 0x17, 0x7f, 0xc5, 0x97, + 0xe2, 0xee, 0x7e, 0xd5, 0x97, 0xda, 0x38, 0xea, 0xcb, 0xfb, 0x85, 0x93, + 0x43, 0x56, 0x57, 0xe7, 0x9d, 0xd2, 0x1a, 0x74, 0x4c, 0x85, 0xda, 0xe8, + 0xea, 0xcb, 0xef, 0xdc, 0x5e, 0xac, 0xbf, 0xce, 0x2f, 0x8e, 0x35, 0x0b, + 0x2f, 0xc7, 0xbe, 0x0b, 0xab, 0x28, 0x69, 0xb3, 0xb1, 0x0b, 0x1f, 0x88, + 0x8c, 0x5b, 0x44, 0x9c, 0x32, 0xbf, 0xf6, 0x8f, 0x92, 0x13, 0xd0, 0x50, + 0xb2, 0xfb, 0x47, 0x0d, 0x59, 0x7f, 0xfe, 0xeb, 0x01, 0x8c, 0x1f, 0xb3, + 0x9f, 0x4a, 0x3c, 0xb2, 0xb4, 0x8b, 0x66, 0x9f, 0x11, 0x0d, 0xf7, 0xe1, + 0xd6, 0xcb, 0x2e, 0x79, 0x2c, 0xbf, 0xff, 0xff, 0x89, 0xc5, 0xee, 0x78, + 0xb3, 0xa1, 0xfd, 0xaf, 0x27, 0x1c, 0x13, 0xe9, 0xe4, 0xb2, 0xff, 0x67, + 0xbc, 0x1e, 0xb9, 0x2c, 0xb8, 0xc6, 0xb2, 0xfe, 0xf0, 0x1f, 0x4f, 0x25, + 0x96, 0x04, 0x8f, 0x0f, 0x05, 0xaf, 0x1c, 0xdc, 0x59, 0x50, 0x78, 0x8d, + 0x27, 0xbf, 0xfb, 0xa7, 0xe7, 0x6c, 0xf8, 0x7c, 0x7a, 0x59, 0x7f, 0x3f, + 0x5b, 0x19, 0xd5, 0x94, 0xe7, 0xe6, 0x14, 0x7b, 0xde, 0x8e, 0x2c, 0xb1, + 0x8d, 0x51, 0x34, 0xc2, 0xda, 0x84, 0x33, 0x61, 0x72, 0x50, 0x94, 0xe9, + 0x0d, 0xf8, 0xfc, 0xed, 0x35, 0x97, 0x9c, 0xbf, 0x59, 0x53, 0x8f, 0x08, + 0x04, 0xd7, 0xb7, 0xe0, 0xd6, 0x5b, 0x5b, 0x1e, 0x14, 0xc4, 0x97, 0xb4, + 0xfe, 0x59, 0x7f, 0xb7, 0x75, 0x9b, 0xa4, 0x11, 0x56, 0x56, 0xc7, 0xac, + 0x28, 0xe5, 0xed, 0xd3, 0x1a, 0xca, 0xc3, 0xc3, 0x72, 0x4a, 0x85, 0xc4, + 0xe3, 0x2f, 0xf4, 0xa4, 0xb7, 0x87, 0x89, 0x43, 0x0e, 0xff, 0xff, 0xfb, + 0xfe, 0x66, 0x13, 0x02, 0x68, 0xa3, 0x3c, 0xcf, 0x85, 0x9b, 0x37, 0x1a, + 0xb2, 0xed, 0x62, 0xcb, 0xb8, 0x6b, 0x2b, 0x63, 0x59, 0xa1, 0x6b, 0xe8, + 0x21, 0x1a, 0xb2, 0xb0, 0xf1, 0x04, 0x22, 0xac, 0x4c, 0x4b, 0xb0, 0xf0, + 0xbb, 0xfe, 0x2c, 0xbe, 0x7f, 0x40, 0x8b, 0x2b, 0x0d, 0xd6, 0xf1, 0x8b, + 0xe8, 0x17, 0x06, 0xb2, 0xff, 0xf8, 0x3f, 0x4b, 0x83, 0xf4, 0x68, 0x6e, + 0xe2, 0xac, 0xac, 0x47, 0xc1, 0xb1, 0x68, 0x88, 0x88, 0xaf, 0x13, 0x4d, + 0x65, 0xf0, 0xb1, 0xf7, 0x16, 0x5e, 0xe8, 0x98, 0xb2, 0xe8, 0xd9, 0x65, + 0x39, 0xb4, 0xe0, 0xed, 0xe1, 0xc4, 0x96, 0x5f, 0xf4, 0x60, 0x3c, 0x7b, + 0xdf, 0x4b, 0x2e, 0xcf, 0x2c, 0xa7, 0x3e, 0xb2, 0x1c, 0x9f, 0x39, 0xbb, + 0x06, 0xb2, 0xee, 0xb2, 0xd6, 0x54, 0x93, 0x99, 0xc3, 0xaf, 0x0d, 0xf1, + 0x63, 0xb0, 0x8b, 0xde, 0x61, 0x3e, 0x2d, 0x7f, 0x66, 0xbf, 0x69, 0xf1, + 0x65, 0xef, 0x04, 0x55, 0x97, 0xee, 0x74, 0xe3, 0xe5, 0x97, 0x04, 0x0b, + 0x2a, 0x46, 0xff, 0xf2, 0x8b, 0xdd, 0xc1, 0x16, 0x5f, 0xcd, 0x0f, 0x3b, + 0x9d, 0x59, 0x7e, 0x7f, 0x7d, 0x2e, 0x2c, 0xa8, 0x3d, 0x70, 0x97, 0x5f, + 0xb3, 0x9f, 0xc4, 0xcb, 0x2f, 0xe8, 0xfb, 0x93, 0xb5, 0x0b, 0x2f, 0x0c, + 0x20, 0x59, 0x7c, 0x32, 0x89, 0x2c, 0xa3, 0x37, 0xce, 0x3b, 0x7f, 0xf8, + 0x49, 0xdf, 0x74, 0xa3, 0x27, 0x67, 0xdd, 0x59, 0x50, 0xa9, 0x20, 0x65, + 0xdf, 0x2e, 0x99, 0x14, 0xce, 0x9a, 0x21, 0x69, 0x4f, 0x9b, 0x82, 0x3f, + 0x7f, 0x8e, 0x67, 0x23, 0xfb, 0x8b, 0x2e, 0xc0, 0x2c, 0xbf, 0xc5, 0xde, + 0x14, 0x77, 0x8b, 0x2f, 0xf7, 0x8b, 0x0f, 0xf8, 0xfd, 0x65, 0xf8, 0xf7, + 0xe1, 0x71, 0x65, 0x62, 0x23, 0x4c, 0xcb, 0x46, 0x77, 0xf7, 0xdd, 0xcf, + 0x07, 0x71, 0x65, 0xfd, 0xac, 0xf7, 0x83, 0xd5, 0x97, 0xef, 0x14, 0x66, + 0x94, 0x5f, 0xd9, 0xad, 0x82, 0xe3, 0x54, 0x41, 0xa6, 0x66, 0x9a, 0xda, + 0xd9, 0x14, 0x32, 0x54, 0xbe, 0x2f, 0x67, 0xcb, 0x2a, 0x13, 0x1f, 0x38, + 0x69, 0xb9, 0x55, 0xf9, 0xc0, 0x6d, 0x85, 0x97, 0xf4, 0xbc, 0x4f, 0xf7, + 0x56, 0x50, 0x0f, 0x50, 0x89, 0xaf, 0x84, 0x27, 0xd9, 0x65, 0x61, 0xe2, + 0x70, 0x86, 0xfd, 0x1d, 0x9c, 0xd1, 0x56, 0x5e, 0x6c, 0x01, 0x65, 0xf1, + 0x7e, 0x1e, 0x2c, 0xb1, 0xe1, 0xbf, 0xd0, 0xe5, 0xff, 0x0f, 0x9c, 0xcd, + 0x0f, 0xd8, 0xb2, 0xff, 0xb8, 0xe5, 0x13, 0x18, 0xf6, 0x59, 0x7f, 0xa4, + 0x6d, 0x8f, 0x08, 0x35, 0x97, 0xff, 0xa3, 0x0b, 0xee, 0xe6, 0x8f, 0x67, + 0x6a, 0xcb, 0xb3, 0xd3, 0x91, 0x6d, 0xc3, 0x9e, 0x9a, 0x5d, 0x9c, 0x59, + 0x61, 0x7a, 0x7a, 0x73, 0xe7, 0xb5, 0x09, 0xb7, 0x3c, 0x68, 0x55, 0x39, + 0x74, 0xd2, 0x79, 0x33, 0x88, 0x51, 0xca, 0x34, 0xdc, 0x86, 0x5e, 0x88, + 0x7c, 0xd4, 0x51, 0xc9, 0xdd, 0x92, 0x59, 0x7f, 0xfe, 0x30, 0x18, 0xfb, + 0x20, 0x97, 0x79, 0xe7, 0x92, 0xca, 0xe1, 0xf5, 0xf4, 0x5a, 0xec, 0x11, + 0x65, 0xf7, 0xfe, 0x81, 0xac, 0xbf, 0xbc, 0x62, 0x94, 0x0d, 0x65, 0xff, + 0x47, 0xed, 0x8c, 0x2e, 0xf1, 0x65, 0xff, 0x73, 0x05, 0xf3, 0xb4, 0xf8, + 0xb2, 0xfd, 0x9a, 0xd8, 0x3c, 0x59, 0x46, 0x8e, 0xa9, 0x88, 0xfc, 0x5b, + 0xc3, 0x8d, 0xe7, 0x37, 0xe3, 0xfa, 0x46, 0x4b, 0x2f, 0x1f, 0xb1, 0x65, + 0xfd, 0xd7, 0x6b, 0x61, 0xab, 0x2b, 0x0f, 0xbc, 0x04, 0xff, 0x0d, 0xd2, + 0xcb, 0x43, 0x4d, 0xd0, 0xa5, 0xf7, 0xb8, 0x12, 0x59, 0x7f, 0xe0, 0xb0, + 0xd0, 0xf7, 0xd0, 0x16, 0x5a, 0xca, 0xf8, 0xf8, 0x48, 0x72, 0xf9, 0xb1, + 0xa6, 0x16, 0x5f, 0x67, 0xff, 0xba, 0xca, 0xc3, 0xc6, 0x22, 0x3a, 0xd9, + 0x11, 0x02, 0xb4, 0x5f, 0x0f, 0x9e, 0x85, 0x97, 0xe2, 0xd0, 0xaf, 0xb2, + 0xca, 0x83, 0xf0, 0xc2, 0x57, 0x22, 0xbf, 0x67, 0x78, 0x6d, 0x59, 0x70, + 0x49, 0x65, 0xe2, 0xcd, 0x96, 0x54, 0x2e, 0x0e, 0xc8, 0x8b, 0x23, 0x01, + 0x38, 0x7a, 0xea, 0x38, 0x02, 0x2c, 0xe1, 0x38, 0x82, 0xd7, 0x7a, 0x4b, + 0x2f, 0x7b, 0x09, 0x65, 0xfe, 0xc2, 0xcf, 0xbb, 0x26, 0xac, 0xbb, 0xb0, + 0xb2, 0xa0, 0xf2, 0x5c, 0xce, 0xff, 0x9e, 0x43, 0x30, 0xb2, 0xcf, 0x4b, + 0x2f, 0xd8, 0x45, 0x03, 0x59, 0x7d, 0xe7, 0xf4, 0x2c, 0xbf, 0xa3, 0x66, + 0xbc, 0xd0, 0xb2, 0xda, 0x59, 0x52, 0x3e, 0x09, 0x88, 0x42, 0x5d, 0x7f, + 0xfc, 0xec, 0x76, 0x35, 0xfe, 0xa3, 0xa4, 0xff, 0xac, 0xbf, 0xd0, 0x01, + 0xf8, 0x2f, 0xc5, 0x97, 0xc0, 0x13, 0xbc, 0x59, 0x7f, 0x16, 0x7f, 0x85, + 0x25, 0x97, 0xff, 0xcc, 0x4e, 0x10, 0x9f, 0xbc, 0x3f, 0xbc, 0x62, 0xac, + 0xac, 0x44, 0x0b, 0x96, 0x51, 0xa3, 0x18, 0xa1, 0x4b, 0x50, 0xab, 0xf3, + 0x05, 0xf4, 0xc8, 0xd2, 0x0f, 0x1e, 0x3c, 0x21, 0x48, 0xc3, 0x8a, 0x21, + 0x87, 0xcd, 0xdc, 0xde, 0xb2, 0xe3, 0xea, 0xcb, 0xe3, 0x27, 0x1a, 0xcb, + 0xff, 0x37, 0x3b, 0xc1, 0x38, 0xf2, 0xc5, 0x97, 0xee, 0x46, 0xbb, 0x0b, + 0x19, 0x9b, 0xfa, 0x1a, 0x26, 0x38, 0xbf, 0x71, 0xb2, 0xd6, 0x5f, 0x0b, + 0x92, 0x35, 0x97, 0xb0, 0xd8, 0x59, 0x7d, 0x33, 0xbe, 0x96, 0x53, 0x9f, + 0x01, 0x11, 0x08, 0x39, 0x7b, 0x0f, 0x7a, 0xcb, 0xd2, 0x11, 0xab, 0x2b, + 0xc6, 0xed, 0xc7, 0x6f, 0xee, 0x1e, 0xb0, 0x3a, 0x59, 0x7f, 0xff, 0x4d, + 0x38, 0xc0, 0x1d, 0x70, 0x33, 0x9a, 0x7d, 0xf1, 0xac, 0xba, 0x18, 0x59, + 0x50, 0x7f, 0x06, 0xc3, 0x58, 0xaa, 0xc9, 0x81, 0x93, 0x85, 0x74, 0xc4, + 0x6d, 0x7a, 0xf3, 0x4f, 0x48, 0x37, 0x61, 0x4b, 0x73, 0x59, 0x2a, 0x8b, + 0xf1, 0x7e, 0xdb, 0xe9, 0x40, 0xd6, 0x5f, 0xb0, 0x8f, 0xe9, 0x2c, 0xbd, + 0xac, 0xc5, 0x94, 0xc8, 0x3e, 0xc3, 0x2a, 0xe1, 0x3d, 0xff, 0xd2, 0xe8, + 0x65, 0x26, 0xf7, 0xb0, 0xd5, 0x97, 0xfb, 0xbc, 0x8d, 0xb3, 0x83, 0x59, + 0x77, 0xb1, 0x65, 0xff, 0xf7, 0xa0, 0x78, 0x09, 0xd8, 0x58, 0x3f, 0x42, + 0xcb, 0xfe, 0xd4, 0x78, 0xf7, 0xea, 0x24, 0xb2, 0xff, 0xe3, 0xc2, 0xcc, + 0xe4, 0xe9, 0x71, 0xab, 0x2f, 0xfc, 0xf1, 0xf4, 0xa7, 0x73, 0xe1, 0xc2, + 0xca, 0x1a, 0x7a, 0x3f, 0x19, 0x1a, 0x36, 0xe1, 0xa4, 0xc2, 0xda, 0x4f, + 0xe1, 0xd7, 0x51, 0x2f, 0x31, 0x1a, 0x59, 0x7f, 0x78, 0xda, 0xef, 0xba, + 0xb2, 0xf6, 0x8f, 0x65, 0x97, 0xf0, 0xe3, 0xfd, 0x67, 0xcb, 0x2d, 0x3e, + 0xb2, 0x99, 0xa2, 0xb0, 0x03, 0xba, 0x2f, 0x68, 0xeb, 0x2c, 0xbe, 0xff, + 0x8d, 0x88, 0xd1, 0x61, 0xb0, 0xb2, 0xe0, 0x6c, 0xb2, 0xff, 0x43, 0x70, + 0xf5, 0x34, 0x96, 0x5c, 0x73, 0x2c, 0xbf, 0xda, 0x86, 0x06, 0x51, 0xf2, + 0xcb, 0xe8, 0x2c, 0x61, 0x65, 0xee, 0x43, 0x0b, 0x2f, 0xfe, 0x08, 0xf3, + 0x51, 0x23, 0x1c, 0x12, 0xcb, 0xfe, 0x27, 0xda, 0x35, 0xa7, 0x92, 0xca, + 0x91, 0xfd, 0x79, 0x0a, 0xff, 0xfb, 0x4f, 0xc2, 0xcd, 0x84, 0x90, 0x60, + 0xc9, 0x65, 0x41, 0xf8, 0x84, 0x8a, 0xbe, 0x4c, 0xa7, 0xb1, 0x84, 0x5e, + 0xe9, 0xec, 0xb2, 0xfd, 0xfb, 0xfd, 0x13, 0x2c, 0xbc, 0x50, 0x05, 0x97, + 0xff, 0x0c, 0xe6, 0xf4, 0x6b, 0xe9, 0x46, 0x96, 0x5f, 0x67, 0x60, 0x6b, + 0x2f, 0xff, 0x19, 0x3f, 0xdc, 0xe6, 0x68, 0x7e, 0xc5, 0x95, 0x39, 0x56, + 0x94, 0x85, 0xc0, 0x68, 0x71, 0xa5, 0x34, 0xad, 0xc7, 0x48, 0xab, 0x83, + 0x62, 0xa3, 0x6e, 0x90, 0xda, 0x16, 0x52, 0xcb, 0xd9, 0x9f, 0xac, 0xbd, + 0xe3, 0xea, 0xcb, 0x6f, 0xc3, 0xd3, 0x31, 0x02, 0x0b, 0x10, 0x72, 0xfe, + 0xcd, 0x6c, 0x17, 0x1a, 0xcb, 0xd1, 0xbb, 0xc5, 0x94, 0xc1, 0xe6, 0x80, + 0xba, 0xfd, 0xad, 0x66, 0xe4, 0xcb, 0x2e, 0x17, 0x8b, 0x2a, 0x19, 0x31, + 0x63, 0x84, 0x06, 0x4a, 0x65, 0x38, 0xc8, 0xb7, 0x14, 0x1a, 0x71, 0xe1, + 0x87, 0x96, 0x0b, 0xfc, 0x3a, 0x43, 0x08, 0xfd, 0xe4, 0x62, 0x16, 0x5e, + 0x6b, 0x88, 0xb2, 0xff, 0xb0, 0xa4, 0x58, 0xd8, 0x02, 0xcb, 0xf7, 0x8f, + 0x7e, 0x0d, 0x65, 0xff, 0x87, 0x05, 0x84, 0x19, 0x67, 0x16, 0x5d, 0x3b, + 0xe5, 0x97, 0xe7, 0x69, 0xee, 0xe2, 0xcb, 0xfb, 0x3c, 0xfd, 0x79, 0x96, + 0x5d, 0x1f, 0x2c, 0xaf, 0x8f, 0x13, 0xa5, 0xb5, 0x88, 0x90, 0x76, 0xdb, + 0xfe, 0xc0, 0x96, 0x74, 0x9d, 0xab, 0x2e, 0x39, 0x96, 0x5d, 0x8c, 0x2c, + 0xa8, 0x35, 0xde, 0x17, 0xbb, 0x58, 0xb2, 0xf1, 0x32, 0x37, 0x56, 0x5f, + 0x1e, 0xa2, 0x4b, 0x2f, 0xb6, 0x6c, 0x71, 0x65, 0x6c, 0x78, 0x98, 0x43, + 0x7f, 0xe8, 0xeb, 0x87, 0xaf, 0xf6, 0x75, 0x65, 0xff, 0x6a, 0x74, 0x0f, + 0xd8, 0x08, 0x59, 0x5e, 0x3f, 0x87, 0x3e, 0xbf, 0x01, 0xe0, 0xe7, 0xd6, + 0x5e, 0x2c, 0xe2, 0xcb, 0xff, 0xff, 0x47, 0x8d, 0xac, 0xe6, 0x93, 0xe8, + 0x4f, 0x1f, 0xdc, 0x01, 0xec, 0xb2, 0xb6, 0x57, 0xea, 0x31, 0xd6, 0x0d, + 0x8c, 0xa7, 0x70, 0xf2, 0x68, 0x55, 0x68, 0x87, 0xcc, 0x9f, 0x90, 0x10, + 0xb7, 0x19, 0xfb, 0x09, 0xa0, 0x90, 0x88, 0x53, 0xba, 0x37, 0x6e, 0x2c, + 0xbf, 0xc0, 0xfd, 0xff, 0x32, 0x02, 0xcb, 0x1f, 0x8f, 0x14, 0x84, 0x6f, + 0xf6, 0xc3, 0xce, 0xf1, 0xfe, 0x59, 0x7d, 0x39, 0xe5, 0x3d, 0x2c, 0xbf, + 0x3c, 0xb8, 0x36, 0xac, 0xbf, 0xfb, 0x37, 0xe0, 0xf0, 0x83, 0x2c, 0xe2, + 0xcb, 0xf6, 0xa3, 0xc2, 0x0d, 0x65, 0x68, 0xfb, 0x5d, 0x12, 0xfa, 0x0f, + 0x68, 0x59, 0x7c, 0x2b, 0xe7, 0x16, 0x5f, 0xc3, 0x8f, 0xcb, 0x3e, 0x59, + 0x7f, 0xd2, 0x6b, 0xcb, 0xbc, 0x86, 0x16, 0x54, 0x22, 0x2b, 0x08, 0x9c, + 0xba, 0xf7, 0x0c, 0x96, 0x5f, 0x88, 0x13, 0xb9, 0xf2, 0xcb, 0xfc, 0x24, + 0xa3, 0x79, 0x97, 0xeb, 0x2f, 0x9f, 0x77, 0x09, 0x65, 0x62, 0x27, 0xdc, + 0x6c, 0x8a, 0xf8, 0x6d, 0x58, 0xab, 0xac, 0x04, 0xdb, 0x86, 0xad, 0x29, + 0x78, 0x4a, 0xfe, 0x42, 0x50, 0xab, 0x0c, 0x33, 0x2e, 0xda, 0x4b, 0x2f, + 0x1f, 0x8d, 0x65, 0x7c, 0x6c, 0xfa, 0x31, 0x7d, 0x9f, 0x4a, 0x16, 0x5e, + 0x0b, 0xf1, 0x65, 0x78, 0xdf, 0x08, 0x45, 0x7f, 0xc6, 0xc4, 0x0e, 0x37, + 0xe7, 0x96, 0x5f, 0xe3, 0x17, 0xe9, 0x73, 0x00, 0xb2, 0xfe, 0x90, 0x9f, + 0xff, 0x1f, 0x2c, 0xaf, 0x1f, 0x3b, 0x9a, 0xdf, 0xc1, 0xe4, 0x4c, 0x1d, + 0x2c, 0xbc, 0x1c, 0xf9, 0x65, 0x78, 0xf3, 0x3a, 0x5f, 0x7f, 0x63, 0x75, + 0xa8, 0x1a, 0xcb, 0xf7, 0xdc, 0xe9, 0xec, 0xb2, 0xfe, 0x09, 0x6d, 0xc3, + 0xf9, 0x65, 0xff, 0xd1, 0xb0, 0xaf, 0xf7, 0x30, 0x67, 0xc5, 0x95, 0x08, + 0x9f, 0x91, 0x51, 0x17, 0xdf, 0x7f, 0xfe, 0x7c, 0xb2, 0xff, 0x06, 0x36, + 0x2c, 0x3d, 0x96, 0x5f, 0xff, 0xa3, 0x5f, 0xe7, 0x08, 0x2f, 0x2f, 0x05, + 0xf6, 0x59, 0x7e, 0xee, 0x39, 0x01, 0x65, 0x78, 0xff, 0x37, 0x55, 0xaf, + 0xff, 0x0f, 0xd1, 0xf4, 0x8b, 0x1b, 0x9f, 0x75, 0x65, 0xf9, 0xb9, 0xec, + 0x25, 0x94, 0x67, 0xe2, 0xe9, 0x77, 0xfc, 0x17, 0x90, 0xf3, 0x3f, 0xe2, + 0xcb, 0xf3, 0x73, 0x4e, 0x4b, 0x2f, 0xfd, 0xf4, 0xbd, 0x0d, 0x7f, 0xa5, + 0x8b, 0x2f, 0xe3, 0xfb, 0xe9, 0x67, 0x56, 0x54, 0x22, 0x57, 0x09, 0xbf, + 0x40, 0xaf, 0x23, 0xf7, 0x90, 0xce, 0xbf, 0x7d, 0xc6, 0x9e, 0xe2, 0xcb, + 0xff, 0xbc, 0xe7, 0xdf, 0xc2, 0x44, 0xf2, 0x59, 0x7d, 0x04, 0x16, 0x5a, + 0xcb, 0xb3, 0x93, 0x8f, 0xa3, 0xc8, 0x75, 0x08, 0xc3, 0x28, 0x4a, 0x5f, + 0xcf, 0xb7, 0xee, 0x43, 0x59, 0x5b, 0x2e, 0xf8, 0x0e, 0x14, 0x20, 0x6d, + 0x32, 0x29, 0xa1, 0x99, 0xa2, 0xe6, 0x92, 0xfa, 0x15, 0xfc, 0x84, 0xb7, + 0x63, 0x1d, 0xdf, 0x0e, 0xb9, 0xf2, 0x6b, 0xfa, 0x3f, 0xc9, 0x8d, 0xab, + 0x2f, 0x77, 0x09, 0x65, 0xef, 0x3e, 0xe2, 0xcb, 0xfc, 0x24, 0x02, 0x7f, + 0x35, 0x0b, 0x2f, 0xf8, 0x78, 0x1d, 0x6c, 0x03, 0xd9, 0x65, 0xff, 0xf6, + 0x6f, 0xc2, 0x19, 0x38, 0xbc, 0xe4, 0x7e, 0xb2, 0xf8, 0xf5, 0x0d, 0x59, + 0x5a, 0x3f, 0x2f, 0x28, 0xdf, 0xff, 0x03, 0xc1, 0x2c, 0xfa, 0x47, 0xc2, + 0xcd, 0xeb, 0x2f, 0xde, 0x8f, 0x1b, 0x0b, 0x2e, 0x79, 0xb8, 0x7f, 0x3b, + 0xaa, 0x35, 0x08, 0xcc, 0xf4, 0x26, 0xea, 0x4a, 0x84, 0x18, 0x1b, 0xf0, + 0xfb, 0x9b, 0x76, 0x37, 0x9a, 0x86, 0x4b, 0x7e, 0x4f, 0x09, 0x1c, 0x33, + 0x5e, 0x51, 0xf5, 0xd3, 0x05, 0x65, 0x9a, 0xb2, 0xbe, 0x35, 0x2c, 0xb1, + 0x8b, 0xfd, 0xdf, 0xc2, 0x5c, 0x31, 0xac, 0xbf, 0x4b, 0xfc, 0xc1, 0xac, + 0xb6, 0xf3, 0x3d, 0xc7, 0x34, 0xbf, 0x78, 0xf5, 0xf8, 0x56, 0x5d, 0x1a, + 0xc3, 0xd1, 0x98, 0xa2, 0xff, 0xf4, 0xc5, 0x1d, 0xe7, 0x7e, 0x01, 0x96, + 0xcb, 0x2f, 0xc6, 0xd1, 0x26, 0xe2, 0xcb, 0xf9, 0xfe, 0x91, 0x40, 0xd6, + 0x5f, 0xf4, 0x7d, 0x23, 0x26, 0xbf, 0x56, 0x51, 0xa3, 0x6f, 0xc9, 0x8e, + 0x54, 0x45, 0xb7, 0xe7, 0x96, 0x6d, 0x0b, 0x2f, 0xfe, 0x8e, 0x73, 0x1b, + 0xd2, 0x86, 0xf1, 0x65, 0xfc, 0xc4, 0xec, 0x6c, 0x01, 0x65, 0xff, 0xd1, + 0xf4, 0xba, 0x18, 0xd8, 0xfe, 0xea, 0xcb, 0xfc, 0x7e, 0x70, 0x41, 0x0d, + 0x65, 0x1a, 0x2a, 0x08, 0xc3, 0x88, 0xf7, 0xf4, 0x03, 0xf6, 0x87, 0xf5, + 0x97, 0xec, 0xde, 0x64, 0x35, 0x97, 0xf8, 0x7c, 0x3f, 0x7b, 0x06, 0xb2, + 0xff, 0xe3, 0x8e, 0x13, 0xca, 0x77, 0x33, 0x4b, 0x2f, 0x13, 0xe9, 0x65, + 0xf3, 0xbb, 0xee, 0xac, 0xbf, 0xff, 0xb0, 0x73, 0x8f, 0xf8, 0x9d, 0xdf, + 0x67, 0x7c, 0xf2, 0x59, 0x7f, 0xf8, 0xf9, 0xb6, 0x0b, 0x84, 0x1d, 0xd8, + 0x67, 0x88, 0x9d, 0x68, 0xde, 0xf2, 0x3b, 0xfd, 0xf4, 0xb9, 0x34, 0xa3, + 0x65, 0x94, 0x35, 0x6b, 0x00, 0x27, 0xd4, 0x3a, 0xda, 0x5d, 0xe3, 0x07, + 0x28, 0x23, 0x3e, 0xc3, 0x84, 0x2e, 0xb7, 0xff, 0xf7, 0x73, 0xee, 0xeb, + 0x51, 0xdf, 0xc4, 0x29, 0x7b, 0x16, 0x5c, 0x7b, 0xd6, 0x5f, 0x41, 0x4b, + 0x8b, 0x2c, 0x7f, 0x22, 0x5e, 0x65, 0xef, 0xc6, 0x2f, 0xf6, 0xb6, 0x28, + 0x01, 0xc9, 0x65, 0x78, 0xfa, 0xdc, 0xe2, 0xfd, 0xe8, 0xde, 0x38, 0x59, + 0x78, 0x6e, 0x4b, 0x2d, 0xbd, 0x65, 0xfb, 0xee, 0x94, 0x79, 0x65, 0xb5, + 0x06, 0xed, 0xc4, 0xef, 0xbe, 0x9a, 0x34, 0xb2, 0xda, 0x59, 0x58, 0x6d, + 0x42, 0x49, 0x52, 0x47, 0xc8, 0xca, 0x74, 0xad, 0xc5, 0xab, 0xfc, 0x5d, + 0xd1, 0xef, 0xc1, 0xac, 0xbf, 0x6a, 0x4f, 0xf0, 0xab, 0x2a, 0x0f, 0x78, + 0xcd, 0x2f, 0xf0, 0x7e, 0x97, 0x78, 0x1d, 0xc5, 0x97, 0xf3, 0x8b, 0xfc, + 0x7b, 0x8b, 0x2a, 0x48, 0x88, 0xf1, 0x01, 0x1c, 0xdf, 0xce, 0xfd, 0x1f, + 0x86, 0xb2, 0xff, 0x7d, 0xa8, 0x39, 0x3f, 0x16, 0x5f, 0xf7, 0x78, 0x19, + 0x08, 0x33, 0xea, 0xca, 0x83, 0xee, 0x73, 0x3b, 0xf7, 0xa3, 0x24, 0xeb, + 0x2f, 0x61, 0xf1, 0x65, 0xfb, 0xbd, 0xc0, 0xec, 0xb2, 0xff, 0xfb, 0x67, + 0xf6, 0x0e, 0x76, 0x11, 0x61, 0xfe, 0xb2, 0xb6, 0x44, 0xa0, 0x06, 0xf4, + 0x53, 0x7f, 0xde, 0x01, 0xbc, 0xee, 0x3f, 0x96, 0x50, 0xd3, 0x25, 0xc8, + 0x5d, 0x39, 0x8d, 0xf1, 0x44, 0x8d, 0x65, 0xf9, 0xcb, 0xe9, 0x1a, 0xcb, + 0xc1, 0x82, 0x59, 0x7f, 0xff, 0x8f, 0xb0, 0x4f, 0x2c, 0x1f, 0x1f, 0x47, + 0xe3, 0xde, 0xb2, 0xb4, 0x8c, 0x1f, 0x10, 0x11, 0x3e, 0xf1, 0xbb, 0xff, + 0xf7, 0x0a, 0x77, 0x9c, 0xfb, 0xf8, 0x48, 0x9e, 0x4b, 0x2f, 0xff, 0xfe, + 0x8d, 0x64, 0xd0, 0xdc, 0x01, 0x8f, 0xd1, 0xde, 0x31, 0xac, 0xdd, 0x59, + 0x7f, 0xbc, 0x6c, 0x4f, 0x87, 0x4c, 0x2c, 0xbf, 0xe6, 0xc1, 0x01, 0xcb, + 0xf6, 0x4a, 0xcb, 0xfc, 0x6d, 0xd6, 0x4f, 0x9f, 0xeb, 0x2f, 0xfa, 0x3f, + 0xd6, 0xa0, 0x51, 0xfc, 0xb2, 0xff, 0x0a, 0xdf, 0x41, 0x96, 0xcb, 0x2f, + 0xff, 0x3c, 0x8f, 0x59, 0xf4, 0xd2, 0x8d, 0x6c, 0xb2, 0xa1, 0x10, 0x1f, + 0x9a, 0x5f, 0xff, 0x16, 0x73, 0x1b, 0x00, 0xce, 0x9e, 0xb1, 0x65, 0x01, + 0x3d, 0x66, 0x9c, 0xf8, 0xf3, 0xf3, 0x6e, 0xc2, 0xf3, 0x79, 0x1d, 0xff, + 0xa6, 0xe7, 0x43, 0xf6, 0x0d, 0xc9, 0x65, 0x42, 0xae, 0xbc, 0x94, 0x96, + 0xec, 0x17, 0xf6, 0xd9, 0xa3, 0x04, 0x2c, 0xbe, 0x21, 0xc3, 0x56, 0x5f, + 0xff, 0x04, 0xbb, 0xcf, 0x1c, 0xc5, 0x0d, 0x79, 0x2c, 0xbe, 0xc2, 0x0b, + 0xac, 0xa6, 0x9f, 0x7e, 0xf4, 0xfb, 0xf9, 0xff, 0xc1, 0xbc, 0x96, 0x54, + 0x23, 0x87, 0x21, 0x20, 0x64, 0x97, 0xdf, 0xf1, 0x94, 0x64, 0xac, 0xa3, + 0x4d, 0xb7, 0xd1, 0x87, 0x39, 0x95, 0xf8, 0xfc, 0x01, 0x24, 0xb2, 0xa1, + 0xb1, 0xb8, 0xda, 0x1a, 0x63, 0x8c, 0x23, 0x25, 0xc9, 0x02, 0x38, 0xa3, + 0x8c, 0x6a, 0x68, 0xc8, 0xf4, 0x5e, 0xd8, 0x4d, 0xfa, 0x34, 0x57, 0x87, + 0xaf, 0xe7, 0xc5, 0x2d, 0x07, 0xb1, 0xd1, 0x84, 0xd6, 0xff, 0xec, 0x2f, + 0xf3, 0x35, 0xce, 0xc6, 0x2c, 0xbf, 0xef, 0xbb, 0x9a, 0x3d, 0x9d, 0xab, + 0x2f, 0x66, 0xfc, 0x59, 0x6c, 0xfd, 0x13, 0x24, 0x85, 0xc3, 0xab, 0xcc, + 0xb9, 0x1a, 0xcb, 0xe8, 0x27, 0x92, 0xcb, 0xf6, 0x6e, 0x39, 0x7f, 0x38, + 0xf0, 0x34, 0x41, 0x7f, 0x6f, 0xf1, 0xc6, 0xb8, 0xb2, 0xff, 0xfd, 0x2e, + 0x16, 0x77, 0x87, 0x8d, 0xee, 0xb0, 0x55, 0x97, 0xfe, 0xf1, 0xb4, 0x79, + 0x34, 0x66, 0x96, 0x5e, 0x94, 0x7c, 0xb2, 0xfc, 0x12, 0x0c, 0x7c, 0xb2, + 0xfa, 0x3f, 0x76, 0xac, 0xb4, 0xb1, 0x14, 0xb3, 0x1f, 0x34, 0x74, 0x8a, + 0x2b, 0xe4, 0xcf, 0x0a, 0x1f, 0x57, 0xdc, 0x3e, 0xc2, 0xca, 0x83, 0xca, + 0x72, 0x9b, 0xf1, 0x67, 0xe1, 0xe2, 0xcb, 0xfd, 0x38, 0x9f, 0x62, 0x8f, + 0x96, 0x5c, 0x03, 0xc3, 0xdd, 0xd1, 0x45, 0xf0, 0x3c, 0x73, 0x2c, 0xbf, + 0xff, 0x16, 0x30, 0xc1, 0x8f, 0xc7, 0x37, 0x8f, 0xee, 0xac, 0xa8, 0x3f, + 0xbc, 0x23, 0xb8, 0x3a, 0x59, 0x78, 0x0f, 0xa5, 0x97, 0xfe, 0xdb, 0x09, + 0xb9, 0xde, 0x09, 0xc5, 0x97, 0xee, 0x02, 0x34, 0xc2, 0xcb, 0xf8, 0xff, + 0xfa, 0x59, 0xd5, 0x95, 0xb2, 0x32, 0xfc, 0x2e, 0xe3, 0x9f, 0xa0, 0x6f, + 0x29, 0xbe, 0x97, 0x73, 0xf5, 0x97, 0xb8, 0x73, 0x2c, 0xaf, 0x8f, 0x03, + 0x84, 0x77, 0xdd, 0xf0, 0x40, 0xb2, 0xfd, 0x86, 0x3f, 0x1a, 0xca, 0xd8, + 0xf2, 0x64, 0x47, 0x79, 0xf4, 0xc2, 0xca, 0x84, 0x56, 0x63, 0x63, 0x91, + 0xdf, 0xfd, 0x9f, 0x77, 0x86, 0x51, 0xfb, 0xb5, 0x65, 0xe9, 0x37, 0xcb, + 0x2b, 0x63, 0xe1, 0xea, 0x25, 0xff, 0xff, 0xa7, 0xf3, 0xbe, 0x71, 0xb3, + 0x2c, 0xde, 0x59, 0xce, 0x1f, 0xdd, 0x59, 0x7f, 0x7d, 0xcc, 0x6c, 0x6e, + 0x2c, 0xbc, 0xc1, 0x8a, 0xb2, 0xfc, 0x29, 0xe1, 0x30, 0xb2, 0x8c, 0xf1, + 0x82, 0x3d, 0x58, 0x99, 0x69, 0x91, 0xbb, 0x91, 0x3b, 0xdf, 0xce, 0x0f, + 0x3e, 0xef, 0x16, 0x5b, 0x16, 0x5f, 0x9e, 0x6f, 0x1e, 0x96, 0x54, 0xe3, + 0x71, 0xe1, 0x0b, 0xee, 0x14, 0x35, 0x65, 0x41, 0xe2, 0x7c, 0x47, 0x7b, + 0xd2, 0x6a, 0xcb, 0xbc, 0x6b, 0x2b, 0x0d, 0x9f, 0x47, 0x6a, 0x19, 0x19, + 0x72, 0x75, 0xc4, 0x36, 0x23, 0xb5, 0xf9, 0xf7, 0xd0, 0xa7, 0x78, 0x75, + 0x94, 0x67, 0x3c, 0x8e, 0xef, 0xa7, 0x41, 0x85, 0x64, 0xfa, 0xad, 0xfe, + 0x89, 0x8f, 0xee, 0x05, 0xab, 0x2e, 0x68, 0x16, 0x56, 0xc7, 0x98, 0x33, + 0x5b, 0xf8, 0x62, 0x0c, 0xb3, 0xcb, 0x2f, 0xd9, 0xc0, 0xeb, 0x65, 0x95, + 0x87, 0xae, 0x45, 0xd7, 0x4b, 0xab, 0x2f, 0xe0, 0x0c, 0xf7, 0xc0, 0xd6, + 0x5b, 0xcb, 0x2d, 0xfa, 0xcb, 0xb9, 0x25, 0x94, 0x34, 0x40, 0x38, 0xbf, + 0xe5, 0xfc, 0x11, 0x08, 0x95, 0xfd, 0xb4, 0xd2, 0x9e, 0xf5, 0xb2, 0xcb, + 0xcf, 0x9a, 0x59, 0x78, 0xb3, 0xab, 0x2f, 0x7b, 0x1a, 0xb2, 0xbc, 0x7a, + 0x44, 0x37, 0xd1, 0xbb, 0xba, 0x4b, 0x2f, 0x47, 0xdc, 0x59, 0x7c, 0x65, + 0x2c, 0x59, 0x7b, 0x67, 0x25, 0x94, 0x33, 0xd9, 0x68, 0xef, 0x48, 0x2f, + 0xa0, 0x6f, 0x25, 0x97, 0xec, 0xef, 0x8f, 0xab, 0x2f, 0xcf, 0xf6, 0x7d, + 0xd5, 0x95, 0xe3, 0xd0, 0xe9, 0x3d, 0xe0, 0x96, 0xcb, 0x2b, 0x64, 0x58, + 0x30, 0xe3, 0xe2, 0x2b, 0x6c, 0xb2, 0xda, 0x59, 0x5b, 0x1a, 0x33, 0x12, + 0xbf, 0xb6, 0x9d, 0xb3, 0xbf, 0x96, 0x5d, 0xf7, 0x56, 0x5f, 0xff, 0xef, + 0x1e, 0xb1, 0xaf, 0xf3, 0x31, 0x85, 0xf5, 0x27, 0xfd, 0x65, 0xfb, 0x08, + 0x7e, 0x85, 0x94, 0xc8, 0x56, 0x9d, 0x10, 0x89, 0x91, 0x76, 0x37, 0x9c, + 0x37, 0xfc, 0xaa, 0xe4, 0x24, 0x62, 0x11, 0x81, 0x59, 0x2f, 0xfb, 0x06, + 0x33, 0xfb, 0x3e, 0xea, 0xcb, 0xe0, 0x14, 0x49, 0x65, 0x78, 0xf6, 0xdc, + 0xea, 0xff, 0x46, 0x76, 0x3c, 0xe3, 0x59, 0x7a, 0x3e, 0x92, 0xca, 0xd8, + 0xfb, 0xc6, 0x43, 0xba, 0x63, 0x7d, 0x98, 0x5d, 0x59, 0x7f, 0xfb, 0x79, + 0x97, 0xfe, 0x37, 0x97, 0x4f, 0x65, 0x97, 0xc1, 0x7d, 0x49, 0x65, 0x41, + 0xf7, 0x0d, 0x32, 0xff, 0xe1, 0xc0, 0xf5, 0x1d, 0x30, 0x18, 0xd6, 0x5f, + 0x4d, 0x1b, 0xb2, 0x59, 0x7f, 0x74, 0x03, 0x1b, 0x74, 0xb2, 0xfd, 0xd3, + 0x28, 0xfd, 0x65, 0xff, 0x4d, 0xcd, 0xee, 0x5b, 0x04, 0x6b, 0x2f, 0xe7, + 0x17, 0xff, 0xdb, 0x3e, 0xb2, 0xfb, 0x3b, 0x8d, 0x59, 0x71, 0x30, 0xb2, + 0x9c, 0xdc, 0x04, 0x86, 0xa4, 0x88, 0xce, 0x36, 0x5f, 0xf8, 0xa3, 0xb2, + 0xcd, 0xc7, 0x2f, 0xd6, 0x5e, 0xfc, 0xff, 0x59, 0x7d, 0xb4, 0xde, 0x35, + 0x96, 0xf6, 0x1e, 0x10, 0x47, 0xaf, 0xfc, 0x1d, 0xcf, 0x1c, 0xe6, 0x35, + 0x9c, 0x59, 0x7f, 0xe2, 0x76, 0x3c, 0xf2, 0xe1, 0x8d, 0x65, 0xfb, 0xc6, + 0x4f, 0xb2, 0xcb, 0x01, 0x65, 0xf0, 0x65, 0x9c, 0x01, 0xb8, 0x22, 0x7a, + 0x6a, 0x2b, 0x49, 0xda, 0xf1, 0x67, 0x56, 0x5c, 0x23, 0x56, 0x51, 0x9e, + 0xa9, 0x11, 0x74, 0x6e, 0xef, 0x86, 0xb2, 0xa1, 0x73, 0x0b, 0x63, 0x39, + 0x42, 0x38, 0x64, 0x38, 0x86, 0xc1, 0x37, 0xc5, 0xe6, 0x4f, 0x34, 0x32, + 0x5a, 0x47, 0xe8, 0x41, 0x11, 0x3f, 0x63, 0x47, 0x09, 0x6d, 0xfd, 0x3a, + 0x68, 0xe9, 0x6f, 0x59, 0x7f, 0xf4, 0x6f, 0xd4, 0x6b, 0x0f, 0xd0, 0x35, + 0x97, 0x46, 0x2c, 0xa2, 0x3d, 0x9e, 0x22, 0x5c, 0xed, 0x59, 0x74, 0xd3, + 0xeb, 0x28, 0x8d, 0x8e, 0xf1, 0x6b, 0x83, 0xd5, 0x95, 0x24, 0xc5, 0xb2, + 0x11, 0x66, 0xa5, 0x3e, 0x45, 0x66, 0x6c, 0x88, 0x44, 0x74, 0xb2, 0x5b, + 0xa7, 0x98, 0x42, 0x4f, 0x65, 0x4c, 0xae, 0x99, 0x3c, 0x47, 0x19, 0x52, + 0x03, 0x28, 0xc9, 0x13, 0x9b, 0xfb, 0x47, 0xb5, 0x29, 0x64, 0xa3, 0x9e, + 0xaf, 0xca, 0x73, 0x1b, 0x12, 0xa5, 0x01, 0x3a, 0xc5, 0xf4, 0xbf, 0xd3, + 0x95, 0x6d, 0x34, 0xed, 0xa6, 0xa7, 0x45, 0x9b, 0x2d, 0xfb, 0xd4, 0xcc, + 0x37, 0x9c, 0xc4, 0xfe, 0x70, 0x45, 0x97, 0x0b, 0x62, 0xa4, 0xe7, 0xf2, + 0xb2, 0x32, 0xed, 0x29, 0xd0, 0x31, 0x8b, 0xef, 0x7a, 0x16, 0x14, 0x13, + 0xf2, 0xe6, 0x04, 0x9e, 0x23, 0xdd, 0x8f, 0xb6, 0x99, 0xc2, 0x33, 0x44, + 0xd4, 0xbd, 0x88, 0x9c, 0x8b, 0xff, 0xcc, 0xda, 0xf2, 0x67, 0x9a, 0x03, + 0xb8, 0x15, 0x13, 0x62, 0xfd, 0xa0, 0x3b, 0x81, 0x51, 0x56, 0xae, 0xff, + 0x7a, 0xcb, 0xb9, 0x3e, 0xb2, 0xcc, 0xf0, 0xfa, 0x3c, 0x69, 0xc1, 0xab, + 0xb7, 0xe9, 0x65, 0xcf, 0x0b, 0x2f, 0xf4, 0xa4, 0x1e, 0x94, 0x49, 0x65, + 0xf6, 0x79, 0xfa, 0xb2, 0xcc, 0x9c, 0x3d, 0x42, 0x33, 0xbf, 0xff, 0xf4, + 0xa3, 0x7c, 0x1e, 0x80, 0x6d, 0x79, 0x19, 0x60, 0xf1, 0x85, 0x97, 0xff, + 0xb4, 0x72, 0xc9, 0x63, 0xc8, 0xa1, 0xab, 0x2f, 0xf6, 0xb0, 0x11, 0xf8, + 0x8d, 0x59, 0x7f, 0xbd, 0x1b, 0x6a, 0x30, 0x6b, 0x2f, 0xff, 0xd1, 0xb4, + 0x6a, 0x1b, 0x11, 0xdf, 0x1f, 0xed, 0x59, 0x50, 0x88, 0x8f, 0x19, 0xde, + 0x81, 0xcc, 0xb2, 0xa4, 0x9d, 0x71, 0xb5, 0xe9, 0x1f, 0xd0, 0xbd, 0xe9, + 0x15, 0xf6, 0x9b, 0xe1, 0xac, 0xbf, 0xfb, 0x52, 0x2c, 0xef, 0x21, 0xbd, + 0x02, 0xca, 0x83, 0xe7, 0x09, 0x1d, 0xe1, 0xe1, 0x2c, 0xbf, 0xb9, 0x23, + 0x03, 0xe9, 0x65, 0xe7, 0x70, 0x2a, 0x2b, 0x45, 0xf9, 0x8f, 0xb8, 0x1f, + 0x96, 0x54, 0x22, 0x04, 0x05, 0xa6, 0x51, 0x7f, 0x04, 0xd8, 0xd4, 0x0d, + 0x65, 0xff, 0xe3, 0xec, 0xa0, 0x1e, 0x3e, 0xf1, 0xfe, 0x59, 0x5a, 0x45, + 0x33, 0x4b, 0xb7, 0x97, 0x5f, 0xdf, 0xce, 0xcd, 0x1b, 0x0b, 0x2f, 0xfb, + 0x06, 0x7c, 0x98, 0xa0, 0x6b, 0x28, 0x67, 0xd2, 0xe6, 0x37, 0xfd, 0x00, + 0xc6, 0xe1, 0x76, 0x7d, 0x65, 0xfe, 0xf4, 0x6b, 0xfe, 0xe6, 0xcb, 0x2e, + 0xf1, 0xb4, 0xfb, 0xfc, 0x75, 0x7a, 0x5f, 0x49, 0x65, 0xe0, 0xf3, 0xab, + 0x2f, 0xff, 0xd2, 0x72, 0x3e, 0xc7, 0x81, 0x83, 0x28, 0xe2, 0xcb, 0xff, + 0xf1, 0xee, 0xc1, 0x06, 0x47, 0xce, 0x44, 0xe6, 0x81, 0x65, 0x1a, 0x2a, + 0xdd, 0x4a, 0xe3, 0xf9, 0x65, 0xff, 0xf0, 0x23, 0x59, 0xfb, 0xb5, 0xe5, + 0x06, 0x05, 0x97, 0xff, 0xd2, 0xe6, 0x14, 0x35, 0xf3, 0xbd, 0x86, 0xac, + 0xa8, 0x44, 0xdb, 0xa7, 0x56, 0x91, 0xa7, 0xd8, 0x59, 0x53, 0x53, 0xe4, + 0xf4, 0x32, 0x3b, 0x0f, 0x4b, 0xff, 0xff, 0xb7, 0x9f, 0x79, 0x8c, 0x03, + 0xc7, 0xdc, 0x98, 0xa1, 0xbb, 0x60, 0xab, 0x2f, 0xff, 0xba, 0xf9, 0xc1, + 0xe4, 0xbd, 0x1b, 0xc7, 0x0b, 0x2f, 0xff, 0xff, 0xe3, 0xe8, 0xf0, 0x3c, + 0x9d, 0xec, 0x07, 0x83, 0xb1, 0xe1, 0x7d, 0x2e, 0x70, 0x30, 0xb2, 0x9d, + 0x1b, 0x84, 0xa1, 0x50, 0x9b, 0x9b, 0xc6, 0xa5, 0x7f, 0xa3, 0xaf, 0xe9, + 0xc3, 0x85, 0x97, 0xd2, 0xe9, 0xec, 0xb2, 0xfd, 0xce, 0x39, 0x6c, 0xb2, + 0xfc, 0x27, 0x4a, 0x3f, 0x59, 0x6f, 0x2c, 0xaf, 0x91, 0x0a, 0xd2, 0x3d, + 0xe5, 0x02, 0x14, 0xdf, 0xff, 0x7e, 0xf9, 0xe7, 0x3d, 0xd8, 0x69, 0x3b, + 0x0b, 0x2f, 0xfc, 0x7c, 0xc1, 0xfd, 0xc8, 0xd7, 0x16, 0x5f, 0xe7, 0x97, + 0x4f, 0x6f, 0x1a, 0xca, 0x84, 0xc1, 0x31, 0x04, 0x0a, 0x26, 0x7f, 0x7e, + 0xcf, 0x1e, 0x35, 0x65, 0xf8, 0xff, 0x69, 0xe9, 0x65, 0xff, 0xff, 0x3f, + 0x60, 0x9f, 0x68, 0xd4, 0x1c, 0xa1, 0xa5, 0x0c, 0x2c, 0xbf, 0xc7, 0xc3, + 0x0b, 0x2c, 0x70, 0xb2, 0x89, 0x13, 0x3d, 0x63, 0xbf, 0xbd, 0x00, 0x27, + 0x6a, 0xcb, 0xff, 0x39, 0x83, 0xce, 0x1d, 0xb4, 0x6b, 0x28, 0xcf, 0xa8, + 0x8b, 0x2f, 0xfd, 0x8f, 0xb4, 0x61, 0x0f, 0xd0, 0xb2, 0xb6, 0x4f, 0x3c, + 0x64, 0xc7, 0x0c, 0x1f, 0x42, 0x30, 0x88, 0x2f, 0xf4, 0xa3, 0x5b, 0x46, + 0xb6, 0x59, 0x7d, 0x2d, 0x63, 0x56, 0x5e, 0xcd, 0x7e, 0xb2, 0xfd, 0x36, + 0x0d, 0xbb, 0x8b, 0x2f, 0xe2, 0x81, 0x7e, 0x97, 0x16, 0x57, 0xc8, 0x9a, + 0x32, 0x29, 0x87, 0x77, 0x4b, 0x2f, 0x30, 0x10, 0x2c, 0xa8, 0x4c, 0xbb, + 0x21, 0x9e, 0xc2, 0x0d, 0xff, 0xff, 0xf8, 0xc1, 0x9d, 0x82, 0xef, 0x27, + 0x41, 0x8f, 0x1b, 0x3b, 0x50, 0x72, 0x7e, 0x2c, 0xbf, 0xfe, 0xd7, 0xfc, + 0xff, 0xcf, 0x23, 0xe9, 0x47, 0xeb, 0x2b, 0x11, 0xaa, 0x18, 0x41, 0xdf, + 0xd9, 0xd7, 0x2f, 0xc2, 0xb2, 0xfe, 0xf4, 0xe3, 0xd9, 0xc9, 0x65, 0xfc, + 0xde, 0x0c, 0x9c, 0x55, 0x97, 0xef, 0xf8, 0xca, 0x32, 0x8c, 0xa2, 0xca, + 0x83, 0xe7, 0x72, 0xeb, 0xe7, 0xfd, 0xc6, 0xb2, 0xa4, 0x98, 0x2e, 0x16, + 0x94, 0x25, 0xb8, 0x41, 0x7f, 0xec, 0xd4, 0xc5, 0x83, 0xf4, 0x6f, 0x59, + 0x66, 0x6c, 0x86, 0xc6, 0x8d, 0x92, 0x33, 0x3d, 0xb4, 0xc4, 0x7b, 0x1b, + 0x42, 0xd8, 0x64, 0x39, 0x1a, 0x13, 0x10, 0x9b, 0x04, 0x24, 0x3e, 0x2d, + 0x39, 0x40, 0x5a, 0x8e, 0xb9, 0xa5, 0x1e, 0x8e, 0xf5, 0xe5, 0x05, 0x14, + 0x70, 0x5c, 0x8c, 0x2b, 0xb1, 0x96, 0x08, 0x83, 0x7e, 0xd0, 0x1d, 0xc0, + 0xa8, 0xb0, 0x17, 0xf9, 0xa7, 0xc0, 0xc6, 0xa6, 0x59, 0x7c, 0x01, 0x3d, + 0x32, 0xca, 0x83, 0xd9, 0x73, 0x4b, 0xdf, 0x89, 0xfa, 0xcb, 0xf0, 0xf3, + 0x3f, 0xe2, 0xcb, 0x33, 0xc4, 0x7a, 0xf2, 0x11, 0xbd, 0x20, 0x10, 0x82, + 0xfd, 0xa0, 0x3b, 0x81, 0x51, 0x3a, 0xaf, 0xff, 0xf7, 0xa3, 0x61, 0xe3, + 0x59, 0xf3, 0x99, 0xe3, 0xe0, 0x76, 0x59, 0x7e, 0x66, 0xd7, 0x93, 0x3c, + 0x44, 0xcc, 0xc6, 0x97, 0xff, 0xf1, 0x06, 0x3b, 0xcc, 0x26, 0x7f, 0xff, + 0x1e, 0x7d, 0x96, 0x5f, 0xc4, 0xce, 0x67, 0x99, 0xd6, 0x54, 0x22, 0x3b, + 0x17, 0xaf, 0x31, 0x0d, 0x59, 0x7e, 0xcd, 0xb6, 0x80, 0x2c, 0xbe, 0x70, + 0x08, 0xd5, 0x97, 0xa5, 0xc6, 0x6c, 0x1f, 0x49, 0x0e, 0xef, 0x29, 0xbf, + 0x68, 0x0e, 0xe0, 0x54, 0x5b, 0x2b, 0xff, 0xbc, 0x7d, 0xf0, 0x7e, 0xc6, + 0xbf, 0xcb, 0x2f, 0xee, 0xbf, 0xa7, 0x0e, 0x16, 0x5f, 0xff, 0xd2, 0x67, + 0xc8, 0x3c, 0x19, 0xe7, 0x33, 0xa5, 0x0b, 0x2a, 0x11, 0x10, 0xe5, 0xf7, + 0xe9, 0x41, 0xef, 0x85, 0x97, 0xfd, 0x1c, 0x67, 0xe3, 0x03, 0xe9, 0x65, + 0x41, 0xf1, 0x7e, 0x51, 0x7f, 0xd1, 0x28, 0xd6, 0xd1, 0xad, 0x96, 0x59, + 0x9e, 0x27, 0xc2, 0x03, 0x46, 0xc3, 0x39, 0xe1, 0x06, 0x44, 0x57, 0xfe, + 0x26, 0x6d, 0x09, 0xf4, 0x9f, 0x75, 0x65, 0xff, 0xc1, 0xe3, 0x3c, 0xd3, + 0xf3, 0xcf, 0x25, 0x97, 0x3f, 0xf8, 0x88, 0x8f, 0xd0, 0xae, 0xf8, 0x0b, + 0x2f, 0x80, 0xee, 0x05, 0x45, 0xcc, 0xb3, 0x56, 0x56, 0x8d, 0xf8, 0xa5, + 0xd7, 0xf1, 0x67, 0xdf, 0x9c, 0x96, 0x59, 0x96, 0xb2, 0xb4, 0x78, 0x7b, + 0xcb, 0xae, 0x99, 0xab, 0x29, 0x65, 0x99, 0xc2, 0x60, 0x78, 0xae, 0x6c, + 0xa2, 0x92, 0x4f, 0x8c, 0x5f, 0xb4, 0x07, 0x70, 0x2a, 0x2e, 0xf5, 0xfe, + 0x93, 0x3e, 0x6b, 0x46, 0x2a, 0xcb, 0x33, 0xc3, 0xeb, 0x73, 0x4b, 0xfe, + 0x28, 0x7d, 0xbe, 0xe4, 0x0d, 0x65, 0xc3, 0xfd, 0x65, 0xe2, 0xcd, 0x96, + 0x59, 0x98, 0xcf, 0xb5, 0x83, 0x92, 0x18, 0xa8, 0x85, 0x51, 0xce, 0x62, + 0x33, 0xfc, 0x08, 0xdf, 0x43, 0x08, 0xeb, 0x1d, 0x9d, 0x4a, 0x55, 0x6c, + 0x38, 0xfd, 0x0d, 0x27, 0x84, 0x57, 0xf2, 0x89, 0x8a, 0x1c, 0x5c, 0x8c, + 0xcb, 0xb0, 0xbf, 0x12, 0x12, 0xb7, 0xfe, 0x15, 0xcb, 0x6e, 0x19, 0x7d, + 0x25, 0x97, 0xff, 0x66, 0xd8, 0x2f, 0xb3, 0x98, 0x64, 0xb2, 0xff, 0xc6, + 0x45, 0x8c, 0x00, 0x2e, 0x35, 0x97, 0xec, 0xf0, 0xdc, 0x96, 0x5c, 0x6c, + 0xfc, 0x8e, 0x62, 0x40, 0xe2, 0x18, 0x87, 0xb7, 0xee, 0x71, 0xaf, 0x25, + 0x97, 0xff, 0xff, 0xfe, 0xf1, 0xf8, 0xe0, 0xba, 0x4e, 0xc6, 0x74, 0x3d, + 0x3e, 0xf3, 0xc7, 0xa8, 0xd9, 0xf4, 0x05, 0x97, 0x72, 0x16, 0x5f, 0xfd, + 0xf0, 0x02, 0xff, 0x77, 0x30, 0x98, 0x59, 0x78, 0x9d, 0x9c, 0x26, 0x38, + 0x02, 0x8e, 0x42, 0x63, 0xa2, 0xd7, 0xf3, 0x22, 0x79, 0x8f, 0xb5, 0xb2, + 0xcb, 0xc1, 0x76, 0xac, 0xbf, 0x66, 0xef, 0x61, 0x85, 0x96, 0xdd, 0x59, + 0x5b, 0x1b, 0xfc, 0x2b, 0xad, 0x1f, 0xe1, 0x2d, 0xdf, 0xfb, 0x8e, 0xc7, + 0x8e, 0x08, 0x30, 0xb2, 0xff, 0xde, 0x7e, 0xbf, 0xbe, 0x96, 0x75, 0x65, + 0x61, 0xfe, 0x19, 0xed, 0xcf, 0xfa, 0xcb, 0xff, 0xff, 0xc4, 0xe2, 0x96, + 0x77, 0xb9, 0xb4, 0x13, 0xb1, 0xc6, 0xc6, 0x10, 0xd6, 0x5e, 0xc1, 0x38, + 0xb2, 0xb1, 0x15, 0x3a, 0x17, 0xdd, 0x75, 0xbf, 0xff, 0xf8, 0x83, 0xcf, + 0x1e, 0xb3, 0x7c, 0x17, 0x70, 0xa3, 0xf6, 0xbc, 0x96, 0x5f, 0x86, 0x7b, + 0xf5, 0x8b, 0x2d, 0xe8, 0x44, 0xd6, 0x38, 0xdf, 0xe7, 0x96, 0xb2, 0x7c, + 0xff, 0x59, 0x79, 0xdc, 0x0a, 0x89, 0x5d, 0x7f, 0x98, 0x72, 0xff, 0xb9, + 0xe5, 0x94, 0x03, 0xdc, 0x32, 0x8b, 0xf9, 0xfe, 0xcf, 0x60, 0x16, 0x5f, + 0xef, 0x89, 0xd8, 0x7e, 0xc9, 0x65, 0xff, 0xde, 0xc9, 0x03, 0xc6, 0x38, + 0x2e, 0xac, 0xa3, 0x3f, 0x7e, 0x9a, 0x54, 0x93, 0x9f, 0x19, 0x3e, 0xa1, + 0x24, 0xd2, 0x12, 0x85, 0x25, 0xfe, 0x8d, 0x3c, 0x9f, 0xe9, 0x2c, 0xbe, + 0xee, 0x8f, 0xe5, 0x97, 0xf8, 0xa1, 0xa3, 0xd3, 0x81, 0x65, 0xff, 0xff, + 0xf6, 0x9c, 0x84, 0x8f, 0xf2, 0x5e, 0x8d, 0xe3, 0x86, 0x78, 0x41, 0x96, + 0x71, 0x65, 0xb6, 0x59, 0x6d, 0x96, 0x54, 0x1a, 0x49, 0x09, 0x5f, 0xb0, + 0x0f, 0x2c, 0x59, 0x7f, 0xff, 0x9f, 0xee, 0x66, 0xbb, 0xd7, 0xd8, 0x46, + 0x8f, 0xc6, 0xc2, 0xcb, 0xed, 0xef, 0x29, 0xe9, 0x65, 0xff, 0x61, 0xef, + 0x28, 0xcd, 0x49, 0x65, 0xff, 0xfb, 0xb2, 0xcd, 0xc7, 0x2f, 0xfe, 0xee, + 0xa3, 0x05, 0x58, 0x29, 0xb8, 0xbf, 0x7d, 0xdf, 0x47, 0xeb, 0x2b, 0x11, + 0xec, 0xec, 0x21, 0x6b, 0xbf, 0xfd, 0x31, 0x47, 0x79, 0xdf, 0x80, 0x65, + 0xb2, 0xcb, 0xfe, 0x71, 0x47, 0xe8, 0xdb, 0x05, 0x59, 0x46, 0x88, 0x72, + 0x4c, 0xbf, 0xff, 0x61, 0xff, 0x8d, 0x3e, 0xf2, 0x1a, 0xff, 0x75, 0x65, + 0xff, 0xfe, 0x03, 0xe9, 0xfd, 0xf4, 0xb3, 0xb9, 0xd8, 0x0b, 0x2f, 0x16, + 0x5f, 0xfc, 0xff, 0x48, 0xfb, 0xe8, 0xd7, 0x61, 0x65, 0xff, 0x43, 0x7b, + 0x93, 0x48, 0xfa, 0xb2, 0xa4, 0x99, 0xb1, 0xaa, 0xb5, 0x93, 0xa8, 0x97, + 0xff, 0xfb, 0xc6, 0x31, 0xe0, 0xbf, 0x74, 0x2f, 0xcf, 0x0a, 0xe3, 0x59, + 0x7c, 0x17, 0xd4, 0x96, 0x5f, 0xc5, 0x1b, 0x7e, 0xfd, 0x59, 0x7f, 0x9c, + 0x62, 0x6e, 0xc1, 0x49, 0x65, 0xa0, 0x07, 0xc8, 0xd2, 0xeb, 0xff, 0xfc, + 0x7d, 0x76, 0xb9, 0x7f, 0xe1, 0x5c, 0xb6, 0x01, 0xec, 0xb2, 0x86, 0x98, + 0x79, 0xc2, 0x19, 0xc9, 0xef, 0xf8, 0x3f, 0xb5, 0xe5, 0xcd, 0x0d, 0x65, + 0xff, 0xfe, 0xc3, 0x2e, 0xe1, 0x4e, 0x27, 0x1c, 0x16, 0xd1, 0xa5, 0x96, + 0xce, 0xa2, 0x67, 0x79, 0xdd, 0xff, 0xff, 0xef, 0x63, 0x7f, 0x7d, 0x66, + 0xfc, 0x1e, 0x70, 0x2f, 0xf7, 0x85, 0x7e, 0xac, 0xbf, 0xf6, 0x7d, 0xde, + 0xc3, 0x7d, 0x9b, 0x2c, 0xbf, 0xe9, 0x81, 0xe3, 0x6c, 0x69, 0x85, 0x97, + 0xfb, 0xfc, 0xd6, 0x67, 0x78, 0xb2, 0xb0, 0xfb, 0xbe, 0x3b, 0xa1, 0xae, + 0xa4, 0xe4, 0x6a, 0xe0, 0x3d, 0xf4, 0x6e, 0x65, 0x0c, 0xde, 0x95, 0x0a, + 0xf6, 0x24, 0x2b, 0xaf, 0xf7, 0x9e, 0x5f, 0xeb, 0x3e, 0x59, 0x7f, 0xfe, + 0x31, 0xf9, 0xcf, 0xb0, 0x40, 0x36, 0xb4, 0xd6, 0x5b, 0x3c, 0x88, 0x72, + 0x35, 0xbf, 0xec, 0xfb, 0x83, 0x87, 0x2d, 0x96, 0x5f, 0xfc, 0x03, 0xd7, + 0xb2, 0x6f, 0x1e, 0xb6, 0x59, 0x7f, 0xcf, 0x2e, 0x7a, 0x34, 0x20, 0xd6, + 0x54, 0x91, 0xc1, 0x84, 0xff, 0x1c, 0xf5, 0x1a, 0xff, 0xff, 0x7b, 0x00, + 0x58, 0xdc, 0x2c, 0xe8, 0x7f, 0x6b, 0xc9, 0x65, 0xff, 0x8b, 0x3d, 0x93, + 0x48, 0xf5, 0x25, 0x97, 0xff, 0xff, 0xdf, 0xc1, 0x01, 0xfa, 0xff, 0x7f, + 0x9b, 0xcf, 0xb2, 0xf1, 0xf7, 0x86, 0x35, 0x97, 0xfe, 0x3d, 0xe7, 0xd9, + 0xa5, 0x05, 0xd5, 0x95, 0x24, 0xd7, 0x40, 0xbf, 0xf1, 0xf7, 0x61, 0x01, + 0x7f, 0xf9, 0xf2, 0x5e, 0xc3, 0x2c, 0xfe, 0x7f, 0x16, 0x5e, 0x79, 0x33, + 0x9e, 0x5b, 0x1b, 0xe8, 0x85, 0xac, 0xa1, 0x3a, 0x38, 0x64, 0xe4, 0xa6, + 0xbf, 0x95, 0x0c, 0xce, 0x62, 0x3d, 0x19, 0x36, 0x14, 0x9e, 0x20, 0xfc, + 0x98, 0xa3, 0x5b, 0xe4, 0xef, 0xf7, 0x63, 0xf1, 0x12, 0x39, 0xad, 0xd4, + 0x4b, 0x99, 0x78, 0xb2, 0xfd, 0xd8, 0x0b, 0x2f, 0x16, 0x5f, 0xb0, 0x0f, + 0x2c, 0x59, 0x7f, 0xb0, 0x66, 0x5d, 0xcf, 0x2c, 0xbd, 0x9e, 0x66, 0xca, + 0x22, 0x73, 0x06, 0xbc, 0x56, 0x44, 0xd7, 0x8e, 0x1d, 0x65, 0xee, 0xc0, + 0xd2, 0x5f, 0xfe, 0xf3, 0x9f, 0x62, 0x47, 0xad, 0x83, 0xfa, 0x4b, 0xda, + 0x65, 0xb3, 0x83, 0xe7, 0xe0, 0xe5, 0xe7, 0x03, 0x39, 0x22, 0xe8, 0x70, + 0x81, 0xb3, 0x31, 0xb6, 0xd2, 0xe0, 0x8d, 0x99, 0xb5, 0x90, 0x97, 0x63, + 0xd7, 0xdf, 0x18, 0x6d, 0xff, 0xe6, 0x6d, 0x79, 0x33, 0xcd, 0x01, 0xdc, + 0x0a, 0x89, 0x85, 0x7d, 0x06, 0x27, 0x96, 0x5f, 0xe0, 0x47, 0xdd, 0x28, + 0x92, 0xcb, 0xc6, 0x27, 0x96, 0x5f, 0xff, 0xd9, 0xbd, 0xc7, 0xe8, 0x67, + 0xdf, 0x60, 0xc3, 0xde, 0x2c, 0xbb, 0x24, 0xb2, 0xff, 0xf6, 0x9f, 0xf6, + 0x6c, 0x76, 0x42, 0xc7, 0x24, 0xb2, 0xec, 0x66, 0x34, 0xcd, 0xf0, 0x8b, + 0xf3, 0x32, 0x1d, 0x0a, 0xf8, 0x82, 0xd7, 0x37, 0x7a, 0xcb, 0xf1, 0xfb, + 0xd9, 0xb2, 0xcb, 0xd3, 0xdf, 0x86, 0xb2, 0xff, 0xe6, 0x4e, 0x7d, 0x20, + 0xbf, 0x4a, 0x24, 0xb2, 0xf9, 0x95, 0xf2, 0x4d, 0x59, 0x7e, 0x9e, 0x67, + 0x99, 0xea, 0x7d, 0x90, 0xb2, 0xfd, 0x8d, 0x9d, 0xf6, 0xe2, 0xcb, 0xfa, + 0x1b, 0x9f, 0xc6, 0xf5, 0x94, 0x33, 0xdd, 0xf1, 0x75, 0xfe, 0xd6, 0x02, + 0x3f, 0x11, 0xab, 0x2f, 0xdd, 0x7d, 0x9f, 0x8b, 0x2f, 0xa1, 0xa7, 0xa5, + 0x96, 0x89, 0x8f, 0x27, 0x45, 0x17, 0xd0, 0x47, 0x32, 0xcb, 0xff, 0xf6, + 0x6d, 0x3b, 0x30, 0xbb, 0xe7, 0x3e, 0x1e, 0xf5, 0x97, 0xef, 0x40, 0xcd, + 0x85, 0x94, 0x69, 0xb4, 0x68, 0x89, 0xaf, 0xc4, 0x51, 0xd2, 0x1d, 0xd5, + 0x7b, 0x99, 0x1d, 0x59, 0x7b, 0x7b, 0xf1, 0x65, 0xff, 0xb8, 0x3d, 0x13, + 0x8b, 0x9f, 0x75, 0x65, 0xfe, 0x14, 0xb3, 0xee, 0xe7, 0x96, 0x56, 0x1f, + 0xa1, 0xa0, 0x5f, 0xe8, 0x7d, 0xba, 0xc3, 0xe9, 0x65, 0xf9, 0xf5, 0x27, + 0x6a, 0xca, 0x1a, 0x65, 0x18, 0x37, 0xe8, 0x49, 0x11, 0x00, 0x4d, 0x2f, + 0xf7, 0x7c, 0xe7, 0xc3, 0xde, 0xb2, 0xcc, 0x85, 0x94, 0x47, 0x93, 0x3e, + 0x69, 0x7f, 0xb9, 0x18, 0x43, 0xf4, 0x2c, 0xbf, 0xa3, 0x08, 0x7e, 0x85, + 0x97, 0x83, 0xa9, 0xa7, 0x1e, 0xe7, 0x0c, 0x6f, 0xff, 0x68, 0xc3, 0x8c, + 0x67, 0x43, 0x1f, 0x0d, 0x65, 0xff, 0xf8, 0xf5, 0xe7, 0x9c, 0x3c, 0x97, + 0xa3, 0x78, 0xe1, 0x65, 0xff, 0x0a, 0x27, 0xa0, 0x1e, 0x39, 0x96, 0x5f, + 0x05, 0xb8, 0x35, 0x96, 0xcf, 0x8f, 0x7b, 0x74, 0xf2, 0xfd, 0xa8, 0x97, + 0x31, 0x65, 0xf1, 0xf7, 0x37, 0xac, 0xbf, 0xd8, 0x2f, 0x49, 0xff, 0xe2, + 0xca, 0x83, 0xfe, 0xf1, 0x3f, 0x48, 0xeb, 0x15, 0x47, 0x82, 0x10, 0x1a, + 0x37, 0xf2, 0x59, 0x42, 0xdb, 0xb0, 0xa9, 0xbf, 0xfe, 0x82, 0xee, 0xa0, + 0xe4, 0x58, 0xd7, 0x92, 0xcb, 0xff, 0xd0, 0x0e, 0x07, 0xa7, 0xe3, 0x63, + 0xc6, 0xb2, 0xfe, 0x6c, 0x61, 0x76, 0x7d, 0x65, 0xb8, 0xb2, 0xfd, 0x18, + 0x5d, 0x9f, 0x59, 0x7b, 0x8f, 0xf4, 0xe3, 0xe9, 0x98, 0xbd, 0xa2, 0x34, + 0x34, 0xd0, 0xda, 0x99, 0xd8, 0x59, 0xdf, 0xf6, 0xe6, 0x0f, 0xd1, 0xb8, + 0x50, 0xb2, 0x8c, 0xfc, 0xdc, 0xda, 0xff, 0xb5, 0xb0, 0x3c, 0x7e, 0x0f, + 0x56, 0x57, 0x8f, 0x6d, 0xc8, 0x2f, 0xf1, 0xb1, 0xac, 0xda, 0x36, 0x59, + 0x7e, 0x86, 0xef, 0xfe, 0x4b, 0x2b, 0x87, 0xc1, 0xd3, 0x5b, 0xba, 0x6b, + 0x2e, 0x0e, 0x2c, 0xa9, 0x1e, 0x73, 0x04, 0x5f, 0x8b, 0x5f, 0x80, 0x7c, + 0xf1, 0xac, 0xbf, 0xb0, 0xcb, 0xa1, 0xf2, 0xcb, 0x77, 0xe3, 0xd3, 0xf1, + 0x3d, 0xfd, 0xac, 0x3f, 0x40, 0xd6, 0x5e, 0xd0, 0x78, 0xb2, 0xff, 0xfb, + 0xd0, 0x59, 0xdf, 0x67, 0x7d, 0x01, 0x65, 0xac, 0xbf, 0x8f, 0x53, 0x9c, + 0xbf, 0x59, 0x7b, 0xd9, 0xf2, 0xcb, 0xff, 0xfc, 0x2e, 0xef, 0x73, 0xd3, + 0x8b, 0x36, 0x3c, 0x2f, 0xa5, 0xc5, 0x97, 0xe1, 0x7b, 0x9e, 0x02, 0xca, + 0xc4, 0x48, 0x3b, 0x3d, 0x0d, 0x39, 0x8c, 0x2c, 0x31, 0xdf, 0x29, 0x39, + 0x79, 0x42, 0xb6, 0xff, 0xf7, 0x49, 0xff, 0xf6, 0x18, 0xc3, 0xde, 0x2c, + 0xbe, 0xdf, 0x83, 0x85, 0x97, 0xfd, 0x1b, 0x09, 0x2f, 0x05, 0xf6, 0x59, + 0x50, 0x8a, 0x9c, 0x4a, 0xd1, 0x1d, 0xff, 0xbe, 0x94, 0xef, 0x38, 0x20, + 0x86, 0xb2, 0xf8, 0x3a, 0xfd, 0xab, 0x2b, 0x0f, 0x97, 0x88, 0x37, 0xc5, + 0x86, 0xc2, 0xcb, 0xe3, 0x8f, 0xb8, 0xb2, 0xfc, 0x27, 0x4a, 0x3f, 0x59, + 0x4d, 0x3e, 0xce, 0x90, 0xef, 0x22, 0xbe, 0xef, 0x70, 0x55, 0x97, 0xff, + 0xa3, 0xbf, 0xc4, 0xb3, 0xee, 0xec, 0x11, 0x56, 0x5f, 0xa1, 0xba, 0x79, + 0x96, 0x5e, 0xe3, 0xfe, 0xb2, 0xa1, 0x1c, 0xf8, 0x62, 0x64, 0x7e, 0x4e, + 0xe9, 0x45, 0x2c, 0xbe, 0x86, 0x9c, 0x96, 0x5d, 0xe8, 0x91, 0xac, 0xd0, + 0x5d, 0xcf, 0x25, 0x97, 0xe8, 0x01, 0x3b, 0x56, 0x5f, 0xfa, 0x25, 0x3b, + 0x3c, 0x7a, 0xf3, 0xac, 0xb1, 0xf8, 0xf9, 0x78, 0x4d, 0x43, 0x46, 0x76, + 0xe1, 0x67, 0x9e, 0xef, 0xd3, 0x70, 0x61, 0xd9, 0x65, 0xfc, 0xff, 0xeb, + 0x47, 0xa5, 0x97, 0xbb, 0x3b, 0x16, 0x54, 0x1f, 0xbf, 0xe5, 0x62, 0x17, + 0x5f, 0x78, 0x3f, 0x75, 0x65, 0xff, 0xde, 0xc8, 0xd1, 0x63, 0x5a, 0x19, + 0x96, 0x5f, 0xdd, 0x13, 0xff, 0xe3, 0xe5, 0x97, 0xfc, 0x7d, 0x3c, 0x69, + 0x66, 0xcb, 0x28, 0xcf, 0xa7, 0xc6, 0x57, 0xf7, 0x0d, 0x86, 0xbf, 0x56, + 0x5f, 0xfb, 0x7c, 0x31, 0x23, 0x28, 0xd4, 0x2c, 0xbf, 0xff, 0xf6, 0xb3, + 0x7c, 0x17, 0x67, 0x08, 0x51, 0xe7, 0x3e, 0xc7, 0x78, 0xb2, 0xe0, 0x4f, + 0x6b, 0x2f, 0x6c, 0x19, 0x2c, 0xbc, 0x59, 0xc9, 0xc6, 0xeb, 0x07, 0x28, + 0x6a, 0x85, 0x41, 0x0a, 0xdf, 0x88, 0x4c, 0xbb, 0x47, 0xfb, 0xe1, 0x51, + 0x7d, 0x3b, 0x7e, 0xee, 0xcb, 0x28, 0x6a, 0xb2, 0x72, 0x51, 0xcb, 0x0c, + 0xb6, 0xdc, 0x59, 0x6d, 0xc5, 0x97, 0xb0, 0x7d, 0x59, 0x66, 0x99, 0xb0, + 0xd0, 0xa5, 0xdd, 0xc5, 0x97, 0xfa, 0x0a, 0x3f, 0x77, 0xdd, 0x59, 0x7b, + 0x4f, 0x25, 0x97, 0xf8, 0x7e, 0xc0, 0x7a, 0x34, 0xb2, 0x86, 0x88, 0x3d, + 0x1a, 0x10, 0xe5, 0xfb, 0x99, 0xdd, 0x42, 0xcb, 0xff, 0xcc, 0xb2, 0x86, + 0xb9, 0xf9, 0xfb, 0xe8, 0x59, 0x50, 0x99, 0xd1, 0xc2, 0x67, 0x85, 0xe1, + 0x27, 0xb9, 0xc0, 0xb2, 0xfe, 0x39, 0x9c, 0x1c, 0x92, 0xca, 0x01, 0xe2, + 0x78, 0x5a, 0xff, 0xff, 0x78, 0xc8, 0x7a, 0xc0, 0x7a, 0x3d, 0x9a, 0xd4, + 0x30, 0xb2, 0xfc, 0x1d, 0xd3, 0xc6, 0xac, 0xbf, 0x75, 0xda, 0x7d, 0x59, + 0x4c, 0x1e, 0x89, 0x15, 0x5f, 0xbd, 0x19, 0x27, 0x59, 0x7f, 0xe3, 0xe8, + 0x74, 0xfc, 0x9c, 0xde, 0xac, 0xa8, 0x44, 0x48, 0xc8, 0x9c, 0x9a, 0xff, + 0xb0, 0xf1, 0xa5, 0x9b, 0x3a, 0xcb, 0xf4, 0x77, 0x9f, 0x85, 0x65, 0xfd, + 0xe3, 0xe9, 0x43, 0x56, 0x5f, 0x46, 0xf2, 0x85, 0x95, 0x31, 0xe7, 0x34, + 0xb2, 0x99, 0x0b, 0x90, 0x70, 0x89, 0x91, 0xb0, 0x02, 0x10, 0xb3, 0x11, + 0x7a, 0x33, 0xa2, 0x2e, 0xe9, 0xb0, 0x5d, 0xef, 0xff, 0x9d, 0xa3, 0xf4, + 0x7a, 0x1a, 0x1f, 0xa5, 0xc5, 0x97, 0xff, 0xb3, 0xbe, 0x3c, 0xfb, 0xb9, + 0xbe, 0x38, 0xb2, 0xde, 0xf2, 0x27, 0x09, 0x46, 0xf9, 0xf9, 0xdd, 0x96, + 0x5f, 0xfc, 0xe5, 0xe8, 0x31, 0x9f, 0x32, 0x4b, 0x2f, 0x47, 0xe2, 0x2c, + 0xbf, 0xb3, 0x7f, 0x8f, 0xf9, 0x96, 0x56, 0x23, 0x6d, 0x82, 0x87, 0x23, + 0x24, 0x1e, 0x0f, 0x5c, 0x50, 0xb2, 0xfb, 0xd1, 0xc8, 0x59, 0x78, 0x41, + 0xe2, 0xcb, 0xcc, 0xbe, 0x4f, 0x6b, 0x2b, 0x63, 0xf9, 0x18, 0xab, 0x90, + 0xf0, 0x76, 0xf7, 0x0f, 0x8b, 0x2f, 0xa7, 0x36, 0x70, 0x16, 0x5e, 0xc0, + 0x0d, 0x65, 0xf7, 0x70, 0xbf, 0x59, 0x7f, 0x38, 0xb1, 0xdc, 0xd9, 0x65, + 0x61, 0xf6, 0x18, 0xe1, 0x11, 0x5f, 0x6c, 0x20, 0x76, 0x59, 0x7d, 0x34, + 0xa3, 0x65, 0x95, 0x07, 0x95, 0x84, 0xd7, 0xf1, 0xf7, 0xf1, 0x0a, 0x4b, + 0x2f, 0x85, 0x9b, 0x90, 0xb2, 0xf8, 0xe1, 0xb8, 0xb2, 0xfd, 0x0c, 0x67, + 0x78, 0xb2, 0xff, 0xcf, 0xde, 0x0f, 0x4f, 0xdf, 0x05, 0x65, 0xff, 0xf1, + 0x90, 0x65, 0x9c, 0x9d, 0xd3, 0x9f, 0xcd, 0x96, 0x56, 0xc9, 0xa7, 0x30, + 0x41, 0xf1, 0x7e, 0x89, 0x3c, 0x40, 0x45, 0x1d, 0x3f, 0xb3, 0x36, 0x43, + 0x7f, 0x2b, 0x3d, 0x0c, 0xb2, 0x4a, 0x27, 0xb2, 0x26, 0x57, 0x48, 0x65, + 0x45, 0x31, 0x28, 0x10, 0x71, 0xc0, 0xe4, 0xb2, 0x60, 0x4a, 0x77, 0xfa, + 0x19, 0xe7, 0x08, 0x49, 0xa3, 0xc1, 0xd4, 0x60, 0x4d, 0x84, 0x9f, 0xa3, + 0x74, 0x78, 0xd0, 0x7f, 0x85, 0x51, 0x4a, 0xf9, 0xe4, 0xe5, 0xe7, 0x65, + 0x05, 0x86, 0x18, 0x3b, 0xcf, 0x05, 0x1c, 0x9f, 0x84, 0x98, 0x91, 0xe2, + 0x5f, 0xe9, 0x8f, 0xb9, 0xae, 0xc2, 0xcb, 0xff, 0xed, 0x1f, 0xd2, 0xe1, + 0xf7, 0xd1, 0xae, 0xc2, 0xcb, 0xfd, 0x1a, 0x79, 0x9f, 0x92, 0x59, 0x79, + 0xdc, 0x0a, 0x8a, 0xb9, 0x7f, 0x38, 0x9e, 0xf3, 0xb5, 0x65, 0x00, 0xf5, + 0xbc, 0x51, 0x7f, 0x1e, 0xbc, 0xe2, 0x35, 0x65, 0x0d, 0x1b, 0x3a, 0x84, + 0x4f, 0x88, 0xaf, 0x8b, 0x77, 0x8e, 0xb2, 0xdb, 0x8b, 0x2f, 0xff, 0x46, + 0xdd, 0x31, 0xe1, 0x48, 0xfc, 0x15, 0x94, 0xd3, 0xdd, 0xf0, 0xa5, 0xed, + 0x43, 0x56, 0x5f, 0xe8, 0xd7, 0x60, 0xa3, 0xf5, 0x97, 0xf9, 0x9e, 0x68, + 0x0e, 0xe0, 0x54, 0x47, 0x8b, 0xf7, 0x8f, 0x5e, 0x75, 0x97, 0x8b, 0xae, + 0xb2, 0xec, 0x1e, 0x1e, 0x17, 0x09, 0xea, 0x48, 0xaf, 0x6c, 0x20, 0xef, + 0xf4, 0xa3, 0x5b, 0x46, 0xb6, 0x59, 0x7f, 0xa7, 0xdf, 0xd0, 0x51, 0xfa, + 0xcb, 0xff, 0xb6, 0x8d, 0x03, 0x39, 0xcc, 0x1e, 0x2c, 0xa8, 0x45, 0x76, + 0x1a, 0xb9, 0xad, 0xff, 0x74, 0xc2, 0xcb, 0xc9, 0x6d, 0x32, 0xcb, 0xf8, + 0xb3, 0xbc, 0xc1, 0x56, 0x54, 0x1f, 0x63, 0x9f, 0xdf, 0xe0, 0x1f, 0x3c, + 0x7d, 0x35, 0x97, 0xec, 0xd9, 0xcb, 0xe5, 0x95, 0xf1, 0xed, 0x11, 0x95, + 0xfb, 0xbd, 0xc2, 0xfd, 0x65, 0xfe, 0xdd, 0x71, 0xc6, 0x0c, 0xd6, 0x59, + 0x9c, 0x2e, 0xcc, 0x0c, 0xcf, 0x23, 0x29, 0x33, 0x59, 0xa1, 0x03, 0xa2, + 0x2f, 0x0e, 0x3c, 0x38, 0x4a, 0x1a, 0xdc, 0x84, 0xcf, 0x5e, 0x84, 0x22, + 0xdd, 0x28, 0xbf, 0x68, 0x0e, 0xe0, 0x54, 0x58, 0x2b, 0xcc, 0x46, 0xcb, + 0x2f, 0xff, 0xe2, 0x0b, 0xec, 0xdc, 0x9f, 0x0e, 0xb3, 0x52, 0x12, 0x4b, + 0x2f, 0xd8, 0x59, 0xde, 0x2c, 0xbf, 0xda, 0x76, 0x89, 0xa7, 0xf9, 0x65, + 0x99, 0xe2, 0x61, 0xac, 0x1a, 0x00, 0x79, 0xd8, 0x04, 0x26, 0xbf, 0xcc, + 0xf3, 0x40, 0x77, 0x02, 0xa2, 0xca, 0x5f, 0xfb, 0x3b, 0x2c, 0xfe, 0x7f, + 0x3c, 0x15, 0x97, 0xed, 0x01, 0xdc, 0x0a, 0x8b, 0x4d, 0x7f, 0x87, 0xe7, + 0x9b, 0xc6, 0xd5, 0x94, 0xb1, 0xcd, 0xa5, 0xfe, 0x86, 0xe0, 0xca, 0x3e, + 0x59, 0x7e, 0x0e, 0x69, 0xf8, 0xb2, 0xcc, 0xc6, 0x98, 0xee, 0x21, 0x35, + 0xa3, 0xc3, 0x5c, 0x32, 0xbf, 0x4f, 0x4c, 0x89, 0xe3, 0x3c, 0x67, 0x8a, + 0xcb, 0xe9, 0xe2, 0xc8, 0x64, 0x4f, 0x2b, 0x2a, 0x7a, 0x3f, 0xa6, 0x57, + 0x44, 0xbf, 0xe9, 0xef, 0xc6, 0x28, 0xdd, 0xc0, 0xb2, 0xfc, 0xca, 0xec, + 0x9e, 0x64, 0x2c, 0xbf, 0xc2, 0x37, 0x3b, 0xc3, 0xe2, 0xcb, 0x1a, 0xca, + 0x9e, 0xcf, 0x12, 0x7c, 0xd2, 0xff, 0x46, 0xda, 0x71, 0xec, 0xeb, 0x2f, + 0xff, 0xde, 0x72, 0xec, 0xb3, 0x59, 0x04, 0x59, 0xd5, 0x95, 0x24, 0x42, + 0x99, 0xa5, 0xfb, 0x7b, 0x8f, 0x1a, 0xb2, 0xfd, 0x39, 0xff, 0x9f, 0xc5, + 0x97, 0x66, 0xf5, 0x96, 0xe4, 0x1e, 0x29, 0x16, 0xdf, 0x36, 0x3e, 0xe2, + 0xcb, 0xfc, 0x6d, 0x3d, 0xd8, 0x23, 0x59, 0x7e, 0x82, 0x07, 0xa1, 0x65, + 0xff, 0xd9, 0xdf, 0x1b, 0x73, 0xbc, 0x13, 0x8b, 0x2f, 0xfd, 0x8f, 0xfc, + 0x4b, 0x51, 0x84, 0xb2, 0x80, 0x88, 0x13, 0x45, 0xbe, 0x3d, 0xfe, 0xde, + 0xb2, 0xfb, 0x90, 0x53, 0x2c, 0xbe, 0x8d, 0xd9, 0xb1, 0x65, 0x39, 0xe3, + 0x91, 0x15, 0xfe, 0xdd, 0x3f, 0xe7, 0x3f, 0x82, 0xb2, 0xa4, 0xaa, 0x6f, + 0x08, 0x8d, 0xba, 0x62, 0x6f, 0x11, 0xfe, 0x66, 0x50, 0xa7, 0xe1, 0x17, + 0x5b, 0x77, 0x48, 0x2f, 0xf3, 0x44, 0x6f, 0xed, 0x3f, 0xd6, 0x5f, 0xa7, + 0x6b, 0x41, 0xf2, 0xcb, 0xf1, 0xb1, 0x04, 0x05, 0x95, 0xc3, 0xd2, 0xe9, + 0x5d, 0x42, 0x2a, 0xf2, 0x11, 0x37, 0x8f, 0x36, 0x59, 0x7f, 0xf8, 0x1e, + 0x3f, 0x1e, 0xa2, 0x61, 0x73, 0xcb, 0x2b, 0xc7, 0xce, 0x43, 0x97, 0xbf, + 0x2c, 0x59, 0x71, 0x62, 0xca, 0x9c, 0x6c, 0x7f, 0x1c, 0xbf, 0xf7, 0x0e, + 0x77, 0x9f, 0x51, 0xbe, 0x16, 0x5f, 0xf3, 0x5e, 0x53, 0xe1, 0xf1, 0xe9, + 0x65, 0x6c, 0x8a, 0x1d, 0x12, 0x35, 0x06, 0xfc, 0xfc, 0xec, 0x0d, 0x65, + 0x41, 0xec, 0x04, 0xc6, 0xff, 0x3e, 0xa4, 0xfd, 0x70, 0x2c, 0xbf, 0xfd, + 0x98, 0x59, 0xf9, 0x67, 0x7d, 0x92, 0x59, 0x50, 0x9f, 0x2f, 0xa3, 0x4b, + 0x09, 0x0e, 0xe9, 0x95, 0xfa, 0x25, 0xc6, 0xc9, 0x65, 0xf4, 0x09, 0x1e, + 0x59, 0x71, 0xec, 0xb2, 0xf3, 0xb8, 0x15, 0x16, 0xe2, 0xb6, 0x37, 0xe0, + 0x17, 0xbf, 0xf1, 0xeb, 0xcf, 0x9a, 0xd8, 0xf6, 0x59, 0x7d, 0x34, 0x0f, + 0x16, 0x5f, 0xfb, 0x35, 0x85, 0x3b, 0xd9, 0xf0, 0xab, 0x2f, 0xc5, 0xfb, + 0xfd, 0xc5, 0x95, 0x07, 0xd4, 0xe8, 0x34, 0xc2, 0x72, 0xdf, 0x14, 0x69, + 0x87, 0xc4, 0x4e, 0x7f, 0xc8, 0x46, 0x5f, 0xf9, 0xc6, 0x4f, 0xbf, 0xd1, + 0x37, 0x16, 0x5f, 0x6f, 0x80, 0x12, 0xcb, 0xf8, 0xbf, 0x98, 0xa1, 0xab, + 0x29, 0x84, 0x48, 0xb5, 0x01, 0xc8, 0xef, 0x34, 0x8d, 0x65, 0x89, 0x65, + 0xff, 0x78, 0x2f, 0xcc, 0xc2, 0x61, 0x65, 0xfb, 0x8f, 0xf3, 0x8d, 0x65, + 0x8c, 0x67, 0xc1, 0xd3, 0x8a, 0x84, 0x59, 0x60, 0xdf, 0x9c, 0x2f, 0xfa, + 0x1c, 0xbd, 0x98, 0x40, 0x59, 0x7f, 0xbb, 0xd3, 0xd9, 0xb0, 0x4b, 0x2a, + 0x47, 0xd1, 0x86, 0xb7, 0xf8, 0x82, 0xd8, 0xe7, 0x4d, 0x65, 0xfa, 0x35, + 0xac, 0xdd, 0x59, 0x7b, 0x47, 0xf2, 0xca, 0x83, 0xf9, 0x23, 0x2e, 0x95, + 0x5f, 0xe0, 0x8c, 0xb3, 0x7b, 0xc9, 0x65, 0xff, 0xe8, 0xdb, 0xa6, 0x3c, + 0x29, 0x1f, 0x82, 0xb2, 0xff, 0xa4, 0x7b, 0xf3, 0xce, 0x5b, 0x2c, 0xbd, + 0x19, 0xa5, 0x97, 0xfb, 0xd1, 0x23, 0x9f, 0xc6, 0xac, 0xa1, 0x9e, 0x87, + 0x06, 0xef, 0xd3, 0xbe, 0xe1, 0xb0, 0xb2, 0xb6, 0x3c, 0xef, 0x88, 0xab, + 0xe4, 0x7e, 0x3c, 0x36, 0x2f, 0xfd, 0x9e, 0x3d, 0x0f, 0xd0, 0x40, 0x59, + 0x7f, 0xe2, 0xce, 0xf2, 0x27, 0x77, 0x00, 0xb2, 0xa4, 0x7f, 0x86, 0x7b, + 0x7f, 0xbe, 0x94, 0x17, 0x73, 0xf5, 0x97, 0xdc, 0xfc, 0xfa, 0xb2, 0xa4, + 0xaa, 0x57, 0xc6, 0x8f, 0x1a, 0x2f, 0x21, 0x48, 0x12, 0x11, 0x0d, 0x2f, + 0xcf, 0xae, 0xe7, 0x96, 0x5f, 0xf8, 0xff, 0x89, 0x0f, 0xd0, 0x40, 0x59, + 0x52, 0x3e, 0x5e, 0x93, 0xdf, 0xdd, 0x96, 0x6b, 0x38, 0xb2, 0x96, 0x5e, + 0x0b, 0xf5, 0x65, 0xc1, 0x85, 0x95, 0x23, 0x65, 0xd1, 0xca, 0x59, 0x7d, + 0xf0, 0x0f, 0x4b, 0x2e, 0x6b, 0x3c, 0x44, 0x67, 0xc7, 0xad, 0x21, 0xe8, + 0x5d, 0xf6, 0x0c, 0x86, 0xb2, 0xa0, 0xfb, 0x37, 0xa5, 0xdf, 0xf1, 0x77, + 0xcf, 0x20, 0xb8, 0x8b, 0x2a, 0x13, 0xa3, 0xc2, 0x23, 0x8c, 0x95, 0xc8, + 0xef, 0x98, 0x73, 0xd9, 0x65, 0x8d, 0x65, 0xa7, 0xd6, 0x58, 0xbf, 0x34, + 0x9d, 0x10, 0xbd, 0x3a, 0x79, 0x9e, 0x56, 0x5f, 0xf4, 0x99, 0xe6, 0x80, + 0xee, 0x05, 0x45, 0x0e, 0xa8, 0x46, 0xf1, 0xa3, 0xcc, 0x4e, 0xe5, 0x37, + 0xef, 0xe0, 0x18, 0xd5, 0x97, 0xd1, 0x36, 0x0d, 0x65, 0x68, 0xf2, 0xb8, + 0x51, 0x7f, 0x73, 0x8f, 0xec, 0x02, 0xcb, 0xfe, 0xc8, 0x1f, 0xa3, 0x76, + 0x26, 0x59, 0x7f, 0xbf, 0x3f, 0x7b, 0x3f, 0x75, 0x94, 0xd3, 0xef, 0xfc, + 0xee, 0xff, 0xc5, 0xba, 0xe4, 0xed, 0x1e, 0x0d, 0x65, 0x42, 0x64, 0x18, + 0x44, 0xf0, 0x9c, 0xdd, 0x23, 0xbf, 0xf3, 0x8e, 0x07, 0xe3, 0x23, 0x6a, + 0xcb, 0xff, 0x6f, 0x7d, 0x71, 0xfd, 0xc8, 0xd9, 0x65, 0xfe, 0xe0, 0x41, + 0x9d, 0x28, 0x59, 0x4d, 0x45, 0x7f, 0x8f, 0x3a, 0x83, 0x7b, 0xb8, 0x05, + 0x97, 0x60, 0x16, 0x5b, 0x27, 0x1b, 0x2e, 0x8e, 0x5f, 0xfa, 0x5e, 0x7d, + 0x7d, 0xd8, 0x3d, 0x96, 0x51, 0x1f, 0x40, 0x4a, 0x2f, 0xf4, 0xa3, 0x5b, + 0x46, 0xb6, 0x59, 0x7f, 0xde, 0x01, 0xf3, 0x06, 0xe0, 0x59, 0x7e, 0x7e, + 0x6f, 0xce, 0x2c, 0xa8, 0x44, 0xb6, 0x1a, 0xfe, 0x71, 0x7e, 0x9d, 0xec, + 0xfd, 0xd6, 0x5f, 0xed, 0x47, 0x9c, 0x72, 0x6a, 0xcb, 0xfe, 0x69, 0xf6, + 0x7f, 0x09, 0xd8, 0x59, 0x7f, 0x49, 0xf5, 0x9f, 0x75, 0x65, 0xfc, 0x37, + 0x6f, 0x8c, 0x55, 0x95, 0x07, 0xb9, 0x85, 0xd7, 0xfd, 0x9d, 0xe0, 0x9c, + 0xd3, 0xf1, 0x65, 0xe1, 0xed, 0xb2, 0xcb, 0xf1, 0xf7, 0x8e, 0x6b, 0x2f, + 0xfb, 0x5f, 0xe9, 0xcb, 0xb9, 0xfa, 0xca, 0xd9, 0x3c, 0xd1, 0x95, 0x61, + 0x9e, 0xa1, 0x2e, 0xd2, 0x07, 0x3a, 0xfc, 0x7c, 0x24, 0xd7, 0x84, 0xd4, + 0x96, 0x5f, 0xc2, 0x74, 0x31, 0x9b, 0x2c, 0xbf, 0xbf, 0xf3, 0x9f, 0x82, + 0xb2, 0xa4, 0x7f, 0x73, 0x0f, 0x68, 0xbe, 0xff, 0xe0, 0x14, 0x74, 0xb3, + 0x7e, 0x6a, 0x4b, 0x2f, 0xcf, 0xce, 0x6d, 0xc5, 0x97, 0xb8, 0xd7, 0x59, + 0x7f, 0x89, 0x81, 0x3d, 0xe0, 0xf1, 0x65, 0x4c, 0x7a, 0x41, 0x1c, 0xbf, + 0xf8, 0x3c, 0xf3, 0xca, 0x08, 0x79, 0xe5, 0x97, 0xfc, 0x24, 0x7f, 0x34, + 0xa3, 0x5b, 0x2c, 0xbf, 0x89, 0xfa, 0x24, 0x01, 0x65, 0x34, 0xfa, 0x88, + 0xf6, 0xf8, 0xbf, 0xdb, 0xf5, 0x97, 0xff, 0xfa, 0x6e, 0x18, 0xe7, 0x4c, + 0x65, 0xbd, 0xe6, 0x7e, 0x86, 0x16, 0x56, 0x22, 0xb0, 0xc8, 0x5c, 0x96, + 0xff, 0x72, 0x77, 0x67, 0x0f, 0x09, 0x65, 0xbf, 0x59, 0x63, 0xf8, 0xf2, + 0x74, 0x6f, 0x7e, 0x7f, 0xb9, 0xd3, 0x59, 0x50, 0xac, 0xc7, 0x0c, 0x18, + 0x44, 0x37, 0xbd, 0x11, 0xfa, 0x35, 0x92, 0x76, 0xe1, 0x45, 0xf9, 0xc2, + 0xc4, 0x08, 0xb2, 0xfd, 0x3d, 0xe6, 0xa3, 0x8b, 0x2a, 0x63, 0xd5, 0x22, + 0x9b, 0xfb, 0x3a, 0x63, 0xc6, 0xac, 0xbe, 0x29, 0x1b, 0x56, 0x5a, 0x74, + 0xc7, 0x9a, 0xe5, 0x97, 0xf1, 0x96, 0xf7, 0x99, 0x95, 0x2c, 0xbf, 0xa2, + 0x6f, 0xa5, 0x9b, 0xd6, 0x54, 0xc7, 0xcd, 0xc3, 0x5a, 0x1a, 0x2c, 0xde, + 0x12, 0x17, 0xff, 0xe1, 0xfa, 0x04, 0x67, 0xd2, 0x7f, 0xf9, 0xc8, 0xfd, + 0x25, 0xc3, 0xc5, 0x97, 0xed, 0xa3, 0x67, 0xe2, 0xca, 0xc4, 0x4c, 0x9a, + 0xd3, 0x8b, 0x5f, 0xdb, 0xaf, 0xfb, 0x63, 0x8b, 0x2e, 0x8f, 0xd6, 0x58, + 0x2b, 0x04, 0x2d, 0xeb, 0xc7, 0xd3, 0xfa, 0x45, 0xff, 0xb9, 0xbd, 0xe6, + 0xd9, 0xc9, 0xe6, 0x59, 0x7f, 0xec, 0x1c, 0x4a, 0x34, 0xde, 0xfc, 0xb2, + 0xfe, 0x7f, 0xe6, 0x28, 0x1a, 0xcb, 0xfe, 0x2c, 0xd8, 0x7e, 0xc2, 0xea, + 0xcb, 0xdd, 0x3e, 0x2c, 0xa8, 0x4c, 0x9a, 0x62, 0x36, 0xa1, 0x78, 0xfc, + 0x8b, 0xb8, 0x71, 0x53, 0xd3, 0xa1, 0xfd, 0x9e, 0x4b, 0xa7, 0x89, 0xf3, + 0x28, 0xed, 0x12, 0xd2, 0xa5, 0x19, 0xf8, 0xe5, 0x39, 0x64, 0x7b, 0x8c, + 0x43, 0xbc, 0x10, 0xe2, 0xfa, 0x12, 0xc7, 0x09, 0xa9, 0xa5, 0x61, 0x6a, + 0x53, 0x63, 0x63, 0x1e, 0xf4, 0x74, 0xaf, 0x0f, 0x2f, 0xe1, 0x94, 0x50, + 0xb7, 0xe4, 0x7f, 0x9d, 0x9c, 0x23, 0x0c, 0x32, 0xf7, 0xc6, 0x45, 0x3f, + 0x0c, 0x01, 0x23, 0xbc, 0xbf, 0xff, 0x01, 0x9f, 0xfa, 0xcf, 0x81, 0xe3, + 0xef, 0x1f, 0xe5, 0x94, 0xcd, 0x52, 0x20, 0x63, 0xe9, 0xbe, 0x8d, 0x49, + 0xab, 0x2f, 0xbe, 0xe3, 0xee, 0x2c, 0xbf, 0x60, 0xc3, 0xde, 0x2c, 0xbc, + 0xfa, 0x61, 0x65, 0x99, 0xec, 0x88, 0xd3, 0x22, 0x22, 0x61, 0x4a, 0x2f, + 0xf3, 0x3c, 0xd0, 0x1d, 0xc0, 0xa8, 0xbc, 0xd5, 0x0f, 0xa6, 0xe7, 0x27, + 0x51, 0xc7, 0x23, 0x95, 0xff, 0xd7, 0xd3, 0xf2, 0x3a, 0x8f, 0x91, 0xaa, + 0x7e, 0x8d, 0x78, 0xad, 0x28, 0x6f, 0x21, 0x75, 0xbd, 0x16, 0xff, 0x33, + 0xcd, 0x01, 0xdc, 0x0a, 0x8a, 0x59, 0x73, 0x21, 0x94, 0x59, 0x7e, 0x36, + 0x7c, 0xc3, 0x59, 0x7e, 0xd0, 0x1d, 0xc0, 0xa8, 0xb0, 0x97, 0xdd, 0x81, + 0xe2, 0xcb, 0xff, 0xec, 0x21, 0xc7, 0xa3, 0xee, 0xe1, 0x3b, 0x56, 0x5e, + 0x20, 0x81, 0x65, 0x41, 0xf4, 0xba, 0x6d, 0xb8, 0xb2, 0xfe, 0x0e, 0x8f, + 0x67, 0x6a, 0xcb, 0x33, 0x65, 0x13, 0x65, 0x19, 0x06, 0x14, 0x19, 0xa3, + 0x61, 0x15, 0xc2, 0x09, 0xf1, 0x1b, 0xfc, 0xcf, 0x34, 0x07, 0x70, 0x2a, + 0x2c, 0xb5, 0xa4, 0xb2, 0xed, 0x30, 0xb2, 0xf9, 0x9b, 0x0c, 0xa4, 0xf4, + 0xb2, 0x92, 0x5e, 0x66, 0x23, 0x56, 0x50, 0x0f, 0x6f, 0x86, 0x01, 0x0b, + 0xa6, 0x11, 0x66, 0x42, 0x3c, 0x73, 0xba, 0x3c, 0xb2, 0xdf, 0xac, 0xb9, + 0x8d, 0x96, 0x5b, 0x52, 0x35, 0x78, 0x25, 0x40, 0x3e, 0x77, 0x41, 0xb8, + 0xff, 0x59, 0x7f, 0xcf, 0xf1, 0x67, 0xdd, 0x86, 0x16, 0x5f, 0xed, 0xbe, + 0xe4, 0x0f, 0xa6, 0xb2, 0xfd, 0x19, 0xbe, 0x38, 0xb2, 0xd0, 0xe7, 0xba, + 0x29, 0xad, 0x3a, 0x2f, 0x8a, 0x12, 0xf7, 0xcf, 0x29, 0x0d, 0x65, 0xfc, + 0xfa, 0x8e, 0xbf, 0x96, 0x5e, 0x14, 0x51, 0x52, 0x5f, 0xf4, 0x4b, 0xee, + 0xea, 0x33, 0xe4, 0x8c, 0xcd, 0x05, 0xff, 0x05, 0xfe, 0xce, 0x9f, 0xc2, + 0xac, 0xba, 0x38, 0xb2, 0x86, 0x98, 0x5f, 0x88, 0x89, 0x33, 0x89, 0x9b, + 0xce, 0xee, 0x65, 0x27, 0xa5, 0x97, 0xf1, 0xbf, 0x3f, 0xe0, 0x56, 0x5f, + 0xfc, 0x72, 0x7e, 0x39, 0x04, 0x19, 0xc4, 0x97, 0xff, 0xf7, 0x8f, 0xbe, + 0xce, 0x16, 0x34, 0x3c, 0xf3, 0xc9, 0x65, 0xfe, 0x89, 0x75, 0xfc, 0xe3, + 0x59, 0x7c, 0xfd, 0x63, 0x8b, 0x2a, 0x11, 0xe3, 0x88, 0x5a, 0x5a, 0x73, + 0x2b, 0x49, 0x65, 0xa4, 0xb2, 0xd2, 0x59, 0x78, 0x51, 0x45, 0x59, 0x60, + 0x24, 0x66, 0x68, 0x2a, 0x0f, 0xd9, 0x81, 0x13, 0x11, 0xfc, 0xc6, 0xfe, + 0x0f, 0x3c, 0xf2, 0xc5, 0x97, 0xff, 0xdc, 0x30, 0x61, 0x6a, 0x0b, 0x07, + 0x8c, 0x2c, 0xa6, 0x9f, 0xd7, 0x4b, 0x6d, 0xf2, 0xcb, 0x30, 0xb2, 0xc1, + 0x59, 0x44, 0x68, 0xf8, 0x25, 0x58, 0x7e, 0xfc, 0x22, 0xe9, 0xad, 0xdc, + 0x61, 0x65, 0xb1, 0x65, 0xc1, 0xfe, 0x0d, 0x40, 0xc6, 0x2e, 0x38, 0x59, + 0x7f, 0x14, 0x34, 0xa3, 0x16, 0x5f, 0xfd, 0x0f, 0xae, 0xfb, 0x06, 0x1e, + 0xf1, 0x65, 0xd2, 0x85, 0x97, 0xb8, 0x36, 0x16, 0x56, 0xc8, 0xe4, 0x19, + 0x6c, 0xc2, 0xbe, 0x2a, 0x0a, 0x20, 0x82, 0xd7, 0xff, 0xff, 0xde, 0x8e, + 0xf0, 0xf9, 0xc8, 0xef, 0x8e, 0x35, 0xfb, 0x5e, 0x52, 0xeb, 0x0b, 0x2e, + 0x3f, 0x96, 0x5d, 0x0d, 0x59, 0x7f, 0xfe, 0x82, 0x0c, 0xa5, 0x1d, 0xf6, + 0x34, 0x48, 0xfd, 0x65, 0xff, 0xf1, 0x90, 0x65, 0x9c, 0xd4, 0x1c, 0x9f, + 0x89, 0x2a, 0x48, 0xa3, 0xea, 0xb5, 0xc0, 0x67, 0x0c, 0x92, 0xdd, 0xa1, + 0x2f, 0x22, 0x11, 0xc3, 0x57, 0x23, 0x31, 0x61, 0x30, 0x04, 0x3a, 0x8c, + 0x7d, 0xe1, 0x60, 0x51, 0x96, 0xf2, 0x33, 0xae, 0xad, 0x6f, 0x7f, 0x9f, + 0x17, 0x12, 0x17, 0x37, 0xff, 0x99, 0xb5, 0xe4, 0xcf, 0x34, 0x07, 0x70, + 0x2a, 0x28, 0xc5, 0xf1, 0xf5, 0xe7, 0xd6, 0x5f, 0xcf, 0xaf, 0xdb, 0x1f, + 0xac, 0xbe, 0x8d, 0x47, 0xeb, 0x2a, 0x63, 0xf5, 0xf1, 0x26, 0xf2, 0xfb, + 0xf8, 0x9f, 0xbe, 0x39, 0x96, 0x5f, 0xbd, 0x1b, 0x60, 0xd6, 0x5f, 0x89, + 0xff, 0x81, 0x16, 0x5f, 0xf8, 0xfe, 0x97, 0x0b, 0x3b, 0xe0, 0xac, 0xbf, + 0xe3, 0xd7, 0xb3, 0x0a, 0x5c, 0x59, 0x52, 0x3f, 0x60, 0x1f, 0xdf, 0x3e, + 0xfc, 0x25, 0x95, 0xf1, 0xe2, 0x68, 0x8a, 0xed, 0xcd, 0xd5, 0x97, 0xfe, + 0x79, 0x03, 0xc6, 0xd8, 0xd3, 0x0b, 0x2c, 0xce, 0x13, 0xe8, 0xc3, 0x29, + 0x8b, 0x7c, 0x51, 0xd8, 0x71, 0x04, 0x8c, 0x51, 0xda, 0x93, 0x60, 0xed, + 0xa8, 0xe9, 0x9a, 0xf0, 0xf4, 0xa2, 0x1e, 0x46, 0x1d, 0xd9, 0x56, 0xf7, + 0xff, 0x33, 0x79, 0x33, 0xcd, 0x01, 0xdc, 0x0a, 0x88, 0xe5, 0x7f, 0xf9, + 0x9b, 0x5e, 0x4c, 0xf3, 0x40, 0x77, 0x02, 0xa2, 0x72, 0x5f, 0xe6, 0x79, + 0xa0, 0x3b, 0x81, 0x51, 0x66, 0x2e, 0xef, 0xeb, 0x2f, 0xd9, 0xe2, 0xcd, + 0x2c, 0xbd, 0xb4, 0x69, 0x65, 0xfa, 0x5c, 0x76, 0xb3, 0xf1, 0xed, 0x90, + 0xc7, 0x09, 0xaf, 0xa7, 0x84, 0xf5, 0x3d, 0x4f, 0x05, 0x97, 0xf8, 0x78, + 0xd8, 0xfa, 0x1a, 0xb2, 0xa7, 0xa3, 0xec, 0x9e, 0x07, 0x37, 0xfb, 0x51, + 0xdf, 0x3f, 0xd2, 0x59, 0x7f, 0xff, 0xfd, 0x13, 0x7a, 0x3b, 0x02, 0x1e, + 0xa6, 0x8f, 0x66, 0xfc, 0xf6, 0x0f, 0x7e, 0x2c, 0xaf, 0xd1, 0x6a, 0x46, + 0x97, 0xfd, 0x9c, 0x7e, 0xfe, 0x21, 0x49, 0x65, 0xbf, 0x59, 0x7f, 0x73, + 0x5a, 0xcf, 0xb8, 0xb2, 0xa7, 0xa3, 0xc1, 0xc1, 0x2b, 0xda, 0xc6, 0xac, + 0xbe, 0x32, 0xce, 0x2c, 0xb6, 0x74, 0xde, 0x6e, 0x8e, 0x5f, 0xff, 0xfb, + 0xd0, 0x41, 0xe7, 0x20, 0x4e, 0x99, 0x06, 0x59, 0xce, 0x9a, 0xcb, 0xee, + 0xf4, 0xf4, 0xb2, 0xa4, 0x88, 0xdd, 0x35, 0xde, 0x72, 0x02, 0xcb, 0xdc, + 0x8e, 0x2c, 0xbd, 0xb4, 0xff, 0x16, 0x5d, 0x3d, 0xf9, 0x65, 0x8d, 0x65, + 0xfe, 0x8e, 0x47, 0x76, 0xc1, 0x56, 0x58, 0xda, 0x78, 0x84, 0x21, 0x7f, + 0xe2, 0x1f, 0xa3, 0x9c, 0xcd, 0x42, 0xcb, 0xbf, 0x75, 0x97, 0xec, 0xfb, + 0xb9, 0x0b, 0x2e, 0x9c, 0x22, 0xcb, 0xf0, 0x3c, 0xe6, 0xcb, 0x59, 0x7e, + 0x0f, 0x23, 0x90, 0xb2, 0xb4, 0x7a, 0x4e, 0x57, 0x7f, 0x17, 0xfe, 0xcf, + 0xdd, 0x65, 0xf1, 0x46, 0xf0, 0xac, 0xa3, 0x3d, 0x17, 0x2e, 0xbb, 0xe6, + 0xac, 0xbf, 0xfa, 0x7d, 0xcb, 0xfc, 0xec, 0x11, 0xfe, 0xb2, 0xcc, 0xe7, + 0xa5, 0xd7, 0x08, 0x87, 0x16, 0xc4, 0x72, 0x7b, 0x1b, 0x16, 0x42, 0xd8, + 0x04, 0x7f, 0x0d, 0xcc, 0x39, 0xa2, 0x16, 0xb0, 0x39, 0x33, 0x2c, 0xf4, + 0x85, 0xf8, 0x4e, 0x16, 0xcd, 0xee, 0x53, 0xe4, 0x02, 0x0c, 0x5f, 0xd9, + 0xa0, 0x3b, 0x81, 0x51, 0x6e, 0xaf, 0xcc, 0xc7, 0xe8, 0xd2, 0xca, 0x66, + 0x7c, 0x7e, 0x39, 0xbf, 0x89, 0xd9, 0xeb, 0x6f, 0x2c, 0xbc, 0x7f, 0x7e, + 0xb2, 0xfd, 0xf4, 0xbc, 0x7f, 0xac, 0xbf, 0xfb, 0x4e, 0x0f, 0xc3, 0xce, + 0xc7, 0xc2, 0xac, 0xb8, 0x98, 0x59, 0x7c, 0x07, 0x70, 0x2a, 0x29, 0x05, + 0x61, 0xe2, 0xe8, 0x5e, 0xff, 0x4b, 0xa6, 0x2f, 0x3f, 0x35, 0x97, 0xfe, + 0xcf, 0x1e, 0xff, 0x66, 0x10, 0x16, 0x5f, 0xd9, 0xec, 0xf1, 0xb0, 0xb2, + 0xfd, 0xd8, 0xde, 0x7b, 0xd6, 0x5e, 0x79, 0x33, 0x84, 0xe8, 0xc6, 0x55, + 0x90, 0x8d, 0xf8, 0x87, 0x86, 0xbd, 0x3e, 0xde, 0x5b, 0x7e, 0xcc, 0xe7, + 0x82, 0xb2, 0xff, 0x18, 0xc3, 0xde, 0x34, 0x96, 0x5f, 0x0a, 0xd8, 0xe2, + 0xcb, 0xce, 0x52, 0x59, 0x66, 0x60, 0x56, 0x0f, 0xa3, 0x06, 0xc7, 0x83, + 0xe7, 0xe7, 0x27, 0x09, 0x98, 0xa4, 0x77, 0xff, 0x33, 0x79, 0x33, 0xcd, + 0x01, 0xdc, 0x0a, 0x89, 0x49, 0x5b, 0x33, 0x3b, 0x26, 0x54, 0x6a, 0xd3, + 0xc2, 0x73, 0xf9, 0xe2, 0x92, 0x8e, 0x1b, 0xb2, 0xca, 0xf7, 0x5d, 0x2f, + 0x33, 0x70, 0x2c, 0xbf, 0x8c, 0xb3, 0xd8, 0x05, 0x97, 0xf1, 0x97, 0x70, + 0xc6, 0xb2, 0xe9, 0x75, 0x65, 0xe2, 0x81, 0x56, 0x5d, 0x0c, 0xf4, 0x6c, + 0xc8, 0x5e, 0xa4, 0x88, 0xbe, 0xaf, 0x5e, 0xe0, 0x5a, 0xb2, 0xcc, 0x85, + 0x96, 0x67, 0x24, 0xc2, 0xfe, 0x85, 0xb1, 0x91, 0xcf, 0x8e, 0xde, 0x27, + 0x92, 0xcb, 0xff, 0xc7, 0xf7, 0xfa, 0xc1, 0xc6, 0x8f, 0xef, 0xd6, 0x5f, + 0xb4, 0x07, 0x70, 0x2a, 0x27, 0x65, 0xfd, 0xb3, 0xe8, 0x1a, 0xc5, 0x97, + 0xff, 0x67, 0x89, 0xe4, 0x1f, 0xda, 0xf2, 0x59, 0x79, 0xe4, 0xce, 0x11, + 0xe7, 0x89, 0xae, 0x68, 0x45, 0xd7, 0x6d, 0xb8, 0xb2, 0xff, 0xfc, 0x63, + 0x0b, 0x63, 0x75, 0xc6, 0x50, 0x58, 0x05, 0x97, 0xfa, 0x51, 0xad, 0xa3, + 0x5b, 0x2c, 0xbf, 0xf7, 0x89, 0xe4, 0x1f, 0xda, 0xf2, 0x59, 0x50, 0x7e, + 0x98, 0x6b, 0x7f, 0xfe, 0xcf, 0xa5, 0xe8, 0xe3, 0xea, 0x37, 0x7c, 0xe0, + 0x59, 0x66, 0x78, 0xaa, 0xd9, 0xb1, 0x87, 0x79, 0x31, 0xc6, 0xca, 0x19, + 0x3b, 0xa4, 0x17, 0xc7, 0xa8, 0xde, 0xb2, 0xec, 0xf2, 0xcb, 0xff, 0xa7, + 0xdc, 0xbf, 0xce, 0xc1, 0x1f, 0xeb, 0x2c, 0xcf, 0x87, 0xff, 0x3e, 0x46, + 0x20, 0xb5, 0xff, 0xce, 0xdf, 0x60, 0x1f, 0xd0, 0x24, 0x96, 0x5e, 0x31, + 0xba, 0xcb, 0xff, 0x8b, 0x3c, 0xfb, 0x67, 0x09, 0xfe, 0x59, 0x74, 0xfb, + 0x31, 0xa2, 0x8b, 0xc8, 0x9c, 0x1b, 0xa8, 0x5e, 0x36, 0x94, 0x65, 0x2d, + 0x96, 0x09, 0xc8, 0x75, 0xcf, 0xc3, 0x76, 0xff, 0xdc, 0x82, 0xfb, 0xfe, + 0x72, 0x3f, 0x59, 0x7f, 0xff, 0xff, 0xde, 0x3e, 0xbb, 0xfd, 0xce, 0x72, + 0x1b, 0x1e, 0xcc, 0xdb, 0x0b, 0x3e, 0xef, 0x23, 0xe5, 0x97, 0xfa, 0x24, + 0x7d, 0x32, 0x92, 0xcb, 0xff, 0xff, 0x00, 0x3b, 0x66, 0xf8, 0xfb, 0x06, + 0xf2, 0x11, 0xbc, 0xc7, 0x1a, 0xcb, 0xe1, 0xbf, 0x59, 0xe2, 0x6e, 0xc0, + 0x41, 0xd4, 0x25, 0x38, 0x63, 0x7f, 0xf4, 0xdf, 0x70, 0xdb, 0x38, 0x4d, + 0x66, 0xcb, 0x2f, 0x80, 0xee, 0x05, 0x44, 0x58, 0xbf, 0x8f, 0x4e, 0x40, + 0x85, 0x95, 0xa3, 0xd9, 0xf1, 0x75, 0xff, 0x9e, 0x4c, 0xf3, 0x40, 0x77, + 0x02, 0xa2, 0x5d, 0x5f, 0xff, 0xd8, 0x3f, 0x40, 0x8c, 0xfa, 0x4f, 0xff, + 0x39, 0x1f, 0xa4, 0xb3, 0x38, 0x4d, 0xc7, 0x21, 0x48, 0xd2, 0x29, 0xf4, + 0xcb, 0xff, 0x9a, 0xf2, 0x67, 0x9a, 0x03, 0xb8, 0x15, 0x13, 0x12, 0xfe, + 0xf4, 0x17, 0xd3, 0x3a, 0xcb, 0xfc, 0xe7, 0x3e, 0x7f, 0xe0, 0xd6, 0x5f, + 0x60, 0x21, 0x9c, 0x1f, 0x1f, 0x8b, 0xa9, 0x9a, 0x3b, 0xbd, 0x0b, 0x5b, + 0xf6, 0x80, 0xee, 0x05, 0x45, 0x52, 0xb6, 0x2c, 0xac, 0x3c, 0x46, 0x0d, + 0x2f, 0xfc, 0x17, 0xd4, 0x8b, 0x05, 0x7f, 0xd6, 0x5f, 0xfc, 0xfc, 0xd1, + 0x8b, 0xdf, 0x1e, 0xa4, 0xb2, 0xff, 0xb4, 0xfe, 0xfa, 0x59, 0xd6, 0x63, + 0x44, 0x27, 0x8f, 0xe9, 0x9a, 0x3e, 0x9e, 0x14, 0xd7, 0xfe, 0x79, 0x33, + 0xcd, 0x01, 0xdc, 0x0a, 0x89, 0xd1, 0x7d, 0xc3, 0xf8, 0x55, 0x94, 0xd3, + 0xf0, 0xfd, 0x32, 0xf9, 0xcb, 0xbc, 0x59, 0x7d, 0xb1, 0x46, 0xcb, 0x2f, + 0x9b, 0x0c, 0x33, 0x69, 0xe2, 0x04, 0x86, 0x99, 0xa2, 0x8c, 0xd9, 0xef, + 0xf1, 0xbe, 0xa2, 0x4f, 0xbd, 0x65, 0xf1, 0x97, 0xe6, 0xb2, 0xfd, 0x34, + 0x4d, 0x1c, 0x59, 0x7f, 0x0b, 0x87, 0xbf, 0x09, 0x65, 0x19, 0xeb, 0xf0, + 0xa6, 0xf1, 0xfa, 0x16, 0x33, 0x34, 0x37, 0xff, 0x07, 0x9d, 0x8f, 0x99, + 0x86, 0x63, 0x6a, 0xca, 0x92, 0x61, 0xed, 0x84, 0xcf, 0x8b, 0x6f, 0xfc, + 0xf2, 0x67, 0x9a, 0x03, 0xb8, 0x15, 0x13, 0xba, 0xfd, 0xd0, 0xbb, 0x4d, + 0x25, 0xff, 0x8a, 0x3b, 0x9c, 0xcc, 0xfa, 0x4b, 0x28, 0x6a, 0x8a, 0x32, + 0x34, 0x26, 0x9b, 0x3a, 0x67, 0x49, 0xef, 0xf8, 0x71, 0x28, 0x66, 0x2f, + 0x3f, 0x59, 0x7e, 0xe1, 0x47, 0xfc, 0x59, 0x78, 0xb0, 0x6b, 0x2e, 0x86, + 0x70, 0x78, 0x7f, 0x94, 0x53, 0x34, 0x7f, 0xe2, 0x81, 0x42, 0x02, 0xfd, + 0xc6, 0x60, 0xec, 0x2c, 0xbf, 0xfc, 0xcd, 0xaf, 0x26, 0x79, 0xa0, 0x3b, + 0x81, 0x51, 0x42, 0xaf, 0xff, 0x9f, 0xb2, 0xc2, 0x31, 0xb3, 0xe6, 0xd1, + 0xa5, 0x97, 0xe6, 0x7b, 0x35, 0xc5, 0x59, 0x7f, 0xff, 0xf0, 0x5a, 0xd7, + 0x93, 0x30, 0x78, 0x3d, 0x82, 0xcd, 0x98, 0x0c, 0x4c, 0xb2, 0xa4, 0x8a, + 0x3f, 0x16, 0x5f, 0x83, 0xf7, 0x4c, 0x0b, 0x2f, 0xd9, 0xfe, 0x39, 0x2c, + 0xbe, 0xe1, 0x8b, 0xd5, 0x97, 0xa3, 0xf6, 0x7b, 0x1f, 0x91, 0x14, 0xf4, + 0x9a, 0x8d, 0x1b, 0x05, 0x09, 0x5b, 0xfe, 0x6b, 0xf3, 0x05, 0x82, 0x1a, + 0xcb, 0xff, 0x3c, 0x99, 0xe6, 0x80, 0xee, 0x05, 0x45, 0x24, 0xbf, 0xd9, + 0xe2, 0xc1, 0xf8, 0x2b, 0x2f, 0x41, 0x0d, 0x65, 0x99, 0xe2, 0x34, 0x5a, + 0x71, 0xd4, 0xc1, 0x4c, 0xaf, 0xff, 0xfb, 0x08, 0x3c, 0x8c, 0x2e, 0x93, + 0xb1, 0x93, 0x41, 0x0d, 0x65, 0xcd, 0x25, 0x97, 0xff, 0x4d, 0xe7, 0x6f, + 0x7d, 0x1d, 0x0b, 0x56, 0x5f, 0x61, 0x46, 0xcb, 0x2b, 0x0f, 0x9f, 0x48, + 0xd7, 0xb3, 0x8c, 0xc9, 0x30, 0x1e, 0x31, 0x88, 0xfb, 0x50, 0xcd, 0xfb, + 0xda, 0x3c, 0xc9, 0x46, 0x74, 0x08, 0xda, 0x35, 0x19, 0xe3, 0x65, 0xa5, + 0xb9, 0xaf, 0xe5, 0x44, 0xb5, 0xd8, 0xf3, 0x03, 0x0f, 0x79, 0xf8, 0xd1, + 0xaf, 0xf3, 0x3c, 0xd0, 0x1d, 0xc0, 0xa8, 0x89, 0x17, 0xb4, 0xfa, 0x59, + 0x7f, 0xe7, 0x93, 0x3c, 0xd0, 0x1d, 0xc0, 0xa8, 0x97, 0x96, 0x66, 0x67, + 0xd0, 0xd1, 0xcb, 0xff, 0xa3, 0x7b, 0xcc, 0x7a, 0xfa, 0x51, 0x32, 0xcb, + 0xd3, 0xd3, 0x7f, 0x59, 0x74, 0xc4, 0xb2, 0xff, 0xf7, 0xa3, 0x82, 0x0e, + 0x35, 0x36, 0x17, 0xeb, 0x2f, 0xb4, 0x1e, 0xf1, 0x65, 0xfb, 0x5f, 0xb4, + 0xf8, 0xb2, 0xf4, 0x17, 0xcb, 0x2f, 0xdd, 0x11, 0xa5, 0x0b, 0x2c, 0x7e, + 0x3c, 0x42, 0x1c, 0xbf, 0xfd, 0xed, 0xf0, 0x5f, 0xee, 0x60, 0xf3, 0x5f, + 0x2c, 0xbf, 0xc7, 0xa7, 0x19, 0x93, 0x0b, 0x2e, 0x8e, 0xac, 0xbf, 0xe7, + 0xdb, 0x51, 0xf4, 0x8d, 0xab, 0x2f, 0xff, 0x04, 0x67, 0xa1, 0x26, 0xdd, + 0x0b, 0x94, 0xcb, 0x2a, 0x49, 0xa4, 0x19, 0x37, 0x94, 0x3f, 0x32, 0x21, + 0x6e, 0x1d, 0x5f, 0xdf, 0xfa, 0x34, 0x6d, 0x59, 0x7f, 0xe9, 0xb9, 0x1b, + 0xdf, 0xd1, 0xf4, 0xcb, 0x2a, 0x0f, 0xc5, 0xcb, 0xaf, 0x8f, 0x74, 0x46, + 0xac, 0xbf, 0x66, 0xd9, 0xc6, 0xac, 0xbf, 0x9f, 0x67, 0xe3, 0xfe, 0xb2, + 0xff, 0xe9, 0xa7, 0x08, 0x51, 0xbd, 0xf7, 0xc4, 0xcb, 0x29, 0x65, 0xf7, + 0x73, 0x53, 0x2c, 0xbd, 0xd7, 0xde, 0xb2, 0xd2, 0xc3, 0xc1, 0x72, 0x3b, + 0xf3, 0xf2, 0x37, 0xe2, 0xca, 0x98, 0xf3, 0xb7, 0x93, 0x54, 0x26, 0x17, + 0x89, 0x8f, 0x09, 0xab, 0xb5, 0x0b, 0x2a, 0x4b, 0x9b, 0x83, 0x4c, 0x32, + 0x39, 0xa3, 0xb5, 0xd4, 0x32, 0x3c, 0x40, 0x44, 0xdd, 0x28, 0xdf, 0x19, + 0xce, 0xe9, 0x9d, 0xd8, 0x4b, 0x2f, 0xe9, 0xdc, 0xf6, 0x1f, 0x56, 0x50, + 0xcf, 0x10, 0xc5, 0x6e, 0x1f, 0xcb, 0x2f, 0xe2, 0x0f, 0x66, 0x86, 0x16, + 0x5e, 0x65, 0x9e, 0x96, 0x58, 0xdc, 0xf3, 0xc2, 0x5f, 0x7f, 0x83, 0xdf, + 0x14, 0x66, 0x96, 0x5f, 0x8b, 0x36, 0x13, 0x7a, 0xcb, 0xec, 0xd8, 0x4d, + 0xeb, 0x2f, 0xc3, 0x8f, 0x86, 0xf3, 0x8f, 0x44, 0x8a, 0xef, 0xff, 0x8f, + 0x53, 0xbd, 0x07, 0xde, 0x04, 0x01, 0x85, 0x97, 0xc7, 0xb7, 0xfb, 0x8b, + 0x2f, 0x3b, 0x81, 0x51, 0x4b, 0xa9, 0x65, 0x00, 0xd9, 0xcc, 0x51, 0x7c, + 0x5d, 0x8d, 0x2c, 0xbf, 0xec, 0xd6, 0xe6, 0x0f, 0x35, 0xf2, 0xca, 0x33, + 0xdd, 0xde, 0x43, 0x7f, 0xe8, 0x97, 0x9c, 0xfe, 0xe4, 0x30, 0xb2, 0xb6, + 0x54, 0x9f, 0x28, 0x41, 0xb0, 0x81, 0x32, 0x8e, 0x96, 0xbc, 0xfe, 0x44, + 0x77, 0xa3, 0x5d, 0x59, 0x7f, 0x0f, 0xe8, 0xd1, 0xfc, 0xb2, 0xfb, 0xbb, + 0x60, 0xab, 0x2a, 0x47, 0xde, 0x63, 0x84, 0x5f, 0x7e, 0x36, 0x35, 0x9c, + 0x59, 0x7f, 0xe8, 0x28, 0xf4, 0xe0, 0x90, 0x40, 0xb2, 0xf0, 0x5f, 0x8b, + 0x2f, 0xa6, 0x0b, 0xcc, 0xb2, 0xfd, 0x1f, 0xbf, 0xdc, 0x59, 0x78, 0x8f, + 0xf5, 0x97, 0xb3, 0xbc, 0x59, 0x50, 0x6e, 0x38, 0x39, 0x52, 0x4c, 0xa0, + 0x65, 0x13, 0x1f, 0xf8, 0x73, 0xf2, 0x4e, 0xb0, 0xdf, 0xb7, 0x1c, 0x87, + 0xba, 0xb2, 0x96, 0x5f, 0xb9, 0xdd, 0x47, 0x16, 0x5a, 0x3e, 0x36, 0x7d, + 0x0b, 0xbf, 0xef, 0xf9, 0xa8, 0xfa, 0x46, 0xd5, 0x97, 0xba, 0xfb, 0xd6, + 0x5f, 0xb6, 0x0c, 0xd1, 0xb8, 0xb2, 0xf8, 0x33, 0x46, 0xe2, 0xcb, 0x9f, + 0x69, 0xc7, 0xa7, 0xb1, 0x6d, 0x42, 0x37, 0x5c, 0xec, 0x2e, 0x37, 0xfd, + 0x07, 0xff, 0x21, 0xaf, 0xd5, 0x97, 0xfc, 0x7c, 0x98, 0xcb, 0xb1, 0xfa, + 0xcb, 0xff, 0x8b, 0xbb, 0xe3, 0x5c, 0x72, 0x8d, 0xc5, 0x95, 0x24, 0x73, + 0x68, 0xb9, 0xa7, 0x1c, 0x39, 0xbf, 0xd1, 0xb9, 0xc8, 0x6b, 0xf5, 0x65, + 0xce, 0x4b, 0x2f, 0xfa, 0x3f, 0x9d, 0xe8, 0x6b, 0x92, 0xca, 0xf8, 0xf3, + 0xf7, 0x8a, 0xdf, 0xff, 0x60, 0xc4, 0x9b, 0x9d, 0xf6, 0x0c, 0x3d, 0xe2, + 0xca, 0x92, 0x3f, 0x35, 0x08, 0x4f, 0x12, 0xdf, 0xd0, 0x29, 0xf8, 0x3b, + 0x8b, 0x2f, 0xef, 0xa5, 0xc7, 0x2f, 0x96, 0x54, 0x2e, 0x0c, 0x49, 0x83, + 0x23, 0xea, 0x38, 0xce, 0x74, 0x6a, 0x21, 0x8d, 0xff, 0x8a, 0x69, 0xda, + 0x8f, 0xa4, 0x6d, 0x59, 0x7f, 0xfb, 0x7c, 0x17, 0x7b, 0xec, 0x18, 0x7b, + 0xc5, 0x97, 0x43, 0x56, 0x54, 0x22, 0x93, 0x10, 0xb4, 0x99, 0x7f, 0x41, + 0x4d, 0xd3, 0x61, 0x65, 0xff, 0x4b, 0x35, 0x36, 0x14, 0x35, 0x65, 0xfb, + 0xf8, 0x06, 0x35, 0x65, 0xfe, 0xcd, 0xb9, 0x13, 0x07, 0x4b, 0x28, 0xd1, + 0x2b, 0xa3, 0x82, 0x28, 0xba, 0x58, 0xb2, 0xfd, 0xc6, 0x34, 0xe2, 0xac, + 0xbc, 0x50, 0xd5, 0x94, 0x33, 0xc5, 0xd1, 0x55, 0xf7, 0xdb, 0x99, 0x25, + 0x97, 0xf9, 0xf5, 0x36, 0x77, 0x77, 0x7a, 0xcb, 0xd1, 0xff, 0x16, 0x54, + 0x26, 0x4e, 0x32, 0xec, 0x5b, 0x72, 0x20, 0x93, 0x0a, 0x73, 0x7c, 0xfe, + 0x7d, 0x96, 0x5f, 0xbc, 0x16, 0x30, 0x96, 0x5f, 0xe1, 0x49, 0xfb, 0x27, + 0x1a, 0xcb, 0xf7, 0x44, 0xda, 0x3c, 0xb2, 0xff, 0xa3, 0xdc, 0x7e, 0xc6, + 0xb7, 0x56, 0x5f, 0xf9, 0xae, 0x31, 0x26, 0x94, 0x17, 0xcb, 0x28, 0x67, + 0xf8, 0x67, 0x77, 0xf0, 0x7d, 0x1a, 0xcf, 0xd6, 0x5f, 0x6b, 0xf1, 0x37, + 0xac, 0xbc, 0x62, 0xf5, 0x65, 0x48, 0xfc, 0xbc, 0x5d, 0xc2, 0x7a, 0xd9, + 0x3e, 0x51, 0x91, 0x7c, 0x51, 0x31, 0x9f, 0xa1, 0x4d, 0xd8, 0x49, 0xdf, + 0xe2, 0xee, 0x70, 0xdf, 0xcb, 0x2f, 0xb9, 0x2e, 0x3a, 0xcb, 0xfe, 0xfc, + 0xfd, 0x9a, 0x79, 0xb8, 0xb2, 0xff, 0xfa, 0x45, 0x1b, 0x09, 0x37, 0x3d, + 0x9b, 0xba, 0xfd, 0x65, 0xe9, 0x0f, 0x7a, 0xca, 0x83, 0xf6, 0x75, 0x7b, + 0xfa, 0x73, 0x73, 0xaf, 0xd5, 0x97, 0xf7, 0x8c, 0x67, 0xa0, 0x2c, 0xb0, + 0x16, 0x5b, 0x98, 0x7d, 0xa0, 0x2f, 0x72, 0xdb, 0xdf, 0x4d, 0xc5, 0x95, + 0xf1, 0xe9, 0x39, 0x9d, 0xe8, 0x31, 0xac, 0xa8, 0x54, 0x3e, 0x33, 0x1f, + 0x88, 0x9b, 0x0b, 0x07, 0x86, 0xff, 0x08, 0xaf, 0xf6, 0x0b, 0x23, 0xe0, + 0x5a, 0xb2, 0xed, 0xfc, 0x59, 0x7f, 0x07, 0x91, 0x30, 0x74, 0xb2, 0xfd, + 0x9b, 0x67, 0xb8, 0xb2, 0xa0, 0xfc, 0x3c, 0x32, 0x45, 0xf7, 0xb3, 0x5c, + 0x59, 0x40, 0x3c, 0x9d, 0xe5, 0xb7, 0xfd, 0xfc, 0x7e, 0x26, 0xf8, 0x2d, + 0xd5, 0x97, 0xff, 0xed, 0xa3, 0xb1, 0xe3, 0xec, 0x8f, 0x40, 0xf4, 0x2c, + 0xa8, 0x4e, 0x9b, 0x21, 0xda, 0x64, 0x8e, 0x81, 0x7f, 0xff, 0xda, 0xf8, + 0x07, 0xf4, 0xe6, 0x1e, 0x77, 0x3c, 0xe0, 0x82, 0x1a, 0xcb, 0xfe, 0x7e, + 0x09, 0xdf, 0x80, 0x6d, 0x59, 0x6f, 0x42, 0x2a, 0x02, 0xdb, 0x7c, 0x6c, + 0x4f, 0xe2, 0xcb, 0xf8, 0x4e, 0xc6, 0xc5, 0xf2, 0xcb, 0xc4, 0x6d, 0x59, + 0x5a, 0x3f, 0x0f, 0xc9, 0x7a, 0x61, 0x7f, 0x8a, 0x1c, 0xbb, 0x84, 0xb2, + 0xff, 0x47, 0xdc, 0xdc, 0x8d, 0x30, 0xb2, 0xff, 0x79, 0xe6, 0x3d, 0x46, + 0xcb, 0x2f, 0xec, 0xdd, 0x6c, 0x67, 0x56, 0x5d, 0x8d, 0x59, 0x43, 0x4e, + 0xa3, 0x21, 0x30, 0xd3, 0x0f, 0x17, 0xb9, 0xc0, 0x4d, 0x37, 0x97, 0xdf, + 0xb7, 0x4d, 0xb1, 0xc5, 0x97, 0xe7, 0xdf, 0x9a, 0xe2, 0xca, 0x19, 0xe9, + 0xb4, 0xaa, 0xfd, 0xe7, 0x23, 0x6a, 0xcb, 0xe6, 0x26, 0xe4, 0x2c, 0xbf, + 0xbf, 0xfb, 0xfc, 0xd6, 0x2c, 0xbf, 0x81, 0x07, 0xd3, 0x92, 0xcb, 0xf9, + 0xff, 0x6c, 0x67, 0x56, 0x54, 0x22, 0x27, 0x0c, 0x0c, 0xb2, 0xf8, 0x7e, + 0x7f, 0x96, 0x5f, 0xdf, 0xf2, 0x3d, 0x1c, 0x59, 0x50, 0x7a, 0x2e, 0x47, + 0x7e, 0xfb, 0xbc, 0xcd, 0x96, 0x5d, 0x9b, 0x2c, 0xa7, 0x3c, 0x12, 0x2a, + 0xa8, 0x4f, 0xd3, 0x08, 0x8c, 0x9b, 0xd0, 0xad, 0x27, 0xee, 0x30, 0xdd, + 0xf8, 0x16, 0x5b, 0x8b, 0x2e, 0x36, 0x38, 0x6a, 0x42, 0x31, 0x7b, 0xf7, + 0x02, 0xcb, 0xe1, 0x66, 0xe4, 0x2c, 0xbe, 0x7d, 0xa3, 0xab, 0x2f, 0xce, + 0x47, 0xb9, 0xbd, 0x65, 0xb8, 0x47, 0x9b, 0xbc, 0x8a, 0xfd, 0xb3, 0xf3, + 0x24, 0xb2, 0xff, 0xf8, 0x79, 0xbd, 0xf5, 0x30, 0x92, 0x7e, 0xbb, 0x56, + 0x5d, 0x9b, 0x8b, 0x2a, 0x11, 0x28, 0x65, 0x1a, 0x53, 0xbf, 0x9f, 0xef, + 0xda, 0x7c, 0x59, 0x50, 0x9d, 0x47, 0xc3, 0xb3, 0x38, 0xea, 0x17, 0xbe, + 0x2e, 0xbf, 0x8c, 0x57, 0x9a, 0x1a, 0xb2, 0xf6, 0xec, 0x71, 0x65, 0x74, + 0xf3, 0x42, 0x5d, 0x66, 0x6c, 0x97, 0x44, 0x47, 0x3c, 0xa4, 0x4f, 0x12, + 0x38, 0x9c, 0xf3, 0xda, 0x1c, 0xf2, 0x21, 0x1b, 0x3e, 0x4a, 0x75, 0xfa, + 0x1b, 0x87, 0x1a, 0xac, 0xd3, 0x8e, 0x5a, 0x8c, 0x21, 0xa5, 0xde, 0x8f, + 0xa9, 0xe5, 0x1d, 0xff, 0x2a, 0x10, 0xa5, 0x04, 0x72, 0x54, 0x7f, 0x65, + 0x58, 0xcf, 0xc2, 0x08, 0x48, 0xf5, 0x77, 0x61, 0x3d, 0x7e, 0xd0, 0x1d, + 0xc0, 0xa8, 0xa7, 0x17, 0xf7, 0x8d, 0xa4, 0xec, 0x2c, 0xb3, 0x3c, 0x3e, + 0x13, 0x34, 0xbf, 0xa1, 0xb9, 0xbb, 0x1d, 0x59, 0x7d, 0xe8, 0x26, 0x16, + 0x53, 0x4f, 0x47, 0xa5, 0xf7, 0xd9, 0xc1, 0x24, 0xb2, 0xff, 0xc7, 0xa7, + 0xe7, 0xb3, 0x08, 0x0b, 0x2f, 0xcd, 0xd6, 0xb3, 0x8b, 0x2f, 0xff, 0xde, + 0x0f, 0x75, 0x1d, 0xe6, 0x03, 0x91, 0xa0, 0x2c, 0xbf, 0xee, 0x1b, 0x19, + 0x28, 0xff, 0x8b, 0x2f, 0xf4, 0x74, 0xc0, 0x63, 0x85, 0x97, 0xff, 0xec, + 0x98, 0x8f, 0x9d, 0x81, 0x0f, 0x53, 0x47, 0x96, 0x56, 0x91, 0x0f, 0xd3, + 0x1b, 0xfb, 0xe9, 0x43, 0x43, 0x32, 0xcb, 0xf9, 0xa3, 0x8e, 0x04, 0x96, + 0x5e, 0xef, 0x8d, 0x65, 0x41, 0xfc, 0x99, 0x83, 0x96, 0xdf, 0xcf, 0xf7, + 0x27, 0x70, 0x45, 0x97, 0xee, 0xfd, 0x28, 0x15, 0x65, 0xfc, 0xe2, 0x66, + 0xf8, 0xe2, 0xca, 0xc3, 0xd9, 0x09, 0x55, 0xff, 0x8f, 0xee, 0x16, 0x0f, + 0xce, 0x2a, 0xcb, 0xff, 0xec, 0xdb, 0x3e, 0xef, 0x0c, 0xa3, 0xf7, 0x6a, + 0xca, 0x61, 0x11, 0xfc, 0x3f, 0xbf, 0xf6, 0x7a, 0x35, 0x8c, 0xc5, 0x14, + 0x54, 0x97, 0x18, 0xab, 0x2e, 0xd9, 0x9c, 0x2e, 0x20, 0xc8, 0x88, 0x64, + 0x78, 0x78, 0x02, 0x8f, 0x95, 0x8e, 0x18, 0x3e, 0x84, 0xe7, 0xe5, 0x85, + 0x08, 0xbe, 0xc2, 0xc2, 0x7c, 0x93, 0x75, 0x0e, 0xfd, 0xa0, 0x3b, 0x81, + 0x51, 0x5e, 0x2f, 0xff, 0xec, 0x1f, 0xa0, 0x46, 0x7d, 0x27, 0xff, 0x9c, + 0x8f, 0xd2, 0x59, 0x9e, 0x22, 0x4e, 0x7c, 0xd2, 0xff, 0xe6, 0x6f, 0x26, + 0x79, 0xa0, 0x3b, 0x81, 0x51, 0x23, 0xae, 0xc6, 0xac, 0xbb, 0xb8, 0xb2, + 0x80, 0x6b, 0x3e, 0x16, 0xbf, 0xff, 0xf1, 0x3b, 0x3d, 0xfd, 0x81, 0xc0, + 0x59, 0x7a, 0x8e, 0x9f, 0xf1, 0x25, 0x97, 0x8f, 0xf8, 0x59, 0x78, 0x18, + 0xd4, 0x8c, 0xcb, 0xcb, 0xec, 0x7f, 0xbf, 0x59, 0x7c, 0x07, 0x70, 0x2a, + 0x24, 0x85, 0x6c, 0x7a, 0x3a, 0x23, 0xbf, 0xff, 0x1e, 0x8f, 0x76, 0x0b, + 0x68, 0xe9, 0xf9, 0xf6, 0x59, 0x7e, 0x79, 0x74, 0xf6, 0x59, 0x50, 0x7f, + 0xe6, 0xaf, 0x7f, 0xf9, 0xfb, 0x37, 0x30, 0x63, 0x0b, 0xea, 0x4b, 0x2f, + 0xff, 0x9f, 0xee, 0x67, 0x9c, 0xb3, 0x66, 0x87, 0xcb, 0x2f, 0xfe, 0xf1, + 0xfd, 0xdc, 0xfb, 0xba, 0xd4, 0x2c, 0xbf, 0xf8, 0xe1, 0xae, 0x31, 0x37, + 0x60, 0xa4, 0xb2, 0xb1, 0x1b, 0x80, 0x50, 0xf2, 0x35, 0xff, 0xe2, 0xcf, + 0xe7, 0xf3, 0x51, 0xb3, 0xe8, 0x0b, 0x2f, 0xf6, 0x79, 0xda, 0x51, 0xf2, + 0xcb, 0xa4, 0xce, 0x15, 0x8a, 0xe3, 0xf7, 0xa1, 0x45, 0xf9, 0x07, 0x23, + 0x27, 0xe9, 0x78, 0x89, 0xb7, 0xe0, 0xfc, 0x03, 0xe2, 0xcb, 0xf6, 0x79, + 0x9e, 0x35, 0x65, 0x99, 0xc2, 0xe4, 0xb8, 0x08, 0x9e, 0x5d, 0x27, 0xef, + 0xfd, 0x29, 0xbf, 0xf9, 0x9b, 0xc9, 0x9e, 0x68, 0x0e, 0xe0, 0x54, 0x49, + 0x4b, 0xf6, 0x80, 0xee, 0x05, 0x45, 0xe2, 0xbf, 0xe9, 0x33, 0xcd, 0x01, + 0xdc, 0x0a, 0x89, 0x35, 0x66, 0x78, 0x7f, 0x6e, 0x69, 0x7c, 0x0f, 0x19, + 0x2c, 0xbf, 0x73, 0x98, 0x58, 0xb2, 0xff, 0xb4, 0x08, 0xdb, 0x30, 0xba, + 0xb2, 0xfe, 0x8e, 0x1b, 0x62, 0x65, 0x97, 0xce, 0x7f, 0x71, 0x65, 0xbc, + 0xb2, 0xb1, 0x17, 0xc6, 0x4c, 0xd3, 0x8f, 0x16, 0x8a, 0x45, 0x7f, 0x8f, + 0xfc, 0x28, 0xfb, 0x8b, 0x2f, 0x6f, 0x89, 0x2c, 0xbf, 0x47, 0x79, 0x9d, + 0x59, 0x79, 0xc8, 0x78, 0x78, 0xbe, 0x1e, 0xbf, 0xe7, 0xd4, 0xb9, 0x81, + 0xd6, 0xcb, 0x28, 0xcf, 0xac, 0x26, 0x37, 0xfd, 0x9f, 0x8f, 0xd0, 0x50, + 0x2a, 0xcb, 0xef, 0xf9, 0x84, 0xb2, 0xa0, 0xf6, 0xcc, 0xe6, 0xff, 0xc1, + 0x07, 0x38, 0xfa, 0xec, 0x30, 0xb2, 0xfd, 0xee, 0xf3, 0x3a, 0xb2, 0x8c, + 0xfa, 0x1d, 0x02, 0xff, 0xfd, 0xe7, 0x3f, 0xf9, 0x8c, 0x3b, 0x75, 0x18, + 0x4b, 0x2e, 0x31, 0xac, 0xa8, 0x3e, 0xaf, 0x2a, 0x5f, 0x48, 0x31, 0xf2, + 0xcb, 0xfe, 0xd8, 0xf9, 0xc7, 0xff, 0xc1, 0x59, 0x7f, 0x1e, 0x86, 0x51, + 0xf2, 0xcb, 0xff, 0xe0, 0xbf, 0xd9, 0x8c, 0x30, 0xf2, 0xcf, 0xba, 0xb2, + 0xfe, 0xf6, 0x67, 0x7d, 0x8b, 0x2f, 0xfa, 0x25, 0xcd, 0x69, 0xcb, 0xab, + 0x2a, 0x4a, 0x9d, 0x07, 0x08, 0x80, 0x42, 0x2a, 0x62, 0x1d, 0x11, 0xf8, + 0xef, 0x85, 0xbd, 0x52, 0xde, 0x59, 0x7f, 0x67, 0x7b, 0x05, 0xb2, 0xcb, + 0xf6, 0x0d, 0x95, 0xcb, 0x71, 0x65, 0xfc, 0xe5, 0xfb, 0x2b, 0x96, 0xe2, + 0xcb, 0x9c, 0x7b, 0xcf, 0xa2, 0x7c, 0xc6, 0xbc, 0x8c, 0x70, 0xc2, 0x56, + 0xf3, 0x90, 0x16, 0x5e, 0xf4, 0x08, 0xb2, 0xba, 0x6e, 0x05, 0x1b, 0xbf, + 0x89, 0xff, 0x27, 0x6a, 0xcb, 0xfa, 0x07, 0xed, 0xc3, 0x25, 0x97, 0xfd, + 0x0d, 0xf6, 0x0c, 0x67, 0xf2, 0xca, 0xc3, 0xe8, 0x32, 0xfb, 0xed, 0xd3, + 0x86, 0x16, 0x5e, 0x97, 0xcc, 0x2c, 0xbf, 0x9b, 0xdf, 0x07, 0xbc, 0x59, + 0x78, 0x23, 0xf9, 0x65, 0xff, 0xcf, 0xf8, 0x3c, 0x7a, 0x23, 0xef, 0x16, + 0x5f, 0xed, 0xf9, 0x2f, 0x41, 0x30, 0xb2, 0xe2, 0xd9, 0x65, 0x42, 0x64, + 0x23, 0x25, 0xc1, 0xf3, 0x2f, 0x71, 0xef, 0xd1, 0x04, 0x35, 0xb7, 0x56, + 0x5d, 0xac, 0x59, 0x7b, 0xf1, 0x36, 0x59, 0x5a, 0x3c, 0x7f, 0xc4, 0x48, + 0x5a, 0xec, 0x6a, 0xcb, 0xda, 0xdf, 0xe5, 0x97, 0xec, 0xd3, 0xc0, 0xd6, + 0x54, 0x1e, 0xdb, 0x8b, 0x10, 0xfd, 0xff, 0xb4, 0x16, 0xf8, 0xe1, 0xae, + 0x4b, 0x2f, 0xfb, 0x90, 0xd2, 0xc9, 0x41, 0x2c, 0xad, 0x1f, 0x9f, 0x4f, + 0x6e, 0x29, 0x2c, 0xba, 0x7b, 0x15, 0x65, 0x04, 0xd9, 0xcf, 0x8b, 0x56, + 0x1f, 0xce, 0xea, 0xad, 0xff, 0xc0, 0x0b, 0x8f, 0x7e, 0x0d, 0x95, 0xcb, + 0x71, 0x65, 0xf1, 0xfa, 0x37, 0xac, 0xad, 0x1f, 0x9f, 0x54, 0x2f, 0xf4, + 0x6a, 0x3e, 0xff, 0x50, 0xb2, 0xe2, 0xd9, 0x65, 0xef, 0x07, 0x71, 0x65, + 0xfc, 0x51, 0xdf, 0x3c, 0x96, 0x54, 0x1e, 0x64, 0xc4, 0x17, 0xbb, 0x1a, + 0x59, 0x50, 0x8f, 0x7d, 0x88, 0xa6, 0x34, 0x76, 0x30, 0x91, 0x5c, 0xe0, + 0x59, 0x7f, 0x00, 0x61, 0xd8, 0x46, 0xac, 0xbf, 0xbe, 0xe6, 0x35, 0xf8, + 0xb2, 0xf8, 0x79, 0xe8, 0x59, 0x7f, 0x66, 0xda, 0x8f, 0xb4, 0xb2, 0xff, + 0x04, 0x79, 0x28, 0xff, 0x8b, 0x2a, 0x11, 0xf3, 0x82, 0xc6, 0x62, 0xe5, + 0xc4, 0x43, 0xc2, 0xfb, 0xf4, 0xdc, 0xe1, 0xb5, 0x65, 0xee, 0x07, 0xe5, + 0x97, 0xff, 0xdb, 0x0a, 0xf2, 0xe7, 0x33, 0x42, 0xc6, 0x98, 0x59, 0x62, + 0x59, 0x7f, 0x3f, 0x79, 0xb6, 0x0a, 0xb2, 0xff, 0xfe, 0x3e, 0x3c, 0xb8, + 0x7b, 0xf8, 0x17, 0x39, 0x1e, 0xf5, 0x97, 0x08, 0x22, 0xca, 0xc4, 0xd4, + 0x26, 0x29, 0x71, 0xef, 0xd5, 0x08, 0x43, 0xa5, 0xe2, 0x2e, 0xdf, 0xb3, + 0x5f, 0xff, 0x0b, 0x2e, 0x9f, 0x66, 0xc8, 0x67, 0xf9, 0xc4, 0x37, 0xe4, + 0x92, 0x38, 0x71, 0xe4, 0xaf, 0x00, 0x46, 0xa9, 0xf3, 0x04, 0xc4, 0x5a, + 0x84, 0xa7, 0xa3, 0x41, 0x78, 0x55, 0x7f, 0x08, 0xa2, 0x8c, 0x63, 0x91, + 0xc7, 0x76, 0x34, 0x31, 0x23, 0xa2, 0xdd, 0x65, 0xbf, 0xc1, 0xd9, 0x9e, + 0xee, 0xe9, 0xb0, 0xb2, 0xa1, 0xf0, 0xcf, 0x36, 0x85, 0x4c, 0xad, 0x12, + 0x60, 0xe5, 0x08, 0x9c, 0xe5, 0xd4, 0xd1, 0xb7, 0xb4, 0xb7, 0xd3, 0xa2, + 0xfd, 0x5b, 0x0c, 0x33, 0xc4, 0xac, 0x06, 0xf7, 0x63, 0x46, 0xa6, 0x56, + 0xa4, 0x8a, 0xa9, 0xc5, 0xa9, 0x4e, 0xda, 0x73, 0x5e, 0x54, 0xb3, 0xe1, + 0xd2, 0x36, 0xb3, 0x34, 0x8d, 0xa6, 0x29, 0x49, 0xa0, 0xc5, 0x23, 0x9f, + 0xd6, 0xa4, 0xe4, 0xeb, 0x41, 0xed, 0xc9, 0x4a, 0x13, 0x5f, 0x6e, 0x56, + 0xaf, 0x9e, 0x3d, 0xba, 0xc4, 0x14, 0xfd, 0x5d, 0x99, 0xbd, 0xfb, 0x0b, + 0xff, 0x58, 0x2a, 0x32, 0xe5, 0xf7, 0x95, 0xb1, 0xbd, 0xe5, 0xb6, 0xb0, + 0xee, 0x30, 0x75, 0xc3, 0x7d, 0x80, 0x7b, 0xeb, 0x14, 0x91, 0x69, 0xac, + 0x73, 0xf3, 0xd9, 0x22, 0x53, 0xf5, 0xf7, 0x6f, 0x10, 0x5e, 0x80, }; -static const unsigned kPreloadedHSTSBits = 596202; +static const unsigned kPreloadedHSTSBits = 595953; -static const unsigned kHSTSRootPosition = 595532; +static const unsigned kHSTSRootPosition = 595283; #endif // NET_HTTP_TRANSPORT_SECURITY_STATE_STATIC_H_
diff --git a/net/http/transport_security_state_static.json b/net/http/transport_security_state_static.json index be1a51c..01d22f41 100644 --- a/net/http/transport_security_state_static.json +++ b/net/http/transport_security_state_static.json
@@ -2183,7 +2183,6 @@ { "name": "pclob.gov", "include_subdomains": true, "mode": "force-https" }, { "name": "plzenskybarcamp.cz", "include_subdomains": true, "mode": "force-https" }, { "name": "ponythread.com", "include_subdomains": true, "mode": "force-https" }, - { "name": "popcorntime.ws", "include_subdomains": true, "mode": "force-https" }, { "name": "ptn.moscow", "include_subdomains": true, "mode": "force-https" }, { "name": "radiormi.com", "include_subdomains": true, "mode": "force-https" }, { "name": "renem.net", "include_subdomains": true, "mode": "force-https" }, @@ -3727,7 +3726,6 @@ { "name": "motd.ch", "include_subdomains": true, "mode": "force-https" }, { "name": "mysecretcase.com", "include_subdomains": true, "mode": "force-https" }, { "name": "namorico.me", "include_subdomains": true, "mode": "force-https" }, - { "name": "natukusa.com", "include_subdomains": true, "mode": "force-https" }, { "name": "nekomimi.pl", "include_subdomains": true, "mode": "force-https" }, { "name": "netprofile.com.au", "include_subdomains": true, "mode": "force-https" }, { "name": "numericacu.com", "include_subdomains": true, "mode": "force-https" }, @@ -5592,7 +5590,6 @@ { "name": "shukatsu-note.com", "include_subdomains": true, "mode": "force-https" }, { "name": "singul4rity.com", "include_subdomains": true, "mode": "force-https" }, { "name": "speedtest-russia.com", "include_subdomains": true, "mode": "force-https" }, - { "name": "spira.io", "include_subdomains": true, "mode": "force-https" }, { "name": "starstreak.net", "include_subdomains": true, "mode": "force-https" }, { "name": "taxbench.com", "include_subdomains": true, "mode": "force-https" }, { "name": "temizmama.com", "include_subdomains": true, "mode": "force-https" }, @@ -7172,7 +7169,6 @@ { "name": "ewie.name", "include_subdomains": true, "mode": "force-https" }, { "name": "expertmile.com", "include_subdomains": true, "mode": "force-https" }, { "name": "ezrefurb.co.uk", "include_subdomains": true, "mode": "force-https" }, - { "name": "fanriff.com", "include_subdomains": true, "mode": "force-https" }, { "name": "fanvoice.com", "include_subdomains": true, "mode": "force-https" }, { "name": "fawkex.me", "include_subdomains": true, "mode": "force-https" }, { "name": "fierman.eu", "include_subdomains": true, "mode": "force-https" },
diff --git a/net/net.gypi b/net/net.gypi index 49d6496f1..b5564fb 100644 --- a/net/net.gypi +++ b/net/net.gypi
@@ -1006,6 +1006,8 @@ 'quic/crypto/proof_source_chromium.h', 'quic/crypto/proof_source_chromium_nss.cc', 'quic/crypto/proof_source_chromium_openssl.cc', + 'quic/crypto/quic_compressed_certs_cache.cc', + 'quic/crypto/quic_compressed_certs_cache.h', 'quic/crypto/quic_crypto_client_config.cc', 'quic/crypto/quic_crypto_client_config.h', 'quic/crypto/quic_crypto_server_config.cc', @@ -1572,6 +1574,7 @@ 'quic/crypto/proof_test.cc', 'quic/crypto/proof_verifier_chromium_test.cc', 'quic/crypto/properties_based_quic_server_info_test.cc', + 'quic/crypto/quic_compressed_certs_cache_test.cc', 'quic/crypto/quic_crypto_client_config_test.cc', 'quic/crypto/quic_crypto_server_config_test.cc', 'quic/crypto/quic_random_test.cc',
diff --git a/net/proxy/proxy_config.cc b/net/proxy/proxy_config.cc index 78d6ef3..ff05b63 100644 --- a/net/proxy/proxy_config.cc +++ b/net/proxy/proxy_config.cc
@@ -42,6 +42,8 @@ type(TYPE_NO_RULES) { } +ProxyConfig::ProxyRules::ProxyRules(const ProxyRules& other) = default; + ProxyConfig::ProxyRules::~ProxyRules() { }
diff --git a/net/proxy/proxy_config.h b/net/proxy/proxy_config.h index 2e91923..68deafdf 100644 --- a/net/proxy/proxy_config.h +++ b/net/proxy/proxy_config.h
@@ -49,6 +49,7 @@ // Note that the default of TYPE_NO_RULES results in direct connections // being made when using this ProxyConfig. ProxyRules(); + ProxyRules(const ProxyRules& other); ~ProxyRules(); bool empty() const {
diff --git a/net/proxy/proxy_info.cc b/net/proxy/proxy_info.cc index b659d67..7500079 100644 --- a/net/proxy/proxy_info.cc +++ b/net/proxy/proxy_info.cc
@@ -15,6 +15,8 @@ did_use_pac_script_(false) { } +ProxyInfo::ProxyInfo(const ProxyInfo& other) = default; + ProxyInfo::~ProxyInfo() { }
diff --git a/net/proxy/proxy_info.h b/net/proxy/proxy_info.h index 1dc7388..3d06a75 100644 --- a/net/proxy/proxy_info.h +++ b/net/proxy/proxy_info.h
@@ -22,6 +22,7 @@ class NET_EXPORT ProxyInfo { public: ProxyInfo(); + ProxyInfo(const ProxyInfo& other); ~ProxyInfo(); // Default copy-constructor and assignment operator are OK!
diff --git a/net/proxy/proxy_list.cc b/net/proxy/proxy_list.cc index a7b7aef..5f627e0c 100644 --- a/net/proxy/proxy_list.cc +++ b/net/proxy/proxy_list.cc
@@ -19,6 +19,8 @@ ProxyList::ProxyList() { } +ProxyList::ProxyList(const ProxyList& other) = default; + ProxyList::~ProxyList() { }
diff --git a/net/proxy/proxy_list.h b/net/proxy/proxy_list.h index 82c637d..d128e18d 100644 --- a/net/proxy/proxy_list.h +++ b/net/proxy/proxy_list.h
@@ -29,6 +29,7 @@ class NET_EXPORT_PRIVATE ProxyList { public: ProxyList(); + ProxyList(const ProxyList& other); ~ProxyList(); // Initializes the proxy list to a string containing one or more proxy servers
diff --git a/net/quic/congestion_control/general_loss_algorithm_test.cc b/net/quic/congestion_control/general_loss_algorithm_test.cc index 797e4650..580ce84 100644 --- a/net/quic/congestion_control/general_loss_algorithm_test.cc +++ b/net/quic/congestion_control/general_loss_algorithm_test.cc
@@ -39,7 +39,7 @@ 0, false, false); packet.retransmittable_frames.push_back(QuicFrame(frame)); unacked_packets_.AddSentPacket(&packet, 0, NOT_RETRANSMISSION, clock_.Now(), - 1000, true); + true); } void VerifyLosses(QuicPacketNumber largest_observed,
diff --git a/net/quic/crypto/crypto_protocol.h b/net/quic/crypto/crypto_protocol.h index 1e0fcb9..5d2f71f5 100644 --- a/net/quic/crypto/crypto_protocol.h +++ b/net/quic/crypto/crypto_protocol.h
@@ -129,6 +129,7 @@ // Client hello tags const QuicTag kVER = TAG('V', 'E', 'R', '\0'); // Version const QuicTag kNONC = TAG('N', 'O', 'N', 'C'); // The client's nonce +const QuicTag kNONP = TAG('N', 'O', 'N', 'P'); // The client's proof nonce const QuicTag kKEXS = TAG('K', 'E', 'X', 'S'); // Key exchange methods const QuicTag kAEAD = TAG('A', 'E', 'A', 'D'); // Authenticated // encryption algorithms
diff --git a/net/quic/crypto/proof_source.h b/net/quic/crypto/proof_source.h index 55ed51b..d2b4859 100644 --- a/net/quic/crypto/proof_source.h +++ b/net/quic/crypto/proof_source.h
@@ -21,7 +21,7 @@ public: // Chain is a reference-counted wrapper for a std::vector of std::stringified // certificates. - struct Chain : public base::RefCounted<Chain> { + struct NET_EXPORT_PRIVATE Chain : public base::RefCounted<Chain> { explicit Chain(const std::vector<std::string>& certs); const std::vector<std::string> certs;
diff --git a/net/quic/crypto/quic_compressed_certs_cache.cc b/net/quic/crypto/quic_compressed_certs_cache.cc new file mode 100644 index 0000000..1b6d55b4 --- /dev/null +++ b/net/quic/crypto/quic_compressed_certs_cache.cc
@@ -0,0 +1,119 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "net/quic/crypto/quic_compressed_certs_cache.h" + +namespace net { + +namespace { + +// Inline helper function for extending a 64-bit |seed| in-place with a 64-bit +// |value|. Based on Boost's hash_combine function. +inline void hash_combine(uint64_t* seed, const uint64_t& val) { + (*seed) ^= val + 0x9e3779b9 + ((*seed) << 6) + ((*seed) >> 2); +} + +} // namespace + +QuicCompressedCertsCache::UncompressedCerts::UncompressedCerts() {} + +QuicCompressedCertsCache::UncompressedCerts::UncompressedCerts( + const scoped_refptr<ProofSource::Chain>& chain, + const string* client_common_set_hashes, + const string* client_cached_cert_hashes) + : chain(chain), + client_common_set_hashes(client_common_set_hashes), + client_cached_cert_hashes(client_cached_cert_hashes) {} + +QuicCompressedCertsCache::UncompressedCerts::~UncompressedCerts() {} + +QuicCompressedCertsCache::CachedCerts::CachedCerts() {} + +QuicCompressedCertsCache::CachedCerts::CachedCerts( + const UncompressedCerts& uncompressed_certs, + const string& compressed_cert) + : chain_(uncompressed_certs.chain), + client_common_set_hashes_(*uncompressed_certs.client_common_set_hashes), + client_cached_cert_hashes_(*uncompressed_certs.client_cached_cert_hashes), + compressed_cert_(compressed_cert) {} + +QuicCompressedCertsCache::CachedCerts::~CachedCerts() {} + +bool QuicCompressedCertsCache::CachedCerts::MatchesUncompressedCerts( + const UncompressedCerts& uncompressed_certs) const { + return (client_common_set_hashes_ == + *uncompressed_certs.client_common_set_hashes && + client_cached_cert_hashes_ == + *uncompressed_certs.client_cached_cert_hashes && + chain_ == uncompressed_certs.chain); +} + +const string* QuicCompressedCertsCache::CachedCerts::compressed_cert() const { + return &compressed_cert_; +} + +QuicCompressedCertsCache::QuicCompressedCertsCache(int64_t max_num_certs) + : certs_cache_(max_num_certs) {} + +QuicCompressedCertsCache::~QuicCompressedCertsCache() { + // Underlying cache must be cleared before destruction. + certs_cache_.Clear(); +} + +const string* QuicCompressedCertsCache::GetCompressedCert( + const scoped_refptr<ProofSource::Chain>& chain, + const string& client_common_set_hashes, + const string& client_cached_cert_hashes) { + UncompressedCerts uncompressed_certs(chain, &client_common_set_hashes, + &client_cached_cert_hashes); + + uint64_t key = ComputeUncompressedCertsHash(uncompressed_certs); + + auto cached_it = certs_cache_.Get(key); + + if (cached_it != certs_cache_.end()) { + const CachedCerts& cached_value = cached_it->second; + if (cached_value.MatchesUncompressedCerts(uncompressed_certs)) { + return cached_value.compressed_cert(); + } + } + return nullptr; +} + +void QuicCompressedCertsCache::Insert( + const scoped_refptr<ProofSource::Chain>& chain, + const string& client_common_set_hashes, + const string& client_cached_cert_hashes, + const string& compressed_cert) { + UncompressedCerts uncompressed_certs(chain, &client_common_set_hashes, + &client_cached_cert_hashes); + + uint64_t key = ComputeUncompressedCertsHash(uncompressed_certs); + + // Insert one unit to the cache. + certs_cache_.Put(key, CachedCerts(uncompressed_certs, compressed_cert)); +} + +size_t QuicCompressedCertsCache::MaxSize() { + return certs_cache_.max_size(); +} + +size_t QuicCompressedCertsCache::Size() { + return certs_cache_.size(); +} + +uint64_t QuicCompressedCertsCache::ComputeUncompressedCertsHash( + const UncompressedCerts& uncompressed_certs) { + uint64_t hash = + std::hash<string>()(*uncompressed_certs.client_common_set_hashes); + uint64_t h = + std::hash<string>()(*uncompressed_certs.client_cached_cert_hashes); + hash_combine(&hash, h); + + hash_combine(&hash, + reinterpret_cast<uint64_t>(uncompressed_certs.chain.get())); + return hash; +} + +} // namespace net
diff --git a/net/quic/crypto/quic_compressed_certs_cache.h b/net/quic/crypto/quic_compressed_certs_cache.h new file mode 100644 index 0000000..5bb0cf4 --- /dev/null +++ b/net/quic/crypto/quic_compressed_certs_cache.h
@@ -0,0 +1,109 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef NET_QUIC_CRYPTO_QUIC_COMPRESSED_CERTS_CACHE_H_ +#define NET_QUIC_CRYPTO_QUIC_COMPRESSED_CERTS_CACHE_H_ + +#include <string> +#include <vector> + +#include "base/containers/mru_cache.h" +#include "base/memory/ref_counted.h" +#include "net/quic/crypto/proof_source.h" + +using std::string; + +namespace net { + +// QuicCompressedCertsCache is a cache to track most recently compressed certs. +class NET_EXPORT_PRIVATE QuicCompressedCertsCache { + public: + explicit QuicCompressedCertsCache(int64_t max_num_certs); + ~QuicCompressedCertsCache(); + + // Returns the pointer to the cached compressed cert if + // |chain, client_common_set_hashes, client_cached_cert_hashes| hits cache. + // Otherwise, return nullptr. + // Returned pointer might become invalid on the next call to Insert(). + const string* GetCompressedCert( + const scoped_refptr<ProofSource::Chain>& chain, + const string& client_common_set_hashes, + const string& client_cached_cert_hashes); + + // Inserts the specified + // |chain, client_common_set_hashes, + // client_cached_cert_hashes, compressed_cert| tuple to the cache. + // If the insertion causes the cache to become overfull, entries will + // be deleted in an LRU order to make room. + void Insert(const scoped_refptr<ProofSource::Chain>& chain, + const string& client_common_set_hashes, + const string& client_cached_cert_hashes, + const string& compressed_cert); + + // Returns max number of cache entries the cache can carry. + size_t MaxSize(); + + // Returns current number of cache entries in the cache. + size_t Size(); + + // Default size of the QuicCompressedCertsCache per server side investigation. + static const size_t kQuicCompressedCertsCacheSize = 225; + + private: + // A wrapper of the tuple: + // |chain, client_common_set_hashes, client_cached_cert_hashes| + // to identify uncompressed representation of certs. + struct UncompressedCerts { + UncompressedCerts(); + UncompressedCerts(const scoped_refptr<ProofSource::Chain>& chain, + const string* client_common_set_hashes, + const string* client_cached_cert_hashes); + ~UncompressedCerts(); + + const scoped_refptr<ProofSource::Chain> chain; + const string* client_common_set_hashes; + const string* client_cached_cert_hashes; + }; + + // Certs stored by QuicCompressedCertsCache where uncompressed certs data is + // used to identify the uncompressed representation of certs and + // |compressed_cert| is the cached compressed representation. + class CachedCerts { + public: + CachedCerts(); + CachedCerts(const UncompressedCerts& uncompressed_certs, + const string& compressed_cert); + + ~CachedCerts(); + + // Returns true if the |uncompressed_certs| matches uncompressed + // representation of this cert. + bool MatchesUncompressedCerts( + const UncompressedCerts& uncompressed_certs) const; + + const string* compressed_cert() const; + + private: + // Uncompressed certs data. + scoped_refptr<ProofSource::Chain> chain_; + const string client_common_set_hashes_; + const string client_cached_cert_hashes_; + + // Cached compressed representation derived from uncompressed certs. + const string compressed_cert_; + }; + + // Computes a uint64_t hash for |uncompressed_certs|. + uint64_t ComputeUncompressedCertsHash( + const UncompressedCerts& uncompressed_certs); + + // Key is a unit64_t hash for UncompressedCerts. Stored associated value is + // CachedCerts which has both original uncompressed certs data and the + // compressed representation of the certs. + base::MRUCache<uint64_t, CachedCerts> certs_cache_; +}; + +} // namespace net + +#endif // NET_QUIC_CRYPTO_QUIC_COMPRESSED_CERTS_CACHE_H_
diff --git a/net/quic/crypto/quic_compressed_certs_cache_test.cc b/net/quic/crypto/quic_compressed_certs_cache_test.cc new file mode 100644 index 0000000..f1f7341 --- /dev/null +++ b/net/quic/crypto/quic_compressed_certs_cache_test.cc
@@ -0,0 +1,93 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "net/quic/crypto/quic_compressed_certs_cache.h" + +#include <string> +#include <vector> + +#include "base/logging.h" +#include "base/macros.h" +#include "base/strings/string_number_conversions.h" +#include "net/quic/crypto/cert_compressor.h" +#include "net/quic/test_tools/crypto_test_utils.h" +#include "testing/gtest/include/gtest/gtest.h" + +using std::vector; + +namespace net { + +namespace test { + +namespace { + +class QuicCompressedCertsCacheTest : public testing::Test { + public: + QuicCompressedCertsCacheTest() + : certs_cache_(QuicCompressedCertsCache::kQuicCompressedCertsCacheSize) {} + + protected: + QuicCompressedCertsCache certs_cache_; +}; + +TEST_F(QuicCompressedCertsCacheTest, CacheHit) { + vector<string> certs = {"leaf cert", "intermediate cert", "root cert"}; + scoped_refptr<ProofSource::Chain> chain(new ProofSource::Chain(certs)); + string common_certs = "common certs"; + string cached_certs = "cached certs"; + string compressed = "compressed cert"; + + certs_cache_.Insert(chain, common_certs, cached_certs, compressed); + + const string* cached_value = + certs_cache_.GetCompressedCert(chain, common_certs, cached_certs); + ASSERT_NE(nullptr, cached_value); + EXPECT_EQ(*cached_value, compressed); +} + +TEST_F(QuicCompressedCertsCacheTest, CacheMiss) { + vector<string> certs = {"leaf cert", "intermediate cert", "root cert"}; + scoped_refptr<ProofSource::Chain> chain(new ProofSource::Chain(certs)); + string common_certs = "common certs"; + string cached_certs = "cached certs"; + string compressed = "compressed cert"; + + certs_cache_.Insert(chain, common_certs, cached_certs, compressed); + + EXPECT_EQ(nullptr, certs_cache_.GetCompressedCert( + chain, "mismatched common certs", cached_certs)); + EXPECT_EQ(nullptr, certs_cache_.GetCompressedCert(chain, common_certs, + "mismatched cached certs")); + scoped_refptr<ProofSource::Chain> chain2(new ProofSource::Chain(certs)); + EXPECT_EQ(nullptr, + certs_cache_.GetCompressedCert(chain2, common_certs, cached_certs)); +} + +TEST_F(QuicCompressedCertsCacheTest, CacheMissDueToEviction) { + // Test cache returns a miss when a queried uncompressed certs was cached but + // then evicted. + vector<string> certs = {"leaf cert", "intermediate cert", "root cert"}; + scoped_refptr<ProofSource::Chain> chain(new ProofSource::Chain(certs)); + + string common_certs = "common certs"; + string cached_certs = "cached certs"; + string compressed = "compressed cert"; + certs_cache_.Insert(chain, common_certs, cached_certs, compressed); + + // Insert another kQuicCompressedCertsCacheSize certs to evict the first + // cached cert. + for (unsigned int i = 0; + i < QuicCompressedCertsCache::kQuicCompressedCertsCacheSize; i++) { + EXPECT_EQ(certs_cache_.Size(), i + 1); + certs_cache_.Insert(chain, base::IntToString(i), "", base::IntToString(i)); + } + EXPECT_EQ(certs_cache_.MaxSize(), certs_cache_.Size()); + + EXPECT_EQ(nullptr, + certs_cache_.GetCompressedCert(chain, common_certs, cached_certs)); +} + +} // namespace +} // namespace test +} // namespace net
diff --git a/net/quic/crypto/quic_crypto_client_config.cc b/net/quic/crypto/quic_crypto_client_config.cc index bbd2d0d..bb71fcc58 100644 --- a/net/quic/crypto/quic_crypto_client_config.cc +++ b/net/quic/crypto/quic_crypto_client_config.cc
@@ -18,6 +18,7 @@ #include "net/quic/crypto/p256_key_exchange.h" #include "net/quic/crypto/proof_verifier.h" #include "net/quic/crypto/quic_encrypter.h" +#include "net/quic/crypto/quic_random.h" #include "net/quic/quic_bug_tracker.h" #include "net/quic/quic_flags.h" #include "net/quic/quic_utils.h" @@ -405,6 +406,7 @@ const QuicServerId& server_id, const QuicVersion preferred_version, const CachedState* cached, + QuicRandom* rand, QuicCryptoNegotiatedParameters* out_params, CryptoHandshakeMessage* out) const { out->set_tag(kCHLO); @@ -421,6 +423,10 @@ out->SetStringPiece(kUAID, user_agent_id_); } + char proof_nonce[32]; + rand->RandBytes(proof_nonce, arraysize(proof_nonce)); + out->SetStringPiece(kNONP, StringPiece(proof_nonce, arraysize(proof_nonce))); + // Even though this is an inchoate CHLO, send the SCID so that // the STK can be validated by the server. const CryptoHandshakeMessage* scfg = cached->GetServerConfig(); @@ -479,8 +485,8 @@ string* error_details) const { DCHECK(error_details != nullptr); - FillInchoateClientHello(server_id, preferred_version, cached, out_params, - out); + FillInchoateClientHello(server_id, preferred_version, cached, rand, + out_params, out); const CryptoHandshakeMessage* scfg = cached->GetServerConfig(); if (!scfg) {
diff --git a/net/quic/crypto/quic_crypto_client_config.h b/net/quic/crypto/quic_crypto_client_config.h index 34be5484..9782f10 100644 --- a/net/quic/crypto/quic_crypto_client_config.h +++ b/net/quic/crypto/quic_crypto_client_config.h
@@ -210,6 +210,7 @@ void FillInchoateClientHello(const QuicServerId& server_id, const QuicVersion preferred_version, const CachedState* cached, + QuicRandom* rand, QuicCryptoNegotiatedParameters* out_params, CryptoHandshakeMessage* out) const;
diff --git a/net/quic/crypto/quic_crypto_client_config_test.cc b/net/quic/crypto/quic_crypto_client_config_test.cc index 2e6866cc..0aff310 100644 --- a/net/quic/crypto/quic_crypto_client_config_test.cc +++ b/net/quic/crypto/quic_crypto_client_config_test.cc
@@ -156,12 +156,16 @@ QuicCryptoNegotiatedParameters params; CryptoHandshakeMessage msg; QuicServerId server_id("www.google.com", 80, PRIVACY_MODE_DISABLED); - config.FillInchoateClientHello(server_id, QuicVersionMax(), &state, ¶ms, - &msg); + MockRandom rand; + config.FillInchoateClientHello(server_id, QuicVersionMax(), &state, &rand, + ¶ms, &msg); QuicTag cver; EXPECT_EQ(QUIC_NO_ERROR, msg.GetUint32(kVER, &cver)); EXPECT_EQ(QuicVersionToQuicTag(QuicVersionMax()), cver); + StringPiece proof_nonce; + EXPECT_TRUE(msg.GetStringPiece(kNONP, &proof_nonce)); + EXPECT_EQ(string(32, 'r'), proof_nonce); } TEST(QuicCryptoClientConfigTest, PreferAesGcm) { @@ -178,8 +182,9 @@ QuicCryptoNegotiatedParameters params; CryptoHandshakeMessage msg; QuicServerId server_id("www.google.com", 443, PRIVACY_MODE_DISABLED); - config.FillInchoateClientHello(server_id, QuicVersionMax(), &state, ¶ms, - &msg); + MockRandom rand; + config.FillInchoateClientHello(server_id, QuicVersionMax(), &state, &rand, + ¶ms, &msg); QuicTag pdmd; EXPECT_EQ(QUIC_NO_ERROR, msg.GetUint32(kPDMD, &pdmd)); @@ -203,8 +208,9 @@ QuicCryptoNegotiatedParameters params; CryptoHandshakeMessage msg; QuicServerId server_id("www.google.com", 443, PRIVACY_MODE_DISABLED); - config.FillInchoateClientHello(server_id, QuicVersionMax(), &state, ¶ms, - &msg); + MockRandom rand; + config.FillInchoateClientHello(server_id, QuicVersionMax(), &state, &rand, + ¶ms, &msg); StringPiece scid; EXPECT_TRUE(msg.GetStringPiece(kSCID, &scid)); @@ -218,8 +224,9 @@ QuicCryptoNegotiatedParameters params; CryptoHandshakeMessage msg; QuicServerId server_id("www.google.com", 443, PRIVACY_MODE_DISABLED); - config.FillInchoateClientHello(server_id, QuicVersionMax(), &state, ¶ms, - &msg); + MockRandom rand; + config.FillInchoateClientHello(server_id, QuicVersionMax(), &state, &rand, + ¶ms, &msg); QuicTag pdmd; EXPECT_EQ(QUIC_NO_ERROR, msg.GetUint32(kPDMD, &pdmd));
diff --git a/net/quic/crypto/quic_crypto_server_config.cc b/net/quic/crypto/quic_crypto_server_config.cc index a96943f..cd14bc1e1 100644 --- a/net/quic/crypto/quic_crypto_server_config.cc +++ b/net/quic/crypto/quic_crypto_server_config.cc
@@ -532,11 +532,7 @@ requested_config = GetConfigWithScid(requested_scid); primary_config = primary_config_; - if (FLAGS_quic_crypto_proof_use_ref) { - crypto_proof->config = primary_config_; - } else { - crypto_proof->primary_scid = primary_config->id; - } + crypto_proof->config = primary_config_; } if (result->error_code == QUIC_NO_ERROR) { @@ -596,17 +592,7 @@ // Use the config that the client requested in order to do key-agreement. // Otherwise give it a copy of |primary_config_| to use. - if (FLAGS_quic_crypto_proof_use_ref) { - primary_config = crypto_proof->config; - } else { - primary_config = GetConfigWithScid(crypto_proof->primary_scid); - } - if (!primary_config) { - *error_details = "Configuration not found"; - QUIC_BUG << "Primary config not found"; - return QUIC_CRYPTO_INTERNAL_ERROR; - } - + primary_config = crypto_proof->config; requested_config = GetConfigWithScid(requested_scid); }
diff --git a/net/quic/iovector.cc b/net/quic/iovector.cc index a6d2c61..effa52d4 100644 --- a/net/quic/iovector.cc +++ b/net/quic/iovector.cc
@@ -8,6 +8,8 @@ IOVector::IOVector() {} +IOVector::IOVector(const IOVector& other) = default; + IOVector::~IOVector() {} } // namespace net
diff --git a/net/quic/iovector.h b/net/quic/iovector.h index 0ea57bb0..cf77a9a 100644 --- a/net/quic/iovector.h +++ b/net/quic/iovector.h
@@ -62,6 +62,7 @@ // Provide a default constructor so it'll never be inhibited by adding other // constructors. IOVector(); + IOVector(const IOVector& other); ~IOVector(); // Provides a way to convert system call-like iovec representation to
diff --git a/net/quic/quic_chromium_client_session.cc b/net/quic/quic_chromium_client_session.cc index 78044e8..328a133 100644 --- a/net/quic/quic_chromium_client_session.cc +++ b/net/quic/quic_chromium_client_session.cc
@@ -417,24 +417,31 @@ } } -QuicChromiumClientStream* -QuicChromiumClientSession::CreateOutgoingDynamicStream(SpdyPriority priority) { +bool QuicChromiumClientSession::ShouldCreateOutgoingDynamicStream() { if (!crypto_stream_->encryption_established()) { DVLOG(1) << "Encryption not active so no outgoing stream created."; - return nullptr; + return false; } if (GetNumOpenOutgoingStreams() >= max_open_outgoing_streams()) { DVLOG(1) << "Failed to create a new outgoing stream. " << "Already " << GetNumOpenOutgoingStreams() << " open."; - return nullptr; + return false; } if (goaway_received()) { DVLOG(1) << "Failed to create a new outgoing stream. " << "Already received goaway."; - return nullptr; + return false; } if (going_away_) { RecordUnexpectedOpenStreams(CREATE_OUTGOING_RELIABLE_STREAM); + return false; + } + return true; +} + +QuicChromiumClientStream* +QuicChromiumClientSession::CreateOutgoingDynamicStream(SpdyPriority priority) { + if (!ShouldCreateOutgoingDynamicStream()) { return nullptr; } return CreateOutgoingReliableStreamImpl();
diff --git a/net/quic/quic_chromium_client_session.h b/net/quic/quic_chromium_client_session.h index 4498aa0..d33beb47 100644 --- a/net/quic/quic_chromium_client_session.h +++ b/net/quic/quic_chromium_client_session.h
@@ -153,6 +153,7 @@ // QuicSession methods: void OnStreamFrame(const QuicStreamFrame& frame) override; + bool ShouldCreateOutgoingDynamicStream(); QuicChromiumClientStream* CreateOutgoingDynamicStream( SpdyPriority priority) override; QuicCryptoClientStream* GetCryptoStream() override;
diff --git a/net/quic/quic_config.cc b/net/quic/quic_config.cc index 076974e..c968be9e 100644 --- a/net/quic/quic_config.cc +++ b/net/quic/quic_config.cc
@@ -264,6 +264,9 @@ has_send_values_(false), has_receive_values_(false) {} +QuicFixedTagVector::QuicFixedTagVector(const QuicFixedTagVector& other) = + default; + QuicFixedTagVector::~QuicFixedTagVector() {} bool QuicFixedTagVector::HasSendValues() const { @@ -349,6 +352,8 @@ SetDefaults(); } +QuicConfig::QuicConfig(const QuicConfig& other) = default; + QuicConfig::~QuicConfig() {} bool QuicConfig::SetInitialReceivedConnectionOptions(
diff --git a/net/quic/quic_config.h b/net/quic/quic_config.h index 1fbb4b7..bd6e5d8a 100644 --- a/net/quic/quic_config.h +++ b/net/quic/quic_config.h
@@ -183,6 +183,7 @@ class NET_EXPORT_PRIVATE QuicFixedTagVector : public QuicConfigValue { public: QuicFixedTagVector(QuicTag name, QuicConfigPresence presence); + QuicFixedTagVector(const QuicFixedTagVector& other); ~QuicFixedTagVector() override; bool HasSendValues() const; @@ -219,6 +220,7 @@ class NET_EXPORT_PRIVATE QuicConfig { public: QuicConfig(); + QuicConfig(const QuicConfig& other); ~QuicConfig(); void SetConnectionOptionsToSend(const QuicTagVector& connection_options);
diff --git a/net/quic/quic_connection.cc b/net/quic/quic_connection.cc index fadf5f451..1dd656e 100644 --- a/net/quic/quic_connection.cc +++ b/net/quic/quic_connection.cc
@@ -644,8 +644,7 @@ // If this packet has already been seen, or the sender has told us that it // will not be retransmitted, then stop processing the packet. - if (FLAGS_quic_drop_non_awaited_packets && - !received_packet_manager_.IsAwaitingPacket(header.packet_number)) { + if (!received_packet_manager_.IsAwaitingPacket(header.packet_number)) { DVLOG(1) << ENDPOINT << "Packet " << header.packet_number << " no longer being waited for. Discarding."; if (debug_visitor_ != nullptr) { @@ -706,8 +705,10 @@ } if (frame.stream_id != kCryptoStreamId && last_decrypted_packet_level_ == ENCRYPTION_NONE) { - DLOG(WARNING) << ENDPOINT - << "Received an unencrypted data frame: closing connection"; + QUIC_BUG << ENDPOINT + << "Received an unencrypted data frame: closing connection" + << " packet_number:" << last_header_.packet_number + << " received_packets:" << received_packet_manager_.ack_frame(); SendConnectionCloseWithDetails(QUIC_UNENCRYPTED_STREAM_DATA, "Unencrypted stream data seen"); return false; @@ -1412,18 +1413,6 @@ return false; } - // If this packet has already been seen, or the sender has told us that it - // will not be retransmitted, then stop processing the packet. - if (!FLAGS_quic_drop_non_awaited_packets && - !received_packet_manager_.IsAwaitingPacket(header.packet_number)) { - DVLOG(1) << ENDPOINT << "Packet " << header.packet_number - << " no longer being waited for. Discarding."; - if (debug_visitor_ != nullptr) { - debug_visitor_->OnDuplicatePacket(header.packet_number); - } - return false; - } - if (version_negotiation_state_ != NEGOTIATED_VERSION) { if (perspective_ == Perspective::IS_SERVER) { if (!header.public_header.version_flag) { @@ -1664,8 +1653,7 @@ if (result.status != WRITE_STATUS_ERROR && debug_visitor_ != nullptr) { // Pass the write result to the visitor. debug_visitor_->OnPacketSent(*packet, packet->original_packet_number, - packet->transmission_type, encrypted_length, - packet_send_time); + packet->transmission_type, packet_send_time); } if (packet->transmission_type == NOT_RETRANSMISSION) { time_of_last_sent_new_packet_ = packet_send_time; @@ -1689,7 +1677,7 @@ bool reset_retransmission_alarm = sent_packet_manager_.OnPacketSent( packet, packet->original_packet_number, packet_send_time, - encrypted_length, packet->transmission_type, IsRetransmittable(*packet)); + packet->transmission_type, IsRetransmittable(*packet)); if (reset_retransmission_alarm || !retransmission_alarm_->IsSet()) { SetRetransmissionAlarm(); @@ -2025,8 +2013,7 @@ QuicFecGroup* QuicConnection::GetFecGroup() { QuicFecGroupNumber fec_group_num = last_header_.fec_group; if (fec_group_num == 0 || - (FLAGS_quic_drop_non_awaited_packets && - fec_group_num < + (fec_group_num < received_packet_manager_.peer_least_packet_awaiting_ack() && !ContainsKey(group_map_, fec_group_num))) { // If the group number is below peer_least_packet_awaiting_ack and this @@ -2129,9 +2116,7 @@ FecGroupMap::iterator it = group_map_.begin(); while (it != group_map_.end()) { // If the group doesn't protect this packet we can ignore it. - if ((!FLAGS_quic_drop_non_awaited_packets && - last_header_.fec_group == it->first) || - !it->second->IsWaitingForPacketBefore(packet_number)) { + if (!it->second->IsWaitingForPacketBefore(packet_number)) { ++it; continue; }
diff --git a/net/quic/quic_connection.h b/net/quic/quic_connection.h index 875f7df..df649b5 100644 --- a/net/quic/quic_connection.h +++ b/net/quic/quic_connection.h
@@ -169,7 +169,6 @@ virtual void OnPacketSent(const SerializedPacket& serialized_packet, QuicPacketNumber original_packet_number, TransmissionType transmission_type, - size_t encrypted_length, QuicTime sent_time) {} // Called when a packet has been received, but before it is
diff --git a/net/quic/quic_connection_logger.cc b/net/quic/quic_connection_logger.cc index 96c6425..fe529d8 100644 --- a/net/quic/quic_connection_logger.cc +++ b/net/quic/quic_connection_logger.cc
@@ -52,14 +52,12 @@ scoped_ptr<base::Value> NetLogQuicPacketSentCallback( const SerializedPacket& serialized_packet, TransmissionType transmission_type, - size_t packet_size, QuicTime sent_time, NetLogCaptureMode /* capture_mode */) { scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); dict->SetInteger("transmission_type", transmission_type); dict->SetString("packet_number", base::Uint64ToString(serialized_packet.packet_number)); - dict->SetInteger("size", packet_size); dict->SetString("sent_time_us", base::Int64ToString(sent_time.ToDebuggingValue())); return std::move(dict); @@ -430,13 +428,12 @@ const SerializedPacket& serialized_packet, QuicPacketNumber original_packet_number, TransmissionType transmission_type, - size_t encrypted_length, QuicTime sent_time) { if (original_packet_number == 0) { net_log_.AddEvent( NetLog::TYPE_QUIC_SESSION_PACKET_SENT, base::Bind(&NetLogQuicPacketSentCallback, serialized_packet, - transmission_type, encrypted_length, sent_time)); + transmission_type, sent_time)); } else { net_log_.AddEvent( NetLog::TYPE_QUIC_SESSION_PACKET_RETRANSMITTED,
diff --git a/net/quic/quic_connection_logger.h b/net/quic/quic_connection_logger.h index bdc5e6ae..f059ef94 100644 --- a/net/quic/quic_connection_logger.h +++ b/net/quic/quic_connection_logger.h
@@ -47,7 +47,6 @@ void OnPacketSent(const SerializedPacket& serialized_packet, QuicPacketNumber original_packet_number, TransmissionType transmission_type, - size_t encrypted_length, QuicTime sent_time) override; void OnPacketReceived(const IPEndPoint& self_address, const IPEndPoint& peer_address,
diff --git a/net/quic/quic_connection_stats.cc b/net/quic/quic_connection_stats.cc index 2c98fcca..f314452 100644 --- a/net/quic/quic_connection_stats.cc +++ b/net/quic/quic_connection_stats.cc
@@ -41,6 +41,9 @@ tcp_loss_events(0), connection_creation_time(QuicTime::Zero()) {} +QuicConnectionStats::QuicConnectionStats(const QuicConnectionStats& other) = + default; + QuicConnectionStats::~QuicConnectionStats() {} } // namespace net
diff --git a/net/quic/quic_connection_stats.h b/net/quic/quic_connection_stats.h index 655ab32..2787612 100644 --- a/net/quic/quic_connection_stats.h +++ b/net/quic/quic_connection_stats.h
@@ -19,6 +19,7 @@ // Structure to hold stats for a QuicConnection. struct NET_EXPORT_PRIVATE QuicConnectionStats { QuicConnectionStats(); + QuicConnectionStats(const QuicConnectionStats& other); ~QuicConnectionStats(); NET_EXPORT_PRIVATE friend std::ostream& operator<<(
diff --git a/net/quic/quic_connection_test.cc b/net/quic/quic_connection_test.cc index 55475c4..c30ac0a6 100644 --- a/net/quic/quic_connection_test.cc +++ b/net/quic/quic_connection_test.cc
@@ -1398,7 +1398,7 @@ EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_UNENCRYPTED_STREAM_DATA, ConnectionCloseSource::FROM_SELF)); - ProcessDataPacket(kDefaultPathId, 1, 0, !kEntropyFlag); + EXPECT_DFATAL(ProcessDataPacket(kDefaultPathId, 1, 0, !kEntropyFlag), ""); EXPECT_FALSE(QuicConnectionPeer::GetConnectionClosePacket(&connection_) == nullptr); const vector<QuicConnectionCloseFrame>& connection_close_frames = @@ -3517,24 +3517,9 @@ ASSERT_EQ(0u, connection_.NumFecGroups()); } -TEST_P(QuicConnectionTest, FailedToCloseFecGroupWithFecProtectedStopWaiting) { - EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); - ValueRestore<bool> old_flag(&FLAGS_quic_drop_non_awaited_packets, false); - // Don't send missing packet 1. - ProcessFecProtectedPacket(kDefaultPathId, 2, false, !kEntropyFlag, - !kHasStopWaiting); - EXPECT_EQ(1u, connection_.NumFecGroups()); - stop_waiting_ = InitStopWaitingFrame(3); - ProcessFecProtectedPacket(kDefaultPathId, 3, false, !kEntropyFlag, - kHasStopWaiting); - // This Fec group would be closed but created again. - EXPECT_EQ(1u, connection_.NumFecGroups()); -} - TEST_P(QuicConnectionTest, CloseFecGroupUnderStopWaitingAndWaitingForPacketsBelowStopWaiting) { EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); - ValueRestore<bool> old_flag(&FLAGS_quic_drop_non_awaited_packets, true); // Don't send missing packet 1. ProcessFecProtectedPacket(kDefaultPathId, 2, false, !kEntropyFlag, !kHasStopWaiting); @@ -3549,7 +3534,6 @@ TEST_P(QuicConnectionTest, DoNotCloseFecGroupUnderStopWaitingButNotWaitingForPacketsBelow) { EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); - ValueRestore<bool> old_flag(&FLAGS_quic_drop_non_awaited_packets, true); ProcessFecProtectedPacket(kDefaultPathId, 1, false, !kEntropyFlag, !kHasStopWaiting); ProcessFecProtectedPacket(kDefaultPathId, 2, false, !kEntropyFlag, @@ -5385,10 +5369,8 @@ new MockQuicConnectionDebugVisitor()); connection_.set_debug_visitor(debug_visitor.get()); EXPECT_CALL(*debug_visitor, OnPacketHeader(Ref(header))).Times(1); - if (FLAGS_quic_drop_non_awaited_packets) { - EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)).Times(1); - EXPECT_CALL(*debug_visitor, OnSuccessfulVersionNegotiation(_)).Times(1); - } + EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)).Times(1); + EXPECT_CALL(*debug_visitor, OnSuccessfulVersionNegotiation(_)).Times(1); connection_.OnPacketHeader(header); }
diff --git a/net/quic/quic_crypto_client_stream.cc b/net/quic/quic_crypto_client_stream.cc index 54c0de82..3e52079 100644 --- a/net/quic/quic_crypto_client_stream.cc +++ b/net/quic/quic_crypto_client_stream.cc
@@ -307,7 +307,8 @@ if (!cached->IsComplete(session()->connection()->clock()->WallNow())) { crypto_config_->FillInchoateClientHello( server_id_, session()->connection()->supported_versions().front(), - cached, &crypto_negotiated_params_, &out); + cached, session()->connection()->random_generator(), + &crypto_negotiated_params_, &out); // Pad the inchoate client hello to fill up a packet. const QuicByteCount kFramingOverhead = 50; // A rough estimate. const QuicByteCount max_packet_size =
diff --git a/net/quic/quic_crypto_server_stream.cc b/net/quic/quic_crypto_server_stream.cc index 62c4d584..f53602e 100644 --- a/net/quic/quic_crypto_server_stream.cc +++ b/net/quic/quic_crypto_server_stream.cc
@@ -69,9 +69,7 @@ // Detach from the validation callback. Calling this multiple times is safe. if (validate_client_hello_cb_ != nullptr) { validate_client_hello_cb_->Cancel(); - if (FLAGS_quic_set_client_hello_cb_nullptr) { - validate_client_hello_cb_ = nullptr; - } + validate_client_hello_cb_ = nullptr; } }
diff --git a/net/quic/quic_crypto_server_stream_test.cc b/net/quic/quic_crypto_server_stream_test.cc index a815f99..4b32c18 100644 --- a/net/quic/quic_crypto_server_stream_test.cc +++ b/net/quic/quic_crypto_server_stream_test.cc
@@ -292,8 +292,6 @@ InitializeFakeClient(/* supports_stateless_rejects= */ true); - client_stream()->CryptoConnect(); - // In the stateless case, the second handshake contains a server-nonce, so the // AsyncStrikeRegisterVerification() case will still succeed (unlike a 0-RTT // handshake). @@ -302,7 +300,7 @@ // On the second round, encryption will be established. EXPECT_TRUE(server_stream()->encryption_established()); EXPECT_TRUE(server_stream()->handshake_confirmed()); - EXPECT_EQ(2, server_stream()->NumHandshakeMessages()); + EXPECT_EQ(1, server_stream()->NumHandshakeMessages()); EXPECT_EQ(1, server_stream()->NumHandshakeMessagesWithServerNonces()); } @@ -485,7 +483,6 @@ TEST_P(QuicCryptoServerStreamTest, CancelRPCBeforeVerificationCompletes) { // Tests that the client can close the connection while the remote strike // register verification RPC is still pending. - ValueRestore<bool> old_flag(&FLAGS_quic_set_client_hello_cb_nullptr, true); // Set version to QUIC_VERSION_25 as QUIC_VERSION_26 and later don't support // asynchronous strike register RPCs.
diff --git a/net/quic/quic_flags.cc b/net/quic/quic_flags.cc index 5818a62..66868e71 100644 --- a/net/quic/quic_flags.cc +++ b/net/quic/quic_flags.cc
@@ -78,10 +78,6 @@ // If true, don't send QUIC packets if the send alarm is set. bool FLAGS_quic_respect_send_alarm2 = true; -// If ture, sets callback pointer to nullptr after calling Cancel() in -// QuicCryptoServerStream::CancelOutstandingCallbacks. -bool FLAGS_quic_set_client_hello_cb_nullptr = true; - // If true, allow each quic stream to write 16k blocks rather than doing a round // robin of one packet per session when ack clocked or paced. bool FLAGS_quic_batch_writes = true; @@ -118,12 +114,6 @@ // If true, QUIC will support RFC 7539 variants of ChaCha20 Poly1305. bool FLAGS_quic_use_rfc7539 = true; -// If true, drop not awaited QUIC packets before decrypting them. -bool FLAGS_quic_drop_non_awaited_packets = false; - -// If true, use the fast implementation of IncrementalHash/FNV1a_128_Hash. -bool FLAGS_quic_utils_use_fast_incremental_hash = true; - // If true, require QUIC connections to use a valid server nonce or a non-local // strike register. bool FLAGS_require_strike_register_or_server_nonce = true; @@ -131,10 +121,6 @@ // When turn on, log packet loss into transport connection stats LossEvent. bool FLAGS_quic_log_loss_event = true; -// If true, use a free list for the stream frame buffer allocations in -// QuicPacketCreator. -bool FLAGS_use_stream_frame_freelist = true; - // If true, for QUIC authenticated encryption algorithms, last 8 bytes // of IV comprise packet path id and lower 7 bytes of packet number. bool FLAGS_quic_include_path_id_in_iv = true; @@ -143,10 +129,6 @@ // priority (or batch) streams when doing QUIC writes. bool FLAGS_quic_cede_correctly = true; -// Has QuicCryptoProof hold a ref to the primary_config instead of storing its -// SCID. -bool FLAGS_quic_crypto_proof_use_ref = true; - // If on, max number of incoming and outgoing streams will be different. // Incoming will be a little higher than outgoing to tolerate race condition. bool FLAGS_quic_different_max_num_open_streams = true;
diff --git a/net/quic/quic_flags.h b/net/quic/quic_flags.h index 71983cb..a991a59 100644 --- a/net/quic/quic_flags.h +++ b/net/quic/quic_flags.h
@@ -27,7 +27,6 @@ NET_EXPORT_PRIVATE extern bool FLAGS_quic_use_new_idle_timeout; NET_EXPORT_PRIVATE extern bool FLAGS_quic_use_stream_sequencer_buffer; NET_EXPORT_PRIVATE extern bool FLAGS_quic_respect_send_alarm2; -NET_EXPORT_PRIVATE extern bool FLAGS_quic_set_client_hello_cb_nullptr; NET_EXPORT_PRIVATE extern bool FLAGS_quic_batch_writes; NET_EXPORT_PRIVATE extern bool FLAGS_quic_block_unencrypted_writes; NET_EXPORT_PRIVATE extern bool FLAGS_quic_never_write_unencrypted_data; @@ -38,14 +37,10 @@ NET_EXPORT_PRIVATE extern bool FLAGS_quic_distinguish_incoming_outgoing_streams; NET_EXPORT_PRIVATE extern bool FLAGS_quic_validate_stk_without_scid; NET_EXPORT_PRIVATE extern bool FLAGS_quic_use_rfc7539; -NET_EXPORT_PRIVATE extern bool FLAGS_quic_drop_non_awaited_packets; -NET_EXPORT_PRIVATE extern bool FLAGS_quic_utils_use_fast_incremental_hash; NET_EXPORT_PRIVATE extern bool FLAGS_require_strike_register_or_server_nonce; NET_EXPORT_PRIVATE extern bool FLAGS_quic_log_loss_event; -NET_EXPORT_PRIVATE extern bool FLAGS_use_stream_frame_freelist; NET_EXPORT_PRIVATE extern bool FLAGS_quic_include_path_id_in_iv; NET_EXPORT_PRIVATE extern bool FLAGS_quic_cede_correctly; -NET_EXPORT_PRIVATE extern bool FLAGS_quic_crypto_proof_use_ref; NET_EXPORT_PRIVATE extern bool FLAGS_quic_different_max_num_open_streams; NET_EXPORT_PRIVATE extern bool FLAGS_quic_crypto_server_config_default_has_chacha20;
diff --git a/net/quic/quic_framer.cc b/net/quic/quic_framer.cc index c7ae630..7d75b8f 100644 --- a/net/quic/quic_framer.cc +++ b/net/quic/quic_framer.cc
@@ -313,6 +313,8 @@ QuicFramer::AckFrameInfo::AckFrameInfo() : max_delta(0) {} +QuicFramer::AckFrameInfo::AckFrameInfo(const AckFrameInfo& other) = default; + QuicFramer::AckFrameInfo::~AckFrameInfo() {} // static
diff --git a/net/quic/quic_framer.h b/net/quic/quic_framer.h index aba0f97..456f2b09 100644 --- a/net/quic/quic_framer.h +++ b/net/quic/quic_framer.h
@@ -376,6 +376,7 @@ struct AckFrameInfo { AckFrameInfo(); + AckFrameInfo(const AckFrameInfo& other); ~AckFrameInfo(); // The maximum delta between ranges.
diff --git a/net/quic/quic_http_stream.cc b/net/quic/quic_http_stream.cc index b355b13..75401df 100644 --- a/net/quic/quic_http_stream.cc +++ b/net/quic/quic_http_stream.cc
@@ -293,6 +293,7 @@ } void QuicHttpStream::PopulateNetErrorDetails(NetErrorDetails* details) { + details->connection_info = HttpResponseInfo::CONNECTION_INFO_QUIC1_SPDY3; if (was_handshake_confirmed_) details->quic_connection_error = quic_connection_error_; }
diff --git a/net/quic/quic_protocol.cc b/net/quic/quic_protocol.cc index 192008e..7de88d7 100644 --- a/net/quic/quic_protocol.cc +++ b/net/quic/quic_protocol.cc
@@ -96,6 +96,8 @@ is_in_fec_group(NOT_IN_FEC_GROUP), fec_group(0) {} +QuicPacketHeader::QuicPacketHeader(const QuicPacketHeader& other) = default; + QuicPublicResetPacket::QuicPublicResetPacket() : nonce_proof(0), rejected_packet_number(0) {} @@ -108,17 +110,13 @@ void StreamBufferDeleter::operator()(char* buffer) const { if (allocator_ != nullptr && buffer != nullptr) { allocator_->Delete(buffer); - if (!FLAGS_use_stream_frame_freelist) { - allocator_->MarkAllocatorIdle(); - } } } UniqueStreamBuffer NewStreamBuffer(QuicBufferAllocator* allocator, size_t size) { - return UniqueStreamBuffer( - allocator->New(size, FLAGS_use_stream_frame_freelist), - StreamBufferDeleter(allocator)); + return UniqueStreamBuffer(allocator->New(size), + StreamBufferDeleter(allocator)); } QuicStreamFrame::QuicStreamFrame() @@ -301,6 +299,8 @@ ack_delay_time(QuicTime::Delta::Infinite()), latest_revived_packet(0) {} +QuicAckFrame::QuicAckFrame(const QuicAckFrame& other) = default; + QuicAckFrame::~QuicAckFrame() {} QuicRstStreamErrorCode AdjustErrorForVersion(QuicRstStreamErrorCode error_code, @@ -729,6 +729,9 @@ DCHECK(listener != nullptr); } +AckListenerWrapper::AckListenerWrapper(const AckListenerWrapper& other) = + default; + AckListenerWrapper::~AckListenerWrapper() {} SerializedPacket::SerializedPacket(QuicPathId path_id, @@ -754,6 +757,8 @@ original_packet_number(0), transmission_type(NOT_RETRANSMISSION) {} +SerializedPacket::SerializedPacket(const SerializedPacket& other) = default; + SerializedPacket::~SerializedPacket() {} QuicEncryptedPacket* QuicEncryptedPacket::Clone() const { @@ -802,6 +807,8 @@ needs_padding(needs_padding), retransmission(0) {} +TransmissionInfo::TransmissionInfo(const TransmissionInfo& other) = default; + TransmissionInfo::~TransmissionInfo() {} } // namespace net
diff --git a/net/quic/quic_protocol.h b/net/quic/quic_protocol.h index a9af2c1..6c5de3f 100644 --- a/net/quic/quic_protocol.h +++ b/net/quic/quic_protocol.h
@@ -707,6 +707,7 @@ struct NET_EXPORT_PRIVATE QuicPacketHeader { QuicPacketHeader(); explicit QuicPacketHeader(const QuicPacketPublicHeader& header); + QuicPacketHeader(const QuicPacketHeader& other); NET_EXPORT_PRIVATE friend std::ostream& operator<<(std::ostream& os, const QuicPacketHeader& s); @@ -956,6 +957,7 @@ struct NET_EXPORT_PRIVATE QuicAckFrame { QuicAckFrame(); + QuicAckFrame(const QuicAckFrame& other); ~QuicAckFrame(); NET_EXPORT_PRIVATE friend std::ostream& operator<<(std::ostream& os, @@ -1288,6 +1290,7 @@ struct NET_EXPORT_PRIVATE AckListenerWrapper { AckListenerWrapper(QuicAckListenerInterface* listener, QuicPacketLength data_length); + AckListenerWrapper(const AckListenerWrapper& other); ~AckListenerWrapper(); scoped_refptr<QuicAckListenerInterface> ack_listener; @@ -1303,6 +1306,7 @@ QuicPacketEntropyHash entropy_hash, bool has_ack, bool has_stop_waiting); + SerializedPacket(const SerializedPacket& other); ~SerializedPacket(); // Not owned. @@ -1341,6 +1345,8 @@ bool has_crypto_handshake, bool needs_padding); + TransmissionInfo(const TransmissionInfo& other); + ~TransmissionInfo(); QuicFrames retransmittable_frames;
diff --git a/net/quic/quic_received_packet_manager.h b/net/quic/quic_received_packet_manager.h index 5adafa6..404f24fd 100644 --- a/net/quic/quic_received_packet_manager.h +++ b/net/quic/quic_received_packet_manager.h
@@ -144,6 +144,9 @@ virtual bool ack_frame_updated() const; + // For logging purposes. + const QuicAckFrame& ack_frame() const { return ack_frame_; } + private: friend class test::QuicConnectionPeer; friend class test::QuicReceivedPacketManagerPeer;
diff --git a/net/quic/quic_sent_packet_manager.cc b/net/quic/quic_sent_packet_manager.cc index 78536f0..fbe446b2 100644 --- a/net/quic/quic_sent_packet_manager.cc +++ b/net/quic/quic_sent_packet_manager.cc
@@ -548,13 +548,13 @@ SerializedPacket* serialized_packet, QuicPacketNumber original_packet_number, QuicTime sent_time, - QuicByteCount bytes, TransmissionType transmission_type, HasRetransmittableData has_retransmittable_data) { QuicPacketNumber packet_number = serialized_packet->packet_number; DCHECK_LT(0u, packet_number); DCHECK(!unacked_packets_.IsUnacked(packet_number)); - QUIC_BUG_IF(bytes == 0) << "Cannot send empty packets."; + QUIC_BUG_IF(serialized_packet->encrypted_length == 0) + << "Cannot send empty packets."; if (delegate_ == nullptr && original_packet_number != 0) { if (!pending_retransmissions_.erase(original_packet_number)) { @@ -576,12 +576,11 @@ : has_retransmittable_data; // TODO(ianswett): Remove sent_time, because it's unused. const bool in_flight = send_algorithm_->OnPacketSent( - sent_time, unacked_packets_.bytes_in_flight(), packet_number, bytes, - has_congestion_controlled_data); + sent_time, unacked_packets_.bytes_in_flight(), packet_number, + serialized_packet->encrypted_length, has_congestion_controlled_data); unacked_packets_.AddSentPacket(serialized_packet, original_packet_number, - transmission_type, sent_time, bytes, - in_flight); + transmission_type, sent_time, in_flight); // Reset the retransmission timer anytime a pending packet is sent. return in_flight; }
diff --git a/net/quic/quic_sent_packet_manager.h b/net/quic/quic_sent_packet_manager.h index 61695d4..15b12d6 100644 --- a/net/quic/quic_sent_packet_manager.h +++ b/net/quic/quic_sent_packet_manager.h
@@ -179,7 +179,6 @@ virtual bool OnPacketSent(SerializedPacket* serialized_packet, QuicPacketNumber original_packet_number, QuicTime sent_time, - QuicByteCount bytes, TransmissionType transmission_type, HasRetransmittableData has_retransmittable_data);
diff --git a/net/quic/quic_sent_packet_manager_test.cc b/net/quic/quic_sent_packet_manager_test.cc index d641472..f8cfce7d 100644 --- a/net/quic/quic_sent_packet_manager_test.cc +++ b/net/quic/quic_sent_packet_manager_test.cc
@@ -185,8 +185,7 @@ .WillOnce(Return(true)); SerializedPacket packet(CreatePacket(new_packet_number, false)); manager_.OnPacketSent(&packet, old_packet_number, clock_.Now(), - kDefaultLength, TLP_RETRANSMISSION, - HAS_RETRANSMITTABLE_DATA); + TLP_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA); EXPECT_TRUE(QuicSentPacketManagerPeer::IsRetransmission(&manager_, new_packet_number)); } @@ -221,8 +220,8 @@ .Times(1) .WillOnce(Return(true)); SerializedPacket packet(CreateDataPacket(packet_number)); - manager_.OnPacketSent(&packet, 0, clock_.Now(), packet.encrypted_length, - NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA); + manager_.OnPacketSent(&packet, 0, clock_.Now(), NOT_RETRANSMISSION, + HAS_RETRANSMITTABLE_DATA); } void SendCryptoPacket(QuicPacketNumber packet_number) { @@ -235,8 +234,8 @@ packet.retransmittable_frames.push_back( QuicFrame(new QuicStreamFrame(1, false, 0, StringPiece()))); packet.has_crypto_handshake = IS_HANDSHAKE; - manager_.OnPacketSent(&packet, 0, clock_.Now(), packet.encrypted_length, - NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA); + manager_.OnPacketSent(&packet, 0, clock_.Now(), NOT_RETRANSMISSION, + HAS_RETRANSMITTABLE_DATA); } void SendFecPacket(QuicPacketNumber packet_number) { @@ -246,8 +245,8 @@ .Times(1) .WillOnce(Return(true)); SerializedPacket packet(CreateFecPacket(packet_number)); - manager_.OnPacketSent(&packet, 0, clock_.Now(), packet.encrypted_length, - NOT_RETRANSMISSION, NO_RETRANSMITTABLE_DATA); + manager_.OnPacketSent(&packet, 0, clock_.Now(), NOT_RETRANSMISSION, + NO_RETRANSMITTABLE_DATA); } void SendAckPacket(QuicPacketNumber packet_number) { @@ -257,8 +256,8 @@ .Times(1) .WillOnce(Return(false)); SerializedPacket packet(CreatePacket(packet_number, false)); - manager_.OnPacketSent(&packet, 0, clock_.Now(), packet.encrypted_length, - NOT_RETRANSMISSION, NO_RETRANSMITTABLE_DATA); + manager_.OnPacketSent(&packet, 0, clock_.Now(), NOT_RETRANSMISSION, + NO_RETRANSMITTABLE_DATA); } // Based on QuicConnection's WritePendingRetransmissions. @@ -272,8 +271,7 @@ const PendingRetransmission pending = manager_.NextPendingRetransmission(); SerializedPacket packet(CreatePacket(retransmission_packet_number, false)); manager_.OnPacketSent(&packet, pending.packet_number, clock_.Now(), - kDefaultLength, pending.transmission_type, - HAS_RETRANSMITTABLE_DATA); + pending.transmission_type, HAS_RETRANSMITTABLE_DATA); } QuicSentPacketManager manager_; @@ -1654,11 +1652,12 @@ .WillOnce(Return(QuicTime::Delta::Zero())); EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA)); - EXPECT_CALL(*send_algorithm_, OnPacketSent(_, BytesInFlight(), i, 1024, - HAS_RETRANSMITTABLE_DATA)) + EXPECT_CALL(*send_algorithm_, + OnPacketSent(_, BytesInFlight(), i, kDefaultLength, + HAS_RETRANSMITTABLE_DATA)) .WillOnce(Return(true)); SerializedPacket packet(CreatePacket(i, true)); - manager_.OnPacketSent(&packet, 0, clock_.Now(), 1024, NOT_RETRANSMISSION, + manager_.OnPacketSent(&packet, 0, clock_.Now(), NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA); } EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, _, _)) @@ -1677,11 +1676,12 @@ .WillOnce(Return(QuicTime::Delta::Zero())); EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA)); - EXPECT_CALL(*send_algorithm_, OnPacketSent(_, BytesInFlight(), i, 1024, - HAS_RETRANSMITTABLE_DATA)) + EXPECT_CALL(*send_algorithm_, + OnPacketSent(_, BytesInFlight(), i, kDefaultLength, + HAS_RETRANSMITTABLE_DATA)) .WillOnce(Return(true)); SerializedPacket packet(CreatePacket(i, true)); - manager_.OnPacketSent(&packet, 0, clock_.Now(), 1024, NOT_RETRANSMISSION, + manager_.OnPacketSent(&packet, 0, clock_.Now(), NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA); } EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, _, _))
diff --git a/net/quic/quic_stream_sequencer.cc b/net/quic/quic_stream_sequencer.cc index 1c4f5806..18f40a3 100644 --- a/net/quic/quic_stream_sequencer.cc +++ b/net/quic/quic_stream_sequencer.cc
@@ -49,6 +49,8 @@ const size_t data_len = frame.frame_length; if (data_len == 0 && !frame.fin) { // Stream frames must have data or a fin flag. + LOG(WARNING) << "QUIC_INVALID_STREAM_FRAM: Empty stream frame " + "without FIN set."; stream_->CloseConnectionWithDetails(QUIC_INVALID_STREAM_FRAME, "Empty stream frame without FIN set."); return; @@ -66,6 +68,8 @@ clock_->ApproximateNow(), &bytes_written); if (result == QUIC_INVALID_STREAM_DATA) { + LOG(WARNING) << "QUIC_INVALID_STREAM_FRAME: Stream frame " + "overlaps with buffered data."; stream_->CloseConnectionWithDetails( QUIC_INVALID_STREAM_FRAME, "Stream frame overlaps with buffered data."); return;
diff --git a/net/quic/quic_unacked_packet_map.cc b/net/quic/quic_unacked_packet_map.cc index 2153c7c..c8a32505 100644 --- a/net/quic/quic_unacked_packet_map.cc +++ b/net/quic/quic_unacked_packet_map.cc
@@ -35,9 +35,9 @@ QuicPacketNumber old_packet_number, TransmissionType transmission_type, QuicTime sent_time, - QuicByteCount bytes_sent, bool set_in_flight) { QuicPacketNumber packet_number = packet->packet_number; + QuicPacketLength bytes_sent = packet->encrypted_length; QUIC_BUG_IF(largest_sent_packet_ >= packet_number) << packet_number; DCHECK_GE(packet_number, least_unacked_ + unacked_packets_.size()); while (least_unacked_ + unacked_packets_.size() < packet_number) {
diff --git a/net/quic/quic_unacked_packet_map.h b/net/quic/quic_unacked_packet_map.h index be12491f..8ed6d0a0b 100644 --- a/net/quic/quic_unacked_packet_map.h +++ b/net/quic/quic_unacked_packet_map.h
@@ -37,7 +37,6 @@ QuicPacketNumber old_packet_number, TransmissionType transmission_type, QuicTime sent_time, - QuicByteCount bytes_sent, bool set_in_flight); // Returns true if the packet |packet_number| is unacked.
diff --git a/net/quic/quic_unacked_packet_map_test.cc b/net/quic/quic_unacked_packet_map_test.cc index a422db15..26a0043 100644 --- a/net/quic/quic_unacked_packet_map_test.cc +++ b/net/quic/quic_unacked_packet_map_test.cc
@@ -18,7 +18,6 @@ namespace { // Default packet length. -const uint32_t kDefaultAckLength = 50; const uint32_t kDefaultLength = 1000; class QuicUnackedPacketMapTest : public ::testing::Test { @@ -118,8 +117,7 @@ TEST_F(QuicUnackedPacketMapTest, RttOnly) { // Acks are only tracked for RTT measurement purposes. SerializedPacket packet(CreateNonRetransmittablePacket(1)); - unacked_packets_.AddSentPacket(&packet, 0, NOT_RETRANSMISSION, now_, - kDefaultAckLength, false); + unacked_packets_.AddSentPacket(&packet, 0, NOT_RETRANSMISSION, now_, false); QuicPacketNumber unacked[] = {1}; VerifyUnackedPackets(unacked, arraysize(unacked)); @@ -135,8 +133,7 @@ TEST_F(QuicUnackedPacketMapTest, RetransmittableInflightAndRtt) { // Simulate a retransmittable packet being sent and acked. SerializedPacket packet(CreateRetransmittablePacket(1)); - unacked_packets_.AddSentPacket(&packet, 0, NOT_RETRANSMISSION, now_, - kDefaultLength, true); + unacked_packets_.AddSentPacket(&packet, 0, NOT_RETRANSMISSION, now_, true); QuicPacketNumber unacked[] = {1}; VerifyUnackedPackets(unacked, arraysize(unacked)); @@ -162,8 +159,7 @@ TEST_F(QuicUnackedPacketMapTest, StopRetransmission) { const QuicStreamId stream_id = 2; SerializedPacket packet(CreateRetransmittablePacketForStream(1, stream_id)); - unacked_packets_.AddSentPacket(&packet, 0, NOT_RETRANSMISSION, now_, - kDefaultLength, true); + unacked_packets_.AddSentPacket(&packet, 0, NOT_RETRANSMISSION, now_, true); QuicPacketNumber unacked[] = {1}; VerifyUnackedPackets(unacked, arraysize(unacked)); @@ -180,8 +176,7 @@ TEST_F(QuicUnackedPacketMapTest, StopRetransmissionOnOtherStream) { const QuicStreamId stream_id = 2; SerializedPacket packet(CreateRetransmittablePacketForStream(1, stream_id)); - unacked_packets_.AddSentPacket(&packet, 0, NOT_RETRANSMISSION, now_, - kDefaultLength, true); + unacked_packets_.AddSentPacket(&packet, 0, NOT_RETRANSMISSION, now_, true); QuicPacketNumber unacked[] = {1}; VerifyUnackedPackets(unacked, arraysize(unacked)); @@ -199,11 +194,9 @@ TEST_F(QuicUnackedPacketMapTest, StopRetransmissionAfterRetransmission) { const QuicStreamId stream_id = 2; SerializedPacket packet1(CreateRetransmittablePacketForStream(1, stream_id)); - unacked_packets_.AddSentPacket(&packet1, 0, NOT_RETRANSMISSION, now_, - kDefaultLength, true); + unacked_packets_.AddSentPacket(&packet1, 0, NOT_RETRANSMISSION, now_, true); SerializedPacket packet2(CreateNonRetransmittablePacket(2)); - unacked_packets_.AddSentPacket(&packet2, 1, LOSS_RETRANSMISSION, now_, - kDefaultLength, true); + unacked_packets_.AddSentPacket(&packet2, 1, LOSS_RETRANSMISSION, now_, true); QuicPacketNumber unacked[] = {1, 2}; VerifyUnackedPackets(unacked, arraysize(unacked)); @@ -221,11 +214,9 @@ // Simulate a retransmittable packet being sent, retransmitted, and the first // transmission being acked. SerializedPacket packet1(CreateRetransmittablePacket(1)); - unacked_packets_.AddSentPacket(&packet1, 0, NOT_RETRANSMISSION, now_, - kDefaultLength, true); + unacked_packets_.AddSentPacket(&packet1, 0, NOT_RETRANSMISSION, now_, true); SerializedPacket packet2(CreateNonRetransmittablePacket(2)); - unacked_packets_.AddSentPacket(&packet2, 1, LOSS_RETRANSMISSION, now_, - kDefaultLength, true); + unacked_packets_.AddSentPacket(&packet2, 1, LOSS_RETRANSMISSION, now_, true); QuicPacketNumber unacked[] = {1, 2}; VerifyUnackedPackets(unacked, arraysize(unacked)); @@ -258,11 +249,9 @@ TEST_F(QuicUnackedPacketMapTest, RetransmitThreeTimes) { // Simulate a retransmittable packet being sent and retransmitted twice. SerializedPacket packet1(CreateRetransmittablePacket(1)); - unacked_packets_.AddSentPacket(&packet1, 0, NOT_RETRANSMISSION, now_, - kDefaultLength, true); + unacked_packets_.AddSentPacket(&packet1, 0, NOT_RETRANSMISSION, now_, true); SerializedPacket packet2(CreateRetransmittablePacket(2)); - unacked_packets_.AddSentPacket(&packet2, 0, NOT_RETRANSMISSION, now_, - kDefaultLength, true); + unacked_packets_.AddSentPacket(&packet2, 0, NOT_RETRANSMISSION, now_, true); QuicPacketNumber unacked[] = {1, 2}; VerifyUnackedPackets(unacked, arraysize(unacked)); @@ -276,11 +265,9 @@ unacked_packets_.RemoveRetransmittability(2); unacked_packets_.RemoveFromInFlight(1); SerializedPacket packet3(CreateNonRetransmittablePacket(3)); - unacked_packets_.AddSentPacket(&packet3, 1, LOSS_RETRANSMISSION, now_, - kDefaultLength, true); + unacked_packets_.AddSentPacket(&packet3, 1, LOSS_RETRANSMISSION, now_, true); SerializedPacket packet4(CreateRetransmittablePacket(4)); - unacked_packets_.AddSentPacket(&packet4, 0, NOT_RETRANSMISSION, now_, - kDefaultLength, true); + unacked_packets_.AddSentPacket(&packet4, 0, NOT_RETRANSMISSION, now_, true); QuicPacketNumber unacked2[] = {1, 3, 4}; VerifyUnackedPackets(unacked2, arraysize(unacked2)); @@ -294,11 +281,9 @@ unacked_packets_.RemoveFromInFlight(4); unacked_packets_.RemoveRetransmittability(4); SerializedPacket packet5(CreateNonRetransmittablePacket(5)); - unacked_packets_.AddSentPacket(&packet5, 3, LOSS_RETRANSMISSION, now_, - kDefaultLength, true); + unacked_packets_.AddSentPacket(&packet5, 3, LOSS_RETRANSMISSION, now_, true); SerializedPacket packet6(CreateRetransmittablePacket(6)); - unacked_packets_.AddSentPacket(&packet6, 0, NOT_RETRANSMISSION, now_, - kDefaultLength, true); + unacked_packets_.AddSentPacket(&packet6, 0, NOT_RETRANSMISSION, now_, true); QuicPacketNumber unacked3[] = {3, 5, 6}; VerifyUnackedPackets(unacked3, arraysize(unacked3)); @@ -312,8 +297,7 @@ unacked_packets_.RemoveFromInFlight(6); unacked_packets_.RemoveRetransmittability(6); SerializedPacket packet7(CreateNonRetransmittablePacket(7)); - unacked_packets_.AddSentPacket(&packet7, 5, LOSS_RETRANSMISSION, now_, - kDefaultLength, true); + unacked_packets_.AddSentPacket(&packet7, 5, LOSS_RETRANSMISSION, now_, true); QuicPacketNumber unacked4[] = {3, 5, 7}; VerifyUnackedPackets(unacked4, arraysize(unacked4)); @@ -332,11 +316,9 @@ TEST_F(QuicUnackedPacketMapTest, RetransmitFourTimes) { // Simulate a retransmittable packet being sent and retransmitted twice. SerializedPacket packet1(CreateRetransmittablePacket(1)); - unacked_packets_.AddSentPacket(&packet1, 0, NOT_RETRANSMISSION, now_, - kDefaultLength, true); + unacked_packets_.AddSentPacket(&packet1, 0, NOT_RETRANSMISSION, now_, true); SerializedPacket packet2(CreateRetransmittablePacket(2)); - unacked_packets_.AddSentPacket(&packet2, 0, NOT_RETRANSMISSION, now_, - kDefaultLength, true); + unacked_packets_.AddSentPacket(&packet2, 0, NOT_RETRANSMISSION, now_, true); QuicPacketNumber unacked[] = {1, 2}; VerifyUnackedPackets(unacked, arraysize(unacked)); @@ -350,8 +332,7 @@ unacked_packets_.RemoveRetransmittability(2); unacked_packets_.RemoveFromInFlight(1); SerializedPacket packet3(CreateNonRetransmittablePacket(3)); - unacked_packets_.AddSentPacket(&packet3, 1, LOSS_RETRANSMISSION, now_, - kDefaultLength, true); + unacked_packets_.AddSentPacket(&packet3, 1, LOSS_RETRANSMISSION, now_, true); QuicPacketNumber unacked2[] = {1, 3}; VerifyUnackedPackets(unacked2, arraysize(unacked2)); @@ -362,11 +343,9 @@ // TLP 3 (formerly 1) as 4, and don't remove 1 from unacked. SerializedPacket packet4(CreateNonRetransmittablePacket(4)); - unacked_packets_.AddSentPacket(&packet4, 3, TLP_RETRANSMISSION, now_, - kDefaultLength, true); + unacked_packets_.AddSentPacket(&packet4, 3, TLP_RETRANSMISSION, now_, true); SerializedPacket packet5(CreateRetransmittablePacket(5)); - unacked_packets_.AddSentPacket(&packet5, 0, NOT_RETRANSMISSION, now_, - kDefaultLength, true); + unacked_packets_.AddSentPacket(&packet5, 0, NOT_RETRANSMISSION, now_, true); QuicPacketNumber unacked3[] = {1, 3, 4, 5}; VerifyUnackedPackets(unacked3, arraysize(unacked3)); @@ -382,8 +361,7 @@ unacked_packets_.RemoveFromInFlight(3); unacked_packets_.RemoveFromInFlight(4); SerializedPacket packet6(CreateNonRetransmittablePacket(6)); - unacked_packets_.AddSentPacket(&packet6, 4, LOSS_RETRANSMISSION, now_, - kDefaultLength, true); + unacked_packets_.AddSentPacket(&packet6, 4, LOSS_RETRANSMISSION, now_, true); QuicPacketNumber unacked4[] = {4, 6}; VerifyUnackedPackets(unacked4, arraysize(unacked4)); @@ -397,14 +375,11 @@ // Simulate a retransmittable packet being sent, retransmitted, and the first // transmission being acked. SerializedPacket packet1(CreateRetransmittablePacket(1)); - unacked_packets_.AddSentPacket(&packet1, 0, NOT_RETRANSMISSION, now_, - kDefaultLength, true); + unacked_packets_.AddSentPacket(&packet1, 0, NOT_RETRANSMISSION, now_, true); SerializedPacket packet3(CreateRetransmittablePacket(3)); - unacked_packets_.AddSentPacket(&packet3, 0, NOT_RETRANSMISSION, now_, - kDefaultLength, true); + unacked_packets_.AddSentPacket(&packet3, 0, NOT_RETRANSMISSION, now_, true); SerializedPacket packet5(CreateNonRetransmittablePacket(5)); - unacked_packets_.AddSentPacket(&packet5, 3, LOSS_RETRANSMISSION, now_, - kDefaultLength, true); + unacked_packets_.AddSentPacket(&packet5, 3, LOSS_RETRANSMISSION, now_, true); EXPECT_EQ(1u, unacked_packets_.GetLeastUnacked()); EXPECT_TRUE(unacked_packets_.IsUnacked(1));
diff --git a/net/quic/quic_utils.cc b/net/quic/quic_utils.cc index e57440a..c6a5cda 100644 --- a/net/quic/quic_utils.cc +++ b/net/quic/quic_utils.cc
@@ -56,6 +56,8 @@ } #endif +#ifndef QUIC_UTIL_HAS_UINT128 +// Slow implementation of IncrementalHash. In practice, only used by Chromium. uint128 IncrementalHashSlow(uint128 hash, const char* data, size_t len) { // kPrime = 309485009821345068724781371 static const uint128 kPrime(16777216, 315); @@ -66,12 +68,11 @@ } return hash; } +#endif uint128 IncrementalHash(uint128 hash, const char* data, size_t len) { #ifdef QUIC_UTIL_HAS_UINT128 - return FLAGS_quic_utils_use_fast_incremental_hash - ? IncrementalHashFast(hash, data, len) - : IncrementalHashSlow(hash, data, len); + return IncrementalHashFast(hash, data, len); #else return IncrementalHashSlow(hash, data, len); #endif
diff --git a/net/quic/quic_utils_test.cc b/net/quic/quic_utils_test.cc index d4b99fd..7412a24 100644 --- a/net/quic/quic_utils_test.cc +++ b/net/quic/quic_utils_test.cc
@@ -175,19 +175,7 @@ return hash; } -TEST(QuicUtilsHashTest, ReferenceTestSlow) { - FLAGS_quic_utils_use_fast_incremental_hash = false; - std::vector<uint8_t> data(32); - for (size_t i = 0; i < data.size(); ++i) { - data[i] = i % 255; - } - EXPECT_EQ(IncrementalHashReference(data.data(), data.size()), - QuicUtils::FNV1a_128_Hash( - reinterpret_cast<const char*>(data.data()), data.size())); -} - -TEST(QuicUtilsHashTest, ReferenceTestFast) { - FLAGS_quic_utils_use_fast_incremental_hash = true; +TEST(QuicUtilsHashTest, ReferenceTest) { std::vector<uint8_t> data(32); for (size_t i = 0; i < data.size(); ++i) { data[i] = i % 255;
diff --git a/net/quic/test_tools/quic_test_utils.cc b/net/quic/test_tools/quic_test_utils.cc index c94b092..9911757c 100644 --- a/net/quic/test_tools/quic_test_utils.cc +++ b/net/quic/test_tools/quic_test_utils.cc
@@ -300,7 +300,7 @@ QuicUtils::CopyBuffer(*packet), packet->encrypted_length, true)); // Transfer ownership of the packet to the SentPacketManager and the // ack notifier to the AckNotifierManager. - sent_packet_manager_.OnPacketSent(packet, 0, QuicTime::Zero(), 1000, + sent_packet_manager_.OnPacketSent(packet, 0, QuicTime::Zero(), NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA); }
diff --git a/net/quic/test_tools/quic_test_utils.h b/net/quic/test_tools/quic_test_utils.h index 729a6d16..d29d667 100644 --- a/net/quic/test_tools/quic_test_utils.h +++ b/net/quic/test_tools/quic_test_utils.h
@@ -709,11 +709,10 @@ MOCK_METHOD1(OnFrameAddedToPacket, void(const QuicFrame&)); - MOCK_METHOD5(OnPacketSent, + MOCK_METHOD4(OnPacketSent, void(const SerializedPacket&, QuicPacketNumber, TransmissionType, - size_t encrypted_length, QuicTime)); MOCK_METHOD3(OnPacketReceived,
diff --git a/net/server/http_server_request_info.cc b/net/server/http_server_request_info.cc index 07c15a54..765ddc0 100644 --- a/net/server/http_server_request_info.cc +++ b/net/server/http_server_request_info.cc
@@ -11,6 +11,9 @@ HttpServerRequestInfo::HttpServerRequestInfo() {} +HttpServerRequestInfo::HttpServerRequestInfo( + const HttpServerRequestInfo& other) = default; + HttpServerRequestInfo::~HttpServerRequestInfo() {} std::string HttpServerRequestInfo::GetHeaderValue(
diff --git a/net/server/http_server_request_info.h b/net/server/http_server_request_info.h index 1b02655b..014142c 100644 --- a/net/server/http_server_request_info.h +++ b/net/server/http_server_request_info.h
@@ -19,6 +19,7 @@ class HttpServerRequestInfo { public: HttpServerRequestInfo(); + HttpServerRequestInfo(const HttpServerRequestInfo& other); ~HttpServerRequestInfo(); // Returns header value for given header name. |header_name| should be
diff --git a/net/server/http_server_response_info.cc b/net/server/http_server_response_info.cc index 2d0a32e..7c195812 100644 --- a/net/server/http_server_response_info.cc +++ b/net/server/http_server_response_info.cc
@@ -15,6 +15,9 @@ HttpServerResponseInfo::HttpServerResponseInfo(HttpStatusCode status_code) : status_code_(status_code) {} +HttpServerResponseInfo::HttpServerResponseInfo( + const HttpServerResponseInfo& other) = default; + HttpServerResponseInfo::~HttpServerResponseInfo() {} // static
diff --git a/net/server/http_server_response_info.h b/net/server/http_server_response_info.h index fd8dfbc..c2451e8 100644 --- a/net/server/http_server_response_info.h +++ b/net/server/http_server_response_info.h
@@ -20,6 +20,7 @@ // Creates a 200 OK HttpServerResponseInfo. HttpServerResponseInfo(); explicit HttpServerResponseInfo(HttpStatusCode status_code); + HttpServerResponseInfo(const HttpServerResponseInfo& other); ~HttpServerResponseInfo(); static HttpServerResponseInfo CreateFor404();
diff --git a/net/socket/client_socket_pool_base.cc b/net/socket/client_socket_pool_base.cc index 30aa3dc..e925943 100644 --- a/net/socket/client_socket_pool_base.cc +++ b/net/socket/client_socket_pool_base.cc
@@ -220,6 +220,9 @@ result(result_in) { } +ClientSocketPoolBaseHelper::CallbackResultPair::CallbackResultPair( + const CallbackResultPair& other) = default; + ClientSocketPoolBaseHelper::CallbackResultPair::~CallbackResultPair() {} bool ClientSocketPoolBaseHelper::IsStalled() const {
diff --git a/net/socket/client_socket_pool_base.h b/net/socket/client_socket_pool_base.h index d288684..1e57adb65 100644 --- a/net/socket/client_socket_pool_base.h +++ b/net/socket/client_socket_pool_base.h
@@ -514,6 +514,7 @@ struct CallbackResultPair { CallbackResultPair(); CallbackResultPair(const CompletionCallback& callback_in, int result_in); + CallbackResultPair(const CallbackResultPair& other); ~CallbackResultPair(); CompletionCallback callback;
diff --git a/net/socket/websocket_transport_client_socket_pool.cc b/net/socket/websocket_transport_client_socket_pool.cc index 983afaf..e4f0883 100644 --- a/net/socket/websocket_transport_client_socket_pool.cc +++ b/net/socket/websocket_transport_client_socket_pool.cc
@@ -634,6 +634,9 @@ callback(callback), net_log(net_log) {} +WebSocketTransportClientSocketPool::StalledRequest::StalledRequest( + const StalledRequest& other) = default; + WebSocketTransportClientSocketPool::StalledRequest::~StalledRequest() {} } // namespace net
diff --git a/net/socket/websocket_transport_client_socket_pool.h b/net/socket/websocket_transport_client_socket_pool.h index 6374374..23b7774 100644 --- a/net/socket/websocket_transport_client_socket_pool.h +++ b/net/socket/websocket_transport_client_socket_pool.h
@@ -185,6 +185,7 @@ ClientSocketHandle* handle, const CompletionCallback& callback, const BoundNetLog& net_log); + StalledRequest(const StalledRequest& other); ~StalledRequest(); const scoped_refptr<TransportSocketParams> params; const RequestPriority priority;
diff --git a/net/spdy/spdy_alt_svc_wire_format.cc b/net/spdy/spdy_alt_svc_wire_format.cc index a50590e..2ec6777 100644 --- a/net/spdy/spdy_alt_svc_wire_format.cc +++ b/net/spdy/spdy_alt_svc_wire_format.cc
@@ -55,6 +55,9 @@ SpdyAltSvcWireFormat::AlternativeService::~AlternativeService() {} +SpdyAltSvcWireFormat::AlternativeService::AlternativeService( + const AlternativeService& other) = default; + // static bool SpdyAltSvcWireFormat::ParseHeaderFieldValue( StringPiece value,
diff --git a/net/spdy/spdy_alt_svc_wire_format.h b/net/spdy/spdy_alt_svc_wire_format.h index 28b4572..de404352 100644 --- a/net/spdy/spdy_alt_svc_wire_format.h +++ b/net/spdy/spdy_alt_svc_wire_format.h
@@ -47,6 +47,7 @@ uint32_t max_age, double probability, VersionVector version); + AlternativeService(const AlternativeService& other); ~AlternativeService(); bool operator==(const AlternativeService& other) const {
diff --git a/net/spdy/spdy_header_block.cc b/net/spdy/spdy_header_block.cc index 49243a7..b24085f 100644 --- a/net/spdy/spdy_header_block.cc +++ b/net/spdy/spdy_header_block.cc
@@ -114,6 +114,9 @@ lookup_result_(lookup_result), key_(key) {} +SpdyHeaderBlock::StringPieceProxy::StringPieceProxy( + const StringPieceProxy& other) = default; + SpdyHeaderBlock::StringPieceProxy::~StringPieceProxy() {} SpdyHeaderBlock::StringPieceProxy& SpdyHeaderBlock::StringPieceProxy::operator=(
diff --git a/net/spdy/spdy_header_block.h b/net/spdy/spdy_header_block.h index 1ee9708..58d6cf4c 100644 --- a/net/spdy/spdy_header_block.h +++ b/net/spdy/spdy_header_block.h
@@ -89,6 +89,7 @@ class NET_EXPORT StringPieceProxy { public: ~StringPieceProxy(); + StringPieceProxy(const StringPieceProxy& other); // Assignment modifies the underlying SpdyHeaderBlock. StringPieceProxy& operator=(const base::StringPiece other);
diff --git a/net/spdy/spdy_http_stream.cc b/net/spdy/spdy_http_stream.cc index 5a3a0cb..4fdbc0e9 100644 --- a/net/spdy/spdy_http_stream.cc +++ b/net/spdy/spdy_http_stream.cc
@@ -580,7 +580,8 @@ delete this; } -void SpdyHttpStream::PopulateNetErrorDetails(NetErrorDetails* /*details*/) { +void SpdyHttpStream::PopulateNetErrorDetails(NetErrorDetails* details) { + details->connection_info = HttpResponseInfo::CONNECTION_INFO_HTTP2; return; }
diff --git a/net/spdy/spdy_session_key.cc b/net/spdy/spdy_session_key.cc index 59f36df7..8b2fcbc 100644 --- a/net/spdy/spdy_session_key.cc +++ b/net/spdy/spdy_session_key.cc
@@ -32,6 +32,8 @@ << ", privacy=" << privacy_mode; } +SpdySessionKey::SpdySessionKey(const SpdySessionKey& other) = default; + SpdySessionKey::~SpdySessionKey() {} bool SpdySessionKey::operator<(const SpdySessionKey& other) const {
diff --git a/net/spdy/spdy_session_key.h b/net/spdy/spdy_session_key.h index 59c832b..a393ce0 100644 --- a/net/spdy/spdy_session_key.h +++ b/net/spdy/spdy_session_key.h
@@ -22,6 +22,8 @@ SpdySessionKey(const HostPortProxyPair& host_port_proxy_pair, PrivacyMode privacy_mode); + SpdySessionKey(const SpdySessionKey& other); + ~SpdySessionKey(); // Comparator function so this can be placed in a std::map.
diff --git a/net/spdy/spdy_write_queue.cc b/net/spdy/spdy_write_queue.cc index ab25eaef8..a8e65532 100644 --- a/net/spdy/spdy_write_queue.cc +++ b/net/spdy/spdy_write_queue.cc
@@ -26,6 +26,8 @@ stream(stream), has_stream(stream.get() != NULL) {} +SpdyWriteQueue::PendingWrite::PendingWrite(const PendingWrite& other) = default; + SpdyWriteQueue::PendingWrite::~PendingWrite() {} SpdyWriteQueue::SpdyWriteQueue() : removing_writes_(false) {}
diff --git a/net/spdy/spdy_write_queue.h b/net/spdy/spdy_write_queue.h index c19b3f2..8383e7a 100644 --- a/net/spdy/spdy_write_queue.h +++ b/net/spdy/spdy_write_queue.h
@@ -75,6 +75,7 @@ PendingWrite(SpdyFrameType frame_type, SpdyBufferProducer* frame_producer, const base::WeakPtr<SpdyStream>& stream); + PendingWrite(const PendingWrite& other); ~PendingWrite(); };
diff --git a/net/ssl/signed_certificate_timestamp_and_status.cc b/net/ssl/signed_certificate_timestamp_and_status.cc index 245fcf2a..55deaa3 100644 --- a/net/ssl/signed_certificate_timestamp_and_status.cc +++ b/net/ssl/signed_certificate_timestamp_and_status.cc
@@ -13,6 +13,9 @@ const ct::SCTVerifyStatus status) : sct(sct), status(status) {} +SignedCertificateTimestampAndStatus::SignedCertificateTimestampAndStatus( + const SignedCertificateTimestampAndStatus& other) = default; + SignedCertificateTimestampAndStatus::~SignedCertificateTimestampAndStatus() {} } // namespace net
diff --git a/net/ssl/signed_certificate_timestamp_and_status.h b/net/ssl/signed_certificate_timestamp_and_status.h index c23753e..650e5b1 100644 --- a/net/ssl/signed_certificate_timestamp_and_status.h +++ b/net/ssl/signed_certificate_timestamp_and_status.h
@@ -19,6 +19,9 @@ const scoped_refptr<ct::SignedCertificateTimestamp>& sct, ct::SCTVerifyStatus status); + SignedCertificateTimestampAndStatus( + const SignedCertificateTimestampAndStatus& other); + ~SignedCertificateTimestampAndStatus(); scoped_refptr<ct::SignedCertificateTimestamp> sct;
diff --git a/net/ssl/ssl_config.cc b/net/ssl/ssl_config.cc index be87ed0..4a71b5948 100644 --- a/net/ssl/ssl_config.cc +++ b/net/ssl/ssl_config.cc
@@ -36,6 +36,8 @@ cert_io_enabled(true), renego_allowed_default(false) {} +SSLConfig::SSLConfig(const SSLConfig& other) = default; + SSLConfig::~SSLConfig() {} bool SSLConfig::IsAllowedBadCert(X509Certificate* cert,
diff --git a/net/ssl/ssl_config.h b/net/ssl/ssl_config.h index 5460f66..0a5a83d 100644 --- a/net/ssl/ssl_config.h +++ b/net/ssl/ssl_config.h
@@ -47,6 +47,7 @@ struct NET_EXPORT SSLConfig { // Default to revocation checking. SSLConfig(); + SSLConfig(const SSLConfig& other); ~SSLConfig(); // Returns true if |cert| is one of the certs in |allowed_bad_certs|.
diff --git a/net/ssl/ssl_server_config.cc b/net/ssl/ssl_server_config.cc index f423933..f5041b67 100644 --- a/net/ssl/ssl_server_config.cc +++ b/net/ssl/ssl_server_config.cc
@@ -16,6 +16,8 @@ client_cert_type(NO_CLIENT_CERT), client_cert_verifier(nullptr) {} +SSLServerConfig::SSLServerConfig(const SSLServerConfig& other) = default; + SSLServerConfig::~SSLServerConfig() {} } // namespace net
diff --git a/net/ssl/ssl_server_config.h b/net/ssl/ssl_server_config.h index 95bea0b..7a1861b 100644 --- a/net/ssl/ssl_server_config.h +++ b/net/ssl/ssl_server_config.h
@@ -26,6 +26,7 @@ // Defaults SSLServerConfig(); + SSLServerConfig(const SSLServerConfig& other); ~SSLServerConfig(); // The minimum and maximum protocol versions that are enabled.
diff --git a/net/test/embedded_test_server/http_request.cc b/net/test/embedded_test_server/http_request.cc index b5b2e4f..7d54326 100644 --- a/net/test/embedded_test_server/http_request.cc +++ b/net/test/embedded_test_server/http_request.cc
@@ -34,6 +34,8 @@ has_content(false) { } +HttpRequest::HttpRequest(const HttpRequest& other) = default; + HttpRequest::~HttpRequest() { }
diff --git a/net/test/embedded_test_server/http_request.h b/net/test/embedded_test_server/http_request.h index d99c050..2a560b6 100644 --- a/net/test/embedded_test_server/http_request.h +++ b/net/test/embedded_test_server/http_request.h
@@ -48,6 +48,7 @@ std::map<std::string, std::string, CaseInsensitiveStringComparator>; HttpRequest(); + HttpRequest(const HttpRequest& other); ~HttpRequest(); // Returns a GURL as a convenience to extract the path and query strings.
diff --git a/net/test/spawned_test_server/base_test_server.cc b/net/test/spawned_test_server/base_test_server.cc index e69233e..ecf5af5 100644 --- a/net/test/spawned_test_server/base_test_server.cc +++ b/net/test/spawned_test_server/base_test_server.cc
@@ -159,6 +159,8 @@ disable_channel_id(false), disable_extended_master_secret(false) {} +BaseTestServer::SSLOptions::SSLOptions(const SSLOptions& other) = default; + BaseTestServer::SSLOptions::~SSLOptions() {} base::FilePath BaseTestServer::SSLOptions::GetCertificateFile() const {
diff --git a/net/test/spawned_test_server/base_test_server.h b/net/test/spawned_test_server/base_test_server.h index 7df2416..60d37e1 100644 --- a/net/test/spawned_test_server/base_test_server.h +++ b/net/test/spawned_test_server/base_test_server.h
@@ -140,6 +140,7 @@ // Initialize a new SSLOptions that will use the specified certificate. explicit SSLOptions(ServerCertificate cert); + SSLOptions(const SSLOptions& other); ~SSLOptions(); // Returns the relative filename of the file that contains the
diff --git a/net/tools/flip_server/output_ordering.cc b/net/tools/flip_server/output_ordering.cc index f378a87..24e92c0 100644 --- a/net/tools/flip_server/output_ordering.cc +++ b/net/tools/flip_server/output_ordering.cc
@@ -14,6 +14,9 @@ OutputOrdering::PriorityMapPointer::PriorityMapPointer() : ring(NULL), alarm_enabled(false) {} +OutputOrdering::PriorityMapPointer::PriorityMapPointer( + const PriorityMapPointer& other) = default; + OutputOrdering::PriorityMapPointer::~PriorityMapPointer() {} // static
diff --git a/net/tools/flip_server/output_ordering.h b/net/tools/flip_server/output_ordering.h index 3641460..ecd32a2b 100644 --- a/net/tools/flip_server/output_ordering.h +++ b/net/tools/flip_server/output_ordering.h
@@ -27,6 +27,7 @@ struct PriorityMapPointer { PriorityMapPointer(); + PriorityMapPointer(const PriorityMapPointer& other); ~PriorityMapPointer(); PriorityRing* ring; PriorityRing::iterator it;
diff --git a/net/tools/quic/quic_client_session.cc b/net/tools/quic/quic_client_session.cc index ce1d8b66..ba0f0ed 100644 --- a/net/tools/quic/quic_client_session.cc +++ b/net/tools/quic/quic_client_session.cc
@@ -38,20 +38,27 @@ void QuicClientSession::OnProofVerifyDetailsAvailable( const ProofVerifyDetails& /*verify_details*/) {} -QuicSpdyClientStream* QuicClientSession::CreateOutgoingDynamicStream( - SpdyPriority priority) { +bool QuicClientSession::ShouldCreateOutgoingDynamicStream() { if (!crypto_stream_->encryption_established()) { DVLOG(1) << "Encryption not active so no outgoing stream created."; - return nullptr; + return false; } if (GetNumOpenOutgoingStreams() >= max_open_outgoing_streams()) { DVLOG(1) << "Failed to create a new outgoing stream. " << "Already " << GetNumOpenOutgoingStreams() << " open."; - return nullptr; + return false; } if (goaway_received() && respect_goaway_) { DVLOG(1) << "Failed to create a new outgoing stream. " << "Already received goaway."; + return false; + } + return true; +} + +QuicSpdyClientStream* QuicClientSession::CreateOutgoingDynamicStream( + SpdyPriority priority) { + if (!ShouldCreateOutgoingDynamicStream()) { return nullptr; } QuicSpdyClientStream* stream = CreateClientStream();
diff --git a/net/tools/quic/quic_client_session.h b/net/tools/quic/quic_client_session.h index 22146e7..2cbf2369 100644 --- a/net/tools/quic/quic_client_session.h +++ b/net/tools/quic/quic_client_session.h
@@ -74,7 +74,12 @@ QuicCryptoClientConfig* crypto_config() { return crypto_config_; } private: + // If an outgoing stream can be created, return true. + bool ShouldCreateOutgoingDynamicStream(); + + // If an incoming stream can be created, return true. bool ShouldCreateIncomingDynamicStream(QuicStreamId id); + scoped_ptr<QuicCryptoClientStreamBase> crypto_stream_; QuicServerId server_id_; QuicCryptoClientConfig* crypto_config_;
diff --git a/net/tools/quic/quic_in_memory_cache.cc b/net/tools/quic/quic_in_memory_cache.cc index 2dee018..1f31b9cf 100644 --- a/net/tools/quic/quic_in_memory_cache.cc +++ b/net/tools/quic/quic_in_memory_cache.cc
@@ -32,6 +32,9 @@ priority(priority), body(body) {} +QuicInMemoryCache::ServerPushInfo::ServerPushInfo(const ServerPushInfo& other) = + default; + QuicInMemoryCache::Response::Response() : response_type_(REGULAR_RESPONSE) {} QuicInMemoryCache::Response::~Response() {}
diff --git a/net/tools/quic/quic_in_memory_cache.h b/net/tools/quic/quic_in_memory_cache.h index d23d1e3..0cedc1e 100644 --- a/net/tools/quic/quic_in_memory_cache.h +++ b/net/tools/quic/quic_in_memory_cache.h
@@ -48,6 +48,7 @@ const net::SpdyHeaderBlock& headers, net::SpdyPriority priority, string body); + ServerPushInfo(const ServerPushInfo& other); GURL request_url; net::SpdyHeaderBlock headers; net::SpdyPriority priority;
diff --git a/net/tools/quic/quic_packet_reader.cc b/net/tools/quic/quic_packet_reader.cc index 249441c..a4ba1be 100644 --- a/net/tools/quic/quic_packet_reader.cc +++ b/net/tools/quic/quic_packet_reader.cc
@@ -37,22 +37,22 @@ void QuicPacketReader::Initialize() { #if MMSG_MORE // Zero initialize uninitialized memory. - memset(cbuf_, 0, arraysize(cbuf_)); - memset(buf_, 0, arraysize(buf_)); - memset(raw_address_, 0, sizeof(raw_address_)); memset(mmsg_hdr_, 0, sizeof(mmsg_hdr_)); for (int i = 0; i < kNumPacketsPerReadMmsgCall; ++i) { - iov_[i].iov_base = buf_ + (kMaxPacketSize * i); - iov_[i].iov_len = kMaxPacketSize; + packets_[i].iov.iov_base = packets_[i].buf; + packets_[i].iov.iov_len = kMaxPacketSize; + memset(&packets_[i].raw_address, 0, sizeof(packets_[i].raw_address)); + memset(packets_[i].cbuf, 0, sizeof(packets_[i].cbuf)); + memset(packets_[i].buf, 0, sizeof(packets_[i].buf)); msghdr* hdr = &mmsg_hdr_[i].msg_hdr; - hdr->msg_name = &raw_address_[i]; + hdr->msg_name = &packets_[i].raw_address; hdr->msg_namelen = sizeof(sockaddr_storage); - hdr->msg_iov = &iov_[i]; + hdr->msg_iov = &packets_[i].iov; hdr->msg_iovlen = 1; - hdr->msg_control = cbuf_ + kSpaceForOverflowAndIp * i; + hdr->msg_control = packets_[i].cbuf; hdr->msg_controllen = kSpaceForOverflowAndIp; } #endif @@ -70,11 +70,10 @@ #if MMSG_MORE // Re-set the length fields in case recvmmsg has changed them. for (int i = 0; i < kNumPacketsPerReadMmsgCall; ++i) { - iov_[i].iov_len = kMaxPacketSize; - mmsg_hdr_[i].msg_len = 0; + DCHECK_EQ(kMaxPacketSize, packets_[i].iov.iov_len); msghdr* hdr = &mmsg_hdr_[i].msg_hdr; hdr->msg_namelen = sizeof(sockaddr_storage); - hdr->msg_iovlen = 1; + DCHECK_EQ(1, hdr->msg_iovlen); hdr->msg_controllen = kSpaceForOverflowAndIp; } @@ -90,7 +89,7 @@ continue; } - IPEndPoint client_address = IPEndPoint(raw_address_[i]); + IPEndPoint client_address = IPEndPoint(packets_[i].raw_address); IPAddressNumber server_ip = QuicSocketUtils::GetAddressFromMsghdr(&mmsg_hdr_[i].msg_hdr); if (!IsInitializedAddress(server_ip)) { @@ -98,8 +97,9 @@ continue; } - QuicEncryptedPacket packet(reinterpret_cast<char*>(iov_[i].iov_base), - mmsg_hdr_[i].msg_len, false); + QuicEncryptedPacket packet( + reinterpret_cast<char*>(packets_[i].iov.iov_base), mmsg_hdr_[i].msg_len, + false); IPEndPoint server_address(server_ip, port); processor->ProcessPacket(server_address, client_address, packet); }
diff --git a/net/tools/quic/quic_packet_reader.h b/net/tools/quic/quic_packet_reader.h index 726f449..22a6f49 100644 --- a/net/tools/quic/quic_packet_reader.h +++ b/net/tools/quic/quic_packet_reader.h
@@ -61,18 +61,23 @@ // Storage only used when recvmmsg is available. #if MMSG_MORE - // cbuf_ is used for ancillary data from the kernel on recvmmsg. - char cbuf_[kSpaceForOverflowAndIp * kNumPacketsPerReadMmsgCall]; - // buf_ is used for the data read from the kernel on recvmmsg. // TODO(danzh): change it to be a pointer to avoid the allocation on the stack // from exceeding maximum allowed frame size. - char buf_[kMaxPacketSize * kNumPacketsPerReadMmsgCall]; - // iov_ and mmsg_hdr_ are used to supply cbuf and buf to the recvmmsg call. - iovec iov_[kNumPacketsPerReadMmsgCall]; + // packets_ and mmsg_hdr_ are used to supply cbuf and buf to the recvmmsg + // call. + + struct PacketData { + iovec iov; + // raw_address is used for address information provided by the recvmmsg + // call on the packets. + struct sockaddr_storage raw_address; + // cbuf is used for ancillary data from the kernel on recvmmsg. + char cbuf[kSpaceForOverflowAndIp]; + // buf is used for the data read from the kernel on recvmmsg. + char buf[kMaxPacketSize]; + }; + PacketData packets_[kNumPacketsPerReadMmsgCall]; mmsghdr mmsg_hdr_[kNumPacketsPerReadMmsgCall]; - // raw_address_ is used for address information provided by the recvmmsg - // call on the packets. - struct sockaddr_storage raw_address_[kNumPacketsPerReadMmsgCall]; #endif DISALLOW_COPY_AND_ASSIGN(QuicPacketReader);
diff --git a/net/tools/quic/quic_time_wait_list_manager.cc b/net/tools/quic/quic_time_wait_list_manager.cc index a583ff6d..3b50f2d 100644 --- a/net/tools/quic/quic_time_wait_list_manager.cc +++ b/net/tools/quic/quic_time_wait_list_manager.cc
@@ -325,6 +325,9 @@ time_added(time_added_), connection_rejected_statelessly(connection_rejected_statelessly) {} +QuicTimeWaitListManager::ConnectionIdData::ConnectionIdData( + const ConnectionIdData& other) = default; + QuicTimeWaitListManager::ConnectionIdData::~ConnectionIdData() {} } // namespace net
diff --git a/net/tools/quic/quic_time_wait_list_manager.h b/net/tools/quic/quic_time_wait_list_manager.h index a5b1212e..51df345d 100644 --- a/net/tools/quic/quic_time_wait_list_manager.h +++ b/net/tools/quic/quic_time_wait_list_manager.h
@@ -149,6 +149,8 @@ QuicTime time_added_, bool connection_rejected_statelessly); + ConnectionIdData(const ConnectionIdData& other); + ~ConnectionIdData(); int num_packets;
diff --git a/net/url_request/redirect_info.cc b/net/url_request/redirect_info.cc index 16b517a..f7f9538 100644 --- a/net/url_request/redirect_info.cc +++ b/net/url_request/redirect_info.cc
@@ -8,6 +8,8 @@ RedirectInfo::RedirectInfo() : status_code(-1) {} +RedirectInfo::RedirectInfo(const RedirectInfo& other) = default; + RedirectInfo::~RedirectInfo() {} } // namespace net
diff --git a/net/url_request/redirect_info.h b/net/url_request/redirect_info.h index b1ae6369..93e7156 100644 --- a/net/url_request/redirect_info.h +++ b/net/url_request/redirect_info.h
@@ -17,6 +17,7 @@ // content/common/resource_messages.h. struct NET_EXPORT RedirectInfo { RedirectInfo(); + RedirectInfo(const RedirectInfo& other); ~RedirectInfo(); // The status code for the redirect response. This is almost redundant with
diff --git a/net/websockets/websocket_channel.cc b/net/websockets/websocket_channel.cc index 3018088d..7d166ee 100644 --- a/net/websockets/websocket_channel.cc +++ b/net/websockets/websocket_channel.cc
@@ -286,6 +286,9 @@ offset_(offset), size_(size) {} +WebSocketChannel::PendingReceivedFrame::PendingReceivedFrame( + const PendingReceivedFrame& other) = default; + WebSocketChannel::PendingReceivedFrame::~PendingReceivedFrame() {} void WebSocketChannel::PendingReceivedFrame::ResetOpcode() {
diff --git a/net/websockets/websocket_channel.h b/net/websockets/websocket_channel.h index 7f341950..97db65f 100644 --- a/net/websockets/websocket_channel.h +++ b/net/websockets/websocket_channel.h
@@ -149,6 +149,7 @@ const scoped_refptr<IOBuffer>& data, uint64_t offset, uint64_t size); + PendingReceivedFrame(const PendingReceivedFrame& other); ~PendingReceivedFrame(); bool final() const { return final_; }
diff --git a/net/websockets/websocket_extension.cc b/net/websockets/websocket_extension.cc index c5e8e17..a0d55607 100644 --- a/net/websockets/websocket_extension.cc +++ b/net/websockets/websocket_extension.cc
@@ -32,6 +32,9 @@ WebSocketExtension::WebSocketExtension(const std::string& name) : name_(name) {} +WebSocketExtension::WebSocketExtension(const WebSocketExtension& other) = + default; + WebSocketExtension::~WebSocketExtension() {} bool WebSocketExtension::Equals(const WebSocketExtension& other) const {
diff --git a/net/websockets/websocket_extension.h b/net/websockets/websocket_extension.h index 20f2922..4c42a76 100644 --- a/net/websockets/websocket_extension.h +++ b/net/websockets/websocket_extension.h
@@ -38,6 +38,7 @@ WebSocketExtension(); explicit WebSocketExtension(const std::string& name); + WebSocketExtension(const WebSocketExtension& other); ~WebSocketExtension(); void Add(const Parameter& parameter) { parameters_.push_back(parameter); }
diff --git a/remoting/base/compound_buffer.cc b/remoting/base/compound_buffer.cc index a659c23f..18e4339 100644 --- a/remoting/base/compound_buffer.cc +++ b/remoting/base/compound_buffer.cc
@@ -19,6 +19,8 @@ size(size_value) { } +CompoundBuffer::DataChunk::DataChunk(const DataChunk& other) = default; + CompoundBuffer::DataChunk::~DataChunk() {} CompoundBuffer::CompoundBuffer()
diff --git a/remoting/base/compound_buffer.h b/remoting/base/compound_buffer.h index 4883e11..d93b0d0 100644 --- a/remoting/base/compound_buffer.h +++ b/remoting/base/compound_buffer.h
@@ -86,6 +86,7 @@ struct DataChunk { DataChunk(net::IOBuffer* buffer, const char* start, int size); + DataChunk(const DataChunk& other); ~DataChunk(); scoped_refptr<net::IOBuffer> buffer;
diff --git a/remoting/host/setup/gaia_oauth_client.cc b/remoting/host/setup/gaia_oauth_client.cc index 9855dd6..6daf95a5 100644 --- a/remoting/host/setup/gaia_oauth_client.cc +++ b/remoting/host/setup/gaia_oauth_client.cc
@@ -94,6 +94,8 @@ this->on_done = on_done; } +GaiaOAuthClient::Request::Request(const Request& other) = default; + GaiaOAuthClient::Request::~Request() { }
diff --git a/remoting/host/setup/gaia_oauth_client.h b/remoting/host/setup/gaia_oauth_client.h index 1af8ded..c963df3 100644 --- a/remoting/host/setup/gaia_oauth_client.h +++ b/remoting/host/setup/gaia_oauth_client.h
@@ -60,6 +60,7 @@ const std::string& auth_code, bool need_user_email, CompletionCallback on_done); + Request(const Request& other); virtual ~Request(); gaia::OAuthClientInfo oauth_client_info; std::string auth_code;
diff --git a/remoting/protocol/pairing_registry.cc b/remoting/protocol/pairing_registry.cc index 9c63a4f..f6ba2d5 100644 --- a/remoting/protocol/pairing_registry.cc +++ b/remoting/protocol/pairing_registry.cc
@@ -44,6 +44,8 @@ shared_secret_(shared_secret) { } +PairingRegistry::Pairing::Pairing(const Pairing& other) = default; + PairingRegistry::Pairing::~Pairing() { }
diff --git a/remoting/protocol/pairing_registry.h b/remoting/protocol/pairing_registry.h index 00cae7f..b34404e1 100644 --- a/remoting/protocol/pairing_registry.h +++ b/remoting/protocol/pairing_registry.h
@@ -47,6 +47,7 @@ const std::string& client_name, const std::string& client_id, const std::string& shared_secret); + Pairing(const Pairing& other); ~Pairing(); static Pairing Create(const std::string& client_name);
diff --git a/remoting/signaling/server_log_entry.cc b/remoting/signaling/server_log_entry.cc index 9eda8931..080f8ea 100644 --- a/remoting/signaling/server_log_entry.cc +++ b/remoting/signaling/server_log_entry.cc
@@ -35,6 +35,8 @@ ServerLogEntry::ServerLogEntry() { } +ServerLogEntry::ServerLogEntry(const ServerLogEntry& other) = default; + ServerLogEntry::~ServerLogEntry() { }
diff --git a/remoting/signaling/server_log_entry.h b/remoting/signaling/server_log_entry.h index f1b0ece..fbcba0f 100644 --- a/remoting/signaling/server_log_entry.h +++ b/remoting/signaling/server_log_entry.h
@@ -28,6 +28,7 @@ }; ServerLogEntry(); + ServerLogEntry(const ServerLogEntry& other); ~ServerLogEntry(); // Sets an arbitrary key/value entry.
diff --git a/remoting/signaling/xmpp_signal_strategy.cc b/remoting/signaling/xmpp_signal_strategy.cc index fbc5373..10aea02 100644 --- a/remoting/signaling/xmpp_signal_strategy.cc +++ b/remoting/signaling/xmpp_signal_strategy.cc
@@ -46,6 +46,9 @@ : port(kDefaultXmppPort), use_tls(true) { } +XmppSignalStrategy::XmppServerConfig::XmppServerConfig( + const XmppServerConfig& other) = default; + XmppSignalStrategy::XmppServerConfig::~XmppServerConfig() { }
diff --git a/remoting/signaling/xmpp_signal_strategy.h b/remoting/signaling/xmpp_signal_strategy.h index 8878547..4743d9f 100644 --- a/remoting/signaling/xmpp_signal_strategy.h +++ b/remoting/signaling/xmpp_signal_strategy.h
@@ -25,6 +25,7 @@ // XMPP Server configuration for XmppSignalStrategy. struct XmppServerConfig { XmppServerConfig(); + XmppServerConfig(const XmppServerConfig& other); ~XmppServerConfig(); std::string host;
diff --git a/remoting/test/connection_setup_info.cc b/remoting/test/connection_setup_info.cc index e6b47a67..12213c9 100644 --- a/remoting/test/connection_setup_info.cc +++ b/remoting/test/connection_setup_info.cc
@@ -10,6 +10,9 @@ ConnectionSetupInfo::ConnectionSetupInfo() { } +ConnectionSetupInfo::ConnectionSetupInfo(const ConnectionSetupInfo& other) = + default; + ConnectionSetupInfo::~ConnectionSetupInfo() { }
diff --git a/remoting/test/connection_setup_info.h b/remoting/test/connection_setup_info.h index 0c9a9e19..96eedcdc 100644 --- a/remoting/test/connection_setup_info.h +++ b/remoting/test/connection_setup_info.h
@@ -16,6 +16,7 @@ // Holds the information needed to establish a connection with a remote host. struct ConnectionSetupInfo { ConnectionSetupInfo(); + ConnectionSetupInfo(const ConnectionSetupInfo& other); ~ConnectionSetupInfo(); // User provided information.
diff --git a/remoting/test/fake_socket_factory.cc b/remoting/test/fake_socket_factory.cc index ed12013..1781185 100644 --- a/remoting/test/fake_socket_factory.cc +++ b/remoting/test/fake_socket_factory.cc
@@ -166,6 +166,9 @@ : from(from), to(to), data(data), data_size(data_size) { } +FakePacketSocketFactory::PendingPacket::PendingPacket( + const PendingPacket& other) = default; + FakePacketSocketFactory::PendingPacket::~PendingPacket() { }
diff --git a/remoting/test/fake_socket_factory.h b/remoting/test/fake_socket_factory.h index c49198ff..8a01456 100644 --- a/remoting/test/fake_socket_factory.h +++ b/remoting/test/fake_socket_factory.h
@@ -86,6 +86,7 @@ const rtc::SocketAddress& to, const scoped_refptr<net::IOBuffer>& data, int data_size); + PendingPacket(const PendingPacket& other); ~PendingPacket(); rtc::SocketAddress from;
diff --git a/remoting/test/host_info.cc b/remoting/test/host_info.cc index 1370011a..4be97e1 100644 --- a/remoting/test/host_info.cc +++ b/remoting/test/host_info.cc
@@ -13,6 +13,8 @@ HostInfo::HostInfo() { } +HostInfo::HostInfo(const HostInfo& other) = default; + HostInfo::~HostInfo() { }
diff --git a/remoting/test/host_info.h b/remoting/test/host_info.h index 1c5028c..41161a3 100644 --- a/remoting/test/host_info.h +++ b/remoting/test/host_info.h
@@ -21,6 +21,7 @@ struct HostInfo { HostInfo(); + HostInfo(const HostInfo& other); ~HostInfo(); // Returns true if |host_info| is valid and initializes HostInfo.
diff --git a/sandbox/win/src/broker_services.cc b/sandbox/win/src/broker_services.cc index 15d905d4..53edf035 100644 --- a/sandbox/win/src/broker_services.cc +++ b/sandbox/win/src/broker_services.cc
@@ -377,10 +377,11 @@ if (stderr_handle != stdout_handle && stderr_handle != INVALID_HANDLE_VALUE) inherited_handle_list.push_back(stderr_handle); - const HandleList& policy_handle_list = policy_base->GetHandlesBeingShared(); + const base::HandlesToInheritVector& policy_handle_list = + policy_base->GetHandlesBeingShared(); - for (auto handle : policy_handle_list) - inherited_handle_list.push_back(handle->Get()); + for (HANDLE handle : policy_handle_list) + inherited_handle_list.push_back(handle); if (inherited_handle_list.size()) ++attribute_count; @@ -442,8 +443,6 @@ DWORD win_result = target->Create(exe_path, command_line, inherit_handles, startup_info, &process_info); - policy_base->ClearSharedHandles(); - if (ERROR_SUCCESS != win_result) { SpawnCleanup(target, win_result); return SBOX_ERROR_CREATE_PROCESS;
diff --git a/sandbox/win/src/policy_target_test.cc b/sandbox/win/src/policy_target_test.cc index d1a82e54..013fddf 100644 --- a/sandbox/win/src/policy_target_test.cc +++ b/sandbox/win/src/policy_target_test.cc
@@ -382,13 +382,13 @@ GetModuleFileNameW(NULL, prog_name, MAX_PATH); TargetPolicy* policy = broker->CreatePolicy(); - void* shared_handle = - policy->AddHandleToShare(read_only_view.handle().GetHandle()); + policy->AddHandleToShare(read_only_view.handle().GetHandle()); base::string16 arguments(L"\""); arguments += prog_name; arguments += L"\" -child 0 shared_memory_handle "; - arguments += base::UintToString16(base::win::HandleToUint32(shared_handle)); + arguments += base::UintToString16( + base::win::HandleToUint32(read_only_view.handle().GetHandle())); // Launch the app. ResultCode result = SBOX_ALL_OK;
diff --git a/sandbox/win/src/sandbox_policy.h b/sandbox/win/src/sandbox_policy.h index 909066f..df76c36 100644 --- a/sandbox/win/src/sandbox_policy.h +++ b/sandbox/win/src/sandbox_policy.h
@@ -8,8 +8,6 @@ #include <stddef.h> #include <stdint.h> -#include <string> - #include "base/strings/string16.h" #include "sandbox/win/src/sandbox_types.h" #include "sandbox/win/src/security_level.h" @@ -253,11 +251,9 @@ virtual ResultCode AddKernelObjectToClose(const wchar_t* handle_type, const wchar_t* handle_name) = 0; - // Adds a handle that will be shared with the target process. - // Returns the handle which was actually shared with the target. This is - // achieved by duplicating the handle to ensure that it is inheritable by - // the target. The caller should treat this as an opaque value. - virtual void* AddHandleToShare(HANDLE handle) = 0; + // Adds a handle that will be shared with the target process. Does not take + // ownership of the handle. + virtual void AddHandleToShare(HANDLE handle) = 0; }; } // namespace sandbox
diff --git a/sandbox/win/src/sandbox_policy_base.cc b/sandbox/win/src/sandbox_policy_base.cc index f7002bf..99e5b74 100644 --- a/sandbox/win/src/sandbox_policy_base.cc +++ b/sandbox/win/src/sandbox_policy_base.cc
@@ -142,8 +142,6 @@ } PolicyBase::~PolicyBase() { - ClearSharedHandles(); - TargetSet::iterator it; for (it = targets_.begin(); it != targets_.end(); ++it) { TargetProcess* target = (*it); @@ -425,30 +423,21 @@ return handle_closer_.AddHandle(handle_type, handle_name); } -void* PolicyBase::AddHandleToShare(HANDLE handle) { - if (base::win::GetVersion() < base::win::VERSION_VISTA) - return nullptr; +void PolicyBase::AddHandleToShare(HANDLE handle) { + CHECK(handle && handle != INVALID_HANDLE_VALUE); - if (!handle) - return nullptr; + // Ensure the handle can be inherited. + BOOL result = SetHandleInformation(handle, HANDLE_FLAG_INHERIT, + HANDLE_FLAG_INHERIT); + PCHECK(result); - HANDLE duped_handle = nullptr; - if (!::DuplicateHandle(::GetCurrentProcess(), handle, ::GetCurrentProcess(), - &duped_handle, 0, TRUE, DUPLICATE_SAME_ACCESS)) { - return nullptr; - } - handles_to_share_.push_back(new base::win::ScopedHandle(duped_handle)); - return duped_handle; + handles_to_share_.push_back(handle); } -const HandleList& PolicyBase::GetHandlesBeingShared() { +const base::HandlesToInheritVector& PolicyBase::GetHandlesBeingShared() { return handles_to_share_; } -void PolicyBase::ClearSharedHandles() { - STLDeleteElements(&handles_to_share_); -} - ResultCode PolicyBase::MakeJobObject(base::win::ScopedHandle* job) { if (job_level_ != JOB_NONE) { // Create the windows job object.
diff --git a/sandbox/win/src/sandbox_policy_base.h b/sandbox/win/src/sandbox_policy_base.h index cd30eba..49fe97f 100644 --- a/sandbox/win/src/sandbox_policy_base.h +++ b/sandbox/win/src/sandbox_policy_base.h
@@ -15,6 +15,7 @@ #include "base/compiler_specific.h" #include "base/macros.h" #include "base/memory/scoped_ptr.h" +#include "base/process/launch.h" #include "base/strings/string16.h" #include "base/win/scoped_handle.h" #include "sandbox/win/src/crosscall_server.h" @@ -32,8 +33,6 @@ class TargetProcess; struct PolicyGlobal; -typedef std::vector<base::win::ScopedHandle*> HandleList; - class PolicyBase final : public TargetPolicy { public: PolicyBase(); @@ -71,7 +70,7 @@ ResultCode AddDllToUnload(const wchar_t* dll_name) override; ResultCode AddKernelObjectToClose(const base::char16* handle_type, const base::char16* handle_name) override; - void* AddHandleToShare(HANDLE handle) override; + void AddHandleToShare(HANDLE handle) override; // Creates a Job object with the level specified in a previous call to // SetJobLevel(). @@ -103,10 +102,7 @@ HANDLE GetStderrHandle(); // Returns the list of handles being shared with the target process. - const HandleList& GetHandlesBeingShared(); - - // Closes the handles being shared with the target and clears out the list. - void ClearSharedHandles(); + const base::HandlesToInheritVector& GetHandlesBeingShared(); private: ~PolicyBase(); @@ -170,7 +166,7 @@ // Contains the list of handles being shared with the target process. // This list contains handles other than the stderr/stdout handles which are // shared with the target at times. - HandleList handles_to_share_; + base::HandlesToInheritVector handles_to_share_; DISALLOW_COPY_AND_ASSIGN(PolicyBase); };
diff --git a/storage/browser/database/databases_table.cc b/storage/browser/database/databases_table.cc index a1bc479..d00b218 100644 --- a/storage/browser/database/databases_table.cc +++ b/storage/browser/database/databases_table.cc
@@ -14,6 +14,8 @@ DatabaseDetails::DatabaseDetails() : estimated_size(0) { } +DatabaseDetails::DatabaseDetails(const DatabaseDetails& other) = default; + DatabaseDetails::~DatabaseDetails() {} bool DatabasesTable::Init() {
diff --git a/storage/browser/database/databases_table.h b/storage/browser/database/databases_table.h index 78e18ba..6dce97c7 100644 --- a/storage/browser/database/databases_table.h +++ b/storage/browser/database/databases_table.h
@@ -20,6 +20,7 @@ struct STORAGE_EXPORT DatabaseDetails { DatabaseDetails(); + DatabaseDetails(const DatabaseDetails& other); ~DatabaseDetails(); std::string origin_identifier;
diff --git a/storage/browser/fileapi/file_system_operation_runner.cc b/storage/browser/fileapi/file_system_operation_runner.cc index 20a957b..4e6bf2b 100644 --- a/storage/browser/fileapi/file_system_operation_runner.cc +++ b/storage/browser/fileapi/file_system_operation_runner.cc
@@ -33,6 +33,8 @@ }; FileSystemOperationRunner::OperationHandle::OperationHandle() {} +FileSystemOperationRunner::OperationHandle::OperationHandle( + const OperationHandle& other) = default; FileSystemOperationRunner::OperationHandle::~OperationHandle() {} FileSystemOperationRunner::~FileSystemOperationRunner() {
diff --git a/storage/browser/fileapi/file_system_operation_runner.h b/storage/browser/fileapi/file_system_operation_runner.h index dabe8f1..7115bc8 100644 --- a/storage/browser/fileapi/file_system_operation_runner.h +++ b/storage/browser/fileapi/file_system_operation_runner.h
@@ -252,6 +252,7 @@ base::WeakPtr<BeginOperationScoper> scope; OperationHandle(); + OperationHandle(const OperationHandle& other); ~OperationHandle(); };
diff --git a/storage/browser/fileapi/file_system_options.cc b/storage/browser/fileapi/file_system_options.cc index 47fc3d0..8037111 100644 --- a/storage/browser/fileapi/file_system_options.cc +++ b/storage/browser/fileapi/file_system_options.cc
@@ -15,6 +15,8 @@ env_override_(env_override) { } +FileSystemOptions::FileSystemOptions(const FileSystemOptions& other) = default; + FileSystemOptions::~FileSystemOptions() { }
diff --git a/storage/browser/fileapi/file_system_options.h b/storage/browser/fileapi/file_system_options.h index 6e15baf9a..717d60c 100644 --- a/storage/browser/fileapi/file_system_options.h +++ b/storage/browser/fileapi/file_system_options.h
@@ -35,6 +35,7 @@ ProfileMode profile_mode, const std::vector<std::string>& additional_allowed_schemes, leveldb::Env* env_override); + FileSystemOptions(const FileSystemOptions& other); ~FileSystemOptions();
diff --git a/storage/browser/fileapi/file_system_url.cc b/storage/browser/fileapi/file_system_url.cc index 13baad42..f1798d8 100644 --- a/storage/browser/fileapi/file_system_url.cc +++ b/storage/browser/fileapi/file_system_url.cc
@@ -24,6 +24,8 @@ mount_option_(FlushPolicy::NO_FLUSH_ON_COMPLETION) { } +FileSystemURL::FileSystemURL(const FileSystemURL& other) = default; + // static FileSystemURL FileSystemURL::CreateForTest(const GURL& url) { return FileSystemURL(url);
diff --git a/storage/browser/fileapi/file_system_url.h b/storage/browser/fileapi/file_system_url.h index aca3cc00..b9e8a99 100644 --- a/storage/browser/fileapi/file_system_url.h +++ b/storage/browser/fileapi/file_system_url.h
@@ -78,6 +78,7 @@ class STORAGE_EXPORT FileSystemURL { public: FileSystemURL(); + FileSystemURL(const FileSystemURL& other); ~FileSystemURL(); // Methods for creating FileSystemURL without attempting to crack them.
diff --git a/storage/common/blob_storage/blob_item_bytes_response.cc b/storage/common/blob_storage/blob_item_bytes_response.cc index 40c07819..534c20dd 100644 --- a/storage/common/blob_storage/blob_item_bytes_response.cc +++ b/storage/common/blob_storage/blob_item_bytes_response.cc
@@ -19,6 +19,9 @@ BlobItemBytesResponse::BlobItemBytesResponse(size_t request_number) : request_number(request_number) {} +BlobItemBytesResponse::BlobItemBytesResponse( + const BlobItemBytesResponse& other) = default; + BlobItemBytesResponse::~BlobItemBytesResponse() {} void PrintTo(const BlobItemBytesResponse& response, ::std::ostream* os) {
diff --git a/storage/common/blob_storage/blob_item_bytes_response.h b/storage/common/blob_storage/blob_item_bytes_response.h index 189313f..3c47451c 100644 --- a/storage/common/blob_storage/blob_item_bytes_response.h +++ b/storage/common/blob_storage/blob_item_bytes_response.h
@@ -23,6 +23,7 @@ BlobItemBytesResponse(); explicit BlobItemBytesResponse(size_t request_number); + BlobItemBytesResponse(const BlobItemBytesResponse& other); ~BlobItemBytesResponse(); char* allocate_mutable_data(size_t size) {
diff --git a/storage/common/data_element.cc b/storage/common/data_element.cc index 821badb..ea11f43 100644 --- a/storage/common/data_element.cc +++ b/storage/common/data_element.cc
@@ -19,6 +19,8 @@ offset_(0), length_(std::numeric_limits<uint64_t>::max()) {} +DataElement::DataElement(const DataElement& other) = default; + DataElement::~DataElement() {} void DataElement::SetToFilePathRange(
diff --git a/storage/common/data_element.h b/storage/common/data_element.h index 2f28c40..08fea6e 100644 --- a/storage/common/data_element.h +++ b/storage/common/data_element.h
@@ -38,6 +38,7 @@ }; DataElement(); + DataElement(const DataElement& other); ~DataElement(); Type type() const { return type_; }
diff --git a/sync/internal_api/model_type_entity.cc b/sync/internal_api/model_type_entity.cc index 19be3e6..d73a8f6 100644 --- a/sync/internal_api/model_type_entity.cc +++ b/sync/internal_api/model_type_entity.cc
@@ -45,6 +45,7 @@ : client_tag_(client_tag), commit_requested_sequence_number_(metadata->acked_sequence_number()) { DCHECK(metadata->has_client_tag_hash()); + DCHECK(metadata->has_creation_time()); metadata_.Swap(metadata); } @@ -87,7 +88,6 @@ const UpdateResponseData& response_data) { DCHECK(metadata_.has_client_tag_hash()); DCHECK(!metadata_.client_tag_hash().empty()); - DCHECK(metadata_.has_creation_time()); DCHECK(metadata_.has_sequence_number()); // TODO(stanisc): crbug/561829: Filter out update if specifics hash hasn't @@ -109,24 +109,20 @@ encryption_key_name_ = response_data.encryption_key_name; } -void ModelTypeEntity::MakeLocalChange(scoped_ptr<EntityData> entity_data, - base::Time modification_time) { - DCHECK(metadata_.has_client_tag_hash()); +void ModelTypeEntity::MakeLocalChange(scoped_ptr<EntityData> data) { DCHECK(!metadata_.client_tag_hash().empty()); - DCHECK(metadata_.has_creation_time()); + DCHECK_EQ(metadata_.client_tag_hash(), data->client_tag_hash); + DCHECK(!data->modification_time.is_null()); - metadata_.set_modification_time(syncer::TimeToProtoTime(modification_time)); + metadata_.set_modification_time( + syncer::TimeToProtoTime(data->modification_time)); metadata_.set_is_deleted(false); IncrementSequenceNumber(); - UpdateSpecificsHash(entity_data->specifics); + UpdateSpecificsHash(data->specifics); - entity_data->client_tag_hash = metadata_.client_tag_hash(); - entity_data->id = metadata_.server_id(); - entity_data->creation_time = - syncer::ProtoTimeToTime(metadata_.creation_time()); - entity_data->modification_time = modification_time; - - CacheCommitData(entity_data.get()); + data->id = metadata_.server_id(); + data->creation_time = syncer::ProtoTimeToTime(metadata_.creation_time()); + CacheCommitData(data.get()); } void ModelTypeEntity::UpdateDesiredEncryptionKey(const std::string& name) {
diff --git a/sync/internal_api/model_type_entity_unittest.cc b/sync/internal_api/model_type_entity_unittest.cc index c1d0035..6f2856c 100644 --- a/sync/internal_api/model_type_entity_unittest.cc +++ b/sync/internal_api/model_type_entity_unittest.cc
@@ -60,9 +60,11 @@ void MakeLocalChange(ModelTypeEntity* entity, const sync_pb::EntitySpecifics& specifics) { scoped_ptr<EntityData> entity_data = make_scoped_ptr(new EntityData()); + entity_data->client_tag_hash = entity->metadata().client_tag_hash(); entity_data->specifics = specifics; entity_data->non_unique_name = "foo"; - entity->MakeLocalChange(std::move(entity_data), kMtime); + entity_data->modification_time = kMtime; + entity->MakeLocalChange(std::move(entity_data)); } scoped_ptr<ModelTypeEntity> NewServerItem() {
diff --git a/sync/internal_api/public/base/model_type.h b/sync/internal_api/public/base/model_type.h index 30b15bb..5e33084 100644 --- a/sync/internal_api/public/base/model_type.h +++ b/sync/internal_api/public/base/model_type.h
@@ -349,9 +349,6 @@ // Returns true if |model_type| supports ordering of sibling entries. SYNC_EXPORT bool TypeSupportsOrdering(ModelType model_type); -// Returns set of model types that should be backed up before first sync. -SYNC_EXPORT ModelTypeSet BackupTypes(); - } // namespace syncer #endif // SYNC_INTERNAL_API_PUBLIC_BASE_MODEL_TYPE_H_
diff --git a/sync/internal_api/public/model_type_entity.h b/sync/internal_api/public/model_type_entity.h index f8204a2..733a148 100644 --- a/sync/internal_api/public/model_type_entity.h +++ b/sync/internal_api/public/model_type_entity.h
@@ -77,8 +77,7 @@ void ApplyUpdateFromServer(const UpdateResponseData& response_data); // Applies a local change to this item. - void MakeLocalChange(scoped_ptr<EntityData> entity_data, - base::Time modification_time); + void MakeLocalChange(scoped_ptr<EntityData> data); // Schedule a commit if the |name| does not match this item's last known // encryption key. The worker that performs the commit is expected to
diff --git a/sync/internal_api/public/shared_model_type_processor.h b/sync/internal_api/public/shared_model_type_processor.h index d365f258..7ca4572 100644 --- a/sync/internal_api/public/shared_model_type_processor.h +++ b/sync/internal_api/public/shared_model_type_processor.h
@@ -117,6 +117,9 @@ // Requires that no entity for |tag| already exists in the map. ModelTypeEntity* CreateEntity(const std::string& tag, const EntityData& data); + // Version of the above that generates a tag for |data|. + ModelTypeEntity* CreateEntity(const EntityData& data); + syncer::ModelType type_; sync_pb::DataTypeState data_type_state_;
diff --git a/sync/internal_api/shared_model_type_processor.cc b/sync/internal_api/shared_model_type_processor.cc index 0956151..757e12d 100644 --- a/sync/internal_api/shared_model_type_processor.cc +++ b/sync/internal_api/shared_model_type_processor.cc
@@ -213,55 +213,46 @@ FlushPendingCommitRequests(); } -void SharedModelTypeProcessor::Put(const std::string& client_tag, - scoped_ptr<EntityData> entity_data, +void SharedModelTypeProcessor::Put(const std::string& tag, + scoped_ptr<EntityData> data, MetadataChangeList* metadata_change_list) { DCHECK(IsAllowingChanges()); - DCHECK(entity_data.get()); - DCHECK(!entity_data->is_deleted()); - DCHECK(!entity_data->non_unique_name.empty()); - DCHECK_EQ(type_, syncer::GetModelTypeFromSpecifics(entity_data->specifics)); + DCHECK(data.get()); + DCHECK(!data->is_deleted()); + DCHECK(!data->non_unique_name.empty()); + DCHECK_EQ(type_, syncer::GetModelTypeFromSpecifics(data->specifics)); if (!data_type_state_.initial_sync_done()) { // Ignore changes before the initial sync is done. return; } - // If the service specified an overriding hash, use that, otherwise generate - // one from the tag. - // TODO(skym): This behavior should be delayed, once crbug.com/561818 is fixed - // we will only perform this logic in the create case. - const std::string client_tag_hash( - entity_data->client_tag_hash.empty() - ? syncer::syncable::GenerateSyncableHash(type_, client_tag) - : entity_data->client_tag_hash); + // Fill in some data. + data->client_tag_hash = GetHashForTag(tag); + if (data->modification_time.is_null()) { + data->modification_time = base::Time::Now(); + } - base::Time now = base::Time::Now(); + ModelTypeEntity* entity = GetEntityForTagHash(data->client_tag_hash); - // TODO(stanisc): crbug.com/561818: Search by client_tag rather than - // client_tag_hash. - ModelTypeEntity* entity = GetEntityForTagHash(client_tag_hash); if (entity == nullptr) { // The service is creating a new entity. - scoped_ptr<ModelTypeEntity> scoped_entity = ModelTypeEntity::CreateNew( - client_tag, client_tag_hash, entity_data->id, now); - entity = scoped_entity.get(); - entities_[client_tag_hash] = std::move(scoped_entity); - } else { - // The service is updating an existing entity. - DCHECK_EQ(client_tag, entity->client_tag()); + if (data->creation_time.is_null()) { + data->creation_time = data->modification_time; + } + entity = CreateEntity(tag, *data); } // TODO(stanisc): crbug.com/561829: Avoid committing a change if there is no // actual change. - entity->MakeLocalChange(std::move(entity_data), now); - metadata_change_list->UpdateMetadata(client_tag, entity->metadata()); + entity->MakeLocalChange(std::move(data)); + metadata_change_list->UpdateMetadata(tag, entity->metadata()); FlushPendingCommitRequests(); } void SharedModelTypeProcessor::Delete( - const std::string& client_tag, + const std::string& tag, MetadataChangeList* metadata_change_list) { DCHECK(IsAllowingChanges()); @@ -270,24 +261,17 @@ return; } - const std::string client_tag_hash( - syncer::syncable::GenerateSyncableHash(type_, client_tag)); - - // TODO(skym): crbug.com/561818: Search by client_tag rather than - // client_tag_hash. - ModelTypeEntity* entity = GetEntityForTagHash(client_tag_hash); + ModelTypeEntity* entity = GetEntityForTag(tag); if (entity == nullptr) { // That's unusual, but not necessarily a bad thing. // Missing is as good as deleted as far as the model is concerned. DLOG(WARNING) << "Attempted to delete missing item." - << " client tag: " << client_tag; + << " client tag: " << tag; return; } entity->Delete(); - - metadata_change_list->UpdateMetadata(client_tag, entity->metadata()); - + metadata_change_list->UpdateMetadata(tag, entity->metadata()); FlushPendingCommitRequests(); } @@ -382,17 +366,9 @@ continue; } - // Let the service define |client_tag| based on the entity data. - const std::string client_tag = service_->GetClientTag(data); - - scoped_ptr<ModelTypeEntity> scoped_entity = ModelTypeEntity::CreateNew( - client_tag, client_tag_hash, data.id, data.creation_time); - entity = scoped_entity.get(); - entities_[client_tag_hash] = std::move(scoped_entity); - + entity = CreateEntity(data); entity_changes.push_back( - EntityChange::CreateAdd(client_tag, update.entity)); - + EntityChange::CreateAdd(entity->client_tag(), update.entity)); } else { if (data.is_deleted()) { entity_changes.push_back( @@ -458,12 +434,8 @@ metadata_changes->UpdateDataTypeState(data_type_state_); for (const UpdateResponseData& update : updates) { - const EntityData& data = update.entity.value(); - - // Let the service define a client |tag| based on the entity data. - std::string tag = service_->GetClientTag(data); - - ModelTypeEntity* entity = CreateEntity(tag, data); + ModelTypeEntity* entity = CreateEntity(update.entity.value()); + const std::string& tag = entity->client_tag(); entity->ApplyUpdateFromServer(update); metadata_changes->UpdateMetadata(tag, entity->metadata()); data_map[tag] = update.entity; @@ -503,4 +475,13 @@ return entity_ptr; } +ModelTypeEntity* SharedModelTypeProcessor::CreateEntity( + const EntityData& data) { + // Let the service define |client_tag| based on the entity data. + const std::string tag = service_->GetClientTag(data); + // This constraint may be relaxed in the future. + DCHECK_EQ(data.client_tag_hash, GetHashForTag(tag)); + return CreateEntity(tag, data); +} + } // namespace syncer_v2
diff --git a/sync/internal_api/shared_model_type_processor_unittest.cc b/sync/internal_api/shared_model_type_processor_unittest.cc index 8e1c730..fb5363ba 100644 --- a/sync/internal_api/shared_model_type_processor_unittest.cc +++ b/sync/internal_api/shared_model_type_processor_unittest.cc
@@ -803,8 +803,6 @@ // The purpose of this test case is to test setting |client_tag_hash| and |id| // on the EntityData object as we pass it into the Put method of the processor. -// TODO(skym): Update this test to verify that specifying a |client_tag_hash| -// on update has no effect once crbug/561818 is completed. TEST_F(SharedModelTypeProcessorTest, CreateAndModifyWithOverrides) { InitializeToReadyState(); EXPECT_EQ(0U, GetNumCommitRequestLists()); @@ -818,48 +816,44 @@ entity_data->id = "cid1"; WriteItem("tag1", std::move(entity_data)); - // Don't access through tag because we forced a specific hash. EXPECT_EQ(1U, GetNumCommitRequestLists()); - ASSERT_TRUE(mock_queue()->HasCommitRequestForTagHash("hash")); - const EntityData& out_entity1 = - mock_queue()->GetLatestCommitRequestForTagHash("hash").entity.value(); - - EXPECT_EQ("hash", out_entity1.client_tag_hash); - EXPECT_EQ("cid1", out_entity1.id); - EXPECT_EQ("value1", out_entity1.specifics.preference().value()); - + ASSERT_FALSE(mock_queue()->HasCommitRequestForTagHash("hash")); + ASSERT_TRUE(HasCommitRequestForTag("tag1")); EXPECT_EQ(1U, db().MetadataCount()); + const EntityData& out_entity1 = + GetLatestCommitRequestForTag("tag1").entity.value(); const sync_pb::EntityMetadata metadata_v1 = db().GetMetadata("tag1"); + + EXPECT_EQ("cid1", out_entity1.id); + EXPECT_NE("hash", out_entity1.client_tag_hash); + EXPECT_EQ("value1", out_entity1.specifics.preference().value()); EXPECT_EQ("cid1", metadata_v1.server_id()); - EXPECT_EQ("hash", metadata_v1.client_tag_hash()); + EXPECT_EQ(metadata_v1.client_tag_hash(), out_entity1.client_tag_hash); entity_data.reset(new EntityData()); entity_data->specifics.mutable_preference()->set_name("name2"); entity_data->specifics.mutable_preference()->set_value("value2"); entity_data->non_unique_name = "name2"; entity_data->client_tag_hash = "hash"; - // TODO(skym): Consider removing this. The ID should never be changed by the - // client once established. + // Make sure ID isn't overwritten either. entity_data->id = "cid2"; - WriteItem("tag1", std::move(entity_data)); EXPECT_EQ(2U, GetNumCommitRequestLists()); - ASSERT_TRUE(mock_queue()->HasCommitRequestForTagHash("hash")); - const EntityData& out_entity2 = - mock_queue()->GetLatestCommitRequestForTagHash("hash").entity.value(); - - // Should still see old cid1 value, override is not respected on update. - EXPECT_EQ("hash", out_entity2.client_tag_hash); - EXPECT_EQ("cid1", out_entity2.id); - EXPECT_EQ("value2", out_entity2.specifics.preference().value()); - + ASSERT_FALSE(mock_queue()->HasCommitRequestForTagHash("hash")); + ASSERT_TRUE(HasCommitRequestForTag("tag1")); EXPECT_EQ(1U, db().MetadataCount()); + const EntityData& out_entity2 = + GetLatestCommitRequestForTag("tag1").entity.value(); const sync_pb::EntityMetadata metadata_v2 = db().GetMetadata("tag1"); - // TODO(skym): Is this correct? - EXPECT_EQ("cid1", metadata_v2.server_id()); - EXPECT_EQ("hash", metadata_v2.client_tag_hash()); + EXPECT_EQ("value2", out_entity2.specifics.preference().value()); + // Should still see old cid1 value, override is not respected on update. + EXPECT_EQ("cid1", out_entity2.id); + EXPECT_EQ("cid1", metadata_v2.server_id()); + EXPECT_EQ(metadata_v2.client_tag_hash(), out_entity2.client_tag_hash); + + // Specifics have changed so the hashes should not match. EXPECT_NE(metadata_v1.specifics_hash(), metadata_v2.specifics_hash()); }
diff --git a/sync/syncable/model_type.cc b/sync/syncable/model_type.cc index b7fd364d..1043383 100644 --- a/sync/syncable/model_type.cc +++ b/sync/syncable/model_type.cc
@@ -555,21 +555,6 @@ return result; } -ModelTypeSet BackupTypes() { - ModelTypeSet result; - result.Put(BOOKMARKS); - result.Put(PREFERENCES); - result.Put(THEMES); - result.Put(EXTENSIONS); - result.Put(SEARCH_ENGINES); - result.Put(APPS); - result.Put(APP_LIST); - result.Put(APP_SETTINGS); - result.Put(EXTENSION_SETTINGS); - result.Put(PRIORITY_PREFERENCES); - return result; -} - const char* ModelTypeToString(ModelType model_type) { // This is used in serialization routines as well as for displaying debug // information. Do not attempt to change these string values unless you know
diff --git a/testing/buildbot/chromium.linux.json b/testing/buildbot/chromium.linux.json index 64d8a79..3f5cf328 100644 --- a/testing/buildbot/chromium.linux.json +++ b/testing/buildbot/chromium.linux.json
@@ -167,9 +167,15 @@ "test": "components_unittests" }, { - "args": [ - "--isolate_file_path=src/content/content_browsertests.isolate" - ], + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "build.id": "KTU84P", + "product.board": "hammerhead" + } + ] + }, "test": "content_browsertests" }, {
diff --git a/testing/buildbot/chromium.mac.json b/testing/buildbot/chromium.mac.json index b01e0a7..7b08547 100644 --- a/testing/buildbot/chromium.mac.json +++ b/testing/buildbot/chromium.mac.json
@@ -704,668 +704,6 @@ } ] }, - "Mac10.6 Tests": { - "gtest_tests": [ - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "accessibility_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "app_list_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "base_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "battor_agent_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true, - "shards": 10 - }, - "test": "browser_tests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "cacheinvalidation_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "cast_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "cc_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "chrome_app_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "chromedriver_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "components_browsertests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "components_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "content_browsertests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "content_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "crypto_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "device_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "extensions_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "gcm_unit_tests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "gfx_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "gn_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "google_apis_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "gpu_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "interactive_ui_tests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "ipc_tests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "jingle_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "media_blink_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "media_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "message_center_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "midi_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "mojo_common_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "mojo_public_bindings_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "mojo_public_environment_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "mojo_public_system_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "mojo_public_utility_unittests" - }, - { - "test": "mojo_system_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "nacl_loader_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "net_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "ppapi_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "printing_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "remoting_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "sandbox_mac_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "skia_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "sql_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "sync_integration_tests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "sync_unit_tests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "ui_base_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "unit_tests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "url_unittests" - } - ], - "isolated_scripts": [ - { - "isolate_name": "telemetry_gpu_unittests", - "name": "telemetry_gpu_unittests", - "override_compile_targets": [ - "telemetry_gpu_unittests_run" - ], - "swarming": { - "can_use_on_swarming_builders": true - } - }, - { - "isolate_name": "telemetry_perf_unittests", - "name": "telemetry_perf_unittests", - "override_compile_targets": [ - "telemetry_perf_unittests_run" - ], - "swarming": { - "can_use_on_swarming_builders": true - } - }, - { - "isolate_name": "telemetry_unittests", - "name": "telemetry_unittests", - "override_compile_targets": [ - "telemetry_unittests_run" - ], - "swarming": { - "can_use_on_swarming_builders": true - } - } - ], - "scripts": [ - { - "name": "nacl_integration", - "script": "nacl_integration.py" - } - ] - }, - "Mac10.8 Tests": { - "gtest_tests": [ - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "accessibility_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "app_list_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "base_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "battor_agent_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true, - "shards": 10 - }, - "test": "browser_tests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "cacheinvalidation_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "cast_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "cc_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "chrome_app_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "chromedriver_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "components_browsertests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "components_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "content_browsertests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "content_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "crypto_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "device_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "extensions_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "gcm_unit_tests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "gfx_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "gin_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "gn_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "google_apis_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "gpu_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "interactive_ui_tests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "ipc_tests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "jingle_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "media_blink_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "media_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "message_center_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "midi_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "mojo_common_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "mojo_public_bindings_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "mojo_public_environment_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "mojo_public_system_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "mojo_public_utility_unittests" - }, - { - "test": "mojo_system_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "nacl_loader_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "net_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "ppapi_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "printing_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "remoting_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "sandbox_mac_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "skia_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "sql_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "sync_integration_tests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "sync_unit_tests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "ui_base_unittests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "unit_tests" - }, - { - "swarming": { - "can_use_on_swarming_builders": true - }, - "test": "url_unittests" - } - ], - "isolated_scripts": [ - { - "isolate_name": "telemetry_gpu_unittests", - "name": "telemetry_gpu_unittests", - "override_compile_targets": [ - "telemetry_gpu_unittests_run" - ], - "swarming": { - "can_use_on_swarming_builders": true - } - }, - { - "isolate_name": "telemetry_perf_unittests", - "name": "telemetry_perf_unittests", - "override_compile_targets": [ - "telemetry_perf_unittests_run" - ], - "swarming": { - "can_use_on_swarming_builders": true - } - }, - { - "isolate_name": "telemetry_unittests", - "name": "telemetry_unittests", - "override_compile_targets": [ - "telemetry_unittests_run" - ], - "swarming": { - "can_use_on_swarming_builders": true - } - } - ], - "scripts": [ - { - "name": "nacl_integration", - "script": "nacl_integration.py" - } - ] - }, "Mac10.9 Tests": { "gtest_tests": [ {
diff --git a/testing/variations/fieldtrial_testing_config_android.json b/testing/variations/fieldtrial_testing_config_android.json index 1e6f1a5..a08a5cc 100644 --- a/testing/variations/fieldtrial_testing_config_android.json +++ b/testing/variations/fieldtrial_testing_config_android.json
@@ -228,10 +228,7 @@ ], "QUIC": [ { - "group_name": "Enabled", - "params": { - "alternate_protocol_probability_threshold": "0.001" - } + "group_name": "Enabled" } ], "ReaderModeUIFeedback": [
diff --git a/testing/variations/fieldtrial_testing_config_chromeos.json b/testing/variations/fieldtrial_testing_config_chromeos.json index 8f8a29a..6a5286b34 100644 --- a/testing/variations/fieldtrial_testing_config_chromeos.json +++ b/testing/variations/fieldtrial_testing_config_chromeos.json
@@ -83,10 +83,7 @@ ], "QUIC": [ { - "group_name": "Enabled", - "params": { - "alternate_protocol_probability_threshold": "0.01" - } + "group_name": "Enabled" } ], "RenderingPipelineThrottling": [
diff --git a/testing/variations/fieldtrial_testing_config_ios.json b/testing/variations/fieldtrial_testing_config_ios.json index 3650d60..67899aa 100644 --- a/testing/variations/fieldtrial_testing_config_ios.json +++ b/testing/variations/fieldtrial_testing_config_ios.json
@@ -48,10 +48,7 @@ ], "QUIC": [ { - "group_name": "Enabled", - "params": { - "alternate_protocol_probability_threshold": "0.001" - } + "group_name": "Enabled" } ], "SdchPersistence": [
diff --git a/testing/variations/fieldtrial_testing_config_linux.json b/testing/variations/fieldtrial_testing_config_linux.json index 7d03bf12..681ed81f 100644 --- a/testing/variations/fieldtrial_testing_config_linux.json +++ b/testing/variations/fieldtrial_testing_config_linux.json
@@ -98,10 +98,7 @@ ], "QUIC": [ { - "group_name": "Enabled", - "params": { - "alternate_protocol_probability_threshold": "0.01" - } + "group_name": "Enabled" } ], "RefreshTokenDeviceId": [
diff --git a/testing/variations/fieldtrial_testing_config_mac.json b/testing/variations/fieldtrial_testing_config_mac.json index 004c5a8..72e6e6c 100644 --- a/testing/variations/fieldtrial_testing_config_mac.json +++ b/testing/variations/fieldtrial_testing_config_mac.json
@@ -114,10 +114,7 @@ ], "QUIC": [ { - "group_name": "Enabled", - "params": { - "alternate_protocol_probability_threshold": "0.01" - } + "group_name": "Enabled" } ], "RefreshTokenDeviceId": [
diff --git a/testing/variations/fieldtrial_testing_config_win.json b/testing/variations/fieldtrial_testing_config_win.json index 19910bc00..6f069b0 100644 --- a/testing/variations/fieldtrial_testing_config_win.json +++ b/testing/variations/fieldtrial_testing_config_win.json
@@ -173,10 +173,7 @@ ], "QUIC": [ { - "group_name": "Enabled", - "params": { - "alternate_protocol_probability_threshold": "0.01" - } + "group_name": "Enabled" } ], "RefreshTokenDeviceId": [
diff --git a/third_party/WebKit/LayoutTests/TestExpectations b/third_party/WebKit/LayoutTests/TestExpectations index 72377be..573cf2f 100644 --- a/third_party/WebKit/LayoutTests/TestExpectations +++ b/third_party/WebKit/LayoutTests/TestExpectations
@@ -1387,7 +1387,7 @@ crbug.com/587779 [ Retina Mac10.10 ] fast/dynamic/window-resize-scrollbars-test.html [ Timeout Failure Pass ] -crbug.com/587950 [ Mac Win ] virtual/threaded/animations/background-shorthand-crash.html [ Failure ] +crbug.com/587950 [ Mac Win ] virtual/threaded/animations/background-shorthand-crash.html [ Failure Crash ] crbug.com/588061 [ Debug ] inspector/sources/debugger-breakpoints/debugger-reload-breakpoints-with-source-maps.html [ Pass Failure ]
diff --git a/third_party/WebKit/LayoutTests/accessibility/content-changed-notification-causes-crash-expected.txt b/third_party/WebKit/LayoutTests/accessibility/content-changed-notification-causes-crash-expected.txt index 689b10a..479cca4d 100644 --- a/third_party/WebKit/LayoutTests/accessibility/content-changed-notification-causes-crash-expected.txt +++ b/third_party/WebKit/LayoutTests/accessibility/content-changed-notification-causes-crash-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. >> Ensures that this snippet does not lead to a crash. Bug 86029.
diff --git a/third_party/WebKit/LayoutTests/accessibility/contenteditable-table-check-causes-crash-expected.txt b/third_party/WebKit/LayoutTests/accessibility/contenteditable-table-check-causes-crash-expected.txt index b9ee65a..9f26c84 100644 --- a/third_party/WebKit/LayoutTests/accessibility/contenteditable-table-check-causes-crash-expected.txt +++ b/third_party/WebKit/LayoutTests/accessibility/contenteditable-table-check-causes-crash-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. Ensures that this snippet does not lead to a crash in the code that detects if a table is contenteditable. Bug 87409. On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/WebKit/LayoutTests/accessibility/duplicate-axlayoutobject-crash-expected.txt b/third_party/WebKit/LayoutTests/accessibility/duplicate-axlayoutobject-crash-expected.txt index 01edd50..6dcb9953 100644 --- a/third_party/WebKit/LayoutTests/accessibility/duplicate-axlayoutobject-crash-expected.txt +++ b/third_party/WebKit/LayoutTests/accessibility/duplicate-axlayoutobject-crash-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. PASS successfullyParsed is true TEST COMPLETE
diff --git a/third_party/WebKit/LayoutTests/bluetooth/getCharacteristic.html b/third_party/WebKit/LayoutTests/bluetooth/getCharacteristic.html index 2906262b..75c9e5732 100644 --- a/third_party/WebKit/LayoutTests/bluetooth/getCharacteristic.html +++ b/third_party/WebKit/LayoutTests/bluetooth/getCharacteristic.html
@@ -40,10 +40,9 @@ }); }, 'Service is removed. Reject with InvalidStateError.'); - promise_test(() => { testRunner.setBluetoothMockDataSet('HeartRateAdapter'); - let expected = new DOMException('Characteristic not found in device.', + let expected = new DOMException('No Characteristics with specified UUID found in Service.', 'NotFoundError'); return requestDeviceWithKeyDown({filters: [{services: ['heart_rate']}], optionalServices: ['generic_access']})
diff --git a/third_party/WebKit/LayoutTests/bluetooth/getCharacteristics/blacklisted-characteristics-with-uuid.html b/third_party/WebKit/LayoutTests/bluetooth/getCharacteristics/blacklisted-characteristics-with-uuid.html new file mode 100644 index 0000000..b6d13cd --- /dev/null +++ b/third_party/WebKit/LayoutTests/bluetooth/getCharacteristics/blacklisted-characteristics-with-uuid.html
@@ -0,0 +1,22 @@ +<!DOCTYPE html> +<script src="../../resources/testharness.js"></script> +<script src="../../resources/testharnessreport.js"></script> +<script src="../resources/bluetooth-helpers.js"></script> +<script> +'use strict'; +promise_test(() => { + testRunner.setBluetoothMockDataSet('BlacklistTestAdapter'); + return requestDeviceWithKeyDown({filters: [{services: ['device_information']}]}) + .then(device => device.gatt.connect()) + .then(gattServer => gattServer.getPrimaryService('device_information')) + .then(service => { + return assert_promise_rejects_with_message( + service.getCharacteristics('serial_number_string'), + new DOMException('getCharacteristic(s) called with blacklisted UUID. ' + + 'https://goo.gl/4NeimX', + 'SecurityError'), + 'Serial Number String characteristic is blacklisted.'); + }); +}, 'Serial Number String characteristic is blacklisted. Should reject with ' + + 'SecurityError.'); +</script>
diff --git a/third_party/WebKit/LayoutTests/bluetooth/getCharacteristics/blacklisted-characteristics.html b/third_party/WebKit/LayoutTests/bluetooth/getCharacteristics/blacklisted-characteristics.html new file mode 100644 index 0000000..decab58 --- /dev/null +++ b/third_party/WebKit/LayoutTests/bluetooth/getCharacteristics/blacklisted-characteristics.html
@@ -0,0 +1,18 @@ +<!DOCTYPE html> +<script src="../../resources/testharness.js"></script> +<script src="../../resources/testharnessreport.js"></script> +<script src="../resources/bluetooth-helpers.js"></script> +<script> +'use strict'; +promise_test(() => { + testRunner.setBluetoothMockDataSet('BlacklistTestAdapter'); + return requestDeviceWithKeyDown({filters: [{services: ['device_information']}]}) + .then(device => device.gatt.connect()) + .then(gattServer => gattServer.getPrimaryService('device_information')) + .then(service => assert_promise_rejects_with_message( + service.getCharacteristics(), + new DOMException('No Characteristics found in service.', + 'NotFoundError'))); +}, 'The Device Information service is composed of blacklisted ' + + 'characteristics so we shouldn\'t find any.'); +</script>
diff --git a/third_party/WebKit/LayoutTests/bluetooth/getCharacteristics/characteristics-found-with-uuid.html b/third_party/WebKit/LayoutTests/bluetooth/getCharacteristics/characteristics-found-with-uuid.html new file mode 100644 index 0000000..c628398e --- /dev/null +++ b/third_party/WebKit/LayoutTests/bluetooth/getCharacteristics/characteristics-found-with-uuid.html
@@ -0,0 +1,26 @@ +<!DOCTYPE html> +<script src="../../resources/testharness.js"></script> +<script src="../../resources/testharnessreport.js"></script> +<script src="../resources/bluetooth-helpers.js"></script> +<script> +'use strict'; +promise_test(() => { + testRunner.setBluetoothMockDataSet('HeartRateAdapter'); + return requestDeviceWithKeyDown({filters: [{services: ['heart_rate']}]}) + .then(device => device.gatt.connect()) + .then(gattServer => gattServer.getPrimaryService('heart_rate')) + .then(service => Promise.all([ + service.getCharacteristics(body_sensor_location.alias), + service.getCharacteristics(body_sensor_location.name), + service.getCharacteristics(body_sensor_location.uuid)])) + .then(characteristics_arrays => { + characteristics_arrays.forEach(characteristics => { + assert_equals(characteristics.length, 2); + assert_equals(characteristics[0].uuid, + BluetoothUUID.getCharacteristic('body_sensor_location')); + assert_equals(characteristics[1].uuid, + BluetoothUUID.getCharacteristic('body_sensor_location')); + }); + }); +}, 'Find characteristics with UUID in service.'); +</script>
diff --git a/third_party/WebKit/LayoutTests/bluetooth/getCharacteristics/characteristics-found.html b/third_party/WebKit/LayoutTests/bluetooth/getCharacteristics/characteristics-found.html new file mode 100644 index 0000000..3ec8c32 --- /dev/null +++ b/third_party/WebKit/LayoutTests/bluetooth/getCharacteristics/characteristics-found.html
@@ -0,0 +1,23 @@ +<!DOCTYPE html> +<script src="../../resources/testharness.js"></script> +<script src="../../resources/testharnessreport.js"></script> +<script src="../resources/bluetooth-helpers.js"></script> +<script> +'use strict'; +promise_test(() => { + testRunner.setBluetoothMockDataSet('HeartRateAdapter'); + return requestDeviceWithKeyDown({filters: [{services: ['heart_rate']}]}) + .then(device => device.gatt.connect()) + .then(gattServer => gattServer.getPrimaryService('heart_rate')) + .then(service => service.getCharacteristics()) + .then(characteristics => { + assert_equals(characteristics.length, 3); + assert_equals(characteristics[0].uuid, + BluetoothUUID.getCharacteristic('heart_rate_measurement')); + assert_equals(characteristics[1].uuid, + BluetoothUUID.getCharacteristic('body_sensor_location')); + assert_equals(characteristics[2].uuid, + BluetoothUUID.getCharacteristic('body_sensor_location')); + }); +}, 'Find all characteristics in a service.'); +</script>
diff --git a/third_party/WebKit/LayoutTests/bluetooth/getCharacteristics/characteristics-not-found-with-uuid.html b/third_party/WebKit/LayoutTests/bluetooth/getCharacteristics/characteristics-not-found-with-uuid.html new file mode 100644 index 0000000..fa6aefb6 --- /dev/null +++ b/third_party/WebKit/LayoutTests/bluetooth/getCharacteristics/characteristics-not-found-with-uuid.html
@@ -0,0 +1,18 @@ +<!DOCTYPE html> +<script src="../../resources/testharness.js"></script> +<script src="../../resources/testharnessreport.js"></script> +<script src="../resources/bluetooth-helpers.js"></script> +<script> +'use strict'; +promise_test(() => { + testRunner.setBluetoothMockDataSet('HeartRateAdapter'); + let expected = new DOMException( + 'No Characteristics with specified UUID found in Service.', + 'NotFoundError'); + return requestDeviceWithKeyDown({filters: [{services: ['heart_rate']}]}) + .then(device => device.gatt.connect()) + .then(gattServer => gattServer.getPrimaryService('heart_rate')) + .then(service => assert_promise_rejects_with_message( + service.getCharacteristics('battery_level'), expected)); +}, 'Request for absent characteristics with UUID. Reject with NotFoundError.'); +</script>
diff --git a/third_party/WebKit/LayoutTests/bluetooth/getCharacteristics/characteristics-not-found.html b/third_party/WebKit/LayoutTests/bluetooth/getCharacteristics/characteristics-not-found.html new file mode 100644 index 0000000..49bef87 --- /dev/null +++ b/third_party/WebKit/LayoutTests/bluetooth/getCharacteristics/characteristics-not-found.html
@@ -0,0 +1,17 @@ +<!DOCTYPE html> +<script src="../../resources/testharness.js"></script> +<script src="../../resources/testharnessreport.js"></script> +<script src="../resources/bluetooth-helpers.js"></script> +<script> +'use strict'; +promise_test(() => { + testRunner.setBluetoothMockDataSet('MissingCharacteristicHeartRateAdapter'); + return requestDeviceWithKeyDown({filters: [{services: ['heart_rate']}]}) + .then(device => device.gatt.connect()) + .then(gattServer => gattServer.getPrimaryService('heart_rate')) + .then(service => assert_promise_rejects_with_message( + service.getCharacteristics(), + new DOMException('No Characteristics found in service.', + 'NotFoundError'))) +}, 'Request for absent characteristics. Reject with NotFoundError.'); +</script>
diff --git a/third_party/WebKit/LayoutTests/bluetooth/getCharacteristics/correct-characteristics.html b/third_party/WebKit/LayoutTests/bluetooth/getCharacteristics/correct-characteristics.html new file mode 100644 index 0000000..043b0504 --- /dev/null +++ b/third_party/WebKit/LayoutTests/bluetooth/getCharacteristics/correct-characteristics.html
@@ -0,0 +1,28 @@ +<!DOCTYPE html> +<script src="../../resources/testharness.js"></script> +<script src="../../resources/testharnessreport.js"></script> +<script src="../resources/bluetooth-helpers.js"></script> +<script> +'use strict'; +promise_test(() => { + testRunner.setBluetoothMockDataSet('HeartRateAdapter'); + return requestDeviceWithKeyDown({filters: [{services: ['heart_rate']}]}) + .then(device => device.gatt.connect()) + .then(gattServer => gattServer.getPrimaryService('heart_rate')) + .then(service => service.getCharacteristics('body_sensor_location')) + .then(characteristics => { + let body_sensor_location_chest = characteristics[0]; + let body_sensor_location_wrist = characteristics[1]; + return body_sensor_location_chest.readValue() + .then(value => { + assert_equals(value.byteLength, 1); + assert_equals(value.getUint8(0), 1 /* chest */); + }) + .then(() => body_sensor_location_wrist.readValue()) + .then(value => { + assert_equals(value.byteLength, 1); + assert_equals(value.getUint8(0), 2 /* wrist */); + }); + }); +}, 'Find characteristics with UUID in service.'); +</script>
diff --git a/third_party/WebKit/LayoutTests/bluetooth/getCharacteristics/device-goes-out-of-range-with-uuid.html b/third_party/WebKit/LayoutTests/bluetooth/getCharacteristics/device-goes-out-of-range-with-uuid.html new file mode 100644 index 0000000..c4f9a58 --- /dev/null +++ b/third_party/WebKit/LayoutTests/bluetooth/getCharacteristics/device-goes-out-of-range-with-uuid.html
@@ -0,0 +1,21 @@ +<!DOCTYPE html> +<script src="../../resources/testharness.js"></script> +<script src="../../resources/testharnessreport.js"></script> +<script src="../resources/bluetooth-helpers.js"></script> +<script> +'use strict'; +promise_test(() => { + testRunner.setBluetoothMockDataSet('HeartRateAdapter'); + return requestDeviceWithKeyDown({filters: [{services: ['heart_rate']}]}) + .then(device => device.gatt.connect()) + .then(gattServer => gattServer.getPrimaryService('heart_rate')) + .then(service => { + testRunner.setBluetoothMockDataSet('EmptyAdapter'); + return assert_promise_rejects_with_message( + service.getCharacteristics('heart_rate_measurement'), + new DOMException('Bluetooth Device is no longer in range.', + 'NetworkError'), + 'Device went out of range.'); + }); +}, 'Device goes out of range with UUID. Reject with NetworkError.'); +</script>
diff --git a/third_party/WebKit/LayoutTests/bluetooth/getCharacteristics/device-goes-out-of-range.html b/third_party/WebKit/LayoutTests/bluetooth/getCharacteristics/device-goes-out-of-range.html new file mode 100644 index 0000000..ba9a8e8 --- /dev/null +++ b/third_party/WebKit/LayoutTests/bluetooth/getCharacteristics/device-goes-out-of-range.html
@@ -0,0 +1,21 @@ +<!DOCTYPE html> +<script src="../../resources/testharness.js"></script> +<script src="../../resources/testharnessreport.js"></script> +<script src="../resources/bluetooth-helpers.js"></script> +<script> +'use strict'; +promise_test(() => { + testRunner.setBluetoothMockDataSet('HeartRateAdapter'); + return requestDeviceWithKeyDown({filters: [{services: ['heart_rate']}]}) + .then(device => device.gatt.connect()) + .then(gattServer => gattServer.getPrimaryService('heart_rate')) + .then(service => { + testRunner.setBluetoothMockDataSet('EmptyAdapter'); + return assert_promise_rejects_with_message( + service.getCharacteristics(), + new DOMException('Bluetooth Device is no longer in range.', + 'NetworkError'), + 'Device went out of range.'); + }); +}, 'Device goes out of range. Reject with NetworkError.'); +</script>
diff --git a/third_party/WebKit/LayoutTests/bluetooth/getCharacteristics/get-same-characteristics.html b/third_party/WebKit/LayoutTests/bluetooth/getCharacteristics/get-same-characteristics.html new file mode 100644 index 0000000..92e8a26 --- /dev/null +++ b/third_party/WebKit/LayoutTests/bluetooth/getCharacteristics/get-same-characteristics.html
@@ -0,0 +1,27 @@ +<!DOCTYPE html> +<script src="../../resources/testharness.js"></script> +<script src="../../resources/testharnessreport.js"></script> +<script src="../resources/bluetooth-helpers.js"></script> +<script> +'use strict'; +promise_test(() => { + testRunner.setBluetoothMockDataSet('HeartRateAdapter'); + return requestDeviceWithKeyDown({filters: [{services: ['heart_rate']}]}) + .then(device => device.gatt.connect()) + .then(gattServer => gattServer.getPrimaryService('heart_rate')) + .then(service => Promise.all([ + service.getCharacteristics('body_sensor_location'), + service.getCharacteristics('body_sensor_location')])) + .then(characteristics => { + let chars1 = characteristics[0]; + let chars2 = characteristics[1]; + assert_equals(chars1.length, chars2.length); + // TODO(ortuno): getCharacteristics should return the same objects + // if they were created earlier. + // https://crbug.com/495270 + for (let i = 0; i < chars1.length; i++) { + assert_not_equals(chars1[i], chars2[i]); + } + }); +}, 'Calls to get the same characteristics should return the same objects.'); +</script>
diff --git a/third_party/WebKit/LayoutTests/bluetooth/getCharacteristics/invalid-characteristic-name.html b/third_party/WebKit/LayoutTests/bluetooth/getCharacteristics/invalid-characteristic-name.html new file mode 100644 index 0000000..a22054e --- /dev/null +++ b/third_party/WebKit/LayoutTests/bluetooth/getCharacteristics/invalid-characteristic-name.html
@@ -0,0 +1,30 @@ +<!DOCTYPE html> +<script src="../../resources/testharness.js"></script> +<script src="../../resources/testharnessreport.js"></script> +<script src="../resources/bluetooth-helpers.js"></script> +<script> +'use strict'; +promise_test(() => { + testRunner.setBluetoothMockDataSet('HeartRateAdapter'); + return requestDeviceWithKeyDown({filters: [{services: ['heart_rate']}], + optionalServices: ['generic_access']}) + .then(device => device.gatt.connect()) + .then(gattServer => gattServer.getPrimaryService('generic_access')) + .then(service => { + return assert_promise_rejects_with_message( + service.getCharacteristics('wrong_name'), new DOMException( + 'Failed to execute \'getCharacteristics\' on ' + + '\'BluetoothRemoteGATTService\': Invalid Characteristic name: ' + + '\'wrong_name\'. ' + + 'It must be a valid UUID alias (e.g. 0x1234), ' + + 'UUID (lowercase hex characters e.g. ' + + '\'00001234-0000-1000-8000-00805f9b34fb\'), ' + + 'or recognized standard name from ' + + 'https://developer.bluetooth.org/gatt/characteristics/' + + 'Pages/CharacteristicsHome.aspx' + + ' e.g. \'aerobic_heart_rate_lower_limit\'.', + 'SyntaxError'), + 'Wrong Characteristic name passed.'); + }); +}, 'Invalid Characteristic name. Reject with SyntaxError.'); +</script>
diff --git a/third_party/WebKit/LayoutTests/bluetooth/getCharacteristics/service-is-removed-with-uuid.html b/third_party/WebKit/LayoutTests/bluetooth/getCharacteristics/service-is-removed-with-uuid.html new file mode 100644 index 0000000..6134bcb --- /dev/null +++ b/third_party/WebKit/LayoutTests/bluetooth/getCharacteristics/service-is-removed-with-uuid.html
@@ -0,0 +1,21 @@ +<!DOCTYPE html> +<script src="../../resources/testharness.js"></script> +<script src="../../resources/testharnessreport.js"></script> +<script src="../resources/bluetooth-helpers.js"></script> +<script> +'use strict'; +promise_test(() => { + testRunner.setBluetoothMockDataSet('HeartRateAdapter'); + return requestDeviceWithKeyDown({filters: [{services: ['heart_rate']}]}) + .then(device => device.gatt.connect()) + .then(gattService => gattService.getPrimaryService('heart_rate')) + .then(service => { + testRunner.setBluetoothMockDataSet('MissingServiceHeartRateAdapter'); + return assert_promise_rejects_with_message( + service.getCharacteristics('heart_rate_measurement'), + new DOMException('GATT Service no longer exists.', + 'InvalidStateError'), + 'Service got removed.'); + }); +}, 'Service is removed. Reject with InvalidStateError.'); +</script>
diff --git a/third_party/WebKit/LayoutTests/bluetooth/getCharacteristics/service-is-removed.html b/third_party/WebKit/LayoutTests/bluetooth/getCharacteristics/service-is-removed.html new file mode 100644 index 0000000..cbc571b --- /dev/null +++ b/third_party/WebKit/LayoutTests/bluetooth/getCharacteristics/service-is-removed.html
@@ -0,0 +1,21 @@ +<!DOCTYPE html> +<script src="../../resources/testharness.js"></script> +<script src="../../resources/testharnessreport.js"></script> +<script src="../resources/bluetooth-helpers.js"></script> +<script> +'use strict'; +promise_test(() => { + testRunner.setBluetoothMockDataSet('HeartRateAdapter'); + return requestDeviceWithKeyDown({filters: [{services: ['heart_rate']}]}) + .then(device => device.gatt.connect()) + .then(gattService => gattService.getPrimaryService('heart_rate')) + .then(service => { + testRunner.setBluetoothMockDataSet('MissingServiceHeartRateAdapter'); + return assert_promise_rejects_with_message( + service.getCharacteristics(), + new DOMException('GATT Service no longer exists.', + 'InvalidStateError'), + 'Service got removed.'); + }); +}, 'Service is removed. Reject with InvalidStateError.'); +</script>
diff --git a/third_party/WebKit/LayoutTests/bluetooth/resources/bluetooth-helpers.js b/third_party/WebKit/LayoutTests/bluetooth/resources/bluetooth-helpers.js index 174469fd..a6f9310 100644 --- a/third_party/WebKit/LayoutTests/bluetooth/resources/bluetooth-helpers.js +++ b/third_party/WebKit/LayoutTests/bluetooth/resources/bluetooth-helpers.js
@@ -29,6 +29,11 @@ name: 'heart_rate', uuid: '0000180d-0000-1000-8000-00805f9b34fb' }; +var body_sensor_location = { + alias: 0x2a38, + name: 'body_sensor_location', + uuid: '00002a38-0000-1000-8000-00805f9b34fb' +}; var glucose = { alias: 0x1808, name: 'glucose',
diff --git a/third_party/WebKit/LayoutTests/editing/execCommand/remove-format-elements-expected.txt b/third_party/WebKit/LayoutTests/editing/execCommand/remove-format-elements-expected.txt index e2afc97..1327d176 100644 --- a/third_party/WebKit/LayoutTests/editing/execCommand/remove-format-elements-expected.txt +++ b/third_party/WebKit/LayoutTests/editing/execCommand/remove-format-elements-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. Removed acronym, b, bdo, big, cite, code, dfn, em, font, i, ins, kbd, nobr, q, s, samp, small, strike, strong, sub, sup, tt, u, var Preserved
diff --git a/third_party/WebKit/LayoutTests/editing/selection/move-by-word-visually-crash-test-4-expected.txt b/third_party/WebKit/LayoutTests/editing/selection/move-by-word-visually-crash-test-4-expected.txt index 90ad4b3..3694b42 100644 --- a/third_party/WebKit/LayoutTests/editing/selection/move-by-word-visually-crash-test-4-expected.txt +++ b/third_party/WebKit/LayoutTests/editing/selection/move-by-word-visually-crash-test-4-expected.txt
@@ -1 +1,2 @@ +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. Crash test passed
diff --git a/third_party/WebKit/LayoutTests/fast/block/child-not-removed-from-parent-lineboxes-crash-expected.txt b/third_party/WebKit/LayoutTests/fast/block/child-not-removed-from-parent-lineboxes-crash-expected.txt index f528f9c1..12cc28b9 100644 --- a/third_party/WebKit/LayoutTests/fast/block/child-not-removed-from-parent-lineboxes-crash-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/block/child-not-removed-from-parent-lineboxes-crash-expected.txt
@@ -1 +1,2 @@ +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. PASS: does not crash
diff --git a/third_party/WebKit/LayoutTests/fast/block/float/float-not-removed-from-first-letter-expected.txt b/third_party/WebKit/LayoutTests/fast/block/float/float-not-removed-from-first-letter-expected.txt index 47fead0..7afac80e 100644 --- a/third_party/WebKit/LayoutTests/fast/block/float/float-not-removed-from-first-letter-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/block/float/float-not-removed-from-first-letter-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. Webkit Bug 86019 - Crash due to floats not removed from first-letter element. PASS. WebKit didn't crash.
diff --git a/third_party/WebKit/LayoutTests/fast/block/float/split-inline-sibling-of-float-crash-expected.txt b/third_party/WebKit/LayoutTests/fast/block/float/split-inline-sibling-of-float-crash-expected.txt index 4e0a60422..d1dbd1b 100644 --- a/third_party/WebKit/LayoutTests/fast/block/float/split-inline-sibling-of-float-crash-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/block/float/split-inline-sibling-of-float-crash-expected.txt
@@ -1 +1,2 @@ +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. PASS if no crash or assert under ASAN
diff --git a/third_party/WebKit/LayoutTests/fast/canvas/canvas-createImageBitmap-drawImage-with-options-expected.txt b/third_party/WebKit/LayoutTests/fast/canvas/canvas-createImageBitmap-drawImage-with-options-expected.txt index 125b7e44..fcadb19 100644 --- a/third_party/WebKit/LayoutTests/fast/canvas/canvas-createImageBitmap-drawImage-with-options-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/canvas/canvas-createImageBitmap-drawImage-with-options-expected.txt
@@ -73,11 +73,6 @@ PASS This pixel is transparent black. PASS This pixel is transparent black. PASS This pixel is transparent black. -PASS This pixel is transparent black. -PASS This pixel is transparent black. -PASS This pixel is transparent black. -PASS This pixel is transparent black. -PASS This pixel is transparent black. Check crop. PASS jsWrapperClass(bitmap) is 'ImageBitmap' PASS bitmap.width is 10 @@ -169,11 +164,6 @@ PASS This pixel is transparent black. PASS This pixel is transparent black. PASS This pixel is transparent black. -PASS This pixel is transparent black. -PASS This pixel is transparent black. -PASS This pixel is transparent black. -PASS This pixel is transparent black. -PASS This pixel is transparent black. Check crop. PASS jsWrapperClass(bitmap) is 'ImageBitmap' PASS bitmap.width is 10 @@ -269,11 +259,6 @@ PASS This pixel is transparent black. PASS This pixel is transparent black. PASS This pixel is transparent black. -PASS This pixel is transparent black. -PASS This pixel is transparent black. -PASS This pixel is transparent black. -PASS This pixel is transparent black. -PASS This pixel is transparent black. Check crop. PASS jsWrapperClass(bitmap) is 'ImageBitmap' PASS bitmap.width is 10 @@ -367,11 +352,6 @@ PASS This pixel is transparent black. PASS This pixel is transparent black. PASS This pixel is transparent black. -PASS This pixel is transparent black. -PASS This pixel is transparent black. -PASS This pixel is transparent black. -PASS This pixel is transparent black. -PASS This pixel is transparent black. Check crop. PASS jsWrapperClass(bitmap) is 'ImageBitmap' PASS bitmap.width is 10 @@ -471,11 +451,6 @@ PASS This pixel is transparent black. PASS This pixel is transparent black. PASS This pixel is transparent black. -PASS This pixel is transparent black. -PASS This pixel is transparent black. -PASS This pixel is transparent black. -PASS This pixel is transparent black. -PASS This pixel is transparent black. Check crop. PASS jsWrapperClass(bitmap) is 'ImageBitmap' PASS bitmap.width is 10 @@ -567,11 +542,6 @@ PASS This pixel is transparent black. PASS This pixel is transparent black. PASS This pixel is transparent black. -PASS This pixel is transparent black. -PASS This pixel is transparent black. -PASS This pixel is transparent black. -PASS This pixel is transparent black. -PASS This pixel is transparent black. Check crop. PASS jsWrapperClass(bitmap) is 'ImageBitmap' PASS bitmap.width is 10 @@ -667,11 +637,6 @@ PASS This pixel is transparent black. PASS This pixel is transparent black. PASS This pixel is transparent black. -PASS This pixel is transparent black. -PASS This pixel is transparent black. -PASS This pixel is transparent black. -PASS This pixel is transparent black. -PASS This pixel is transparent black. Check crop. PASS jsWrapperClass(bitmap) is 'ImageBitmap' PASS bitmap.width is 10 @@ -765,11 +730,6 @@ PASS This pixel is transparent black. PASS This pixel is transparent black. PASS This pixel is transparent black. -PASS This pixel is transparent black. -PASS This pixel is transparent black. -PASS This pixel is transparent black. -PASS This pixel is transparent black. -PASS This pixel is transparent black. Check crop. PASS jsWrapperClass(bitmap) is 'ImageBitmap' PASS bitmap.width is 10 @@ -869,11 +829,6 @@ PASS This pixel is transparent black. PASS This pixel is transparent black. PASS This pixel is transparent black. -PASS This pixel is transparent black. -PASS This pixel is transparent black. -PASS This pixel is transparent black. -PASS This pixel is transparent black. -PASS This pixel is transparent black. Check crop. PASS jsWrapperClass(bitmap) is 'ImageBitmap' PASS bitmap.width is 10 @@ -965,11 +920,6 @@ PASS This pixel is transparent black. PASS This pixel is transparent black. PASS This pixel is transparent black. -PASS This pixel is transparent black. -PASS This pixel is transparent black. -PASS This pixel is transparent black. -PASS This pixel is transparent black. -PASS This pixel is transparent black. Check crop. PASS jsWrapperClass(bitmap) is 'ImageBitmap' PASS bitmap.width is 10 @@ -1065,11 +1015,6 @@ PASS This pixel is transparent black. PASS This pixel is transparent black. PASS This pixel is transparent black. -PASS This pixel is transparent black. -PASS This pixel is transparent black. -PASS This pixel is transparent black. -PASS This pixel is transparent black. -PASS This pixel is transparent black. Check crop. PASS jsWrapperClass(bitmap) is 'ImageBitmap' PASS bitmap.width is 10 @@ -1163,11 +1108,6 @@ PASS This pixel is transparent black. PASS This pixel is transparent black. PASS This pixel is transparent black. -PASS This pixel is transparent black. -PASS This pixel is transparent black. -PASS This pixel is transparent black. -PASS This pixel is transparent black. -PASS This pixel is transparent black. Check crop. PASS jsWrapperClass(bitmap) is 'ImageBitmap' PASS bitmap.width is 10 @@ -1267,11 +1207,6 @@ PASS This pixel is transparent black. PASS This pixel is transparent black. PASS This pixel is transparent black. -PASS This pixel is transparent black. -PASS This pixel is transparent black. -PASS This pixel is transparent black. -PASS This pixel is transparent black. -PASS This pixel is transparent black. Check crop. PASS jsWrapperClass(bitmap) is 'ImageBitmap' PASS bitmap.width is 10 @@ -1363,11 +1298,6 @@ PASS This pixel is transparent black. PASS This pixel is transparent black. PASS This pixel is transparent black. -PASS This pixel is transparent black. -PASS This pixel is transparent black. -PASS This pixel is transparent black. -PASS This pixel is transparent black. -PASS This pixel is transparent black. Check crop. PASS jsWrapperClass(bitmap) is 'ImageBitmap' PASS bitmap.width is 10 @@ -1463,11 +1393,6 @@ PASS This pixel is transparent black. PASS This pixel is transparent black. PASS This pixel is transparent black. -PASS This pixel is transparent black. -PASS This pixel is transparent black. -PASS This pixel is transparent black. -PASS This pixel is transparent black. -PASS This pixel is transparent black. Check crop. PASS jsWrapperClass(bitmap) is 'ImageBitmap' PASS bitmap.width is 10 @@ -1561,11 +1486,6 @@ PASS This pixel is transparent black. PASS This pixel is transparent black. PASS This pixel is transparent black. -PASS This pixel is transparent black. -PASS This pixel is transparent black. -PASS This pixel is transparent black. -PASS This pixel is transparent black. -PASS This pixel is transparent black. Check crop. PASS jsWrapperClass(bitmap) is 'ImageBitmap' PASS bitmap.width is 10 @@ -1665,11 +1585,6 @@ PASS This pixel is transparent black. PASS This pixel is transparent black. PASS This pixel is transparent black. -PASS This pixel is transparent black. -PASS This pixel is transparent black. -PASS This pixel is transparent black. -PASS This pixel is transparent black. -PASS This pixel is transparent black. Check crop. PASS jsWrapperClass(bitmap) is 'ImageBitmap' PASS bitmap.width is 10 @@ -1761,11 +1676,6 @@ PASS This pixel is transparent black. PASS This pixel is transparent black. PASS This pixel is transparent black. -PASS This pixel is transparent black. -PASS This pixel is transparent black. -PASS This pixel is transparent black. -PASS This pixel is transparent black. -PASS This pixel is transparent black. Check crop. PASS jsWrapperClass(bitmap) is 'ImageBitmap' PASS bitmap.width is 10 @@ -1861,11 +1771,6 @@ PASS This pixel is transparent black. PASS This pixel is transparent black. PASS This pixel is transparent black. -PASS This pixel is transparent black. -PASS This pixel is transparent black. -PASS This pixel is transparent black. -PASS This pixel is transparent black. -PASS This pixel is transparent black. Check crop. PASS jsWrapperClass(bitmap) is 'ImageBitmap' PASS bitmap.width is 10 @@ -1959,11 +1864,6 @@ PASS This pixel is transparent black. PASS This pixel is transparent black. PASS This pixel is transparent black. -PASS This pixel is transparent black. -PASS This pixel is transparent black. -PASS This pixel is transparent black. -PASS This pixel is transparent black. -PASS This pixel is transparent black. Check crop. PASS jsWrapperClass(bitmap) is 'ImageBitmap' PASS bitmap.width is 10
diff --git a/third_party/WebKit/LayoutTests/fast/canvas/canvas-createImageBitmap-drawImage-with-options.html b/third_party/WebKit/LayoutTests/fast/canvas/canvas-createImageBitmap-drawImage-with-options.html index 9325698d..dd8d311 100644 --- a/third_party/WebKit/LayoutTests/fast/canvas/canvas-createImageBitmap-drawImage-with-options.html +++ b/third_party/WebKit/LayoutTests/fast/canvas/canvas-createImageBitmap-drawImage-with-options.html
@@ -537,7 +537,7 @@ shouldBeClear(5, 5); shouldBeClear(1, 5); shouldBeClear(5, 1); - }*/ + } clearContext(ctx); ctx.drawImage(imageBitmap, 10, 10, 20, 20, 0, 0, 20, 20); @@ -553,7 +553,7 @@ shouldBeClear(5, 5); shouldBeClear(1, 5); shouldBeClear(5, 1); - } + }*/ } // For an empty image, the orientation doesn't matter
diff --git a/third_party/WebKit/LayoutTests/fast/css-grid-layout/stale-grid-layout-expected.txt b/third_party/WebKit/LayoutTests/fast/css-grid-layout/stale-grid-layout-expected.txt index 1af5e8b2..89727d7 100644 --- a/third_party/WebKit/LayoutTests/fast/css-grid-layout/stale-grid-layout-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/css-grid-layout/stale-grid-layout-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. The test checks that we don't add non-children of the grid into the grid representation This test has passed if it didn't crash under ASAN.
diff --git a/third_party/WebKit/LayoutTests/fast/css/pseudo-required-optional-unapplied-expected.txt b/third_party/WebKit/LayoutTests/fast/css/pseudo-required-optional-unapplied-expected.txt index d12f43b..4cbacf3 100644 --- a/third_party/WebKit/LayoutTests/fast/css/pseudo-required-optional-unapplied-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/css/pseudo-required-optional-unapplied-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. Check cases that :required/:optional classes are not applied On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/WebKit/LayoutTests/fast/deprecated-flexbox/crash-button-keygen-expected.txt b/third_party/WebKit/LayoutTests/fast/deprecated-flexbox/crash-button-keygen-expected.txt index 22763504..bc4184ef 100644 --- a/third_party/WebKit/LayoutTests/fast/deprecated-flexbox/crash-button-keygen-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/deprecated-flexbox/crash-button-keygen-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. Test for bug 63776: Partial layout when a flex-box has visibility: collapse This test PASSES if it does not CRASH.
diff --git a/third_party/WebKit/LayoutTests/fast/dom/HTMLFormElement/associated-elements-after-index-assertion-fail1-expected.txt b/third_party/WebKit/LayoutTests/fast/dom/HTMLFormElement/associated-elements-after-index-assertion-fail1-expected.txt index 02d7cb5e..c16e5106b 100644 --- a/third_party/WebKit/LayoutTests/fast/dom/HTMLFormElement/associated-elements-after-index-assertion-fail1-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/dom/HTMLFormElement/associated-elements-after-index-assertion-fail1-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. This page verifies fix for bug 58247. WebKit should not crash when this page is rendered.
diff --git a/third_party/WebKit/LayoutTests/fast/dom/HTMLKeygenElement/keygen-expected.txt b/third_party/WebKit/LayoutTests/fast/dom/HTMLKeygenElement/keygen-expected.txt index 132e6c2e9..27379c4 100644 --- a/third_party/WebKit/LayoutTests/fast/dom/HTMLKeygenElement/keygen-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/dom/HTMLKeygenElement/keygen-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. This tests the keygen element On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/WebKit/LayoutTests/fast/dom/click-method-on-html-element-expected.txt b/third_party/WebKit/LayoutTests/fast/dom/click-method-on-html-element-expected.txt index 23a334e5..b94ac3a7 100644 --- a/third_party/WebKit/LayoutTests/fast/dom/click-method-on-html-element-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/dom/click-method-on-html-element-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. The support of click() method on HTMLElement. Pass: Click event handler called for: a
diff --git a/third_party/WebKit/LayoutTests/fast/dom/domstring-attribute-reflection-expected.txt b/third_party/WebKit/LayoutTests/fast/dom/domstring-attribute-reflection-expected.txt index 4d02a193..8f2039c 100644 --- a/third_party/WebKit/LayoutTests/fast/dom/domstring-attribute-reflection-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/dom/domstring-attribute-reflection-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. Reflected DOMString attribute test for button/@name Initial value: PASS element.name is ""
diff --git a/third_party/WebKit/LayoutTests/fast/dom/element-attribute-js-null-expected.txt b/third_party/WebKit/LayoutTests/fast/dom/element-attribute-js-null-expected.txt index 8ac9dcd2..bbb62bb 100644 --- a/third_party/WebKit/LayoutTests/fast/dom/element-attribute-js-null-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/dom/element-attribute-js-null-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. This test setting various attributes of a elements to JavaScript null. TEST SUCCEEDED: The value was null. [tested Node.nodeValue]
diff --git a/third_party/WebKit/LayoutTests/fast/dom/shadow/layout-tests-can-access-shadow-expected.txt b/third_party/WebKit/LayoutTests/fast/dom/shadow/layout-tests-can-access-shadow-expected.txt index d6c0008b..5c9792f 100644 --- a/third_party/WebKit/LayoutTests/fast/dom/shadow/layout-tests-can-access-shadow-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/dom/shadow/layout-tests-can-access-shadow-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. This tests that layout tests can access shadow DOM.
diff --git a/third_party/WebKit/LayoutTests/fast/dom/shadow/no-renderers-for-light-children-expected.txt b/third_party/WebKit/LayoutTests/fast/dom/shadow/no-renderers-for-light-children-expected.txt index 297b2ef..0f16c6f 100644 --- a/third_party/WebKit/LayoutTests/fast/dom/shadow/no-renderers-for-light-children-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/dom/shadow/no-renderers-for-light-children-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. Children of an element are never rendered is it has a shadow DOM subtree. Should not see the word FAIL below.
diff --git a/third_party/WebKit/LayoutTests/fast/dom/shadow/nodetype-expected.txt b/third_party/WebKit/LayoutTests/fast/dom/shadow/nodetype-expected.txt index 21eccd5..2fb99f3 100644 --- a/third_party/WebKit/LayoutTests/fast/dom/shadow/nodetype-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/dom/shadow/nodetype-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. This tests the shadow host's and shadow root's nodeType. PASS keygen.nodeType is Node.ELEMENT_NODE
diff --git a/third_party/WebKit/LayoutTests/fast/dom/shadow/shadow-disable-expected.txt b/third_party/WebKit/LayoutTests/fast/dom/shadow/shadow-disable-expected.txt index e32dbef..62ecfef 100644 --- a/third_party/WebKit/LayoutTests/fast/dom/shadow/shadow-disable-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/dom/shadow/shadow-disable-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. CONSOLE WARNING: Calling Element.createShadowRoot() for an element which already hosts a user-agent shadow root is deprecated. See https://www.chromestatus.com/features/4668884095336448 for more details. Tests to ensure that shadow element cannot be created in elements having dynamically created shadow root.
diff --git a/third_party/WebKit/LayoutTests/fast/dom/shadow/shadowdom-for-form-associated-element-useragent-expected.txt b/third_party/WebKit/LayoutTests/fast/dom/shadow/shadowdom-for-form-associated-element-useragent-expected.txt index 5f961f37..0741b4c 100644 --- a/third_party/WebKit/LayoutTests/fast/dom/shadow/shadowdom-for-form-associated-element-useragent-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/dom/shadow/shadowdom-for-form-associated-element-useragent-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. CONSOLE WARNING: Calling Element.createShadowRoot() for an element which already hosts a user-agent shadow root is deprecated. See https://www.chromestatus.com/features/4668884095336448 for more details. CONSOLE WARNING: <shadow> doesn't work for KEYGEN element host. When a OpenShadowRoot is added, UserAgentShadowRoot should exists as the oldest Shadow Root.
diff --git a/third_party/WebKit/LayoutTests/fast/dom/wrapper-classes-expected.txt b/third_party/WebKit/LayoutTests/fast/dom/wrapper-classes-expected.txt index 93340f9d..b92ba22 100644 --- a/third_party/WebKit/LayoutTests/fast/dom/wrapper-classes-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/dom/wrapper-classes-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. This tests wrapper class names for JavaScript. On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/WebKit/LayoutTests/fast/dynamic/insertAdjacentHTML-allowed-parents-expected.txt b/third_party/WebKit/LayoutTests/fast/dynamic/insertAdjacentHTML-allowed-parents-expected.txt index 370d030..246585df 100644 --- a/third_party/WebKit/LayoutTests/fast/dynamic/insertAdjacentHTML-allowed-parents-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/dynamic/insertAdjacentHTML-allowed-parents-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. PASS: insertAdjacentHTML did not throw an exception when using the a tag. PASS: insertAdjacentHTML did not throw an exception when using the abbr tag. PASS: insertAdjacentHTML did not throw an exception when using the acronym tag.
diff --git a/third_party/WebKit/LayoutTests/fast/forms/access-key-for-all-elements-expected.txt b/third_party/WebKit/LayoutTests/fast/forms/access-key-for-all-elements-expected.txt index c945384..1bd1ee0 100644 --- a/third_party/WebKit/LayoutTests/fast/forms/access-key-for-all-elements-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/forms/access-key-for-all-elements-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. This test checks to see if accesskey attributes works on all elements. On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/WebKit/LayoutTests/fast/forms/autofocus-keygen-expected.txt b/third_party/WebKit/LayoutTests/fast/forms/autofocus-keygen-expected.txt index c14374d..77b4b985 100644 --- a/third_party/WebKit/LayoutTests/fast/forms/autofocus-keygen-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/forms/autofocus-keygen-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. This tests whether the keygen element supports the autofocus attribute.
diff --git a/third_party/WebKit/LayoutTests/fast/forms/checkValidity-001-expected.txt b/third_party/WebKit/LayoutTests/fast/forms/checkValidity-001-expected.txt index acce042..f61df849 100644 --- a/third_party/WebKit/LayoutTests/fast/forms/checkValidity-001-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/forms/checkValidity-001-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. This test checks if checkValidity() returns correctly a true (meaning no error) result. On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/WebKit/LayoutTests/fast/forms/fieldset/fieldset-elements-expected.txt b/third_party/WebKit/LayoutTests/fast/forms/fieldset/fieldset-elements-expected.txt index d5633ab..6dfe595e 100644 --- a/third_party/WebKit/LayoutTests/fast/forms/fieldset/fieldset-elements-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/forms/fieldset/fieldset-elements-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. This test the elements attibute of HTMLFieldSet element. On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/WebKit/LayoutTests/fast/forms/fieldset/fieldset-form-collection-radionode-list-expected.txt b/third_party/WebKit/LayoutTests/fast/forms/fieldset/fieldset-form-collection-radionode-list-expected.txt index 245b6be..7629e53 100644 --- a/third_party/WebKit/LayoutTests/fast/forms/fieldset/fieldset-form-collection-radionode-list-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/forms/fieldset/fieldset-form-collection-radionode-list-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. CONSOLE WARNING: The specified value "inputRadioValue" does not conform to the required format, "yyyy-MM-dd". This test is for RadioNodeList specified at http://www.whatwg.org/specs/web-apps/current-work/multipage/common-dom-interfaces.html#radionodelist
diff --git a/third_party/WebKit/LayoutTests/fast/forms/form-associated-element-crash3-expected.txt b/third_party/WebKit/LayoutTests/fast/forms/form-associated-element-crash3-expected.txt index bdecefa3..ab911e4 100644 --- a/third_party/WebKit/LayoutTests/fast/forms/form-associated-element-crash3-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/forms/form-associated-element-crash3-expected.txt
@@ -1 +1,2 @@ +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. This test passes if it doesn't crash. Note: You might need to reload this test many times (or run the test under valgrind / ASAN) to see a crash.
diff --git a/third_party/WebKit/LayoutTests/fast/forms/form-associated-element-expected.txt b/third_party/WebKit/LayoutTests/fast/forms/form-associated-element-expected.txt index 7cffe96..d235937 100644 --- a/third_party/WebKit/LayoutTests/fast/forms/form-associated-element-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/forms/form-associated-element-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. Verify that only elements that are 'form associatable' get a form owner. On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/WebKit/LayoutTests/fast/forms/form-attribute-expected.txt b/third_party/WebKit/LayoutTests/fast/forms/form-attribute-expected.txt index 5ad38637..a44cdd0f 100644 --- a/third_party/WebKit/LayoutTests/fast/forms/form-attribute-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/forms/form-attribute-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. This test checks the form attribute of the form-associated elements. On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/WebKit/LayoutTests/fast/forms/form-collection-elements-expected.txt b/third_party/WebKit/LayoutTests/fast/forms/form-collection-elements-expected.txt index c0c49a64..84e89f3 100644 --- a/third_party/WebKit/LayoutTests/fast/forms/form-collection-elements-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/forms/form-collection-elements-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. This test lists all the elements of a form per http://www.whatwg.org/specs/web-apps/current-work/multipage/forms.html#category-listed. On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/WebKit/LayoutTests/fast/forms/form-collection-elements-order-expected.txt b/third_party/WebKit/LayoutTests/fast/forms/form-collection-elements-order-expected.txt index 4187ac7b..2c86ec76 100644 --- a/third_party/WebKit/LayoutTests/fast/forms/form-collection-elements-order-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/forms/form-collection-elements-order-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. This test examines the order of form associated elements which are classified as 'listed'. On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/WebKit/LayoutTests/fast/forms/form-collection-radio-node-list-expected.txt b/third_party/WebKit/LayoutTests/fast/forms/form-collection-radio-node-list-expected.txt index 5881f4a..a9a290a 100644 --- a/third_party/WebKit/LayoutTests/fast/forms/form-collection-radio-node-list-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/forms/form-collection-radio-node-list-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. CONSOLE WARNING: The specified value "inputRadioValue" does not conform to the required format, "yyyy-MM-dd". This test is for RadioNodeList specified at http://www.whatwg.org/specs/web-apps/current-work/multipage/common-dom-interfaces.html#radionodelist
diff --git a/third_party/WebKit/LayoutTests/fast/forms/form-radio-img-node-list-expected.txt b/third_party/WebKit/LayoutTests/fast/forms/form-radio-img-node-list-expected.txt index d091824..a8754fb 100644 --- a/third_party/WebKit/LayoutTests/fast/forms/form-radio-img-node-list-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/forms/form-radio-img-node-list-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. Test RadioNodeLists returned by the HTMLFormElement named-getter. On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/WebKit/LayoutTests/fast/forms/form-radio-node-list-expected.txt b/third_party/WebKit/LayoutTests/fast/forms/form-radio-node-list-expected.txt index cae64ba..862ee43b 100644 --- a/third_party/WebKit/LayoutTests/fast/forms/form-radio-node-list-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/forms/form-radio-node-list-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. Test RadioNodeLists returned by the HTMLFormElement named-getter. On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/WebKit/LayoutTests/fast/forms/label/label-contains-other-interactive-content-expected.txt b/third_party/WebKit/LayoutTests/fast/forms/label/label-contains-other-interactive-content-expected.txt index fab65c7..d9cbcb8 100644 --- a/third_party/WebKit/LayoutTests/fast/forms/label/label-contains-other-interactive-content-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/forms/label/label-contains-other-interactive-content-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. button PASS document.activeElement.id is not "control" details
diff --git a/third_party/WebKit/LayoutTests/fast/forms/label/labelable-elements-expected.txt b/third_party/WebKit/LayoutTests/fast/forms/label/labelable-elements-expected.txt index ff6e41a..3269751 100644 --- a/third_party/WebKit/LayoutTests/fast/forms/label/labelable-elements-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/forms/label/labelable-elements-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. Test labelable elements have labels attribute and others do not. On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/WebKit/LayoutTests/fast/forms/label/labels-add-htmlFor-label-expected.txt b/third_party/WebKit/LayoutTests/fast/forms/label/labels-add-htmlFor-label-expected.txt index 104502b..dcebb99 100644 --- a/third_party/WebKit/LayoutTests/fast/forms/label/labels-add-htmlFor-label-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/forms/label/labels-add-htmlFor-label-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. Test that the labels list of a form control is dynamically updated when adding a label whose htmlFor points to that control. On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/WebKit/LayoutTests/fast/forms/label/labels-add-parent-label-expected.txt b/third_party/WebKit/LayoutTests/fast/forms/label/labels-add-parent-label-expected.txt index 871d6968..40cf9c5 100644 --- a/third_party/WebKit/LayoutTests/fast/forms/label/labels-add-parent-label-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/forms/label/labels-add-parent-label-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. Test that the labels list of a form control is dynamically updated when adding a label as parent for that form control. On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/WebKit/LayoutTests/fast/forms/label/labels-change-htmlFor-attribute-expected.txt b/third_party/WebKit/LayoutTests/fast/forms/label/labels-change-htmlFor-attribute-expected.txt index b4a1859..182564a7 100644 --- a/third_party/WebKit/LayoutTests/fast/forms/label/labels-change-htmlFor-attribute-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/forms/label/labels-change-htmlFor-attribute-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. Test that the labels list of a form control is dynamically updated when the htmlFor attribute of a label changes to point to that control. On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/WebKit/LayoutTests/fast/forms/label/labels-multiple-sibling-labels-expected.txt b/third_party/WebKit/LayoutTests/fast/forms/label/labels-multiple-sibling-labels-expected.txt index ef0ebc86..f554e86 100644 --- a/third_party/WebKit/LayoutTests/fast/forms/label/labels-multiple-sibling-labels-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/forms/label/labels-multiple-sibling-labels-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. Test that the labels list of a form control contains multiple sibling labels. On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/WebKit/LayoutTests/fast/forms/label/labels-parent-and-sibling-labels-expected.txt b/third_party/WebKit/LayoutTests/fast/forms/label/labels-parent-and-sibling-labels-expected.txt index 6e64cca..b92189c2 100644 --- a/third_party/WebKit/LayoutTests/fast/forms/label/labels-parent-and-sibling-labels-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/forms/label/labels-parent-and-sibling-labels-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. Test that the labels list of a form control contains both parent label and sibling label. On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/WebKit/LayoutTests/fast/forms/label/labels-remove-htmlFor-attribute-expected.txt b/third_party/WebKit/LayoutTests/fast/forms/label/labels-remove-htmlFor-attribute-expected.txt index 6d4ce0b..1b2a7d7a 100644 --- a/third_party/WebKit/LayoutTests/fast/forms/label/labels-remove-htmlFor-attribute-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/forms/label/labels-remove-htmlFor-attribute-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. Test that the labels list of a form control is dynamically updated when the htmlFor attribute of a label is removed. On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/WebKit/LayoutTests/fast/forms/label/labels-remove-htmlFor-label-expected.txt b/third_party/WebKit/LayoutTests/fast/forms/label/labels-remove-htmlFor-label-expected.txt index 336b960..25c2865 100644 --- a/third_party/WebKit/LayoutTests/fast/forms/label/labels-remove-htmlFor-label-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/forms/label/labels-remove-htmlFor-label-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. Test that the labels list of a form control is dynamically updated when removing the htmlFor attribute that pointed to that form control. On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/WebKit/LayoutTests/fast/forms/label/labels-remove-parent-label-expected.txt b/third_party/WebKit/LayoutTests/fast/forms/label/labels-remove-parent-label-expected.txt index f55ad3f..f1b21356 100644 --- a/third_party/WebKit/LayoutTests/fast/forms/label/labels-remove-parent-label-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/forms/label/labels-remove-parent-label-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. Test that the labels list of a form control is dynamically updated when removing a label as parent for that form control. On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/WebKit/LayoutTests/fast/forms/label/labels-set-htmlFor-attribute-expected.txt b/third_party/WebKit/LayoutTests/fast/forms/label/labels-set-htmlFor-attribute-expected.txt index b4a1859..182564a7 100644 --- a/third_party/WebKit/LayoutTests/fast/forms/label/labels-set-htmlFor-attribute-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/forms/label/labels-set-htmlFor-attribute-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. Test that the labels list of a form control is dynamically updated when the htmlFor attribute of a label changes to point to that control. On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/WebKit/LayoutTests/fast/forms/large-parts-expected.txt b/third_party/WebKit/LayoutTests/fast/forms/large-parts-expected.txt index 7b4c69c..9d0d35c2 100644 --- a/third_party/WebKit/LayoutTests/fast/forms/large-parts-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/forms/large-parts-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. Test for Bug 41737. PASS unless crash.
diff --git a/third_party/WebKit/LayoutTests/fast/forms/reportValidity-valid-expected.txt b/third_party/WebKit/LayoutTests/fast/forms/reportValidity-valid-expected.txt index 77c5851..b0ec1b3 100644 --- a/third_party/WebKit/LayoutTests/fast/forms/reportValidity-valid-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/forms/reportValidity-valid-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. This test checks if reportValidity() returns correctly a true (meaning no error) result. On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/WebKit/LayoutTests/fast/forms/setCustomValidity-arguments-expected.txt b/third_party/WebKit/LayoutTests/fast/forms/setCustomValidity-arguments-expected.txt index b41db7f5..efa7a38 100644 --- a/third_party/WebKit/LayoutTests/fast/forms/setCustomValidity-arguments-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/forms/setCustomValidity-arguments-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. Test how setCustomValidity reacts to too few arguments. On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/WebKit/LayoutTests/fast/forms/setCustomValidity-existence-expected.txt b/third_party/WebKit/LayoutTests/fast/forms/setCustomValidity-existence-expected.txt index 5ac4f84..0ea87ea 100644 --- a/third_party/WebKit/LayoutTests/fast/forms/setCustomValidity-existence-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/forms/setCustomValidity-existence-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. Existence tests for .setCustomValidity property On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/WebKit/LayoutTests/fast/forms/state-restore-skip-stateless-expected.txt b/third_party/WebKit/LayoutTests/fast/forms/state-restore-skip-stateless-expected.txt index 95ec3a20..39eb6e2 100644 --- a/third_party/WebKit/LayoutTests/fast/forms/state-restore-skip-stateless-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/forms/state-restore-skip-stateless-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. CONSOLE MESSAGE: line 44: Test if state of stateless form control types are not saved. PASS There is a state for hidden PASS There is a state for text
diff --git a/third_party/WebKit/LayoutTests/fast/forms/validationMessage-expected.txt b/third_party/WebKit/LayoutTests/fast/forms/validationMessage-expected.txt index 321c6c2..f8ed5374 100644 --- a/third_party/WebKit/LayoutTests/fast/forms/validationMessage-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/forms/validationMessage-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. Test for validationMessage DOM property. On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/WebKit/LayoutTests/fast/forms/validity-property-expected.txt b/third_party/WebKit/LayoutTests/fast/forms/validity-property-expected.txt index 240cbb0..a4152ac1 100644 --- a/third_party/WebKit/LayoutTests/fast/forms/validity-property-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/forms/validity-property-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. Each form control in this document exposes a validity attribute that returns a live instance of ValidityState. On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/WebKit/LayoutTests/fast/forms/willvalidate-expected.txt b/third_party/WebKit/LayoutTests/fast/forms/willvalidate-expected.txt index 6a1a969..e688928 100644 --- a/third_party/WebKit/LayoutTests/fast/forms/willvalidate-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/forms/willvalidate-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. Various tests for .willValidate property On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/WebKit/LayoutTests/fast/html/clone-keygen-expected.txt b/third_party/WebKit/LayoutTests/fast/html/clone-keygen-expected.txt index 247e6d97..e132013 100644 --- a/third_party/WebKit/LayoutTests/fast/html/clone-keygen-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/html/clone-keygen-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. Tests that a cloned keygen has the right shadow pseudo ID. You should see two big keygens with purple text (they should look the same.)
diff --git a/third_party/WebKit/LayoutTests/fast/multicol/span/positioned-child-not-removed-crash-expected.txt b/third_party/WebKit/LayoutTests/fast/multicol/span/positioned-child-not-removed-crash-expected.txt index 7e24c80..52d890b 100644 --- a/third_party/WebKit/LayoutTests/fast/multicol/span/positioned-child-not-removed-crash-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/multicol/span/positioned-child-not-removed-crash-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. Test passes if it does not crash.
diff --git a/third_party/WebKit/LayoutTests/fast/replaced/keygen-as-table-column-group-crash-expected.txt b/third_party/WebKit/LayoutTests/fast/replaced/keygen-as-table-column-group-crash-expected.txt index e92fce8..31a1e3ef 100644 --- a/third_party/WebKit/LayoutTests/fast/replaced/keygen-as-table-column-group-crash-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/replaced/keygen-as-table-column-group-crash-expected.txt
@@ -1 +1,2 @@ +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. PASS if no crash or assert.
diff --git a/third_party/WebKit/LayoutTests/fast/ruby/float-object-doesnt-crash-expected.txt b/third_party/WebKit/LayoutTests/fast/ruby/float-object-doesnt-crash-expected.txt index 8d1b6a4..990f7db 100644 --- a/third_party/WebKit/LayoutTests/fast/ruby/float-object-doesnt-crash-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/ruby/float-object-doesnt-crash-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. Test passes if it does not crash when run with memory checking for use-after-free. | >
diff --git a/third_party/WebKit/LayoutTests/fast/table/crash-splitColumn-2-expected.txt b/third_party/WebKit/LayoutTests/fast/table/crash-splitColumn-2-expected.txt index a03f428..5cbbcc5e 100644 --- a/third_party/WebKit/LayoutTests/fast/table/crash-splitColumn-2-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/table/crash-splitColumn-2-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. Bug 70171: Crash in LayoutTableSection::splitColumn This test PASSES if it does not CRASH or ASSERT.
diff --git a/third_party/WebKit/LayoutTests/html5lib/generated/run-tests19-data-expected.txt b/third_party/WebKit/LayoutTests/html5lib/generated/run-tests19-data-expected.txt index 7017306..2514735 100644 --- a/third_party/WebKit/LayoutTests/html5lib/generated/run-tests19-data-expected.txt +++ b/third_party/WebKit/LayoutTests/html5lib/generated/run-tests19-data-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. ../resources/tests19.dat: 8 9
diff --git a/third_party/WebKit/LayoutTests/html5lib/generated/run-tests19-write-expected.txt b/third_party/WebKit/LayoutTests/html5lib/generated/run-tests19-write-expected.txt index 7017306..2514735 100644 --- a/third_party/WebKit/LayoutTests/html5lib/generated/run-tests19-write-expected.txt +++ b/third_party/WebKit/LayoutTests/html5lib/generated/run-tests19-write-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. ../resources/tests19.dat: 8 9
diff --git a/third_party/WebKit/LayoutTests/html5lib/generated/run-tests25-data-expected.txt b/third_party/WebKit/LayoutTests/html5lib/generated/run-tests25-data-expected.txt index e08f1f6..fbd0cca 100644 --- a/third_party/WebKit/LayoutTests/html5lib/generated/run-tests25-data-expected.txt +++ b/third_party/WebKit/LayoutTests/html5lib/generated/run-tests25-data-expected.txt
@@ -1 +1,2 @@ +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. ../resources/tests25.dat: PASS
diff --git a/third_party/WebKit/LayoutTests/html5lib/generated/run-tests25-write-expected.txt b/third_party/WebKit/LayoutTests/html5lib/generated/run-tests25-write-expected.txt index e08f1f6..fbd0cca 100644 --- a/third_party/WebKit/LayoutTests/html5lib/generated/run-tests25-write-expected.txt +++ b/third_party/WebKit/LayoutTests/html5lib/generated/run-tests25-write-expected.txt
@@ -1 +1,2 @@ +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. ../resources/tests25.dat: PASS
diff --git a/third_party/WebKit/LayoutTests/html5lib/generated/run-tests7-data-expected.txt b/third_party/WebKit/LayoutTests/html5lib/generated/run-tests7-data-expected.txt index a34b5b0..0112828 100644 --- a/third_party/WebKit/LayoutTests/html5lib/generated/run-tests7-data-expected.txt +++ b/third_party/WebKit/LayoutTests/html5lib/generated/run-tests7-data-expected.txt
@@ -1,2 +1,3 @@ CONSOLE ERROR: line 1: Uncaught SyntaxError: Unexpected token < +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. ../resources/tests7.dat: PASS
diff --git a/third_party/WebKit/LayoutTests/html5lib/generated/run-tests7-write-expected.txt b/third_party/WebKit/LayoutTests/html5lib/generated/run-tests7-write-expected.txt index a34b5b0..0112828 100644 --- a/third_party/WebKit/LayoutTests/html5lib/generated/run-tests7-write-expected.txt +++ b/third_party/WebKit/LayoutTests/html5lib/generated/run-tests7-write-expected.txt
@@ -1,2 +1,3 @@ CONSOLE ERROR: line 1: Uncaught SyntaxError: Unexpected token < +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. ../resources/tests7.dat: PASS
diff --git a/third_party/WebKit/LayoutTests/http/tests/misc/submit-post-keygen-expected.txt b/third_party/WebKit/LayoutTests/http/tests/misc/submit-post-keygen-expected.txt index 64d41a7..6aebd610 100644 --- a/third_party/WebKit/LayoutTests/http/tests/misc/submit-post-keygen-expected.txt +++ b/third_party/WebKit/LayoutTests/http/tests/misc/submit-post-keygen-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. This is a regression test for keygen tag POST processing: https://bugs.webkit.org/show_bug.cgi?id=70617. SUCCESS: keygen was parsed correctly
diff --git a/third_party/WebKit/LayoutTests/http/tests/multipart/stop-loading.html b/third_party/WebKit/LayoutTests/http/tests/multipart/stop-loading.html index c5665aa..31383c78 100644 --- a/third_party/WebKit/LayoutTests/http/tests/multipart/stop-loading.html +++ b/third_party/WebKit/LayoutTests/http/tests/multipart/stop-loading.html
@@ -10,7 +10,7 @@ { window.stop(); window.setTimeout(function() { - var broken = (testingImage.width != 2 && testingImage != 76); + var broken = (testingImage.width != 2 && testingImage.width != 76); document.getElementById("results").innerHTML = broken ? "PASS" : "FAIL"; if (window.testRunner) testRunner.notifyDone();
diff --git a/third_party/WebKit/LayoutTests/http/tests/serviceworker/foreign-fetch-basics.html b/third_party/WebKit/LayoutTests/http/tests/serviceworker/foreign-fetch-basics.html index e51fd6b..4ad7097 100644 --- a/third_party/WebKit/LayoutTests/http/tests/serviceworker/foreign-fetch-basics.html +++ b/third_party/WebKit/LayoutTests/http/tests/serviceworker/foreign-fetch-basics.html
@@ -12,7 +12,7 @@ promise_test(t => { var scope = 'resources/foreign-fetch/scope'; return service_worker_unregister_and_register( - t, worker_for_origins('*'), scope) + t, worker_for_origins(['*']), scope) .then(r => { add_completion_callback(() => r.unregister()); return wait_for_state(t, r.installing, 'activated'); @@ -31,7 +31,7 @@ promise_test(t => { var scope = 'resources/foreign-fetch/scope/match-origin'; return service_worker_unregister_and_register( - t, worker_for_origins(location.origin), scope) + t, worker_for_origins([location.origin]), scope) .then(r => { add_completion_callback(() => r.unregister()); return wait_for_state(t, r.installing, 'activated'); @@ -46,7 +46,7 @@ promise_test(t => { var scope = 'resources/foreign-fetch/scope/nomatch-origin'; return service_worker_unregister_and_register( - t, worker_for_origins('https://example.com'), scope) + t, worker_for_origins(['https://example.com']), scope) .then(r => { add_completion_callback(() => r.unregister()); return wait_for_state(t, r.installing, 'activated');
diff --git a/third_party/WebKit/LayoutTests/http/tests/serviceworker/resources/foreign-fetch-worker.js b/third_party/WebKit/LayoutTests/http/tests/serviceworker/resources/foreign-fetch-worker.js index d7c904f..0e645a1f 100644 --- a/third_party/WebKit/LayoutTests/http/tests/serviceworker/resources/foreign-fetch-worker.js +++ b/third_party/WebKit/LayoutTests/http/tests/serviceworker/resources/foreign-fetch-worker.js
@@ -1,7 +1,7 @@ self.addEventListener('install', function(event) { var origins = JSON.parse(decodeURIComponent(location.search.substring(1))); - event.registerForeignFetchScopes([registration.scope + '/intercept'], - origins); + event.registerForeignFetch({scopes: [registration.scope + '/intercept'], + origins: origins}); }); self.addEventListener('foreignfetch', function(event) {
diff --git a/third_party/WebKit/LayoutTests/http/tests/serviceworker/resources/register-foreign-fetch-errors-worker.js b/third_party/WebKit/LayoutTests/http/tests/serviceworker/resources/register-foreign-fetch-errors-worker.js index 54994dc..dda555fd 100644 --- a/third_party/WebKit/LayoutTests/http/tests/serviceworker/resources/register-foreign-fetch-errors-worker.js +++ b/third_party/WebKit/LayoutTests/http/tests/serviceworker/resources/register-foreign-fetch-errors-worker.js
@@ -4,19 +4,25 @@ test(function() { assert_throws(new TypeError(), function() { - event.registerForeignFetchScopes(scope, '*'); + event.registerForeignFetch({}); + }); + }, 'Invalid options'); + + test(function() { + assert_throws(new TypeError(), function() { + event.registerForeignFetch({scopes: scope, origins: ['*']}); }); }, 'Scopes not an array'); test(function() { assert_throws(new TypeError(), function() { - event.registerForeignFetchScopes([{}], '*'); + event.registerForeignFetch({scopes: [{}], origins: ['*']}); }); }, 'Scopes not a string in array'); test(function() { assert_throws(new TypeError(), function() { - event.registerForeignFetchScopes(['/foo'], '*'); + event.registerForeignFetch({scopes: ['/foo'], origins: ['*']}); }); }, 'Relative url not under scope'); @@ -24,25 +30,31 @@ var url = new URL(scope_url); url.host = 'example.com'; assert_throws(new TypeError(), function() { - event.registerForeignFetchScopes([url.href], '*'); + event.registerForeignFetch({scopes: [url.href], origins: ['*']}); }); }, 'Absolute url not under scope'); + test(function() { + assert_throws(new TypeError(), function() { + event.registerForeignFetch({scopes: [], origins: ['*']}); + }); + }, 'Empty scope array'); + async_test(function(t) { self.setTimeout(t.step_func(function() { assert_throws('InvalidStateError', function() { - event.registerForeignFetchScopes([scope], '*'); + event.registerForeignFetch({scopes: [scope], origins: ['*']}); }); t.done(); }), 1); }, 'Call after event returned'); test(function() { - event.registerForeignFetchScopes([], '*'); - }, 'Empty array with wildcard origin string'); + event.registerForeignFetch({scopes: [scope], origins: ['*']}); + }, 'Valid scopes with wildcard origin string'); test(function() { - event.registerForeignFetchScopes([scope, scope + '/foo'], '*'); + event.registerForeignFetch({scopes: [scope, scope + '/foo'], origins: ['*']}); }, 'Absolute urls'); test(function() { @@ -52,65 +64,67 @@ assert_true(scope_url.pathname.startsWith(local_dir)); var relative_scope = scope_url.pathname.substr(local_dir.length + 1); - event.registerForeignFetchScopes([ + event.registerForeignFetch({scopes: [ scope_url.pathname, relative_scope, './' + relative_scope, - relative_scope + '/foo'], '*'); + relative_scope + '/foo'], origins: ['*']}); }, 'Relative urls'); test(function() { assert_throws(new TypeError(), function() { - event.registerForeignFetchScopes([scope]); + event.registerForeignFetch({scopes: [scope]}); }); }, 'No origins specified'); test(function() { assert_throws(new TypeError(), function() { - event.registerForeignFetchScopes([scope], {}); + event.registerForeignFetch({scopes: [scope], origins: {}}); }); }, 'Origins not a string or array'); test(function() { assert_throws(new TypeError(), function() { - event.registerForeignFetchScopes([scope], [{}]); + event.registerForeignFetch({scopes: [scope], origins: [{}]}); }); }, 'Origins contains something not a string'); test(function() { assert_throws(new TypeError(), function() { - event.registerForeignFetchScopes([scope], '/foo'); + event.registerForeignFetch({scopes: [scope], origins: ['/foo']}); }); }, 'Origin not an absolute URL'); test(function() { - event.registerForeignFetchScopes([scope], ['*']); + event.registerForeignFetch({scopes: [scope], origins: ['*']}); }, 'Wildcard origin string in array'); test(function() { - event.registerForeignFetchScopes([scope], 'https://example.com/'); + assert_throws(new TypeError(), function() { + event.registerForeignFetch({scopes: [scope], origins: 'https://example.com/'}); + }); }, 'Origin string'); test(function() { - event.registerForeignFetchScopes([scope], ['https://example.com/']); + event.registerForeignFetch({scopes: [scope], origins: ['https://example.com/']}); }, 'Origin string in array'); test(function() { - event.registerForeignFetchScopes( - [scope], ['https://example.com/', 'https://chromium.org']); + event.registerForeignFetch({ + scopes: [scope], origins: ['https://example.com/', 'https://chromium.org']}); }, 'Array with multiple origins'); test(function() { assert_throws(new TypeError(), function() { - event.registerForeignFetchScopes([scope], - ['*', 'https://example.com/']); + event.registerForeignFetch({scopes: [scope], + origins: ['*', 'https://example.com/']}); }); }, 'Origins includes wildcard and other strings'); test(function() { assert_throws(new TypeError(), function() { - event.registerForeignFetchScopes([scope], - ['https://example.com/', '*']); + event.registerForeignFetch({scopes: [scope], + origins: ['https://example.com/', '*']}); }); }, 'Origins includes other strings and wildcard'); });
diff --git a/third_party/WebKit/LayoutTests/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt b/third_party/WebKit/LayoutTests/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt index ed5edb8c..cd47ee3 100644 --- a/third_party/WebKit/LayoutTests/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt +++ b/third_party/WebKit/LayoutTests/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt
@@ -412,7 +412,7 @@ method constructor interface InstallEvent : ExtendableEvent method constructor - method registerForeignFetchScopes + method registerForeignFetch interface MessageChannel getter port1 getter port2
diff --git a/third_party/WebKit/LayoutTests/imported/web-platform-tests/html/semantics/forms/constraints/form-validation-willValidate-expected.txt b/third_party/WebKit/LayoutTests/imported/web-platform-tests/html/semantics/forms/constraints/form-validation-willValidate-expected.txt index 4863e3d..fb426d79 100644 --- a/third_party/WebKit/LayoutTests/imported/web-platform-tests/html/semantics/forms/constraints/form-validation-willValidate-expected.txt +++ b/third_party/WebKit/LayoutTests/imported/web-platform-tests/html/semantics/forms/constraints/form-validation-willValidate-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. This is a testharness.js-based test. PASS [INPUT in HIDDEN status] Must be barred from the constraint validation PASS [INPUT in BUTTON status] Must be barred from the constraint validation
diff --git a/third_party/WebKit/LayoutTests/imported/web-platform-tests/html/semantics/forms/the-label-element/labelable-elements-expected.txt b/third_party/WebKit/LayoutTests/imported/web-platform-tests/html/semantics/forms/the-label-element/labelable-elements-expected.txt index 8a91b217..686daaf 100644 --- a/third_party/WebKit/LayoutTests/imported/web-platform-tests/html/semantics/forms/the-label-element/labelable-elements-expected.txt +++ b/third_party/WebKit/LayoutTests/imported/web-platform-tests/html/semantics/forms/the-label-element/labelable-elements-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. This is a testharness.js-based test. PASS Check if the output element is a labelable element PASS Check if the output element can access 'labels'
diff --git a/third_party/WebKit/LayoutTests/imported/web-platform-tests/html/semantics/grouping-content/the-ol-element/grouping-ol-expected.txt b/third_party/WebKit/LayoutTests/imported/web-platform-tests/html/semantics/grouping-content/the-ol-element/grouping-ol-expected.txt index bca0cbd..daf9fa37 100644 --- a/third_party/WebKit/LayoutTests/imported/web-platform-tests/html/semantics/grouping-content/the-ol-element/grouping-ol-expected.txt +++ b/third_party/WebKit/LayoutTests/imported/web-platform-tests/html/semantics/grouping-content/the-ol-element/grouping-ol-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. This is a testharness.js-based test. PASS The prototype for OL is HTMLOListElement.prototype FAIL 'reversed' property should be defined on OL. assert_own_property: expected property "reversed" missing
diff --git a/third_party/WebKit/LayoutTests/imported/web-platform-tests/html/semantics/interfaces-expected.txt b/third_party/WebKit/LayoutTests/imported/web-platform-tests/html/semantics/interfaces-expected.txt index c89363e4..05d7e5d 100644 --- a/third_party/WebKit/LayoutTests/imported/web-platform-tests/html/semantics/interfaces-expected.txt +++ b/third_party/WebKit/LayoutTests/imported/web-platform-tests/html/semantics/interfaces-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. This is a testharness.js-based test. PASS Interfaces for abbr PASS Interfaces for ABBR
diff --git a/third_party/WebKit/LayoutTests/imported/web-platform-tests/html/syntax/parsing/html5lib_tests19-expected.txt b/third_party/WebKit/LayoutTests/imported/web-platform-tests/html/syntax/parsing/html5lib_tests19-expected.txt index 764ae6a..8975f10 100644 --- a/third_party/WebKit/LayoutTests/imported/web-platform-tests/html/syntax/parsing/html5lib_tests19-expected.txt +++ b/third_party/WebKit/LayoutTests/imported/web-platform-tests/html/syntax/parsing/html5lib_tests19-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. This is a testharness.js-based test. PASS html5lib_tests19.html 6135e0cbdbb22a97e8a13c2442c3e9a9e0a53298 PASS html5lib_tests19.html 6b46dba2f4d7d1a08359ab21fe5e011463dd8746
diff --git a/third_party/WebKit/LayoutTests/imported/web-platform-tests/html/syntax/parsing/html5lib_tests25-expected.txt b/third_party/WebKit/LayoutTests/imported/web-platform-tests/html/syntax/parsing/html5lib_tests25-expected.txt index bd7130d..37e3e43 100644 --- a/third_party/WebKit/LayoutTests/imported/web-platform-tests/html/syntax/parsing/html5lib_tests25-expected.txt +++ b/third_party/WebKit/LayoutTests/imported/web-platform-tests/html/syntax/parsing/html5lib_tests25-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. This is a testharness.js-based test. PASS html5lib_tests25.html 025adbb619bdef9ad228a6b378b9dd6bef9f93dc PASS html5lib_tests25.html 7e561454888535bc5c68e7396de2f4206c81e97d
diff --git a/third_party/WebKit/LayoutTests/imported/web-platform-tests/html/syntax/serializing-html-fragments/outerHTML-expected.txt b/third_party/WebKit/LayoutTests/imported/web-platform-tests/html/syntax/serializing-html-fragments/outerHTML-expected.txt index eb4a5a8..78958a99 100644 --- a/third_party/WebKit/LayoutTests/imported/web-platform-tests/html/syntax/serializing-html-fragments/outerHTML-expected.txt +++ b/third_party/WebKit/LayoutTests/imported/web-platform-tests/html/syntax/serializing-html-fragments/outerHTML-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. This is a testharness.js-based test. PASS HTML Test: element.outerHTML to verify HTML fragment serialization algorithm PASS Node for a
diff --git a/third_party/WebKit/LayoutTests/inspector/elements/styles-1/color-swatch-expected.txt b/third_party/WebKit/LayoutTests/inspector/elements/styles-1/color-swatch-expected.txt index faa2375..9177023 100644 --- a/third_party/WebKit/LayoutTests/inspector/elements/styles-1/color-swatch-expected.txt +++ b/third_party/WebKit/LayoutTests/inspector/elements/styles-1/color-swatch-expected.txt
@@ -11,6 +11,6 @@ Has popover after click: true Running: testColorSwatchInComputedRules -Initial color value: rgb(255, 0, 0); -After shift-click color value: hsl(0, 100%, 50%); +Initial color value: rgb(255, 0, 0) +After shift-click color value: hsl(0, 100%, 50%)
diff --git a/third_party/WebKit/LayoutTests/platform/android/fast/html/keygen-expected.txt b/third_party/WebKit/LayoutTests/platform/android/fast/html/keygen-expected.txt index d3234f2..a61a9744f 100644 --- a/third_party/WebKit/LayoutTests/platform/android/fast/html/keygen-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/android/fast/html/keygen-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. layer at (0,0) size 800x600 LayoutView at (0,0) size 800x600 layer at (0,0) size 800x600
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/forms/form-radio-img-node-list-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/fast/forms/form-radio-img-node-list-expected.txt index d091824..a8754fb 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/fast/forms/form-radio-img-node-list-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/linux/fast/forms/form-radio-img-node-list-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. Test RadioNodeLists returned by the HTMLFormElement named-getter. On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/html/keygen-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/fast/html/keygen-expected.txt index 1b670d0..b9eb2178 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/fast/html/keygen-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/linux/fast/html/keygen-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. layer at (0,0) size 800x600 LayoutView at (0,0) size 800x600 layer at (0,0) size 800x600
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/compositing/layer-creation/compositing-reason-removed-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/compositing/layer-creation/compositing-reason-removed-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/compositing/layer-creation/compositing-reason-removed-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/compositing/layer-creation/compositing-reason-removed-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/compositing/overflow/do-not-paint-outline-into-composited-scrolling-contents-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/compositing/overflow/do-not-paint-outline-into-composited-scrolling-contents-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/compositing/overflow/do-not-paint-outline-into-composited-scrolling-contents-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/compositing/overflow/do-not-paint-outline-into-composited-scrolling-contents-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/compositing/overflow/fixed-scroll-in-empty-root-layer-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/compositing/overflow/fixed-scroll-in-empty-root-layer-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/compositing/overflow/fixed-scroll-in-empty-root-layer-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/compositing/overflow/fixed-scroll-in-empty-root-layer-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/compositing/overflow/text-color-change-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/compositing/overflow/text-color-change-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/compositing/overflow/text-color-change-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/compositing/overflow/text-color-change-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/compositing/overflow/textarea-scroll-touch-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/compositing/overflow/textarea-scroll-touch-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/compositing/overflow/textarea-scroll-touch-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/compositing/overflow/textarea-scroll-touch-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/compositing/overflow/theme-affects-visual-overflow-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/compositing/overflow/theme-affects-visual-overflow-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/compositing/overflow/theme-affects-visual-overflow-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/compositing/overflow/theme-affects-visual-overflow-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/compositing/overflow/theme-affects-visual-overflow-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/compositing/overflow/theme-affects-visual-overflow-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/compositing/overflow/theme-affects-visual-overflow-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/compositing/overflow/theme-affects-visual-overflow-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/compositing/overflow/update-widget-positions-on-nested-frames-and-scrollers-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/compositing/overflow/update-widget-positions-on-nested-frames-and-scrollers-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/compositing/overflow/update-widget-positions-on-nested-frames-and-scrollers-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/compositing/overflow/update-widget-positions-on-nested-frames-and-scrollers-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/compositing/overflow/updating-scrolling-container-and-content-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/compositing/overflow/updating-scrolling-container-and-content-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/compositing/overflow/updating-scrolling-container-and-content-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/compositing/overflow/updating-scrolling-container-and-content-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/compositing/overflow/updating-scrolling-container-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/compositing/overflow/updating-scrolling-container-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/compositing/overflow/updating-scrolling-container-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/compositing/overflow/updating-scrolling-container-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/compositing/squashing/invalidate-when-leaving-squashed-layer-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/compositing/squashing/invalidate-when-leaving-squashed-layer-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/compositing/squashing/invalidate-when-leaving-squashed-layer-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/compositing/squashing/invalidate-when-leaving-squashed-layer-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/compositing/squashing/invalidation-for-subpixel-offset-of-squashed-layer-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/compositing/squashing/invalidation-for-subpixel-offset-of-squashed-layer-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/compositing/squashing/invalidation-for-subpixel-offset-of-squashed-layer-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/compositing/squashing/invalidation-for-subpixel-offset-of-squashed-layer-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/compositing/squashing/invalidations-with-large-negative-margin-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/compositing/squashing/invalidations-with-large-negative-margin-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/compositing/squashing/invalidations-with-large-negative-margin-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/compositing/squashing/invalidations-with-large-negative-margin-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/compositing/squashing/repaint-overflow-scrolled-squashed-content-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/compositing/squashing/repaint-overflow-scrolled-squashed-content-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/compositing/squashing/repaint-overflow-scrolled-squashed-content-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/compositing/squashing/repaint-overflow-scrolled-squashed-content-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/compositing/squashing/repaint-squashed-layer-in-rect-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/compositing/squashing/repaint-squashed-layer-in-rect-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/compositing/squashing/repaint-squashed-layer-in-rect-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/compositing/squashing/repaint-squashed-layer-in-rect-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/compositing/squashing/repaint-via-layout-offset-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/compositing/squashing/repaint-via-layout-offset-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/compositing/squashing/repaint-via-layout-offset-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/compositing/squashing/repaint-via-layout-offset-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/compositing/squashing/resize-squashing-layer-that-needs-full-repaint-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/compositing/squashing/resize-squashing-layer-that-needs-full-repaint-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/compositing/squashing/resize-squashing-layer-that-needs-full-repaint-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/compositing/squashing/resize-squashing-layer-that-needs-full-repaint-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/compositing/squashing/squash-partial-repaint-inside-squashed-layer-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/compositing/squashing/squash-partial-repaint-inside-squashed-layer-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/compositing/squashing/squash-partial-repaint-inside-squashed-layer-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/compositing/squashing/squash-partial-repaint-inside-squashed-layer-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/compositing/squashing/squashing-inside-preserve-3d-element-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/compositing/squashing/squashing-inside-preserve-3d-element-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/compositing/squashing/squashing-inside-preserve-3d-element-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/compositing/squashing/squashing-inside-preserve-3d-element-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/basic/comments-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/basic/comments-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/basic/comments-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/basic/comments-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/basic/containment-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/basic/containment-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/basic/containment-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/basic/containment-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/basic/contextual_selectors-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/basic/contextual_selectors-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/basic/contextual_selectors-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/basic/contextual_selectors-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/basic/id_as_selector-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/basic/id_as_selector-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/basic/id_as_selector-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/basic/id_as_selector-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/box_properties/acid_test-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/box_properties/acid_test-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/box_properties/acid_test-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/box_properties/acid_test-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/box_properties/acid_test-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/box_properties/acid_test-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/box_properties/acid_test-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/box_properties/acid_test-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/box_properties/border-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/box_properties/border-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/box_properties/border-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/box_properties/border-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/box_properties/border_bottom-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/box_properties/border_bottom-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/box_properties/border_bottom-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/box_properties/border_bottom-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/box_properties/border_bottom_width-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/box_properties/border_bottom_width-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/box_properties/border_bottom_width-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/box_properties/border_bottom_width-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/box_properties/border_left-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/box_properties/border_left-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/box_properties/border_left-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/box_properties/border_left-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/box_properties/border_left_width-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/box_properties/border_left_width-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/box_properties/border_left_width-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/box_properties/border_left_width-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/box_properties/border_right_inline-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/box_properties/border_right_inline-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/box_properties/border_right_inline-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/box_properties/border_right_inline-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/box_properties/border_right_width-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/box_properties/border_right_width-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/box_properties/border_right_width-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/box_properties/border_right_width-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/box_properties/border_style-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/box_properties/border_style-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/box_properties/border_style-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/box_properties/border_style-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/box_properties/border_top-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/box_properties/border_top-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/box_properties/border_top-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/box_properties/border_top-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/box_properties/border_top_width-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/box_properties/border_top_width-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/box_properties/border_top_width-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/box_properties/border_top_width-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/box_properties/border_width-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/box_properties/border_width-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/box_properties/border_width-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/box_properties/border_width-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/box_properties/clear-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/box_properties/clear-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/box_properties/clear-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/box_properties/clear-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/box_properties/float_elements_in_series-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/box_properties/float_elements_in_series-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/box_properties/float_elements_in_series-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/box_properties/float_elements_in_series-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/box_properties/float_margin-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/box_properties/float_margin-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/box_properties/float_margin-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/box_properties/float_margin-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/box_properties/float_on_text_elements-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/box_properties/float_on_text_elements-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/box_properties/float_on_text_elements-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/box_properties/float_on_text_elements-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/box_properties/height-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/box_properties/height-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/box_properties/height-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/box_properties/height-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/box_properties/margin_bottom-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/box_properties/margin_bottom-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/box_properties/margin_bottom-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/box_properties/margin_bottom-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/box_properties/margin_left-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/box_properties/margin_left-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/box_properties/margin_left-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/box_properties/margin_left-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/box_properties/margin_top-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/box_properties/margin_top-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/box_properties/margin_top-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/box_properties/margin_top-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/box_properties/padding-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/box_properties/padding-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/box_properties/padding-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/box_properties/padding-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/box_properties/padding_bottom-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/box_properties/padding_bottom-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/box_properties/padding_bottom-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/box_properties/padding_bottom-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/box_properties/padding_inline-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/box_properties/padding_inline-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/box_properties/padding_inline-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/box_properties/padding_inline-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/box_properties/padding_left-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/box_properties/padding_left-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/box_properties/padding_left-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/box_properties/padding_left-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/box_properties/padding_right-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/box_properties/padding_right-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/box_properties/padding_right-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/box_properties/padding_right-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/box_properties/padding_top-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/box_properties/padding_top-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/box_properties/padding_top-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/box_properties/padding_top-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/box_properties/width-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/box_properties/width-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/box_properties/width-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/box_properties/width-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/cascade/cascade_order-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/cascade/cascade_order-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/cascade/cascade_order-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/cascade/cascade_order-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/classification/display-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/classification/display-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/classification/display-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/classification/display-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/classification/list_style_type-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/classification/list_style_type-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/classification/list_style_type-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/classification/list_style_type-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/color_and_background/background-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/color_and_background/background-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/color_and_background/background-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/color_and_background/background-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/color_and_background/background_position-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/color_and_background/background_position-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/color_and_background/background_position-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/color_and_background/background_position-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/conformance/forward_compatible_parsing-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/conformance/forward_compatible_parsing-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/conformance/forward_compatible_parsing-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/conformance/forward_compatible_parsing-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/font_properties/font-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/font_properties/font-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/font_properties/font-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/font_properties/font-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/font_properties/font_family-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/font_properties/font_family-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/font_properties/font_family-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/font_properties/font_family-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/font_properties/font_size-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/font_properties/font_size-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/font_properties/font_size-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/font_properties/font_size-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/font_properties/font_weight-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/font_properties/font_weight-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/font_properties/font_weight-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/font_properties/font_weight-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/formatting_model/floating_elements-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/formatting_model/floating_elements-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/formatting_model/floating_elements-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/formatting_model/floating_elements-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/formatting_model/height_of_lines-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/formatting_model/height_of_lines-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/formatting_model/height_of_lines-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/formatting_model/height_of_lines-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/formatting_model/inline_elements-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/formatting_model/inline_elements-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/formatting_model/inline_elements-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/formatting_model/inline_elements-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/formatting_model/replaced_elements-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/formatting_model/replaced_elements-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/formatting_model/replaced_elements-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/formatting_model/replaced_elements-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/formatting_model/vertical_formatting-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/formatting_model/vertical_formatting-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/formatting_model/vertical_formatting-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/formatting_model/vertical_formatting-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/pseudo/anchor-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/pseudo/anchor-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/pseudo/anchor-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/pseudo/anchor-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/pseudo/firstletter-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/pseudo/firstletter-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/pseudo/firstletter-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/pseudo/firstletter-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/pseudo/firstline-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/pseudo/firstline-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/pseudo/firstline-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/pseudo/firstline-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/pseudo/multiple_pseudo_elements-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/pseudo/multiple_pseudo_elements-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/pseudo/multiple_pseudo_elements-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/pseudo/multiple_pseudo_elements-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/text_properties/letter_spacing-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/text_properties/letter_spacing-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/text_properties/letter_spacing-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/text_properties/letter_spacing-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/text_properties/line_height-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/text_properties/line_height-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/text_properties/line_height-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/text_properties/line_height-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/text_properties/text_decoration-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/text_properties/text_decoration-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/text_properties/text_decoration-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/text_properties/text_decoration-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/text_properties/text_indent-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/text_properties/text_indent-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/text_properties/text_indent-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/text_properties/text_indent-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/text_properties/text_transform-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/text_properties/text_transform-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/text_properties/text_transform-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/text_properties/text_transform-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/text_properties/vertical_align-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/text_properties/vertical_align-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/text_properties/vertical_align-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/text_properties/vertical_align-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/text_properties/word_spacing-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/text_properties/word_spacing-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/text_properties/word_spacing-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/text_properties/word_spacing-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/units/color_units-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/units/color_units-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/units/color_units-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/units/color_units-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/units/length_units-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/units/length_units-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css1/units/length_units-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css1/units/length_units-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css2.1/20110323/abspos-containing-block-initial-001-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css2.1/20110323/abspos-containing-block-initial-001-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css2.1/20110323/abspos-containing-block-initial-001-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css2.1/20110323/abspos-containing-block-initial-001-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css2.1/20110323/block-non-replaced-height-002-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css2.1/20110323/block-non-replaced-height-002-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css2.1/20110323/block-non-replaced-height-002-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css2.1/20110323/block-non-replaced-height-002-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css2.1/20110323/block-non-replaced-height-004-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css2.1/20110323/block-non-replaced-height-004-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css2.1/20110323/block-non-replaced-height-004-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css2.1/20110323/block-non-replaced-height-004-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css2.1/20110323/block-non-replaced-height-006-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css2.1/20110323/block-non-replaced-height-006-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css2.1/20110323/block-non-replaced-height-006-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css2.1/20110323/block-non-replaced-height-006-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css2.1/20110323/block-non-replaced-height-008-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css2.1/20110323/block-non-replaced-height-008-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css2.1/20110323/block-non-replaced-height-008-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css2.1/20110323/block-non-replaced-height-008-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css2.1/20110323/block-non-replaced-height-010-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css2.1/20110323/block-non-replaced-height-010-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css2.1/20110323/block-non-replaced-height-010-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css2.1/20110323/block-non-replaced-height-010-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css2.1/20110323/block-non-replaced-height-012-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css2.1/20110323/block-non-replaced-height-012-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css2.1/20110323/block-non-replaced-height-012-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css2.1/20110323/block-non-replaced-height-012-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css2.1/20110323/block-non-replaced-height-014-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css2.1/20110323/block-non-replaced-height-014-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css2.1/20110323/block-non-replaced-height-014-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css2.1/20110323/block-non-replaced-height-014-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css2.1/20110323/block-non-replaced-height-016-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css2.1/20110323/block-non-replaced-height-016-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css2.1/20110323/block-non-replaced-height-016-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css2.1/20110323/block-non-replaced-height-016-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css2.1/t0803-c5502-mrgn-r-02-c-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css2.1/t0803-c5502-mrgn-r-02-c-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css2.1/t0803-c5502-mrgn-r-02-c-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css2.1/t0803-c5502-mrgn-r-02-c-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css2.1/t0803-c5505-mrgn-02-c-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css2.1/t0803-c5505-mrgn-02-c-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css2.1/t0803-c5505-mrgn-02-c-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css2.1/t0803-c5505-mrgn-02-c-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css2.1/t080301-c411-vt-mrgn-00-b-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css2.1/t080301-c411-vt-mrgn-00-b-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css2.1/t080301-c411-vt-mrgn-00-b-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css2.1/t080301-c411-vt-mrgn-00-b-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css2.1/t09-c5526c-display-00-e-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css2.1/t09-c5526c-display-00-e-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css2.1/t09-c5526c-display-00-e-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css2.1/t09-c5526c-display-00-e-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css2.1/t09-c5526c-display-00-e-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css2.1/t09-c5526c-display-00-e-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css2.1/t09-c5526c-display-00-e-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css2.1/t09-c5526c-display-00-e-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css2.1/t0905-c5525-fltwidth-00-c-g-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css2.1/t0905-c5525-fltwidth-00-c-g-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css2.1/t0905-c5525-fltwidth-00-c-g-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css2.1/t0905-c5525-fltwidth-00-c-g-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css2.1/t1002-c5523-width-02-b-g-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css2.1/t1002-c5523-width-02-b-g-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css2.1/t1002-c5523-width-02-b-g-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css2.1/t1002-c5523-width-02-b-g-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css2.1/t140201-c535-bg-fixd-00-b-g-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css2.1/t140201-c535-bg-fixd-00-b-g-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css2.1/t140201-c535-bg-fixd-00-b-g-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css2.1/t140201-c535-bg-fixd-00-b-g-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css2.1/t140201-c537-bgfxps-00-c-ag-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css2.1/t140201-c537-bgfxps-00-c-ag-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css2.1/t140201-c537-bgfxps-00-c-ag-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css2.1/t140201-c537-bgfxps-00-c-ag-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/flexbox/button-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/flexbox/button-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/flexbox/button-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/flexbox/button-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/flexbox/flexbox-baseline-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/flexbox/flexbox-baseline-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/flexbox/flexbox-baseline-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/flexbox/flexbox-baseline-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/flexbox/flexbox-baseline-margins-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/flexbox/flexbox-baseline-margins-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/flexbox/flexbox-baseline-margins-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/flexbox/flexbox-baseline-margins-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/flexbox/repaint-rtl-column-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/flexbox/repaint-rtl-column-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/flexbox/repaint-rtl-column-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/flexbox/repaint-rtl-column-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/masking/mask-repeat-round-content-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/masking/mask-repeat-round-content-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/masking/mask-repeat-round-content-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/masking/mask-repeat-round-content-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/masking/mask-repeat-space-border-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/masking/mask-repeat-space-border-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/masking/mask-repeat-space-border-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/masking/mask-repeat-space-border-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/masking/mask-repeat-space-content-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/masking/mask-repeat-space-content-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/masking/mask-repeat-space-content-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/masking/mask-repeat-space-content-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/masking/mask-repeat-space-padding-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/masking/mask-repeat-space-padding-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/masking/mask-repeat-space-padding-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/masking/mask-repeat-space-padding-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/html/css3-modsel-161-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/html/css3-modsel-161-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/html/css3-modsel-161-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/html/css3-modsel-161-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/html/css3-modsel-161-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/html/css3-modsel-161-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/html/css3-modsel-161-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/html/css3-modsel-161-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/html/css3-modsel-19b-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/html/css3-modsel-19b-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/html/css3-modsel-19b-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/html/css3-modsel-19b-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/html/css3-modsel-19b-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/html/css3-modsel-19b-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/html/css3-modsel-19b-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/html/css3-modsel-19b-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/html/css3-modsel-23-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/html/css3-modsel-23-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/html/css3-modsel-23-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/html/css3-modsel-23-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/html/css3-modsel-23-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/html/css3-modsel-23-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/html/css3-modsel-23-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/html/css3-modsel-23-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/html/css3-modsel-24-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/html/css3-modsel-24-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/html/css3-modsel-24-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/html/css3-modsel-24-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/html/css3-modsel-24-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/html/css3-modsel-24-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/html/css3-modsel-24-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/html/css3-modsel-24-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/html/css3-modsel-25-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/html/css3-modsel-25-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/html/css3-modsel-25-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/html/css3-modsel-25-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/html/css3-modsel-25-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/html/css3-modsel-25-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/html/css3-modsel-25-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/html/css3-modsel-25-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/html/css3-modsel-64-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/html/css3-modsel-64-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/html/css3-modsel-64-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/html/css3-modsel-64-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/html/css3-modsel-64-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/html/css3-modsel-64-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/html/css3-modsel-64-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/html/css3-modsel-64-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/html/css3-modsel-68-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/html/css3-modsel-68-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/html/css3-modsel-68-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/html/css3-modsel-68-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/html/css3-modsel-68-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/html/css3-modsel-68-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/html/css3-modsel-68-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/html/css3-modsel-68-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/html/css3-modsel-69-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/html/css3-modsel-69-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/html/css3-modsel-69-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/html/css3-modsel-69-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/html/css3-modsel-69-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/html/css3-modsel-69-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/html/css3-modsel-69-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/html/css3-modsel-69-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/html/css3-modsel-70-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/html/css3-modsel-70-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/html/css3-modsel-70-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/html/css3-modsel-70-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/html/css3-modsel-70-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/html/css3-modsel-70-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/html/css3-modsel-70-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/html/css3-modsel-70-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/xhtml/css3-modsel-161-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/xhtml/css3-modsel-161-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/xhtml/css3-modsel-161-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/xhtml/css3-modsel-161-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/xhtml/css3-modsel-161-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/xhtml/css3-modsel-161-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/xhtml/css3-modsel-161-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/xhtml/css3-modsel-161-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/xhtml/css3-modsel-19b-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/xhtml/css3-modsel-19b-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/xhtml/css3-modsel-19b-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/xhtml/css3-modsel-19b-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/xhtml/css3-modsel-19b-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/xhtml/css3-modsel-19b-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/xhtml/css3-modsel-19b-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/xhtml/css3-modsel-19b-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/xhtml/css3-modsel-23-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/xhtml/css3-modsel-23-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/xhtml/css3-modsel-23-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/xhtml/css3-modsel-23-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/xhtml/css3-modsel-23-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/xhtml/css3-modsel-23-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/xhtml/css3-modsel-23-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/xhtml/css3-modsel-23-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/xhtml/css3-modsel-24-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/xhtml/css3-modsel-24-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/xhtml/css3-modsel-24-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/xhtml/css3-modsel-24-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/xhtml/css3-modsel-24-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/xhtml/css3-modsel-24-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/xhtml/css3-modsel-24-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/xhtml/css3-modsel-24-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/xhtml/css3-modsel-25-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/xhtml/css3-modsel-25-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/xhtml/css3-modsel-25-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/xhtml/css3-modsel-25-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/xhtml/css3-modsel-25-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/xhtml/css3-modsel-25-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/xhtml/css3-modsel-25-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/xhtml/css3-modsel-25-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/xhtml/css3-modsel-64-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/xhtml/css3-modsel-64-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/xhtml/css3-modsel-64-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/xhtml/css3-modsel-64-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/xhtml/css3-modsel-64-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/xhtml/css3-modsel-64-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/xhtml/css3-modsel-64-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/xhtml/css3-modsel-64-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/xhtml/css3-modsel-68-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/xhtml/css3-modsel-68-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/xhtml/css3-modsel-68-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/xhtml/css3-modsel-68-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/xhtml/css3-modsel-68-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/xhtml/css3-modsel-68-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/xhtml/css3-modsel-68-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/xhtml/css3-modsel-68-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/xhtml/css3-modsel-69-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/xhtml/css3-modsel-69-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/xhtml/css3-modsel-69-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/xhtml/css3-modsel-69-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/xhtml/css3-modsel-69-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/xhtml/css3-modsel-69-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/xhtml/css3-modsel-69-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/xhtml/css3-modsel-69-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/xhtml/css3-modsel-70-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/xhtml/css3-modsel-70-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/xhtml/css3-modsel-70-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/xhtml/css3-modsel-70-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/xhtml/css3-modsel-70-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/xhtml/css3-modsel-70-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/xhtml/css3-modsel-70-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/xhtml/css3-modsel-70-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/xml/css3-modsel-161-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/xml/css3-modsel-161-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/xml/css3-modsel-161-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/xml/css3-modsel-161-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/xml/css3-modsel-161-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/xml/css3-modsel-161-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/xml/css3-modsel-161-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/xml/css3-modsel-161-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/xml/css3-modsel-19b-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/xml/css3-modsel-19b-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/xml/css3-modsel-19b-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/xml/css3-modsel-19b-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/xml/css3-modsel-19b-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/xml/css3-modsel-19b-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/xml/css3-modsel-19b-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/xml/css3-modsel-19b-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/xml/css3-modsel-23-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/xml/css3-modsel-23-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/xml/css3-modsel-23-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/xml/css3-modsel-23-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/xml/css3-modsel-23-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/xml/css3-modsel-23-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/xml/css3-modsel-23-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/xml/css3-modsel-23-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/xml/css3-modsel-24-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/xml/css3-modsel-24-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/xml/css3-modsel-24-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/xml/css3-modsel-24-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/xml/css3-modsel-24-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/xml/css3-modsel-24-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/xml/css3-modsel-24-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/xml/css3-modsel-24-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/xml/css3-modsel-25-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/xml/css3-modsel-25-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/xml/css3-modsel-25-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/xml/css3-modsel-25-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/xml/css3-modsel-25-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/xml/css3-modsel-25-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/xml/css3-modsel-25-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/xml/css3-modsel-25-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/xml/css3-modsel-64-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/xml/css3-modsel-64-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/xml/css3-modsel-64-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/xml/css3-modsel-64-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/xml/css3-modsel-64-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/xml/css3-modsel-64-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/xml/css3-modsel-64-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/xml/css3-modsel-64-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/xml/css3-modsel-68-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/xml/css3-modsel-68-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/xml/css3-modsel-68-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/xml/css3-modsel-68-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/xml/css3-modsel-68-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/xml/css3-modsel-68-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/xml/css3-modsel-68-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/xml/css3-modsel-68-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/xml/css3-modsel-69-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/xml/css3-modsel-69-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/xml/css3-modsel-69-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/xml/css3-modsel-69-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/xml/css3-modsel-69-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/xml/css3-modsel-69-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/xml/css3-modsel-69-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/xml/css3-modsel-69-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/xml/css3-modsel-70-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/xml/css3-modsel-70-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/xml/css3-modsel-70-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/xml/css3-modsel-70-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/xml/css3-modsel-70-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/xml/css3-modsel-70-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/css3/selectors3/xml/css3-modsel-70-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/css3/selectors3/xml/css3-modsel-70-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/caret/caret-position-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/caret/caret-position-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/caret/caret-position-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/caret/caret-position-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/input/caret-at-the-edge-of-input-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/input/caret-at-the-edge-of-input-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/input/caret-at-the-edge-of-input-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/input/caret-at-the-edge-of-input-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/input/caret-at-the-edge-of-input-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/input/caret-at-the-edge-of-input-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/input/caret-at-the-edge-of-input-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/input/caret-at-the-edge-of-input-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/input/reveal-caret-of-multiline-contenteditable-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/input/reveal-caret-of-multiline-contenteditable-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/input/reveal-caret-of-multiline-contenteditable-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/input/reveal-caret-of-multiline-contenteditable-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/input/reveal-caret-of-multiline-input-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/input/reveal-caret-of-multiline-input-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/input/reveal-caret-of-multiline-input-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/input/reveal-caret-of-multiline-input-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/input/reveal-caret-of-multiline-input-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/input/reveal-caret-of-multiline-input-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/input/reveal-caret-of-multiline-input-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/input/reveal-caret-of-multiline-input-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/inserting/4960120-1-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/inserting/4960120-1-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/inserting/4960120-1-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/inserting/4960120-1-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/inserting/4960120-1-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/inserting/4960120-1-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/inserting/4960120-1-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/inserting/4960120-1-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/inserting/before-after-input-element-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/inserting/before-after-input-element-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/inserting/before-after-input-element-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/inserting/before-after-input-element-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/inserting/before-after-input-element-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/inserting/before-after-input-element-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/inserting/before-after-input-element-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/inserting/before-after-input-element-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/inserting/insert-div-023-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/inserting/insert-div-023-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/inserting/insert-div-023-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/inserting/insert-div-023-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/pasteboard/4641033-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/pasteboard/4641033-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/pasteboard/4641033-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/pasteboard/4641033-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/pasteboard/4641033-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/pasteboard/4641033-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/pasteboard/4641033-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/pasteboard/4641033-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/pasteboard/4806874-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/pasteboard/4806874-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/pasteboard/4806874-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/pasteboard/4806874-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/pasteboard/4806874-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/pasteboard/4806874-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/pasteboard/4806874-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/pasteboard/4806874-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/pasteboard/drop-text-without-selection-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/pasteboard/drop-text-without-selection-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/pasteboard/drop-text-without-selection-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/pasteboard/drop-text-without-selection-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/pasteboard/drop-text-without-selection-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/pasteboard/drop-text-without-selection-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/pasteboard/drop-text-without-selection-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/pasteboard/drop-text-without-selection-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/pasteboard/input-field-1-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/pasteboard/input-field-1-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/pasteboard/input-field-1-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/pasteboard/input-field-1-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/pasteboard/input-field-1-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/pasteboard/input-field-1-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/pasteboard/input-field-1-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/pasteboard/input-field-1-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/pasteboard/pasting-tabs-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/pasteboard/pasting-tabs-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/pasteboard/pasting-tabs-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/pasteboard/pasting-tabs-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/pasteboard/pasting-tabs-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/pasteboard/pasting-tabs-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/pasteboard/pasting-tabs-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/pasteboard/pasting-tabs-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/selection/3690703-2-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/selection/3690703-2-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/selection/3690703-2-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/selection/3690703-2-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/selection/3690703-2-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/selection/3690703-2-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/selection/3690703-2-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/selection/3690703-2-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/selection/3690703-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/selection/3690703-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/selection/3690703-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/selection/3690703-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/selection/3690703-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/selection/3690703-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/selection/3690703-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/selection/3690703-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/selection/3690719-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/selection/3690719-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/selection/3690719-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/selection/3690719-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/selection/3690719-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/selection/3690719-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/selection/3690719-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/selection/3690719-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/selection/4397952-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/selection/4397952-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/selection/4397952-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/selection/4397952-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/selection/4397952-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/selection/4397952-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/selection/4397952-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/selection/4397952-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/selection/4975120-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/selection/4975120-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/selection/4975120-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/selection/4975120-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/selection/4975120-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/selection/4975120-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/selection/4975120-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/selection/4975120-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/selection/5240265-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/selection/5240265-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/selection/5240265-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/selection/5240265-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/selection/5240265-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/selection/5240265-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/selection/5240265-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/selection/5240265-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/selection/caret-before-select-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/selection/caret-before-select-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/selection/caret-before-select-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/selection/caret-before-select-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/selection/caret-before-select-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/selection/caret-before-select-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/selection/caret-before-select-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/selection/caret-before-select-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/selection/drag-select-1-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/selection/drag-select-1-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/selection/drag-select-1-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/selection/drag-select-1-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/selection/drag-select-1-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/selection/drag-select-1-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/selection/drag-select-1-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/selection/drag-select-1-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/selection/move-left-right-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/selection/move-left-right-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/selection/move-left-right-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/selection/move-left-right-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/selection/replaced-boundaries-3-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/selection/replaced-boundaries-3-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/selection/replaced-boundaries-3-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/selection/replaced-boundaries-3-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/selection/replaced-boundaries-3-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/selection/replaced-boundaries-3-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/selection/replaced-boundaries-3-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/selection/replaced-boundaries-3-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/selection/select-across-readonly-input-1-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/selection/select-across-readonly-input-1-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/selection/select-across-readonly-input-1-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/selection/select-across-readonly-input-1-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/selection/select-across-readonly-input-1-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/selection/select-across-readonly-input-1-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/selection/select-across-readonly-input-1-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/selection/select-across-readonly-input-1-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/selection/select-across-readonly-input-2-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/selection/select-across-readonly-input-2-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/selection/select-across-readonly-input-2-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/selection/select-across-readonly-input-2-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/selection/select-across-readonly-input-2-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/selection/select-across-readonly-input-2-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/selection/select-across-readonly-input-2-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/selection/select-across-readonly-input-2-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/selection/select-across-readonly-input-3-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/selection/select-across-readonly-input-3-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/selection/select-across-readonly-input-3-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/selection/select-across-readonly-input-3-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/selection/select-across-readonly-input-3-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/selection/select-across-readonly-input-3-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/selection/select-across-readonly-input-3-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/selection/select-across-readonly-input-3-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/selection/select-across-readonly-input-4-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/selection/select-across-readonly-input-4-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/selection/select-across-readonly-input-4-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/selection/select-across-readonly-input-4-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/selection/select-across-readonly-input-4-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/selection/select-across-readonly-input-4-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/selection/select-across-readonly-input-4-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/selection/select-across-readonly-input-4-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/selection/select-across-readonly-input-5-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/selection/select-across-readonly-input-5-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/selection/select-across-readonly-input-5-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/selection/select-across-readonly-input-5-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/selection/select-across-readonly-input-5-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/selection/select-across-readonly-input-5-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/selection/select-across-readonly-input-5-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/selection/select-across-readonly-input-5-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/selection/select-box-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/selection/select-box-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/selection/select-box-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/selection/select-box-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/selection/select-element-paragraph-boundary-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/selection/select-element-paragraph-boundary-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/selection/select-element-paragraph-boundary-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/selection/select-element-paragraph-boundary-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/selection/selection-button-text-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/selection/selection-button-text-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/selection/selection-button-text-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/selection/selection-button-text-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/selection/selection-button-text-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/selection/selection-button-text-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/selection/selection-button-text-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/selection/selection-button-text-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/spelling/inline-spelling-markers-hidpi-composited-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/spelling/inline-spelling-markers-hidpi-composited-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/spelling/inline-spelling-markers-hidpi-composited-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/spelling/inline-spelling-markers-hidpi-composited-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/spelling/input-type-text-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/spelling/input-type-text-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/editing/spelling/input-type-text-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/editing/spelling/input-type-text-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/backgrounds/background-inherit-color-bug-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/backgrounds/background-inherit-color-bug-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/backgrounds/background-inherit-color-bug-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/backgrounds/background-inherit-color-bug-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/backgrounds/background-leakage-transforms-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/backgrounds/background-leakage-transforms-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/backgrounds/background-leakage-transforms-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/backgrounds/background-leakage-transforms-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/block/basic/011-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/block/basic/011-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/block/basic/011-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/block/basic/011-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/block/basic/011-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/block/basic/011-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/block/basic/011-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/block/basic/011-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/block/basic/016-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/block/basic/016-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/block/basic/016-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/block/basic/016-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/block/basic/fieldset-stretch-to-legend-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/block/basic/fieldset-stretch-to-legend-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/block/basic/fieldset-stretch-to-legend-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/block/basic/fieldset-stretch-to-legend-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/block/float/008-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/block/float/008-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/block/float/008-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/block/float/008-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/block/float/016-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/block/float/016-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/block/float/016-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/block/float/016-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/block/float/021-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/block/float/021-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/block/float/021-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/block/float/021-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/block/float/025-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/block/float/025-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/block/float/025-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/block/float/025-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/block/float/026-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/block/float/026-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/block/float/026-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/block/float/026-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/block/float/027-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/block/float/027-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/block/float/027-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/block/float/027-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/block/float/028-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/block/float/028-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/block/float/028-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/block/float/028-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/block/float/032-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/block/float/032-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/block/float/032-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/block/float/032-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/block/float/033-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/block/float/033-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/block/float/033-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/block/float/033-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/block/float/035-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/block/float/035-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/block/float/035-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/block/float/035-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/block/float/br-with-clear-2-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/block/float/br-with-clear-2-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/block/float/br-with-clear-2-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/block/float/br-with-clear-2-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/block/float/centered-float-avoidance-complexity-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/block/float/centered-float-avoidance-complexity-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/block/float/centered-float-avoidance-complexity-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/block/float/centered-float-avoidance-complexity-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/block/float/float-avoidance-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/block/float/float-avoidance-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/block/float/float-avoidance-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/block/float/float-avoidance-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/block/float/float-avoidance-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/block/float/float-avoidance-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/block/float/float-avoidance-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/block/float/float-avoidance-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/block/float/nested-clearance-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/block/float/nested-clearance-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/block/float/nested-clearance-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/block/float/nested-clearance-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/block/float/overhanging-tall-block-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/block/float/overhanging-tall-block-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/block/float/overhanging-tall-block-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/block/float/overhanging-tall-block-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/block/float/overhanging-tall-block-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/block/float/overhanging-tall-block-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/block/float/overhanging-tall-block-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/block/float/overhanging-tall-block-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/block/float/relative-painted-twice-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/block/float/relative-painted-twice-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/block/float/relative-painted-twice-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/block/float/relative-painted-twice-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/block/float/shrink-to-avoid-float-complexity-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/block/float/shrink-to-avoid-float-complexity-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/block/float/shrink-to-avoid-float-complexity-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/block/float/shrink-to-avoid-float-complexity-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/block/margin-collapse/103-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/block/margin-collapse/103-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/block/margin-collapse/103-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/block/margin-collapse/103-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/block/margin-collapse/103-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/block/margin-collapse/103-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/block/margin-collapse/103-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/block/margin-collapse/103-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/block/margin-collapse/104-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/block/margin-collapse/104-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/block/margin-collapse/104-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/block/margin-collapse/104-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/block/margin-collapse/empty-clear-blocks-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/block/margin-collapse/empty-clear-blocks-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/block/margin-collapse/empty-clear-blocks-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/block/margin-collapse/empty-clear-blocks-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/block/positioning/047-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/block/positioning/047-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/block/positioning/047-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/block/positioning/047-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/block/positioning/051-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/block/positioning/051-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/block/positioning/051-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/block/positioning/051-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/block/positioning/055-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/block/positioning/055-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/block/positioning/055-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/block/positioning/055-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/block/positioning/auto/007-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/block/positioning/auto/007-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/block/positioning/auto/007-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/block/positioning/auto/007-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/block/positioning/fixed-positioning-scrollbar-bug-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/block/positioning/fixed-positioning-scrollbar-bug-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/block/positioning/fixed-positioning-scrollbar-bug-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/block/positioning/fixed-positioning-scrollbar-bug-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/block/positioning/inline-block-relposition-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/block/positioning/inline-block-relposition-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/block/positioning/inline-block-relposition-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/block/positioning/inline-block-relposition-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/block/positioning/inline-block-relposition-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/block/positioning/inline-block-relposition-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/block/positioning/inline-block-relposition-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/block/positioning/inline-block-relposition-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/block/positioning/relative-overflow-block-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/block/positioning/relative-overflow-block-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/block/positioning/relative-overflow-block-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/block/positioning/relative-overflow-block-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/block/positioning/relative-overflow-replaced-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/block/positioning/relative-overflow-replaced-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/block/positioning/relative-overflow-replaced-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/block/positioning/relative-overflow-replaced-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/block/positioning/relative-overflow-replaced-float-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/block/positioning/relative-overflow-replaced-float-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/block/positioning/relative-overflow-replaced-float-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/block/positioning/relative-overflow-replaced-float-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/block/positioning/vertical-lr/002-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/block/positioning/vertical-lr/002-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/block/positioning/vertical-lr/002-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/block/positioning/vertical-lr/002-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/block/positioning/vertical-rl/002-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/block/positioning/vertical-rl/002-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/block/positioning/vertical-rl/002-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/block/positioning/vertical-rl/002-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/body-propagation/overflow/001-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/body-propagation/overflow/001-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/body-propagation/overflow/001-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/body-propagation/overflow/001-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/body-propagation/overflow/001-xhtml-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/body-propagation/overflow/001-xhtml-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/body-propagation/overflow/001-xhtml-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/body-propagation/overflow/001-xhtml-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/body-propagation/overflow/002-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/body-propagation/overflow/002-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/body-propagation/overflow/002-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/body-propagation/overflow/002-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/body-propagation/overflow/002-xhtml-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/body-propagation/overflow/002-xhtml-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/body-propagation/overflow/002-xhtml-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/body-propagation/overflow/002-xhtml-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/body-propagation/overflow/003-declarative-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/body-propagation/overflow/003-declarative-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/body-propagation/overflow/003-declarative-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/body-propagation/overflow/003-declarative-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/body-propagation/overflow/003-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/body-propagation/overflow/003-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/body-propagation/overflow/003-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/body-propagation/overflow/003-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/body-propagation/overflow/003-xhtml-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/body-propagation/overflow/003-xhtml-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/body-propagation/overflow/003-xhtml-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/body-propagation/overflow/003-xhtml-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/body-propagation/overflow/004-declarative-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/body-propagation/overflow/004-declarative-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/body-propagation/overflow/004-declarative-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/body-propagation/overflow/004-declarative-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/body-propagation/overflow/004-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/body-propagation/overflow/004-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/body-propagation/overflow/004-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/body-propagation/overflow/004-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/body-propagation/overflow/004-xhtml-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/body-propagation/overflow/004-xhtml-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/body-propagation/overflow/004-xhtml-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/body-propagation/overflow/004-xhtml-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/body-propagation/overflow/005-declarative-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/body-propagation/overflow/005-declarative-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/body-propagation/overflow/005-declarative-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/body-propagation/overflow/005-declarative-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/body-propagation/overflow/005-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/body-propagation/overflow/005-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/body-propagation/overflow/005-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/body-propagation/overflow/005-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/body-propagation/overflow/005-xhtml-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/body-propagation/overflow/005-xhtml-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/body-propagation/overflow/005-xhtml-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/body-propagation/overflow/005-xhtml-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/body-propagation/overflow/006-declarative-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/body-propagation/overflow/006-declarative-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/body-propagation/overflow/006-declarative-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/body-propagation/overflow/006-declarative-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/body-propagation/overflow/006-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/body-propagation/overflow/006-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/body-propagation/overflow/006-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/body-propagation/overflow/006-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/body-propagation/overflow/006-xhtml-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/body-propagation/overflow/006-xhtml-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/body-propagation/overflow/006-xhtml-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/body-propagation/overflow/006-xhtml-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/body-propagation/overflow/007-declarative-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/body-propagation/overflow/007-declarative-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/body-propagation/overflow/007-declarative-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/body-propagation/overflow/007-declarative-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/body-propagation/overflow/007-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/body-propagation/overflow/007-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/body-propagation/overflow/007-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/body-propagation/overflow/007-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/body-propagation/overflow/007-xhtml-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/body-propagation/overflow/007-xhtml-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/body-propagation/overflow/007-xhtml-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/body-propagation/overflow/007-xhtml-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/borders/inline-mask-overlay-image-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/borders/inline-mask-overlay-image-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/borders/inline-mask-overlay-image-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/borders/inline-mask-overlay-image-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/borders/rtl-border-01-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/borders/rtl-border-01-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/borders/rtl-border-01-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/borders/rtl-border-01-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/borders/rtl-border-02-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/borders/rtl-border-02-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/borders/rtl-border-02-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/borders/rtl-border-02-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/borders/rtl-border-03-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/borders/rtl-border-03-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/borders/rtl-border-03-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/borders/rtl-border-03-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/box-shadow/basic-shadows-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/box-shadow/basic-shadows-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/box-shadow/basic-shadows-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/box-shadow/basic-shadows-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/box-sizing/box-sizing-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/box-sizing/box-sizing-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/box-sizing/box-sizing-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/box-sizing/box-sizing-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/canvas/canvas-composite-video-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/canvas/canvas-composite-video-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/canvas/canvas-composite-video-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/canvas/canvas-composite-video-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/clip/014-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/clip/014-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/clip/014-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/clip/014-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css-generated-content/014-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css-generated-content/014-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css-generated-content/014-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css-generated-content/014-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css-generated-content/table-parts-before-and-after-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css-generated-content/table-parts-before-and-after-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css-generated-content/table-parts-before-and-after-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css-generated-content/table-parts-before-and-after-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/bidi-override-in-anonymous-block-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/bidi-override-in-anonymous-block-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/bidi-override-in-anonymous-block-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/bidi-override-in-anonymous-block-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/border-height-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/border-height-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/border-height-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/border-height-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/color-correction-backgrounds-and-text-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/color-correction-backgrounds-and-text-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/color-correction-backgrounds-and-text-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/color-correction-backgrounds-and-text-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/color-correction-on-background-image-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/color-correction-on-background-image-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/color-correction-on-background-image-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/color-correction-on-background-image-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/continuationCrash-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/continuationCrash-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/continuationCrash-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/continuationCrash-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/continuationCrash-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/continuationCrash-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/continuationCrash-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/continuationCrash-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/empty-pseudo-class-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/empty-pseudo-class-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/empty-pseudo-class-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/empty-pseudo-class-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/first-child-pseudo-class-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/first-child-pseudo-class-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/first-child-pseudo-class-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/first-child-pseudo-class-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/first-of-type-pseudo-class-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/first-of-type-pseudo-class-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/first-of-type-pseudo-class-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/first-of-type-pseudo-class-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/font-face-data-uri-invalid-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/font-face-data-uri-invalid-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/font-face-data-uri-invalid-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/font-face-data-uri-invalid-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/fontfaceset-download-error-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/fontfaceset-download-error-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/fontfaceset-download-error-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/fontfaceset-download-error-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/hsl-color-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/hsl-color-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/hsl-color-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/hsl-color-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/imageTileOpacity-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/imageTileOpacity-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/imageTileOpacity-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/imageTileOpacity-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/input-search-padding-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/input-search-padding-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/input-search-padding-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/input-search-padding-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/input-search-padding-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/input-search-padding-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/input-search-padding-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/input-search-padding-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/last-child-pseudo-class-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/last-child-pseudo-class-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/last-child-pseudo-class-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/last-child-pseudo-class-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/last-of-type-pseudo-class-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/last-of-type-pseudo-class-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/last-of-type-pseudo-class-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/last-of-type-pseudo-class-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/line-height-determined-by-primary-font-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/line-height-determined-by-primary-font-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/line-height-determined-by-primary-font-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/line-height-determined-by-primary-font-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/line-height-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/line-height-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/line-height-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/line-height-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/line-height-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/line-height-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/line-height-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/line-height-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/line-height-overflow-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/line-height-overflow-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/line-height-overflow-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/line-height-overflow-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/margin-top-bottom-dynamic-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/margin-top-bottom-dynamic-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/margin-top-bottom-dynamic-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/margin-top-bottom-dynamic-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/margin-top-bottom-dynamic-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/margin-top-bottom-dynamic-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/margin-top-bottom-dynamic-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/margin-top-bottom-dynamic-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/nested-rounded-corners-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/nested-rounded-corners-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/nested-rounded-corners-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/nested-rounded-corners-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/non-standard-checkbox-size-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/non-standard-checkbox-size-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/non-standard-checkbox-size-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/non-standard-checkbox-size-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/non-standard-checkbox-size-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/non-standard-checkbox-size-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/non-standard-checkbox-size-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/non-standard-checkbox-size-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/only-child-pseudo-class-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/only-child-pseudo-class-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/only-child-pseudo-class-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/only-child-pseudo-class-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/only-of-type-pseudo-class-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/only-of-type-pseudo-class-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/only-of-type-pseudo-class-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/only-of-type-pseudo-class-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/resize-corner-tracking-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/resize-corner-tracking-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/resize-corner-tracking-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/resize-corner-tracking-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/resize-corner-tracking-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/resize-corner-tracking-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/resize-corner-tracking-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/resize-corner-tracking-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/rtl-ordering-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/rtl-ordering-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/rtl-ordering-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/rtl-ordering-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/rtl-ordering-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/rtl-ordering-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/rtl-ordering-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/rtl-ordering-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/shadow-multiple-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/shadow-multiple-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/shadow-multiple-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/shadow-multiple-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/square-button-appearance-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/square-button-appearance-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/square-button-appearance-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/square-button-appearance-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/text-overflow-ellipsis-text-align-center-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/text-overflow-ellipsis-text-align-center-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/text-overflow-ellipsis-text-align-center-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/text-overflow-ellipsis-text-align-center-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/text-overflow-ellipsis-text-align-justify-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/text-overflow-ellipsis-text-align-justify-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/text-overflow-ellipsis-text-align-justify-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/text-overflow-ellipsis-text-align-justify-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/text-overflow-ellipsis-text-align-left-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/text-overflow-ellipsis-text-align-left-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/text-overflow-ellipsis-text-align-left-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/text-overflow-ellipsis-text-align-left-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/text-overflow-ellipsis-text-align-right-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/text-overflow-ellipsis-text-align-right-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/text-overflow-ellipsis-text-align-right-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/text-overflow-ellipsis-text-align-right-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/text-overflow-input-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/text-overflow-input-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/text-overflow-input-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/text-overflow-input-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/text-overflow-input-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/text-overflow-input-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/text-overflow-input-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/text-overflow-input-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/vertical-text-overflow-ellipsis-text-align-center-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/vertical-text-overflow-ellipsis-text-align-center-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/vertical-text-overflow-ellipsis-text-align-center-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/vertical-text-overflow-ellipsis-text-align-center-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/vertical-text-overflow-ellipsis-text-align-justify-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/vertical-text-overflow-ellipsis-text-align-justify-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/vertical-text-overflow-ellipsis-text-align-justify-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/vertical-text-overflow-ellipsis-text-align-justify-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/vertical-text-overflow-ellipsis-text-align-left-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/vertical-text-overflow-ellipsis-text-align-left-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/vertical-text-overflow-ellipsis-text-align-left-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/vertical-text-overflow-ellipsis-text-align-left-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/vertical-text-overflow-ellipsis-text-align-right-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/vertical-text-overflow-ellipsis-text-align-right-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/css/vertical-text-overflow-ellipsis-text-align-right-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/css/vertical-text-overflow-ellipsis-text-align-right-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/deprecated-flexbox/009-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/deprecated-flexbox/009-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/deprecated-flexbox/009-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/deprecated-flexbox/009-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/deprecated-flexbox/009-horizontal-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/deprecated-flexbox/009-horizontal-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/deprecated-flexbox/009-horizontal-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/deprecated-flexbox/009-horizontal-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/dom/34176-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/dom/34176-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/dom/34176-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/dom/34176-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/dom/52776-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/dom/52776-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/dom/52776-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/dom/52776-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/dom/HTMLInputElement/input-image-alt-text-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/dom/HTMLInputElement/input-image-alt-text-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/dom/HTMLInputElement/input-image-alt-text-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/dom/HTMLInputElement/input-image-alt-text-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/dom/HTMLInputElement/input-image-alt-text-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/dom/HTMLInputElement/input-image-alt-text-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/dom/HTMLInputElement/input-image-alt-text-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/dom/HTMLInputElement/input-image-alt-text-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/dom/HTMLTableColElement/resize-table-using-col-width-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/dom/HTMLTableColElement/resize-table-using-col-width-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/dom/HTMLTableColElement/resize-table-using-col-width-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/dom/HTMLTableColElement/resize-table-using-col-width-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/dom/HTMLTableColElement/resize-table-using-col-width-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/dom/HTMLTableColElement/resize-table-using-col-width-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/dom/HTMLTableColElement/resize-table-using-col-width-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/dom/HTMLTableColElement/resize-table-using-col-width-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/dom/adopt-attribute-crash-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/dom/adopt-attribute-crash-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/dom/adopt-attribute-crash-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/dom/adopt-attribute-crash-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/dom/focus-contenteditable-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/dom/focus-contenteditable-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/dom/focus-contenteditable-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/dom/focus-contenteditable-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/dom/rtl-scroll-to-leftmost-and-resize-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/dom/rtl-scroll-to-leftmost-and-resize-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/dom/rtl-scroll-to-leftmost-and-resize-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/dom/rtl-scroll-to-leftmost-and-resize-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/dynamic/008-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/dynamic/008-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/dynamic/008-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/dynamic/008-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/dynamic/008-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/dynamic/008-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/dynamic/008-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/dynamic/008-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/dynamic/anchor-lock-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/dynamic/anchor-lock-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/dynamic/anchor-lock-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/dynamic/anchor-lock-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/dynamic/positioned-movement-with-positioned-children-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/dynamic/positioned-movement-with-positioned-children-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/dynamic/positioned-movement-with-positioned-children-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/dynamic/positioned-movement-with-positioned-children-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/encoding/invalid-UTF-8-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/encoding/invalid-UTF-8-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/encoding/invalid-UTF-8-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/encoding/invalid-UTF-8-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/events/autoscroll-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/events/autoscroll-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/events/autoscroll-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/events/autoscroll-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/events/autoscroll-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/events/autoscroll-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/events/autoscroll-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/events/autoscroll-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/events/context-no-deselect-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/events/context-no-deselect-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/events/context-no-deselect-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/events/context-no-deselect-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/events/context-no-deselect-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/events/context-no-deselect-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/events/context-no-deselect-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/events/context-no-deselect-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/events/reveal-link-when-focused-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/events/reveal-link-when-focused-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/events/reveal-link-when-focused-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/events/reveal-link-when-focused-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/files/file-in-input-display-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/files/file-in-input-display-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/files/file-in-input-display-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/files/file-in-input-display-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/files/file-in-input-display-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/files/file-in-input-display-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/files/file-in-input-display-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/files/file-in-input-display-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/001-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/001-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/001-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/001-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/001-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/001-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/001-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/001-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/basic-buttons-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/basic-buttons-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/basic-buttons-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/basic-buttons-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/basic-buttons-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/basic-buttons-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/basic-buttons-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/basic-buttons-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/basic-inputs-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/basic-inputs-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/basic-inputs-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/basic-inputs-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/basic-inputs-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/basic-inputs-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/basic-inputs-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/basic-inputs-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/blankbuttons-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/blankbuttons-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/blankbuttons-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/blankbuttons-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/blankbuttons-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/blankbuttons-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/blankbuttons-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/blankbuttons-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/button-default-title-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/button-default-title-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/button-default-title-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/button-default-title-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/button-default-title-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/button-default-title-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/button-default-title-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/button-default-title-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/button-positioned-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/button-positioned-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/button-positioned-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/button-positioned-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/button-positioned-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/button-positioned-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/button-positioned-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/button-positioned-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/button-sizes-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/button-sizes-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/button-sizes-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/button-sizes-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/button-sizes-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/button-sizes-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/button-sizes-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/button-sizes-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/button-style-color-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/button-style-color-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/button-style-color-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/button-style-color-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/button-style-color-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/button-style-color-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/button-style-color-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/button-style-color-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/button-table-styles-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/button-table-styles-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/button-table-styles-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/button-table-styles-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/button-table-styles-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/button-table-styles-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/button-table-styles-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/button-table-styles-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/button-text-transform-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/button-text-transform-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/button-text-transform-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/button-text-transform-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/button-text-transform-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/button-text-transform-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/button-text-transform-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/button-text-transform-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/button/button-align-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/button/button-align-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/button/button-align-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/button/button-align-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/button/button-align-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/button/button-align-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/button/button-align-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/button/button-align-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/button/button-cannot-be-nested-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/button/button-cannot-be-nested-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/button/button-cannot-be-nested-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/button/button-cannot-be-nested-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/button/button-cannot-be-nested-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/button/button-cannot-be-nested-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/button/button-cannot-be-nested-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/button/button-cannot-be-nested-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/button/button-inner-block-reuse-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/button/button-inner-block-reuse-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/button/button-inner-block-reuse-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/button/button-inner-block-reuse-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/button/button-reset-focus-by-mouse-then-keydown-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/button/button-reset-focus-by-mouse-then-keydown-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/button/button-reset-focus-by-mouse-then-keydown-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/button/button-reset-focus-by-mouse-then-keydown-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/button/button-white-space-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/button/button-white-space-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/button/button-white-space-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/button/button-white-space-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/button/button-white-space-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/button/button-white-space-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/button/button-white-space-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/button/button-white-space-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/calendar-picker/calendar-picker-appearance-ar-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/calendar-picker/calendar-picker-appearance-ar-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/calendar-picker/calendar-picker-appearance-ar-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/calendar-picker/calendar-picker-appearance-ar-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/calendar-picker/calendar-picker-appearance-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/calendar-picker/calendar-picker-appearance-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/calendar-picker/calendar-picker-appearance-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/calendar-picker/calendar-picker-appearance-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/calendar-picker/calendar-picker-appearance-minimum-date-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/calendar-picker/calendar-picker-appearance-minimum-date-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/calendar-picker/calendar-picker-appearance-minimum-date-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/calendar-picker/calendar-picker-appearance-minimum-date-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/calendar-picker/calendar-picker-appearance-required-ar-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/calendar-picker/calendar-picker-appearance-required-ar-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/calendar-picker/calendar-picker-appearance-required-ar-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/calendar-picker/calendar-picker-appearance-required-ar-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/calendar-picker/calendar-picker-appearance-required-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/calendar-picker/calendar-picker-appearance-required-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/calendar-picker/calendar-picker-appearance-required-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/calendar-picker/calendar-picker-appearance-required-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/calendar-picker/calendar-picker-appearance-ru-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/calendar-picker/calendar-picker-appearance-ru-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/calendar-picker/calendar-picker-appearance-ru-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/calendar-picker/calendar-picker-appearance-ru-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/calendar-picker/calendar-picker-appearance-step-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/calendar-picker/calendar-picker-appearance-step-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/calendar-picker/calendar-picker-appearance-step-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/calendar-picker/calendar-picker-appearance-step-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/calendar-picker/calendar-picker-appearance-zoom125-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/calendar-picker/calendar-picker-appearance-zoom125-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/calendar-picker/calendar-picker-appearance-zoom125-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/calendar-picker/calendar-picker-appearance-zoom125-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/calendar-picker/calendar-picker-appearance-zoom200-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/calendar-picker/calendar-picker-appearance-zoom200-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/calendar-picker/calendar-picker-appearance-zoom200-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/calendar-picker/calendar-picker-appearance-zoom200-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/calendar-picker/month-picker-appearance-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/calendar-picker/month-picker-appearance-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/calendar-picker/month-picker-appearance-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/calendar-picker/month-picker-appearance-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/calendar-picker/month-picker-appearance-step-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/calendar-picker/month-picker-appearance-step-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/calendar-picker/month-picker-appearance-step-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/calendar-picker/month-picker-appearance-step-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/calendar-picker/week-picker-appearance-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/calendar-picker/week-picker-appearance-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/calendar-picker/week-picker-appearance-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/calendar-picker/week-picker-appearance-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/calendar-picker/week-picker-appearance-step-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/calendar-picker/week-picker-appearance-step-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/calendar-picker/week-picker-appearance-step-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/calendar-picker/week-picker-appearance-step-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/checkbox/checkbox-appearance-basic-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/checkbox/checkbox-appearance-basic-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/checkbox/checkbox-appearance-basic-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/checkbox/checkbox-appearance-basic-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/checkbox/checkbox-focus-by-mouse-then-keydown-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/checkbox/checkbox-focus-by-mouse-then-keydown-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/checkbox/checkbox-focus-by-mouse-then-keydown-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/checkbox/checkbox-focus-by-mouse-then-keydown-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/color/color-suggestion-picker-appearance-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/color/color-suggestion-picker-appearance-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/color/color-suggestion-picker-appearance-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/color/color-suggestion-picker-appearance-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/color/color-suggestion-picker-appearance-zoom125-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/color/color-suggestion-picker-appearance-zoom125-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/color/color-suggestion-picker-appearance-zoom125-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/color/color-suggestion-picker-appearance-zoom125-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/color/color-suggestion-picker-appearance-zoom200-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/color/color-suggestion-picker-appearance-zoom200-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/color/color-suggestion-picker-appearance-zoom200-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/color/color-suggestion-picker-appearance-zoom200-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/color/color-suggestion-picker-one-row-appearance-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/color/color-suggestion-picker-one-row-appearance-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/color/color-suggestion-picker-one-row-appearance-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/color/color-suggestion-picker-one-row-appearance-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/color/color-suggestion-picker-two-row-appearance-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/color/color-suggestion-picker-two-row-appearance-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/color/color-suggestion-picker-two-row-appearance-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/color/color-suggestion-picker-two-row-appearance-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/color/color-suggestion-picker-with-scrollbar-appearance-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/color/color-suggestion-picker-with-scrollbar-appearance-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/color/color-suggestion-picker-with-scrollbar-appearance-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/color/color-suggestion-picker-with-scrollbar-appearance-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/color/input-appearance-color-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/color/input-appearance-color-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/color/input-appearance-color-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/color/input-appearance-color-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/control-clip-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/control-clip-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/control-clip-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/control-clip-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/control-clip-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/control-clip-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/control-clip-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/control-clip-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/control-clip-overflow-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/control-clip-overflow-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/control-clip-overflow-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/control-clip-overflow-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/control-clip-overflow-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/control-clip-overflow-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/control-clip-overflow-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/control-clip-overflow-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/control-restrict-line-height-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/control-restrict-line-height-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/control-restrict-line-height-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/control-restrict-line-height-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/control-restrict-line-height-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/control-restrict-line-height-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/control-restrict-line-height-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/control-restrict-line-height-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/date/date-appearance-basic-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/date/date-appearance-basic-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/date/date-appearance-basic-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/date/date-appearance-basic-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/date/date-appearance-l10n-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/date/date-appearance-l10n-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/date/date-appearance-l10n-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/date/date-appearance-l10n-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/date/date-appearance-pseudo-elements-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/date/date-appearance-pseudo-elements-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/date/date-appearance-pseudo-elements-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/date/date-appearance-pseudo-elements-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/datetimelocal/datetimelocal-appearance-basic-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/datetimelocal/datetimelocal-appearance-basic-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/datetimelocal/datetimelocal-appearance-basic-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/datetimelocal/datetimelocal-appearance-basic-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/datetimelocal/datetimelocal-appearance-l10n-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/datetimelocal/datetimelocal-appearance-l10n-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/datetimelocal/datetimelocal-appearance-l10n-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/datetimelocal/datetimelocal-appearance-l10n-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/encoding-test-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/encoding-test-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/encoding-test-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/encoding-test-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/encoding-test-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/encoding-test-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/encoding-test-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/encoding-test-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/fieldset/fieldset-align-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/fieldset/fieldset-align-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/fieldset/fieldset-align-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/fieldset/fieldset-align-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/fieldset/fieldset-align-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/fieldset/fieldset-align-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/fieldset/fieldset-align-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/fieldset/fieldset-align-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/file/file-input-direction-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/file/file-input-direction-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/file/file-input-direction-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/file/file-input-direction-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/file/file-input-direction-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/file/file-input-direction-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/file/file-input-direction-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/file/file-input-direction-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/file/file-input-disabled-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/file/file-input-disabled-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/file/file-input-disabled-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/file/file-input-disabled-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/file/file-input-disabled-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/file/file-input-disabled-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/file/file-input-disabled-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/file/file-input-disabled-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/file/file-input-pressed-state-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/file/file-input-pressed-state-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/file/file-input-pressed-state-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/file/file-input-pressed-state-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/file/input-file-re-render-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/file/input-file-re-render-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/file/input-file-re-render-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/file/input-file-re-render-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/file/input-file-re-render-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/file/input-file-re-render-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/file/input-file-re-render-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/file/input-file-re-render-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/floating-textfield-relayout-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/floating-textfield-relayout-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/floating-textfield-relayout-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/floating-textfield-relayout-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/floating-textfield-relayout-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/floating-textfield-relayout-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/floating-textfield-relayout-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/floating-textfield-relayout-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/form-element-geometry-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/form-element-geometry-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/form-element-geometry-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/form-element-geometry-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/form-element-geometry-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/form-element-geometry-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/form-element-geometry-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/form-element-geometry-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/formmove-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/formmove-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/formmove-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/formmove-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/formmove-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/formmove-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/formmove-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/formmove-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/formmove2-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/formmove2-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/formmove2-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/formmove2-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/formmove2-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/formmove2-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/formmove2-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/formmove2-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/formmove3-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/formmove3-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/formmove3-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/formmove3-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/formmove3-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/formmove3-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/formmove3-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/formmove3-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/image/002-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/image/002-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/image/002-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/image/002-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/image/002-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/image/002-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/image/002-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/image/002-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/image/005-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/image/005-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/image/005-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/image/005-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/image/005-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/image/005-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/image/005-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/image/005-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/indeterminate-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/indeterminate-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/indeterminate-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/indeterminate-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/indeterminate-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/indeterminate-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/indeterminate-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/indeterminate-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/input-align-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/input-align-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/input-align-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/input-align-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/input-align-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/input-align-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/input-align-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/input-align-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/input-appearance-height-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/input-appearance-height-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/input-appearance-height-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/input-appearance-height-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/input-appearance-height-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/input-appearance-height-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/input-appearance-height-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/input-appearance-height-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/input-button-sizes-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/input-button-sizes-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/input-button-sizes-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/input-button-sizes-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/input-button-sizes-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/input-button-sizes-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/input-button-sizes-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/input-button-sizes-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/input-first-letter-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/input-first-letter-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/input-first-letter-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/input-first-letter-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/input-first-letter-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/input-first-letter-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/input-first-letter-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/input-first-letter-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/input-type-text-min-width-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/input-type-text-min-width-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/input-type-text-min-width-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/input-type-text-min-width-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/input-type-text-min-width-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/input-type-text-min-width-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/input-type-text-min-width-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/input-type-text-min-width-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/input-value-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/input-value-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/input-value-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/input-value-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/input-value-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/input-value-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/input-value-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/input-value-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/minWidthPercent-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/minWidthPercent-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/minWidthPercent-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/minWidthPercent-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/minWidthPercent-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/minWidthPercent-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/minWidthPercent-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/minWidthPercent-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/month/month-appearance-basic-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/month/month-appearance-basic-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/month/month-appearance-basic-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/month/month-appearance-basic-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/month/month-appearance-l10n-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/month/month-appearance-l10n-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/month/month-appearance-l10n-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/month/month-appearance-l10n-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/month/month-appearance-pseudo-elements-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/month/month-appearance-pseudo-elements-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/month/month-appearance-pseudo-elements-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/month/month-appearance-pseudo-elements-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/number/number-appearance-datalist-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/number/number-appearance-datalist-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/number/number-appearance-datalist-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/number/number-appearance-datalist-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/number/number-appearance-datalist-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/number/number-appearance-datalist-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/number/number-appearance-datalist-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/number/number-appearance-datalist-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/number/number-appearance-rtl-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/number/number-appearance-rtl-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/number/number-appearance-rtl-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/number/number-appearance-rtl-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/number/number-appearance-rtl-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/number/number-appearance-rtl-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/number/number-appearance-rtl-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/number/number-appearance-rtl-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/number/number-appearance-spinbutton-disabled-readonly-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/number/number-appearance-spinbutton-disabled-readonly-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/number/number-appearance-spinbutton-disabled-readonly-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/number/number-appearance-spinbutton-disabled-readonly-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/number/number-appearance-spinbutton-disabled-readonly-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/number/number-appearance-spinbutton-disabled-readonly-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/number/number-appearance-spinbutton-disabled-readonly-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/number/number-appearance-spinbutton-disabled-readonly-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/number/number-appearance-spinbutton-layer-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/number/number-appearance-spinbutton-layer-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/number/number-appearance-spinbutton-layer-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/number/number-appearance-spinbutton-layer-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/number/number-appearance-spinbutton-layer-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/number/number-appearance-spinbutton-layer-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/number/number-appearance-spinbutton-layer-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/number/number-appearance-spinbutton-layer-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/placeholder-position-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/placeholder-position-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/placeholder-position-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/placeholder-position-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/placeholder-position-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/placeholder-position-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/placeholder-position-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/placeholder-position-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/plaintext-mode-2-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/plaintext-mode-2-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/plaintext-mode-2-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/plaintext-mode-2-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/plaintext-mode-2-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/plaintext-mode-2-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/plaintext-mode-2-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/plaintext-mode-2-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/radio/radio-appearance-basic-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/radio/radio-appearance-basic-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/radio/radio-appearance-basic-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/radio/radio-appearance-basic-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/radio/radio-focus-by-mouse-then-keydown-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/radio/radio-focus-by-mouse-then-keydown-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/radio/radio-focus-by-mouse-then-keydown-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/radio/radio-focus-by-mouse-then-keydown-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/search/search-appearance-basic-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/search/search-appearance-basic-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/search/search-appearance-basic-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/search/search-appearance-basic-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/search/search-appearance-basic-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/search/search-appearance-basic-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/search/search-appearance-basic-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/search/search-appearance-basic-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/search/search-cancel-button-style-sharing-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/search/search-cancel-button-style-sharing-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/search/search-cancel-button-style-sharing-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/search/search-cancel-button-style-sharing-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/search/search-cancel-button-style-sharing-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/search/search-cancel-button-style-sharing-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/search/search-cancel-button-style-sharing-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/search/search-cancel-button-style-sharing-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/search/search-display-none-cancel-button-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/search/search-display-none-cancel-button-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/search/search-display-none-cancel-button-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/search/search-display-none-cancel-button-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/search/search-display-none-cancel-button-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/search/search-display-none-cancel-button-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/search/search-display-none-cancel-button-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/search/search-display-none-cancel-button-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/search/search-rtl-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/search/search-rtl-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/search/search-rtl-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/search/search-rtl-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/search/search-rtl-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/search/search-rtl-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/search/search-rtl-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/search/search-rtl-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/search/search-vertical-alignment-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/search/search-vertical-alignment-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/search/search-vertical-alignment-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/search/search-vertical-alignment-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/search/search-vertical-alignment-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/search/search-vertical-alignment-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/search/search-vertical-alignment-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/search/search-vertical-alignment-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/search/searchfield-heights-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/search/searchfield-heights-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/search/searchfield-heights-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/search/searchfield-heights-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/search/searchfield-heights-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/search/searchfield-heights-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/search/searchfield-heights-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/search/searchfield-heights-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/003-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/003-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/003-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/003-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/003-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/003-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/003-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/003-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/004-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/004-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/004-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/004-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/004-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/004-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/004-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/004-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/HTMLOptionElement_label01-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/HTMLOptionElement_label01-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/HTMLOptionElement_label01-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/HTMLOptionElement_label01-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/HTMLOptionElement_label01-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/HTMLOptionElement_label01-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/HTMLOptionElement_label01-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/HTMLOptionElement_label01-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/HTMLOptionElement_label02-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/HTMLOptionElement_label02-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/HTMLOptionElement_label02-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/HTMLOptionElement_label02-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/HTMLOptionElement_label02-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/HTMLOptionElement_label02-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/HTMLOptionElement_label02-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/HTMLOptionElement_label02-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/HTMLOptionElement_label03-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/HTMLOptionElement_label03-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/HTMLOptionElement_label03-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/HTMLOptionElement_label03-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/HTMLOptionElement_label03-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/HTMLOptionElement_label03-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/HTMLOptionElement_label03-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/HTMLOptionElement_label03-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/HTMLOptionElement_label04-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/HTMLOptionElement_label04-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/HTMLOptionElement_label04-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/HTMLOptionElement_label04-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/HTMLOptionElement_label04-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/HTMLOptionElement_label04-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/HTMLOptionElement_label04-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/HTMLOptionElement_label04-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/HTMLOptionElement_label05-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/HTMLOptionElement_label05-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/HTMLOptionElement_label05-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/HTMLOptionElement_label05-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/HTMLOptionElement_label05-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/HTMLOptionElement_label05-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/HTMLOptionElement_label05-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/HTMLOptionElement_label05-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/HTMLOptionElement_label06-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/HTMLOptionElement_label06-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/HTMLOptionElement_label06-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/HTMLOptionElement_label06-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/HTMLOptionElement_label07-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/HTMLOptionElement_label07-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/HTMLOptionElement_label07-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/HTMLOptionElement_label07-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/basic-selects-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/basic-selects-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/basic-selects-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/basic-selects-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/basic-selects-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/basic-selects-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/basic-selects-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/basic-selects-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/disabled-select-change-index-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/disabled-select-change-index-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/disabled-select-change-index-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/disabled-select-change-index-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/disabled-select-change-index-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/disabled-select-change-index-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/disabled-select-change-index-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/disabled-select-change-index-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/hidden-listbox-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/hidden-listbox-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/hidden-listbox-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/hidden-listbox-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/listbox-appearance-basic-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/listbox-appearance-basic-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/listbox-appearance-basic-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/listbox-appearance-basic-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/listbox-appearance-basic-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/listbox-appearance-basic-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/listbox-appearance-basic-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/listbox-appearance-basic-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/listbox-appearance-separator-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/listbox-appearance-separator-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/listbox-appearance-separator-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/listbox-appearance-separator-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/listbox-bidi-align-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/listbox-bidi-align-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/listbox-bidi-align-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/listbox-bidi-align-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/listbox-bidi-align-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/listbox-bidi-align-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/listbox-bidi-align-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/listbox-bidi-align-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/listbox-clip-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/listbox-clip-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/listbox-clip-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/listbox-clip-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/listbox-scrollbar-incremental-load-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/listbox-scrollbar-incremental-load-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/listbox-scrollbar-incremental-load-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/listbox-scrollbar-incremental-load-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/listbox-scrollbar-incremental-load-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/listbox-scrollbar-incremental-load-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/listbox-scrollbar-incremental-load-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/listbox-scrollbar-incremental-load-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/listbox-width-change-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/listbox-width-change-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/listbox-width-change-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/listbox-width-change-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/listbox-width-change-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/listbox-width-change-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/listbox-width-change-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/listbox-width-change-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/listbox-with-display-none-option-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/listbox-with-display-none-option-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/listbox-with-display-none-option-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/listbox-with-display-none-option-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/listbox-with-display-none-option-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/listbox-with-display-none-option-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/listbox-with-display-none-option-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/listbox-with-display-none-option-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/menulist-appearance-basic-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/menulist-appearance-basic-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/menulist-appearance-basic-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/menulist-appearance-basic-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/menulist-appearance-basic-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/menulist-appearance-basic-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/menulist-appearance-basic-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/menulist-appearance-basic-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/menulist-clip-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/menulist-clip-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/menulist-clip-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/menulist-clip-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/menulist-clip-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/menulist-clip-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/menulist-clip-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/menulist-clip-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/menulist-deselect-update-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/menulist-deselect-update-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/menulist-deselect-update-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/menulist-deselect-update-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/menulist-deselect-update-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/menulist-deselect-update-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/menulist-deselect-update-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/menulist-deselect-update-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/menulist-narrow-width-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/menulist-narrow-width-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/menulist-narrow-width-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/menulist-narrow-width-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/menulist-narrow-width-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/menulist-narrow-width-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/menulist-narrow-width-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/menulist-narrow-width-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/menulist-no-overflow-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/menulist-no-overflow-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/menulist-no-overflow-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/menulist-no-overflow-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/menulist-no-overflow-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/menulist-no-overflow-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/menulist-no-overflow-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/menulist-no-overflow-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/menulist-option-wrap-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/menulist-option-wrap-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/menulist-option-wrap-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/menulist-option-wrap-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/menulist-option-wrap-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/menulist-option-wrap-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/menulist-option-wrap-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/menulist-option-wrap-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/menulist-restrict-line-height-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/menulist-restrict-line-height-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/menulist-restrict-line-height-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/menulist-restrict-line-height-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/menulist-restrict-line-height-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/menulist-restrict-line-height-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/menulist-restrict-line-height-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/menulist-restrict-line-height-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/menulist-style-color-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/menulist-style-color-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/menulist-style-color-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/menulist-style-color-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/menulist-style-color-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/menulist-style-color-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/menulist-style-color-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/menulist-style-color-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/menulist-update-text-popup-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/menulist-update-text-popup-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/menulist-update-text-popup-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/menulist-update-text-popup-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/menulist-width-change-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/menulist-width-change-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/menulist-width-change-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/menulist-width-change-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/menulist-width-change-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/menulist-width-change-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/menulist-width-change-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/menulist-width-change-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/optgroup-rendering-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/optgroup-rendering-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/optgroup-rendering-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/optgroup-rendering-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/optgroup-rendering-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/optgroup-rendering-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/optgroup-rendering-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/optgroup-rendering-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/option-script-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/option-script-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/option-script-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/option-script-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/option-script-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/option-script-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/option-script-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/option-script-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/option-strip-whitespace-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/option-strip-whitespace-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/option-strip-whitespace-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/option-strip-whitespace-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/option-strip-whitespace-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/option-strip-whitespace-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/option-strip-whitespace-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/option-strip-whitespace-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/option-text-clip-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/option-text-clip-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/option-text-clip-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/option-text-clip-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/option-text-clip-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/option-text-clip-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/option-text-clip-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/option-text-clip-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-align-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-align-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-align-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-align-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-align-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-align-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-align-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-align-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-autofilled-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-autofilled-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-autofilled-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-autofilled-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-background-none-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-background-none-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-background-none-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-background-none-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-baseline-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-baseline-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-baseline-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-baseline-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-baseline-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-baseline-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-baseline-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-baseline-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-block-background-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-block-background-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-block-background-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-block-background-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-block-background-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-block-background-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-block-background-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-block-background-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-change-listbox-size-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-change-listbox-size-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-change-listbox-size-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-change-listbox-size-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-change-listbox-size-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-change-listbox-size-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-change-listbox-size-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-change-listbox-size-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-change-listbox-to-popup-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-change-listbox-to-popup-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-change-listbox-to-popup-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-change-listbox-to-popup-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-change-listbox-to-popup-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-change-listbox-to-popup-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-change-listbox-to-popup-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-change-listbox-to-popup-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-change-popup-to-listbox-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-change-popup-to-listbox-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-change-popup-to-listbox-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-change-popup-to-listbox-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-change-popup-to-listbox-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-change-popup-to-listbox-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-change-popup-to-listbox-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-change-popup-to-listbox-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-dirty-parent-pref-widths-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-dirty-parent-pref-widths-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-dirty-parent-pref-widths-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-dirty-parent-pref-widths-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-dirty-parent-pref-widths-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-dirty-parent-pref-widths-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-dirty-parent-pref-widths-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-dirty-parent-pref-widths-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-disabled-appearance-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-disabled-appearance-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-disabled-appearance-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-disabled-appearance-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-disabled-appearance-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-disabled-appearance-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-disabled-appearance-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-disabled-appearance-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-empty-option-height-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-empty-option-height-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-empty-option-height-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-empty-option-height-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-empty-option-height-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-empty-option-height-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-empty-option-height-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-empty-option-height-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-initial-position-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-initial-position-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-initial-position-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-initial-position-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-initial-position-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-initial-position-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-initial-position-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-initial-position-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-item-background-clip-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-item-background-clip-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-item-background-clip-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-item-background-clip-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-item-background-clip-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-item-background-clip-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-item-background-clip-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-item-background-clip-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-list-box-with-height-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-list-box-with-height-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-list-box-with-height-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-list-box-with-height-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-list-box-with-height-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-list-box-with-height-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-list-box-with-height-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-list-box-with-height-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-listbox-multiple-no-focusring-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-listbox-multiple-no-focusring-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-listbox-multiple-no-focusring-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-listbox-multiple-no-focusring-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-listbox-multiple-no-focusring-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-listbox-multiple-no-focusring-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-listbox-multiple-no-focusring-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-listbox-multiple-no-focusring-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-multiple-rtl-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-multiple-rtl-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-multiple-rtl-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-multiple-rtl-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-multiple-rtl-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-multiple-rtl-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-multiple-rtl-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-multiple-rtl-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-overflow-scroll-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-overflow-scroll-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-overflow-scroll-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-overflow-scroll-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-overflow-scroll-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-overflow-scroll-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-overflow-scroll-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-overflow-scroll-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-overflow-scroll-inherited-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-overflow-scroll-inherited-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-overflow-scroll-inherited-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-overflow-scroll-inherited-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-overflow-scroll-inherited-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-overflow-scroll-inherited-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-overflow-scroll-inherited-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-overflow-scroll-inherited-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-selected-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-selected-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-selected-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-selected-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-selected-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-selected-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-selected-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-selected-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-size-invalid-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-size-invalid-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-size-invalid-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-size-invalid-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-size-invalid-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-size-invalid-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-size-invalid-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-size-invalid-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-style-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-style-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-style-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-style-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-style-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-style-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-style-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-style-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-visual-hebrew-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-visual-hebrew-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-visual-hebrew-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-visual-hebrew-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-visual-hebrew-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-visual-hebrew-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-visual-hebrew-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-visual-hebrew-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-writing-direction-natural-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-writing-direction-natural-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-writing-direction-natural-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-writing-direction-natural-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-writing-direction-natural-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-writing-direction-natural-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/select-writing-direction-natural-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/select-writing-direction-natural-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/selectlist-minsize-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/selectlist-minsize-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/select/selectlist-minsize-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/select/selectlist-minsize-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/stuff-on-my-optgroup-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/stuff-on-my-optgroup-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/stuff-on-my-optgroup-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/stuff-on-my-optgroup-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/stuff-on-my-optgroup-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/stuff-on-my-optgroup-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/stuff-on-my-optgroup-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/stuff-on-my-optgroup-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/submit/submit-appearance-basic-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/submit/submit-appearance-basic-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/submit/submit-appearance-basic-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/submit/submit-appearance-basic-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/submit/submit-appearance-basic-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/submit/submit-appearance-basic-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/submit/submit-appearance-basic-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/submit/submit-appearance-basic-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/submit/submit-focus-by-mouse-then-keydown-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/submit/submit-focus-by-mouse-then-keydown-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/submit/submit-focus-by-mouse-then-keydown-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/submit/submit-focus-by-mouse-then-keydown-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/submit/submit-focus-by-mouse-then-keydown-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/submit/submit-focus-by-mouse-then-keydown-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/submit/submit-focus-by-mouse-then-keydown-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/submit/submit-focus-by-mouse-then-keydown-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/suggestion-picker/date-suggestion-picker-appearance-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/suggestion-picker/date-suggestion-picker-appearance-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/suggestion-picker/date-suggestion-picker-appearance-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/suggestion-picker/date-suggestion-picker-appearance-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/suggestion-picker/date-suggestion-picker-appearance-rtl-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/suggestion-picker/date-suggestion-picker-appearance-rtl-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/suggestion-picker/date-suggestion-picker-appearance-rtl-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/suggestion-picker/date-suggestion-picker-appearance-rtl-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/suggestion-picker/date-suggestion-picker-appearance-with-scroll-bar-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/suggestion-picker/date-suggestion-picker-appearance-with-scroll-bar-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/suggestion-picker/date-suggestion-picker-appearance-with-scroll-bar-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/suggestion-picker/date-suggestion-picker-appearance-with-scroll-bar-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/suggestion-picker/date-suggestion-picker-appearance-zoom125-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/suggestion-picker/date-suggestion-picker-appearance-zoom125-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/suggestion-picker/date-suggestion-picker-appearance-zoom125-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/suggestion-picker/date-suggestion-picker-appearance-zoom125-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/suggestion-picker/date-suggestion-picker-appearance-zoom200-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/suggestion-picker/date-suggestion-picker-appearance-zoom200-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/suggestion-picker/date-suggestion-picker-appearance-zoom200-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/suggestion-picker/date-suggestion-picker-appearance-zoom200-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-locale-hebrew-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-locale-hebrew-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-locale-hebrew-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-locale-hebrew-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-rtl-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-rtl-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-rtl-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-rtl-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-with-scroll-bar-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-with-scroll-bar-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-with-scroll-bar-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-with-scroll-bar-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/suggestion-picker/month-suggestion-picker-appearance-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/suggestion-picker/month-suggestion-picker-appearance-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/suggestion-picker/month-suggestion-picker-appearance-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/suggestion-picker/month-suggestion-picker-appearance-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/suggestion-picker/month-suggestion-picker-appearance-rtl-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/suggestion-picker/month-suggestion-picker-appearance-rtl-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/suggestion-picker/month-suggestion-picker-appearance-rtl-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/suggestion-picker/month-suggestion-picker-appearance-rtl-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/suggestion-picker/month-suggestion-picker-appearance-with-scroll-bar-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/suggestion-picker/month-suggestion-picker-appearance-with-scroll-bar-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/suggestion-picker/month-suggestion-picker-appearance-with-scroll-bar-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/suggestion-picker/month-suggestion-picker-appearance-with-scroll-bar-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/suggestion-picker/time-suggestion-picker-appearance-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/suggestion-picker/time-suggestion-picker-appearance-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/suggestion-picker/time-suggestion-picker-appearance-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/suggestion-picker/time-suggestion-picker-appearance-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/suggestion-picker/time-suggestion-picker-appearance-locale-hebrew-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/suggestion-picker/time-suggestion-picker-appearance-locale-hebrew-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/suggestion-picker/time-suggestion-picker-appearance-locale-hebrew-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/suggestion-picker/time-suggestion-picker-appearance-locale-hebrew-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/suggestion-picker/time-suggestion-picker-appearance-rtl-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/suggestion-picker/time-suggestion-picker-appearance-rtl-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/suggestion-picker/time-suggestion-picker-appearance-rtl-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/suggestion-picker/time-suggestion-picker-appearance-rtl-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/suggestion-picker/time-suggestion-picker-appearance-with-scroll-bar-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/suggestion-picker/time-suggestion-picker-appearance-with-scroll-bar-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/suggestion-picker/time-suggestion-picker-appearance-with-scroll-bar-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/suggestion-picker/time-suggestion-picker-appearance-with-scroll-bar-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/suggestion-picker/week-suggestion-picker-appearance-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/suggestion-picker/week-suggestion-picker-appearance-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/suggestion-picker/week-suggestion-picker-appearance-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/suggestion-picker/week-suggestion-picker-appearance-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/suggestion-picker/week-suggestion-picker-appearance-rtl-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/suggestion-picker/week-suggestion-picker-appearance-rtl-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/suggestion-picker/week-suggestion-picker-appearance-rtl-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/suggestion-picker/week-suggestion-picker-appearance-rtl-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/suggestion-picker/week-suggestion-picker-appearance-with-scroll-bar-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/suggestion-picker/week-suggestion-picker-appearance-with-scroll-bar-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/suggestion-picker/week-suggestion-picker-appearance-with-scroll-bar-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/suggestion-picker/week-suggestion-picker-appearance-with-scroll-bar-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/tabbing-input-iframe-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/tabbing-input-iframe-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/tabbing-input-iframe-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/tabbing-input-iframe-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/tabbing-input-iframe-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/tabbing-input-iframe-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/tabbing-input-iframe-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/tabbing-input-iframe-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/targeted-frame-submission-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/targeted-frame-submission-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/targeted-frame-submission-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/targeted-frame-submission-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/targeted-frame-submission-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/targeted-frame-submission-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/targeted-frame-submission-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/targeted-frame-submission-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text-style-color-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text-style-color-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text-style-color-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text-style-color-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text-style-color-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text-style-color-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text-style-color-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text-style-color-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-appearance-bkcolor-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-appearance-bkcolor-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-appearance-bkcolor-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-appearance-bkcolor-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-appearance-bkcolor-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-appearance-bkcolor-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-appearance-bkcolor-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-appearance-bkcolor-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-appearance-default-bkcolor-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-appearance-default-bkcolor-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-appearance-default-bkcolor-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-appearance-default-bkcolor-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-appearance-default-bkcolor-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-appearance-default-bkcolor-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-appearance-default-bkcolor-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-appearance-default-bkcolor-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-appearance-disabled-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-appearance-disabled-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-appearance-disabled-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-appearance-disabled-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-appearance-disabled-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-appearance-disabled-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-appearance-disabled-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-appearance-disabled-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-appearance-focus-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-appearance-focus-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-appearance-focus-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-appearance-focus-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-appearance-focus-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-appearance-focus-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-appearance-focus-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-appearance-focus-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-appearance-preventDefault-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-appearance-preventDefault-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-appearance-preventDefault-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-appearance-preventDefault-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-appearance-preventDefault-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-appearance-preventDefault-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-appearance-preventDefault-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-appearance-preventDefault-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-appearance-readonly-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-appearance-readonly-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-appearance-readonly-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-appearance-readonly-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-appearance-readonly-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-appearance-readonly-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-appearance-readonly-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-appearance-readonly-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-appearance-selection-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-appearance-selection-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-appearance-selection-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-appearance-selection-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-appearance-selection-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-appearance-selection-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-appearance-selection-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-appearance-selection-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-appearance-visibility-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-appearance-visibility-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-appearance-visibility-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-appearance-visibility-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-appearance-visibility-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-appearance-visibility-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-appearance-visibility-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-appearance-visibility-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-appearance-width-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-appearance-width-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-appearance-width-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-appearance-width-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-appearance-width-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-appearance-width-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-appearance-width-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-appearance-width-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-baseline-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-baseline-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-baseline-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-baseline-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-baseline-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-baseline-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-baseline-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-baseline-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-disabled-color-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-disabled-color-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-disabled-color-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-disabled-color-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-disabled-color-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-disabled-color-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-disabled-color-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-disabled-color-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-double-click-selection-gap-bug-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-double-click-selection-gap-bug-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-double-click-selection-gap-bug-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-double-click-selection-gap-bug-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-double-click-selection-gap-bug-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-double-click-selection-gap-bug-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-double-click-selection-gap-bug-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-double-click-selection-gap-bug-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-field-text-truncated-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-field-text-truncated-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-field-text-truncated-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-field-text-truncated-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-field-text-truncated-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-field-text-truncated-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-field-text-truncated-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-field-text-truncated-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-placeholder-paint-order-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-placeholder-paint-order-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-placeholder-paint-order-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-placeholder-paint-order-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-placeholder-visibility-1-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-placeholder-visibility-1-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-placeholder-visibility-1-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-placeholder-visibility-1-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-placeholder-visibility-1-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-placeholder-visibility-1-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-placeholder-visibility-1-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-placeholder-visibility-1-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-placeholder-visibility-3-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-placeholder-visibility-3-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-placeholder-visibility-3-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-placeholder-visibility-3-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-placeholder-visibility-3-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-placeholder-visibility-3-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-placeholder-visibility-3-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-placeholder-visibility-3-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-readonly-autoscroll-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-readonly-autoscroll-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-readonly-autoscroll-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-readonly-autoscroll-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-readonly-autoscroll-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-readonly-autoscroll-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-readonly-autoscroll-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-readonly-autoscroll-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-readonly-dimmed-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-readonly-dimmed-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-readonly-dimmed-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-readonly-dimmed-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-readonly-dimmed-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-readonly-dimmed-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-readonly-dimmed-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-readonly-dimmed-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-readonly-empty-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-readonly-empty-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-readonly-empty-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-readonly-empty-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-readonly-empty-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-readonly-empty-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-readonly-empty-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-readonly-empty-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-spaces-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-spaces-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-spaces-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-spaces-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-spaces-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-spaces-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-spaces-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-spaces-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-tab-shows-caret-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-tab-shows-caret-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-tab-shows-caret-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-tab-shows-caret-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-tab-shows-caret-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-tab-shows-caret-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-tab-shows-caret-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-tab-shows-caret-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-table-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-table-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-table-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-table-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-table-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-table-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-table-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-table-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-text-click-inside-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-text-click-inside-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-text-click-inside-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-text-click-inside-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-text-click-inside-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-text-click-inside-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-text-click-inside-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-text-click-inside-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-text-click-outside-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-text-click-outside-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-text-click-outside-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-text-click-outside-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-text-click-outside-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-text-click-outside-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-text-click-outside-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-text-click-outside-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-text-double-click-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-text-double-click-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-text-double-click-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-text-double-click-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-text-double-click-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-text-double-click-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-text-double-click-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-text-double-click-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-text-drag-down-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-text-drag-down-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-text-drag-down-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-text-drag-down-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-text-drag-down-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-text-drag-down-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-text-drag-down-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-text-drag-down-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-text-option-delete-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-text-option-delete-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-text-option-delete-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-text-option-delete-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-text-option-delete-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-text-option-delete-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-text-option-delete-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-text-option-delete-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-text-scroll-left-on-blur-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-text-scroll-left-on-blur-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-text-scroll-left-on-blur-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-text-scroll-left-on-blur-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-text-scroll-left-on-blur-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-text-scroll-left-on-blur-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-text-scroll-left-on-blur-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-text-scroll-left-on-blur-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-text-self-emptying-click-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-text-self-emptying-click-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-text-self-emptying-click-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-text-self-emptying-click-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-text-self-emptying-click-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-text-self-emptying-click-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-text-self-emptying-click-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-text-self-emptying-click-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-text-word-wrap-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-text-word-wrap-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-text-word-wrap-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-text-word-wrap-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-text-word-wrap-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-text-word-wrap-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-text-word-wrap-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-text-word-wrap-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-width-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-width-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-width-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-width-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-width-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-width-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/input-width-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/input-width-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/placeholder-pseudo-style-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/placeholder-pseudo-style-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/placeholder-pseudo-style-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/placeholder-pseudo-style-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/placeholder-pseudo-style-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/placeholder-pseudo-style-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/placeholder-pseudo-style-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/placeholder-pseudo-style-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/text-appearance-basic-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/text-appearance-basic-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/text-appearance-basic-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/text-appearance-basic-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/text-appearance-basic-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/text-appearance-basic-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/text-appearance-basic-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/text-appearance-basic-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/text-appearance-datalist-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/text-appearance-datalist-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/text-appearance-datalist-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/text-appearance-datalist-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/text-appearance-datalist-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/text-appearance-datalist-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/text-appearance-datalist-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/text-appearance-datalist-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/text-font-height-mismatch-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/text-font-height-mismatch-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/text-font-height-mismatch-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/text-font-height-mismatch-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/text-font-height-mismatch-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/text-font-height-mismatch-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/text-font-height-mismatch-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/text-font-height-mismatch-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/textfield-focus-ring-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/textfield-focus-ring-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/textfield-focus-ring-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/textfield-focus-ring-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/textfield-focus-ring-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/textfield-focus-ring-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/textfield-focus-ring-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/textfield-focus-ring-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/textfield-outline-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/textfield-outline-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/textfield-outline-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/textfield-outline-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/textfield-outline-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/textfield-outline-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/textfield-outline-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/textfield-outline-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/textfield-overflow-by-value-update-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/textfield-overflow-by-value-update-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/textfield-overflow-by-value-update-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/textfield-overflow-by-value-update-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/textfield-overflow-by-value-update-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/textfield-overflow-by-value-update-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/textfield-overflow-by-value-update-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/textfield-overflow-by-value-update-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/textfield-overflow-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/textfield-overflow-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/textfield-overflow-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/textfield-overflow-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/textfield-overflow-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/textfield-overflow-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/text/textfield-overflow-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/text/textfield-overflow-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/textarea/basic-textareas-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/textarea/basic-textareas-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/textarea/basic-textareas-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/textarea/basic-textareas-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/textarea/basic-textareas-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/textarea/basic-textareas-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/textarea/basic-textareas-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/textarea/basic-textareas-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/textarea/basic-textareas-quirks-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/textarea/basic-textareas-quirks-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/textarea/basic-textareas-quirks-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/textarea/basic-textareas-quirks-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/textarea/basic-textareas-quirks-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/textarea/basic-textareas-quirks-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/textarea/basic-textareas-quirks-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/textarea/basic-textareas-quirks-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/textarea/onselect-textarea-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/textarea/onselect-textarea-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/textarea/onselect-textarea-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/textarea/onselect-textarea-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/textarea/placeholder-appearance-textarea-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/textarea/placeholder-appearance-textarea-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/textarea/placeholder-appearance-textarea-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/textarea/placeholder-appearance-textarea-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/textarea/placeholder-appearance-textarea-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/textarea/placeholder-appearance-textarea-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/textarea/placeholder-appearance-textarea-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/textarea/placeholder-appearance-textarea-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/textarea/reset-textarea-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/textarea/reset-textarea-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/textarea/reset-textarea-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/textarea/reset-textarea-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/textarea/reset-textarea-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/textarea/reset-textarea-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/textarea/reset-textarea-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/textarea/reset-textarea-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/textarea/textAreaLineHeight-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/textarea/textAreaLineHeight-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/textarea/textAreaLineHeight-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/textarea/textAreaLineHeight-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/textarea/textAreaLineHeight-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/textarea/textAreaLineHeight-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/textarea/textAreaLineHeight-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/textarea/textAreaLineHeight-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/textarea/textarea-align-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/textarea/textarea-align-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/textarea/textarea-align-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/textarea/textarea-align-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/textarea/textarea-align-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/textarea/textarea-align-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/textarea/textarea-align-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/textarea/textarea-align-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/textarea/textarea-appearance-basic-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/textarea/textarea-appearance-basic-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/textarea/textarea-appearance-basic-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/textarea/textarea-appearance-basic-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/textarea/textarea-appearance-basic-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/textarea/textarea-appearance-basic-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/textarea/textarea-appearance-basic-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/textarea/textarea-appearance-basic-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/textarea/textarea-placeholder-paint-order-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/textarea/textarea-placeholder-paint-order-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/textarea/textarea-placeholder-paint-order-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/textarea/textarea-placeholder-paint-order-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/textarea/textarea-placeholder-pseudo-style-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/textarea/textarea-placeholder-pseudo-style-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/textarea/textarea-placeholder-pseudo-style-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/textarea/textarea-placeholder-pseudo-style-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/textarea/textarea-placeholder-pseudo-style-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/textarea/textarea-placeholder-pseudo-style-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/textarea/textarea-placeholder-pseudo-style-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/textarea/textarea-placeholder-pseudo-style-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/textarea/textarea-placeholder-visibility-1-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/textarea/textarea-placeholder-visibility-1-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/textarea/textarea-placeholder-visibility-1-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/textarea/textarea-placeholder-visibility-1-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/textarea/textarea-placeholder-visibility-1-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/textarea/textarea-placeholder-visibility-1-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/textarea/textarea-placeholder-visibility-1-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/textarea/textarea-placeholder-visibility-1-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/textarea/textarea-placeholder-visibility-2-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/textarea/textarea-placeholder-visibility-2-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/textarea/textarea-placeholder-visibility-2-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/textarea/textarea-placeholder-visibility-2-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/textarea/textarea-placeholder-visibility-2-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/textarea/textarea-placeholder-visibility-2-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/textarea/textarea-placeholder-visibility-2-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/textarea/textarea-placeholder-visibility-2-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/textarea/textarea-scroll-height-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/textarea/textarea-scroll-height-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/textarea/textarea-scroll-height-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/textarea/textarea-scroll-height-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/textarea/textarea-scroll-height-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/textarea/textarea-scroll-height-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/textarea/textarea-scroll-height-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/textarea/textarea-scroll-height-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/textarea/textarea-scrollbar-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/textarea/textarea-scrollbar-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/textarea/textarea-scrollbar-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/textarea/textarea-scrollbar-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/textarea/textarea-scrollbar-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/textarea/textarea-scrollbar-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/textarea/textarea-scrollbar-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/textarea/textarea-scrollbar-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/textarea/textarea-scrolled-focus-ring-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/textarea/textarea-scrolled-focus-ring-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/textarea/textarea-scrolled-focus-ring-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/textarea/textarea-scrolled-focus-ring-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/textarea/textarea-scrolled-focus-ring-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/textarea/textarea-scrolled-focus-ring-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/textarea/textarea-scrolled-focus-ring-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/textarea/textarea-scrolled-focus-ring-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/textarea/textarea-scrolled-mask-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/textarea/textarea-scrolled-mask-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/textarea/textarea-scrolled-mask-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/textarea/textarea-scrolled-mask-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/textarea/textarea-scrolled-mask-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/textarea/textarea-scrolled-mask-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/textarea/textarea-scrolled-mask-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/textarea/textarea-scrolled-mask-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/textarea/textarea-scrolled-type-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/textarea/textarea-scrolled-type-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/textarea/textarea-scrolled-type-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/textarea/textarea-scrolled-type-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/textarea/textarea-scrolled-type-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/textarea/textarea-scrolled-type-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/textarea/textarea-scrolled-type-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/textarea/textarea-scrolled-type-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/textarea/textarea-setinnerhtml-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/textarea/textarea-setinnerhtml-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/textarea/textarea-setinnerhtml-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/textarea/textarea-setinnerhtml-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/textarea/textarea-setinnerhtml-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/textarea/textarea-setinnerhtml-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/textarea/textarea-setinnerhtml-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/textarea/textarea-setinnerhtml-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/time/time-appearance-basic-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/time/time-appearance-basic-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/time/time-appearance-basic-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/time/time-appearance-basic-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/time/time-appearance-pseudo-elements-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/time/time-appearance-pseudo-elements-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/time/time-appearance-pseudo-elements-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/time/time-appearance-pseudo-elements-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/visual-hebrew-text-field-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/visual-hebrew-text-field-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/visual-hebrew-text-field-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/visual-hebrew-text-field-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/visual-hebrew-text-field-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/visual-hebrew-text-field-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/visual-hebrew-text-field-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/visual-hebrew-text-field-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/week/week-appearance-basic-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/week/week-appearance-basic-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/week/week-appearance-basic-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/week/week-appearance-basic-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/week/week-appearance-pseudo-elements-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/week/week-appearance-pseudo-elements-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/week/week-appearance-pseudo-elements-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/forms/week/week-appearance-pseudo-elements-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/frames/frame-scrolling-attribute-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/frames/frame-scrolling-attribute-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/frames/frame-scrolling-attribute-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/frames/frame-scrolling-attribute-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/frames/iframe-scaling-with-scroll-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/frames/iframe-scaling-with-scroll-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/frames/iframe-scaling-with-scroll-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/frames/iframe-scaling-with-scroll-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/frames/iframe-scrolling-attribute-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/frames/iframe-scrolling-attribute-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/frames/iframe-scrolling-attribute-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/frames/iframe-scrolling-attribute-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/frames/invalid-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/frames/invalid-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/frames/invalid-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/frames/invalid-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/frames/onlyCommentInIFrame-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/frames/onlyCommentInIFrame-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/frames/onlyCommentInIFrame-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/frames/onlyCommentInIFrame-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/frames/valid-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/frames/valid-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/frames/valid-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/frames/valid-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/gradients/css3-color-stop-units-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/gradients/css3-color-stop-units-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/gradients/css3-color-stop-units-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/gradients/css3-color-stop-units-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/hidpi/resize-corner-hidpi-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/hidpi/resize-corner-hidpi-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/hidpi/resize-corner-hidpi-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/hidpi/resize-corner-hidpi-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/hidpi/resize-corner-hidpi-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/hidpi/resize-corner-hidpi-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/hidpi/resize-corner-hidpi-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/hidpi/resize-corner-hidpi-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/html/details-no-summary4-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/html/details-no-summary4-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/html/details-no-summary4-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/html/details-no-summary4-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/html/details-no-summary4-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/html/details-no-summary4-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/html/details-no-summary4-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/html/details-no-summary4-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/html/details-open-javascript-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/html/details-open-javascript-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/html/details-open-javascript-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/html/details-open-javascript-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/html/details-open-javascript-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/html/details-open-javascript-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/html/details-open-javascript-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/html/details-open-javascript-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/html/details-open2-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/html/details-open2-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/html/details-open2-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/html/details-open2-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/html/details-open2-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/html/details-open2-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/html/details-open2-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/html/details-open2-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/html/details-open4-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/html/details-open4-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/html/details-open4-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/html/details-open4-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/html/details-open4-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/html/details-open4-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/html/details-open4-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/html/details-open4-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/html/details-replace-summary-child-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/html/details-replace-summary-child-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/html/details-replace-summary-child-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/html/details-replace-summary-child-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/html/details-replace-summary-child-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/html/details-replace-summary-child-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/html/details-replace-summary-child-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/html/details-replace-summary-child-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/html/details-replace-text-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/html/details-replace-text-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/html/details-replace-text-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/html/details-replace-text-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/html/details-replace-text-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/html/details-replace-text-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/html/details-replace-text-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/html/details-replace-text-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/html/keygen-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/html/keygen-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/html/keygen-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/html/keygen-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/html/keygen-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/html/keygen-expected.txt similarity index 74% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/html/keygen-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/html/keygen-expected.txt index 3a020a03..7b3314b 100644 --- a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/html/keygen-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/html/keygen-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. layer at (0,0) size 800x600 LayoutView at (0,0) size 800x600 layer at (0,0) size 800x600
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/images/12-55-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/images/12-55-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/images/12-55-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/images/12-55-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/images/182-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/images/182-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/images/182-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/images/182-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/images/2-dht-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/images/2-dht-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/images/2-dht-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/images/2-dht-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/images/23-55-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/images/23-55-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/images/23-55-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/images/23-55-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/images/55-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/images/55-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/images/55-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/images/55-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/images/color-profile-background-clip-text-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/images/color-profile-background-clip-text-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/images/color-profile-background-clip-text-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/images/color-profile-background-clip-text-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/images/color-profile-svg-fill-text-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/images/color-profile-svg-fill-text-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/images/color-profile-svg-fill-text-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/images/color-profile-svg-fill-text-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/images/style-access-during-imageChanged-crash-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/images/style-access-during-imageChanged-crash-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/images/style-access-during-imageChanged-crash-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/images/style-access-during-imageChanged-crash-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/inline-block/tricky-baseline-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/inline-block/tricky-baseline-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/inline-block/tricky-baseline-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/inline-block/tricky-baseline-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/inline/inline-borders-with-bidi-override-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/inline/inline-borders-with-bidi-override-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/inline/inline-borders-with-bidi-override-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/inline/inline-borders-with-bidi-override-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/inline/inline-continuation-borders-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/inline/inline-continuation-borders-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/inline/inline-continuation-borders-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/inline/inline-continuation-borders-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/inline/justify-emphasis-inline-box-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/inline/justify-emphasis-inline-box-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/inline/justify-emphasis-inline-box-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/inline/justify-emphasis-inline-box-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/inline/positionedLifetime-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/inline/positionedLifetime-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/inline/positionedLifetime-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/inline/positionedLifetime-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/inline/positionedLifetime-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/inline/positionedLifetime-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/inline/positionedLifetime-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/inline/positionedLifetime-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/inline/vertical-align-with-fallback-fonts-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/inline/vertical-align-with-fallback-fonts-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/inline/vertical-align-with-fallback-fonts-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/inline/vertical-align-with-fallback-fonts-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/invalid/014-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/invalid/014-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/invalid/014-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/invalid/014-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/layers/overflow-scroll-auto-switch-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/layers/overflow-scroll-auto-switch-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/layers/overflow-scroll-auto-switch-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/layers/overflow-scroll-auto-switch-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/layers/scroll-descendant-with-cached-cliprects-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/layers/scroll-descendant-with-cached-cliprects-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/layers/scroll-descendant-with-cached-cliprects-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/layers/scroll-descendant-with-cached-cliprects-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/layers/scroll-rect-to-visible-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/layers/scroll-rect-to-visible-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/layers/scroll-rect-to-visible-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/layers/scroll-rect-to-visible-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/layers/scroll-with-transform-composited-layer-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/layers/scroll-with-transform-composited-layer-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/layers/scroll-with-transform-composited-layer-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/layers/scroll-with-transform-composited-layer-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/layers/scroll-with-transform-layer-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/layers/scroll-with-transform-layer-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/layers/scroll-with-transform-layer-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/layers/scroll-with-transform-layer-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/lists/008-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/lists/008-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/lists/008-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/lists/008-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/lists/dynamic-marker-crash-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/lists/dynamic-marker-crash-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/lists/dynamic-marker-crash-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/lists/dynamic-marker-crash-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/lists/dynamic-marker-crash-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/lists/dynamic-marker-crash-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/lists/dynamic-marker-crash-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/lists/dynamic-marker-crash-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/lists/ol-start-parsing-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/lists/ol-start-parsing-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/lists/ol-start-parsing-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/lists/ol-start-parsing-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/lists/olstart-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/lists/olstart-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/lists/olstart-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/lists/olstart-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/multicol/multicol-with-child-renderLayer-for-input-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/multicol/multicol-with-child-renderLayer-for-input-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/multicol/multicol-with-child-renderLayer-for-input-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/multicol/multicol-with-child-renderLayer-for-input-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/multicol/multicol-with-child-renderLayer-for-input-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/multicol/multicol-with-child-renderLayer-for-input-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/multicol/multicol-with-child-renderLayer-for-input-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/multicol/multicol-with-child-renderLayer-for-input-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/overflow/002-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/overflow/002-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/overflow/002-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/overflow/002-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/overflow/003-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/overflow/003-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/overflow/003-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/overflow/003-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/overflow/005-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/overflow/005-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/overflow/005-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/overflow/005-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/overflow/006-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/overflow/006-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/overflow/006-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/overflow/006-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/overflow/007-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/overflow/007-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/overflow/007-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/overflow/007-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/overflow/008-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/overflow/008-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/overflow/008-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/overflow/008-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/overflow/childFocusRingClip-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/overflow/childFocusRingClip-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/overflow/childFocusRingClip-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/overflow/childFocusRingClip-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/overflow/clip-rects-fixed-ancestor-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/overflow/clip-rects-fixed-ancestor-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/overflow/clip-rects-fixed-ancestor-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/overflow/clip-rects-fixed-ancestor-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/overflow/float-in-relpositioned-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/overflow/float-in-relpositioned-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/overflow/float-in-relpositioned-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/overflow/float-in-relpositioned-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/overflow/hit-test-overflow-controls-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/overflow/hit-test-overflow-controls-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/overflow/hit-test-overflow-controls-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/overflow/hit-test-overflow-controls-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/overflow/image-selection-highlight-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/overflow/image-selection-highlight-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/overflow/image-selection-highlight-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/overflow/image-selection-highlight-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/overflow/overflow-auto-position-absolute-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/overflow/overflow-auto-position-absolute-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/overflow/overflow-auto-position-absolute-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/overflow/overflow-auto-position-absolute-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/overflow/overflow-rtl-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/overflow/overflow-rtl-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/overflow/overflow-rtl-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/overflow/overflow-rtl-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/overflow/overflow-rtl-vertical-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/overflow/overflow-rtl-vertical-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/overflow/overflow-rtl-vertical-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/overflow/overflow-rtl-vertical-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/overflow/overflow-stacking-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/overflow/overflow-stacking-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/overflow/overflow-stacking-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/overflow/overflow-stacking-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/overflow/overflow-text-hit-testing-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/overflow/overflow-text-hit-testing-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/overflow/overflow-text-hit-testing-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/overflow/overflow-text-hit-testing-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/overflow/overflow-update-transform-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/overflow/overflow-update-transform-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/overflow/overflow-update-transform-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/overflow/overflow-update-transform-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/overflow/overflow-with-local-background-attachment-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/overflow/overflow-with-local-background-attachment-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/overflow/overflow-with-local-background-attachment-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/overflow/overflow-with-local-background-attachment-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/overflow/overflow-x-y-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/overflow/overflow-x-y-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/overflow/overflow-x-y-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/overflow/overflow-x-y-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/overflow/overflow-x-y-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/overflow/overflow-x-y-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/overflow/overflow-x-y-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/overflow/overflow-x-y-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/overflow/position-fixed-transform-clipping-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/overflow/position-fixed-transform-clipping-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/overflow/position-fixed-transform-clipping-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/overflow/position-fixed-transform-clipping-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/overflow/scroll-nested-positioned-layer-in-overflow-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/overflow/scroll-nested-positioned-layer-in-overflow-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/overflow/scroll-nested-positioned-layer-in-overflow-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/overflow/scroll-nested-positioned-layer-in-overflow-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/overflow/scroll-nested-positioned-layer-in-overflow-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/overflow/scroll-nested-positioned-layer-in-overflow-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/overflow/scroll-nested-positioned-layer-in-overflow-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/overflow/scroll-nested-positioned-layer-in-overflow-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/overflow/scrollRevealButton-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/overflow/scrollRevealButton-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/overflow/scrollRevealButton-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/overflow/scrollRevealButton-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/overflow/scrollRevealButton-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/overflow/scrollRevealButton-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/overflow/scrollRevealButton-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/overflow/scrollRevealButton-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/overflow/scrollbar-position-update-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/overflow/scrollbar-position-update-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/overflow/scrollbar-position-update-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/overflow/scrollbar-position-update-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/overflow/table-overflow-float-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/overflow/table-overflow-float-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/overflow/table-overflow-float-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/overflow/table-overflow-float-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/overflow/unreachable-overflow-rtl-bug-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/overflow/unreachable-overflow-rtl-bug-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/overflow/unreachable-overflow-rtl-bug-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/overflow/unreachable-overflow-rtl-bug-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/parser/bad-xml-slash-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/parser/bad-xml-slash-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/parser/bad-xml-slash-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/parser/bad-xml-slash-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/parser/bad-xml-slash-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/parser/bad-xml-slash-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/parser/bad-xml-slash-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/parser/bad-xml-slash-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/parser/document-write-option-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/parser/document-write-option-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/parser/document-write-option-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/parser/document-write-option-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/parser/document-write-option-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/parser/document-write-option-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/parser/document-write-option-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/parser/document-write-option-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/parser/entity-comment-in-textarea-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/parser/entity-comment-in-textarea-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/parser/entity-comment-in-textarea-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/parser/entity-comment-in-textarea-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/parser/entity-comment-in-textarea-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/parser/entity-comment-in-textarea-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/parser/entity-comment-in-textarea-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/parser/entity-comment-in-textarea-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/parser/open-comment-in-textarea-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/parser/open-comment-in-textarea-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/parser/open-comment-in-textarea-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/parser/open-comment-in-textarea-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/parser/open-comment-in-textarea-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/parser/open-comment-in-textarea-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/parser/open-comment-in-textarea-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/parser/open-comment-in-textarea-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/parser/xml-colon-entity-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/parser/xml-colon-entity-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/parser/xml-colon-entity-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/parser/xml-colon-entity-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/parser/xml-declaration-missing-ending-mark-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/parser/xml-declaration-missing-ending-mark-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/parser/xml-declaration-missing-ending-mark-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/parser/xml-declaration-missing-ending-mark-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/repaint/background-image-paint-invalidation-large-abspos-div-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/repaint/background-image-paint-invalidation-large-abspos-div-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/repaint/background-image-paint-invalidation-large-abspos-div-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/repaint/background-image-paint-invalidation-large-abspos-div-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/repaint/block-selection-gap-stale-cache-2-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/repaint/block-selection-gap-stale-cache-2-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/repaint/block-selection-gap-stale-cache-2-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/repaint/block-selection-gap-stale-cache-2-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/repaint/caret-invalidation-in-overflow-scroll-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/repaint/caret-invalidation-in-overflow-scroll-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/repaint/caret-invalidation-in-overflow-scroll-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/repaint/caret-invalidation-in-overflow-scroll-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/repaint/change-text-content-and-background-color-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/repaint/change-text-content-and-background-color-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/repaint/change-text-content-and-background-color-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/repaint/change-text-content-and-background-color-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/repaint/control-clip-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/repaint/control-clip-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/repaint/control-clip-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/repaint/control-clip-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/repaint/details-open-repaint-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/repaint/details-open-repaint-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/repaint/details-open-repaint-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/repaint/details-open-repaint-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/repaint/japanese-rl-selection-repaint-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/repaint/japanese-rl-selection-repaint-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/repaint/japanese-rl-selection-repaint-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/repaint/japanese-rl-selection-repaint-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/repaint/line-flow-with-floats-9-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/repaint/line-flow-with-floats-9-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/repaint/line-flow-with-floats-9-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/repaint/line-flow-with-floats-9-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/repaint/multi-layout-one-frame-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/repaint/multi-layout-one-frame-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/repaint/multi-layout-one-frame-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/repaint/multi-layout-one-frame-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/repaint/overflow-outline-repaint-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/repaint/overflow-outline-repaint-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/repaint/overflow-outline-repaint-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/repaint/overflow-outline-repaint-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/repaint/renderer-destruction-by-invalidateSelection-crash-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/repaint/renderer-destruction-by-invalidateSelection-crash-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/repaint/renderer-destruction-by-invalidateSelection-crash-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/repaint/renderer-destruction-by-invalidateSelection-crash-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/repaint/renderer-destruction-by-invalidateSelection-crash-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/repaint/renderer-destruction-by-invalidateSelection-crash-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/repaint/renderer-destruction-by-invalidateSelection-crash-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/repaint/renderer-destruction-by-invalidateSelection-crash-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/repaint/repaint-during-scroll-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/repaint/repaint-during-scroll-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/repaint/repaint-during-scroll-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/repaint/repaint-during-scroll-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/repaint/search-field-cancel-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/repaint/search-field-cancel-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/repaint/search-field-cancel-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/repaint/search-field-cancel-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/repaint/stacked-diacritics-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/repaint/stacked-diacritics-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/repaint/stacked-diacritics-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/repaint/stacked-diacritics-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/repaint/subtree-root-skipped-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/repaint/subtree-root-skipped-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/repaint/subtree-root-skipped-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/repaint/subtree-root-skipped-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/replaced/border-radius-clip-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/replaced/border-radius-clip-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/replaced/border-radius-clip-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/replaced/border-radius-clip-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/replaced/replaced-breaking-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/replaced/replaced-breaking-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/replaced/replaced-breaking-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/replaced/replaced-breaking-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/replaced/replaced-breaking-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/replaced/replaced-breaking-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/replaced/replaced-breaking-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/replaced/replaced-breaking-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/replaced/replaced-breaking-mixture-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/replaced/replaced-breaking-mixture-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/replaced/replaced-breaking-mixture-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/replaced/replaced-breaking-mixture-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/replaced/replaced-breaking-mixture-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/replaced/replaced-breaking-mixture-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/replaced/replaced-breaking-mixture-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/replaced/replaced-breaking-mixture-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/replaced/three-selects-break-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/replaced/three-selects-break-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/replaced/three-selects-break-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/replaced/three-selects-break-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/replaced/width100percent-button-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/replaced/width100percent-button-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/replaced/width100percent-button-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/replaced/width100percent-button-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/replaced/width100percent-button-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/replaced/width100percent-button-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/replaced/width100percent-button-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/replaced/width100percent-button-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/replaced/width100percent-checkbox-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/replaced/width100percent-checkbox-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/replaced/width100percent-checkbox-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/replaced/width100percent-checkbox-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/replaced/width100percent-checkbox-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/replaced/width100percent-checkbox-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/replaced/width100percent-checkbox-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/replaced/width100percent-checkbox-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/replaced/width100percent-menulist-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/replaced/width100percent-menulist-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/replaced/width100percent-menulist-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/replaced/width100percent-menulist-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/replaced/width100percent-radio-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/replaced/width100percent-radio-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/replaced/width100percent-radio-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/replaced/width100percent-radio-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/replaced/width100percent-radio-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/replaced/width100percent-radio-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/replaced/width100percent-radio-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/replaced/width100percent-radio-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/replaced/width100percent-searchfield-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/replaced/width100percent-searchfield-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/replaced/width100percent-searchfield-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/replaced/width100percent-searchfield-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/replaced/width100percent-searchfield-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/replaced/width100percent-searchfield-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/replaced/width100percent-searchfield-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/replaced/width100percent-searchfield-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/replaced/width100percent-textarea-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/replaced/width100percent-textarea-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/replaced/width100percent-textarea-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/replaced/width100percent-textarea-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/replaced/width100percent-textarea-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/replaced/width100percent-textarea-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/replaced/width100percent-textarea-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/replaced/width100percent-textarea-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/replaced/width100percent-textfield-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/replaced/width100percent-textfield-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/replaced/width100percent-textfield-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/replaced/width100percent-textfield-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/replaced/width100percent-textfield-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/replaced/width100percent-textfield-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/replaced/width100percent-textfield-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/replaced/width100percent-textfield-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/ruby/nested-ruby-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/ruby/nested-ruby-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/ruby/nested-ruby-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/ruby/nested-ruby-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/ruby/nested-ruby-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/ruby/nested-ruby-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/ruby/nested-ruby-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/ruby/nested-ruby-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/selectors/064-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/selectors/064-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/selectors/064-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/selectors/064-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/selectors/064-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/selectors/064-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/selectors/064-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/selectors/064-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/selectors/166-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/selectors/166-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/selectors/166-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/selectors/166-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/spatial-navigation/snav-multiple-select-focusring-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/spatial-navigation/snav-multiple-select-focusring-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/spatial-navigation/snav-multiple-select-focusring-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/spatial-navigation/snav-multiple-select-focusring-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/spatial-navigation/snav-multiple-select-focusring-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/spatial-navigation/snav-multiple-select-focusring-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/spatial-navigation/snav-multiple-select-focusring-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/spatial-navigation/snav-multiple-select-focusring-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/table/003-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/table/003-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/table/003-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/table/003-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/table/003-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/table/003-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/table/003-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/table/003-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/table/023-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/table/023-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/table/023-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/table/023-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/table/027-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/table/027-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/table/027-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/table/027-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/table/027-vertical-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/table/027-vertical-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/table/027-vertical-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/table/027-vertical-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/table/040-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/table/040-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/table/040-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/table/040-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/table/040-vertical-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/table/040-vertical-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/table/040-vertical-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/table/040-vertical-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/table/append-cells2-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/table/append-cells2-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/table/append-cells2-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/table/append-cells2-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/table/append-cells2-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/table/append-cells2-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/table/append-cells2-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/table/append-cells2-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/table/border-collapsing/004-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/table/border-collapsing/004-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/table/border-collapsing/004-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/table/border-collapsing/004-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/table/colspanMinWidth-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/table/colspanMinWidth-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/table/colspanMinWidth-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/table/colspanMinWidth-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/table/colspanMinWidth-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/table/colspanMinWidth-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/table/colspanMinWidth-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/table/colspanMinWidth-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/table/colspanMinWidth-vertical-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/table/colspanMinWidth-vertical-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/table/colspanMinWidth-vertical-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/table/colspanMinWidth-vertical-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/table/colspanMinWidth-vertical-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/table/colspanMinWidth-vertical-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/table/colspanMinWidth-vertical-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/table/colspanMinWidth-vertical-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/table/edge-offsets-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/table/edge-offsets-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/table/edge-offsets-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/table/edge-offsets-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/table/empty-cells-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/table/empty-cells-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/table/empty-cells-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/table/empty-cells-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/table/frame-and-rules-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/table/frame-and-rules-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/table/frame-and-rules-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/table/frame-and-rules-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/table/height-percent-test-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/table/height-percent-test-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/table/height-percent-test-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/table/height-percent-test-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/table/overflowHidden-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/table/overflowHidden-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/table/overflowHidden-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/table/overflowHidden-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/table/prepend-in-anonymous-table-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/table/prepend-in-anonymous-table-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/table/prepend-in-anonymous-table-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/table/prepend-in-anonymous-table-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/table/remove-td-display-none-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/table/remove-td-display-none-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/table/remove-td-display-none-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/table/remove-td-display-none-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/table/remove-td-display-none-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/table/remove-td-display-none-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/table/remove-td-display-none-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/table/remove-td-display-none-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/table/spanOverlapRepaint-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/table/spanOverlapRepaint-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/table/spanOverlapRepaint-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/table/spanOverlapRepaint-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/table/spanOverlapRepaint-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/table/spanOverlapRepaint-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/table/spanOverlapRepaint-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/table/spanOverlapRepaint-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/table/table-display-types-vertical-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/table/table-display-types-vertical-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/table/table-display-types-vertical-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/table/table-display-types-vertical-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/table/text-field-baseline-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/table/text-field-baseline-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/table/text-field-baseline-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/table/text-field-baseline-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/table/text-field-baseline-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/table/text-field-baseline-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/table/text-field-baseline-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/table/text-field-baseline-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text-autosizing/hackernews-comments-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text-autosizing/hackernews-comments-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text-autosizing/hackernews-comments-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text-autosizing/hackernews-comments-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/atsui-rtl-override-selection-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/atsui-rtl-override-selection-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/atsui-rtl-override-selection-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/atsui-rtl-override-selection-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/capitalize-boundaries-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/capitalize-boundaries-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/capitalize-boundaries-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/capitalize-boundaries-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/caps-lock-indicator-disabled-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/caps-lock-indicator-disabled-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/caps-lock-indicator-disabled-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/caps-lock-indicator-disabled-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/caps-lock-indicator-disabled-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/caps-lock-indicator-disabled-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/caps-lock-indicator-disabled-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/caps-lock-indicator-disabled-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/caps-lock-indicator-enabled-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/caps-lock-indicator-enabled-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/caps-lock-indicator-enabled-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/caps-lock-indicator-enabled-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/caps-lock-indicator-enabled-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/caps-lock-indicator-enabled-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/caps-lock-indicator-enabled-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/caps-lock-indicator-enabled-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/complex-text-opacity-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/complex-text-opacity-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/complex-text-opacity-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/complex-text-opacity-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/custom-font-data-crash-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/custom-font-data-crash-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/custom-font-data-crash-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/custom-font-data-crash-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/custom-font-data-crash2-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/custom-font-data-crash2-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/custom-font-data-crash2-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/custom-font-data-crash2-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/drawBidiText-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/drawBidiText-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/drawBidiText-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/drawBidiText-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/drawBidiText-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/drawBidiText-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/drawBidiText-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/drawBidiText-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/emoticons-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/emoticons-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/emoticons-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/emoticons-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/emphasis-complex-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/emphasis-complex-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/emphasis-complex-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/emphasis-complex-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/emphasis-complex-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/emphasis-complex-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/emphasis-complex-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/emphasis-complex-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/emphasis-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/emphasis-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/emphasis-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/emphasis-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/emphasis-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/emphasis-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/emphasis-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/emphasis-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/emphasis-vertical-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/emphasis-vertical-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/emphasis-vertical-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/emphasis-vertical-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/emphasis-vertical-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/emphasis-vertical-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/emphasis-vertical-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/emphasis-vertical-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/fallback-traits-fixup-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/fallback-traits-fixup-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/fallback-traits-fixup-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/fallback-traits-fixup-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/font-fallback-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/font-fallback-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/font-fallback-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/font-fallback-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/font-fallback-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/font-fallback-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/font-fallback-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/font-fallback-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/font-stretch-variant-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/font-stretch-variant-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/font-stretch-variant-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/font-stretch-variant-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/font-weight-variant-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/font-weight-variant-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/font-weight-variant-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/font-weight-variant-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/001-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/001-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/001-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/001-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/001-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/001-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/001-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/001-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/002-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/002-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/002-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/002-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/002-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/002-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/002-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/002-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/003-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/003-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/003-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/003-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/003-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/003-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/003-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/003-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/bidi-AN-after-L-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/bidi-AN-after-L-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/bidi-AN-after-L-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/bidi-AN-after-L-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/bidi-listbox-atsui-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/bidi-listbox-atsui-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/bidi-listbox-atsui-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/bidi-listbox-atsui-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/bidi-listbox-atsui-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/bidi-listbox-atsui-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/bidi-listbox-atsui-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/bidi-listbox-atsui-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/bidi-listbox-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/bidi-listbox-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/bidi-listbox-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/bidi-listbox-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/bidi-listbox-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/bidi-listbox-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/bidi-listbox-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/bidi-listbox-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/bidi-menulist-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/bidi-menulist-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/bidi-menulist-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/bidi-menulist-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/bidi-mirror-he-ar-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/bidi-mirror-he-ar-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/bidi-mirror-he-ar-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/bidi-mirror-he-ar-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/bidi-mirror-he-ar-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/bidi-mirror-he-ar-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/bidi-mirror-he-ar-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/bidi-mirror-he-ar-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/bidi-neutral-run-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/bidi-neutral-run-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/bidi-neutral-run-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/bidi-neutral-run-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/bold-bengali-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/bold-bengali-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/bold-bengali-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/bold-bengali-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/bold-bengali-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/bold-bengali-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/bold-bengali-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/bold-bengali-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/complex-character-based-fallback-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/complex-character-based-fallback-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/complex-character-based-fallback-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/complex-character-based-fallback-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/complex-character-based-fallback-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/complex-character-based-fallback-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/complex-character-based-fallback-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/complex-character-based-fallback-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/danda-space-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/danda-space-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/danda-space-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/danda-space-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/danda-space-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/danda-space-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/danda-space-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/danda-space-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/hindi-spacing-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/hindi-spacing-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/hindi-spacing-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/hindi-spacing-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/hindi-spacing-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/hindi-spacing-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/hindi-spacing-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/hindi-spacing-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/hindi-whitespace-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/hindi-whitespace-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/hindi-whitespace-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/hindi-whitespace-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/hindi-whitespace-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/hindi-whitespace-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/hindi-whitespace-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/hindi-whitespace-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/khmer-selection-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/khmer-selection-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/khmer-selection-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/khmer-selection-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/khmer-selection-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/khmer-selection-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/khmer-selection-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/khmer-selection-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/lang-glyph-cache-separation-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/lang-glyph-cache-separation-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/lang-glyph-cache-separation-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/lang-glyph-cache-separation-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/lang-glyph-cache-separation-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/lang-glyph-cache-separation-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/lang-glyph-cache-separation-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/lang-glyph-cache-separation-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/menulist-width-rtl-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/menulist-width-rtl-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/menulist-width-rtl-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/menulist-width-rtl-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/menulist-width-rtl-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/menulist-width-rtl-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/menulist-width-rtl-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/menulist-width-rtl-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/mixed-directionality-selection-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/mixed-directionality-selection-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/mixed-directionality-selection-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/mixed-directionality-selection-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/mixed-directionality-selection-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/mixed-directionality-selection-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/mixed-directionality-selection-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/mixed-directionality-selection-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/plane2-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/plane2-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/plane2-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/plane2-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/pop-up-button-text-alignment-and-direction-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/pop-up-button-text-alignment-and-direction-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/pop-up-button-text-alignment-and-direction-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/pop-up-button-text-alignment-and-direction-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/pop-up-button-text-alignment-and-direction-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/pop-up-button-text-alignment-and-direction-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/pop-up-button-text-alignment-and-direction-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/pop-up-button-text-alignment-and-direction-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/text-combine-image-test-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/text-combine-image-test-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/text-combine-image-test-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/text-combine-image-test-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/text-combine-image-test-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/text-combine-image-test-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/text-combine-image-test-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/text-combine-image-test-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/text-spliced-font-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/text-spliced-font-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/text-spliced-font-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/text-spliced-font-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/text-spliced-font-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/text-spliced-font-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/text-spliced-font-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/text-spliced-font-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/thai-line-breaks-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/thai-line-breaks-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/thai-line-breaks-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/thai-line-breaks-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/unicode-bidi-plaintext-in-textarea-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/unicode-bidi-plaintext-in-textarea-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/unicode-bidi-plaintext-in-textarea-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/unicode-bidi-plaintext-in-textarea-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/unicode-bidi-plaintext-in-textarea-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/unicode-bidi-plaintext-in-textarea-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/unicode-bidi-plaintext-in-textarea-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/unicode-bidi-plaintext-in-textarea-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/vertical-text-glyph-test-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/vertical-text-glyph-test-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/vertical-text-glyph-test-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/vertical-text-glyph-test-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/wrap-CJK-001-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/wrap-CJK-001-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/wrap-CJK-001-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/wrap-CJK-001-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/wrap-CJK-001-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/wrap-CJK-001-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/international/wrap-CJK-001-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/international/wrap-CJK-001-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/justify-ideograph-complex-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/justify-ideograph-complex-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/justify-ideograph-complex-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/justify-ideograph-complex-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/justify-ideograph-complex-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/justify-ideograph-complex-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/justify-ideograph-complex-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/justify-ideograph-complex-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/justify-ideograph-simple-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/justify-ideograph-simple-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/justify-ideograph-simple-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/justify-ideograph-simple-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/justify-ideograph-simple-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/justify-ideograph-simple-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/justify-ideograph-simple-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/justify-ideograph-simple-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/justify-ideograph-vertical-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/justify-ideograph-vertical-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/justify-ideograph-vertical-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/justify-ideograph-vertical-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/justify-ideograph-vertical-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/justify-ideograph-vertical-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/justify-ideograph-vertical-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/justify-ideograph-vertical-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/large-text-composed-char-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/large-text-composed-char-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/large-text-composed-char-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/large-text-composed-char-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/orientation-sideways-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/orientation-sideways-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/orientation-sideways-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/orientation-sideways-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/orientation-sideways-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/orientation-sideways-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/orientation-sideways-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/orientation-sideways-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/selection-multiple-runs-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/selection-multiple-runs-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/selection-multiple-runs-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/selection-multiple-runs-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/selection-multiple-runs-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/selection-multiple-runs-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/selection-multiple-runs-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/selection-multiple-runs-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/softHyphen-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/softHyphen-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/softHyphen-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/softHyphen-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/textIteratorNilRenderer-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/textIteratorNilRenderer-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/textIteratorNilRenderer-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/textIteratorNilRenderer-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/textIteratorNilRenderer-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/textIteratorNilRenderer-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/textIteratorNilRenderer-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/textIteratorNilRenderer-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/unicode-fallback-font-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/unicode-fallback-font-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/unicode-fallback-font-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/unicode-fallback-font-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/unicode-fallback-font-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/unicode-fallback-font-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/unicode-fallback-font-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/unicode-fallback-font-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/updateNewFont-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/updateNewFont-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/updateNewFont-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/updateNewFont-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/updateNewFont-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/updateNewFont-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/updateNewFont-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/updateNewFont-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/whitespace/024-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/whitespace/024-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/whitespace/024-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/whitespace/024-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/whitespace/normal-after-nowrap-breaking-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/whitespace/normal-after-nowrap-breaking-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/whitespace/normal-after-nowrap-breaking-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/whitespace/normal-after-nowrap-breaking-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/whitespace/normal-after-nowrap-breaking-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/whitespace/normal-after-nowrap-breaking-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/whitespace/normal-after-nowrap-breaking-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/whitespace/normal-after-nowrap-breaking-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/whitespace/pre-wrap-spaces-after-newline-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/whitespace/pre-wrap-spaces-after-newline-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/whitespace/pre-wrap-spaces-after-newline-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/whitespace/pre-wrap-spaces-after-newline-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/word-break-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/word-break-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/word-break-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/text/word-break-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/transforms/transformed-focused-text-input-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/transforms/transformed-focused-text-input-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/transforms/transformed-focused-text-input-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/transforms/transformed-focused-text-input-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/transforms/transformed-focused-text-input-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/transforms/transformed-focused-text-input-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/transforms/transformed-focused-text-input-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/transforms/transformed-focused-text-input-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/writing-mode/Kusa-Makura-background-canvas-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/writing-mode/Kusa-Makura-background-canvas-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/writing-mode/Kusa-Makura-background-canvas-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/writing-mode/Kusa-Makura-background-canvas-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/writing-mode/Kusa-Makura-background-canvas-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/writing-mode/Kusa-Makura-background-canvas-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/writing-mode/Kusa-Makura-background-canvas-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/writing-mode/Kusa-Makura-background-canvas-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/writing-mode/border-radius-clipping-vertical-lr-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/writing-mode/border-radius-clipping-vertical-lr-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/writing-mode/border-radius-clipping-vertical-lr-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/writing-mode/border-radius-clipping-vertical-lr-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/writing-mode/border-vertical-lr-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/writing-mode/border-vertical-lr-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/writing-mode/border-vertical-lr-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/writing-mode/border-vertical-lr-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/writing-mode/border-vertical-lr-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/writing-mode/border-vertical-lr-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/writing-mode/border-vertical-lr-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/writing-mode/border-vertical-lr-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/writing-mode/fieldsets-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/writing-mode/fieldsets-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/writing-mode/fieldsets-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/writing-mode/fieldsets-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/writing-mode/japanese-lr-selection-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/writing-mode/japanese-lr-selection-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/writing-mode/japanese-lr-selection-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/writing-mode/japanese-lr-selection-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/writing-mode/japanese-lr-selection-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/writing-mode/japanese-lr-selection-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/writing-mode/japanese-lr-selection-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/writing-mode/japanese-lr-selection-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/writing-mode/japanese-lr-text-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/writing-mode/japanese-lr-text-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/writing-mode/japanese-lr-text-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/writing-mode/japanese-lr-text-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/writing-mode/japanese-lr-text-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/writing-mode/japanese-lr-text-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/writing-mode/japanese-lr-text-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/writing-mode/japanese-lr-text-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/writing-mode/japanese-rl-selection-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/writing-mode/japanese-rl-selection-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/writing-mode/japanese-rl-selection-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/writing-mode/japanese-rl-selection-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/writing-mode/japanese-rl-selection-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/writing-mode/japanese-rl-selection-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/writing-mode/japanese-rl-selection-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/writing-mode/japanese-rl-selection-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/writing-mode/japanese-rl-text-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/writing-mode/japanese-rl-text-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/writing-mode/japanese-rl-text-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/writing-mode/japanese-rl-text-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/writing-mode/japanese-rl-text-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/writing-mode/japanese-rl-text-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/writing-mode/japanese-rl-text-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/writing-mode/japanese-rl-text-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/writing-mode/text-orientation-basic-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/writing-mode/text-orientation-basic-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/writing-mode/text-orientation-basic-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/writing-mode/text-orientation-basic-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/writing-mode/text-orientation-basic-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/writing-mode/text-orientation-basic-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/writing-mode/text-orientation-basic-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/writing-mode/text-orientation-basic-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/writing-mode/vertical-baseline-alignment-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/writing-mode/vertical-baseline-alignment-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/writing-mode/vertical-baseline-alignment-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/writing-mode/vertical-baseline-alignment-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/writing-mode/vertical-font-fallback-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/writing-mode/vertical-font-fallback-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/writing-mode/vertical-font-fallback-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/writing-mode/vertical-font-fallback-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/xsl/xslt-enc-cyr-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/xsl/xslt-enc-cyr-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/xsl/xslt-enc-cyr-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fast/xsl/xslt-enc-cyr-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fonts/cursive-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fonts/cursive-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fonts/cursive-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fonts/cursive-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fonts/default-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fonts/default-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fonts/default-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fonts/default-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fonts/fantasy-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fonts/fantasy-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fonts/fantasy-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fonts/fantasy-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fonts/monospace-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fonts/monospace-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fonts/monospace-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fonts/monospace-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fonts/sans-serif-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fonts/sans-serif-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fonts/sans-serif-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fonts/sans-serif-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fonts/serif-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/fonts/serif-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/fonts/serif-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/fonts/serif-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/http/tests/filesystem/input-display-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/http/tests/filesystem/input-display-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/http/tests/filesystem/input-display-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/http/tests/filesystem/input-display-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/http/tests/filesystem/input-display-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/http/tests/filesystem/input-display-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/http/tests/filesystem/input-display-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/http/tests/filesystem/input-display-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/http/tests/misc/object-embedding-svg-delayed-size-negotiation-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/http/tests/misc/object-embedding-svg-delayed-size-negotiation-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/http/tests/misc/object-embedding-svg-delayed-size-negotiation-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/http/tests/misc/object-embedding-svg-delayed-size-negotiation-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/http/tests/navigation/navigation-redirect-schedule-crash-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/http/tests/navigation/navigation-redirect-schedule-crash-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/http/tests/navigation/navigation-redirect-schedule-crash-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/http/tests/navigation/navigation-redirect-schedule-crash-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/http/tests/webfont/popup-menu-load-webfont-after-open-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/http/tests/webfont/popup-menu-load-webfont-after-open-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/http/tests/webfont/popup-menu-load-webfont-after-open-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/http/tests/webfont/popup-menu-load-webfont-after-open-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/ietestcenter/css3/bordersbackgrounds/background-attachment-local-scrolling-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/ietestcenter/css3/bordersbackgrounds/background-attachment-local-scrolling-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/ietestcenter/css3/bordersbackgrounds/background-attachment-local-scrolling-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/ietestcenter/css3/bordersbackgrounds/background-attachment-local-scrolling-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/ietestcenter/css3/bordersbackgrounds/background-size-aspect-ratio-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/ietestcenter/css3/bordersbackgrounds/background-size-aspect-ratio-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/ietestcenter/css3/bordersbackgrounds/background-size-aspect-ratio-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/ietestcenter/css3/bordersbackgrounds/background-size-aspect-ratio-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/ietestcenter/css3/bordersbackgrounds/background_position_three_four_values-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/ietestcenter/css3/bordersbackgrounds/background_position_three_four_values-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/ietestcenter/css3/bordersbackgrounds/background_position_three_four_values-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/ietestcenter/css3/bordersbackgrounds/background_position_three_four_values-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/inspector-protocol/layout-fonts/cjk-ideograph-fallback-by-lang-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/inspector-protocol/layout-fonts/cjk-ideograph-fallback-by-lang-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/inspector-protocol/layout-fonts/cjk-ideograph-fallback-by-lang-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/inspector-protocol/layout-fonts/cjk-ideograph-fallback-by-lang-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/inspector-protocol/layout-fonts/languages-emoji-rare-glyphs-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/inspector-protocol/layout-fonts/languages-emoji-rare-glyphs-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/inspector-protocol/layout-fonts/languages-emoji-rare-glyphs-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/inspector-protocol/layout-fonts/languages-emoji-rare-glyphs-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/media/track/track-cue-rendering-vertical-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/media/track/track-cue-rendering-vertical-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/media/track/track-cue-rendering-vertical-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/media/track/track-cue-rendering-vertical-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/media/track/track-cue-rendering-vertical-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/media/track/track-cue-rendering-vertical-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/media/track/track-cue-rendering-vertical-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/media/track/track-cue-rendering-vertical-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/media/video-frame-accurate-seek-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/media/video-frame-accurate-seek-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/media/video-frame-accurate-seek-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/media/video-frame-accurate-seek-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/paint/invalidation/spv2/selection-within-composited-scroller-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/paint/invalidation/spv2/selection-within-composited-scroller-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/paint/invalidation/spv2/selection-within-composited-scroller-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/paint/invalidation/spv2/selection-within-composited-scroller-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/paint/invalidation/spv2/text-match-highlight-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/paint/invalidation/spv2/text-match-highlight-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/paint/invalidation/spv2/text-match-highlight-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/paint/invalidation/spv2/text-match-highlight-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/paint/selection/text-selection-newline-mixed-ltr-rtl-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/paint/selection/text-selection-newline-mixed-ltr-rtl-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/paint/selection/text-selection-newline-mixed-ltr-rtl-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/paint/selection/text-selection-newline-mixed-ltr-rtl-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/plugins/embed-attributes-style-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/plugins/embed-attributes-style-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/plugins/embed-attributes-style-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/plugins/embed-attributes-style-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/plugins/mouse-click-plugin-clears-selection-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/plugins/mouse-click-plugin-clears-selection-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/plugins/mouse-click-plugin-clears-selection-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/plugins/mouse-click-plugin-clears-selection-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/plugins/mouse-click-plugin-clears-selection-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/plugins/mouse-click-plugin-clears-selection-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/plugins/mouse-click-plugin-clears-selection-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/plugins/mouse-click-plugin-clears-selection-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/plugins/webview-plugin-nested-iframe-scroll-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/plugins/webview-plugin-nested-iframe-scroll-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/plugins/webview-plugin-nested-iframe-scroll-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/plugins/webview-plugin-nested-iframe-scroll-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/printing/return-from-printing-mode-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/printing/return-from-printing-mode-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/printing/return-from-printing-mode-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/printing/return-from-printing-mode-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/scrollbars/border-box-rect-clips-scrollbars-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/scrollbars/border-box-rect-clips-scrollbars-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/scrollbars/border-box-rect-clips-scrollbars-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/scrollbars/border-box-rect-clips-scrollbars-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/scrollbars/overflow-scrollbar-combinations-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/scrollbars/overflow-scrollbar-combinations-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/scrollbars/overflow-scrollbar-combinations-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/scrollbars/overflow-scrollbar-combinations-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/scrollbars/rtl/overflow-scroll-rtl-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/scrollbars/rtl/overflow-scroll-rtl-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/scrollbars/rtl/overflow-scroll-rtl-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/scrollbars/rtl/overflow-scroll-rtl-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/scrollbars/scrollbars-on-positioned-content-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/scrollbars/scrollbars-on-positioned-content-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/scrollbars/scrollbars-on-positioned-content-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/scrollbars/scrollbars-on-positioned-content-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/scrollbars/short-scrollbar-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/scrollbars/short-scrollbar-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/scrollbars/short-scrollbar-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/scrollbars/short-scrollbar-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/W3C-SVG-1.1-SE/coords-units-03-b-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/W3C-SVG-1.1-SE/coords-units-03-b-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/W3C-SVG-1.1-SE/coords-units-03-b-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/W3C-SVG-1.1-SE/coords-units-03-b-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/W3C-SVG-1.1-SE/filters-felem-01-b-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/W3C-SVG-1.1-SE/filters-felem-01-b-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/W3C-SVG-1.1-SE/filters-felem-01-b-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/W3C-SVG-1.1-SE/filters-felem-01-b-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/W3C-SVG-1.1-SE/text-intro-05-t-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/W3C-SVG-1.1-SE/text-intro-05-t-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/W3C-SVG-1.1-SE/text-intro-05-t-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/W3C-SVG-1.1-SE/text-intro-05-t-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/W3C-SVG-1.1-SE/text-tspan-02-b-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/W3C-SVG-1.1-SE/text-tspan-02-b-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/W3C-SVG-1.1-SE/text-tspan-02-b-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/W3C-SVG-1.1-SE/text-tspan-02-b-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/W3C-SVG-1.1-SE/types-dom-01-b-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/W3C-SVG-1.1-SE/types-dom-01-b-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/W3C-SVG-1.1-SE/types-dom-01-b-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/W3C-SVG-1.1-SE/types-dom-01-b-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/W3C-SVG-1.1/text-align-08-b-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/W3C-SVG-1.1/text-align-08-b-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/W3C-SVG-1.1/text-align-08-b-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/W3C-SVG-1.1/text-align-08-b-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/W3C-SVG-1.1/text-align-08-b-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/W3C-SVG-1.1/text-align-08-b-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/W3C-SVG-1.1/text-align-08-b-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/W3C-SVG-1.1/text-align-08-b-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/W3C-SVG-1.1/text-fonts-01-t-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/W3C-SVG-1.1/text-fonts-01-t-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/W3C-SVG-1.1/text-fonts-01-t-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/W3C-SVG-1.1/text-fonts-01-t-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/W3C-SVG-1.1/text-intro-01-t-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/W3C-SVG-1.1/text-intro-01-t-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/W3C-SVG-1.1/text-intro-01-t-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/W3C-SVG-1.1/text-intro-01-t-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/W3C-SVG-1.1/text-intro-01-t-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/W3C-SVG-1.1/text-intro-01-t-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/W3C-SVG-1.1/text-intro-01-t-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/W3C-SVG-1.1/text-intro-01-t-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/W3C-SVG-1.1/text-intro-03-b-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/W3C-SVG-1.1/text-intro-03-b-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/W3C-SVG-1.1/text-intro-03-b-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/W3C-SVG-1.1/text-intro-03-b-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/W3C-SVG-1.1/text-intro-04-t-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/W3C-SVG-1.1/text-intro-04-t-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/W3C-SVG-1.1/text-intro-04-t-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/W3C-SVG-1.1/text-intro-04-t-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/W3C-SVG-1.1/text-intro-04-t-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/W3C-SVG-1.1/text-intro-04-t-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/W3C-SVG-1.1/text-intro-04-t-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/W3C-SVG-1.1/text-intro-04-t-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/W3C-SVG-1.1/types-basicDOM-01-b-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/W3C-SVG-1.1/types-basicDOM-01-b-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/W3C-SVG-1.1/types-basicDOM-01-b-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/W3C-SVG-1.1/types-basicDOM-01-b-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/W3C-SVG-1.2-Tiny/struct-use-recursion-01-t-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/W3C-SVG-1.2-Tiny/struct-use-recursion-01-t-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/W3C-SVG-1.2-Tiny/struct-use-recursion-01-t-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/W3C-SVG-1.2-Tiny/struct-use-recursion-01-t-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/W3C-SVG-1.2-Tiny/struct-use-recursion-02-t-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/W3C-SVG-1.2-Tiny/struct-use-recursion-02-t-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/W3C-SVG-1.2-Tiny/struct-use-recursion-02-t-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/W3C-SVG-1.2-Tiny/struct-use-recursion-02-t-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/W3C-SVG-1.2-Tiny/struct-use-recursion-03-t-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/W3C-SVG-1.2-Tiny/struct-use-recursion-03-t-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/W3C-SVG-1.2-Tiny/struct-use-recursion-03-t-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/W3C-SVG-1.2-Tiny/struct-use-recursion-03-t-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/batik/text/verticalText-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/batik/text/verticalText-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/batik/text/verticalText-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/batik/text/verticalText-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/custom/bug45331-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/custom/bug45331-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/custom/bug45331-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/custom/bug45331-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/custom/getscreenctm-in-scrollable-div-area-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/custom/getscreenctm-in-scrollable-div-area-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/custom/getscreenctm-in-scrollable-div-area-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/custom/getscreenctm-in-scrollable-div-area-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/custom/getscreenctm-in-scrollable-div-area-nested-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/custom/getscreenctm-in-scrollable-div-area-nested-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/custom/getscreenctm-in-scrollable-div-area-nested-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/custom/getscreenctm-in-scrollable-div-area-nested-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/custom/getscreenctm-in-scrollable-svg-area-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/custom/getscreenctm-in-scrollable-svg-area-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/custom/getscreenctm-in-scrollable-svg-area-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/custom/getscreenctm-in-scrollable-svg-area-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/custom/inline-svg-in-xhtml-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/custom/inline-svg-in-xhtml-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/custom/inline-svg-in-xhtml-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/custom/inline-svg-in-xhtml-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/custom/inline-svg-in-xhtml-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/custom/inline-svg-in-xhtml-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/custom/inline-svg-in-xhtml-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/custom/inline-svg-in-xhtml-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/custom/invisible-text-after-scrolling-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/custom/invisible-text-after-scrolling-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/custom/invisible-text-after-scrolling-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/custom/invisible-text-after-scrolling-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/custom/junk-data-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/custom/junk-data-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/custom/junk-data-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/custom/junk-data-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/custom/linking-base-external-reference-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/custom/linking-base-external-reference-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/custom/linking-base-external-reference-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/custom/linking-base-external-reference-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/custom/linking-uri-01-b-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/custom/linking-uri-01-b-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/custom/linking-uri-01-b-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/custom/linking-uri-01-b-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/custom/load-non-wellformed-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/custom/load-non-wellformed-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/custom/load-non-wellformed-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/custom/load-non-wellformed-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/custom/missing-xlink-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/custom/missing-xlink-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/custom/missing-xlink-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/custom/missing-xlink-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/custom/object-sizing-no-width-height-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/custom/object-sizing-no-width-height-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/custom/object-sizing-no-width-height-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/custom/object-sizing-no-width-height-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/custom/path-bad-data-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/custom/path-bad-data-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/custom/path-bad-data-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/custom/path-bad-data-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/custom/scrolling-embedded-svg-file-image-repaint-problem-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/custom/scrolling-embedded-svg-file-image-repaint-problem-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/custom/scrolling-embedded-svg-file-image-repaint-problem-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/custom/scrolling-embedded-svg-file-image-repaint-problem-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/custom/text-xy-updates-SVGList-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/custom/text-xy-updates-SVGList-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/custom/text-xy-updates-SVGList-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/custom/text-xy-updates-SVGList-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/custom/use-font-face-crash-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/custom/use-font-face-crash-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/custom/use-font-face-crash-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/custom/use-font-face-crash-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/dom/SVGLengthList-appendItem-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/dom/SVGLengthList-appendItem-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/dom/SVGLengthList-appendItem-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/dom/SVGLengthList-appendItem-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/dom/SVGLengthList-initialize-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/dom/SVGLengthList-initialize-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/dom/SVGLengthList-initialize-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/dom/SVGLengthList-initialize-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/dom/SVGLengthList-insertItemBefore-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/dom/SVGLengthList-insertItemBefore-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/dom/SVGLengthList-insertItemBefore-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/dom/SVGLengthList-insertItemBefore-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/dom/SVGLengthList-removeItem-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/dom/SVGLengthList-removeItem-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/dom/SVGLengthList-removeItem-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/dom/SVGLengthList-removeItem-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/dom/SVGLengthList-replaceItem-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/dom/SVGLengthList-replaceItem-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/dom/SVGLengthList-replaceItem-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/dom/SVGLengthList-replaceItem-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/dom/SVGLengthList-xml-dom-modifications-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/dom/SVGLengthList-xml-dom-modifications-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/dom/SVGLengthList-xml-dom-modifications-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/dom/SVGLengthList-xml-dom-modifications-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/dom/SVGStringList-basics-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/dom/SVGStringList-basics-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/dom/SVGStringList-basics-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/dom/SVGStringList-basics-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/dom/css-transforms-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/dom/css-transforms-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/dom/css-transforms-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/dom/css-transforms-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/filters/feImage-filterUnits-objectBoundingBox-primitiveUnits-objectBoundingBox-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/filters/feImage-filterUnits-objectBoundingBox-primitiveUnits-objectBoundingBox-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/filters/feImage-filterUnits-objectBoundingBox-primitiveUnits-objectBoundingBox-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/filters/feImage-filterUnits-objectBoundingBox-primitiveUnits-objectBoundingBox-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/filters/feImage-filterUnits-objectBoundingBox-primitiveUnits-userSpaceOnUse-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/filters/feImage-filterUnits-objectBoundingBox-primitiveUnits-userSpaceOnUse-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/filters/feImage-filterUnits-objectBoundingBox-primitiveUnits-userSpaceOnUse-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/filters/feImage-filterUnits-objectBoundingBox-primitiveUnits-userSpaceOnUse-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/filters/feImage-filterUnits-userSpaceOnUse-primitiveUnits-objectBoundingBox-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/filters/feImage-filterUnits-userSpaceOnUse-primitiveUnits-objectBoundingBox-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/filters/feImage-filterUnits-userSpaceOnUse-primitiveUnits-objectBoundingBox-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/filters/feImage-filterUnits-userSpaceOnUse-primitiveUnits-objectBoundingBox-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/filters/feImage-filterUnits-userSpaceOnUse-primitiveUnits-userSpaceOnUse-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/filters/feImage-filterUnits-userSpaceOnUse-primitiveUnits-userSpaceOnUse-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/filters/feImage-filterUnits-userSpaceOnUse-primitiveUnits-userSpaceOnUse-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/filters/feImage-filterUnits-userSpaceOnUse-primitiveUnits-userSpaceOnUse-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/hixie/error/012-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/hixie/error/012-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/hixie/error/012-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/hixie/error/012-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/hixie/mixed/003-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/hixie/mixed/003-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/hixie/mixed/003-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/hixie/mixed/003-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/hixie/mixed/003-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/hixie/mixed/003-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/hixie/mixed/003-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/hixie/mixed/003-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/overflow/overflow-on-outermost-svg-element-defaults-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/overflow/overflow-on-outermost-svg-element-defaults-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/overflow/overflow-on-outermost-svg-element-defaults-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/overflow/overflow-on-outermost-svg-element-defaults-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/overflow/overflow-on-outermost-svg-element-ignore-attribute-2-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/overflow/overflow-on-outermost-svg-element-ignore-attribute-2-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/overflow/overflow-on-outermost-svg-element-ignore-attribute-2-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/overflow/overflow-on-outermost-svg-element-ignore-attribute-2-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/overflow/overflow-on-outermost-svg-element-ignore-attribute-3-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/overflow/overflow-on-outermost-svg-element-ignore-attribute-3-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/overflow/overflow-on-outermost-svg-element-ignore-attribute-3-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/overflow/overflow-on-outermost-svg-element-ignore-attribute-3-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/overflow/overflow-on-outermost-svg-element-in-xhtml-defaults-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/overflow/overflow-on-outermost-svg-element-in-xhtml-defaults-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/overflow/overflow-on-outermost-svg-element-in-xhtml-defaults-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/overflow/overflow-on-outermost-svg-element-in-xhtml-defaults-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/text/foreignObject-repaint-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/text/foreignObject-repaint-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/text/foreignObject-repaint-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/text/foreignObject-repaint-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/text/text-selection-fonts-01-t-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/text/text-selection-fonts-01-t-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/text/text-selection-fonts-01-t-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/text/text-selection-fonts-01-t-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/text/text-selection-intro-05-t-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/text/text-selection-intro-05-t-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/text/text-selection-intro-05-t-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/text/text-selection-intro-05-t-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/transforms/text-with-pattern-inside-transformed-html-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/transforms/text-with-pattern-inside-transformed-html-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/transforms/text-with-pattern-inside-transformed-html-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/transforms/text-with-pattern-inside-transformed-html-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/wicd/test-rightsizing-b-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/wicd/test-rightsizing-b-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/wicd/test-rightsizing-b-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/wicd/test-rightsizing-b-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/wicd/test-scalable-background-image1-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/wicd/test-scalable-background-image1-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/wicd/test-scalable-background-image1-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/wicd/test-scalable-background-image1-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/zoom/page/absolute-sized-document-scrollbars-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/zoom/page/absolute-sized-document-scrollbars-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/zoom/page/absolute-sized-document-scrollbars-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/zoom/page/absolute-sized-document-scrollbars-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/zoom/page/zoom-hixie-mixed-008-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/zoom/page/zoom-hixie-mixed-008-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/zoom/page/zoom-hixie-mixed-008-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/zoom/page/zoom-hixie-mixed-008-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/zoom/page/zoom-mask-with-percentages-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/zoom/page/zoom-mask-with-percentages-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/zoom/page/zoom-mask-with-percentages-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/zoom/page/zoom-mask-with-percentages-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/zoom/page/zoom-svg-float-border-padding-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/zoom/page/zoom-svg-float-border-padding-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/zoom/page/zoom-svg-float-border-padding-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/zoom/page/zoom-svg-float-border-padding-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/zoom/text/zoom-svg-float-border-padding-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/zoom/text/zoom-svg-float-border-padding-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/svg/zoom/text/zoom-svg-float-border-padding-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/svg/zoom/text/zoom-svg-float-border-padding-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/45621-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/45621-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/45621-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/45621-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug101674-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug101674-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug101674-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug101674-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug10269-2-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug10269-2-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug10269-2-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug10269-2-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug10296-1-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug10296-1-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug10296-1-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug10296-1-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug1055-1-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug1055-1-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug1055-1-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug1055-1-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug113235-1-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug113235-1-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug113235-1-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug113235-1-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug113235-3-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug113235-3-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug113235-3-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug113235-3-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug1188-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug1188-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug1188-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug1188-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug1188-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug1188-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug1188-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug1188-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug11944-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug11944-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug11944-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug11944-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug120364-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug120364-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug120364-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug120364-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug12384-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug12384-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug12384-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug12384-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug12384-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug12384-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug12384-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug12384-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug1302-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug1302-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug1302-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug1302-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug131020-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug131020-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug131020-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug131020-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug131020_iframe-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug131020_iframe-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug131020_iframe-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug131020_iframe-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug1318-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug1318-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug1318-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug1318-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug1318-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug1318-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug1318-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug1318-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug137388-2-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug137388-2-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug137388-2-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug137388-2-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug138725-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug138725-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug138725-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug138725-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug138725-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug138725-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug138725-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug138725-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug149275-1-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug149275-1-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug149275-1-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug149275-1-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug18359-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug18359-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug18359-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug18359-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug18359-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug18359-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug18359-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug18359-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug194024-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug194024-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug194024-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug194024-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug194024-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug194024-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug194024-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug194024-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug22019-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug22019-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug22019-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug22019-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug24200-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug24200-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug24200-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug24200-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug24200-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug24200-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug24200-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug24200-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug2469-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug2469-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug2469-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug2469-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug2479-1-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug2479-1-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug2479-1-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug2479-1-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug2479-2-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug2479-2-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug2479-2-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug2479-2-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug2479-2-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug2479-2-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug2479-2-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug2479-2-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug2479-3-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug2479-3-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug2479-3-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug2479-3-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug2479-3-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug2479-3-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug2479-3-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug2479-3-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug2479-4-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug2479-4-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug2479-4-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug2479-4-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug2479-4-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug2479-4-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug2479-4-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug2479-4-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug26178-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug26178-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug26178-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug26178-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug26178-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug26178-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug26178-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug26178-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug27038-2-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug27038-2-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug27038-2-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug27038-2-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug28928-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug28928-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug28928-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug28928-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug28928-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug28928-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug28928-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug28928-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug29326-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug29326-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug29326-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug29326-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug29326-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug29326-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug29326-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug29326-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug2947-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug2947-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug2947-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug2947-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug30559-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug30559-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug30559-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug30559-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug30559-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug30559-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug30559-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug30559-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug30692-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug30692-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug30692-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug30692-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug30692-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug30692-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug30692-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug30692-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug32205-2-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug32205-2-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug32205-2-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug32205-2-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug33855-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug33855-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug33855-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug33855-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug33855-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug33855-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug33855-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug33855-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug38916-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug38916-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug38916-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug38916-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug39209-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug39209-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug39209-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug39209-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug39209-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug39209-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug39209-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug39209-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug3977-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug3977-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug3977-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug3977-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug4382-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug4382-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug4382-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug4382-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug4382-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug4382-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug4382-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug4382-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug4429-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug4429-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug4429-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug4429-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug4429-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug4429-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug4429-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug4429-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug44505-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug44505-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug44505-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug44505-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug44505-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug44505-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug44505-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug44505-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug4527-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug4527-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug4527-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug4527-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug4527-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug4527-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug4527-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug4527-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug46368-1-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug46368-1-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug46368-1-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug46368-1-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug46368-1-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug46368-1-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug46368-1-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug46368-1-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug46368-2-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug46368-2-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug46368-2-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug46368-2-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug46368-2-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug46368-2-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug46368-2-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug46368-2-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug46480-1-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug46480-1-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug46480-1-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug46480-1-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug50695-1-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug50695-1-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug50695-1-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug50695-1-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug51037-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug51037-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug51037-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug51037-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug51037-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug51037-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug51037-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug51037-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug51727-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug51727-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug51727-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug51727-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug51727-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug51727-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug51727-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug51727-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug52505-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug52505-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug52505-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug52505-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug52505-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug52505-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug52505-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug52505-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug52506-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug52506-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug52506-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug52506-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug52506-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug52506-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug52506-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug52506-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug55545-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug55545-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug55545-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug55545-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug55545-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug55545-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug55545-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug55545-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug56405-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug56405-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug56405-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug56405-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug5835-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug5835-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug5835-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug5835-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug59354-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug59354-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug59354-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug59354-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug59354-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug59354-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug59354-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug59354-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug60749-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug60749-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug60749-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug60749-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug60749-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug60749-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug60749-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug60749-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug650-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug650-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug650-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug650-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug67915-1-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug67915-1-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug67915-1-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug67915-1-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug68912-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug68912-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug68912-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug68912-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug68912-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug68912-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug68912-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug68912-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug7112-1-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug7112-1-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug7112-1-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug7112-1-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug7112-2-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug7112-2-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug7112-2-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug7112-2-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug73321-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug73321-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug73321-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug73321-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug7342-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug7342-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug7342-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug7342-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug7342-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug7342-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug7342-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug7342-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug92647-2-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug92647-2-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug92647-2-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug92647-2-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug96334-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug96334-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug96334-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug96334-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug96334-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug96334-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug96334-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug96334-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug96343-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug96343-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug96343-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug96343-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug99948-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug99948-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug99948-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug99948-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug99948-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug99948-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/bugs/bug99948-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/bugs/bug99948-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/collapsing_borders/bug41262-4-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/collapsing_borders/bug41262-4-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/collapsing_borders/bug41262-4-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/collapsing_borders/bug41262-4-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/collapsing_borders/bug41262-4-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/collapsing_borders/bug41262-4-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/collapsing_borders/bug41262-4-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/collapsing_borders/bug41262-4-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/core/bloomberg-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/core/bloomberg-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/core/bloomberg-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/core/bloomberg-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/core/captions-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/core/captions-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/core/captions-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/core/captions-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/core/cell_heights-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/core/cell_heights-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/core/cell_heights-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/core/cell_heights-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/core/col_widths_fix_fixPer-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/core/col_widths_fix_fixPer-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/core/col_widths_fix_fixPer-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/core/col_widths_fix_fixPer-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/core/margins-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/core/margins-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/core/margins-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/core/margins-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/core/margins-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/core/margins-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/core/margins-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/core/margins-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/core/row_span-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/core/row_span-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/core/row_span-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/core/row_span-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/dom/tableDom-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/dom/tableDom-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/dom/tableDom-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/dom/tableDom-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/dom/tableDom-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/dom/tableDom-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/dom/tableDom-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/dom/tableDom-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/marvin/backgr_layers-opacity-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/marvin/backgr_layers-opacity-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/marvin/backgr_layers-opacity-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/marvin/backgr_layers-opacity-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/marvin/backgr_position-table-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/marvin/backgr_position-table-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/marvin/backgr_position-table-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/marvin/backgr_position-table-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/marvin/backgr_simple-table-cell-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/marvin/backgr_simple-table-cell-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/marvin/backgr_simple-table-cell-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/marvin/backgr_simple-table-cell-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/marvin/backgr_simple-table-column-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/marvin/backgr_simple-table-column-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/marvin/backgr_simple-table-column-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/marvin/backgr_simple-table-column-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/marvin/backgr_simple-table-column-group-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/marvin/backgr_simple-table-column-group-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/marvin/backgr_simple-table-column-group-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/marvin/backgr_simple-table-column-group-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/marvin/backgr_simple-table-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/marvin/backgr_simple-table-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/marvin/backgr_simple-table-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/marvin/backgr_simple-table-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/marvin/backgr_simple-table-row-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/marvin/backgr_simple-table-row-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/marvin/backgr_simple-table-row-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/marvin/backgr_simple-table-row-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/marvin/backgr_simple-table-row-group-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/marvin/backgr_simple-table-row-group-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/marvin/backgr_simple-table-row-group-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/marvin/backgr_simple-table-row-group-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/marvin/x_table_bgcolor_name-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/marvin/x_table_bgcolor_name-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/marvin/x_table_bgcolor_name-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/marvin/x_table_bgcolor_name-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/marvin/x_table_bgcolor_rgb-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/marvin/x_table_bgcolor_rgb-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/marvin/x_table_bgcolor_rgb-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/marvin/x_table_bgcolor_rgb-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/marvin/x_td_bgcolor_name-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/marvin/x_td_bgcolor_name-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/marvin/x_td_bgcolor_name-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/marvin/x_td_bgcolor_name-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/marvin/x_td_bgcolor_rgb-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/marvin/x_td_bgcolor_rgb-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/marvin/x_td_bgcolor_rgb-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/marvin/x_td_bgcolor_rgb-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/marvin/x_td_height-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/marvin/x_td_height-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/marvin/x_td_height-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/marvin/x_td_height-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/marvin/x_th_bgcolor_name-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/marvin/x_th_bgcolor_name-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/marvin/x_th_bgcolor_name-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/marvin/x_th_bgcolor_name-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/marvin/x_th_bgcolor_rgb-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/marvin/x_th_bgcolor_rgb-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/marvin/x_th_bgcolor_rgb-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/marvin/x_th_bgcolor_rgb-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/marvin/x_th_height-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/marvin/x_th_height-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/marvin/x_th_height-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/marvin/x_th_height-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/marvin/x_tr_bgcolor_name-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/marvin/x_tr_bgcolor_name-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/marvin/x_tr_bgcolor_name-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/marvin/x_tr_bgcolor_name-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/marvin/x_tr_bgcolor_rgb-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/marvin/x_tr_bgcolor_rgb-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/marvin/x_tr_bgcolor_rgb-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/marvin/x_tr_bgcolor_rgb-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/other/cell_widths-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/other/cell_widths-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/other/cell_widths-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/other/cell_widths-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/other/move_row-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/other/move_row-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/other/move_row-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/other/move_row-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/other/move_row-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/other/move_row-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/other/move_row-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/other/move_row-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/other/nestedTables-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/other/nestedTables-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/other/nestedTables-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/other/nestedTables-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/other/test3-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/other/test3-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/other/test3-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/other/test3-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/other/test6-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/other/test6-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/other/test6-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/other/test6-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/other/wa_table_thtd_rowspan-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/other/wa_table_thtd_rowspan-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/other/wa_table_thtd_rowspan-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/other/wa_table_thtd_rowspan-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/other/wa_table_tr_align-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/other/wa_table_tr_align-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla/other/wa_table_tr_align-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla/other/wa_table_tr_align-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/bugs/bug10140-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/bugs/bug10140-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/bugs/bug10140-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/bugs/bug10140-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/bugs/bug101759-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/bugs/bug101759-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/bugs/bug101759-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/bugs/bug101759-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/bugs/bug10216-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/bugs/bug10216-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/bugs/bug10216-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/bugs/bug10216-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/bugs/bug1055-2-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/bugs/bug1055-2-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/bugs/bug1055-2-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/bugs/bug1055-2-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/bugs/bug106966-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/bugs/bug106966-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/bugs/bug106966-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/bugs/bug106966-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/bugs/bug131020-3-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/bugs/bug131020-3-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/bugs/bug131020-3-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/bugs/bug131020-3-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/bugs/bug14007-1-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/bugs/bug14007-1-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/bugs/bug14007-1-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/bugs/bug14007-1-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/bugs/bug14007-2-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/bugs/bug14007-2-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/bugs/bug14007-2-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/bugs/bug14007-2-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/bugs/bug1725-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/bugs/bug1725-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/bugs/bug1725-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/bugs/bug1725-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/bugs/bug1725-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/bugs/bug1725-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/bugs/bug1725-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/bugs/bug1725-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/bugs/bug19526-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/bugs/bug19526-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/bugs/bug19526-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/bugs/bug19526-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/bugs/bug22122-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/bugs/bug22122-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/bugs/bug22122-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/bugs/bug22122-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/bugs/bug2479-5-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/bugs/bug2479-5-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/bugs/bug2479-5-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/bugs/bug2479-5-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/bugs/bug2479-5-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/bugs/bug2479-5-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/bugs/bug2479-5-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/bugs/bug2479-5-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/bugs/bug32205-1-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/bugs/bug32205-1-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/bugs/bug32205-1-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/bugs/bug32205-1-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/bugs/bug58402-2-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/bugs/bug58402-2-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/bugs/bug58402-2-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/bugs/bug58402-2-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/bugs/bug58402-2-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/bugs/bug58402-2-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/bugs/bug58402-2-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/bugs/bug58402-2-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/bugs/bug80762-2-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/bugs/bug80762-2-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/bugs/bug80762-2-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/bugs/bug80762-2-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/bugs/bug89315-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/bugs/bug89315-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/bugs/bug89315-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/bugs/bug89315-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/bugs/bug91057-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/bugs/bug91057-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/bugs/bug91057-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/bugs/bug91057-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/bugs/bug92647-1-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/bugs/bug92647-1-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/bugs/bug92647-1-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/bugs/bug92647-1-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/bugs/bug92647-1-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/bugs/bug92647-1-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/bugs/bug92647-1-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/bugs/bug92647-1-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/collapsing_borders/bug41262-5-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/collapsing_borders/bug41262-5-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/collapsing_borders/bug41262-5-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/collapsing_borders/bug41262-5-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/collapsing_borders/bug41262-5-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/collapsing_borders/bug41262-5-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/collapsing_borders/bug41262-5-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/collapsing_borders/bug41262-5-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/collapsing_borders/bug41262-6-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/collapsing_borders/bug41262-6-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/collapsing_borders/bug41262-6-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/collapsing_borders/bug41262-6-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/collapsing_borders/bug41262-6-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/collapsing_borders/bug41262-6-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/collapsing_borders/bug41262-6-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/collapsing_borders/bug41262-6-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/core/backgrounds-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/core/backgrounds-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/core/backgrounds-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/core/backgrounds-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/core/captions1-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/core/captions1-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/core/captions1-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/core/captions1-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/core/captions2-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/core/captions2-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/core/captions2-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/core/captions2-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/core/captions3-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/core/captions3-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/core/captions3-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/core/captions3-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/core/col_span2-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/core/col_span2-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/core/col_span2-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/core/col_span2-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/core/columns-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/core/columns-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/core/columns-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/core/columns-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/core/conflicts-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/core/conflicts-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/core/conflicts-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/core/conflicts-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/core/standards1-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/core/standards1-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/core/standards1-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/core/standards1-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/marvin/backgr_border-table-cell-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/marvin/backgr_border-table-cell-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/marvin/backgr_border-table-cell-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/marvin/backgr_border-table-cell-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/marvin/backgr_border-table-column-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/marvin/backgr_border-table-column-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/marvin/backgr_border-table-column-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/marvin/backgr_border-table-column-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/marvin/backgr_border-table-column-group-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/marvin/backgr_border-table-column-group-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/marvin/backgr_border-table-column-group-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/marvin/backgr_border-table-column-group-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/marvin/backgr_border-table-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/marvin/backgr_border-table-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/marvin/backgr_border-table-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/marvin/backgr_border-table-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/marvin/backgr_border-table-quirks-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/marvin/backgr_border-table-quirks-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/marvin/backgr_border-table-quirks-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/marvin/backgr_border-table-quirks-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/marvin/backgr_border-table-row-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/marvin/backgr_border-table-row-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/marvin/backgr_border-table-row-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/marvin/backgr_border-table-row-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/marvin/backgr_border-table-row-group-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/marvin/backgr_border-table-row-group-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/marvin/backgr_border-table-row-group-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/marvin/backgr_border-table-row-group-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/marvin/backgr_layers-hide-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/marvin/backgr_layers-hide-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/marvin/backgr_layers-hide-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/marvin/backgr_layers-hide-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/marvin/backgr_position-table-cell-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/marvin/backgr_position-table-cell-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/marvin/backgr_position-table-cell-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/marvin/backgr_position-table-cell-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/marvin/backgr_position-table-column-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/marvin/backgr_position-table-column-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/marvin/backgr_position-table-column-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/marvin/backgr_position-table-column-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/marvin/backgr_position-table-column-group-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/marvin/backgr_position-table-column-group-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/marvin/backgr_position-table-column-group-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/marvin/backgr_position-table-column-group-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/marvin/backgr_position-table-row-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/marvin/backgr_position-table-row-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/marvin/backgr_position-table-row-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/marvin/backgr_position-table-row-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/marvin/backgr_position-table-row-group-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/marvin/backgr_position-table-row-group-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/marvin/backgr_position-table-row-group-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/marvin/backgr_position-table-row-group-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/marvin/table_overflow_dirty_reflow_tbody-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/marvin/table_overflow_dirty_reflow_tbody-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/marvin/table_overflow_dirty_reflow_tbody-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/marvin/table_overflow_dirty_reflow_tbody-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/marvin/table_overflow_style_reflow_row_sibling-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/marvin/table_overflow_style_reflow_row_sibling-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/marvin/table_overflow_style_reflow_row_sibling-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/marvin/table_overflow_style_reflow_row_sibling-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/marvin/table_overflow_style_reflow_tbody_sibling-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/marvin/table_overflow_style_reflow_tbody_sibling-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/marvin/table_overflow_style_reflow_tbody_sibling-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/marvin/table_overflow_style_reflow_tbody_sibling-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/other/empty_cells-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/other/empty_cells-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/other/empty_cells-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/other/empty_cells-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/other/test4-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/other/test4-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/tables/mozilla_expected_failures/other/test4-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/tables/mozilla_expected_failures/other/test4-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/transforms/2d/hindi-rotated-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/transforms/2d/hindi-rotated-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/transforms/2d/hindi-rotated-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/transforms/2d/hindi-rotated-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/transforms/2d/hindi-rotated-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/transforms/2d/hindi-rotated-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/transforms/2d/hindi-rotated-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/transforms/2d/hindi-rotated-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/transforms/2d/transform-fixed-container-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/transforms/2d/transform-fixed-container-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/transforms/2d/transform-fixed-container-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/transforms/2d/transform-fixed-container-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/transforms/2d/zoom-menulist-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/transforms/2d/zoom-menulist-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/transforms/2d/zoom-menulist-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/transforms/2d/zoom-menulist-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/transforms/2d/zoom-menulist-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/transforms/2d/zoom-menulist-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/transforms/2d/zoom-menulist-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/transforms/2d/zoom-menulist-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/transforms/3d/general/perspective-non-layer-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/transforms/3d/general/perspective-non-layer-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/transforms/3d/general/perspective-non-layer-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/transforms/3d/general/perspective-non-layer-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/transforms/3d/general/perspective-non-layer-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/transforms/3d/general/perspective-non-layer-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/transforms/3d/general/perspective-non-layer-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/transforms/3d/general/perspective-non-layer-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/transforms/3d/point-mapping/3d-point-mapping-deep-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/transforms/3d/point-mapping/3d-point-mapping-deep-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/transforms/3d/point-mapping/3d-point-mapping-deep-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/transforms/3d/point-mapping/3d-point-mapping-deep-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/transforms/3d/point-mapping/3d-point-mapping-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/transforms/3d/point-mapping/3d-point-mapping-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/transforms/3d/point-mapping/3d-point-mapping-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/transforms/3d/point-mapping/3d-point-mapping-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/transforms/3d/point-mapping/3d-point-mapping-origins-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/transforms/3d/point-mapping/3d-point-mapping-origins-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/transforms/3d/point-mapping/3d-point-mapping-origins-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/transforms/3d/point-mapping/3d-point-mapping-origins-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/transforms/3d/point-mapping/3d-point-mapping-preserve-3d-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/transforms/3d/point-mapping/3d-point-mapping-preserve-3d-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/transforms/3d/point-mapping/3d-point-mapping-preserve-3d-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/transforms/3d/point-mapping/3d-point-mapping-preserve-3d-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-video-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-video-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-video-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/display_list_2d_canvas/fast/canvas/canvas-composite-video-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/display_list_2d_canvas/fast/canvas/canvas-imageSmoothingQuality-pixel-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/display_list_2d_canvas/fast/canvas/canvas-imageSmoothingQuality-pixel-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/display_list_2d_canvas/fast/canvas/canvas-imageSmoothingQuality-pixel-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/display_list_2d_canvas/fast/canvas/canvas-imageSmoothingQuality-pixel-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/display_list_2d_canvas/fast/canvas/canvas-shadow-source-in-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/display_list_2d_canvas/fast/canvas/canvas-shadow-source-in-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/display_list_2d_canvas/fast/canvas/canvas-shadow-source-in-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/display_list_2d_canvas/fast/canvas/canvas-shadow-source-in-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/gpu/fast/canvas/canvas-composite-video-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/gpu/fast/canvas/canvas-composite-video-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/gpu/fast/canvas/canvas-composite-video-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/gpu/fast/canvas/canvas-composite-video-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/gpu/fast/canvas/canvas-imageSmoothingQuality-pixel-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/gpu/fast/canvas/canvas-imageSmoothingQuality-pixel-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/gpu/fast/canvas/canvas-imageSmoothingQuality-pixel-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/gpu/fast/canvas/canvas-imageSmoothingQuality-pixel-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/pointerevent/fast/events/autoscroll-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/pointerevent/fast/events/autoscroll-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/pointerevent/fast/events/autoscroll-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/pointerevent/fast/events/autoscroll-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/pointerevent/fast/events/autoscroll-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/pointerevent/fast/events/autoscroll-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/pointerevent/fast/events/autoscroll-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/pointerevent/fast/events/autoscroll-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/pointerevent/fast/events/reveal-link-when-focused-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/pointerevent/fast/events/reveal-link-when-focused-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/pointerevent/fast/events/reveal-link-when-focused-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/pointerevent/fast/events/reveal-link-when-focused-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/pointerevent/fast/events/scale-and-scroll-iframe-body-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/pointerevent/fast/events/scale-and-scroll-iframe-body-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/pointerevent/fast/events/scale-and-scroll-iframe-body-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/pointerevent/fast/events/scale-and-scroll-iframe-body-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/pointerevent/fast/events/scale-and-scroll-iframe-window-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/pointerevent/fast/events/scale-and-scroll-iframe-window-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/pointerevent/fast/events/scale-and-scroll-iframe-window-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/pointerevent/fast/events/scale-and-scroll-iframe-window-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/prefer_compositing_to_lcd_text/compositing/overflow/do-not-paint-outline-into-composited-scrolling-contents-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/prefer_compositing_to_lcd_text/compositing/overflow/do-not-paint-outline-into-composited-scrolling-contents-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/prefer_compositing_to_lcd_text/compositing/overflow/do-not-paint-outline-into-composited-scrolling-contents-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/prefer_compositing_to_lcd_text/compositing/overflow/do-not-paint-outline-into-composited-scrolling-contents-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/prefer_compositing_to_lcd_text/compositing/overflow/textarea-scroll-touch-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/prefer_compositing_to_lcd_text/compositing/overflow/textarea-scroll-touch-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/prefer_compositing_to_lcd_text/compositing/overflow/textarea-scroll-touch-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/prefer_compositing_to_lcd_text/compositing/overflow/textarea-scroll-touch-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/prefer_compositing_to_lcd_text/compositing/overflow/update-widget-positions-on-nested-frames-and-scrollers-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/prefer_compositing_to_lcd_text/compositing/overflow/update-widget-positions-on-nested-frames-and-scrollers-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/prefer_compositing_to_lcd_text/compositing/overflow/update-widget-positions-on-nested-frames-and-scrollers-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/prefer_compositing_to_lcd_text/compositing/overflow/update-widget-positions-on-nested-frames-and-scrollers-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/prefer_compositing_to_lcd_text/scrollbars/border-box-rect-clips-scrollbars-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/prefer_compositing_to_lcd_text/scrollbars/border-box-rect-clips-scrollbars-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/prefer_compositing_to_lcd_text/scrollbars/border-box-rect-clips-scrollbars-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/prefer_compositing_to_lcd_text/scrollbars/border-box-rect-clips-scrollbars-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/prefer_compositing_to_lcd_text/scrollbars/overflow-scrollbar-combinations-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/prefer_compositing_to_lcd_text/scrollbars/overflow-scrollbar-combinations-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/prefer_compositing_to_lcd_text/scrollbars/overflow-scrollbar-combinations-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/prefer_compositing_to_lcd_text/scrollbars/overflow-scrollbar-combinations-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/prefer_compositing_to_lcd_text/scrollbars/rtl/overflow-scroll-rtl-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/prefer_compositing_to_lcd_text/scrollbars/rtl/overflow-scroll-rtl-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/prefer_compositing_to_lcd_text/scrollbars/rtl/overflow-scroll-rtl-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/prefer_compositing_to_lcd_text/scrollbars/rtl/overflow-scroll-rtl-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/prefer_compositing_to_lcd_text/scrollbars/scrollbars-on-positioned-content-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/prefer_compositing_to_lcd_text/scrollbars/scrollbars-on-positioned-content-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/prefer_compositing_to_lcd_text/scrollbars/scrollbars-on-positioned-content-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/prefer_compositing_to_lcd_text/scrollbars/scrollbars-on-positioned-content-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/prefer_compositing_to_lcd_text/scrollbars/short-scrollbar-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/prefer_compositing_to_lcd_text/scrollbars/short-scrollbar-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/prefer_compositing_to_lcd_text/scrollbars/short-scrollbar-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/prefer_compositing_to_lcd_text/scrollbars/short-scrollbar-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/rootlayerscrolls/scrollbars/border-box-rect-clips-scrollbars-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/rootlayerscrolls/scrollbars/border-box-rect-clips-scrollbars-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/rootlayerscrolls/scrollbars/border-box-rect-clips-scrollbars-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/rootlayerscrolls/scrollbars/border-box-rect-clips-scrollbars-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/rootlayerscrolls/scrollbars/overflow-scrollbar-combinations-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/rootlayerscrolls/scrollbars/overflow-scrollbar-combinations-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/rootlayerscrolls/scrollbars/overflow-scrollbar-combinations-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/rootlayerscrolls/scrollbars/overflow-scrollbar-combinations-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/rootlayerscrolls/scrollbars/scrollbars-on-positioned-content-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/rootlayerscrolls/scrollbars/scrollbars-on-positioned-content-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/rootlayerscrolls/scrollbars/scrollbars-on-positioned-content-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/rootlayerscrolls/scrollbars/scrollbars-on-positioned-content-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/spv2/fast/repaint/control-clip-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/spv2/fast/repaint/control-clip-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/spv2/fast/repaint/control-clip-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/spv2/fast/repaint/control-clip-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/spv2/paint/invalidation/spv2/image-resize-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/spv2/paint/invalidation/spv2/image-resize-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/spv2/paint/invalidation/spv2/image-resize-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/spv2/paint/invalidation/spv2/image-resize-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/spv2/paint/invalidation/spv2/text-match-highlight-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/spv2/paint/invalidation/spv2/text-match-highlight-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/spv2/paint/invalidation/spv2/text-match-highlight-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/spv2/paint/invalidation/spv2/text-match-highlight-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/spv2/paint/selection/text-selection-newline-mixed-ltr-rtl-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/spv2/paint/selection/text-selection-newline-mixed-ltr-rtl-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/spv2/paint/selection/text-selection-newline-mixed-ltr-rtl-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/spv2/paint/selection/text-selection-newline-mixed-ltr-rtl-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/syncpaint/fast/repaint/background-image-paint-invalidation-large-abspos-div-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/syncpaint/fast/repaint/background-image-paint-invalidation-large-abspos-div-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/syncpaint/fast/repaint/background-image-paint-invalidation-large-abspos-div-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/syncpaint/fast/repaint/background-image-paint-invalidation-large-abspos-div-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/syncpaint/fast/repaint/caret-invalidation-in-overflow-scroll-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/syncpaint/fast/repaint/caret-invalidation-in-overflow-scroll-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/syncpaint/fast/repaint/caret-invalidation-in-overflow-scroll-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/syncpaint/fast/repaint/caret-invalidation-in-overflow-scroll-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/syncpaint/fast/repaint/change-text-content-and-background-color-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/syncpaint/fast/repaint/change-text-content-and-background-color-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/syncpaint/fast/repaint/change-text-content-and-background-color-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/syncpaint/fast/repaint/change-text-content-and-background-color-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/syncpaint/fast/repaint/details-open-repaint-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/syncpaint/fast/repaint/details-open-repaint-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/syncpaint/fast/repaint/details-open-repaint-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/syncpaint/fast/repaint/details-open-repaint-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/syncpaint/fast/repaint/japanese-rl-selection-repaint-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/syncpaint/fast/repaint/japanese-rl-selection-repaint-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/syncpaint/fast/repaint/japanese-rl-selection-repaint-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/syncpaint/fast/repaint/japanese-rl-selection-repaint-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/syncpaint/fast/repaint/line-flow-with-floats-7-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/syncpaint/fast/repaint/line-flow-with-floats-7-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/syncpaint/fast/repaint/line-flow-with-floats-7-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/syncpaint/fast/repaint/line-flow-with-floats-7-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/syncpaint/fast/repaint/multi-layout-one-frame-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/syncpaint/fast/repaint/multi-layout-one-frame-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/syncpaint/fast/repaint/multi-layout-one-frame-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/syncpaint/fast/repaint/multi-layout-one-frame-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/syncpaint/fast/repaint/subtree-root-skipped-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/syncpaint/fast/repaint/subtree-root-skipped-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/syncpaint/fast/repaint/subtree-root-skipped-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/syncpaint/fast/repaint/subtree-root-skipped-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/threaded/printing/return-from-printing-mode-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/threaded/printing/return-from-printing-mode-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/threaded/printing/return-from-printing-mode-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/threaded/printing/return-from-printing-mode-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/threaded/transitions/cancel-and-start-new-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/threaded/transitions/cancel-and-start-new-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/threaded/transitions/cancel-and-start-new-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/threaded/transitions/cancel-and-start-new-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/trustedeventsdefaultaction/fast/events/autoscroll-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/trustedeventsdefaultaction/fast/events/autoscroll-expected.png similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/trustedeventsdefaultaction/fast/events/autoscroll-expected.png rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/trustedeventsdefaultaction/fast/events/autoscroll-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/trustedeventsdefaultaction/fast/events/autoscroll-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/trustedeventsdefaultaction/fast/events/autoscroll-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/platform/mac-mavericks/virtual/trustedeventsdefaultaction/fast/events/autoscroll-expected.txt rename to third_party/WebKit/LayoutTests/platform/mac-mac10.9/virtual/trustedeventsdefaultaction/fast/events/autoscroll-expected.txt
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/html/keygen-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/fast/html/keygen-expected.txt index 2d67c5d3..22cb8f4 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/fast/html/keygen-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/mac/fast/html/keygen-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. layer at (0,0) size 800x600 LayoutView at (0,0) size 800x600 layer at (0,0) size 800x600
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/forms/form-radio-img-node-list-expected.txt b/third_party/WebKit/LayoutTests/platform/win/fast/forms/form-radio-img-node-list-expected.txt index 631b2400..fc08023 100644 --- a/third_party/WebKit/LayoutTests/platform/win/fast/forms/form-radio-img-node-list-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/win/fast/forms/form-radio-img-node-list-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. Test RadioNodeLists returned by the HTMLFormElement named-getter. On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/html/keygen-expected.txt b/third_party/WebKit/LayoutTests/platform/win/fast/html/keygen-expected.txt index 708446b..12fce1d4 100644 --- a/third_party/WebKit/LayoutTests/platform/win/fast/html/keygen-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/win/fast/html/keygen-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. layer at (0,0) size 800x600 LayoutView at (0,0) size 800x600 layer at (0,0) size 800x600
diff --git a/third_party/WebKit/LayoutTests/virtual/stable/webexposed/element-instance-property-listing-expected.txt b/third_party/WebKit/LayoutTests/virtual/stable/webexposed/element-instance-property-listing-expected.txt index 4c485d0e..544fe305 100644 --- a/third_party/WebKit/LayoutTests/virtual/stable/webexposed/element-instance-property-listing-expected.txt +++ b/third_party/WebKit/LayoutTests/virtual/stable/webexposed/element-instance-property-listing-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. This test documents all properties on all element instances. On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/WebKit/LayoutTests/virtual/stable/webexposed/global-interface-listing-expected.txt b/third_party/WebKit/LayoutTests/virtual/stable/webexposed/global-interface-listing-expected.txt index 0c44110..f8843a7f 100644 --- a/third_party/WebKit/LayoutTests/virtual/stable/webexposed/global-interface-listing-expected.txt +++ b/third_party/WebKit/LayoutTests/virtual/stable/webexposed/global-interface-listing-expected.txt
@@ -10,7 +10,28 @@ CONSOLE WARNING: 'webkitIDBDatabase' is deprecated. Please use 'IDBDatabase' instead. CONSOLE WARNING: 'webkitIDBCursor' is deprecated. Please use 'IDBCursor' instead. CONSOLE WARNING: 'webkitIndexedDB' is deprecated. Please use 'indexedDB' instead. +CONSOLE ERROR: The 'WebBluetooth' feature is currently enabled in limited trials. Please see [Phosphor console URL] for information on enabling a trial for your site. +CONSOLE ERROR: The 'WebBluetooth' feature is currently enabled in limited trials. Please see [Phosphor console URL] for information on enabling a trial for your site. +CONSOLE ERROR: The 'WebBluetooth' feature is currently enabled in limited trials. Please see [Phosphor console URL] for information on enabling a trial for your site. +CONSOLE ERROR: The 'WebBluetooth' feature is currently enabled in limited trials. Please see [Phosphor console URL] for information on enabling a trial for your site. +CONSOLE ERROR: The 'WebBluetooth' feature is currently enabled in limited trials. Please see [Phosphor console URL] for information on enabling a trial for your site. +CONSOLE ERROR: The 'WebBluetooth' feature is currently enabled in limited trials. Please see [Phosphor console URL] for information on enabling a trial for your site. +CONSOLE ERROR: The 'WebBluetooth' feature is currently enabled in limited trials. Please see [Phosphor console URL] for information on enabling a trial for your site. CONSOLE WARNING: 'webkitURL' is deprecated. Please use 'URL' instead. +CONSOLE ERROR: The 'WebBluetooth' feature is currently enabled in limited trials. Please see [Phosphor console URL] for information on enabling a trial for your site. +CONSOLE ERROR: The 'WebBluetooth' feature is currently enabled in limited trials. Please see [Phosphor console URL] for information on enabling a trial for your site. +CONSOLE ERROR: The 'WebBluetooth' feature is currently enabled in limited trials. Please see [Phosphor console URL] for information on enabling a trial for your site. +CONSOLE ERROR: The 'WebBluetooth' feature is currently enabled in limited trials. Please see [Phosphor console URL] for information on enabling a trial for your site. +CONSOLE ERROR: The 'WebBluetooth' feature is currently enabled in limited trials. Please see [Phosphor console URL] for information on enabling a trial for your site. +CONSOLE ERROR: The 'WebBluetooth' feature is currently enabled in limited trials. Please see [Phosphor console URL] for information on enabling a trial for your site. +CONSOLE ERROR: The 'WebBluetooth' feature is currently enabled in limited trials. Please see [Phosphor console URL] for information on enabling a trial for your site. +CONSOLE ERROR: The 'WebBluetooth' feature is currently enabled in limited trials. Please see [Phosphor console URL] for information on enabling a trial for your site. +CONSOLE ERROR: The 'WebBluetooth' feature is currently enabled in limited trials. Please see [Phosphor console URL] for information on enabling a trial for your site. +CONSOLE ERROR: The 'WebBluetooth' feature is currently enabled in limited trials. Please see [Phosphor console URL] for information on enabling a trial for your site. +CONSOLE ERROR: The 'WebBluetooth' feature is currently enabled in limited trials. Please see [Phosphor console URL] for information on enabling a trial for your site. +CONSOLE ERROR: The 'WebBluetooth' feature is currently enabled in limited trials. Please see [Phosphor console URL] for information on enabling a trial for your site. +CONSOLE ERROR: The 'WebBluetooth' feature is currently enabled in limited trials. Please see [Phosphor console URL] for information on enabling a trial for your site. +CONSOLE ERROR: The 'WebBluetooth' feature is currently enabled in limited trials. Please see [Phosphor console URL] for information on enabling a trial for your site. This test documents all interface attributes and methods on the global window object and element instances. On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/WebKit/LayoutTests/webaudio/realtimeanalyser-zero-expected.txt b/third_party/WebKit/LayoutTests/webaudio/realtimeanalyser-zero-expected.txt new file mode 100644 index 0000000..6991218 --- /dev/null +++ b/third_party/WebKit/LayoutTests/webaudio/realtimeanalyser-zero-expected.txt
@@ -0,0 +1,10 @@ +Test AnalyserNode getFloatFrequencyData With Zero-Valued Input + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + + +PASS getFloatFrequencyData() with zero-valued input contains only the constant -Infinity. +PASS successfullyParsed is true + +TEST COMPLETE +
diff --git a/third_party/WebKit/LayoutTests/webaudio/realtimeanalyser-zero.html b/third_party/WebKit/LayoutTests/webaudio/realtimeanalyser-zero.html new file mode 100644 index 0000000..3c12bda7 --- /dev/null +++ b/third_party/WebKit/LayoutTests/webaudio/realtimeanalyser-zero.html
@@ -0,0 +1,63 @@ +<!doctype html> +<html> + <head> + <script src="../resources/js-test.js"></script> + <script src="resources/compatibility.js"></script> + <script src="resources/audio-testing.js"></script> + <title>Test getFloatFrequencyData With Zero Inputs</title> + </head> + + <body> + <script> + description("Test AnalyserNode getFloatFrequencyData With Zero-Valued Input"); + window.jsTestIsAsync = true; + + var sampleRate = 48000; + + // Render enough data to run the test. + var renderFrames = 2*1024; + var renderDuration = renderFrames / sampleRate; + + var audit = Audit.createTaskRunner(); + + + // Test that getFloatFrequencyData returns -Infinity when the input is all-zeroes. + audit.defineTask("zero input", function (done) { + var context = new OfflineAudioContext(1, renderFrames, sampleRate); + + // Constant source of 0's. + var source = context.createBufferSource(); + source.buffer = createConstantBuffer(context, 1, 0); + source.loop = true; + + // Create analyser and use some non-default minDecibels value. + var analyser = context.createAnalyser(); + analyser.minDecibels = -123; + + source.connect(analyser); + analyser.connect(context.destination); + + source.start(); + + // Suspend after some number of frames and grab the float frequency data. + context.suspend(1024 / sampleRate).then(function () { + var f = new Float32Array(analyser.frequencyBinCount); + analyser.getFloatFrequencyData(f); + + Should("getFloatFrequencyData() with zero-valued input", f) + .beConstantValueOf(-Infinity); + }).then(context.resume.bind(context)); + + context.startRendering().then(done); + }); + + audit.defineTask("finish", function (done) { + finishJSTest(); + done(); + }); + + audit.runTasks(); + + </script> + </body> +</html>
diff --git a/third_party/WebKit/LayoutTests/webexposed/element-instance-property-listing-expected.txt b/third_party/WebKit/LayoutTests/webexposed/element-instance-property-listing-expected.txt index 52578e8..e8194858 100644 --- a/third_party/WebKit/LayoutTests/webexposed/element-instance-property-listing-expected.txt +++ b/third_party/WebKit/LayoutTests/webexposed/element-instance-property-listing-expected.txt
@@ -1,3 +1,4 @@ +CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details. This test documents all properties on all element instances. On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt index 82bfe60f..2e5f11cb 100644 --- a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt +++ b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt
@@ -344,6 +344,7 @@ getter uuid method constructor method getCharacteristic + method getCharacteristics interface BluetoothUUID static method canonicalUUID static method getCharacteristic
diff --git a/third_party/WebKit/Source/bindings/core/v8/RejectedPromises.cpp b/third_party/WebKit/Source/bindings/core/v8/RejectedPromises.cpp index 801adebc..8b075ca4 100644 --- a/third_party/WebKit/Source/bindings/core/v8/RejectedPromises.cpp +++ b/third_party/WebKit/Source/bindings/core/v8/RejectedPromises.cpp
@@ -15,7 +15,6 @@ #include "core/inspector/ConsoleMessage.h" #include "core/inspector/ScriptArguments.h" #include "platform/RuntimeEnabledFeatures.h" -#include "platform/Task.h" #include "public/platform/Platform.h" #include "public/platform/WebScheduler.h" #include "public/platform/WebTaskRunner.h" @@ -221,7 +220,7 @@ auto& message = m_reportedAsErrors.at(i); if (!message->isCollected() && message->hasPromise(data.GetPromise())) { message->makePromiseStrong(); - Platform::current()->currentThread()->scheduler()->timerTaskRunner()->postTask(BLINK_FROM_HERE, new Task(bind(&RejectedPromises::revokeNow, PassRefPtrWillBeRawPtr<RejectedPromises>(this), message.release()))); + Platform::current()->currentThread()->scheduler()->timerTaskRunner()->postTask(BLINK_FROM_HERE, bind(&RejectedPromises::revokeNow, PassRefPtrWillBeRawPtr<RejectedPromises>(this), message.release())); m_reportedAsErrors.remove(i); return; } @@ -250,7 +249,7 @@ OwnPtr<MessageQueue> queue = createMessageQueue(); queue->swap(m_queue); - Platform::current()->currentThread()->scheduler()->timerTaskRunner()->postTask(BLINK_FROM_HERE, new Task(bind(&RejectedPromises::processQueueNow, PassRefPtr<RejectedPromises>(this), queue.release()))); + Platform::current()->currentThread()->scheduler()->timerTaskRunner()->postTask(BLINK_FROM_HERE, bind(&RejectedPromises::processQueueNow, PassRefPtr<RejectedPromises>(this), queue.release())); } void RejectedPromises::processQueueNow(PassOwnPtr<MessageQueue> queue)
diff --git a/third_party/WebKit/Source/bindings/core/v8/ScriptStreamer.cpp b/third_party/WebKit/Source/bindings/core/v8/ScriptStreamer.cpp index e465472..77379c2 100644 --- a/third_party/WebKit/Source/bindings/core/v8/ScriptStreamer.cpp +++ b/third_party/WebKit/Source/bindings/core/v8/ScriptStreamer.cpp
@@ -14,7 +14,6 @@ #include "core/html/parser/TextResourceDecoder.h" #include "platform/Histogram.h" #include "platform/SharedBuffer.h" -#include "platform/Task.h" #include "platform/ThreadSafeFunctional.h" #include "platform/TraceEvent.h" #include "public/platform/WebScheduler.h" @@ -546,7 +545,7 @@ // running. This is taken care of with a manual ref() & deref() pair; // the corresponding deref() is in streamingComplete. ref(); - ScriptStreamerThread::shared()->postTask(new Task(threadSafeBind(&ScriptStreamerThread::runScriptStreamingTask, scriptStreamingTask.release(), AllowCrossThreadAccess(this)))); + ScriptStreamerThread::shared()->postTask(threadSafeBind(&ScriptStreamerThread::runScriptStreamingTask, scriptStreamingTask.release(), AllowCrossThreadAccess(this))); recordStartedStreamingHistogram(m_scriptType, 1); } if (m_stream)
diff --git a/third_party/WebKit/Source/bindings/core/v8/ScriptStreamerTest.cpp b/third_party/WebKit/Source/bindings/core/v8/ScriptStreamerTest.cpp index f501d1f..4aae6c26 100644 --- a/third_party/WebKit/Source/bindings/core/v8/ScriptStreamerTest.cpp +++ b/third_party/WebKit/Source/bindings/core/v8/ScriptStreamerTest.cpp
@@ -13,7 +13,6 @@ #include "core/dom/Element.h" #include "core/dom/PendingScript.h" #include "core/frame/Settings.h" -#include "platform/Task.h" #include "platform/heap/Handle.h" #include "platform/testing/UnitTestHelpers.h" #include "public/platform/Platform.h"
diff --git a/third_party/WebKit/Source/bindings/core/v8/ScriptStreamerThread.cpp b/third_party/WebKit/Source/bindings/core/v8/ScriptStreamerThread.cpp index 2853e76..4b7027c 100644 --- a/third_party/WebKit/Source/bindings/core/v8/ScriptStreamerThread.cpp +++ b/third_party/WebKit/Source/bindings/core/v8/ScriptStreamerThread.cpp
@@ -5,12 +5,11 @@ #include "bindings/core/v8/ScriptStreamerThread.h" #include "bindings/core/v8/ScriptStreamer.h" -#include "platform/Task.h" #include "platform/TraceEvent.h" #include "public/platform/Platform.h" +#include "public/platform/WebTaskRunner.h" #include "public/platform/WebTraceLocation.h" #include "wtf/MainThread.h" -#include "wtf/PassOwnPtr.h" namespace blink { @@ -54,7 +53,7 @@ return s_sharedThread; } -void ScriptStreamerThread::postTask(WebTaskRunner::Task* task) +void ScriptStreamerThread::postTask(PassOwnPtr<Closure> task) { ASSERT(isMainThread()); MutexLocker locker(m_mutex);
diff --git a/third_party/WebKit/Source/bindings/core/v8/ScriptStreamerThread.h b/third_party/WebKit/Source/bindings/core/v8/ScriptStreamerThread.h index 9254ca59..7fd2f87c 100644 --- a/third_party/WebKit/Source/bindings/core/v8/ScriptStreamerThread.h +++ b/third_party/WebKit/Source/bindings/core/v8/ScriptStreamerThread.h
@@ -7,9 +7,10 @@ #include "core/CoreExport.h" #include "platform/TaskSynchronizer.h" -#include "public/platform/WebTaskRunner.h" #include "public/platform/WebThread.h" +#include "wtf/Functional.h" #include "wtf/OwnPtr.h" +#include "wtf/PassOwnPtr.h" #include <v8.h> @@ -26,7 +27,7 @@ static void shutdown(); static ScriptStreamerThread* shared(); - void postTask(WebTaskRunner::Task*); + void postTask(WTF::PassOwnPtr<WTF::Closure>); bool isRunningTask() const {
diff --git a/third_party/WebKit/Source/core/core.gypi b/third_party/WebKit/Source/core/core.gypi index 662cb0f..ba598b0 100644 --- a/third_party/WebKit/Source/core/core.gypi +++ b/third_party/WebKit/Source/core/core.gypi
@@ -505,6 +505,7 @@ 'layout/api/LayoutBoxItem.h', 'layout/api/LayoutBoxModel.h', 'layout/api/LayoutItem.h', + 'layout/api/LayoutPartItem.h', 'layout/api/LayoutTextControlItem.h', 'layout/api/LayoutTextFragmentItem.h', 'layout/api/LayoutTextItem.h',
diff --git a/third_party/WebKit/Source/core/dom/Document.cpp b/third_party/WebKit/Source/core/dom/Document.cpp index 46907d7..64f72e83 100644 --- a/third_party/WebKit/Source/core/dom/Document.cpp +++ b/third_party/WebKit/Source/core/dom/Document.cpp
@@ -4837,21 +4837,21 @@ // Start from the last child node so that icons seen later take precedence as required by the spec. for (HTMLLinkElement* linkElement = head() ? Traversal<HTMLLinkElement>::firstChild(*head()) : 0; linkElement; linkElement = Traversal<HTMLLinkElement>::nextSibling(*linkElement)) { - if (!(linkElement->iconType() & iconTypesMask)) + if (!(linkElement->getIconType() & iconTypesMask)) continue; if (linkElement->href().isEmpty()) continue; - IconURL newURL(linkElement->href(), linkElement->iconSizes(), linkElement->type(), linkElement->iconType()); - if (linkElement->iconType() == Favicon) { + IconURL newURL(linkElement->href(), linkElement->iconSizes(), linkElement->type(), linkElement->getIconType()); + if (linkElement->getIconType() == Favicon) { if (firstFavicon.m_iconType != InvalidIcon) secondaryIcons.append(firstFavicon); firstFavicon = newURL; - } else if (linkElement->iconType() == TouchIcon) { + } else if (linkElement->getIconType() == TouchIcon) { if (firstTouchIcon.m_iconType != InvalidIcon) secondaryIcons.append(firstTouchIcon); firstTouchIcon = newURL; - } else if (linkElement->iconType() == TouchPrecomposedIcon) { + } else if (linkElement->getIconType() == TouchPrecomposedIcon) { if (firstTouchPrecomposedIcon.m_iconType != InvalidIcon) secondaryIcons.append(firstTouchPrecomposedIcon); firstTouchPrecomposedIcon = newURL;
diff --git a/third_party/WebKit/Source/core/dom/MainThreadTaskRunner.cpp b/third_party/WebKit/Source/core/dom/MainThreadTaskRunner.cpp index 90d6a7f8..8871c9f 100644 --- a/third_party/WebKit/Source/core/dom/MainThreadTaskRunner.cpp +++ b/third_party/WebKit/Source/core/dom/MainThreadTaskRunner.cpp
@@ -29,38 +29,12 @@ #include "core/dom/ExecutionContext.h" #include "core/dom/ExecutionContextTask.h" #include "core/inspector/InspectorInstrumentation.h" +#include "platform/ThreadSafeFunctional.h" #include "public/platform/Platform.h" #include "wtf/Assertions.h" namespace blink { -class MainThreadTask : public WebTaskRunner::Task { - WTF_MAKE_NONCOPYABLE(MainThreadTask); USING_FAST_MALLOC(MainThreadTask); -public: - MainThreadTask(WeakPtrWillBeRawPtr<MainThreadTaskRunner> runner, PassOwnPtr<ExecutionContextTask> task, bool isInspectorTask) - : m_runner(runner) - , m_task(task) - , m_isInspectorTask(isInspectorTask) - { - } - - void run() override; - -private: - WeakPtrWillBeCrossThreadWeakPersistent<MainThreadTaskRunner> m_runner; - OwnPtr<ExecutionContextTask> m_task; - bool m_isInspectorTask; -}; - -void MainThreadTask::run() -{ - ASSERT(isMainThread()); - - if (!m_runner.get()) - return; - m_runner->perform(m_task.release(), m_isInspectorTask); -} - MainThreadTaskRunner::MainThreadTaskRunner(ExecutionContext* context) : m_context(context) #if !ENABLE(OILPAN) @@ -80,16 +54,29 @@ visitor->trace(m_context); } +void MainThreadTaskRunner::postTaskInternal(const WebTraceLocation& location, PassOwnPtr<ExecutionContextTask> task, bool isInspectorTask) +{ + Platform::current()->mainThread()->taskRunner()->postTask(location, threadSafeBind( + &MainThreadTaskRunner::perform, +#if ENABLE(OILPAN) + CrossThreadWeakPersistentThisPointer<MainThreadTaskRunner>(this), +#else + AllowCrossThreadAccess(m_weakFactory.createWeakPtr()), +#endif + task, + isInspectorTask)); +} + void MainThreadTaskRunner::postTask(const WebTraceLocation& location, PassOwnPtr<ExecutionContextTask> task) { if (!task->taskNameForInstrumentation().isEmpty()) InspectorInstrumentation::didPostExecutionContextTask(m_context, task.get()); - Platform::current()->mainThread()->taskRunner()->postTask(location, new MainThreadTask(createWeakPointerToSelf(), task, false)); + postTaskInternal(location, task, false); } void MainThreadTaskRunner::postInspectorTask(const WebTraceLocation& location, PassOwnPtr<ExecutionContextTask> task) { - Platform::current()->mainThread()->taskRunner()->postTask(location, new MainThreadTask(createWeakPointerToSelf(), task, true)); + postTaskInternal(location, task, true); } void MainThreadTaskRunner::perform(PassOwnPtr<ExecutionContextTask> task, bool isInspectorTask) @@ -137,13 +124,4 @@ } } -WeakPtrWillBeRawPtr<MainThreadTaskRunner> MainThreadTaskRunner::createWeakPointerToSelf() -{ -#if ENABLE(OILPAN) - return this; -#else - return m_weakFactory.createWeakPtr(); -#endif -} - } // namespace blink
diff --git a/third_party/WebKit/Source/core/dom/MainThreadTaskRunner.h b/third_party/WebKit/Source/core/dom/MainThreadTaskRunner.h index f661b888..14a5c7a 100644 --- a/third_party/WebKit/Source/core/dom/MainThreadTaskRunner.h +++ b/third_party/WebKit/Source/core/dom/MainThreadTaskRunner.h
@@ -65,7 +65,7 @@ void pendingTasksTimerFired(Timer<MainThreadTaskRunner>*); - WeakPtrWillBeRawPtr<MainThreadTaskRunner> createWeakPointerToSelf(); + void postTaskInternal(const WebTraceLocation&, PassOwnPtr<ExecutionContextTask>, bool isInspectorTask); RawPtrWillBeMember<ExecutionContext> m_context; #if !ENABLE(OILPAN)
diff --git a/third_party/WebKit/Source/core/dom/ScriptRunner.cpp b/third_party/WebKit/Source/core/dom/ScriptRunner.cpp index b3312a67..740874b3 100644 --- a/third_party/WebKit/Source/core/dom/ScriptRunner.cpp +++ b/third_party/WebKit/Source/core/dom/ScriptRunner.cpp
@@ -59,28 +59,6 @@ #endif } -class ScriptRunner::Task : public WebTaskRunner::Task { - WTF_MAKE_NONCOPYABLE(Task); - -public: - explicit Task(WeakPtrWillBeRawPtr<ScriptRunner> scriptRunner) - : m_scriptRunner(scriptRunner) - { - } - - virtual ~Task() { }; - - void run() override - { - if (!m_scriptRunner) - return; - m_scriptRunner->executeTask(); - } - -private: - WeakPtrWillBeWeakPersistent<ScriptRunner> m_scriptRunner; -}; - #if !ENABLE(OILPAN) void ScriptRunner::dispose() { @@ -121,14 +99,11 @@ void ScriptRunner::postTask(const WebTraceLocation& webTraceLocation) { - // TODO(altimin): Replace all this with `new Task(this)` when Oilpan is here. - WeakPtrWillBeRawPtr<ScriptRunner> scriptRunnerForTask; #if !ENABLE(OILPAN) - scriptRunnerForTask = m_weakPointerFactoryForTasks.createWeakPtr(); + m_taskRunner->postTask(webTraceLocation, bind(&ScriptRunner::executeTask, m_weakPointerFactoryForTasks.createWeakPtr())); #else - scriptRunnerForTask = this; + m_taskRunner->postTask(webTraceLocation, bind(&ScriptRunner::executeTask, WeakPersistentThisPointer<ScriptRunner>(this))); #endif - m_taskRunner->postTask(webTraceLocation, new Task(scriptRunnerForTask)); } void ScriptRunner::suspend()
diff --git a/third_party/WebKit/Source/core/dom/custom/CustomElementMicrotaskRunQueue.cpp b/third_party/WebKit/Source/core/dom/custom/CustomElementMicrotaskRunQueue.cpp index ca519ac..660598a 100644 --- a/third_party/WebKit/Source/core/dom/custom/CustomElementMicrotaskRunQueue.cpp +++ b/third_party/WebKit/Source/core/dom/custom/CustomElementMicrotaskRunQueue.cpp
@@ -37,22 +37,14 @@ requestDispatchIfNeeded(); } -void CustomElementMicrotaskRunQueue::dispatchIfAlive(WeakPtrWillBeWeakPersistent<CustomElementMicrotaskRunQueue> self) -{ - if (self.get()) { - RefPtrWillBeRawPtr<CustomElementMicrotaskRunQueue> protect(self.get()); - self->dispatch(); - } -} - void CustomElementMicrotaskRunQueue::requestDispatchIfNeeded() { if (m_dispatchIsPending || isEmpty()) return; #if ENABLE(OILPAN) - Microtask::enqueueMicrotask(WTF::bind(&CustomElementMicrotaskRunQueue::dispatchIfAlive, WeakPersistent<CustomElementMicrotaskRunQueue>(this))); + Microtask::enqueueMicrotask(WTF::bind(&CustomElementMicrotaskRunQueue::dispatch, WeakPersistentThisPointer<CustomElementMicrotaskRunQueue>(this))); #else - Microtask::enqueueMicrotask(WTF::bind(&CustomElementMicrotaskRunQueue::dispatchIfAlive, m_weakFactory.createWeakPtr())); + Microtask::enqueueMicrotask(WTF::bind(&CustomElementMicrotaskRunQueue::dispatch, m_weakFactory.createWeakPtr())); #endif m_dispatchIsPending = true; } @@ -65,6 +57,7 @@ void CustomElementMicrotaskRunQueue::dispatch() { + RefPtrWillBeRawPtr<CustomElementMicrotaskRunQueue> protect(this); m_dispatchIsPending = false; m_syncQueue->dispatch(); if (m_syncQueue->isEmpty())
diff --git a/third_party/WebKit/Source/core/dom/custom/CustomElementMicrotaskRunQueue.h b/third_party/WebKit/Source/core/dom/custom/CustomElementMicrotaskRunQueue.h index f4ed5181..b531e27 100644 --- a/third_party/WebKit/Source/core/dom/custom/CustomElementMicrotaskRunQueue.h +++ b/third_party/WebKit/Source/core/dom/custom/CustomElementMicrotaskRunQueue.h
@@ -28,8 +28,6 @@ DECLARE_TRACE(); private: - static void dispatchIfAlive(WeakPtrWillBeWeakPersistent<CustomElementMicrotaskRunQueue>); - CustomElementMicrotaskRunQueue(); void dispatch();
diff --git a/third_party/WebKit/Source/core/editing/RenderedPosition.cpp b/third_party/WebKit/Source/core/editing/RenderedPosition.cpp index 0ca8031..eb4be7302 100644 --- a/third_party/WebKit/Source/core/editing/RenderedPosition.cpp +++ b/third_party/WebKit/Source/core/editing/RenderedPosition.cpp
@@ -89,7 +89,7 @@ m_inlineBox = boxPosition.inlineBox; m_offset = boxPosition.offsetInBox; if (m_inlineBox) - m_layoutObject = LineLayoutAPIShim::layoutObjectFrom(m_inlineBox->lineLayoutItem()); + m_layoutObject = LineLayoutAPIShim::layoutObjectFrom(m_inlineBox->getLineLayoutItem()); else m_layoutObject = layoutObjectFromPosition(position); } @@ -141,7 +141,7 @@ do { InlineBox* prev = box->prevLeafChildIgnoringLineBreak(); if (!prev || prev->bidiLevel() < bidiLevelOfRun) - return RenderedPosition(LineLayoutAPIShim::layoutObjectFrom(box->lineLayoutItem()), box, box->caretLeftmostOffset()); + return RenderedPosition(LineLayoutAPIShim::layoutObjectFrom(box->getLineLayoutItem()), box, box->caretLeftmostOffset()); box = prev; } while (box); @@ -158,7 +158,7 @@ do { InlineBox* next = box->nextLeafChildIgnoringLineBreak(); if (!next || next->bidiLevel() < bidiLevelOfRun) - return RenderedPosition(LineLayoutAPIShim::layoutObjectFrom(box->lineLayoutItem()), box, box->caretRightmostOffset()); + return RenderedPosition(LineLayoutAPIShim::layoutObjectFrom(box->getLineLayoutItem()), box, box->caretRightmostOffset()); box = next; } while (box); @@ -213,7 +213,7 @@ if (atLeftmostOffsetInBox()) return Position::editingPositionOf(m_layoutObject->node(), m_offset); - return Position::editingPositionOf(nextLeafChild()->lineLayoutItem().node(), nextLeafChild()->caretLeftmostOffset()); + return Position::editingPositionOf(nextLeafChild()->getLineLayoutItem().node(), nextLeafChild()->caretLeftmostOffset()); } Position RenderedPosition::positionAtRightBoundaryOfBiDiRun() const @@ -223,7 +223,7 @@ if (atRightmostOffsetInBox()) return Position::editingPositionOf(m_layoutObject->node(), m_offset); - return Position::editingPositionOf(prevLeafChild()->lineLayoutItem().node(), prevLeafChild()->caretRightmostOffset()); + return Position::editingPositionOf(prevLeafChild()->getLineLayoutItem().node(), prevLeafChild()->caretRightmostOffset()); } IntRect RenderedPosition::absoluteRect(LayoutUnit* extraWidthToEndOfLine) const
diff --git a/third_party/WebKit/Source/core/editing/VisibleUnits.cpp b/third_party/WebKit/Source/core/editing/VisibleUnits.cpp index 5100541..7d0948a0 100644 --- a/third_party/WebKit/Source/core/editing/VisibleUnits.cpp +++ b/third_party/WebKit/Source/core/editing/VisibleUnits.cpp
@@ -404,7 +404,7 @@ return previousBox; while (1) { - Node* startNode = startBox->lineLayoutItem().nonPseudoNode(); + Node* startNode = startBox->getLineLayoutItem().nonPseudoNode(); if (!startNode) break; @@ -445,7 +445,7 @@ return nextBox; while (1) { - Node* startNode =startBox->lineLayoutItem().nonPseudoNode(); + Node* startNode =startBox->getLineLayoutItem().nonPseudoNode(); if (!startNode) break; @@ -483,10 +483,10 @@ string.clear(); if (previousBox) { previousBoxLength = previousBox->len(); - previousBox->lineLayoutItem().text().appendTo(string, previousBox->start(), previousBoxLength); + previousBox->getLineLayoutItem().text().appendTo(string, previousBox->start(), previousBoxLength); len += previousBoxLength; } - textBox->lineLayoutItem().text().appendTo(string, textBox->start(), textBox->len()); + textBox->getLineLayoutItem().text().appendTo(string, textBox->start(), textBox->len()); len += textBox->len(); return wordBreakIterator(string.data(), len); @@ -502,10 +502,10 @@ int len = 0; string.clear(); - textBox->lineLayoutItem().text().appendTo(string, textBox->start(), textBox->len()); + textBox->getLineLayoutItem().text().appendTo(string, textBox->start(), textBox->len()); len += textBox->len(); if (nextBox) { - nextBox->lineLayoutItem().text().appendTo(string, nextBox->start(), nextBox->len()); + nextBox->getLineLayoutItem().text().appendTo(string, nextBox->start(), nextBox->len()); len += nextBox->len(); } @@ -572,7 +572,7 @@ } else if (offsetInBox == box->caretMaxOffset()) { iter = wordBreakIteratorForMaxOffsetBoundary(visiblePosition, textBox, nextBoxInDifferentBlock, string, leafBoxes); } else if (movingIntoNewBox) { - iter = wordBreakIterator(textBox->lineLayoutItem().text(), textBox->start(), textBox->len()); + iter = wordBreakIterator(textBox->getLineLayoutItem().text(), textBox->start(), textBox->len()); previouslyVisitedBox = box; } @@ -996,7 +996,7 @@ if (!startBox) return PositionWithAffinityTemplate<Strategy>(); - startNode = startBox->lineLayoutItem().nonPseudoNode(); + startNode = startBox->getLineLayoutItem().nonPseudoNode(); if (startNode) break; @@ -1093,7 +1093,7 @@ if (!endBox) return VisiblePositionTemplate<Strategy>(); - endNode = endBox->lineLayoutItem().nonPseudoNode(); + endNode = endBox->getLineLayoutItem().nonPseudoNode(); if (endNode) break; @@ -1330,7 +1330,7 @@ if (root) { // FIXME: Can be wrong for multi-column layout and with transforms. LayoutPoint pointInLine = absoluteLineDirectionPointToLocalPointInBlock(root, lineDirectionPoint); - LineLayoutItem lineLayoutItem = root->closestLeafChildForPoint(pointInLine, isEditablePosition(p))->lineLayoutItem(); + LineLayoutItem lineLayoutItem = root->closestLeafChildForPoint(pointInLine, isEditablePosition(p))->getLineLayoutItem(); Node* node = lineLayoutItem.node(); if (node && editingIgnoresContent(node)) return createVisiblePosition(positionInParentBeforeNode(*node)); @@ -1386,7 +1386,7 @@ if (root) { // FIXME: Can be wrong for multi-column layout and with transforms. LayoutPoint pointInLine = absoluteLineDirectionPointToLocalPointInBlock(root, lineDirectionPoint); - LineLayoutItem lineLayoutItem = root->closestLeafChildForPoint(pointInLine, isEditablePosition(p))->lineLayoutItem(); + LineLayoutItem lineLayoutItem = root->closestLeafChildForPoint(pointInLine, isEditablePosition(p))->getLineLayoutItem(); Node* node = lineLayoutItem.node(); if (node && editingIgnoresContent(node)) return createVisiblePosition(positionInParentBeforeNode(*node)); @@ -2138,7 +2138,7 @@ InlineBoxPosition boxPosition = computeInlineBoxPosition(position.position(), position.affinity()); if (boxPosition.inlineBox) - layoutObject = LineLayoutAPIShim::layoutObjectFrom(boxPosition.inlineBox->lineLayoutItem()); + layoutObject = LineLayoutAPIShim::layoutObjectFrom(boxPosition.inlineBox->getLineLayoutItem()); return layoutObject->localCaretRect(boxPosition.inlineBox, boxPosition.offsetInBox); } @@ -2573,7 +2573,7 @@ otherBox = otherBox->nextLeafChild(); if (!otherBox) break; - if (otherBox == lastTextBox || (LineLayoutAPIShim::layoutObjectFrom(otherBox->lineLayoutItem()) == textLayoutObject && toInlineTextBox(otherBox)->start() > textOffset)) + if (otherBox == lastTextBox || (LineLayoutAPIShim::layoutObjectFrom(otherBox->getLineLayoutItem()) == textLayoutObject && toInlineTextBox(otherBox)->start() > textOffset)) continuesOnNextLine = false; } @@ -2582,7 +2582,7 @@ otherBox = otherBox->prevLeafChild(); if (!otherBox) break; - if (otherBox == lastTextBox || (LineLayoutAPIShim::layoutObjectFrom(otherBox->lineLayoutItem()) == textLayoutObject && toInlineTextBox(otherBox)->start() > textOffset)) + if (otherBox == lastTextBox || (LineLayoutAPIShim::layoutObjectFrom(otherBox->getLineLayoutItem()) == textLayoutObject && toInlineTextBox(otherBox)->start() > textOffset)) continuesOnNextLine = false; } @@ -2704,7 +2704,7 @@ otherBox = otherBox->nextLeafChild(); if (!otherBox) break; - if (otherBox == lastTextBox || (LineLayoutAPIShim::layoutObjectFrom(otherBox->lineLayoutItem()) == textLayoutObject && toInlineTextBox(otherBox)->start() >= textOffset)) + if (otherBox == lastTextBox || (LineLayoutAPIShim::layoutObjectFrom(otherBox->getLineLayoutItem()) == textLayoutObject && toInlineTextBox(otherBox)->start() >= textOffset)) continuesOnNextLine = false; } @@ -2713,7 +2713,7 @@ otherBox = otherBox->prevLeafChild(); if (!otherBox) break; - if (otherBox == lastTextBox || (LineLayoutAPIShim::layoutObjectFrom(otherBox->lineLayoutItem()) == textLayoutObject && toInlineTextBox(otherBox)->start() >= textOffset)) + if (otherBox == lastTextBox || (LineLayoutAPIShim::layoutObjectFrom(otherBox->getLineLayoutItem()) == textLayoutObject && toInlineTextBox(otherBox)->start() >= textOffset)) continuesOnNextLine = false; } @@ -2946,7 +2946,7 @@ if (!box) return primaryDirection == LTR ? previousVisuallyDistinctCandidate(deepPosition) : nextVisuallyDistinctCandidate(deepPosition); - LineLayoutItem lineLayoutItem = box->lineLayoutItem(); + LineLayoutItem lineLayoutItem = box->getLineLayoutItem(); while (true) { if ((lineLayoutItem.isAtomicInlineLevel() || lineLayoutItem.isBR()) && offset == box->caretRightmostOffset()) @@ -2956,7 +2956,7 @@ box = box->prevLeafChild(); if (!box) return primaryDirection == LTR ? previousVisuallyDistinctCandidate(deepPosition) : nextVisuallyDistinctCandidate(deepPosition); - lineLayoutItem = box->lineLayoutItem(); + lineLayoutItem = box->getLineLayoutItem(); offset = box->caretRightmostOffset(); continue; } @@ -2986,7 +2986,7 @@ // Reposition at the other logical position corresponding to our // edge's visual position and go for another round. box = prevBox; - lineLayoutItem = box->lineLayoutItem(); + lineLayoutItem = box->getLineLayoutItem(); offset = prevBox->caretRightmostOffset(); continue; } @@ -3001,7 +3001,7 @@ InlineBox* logicalStart = 0; if (primaryDirection == LTR ? box->root().getLogicalStartBoxWithNode(logicalStart) : box->root().getLogicalEndBoxWithNode(logicalStart)) { box = logicalStart; - lineLayoutItem = box->lineLayoutItem(); + lineLayoutItem = box->getLineLayoutItem(); offset = primaryDirection == LTR ? box->caretMinOffset() : box->caretMaxOffset(); } break; @@ -3020,19 +3020,19 @@ break; box = prevBox; - lineLayoutItem = box->lineLayoutItem(); + lineLayoutItem = box->getLineLayoutItem(); offset = box->caretRightmostOffset(); if (box->direction() == primaryDirection) break; continue; } - while (prevBox && !prevBox->lineLayoutItem().node()) + while (prevBox && !prevBox->getLineLayoutItem().node()) prevBox = prevBox->prevLeafChild(); if (prevBox) { box = prevBox; - lineLayoutItem = box->lineLayoutItem(); + lineLayoutItem = box->getLineLayoutItem(); offset = box->caretRightmostOffset(); if (box->bidiLevel() > level) { do { @@ -3063,7 +3063,7 @@ break; level = box->bidiLevel(); } - lineLayoutItem = box->lineLayoutItem(); + lineLayoutItem = box->getLineLayoutItem(); offset = primaryDirection == LTR ? box->caretMinOffset() : box->caretMaxOffset(); } break; @@ -3121,7 +3121,7 @@ if (!box) return primaryDirection == LTR ? nextVisuallyDistinctCandidate(deepPosition) : previousVisuallyDistinctCandidate(deepPosition); - LayoutObject* layoutObject = LineLayoutAPIShim::layoutObjectFrom(box->lineLayoutItem()); + LayoutObject* layoutObject = LineLayoutAPIShim::layoutObjectFrom(box->getLineLayoutItem()); while (true) { if ((layoutObject->isAtomicInlineLevel() || layoutObject->isBR()) && offset == box->caretLeftmostOffset()) @@ -3131,7 +3131,7 @@ box = box->nextLeafChild(); if (!box) return primaryDirection == LTR ? nextVisuallyDistinctCandidate(deepPosition) : previousVisuallyDistinctCandidate(deepPosition); - layoutObject = LineLayoutAPIShim::layoutObjectFrom(box->lineLayoutItem()); + layoutObject = LineLayoutAPIShim::layoutObjectFrom(box->getLineLayoutItem()); offset = box->caretLeftmostOffset(); continue; } @@ -3161,7 +3161,7 @@ // Reposition at the other logical position corresponding to our // edge's visual position and go for another round. box = nextBox; - layoutObject = LineLayoutAPIShim::layoutObjectFrom(box->lineLayoutItem()); + layoutObject = LineLayoutAPIShim::layoutObjectFrom(box->getLineLayoutItem()); offset = nextBox->caretLeftmostOffset(); continue; } @@ -3176,7 +3176,7 @@ InlineBox* logicalEnd = 0; if (primaryDirection == LTR ? box->root().getLogicalEndBoxWithNode(logicalEnd) : box->root().getLogicalStartBoxWithNode(logicalEnd)) { box = logicalEnd; - layoutObject = LineLayoutAPIShim::layoutObjectFrom(box->lineLayoutItem()); + layoutObject = LineLayoutAPIShim::layoutObjectFrom(box->getLineLayoutItem()); offset = primaryDirection == LTR ? box->caretMaxOffset() : box->caretMinOffset(); } break; @@ -3198,19 +3198,19 @@ // For example, abc 123 ^ CBA or 123 ^ CBA abc box = nextBox; - layoutObject = LineLayoutAPIShim::layoutObjectFrom(box->lineLayoutItem()); + layoutObject = LineLayoutAPIShim::layoutObjectFrom(box->getLineLayoutItem()); offset = box->caretLeftmostOffset(); if (box->direction() == primaryDirection) break; continue; } - while (nextBox && !nextBox->lineLayoutItem().node()) + while (nextBox && !nextBox->getLineLayoutItem().node()) nextBox = nextBox->nextLeafChild(); if (nextBox) { box = nextBox; - layoutObject = LineLayoutAPIShim::layoutObjectFrom(box->lineLayoutItem()); + layoutObject = LineLayoutAPIShim::layoutObjectFrom(box->getLineLayoutItem()); offset = box->caretLeftmostOffset(); if (box->bidiLevel() > level) { @@ -3241,7 +3241,7 @@ break; level = box->bidiLevel(); } - layoutObject = LineLayoutAPIShim::layoutObjectFrom(box->lineLayoutItem()); + layoutObject = LineLayoutAPIShim::layoutObjectFrom(box->getLineLayoutItem()); offset = primaryDirection == LTR ? box->caretMaxOffset() : box->caretMinOffset(); } break;
diff --git a/third_party/WebKit/Source/core/editing/VisibleUnitsTest.cpp b/third_party/WebKit/Source/core/editing/VisibleUnitsTest.cpp index 746e39b..b3dc8b10 100644 --- a/third_party/WebKit/Source/core/editing/VisibleUnitsTest.cpp +++ b/third_party/WebKit/Source/core/editing/VisibleUnitsTest.cpp
@@ -42,7 +42,7 @@ { if (!inlineBoxPosition.inlineBox) return ostream << "null"; - return ostream << inlineBoxPosition.inlineBox->lineLayoutItem().node() << "@" << inlineBoxPosition.offsetInBox; + return ostream << inlineBoxPosition.inlineBox->getLineLayoutItem().node() << "@" << inlineBoxPosition.offsetInBox; } class VisibleUnitsTest : public EditingTestBase {
diff --git a/third_party/WebKit/Source/core/editing/iterators/TextIterator.cpp b/third_party/WebKit/Source/core/editing/iterators/TextIterator.cpp index 708b95ea..ace7750 100644 --- a/third_party/WebKit/Source/core/editing/iterators/TextIterator.cpp +++ b/third_party/WebKit/Source/core/editing/iterators/TextIterator.cpp
@@ -570,11 +570,11 @@ // FirstLetter seem to have different ideas of where things can split. // FirstLetter takes the punctuation + first letter, and BIDI will // split out the punctuation and possibly reorder it. - if (nextTextBox && !(nextTextBox->lineLayoutItem().isEqual(layoutObject))) { + if (nextTextBox && !(nextTextBox->getLineLayoutItem().isEqual(layoutObject))) { m_textBox = 0; return; } - ASSERT(!nextTextBox || nextTextBox->lineLayoutItem().isEqual(layoutObject)); + ASSERT(!nextTextBox || nextTextBox->getLineLayoutItem().isEqual(layoutObject)); if (runStart < runEnd) { // Handle either a single newline character (which becomes a space),
diff --git a/third_party/WebKit/Source/core/fetch/MemoryCacheTest.cpp b/third_party/WebKit/Source/core/fetch/MemoryCacheTest.cpp index 8d4da98d..45b5d08 100644 --- a/third_party/WebKit/Source/core/fetch/MemoryCacheTest.cpp +++ b/third_party/WebKit/Source/core/fetch/MemoryCacheTest.cpp
@@ -197,6 +197,36 @@ TestDeadResourceEviction(resource1.get(), resource2.get()); } +static void runTask1(Resource* live, Resource* dead) +{ + // The resource size has to be nonzero for this test to be meaningful, but + // we do not rely on it having any particular value. + ASSERT_GT(live->size(), 0u); + ASSERT_GT(dead->size(), 0u); + + ASSERT_EQ(0u, memoryCache()->deadSize()); + ASSERT_EQ(0u, memoryCache()->liveSize()); + + memoryCache()->add(dead); + memoryCache()->add(live); + memoryCache()->updateDecodedResource(live, UpdateForPropertyChange); + ASSERT_EQ(dead->size(), memoryCache()->deadSize()); + ASSERT_EQ(live->size(), memoryCache()->liveSize()); + ASSERT_GT(live->decodedSize(), 0u); + + memoryCache()->prune(); // Dead resources are pruned immediately + ASSERT_EQ(dead->size(), memoryCache()->deadSize()); + ASSERT_EQ(live->size(), memoryCache()->liveSize()); + ASSERT_GT(live->decodedSize(), 0u); +} + +static void runTask2(unsigned liveSizeWithoutDecode) +{ + // Next task: now, the live resource was evicted. + ASSERT_EQ(0u, memoryCache()->deadSize()); + ASSERT_EQ(liveSizeWithoutDecode, memoryCache()->liveSize()); +} + static void TestLiveResourceEvictionAtEndOfTask(Resource* cachedDeadResource, Resource* cachedLiveResource) { memoryCache()->setDelayBeforeLiveDecodedPrune(0); @@ -209,60 +239,8 @@ MockImageResourceClient client(cachedLiveResource); cachedLiveResource->appendData(data, 4u); - class Task1 : public WebTaskRunner::Task { - public: - Task1(Resource* live, Resource* dead) - : m_live(live) - , m_dead(dead) - { } - - void run() override - { - // The resource size has to be nonzero for this test to be meaningful, but - // we do not rely on it having any particular value. - ASSERT_GT(m_live->size(), 0u); - ASSERT_GT(m_dead->size(), 0u); - - ASSERT_EQ(0u, memoryCache()->deadSize()); - ASSERT_EQ(0u, memoryCache()->liveSize()); - - memoryCache()->add(m_dead.get()); - memoryCache()->add(m_live.get()); - memoryCache()->updateDecodedResource(m_live.get(), UpdateForPropertyChange); - ASSERT_EQ(m_dead->size(), memoryCache()->deadSize()); - ASSERT_EQ(m_live->size(), memoryCache()->liveSize()); - ASSERT_GT(m_live->decodedSize(), 0u); - - memoryCache()->prune(); // Dead resources are pruned immediately - ASSERT_EQ(m_dead->size(), memoryCache()->deadSize()); - ASSERT_EQ(m_live->size(), memoryCache()->liveSize()); - ASSERT_GT(m_live->decodedSize(), 0u); - } - - private: - RefPtrWillBePersistent<Resource> m_live; - RefPtrWillBePersistent<Resource> m_dead; - }; - - class Task2 : public WebTaskRunner::Task { - public: - Task2(unsigned liveSizeWithoutDecode) - : m_liveSizeWithoutDecode(liveSizeWithoutDecode) { } - - void run() override - { - // Next task: now, the live resource was evicted. - ASSERT_EQ(0u, memoryCache()->deadSize()); - ASSERT_EQ(m_liveSizeWithoutDecode, memoryCache()->liveSize()); - } - - private: - unsigned m_liveSizeWithoutDecode; - }; - - - Platform::current()->currentThread()->taskRunner()->postTask(BLINK_FROM_HERE, new Task1(cachedLiveResource, cachedDeadResource)); - Platform::current()->currentThread()->taskRunner()->postTask(BLINK_FROM_HERE, new Task2(cachedLiveResource->encodedSize() + cachedLiveResource->overheadSize())); + Platform::current()->currentThread()->taskRunner()->postTask(BLINK_FROM_HERE, bind(&runTask1, PassRefPtrWillBeRawPtr<Resource>(cachedLiveResource), PassRefPtrWillBeRawPtr<Resource>(cachedDeadResource))); + Platform::current()->currentThread()->taskRunner()->postTask(BLINK_FROM_HERE, bind(&runTask2, cachedLiveResource->encodedSize() + cachedLiveResource->overheadSize())); testing::runPendingTasks(); }
diff --git a/third_party/WebKit/Source/core/frame/Deprecation.cpp b/third_party/WebKit/Source/core/frame/Deprecation.cpp index c1ccde8..a3ad087 100644 --- a/third_party/WebKit/Source/core/frame/Deprecation.cpp +++ b/third_party/WebKit/Source/core/frame/Deprecation.cpp
@@ -117,6 +117,8 @@ return "M52, around July 2016"; case 53: return "M53, around September 2016"; + case 54: + return "M54, around October 2016"; } ASSERT_NOT_REACHED(); @@ -335,6 +337,9 @@ case UseCounter::PresentationConnectionStateChangeEventListener: return replacedWillBeRemoved("'PresentationConnection.onstateachange'", "'PresentationConnection.on{connect,close,terminate}'", 51, "5662456714100736"); + case UseCounter::HTMLKeygenElement: + return willBeRemoved("The <keygen> element", 54, "5716060992962560"); + // Features that aren't deprecated don't have a deprecation message. default: return String();
diff --git a/third_party/WebKit/Source/core/frame/ImageBitmap.cpp b/third_party/WebKit/Source/core/frame/ImageBitmap.cpp index 1b3eb6e8..a0ceecab 100644 --- a/third_party/WebKit/Source/core/frame/ImageBitmap.cpp +++ b/third_party/WebKit/Source/core/frame/ImageBitmap.cpp
@@ -16,22 +16,6 @@ static const char* imageOrientationFlipY = "flipY"; static const char* imageBitmapOptionNone = "none"; -static void parseOptions(const ImageBitmapOptions& options, bool& imageOrientationFlipYFlag, bool& premultiplyAlphaEnabledFlag) -{ - if (options.imageOrientation() == imageOrientationFlipY) { - imageOrientationFlipYFlag = true; - } else { - imageOrientationFlipYFlag = false; - ASSERT(options.imageOrientation() == imageBitmapOptionNone); - } - if (options.premultiplyAlpha() == imageBitmapOptionNone) { - premultiplyAlphaEnabledFlag = false; - } else { - premultiplyAlphaEnabledFlag = true; - ASSERT(options.premultiplyAlpha() == "default"); - } -} - // The following two functions are helpers used in cropImage static inline IntRect normalizeRect(const IntRect& rect) { @@ -63,6 +47,25 @@ }, nullptr)); } +static void swizzleImageData(unsigned char* srcAddr, int height, int bytesPerRow, bool flipY) +{ + if (flipY) { + for (int i = 0; i < height / 2; i++) { + int topRowStartPosition = i * bytesPerRow; + int bottomRowStartPosition = (height - 1 - i) * bytesPerRow; + for (int j = 0; j < bytesPerRow; j += 4) { + std::swap(srcAddr[topRowStartPosition + j], srcAddr[bottomRowStartPosition + j + 2]); + std::swap(srcAddr[topRowStartPosition + j + 1], srcAddr[bottomRowStartPosition + j + 1]); + std::swap(srcAddr[topRowStartPosition + j + 2], srcAddr[bottomRowStartPosition + j]); + std::swap(srcAddr[topRowStartPosition + j + 3], srcAddr[bottomRowStartPosition + j + 3]); + } + } + } else { + for (int i = 0; i < height * bytesPerRow; i += 4) + std::swap(srcAddr[i], srcAddr[i + 2]); + } +} + static PassRefPtr<SkImage> flipSkImageVertically(SkImage* input) { int width = input->width(); @@ -86,7 +89,7 @@ return newSkImageFromRaster(info, dstPixels.release(), input->width() * info.bytesPerPixel()); } -static PassRefPtr<StaticBitmapImage> cropImage(Image* image, const IntRect& cropRect, bool flipYEnabled, bool premultiplyAlphaEnabled, bool isBitmapAlreadyPremultiplied = true) +static PassRefPtr<StaticBitmapImage> cropImage(Image* image, const IntRect& cropRect, bool flipY, bool premultiplyAlpha, bool isBitmapPremultiplied = true) { ASSERT(image); @@ -95,7 +98,7 @@ // In the case when cropRect doesn't intersect the source image and it requires a umpremul image // We immediately return a transparent black image with cropRect.size() - if (srcRect.isEmpty() && !premultiplyAlphaEnabled) { + if (srcRect.isEmpty() && !premultiplyAlpha) { SkImageInfo info = SkImageInfo::Make(cropRect.width(), cropRect.height(), kN32_SkColorType, kUnpremul_SkAlphaType); OwnPtr<uint8_t[]> dstPixels = adoptArrayPtr(new uint8_t[cropRect.width() * cropRect.height() * info.bytesPerPixel()]()); return StaticBitmapImage::create(newSkImageFromRaster(info, dstPixels.release(), cropRect.width() * info.bytesPerPixel())); @@ -103,7 +106,7 @@ RefPtr<SkImage> skiaImage = image->imageForCurrentFrame(); // Attempt to get raw unpremultiplied image data, executed only when skiaImage is premultiplied. - if (((!premultiplyAlphaEnabled && !skiaImage->isOpaque()) || !skiaImage) && image->data() && isBitmapAlreadyPremultiplied) { + if (((!premultiplyAlpha && !skiaImage->isOpaque()) || !skiaImage) && image->data() && isBitmapPremultiplied) { // TODO(xidachen): GammaAndColorProfileApplied needs to be changed when working on color-space conversion OwnPtr<ImageDecoder> decoder(ImageDecoder::create( *(image->data()), ImageDecoder::AlphaNotPremultiplied, @@ -123,7 +126,7 @@ } if (cropRect == srcRect) { - if (flipYEnabled) + if (flipY) return StaticBitmapImage::create(flipSkImageVertically(skiaImage->newSubset(srcRect))); return StaticBitmapImage::create(adoptRef(skiaImage->newSubset(srcRect))); } @@ -139,25 +142,22 @@ if (cropRect.y() < 0) dstTop = -cropRect.y(); surface->getCanvas()->drawImage(skiaImage.get(), dstLeft, dstTop); - if (flipYEnabled) + if (flipY) skiaImage = flipSkImageVertically(surface->newImageSnapshot()); else skiaImage = adoptRef(surface->newImageSnapshot()); - if (premultiplyAlphaEnabled) + if (premultiplyAlpha) return StaticBitmapImage::create(skiaImage.release()); return StaticBitmapImage::create(premulSkImageToUnPremul(skiaImage.get())); } ImageBitmap::ImageBitmap(HTMLImageElement* image, const IntRect& cropRect, Document* document, const ImageBitmapOptions& options) { - bool imageOrientationFlipYFlag; - bool premultiplyAlphaEnabledFlag; - parseOptions(options, imageOrientationFlipYFlag, premultiplyAlphaEnabledFlag); + bool flipY; + parseOptions(options, flipY); - m_image = cropImage(image->cachedImage()->image(), cropRect, imageOrientationFlipYFlag, premultiplyAlphaEnabledFlag); + m_image = cropImage(image->cachedImage()->image(), cropRect, flipY, m_isPremultiplied); m_image->setOriginClean(!image->wouldTaintOrigin(document->securityOrigin())); - if (!premultiplyAlphaEnabledFlag) - m_isPremultiplied = false; } ImageBitmap::ImageBitmap(HTMLVideoElement* video, const IntRect& cropRect, Document* document, const ImageBitmapOptions& options) @@ -175,44 +175,90 @@ IntPoint dstPoint = IntPoint(std::max(0, -cropRect.x()), std::max(0, -cropRect.y())); video->paintCurrentFrame(buffer->canvas(), IntRect(dstPoint, srcRect.size()), nullptr); - bool imageOrientationFlipYFlag; - bool premultiplyAlphaEnabledFlag; - parseOptions(options, imageOrientationFlipYFlag, premultiplyAlphaEnabledFlag); + bool flipY; + parseOptions(options, flipY); - if (imageOrientationFlipYFlag || !premultiplyAlphaEnabledFlag) { + if (flipY || !m_isPremultiplied) { RefPtr<SkImage> skiaImage = buffer->newSkImageSnapshot(PreferNoAcceleration, SnapshotReasonUnknown); - if (imageOrientationFlipYFlag) + if (flipY) skiaImage = flipSkImageVertically(skiaImage.get()); - if (!premultiplyAlphaEnabledFlag) + if (!m_isPremultiplied) skiaImage = premulSkImageToUnPremul(skiaImage.get()); m_image = StaticBitmapImage::create(skiaImage.release()); } else { m_image = StaticBitmapImage::create(buffer->newSkImageSnapshot(PreferNoAcceleration, SnapshotReasonUnknown)); } m_image->setOriginClean(!video->wouldTaintOrigin(document->securityOrigin())); - if (!premultiplyAlphaEnabledFlag) - m_isPremultiplied = false; } ImageBitmap::ImageBitmap(HTMLCanvasElement* canvas, const IntRect& cropRect, const ImageBitmapOptions& options) { ASSERT(canvas->isPaintable()); - bool imageOrientationFlipYFlag; - bool premultiplyAlphaEnabledFlag; - parseOptions(options, imageOrientationFlipYFlag, premultiplyAlphaEnabledFlag); + bool flipY; + parseOptions(options, flipY); + // canvas is always premultiplied, so set the last parameter to true and convert to un-premul later - m_image = cropImage(canvas->copiedImage(BackBuffer, PreferAcceleration).get(), cropRect, imageOrientationFlipYFlag, true); - if (!premultiplyAlphaEnabledFlag) + m_image = cropImage(canvas->copiedImage(BackBuffer, PreferAcceleration).get(), cropRect, flipY, true); + if (!m_isPremultiplied) m_image = StaticBitmapImage::create(premulSkImageToUnPremul(m_image->imageForCurrentFrame().get())); m_image->setOriginClean(canvas->originClean()); - if (!premultiplyAlphaEnabledFlag) - m_isPremultiplied = false; } ImageBitmap::ImageBitmap(ImageData* data, const IntRect& cropRect, const ImageBitmapOptions& options) { + bool flipY; + parseOptions(options, flipY); IntRect srcRect = intersection(cropRect, IntRect(IntPoint(), data->size())); + // treat non-premultiplyAlpha as a special case + if (!m_isPremultiplied) { + unsigned char* srcAddr = data->data()->data(); + int srcHeight = data->size().height(); + int dstHeight = cropRect.height(); + // TODO (xidachen): skia doesn't support SkImage::NewRasterCopy from a kRGBA color type. + // For now, we swap R and B channel and uses kBGRA color type. + SkImageInfo info = SkImageInfo::Make(cropRect.width(), dstHeight, kBGRA_8888_SkColorType, kUnpremul_SkAlphaType); + int srcPixelBytesPerRow = info.bytesPerPixel() * data->size().width(); + int dstPixelBytesPerRow = info.bytesPerPixel() * cropRect.width(); + if (cropRect == IntRect(IntPoint(), data->size())) { + swizzleImageData(srcAddr, srcHeight, srcPixelBytesPerRow, flipY); + m_image = StaticBitmapImage::create(adoptRef(SkImage::NewRasterCopy(info, srcAddr, dstPixelBytesPerRow))); + // restore the original ImageData + swizzleImageData(srcAddr, srcHeight, srcPixelBytesPerRow, flipY); + } else { + OwnPtr<uint8_t[]> copiedDataBuffer = adoptArrayPtr(new uint8_t[dstHeight * dstPixelBytesPerRow]()); + if (!srcRect.isEmpty()) { + IntPoint srcPoint = IntPoint((cropRect.x() > 0) ? cropRect.x() : 0, (cropRect.y() > 0) ? cropRect.y() : 0); + IntPoint dstPoint = IntPoint((cropRect.x() >= 0) ? 0 : -cropRect.x(), (cropRect.y() >= 0) ? 0 : -cropRect.y()); + int copyHeight = srcHeight - srcPoint.y(); + if (cropRect.height() < copyHeight) + copyHeight = cropRect.height(); + int copyWidth = data->size().width() - srcPoint.x(); + if (cropRect.width() < copyWidth) + copyWidth = cropRect.width(); + for (int i = 0; i < copyHeight; i++) { + int srcStartCopyPosition = (i + srcPoint.y()) * srcPixelBytesPerRow + srcPoint.x() * info.bytesPerPixel(); + int srcEndCopyPosition = srcStartCopyPosition + copyWidth * info.bytesPerPixel(); + int dstStartCopyPosition; + if (flipY) + dstStartCopyPosition = (dstHeight -1 - dstPoint.y() - i) * dstPixelBytesPerRow + dstPoint.x() * info.bytesPerPixel(); + else + dstStartCopyPosition = (dstPoint.y() + i) * dstPixelBytesPerRow + dstPoint.x() * info.bytesPerPixel(); + for (int j = 0; j < srcEndCopyPosition - srcStartCopyPosition; j++) { + if (j % 4 == 0) + copiedDataBuffer[dstStartCopyPosition + j] = srcAddr[srcStartCopyPosition + j + 2]; + else if (j % 4 == 2) + copiedDataBuffer[dstStartCopyPosition + j] = srcAddr[srcStartCopyPosition + j - 2]; + else + copiedDataBuffer[dstStartCopyPosition + j] = srcAddr[srcStartCopyPosition + j]; + } + } + } + m_image = StaticBitmapImage::create(newSkImageFromRaster(info, copiedDataBuffer.release(), dstPixelBytesPerRow)); + } + return; + } + OwnPtr<ImageBuffer> buffer = ImageBuffer::create(cropRect.size(), NonOpaque, DoNotInitializeImagePixels); if (!buffer) return; @@ -228,7 +274,7 @@ if (cropRect.y() < 0) dstPoint.setY(-cropRect.y()); buffer->putByteArray(Unmultiplied, data->data()->data(), data->size(), srcRect, dstPoint); - if (options.imageOrientation() == imageOrientationFlipY) + if (flipY) m_image = StaticBitmapImage::create(flipSkImageVertically(buffer->newSkImageSnapshot(PreferNoAcceleration, SnapshotReasonUnknown).get())); else m_image = StaticBitmapImage::create(buffer->newSkImageSnapshot(PreferNoAcceleration, SnapshotReasonUnknown)); @@ -236,24 +282,18 @@ ImageBitmap::ImageBitmap(ImageBitmap* bitmap, const IntRect& cropRect, const ImageBitmapOptions& options) { - bool imageOrientationFlipYFlag; - bool premultiplyAlphaEnabledFlag; - parseOptions(options, imageOrientationFlipYFlag, premultiplyAlphaEnabledFlag); - m_image = cropImage(bitmap->bitmapImage(), cropRect, imageOrientationFlipYFlag, premultiplyAlphaEnabledFlag, bitmap->isPremultiplied()); + bool flipY; + parseOptions(options, flipY); + m_image = cropImage(bitmap->bitmapImage(), cropRect, flipY, m_isPremultiplied, bitmap->isPremultiplied()); m_image->setOriginClean(bitmap->originClean()); - if (!premultiplyAlphaEnabledFlag) - m_isPremultiplied = false; } ImageBitmap::ImageBitmap(PassRefPtr<StaticBitmapImage> image, const IntRect& cropRect, const ImageBitmapOptions& options) { - bool imageOrientationFlipYFlag; - bool premultiplyAlphaEnabledFlag; - parseOptions(options, imageOrientationFlipYFlag, premultiplyAlphaEnabledFlag); - m_image = cropImage(image.get(), cropRect, imageOrientationFlipYFlag, premultiplyAlphaEnabledFlag); + bool flipY; + parseOptions(options, flipY); + m_image = cropImage(image.get(), cropRect, flipY, m_isPremultiplied); m_image->setOriginClean(image->originClean()); - if (!premultiplyAlphaEnabledFlag) - m_isPremultiplied = false; } ImageBitmap::ImageBitmap(PassRefPtr<StaticBitmapImage> image) @@ -361,6 +401,21 @@ return ImageBitmapSource::fulfillImageBitmap(scriptState, create(this, IntRect(sx, sy, sw, sh), options)); } +void ImageBitmap::parseOptions(const ImageBitmapOptions& options, bool& flipY) +{ + if (options.imageOrientation() == imageOrientationFlipY) { + flipY = true; + } else { + flipY = false; + ASSERT(options.imageOrientation() == imageBitmapOptionNone); + } + if (options.premultiplyAlpha() == imageBitmapOptionNone) { + m_isPremultiplied = false; + } else { + ASSERT(options.premultiplyAlpha() == "default"); + } +} + PassRefPtr<Image> ImageBitmap::getSourceImageForCanvas(SourceImageStatus* status, AccelerationHint, SnapshotReason) const { *status = NormalSourceImageStatus;
diff --git a/third_party/WebKit/Source/core/frame/ImageBitmap.h b/third_party/WebKit/Source/core/frame/ImageBitmap.h index 4b0e377..1939fe0 100644 --- a/third_party/WebKit/Source/core/frame/ImageBitmap.h +++ b/third_party/WebKit/Source/core/frame/ImageBitmap.h
@@ -76,6 +76,8 @@ ImageBitmap(PassRefPtr<StaticBitmapImage>); ImageBitmap(PassRefPtr<StaticBitmapImage>, const IntRect&, const ImageBitmapOptions&); + void parseOptions(const ImageBitmapOptions&, bool&); + RefPtr<StaticBitmapImage> m_image; bool m_isNeutered = false; bool m_isPremultiplied = true;
diff --git a/third_party/WebKit/Source/core/frame/LocalFrame.cpp b/third_party/WebKit/Source/core/frame/LocalFrame.cpp index c66840f7..ca6138a 100644 --- a/third_party/WebKit/Source/core/frame/LocalFrame.cpp +++ b/third_party/WebKit/Source/core/frame/LocalFrame.cpp
@@ -97,7 +97,7 @@ class DragImageBuilder { STACK_ALLOCATED(); public: - DragImageBuilder(const LocalFrame* localFrame, const IntRect& bounds, Node* draggedNode, float opacity = 1) + DragImageBuilder(const LocalFrame* localFrame, const FloatRect& bounds, Node* draggedNode, float opacity = 1) : m_localFrame(localFrame) , m_draggedNode(draggedNode) , m_bounds(bounds) @@ -140,7 +140,7 @@ private: RawPtrWillBeMember<const LocalFrame> m_localFrame; RawPtrWillBeMember<Node> m_draggedNode; - IntRect m_bounds; + FloatRect m_bounds; float m_opacity; OwnPtr<SkPictureBuilder> m_pictureBuilder; }; @@ -631,18 +631,6 @@ return ratio; } -PassOwnPtr<DragImage> LocalFrame::paintIntoDragImage(const GlobalPaintFlags globalPaintFlags, - IntRect paintingRect, Node* draggedNode, float opacity) -{ - ASSERT(document()->isActive()); - // Not flattening compositing layers will result in a broken image being painted. - ASSERT(globalPaintFlags & GlobalPaintFlattenCompositingLayers); - - DragImageBuilder dragImageBuilder(this, paintingRect, draggedNode, opacity); - m_view->paintContents(dragImageBuilder.context(), globalPaintFlags, paintingRect); - return dragImageBuilder.createImage(); -} - PassOwnPtr<DragImage> LocalFrame::nodeImage(Node& node) { m_view->updateAllLifecyclePhases(); @@ -650,23 +638,20 @@ if (!layoutObject) return nullptr; - // Directly paint boxes as if they are a stacking context. - if (layoutObject->isBox() && layoutObject->container()) { - IntRect boundingBox = layoutObject->absoluteBoundingBoxRectIncludingDescendants(); - LayoutPoint paintOffset = boundingBox.location() - layoutObject->offsetFromContainer(layoutObject->container(), LayoutPoint()); - - DragImageBuilder dragImageBuilder(this, boundingBox, &node); - { - PaintInfo paintInfo(dragImageBuilder.context(), boundingBox, PaintPhase::PaintPhaseForeground, GlobalPaintFlattenCompositingLayers, 0); - ObjectPainter(*layoutObject).paintAsPseudoStackingContext(paintInfo, LayoutPoint(paintOffset)); - } - return dragImageBuilder.createImage(); + // Paint starting at the nearest self painting layer, clipped to the object itself. + // TODO(pdr): This will also paint the content behind the object if the object contains + // transparency but the layer is opaque. We could directly call layoutObject->paint(...) + // (see ObjectPainter::paintAsPseudoStackingContext) but this would skip self-painting children. + PaintLayer* layer = layoutObject->enclosingLayer()->enclosingSelfPaintingLayer(); + IntRect absoluteBoundingBox = layoutObject->absoluteBoundingBoxRectIncludingDescendants(); + FloatRect boundingBox = layer->layoutObject()->absoluteToLocalQuad(FloatQuad(absoluteBoundingBox), UseTransforms).boundingBox(); + DragImageBuilder dragImageBuilder(this, boundingBox, &node); + { + PaintLayerPaintingInfo paintingInfo(layer, LayoutRect(boundingBox), GlobalPaintFlattenCompositingLayers, LayoutSize(), 0); + PaintLayerFlags flags = PaintLayerHaveTransparency | PaintLayerAppliedTransform | PaintLayerUncachedClipRects; + PaintLayerPainter(*layer).paintLayer(dragImageBuilder.context(), paintingInfo, flags); } - - // TODO(pdr): This will also paint the background if the object contains transparency. We can - // directly call layoutObject->paint(...) (see: ObjectPainter::paintAsPseudoStackingContext) but - // painters are inconsistent about which transform space they expect (see: svg, inlines, etc.) - return paintIntoDragImage(GlobalPaintFlattenCompositingLayers, layoutObject->absoluteBoundingBoxRectIncludingDescendants(), &node); + return dragImageBuilder.createImage(); } PassOwnPtr<DragImage> LocalFrame::dragImageForSelection(float opacity) @@ -675,9 +660,13 @@ return nullptr; m_view->updateAllLifecyclePhases(); + ASSERT(document()->isActive()); - return paintIntoDragImage(GlobalPaintSelectionOnly | GlobalPaintFlattenCompositingLayers, - enclosingIntRect(selection().bounds()), nullptr, opacity); + FloatRect paintingRect = FloatRect(selection().bounds()); + DragImageBuilder dragImageBuilder(this, paintingRect, nullptr, opacity); + GlobalPaintFlags paintFlags = GlobalPaintSelectionOnly | GlobalPaintFlattenCompositingLayers; + m_view->paintContents(dragImageBuilder.context(), paintFlags, enclosingIntRect(paintingRect)); + return dragImageBuilder.createImage(); } String LocalFrame::selectedText() const
diff --git a/third_party/WebKit/Source/core/frame/LocalFrame.h b/third_party/WebKit/Source/core/frame/LocalFrame.h index 9288d04..71067fb04 100644 --- a/third_party/WebKit/Source/core/frame/LocalFrame.h +++ b/third_party/WebKit/Source/core/frame/LocalFrame.h
@@ -199,11 +199,6 @@ String localLayerTreeAsText(unsigned flags) const; - // Paints the area for the given rect into a DragImage. - // The rect is in the coordinate space of the frame. - PassOwnPtr<DragImage> paintIntoDragImage(const GlobalPaintFlags, - IntRect paintingRect, Node* draggedNode = nullptr, float opacity = 1); - void enableNavigation() { --m_navigationDisableCount; } void disableNavigation() { ++m_navigationDisableCount; }
diff --git a/third_party/WebKit/Source/core/html/HTMLDialogElement.h b/third_party/WebKit/Source/core/html/HTMLDialogElement.h index 4a20fcc..18baedf4 100644 --- a/third_party/WebKit/Source/core/html/HTMLDialogElement.h +++ b/third_party/WebKit/Source/core/html/HTMLDialogElement.h
@@ -49,7 +49,7 @@ // been centered and centeredPosition() is set. NeedsCentering means attempt // to center on the next layout, then set to Centered or NotCentered. enum CenteringMode { NotCentered, Centered, NeedsCentering }; - CenteringMode centeringMode() const { return m_centeringMode; } + CenteringMode getCenteringMode() const { return m_centeringMode; } LayoutUnit centeredPosition() const { ASSERT(m_centeringMode == Centered);
diff --git a/third_party/WebKit/Source/core/html/HTMLFrameOwnerElement.cpp b/third_party/WebKit/Source/core/html/HTMLFrameOwnerElement.cpp index fea3be7..36205fb2 100644 --- a/third_party/WebKit/Source/core/html/HTMLFrameOwnerElement.cpp +++ b/third_party/WebKit/Source/core/html/HTMLFrameOwnerElement.cpp
@@ -29,6 +29,7 @@ #include "core/frame/FrameView.h" #include "core/frame/LocalFrame.h" #include "core/layout/LayoutPart.h" +#include "core/layout/api/LayoutPartItem.h" #include "core/loader/FrameLoadRequest.h" #include "core/loader/FrameLoader.h" #include "core/loader/FrameLoaderClient.h" @@ -240,15 +241,16 @@ m_widget = widget; LayoutPart* layoutPart = toLayoutPart(layoutObject()); - if (!layoutPart) + LayoutPartItem layoutPartItem = LayoutPartItem(layoutPart); + if (layoutPartItem.isNull()) return; if (m_widget) { - layoutPart->updateOnWidgetChange(); + layoutPartItem.updateOnWidgetChange(); - ASSERT(document().view() == layoutPart->frameView()); - ASSERT(layoutPart->frameView()); - moveWidgetToParentSoon(m_widget.get(), layoutPart->frameView()); + ASSERT(document().view() == layoutPartItem.frameView()); + ASSERT(layoutPartItem.frameView()); + moveWidgetToParentSoon(m_widget.get(), layoutPartItem.frameView()); } if (AXObjectCache* cache = document().existingAXObjectCache())
diff --git a/third_party/WebKit/Source/core/html/HTMLKeygenElement.cpp b/third_party/WebKit/Source/core/html/HTMLKeygenElement.cpp index 32a05a1..90b3c40 100644 --- a/third_party/WebKit/Source/core/html/HTMLKeygenElement.cpp +++ b/third_party/WebKit/Source/core/html/HTMLKeygenElement.cpp
@@ -29,7 +29,7 @@ #include "core/dom/Document.h" #include "core/dom/Text.h" #include "core/dom/shadow/ShadowRoot.h" -#include "core/frame/UseCounter.h" +#include "core/frame/Deprecation.h" #include "core/html/FormData.h" #include "core/html/HTMLOptionElement.h" #include "core/html/HTMLSelectElement.h" @@ -49,7 +49,7 @@ HTMLKeygenElement::HTMLKeygenElement(Document& document, HTMLFormElement* form) : HTMLFormControlElementWithState(keygenTag, document, form) { - UseCounter::count(document, UseCounter::HTMLKeygenElement); + Deprecation::countDeprecation(document, UseCounter::HTMLKeygenElement); if (document.frame()) document.frame()->loader().client()->didUseKeygen(); }
diff --git a/third_party/WebKit/Source/core/html/HTMLLinkElement.cpp b/third_party/WebKit/Source/core/html/HTMLLinkElement.cpp index 4ca2d1f..7e165f6 100644 --- a/third_party/WebKit/Source/core/html/HTMLLinkElement.cpp +++ b/third_party/WebKit/Source/core/html/HTMLLinkElement.cpp
@@ -444,9 +444,9 @@ return fastHasAttribute(HTMLNames::asyncAttr); } -IconType HTMLLinkElement::iconType() const +IconType HTMLLinkElement::getIconType() const { - return m_relAttribute.iconType(); + return m_relAttribute.getIconType(); } const Vector<IntSize>& HTMLLinkElement::iconSizes() const @@ -707,7 +707,7 @@ String as = m_owner->asValue().lower(); LinkRequestBuilder builder(m_owner); - if (m_owner->relAttribute().iconType() != InvalidIcon && builder.url().isValid() && !builder.url().isEmpty()) { + if (m_owner->relAttribute().getIconType() != InvalidIcon && builder.url().isValid() && !builder.url().isEmpty()) { if (!m_owner->shouldLoadLink()) return; if (!document().securityOrigin()->canDisplay(builder.url())) @@ -715,7 +715,7 @@ if (!document().contentSecurityPolicy()->allowImageFromSource(builder.url())) return; if (document().frame() && document().frame()->loader().client()) - document().frame()->loader().client()->dispatchDidChangeIcons(m_owner->relAttribute().iconType()); + document().frame()->loader().client()->dispatchDidChangeIcons(m_owner->relAttribute().getIconType()); } if (!m_owner->loadLink(type, as, builder.url()))
diff --git a/third_party/WebKit/Source/core/html/HTMLLinkElement.h b/third_party/WebKit/Source/core/html/HTMLLinkElement.h index d42bf50..cb89768 100644 --- a/third_party/WebKit/Source/core/html/HTMLLinkElement.h +++ b/third_party/WebKit/Source/core/html/HTMLLinkElement.h
@@ -65,7 +65,7 @@ explicit LinkStyle(HTMLLinkElement* owner); ~LinkStyle() override; - Type type() const override { return Style; } + LinkResourceType type() const override { return Style; } void process() override; void ownerRemoved() override; bool hasLoaded() const override { return m_loadedSheet; } @@ -146,7 +146,7 @@ const AtomicString& type() const; - IconType iconType() const; + IconType getIconType() const; // the icon sizes as parsed from the HTML attribute const Vector<IntSize>& iconSizes() const;
diff --git a/third_party/WebKit/Source/core/html/HTMLMediaElement.cpp b/third_party/WebKit/Source/core/html/HTMLMediaElement.cpp index 8808be2..19238e2 100644 --- a/third_party/WebKit/Source/core/html/HTMLMediaElement.cpp +++ b/third_party/WebKit/Source/core/html/HTMLMediaElement.cpp
@@ -1151,8 +1151,8 @@ // in the disabled state when the element's resource selection algorithm last started now // have a text track readiness state of loaded or failed to load. for (unsigned i = 0; i < m_textTracksWhenResourceSelectionBegan.size(); ++i) { - if (m_textTracksWhenResourceSelectionBegan[i]->readinessState() == TextTrack::Loading - || m_textTracksWhenResourceSelectionBegan[i]->readinessState() == TextTrack::NotLoaded) + if (m_textTracksWhenResourceSelectionBegan[i]->getReadinessState() == TextTrack::Loading + || m_textTracksWhenResourceSelectionBegan[i]->getReadinessState() == TextTrack::NotLoaded) return false; } @@ -1162,13 +1162,13 @@ void HTMLMediaElement::textTrackReadyStateChanged(TextTrack* track) { if (webMediaPlayer()&& m_textTracksWhenResourceSelectionBegan.contains(track)) { - if (track->readinessState() != TextTrack::Loading) - setReadyState(static_cast<ReadyState>(webMediaPlayer()->readyState())); + if (track->getReadinessState() != TextTrack::Loading) + setReadyState(static_cast<ReadyState>(webMediaPlayer()->getReadyState())); } else { // The track readiness state might have changed as a result of the user // clicking the captions button. In this case, a check whether all the // resources have failed loading should be done in order to hide the CC button. - if (mediaControls() && track->readinessState() == TextTrack::FailedToLoad) + if (mediaControls() && track->getReadinessState() == TextTrack::FailedToLoad) mediaControls()->refreshClosedCaptionsButtonVisibility(); } } @@ -1328,7 +1328,7 @@ void HTMLMediaElement::networkStateChanged() { - setNetworkState(webMediaPlayer()->networkState()); + setNetworkState(webMediaPlayer()->getNetworkState()); } void HTMLMediaElement::mediaLoadingFailed(WebMediaPlayer::NetworkState error) @@ -1428,7 +1428,7 @@ void HTMLMediaElement::readyStateChanged() { - setReadyState(static_cast<ReadyState>(webMediaPlayer()->readyState())); + setReadyState(static_cast<ReadyState>(webMediaPlayer()->getReadyState())); } void HTMLMediaElement::setReadyState(ReadyState state) @@ -1713,7 +1713,7 @@ Platform::current()->recordAction(UserMetricsAction("Media_Seeked")); } -HTMLMediaElement::ReadyState HTMLMediaElement::readyState() const +HTMLMediaElement::ReadyState HTMLMediaElement::getReadyState() const { return m_readyState; } @@ -3213,7 +3213,7 @@ if (m_textTracks) { for (unsigned i = 0; i < m_textTracks->length(); ++i) { TextTrack* track = m_textTracks->anonymousIndexedGetter(i); - if (track->readinessState() == TextTrack::FailedToLoad) + if (track->getReadinessState() == TextTrack::FailedToLoad) continue; if (track->kind() == TextTrack::captionsKeyword()
diff --git a/third_party/WebKit/Source/core/html/HTMLMediaElement.h b/third_party/WebKit/Source/core/html/HTMLMediaElement.h index f2a10fc..d922e176 100644 --- a/third_party/WebKit/Source/core/html/HTMLMediaElement.h +++ b/third_party/WebKit/Source/core/html/HTMLMediaElement.h
@@ -123,7 +123,7 @@ // ready state enum ReadyState { HAVE_NOTHING, HAVE_METADATA, HAVE_CURRENT_DATA, HAVE_FUTURE_DATA, HAVE_ENOUGH_DATA }; - ReadyState readyState() const; + ReadyState getReadyState() const; bool seeking() const; // playback state @@ -275,7 +275,7 @@ virtual KURL posterImageURL() const { return KURL(); } enum DisplayMode { Unknown, Poster, Video }; - DisplayMode displayMode() const { return m_displayMode; } + DisplayMode getDisplayMode() const { return m_displayMode; } virtual void setDisplayMode(DisplayMode mode) { m_displayMode = mode; } private:
diff --git a/third_party/WebKit/Source/core/html/HTMLMediaElement.idl b/third_party/WebKit/Source/core/html/HTMLMediaElement.idl index 297f2a08..80899b4 100644 --- a/third_party/WebKit/Source/core/html/HTMLMediaElement.idl +++ b/third_party/WebKit/Source/core/html/HTMLMediaElement.idl
@@ -55,7 +55,7 @@ const unsigned short HAVE_CURRENT_DATA = 2; const unsigned short HAVE_FUTURE_DATA = 3; const unsigned short HAVE_ENOUGH_DATA = 4; - readonly attribute unsigned short readyState; + [ImplementedAs=getReadyState] readonly attribute unsigned short readyState; readonly attribute boolean seeking; // playback state
diff --git a/third_party/WebKit/Source/core/html/HTMLTrackElement.cpp b/third_party/WebKit/Source/core/html/HTMLTrackElement.cpp index cdd1a26..290faf5 100644 --- a/third_party/WebKit/Source/core/html/HTMLTrackElement.cpp +++ b/third_party/WebKit/Source/core/html/HTMLTrackElement.cpp
@@ -307,9 +307,9 @@ return parent->textTrackReadyStateChanged(m_track.get()); } -HTMLTrackElement::ReadyState HTMLTrackElement::readyState() +HTMLTrackElement::ReadyState HTMLTrackElement::getReadyState() { - return static_cast<ReadyState>(ensureTrack()->readinessState()); + return static_cast<ReadyState>(ensureTrack()->getReadinessState()); } const AtomicString& HTMLTrackElement::mediaElementCrossOriginAttribute() const
diff --git a/third_party/WebKit/Source/core/html/HTMLTrackElement.h b/third_party/WebKit/Source/core/html/HTMLTrackElement.h index 8d1d1990..0d3d01b 100644 --- a/third_party/WebKit/Source/core/html/HTMLTrackElement.h +++ b/third_party/WebKit/Source/core/html/HTMLTrackElement.h
@@ -50,7 +50,7 @@ LOADED = 2, TRACK_ERROR = 3 }; - ReadyState readyState(); + ReadyState getReadyState(); void scheduleLoad(); TextTrack* track();
diff --git a/third_party/WebKit/Source/core/html/HTMLTrackElement.idl b/third_party/WebKit/Source/core/html/HTMLTrackElement.idl index 8a9b38e..08b3f14b 100644 --- a/third_party/WebKit/Source/core/html/HTMLTrackElement.idl +++ b/third_party/WebKit/Source/core/html/HTMLTrackElement.idl
@@ -37,7 +37,7 @@ const unsigned short LOADED = 2; // Reflect is used for ERROR because it conflicts with a windows define. [Reflect=TRACK_ERROR] const unsigned short ERROR = 3; - readonly attribute unsigned short readyState; + [ImplementedAs=getReadyState] readonly attribute unsigned short readyState; readonly attribute TextTrack track; };
diff --git a/third_party/WebKit/Source/core/html/HTMLVideoElement.cpp b/third_party/WebKit/Source/core/html/HTMLVideoElement.cpp index a89cc598..05a165b0 100644 --- a/third_party/WebKit/Source/core/html/HTMLVideoElement.cpp +++ b/third_party/WebKit/Source/core/html/HTMLVideoElement.cpp
@@ -118,7 +118,7 @@ if (name == posterAttr) { // In case the poster attribute is set after playback, don't update the // display state, post playback the correct state will be picked up. - if (displayMode() < Video || !hasAvailableVideoFrame()) { + if (getDisplayMode() < Video || !hasAvailableVideoFrame()) { // Force a poster recalc by setting m_displayMode to Unknown directly before calling updateDisplayState. HTMLMediaElement::setDisplayMode(Unknown); updateDisplayState(); @@ -168,7 +168,7 @@ void HTMLVideoElement::setDisplayMode(DisplayMode mode) { - DisplayMode oldMode = displayMode(); + DisplayMode oldMode = getDisplayMode(); KURL poster = posterImageURL(); if (!poster.isEmpty()) { @@ -182,7 +182,7 @@ HTMLMediaElement::setDisplayMode(mode); - if (layoutObject() && displayMode() != oldMode) + if (layoutObject() && getDisplayMode() != oldMode) layoutObject()->updateFromElement(); } @@ -190,7 +190,7 @@ { if (posterImageURL().isEmpty()) setDisplayMode(Video); - else if (displayMode() < Poster) + else if (getDisplayMode() < Poster) setDisplayMode(Poster); } @@ -221,7 +221,7 @@ if (!webMediaPlayer()) return false; - return webMediaPlayer()->hasVideo() && webMediaPlayer()->readyState() >= WebMediaPlayer::ReadyStateHaveCurrentData; + return webMediaPlayer()->hasVideo() && webMediaPlayer()->getReadyState() >= WebMediaPlayer::ReadyStateHaveCurrentData; } void HTMLVideoElement::webkitEnterFullscreen() @@ -333,7 +333,7 @@ exceptionState.throwDOMException(InvalidStateError, "The provided element has not retrieved data."); return ScriptPromise(); } - if (readyState() <= HTMLMediaElement::HAVE_METADATA) { + if (getReadyState() <= HTMLMediaElement::HAVE_METADATA) { exceptionState.throwDOMException(InvalidStateError, "The provided element's player has no current data."); return ScriptPromise(); }
diff --git a/third_party/WebKit/Source/core/html/HTMLVideoElement.h b/third_party/WebKit/Source/core/html/HTMLVideoElement.h index 71811fd9..9f0fa8ec 100644 --- a/third_party/WebKit/Source/core/html/HTMLVideoElement.h +++ b/third_party/WebKit/Source/core/html/HTMLVideoElement.h
@@ -73,7 +73,7 @@ // Used by WebGL to do GPU-GPU textures copy if possible. bool copyVideoTextureToPlatformTexture(WebGraphicsContext3D*, Platform3DObject texture, GLenum internalFormat, GLenum type, bool premultiplyAlpha, bool flipY); - bool shouldDisplayPosterImage() const { return displayMode() == Poster; } + bool shouldDisplayPosterImage() const { return getDisplayMode() == Poster; } bool hasAvailableVideoFrame() const;
diff --git a/third_party/WebKit/Source/core/html/HTMLVideoElementTest.cpp b/third_party/WebKit/Source/core/html/HTMLVideoElementTest.cpp index b5ed951b..47686fe 100644 --- a/third_party/WebKit/Source/core/html/HTMLVideoElementTest.cpp +++ b/third_party/WebKit/Source/core/html/HTMLVideoElementTest.cpp
@@ -38,8 +38,8 @@ bool seeking() const override { return false; }; double duration() const override { return 0.0; }; double currentTime() const override { return 0.0; }; - NetworkState networkState() const override { return NetworkStateEmpty; }; - ReadyState readyState() const override { return ReadyStateHaveNothing; }; + NetworkState getNetworkState() const override { return NetworkStateEmpty; }; + ReadyState getReadyState() const override { return ReadyStateHaveNothing; }; bool didLoadingProgress() override { return false; }; bool hasSingleSecurityOrigin() const override { return true; }; bool didPassCORSAccessCheck() const override { return true; };
diff --git a/third_party/WebKit/Source/core/html/LinkManifest.h b/third_party/WebKit/Source/core/html/LinkManifest.h index 7fbcc1c..1b0a70b 100644 --- a/third_party/WebKit/Source/core/html/LinkManifest.h +++ b/third_party/WebKit/Source/core/html/LinkManifest.h
@@ -24,7 +24,7 @@ // LinkResource void process() override; - Type type() const override { return Manifest; } + LinkResourceType type() const override { return Manifest; } bool hasLoaded() const override; void ownerRemoved() override;
diff --git a/third_party/WebKit/Source/core/html/LinkRelAttribute.h b/third_party/WebKit/Source/core/html/LinkRelAttribute.h index b3e5d1c..5230d3a 100644 --- a/third_party/WebKit/Source/core/html/LinkRelAttribute.h +++ b/third_party/WebKit/Source/core/html/LinkRelAttribute.h
@@ -45,7 +45,7 @@ explicit LinkRelAttribute(const String& = ""); bool isStyleSheet() const { return m_isStyleSheet; } - IconType iconType() const { return m_iconType; } + IconType getIconType() const { return m_iconType; } bool isAlternate() const { return m_isAlternate; } bool isDNSPrefetch() const { return m_isDNSPrefetch; } bool isPreconnect() const { return m_isPreconnect; }
diff --git a/third_party/WebKit/Source/core/html/LinkRelAttributeTest.cpp b/third_party/WebKit/Source/core/html/LinkRelAttributeTest.cpp index 7139d03..16c68cc 100644 --- a/third_party/WebKit/Source/core/html/LinkRelAttributeTest.cpp +++ b/third_party/WebKit/Source/core/html/LinkRelAttributeTest.cpp
@@ -40,7 +40,7 @@ { LinkRelAttribute linkRelAttribute(value); ASSERT_EQ(isStyleSheet, linkRelAttribute.isStyleSheet()) << value.utf8().data(); - ASSERT_EQ(iconType, linkRelAttribute.iconType()) << value.utf8().data(); + ASSERT_EQ(iconType, linkRelAttribute.getIconType()) << value.utf8().data(); ASSERT_EQ(isAlternate, linkRelAttribute.isAlternate()) << value.utf8().data(); ASSERT_EQ(isDNSPrefetch, linkRelAttribute.isDNSPrefetch()) << value.utf8().data(); ASSERT_EQ(isLinkPrerender, linkRelAttribute.isLinkPrerender()) << value.utf8().data();
diff --git a/third_party/WebKit/Source/core/html/LinkResource.h b/third_party/WebKit/Source/core/html/LinkResource.h index e38203f..7599d92 100644 --- a/third_party/WebKit/Source/core/html/LinkResource.h +++ b/third_party/WebKit/Source/core/html/LinkResource.h
@@ -44,7 +44,7 @@ class LinkResource : public NoBaseWillBeGarbageCollectedFinalized<LinkResource> { WTF_MAKE_NONCOPYABLE(LinkResource); USING_FAST_MALLOC_WILL_BE_REMOVED(LinkResource); public: - enum Type { + enum LinkResourceType { Style, Import, Manifest @@ -56,7 +56,7 @@ bool shouldLoadResource() const; LocalFrame* loadingFrame() const; - virtual Type type() const = 0; + virtual LinkResourceType type() const = 0; virtual void process() = 0; virtual void ownerRemoved() { } virtual void ownerInserted() { }
diff --git a/third_party/WebKit/Source/core/html/MediaError.h b/third_party/WebKit/Source/core/html/MediaError.h index 65bcb0f..52048859 100644 --- a/third_party/WebKit/Source/core/html/MediaError.h +++ b/third_party/WebKit/Source/core/html/MediaError.h
@@ -35,26 +35,26 @@ class CORE_EXPORT MediaError final : public GarbageCollected<MediaError>, public ScriptWrappable { DEFINE_WRAPPERTYPEINFO(); public: - enum Code { + enum ErrorCode { MEDIA_ERR_ABORTED = 1, MEDIA_ERR_NETWORK, MEDIA_ERR_DECODE, MEDIA_ERR_SRC_NOT_SUPPORTED, }; - static MediaError* create(Code code) + static MediaError* create(ErrorCode code) { return new MediaError(code); } - Code code() const { return m_code; } + ErrorCode code() const { return m_code; } DEFINE_INLINE_TRACE() { } private: - MediaError(Code code) : m_code(code) { } + MediaError(ErrorCode code) : m_code(code) { } - Code m_code; + ErrorCode m_code; }; } // namespace blink
diff --git a/third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.cpp b/third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.cpp index 97655a8..2d3ead5 100644 --- a/third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.cpp +++ b/third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.cpp
@@ -5,7 +5,6 @@ #include "CanvasAsyncBlobCreator.h" #include "core/fileapi/Blob.h" -#include "platform/Task.h" #include "platform/ThreadSafeFunctional.h" #include "platform/graphics/ImageBuffer.h" #include "platform/heap/Handle.h"
diff --git a/third_party/WebKit/Source/core/html/imports/LinkImport.h b/third_party/WebKit/Source/core/html/imports/LinkImport.h index 926c5e6..028674bb4 100644 --- a/third_party/WebKit/Source/core/html/imports/LinkImport.h +++ b/third_party/WebKit/Source/core/html/imports/LinkImport.h
@@ -57,7 +57,7 @@ // LinkResource void process() override; - Type type() const override { return Import; } + LinkResourceType type() const override { return Import; } bool hasLoaded() const override; DECLARE_VIRTUAL_TRACE(); void ownerInserted() override;
diff --git a/third_party/WebKit/Source/core/html/parser/AtomicHTMLToken.h b/third_party/WebKit/Source/core/html/parser/AtomicHTMLToken.h index b5284b5..a01298e 100644 --- a/third_party/WebKit/Source/core/html/parser/AtomicHTMLToken.h +++ b/third_party/WebKit/Source/core/html/parser/AtomicHTMLToken.h
@@ -47,7 +47,7 @@ return m_doctypeData->m_forceQuirks; } - HTMLToken::Type type() const { return m_type; } + HTMLToken::TokenType type() const { return m_type; } const AtomicString& name() const { @@ -182,13 +182,13 @@ } } - explicit AtomicHTMLToken(HTMLToken::Type type) + explicit AtomicHTMLToken(HTMLToken::TokenType type) : m_type(type) , m_selfClosing(false) { } - AtomicHTMLToken(HTMLToken::Type type, const AtomicString& name, const Vector<Attribute>& attributes = Vector<Attribute>()) + AtomicHTMLToken(HTMLToken::TokenType type, const AtomicString& name, const Vector<Attribute>& attributes = Vector<Attribute>()) : m_type(type) , m_name(name) , m_selfClosing(false) @@ -198,7 +198,7 @@ } private: - HTMLToken::Type m_type; + HTMLToken::TokenType m_type; void initializeAttributes(const HTMLToken::AttributeList& attributes); QualifiedName nameForAttribute(const HTMLToken::Attribute&) const;
diff --git a/third_party/WebKit/Source/core/html/parser/BackgroundHTMLParser.cpp b/third_party/WebKit/Source/core/html/parser/BackgroundHTMLParser.cpp index ceca5de..0a7c3688 100644 --- a/third_party/WebKit/Source/core/html/parser/BackgroundHTMLParser.cpp +++ b/third_party/WebKit/Source/core/html/parser/BackgroundHTMLParser.cpp
@@ -29,7 +29,6 @@ #include "core/html/parser/HTMLDocumentParser.h" #include "core/html/parser/TextResourceDecoder.h" #include "core/html/parser/XSSAuditor.h" -#include "platform/Task.h" #include "platform/ThreadSafeFunctional.h" #include "public/platform/Platform.h" #include "public/platform/WebTaskRunner.h" @@ -284,7 +283,7 @@ OwnPtr<HTMLDocumentParser::ParsedChunk> chunk = adoptPtr(new HTMLDocumentParser::ParsedChunk); chunk->preloads.swap(m_pendingPreloads); chunk->xssInfos.swap(m_pendingXSSInfos); - chunk->tokenizerState = m_tokenizer->state(); + chunk->tokenizerState = m_tokenizer->getState(); chunk->treeBuilderState = m_treeBuilderSimulator.state(); chunk->inputCheckpoint = m_input.createCheckpoint(m_pendingTokens->size()); chunk->preloadScannerCheckpoint = m_preloadScanner->createCheckpoint(); @@ -296,7 +295,7 @@ if (isEmpty) { m_loadingTaskRunner->postTask( BLINK_FROM_HERE, - new Task(threadSafeBind(&HTMLDocumentParser::notifyPendingParsedChunks, AllowCrossThreadAccess(m_parser)))); + threadSafeBind(&HTMLDocumentParser::notifyPendingParsedChunks, AllowCrossThreadAccess(m_parser))); } m_pendingTokens = adoptPtr(new CompactHTMLTokenStream);
diff --git a/third_party/WebKit/Source/core/html/parser/CompactHTMLToken.h b/third_party/WebKit/Source/core/html/parser/CompactHTMLToken.h index 756e19e..ead1df90 100644 --- a/third_party/WebKit/Source/core/html/parser/CompactHTMLToken.h +++ b/third_party/WebKit/Source/core/html/parser/CompactHTMLToken.h
@@ -65,7 +65,7 @@ bool isSafeToSendToAnotherThread() const; - HTMLToken::Type type() const { return static_cast<HTMLToken::Type>(m_type); } + HTMLToken::TokenType type() const { return static_cast<HTMLToken::TokenType>(m_type); } const String& data() const { return m_data; } bool selfClosing() const { return m_selfClosing; } bool isAll8BitData() const { return m_isAll8BitData; }
diff --git a/third_party/WebKit/Source/core/html/parser/HTMLDocumentParser.cpp b/third_party/WebKit/Source/core/html/parser/HTMLDocumentParser.cpp index a353983..5b95df72 100644 --- a/third_party/WebKit/Source/core/html/parser/HTMLDocumentParser.cpp +++ b/third_party/WebKit/Source/core/html/parser/HTMLDocumentParser.cpp
@@ -430,7 +430,7 @@ // speculation buffer in other states, but we'd likely need to do something more // sophisticated with the HTMLToken. if (chunk->tokenizerState == HTMLTokenizer::DataState - && tokenizer->state() == HTMLTokenizer::DataState + && tokenizer->getState() == HTMLTokenizer::DataState && m_input.current().isEmpty() && chunk->treeBuilderState == HTMLTreeBuilderSimulator::stateFor(m_treeBuilder.get())) { ASSERT(token->isUninitialized()); @@ -680,7 +680,7 @@ RELEASE_ASSERT(!isStopped()); if (isWaitingForScripts()) { - ASSERT(m_tokenizer->state() == HTMLTokenizer::DataState); + ASSERT(m_tokenizer->getState() == HTMLTokenizer::DataState); ASSERT(m_preloader); // TODO(kouhei): m_preloader should be always available for synchronous parsing case,
diff --git a/third_party/WebKit/Source/core/html/parser/HTMLParserThread.cpp b/third_party/WebKit/Source/core/html/parser/HTMLParserThread.cpp index c7885d4..bdc05560 100644 --- a/third_party/WebKit/Source/core/html/parser/HTMLParserThread.cpp +++ b/third_party/WebKit/Source/core/html/parser/HTMLParserThread.cpp
@@ -30,7 +30,6 @@ #include "core/html/parser/HTMLParserThread.h" -#include "platform/Task.h" #include "platform/ThreadSafeFunctional.h" #include "platform/WaitableEvent.h" #include "platform/heap/SafePoint.h" @@ -103,7 +102,7 @@ void HTMLParserThread::postTask(PassOwnPtr<Closure> closure) { - platformThread().taskRunner()->postTask(BLINK_FROM_HERE, new Task(closure)); + platformThread().taskRunner()->postTask(BLINK_FROM_HERE, closure); } } // namespace blink
diff --git a/third_party/WebKit/Source/core/html/parser/HTMLPreloadScanner.cpp b/third_party/WebKit/Source/core/html/parser/HTMLPreloadScanner.cpp index 7e3ec7d..ffa9a44 100644 --- a/third_party/WebKit/Source/core/html/parser/HTMLPreloadScanner.cpp +++ b/third_party/WebKit/Source/core/html/parser/HTMLPreloadScanner.cpp
@@ -276,7 +276,7 @@ setUrlToLoad(attributeValue, DisallowURLReplacement); } else if (match(attributeName, relAttr)) { LinkRelAttribute rel(attributeValue); - m_linkIsStyleSheet = rel.isStyleSheet() && !rel.isAlternate() && rel.iconType() == InvalidIcon && !rel.isDNSPrefetch(); + m_linkIsStyleSheet = rel.isStyleSheet() && !rel.isAlternate() && rel.getIconType() == InvalidIcon && !rel.isDNSPrefetch(); m_linkIsPreconnect = rel.isPreconnect(); m_linkIsPreload = rel.isLinkPreload(); m_linkIsImport = rel.isImport();
diff --git a/third_party/WebKit/Source/core/html/parser/HTMLToken.h b/third_party/WebKit/Source/core/html/parser/HTMLToken.h index 5e52db8..320f0cb7 100644 --- a/third_party/WebKit/Source/core/html/parser/HTMLToken.h +++ b/third_party/WebKit/Source/core/html/parser/HTMLToken.h
@@ -65,7 +65,7 @@ WTF_MAKE_NONCOPYABLE(HTMLToken); USING_FAST_MALLOC(HTMLToken); public: - enum Type { + enum TokenType { Uninitialized, DOCTYPE, StartTag, @@ -135,7 +135,7 @@ } bool isUninitialized() { return m_type == Uninitialized; } - Type type() const { return m_type; } + TokenType type() const { return m_type; } void makeEndOfFile() { @@ -459,7 +459,7 @@ } private: - Type m_type; + TokenType m_type; Attribute::Range m_range; // Always starts at zero. int m_baseOffset; DataVector m_data;
diff --git a/third_party/WebKit/Source/core/html/parser/HTMLTokenizer.h b/third_party/WebKit/Source/core/html/parser/HTMLTokenizer.h index 1612d20..09335ac 100644 --- a/third_party/WebKit/Source/core/html/parser/HTMLTokenizer.h +++ b/third_party/WebKit/Source/core/html/parser/HTMLTokenizer.h
@@ -161,7 +161,7 @@ bool shouldAllowCDATA() const { return m_shouldAllowCDATA; } void setShouldAllowCDATA(bool value) { m_shouldAllowCDATA = value; } - State state() const { return m_state; } + State getState() const { return m_state; } void setState(State state) { m_state = state; } inline bool shouldSkipNullCharacters() const
diff --git a/third_party/WebKit/Source/core/html/parser/HTMLTreeBuilder.cpp b/third_party/WebKit/Source/core/html/parser/HTMLTreeBuilder.cpp index 39b2b1f8..2ce0a69 100644 --- a/third_party/WebKit/Source/core/html/parser/HTMLTreeBuilder.cpp +++ b/third_party/WebKit/Source/core/html/parser/HTMLTreeBuilder.cpp
@@ -983,7 +983,7 @@ // http://www.whatwg.org/specs/web-apps/current-work/multipage/tokenization.html#close-the-cell void HTMLTreeBuilder::closeTheCell() { - ASSERT(insertionMode() == InCellMode); + ASSERT(getInsertionMode() == InCellMode); if (m_tree.openElements()->inTableScope(tdTag)) { ASSERT(!m_tree.openElements()->inTableScope(thTag)); processFakeEndTag(tdTag); @@ -991,7 +991,7 @@ } ASSERT(m_tree.openElements()->inTableScope(thTag)); processFakeEndTag(thTag); - ASSERT(insertionMode() == InRowMode); + ASSERT(getInsertionMode() == InRowMode); } void HTMLTreeBuilder::processStartTagForInTable(AtomicHTMLToken* token) @@ -1025,7 +1025,7 @@ if (isTableCellContextTag(token->name()) || token->name() == trTag) { processFakeStartTag(tbodyTag); - ASSERT(insertionMode() == InTableBodyMode); + ASSERT(getInsertionMode() == InTableBodyMode); processStartTag(token); return; } @@ -1071,13 +1071,13 @@ void HTMLTreeBuilder::processStartTag(AtomicHTMLToken* token) { ASSERT(token->type() == HTMLToken::StartTag); - switch (insertionMode()) { + switch (getInsertionMode()) { case InitialMode: - ASSERT(insertionMode() == InitialMode); + ASSERT(getInsertionMode() == InitialMode); defaultForInitial(); // Fall through. case BeforeHTMLMode: - ASSERT(insertionMode() == BeforeHTMLMode); + ASSERT(getInsertionMode() == BeforeHTMLMode); if (token->name() == htmlTag) { m_tree.insertHTMLHtmlStartTagBeforeHTML(token); setInsertionMode(BeforeHeadMode); @@ -1086,7 +1086,7 @@ defaultForBeforeHTML(); // Fall through. case BeforeHeadMode: - ASSERT(insertionMode() == BeforeHeadMode); + ASSERT(getInsertionMode() == BeforeHeadMode); if (token->name() == htmlTag) { processHtmlStartTagForInBody(token); return; @@ -1099,13 +1099,13 @@ defaultForBeforeHead(); // Fall through. case InHeadMode: - ASSERT(insertionMode() == InHeadMode); + ASSERT(getInsertionMode() == InHeadMode); if (processStartTagForInHead(token)) return; defaultForInHead(); // Fall through. case AfterHeadMode: - ASSERT(insertionMode() == AfterHeadMode); + ASSERT(getInsertionMode() == AfterHeadMode); if (token->name() == htmlTag) { processHtmlStartTagForInBody(token); return; @@ -1145,15 +1145,15 @@ defaultForAfterHead(); // Fall through case InBodyMode: - ASSERT(insertionMode() == InBodyMode); + ASSERT(getInsertionMode() == InBodyMode); processStartTagForInBody(token); break; case InTableMode: - ASSERT(insertionMode() == InTableMode); + ASSERT(getInsertionMode() == InTableMode); processStartTagForInTable(token); break; case InCaptionMode: - ASSERT(insertionMode() == InCaptionMode); + ASSERT(getInsertionMode() == InCaptionMode); if (isCaptionColOrColgroupTag(token->name()) || isTableBodyContextTag(token->name()) || isTableCellContextTag(token->name()) @@ -1169,7 +1169,7 @@ processStartTagForInBody(token); break; case InColumnGroupMode: - ASSERT(insertionMode() == InColumnGroupMode); + ASSERT(getInsertionMode() == InColumnGroupMode); if (token->name() == htmlTag) { processHtmlStartTagForInBody(token); return; @@ -1189,7 +1189,7 @@ processStartTag(token); break; case InTableBodyMode: - ASSERT(insertionMode() == InTableBodyMode); + ASSERT(getInsertionMode() == InTableBodyMode); if (token->name() == trTag) { m_tree.openElements()->popUntilTableBodyScopeMarker(); // How is there ever anything to pop? m_tree.insertHTMLElement(token); @@ -1199,7 +1199,7 @@ if (isTableCellContextTag(token->name())) { parseError(token); processFakeStartTag(trTag); - ASSERT(insertionMode() == InRowMode); + ASSERT(getInsertionMode() == InRowMode); processStartTag(token); return; } @@ -1219,7 +1219,7 @@ processStartTagForInTable(token); break; case InRowMode: - ASSERT(insertionMode() == InRowMode); + ASSERT(getInsertionMode() == InRowMode); if (isTableCellContextTag(token->name())) { m_tree.openElements()->popUntilTableRowScopeMarker(); m_tree.insertHTMLElement(token); @@ -1234,14 +1234,14 @@ ASSERT(isParsingFragmentOrTemplateContents()); return; } - ASSERT(insertionMode() == InTableBodyMode); + ASSERT(getInsertionMode() == InTableBodyMode); processStartTag(token); return; } processStartTagForInTable(token); break; case InCellMode: - ASSERT(insertionMode() == InCellMode); + ASSERT(getInsertionMode() == InCellMode); if (isCaptionColOrColgroupTag(token->name()) || isTableCellContextTag(token->name()) || token->name() == trTag @@ -1260,7 +1260,7 @@ break; case AfterBodyMode: case AfterAfterBodyMode: - ASSERT(insertionMode() == AfterBodyMode || insertionMode() == AfterAfterBodyMode); + ASSERT(getInsertionMode() == AfterBodyMode || getInsertionMode() == AfterAfterBodyMode); if (token->name() == htmlTag) { processHtmlStartTagForInBody(token); return; @@ -1269,7 +1269,7 @@ processStartTag(token); break; case InHeadNoscriptMode: - ASSERT(insertionMode() == InHeadNoscriptMode); + ASSERT(getInsertionMode() == InHeadNoscriptMode); if (token->name() == htmlTag) { processHtmlStartTagForInBody(token); return; @@ -1292,7 +1292,7 @@ processToken(token); break; case InFramesetMode: - ASSERT(insertionMode() == InFramesetMode); + ASSERT(getInsertionMode() == InFramesetMode); if (token->name() == htmlTag) { processHtmlStartTagForInBody(token); return; @@ -1317,7 +1317,7 @@ break; case AfterFramesetMode: case AfterAfterFramesetMode: - ASSERT(insertionMode() == AfterFramesetMode || insertionMode() == AfterAfterFramesetMode); + ASSERT(getInsertionMode() == AfterFramesetMode || getInsertionMode() == AfterAfterFramesetMode); if (token->name() == htmlTag) { processHtmlStartTagForInBody(token); return; @@ -1329,7 +1329,7 @@ parseError(token); break; case InSelectInTableMode: - ASSERT(insertionMode() == InSelectInTableMode); + ASSERT(getInsertionMode() == InSelectInTableMode); if (token->name() == captionTag || token->name() == tableTag || isTableBodyContextTag(token->name()) @@ -1343,7 +1343,7 @@ } // Fall through case InSelectMode: - ASSERT(insertionMode() == InSelectMode || insertionMode() == InSelectInTableMode); + ASSERT(getInsertionMode() == InSelectMode || getInsertionMode() == InSelectInTableMode); if (token->name() == htmlTag) { processHtmlStartTagForInBody(token); return; @@ -1696,7 +1696,7 @@ ASSERT(isParsingFragmentOrTemplateContents()); return; } - ASSERT(insertionMode() == InTableBodyMode); + ASSERT(getInsertionMode() == InTableBodyMode); processEndTag(token); return; } @@ -1706,7 +1706,7 @@ return; } processFakeEndTag(trTag); - ASSERT(insertionMode() == InTableBodyMode); + ASSERT(getInsertionMode() == InTableBodyMode); processEndTag(token); return; } @@ -1960,13 +1960,13 @@ void HTMLTreeBuilder::processEndTag(AtomicHTMLToken* token) { ASSERT(token->type() == HTMLToken::EndTag); - switch (insertionMode()) { + switch (getInsertionMode()) { case InitialMode: - ASSERT(insertionMode() == InitialMode); + ASSERT(getInsertionMode() == InitialMode); defaultForInitial(); // Fall through. case BeforeHTMLMode: - ASSERT(insertionMode() == BeforeHTMLMode); + ASSERT(getInsertionMode() == BeforeHTMLMode); if (token->name() != headTag && token->name() != bodyTag && token->name() != htmlTag && token->name() != brTag) { parseError(token); return; @@ -1974,7 +1974,7 @@ defaultForBeforeHTML(); // Fall through. case BeforeHeadMode: - ASSERT(insertionMode() == BeforeHeadMode); + ASSERT(getInsertionMode() == BeforeHeadMode); if (token->name() != headTag && token->name() != bodyTag && token->name() != htmlTag && token->name() != brTag) { parseError(token); return; @@ -1982,7 +1982,7 @@ defaultForBeforeHead(); // Fall through. case InHeadMode: - ASSERT(insertionMode() == InHeadMode); + ASSERT(getInsertionMode() == InHeadMode); // FIXME: This case should be broken out into processEndTagForInHead, // because other end tag cases now refer to it ("process the token for using the rules of the "in head" insertion mode"). // but because the logic falls through to AfterHeadMode, that gets a little messy. @@ -2002,7 +2002,7 @@ defaultForInHead(); // Fall through. case AfterHeadMode: - ASSERT(insertionMode() == AfterHeadMode); + ASSERT(getInsertionMode() == AfterHeadMode); if (token->name() != bodyTag && token->name() != htmlTag && token->name() != brTag) { parseError(token); return; @@ -2010,15 +2010,15 @@ defaultForAfterHead(); // Fall through case InBodyMode: - ASSERT(insertionMode() == InBodyMode); + ASSERT(getInsertionMode() == InBodyMode); processEndTagForInBody(token); break; case InTableMode: - ASSERT(insertionMode() == InTableMode); + ASSERT(getInsertionMode() == InTableMode); processEndTagForInTable(token); break; case InCaptionMode: - ASSERT(insertionMode() == InCaptionMode); + ASSERT(getInsertionMode() == InCaptionMode); if (token->name() == captionTag) { processCaptionEndTagForInCaption(); return; @@ -2045,7 +2045,7 @@ processEndTagForInBody(token); break; case InColumnGroupMode: - ASSERT(insertionMode() == InColumnGroupMode); + ASSERT(getInsertionMode() == InColumnGroupMode); if (token->name() == colgroupTag) { processColgroupEndTagForInColumnGroup(); return; @@ -2065,19 +2065,19 @@ processEndTag(token); break; case InRowMode: - ASSERT(insertionMode() == InRowMode); + ASSERT(getInsertionMode() == InRowMode); processEndTagForInRow(token); break; case InCellMode: - ASSERT(insertionMode() == InCellMode); + ASSERT(getInsertionMode() == InCellMode); processEndTagForInCell(token); break; case InTableBodyMode: - ASSERT(insertionMode() == InTableBodyMode); + ASSERT(getInsertionMode() == InTableBodyMode); processEndTagForInTableBody(token); break; case AfterBodyMode: - ASSERT(insertionMode() == AfterBodyMode); + ASSERT(getInsertionMode() == AfterBodyMode); if (token->name() == htmlTag) { if (isParsingFragment()) { parseError(token); @@ -2088,13 +2088,13 @@ } // Fall through. case AfterAfterBodyMode: - ASSERT(insertionMode() == AfterBodyMode || insertionMode() == AfterAfterBodyMode); + ASSERT(getInsertionMode() == AfterBodyMode || getInsertionMode() == AfterAfterBodyMode); parseError(token); setInsertionMode(InBodyMode); processEndTag(token); break; case InHeadNoscriptMode: - ASSERT(insertionMode() == InHeadNoscriptMode); + ASSERT(getInsertionMode() == InHeadNoscriptMode); if (token->name() == noscriptTag) { ASSERT(m_tree.currentStackItem()->hasTagName(noscriptTag)); m_tree.openElements()->pop(); @@ -2129,7 +2129,7 @@ setInsertionMode(m_originalInsertionMode); break; case InFramesetMode: - ASSERT(insertionMode() == InFramesetMode); + ASSERT(getInsertionMode() == InFramesetMode); if (token->name() == framesetTag) { bool ignoreFramesetForFragmentParsing = m_tree.currentIsRootNode(); ignoreFramesetForFragmentParsing = ignoreFramesetForFragmentParsing || m_tree.openElements()->hasTemplateInHTMLScope(); @@ -2149,18 +2149,18 @@ } break; case AfterFramesetMode: - ASSERT(insertionMode() == AfterFramesetMode); + ASSERT(getInsertionMode() == AfterFramesetMode); if (token->name() == htmlTag) { setInsertionMode(AfterAfterFramesetMode); return; } // Fall through. case AfterAfterFramesetMode: - ASSERT(insertionMode() == AfterFramesetMode || insertionMode() == AfterAfterFramesetMode); + ASSERT(getInsertionMode() == AfterFramesetMode || getInsertionMode() == AfterAfterFramesetMode); parseError(token); break; case InSelectInTableMode: - ASSERT(insertionMode() == InSelectInTableMode); + ASSERT(getInsertionMode() == InSelectInTableMode); if (token->name() == captionTag || token->name() == tableTag || isTableBodyContextTag(token->name()) @@ -2176,7 +2176,7 @@ } // Fall through. case InSelectMode: - ASSERT(insertionMode() == InSelectMode || insertionMode() == InSelectInTableMode); + ASSERT(getInsertionMode() == InSelectMode || getInsertionMode() == InSelectInTableMode); if (token->name() == optgroupTag) { if (m_tree.currentStackItem()->hasTagName(optionTag) && m_tree.oneBelowTop() && m_tree.oneBelowTop()->hasTagName(optgroupTag)) processFakeEndTag(optionTag); @@ -2273,9 +2273,9 @@ return; } - switch (insertionMode()) { + switch (getInsertionMode()) { case InitialMode: { - ASSERT(insertionMode() == InitialMode); + ASSERT(getInsertionMode() == InitialMode); buffer.skipLeadingWhitespace(); if (buffer.isEmpty()) return; @@ -2283,7 +2283,7 @@ // Fall through. } case BeforeHTMLMode: { - ASSERT(insertionMode() == BeforeHTMLMode); + ASSERT(getInsertionMode() == BeforeHTMLMode); buffer.skipLeadingWhitespace(); if (buffer.isEmpty()) return; @@ -2291,7 +2291,7 @@ // Fall through. } case BeforeHeadMode: { - ASSERT(insertionMode() == BeforeHeadMode); + ASSERT(getInsertionMode() == BeforeHeadMode); buffer.skipLeadingWhitespace(); if (buffer.isEmpty()) return; @@ -2299,7 +2299,7 @@ // Fall through. } case InHeadMode: { - ASSERT(insertionMode() == InHeadMode); + ASSERT(getInsertionMode() == InHeadMode); String leadingWhitespace = buffer.takeLeadingWhitespace(); if (!leadingWhitespace.isEmpty()) m_tree.insertTextNode(leadingWhitespace, AllWhitespace); @@ -2309,7 +2309,7 @@ // Fall through. } case AfterHeadMode: { - ASSERT(insertionMode() == AfterHeadMode); + ASSERT(getInsertionMode() == AfterHeadMode); String leadingWhitespace = buffer.takeLeadingWhitespace(); if (!leadingWhitespace.isEmpty()) m_tree.insertTextNode(leadingWhitespace, AllWhitespace); @@ -2322,14 +2322,14 @@ case InCaptionMode: case TemplateContentsMode: case InCellMode: { - ASSERT(insertionMode() == InBodyMode || insertionMode() == InCaptionMode || insertionMode() == InCellMode || insertionMode() == TemplateContentsMode); + ASSERT(getInsertionMode() == InBodyMode || getInsertionMode() == InCaptionMode || getInsertionMode() == InCellMode || getInsertionMode() == TemplateContentsMode); processCharacterBufferForInBody(buffer); break; } case InTableMode: case InTableBodyMode: case InRowMode: { - ASSERT(insertionMode() == InTableMode || insertionMode() == InTableBodyMode || insertionMode() == InRowMode); + ASSERT(getInsertionMode() == InTableMode || getInsertionMode() == InTableBodyMode || getInsertionMode() == InRowMode); ASSERT(m_pendingTableCharacters.isEmpty()); if (m_tree.currentStackItem()->isElementNode() && (m_tree.currentStackItem()->hasTagName(tableTag) @@ -2352,7 +2352,7 @@ break; } case InColumnGroupMode: { - ASSERT(insertionMode() == InColumnGroupMode); + ASSERT(getInsertionMode() == InColumnGroupMode); String leadingWhitespace = buffer.takeLeadingWhitespace(); if (!leadingWhitespace.isEmpty()) m_tree.insertTextNode(leadingWhitespace, AllWhitespace); @@ -2369,18 +2369,18 @@ } case AfterBodyMode: case AfterAfterBodyMode: { - ASSERT(insertionMode() == AfterBodyMode || insertionMode() == AfterAfterBodyMode); + ASSERT(getInsertionMode() == AfterBodyMode || getInsertionMode() == AfterAfterBodyMode); // FIXME: parse error setInsertionMode(InBodyMode); goto ReprocessBuffer; } case TextMode: { - ASSERT(insertionMode() == TextMode); + ASSERT(getInsertionMode() == TextMode); m_tree.insertTextNode(buffer.takeRemaining()); break; } case InHeadNoscriptMode: { - ASSERT(insertionMode() == InHeadNoscriptMode); + ASSERT(getInsertionMode() == InHeadNoscriptMode); String leadingWhitespace = buffer.takeLeadingWhitespace(); if (!leadingWhitespace.isEmpty()) m_tree.insertTextNode(leadingWhitespace, AllWhitespace); @@ -2391,7 +2391,7 @@ } case InFramesetMode: case AfterFramesetMode: { - ASSERT(insertionMode() == InFramesetMode || insertionMode() == AfterFramesetMode || insertionMode() == AfterAfterFramesetMode); + ASSERT(getInsertionMode() == InFramesetMode || getInsertionMode() == AfterFramesetMode || getInsertionMode() == AfterAfterFramesetMode); String leadingWhitespace = buffer.takeRemainingWhitespace(); if (!leadingWhitespace.isEmpty()) m_tree.insertTextNode(leadingWhitespace, AllWhitespace); @@ -2401,7 +2401,7 @@ } case InSelectInTableMode: case InSelectMode: { - ASSERT(insertionMode() == InSelectMode || insertionMode() == InSelectInTableMode); + ASSERT(getInsertionMode() == InSelectMode || getInsertionMode() == InSelectInTableMode); m_tree.insertTextNode(buffer.takeRemaining()); break; } @@ -2430,48 +2430,48 @@ void HTMLTreeBuilder::processEndOfFile(AtomicHTMLToken* token) { ASSERT(token->type() == HTMLToken::EndOfFile); - switch (insertionMode()) { + switch (getInsertionMode()) { case InitialMode: - ASSERT(insertionMode() == InitialMode); + ASSERT(getInsertionMode() == InitialMode); defaultForInitial(); // Fall through. case BeforeHTMLMode: - ASSERT(insertionMode() == BeforeHTMLMode); + ASSERT(getInsertionMode() == BeforeHTMLMode); defaultForBeforeHTML(); // Fall through. case BeforeHeadMode: - ASSERT(insertionMode() == BeforeHeadMode); + ASSERT(getInsertionMode() == BeforeHeadMode); defaultForBeforeHead(); // Fall through. case InHeadMode: - ASSERT(insertionMode() == InHeadMode); + ASSERT(getInsertionMode() == InHeadMode); defaultForInHead(); // Fall through. case AfterHeadMode: - ASSERT(insertionMode() == AfterHeadMode); + ASSERT(getInsertionMode() == AfterHeadMode); defaultForAfterHead(); // Fall through case InBodyMode: case InCellMode: case InCaptionMode: case InRowMode: - ASSERT(insertionMode() == InBodyMode || insertionMode() == InCellMode || insertionMode() == InCaptionMode || insertionMode() == InRowMode || insertionMode() == TemplateContentsMode); + ASSERT(getInsertionMode() == InBodyMode || getInsertionMode() == InCellMode || getInsertionMode() == InCaptionMode || getInsertionMode() == InRowMode || getInsertionMode() == TemplateContentsMode); notImplemented(); // Emit parse error based on what elements are still open. if (!m_templateInsertionModes.isEmpty() && processEndOfFileForInTemplateContents(token)) return; break; case AfterBodyMode: case AfterAfterBodyMode: - ASSERT(insertionMode() == AfterBodyMode || insertionMode() == AfterAfterBodyMode); + ASSERT(getInsertionMode() == AfterBodyMode || getInsertionMode() == AfterAfterBodyMode); break; case InHeadNoscriptMode: - ASSERT(insertionMode() == InHeadNoscriptMode); + ASSERT(getInsertionMode() == InHeadNoscriptMode); defaultForInHeadNoscript(); processEndOfFile(token); return; case AfterFramesetMode: case AfterAfterFramesetMode: - ASSERT(insertionMode() == AfterFramesetMode || insertionMode() == AfterAfterFramesetMode); + ASSERT(getInsertionMode() == AfterFramesetMode || getInsertionMode() == AfterAfterFramesetMode); break; case InColumnGroupMode: if (m_tree.currentIsRootNode()) { @@ -2486,7 +2486,7 @@ case InTableBodyMode: case InSelectInTableMode: case InSelectMode: - ASSERT(insertionMode() == InSelectMode || insertionMode() == InSelectInTableMode || insertionMode() == InTableMode || insertionMode() == InFramesetMode || insertionMode() == InTableBodyMode || insertionMode() == InColumnGroupMode); + ASSERT(getInsertionMode() == InSelectMode || getInsertionMode() == InSelectInTableMode || getInsertionMode() == InTableMode || getInsertionMode() == InFramesetMode || getInsertionMode() == InTableBodyMode || getInsertionMode() == InColumnGroupMode); if (m_tree.currentNode() != m_tree.openElements()->rootNode()) parseError(token); if (!m_templateInsertionModes.isEmpty() && processEndOfFileForInTemplateContents(token))
diff --git a/third_party/WebKit/Source/core/html/parser/HTMLTreeBuilder.h b/third_party/WebKit/Source/core/html/parser/HTMLTreeBuilder.h index 8fc58d8..9d7727c6 100644 --- a/third_party/WebKit/Source/core/html/parser/HTMLTreeBuilder.h +++ b/third_party/WebKit/Source/core/html/parser/HTMLTreeBuilder.h
@@ -179,7 +179,7 @@ void parseError(AtomicHTMLToken*); - InsertionMode insertionMode() const { return m_insertionMode; } + InsertionMode getInsertionMode() const { return m_insertionMode; } void setInsertionMode(InsertionMode mode) { m_insertionMode = mode; } void resetInsertionModeAppropriately();
diff --git a/third_party/WebKit/Source/core/html/shadow/SpinButtonElement.h b/third_party/WebKit/Source/core/html/shadow/SpinButtonElement.h index 486200a8..4be7353d 100644 --- a/third_party/WebKit/Source/core/html/shadow/SpinButtonElement.h +++ b/third_party/WebKit/Source/core/html/shadow/SpinButtonElement.h
@@ -60,7 +60,7 @@ // because SpinButtonElement can be outlive SpinButtonOwner // implementation, e.g. during event handling. static PassRefPtrWillBeRawPtr<SpinButtonElement> create(Document&, SpinButtonOwner&); - UpDownState upDownState() const { return m_upDownState; } + UpDownState getUpDownState() const { return m_upDownState; } void releaseCapture(EventDispatch = EventDispatchAllowed); void removeSpinButtonOwner() { m_spinButtonOwner = nullptr; }
diff --git a/third_party/WebKit/Source/core/html/track/CueTimeline.cpp b/third_party/WebKit/Source/core/html/track/CueTimeline.cpp index f0820b54d..72e2fa7a 100644 --- a/third_party/WebKit/Source/core/html/track/CueTimeline.cpp +++ b/third_party/WebKit/Source/core/html/track/CueTimeline.cpp
@@ -150,7 +150,7 @@ // The user agent must synchronously unset [the text track cue active] flag // whenever ... the media element's readyState is changed back to HAVE_NOTHING. - if (mediaElement.readyState() != HTMLMediaElement::HAVE_NOTHING && mediaElement.webMediaPlayer()) + if (mediaElement.getReadyState() != HTMLMediaElement::HAVE_NOTHING && mediaElement.webMediaPlayer()) currentCues = m_cueTree.allOverlaps(m_cueTree.createInterval(movieTime, movieTime)); CueList previousCues;
diff --git a/third_party/WebKit/Source/core/html/track/CueTimeline.h b/third_party/WebKit/Source/core/html/track/CueTimeline.h index 09cc811f..9fd9c413 100644 --- a/third_party/WebKit/Source/core/html/track/CueTimeline.h +++ b/third_party/WebKit/Source/core/html/track/CueTimeline.h
@@ -88,7 +88,7 @@ // Template specializations required by PodIntervalTree in debug mode. template <> struct ValueToString<double> { - static String string(const double value) + static String toString(const double value) { return String::number(value); } @@ -96,7 +96,7 @@ template <> struct ValueToString<TextTrackCue*> { - static String string(TextTrackCue* const& cue) + static String toString(TextTrackCue* const& cue) { return cue->toString(); }
diff --git a/third_party/WebKit/Source/core/html/track/LoadableTextTrack.cpp b/third_party/WebKit/Source/core/html/track/LoadableTextTrack.cpp index f059ec6..51540ac 100644 --- a/third_party/WebKit/Source/core/html/track/LoadableTextTrack.cpp +++ b/third_party/WebKit/Source/core/html/track/LoadableTextTrack.cpp
@@ -65,7 +65,7 @@ return; #endif - if (m_trackElement->readyState() == HTMLTrackElement::NONE) + if (m_trackElement->getReadyState() == HTMLTrackElement::NONE) m_trackElement->scheduleLoad(); }
diff --git a/third_party/WebKit/Source/core/html/track/TextTrack.cpp b/third_party/WebKit/Source/core/html/track/TextTrack.cpp index 1cd6017..2f122e2 100644 --- a/third_party/WebKit/Source/core/html/track/TextTrack.cpp +++ b/third_party/WebKit/Source/core/html/track/TextTrack.cpp
@@ -171,7 +171,7 @@ m_mode = mode; - if (mode != disabledKeyword() && readinessState() == Loaded) { + if (mode != disabledKeyword() && getReadinessState() == Loaded) { if (m_cues && cueTimeline()) cueTimeline()->addCues(this, m_cues.get()); }
diff --git a/third_party/WebKit/Source/core/html/track/TextTrack.h b/third_party/WebKit/Source/core/html/track/TextTrack.h index 31d47947..cf93726 100644 --- a/third_party/WebKit/Source/core/html/track/TextTrack.h +++ b/third_party/WebKit/Source/core/html/track/TextTrack.h
@@ -76,7 +76,7 @@ virtual void setMode(const AtomicString&); enum ReadinessState { NotLoaded = 0, Loading = 1, Loaded = 2, FailedToLoad = 3 }; - ReadinessState readinessState() const { return m_readinessState; } + ReadinessState getReadinessState() const { return m_readinessState; } void setReadinessState(ReadinessState state) { m_readinessState = state; } TextTrackCueList* cues();
diff --git a/third_party/WebKit/Source/core/html/track/TrackBase.cpp b/third_party/WebKit/Source/core/html/track/TrackBase.cpp index c408822f..633a452 100644 --- a/third_party/WebKit/Source/core/html/track/TrackBase.cpp +++ b/third_party/WebKit/Source/core/html/track/TrackBase.cpp
@@ -40,7 +40,7 @@ return ++next; } -TrackBase::TrackBase(Type type, const AtomicString& label, const AtomicString& language, const String& id) +TrackBase::TrackBase(TrackType type, const AtomicString& label, const AtomicString& language, const String& id) : m_trackId(nextTrackId()) , m_type(type) , m_label(label)
diff --git a/third_party/WebKit/Source/core/html/track/TrackBase.h b/third_party/WebKit/Source/core/html/track/TrackBase.h index 28db2a6..4a71790 100644 --- a/third_party/WebKit/Source/core/html/track/TrackBase.h +++ b/third_party/WebKit/Source/core/html/track/TrackBase.h
@@ -42,8 +42,8 @@ WebMediaPlayer::TrackId trackId() const { return m_trackId; } - enum Type { TextTrack, AudioTrack, VideoTrack }; - Type type() const { return m_type; } + enum TrackType { TextTrack, AudioTrack, VideoTrack }; + TrackType type() const { return m_type; } const AtomicString& kind() const { return m_kind; } virtual void setKind(const AtomicString&); @@ -64,14 +64,14 @@ DECLARE_VIRTUAL_TRACE(); protected: - TrackBase(Type, const AtomicString& label, const AtomicString& language, const String& id); + TrackBase(TrackType, const AtomicString& label, const AtomicString& language, const String& id); virtual bool isValidKind(const AtomicString&) const = 0; virtual AtomicString defaultKind() const = 0; private: WebMediaPlayer::TrackId m_trackId; - Type m_type; + TrackType m_type; AtomicString m_kind; AtomicString m_label; AtomicString m_language;
diff --git a/third_party/WebKit/Source/core/html/track/vtt/VTTCue.cpp b/third_party/WebKit/Source/core/html/track/vtt/VTTCue.cpp index a09e9a33..eb462a3 100644 --- a/third_party/WebKit/Source/core/html/track/vtt/VTTCue.cpp +++ b/third_party/WebKit/Source/core/html/track/vtt/VTTCue.cpp
@@ -653,7 +653,7 @@ // Note: The 'text-align' property is also determined here so that // VTTCueBox::applyCSSProperties need not have access to a VTTCue. - displayParameters.textAlign = displayAlignmentMap[cueAlignment()]; + displayParameters.textAlign = displayAlignmentMap[getCueAlignment()]; // 3. If the cue writing direction is horizontal, then let block-flow be // 'tb'. Otherwise, if the cue writing direction is vertical growing left,
diff --git a/third_party/WebKit/Source/core/html/track/vtt/VTTCue.h b/third_party/WebKit/Source/core/html/track/vtt/VTTCue.h index 1849944..0fde730 100644 --- a/third_party/WebKit/Source/core/html/track/vtt/VTTCue.h +++ b/third_party/WebKit/Source/core/html/track/vtt/VTTCue.h
@@ -139,7 +139,7 @@ Right, NumberOfAlignments }; - CueAlignment cueAlignment() const { return m_cueAlignment; } + CueAlignment getCueAlignment() const { return m_cueAlignment; } ExecutionContext* executionContext() const override;
diff --git a/third_party/WebKit/Source/core/html/track/vtt/VTTScanner.cpp b/third_party/WebKit/Source/core/html/track/vtt/VTTScanner.cpp index 2110b9e..423dce5c 100644 --- a/third_party/WebKit/Source/core/html/track/vtt/VTTScanner.cpp +++ b/third_party/WebKit/Source/core/html/track/vtt/VTTScanner.cpp
@@ -67,7 +67,7 @@ bool VTTScanner::scanRun(const Run& run, const String& toMatch) { - ASSERT(run.start() == position()); + ASSERT(run.start() == getPosition()); ASSERT(run.start() <= end()); ASSERT(run.end() >= run.start()); ASSERT(run.end() <= end()); @@ -94,7 +94,7 @@ String VTTScanner::extractString(const Run& run) { - ASSERT(run.start() == position()); + ASSERT(run.start() == getPosition()); ASSERT(run.start() <= end()); ASSERT(run.end() >= run.start()); ASSERT(run.end() <= end()); @@ -109,7 +109,7 @@ String VTTScanner::restOfInputAsString() { - Run rest(position(), end(), m_is8Bit); + Run rest(getPosition(), end(), m_is8Bit); return extractString(rest); } @@ -142,7 +142,7 @@ { Run integerRun = collectWhile<isASCIIDigit>(); seekTo(integerRun.end()); - Run decimalRun(position(), position(), m_is8Bit); + Run decimalRun(getPosition(), getPosition(), m_is8Bit); if (scan('.')) { decimalRun = collectWhile<isASCIIDigit>(); seekTo(decimalRun.end()); @@ -155,7 +155,7 @@ return false; } - size_t lengthOfFloat = Run(integerRun.start(), position(), m_is8Bit).length(); + size_t lengthOfFloat = Run(integerRun.start(), getPosition(), m_is8Bit).length(); bool validNumber; if (m_is8Bit) number = charactersToFloat(integerRun.start(), lengthOfFloat, &validNumber); @@ -169,7 +169,7 @@ bool VTTScanner::scanPercentage(float& percentage) { - Position savedPosition = position(); + Position savedPosition = getPosition(); if (!scanFloat(percentage)) return false; if (scan('%'))
diff --git a/third_party/WebKit/Source/core/html/track/vtt/VTTScanner.h b/third_party/WebKit/Source/core/html/track/vtt/VTTScanner.h index 493d381..b250eb5e 100644 --- a/third_party/WebKit/Source/core/html/track/vtt/VTTScanner.h +++ b/third_party/WebKit/Source/core/html/track/vtt/VTTScanner.h
@@ -75,9 +75,9 @@ }; // Check if the input pointer points at the specified position. - bool isAt(Position checkPosition) const { return position() == checkPosition; } + bool isAt(Position checkPosition) const { return getPosition() == checkPosition; } // Check if the input pointer points at the end of the input. - bool isAtEnd() const { return position() == end(); } + bool isAtEnd() const { return getPosition() == end(); } // Match the character |c| against the character at the input pointer (~lookahead). bool match(char c) const { return !isAtEnd() && currentChar() == c; } // Scan the character |c|. @@ -137,7 +137,7 @@ bool scanPercentage(float& percentage); protected: - Position position() const { return m_data.characters8; } + Position getPosition() const { return m_data.characters8; } Position end() const { return m_end.characters8; } void seekTo(Position); UChar currentChar() const; @@ -194,11 +194,11 @@ if (m_is8Bit) { const LChar* current = m_data.characters8; ::skipWhile<LChar, LCharPredicateAdapter<characterPredicate>>(current, m_end.characters8); - return Run(position(), current, m_is8Bit); + return Run(getPosition(), current, m_is8Bit); } const UChar* current = m_data.characters16; ::skipWhile<UChar, characterPredicate>(current, m_end.characters16); - return Run(position(), reinterpret_cast<Position>(current), m_is8Bit); + return Run(getPosition(), reinterpret_cast<Position>(current), m_is8Bit); } template<bool characterPredicate(UChar)> @@ -207,11 +207,11 @@ if (m_is8Bit) { const LChar* current = m_data.characters8; ::skipUntil<LChar, LCharPredicateAdapter<characterPredicate>>(current, m_end.characters8); - return Run(position(), current, m_is8Bit); + return Run(getPosition(), current, m_is8Bit); } const UChar* current = m_data.characters16; ::skipUntil<UChar, characterPredicate>(current, m_end.characters16); - return Run(position(), reinterpret_cast<Position>(current), m_is8Bit); + return Run(getPosition(), reinterpret_cast<Position>(current), m_is8Bit); } inline void VTTScanner::seekTo(Position position) @@ -222,13 +222,13 @@ inline UChar VTTScanner::currentChar() const { - ASSERT(position() < end()); + ASSERT(getPosition() < end()); return m_is8Bit ? *m_data.characters8 : *m_data.characters16; } inline void VTTScanner::advance(unsigned amount) { - ASSERT(position() < end()); + ASSERT(getPosition() < end()); if (m_is8Bit) m_data.characters8 += amount; else
diff --git a/third_party/WebKit/Source/core/imagebitmap/ImageBitmapFactories.cpp b/third_party/WebKit/Source/core/imagebitmap/ImageBitmapFactories.cpp index 22de005a..5a6095df 100644 --- a/third_party/WebKit/Source/core/imagebitmap/ImageBitmapFactories.cpp +++ b/third_party/WebKit/Source/core/imagebitmap/ImageBitmapFactories.cpp
@@ -43,7 +43,6 @@ #include "core/imagebitmap/ImageBitmapOptions.h" #include "core/workers/WorkerGlobalScope.h" #include "platform/SharedBuffer.h" -#include "platform/Task.h" #include "platform/ThreadSafeFunctional.h" #include "platform/graphics/ImageSource.h" #include "platform/threading/BackgroundTaskRunner.h"
diff --git a/third_party/WebKit/Source/core/inspector/InspectorLayerTreeAgent.cpp b/third_party/WebKit/Source/core/inspector/InspectorLayerTreeAgent.cpp index 0d4795c..dd93783 100644 --- a/third_party/WebKit/Source/core/inspector/InspectorLayerTreeAgent.cpp +++ b/third_party/WebKit/Source/core/inspector/InspectorLayerTreeAgent.cpp
@@ -308,7 +308,7 @@ const GraphicsLayer* graphicsLayer = layerById(errorString, layerId); if (!graphicsLayer) return; - CompositingReasons reasonsBitmask = graphicsLayer->compositingReasons(); + CompositingReasons reasonsBitmask = graphicsLayer->getCompositingReasons(); *reasonStrings = Array<String>::create(); for (size_t i = 0; i < kNumberOfCompositingReasons; ++i) { if (!(reasonsBitmask & kCompositingReasonStringMap[i].reason))
diff --git a/third_party/WebKit/Source/core/layout/FloatingObjects.cpp b/third_party/WebKit/Source/core/layout/FloatingObjects.cpp index 5e4051c..258aab4a 100644 --- a/third_party/WebKit/Source/core/layout/FloatingObjects.cpp +++ b/third_party/WebKit/Source/core/layout/FloatingObjects.cpp
@@ -90,12 +90,12 @@ PassOwnPtr<FloatingObject> FloatingObject::copyToNewContainer(LayoutSize offset, bool shouldPaint, bool isDescendant) const { - return adoptPtr(new FloatingObject(layoutObject(), type(), LayoutRect(frameRect().location() - offset, frameRect().size()), shouldPaint, isDescendant, isLowestNonOverhangingFloatInChild())); + return adoptPtr(new FloatingObject(layoutObject(), getType(), LayoutRect(frameRect().location() - offset, frameRect().size()), shouldPaint, isDescendant, isLowestNonOverhangingFloatInChild())); } PassOwnPtr<FloatingObject> FloatingObject::unsafeClone() const { - OwnPtr<FloatingObject> cloneObject = adoptPtr(new FloatingObject(layoutObject(), type(), m_frameRect, m_shouldPaint, m_isDescendant, false)); + OwnPtr<FloatingObject> cloneObject = adoptPtr(new FloatingObject(layoutObject(), getType(), m_frameRect, m_shouldPaint, m_isDescendant, false)); cloneObject->m_paginationStrut = m_paginationStrut; cloneObject->m_isPlaced = m_isPlaced; return cloneObject.release(); @@ -258,7 +258,7 @@ // Clear references to originating lines, since the lines are being deleted FloatingObjectSetIterator end = m_set.end(); for (FloatingObjectSetIterator it = m_set.begin(); it != end; ++it) { - ASSERT(!((*it)->originatingLine()) || (*it)->originatingLine()->lineLayoutItem().isEqual(m_layoutObject)); + ASSERT(!((*it)->originatingLine()) || (*it)->originatingLine()->getLineLayoutItem().isEqual(m_layoutObject)); (*it)->setOriginatingLine(nullptr); } } @@ -306,7 +306,7 @@ for (FloatingObjectSetIterator it = floatingObjectSet.begin(); it != end; ++it) { FloatingObject& floatingObject = *it->get(); if (floatingObject.isPlaced()) { - FloatingObject::Type curType = floatingObject.type(); + FloatingObject::Type curType = floatingObject.getType(); LayoutUnit curFloatLogicalBottom = m_layoutObject->logicalBottomForFloat(floatingObject); if (curType & FloatingObject::FloatLeft && curFloatLogicalBottom > lowestFloatBottomLeft) { lowestFloatBottomLeft = curFloatLogicalBottom; @@ -325,7 +325,7 @@ FloatingObject* lowestFloatingObject = nullptr; for (FloatingObjectSetIterator it = floatingObjectSet.begin(); it != end; ++it) { FloatingObject& floatingObject = *it->get(); - if (floatingObject.isPlaced() && floatingObject.type() == floatType) { + if (floatingObject.isPlaced() && floatingObject.getType() == floatType) { if (m_layoutObject->logicalBottomForFloat(floatingObject) > lowestFloatBottom) { lowestFloatingObject = &floatingObject; lowestFloatBottom = m_layoutObject->logicalBottomForFloat(floatingObject); @@ -453,7 +453,7 @@ FloatingObject* FloatingObjects::add(PassOwnPtr<FloatingObject> floatingObject) { FloatingObject* newObject = floatingObject.leakPtr(); - increaseObjectsCount(newObject->type()); + increaseObjectsCount(newObject->getType()); m_set.add(adoptPtr(newObject)); if (newObject->isPlaced()) addPlacedObject(*newObject); @@ -463,7 +463,7 @@ void FloatingObjects::remove(FloatingObject* toBeRemoved) { - decreaseObjectsCount(toBeRemoved->type()); + decreaseObjectsCount(toBeRemoved->getType()); OwnPtr<FloatingObject> floatingObject = m_set.take(toBeRemoved); ASSERT(floatingObject->isPlaced() || !floatingObject->isInPlacedTree()); if (floatingObject->isPlaced()) @@ -563,7 +563,7 @@ inline void ComputeFloatOffsetAdapter<FloatTypeValue>::collectIfNeeded(const IntervalType& interval) { const FloatingObject& floatingObject = *(interval.data()); - if (floatingObject.type() != FloatTypeValue || !rangesIntersect(interval.low(), interval.high(), m_lineTop, m_lineBottom)) + if (floatingObject.getType() != FloatTypeValue || !rangesIntersect(interval.low(), interval.high(), m_lineTop, m_lineBottom)) return; // Make sure the float hasn't changed since it was added to the placed floats tree. @@ -616,12 +616,12 @@ #ifndef NDEBUG // These helpers are only used by the PODIntervalTree for debugging purposes. -String ValueToString<LayoutUnit>::string(const LayoutUnit value) +String ValueToString<LayoutUnit>::toString(const LayoutUnit value) { return String::number(value.toFloat()); } -String ValueToString<FloatingObject*>::string(const FloatingObject* floatingObject) +String ValueToString<FloatingObject*>::toString(const FloatingObject* floatingObject) { return String::format("%p (%gx%g %gx%g)", floatingObject, floatingObject->frameRect().x().toFloat(), floatingObject->frameRect().y().toFloat(), floatingObject->frameRect().maxX().toFloat(), floatingObject->frameRect().maxY().toFloat()); }
diff --git a/third_party/WebKit/Source/core/layout/FloatingObjects.h b/third_party/WebKit/Source/core/layout/FloatingObjects.h index 3c9c4ff9..e465f40 100644 --- a/third_party/WebKit/Source/core/layout/FloatingObjects.h +++ b/third_party/WebKit/Source/core/layout/FloatingObjects.h
@@ -52,7 +52,7 @@ PassOwnPtr<FloatingObject> unsafeClone() const; - Type type() const { return static_cast<Type>(m_type); } + Type getType() const { return static_cast<Type>(m_type); } LayoutBox* layoutObject() const { return m_layoutObject; } bool isPlaced() const { return m_isPlaced; } @@ -201,10 +201,10 @@ #ifndef NDEBUG // These structures are used by PODIntervalTree for debugging purposes. template <> struct ValueToString<LayoutUnit> { - static String string(const LayoutUnit value); + static String toString(const LayoutUnit value); }; template<> struct ValueToString<FloatingObject*> { - static String string(const FloatingObject*); + static String toString(const FloatingObject*); }; #endif
diff --git a/third_party/WebKit/Source/core/layout/ImageQualityController.cpp b/third_party/WebKit/Source/core/layout/ImageQualityController.cpp index 517cd8e..75ab1856 100644 --- a/third_party/WebKit/Source/core/layout/ImageQualityController.cpp +++ b/third_party/WebKit/Source/core/layout/ImageQualityController.cpp
@@ -142,7 +142,7 @@ if (i != m_objectLayerSizeMap.end()) { // Only invalidate the object if it is animating. if (i->value.isResizing) { - // TODO(wangxianzhu): Use LayoutObject::mutableForPainting(). + // TODO(wangxianzhu): Use LayoutObject::getMutableForPainting(). const_cast<LayoutObject*>(layoutObject)->setShouldDoFullPaintInvalidation(); } i->value.isResizing = false;
diff --git a/third_party/WebKit/Source/core/layout/LayoutBlock.cpp b/third_party/WebKit/Source/core/layout/LayoutBlock.cpp index d7549b3..bf86b7a8 100644 --- a/third_party/WebKit/Source/core/layout/LayoutBlock.cpp +++ b/third_party/WebKit/Source/core/layout/LayoutBlock.cpp
@@ -1704,14 +1704,14 @@ if (!box) return Position(); - if (!box->lineLayoutItem().nonPseudoNode()) + if (!box->getLineLayoutItem().nonPseudoNode()) return Position::editingPositionOf(nonPseudoNode(), start ? caretMinOffset() : caretMaxOffset()); if (!box->isInlineTextBox()) - return Position::editingPositionOf(box->lineLayoutItem().nonPseudoNode(), start ? box->lineLayoutItem().caretMinOffset() : box->lineLayoutItem().caretMaxOffset()); + return Position::editingPositionOf(box->getLineLayoutItem().nonPseudoNode(), start ? box->getLineLayoutItem().caretMinOffset() : box->getLineLayoutItem().caretMaxOffset()); InlineTextBox* textBox = toInlineTextBox(box); - return Position::editingPositionOf(box->lineLayoutItem().nonPseudoNode(), start ? textBox->start() : textBox->start() + textBox->len()); + return Position::editingPositionOf(box->getLineLayoutItem().nonPseudoNode(), start ? textBox->start() : textBox->start() + textBox->len()); } static inline bool isEditingBoundary(LayoutObject* ancestor, LayoutObject* child) @@ -1826,9 +1826,9 @@ LayoutPoint point(pointInLogicalContents.x(), closestBox->root().blockDirectionPointInLine()); if (!isHorizontalWritingMode()) point = point.transposedPoint(); - if (closestBox->lineLayoutItem().isAtomicInlineLevel()) - return positionForPointRespectingEditingBoundaries(this, LineLayoutBox(closestBox->lineLayoutItem()), point); - return closestBox->lineLayoutItem().positionForPoint(point); + if (closestBox->getLineLayoutItem().isAtomicInlineLevel()) + return positionForPointRespectingEditingBoundaries(this, LineLayoutBox(closestBox->getLineLayoutItem()), point); + return closestBox->getLineLayoutItem().positionForPoint(point); } if (lastRootBoxWithChildren) {
diff --git a/third_party/WebKit/Source/core/layout/LayoutBlockFlow.cpp b/third_party/WebKit/Source/core/layout/LayoutBlockFlow.cpp index 468ccc3..1bb6ccc5 100644 --- a/third_party/WebKit/Source/core/layout/LayoutBlockFlow.cpp +++ b/third_party/WebKit/Source/core/layout/LayoutBlockFlow.cpp
@@ -953,7 +953,7 @@ } if (oldFloatingObject->originatingLine() && !selfNeedsLayout()) { - ASSERT(oldFloatingObject->originatingLine()->lineLayoutItem().isEqual(this)); + ASSERT(oldFloatingObject->originatingLine()->getLineLayoutItem().isEqual(this)); oldFloatingObject->originatingLine()->markDirty(); } @@ -2300,7 +2300,7 @@ } if (floatingObject.originatingLine()) { if (!selfNeedsLayout()) { - ASSERT(floatingObject.originatingLine()->lineLayoutItem().isEqual(this)); + ASSERT(floatingObject.originatingLine()->getLineLayoutItem().isEqual(this)); floatingObject.originatingLine()->markDirty(); } #if ENABLE(ASSERT) @@ -2835,19 +2835,19 @@ void LayoutBlockFlow::positionDialog() { HTMLDialogElement* dialog = toHTMLDialogElement(node()); - if (dialog->centeringMode() == HTMLDialogElement::NotCentered) + if (dialog->getCenteringMode() == HTMLDialogElement::NotCentered) return; bool canCenterDialog = (style()->position() == AbsolutePosition || style()->position() == FixedPosition) && style()->hasAutoTopAndBottom(); - if (dialog->centeringMode() == HTMLDialogElement::Centered) { + if (dialog->getCenteringMode() == HTMLDialogElement::Centered) { if (canCenterDialog) setY(dialog->centeredPosition()); return; } - ASSERT(dialog->centeringMode() == HTMLDialogElement::NeedsCentering); + ASSERT(dialog->getCenteringMode() == HTMLDialogElement::NeedsCentering); if (!canCenterDialog) { dialog->setNotCentered(); return;
diff --git a/third_party/WebKit/Source/core/layout/LayoutBlockFlowLine.cpp b/third_party/WebKit/Source/core/layout/LayoutBlockFlowLine.cpp index 14de6946..e0eafe4 100644 --- a/third_party/WebKit/Source/core/layout/LayoutBlockFlowLine.cpp +++ b/third_party/WebKit/Source/core/layout/LayoutBlockFlowLine.cpp
@@ -281,14 +281,14 @@ if (!box) continue; - if (!rootHasSelectedChildren && box->lineLayoutItem().selectionState() != SelectionNone) + if (!rootHasSelectedChildren && box->getLineLayoutItem().getSelectionState() != SelectionNone) rootHasSelectedChildren = true; // If we have no parent box yet, or if the run is not simply a sibling, // then we need to construct inline boxes as necessary to properly enclose the // run's inline box. Segments can only be siblings at the root level, as // they are positioned separately. - if (!parentBox || (!parentBox->lineLayoutItem().isEqual(r->m_lineLayoutItem.parent()))) { + if (!parentBox || (!parentBox->getLineLayoutItem().isEqual(r->m_lineLayoutItem.parent()))) { // Create new inline boxes all the way back to the appropriate insertion point. parentBox = createLineBoxes(r->m_lineLayoutItem.parent(), lineInfo, box); } else { @@ -519,7 +519,7 @@ void LayoutBlockFlow::updateLogicalWidthForAlignment(const ETextAlign& textAlign, const RootInlineBox* rootInlineBox, BidiRun* trailingSpaceRun, LayoutUnit& logicalLeft, LayoutUnit& totalLogicalWidth, LayoutUnit& availableLogicalWidth, unsigned expansionOpportunityCount) { TextDirection direction; - if (rootInlineBox && rootInlineBox->lineLayoutItem().style()->unicodeBidi() == Plaintext) + if (rootInlineBox && rootInlineBox->getLineLayoutItem().style()->unicodeBidi() == Plaintext) direction = rootInlineBox->direction(); else direction = style()->direction(); @@ -704,7 +704,7 @@ return nullptr; // FIXME: Why is this only done when we had runs? - lineInfo.setLastLine(!end.lineLayoutItem()); + lineInfo.setLastLine(!end.getLineLayoutItem()); RootInlineBox* lineBox = constructLine(bidiRuns, lineInfo); if (!lineBox) @@ -803,7 +803,7 @@ for (; it != end; ++it) { FloatingObject& floatingObject = *it->get(); // If we've reached the start of clean lines any remaining floating children belong to them. - if (floatingObject.layoutObject() == cleanLineStart.lineLayoutItem() && layoutState.endLine()) { + if (floatingObject.layoutObject() == cleanLineStart.getLineLayoutItem() && layoutState.endLine()) { layoutState.setEndLineMatched(layoutState.endLineMatched() || matchedEndLine(layoutState, resolver, cleanLineStart, cleanLineBidiStatus)); if (layoutState.endLineMatched()) { layoutState.setLastFloat(&floatingObject); @@ -878,12 +878,12 @@ // This is a short-cut for empty lines. if (layoutState.lineInfo().isEmpty()) { if (lastRootBox()) - lastRootBox()->setLineBreakInfo(endOfLine.lineLayoutItem(), endOfLine.offset(), resolver.status()); + lastRootBox()->setLineBreakInfo(endOfLine.getLineLayoutItem(), endOfLine.offset(), resolver.status()); resolver.runs().deleteRuns(); } else { VisualDirectionOverride override = (styleToUse.rtlOrdering() == VisualOrder ? (styleToUse.direction() == LTR ? VisualLeftToRightOverride : VisualRightToLeftOverride) : NoVisualOverride); if (isNewUBAParagraph && styleToUse.unicodeBidi() == Plaintext && !resolver.context()->parent()) { - TextDirection direction = determinePlaintextDirectionality(resolver.position().root(), resolver.position().lineLayoutItem(), resolver.position().offset()); + TextDirection direction = determinePlaintextDirectionality(resolver.position().root(), resolver.position().getLineLayoutItem(), resolver.position().offset()); resolver.setStatus(BidiStatus(direction, isOverride(styleToUse.unicodeBidi()))); } // FIXME: This ownership is reversed. We should own the BidiRunList and pass it to createBidiRunsForLine. @@ -907,7 +907,7 @@ resolver.markCurrentRunEmpty(); // FIXME: This can probably be replaced by an ASSERT (or just removed). if (lineBox) { - lineBox->setLineBreakInfo(endOfLine.lineLayoutItem(), endOfLine.offset(), resolver.status()); + lineBox->setLineBreakInfo(endOfLine.getLineLayoutItem(), endOfLine.offset(), resolver.status()); if (layoutState.usesPaintInvalidationBounds()) layoutState.updatePaintInvalidationRangeFromBox(lineBox); @@ -1749,7 +1749,7 @@ if (!curr->endsWithBreak()) return false; InlineBox* lastBox = style()->isLeftToRightDirection() ? curr->lastLeafChild() : curr->firstLeafChild(); - return lastBox && lastBox->lineLayoutItem().isBR() && lastBox->lineLayoutItem().style()->clear() != CNONE; + return lastBox && lastBox->getLineLayoutItem().isBR() && lastBox->getLineLayoutItem().style()->clear() != CNONE; } void LayoutBlockFlow::determineEndPosition(LineLayoutState& layoutState, RootInlineBox* startLine, InlineIterator& cleanLineStart, BidiStatus& cleanLineBidiStatus) @@ -1842,7 +1842,7 @@ RootInlineBox* originalEndLine = layoutState.endLine(); RootInlineBox* line = originalEndLine; for (int i = 0; i < numLines && line; i++, line = line->nextRootBox()) { - if (line->lineBreakObj() == resolver.position().lineLayoutItem() && line->lineBreakPos() == resolver.position().offset()) { + if (line->lineBreakObj() == resolver.position().getLineLayoutItem() && line->lineBreakPos() == resolver.position().offset()) { // We have a match. if (line->lineBreakBidiStatus() != resolver.status()) return false; // ...but the bidi state doesn't match.
diff --git a/third_party/WebKit/Source/core/layout/LayoutBox.cpp b/third_party/WebKit/Source/core/layout/LayoutBox.cpp index 3bc1709..e534069 100644 --- a/third_party/WebKit/Source/core/layout/LayoutBox.cpp +++ b/third_party/WebKit/Source/core/layout/LayoutBox.cpp
@@ -1983,12 +1983,12 @@ rect.move(-containerOffset); // If the paintInvalidationContainer is fixed, then the rect is already in its coordinates so doesn't need viewport-adjusting. if (ancestor->style()->position() != FixedPosition && container->isLayoutView()) - toLayoutView(container)->adjustViewportConstrainedOffset(rect, LayoutView::viewportConstrainedPosition(position)); + toLayoutView(container)->adjustViewportConstrainedOffset(rect, LayoutView::toViewportConstrainedPosition(position)); return; } if (container->isLayoutView()) - toLayoutView(container)->mapToVisibleRectInAncestorSpace(ancestor, rect, LayoutView::viewportConstrainedPosition(position), paintInvalidationState); + toLayoutView(container)->mapToVisibleRectInAncestorSpace(ancestor, rect, LayoutView::toViewportConstrainedPosition(position), paintInvalidationState); else container->mapToVisibleRectInAncestorSpace(ancestor, rect, paintInvalidationState); }
diff --git a/third_party/WebKit/Source/core/layout/LayoutBoxModelObject.cpp b/third_party/WebKit/Source/core/layout/LayoutBoxModelObject.cpp index 70c3094..519f08b3 100644 --- a/third_party/WebKit/Source/core/layout/LayoutBoxModelObject.cpp +++ b/third_party/WebKit/Source/core/layout/LayoutBoxModelObject.cpp
@@ -78,11 +78,11 @@ void LayoutBoxModelObject::setSelectionState(SelectionState state) { - if (state == SelectionInside && selectionState() != SelectionNone) + if (state == SelectionInside && getSelectionState() != SelectionNone) return; - if ((state == SelectionStart && selectionState() == SelectionEnd) - || (state == SelectionEnd && selectionState() == SelectionStart)) + if ((state == SelectionStart && getSelectionState() == SelectionEnd) + || (state == SelectionEnd && getSelectionState() == SelectionStart)) LayoutObject::setSelectionState(SelectionBoth); else LayoutObject::setSelectionState(state);
diff --git a/third_party/WebKit/Source/core/layout/LayoutFlowThread.h b/third_party/WebKit/Source/core/layout/LayoutFlowThread.h index 6313db8..eec35e9 100644 --- a/third_party/WebKit/Source/core/layout/LayoutFlowThread.h +++ b/third_party/WebKit/Source/core/layout/LayoutFlowThread.h
@@ -156,7 +156,7 @@ // These structures are used by PODIntervalTree for debugging. #ifndef NDEBUG template <> struct ValueToString<LayoutMultiColumnSet*> { - static String string(const LayoutMultiColumnSet* value) { return String::format("%p", value); } + static String toString(const LayoutMultiColumnSet* value) { return String::format("%p", value); } }; #endif
diff --git a/third_party/WebKit/Source/core/layout/LayoutGeometryMap.h b/third_party/WebKit/Source/core/layout/LayoutGeometryMap.h index 315026fc..ed6666c 100644 --- a/third_party/WebKit/Source/core/layout/LayoutGeometryMap.h +++ b/third_party/WebKit/Source/core/layout/LayoutGeometryMap.h
@@ -51,7 +51,7 @@ LayoutGeometryMap(MapCoordinatesFlags = UseTransforms); ~LayoutGeometryMap(); - MapCoordinatesFlags mapCoordinatesFlags() const { return m_mapCoordinatesFlags; } + MapCoordinatesFlags getMapCoordinatesFlags() const { return m_mapCoordinatesFlags; } FloatRect absoluteRect(const FloatRect& rect) const {
diff --git a/third_party/WebKit/Source/core/layout/LayoutGrid.cpp b/third_party/WebKit/Source/core/layout/LayoutGrid.cpp index 353c95c..e294061 100644 --- a/third_party/WebKit/Source/core/layout/LayoutGrid.cpp +++ b/third_party/WebKit/Source/core/layout/LayoutGrid.cpp
@@ -765,7 +765,7 @@ return logicalHeightForChild(child, columnTracks); } -// We're basically using a class instead of a std::pair because of accessing gridItem() or gridSpan() is much more +// We're basically using a class instead of a std::pair because of accessing gridItem() or getGridSpan() is much more // self-explanatory that using .first or .second members in the pair. Having a std::pair<LayoutBox*, size_t> // does not work either because we still need the GridSpan so we'd have to add an extra hash lookup for each item // at the beginning of LayoutGrid::resolveContentBasedTrackSizingFunctionsForItems(). @@ -778,7 +778,7 @@ } LayoutBox& gridItem() const { return *m_gridItem; } - GridSpan gridSpan() const { return m_gridSpan; } + GridSpan getGridSpan() const { return m_gridSpan; } bool operator<(const GridItemWithSpan other) const { return m_gridSpan.integerSpan() < other.m_gridSpan.integerSpan(); } @@ -991,8 +991,8 @@ for (auto it = gridItemsWithSpan.rangeStart; it != gridItemsWithSpan.rangeEnd; ++it) { GridItemWithSpan& gridItemWithSpan = *it; - ASSERT(gridItemWithSpan.gridSpan().integerSpan() > 1); - const GridSpan& itemSpan = gridItemWithSpan.gridSpan(); + ASSERT(gridItemWithSpan.getGridSpan().integerSpan() > 1); + const GridSpan& itemSpan = gridItemWithSpan.getGridSpan(); sizingData.growBeyondGrowthLimitsTracks.shrink(0); sizingData.filteredTracks.shrink(0);
diff --git a/third_party/WebKit/Source/core/layout/LayoutInline.cpp b/third_party/WebKit/Source/core/layout/LayoutInline.cpp index b73476f..2b830b0 100644 --- a/third_party/WebKit/Source/core/layout/LayoutInline.cpp +++ b/third_party/WebKit/Source/core/layout/LayoutInline.cpp
@@ -564,7 +564,7 @@ LayoutBox* currBox = toLayoutBox(curr); if (currBox->inlineBoxWrapper()) { RootInlineBox& rootBox = currBox->inlineBoxWrapper()->root(); - LayoutUnit logicalTop = rootBox.logicalTop() + (rootBox.lineLayoutItem().style(rootBox.isFirstLineStyle())->font().fontMetrics().ascent() - container->style(rootBox.isFirstLineStyle())->font().fontMetrics().ascent()); + LayoutUnit logicalTop = rootBox.logicalTop() + (rootBox.getLineLayoutItem().style(rootBox.isFirstLineStyle())->font().fontMetrics().ascent() - container->style(rootBox.isFirstLineStyle())->font().fontMetrics().ascent()); LayoutUnit logicalHeight(container->style(rootBox.isFirstLineStyle())->font().fontMetrics().height()); if (isHorizontal) { yield(LayoutRect(LayoutUnit(currBox->inlineBoxWrapper()->x() - currBox->marginLeft()), LayoutUnit(logicalTop), @@ -582,7 +582,7 @@ } else { for (InlineFlowBox* childLine = currInline->firstLineBox(); childLine; childLine = childLine->nextLineBox()) { RootInlineBox& rootBox = childLine->root(); - LayoutUnit logicalTop = rootBox.logicalTop() + (rootBox.lineLayoutItem().style(rootBox.isFirstLineStyle())->font().fontMetrics().ascent() - container->style(rootBox.isFirstLineStyle())->font().fontMetrics().ascent()); + LayoutUnit logicalTop = rootBox.logicalTop() + (rootBox.getLineLayoutItem().style(rootBox.isFirstLineStyle())->font().fontMetrics().ascent() - container->style(rootBox.isFirstLineStyle())->font().fontMetrics().ascent()); LayoutUnit logicalHeight(container->style(rootBox.isFirstLineStyle())->font().fontMetrics().height()); if (isHorizontal) { yield(LayoutRect(LayoutUnit(childLine->x() - childLine->marginLogicalLeft()), @@ -602,7 +602,7 @@ for (InlineTextBox* childText = currText->firstTextBox(); childText; childText = childText->nextTextBox()) { RootInlineBox& rootBox = childText->root(); LayoutUnit logicalTop = LayoutUnit(rootBox.logicalTop() - + (rootBox.lineLayoutItem().style(rootBox.isFirstLineStyle())->font().fontMetrics().ascent() + + (rootBox.getLineLayoutItem().style(rootBox.isFirstLineStyle())->font().fontMetrics().ascent() - container->style(rootBox.isFirstLineStyle())->font().fontMetrics().ascent())); LayoutUnit logicalHeight(container->style(rootBox.isFirstLineStyle())->font().fontMetrics().height()); if (isHorizontal)
diff --git a/third_party/WebKit/Source/core/layout/LayoutListMarker.cpp b/third_party/WebKit/Source/core/layout/LayoutListMarker.cpp index b77747d..6c38a33 100644 --- a/third_party/WebKit/Source/core/layout/LayoutListMarker.cpp +++ b/third_party/WebKit/Source/core/layout/LayoutListMarker.cpp
@@ -444,7 +444,7 @@ { ASSERT(!needsLayout()); - if (selectionState() == SelectionNone || !inlineBoxWrapper()) + if (getSelectionState() == SelectionNone || !inlineBoxWrapper()) return LayoutRect(); RootInlineBox& root = inlineBoxWrapper()->root();
diff --git a/third_party/WebKit/Source/core/layout/LayoutObject.cpp b/third_party/WebKit/Source/core/layout/LayoutObject.cpp index 8e93284..0d1bf5f 100644 --- a/third_party/WebKit/Source/core/layout/LayoutObject.cpp +++ b/third_party/WebKit/Source/core/layout/LayoutObject.cpp
@@ -2570,7 +2570,7 @@ bool LayoutObject::isSelectionBorder() const { - SelectionState st = selectionState(); + SelectionState st = getSelectionState(); return st == SelectionStart || st == SelectionEnd || st == SelectionBoth; }
diff --git a/third_party/WebKit/Source/core/layout/LayoutObject.h b/third_party/WebKit/Source/core/layout/LayoutObject.h index 8d06f7d..548954a 100644 --- a/third_party/WebKit/Source/core/layout/LayoutObject.h +++ b/third_party/WebKit/Source/core/layout/LayoutObject.h
@@ -669,7 +669,7 @@ HasBoxDecorationBackgroundKnownToBeObscured, HasBoxDecorationBackgroundMayBeVisible, }; - bool hasBoxDecorationBackground() const { return m_bitfields.boxDecorationBackgroundState() != NoBoxDecorationBackground; } + bool hasBoxDecorationBackground() const { return m_bitfields.getBoxDecorationBackgroundState() != NoBoxDecorationBackground; } bool boxDecorationBackgroundIsKnownToBeObscured() const; bool mustInvalidateFillLayersPaintOnHeightChange(const FillLayer&) const; bool hasBackground() const { return style()->hasBackground(); } @@ -1128,7 +1128,7 @@ // The current selection state for an object. For blocks, the state refers to the state of the leaf // descendants (as described above in the SelectionState enum declaration). - SelectionState selectionState() const { return m_bitfields.selectionState(); } + SelectionState getSelectionState() const { return m_bitfields.getSelectionState(); } virtual void setSelectionState(SelectionState state) { m_bitfields.setSelectionState(state); } inline void setSelectionStateIfNeeded(SelectionState); bool canUpdateSelectionOnRootLineBoxes() const; @@ -1141,7 +1141,7 @@ LayoutRect selectionRectInViewCoordinates() const; virtual bool canBeSelectionLeaf() const { return false; } - bool hasSelectedChildren() const { return selectionState() != SelectionNone; } + bool hasSelectedChildren() const { return getSelectionState() != SelectionNone; } bool isSelectable() const; // Obtains the selection colors that should be used when painting a selection. @@ -1343,7 +1343,7 @@ LayoutObject& m_layoutObject; }; - MutableForPainting mutableForPainting() const { return MutableForPainting(*this); } + MutableForPainting getMutableForPainting() const { return MutableForPainting(*this); } void setIsScrollAnchorObject() { m_bitfields.setIsScrollAnchorObject(true); } // Clears the IsScrollAnchorObject bit, unless any ScrollAnchor still refers to us. @@ -1855,10 +1855,10 @@ } void clearPositionedState() { m_positionedState = StaticPosition; } - ALWAYS_INLINE SelectionState selectionState() const { return static_cast<SelectionState>(m_selectionState); } + ALWAYS_INLINE SelectionState getSelectionState() const { return static_cast<SelectionState>(m_selectionState); } ALWAYS_INLINE void setSelectionState(SelectionState selectionState) { m_selectionState = selectionState; } - ALWAYS_INLINE BoxDecorationBackgroundState boxDecorationBackgroundState() const { return static_cast<BoxDecorationBackgroundState>(m_boxDecorationBackgroundState); } + ALWAYS_INLINE BoxDecorationBackgroundState getBoxDecorationBackgroundState() const { return static_cast<BoxDecorationBackgroundState>(m_boxDecorationBackgroundState); } ALWAYS_INLINE void setBoxDecorationBackgroundState(BoxDecorationBackgroundState s) const { m_boxDecorationBackgroundState = s; } PaintInvalidationReason fullPaintInvalidationReason() const { return static_cast<PaintInvalidationReason>(m_fullPaintInvalidationReason); } @@ -2038,7 +2038,7 @@ inline void LayoutObject::setSelectionStateIfNeeded(SelectionState state) { - if (selectionState() == state) + if (getSelectionState() == state) return; setSelectionState(state); @@ -2064,11 +2064,11 @@ inline bool LayoutObject::boxDecorationBackgroundIsKnownToBeObscured() const { - if (m_bitfields.boxDecorationBackgroundState() == HasBoxDecorationBackgroundObscurationStatusInvalid) { + if (m_bitfields.getBoxDecorationBackgroundState() == HasBoxDecorationBackgroundObscurationStatusInvalid) { BoxDecorationBackgroundState state = computeBackgroundIsKnownToBeObscured() ? HasBoxDecorationBackgroundKnownToBeObscured : HasBoxDecorationBackgroundMayBeVisible; m_bitfields.setBoxDecorationBackgroundState(state); } - return m_bitfields.boxDecorationBackgroundState() == HasBoxDecorationBackgroundKnownToBeObscured; + return m_bitfields.getBoxDecorationBackgroundState() == HasBoxDecorationBackgroundKnownToBeObscured; } inline void makeMatrixRenderable(TransformationMatrix& matrix, bool has3DRendering)
diff --git a/third_party/WebKit/Source/core/layout/LayoutReplaced.cpp b/third_party/WebKit/Source/core/layout/LayoutReplaced.cpp index c9185389..7799e2c 100644 --- a/third_party/WebKit/Source/core/layout/LayoutReplaced.cpp +++ b/third_party/WebKit/Source/core/layout/LayoutReplaced.cpp
@@ -726,7 +726,7 @@ LayoutRect LayoutReplaced::localSelectionRect() const { - if (selectionState() == SelectionNone) + if (getSelectionState() == SelectionNone) return LayoutRect(); if (!inlineBoxWrapper()) {
diff --git a/third_party/WebKit/Source/core/layout/LayoutText.cpp b/third_party/WebKit/Source/core/layout/LayoutText.cpp index 70384e9d..3af1361a 100644 --- a/third_party/WebKit/Source/core/layout/LayoutText.cpp +++ b/third_party/WebKit/Source/core/layout/LayoutText.cpp
@@ -524,8 +524,8 @@ affinity = offset > box->caretMinOffset() ? VP_UPSTREAM_IF_POSSIBLE : TextAffinity::Downstream; break; } - int textStartOffset = box->lineLayoutItem().isText() ? LineLayoutText(box->lineLayoutItem()).textStartOffset() : 0; - return box->lineLayoutItem().createPositionWithAffinity(offset + textStartOffset, affinity); + int textStartOffset = box->getLineLayoutItem().isText() ? LineLayoutText(box->getLineLayoutItem()).textStartOffset() : 0; + return box->getLineLayoutItem().createPositionWithAffinity(offset + textStartOffset, affinity); } static PositionWithAffinity createPositionWithAffinityForBoxAfterAdjustingOffsetForBiDi(const InlineTextBox* box, int offset, ShouldAffinityBeDownstream shouldAffinityBeDownstream) @@ -542,7 +542,7 @@ const InlineBox* prevBox = box->prevLeafChildIgnoringLineBreak(); if ((prevBox && prevBox->bidiLevel() == box->bidiLevel()) - || box->lineLayoutItem().containingBlock().style()->direction() == box->direction()) // FIXME: left on 12CBA + || box->getLineLayoutItem().containingBlock().style()->direction() == box->direction()) // FIXME: left on 12CBA return createPositionWithAffinityForBox(box, box->caretLeftmostOffset(), shouldAffinityBeDownstream); if (prevBox && prevBox->bidiLevel() > box->bidiLevel()) { @@ -572,7 +572,7 @@ const InlineBox* nextBox = box->nextLeafChildIgnoringLineBreak(); if ((nextBox && nextBox->bidiLevel() == box->bidiLevel()) - || box->lineLayoutItem().containingBlock().style()->direction() == box->direction()) + || box->getLineLayoutItem().containingBlock().style()->direction() == box->direction()) return createPositionWithAffinityForBox(box, box->caretRightmostOffset(), shouldAffinityBeDownstream); // offset is on the right edge @@ -1185,13 +1185,13 @@ if (state == SelectionStart || state == SelectionEnd || state == SelectionBoth) { int startPos, endPos; selectionStartEnd(startPos, endPos); - if (selectionState() == SelectionStart) { + if (getSelectionState() == SelectionStart) { endPos = textLength(); // to handle selection from end of text to end of line if (startPos && startPos == endPos) startPos = endPos - 1; - } else if (selectionState() == SelectionEnd) { + } else if (getSelectionState() == SelectionEnd) { startPos = 0; } @@ -1587,7 +1587,7 @@ { ASSERT(!needsLayout()); - if (selectionState() == SelectionNone) + if (getSelectionState() == SelectionNone) return LayoutRect(); LayoutBlock* cb = containingBlock(); if (!cb) @@ -1596,15 +1596,15 @@ // Now calculate startPos and endPos for painting selection. // We include a selection while endPos > 0 int startPos, endPos; - if (selectionState() == SelectionInside) { + if (getSelectionState() == SelectionInside) { // We are fully selected. startPos = 0; endPos = textLength(); } else { selectionStartEnd(startPos, endPos); - if (selectionState() == SelectionStart) + if (getSelectionState() == SelectionStart) endPos = textLength(); - else if (selectionState() == SelectionEnd) + else if (getSelectionState() == SelectionEnd) startPos = 0; } @@ -1716,7 +1716,7 @@ #ifdef CHECK_CONSISTENCY const InlineTextBox* prev = nullptr; for (const InlineTextBox* child = m_firstTextBox; child; child = child->nextTextBox()) { - ASSERT(child->lineLayoutItem().isEqual(this)); + ASSERT(child->getLineLayoutItem().isEqual(this)); ASSERT(child->prevTextBox() == prev); prev = child; }
diff --git a/third_party/WebKit/Source/core/layout/LayoutTextControl.cpp b/third_party/WebKit/Source/core/layout/LayoutTextControl.cpp index 2ea7fdd..75c6f46 100644 --- a/third_party/WebKit/Source/core/layout/LayoutTextControl.cpp +++ b/third_party/WebKit/Source/core/layout/LayoutTextControl.cpp
@@ -210,12 +210,14 @@ float LayoutTextControl::getAvgCharWidth(const AtomicString& family) const { - if (hasValidAvgCharWidth(family)) - return roundf(style()->font().primaryFont()->avgCharWidth()); + const Font& font = style()->font(); + if (hasValidAvgCharWidth(family)) { + ASSERT(font.primaryFont()); + return roundf(font.primaryFont()->avgCharWidth()); + } const UChar ch = '0'; const String str = String(&ch, 1); - const Font& font = style()->font(); TextRun textRun = constructTextRun(font, str, styleRef(), TextRun::AllowTrailingExpansion); return font.width(textRun); }
diff --git a/third_party/WebKit/Source/core/layout/LayoutTheme.cpp b/third_party/WebKit/Source/core/layout/LayoutTheme.cpp index 53729a5..108117645 100644 --- a/third_party/WebKit/Source/core/layout/LayoutTheme.cpp +++ b/third_party/WebKit/Source/core/layout/LayoutTheme.cpp
@@ -548,7 +548,7 @@ || !toElement(node)->isSpinButtonElement()) return false; SpinButtonElement* element = toSpinButtonElement(node); - return element->upDownState() == SpinButtonElement::Up; + return element->getUpDownState() == SpinButtonElement::Up; } bool LayoutTheme::isReadOnlyControl(const LayoutObject& o) @@ -568,7 +568,7 @@ if (!node->isElementNode() || !toElement(node)->isSpinButtonElement()) return node->hovered(); SpinButtonElement* element = toSpinButtonElement(node); - return element->hovered() && element->upDownState() != SpinButtonElement::Indeterminate; + return element->hovered() && element->getUpDownState() != SpinButtonElement::Indeterminate; } bool LayoutTheme::isSpinUpButtonPartHovered(const LayoutObject& o) @@ -577,7 +577,7 @@ if (!node || !node->isElementNode() || !toElement(node)->isSpinButtonElement()) return false; SpinButtonElement* element = toSpinButtonElement(node); - return element->upDownState() == SpinButtonElement::Up; + return element->getUpDownState() == SpinButtonElement::Up; } void LayoutTheme::adjustCheckboxStyle(ComputedStyle& style) const
diff --git a/third_party/WebKit/Source/core/layout/LayoutThemeAndroid.h b/third_party/WebKit/Source/core/layout/LayoutThemeAndroid.h index 45daca5..1780c3b 100644 --- a/third_party/WebKit/Source/core/layout/LayoutThemeAndroid.h +++ b/third_party/WebKit/Source/core/layout/LayoutThemeAndroid.h
@@ -12,6 +12,7 @@ class LayoutThemeAndroid final : public LayoutThemeMobile { public: static PassRefPtr<LayoutTheme> create(); + bool delegatesMenuListRendering() const override { return true; } private: ~LayoutThemeAndroid() override;
diff --git a/third_party/WebKit/Source/core/layout/LayoutThemeMobile.h b/third_party/WebKit/Source/core/layout/LayoutThemeMobile.h index 779703923..2c826e4 100644 --- a/third_party/WebKit/Source/core/layout/LayoutThemeMobile.h +++ b/third_party/WebKit/Source/core/layout/LayoutThemeMobile.h
@@ -37,8 +37,6 @@ void adjustInnerSpinButtonStyle(ComputedStyle&) const override; - bool delegatesMenuListRendering() const override { return true; } - String extraMediaControlsStyleSheet() override; Color platformTapHighlightColor() const override
diff --git a/third_party/WebKit/Source/core/layout/LayoutTreeAsText.cpp b/third_party/WebKit/Source/core/layout/LayoutTreeAsText.cpp index 93a18fb..b8ee77c 100644 --- a/third_party/WebKit/Source/core/layout/LayoutTreeAsText.cpp +++ b/third_party/WebKit/Source/core/layout/LayoutTreeAsText.cpp
@@ -409,7 +409,7 @@ { writeIndent(ts, indent); ts << "+ "; - ts << box.boxName() << " {" << box.lineLayoutItem().debugName() << "}" + ts << box.boxName() << " {" << box.getLineLayoutItem().debugName() << "}" << " pos=(" << box.x() << "," << box.y() << ")" << " size=(" << box.width() << "," << box.height() << ")" << " baseline=" << box.baselinePosition(AlphabeticBaseline)
diff --git a/third_party/WebKit/Source/core/layout/LayoutVideo.cpp b/third_party/WebKit/Source/core/layout/LayoutVideo.cpp index f6638f1..7c04530 100644 --- a/third_party/WebKit/Source/core/layout/LayoutVideo.cpp +++ b/third_party/WebKit/Source/core/layout/LayoutVideo.cpp
@@ -90,7 +90,7 @@ // of the video resource, if that is available; otherwise it is the intrinsic // height of the poster frame, if that is available; otherwise it is 150 CSS pixels. WebMediaPlayer* webMediaPlayer = mediaElement()->webMediaPlayer(); - if (webMediaPlayer && video->readyState() >= HTMLVideoElement::HAVE_METADATA) { + if (webMediaPlayer && video->getReadyState() >= HTMLVideoElement::HAVE_METADATA) { IntSize size = webMediaPlayer->naturalSize(); if (!size.isEmpty()) return LayoutSize(size);
diff --git a/third_party/WebKit/Source/core/layout/LayoutView.cpp b/third_party/WebKit/Source/core/layout/LayoutView.cpp index bbfcf0dd..db6a5ad8 100644 --- a/third_party/WebKit/Source/core/layout/LayoutView.cpp +++ b/third_party/WebKit/Source/core/layout/LayoutView.cpp
@@ -366,7 +366,7 @@ offsetForFixedPosition = LayoutSize(scrolledContentOffset()); } - if (geometryMap.mapCoordinatesFlags() & TraverseDocumentBoundaries) { + if (geometryMap.getMapCoordinatesFlags() & TraverseDocumentBoundaries) { if (LayoutPart* parentDocLayoutObject = frame()->ownerLayoutObject()) { offset = -LayoutSize(m_frameView->scrollOffset()); offset += parentDocLayoutObject->contentBoxOffset(); @@ -579,7 +579,7 @@ LayoutObject* os = m_selectionStart; LayoutObject* stop = layoutObjectAfterPosition(m_selectionEnd, m_selectionEndPos); while (os && os != stop) { - if ((os->canBeSelectionLeaf() || os == m_selectionStart || os == m_selectionEnd) && os->selectionState() != SelectionNone) { + if ((os->canBeSelectionLeaf() || os == m_selectionStart || os == m_selectionEnd) && os->getSelectionState() != SelectionNone) { // Blocks are responsible for painting line gaps and margin gaps. They must be examined as well. selRect.unite(selectionRectForLayoutObject(os)); const LayoutBlock* cb = os->containingBlock(); @@ -606,7 +606,7 @@ for (LayoutObject* o = m_selectionStart; o && o != end; o = o->nextInPreOrder()) { if (!o->canBeSelectionLeaf() && o != m_selectionStart && o != m_selectionEnd) continue; - if (o->selectionState() == SelectionNone) + if (o->getSelectionState() == SelectionNone) continue; o->setShouldInvalidateSelection(); @@ -684,13 +684,13 @@ bool exploringBackwards = false; bool continueExploring = os && (os != stop); while (continueExploring) { - if ((os->canBeSelectionLeaf() || os == m_selectionStart || os == m_selectionEnd) && os->selectionState() != SelectionNone) { + if ((os->canBeSelectionLeaf() || os == m_selectionStart || os == m_selectionEnd) && os->getSelectionState() != SelectionNone) { // Blocks are responsible for painting line gaps and margin gaps. They must be examined as well. - oldSelectedObjects.set(os, os->selectionState()); + oldSelectedObjects.set(os, os->getSelectionState()); if (blockPaintInvalidationMode == PaintInvalidationNewXOROld) { LayoutBlock* cb = os->containingBlock(); while (cb && !cb->isLayoutView()) { - SelectedBlockMap::AddResult result = oldSelectedBlocks.add(cb, cb->selectionState()); + SelectedBlockMap::AddResult result = oldSelectedBlocks.add(cb, cb->getSelectionState()); if (!result.isNewEntry) break; cb = cb->containingBlock(); @@ -737,11 +737,11 @@ exploringBackwards = false; continueExploring = o && (o != stop); while (continueExploring) { - if ((o->canBeSelectionLeaf() || o == start || o == end) && o->selectionState() != SelectionNone) { - newSelectedObjects.set(o, o->selectionState()); + if ((o->canBeSelectionLeaf() || o == start || o == end) && o->getSelectionState() != SelectionNone) { + newSelectedObjects.set(o, o->getSelectionState()); LayoutBlock* cb = o->containingBlock(); while (cb && !cb->isLayoutView()) { - SelectedBlockMap::AddResult result = newSelectedBlocks.add(cb, cb->selectionState()); + SelectedBlockMap::AddResult result = newSelectedBlocks.add(cb, cb->getSelectionState()); if (!result.isNewEntry) break; cb = cb->containingBlock(); @@ -757,7 +757,7 @@ // Have any of the old selected objects changed compared to the new selection? for (SelectedObjectMap::iterator i = oldSelectedObjects.begin(); i != oldObjectsEnd; ++i) { LayoutObject* obj = i->key; - SelectionState newSelectionState = obj->selectionState(); + SelectionState newSelectionState = obj->getSelectionState(); SelectionState oldSelectionState = i->value; if (newSelectionState != oldSelectionState || (m_selectionStart == obj && oldStartPos != m_selectionStartPos) @@ -776,7 +776,7 @@ SelectedBlockMap::iterator oldBlocksEnd = oldSelectedBlocks.end(); for (SelectedBlockMap::iterator i = oldSelectedBlocks.begin(); i != oldBlocksEnd; ++i) { LayoutBlock* block = i->key; - SelectionState newSelectionState = block->selectionState(); + SelectionState newSelectionState = block->getSelectionState(); SelectionState oldSelectionState = i->value; if (newSelectionState != oldSelectionState) { block->setShouldInvalidateSelection();
diff --git a/third_party/WebKit/Source/core/layout/LayoutView.h b/third_party/WebKit/Source/core/layout/LayoutView.h index 9cf6840..87748b9 100644 --- a/third_party/WebKit/Source/core/layout/LayoutView.h +++ b/third_party/WebKit/Source/core/layout/LayoutView.h
@@ -109,7 +109,7 @@ IsFixedPosition, }; - static ViewportConstrainedPosition viewportConstrainedPosition(EPosition position) { return position == FixedPosition ? IsFixedPosition : IsNotFixedPosition; } + static ViewportConstrainedPosition toViewportConstrainedPosition(EPosition position) { return position == FixedPosition ? IsFixedPosition : IsNotFixedPosition; } void mapToVisibleRectInAncestorSpace(const LayoutBoxModelObject* ancestor, LayoutRect&, ViewportConstrainedPosition, const PaintInvalidationState*) const; void mapToVisibleRectInAncestorSpace(const LayoutBoxModelObject* ancestor, LayoutRect&, const PaintInvalidationState*) const override; void adjustViewportConstrainedOffset(LayoutRect&, ViewportConstrainedPosition) const;
diff --git a/third_party/WebKit/Source/core/layout/api/LayoutItem.h b/third_party/WebKit/Source/core/layout/api/LayoutItem.h index dbb1ceef..add95a80 100644 --- a/third_party/WebKit/Source/core/layout/api/LayoutItem.h +++ b/third_party/WebKit/Source/core/layout/api/LayoutItem.h
@@ -11,6 +11,8 @@ namespace blink { +class FrameView; + class LayoutItem { DISALLOW_NEW_EXCEPT_PLACEMENT_NEW(); public: @@ -67,6 +69,11 @@ return m_layoutObject->isTextControl(); } + bool isLayoutPart() const + { + return m_layoutObject->isLayoutPart(); + } + bool needsLayout() { return m_layoutObject->needsLayout(); @@ -92,6 +99,11 @@ return m_layoutObject->offsetFromContainer(item.layoutObject(), point, offsetDependsOnPoint); } + FrameView* frameView() const + { + return m_layoutObject->document().view(); + } + void setMayNeedPaintInvalidation() { m_layoutObject->setMayNeedPaintInvalidation();
diff --git a/third_party/WebKit/Source/core/layout/api/LayoutPartItem.h b/third_party/WebKit/Source/core/layout/api/LayoutPartItem.h new file mode 100644 index 0000000..c3351cb --- /dev/null +++ b/third_party/WebKit/Source/core/layout/api/LayoutPartItem.h
@@ -0,0 +1,49 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef LayoutPartItem_h +#define LayoutPartItem_h + +#include "core/layout/LayoutPart.h" +#include "core/layout/api/LayoutBoxItem.h" + +namespace blink { + +class LayoutPartItem : public LayoutBoxItem { +public: + explicit LayoutPartItem(LayoutPart* layoutPart) + : LayoutBoxItem(layoutPart) + { + } + + explicit LayoutPartItem(const LayoutItem& item) + : LayoutBoxItem(item) + { + ASSERT(!item || item.isLayoutPart()); + } + + explicit LayoutPartItem(std::nullptr_t) : LayoutBoxItem(nullptr) { } + + LayoutPartItem() { } + + void updateOnWidgetChange() + { + toPart()->updateOnWidgetChange(); + } + +private: + LayoutPart* toPart() + { + return toLayoutPart(layoutObject()); + } + + const LayoutPart* toPart() const + { + return toLayoutPart(layoutObject()); + } +}; + +} // namespace blink + +#endif // LayoutPartItem_h
diff --git a/third_party/WebKit/Source/core/layout/api/LineLayoutItem.h b/third_party/WebKit/Source/core/layout/api/LineLayoutItem.h index 8824f1d..da672d7 100644 --- a/third_party/WebKit/Source/core/layout/api/LineLayoutItem.h +++ b/third_party/WebKit/Source/core/layout/api/LineLayoutItem.h
@@ -335,9 +335,9 @@ return m_layoutObject->hitTest(result, locationInContainer, accumulatedOffset, filter); } - SelectionState selectionState() const + SelectionState getSelectionState() const { - return m_layoutObject->selectionState(); + return m_layoutObject->getSelectionState(); } Color selectionBackgroundColor() const
diff --git a/third_party/WebKit/Source/core/layout/compositing/PaintLayerCompositor.cpp b/third_party/WebKit/Source/core/layout/compositing/PaintLayerCompositor.cpp index f1f16c6..0635acd1 100644 --- a/third_party/WebKit/Source/core/layout/compositing/PaintLayerCompositor.cpp +++ b/third_party/WebKit/Source/core/layout/compositing/PaintLayerCompositor.cpp
@@ -660,7 +660,7 @@ bool PaintLayerCompositor::attachFrameContentLayersToIframeLayer(LayoutPart* layoutObject) { PaintLayerCompositor* innerCompositor = frameContentsCompositor(layoutObject); - if (!innerCompositor || !innerCompositor->staleInCompositingMode() || innerCompositor->rootLayerAttachment() != RootLayerAttachedViaEnclosingFrame) + if (!innerCompositor || !innerCompositor->staleInCompositingMode() || innerCompositor->getRootLayerAttachment() != RootLayerAttachedViaEnclosingFrame) return false; PaintLayer* layer = layoutObject->layer();
diff --git a/third_party/WebKit/Source/core/layout/compositing/PaintLayerCompositor.h b/third_party/WebKit/Source/core/layout/compositing/PaintLayerCompositor.h index 7520b695..052b153 100644 --- a/third_party/WebKit/Source/core/layout/compositing/PaintLayerCompositor.h +++ b/third_party/WebKit/Source/core/layout/compositing/PaintLayerCompositor.h
@@ -127,7 +127,7 @@ RootLayerAttachedViaEnclosingFrame }; - RootLayerAttachment rootLayerAttachment() const { return m_rootLayerAttachment; } + RootLayerAttachment getRootLayerAttachment() const { return m_rootLayerAttachment; } void updateRootLayerAttachment(); void updateRootLayerPosition();
diff --git a/third_party/WebKit/Source/core/layout/line/AbstractInlineTextBox.cpp b/third_party/WebKit/Source/core/layout/line/AbstractInlineTextBox.cpp index d7ded7df..cdd011a 100644 --- a/third_party/WebKit/Source/core/layout/line/AbstractInlineTextBox.cpp +++ b/third_party/WebKit/Source/core/layout/line/AbstractInlineTextBox.cpp
@@ -86,7 +86,7 @@ PassRefPtr<AbstractInlineTextBox> AbstractInlineTextBox::nextInlineTextBox() const { - ASSERT(!m_inlineTextBox || !m_inlineTextBox->lineLayoutItem().needsLayout()); + ASSERT(!m_inlineTextBox || !m_inlineTextBox->getLineLayoutItem().needsLayout()); if (!m_inlineTextBox) return nullptr; @@ -171,38 +171,38 @@ bool AbstractInlineTextBox::isFirst() const { - ASSERT(!m_inlineTextBox || !m_inlineTextBox->lineLayoutItem().needsLayout()); + ASSERT(!m_inlineTextBox || !m_inlineTextBox->getLineLayoutItem().needsLayout()); return !m_inlineTextBox || !m_inlineTextBox->prevTextBox(); } bool AbstractInlineTextBox::isLast() const { - ASSERT(!m_inlineTextBox || !m_inlineTextBox->lineLayoutItem().needsLayout()); + ASSERT(!m_inlineTextBox || !m_inlineTextBox->getLineLayoutItem().needsLayout()); return !m_inlineTextBox || !m_inlineTextBox->nextTextBox(); } PassRefPtr<AbstractInlineTextBox> AbstractInlineTextBox::nextOnLine() const { - ASSERT(!m_inlineTextBox || !m_inlineTextBox->lineLayoutItem().needsLayout()); + ASSERT(!m_inlineTextBox || !m_inlineTextBox->getLineLayoutItem().needsLayout()); if (!m_inlineTextBox) return nullptr; InlineBox* next = m_inlineTextBox->nextOnLine(); if (next && next->isInlineTextBox()) - return getOrCreate(toInlineTextBox(next)->lineLayoutItem(), toInlineTextBox(next)); + return getOrCreate(toInlineTextBox(next)->getLineLayoutItem(), toInlineTextBox(next)); return nullptr; } PassRefPtr<AbstractInlineTextBox> AbstractInlineTextBox::previousOnLine() const { - ASSERT(!m_inlineTextBox || !m_inlineTextBox->lineLayoutItem().needsLayout()); + ASSERT(!m_inlineTextBox || !m_inlineTextBox->getLineLayoutItem().needsLayout()); if (!m_inlineTextBox) return nullptr; InlineBox* previous = m_inlineTextBox->prevOnLine(); if (previous && previous->isInlineTextBox()) - return getOrCreate(toInlineTextBox(previous)->lineLayoutItem(), toInlineTextBox(previous)); + return getOrCreate(toInlineTextBox(previous)->getLineLayoutItem(), toInlineTextBox(previous)); return nullptr; }
diff --git a/third_party/WebKit/Source/core/layout/line/AbstractInlineTextBox.h b/third_party/WebKit/Source/core/layout/line/AbstractInlineTextBox.h index 7dc5396..c8305cf 100644 --- a/third_party/WebKit/Source/core/layout/line/AbstractInlineTextBox.h +++ b/third_party/WebKit/Source/core/layout/line/AbstractInlineTextBox.h
@@ -75,7 +75,7 @@ ~AbstractInlineTextBox(); - LineLayoutText lineLayoutItem() const { return m_lineLayoutItem; } + LineLayoutText getLineLayoutItem() const { return m_lineLayoutItem; } PassRefPtr<AbstractInlineTextBox> nextInlineTextBox() const; LayoutRect bounds() const;
diff --git a/third_party/WebKit/Source/core/layout/line/BreakingContext.cpp b/third_party/WebKit/Source/core/layout/line/BreakingContext.cpp index 96d2e824..80e1877f 100644 --- a/third_party/WebKit/Source/core/layout/line/BreakingContext.cpp +++ b/third_party/WebKit/Source/core/layout/line/BreakingContext.cpp
@@ -27,15 +27,15 @@ InlineIterator BreakingContext::handleEndOfLine() { - if (m_lineBreak == m_resolver.position() && (!m_lineBreak.lineLayoutItem() || !m_lineBreak.lineLayoutItem().isBR())) { + if (m_lineBreak == m_resolver.position() && (!m_lineBreak.getLineLayoutItem() || !m_lineBreak.getLineLayoutItem().isBR())) { // we just add as much as possible if (m_blockStyle->whiteSpace() == PRE && !m_current.offset()) { m_lineBreak.moveTo(m_lastObject, m_lastObject.isText() ? m_lastObject.length() : 0); - } else if (m_lineBreak.lineLayoutItem()) { + } else if (m_lineBreak.getLineLayoutItem()) { // Don't ever break in the middle of a word if we can help it. // There's no room at all. We just have to be on this line, // even though we'll spill out. - m_lineBreak.moveTo(m_current.lineLayoutItem(), m_current.offset()); + m_lineBreak.moveTo(m_current.getLineLayoutItem(), m_current.offset()); } } @@ -59,7 +59,7 @@ do { m_lineBreak.setOffset(m_lineBreak.offset() - 1); m_lineBreak.increment(); - } while (!m_lineBreak.atEnd() && isEmptyInline(m_lineBreak.lineLayoutItem())); + } while (!m_lineBreak.atEnd() && isEmptyInline(m_lineBreak.getLineLayoutItem())); } return m_lineBreak;
diff --git a/third_party/WebKit/Source/core/layout/line/BreakingContextInlineHeaders.h b/third_party/WebKit/Source/core/layout/line/BreakingContextInlineHeaders.h index 129bac52..0490fe75 100644 --- a/third_party/WebKit/Source/core/layout/line/BreakingContextInlineHeaders.h +++ b/third_party/WebKit/Source/core/layout/line/BreakingContextInlineHeaders.h
@@ -58,7 +58,7 @@ , m_current(resolver.position()) , m_lineBreak(resolver.position()) , m_block(block) - , m_lastObject(m_current.lineLayoutItem()) + , m_lastObject(m_current.getLineLayoutItem()) , m_nextObject(nullptr) , m_currentStyle(nullptr) , m_blockStyle(block.style()) @@ -86,7 +86,7 @@ m_lineInfo.setPreviousLineBrokeCleanly(false); } - LineLayoutItem currentItem() { return m_current.lineLayoutItem(); } + LineLayoutItem currentItem() { return m_current.getLineLayoutItem(); } InlineIterator lineBreak() { return m_lineBreak; } bool atEnd() { return m_atEnd; } @@ -200,18 +200,18 @@ inline bool requiresLineBox(const InlineIterator& it, const LineInfo& lineInfo = LineInfo(), WhitespacePosition whitespacePosition = LeadingWhitespace) { - if (it.lineLayoutItem().isFloatingOrOutOfFlowPositioned()) + if (it.getLineLayoutItem().isFloatingOrOutOfFlowPositioned()) return false; - if (it.lineLayoutItem().isLayoutInline() && !alwaysRequiresLineBox(it.lineLayoutItem()) && !requiresLineBoxForContent(LineLayoutInline(it.lineLayoutItem()), lineInfo)) + if (it.getLineLayoutItem().isLayoutInline() && !alwaysRequiresLineBox(it.getLineLayoutItem()) && !requiresLineBoxForContent(LineLayoutInline(it.getLineLayoutItem()), lineInfo)) return false; - if (!shouldCollapseWhiteSpace(it.lineLayoutItem().styleRef(), lineInfo, whitespacePosition) || it.lineLayoutItem().isBR()) + if (!shouldCollapseWhiteSpace(it.getLineLayoutItem().styleRef(), lineInfo, whitespacePosition) || it.getLineLayoutItem().isBR()) return true; UChar current = it.current(); - bool notJustWhitespace = current != spaceCharacter && current != tabulationCharacter && current != softHyphenCharacter && (current != newlineCharacter || it.lineLayoutItem().preservesNewline()); - return notJustWhitespace || isEmptyInline(it.lineLayoutItem()); + bool notJustWhitespace = current != spaceCharacter && current != tabulationCharacter && current != softHyphenCharacter && (current != newlineCharacter || it.getLineLayoutItem().preservesNewline()); + return notJustWhitespace || isEmptyInline(it.getLineLayoutItem()); } inline void setStaticPositions(LineLayoutBlockFlow block, LineLayoutBox child, IndentTextOrNot indentText) @@ -245,7 +245,7 @@ inline void BreakingContext::skipTrailingWhitespace(InlineIterator& iterator, const LineInfo& lineInfo) { while (!iterator.atEnd() && !requiresLineBox(iterator, lineInfo, TrailingWhitespace)) { - LineLayoutItem item = iterator.lineLayoutItem(); + LineLayoutItem item = iterator.getLineLayoutItem(); if (item.isOutOfFlowPositioned()) setStaticPositions(m_block, LineLayoutBox(item), DoNotIndentText); else if (item.isFloating()) @@ -256,15 +256,15 @@ inline void BreakingContext::initializeForCurrentObject() { - m_currentStyle = m_current.lineLayoutItem().style(); - m_nextObject = bidiNextSkippingEmptyInlines(m_block, m_current.lineLayoutItem()); - if (m_nextObject && m_nextObject.parent() && !m_nextObject.parent().isDescendantOf(m_current.lineLayoutItem().parent())) + m_currentStyle = m_current.getLineLayoutItem().style(); + m_nextObject = bidiNextSkippingEmptyInlines(m_block, m_current.getLineLayoutItem()); + if (m_nextObject && m_nextObject.parent() && !m_nextObject.parent().isDescendantOf(m_current.getLineLayoutItem().parent())) m_includeEndWidth = true; - m_currWS = m_current.lineLayoutItem().isLayoutInline() ? m_currentStyle->whiteSpace() : m_current.lineLayoutItem().parent().style()->whiteSpace(); + m_currWS = m_current.getLineLayoutItem().isLayoutInline() ? m_currentStyle->whiteSpace() : m_current.getLineLayoutItem().parent().style()->whiteSpace(); m_lastWS = m_lastObject.isLayoutInline() ? m_lastObject.style()->whiteSpace() : m_lastObject.parent().style()->whiteSpace(); - bool isSVGText = m_current.lineLayoutItem().isSVGInlineText(); + bool isSVGText = m_current.getLineLayoutItem().isSVGInlineText(); m_autoWrap = !isSVGText && ComputedStyle::autoWrap(m_currWS); m_autoWrapWasEverTrueOnLine = m_autoWrapWasEverTrueOnLine || m_autoWrap; @@ -293,7 +293,7 @@ inline void BreakingContext::handleBR(EClear& clear) { if (m_width.fitsOnLine()) { - LineLayoutItem br = m_current.lineLayoutItem(); + LineLayoutItem br = m_current.getLineLayoutItem(); m_lineBreak.moveToStartOf(br); m_lineBreak.increment(); @@ -362,7 +362,7 @@ { // If our original display wasn't an inline type, then we can // go ahead and determine our static inline position now. - LineLayoutBox box(m_current.lineLayoutItem()); + LineLayoutBox box(m_current.getLineLayoutItem()); bool isInlineType = box.style()->isOriginalDisplayInlineType(); if (!isInlineType) { m_block.setStaticInlinePositionForChild(box, m_block.startOffsetForContent()); @@ -388,7 +388,7 @@ inline void BreakingContext::handleFloat() { - LineLayoutBox floatBox(m_current.lineLayoutItem()); + LineLayoutBox floatBox(m_current.getLineLayoutItem()); FloatingObject* floatingObject = m_block.insertFloatingObject(floatBox); // check if it fits in the current line. // If it does, position it now, otherwise, position @@ -396,7 +396,7 @@ // FIXME: Bug 110372: Properly position multiple stacked floats with non-rectangular shape outside. if (m_floatsFitOnLine && m_width.fitsOnLine(m_block.logicalWidthForFloat(*floatingObject).toFloat(), ExcludeWhitespace)) { m_block.positionNewFloatOnLine(*floatingObject, m_lastFloatFromPreviousLine, m_lineInfo, m_width); - if (m_lineBreak.lineLayoutItem() == m_current.lineLayoutItem()) { + if (m_lineBreak.getLineLayoutItem() == m_current.getLineLayoutItem()) { ASSERT(!m_lineBreak.offset()); m_lineBreak.increment(); } @@ -433,11 +433,11 @@ inline void BreakingContext::handleEmptyInline() { // This should only end up being called on empty inlines - ASSERT(m_current.lineLayoutItem()); + ASSERT(m_current.getLineLayoutItem()); - LineLayoutInline flowBox(m_current.lineLayoutItem()); + LineLayoutInline flowBox(m_current.getLineLayoutItem()); - bool requiresLineBox = alwaysRequiresLineBox(m_current.lineLayoutItem()); + bool requiresLineBox = alwaysRequiresLineBox(m_current.getLineLayoutItem()); if (requiresLineBox || requiresLineBoxForContent(flowBox, m_lineInfo)) { // An empty inline that only has line-height, vertical-align or font-metrics will // not force linebox creation (and thus affect the height of the line) if the rest of the line is empty. @@ -447,9 +447,9 @@ // If we are in a run of ignored spaces then ensure we get a linebox if lineboxes are eventually // created for the line... m_trailingObjects.clear(); - ensureLineBoxInsideIgnoredSpaces(&m_lineMidpointState, m_current.lineLayoutItem()); - } else if (m_blockStyle->collapseWhiteSpace() && m_resolver.position().lineLayoutItem() == m_current.lineLayoutItem() - && shouldSkipWhitespaceAfterStartObject(m_block, m_current.lineLayoutItem(), m_lineMidpointState)) { + ensureLineBoxInsideIgnoredSpaces(&m_lineMidpointState, m_current.getLineLayoutItem()); + } else if (m_blockStyle->collapseWhiteSpace() && m_resolver.position().getLineLayoutItem() == m_current.getLineLayoutItem() + && shouldSkipWhitespaceAfterStartObject(m_block, m_current.getLineLayoutItem(), m_lineMidpointState)) { // If this object is at the start of the line, we need to behave like list markers and // start ignoring spaces. m_currentCharacterIsSpace = true; @@ -457,30 +457,30 @@ } else { // If we are after a trailing space but aren't ignoring spaces yet then ensure we get a linebox // if we encounter collapsible whitepace. - m_trailingObjects.appendObjectIfNeeded(m_current.lineLayoutItem()); + m_trailingObjects.appendObjectIfNeeded(m_current.getLineLayoutItem()); } } - m_width.addUncommittedWidth((inlineLogicalWidthFromAncestorsIfNeeded(m_current.lineLayoutItem()) + borderPaddingMarginStart(flowBox) + borderPaddingMarginEnd(flowBox)).toFloat()); + m_width.addUncommittedWidth((inlineLogicalWidthFromAncestorsIfNeeded(m_current.getLineLayoutItem()) + borderPaddingMarginStart(flowBox) + borderPaddingMarginEnd(flowBox)).toFloat()); } inline void BreakingContext::handleReplaced() { - LineLayoutBox replacedBox(m_current.lineLayoutItem()); + LineLayoutBox replacedBox(m_current.getLineLayoutItem()); if (m_atStart) m_width.updateAvailableWidth(replacedBox.logicalHeight()); // Break on replaced elements if either has normal white-space, // or if the replaced element is ruby that can break before. - if ((m_autoWrap || ComputedStyle::autoWrap(m_lastWS)) && (!m_current.lineLayoutItem().isImage() || m_allowImagesToBreak) - && (!m_current.lineLayoutItem().isRubyRun() || LineLayoutRubyRun(m_current.lineLayoutItem()).canBreakBefore(m_layoutTextInfo.m_lineBreakIterator))) { + if ((m_autoWrap || ComputedStyle::autoWrap(m_lastWS)) && (!m_current.getLineLayoutItem().isImage() || m_allowImagesToBreak) + && (!m_current.getLineLayoutItem().isRubyRun() || LineLayoutRubyRun(m_current.getLineLayoutItem()).canBreakBefore(m_layoutTextInfo.m_lineBreakIterator))) { m_width.commit(); - m_lineBreak.moveToStartOf(m_current.lineLayoutItem()); + m_lineBreak.moveToStartOf(m_current.getLineLayoutItem()); } if (m_ignoringSpaces) - m_lineMidpointState.stopIgnoringSpaces(InlineIterator(0, m_current.lineLayoutItem(), 0)); + m_lineMidpointState.stopIgnoringSpaces(InlineIterator(0, m_current.getLineLayoutItem(), 0)); m_lineInfo.setEmpty(false, m_block, &m_width); m_ignoringSpaces = false; @@ -489,21 +489,21 @@ // Optimize for a common case. If we can't find whitespace after the list // item, then this is all moot. - LayoutUnit replacedLogicalWidth = m_block.logicalWidthForChild(replacedBox) + m_block.marginStartForChild(replacedBox) + m_block.marginEndForChild(replacedBox) + inlineLogicalWidthFromAncestorsIfNeeded(m_current.lineLayoutItem()); - if (m_current.lineLayoutItem().isListMarker()) { - if (m_blockStyle->collapseWhiteSpace() && shouldSkipWhitespaceAfterStartObject(m_block, m_current.lineLayoutItem(), m_lineMidpointState)) { + LayoutUnit replacedLogicalWidth = m_block.logicalWidthForChild(replacedBox) + m_block.marginStartForChild(replacedBox) + m_block.marginEndForChild(replacedBox) + inlineLogicalWidthFromAncestorsIfNeeded(m_current.getLineLayoutItem()); + if (m_current.getLineLayoutItem().isListMarker()) { + if (m_blockStyle->collapseWhiteSpace() && shouldSkipWhitespaceAfterStartObject(m_block, m_current.getLineLayoutItem(), m_lineMidpointState)) { // Like with inline flows, we start ignoring spaces to make sure that any // additional spaces we see will be discarded. m_currentCharacterIsSpace = true; m_ignoringSpaces = true; } - if (LineLayoutListMarker(m_current.lineLayoutItem()).isInside()) + if (LineLayoutListMarker(m_current.getLineLayoutItem()).isInside()) m_width.addUncommittedWidth(replacedLogicalWidth.toFloat()); } else { m_width.addUncommittedWidth(replacedLogicalWidth.toFloat()); } - if (m_current.lineLayoutItem().isRubyRun()) - m_width.applyOverhang(LineLayoutRubyRun(m_current.lineLayoutItem()), m_lastObject, m_nextObject); + if (m_current.getLineLayoutItem().isRubyRun()) + m_width.applyOverhang(LineLayoutRubyRun(m_current.getLineLayoutItem()), m_lastObject, m_nextObject); // Update prior line break context characters, using U+FFFD (OBJECT REPLACEMENT CHARACTER) for replaced element. m_layoutTextInfo.m_lineBreakIterator.updatePriorContext(replacementCharacter); } @@ -545,13 +545,13 @@ if (!m_current.offset()) m_appliedStartWidth = false; - LineLayoutText layoutText(m_current.lineLayoutItem()); + LineLayoutText layoutText(m_current.getLineLayoutItem()); // If we have left a no-wrap inline and entered an autowrap inline while ignoring spaces // then we need to mark the start of the autowrap inline as a potential linebreak now. if (m_autoWrap && !ComputedStyle::autoWrap(m_lastWS) && m_ignoringSpaces) { m_width.commit(); - m_lineBreak.moveToStartOf(m_current.lineLayoutItem()); + m_lineBreak.moveToStartOf(m_current.getLineLayoutItem()); } const ComputedStyle& style = layoutText.styleRef(m_lineInfo.isFirstLine()); @@ -588,7 +588,7 @@ if (layoutText.isWordBreak()) { m_width.commit(); - m_lineBreak.moveToStartOf(m_current.lineLayoutItem()); + m_lineBreak.moveToStartOf(m_current.getLineLayoutItem()); ASSERT(m_current.offset() == layoutText.textLength()); } @@ -686,7 +686,7 @@ // For example: '<span style="margin-left: 5px;"><span style="margin-left: 10px;">FirstWord</span></span>' would // apply a width of 15px from the two span ancestors. if (!m_appliedStartWidth) { - m_width.addUncommittedWidth(inlineLogicalWidthFromAncestorsIfNeeded(m_current.lineLayoutItem(), true, false).toFloat()); + m_width.addUncommittedWidth(inlineLogicalWidthFromAncestorsIfNeeded(m_current.getLineLayoutItem(), true, false).toFloat()); m_appliedStartWidth = true; } @@ -705,7 +705,7 @@ if (c == newlineCharacter && m_preservesNewline) { if (!stoppedIgnoringSpaces && m_current.offset()) m_lineMidpointState.ensureCharacterGetsLineBox(m_current); - m_lineBreak.moveTo(m_current.lineLayoutItem(), m_current.offset(), m_current.nextBreakablePosition()); + m_lineBreak.moveTo(m_current.getLineLayoutItem(), m_current.offset(), m_current.nextBreakablePosition()); m_lineBreak.increment(); m_lineInfo.setPreviousLineBrokeCleanly(true); return true; @@ -716,14 +716,14 @@ if (m_autoWrap && betweenWords) { m_width.commit(); widthFromLastBreakingOpportunity = 0; - m_lineBreak.moveTo(m_current.lineLayoutItem(), m_current.offset(), m_current.nextBreakablePosition()); + m_lineBreak.moveTo(m_current.getLineLayoutItem(), m_current.offset(), m_current.nextBreakablePosition()); breakWords = false; widthMeasurementAtLastBreakOpportunity = lastWidthMeasurement; } // Remember this as a breakable position in case adding the end width forces a break. if (midWordBreak && !U16_IS_TRAIL(c) && !(WTF::Unicode::category(c) & (WTF::Unicode::Mark_NonSpacing | WTF::Unicode::Mark_Enclosing | WTF::Unicode::Mark_SpacingCombining))) { - m_lineBreak.moveTo(m_current.lineLayoutItem(), m_current.offset(), m_current.nextBreakablePosition()); + m_lineBreak.moveTo(m_current.getLineLayoutItem(), m_current.offset(), m_current.nextBreakablePosition()); midWordBreak &= (breakWords || breakAll); } @@ -768,7 +768,7 @@ } lastWidthMeasurement += lastSpaceWordSpacing; - LayoutUnit additionalWidthFromAncestors = inlineLogicalWidthFromAncestorsIfNeeded(m_current.lineLayoutItem(), !m_appliedStartWidth, m_includeEndWidth); + LayoutUnit additionalWidthFromAncestors = inlineLogicalWidthFromAncestorsIfNeeded(m_current.getLineLayoutItem(), !m_appliedStartWidth, m_includeEndWidth); m_width.addUncommittedWidth(lastWidthMeasurement + additionalWidthFromAncestors); if (m_collapseWhiteSpace && m_currentCharacterIsSpace && lastWidthMeasurement) @@ -802,15 +802,15 @@ prohibitBreakInside = false; } if (m_currentCharacterIsSpace && !previousCharacterIsSpace) { - m_startOfIgnoredSpaces.setLineLayoutItem(m_current.lineLayoutItem()); + m_startOfIgnoredSpaces.setLineLayoutItem(m_current.getLineLayoutItem()); m_startOfIgnoredSpaces.setOffset(m_current.offset()); } if (!m_currentCharacterIsSpace && previousCharacterIsSpace) { if (m_autoWrap && m_currentStyle->breakOnlyAfterWhiteSpace()) - m_lineBreak.moveTo(m_current.lineLayoutItem(), m_current.offset(), m_current.nextBreakablePosition()); + m_lineBreak.moveTo(m_current.getLineLayoutItem(), m_current.offset(), m_current.nextBreakablePosition()); } if (m_collapseWhiteSpace && m_currentCharacterIsSpace && !m_ignoringSpaces) - m_trailingObjects.setTrailingWhitespace(LineLayoutText(m_current.lineLayoutItem())); + m_trailingObjects.setTrailingWhitespace(LineLayoutText(m_current.getLineLayoutItem())); else if (!m_currentStyle->collapseWhiteSpace() || !m_currentCharacterIsSpace) m_trailingObjects.clear(); } @@ -820,7 +820,7 @@ { m_ignoringSpaces = false; lastSpace = m_current.offset(); // e.g., "Foo goo", don't add in any of the ignored spaces. - m_lineMidpointState.stopIgnoringSpaces(InlineIterator(0, m_current.lineLayoutItem(), m_current.offset())); + m_lineMidpointState.stopIgnoringSpaces(InlineIterator(0, m_current.getLineLayoutItem(), m_current.offset())); } inline WordMeasurement& BreakingContext::calculateWordWidth(WordMeasurements& wordMeasurements, LineLayoutText& layoutText, unsigned lastSpace, float& lastWidthMeasurement, float wordSpacingForWordMeasurement, const Font& font, float wordTrailingSpaceWidth, UChar c) @@ -853,7 +853,7 @@ // then move the line break to the space and skip all // additional whitespace. if (!m_width.fitsOnLine(charWidth)) { - m_lineBreak.moveTo(m_current.lineLayoutItem(), m_current.offset(), m_current.nextBreakablePosition()); + m_lineBreak.moveTo(m_current.getLineLayoutItem(), m_current.offset(), m_current.nextBreakablePosition()); skipTrailingWhitespace(m_lineBreak, m_lineInfo); return true; } @@ -876,7 +876,7 @@ m_lineInfo.setPreviousLineBrokeCleanly(true); wordMeasurement.endOffset = m_lineBreak.offset(); } - if (m_lineBreak.lineLayoutItem() && m_lineBreak.offset() && m_lineBreak.lineLayoutItem().isText() && LineLayoutText(m_lineBreak.lineLayoutItem()).textLength() && LineLayoutText(m_lineBreak.lineLayoutItem()).characterAt(m_lineBreak.offset() - 1) == softHyphenCharacter) + if (m_lineBreak.getLineLayoutItem() && m_lineBreak.offset() && m_lineBreak.getLineLayoutItem().isText() && LineLayoutText(m_lineBreak.getLineLayoutItem()).textLength() && LineLayoutText(m_lineBreak.getLineLayoutItem()).characterAt(m_lineBreak.offset() - 1) == softHyphenCharacter) hyphenated = true; if (m_lineBreak.offset() && m_lineBreak.offset() != (unsigned)wordMeasurement.endOffset && !wordMeasurement.width) { if (charWidth) { @@ -904,13 +904,13 @@ inline void BreakingContext::commitAndUpdateLineBreakIfNeeded() { bool checkForBreak = m_autoWrap; - if (m_width.committedWidth() && !m_width.fitsOnLine() && m_lineBreak.lineLayoutItem() && m_currWS == NOWRAP) { + if (m_width.committedWidth() && !m_width.fitsOnLine() && m_lineBreak.getLineLayoutItem() && m_currWS == NOWRAP) { if (m_width.fitsOnLine(0, ExcludeWhitespace)) { m_width.commit(); m_lineBreak.moveToStartOf(m_nextObject); } checkForBreak = true; - } else if (m_nextObject && m_current.lineLayoutItem().isText() && m_nextObject.isText() && !m_nextObject.isBR() && (m_autoWrap || m_nextObject.style()->autoWrap())) { + } else if (m_nextObject && m_current.getLineLayoutItem().isText() && m_nextObject.isText() && !m_nextObject.isBR() && (m_autoWrap || m_nextObject.style()->autoWrap())) { if (m_autoWrap && m_currentCharacterIsSpace) { checkForBreak = true; } else { @@ -962,8 +962,8 @@ m_width.fitBelowFloats(m_lineInfo.isFirstLine()); } - if (!m_current.lineLayoutItem().isFloatingOrOutOfFlowPositioned()) { - m_lastObject = m_current.lineLayoutItem(); + if (!m_current.getLineLayoutItem().isFloatingOrOutOfFlowPositioned()) { + m_lastObject = m_current.getLineLayoutItem(); if (m_lastObject.isAtomicInlineLevel() && m_autoWrap && (!m_lastObject.isImage() || m_allowImagesToBreak) && (!m_lastObject.isListMarker() || LineLayoutListMarker(m_lastObject).isInside()) && !m_lastObject.isRubyRun()) { m_width.commit();
diff --git a/third_party/WebKit/Source/core/layout/line/EllipsisBox.cpp b/third_party/WebKit/Source/core/layout/line/EllipsisBox.cpp index ae1ed72..fce3a26f 100644 --- a/third_party/WebKit/Source/core/layout/line/EllipsisBox.cpp +++ b/third_party/WebKit/Source/core/layout/line/EllipsisBox.cpp
@@ -37,7 +37,7 @@ IntRect EllipsisBox::selectionRect() const { - const ComputedStyle& style = lineLayoutItem().styleRef(isFirstLineStyle()); + const ComputedStyle& style = getLineLayoutItem().styleRef(isFirstLineStyle()); const Font& font = style.font(); return enclosingIntRect(font.selectionRectForText(constructTextRun(font, m_str, style, TextRun::AllowTrailingExpansion), IntPoint(logicalLeft(), logicalTop() + root().selectionTop()), root().selectionHeight())); } @@ -52,8 +52,8 @@ boxOrigin.moveBy(accumulatedOffset); LayoutRect boundsRect(boxOrigin, size()); if (visibleToHitTestRequest(result.hitTestRequest()) && boundsRect.intersects(LayoutRect(HitTestLocation::rectForPoint(locationInContainer.point(), 0, 0, 0, 0)))) { - lineLayoutItem().updateHitTestResult(result, locationInContainer.point() - toLayoutSize(adjustedLocation)); - if (result.addNodeToListBasedTestResult(lineLayoutItem().node(), locationInContainer, boundsRect) == StopHitTesting) + getLineLayoutItem().updateHitTestResult(result, locationInContainer.point() - toLayoutSize(adjustedLocation)); + if (result.addNodeToListBasedTestResult(getLineLayoutItem().node(), locationInContainer, boundsRect) == StopHitTesting) return true; }
diff --git a/third_party/WebKit/Source/core/layout/line/EllipsisBox.h b/third_party/WebKit/Source/core/layout/line/EllipsisBox.h index 9453dc6..10d5f2b 100644 --- a/third_party/WebKit/Source/core/layout/line/EllipsisBox.h +++ b/third_party/WebKit/Source/core/layout/line/EllipsisBox.h
@@ -46,7 +46,7 @@ IntRect selectionRect() const; LayoutUnit virtualLogicalHeight() const override { return LayoutUnit(m_height); } - SelectionState selectionState() const override { return m_selectionState; } + SelectionState getSelectionState() const override { return m_selectionState; } const AtomicString& ellipsisStr() const { return m_str; } const char* boxName() const override;
diff --git a/third_party/WebKit/Source/core/layout/line/InlineBox.cpp b/third_party/WebKit/Source/core/layout/line/InlineBox.cpp index c6db3cd..51644d2d 100644 --- a/third_party/WebKit/Source/core/layout/line/InlineBox.cpp +++ b/third_party/WebKit/Source/core/layout/line/InlineBox.cpp
@@ -143,14 +143,14 @@ if (hasVirtualLogicalHeight()) return virtualLogicalHeight(); - if (lineLayoutItem().isText()) - return m_bitfields.isText() ? LayoutUnit(lineLayoutItem().style(isFirstLineStyle())->fontMetrics().height()) : LayoutUnit(); - if (lineLayoutItem().isBox() && parent()) + if (getLineLayoutItem().isText()) + return m_bitfields.isText() ? LayoutUnit(getLineLayoutItem().style(isFirstLineStyle())->fontMetrics().height()) : LayoutUnit(); + if (getLineLayoutItem().isBox() && parent()) return isHorizontal() ? toLayoutBox(layoutObject()).size().height() : toLayoutBox(layoutObject()).size().width(); ASSERT(isInlineFlowBox()); LineLayoutBoxModel flowObject = boxModelObject(); - const FontMetrics& fontMetrics = lineLayoutItem().style(isFirstLineStyle())->fontMetrics(); + const FontMetrics& fontMetrics = getLineLayoutItem().style(isFirstLineStyle())->fontMetrics(); LayoutUnit result(fontMetrics.height()); if (parent()) result += flowObject.borderAndPaddingLogicalHeight(); @@ -169,12 +169,12 @@ int InlineBox::caretMinOffset() const { - return lineLayoutItem().caretMinOffset(); + return getLineLayoutItem().caretMinOffset(); } int InlineBox::caretMaxOffset() const { - return lineLayoutItem().caretMaxOffset(); + return getLineLayoutItem().caretMaxOffset(); } void InlineBox::dirtyLineBoxes() @@ -186,7 +186,7 @@ void InlineBox::deleteLine() { - if (!m_bitfields.extracted() && lineLayoutItem().isBox()) + if (!m_bitfields.extracted() && getLineLayoutItem().isBox()) toLayoutBox(layoutObject()).setInlineBoxWrapper(nullptr); destroy(); } @@ -194,14 +194,14 @@ void InlineBox::extractLine() { m_bitfields.setExtracted(true); - if (lineLayoutItem().isBox()) + if (getLineLayoutItem().isBox()) toLayoutBox(layoutObject()).setInlineBoxWrapper(nullptr); } void InlineBox::attachLine() { m_bitfields.setExtracted(false); - if (lineLayoutItem().isBox()) + if (getLineLayoutItem().isBox()) toLayoutBox(layoutObject()).setInlineBoxWrapper(this); } @@ -209,7 +209,7 @@ { m_topLeft.move(delta); - if (lineLayoutItem().isAtomicInlineLevel()) + if (getLineLayoutItem().isAtomicInlineLevel()) toLayoutBox(layoutObject()).move(delta.width(), delta.height()); } @@ -224,18 +224,18 @@ // own stacking context. (See Appendix E.2, section 6.4 on inline block/table elements in the CSS2.1 // specification.) LayoutPoint childPoint = accumulatedOffset; - if (parent()->lineLayoutItem().hasFlippedBlocksWritingMode()) // Faster than calling containingBlock(). + if (parent()->getLineLayoutItem().hasFlippedBlocksWritingMode()) // Faster than calling containingBlock(). childPoint = layoutObject().containingBlock()->flipForWritingModeForChild(&toLayoutBox(layoutObject()), childPoint); - if (lineLayoutItem().style()->hasBorderRadius()) { + if (getLineLayoutItem().style()->hasBorderRadius()) { LayoutRect borderRect = logicalFrameRect(); borderRect.moveBy(accumulatedOffset); - FloatRoundedRect border = lineLayoutItem().style()->getRoundedBorderFor(borderRect); + FloatRoundedRect border = getLineLayoutItem().style()->getRoundedBorderFor(borderRect); if (!locationInContainer.intersects(border)) return false; } - return lineLayoutItem().hitTest(result, locationInContainer, childPoint); + return getLineLayoutItem().hitTest(result, locationInContainer, childPoint); } const RootInlineBox& InlineBox::root() const @@ -301,15 +301,15 @@ return (leaf && leaf->isLineBreak()) ? nullptr : leaf; } -SelectionState InlineBox::selectionState() const +SelectionState InlineBox::getSelectionState() const { - return layoutObject().selectionState(); + return layoutObject().getSelectionState(); } bool InlineBox::canAccommodateEllipsis(bool ltr, int blockEdge, int ellipsisWidth) const { // Non-atomic inline-level elements can always accommodate an ellipsis. - if (!lineLayoutItem().isAtomicInlineLevel()) + if (!getLineLayoutItem().isAtomicInlineLevel()) return true; IntRect boxRect(left(), 0, m_logicalWidth, 10); @@ -338,7 +338,7 @@ LayoutPoint InlineBox::logicalPositionToPhysicalPoint(const LayoutPoint& point, const LayoutSize& size) const { - if (!UNLIKELY(lineLayoutItem().hasFlippedBlocksWritingMode())) + if (!UNLIKELY(getLineLayoutItem().hasFlippedBlocksWritingMode())) return LayoutPoint(point.x(), point.y()); LineLayoutBlockFlow block = root().block(); @@ -350,7 +350,7 @@ void InlineBox::logicalRectToPhysicalRect(LayoutRect& current) const { - if (isHorizontal() && !lineLayoutItem().hasFlippedBlocksWritingMode()) + if (isHorizontal() && !getLineLayoutItem().hasFlippedBlocksWritingMode()) return; if (!isHorizontal()) { @@ -362,28 +362,28 @@ void InlineBox::flipForWritingMode(FloatRect& rect) const { - if (!UNLIKELY(lineLayoutItem().hasFlippedBlocksWritingMode())) + if (!UNLIKELY(getLineLayoutItem().hasFlippedBlocksWritingMode())) return; root().block().flipForWritingMode(rect); } FloatPoint InlineBox::flipForWritingMode(const FloatPoint& point) const { - if (!UNLIKELY(lineLayoutItem().hasFlippedBlocksWritingMode())) + if (!UNLIKELY(getLineLayoutItem().hasFlippedBlocksWritingMode())) return point; return root().block().flipForWritingMode(point); } void InlineBox::flipForWritingMode(LayoutRect& rect) const { - if (!UNLIKELY(lineLayoutItem().hasFlippedBlocksWritingMode())) + if (!UNLIKELY(getLineLayoutItem().hasFlippedBlocksWritingMode())) return; root().block().flipForWritingMode(rect); } LayoutPoint InlineBox::flipForWritingMode(const LayoutPoint& point) const { - if (!UNLIKELY(lineLayoutItem().hasFlippedBlocksWritingMode())) + if (!UNLIKELY(getLineLayoutItem().hasFlippedBlocksWritingMode())) return point; return root().block().flipForWritingMode(point); }
diff --git a/third_party/WebKit/Source/core/layout/line/InlineBox.h b/third_party/WebKit/Source/core/layout/line/InlineBox.h index 3743ecb0..5790fee 100644 --- a/third_party/WebKit/Source/core/layout/line/InlineBox.h +++ b/third_party/WebKit/Source/core/layout/line/InlineBox.h
@@ -171,7 +171,7 @@ InlineBox* nextLeafChildIgnoringLineBreak() const; InlineBox* prevLeafChildIgnoringLineBreak() const; - LineLayoutItem lineLayoutItem() const { return LineLayoutItem(&m_layoutObject); } + LineLayoutItem getLineLayoutItem() const { return LineLayoutItem(&m_layoutObject); } InlineFlowBox* parent() const { @@ -256,7 +256,7 @@ virtual void dirtyLineBoxes(); - virtual SelectionState selectionState() const; + virtual SelectionState getSelectionState() const; virtual bool canAccommodateEllipsis(bool ltr, int blockEdge, int ellipsisWidth) const; // visibleLeftEdge, visibleRightEdge are in the parent's coordinate system. @@ -268,16 +268,16 @@ int expansion() const { return m_bitfields.expansion(); } - bool visibleToHitTestRequest(const HitTestRequest& request) const { return lineLayoutItem().visibleToHitTestRequest(request); } + bool visibleToHitTestRequest(const HitTestRequest& request) const { return getLineLayoutItem().visibleToHitTestRequest(request); } // Anonymous inline: https://drafts.csswg.org/css2/visuren.html#anonymous - bool isAnonymousInline() const { return lineLayoutItem().isText() && lineLayoutItem().parent() && lineLayoutItem().parent().isBox(); } - EVerticalAlign verticalAlign() const { return isAnonymousInline() ? ComputedStyle::initialVerticalAlign() : lineLayoutItem().style(m_bitfields.firstLine())->verticalAlign(); } + bool isAnonymousInline() const { return getLineLayoutItem().isText() && getLineLayoutItem().parent() && getLineLayoutItem().parent().isBox(); } + EVerticalAlign verticalAlign() const { return isAnonymousInline() ? ComputedStyle::initialVerticalAlign() : getLineLayoutItem().style(m_bitfields.firstLine())->verticalAlign(); } // Use with caution! The type is not checked! LineLayoutBoxModel boxModelObject() const { - if (!lineLayoutItem().isText()) + if (!getLineLayoutItem().isText()) return LineLayoutBoxModel(toLayoutBoxModelObject(&m_layoutObject)); return LineLayoutBoxModel(nullptr); }
diff --git a/third_party/WebKit/Source/core/layout/line/InlineFlowBox.cpp b/third_party/WebKit/Source/core/layout/line/InlineFlowBox.cpp index 2fec4ee3..08fc3ba0 100644 --- a/third_party/WebKit/Source/core/layout/line/InlineFlowBox.cpp +++ b/third_party/WebKit/Source/core/layout/line/InlineFlowBox.cpp
@@ -107,7 +107,7 @@ child->setFirstLineStyleBit(isFirstLineStyle()); child->setIsHorizontal(isHorizontal()); if (child->isText()) { - if (child->lineLayoutItem().parent() == lineLayoutItem()) + if (child->getLineLayoutItem().parent() == getLineLayoutItem()) m_hasTextChildren = true; setHasTextDescendantsOnAncestors(this); } else if (child->isInlineFlowBox()) { @@ -115,14 +115,14 @@ setHasTextDescendantsOnAncestors(this); } - if (descendantsHaveSameLineHeightAndBaseline() && !child->lineLayoutItem().isOutOfFlowPositioned()) { - const ComputedStyle& parentStyle = lineLayoutItem().styleRef(isFirstLineStyle()); - const ComputedStyle& childStyle = child->lineLayoutItem().styleRef(isFirstLineStyle()); + if (descendantsHaveSameLineHeightAndBaseline() && !child->getLineLayoutItem().isOutOfFlowPositioned()) { + const ComputedStyle& parentStyle = getLineLayoutItem().styleRef(isFirstLineStyle()); + const ComputedStyle& childStyle = child->getLineLayoutItem().styleRef(isFirstLineStyle()); bool shouldClearDescendantsHaveSameLineHeightAndBaseline = false; - if (child->lineLayoutItem().isAtomicInlineLevel()) { + if (child->getLineLayoutItem().isAtomicInlineLevel()) { shouldClearDescendantsHaveSameLineHeightAndBaseline = true; } else if (child->isText()) { - if (child->lineLayoutItem().isBR() || (child->lineLayoutItem().parent() != lineLayoutItem())) { + if (child->getLineLayoutItem().isBR() || (child->getLineLayoutItem().parent() != getLineLayoutItem())) { if (!parentStyle.font().fontMetrics().hasIdenticalAscentDescentAndLineGap(childStyle.font().fontMetrics()) || parentStyle.lineHeight() != childStyle.lineHeight() || (parentStyle.verticalAlign() != BASELINE && !isRootInlineBox()) || childStyle.verticalAlign() != BASELINE) @@ -131,7 +131,7 @@ if (childStyle.hasTextCombine() || childStyle.textEmphasisMark() != TextEmphasisMarkNone) shouldClearDescendantsHaveSameLineHeightAndBaseline = true; } else { - if (child->lineLayoutItem().isBR()) { + if (child->getLineLayoutItem().isBR()) { // FIXME: This is dumb. We only turn off because current layout test results expect the <br> to be 0-height on the baseline. // Other than making a zillion tests have to regenerate results, there's no reason to ditch the optimization here. shouldClearDescendantsHaveSameLineHeightAndBaseline = true; @@ -152,19 +152,19 @@ clearDescendantsHaveSameLineHeightAndBaseline(); } - if (!child->lineLayoutItem().isOutOfFlowPositioned()) { + if (!child->getLineLayoutItem().isOutOfFlowPositioned()) { if (child->isText()) { - const ComputedStyle& childStyle = child->lineLayoutItem().styleRef(isFirstLineStyle()); + const ComputedStyle& childStyle = child->getLineLayoutItem().styleRef(isFirstLineStyle()); if (childStyle.letterSpacing() < 0 || childStyle.textShadow() || childStyle.textEmphasisMark() != TextEmphasisMarkNone || childStyle.textStrokeWidth()) child->clearKnownToHaveNoOverflow(); - } else if (child->lineLayoutItem().isAtomicInlineLevel()) { - LineLayoutBox box = LineLayoutBox(child->lineLayoutItem()); + } else if (child->getLineLayoutItem().isAtomicInlineLevel()) { + LineLayoutBox box = LineLayoutBox(child->getLineLayoutItem()); if (box.hasOverflowModel() || box.hasSelfPaintingLayer()) child->clearKnownToHaveNoOverflow(); - } else if (!child->lineLayoutItem().isBR() && (child->lineLayoutItem().style(isFirstLineStyle())->boxShadow() || child->boxModelObject().hasSelfPaintingLayer() - || (child->lineLayoutItem().isListMarker() && !LineLayoutListMarker(child->lineLayoutItem()).isInside()) - || child->lineLayoutItem().style(isFirstLineStyle())->hasBorderImageOutsets() - || child->lineLayoutItem().style(isFirstLineStyle())->hasOutline())) { + } else if (!child->getLineLayoutItem().isBR() && (child->getLineLayoutItem().style(isFirstLineStyle())->boxShadow() || child->boxModelObject().hasSelfPaintingLayer() + || (child->getLineLayoutItem().isListMarker() && !LineLayoutListMarker(child->getLineLayoutItem()).isInside()) + || child->getLineLayoutItem().style(isFirstLineStyle())->hasBorderImageOutsets() + || child->getLineLayoutItem().style(isFirstLineStyle())->hasOutline())) { child->clearKnownToHaveNoOverflow(); } @@ -255,7 +255,7 @@ { InlineBox::move(delta); for (InlineBox* child = firstChild(); child; child = child->nextOnLine()) { - if (child->lineLayoutItem().isOutOfFlowPositioned()) + if (child->getLineLayoutItem().isOutOfFlowPositioned()) continue; child->move(delta); } @@ -265,7 +265,7 @@ LineBoxList* InlineFlowBox::lineBoxes() const { - return LineLayoutInline(lineLayoutItem()).lineBoxes(); + return LineLayoutInline(getLineLayoutItem()).lineBoxes(); } static inline bool isLastChildForLayoutObject(LineLayoutItem ancestor, LineLayoutItem child) @@ -311,13 +311,13 @@ // The root inline box never has borders/margins/padding. if (parent()) { - bool ltr = lineLayoutItem().style()->isLeftToRightDirection(); + bool ltr = getLineLayoutItem().style()->isLeftToRightDirection(); // Check to see if all initial lines are unconstructed. If so, then // we know the inline began on this line (unless we are a continuation). LineBoxList* lineBoxList = lineBoxes(); - if (!lineBoxList->firstLineBox()->isConstructed() && !lineLayoutItem().isInlineElementContinuation()) { - if (lineLayoutItem().style()->boxDecorationBreak() == DCLONE) + if (!lineBoxList->firstLineBox()->isConstructed() && !getLineLayoutItem().isInlineElementContinuation()) { + if (getLineLayoutItem().style()->boxDecorationBreak() == DCLONE) includeLeftEdge = includeRightEdge = true; else if (ltr && lineBoxList->firstLineBox() == this) includeLeftEdge = true; @@ -326,16 +326,16 @@ } if (!lineBoxList->lastLineBox()->isConstructed()) { - LineLayoutInline inlineFlow = LineLayoutInline(lineLayoutItem()); + LineLayoutInline inlineFlow = LineLayoutInline(getLineLayoutItem()); LineLayoutItem logicallyLastRunLayoutItem = LineLayoutItem(logicallyLastRunLayoutObject); - bool isLastObjectOnLine = !isAncestorAndWithinBlock(lineLayoutItem(), logicallyLastRunLayoutItem) || (isLastChildForLayoutObject(lineLayoutItem(), logicallyLastRunLayoutItem) && !isLogicallyLastRunWrapped); + bool isLastObjectOnLine = !isAncestorAndWithinBlock(getLineLayoutItem(), logicallyLastRunLayoutItem) || (isLastChildForLayoutObject(getLineLayoutItem(), logicallyLastRunLayoutItem) && !isLogicallyLastRunWrapped); // We include the border under these conditions: // (1) The next line was not created, or it is constructed. We check the previous line for rtl. // (2) The logicallyLastRun is not a descendant of this layout object. // (3) The logicallyLastRun is a descendant of this layout object, but it is the last child of this layout object and it does not wrap to the next line. // (4) The decoration break is set to clone therefore there will be borders on every sides. - if (lineLayoutItem().style()->boxDecorationBreak() == DCLONE) { + if (getLineLayoutItem().style()->boxDecorationBreak() == DCLONE) { includeLeftEdge = includeRightEdge = true; } else if (ltr) { if (!nextLineBox() @@ -383,9 +383,9 @@ LayoutUnit& logicalLeft, LayoutUnit& minLogicalLeft, LayoutUnit& maxLogicalRight, bool& needsWordSpacing) { for (InlineBox* curr = firstChild; curr && curr != lastChild; curr = curr->nextOnLine()) { - if (curr->lineLayoutItem().isText()) { + if (curr->getLineLayoutItem().isText()) { InlineTextBox* text = toInlineTextBox(curr); - LineLayoutText rt = text->lineLayoutItem(); + LineLayoutText rt = text->getLineLayoutItem(); LayoutUnit space; if (rt.textLength()) { if (needsWordSpacing && isSpaceOrNewline(rt.characterAt(text->start()))) @@ -405,8 +405,8 @@ if (knownToHaveNoOverflow()) maxLogicalRight = std::max(logicalLeft, maxLogicalRight); } else { - if (curr->lineLayoutItem().isOutOfFlowPositioned()) { - if (curr->lineLayoutItem().parent().style()->isLeftToRightDirection()) { + if (curr->getLineLayoutItem().isOutOfFlowPositioned()) { + if (curr->getLineLayoutItem().parent().style()->isLeftToRightDirection()) { curr->setLogicalLeft(logicalLeft); } else { // Our offset that we cache needs to be from the edge of the right border box and @@ -416,7 +416,7 @@ } continue; // The positioned object has no effect on the width. } - if (curr->lineLayoutItem().isLayoutInline()) { + if (curr->getLineLayoutItem().isLayoutInline()) { InlineFlowBox* flow = toInlineFlowBox(curr); logicalLeft += flow->marginLogicalLeft(); if (knownToHaveNoOverflow()) @@ -425,7 +425,7 @@ if (knownToHaveNoOverflow()) maxLogicalRight = std::max(logicalLeft, maxLogicalRight); logicalLeft += flow->marginLogicalRight(); - } else if (!curr->lineLayoutItem().isListMarker() || LineLayoutListMarker(curr->lineLayoutItem()).isInside()) { + } else if (!curr->getLineLayoutItem().isListMarker() || LineLayoutListMarker(curr->getLineLayoutItem()).isInside()) { // The box can have a different writing-mode than the overall line, so this is a bit complicated. // Just get all the physical margin and overflow values by hand based off |isHorizontal|. LineLayoutBoxModel box = curr->boxModelObject(); @@ -458,7 +458,7 @@ { // Use "central" (Ideographic) baseline if writing-mode is vertical-* and text-orientation is not sideways-*. // http://dev.w3.org/csswg/css-writing-modes-3/#text-baselines - if (!isHorizontal() && lineLayoutItem().style(isFirstLineStyle())->fontDescription().isVerticalAnyUpright()) + if (!isHorizontal() && getLineLayoutItem().style(isFirstLineStyle())->fontDescription().isVerticalAnyUpright()) return IdeographicBaseline; return AlphabeticBaseline; } @@ -468,7 +468,7 @@ for (InlineBox* curr = firstChild(); curr; curr = curr->nextOnLine()) { // The computed lineheight needs to be extended for the // positioned elements - if (curr->lineLayoutItem().isOutOfFlowPositioned()) + if (curr->getLineLayoutItem().isOutOfFlowPositioned()) continue; // Positioned placeholders don't affect calculations. if (curr->verticalAlign() == TOP || curr->verticalAlign() == BOTTOM) { int lineHeight = curr->lineHeight(); @@ -530,7 +530,7 @@ return; for (InlineBox* curr = firstChild(); curr; curr = curr->nextOnLine()) { - if (curr->lineLayoutItem().isOutOfFlowPositioned()) + if (curr->getLineLayoutItem().isOutOfFlowPositioned()) continue; // Positioned placeholders don't affect calculations. InlineFlowBox* inlineFlowBox = curr->isInlineFlowBox() ? toInlineFlowBox(curr) : nullptr; @@ -583,7 +583,7 @@ { bool isRootBox = isRootInlineBox(); if (isRootBox) { - const FontMetrics& fontMetrics = lineLayoutItem().style(isFirstLineStyle())->fontMetrics(); + const FontMetrics& fontMetrics = getLineLayoutItem().style(isFirstLineStyle())->fontMetrics(); // RootInlineBoxes are always placed at pixel boundaries in their logical y direction. Not doing // so results in incorrect layout of text decorations, most notably underlines. setLogicalTop(LayoutUnit(roundToInt(top + maxAscent - fontMetrics.ascent(baselineType)))); @@ -597,7 +597,7 @@ } for (InlineBox* curr = firstChild(); curr; curr = curr->nextOnLine()) { - if (curr->lineLayoutItem().isOutOfFlowPositioned()) + if (curr->getLineLayoutItem().isOutOfFlowPositioned()) continue; // Positioned placeholders don't affect calculations. if (descendantsHaveSameLineHeightAndBaseline()) { @@ -625,19 +625,19 @@ LayoutUnit boxHeightIncludingMargins = boxHeight; LayoutUnit borderPaddingHeight; if (curr->isText() || curr->isInlineFlowBox()) { - const FontMetrics& fontMetrics = curr->lineLayoutItem().style(isFirstLineStyle())->fontMetrics(); + const FontMetrics& fontMetrics = curr->getLineLayoutItem().style(isFirstLineStyle())->fontMetrics(); newLogicalTop += curr->baselinePosition(baselineType) - fontMetrics.ascent(baselineType); if (curr->isInlineFlowBox()) { - LineLayoutBoxModel boxObject = LineLayoutBoxModel(curr->lineLayoutItem()); + LineLayoutBoxModel boxObject = LineLayoutBoxModel(curr->getLineLayoutItem()); newLogicalTop -= boxObject.borderAndPaddingOver(); borderPaddingHeight = boxObject.borderAndPaddingLogicalHeight(); } newLogicalTopIncludingMargins = newLogicalTop; - } else if (!curr->lineLayoutItem().isBR()) { - LineLayoutBox box = LineLayoutBox(curr->lineLayoutItem()); + } else if (!curr->getLineLayoutItem().isBR()) { + LineLayoutBox box = LineLayoutBox(curr->getLineLayoutItem()); newLogicalTopIncludingMargins = newLogicalTop; // TODO(kojii): isHorizontal() does not match to m_layoutObject.isHorizontalWritingMode(). crbug.com/552954 - // ASSERT(curr->isHorizontal() == curr->lineLayoutItem().style()->isHorizontalWritingMode()); + // ASSERT(curr->isHorizontal() == curr->getLineLayoutItem().style()->isHorizontalWritingMode()); LayoutUnit overSideMargin = curr->isHorizontal() ? box.marginTop() : box.marginRight(); LayoutUnit underSideMargin = curr->isHorizontal() ? box.marginBottom() : box.marginLeft(); newLogicalTop += overSideMargin; @@ -647,28 +647,28 @@ curr->setLogicalTop(newLogicalTop); if (childAffectsTopBottomPos) { - if (curr->lineLayoutItem().isRubyRun()) { + if (curr->getLineLayoutItem().isRubyRun()) { // Treat the leading on the first and last lines of ruby runs as not being part of the overall lineTop/lineBottom. // Really this is a workaround hack for the fact that ruby should have been done as line layout and not done using // inline-block. - if (lineLayoutItem().style()->isFlippedLinesWritingMode() == (curr->lineLayoutItem().style()->rubyPosition() == RubyPositionAfter)) + if (getLineLayoutItem().style()->isFlippedLinesWritingMode() == (curr->getLineLayoutItem().style()->rubyPosition() == RubyPositionAfter)) hasAnnotationsBefore = true; else hasAnnotationsAfter = true; - LineLayoutRubyRun rubyRun = LineLayoutRubyRun(curr->lineLayoutItem()); + LineLayoutRubyRun rubyRun = LineLayoutRubyRun(curr->getLineLayoutItem()); if (LayoutRubyBase* rubyBase = rubyRun.rubyBase()) { LayoutUnit bottomRubyBaseLeading = (curr->logicalHeight() - rubyBase->logicalBottom()) + rubyBase->logicalHeight() - (rubyBase->lastRootBox() ? rubyBase->lastRootBox()->lineBottom() : LayoutUnit()); LayoutUnit topRubyBaseLeading = rubyBase->logicalTop() + (rubyBase->firstRootBox() ? rubyBase->firstRootBox()->lineTop() : LayoutUnit()); - newLogicalTop += !lineLayoutItem().style()->isFlippedLinesWritingMode() ? topRubyBaseLeading : bottomRubyBaseLeading; + newLogicalTop += !getLineLayoutItem().style()->isFlippedLinesWritingMode() ? topRubyBaseLeading : bottomRubyBaseLeading; boxHeight -= (topRubyBaseLeading + bottomRubyBaseLeading); } } if (curr->isInlineTextBox()) { TextEmphasisPosition emphasisMarkPosition; - if (toInlineTextBox(curr)->getEmphasisMarkPosition(curr->lineLayoutItem().styleRef(isFirstLineStyle()), emphasisMarkPosition)) { + if (toInlineTextBox(curr)->getEmphasisMarkPosition(curr->getLineLayoutItem().styleRef(isFirstLineStyle()), emphasisMarkPosition)) { bool emphasisMarkIsOver = emphasisMarkPosition == TextEmphasisPositionOver; - if (emphasisMarkIsOver != curr->lineLayoutItem().style(isFirstLineStyle())->isFlippedLinesWritingMode()) + if (emphasisMarkIsOver != curr->getLineLayoutItem().style(isFirstLineStyle())->isFlippedLinesWritingMode()) hasAnnotationsBefore = true; else hasAnnotationsAfter = true; @@ -709,7 +709,7 @@ lineBottomIncludingMargins = std::max(lineBottom, lineBottomIncludingMargins); } - if (lineLayoutItem().style()->isFlippedLinesWritingMode()) + if (getLineLayoutItem().style()->isFlippedLinesWritingMode()) flipLinesInBlockDirection(lineTopIncludingMargins, lineBottomIncludingMargins); } } @@ -717,7 +717,7 @@ void InlineFlowBox::computeMaxLogicalTop(LayoutUnit& maxLogicalTop) const { for (InlineBox* curr = firstChild(); curr; curr = curr->nextOnLine()) { - if (curr->lineLayoutItem().isOutOfFlowPositioned()) + if (curr->getLineLayoutItem().isOutOfFlowPositioned()) continue; // Positioned placeholders don't affect calculations. if (descendantsHaveSameLineHeightAndBaseline()) @@ -737,7 +737,7 @@ setLogicalTop(lineBottom - (logicalTop() - lineTop) - logicalHeight()); for (InlineBox* curr = firstChild(); curr; curr = curr->nextOnLine()) { - if (curr->lineLayoutItem().isOutOfFlowPositioned()) + if (curr->getLineLayoutItem().isOutOfFlowPositioned()) continue; // Positioned placeholders aren't affected here. if (curr->isInlineFlowBox()) @@ -749,11 +749,11 @@ inline void InlineFlowBox::addBoxShadowVisualOverflow(LayoutRect& logicalVisualOverflow) { - const ComputedStyle& style = lineLayoutItem().styleRef(isFirstLineStyle()); + const ComputedStyle& style = getLineLayoutItem().styleRef(isFirstLineStyle()); // box-shadow on the block element applies to the block and not to the lines, // unless it is modified by :first-line pseudo element. - if (!parent() && (!isFirstLineStyle() || &style == lineLayoutItem().style())) + if (!parent() && (!isFirstLineStyle() || &style == getLineLayoutItem().style())) return; WritingMode writingMode = style.writingMode(); @@ -773,11 +773,11 @@ inline void InlineFlowBox::addBorderOutsetVisualOverflow(LayoutRect& logicalVisualOverflow) { - const ComputedStyle& style = lineLayoutItem().styleRef(isFirstLineStyle()); + const ComputedStyle& style = getLineLayoutItem().styleRef(isFirstLineStyle()); // border-image-outset on the block element applies to the block and not to the lines, // unless it is modified by :first-line pseudo element. - if (!parent() && (!isFirstLineStyle() || &style == lineLayoutItem().style())) + if (!parent() && (!isFirstLineStyle() || &style == getLineLayoutItem().style())) return; if (!style.hasBorderImageOutsets()) @@ -803,7 +803,7 @@ if (!parent()) return; - const ComputedStyle& style = lineLayoutItem().styleRef(isFirstLineStyle()); + const ComputedStyle& style = getLineLayoutItem().styleRef(isFirstLineStyle()); if (!style.hasOutline()) return; @@ -815,7 +815,7 @@ if (textBox->knownToHaveNoOverflow()) return; - const ComputedStyle& style = textBox->lineLayoutItem().styleRef(isFirstLineStyle()); + const ComputedStyle& style = textBox->getLineLayoutItem().styleRef(isFirstLineStyle()); GlyphOverflowAndFallbackFontsMap::iterator it = textBoxDataMap.find(textBox); GlyphOverflow* glyphOverflow = it == textBoxDataMap.end() ? nullptr : &it->value.second; @@ -878,13 +878,13 @@ inline void InlineFlowBox::addReplacedChildOverflow(const InlineBox* inlineBox, LayoutRect& logicalLayoutOverflow, LayoutRect& logicalVisualOverflow) { - LineLayoutBox box = LineLayoutBox(inlineBox->lineLayoutItem()); + LineLayoutBox box = LineLayoutBox(inlineBox->getLineLayoutItem()); // Visual overflow only propagates if the box doesn't have a self-painting layer. This rectangle does not include // transforms or relative positioning (since those objects always have self-painting layers), but it does need to be adjusted // for writing-mode differences. if (!box.hasSelfPaintingLayer()) { - LayoutRect childLogicalVisualOverflow = box.logicalVisualOverflowRectForPropagation(lineLayoutItem().styleRef()); + LayoutRect childLogicalVisualOverflow = box.logicalVisualOverflowRectForPropagation(getLineLayoutItem().styleRef()); childLogicalVisualOverflow.move(inlineBox->logicalLeft(), inlineBox->logicalTop()); logicalVisualOverflow.unite(childLogicalVisualOverflow); } @@ -892,7 +892,7 @@ // Layout overflow internal to the child box only propagates if the child box doesn't have overflow clip set. // Otherwise the child border box propagates as layout overflow. This rectangle must include transforms and relative positioning // and be adjusted for writing-mode differences. - LayoutRect childLogicalLayoutOverflow = box.logicalLayoutOverflowRectForPropagation(lineLayoutItem().styleRef()); + LayoutRect childLogicalLayoutOverflow = box.logicalLayoutOverflowRectForPropagation(getLineLayoutItem().styleRef()); childLogicalLayoutOverflow.move(inlineBox->logicalLeft(), inlineBox->logicalTop()); logicalLayoutOverflow.unite(childLogicalLayoutOverflow); } @@ -919,18 +919,18 @@ addOutlineVisualOverflow(logicalVisualOverflow); for (InlineBox* curr = firstChild(); curr; curr = curr->nextOnLine()) { - if (curr->lineLayoutItem().isOutOfFlowPositioned()) + if (curr->getLineLayoutItem().isOutOfFlowPositioned()) continue; // Positioned placeholders don't affect calculations. - if (curr->lineLayoutItem().isText()) { + if (curr->getLineLayoutItem().isText()) { InlineTextBox* text = toInlineTextBox(curr); - LineLayoutText rt = text->lineLayoutItem(); + LineLayoutText rt = text->getLineLayoutItem(); if (rt.isBR()) continue; LayoutRect textBoxOverflow(text->logicalFrameRect()); addTextBoxVisualOverflow(text, textBoxDataMap, textBoxOverflow); logicalVisualOverflow.unite(textBoxOverflow); - } else if (curr->lineLayoutItem().isLayoutInline()) { + } else if (curr->getLineLayoutItem().isLayoutInline()) { InlineFlowBox* flow = toInlineFlowBox(curr); flow->computeOverflow(lineTop, lineBottom, textBoxDataMap); if (!flow->boxModelObject().hasSelfPaintingLayer()) @@ -1002,18 +1002,18 @@ // Layers will handle hit testing themselves. if (!curr->boxModelObject() || !curr->boxModelObject().hasSelfPaintingLayer()) { if (curr->nodeAtPoint(result, locationInContainer, accumulatedOffset, lineTop, lineBottom)) { - lineLayoutItem().updateHitTestResult(result, locationInContainer.point() - toLayoutSize(accumulatedOffset)); + getLineLayoutItem().updateHitTestResult(result, locationInContainer.point() - toLayoutSize(accumulatedOffset)); return true; } } // If the current inline box's layout object and the previous inline box's layout object are same, // we should yield the hit-test to the previous inline box. - if (prev && curr->lineLayoutItem() == prev->lineLayoutItem()) + if (prev && curr->getLineLayoutItem() == prev->getLineLayoutItem()) continue; // Hit test the culled inline if necessary. - LineLayoutItem currLayoutItem = curr->lineLayoutItem(); + LineLayoutItem currLayoutItem = curr->getLineLayoutItem(); while (true) { // If the previous inline box is not a descendant of a current inline's parent, // the parent is a culled inline and we hit test it. @@ -1023,7 +1023,7 @@ LineLayoutItem culledParent = currLayoutItem.parent(); ASSERT(culledParent); - if (culledParent == lineLayoutItem() || (hasSibling && prev && prev->lineLayoutItem().isDescendantOf(culledParent))) + if (culledParent == getLineLayoutItem() || (hasSibling && prev && prev->getLineLayoutItem().isDescendantOf(culledParent))) break; if (culledParent.isLayoutInline() && LineLayoutInline(culledParent).hitTestCulledInline(result, locationInContainer, accumulatedOffset)) @@ -1033,10 +1033,10 @@ } } - if (lineLayoutItem().style()->hasBorderRadius()) { + if (getLineLayoutItem().style()->hasBorderRadius()) { LayoutRect borderRect = logicalFrameRect(); borderRect.moveBy(accumulatedOffset); - FloatRoundedRect border = lineLayoutItem().style()->getRoundedBorderFor(borderRect, includeLogicalLeftEdge(), includeLogicalRightEdge()); + FloatRoundedRect border = getLineLayoutItem().style()->getRoundedBorderFor(borderRect, includeLogicalLeftEdge(), includeLogicalRightEdge()); if (!locationInContainer.intersects(border)) return false; } @@ -1050,8 +1050,8 @@ // Pixel snap hit testing. rect = LayoutRect(pixelSnappedIntRect(rect)); if (visibleToHitTestRequest(result.hitTestRequest()) && locationInContainer.intersects(rect)) { - lineLayoutItem().updateHitTestResult(result, flipForWritingMode(locationInContainer.point() - toLayoutSize(accumulatedOffset))); // Don't add in m_topLeft here, we want coords in the containing block's space. - if (result.addNodeToListBasedTestResult(lineLayoutItem().node(), locationInContainer, rect) == StopHitTesting) + getLineLayoutItem().updateHitTestResult(result, flipForWritingMode(locationInContainer.point() - toLayoutSize(accumulatedOffset))); // Don't add in m_topLeft here, we want coords in the containing block's space. + if (result.addNodeToListBasedTestResult(getLineLayoutItem().node(), locationInContainer, rect) == StopHitTesting) return true; } @@ -1069,7 +1069,7 @@ // would be clipped out, so it has to be drawn separately). StyleImage* image = lastBackgroundLayer.image(); bool hasFillImage = image && image->canRender(); - return (!hasFillImage && !lineLayoutItem().style()->hasBorderRadius()) || (!prevLineBox() && !nextLineBox()) || !parent(); + return (!hasFillImage && !getLineLayoutItem().style()->hasBorderRadius()) || (!prevLineBox() && !nextLineBox()) || !parent(); } InlineBox* InlineFlowBox::firstLeafChild() const @@ -1088,7 +1088,7 @@ return leaf; } -SelectionState InlineFlowBox::selectionState() const +SelectionState InlineFlowBox::getSelectionState() const { return SelectionNone; } @@ -1142,14 +1142,14 @@ { LayoutUnit result; for (InlineBox* curr = firstChild(); curr; curr = curr->nextOnLine()) { - if (curr->lineLayoutItem().isOutOfFlowPositioned()) + if (curr->getLineLayoutItem().isOutOfFlowPositioned()) continue; // Positioned placeholders don't affect calculations. if (curr->isInlineFlowBox()) result = std::max(result, toInlineFlowBox(curr)->computeOverAnnotationAdjustment(allowedPosition)); - if (curr->lineLayoutItem().isAtomicInlineLevel() && curr->lineLayoutItem().isRubyRun() && curr->lineLayoutItem().style()->rubyPosition() == RubyPositionBefore) { - LineLayoutRubyRun rubyRun = LineLayoutRubyRun(curr->lineLayoutItem()); + if (curr->getLineLayoutItem().isAtomicInlineLevel() && curr->getLineLayoutItem().isRubyRun() && curr->getLineLayoutItem().style()->rubyPosition() == RubyPositionBefore) { + LineLayoutRubyRun rubyRun = LineLayoutRubyRun(curr->getLineLayoutItem()); LayoutRubyText* rubyText = rubyRun.rubyText(); if (!rubyText) continue; @@ -1170,7 +1170,7 @@ } if (curr->isInlineTextBox()) { - const ComputedStyle& style = curr->lineLayoutItem().styleRef(isFirstLineStyle()); + const ComputedStyle& style = curr->getLineLayoutItem().styleRef(isFirstLineStyle()); TextEmphasisPosition emphasisMarkPosition; if (style.textEmphasisMark() != TextEmphasisMarkNone && toInlineTextBox(curr)->getEmphasisMarkPosition(style, emphasisMarkPosition) && emphasisMarkPosition == TextEmphasisPositionOver) { if (!style.isFlippedLinesWritingMode()) { @@ -1190,14 +1190,14 @@ { LayoutUnit result; for (InlineBox* curr = firstChild(); curr; curr = curr->nextOnLine()) { - if (curr->lineLayoutItem().isOutOfFlowPositioned()) + if (curr->getLineLayoutItem().isOutOfFlowPositioned()) continue; // Positioned placeholders don't affect calculations. if (curr->isInlineFlowBox()) result = std::max(result, toInlineFlowBox(curr)->computeUnderAnnotationAdjustment(allowedPosition)); - if (curr->lineLayoutItem().isAtomicInlineLevel() && curr->lineLayoutItem().isRubyRun() && curr->lineLayoutItem().style()->rubyPosition() == RubyPositionAfter) { - LineLayoutRubyRun rubyRun = LineLayoutRubyRun(curr->lineLayoutItem()); + if (curr->getLineLayoutItem().isAtomicInlineLevel() && curr->getLineLayoutItem().isRubyRun() && curr->getLineLayoutItem().style()->rubyPosition() == RubyPositionAfter) { + LineLayoutRubyRun rubyRun = LineLayoutRubyRun(curr->getLineLayoutItem()); LayoutRubyText* rubyText = rubyRun.rubyText(); if (!rubyText) continue; @@ -1218,7 +1218,7 @@ } if (curr->isInlineTextBox()) { - const ComputedStyle& style = curr->lineLayoutItem().styleRef(isFirstLineStyle()); + const ComputedStyle& style = curr->getLineLayoutItem().styleRef(isFirstLineStyle()); if (style.textEmphasisMark() != TextEmphasisMarkNone && style.textEmphasisPosition() == TextEmphasisPositionUnder) { if (!style.isFlippedLinesWritingMode()) { LayoutUnit bottomOfEmphasisMark = curr->logicalBottom() + style.font().emphasisMarkHeight(style.textEmphasisMarkString()); @@ -1249,7 +1249,7 @@ leafBoxesInLogicalOrder.append(leaf); } - if (lineLayoutItem().style()->rtlOrdering() == VisualOrder) + if (getLineLayoutItem().style()->rtlOrdering() == VisualOrder) return; // Reverse of reordering of the line (L2 according to Bidi spec):
diff --git a/third_party/WebKit/Source/core/layout/line/InlineFlowBox.h b/third_party/WebKit/Source/core/layout/line/InlineFlowBox.h index ac1770b..4457583 100644 --- a/third_party/WebKit/Source/core/layout/line/InlineFlowBox.h +++ b/third_party/WebKit/Source/core/layout/line/InlineFlowBox.h
@@ -143,13 +143,13 @@ { if (!includeLogicalLeftEdge()) return 0; - return isHorizontal() ? lineLayoutItem().style(isFirstLineStyle())->borderLeftWidth() : lineLayoutItem().style(isFirstLineStyle())->borderTopWidth(); + return isHorizontal() ? getLineLayoutItem().style(isFirstLineStyle())->borderLeftWidth() : getLineLayoutItem().style(isFirstLineStyle())->borderTopWidth(); } int borderLogicalRight() const { if (!includeLogicalRightEdge()) return 0; - return isHorizontal() ? lineLayoutItem().style(isFirstLineStyle())->borderRightWidth() : lineLayoutItem().style(isFirstLineStyle())->borderBottomWidth(); + return isHorizontal() ? getLineLayoutItem().style(isFirstLineStyle())->borderRightWidth() : getLineLayoutItem().style(isFirstLineStyle())->borderBottomWidth(); } int paddingLogicalLeft() const { @@ -190,7 +190,7 @@ void removeChild(InlineBox* child, MarkLineBoxes); - SelectionState selectionState() const override; + SelectionState getSelectionState() const override; bool canAccommodateEllipsis(bool ltr, int blockEdge, int ellipsisWidth) const final; LayoutUnit placeEllipsisBox(bool ltr, LayoutUnit blockLeftEdge, LayoutUnit blockRightEdge, LayoutUnit ellipsisWidth, LayoutUnit &truncatedWidth, bool&) override; @@ -224,7 +224,7 @@ LayoutRect logicalLayoutOverflowRect(LayoutUnit lineTop, LayoutUnit lineBottom) const { LayoutRect result = layoutOverflowRect(lineTop, lineBottom); - if (!lineLayoutItem().isHorizontalWritingMode()) + if (!getLineLayoutItem().isHorizontalWritingMode()) result = result.transposedRect(); return result; } @@ -250,7 +250,7 @@ LayoutRect logicalVisualOverflowRect(LayoutUnit lineTop, LayoutUnit lineBottom) const { LayoutRect result = visualOverflowRect(lineTop, lineBottom); - if (!lineLayoutItem().isHorizontalWritingMode()) + if (!getLineLayoutItem().isHorizontalWritingMode()) result = result.transposedRect(); return result; }
diff --git a/third_party/WebKit/Source/core/layout/line/InlineIterator.h b/third_party/WebKit/Source/core/layout/line/InlineIterator.h index b7953c92..92a0894 100644 --- a/third_party/WebKit/Source/core/layout/line/InlineIterator.h +++ b/third_party/WebKit/Source/core/layout/line/InlineIterator.h
@@ -92,7 +92,7 @@ m_nextBreakablePosition = nextBreak; } - LineLayoutItem lineLayoutItem() const { return m_lineLayoutItem; } + LineLayoutItem getLineLayoutItem() const { return m_lineLayoutItem; } void setLineLayoutItem(LineLayoutItem lineLayoutItem) { m_lineLayoutItem = lineLayoutItem; } int nextBreakablePosition() const { return m_nextBreakablePosition; } @@ -132,12 +132,12 @@ inline bool operator==(const InlineIterator& it1, const InlineIterator& it2) { - return it1.offset() == it2.offset() && it1.lineLayoutItem() == it2.lineLayoutItem(); + return it1.offset() == it2.offset() && it1.getLineLayoutItem() == it2.getLineLayoutItem(); } inline bool operator!=(const InlineIterator& it1, const InlineIterator& it2) { - return it1.offset() != it2.offset() || it1.lineLayoutItem() != it2.lineLayoutItem(); + return it1.offset() != it2.offset() || it1.getLineLayoutItem() != it2.getLineLayoutItem(); } static inline WTF::Unicode::CharDirection embedCharFromDirection(TextDirection dir, EUnicodeBidi unicodeBidi) @@ -403,12 +403,12 @@ static inline bool endOfLineHasIsolatedObjectAncestor(const InlineIterator& isolatedIterator, const InlineIterator& ancestorItertor) { - if (!isolatedIterator.lineLayoutItem() || !treatAsIsolated(isolatedIterator.lineLayoutItem().styleRef())) + if (!isolatedIterator.getLineLayoutItem() || !treatAsIsolated(isolatedIterator.getLineLayoutItem().styleRef())) return false; - LineLayoutItem innerIsolatedObject = isolatedIterator.lineLayoutItem(); + LineLayoutItem innerIsolatedObject = isolatedIterator.getLineLayoutItem(); while (innerIsolatedObject && innerIsolatedObject != isolatedIterator.root()) { - if (innerIsolatedObject == ancestorItertor.lineLayoutItem()) + if (innerIsolatedObject == ancestorItertor.getLineLayoutItem()) return true; innerIsolatedObject = innerIsolatedObject.parent(); } @@ -482,9 +482,9 @@ template <> inline bool InlineBidiResolver::isEndOfLine(const InlineIterator& end) { - bool inEndOfLine = m_current == end || m_current.atEnd() || (inIsolate() && m_current.lineLayoutItem() == end.lineLayoutItem()); + bool inEndOfLine = m_current == end || m_current.atEnd() || (inIsolate() && m_current.getLineLayoutItem() == end.getLineLayoutItem()); if (inIsolate() && inEndOfLine) { - m_current.moveTo(m_current.lineLayoutItem(), end.offset(), m_current.nextBreakablePosition()); + m_current.moveTo(m_current.getLineLayoutItem(), end.offset(), m_current.nextBreakablePosition()); m_last = m_current; updateStatusLastFromCurrentDirection(WTF::Unicode::OtherNeutral); } @@ -574,7 +574,7 @@ static inline unsigned numberOfIsolateAncestors(const InlineIterator& iter) { - LineLayoutItem object = iter.lineLayoutItem(); + LineLayoutItem object = iter.getLineLayoutItem(); if (!object) return 0; unsigned count = 0; @@ -696,7 +696,7 @@ if (haveNextMidpoint) nextMidpoint = lineMidpointState.midpoints()[lineMidpointState.currentMidpoint()]; if (lineMidpointState.betweenMidpoints()) { - if (!(haveNextMidpoint && nextMidpoint.lineLayoutItem() == obj)) + if (!(haveNextMidpoint && nextMidpoint.getLineLayoutItem() == obj)) return; // This is a new start point. Stop ignoring objects and // adjust our start. @@ -706,7 +706,7 @@ if (start < end) return adjustMidpointsAndAppendRunsForObjectIfNeeded(obj, start, end, root, resolver, behavior, tracker); } else { - if (!haveNextMidpoint || (obj != nextMidpoint.lineLayoutItem())) { + if (!haveNextMidpoint || (obj != nextMidpoint.getLineLayoutItem())) { appendRunObjectIfNecessary(obj, start, end, root, resolver, behavior, tracker); return; } @@ -742,8 +742,8 @@ // FIXME: Could this initialize from this->inIsolate() instead of walking up the layout tree? IsolateTracker isolateTracker(runs, numberOfIsolateAncestors(m_sor)); int start = m_sor.offset(); - LineLayoutItem obj = m_sor.lineLayoutItem(); - while (obj && obj != m_eor.lineLayoutItem() && obj != m_endOfRunAtEndOfLine.lineLayoutItem()) { + LineLayoutItem obj = m_sor.getLineLayoutItem(); + while (obj && obj != m_eor.getLineLayoutItem() && obj != m_endOfRunAtEndOfLine.getLineLayoutItem()) { if (isolateTracker.inIsolate()) addFakeRunIfNecessary(obj, start, obj.length(), m_sor.root(), *this, isolateTracker); else @@ -752,10 +752,10 @@ start = 0; obj = bidiNextSkippingEmptyInlines(m_sor.root(), obj, &isolateTracker); } - bool isEndOfLine = obj == m_endOfLine.lineLayoutItem() && !m_endOfLine.offset(); + bool isEndOfLine = obj == m_endOfLine.getLineLayoutItem() && !m_endOfLine.offset(); if (obj && !isEndOfLine) { - unsigned pos = obj == m_eor.lineLayoutItem() ? m_eor.offset() : INT_MAX; - if (obj == m_endOfRunAtEndOfLine.lineLayoutItem() && m_endOfRunAtEndOfLine.offset() <= pos) { + unsigned pos = obj == m_eor.getLineLayoutItem() ? m_eor.offset() : INT_MAX; + if (obj == m_endOfRunAtEndOfLine.getLineLayoutItem() && m_endOfRunAtEndOfLine.offset() <= pos) { m_reachedEndOfLine = true; pos = m_endOfRunAtEndOfLine.offset(); } @@ -771,7 +771,7 @@ m_reachedEndOfLine = true; // If isolateTrack is inIsolate, the next |start of run| can not be the current isolated layoutObject. if (isolateTracker.inIsolate()) - m_eor.moveTo(bidiNextSkippingEmptyInlines(m_eor.root(), m_eor.lineLayoutItem()), 0); + m_eor.moveTo(bidiNextSkippingEmptyInlines(m_eor.root(), m_eor.getLineLayoutItem()), 0); else m_eor.increment(); m_sor = m_eor;
diff --git a/third_party/WebKit/Source/core/layout/line/InlineTextBox.cpp b/third_party/WebKit/Source/core/layout/line/InlineTextBox.cpp index 29105276..1f0885bd 100644 --- a/third_party/WebKit/Source/core/layout/line/InlineTextBox.cpp +++ b/third_party/WebKit/Source/core/layout/line/InlineTextBox.cpp
@@ -112,43 +112,43 @@ { if (!isText() || !parent()) return 0; - if (parent()->lineLayoutItem() == lineLayoutItem().parent()) + if (parent()->getLineLayoutItem() == getLineLayoutItem().parent()) return parent()->baselinePosition(baselineType); - return LineLayoutBoxModel(lineLayoutItem().parent()).baselinePosition(baselineType, isFirstLineStyle(), isHorizontal() ? HorizontalLine : VerticalLine, PositionOnContainingLine); + return LineLayoutBoxModel(getLineLayoutItem().parent()).baselinePosition(baselineType, isFirstLineStyle(), isHorizontal() ? HorizontalLine : VerticalLine, PositionOnContainingLine); } LayoutUnit InlineTextBox::lineHeight() const { - if (!isText() || !lineLayoutItem().parent()) + if (!isText() || !getLineLayoutItem().parent()) return LayoutUnit(); - if (lineLayoutItem().isBR()) - return LayoutUnit(toLayoutBR(lineLayoutItem())->lineHeight(isFirstLineStyle())); - if (parent()->lineLayoutItem() == lineLayoutItem().parent()) + if (getLineLayoutItem().isBR()) + return LayoutUnit(toLayoutBR(getLineLayoutItem())->lineHeight(isFirstLineStyle())); + if (parent()->getLineLayoutItem() == getLineLayoutItem().parent()) return parent()->lineHeight(); - return LineLayoutBoxModel(lineLayoutItem().parent()).lineHeight(isFirstLineStyle(), isHorizontal() ? HorizontalLine : VerticalLine, PositionOnContainingLine); + return LineLayoutBoxModel(getLineLayoutItem().parent()).lineHeight(isFirstLineStyle(), isHorizontal() ? HorizontalLine : VerticalLine, PositionOnContainingLine); } bool InlineTextBox::isSelected(int startPos, int endPos) const { int sPos = std::max(startPos - m_start, 0); // The position after a hard line break is considered to be past its end. - // See the corresponding code in InlineTextBox::selectionState. + // See the corresponding code in InlineTextBox::getSelectionState. int ePos = std::min(endPos - m_start, int(m_len) + (isLineBreak() ? 0 : 1)); return (sPos < ePos); } -SelectionState InlineTextBox::selectionState() const +SelectionState InlineTextBox::getSelectionState() const { - SelectionState state = lineLayoutItem().selectionState(); + SelectionState state = getLineLayoutItem().getSelectionState(); if (state == SelectionStart || state == SelectionEnd || state == SelectionBoth) { int startPos, endPos; - lineLayoutItem().selectionStartEnd(startPos, endPos); + getLineLayoutItem().selectionStartEnd(startPos, endPos); // The position after a hard line break is considered to be past its end. // See the corresponding code in InlineTextBox::isSelected. int lastSelectable = start() + len() - (isLineBreak() ? 1 : 0); // FIXME: Remove -webkit-line-break: LineBreakAfterWhiteSpace. - int endOfLineAdjustmentForCSSLineBreak = lineLayoutItem().style()->lineBreak() == LineBreakAfterWhiteSpace ? -1 : 0; + int endOfLineAdjustmentForCSSLineBreak = getLineLayoutItem().style()->lineBreak() == LineBreakAfterWhiteSpace ? -1 : 0; bool start = (state != SelectionEnd && startPos >= m_start && startPos <= m_start + m_len + endOfLineAdjustmentForCSSLineBreak); bool end = (state != SelectionStart && endPos > m_start && endPos <= lastSelectable); if (start && end) @@ -191,10 +191,10 @@ // Bail out as currently looking up selection state can cause the editing // code can force a re-layout while scrutinizing the editing position, and // InlineTextBox instances are not guaranteed to survive a re-layout. - if (lineLayoutItem().needsLayout()) + if (getLineLayoutItem().needsLayout()) return false; - SelectionState state = selectionState(); + SelectionState state = getSelectionState(); return (state == SelectionStart || state == SelectionInside) // Checking last leaf child can be slow, so we make sure to do this only // after the other simple conditionals. @@ -208,7 +208,7 @@ float InlineTextBox::newlineSpaceWidth() const { - const ComputedStyle& styleToUse = lineLayoutItem().styleRef(isFirstLineStyle()); + const ComputedStyle& styleToUse = getLineLayoutItem().styleRef(isFirstLineStyle()); return styleToUse.font().spaceWidth(); } @@ -224,7 +224,7 @@ LayoutUnit selTop = root().selectionTop(); LayoutUnit selHeight = root().selectionHeight(); - const ComputedStyle& styleToUse = lineLayoutItem().styleRef(isFirstLineStyle()); + const ComputedStyle& styleToUse = getLineLayoutItem().styleRef(isFirstLineStyle()); const Font& font = styleToUse.font(); StringBuilder charactersWithHyphen; @@ -274,7 +274,7 @@ void InlineTextBox::deleteLine() { - lineLayoutItem().removeTextBox(this); + getLineLayoutItem().removeTextBox(this); destroy(); } @@ -283,7 +283,7 @@ if (extracted()) return; - lineLayoutItem().extractTextBox(this); + getLineLayoutItem().extractTextBox(this); } void InlineTextBox::attachLine() @@ -291,7 +291,7 @@ if (!extracted()) return; - lineLayoutItem().attachTextBox(this); + getLineLayoutItem().attachTextBox(this); } void InlineTextBox::setTruncation(unsigned truncation) @@ -359,7 +359,7 @@ // If we got here that means that we were only partially truncated and we need to return the pixel offset at which // to place the ellipsis. - LayoutUnit widthOfVisibleText(lineLayoutItem().width(m_start, offset, textPos(), flowIsLTR ? LTR : RTL, isFirstLineStyle())); + LayoutUnit widthOfVisibleText(getLineLayoutItem().width(m_start, offset, textPos(), flowIsLTR ? LTR : RTL, isFirstLineStyle())); // The ellipsis needs to be placed just after the last visible character. // Where "after" is defined by the flow directionality, not the inline @@ -377,7 +377,7 @@ bool InlineTextBox::isLineBreak() const { - return lineLayoutItem().isBR() || (lineLayoutItem().style()->preserveNewline() && len() == 1 && (*lineLayoutItem().text().impl())[start()] == '\n'); + return getLineLayoutItem().isBR() || (getLineLayoutItem().style()->preserveNewline() && len() == 1 && (*getLineLayoutItem().text().impl())[start()] == '\n'); } bool InlineTextBox::nodeAtPoint(HitTestResult& result, const HitTestLocation& locationInContainer, const LayoutPoint& accumulatedOffset, LayoutUnit /* lineTop */, LayoutUnit /*lineBottom*/) @@ -389,8 +389,8 @@ boxOrigin.moveBy(accumulatedOffset); LayoutRect rect(boxOrigin, size()); if (visibleToHitTestRequest(result.hitTestRequest()) && locationInContainer.intersects(rect)) { - lineLayoutItem().updateHitTestResult(result, flipForWritingMode(locationInContainer.point() - toLayoutSize(accumulatedOffset))); - if (result.addNodeToListBasedTestResult(lineLayoutItem().node(), locationInContainer, rect) == StopHitTesting) + getLineLayoutItem().updateHitTestResult(result, flipForWritingMode(locationInContainer.point() - toLayoutSize(accumulatedOffset))); + if (result.addNodeToListBasedTestResult(getLineLayoutItem().node(), locationInContainer, rect) == StopHitTesting) return true; } return false; @@ -406,7 +406,7 @@ if (emphasisPosition == TextEmphasisPositionUnder) return true; // Ruby text is always over, so it cannot suppress emphasis marks under. - LineLayoutBox containingBlock = lineLayoutItem().containingBlock(); + LineLayoutBox containingBlock = getLineLayoutItem().containingBlock(); if (!containingBlock.isRubyBase()) return true; // This text is not inside a ruby base, so it does not have ruby text over it. @@ -427,14 +427,14 @@ void InlineTextBox::selectionStartEnd(int& sPos, int& ePos) const { int startPos, endPos; - if (lineLayoutItem().selectionState() == SelectionInside) { + if (getLineLayoutItem().getSelectionState() == SelectionInside) { startPos = 0; - endPos = lineLayoutItem().textLength(); + endPos = getLineLayoutItem().textLength(); } else { - lineLayoutItem().selectionStartEnd(startPos, endPos); - if (lineLayoutItem().selectionState() == SelectionStart) - endPos = lineLayoutItem().textLength(); - else if (lineLayoutItem().selectionState() == SelectionEnd) + getLineLayoutItem().selectionStartEnd(startPos, endPos); + if (getLineLayoutItem().getSelectionState() == SelectionStart) + endPos = getLineLayoutItem().textLength(); + else if (getLineLayoutItem().getSelectionState() == SelectionEnd) startPos = 0; } @@ -486,7 +486,7 @@ if (lineOffset - logicalLeft() < 0) return isLeftToRightDirection() ? 0 : len(); - LineLayoutText text = lineLayoutItem(); + LineLayoutText text = getLineLayoutItem(); const ComputedStyle& style = text.styleRef(isFirstLineStyle()); const Font& font = style.font(); return font.offsetForPosition(constructTextRun(style, font), (lineOffset - logicalLeft()).toFloat(), includePartialGlyphs); @@ -500,7 +500,7 @@ if (isLineBreak()) return logicalLeft(); - LineLayoutText text = lineLayoutItem(); + LineLayoutText text = getLineLayoutItem(); const ComputedStyle& styleToUse = text.styleRef(isFirstLineStyle()); const Font& font = styleToUse.font(); int from = !isLeftToRightDirection() ? offset - m_start : 0; @@ -539,15 +539,15 @@ return; FontCachePurgePreventer fontCachePurgePreventer; - ASSERT(lineLayoutItem().text()); + ASSERT(getLineLayoutItem().text()); - const ComputedStyle& styleToUse = lineLayoutItem().styleRef(isFirstLineStyle()); + const ComputedStyle& styleToUse = getLineLayoutItem().styleRef(isFirstLineStyle()); const Font& font = styleToUse.font(); float lastWidth = 0; widths.resize(m_len); for (unsigned i = 0; i < m_len; i++) { - StringView substringView = lineLayoutItem().text().createView(); + StringView substringView = getLineLayoutItem().text().createView(); substringView.narrow(start(), 1 + i); TextRun textRun = constructTextRun(styleToUse, font, substringView, m_len); widths[i] = font.width(textRun, nullptr, nullptr) - lastWidth; @@ -557,16 +557,16 @@ TextRun InlineTextBox::constructTextRun(const ComputedStyle& style, const Font& font, StringBuilder* charactersWithHyphen) const { - ASSERT(lineLayoutItem().text()); + ASSERT(getLineLayoutItem().text()); - StringView string = lineLayoutItem().text().createView(); + StringView string = getLineLayoutItem().text().createView(); unsigned startPos = start(); unsigned length = len(); if (string.length() != length || startPos) string.narrow(startPos, length); - return constructTextRun(style, font, string, lineLayoutItem().textLength() - startPos, charactersWithHyphen); + return constructTextRun(style, font, string, getLineLayoutItem().textLength() - startPos, charactersWithHyphen); } TextRun InlineTextBox::constructTextRun(const ComputedStyle& style, const Font& font, StringView string, int maximumLength, StringBuilder* charactersWithHyphen) const @@ -609,7 +609,7 @@ String InlineTextBox::text() const { - return lineLayoutItem().text().substring(start(), len()); + return getLineLayoutItem().text().substring(start(), len()); } #ifndef NDEBUG @@ -622,7 +622,7 @@ printedCharacters += fprintf(stderr, "%s %p", boxName(), this); for (; printedCharacters < showTreeCharacterOffset; printedCharacters++) fputc(' ', stderr); - const LineLayoutText obj = lineLayoutItem(); + const LineLayoutText obj = getLineLayoutItem(); printedCharacters = fprintf(stderr, "\t%s %p", obj.name(), obj.debugPointer()); const int layoutObjectCharacterOffset = 75; for (; printedCharacters < layoutObjectCharacterOffset; printedCharacters++)
diff --git a/third_party/WebKit/Source/core/layout/line/InlineTextBox.h b/third_party/WebKit/Source/core/layout/line/InlineTextBox.h index 0711e25df..d26ebede 100644 --- a/third_party/WebKit/Source/core/layout/line/InlineTextBox.h +++ b/third_party/WebKit/Source/core/layout/line/InlineTextBox.h
@@ -51,7 +51,7 @@ setIsText(true); } - LineLayoutText lineLayoutItem() const { return LineLayoutText(InlineBox::lineLayoutItem()); } + LineLayoutText getLineLayoutItem() const { return LineLayoutText(InlineBox::getLineLayoutItem()); } void destroy() final; @@ -125,7 +125,7 @@ void attachLine() final; public: - SelectionState selectionState() const final; + SelectionState getSelectionState() const final; bool hasWrappedSelectionNewline() const; float newlineSpaceWidth() const;
diff --git a/third_party/WebKit/Source/core/layout/line/LineBreaker.cpp b/third_party/WebKit/Source/core/layout/line/LineBreaker.cpp index 952ca52..4f28f9b2 100644 --- a/third_party/WebKit/Source/core/layout/line/LineBreaker.cpp +++ b/third_party/WebKit/Source/core/layout/line/LineBreaker.cpp
@@ -30,7 +30,7 @@ FloatingObject* lastFloatFromPreviousLine, LineWidth& width) { while (!resolver.position().atEnd() && !requiresLineBox(resolver.position(), lineInfo, LeadingWhitespace)) { - LayoutObject* object = resolver.position().lineLayoutItem(); + LayoutObject* object = resolver.position().getLineLayoutItem(); if (object->isOutOfFlowPositioned()) { setStaticPositions(m_block, LineLayoutBox(toLayoutBox(object)), width.indentText()); if (object->style()->isOriginalDisplayInlineType()) {
diff --git a/third_party/WebKit/Source/core/layout/line/LineWidth.cpp b/third_party/WebKit/Source/core/layout/line/LineWidth.cpp index c69d9e49..5982992 100644 --- a/third_party/WebKit/Source/core/layout/line/LineWidth.cpp +++ b/third_party/WebKit/Source/core/layout/line/LineWidth.cpp
@@ -71,7 +71,7 @@ shapeDeltas = shapeOutsideInfo->computeDeltasForContainingBlockLine(m_block, newFloat, m_block.logicalHeight(), lineHeight); } - if (newFloat.type() == FloatingObject::FloatLeft) { + if (newFloat.getType() == FloatingObject::FloatLeft) { float newLeft = m_block.logicalRightForFloat(newFloat).toFloat(); if (shapeDeltas.isValid()) { if (shapeDeltas.lineOverlapsShape())
diff --git a/third_party/WebKit/Source/core/layout/line/RootInlineBox.cpp b/third_party/WebKit/Source/core/layout/line/RootInlineBox.cpp index 3014b52..c054281 100644 --- a/third_party/WebKit/Source/core/layout/line/RootInlineBox.cpp +++ b/third_party/WebKit/Source/core/layout/line/RootInlineBox.cpp
@@ -160,7 +160,7 @@ { if (hasEllipsisBox() && visibleToHitTestRequest(result.hitTestRequest())) { if (ellipsisBox()->nodeAtPoint(result, locationInContainer, accumulatedOffset, lineTop, lineBottom)) { - lineLayoutItem().updateHitTestResult(result, locationInContainer.point() - toLayoutSize(accumulatedOffset)); + getLineLayoutItem().updateHitTestResult(result, locationInContainer.point() - toLayoutSize(accumulatedOffset)); return true; } } @@ -182,10 +182,10 @@ void RootInlineBox::childRemoved(InlineBox* box) { - if (box->lineLayoutItem() == m_lineBreakObj) + if (box->getLineLayoutItem() == m_lineBreakObj) setLineBreakInfo(0, 0, BidiStatus()); - for (RootInlineBox* prev = prevRootBox(); prev && prev->lineBreakObj() == box->lineLayoutItem(); prev = prev->prevRootBox()) { + for (RootInlineBox* prev = prevRootBox(); prev && prev->lineBreakObj() == box->getLineLayoutItem(); prev = prev->prevRootBox()) { prev->setLineBreakInfo(0, 0, BidiStatus()); prev->markDirty(); } @@ -232,7 +232,7 @@ bool setMaxDescent = false; // Figure out if we're in no-quirks mode. - bool noQuirksMode = lineLayoutItem().document().inNoQuirksMode(); + bool noQuirksMode = getLineLayoutItem().document().inNoQuirksMode(); m_baselineType = dominantBaseline(); @@ -241,8 +241,8 @@ if (maxAscent + maxDescent < std::max(maxPositionTop, maxPositionBottom)) adjustMaxAscentAndDescent(maxAscent, maxDescent, maxPositionTop, maxPositionBottom); - if (lineLayoutItem().styleRef().snapHeightUnit()) - snapHeight(maxAscent, maxDescent, lineLayoutItem().styleRef()); + if (getLineLayoutItem().styleRef().snapHeightUnit()) + snapHeight(maxAscent, maxDescent, getLineLayoutItem().styleRef()); LayoutUnit maxHeight = LayoutUnit(maxAscent + maxDescent); LayoutUnit lineTop = heightOfBlock; @@ -283,7 +283,7 @@ { LayoutUnit result; - if (!lineLayoutItem().style()->isFlippedLinesWritingMode()) { + if (!getLineLayoutItem().style()->isFlippedLinesWritingMode()) { // Annotations under the previous line may push us down. if (prevRootBox() && prevRootBox()->hasAnnotationsAfter()) result = prevRootBox()->computeUnderAnnotationAdjustment(lineTop()); @@ -310,12 +310,12 @@ return result; } -SelectionState RootInlineBox::selectionState() const +SelectionState RootInlineBox::getSelectionState() const { // Walk over all of the selected boxes. SelectionState state = SelectionNone; for (InlineBox* box = firstLeafChild(); box; box = box->nextLeafChild()) { - SelectionState boxState = box->selectionState(); + SelectionState boxState = box->getSelectionState(); if ((boxState == SelectionStart && state == SelectionEnd) || (boxState == SelectionEnd && state == SelectionStart)) { state = SelectionBoth; @@ -335,7 +335,7 @@ InlineBox* RootInlineBox::firstSelectedBox() const { for (InlineBox* box = firstLeafChild(); box; box = box->nextLeafChild()) { - if (box->selectionState() != SelectionNone) + if (box->getSelectionState() != SelectionNone) return box; } @@ -345,7 +345,7 @@ InlineBox* RootInlineBox::lastSelectedBox() const { for (InlineBox* box = lastLeafChild(); box; box = box->prevLeafChild()) { - if (box->selectionState() != SelectionNone) + if (box->getSelectionState() != SelectionNone) return box; } @@ -357,9 +357,9 @@ LayoutUnit selectionTop = m_lineTop; if (m_hasAnnotationsBefore) - selectionTop -= !lineLayoutItem().style()->isFlippedLinesWritingMode() ? computeOverAnnotationAdjustment(m_lineTop) : computeUnderAnnotationAdjustment(m_lineTop); + selectionTop -= !getLineLayoutItem().style()->isFlippedLinesWritingMode() ? computeOverAnnotationAdjustment(m_lineTop) : computeUnderAnnotationAdjustment(m_lineTop); - if (lineLayoutItem().style()->isFlippedLinesWritingMode() || !prevRootBox()) + if (getLineLayoutItem().style()->isFlippedLinesWritingMode() || !prevRootBox()) return selectionTop; LayoutUnit prevBottom = prevRootBox()->selectionBottom(); @@ -380,12 +380,12 @@ LayoutUnit RootInlineBox::selectionBottom() const { - LayoutUnit selectionBottom = lineLayoutItem().document().inNoQuirksMode() ? m_selectionBottom : m_lineBottom; + LayoutUnit selectionBottom = getLineLayoutItem().document().inNoQuirksMode() ? m_selectionBottom : m_lineBottom; if (m_hasAnnotationsAfter) - selectionBottom += !lineLayoutItem().style()->isFlippedLinesWritingMode() ? computeUnderAnnotationAdjustment(m_lineBottom) : computeOverAnnotationAdjustment(m_lineBottom); + selectionBottom += !getLineLayoutItem().style()->isFlippedLinesWritingMode() ? computeUnderAnnotationAdjustment(m_lineBottom) : computeOverAnnotationAdjustment(m_lineBottom); - if (!lineLayoutItem().style()->isFlippedLinesWritingMode() || !nextRootBox()) + if (!getLineLayoutItem().style()->isFlippedLinesWritingMode() || !nextRootBox()) return selectionBottom; LayoutUnit nextTop = nextRootBox()->selectionTop(); @@ -411,12 +411,12 @@ LineLayoutBlockFlow RootInlineBox::block() const { - return LineLayoutBlockFlow(lineLayoutItem()); + return LineLayoutBlockFlow(getLineLayoutItem()); } static bool isEditableLeaf(InlineBox* leaf) { - return leaf && leaf->lineLayoutItem().node() && leaf->lineLayoutItem().node()->hasEditableStyle(); + return leaf && leaf->getLineLayoutItem().node() && leaf->getLineLayoutItem().node()->hasEditableStyle(); } InlineBox* RootInlineBox::closestLeafChildForPoint(const LayoutPoint& pointInContents, bool onlyEditableLeaves) @@ -440,13 +440,13 @@ return firstLeaf; // Avoid returning a list marker when possible. - if (leftPosition <= firstLeaf->logicalLeft() && !firstLeaf->lineLayoutItem().isListMarker() && (!onlyEditableLeaves || isEditableLeaf(firstLeaf))) { + if (leftPosition <= firstLeaf->logicalLeft() && !firstLeaf->getLineLayoutItem().isListMarker() && (!onlyEditableLeaves || isEditableLeaf(firstLeaf))) { // The leftPosition coordinate is less or equal to left edge of the firstLeaf. // Return it. return firstLeaf; } - if (leftPosition >= lastLeaf->logicalRight() && !lastLeaf->lineLayoutItem().isListMarker() && (!onlyEditableLeaves || isEditableLeaf(lastLeaf))) { + if (leftPosition >= lastLeaf->logicalRight() && !lastLeaf->getLineLayoutItem().isListMarker() && (!onlyEditableLeaves || isEditableLeaf(lastLeaf))) { // The leftPosition coordinate is greater or equal to right edge of the lastLeaf. // Return it. return lastLeaf; @@ -454,7 +454,7 @@ InlineBox* closestLeaf = nullptr; for (InlineBox* leaf = firstLeaf; leaf; leaf = leaf->nextLeafChildIgnoringLineBreak()) { - if (!leaf->lineLayoutItem().isListMarker() && (!onlyEditableLeaves || isEditableLeaf(leaf))) { + if (!leaf->getLineLayoutItem().isListMarker() && (!onlyEditableLeaves || isEditableLeaf(leaf))) { closestLeaf = leaf; if (leftPosition < leaf->logicalRight()) { // The x coordinate is less than the right edge of the box. @@ -551,7 +551,7 @@ { bool ascentDescentSet = false; - if (box->lineLayoutItem().isAtomicInlineLevel()) { + if (box->getLineLayoutItem().isAtomicInlineLevel()) { ascent = box->baselinePosition(baselineType()); descent = roundToInt(box->lineHeight() - ascent); @@ -570,8 +570,8 @@ bool includeLeading = includeLeadingForBox(box); bool setUsedFontWithLeading = false; - if (usedFonts && !usedFonts->isEmpty() && (box->lineLayoutItem().style(isFirstLineStyle())->lineHeight().isNegative() && includeLeading)) { - usedFonts->append(box->lineLayoutItem().style(isFirstLineStyle())->font().primaryFont()); + if (usedFonts && !usedFonts->isEmpty() && (box->getLineLayoutItem().style(isFirstLineStyle())->lineHeight().isNegative() && includeLeading)) { + usedFonts->append(box->getLineLayoutItem().style(isFirstLineStyle())->font().primaryFont()); for (size_t i = 0; i < usedFonts->size(); ++i) { const FontMetrics& fontMetrics = usedFonts->at(i)->fontMetrics(); int usedFontAscent = fontMetrics.ascent(baselineType()); @@ -607,7 +607,7 @@ LayoutUnit RootInlineBox::verticalPositionForBox(InlineBox* box, VerticalPositionCache& verticalPositionCache) { - if (box->lineLayoutItem().isText()) + if (box->getLineLayoutItem().isText()) return box->parent()->logicalTop(); LineLayoutBoxModel boxModel = box->boxModelObject(); @@ -681,7 +681,7 @@ bool RootInlineBox::includeLeadingForBox(InlineBox* box) const { - return !(box->lineLayoutItem().isAtomicInlineLevel() || (box->lineLayoutItem().isText() && !box->isText())); + return !(box->getLineLayoutItem().isAtomicInlineLevel() || (box->getLineLayoutItem().isText() && !box->isText())); } Node* RootInlineBox::getLogicalStartBoxWithNode(InlineBox*& startBox) const @@ -689,9 +689,9 @@ Vector<InlineBox*> leafBoxesInLogicalOrder; collectLeafBoxesInLogicalOrder(leafBoxesInLogicalOrder); for (size_t i = 0; i < leafBoxesInLogicalOrder.size(); ++i) { - if (leafBoxesInLogicalOrder[i]->lineLayoutItem().nonPseudoNode()) { + if (leafBoxesInLogicalOrder[i]->getLineLayoutItem().nonPseudoNode()) { startBox = leafBoxesInLogicalOrder[i]; - return startBox->lineLayoutItem().nonPseudoNode(); + return startBox->getLineLayoutItem().nonPseudoNode(); } } startBox = nullptr; @@ -703,9 +703,9 @@ Vector<InlineBox*> leafBoxesInLogicalOrder; collectLeafBoxesInLogicalOrder(leafBoxesInLogicalOrder); for (size_t i = leafBoxesInLogicalOrder.size(); i > 0; --i) { - if (leafBoxesInLogicalOrder[i - 1]->lineLayoutItem().nonPseudoNode()) { + if (leafBoxesInLogicalOrder[i - 1]->getLineLayoutItem().nonPseudoNode()) { endBox = leafBoxesInLogicalOrder[i - 1]; - return endBox->lineLayoutItem().nonPseudoNode(); + return endBox->getLineLayoutItem().nonPseudoNode(); } } endBox = nullptr;
diff --git a/third_party/WebKit/Source/core/layout/line/RootInlineBox.h b/third_party/WebKit/Source/core/layout/line/RootInlineBox.h index 5836f6b..f7d5338d 100644 --- a/third_party/WebKit/Source/core/layout/line/RootInlineBox.h +++ b/third_party/WebKit/Source/core/layout/line/RootInlineBox.h
@@ -110,7 +110,7 @@ using InlineBox::hasSelectedChildren; using InlineBox::setHasSelectedChildren; - SelectionState selectionState() const final; + SelectionState getSelectionState() const final; InlineBox* firstSelectedBox() const; InlineBox* lastSelectedBox() const;
diff --git a/third_party/WebKit/Source/core/layout/line/TrailingObjects.cpp b/third_party/WebKit/Source/core/layout/line/TrailingObjects.cpp index ce01138..f0d2184 100644 --- a/third_party/WebKit/Source/core/layout/line/TrailingObjects.cpp +++ b/third_party/WebKit/Source/core/layout/line/TrailingObjects.cpp
@@ -39,7 +39,7 @@ if (lineMidpointState.numMidpoints() % 2) { // Find the trailing space object's midpoint. int trailingSpaceMidpoint = lineMidpointState.numMidpoints() - 1; - for ( ; trailingSpaceMidpoint > 0 && lineMidpointState.midpoints()[trailingSpaceMidpoint].lineLayoutItem() != m_whitespace; --trailingSpaceMidpoint) { } + for ( ; trailingSpaceMidpoint > 0 && lineMidpointState.midpoints()[trailingSpaceMidpoint].getLineLayoutItem() != m_whitespace; --trailingSpaceMidpoint) { } ASSERT(trailingSpaceMidpoint >= 0); if (collapseFirstSpace == CollapseFirstSpace) lineMidpointState.midpoints()[trailingSpaceMidpoint].setOffset(lineMidpointState.midpoints()[trailingSpaceMidpoint].offset() -1); @@ -52,12 +52,12 @@ // We don't have a midpoint for this box yet. ensureLineBoxInsideIgnoredSpaces(&lineMidpointState, LineLayoutItem(m_objects[i])); } else { - ASSERT(lineMidpointState.midpoints()[currentMidpoint].lineLayoutItem() == m_objects[i]); - ASSERT(lineMidpointState.midpoints()[currentMidpoint + 1].lineLayoutItem() == m_objects[i]); + ASSERT(lineMidpointState.midpoints()[currentMidpoint].getLineLayoutItem() == m_objects[i]); + ASSERT(lineMidpointState.midpoints()[currentMidpoint + 1].getLineLayoutItem() == m_objects[i]); } currentMidpoint += 2; } - } else if (!lBreak.lineLayoutItem()) { + } else if (!lBreak.getLineLayoutItem()) { ASSERT(collapseFirstSpace == CollapseFirstSpace); // Add a new end midpoint that stops right at the very end. unsigned length = m_whitespace.textLength();
diff --git a/third_party/WebKit/Source/core/layout/svg/LayoutSVGText.cpp b/third_party/WebKit/Source/core/layout/svg/LayoutSVGText.cpp index d76403a..6458eb56 100644 --- a/third_party/WebKit/Source/core/layout/svg/LayoutSVGText.cpp +++ b/third_party/WebKit/Source/core/layout/svg/LayoutSVGText.cpp
@@ -462,7 +462,7 @@ if (!closestBox) return createPositionWithAffinity(0); - return closestBox->lineLayoutItem().positionForPoint(LayoutPoint(clippedPointInContents.x(), closestBox->y())); + return closestBox->getLineLayoutItem().positionForPoint(LayoutPoint(clippedPointInContents.x(), closestBox->y())); } void LayoutSVGText::absoluteQuads(Vector<FloatQuad>& quads, bool* wasFixed) const
diff --git a/third_party/WebKit/Source/core/layout/svg/SVGLayoutTreeAsText.cpp b/third_party/WebKit/Source/core/layout/svg/SVGLayoutTreeAsText.cpp index af0644c..40c0516 100644 --- a/third_party/WebKit/Source/core/layout/svg/SVGLayoutTreeAsText.cpp +++ b/third_party/WebKit/Source/core/layout/svg/SVGLayoutTreeAsText.cpp
@@ -396,10 +396,10 @@ if (fragments.isEmpty()) return; - LineLayoutSVGInlineText textLineLayout = LineLayoutSVGInlineText(textBox->lineLayoutItem()); + LineLayoutSVGInlineText textLineLayout = LineLayoutSVGInlineText(textBox->getLineLayoutItem()); const SVGComputedStyle& svgStyle = textLineLayout.style()->svgStyle(); - String text = textBox->lineLayoutItem().text(); + String text = textBox->getLineLayoutItem().text(); unsigned fragmentsSize = fragments.size(); for (unsigned i = 0; i < fragmentsSize; ++i) {
diff --git a/third_party/WebKit/Source/core/layout/svg/SVGTextChunkBuilder.cpp b/third_party/WebKit/Source/core/layout/svg/SVGTextChunkBuilder.cpp index f4f7366d..07cbdc7 100644 --- a/third_party/WebKit/Source/core/layout/svg/SVGTextChunkBuilder.cpp +++ b/third_party/WebKit/Source/core/layout/svg/SVGTextChunkBuilder.cpp
@@ -158,7 +158,7 @@ void SVGTextPathChunkBuilder::handleTextChunk(BoxListConstIterator boxStart, BoxListConstIterator boxEnd) { - const ComputedStyle& style = (*boxStart)->lineLayoutItem().styleRef(); + const ComputedStyle& style = (*boxStart)->getLineLayoutItem().styleRef(); ChunkLengthAccumulator lengthAccumulator(!style.isHorizontalWritingMode()); lengthAccumulator.processRange(boxStart, boxEnd); @@ -180,7 +180,7 @@ { ASSERT(*boxStart); - const LineLayoutSVGInlineText textLineLayout = LineLayoutSVGInlineText((*boxStart)->lineLayoutItem()); + const LineLayoutSVGInlineText textLineLayout = LineLayoutSVGInlineText((*boxStart)->getLineLayoutItem()); const ComputedStyle& style = textLineLayout.styleRef(); // Handle 'lengthAdjust' property.
diff --git a/third_party/WebKit/Source/core/layout/svg/SVGTextLayoutEngine.cpp b/third_party/WebKit/Source/core/layout/svg/SVGTextLayoutEngine.cpp index 4cd9375a..2b584b6 100644 --- a/third_party/WebKit/Source/core/layout/svg/SVGTextLayoutEngine.cpp +++ b/third_party/WebKit/Source/core/layout/svg/SVGTextLayoutEngine.cpp
@@ -113,7 +113,7 @@ static void computeGlyphOverflow(SVGInlineTextBox* textBox, SVGTextFragment& textFragment) { - LineLayoutSVGInlineText textLineLayout = LineLayoutSVGInlineText(textBox->lineLayoutItem()); + LineLayoutSVGInlineText textLineLayout = LineLayoutSVGInlineText(textBox->getLineLayoutItem()); TextRun run = SVGTextMetrics::constructTextRun(textLineLayout, textFragment.characterOffset, textFragment.length, textLineLayout.styleRef().direction()); float scalingFactor = textLineLayout.scalingFactor(); @@ -173,7 +173,7 @@ lineLayout.layoutCharactersInTextBoxes(flowBox); m_inPathLayout = true; - LineLayoutSVGTextPath textPath = LineLayoutSVGTextPath(flowBox->lineLayoutItem()); + LineLayoutSVGTextPath textPath = LineLayoutSVGTextPath(flowBox->getLineLayoutItem()); m_textPath = textPath.layoutPath(); if (!m_textPath) @@ -223,7 +223,7 @@ { ASSERT(textBox); - LineLayoutSVGInlineText textLineLayout = LineLayoutSVGInlineText(textBox->lineLayoutItem()); + LineLayoutSVGInlineText textLineLayout = LineLayoutSVGInlineText(textBox->getLineLayoutItem()); ASSERT(textLineLayout.parent()); ASSERT(textLineLayout.parent().node()); ASSERT(textLineLayout.parent().node()->isSVGElement()); @@ -242,7 +242,7 @@ static bool definesTextLengthWithSpacing(const InlineFlowBox* start) { - SVGTextContentElement* textContentElement = SVGTextContentElement::elementFromLineLayoutItem(start->lineLayoutItem()); + SVGTextContentElement* textContentElement = SVGTextContentElement::elementFromLineLayoutItem(start->getLineLayoutItem()); return textContentElement && textContentElement->lengthAdjust()->currentValue()->enumValue() == SVGLengthAdjustSpacing && textContentElement->textLengthIsSpecifiedByUser(); @@ -255,11 +255,11 @@ for (InlineBox* child = start->firstChild(); child; child = child->nextOnLine()) { if (child->isSVGInlineTextBox()) { - ASSERT(child->lineLayoutItem().isSVGInlineText()); + ASSERT(child->getLineLayoutItem().isSVGInlineText()); layoutInlineTextBox(toSVGInlineTextBox(child)); } else { // Skip generated content. - Node* node = child->lineLayoutItem().node(); + Node* node = child->getLineLayoutItem().node(); if (!node) continue;
diff --git a/third_party/WebKit/Source/core/layout/svg/SVGTextQuery.cpp b/third_party/WebKit/Source/core/layout/svg/SVGTextQuery.cpp index 7fadccda..865eaac 100644 --- a/third_party/WebKit/Source/core/layout/svg/SVGTextQuery.cpp +++ b/third_party/WebKit/Source/core/layout/svg/SVGTextQuery.cpp
@@ -88,7 +88,7 @@ for (InlineBox* child = flowBox->firstChild(); child; child = child->nextOnLine()) { if (child->isInlineFlowBox()) { // Skip generated content. - if (!child->lineLayoutItem().node()) + if (!child->getLineLayoutItem().node()) continue; collectTextBoxesInFlowBox(toInlineFlowBox(child), textBoxes); @@ -105,7 +105,7 @@ static bool queryTextBox(QueryData* queryData, const SVGInlineTextBox* textBox, ProcessTextFragmentCallback fragmentCallback) { queryData->textBox = textBox; - queryData->textLineLayout = LineLayoutSVGInlineText(textBox->lineLayoutItem()); + queryData->textLineLayout = LineLayoutSVGInlineText(textBox->getLineLayoutItem()); queryData->isVerticalText = !queryData->textLineLayout.style()->isHorizontalWritingMode();
diff --git a/third_party/WebKit/Source/core/layout/svg/line/SVGInlineTextBox.cpp b/third_party/WebKit/Source/core/layout/svg/line/SVGInlineTextBox.cpp index 2fcea25..1456c03 100644 --- a/third_party/WebKit/Source/core/layout/svg/line/SVGInlineTextBox.cpp +++ b/third_party/WebKit/Source/core/layout/svg/line/SVGInlineTextBox.cpp
@@ -77,7 +77,7 @@ int SVGInlineTextBox::offsetForPositionInFragment(const SVGTextFragment& fragment, LayoutUnit position, bool includePartialGlyphs) const { - LineLayoutSVGInlineText lineLayoutItem = LineLayoutSVGInlineText(this->lineLayoutItem()); + LineLayoutSVGInlineText lineLayoutItem = LineLayoutSVGInlineText(this->getLineLayoutItem()); float scalingFactor = lineLayoutItem.scalingFactor(); ASSERT(scalingFactor); @@ -107,7 +107,7 @@ { ASSERT(startPosition < endPosition); - LineLayoutSVGInlineText lineLayoutItem = LineLayoutSVGInlineText(this->lineLayoutItem()); + LineLayoutSVGInlineText lineLayoutItem = LineLayoutSVGInlineText(this->getLineLayoutItem()); float scalingFactor = lineLayoutItem.scalingFactor(); ASSERT(scalingFactor); @@ -136,7 +136,7 @@ if (startPosition >= endPosition) return LayoutRect(); - const ComputedStyle& style = lineLayoutItem().styleRef(); + const ComputedStyle& style = getLineLayoutItem().styleRef(); FloatRect selectionRect; int fragmentStartPosition = 0; @@ -168,7 +168,7 @@ TextRun SVGInlineTextBox::constructTextRun(const ComputedStyle& style, const SVGTextFragment& fragment) const { - LineLayoutText text = lineLayoutItem(); + LineLayoutText text = getLineLayoutItem(); // FIXME(crbug.com/264211): This should not be necessary but can occur if we // layout during layout. Remove this when 264211 is fixed. @@ -230,7 +230,7 @@ LayoutRect SVGInlineTextBox::calculateBoundaries() const { - LineLayoutSVGInlineText lineLayoutItem = LineLayoutSVGInlineText(this->lineLayoutItem()); + LineLayoutSVGInlineText lineLayoutItem = LineLayoutSVGInlineText(this->getLineLayoutItem()); float scalingFactor = lineLayoutItem.scalingFactor(); ASSERT(scalingFactor); LayoutUnit baseline(lineLayoutItem.scaledFont().fontMetrics().floatAscent() / scalingFactor); @@ -247,17 +247,17 @@ // FIXME: integrate with InlineTextBox::nodeAtPoint better. ASSERT(!isLineBreak()); - PointerEventsHitRules hitRules(PointerEventsHitRules::SVG_TEXT_HITTESTING, result.hitTestRequest(), lineLayoutItem().style()->pointerEvents()); - bool isVisible = lineLayoutItem().style()->visibility() == VISIBLE; + PointerEventsHitRules hitRules(PointerEventsHitRules::SVG_TEXT_HITTESTING, result.hitTestRequest(), getLineLayoutItem().style()->pointerEvents()); + bool isVisible = getLineLayoutItem().style()->visibility() == VISIBLE; if (isVisible || !hitRules.requireVisible) { if (hitRules.canHitBoundingBox - || (hitRules.canHitStroke && (lineLayoutItem().style()->svgStyle().hasStroke() || !hitRules.requireStroke)) - || (hitRules.canHitFill && (lineLayoutItem().style()->svgStyle().hasFill() || !hitRules.requireFill))) { + || (hitRules.canHitStroke && (getLineLayoutItem().style()->svgStyle().hasStroke() || !hitRules.requireStroke)) + || (hitRules.canHitFill && (getLineLayoutItem().style()->svgStyle().hasFill() || !hitRules.requireFill))) { LayoutPoint boxOrigin(x(), y()); boxOrigin.moveBy(accumulatedOffset); LayoutRect rect(boxOrigin, size()); if (locationInContainer.intersects(rect)) { - LineLayoutSVGInlineText lineLayoutItem = LineLayoutSVGInlineText(this->lineLayoutItem()); + LineLayoutSVGInlineText lineLayoutItem = LineLayoutSVGInlineText(this->getLineLayoutItem()); ASSERT(lineLayoutItem.scalingFactor()); float baseline = lineLayoutItem.scaledFont().fontMetrics().floatAscent() / lineLayoutItem.scalingFactor();
diff --git a/third_party/WebKit/Source/core/layout/svg/line/SVGRootInlineBox.cpp b/third_party/WebKit/Source/core/layout/svg/line/SVGRootInlineBox.cpp index 31d257f..d0c6557 100644 --- a/third_party/WebKit/Source/core/layout/svg/line/SVGRootInlineBox.cpp +++ b/third_party/WebKit/Source/core/layout/svg/line/SVGRootInlineBox.cpp
@@ -76,7 +76,7 @@ for (InlineBox* child = start->firstChild(); child; child = child->nextOnLine()) { LayoutRect boxRect; if (child->isSVGInlineTextBox()) { - ASSERT(child->lineLayoutItem().isSVGInlineText()); + ASSERT(child->getLineLayoutItem().isSVGInlineText()); SVGInlineTextBox* textBox = toSVGInlineTextBox(child); boxRect = textBox->calculateBoundaries(); @@ -86,7 +86,7 @@ textBox->setLogicalHeight(boxRect.height()); } else { // Skip generated content. - if (!child->lineLayoutItem().node()) + if (!child->getLineLayoutItem().node()) continue; SVGInlineFlowBox* flowBox = toSVGInlineFlowBox(child); @@ -115,7 +115,7 @@ // Position all children relative to the parent block. for (InlineBox* child = firstChild(); child; child = child->nextOnLine()) { // Skip generated content. - if (!child->lineLayoutItem().node()) + if (!child->getLineLayoutItem().node()) continue; child->move(LayoutSize(-childRect.x(), -childRect.y())); } @@ -209,8 +209,8 @@ // Reordering is only necessary for BiDi text that is _absolutely_ positioned. if (firstTextBox->len() == 1 && firstTextBox->len() == lastTextBox->len()) { - LineLayoutSVGInlineText firstContext = LineLayoutSVGInlineText(firstTextBox->lineLayoutItem()); - LineLayoutSVGInlineText lastContext = LineLayoutSVGInlineText(lastTextBox->lineLayoutItem()); + LineLayoutSVGInlineText firstContext = LineLayoutSVGInlineText(firstTextBox->getLineLayoutItem()); + LineLayoutSVGInlineText lastContext = LineLayoutSVGInlineText(lastTextBox->getLineLayoutItem()); SVGTextLayoutAttributes* firstAttributes = nullptr; SVGTextLayoutAttributes* lastAttributes = nullptr;
diff --git a/third_party/WebKit/Source/core/loader/DocumentThreadableLoader.cpp b/third_party/WebKit/Source/core/loader/DocumentThreadableLoader.cpp index 0980465..3ccd49c 100644 --- a/third_party/WebKit/Source/core/loader/DocumentThreadableLoader.cpp +++ b/third_party/WebKit/Source/core/loader/DocumentThreadableLoader.cpp
@@ -50,7 +50,6 @@ #include "core/page/ChromeClient.h" #include "core/page/Page.h" #include "platform/SharedBuffer.h" -#include "platform/Task.h" #include "platform/network/ResourceRequest.h" #include "platform/weborigin/SchemeRegistry.h" #include "platform/weborigin/SecurityOrigin.h" @@ -68,7 +67,7 @@ public: explicit EmptyDataReader(WebDataConsumerHandle::Client* client) : m_factory(this) { - Platform::current()->currentThread()->taskRunner()->postTask(BLINK_FROM_HERE, new Task(bind(&EmptyDataReader::notify, m_factory.createWeakPtr(), client))); + Platform::current()->currentThread()->taskRunner()->postTask(BLINK_FROM_HERE, bind(&EmptyDataReader::notify, m_factory.createWeakPtr(), client)); } private: Result beginRead(const void** buffer, WebDataConsumerHandle::Flags, size_t *available) override
diff --git a/third_party/WebKit/Source/core/page/TouchAdjustment.cpp b/third_party/WebKit/Source/core/page/TouchAdjustment.cpp index 0b5ab30..7c87156 100644 --- a/third_party/WebKit/Source/core/page/TouchAdjustment.cpp +++ b/third_party/WebKit/Source/core/page/TouchAdjustment.cpp
@@ -130,7 +130,7 @@ return true; // Only the selected part of the layoutObject is a valid target, but this will be corrected in // appendContextSubtargetsForNode. - if (node->layoutObject()->selectionState() != SelectionNone) + if (node->layoutObject()->getSelectionState() != SelectionNone) return true; } return false; @@ -184,11 +184,11 @@ lastOffset = offset; } } else { - if (textLayoutObject->selectionState() == SelectionNone) + if (textLayoutObject->getSelectionState() == SelectionNone) return appendBasicSubtargetsForNode(node, subtargets); // If selected, make subtargets out of only the selected part of the text. int startPos, endPos; - switch (textLayoutObject->selectionState()) { + switch (textLayoutObject->getSelectionState()) { case SelectionInside: startPos = 0; endPos = textLayoutObject->textLength();
diff --git a/third_party/WebKit/Source/core/paint/BlockPainter.cpp b/third_party/WebKit/Source/core/paint/BlockPainter.cpp index 624d9f10f..08e2e24 100644 --- a/third_party/WebKit/Source/core/paint/BlockPainter.cpp +++ b/third_party/WebKit/Source/core/paint/BlockPainter.cpp
@@ -120,10 +120,10 @@ ASSERT(paintInfo.phase != PaintPhaseTextClip); LayoutPoint childPoint = paintOffset; - if (inlineBox.parent()->lineLayoutItem().style()->isFlippedBlocksWritingMode()) // Faster than calling containingBlock(). - childPoint = LineLayoutAPIShim::layoutObjectFrom(inlineBox.lineLayoutItem())->containingBlock()->flipForWritingModeForChild(toLayoutBox(LineLayoutAPIShim::layoutObjectFrom(inlineBox.lineLayoutItem())), childPoint); + if (inlineBox.parent()->getLineLayoutItem().style()->isFlippedBlocksWritingMode()) // Faster than calling containingBlock(). + childPoint = LineLayoutAPIShim::layoutObjectFrom(inlineBox.getLineLayoutItem())->containingBlock()->flipForWritingModeForChild(toLayoutBox(LineLayoutAPIShim::layoutObjectFrom(inlineBox.getLineLayoutItem())), childPoint); - ObjectPainter(*LineLayoutAPIShim::constLayoutObjectFrom(inlineBox.lineLayoutItem())).paintAsPseudoStackingContext(paintInfo, childPoint); + ObjectPainter(*LineLayoutAPIShim::constLayoutObjectFrom(inlineBox.getLineLayoutItem())).paintAsPseudoStackingContext(paintInfo, childPoint); } void BlockPainter::paintObject(const PaintInfo& paintInfo, const LayoutPoint& paintOffset) @@ -136,7 +136,7 @@ // Set previousPaintOffset here in case that m_layoutBlock paints nothing and no // LayoutObjectDrawingRecorder updates its previousPaintOffset. // TODO(wangxianzhu): Integrate paint offset checking into new paint invalidation. - m_layoutBlock.mutableForPainting().setPreviousPaintOffset(paintOffset); + m_layoutBlock.getMutableForPainting().setPreviousPaintOffset(paintOffset); } const PaintPhase paintPhase = paintInfo.phase;
diff --git a/third_party/WebKit/Source/core/paint/EllipsisBoxPainter.cpp b/third_party/WebKit/Source/core/paint/EllipsisBoxPainter.cpp index 71b3e53a..1e44f600 100644 --- a/third_party/WebKit/Source/core/paint/EllipsisBoxPainter.cpp +++ b/third_party/WebKit/Source/core/paint/EllipsisBoxPainter.cpp
@@ -18,13 +18,13 @@ void EllipsisBoxPainter::paint(const PaintInfo& paintInfo, const LayoutPoint& paintOffset, LayoutUnit lineTop, LayoutUnit lineBottom) { - const ComputedStyle& style = m_ellipsisBox.lineLayoutItem().styleRef(m_ellipsisBox.isFirstLineStyle()); + const ComputedStyle& style = m_ellipsisBox.getLineLayoutItem().styleRef(m_ellipsisBox.isFirstLineStyle()); paintEllipsis(paintInfo, paintOffset, lineTop, lineBottom, style); } void EllipsisBoxPainter::paintEllipsis(const PaintInfo& paintInfo, const LayoutPoint& paintOffset, LayoutUnit lineTop, LayoutUnit lineBottom, const ComputedStyle& style) { - bool haveSelection = !paintInfo.isPrinting() && paintInfo.phase != PaintPhaseTextClip && m_ellipsisBox.selectionState() != SelectionNone; + bool haveSelection = !paintInfo.isPrinting() && paintInfo.phase != PaintPhaseTextClip && m_ellipsisBox.getSelectionState() != SelectionNone; LayoutRect paintRect(m_ellipsisBox.logicalFrameRect()); if (haveSelection) @@ -54,9 +54,9 @@ else if (paintInfo.phase == PaintPhaseSelection) return; - TextPainter::Style textStyle = TextPainter::textPaintingStyle(m_ellipsisBox.lineLayoutItem(), style, paintInfo); + TextPainter::Style textStyle = TextPainter::textPaintingStyle(m_ellipsisBox.getLineLayoutItem(), style, paintInfo); if (haveSelection) - textStyle = TextPainter::selectionPaintingStyle(m_ellipsisBox.lineLayoutItem(), true, paintInfo, textStyle); + textStyle = TextPainter::selectionPaintingStyle(m_ellipsisBox.getLineLayoutItem(), true, paintInfo, textStyle); TextRun textRun = constructTextRun(font, m_ellipsisBox.ellipsisStr(), style, TextRun::AllowTrailingExpansion); LayoutPoint textOrigin(boxOrigin.x(), boxOrigin.y() + font.fontMetrics().ascent()); @@ -66,8 +66,8 @@ void EllipsisBoxPainter::paintSelection(GraphicsContext& context, const LayoutPoint& boxOrigin, const ComputedStyle& style, const Font& font) { - Color textColor = m_ellipsisBox.lineLayoutItem().resolveColor(style, CSSPropertyColor); - Color c = m_ellipsisBox.lineLayoutItem().selectionBackgroundColor(); + Color textColor = m_ellipsisBox.getLineLayoutItem().resolveColor(style, CSSPropertyColor); + Color c = m_ellipsisBox.getLineLayoutItem().selectionBackgroundColor(); if (!c.alpha()) return; @@ -80,7 +80,7 @@ LayoutUnit selectionBottom = m_ellipsisBox.root().selectionBottom(); LayoutUnit top = m_ellipsisBox.root().selectionTop(); LayoutUnit h = m_ellipsisBox.root().selectionHeight(); - const int deltaY = roundToInt(m_ellipsisBox.lineLayoutItem().styleRef().isFlippedLinesWritingMode() ? selectionBottom - m_ellipsisBox.logicalBottom() : m_ellipsisBox.logicalTop() - top); + const int deltaY = roundToInt(m_ellipsisBox.getLineLayoutItem().styleRef().isFlippedLinesWritingMode() ? selectionBottom - m_ellipsisBox.logicalBottom() : m_ellipsisBox.logicalTop() - top); const FloatPoint localOrigin(LayoutPoint(boxOrigin.x(), boxOrigin.y() - deltaY)); FloatRect clipRect(localOrigin, FloatSize(LayoutSize(m_ellipsisBox.logicalWidth(), h))); context.clip(clipRect);
diff --git a/third_party/WebKit/Source/core/paint/InlineFlowBoxPainter.cpp b/third_party/WebKit/Source/core/paint/InlineFlowBoxPainter.cpp index cb498b8..0554155f 100644 --- a/third_party/WebKit/Source/core/paint/InlineFlowBoxPainter.cpp +++ b/third_party/WebKit/Source/core/paint/InlineFlowBoxPainter.cpp
@@ -46,7 +46,7 @@ // Paint our children. PaintInfo childInfo(paintInfo); for (InlineBox* curr = m_inlineFlowBox.firstChild(); curr; curr = curr->nextOnLine()) { - if (curr->lineLayoutItem().isText() || !curr->boxModelObject().hasSelfPaintingLayer()) + if (curr->getLineLayoutItem().isText() || !curr->boxModelObject().hasSelfPaintingLayer()) curr->paint(childInfo, paintOffset, lineTop, lineBottom); } } @@ -65,9 +65,9 @@ LayoutBoxModelObject* boxModel = toLayoutBoxModelObject(LineLayoutAPIShim::layoutObjectFrom(m_inlineFlowBox.boxModelObject())); StyleImage* img = fillLayer.image(); bool hasFillImage = img && img->canRender(); - if ((!hasFillImage && !m_inlineFlowBox.lineLayoutItem().style()->hasBorderRadius()) || (!m_inlineFlowBox.prevLineBox() && !m_inlineFlowBox.nextLineBox()) || !m_inlineFlowBox.parent()) { + if ((!hasFillImage && !m_inlineFlowBox.getLineLayoutItem().style()->hasBorderRadius()) || (!m_inlineFlowBox.prevLineBox() && !m_inlineFlowBox.nextLineBox()) || !m_inlineFlowBox.parent()) { BoxPainter::paintFillLayer(*boxModel, paintInfo, c, fillLayer, rect, BackgroundBleedNone, &m_inlineFlowBox, rect.size(), op); - } else if (m_inlineFlowBox.lineLayoutItem().style()->boxDecorationBreak() == DCLONE) { + } else if (m_inlineFlowBox.getLineLayoutItem().style()->boxDecorationBreak() == DCLONE) { GraphicsContextStateSaver stateSaver(paintInfo.context); paintInfo.context.clip(pixelSnappedIntRect(rect)); BoxPainter::paintFillLayer(*boxModel, paintInfo, c, fillLayer, rect, BackgroundBleedNone, &m_inlineFlowBox, rect.size(), op); @@ -75,7 +75,7 @@ // We have a fill image that spans multiple lines. // FIXME: frameSize ought to be the same as rect.size(). LayoutSize frameSize(m_inlineFlowBox.width(), m_inlineFlowBox.height()); - LayoutRect imageStripPaintRect = paintRectForImageStrip(rect.location(), frameSize, m_inlineFlowBox.lineLayoutItem().style()->direction()); + LayoutRect imageStripPaintRect = paintRectForImageStrip(rect.location(), frameSize, m_inlineFlowBox.getLineLayoutItem().style()->direction()); GraphicsContextStateSaver stateSaver(paintInfo.context); // TODO(chrishtr): this should likely be pixel-snapped. paintInfo.context.clip(pixelSnappedIntRect(rect)); @@ -97,7 +97,7 @@ static LayoutRect clipRectForNinePieceImageStrip(const InlineFlowBox& box, const NinePieceImage& image, const LayoutRect& paintRect) { LayoutRect clipRect(paintRect); - const ComputedStyle& style = box.lineLayoutItem().styleRef(); + const ComputedStyle& style = box.getLineLayoutItem().styleRef(); LayoutRectOutsets outsets = style.imageOutsets(image); if (box.isHorizontal()) { clipRect.setY(paintRect.y() - outsets.top()); @@ -155,8 +155,8 @@ InlineFlowBoxPainter::BorderPaintingType InlineFlowBoxPainter::getBorderPaintType(const LayoutRect& adjustedFrameRect, IntRect& adjustedClipRect) const { adjustedClipRect = pixelSnappedIntRect(adjustedFrameRect); - if (m_inlineFlowBox.parent() && m_inlineFlowBox.lineLayoutItem().style()->hasBorderDecoration()) { - const NinePieceImage& borderImage = m_inlineFlowBox.lineLayoutItem().style()->borderImage(); + if (m_inlineFlowBox.parent() && m_inlineFlowBox.getLineLayoutItem().style()->hasBorderDecoration()) { + const NinePieceImage& borderImage = m_inlineFlowBox.getLineLayoutItem().style()->borderImage(); StyleImage* borderImageSource = borderImage.image(); bool hasBorderImage = borderImageSource && borderImageSource->canRender(); if (hasBorderImage && !borderImageSource->isLoaded()) @@ -177,18 +177,18 @@ void InlineFlowBoxPainter::paintBoxDecorationBackground(const PaintInfo& paintInfo, const LayoutPoint& paintOffset, const LayoutRect& cullRect) { ASSERT(paintInfo.phase == PaintPhaseForeground); - if (m_inlineFlowBox.lineLayoutItem().style()->visibility() != VISIBLE) + if (m_inlineFlowBox.getLineLayoutItem().style()->visibility() != VISIBLE) return; // You can use p::first-line to specify a background. If so, the root line boxes for // a line may actually have to paint a background. - LayoutObject* inlineFlowBoxLayoutObject = LineLayoutAPIShim::layoutObjectFrom(m_inlineFlowBox.lineLayoutItem()); - const ComputedStyle* styleToUse = m_inlineFlowBox.lineLayoutItem().style(m_inlineFlowBox.isFirstLineStyle()); + LayoutObject* inlineFlowBoxLayoutObject = LineLayoutAPIShim::layoutObjectFrom(m_inlineFlowBox.getLineLayoutItem()); + const ComputedStyle* styleToUse = m_inlineFlowBox.getLineLayoutItem().style(m_inlineFlowBox.isFirstLineStyle()); bool shouldPaintBoxDecorationBackground; if (m_inlineFlowBox.parent()) shouldPaintBoxDecorationBackground = inlineFlowBoxLayoutObject->hasBoxDecorationBackground(); else - shouldPaintBoxDecorationBackground = m_inlineFlowBox.isFirstLineStyle() && styleToUse != m_inlineFlowBox.lineLayoutItem().style(); + shouldPaintBoxDecorationBackground = m_inlineFlowBox.isFirstLineStyle() && styleToUse != m_inlineFlowBox.getLineLayoutItem().style(); if (!shouldPaintBoxDecorationBackground) return; @@ -222,7 +222,7 @@ case DontPaintBorders: break; case PaintBordersWithoutClip: - BoxPainter::paintBorder(*toLayoutBoxModelObject(LineLayoutAPIShim::layoutObjectFrom(m_inlineFlowBox.boxModelObject())), paintInfo, adjustedFrameRect, m_inlineFlowBox.lineLayoutItem().styleRef(m_inlineFlowBox.isFirstLineStyle()), BackgroundBleedNone, m_inlineFlowBox.includeLogicalLeftEdge(), m_inlineFlowBox.includeLogicalRightEdge()); + BoxPainter::paintBorder(*toLayoutBoxModelObject(LineLayoutAPIShim::layoutObjectFrom(m_inlineFlowBox.boxModelObject())), paintInfo, adjustedFrameRect, m_inlineFlowBox.getLineLayoutItem().styleRef(m_inlineFlowBox.isFirstLineStyle()), BackgroundBleedNone, m_inlineFlowBox.includeLogicalLeftEdge(), m_inlineFlowBox.includeLogicalRightEdge()); break; case PaintBordersWithClip: // FIXME: What the heck do we do with RTL here? The math we're using is obviously not right, @@ -230,14 +230,14 @@ LayoutRect imageStripPaintRect = paintRectForImageStrip(adjustedPaintOffset, frameRect.size(), LTR); GraphicsContextStateSaver stateSaver(paintInfo.context); paintInfo.context.clip(adjustedClipRect); - BoxPainter::paintBorder(*toLayoutBoxModelObject(LineLayoutAPIShim::layoutObjectFrom(m_inlineFlowBox.boxModelObject())), paintInfo, imageStripPaintRect, m_inlineFlowBox.lineLayoutItem().styleRef(m_inlineFlowBox.isFirstLineStyle())); + BoxPainter::paintBorder(*toLayoutBoxModelObject(LineLayoutAPIShim::layoutObjectFrom(m_inlineFlowBox.boxModelObject())), paintInfo, imageStripPaintRect, m_inlineFlowBox.getLineLayoutItem().styleRef(m_inlineFlowBox.isFirstLineStyle())); break; } } void InlineFlowBoxPainter::paintMask(const PaintInfo& paintInfo, const LayoutPoint& paintOffset) { - if (m_inlineFlowBox.lineLayoutItem().style()->visibility() != VISIBLE || paintInfo.phase != PaintPhaseMask) + if (m_inlineFlowBox.getLineLayoutItem().style()->visibility() != VISIBLE || paintInfo.phase != PaintPhaseMask) return; LayoutRect frameRect = frameRectClampedToLineTopAndBottomIfNeeded(); @@ -247,16 +247,16 @@ m_inlineFlowBox.flipForWritingMode(localRect); LayoutPoint adjustedPaintOffset = paintOffset + localRect.location(); - const NinePieceImage& maskNinePieceImage = m_inlineFlowBox.lineLayoutItem().style()->maskBoxImage(); - StyleImage* maskBoxImage = m_inlineFlowBox.lineLayoutItem().style()->maskBoxImage().image(); + const NinePieceImage& maskNinePieceImage = m_inlineFlowBox.getLineLayoutItem().style()->maskBoxImage(); + StyleImage* maskBoxImage = m_inlineFlowBox.getLineLayoutItem().style()->maskBoxImage().image(); // Figure out if we need to push a transparency layer to render our mask. bool pushTransparencyLayer = false; - bool compositedMask = m_inlineFlowBox.lineLayoutItem().hasLayer() && m_inlineFlowBox.boxModelObject().layer()->hasCompositedMask(); + bool compositedMask = m_inlineFlowBox.getLineLayoutItem().hasLayer() && m_inlineFlowBox.boxModelObject().layer()->hasCompositedMask(); bool flattenCompositingLayers = paintInfo.globalPaintFlags() & GlobalPaintFlattenCompositingLayers; SkXfermode::Mode compositeOp = SkXfermode::kSrcOver_Mode; if (!compositedMask || flattenCompositingLayers) { - if ((maskBoxImage && m_inlineFlowBox.lineLayoutItem().style()->maskLayers().hasImage()) || m_inlineFlowBox.lineLayoutItem().style()->maskLayers().next()) { + if ((maskBoxImage && m_inlineFlowBox.getLineLayoutItem().style()->maskLayers().hasImage()) || m_inlineFlowBox.getLineLayoutItem().style()->maskLayers().next()) { pushTransparencyLayer = true; paintInfo.context.beginLayer(1.0f, SkXfermode::kDstIn_Mode); } else { @@ -270,7 +270,7 @@ } LayoutRect paintRect = LayoutRect(adjustedPaintOffset, frameRect.size()); - paintFillLayers(paintInfo, Color::transparent, m_inlineFlowBox.lineLayoutItem().style()->maskLayers(), paintRect, compositeOp); + paintFillLayers(paintInfo, Color::transparent, m_inlineFlowBox.getLineLayoutItem().style()->maskLayers(), paintRect, compositeOp); bool hasBoxImage = maskBoxImage && maskBoxImage->canRender(); if (!hasBoxImage || !maskBoxImage->isLoaded()) { @@ -283,7 +283,7 @@ // The simple case is where we are the only box for this object. In those // cases only a single call to draw is required. if (!m_inlineFlowBox.prevLineBox() && !m_inlineFlowBox.nextLineBox()) { - BoxPainter::paintNinePieceImage(*boxModel, paintInfo.context, paintRect, m_inlineFlowBox.lineLayoutItem().styleRef(), maskNinePieceImage, compositeOp); + BoxPainter::paintNinePieceImage(*boxModel, paintInfo.context, paintRect, m_inlineFlowBox.getLineLayoutItem().styleRef(), maskNinePieceImage, compositeOp); } else { // We have a mask image that spans multiple lines. // FIXME: What the heck do we do with RTL here? The math we're using is obviously not right, @@ -293,7 +293,7 @@ GraphicsContextStateSaver stateSaver(paintInfo.context); // TODO(chrishtr): this should be pixel-snapped. paintInfo.context.clip(clipRect); - BoxPainter::paintNinePieceImage(*boxModel, paintInfo.context, imageStripPaintRect, m_inlineFlowBox.lineLayoutItem().styleRef(), maskNinePieceImage, compositeOp); + BoxPainter::paintNinePieceImage(*boxModel, paintInfo.context, imageStripPaintRect, m_inlineFlowBox.getLineLayoutItem().styleRef(), maskNinePieceImage, compositeOp); } if (pushTransparencyLayer) @@ -305,7 +305,7 @@ { LayoutRect rect(m_inlineFlowBox.frameRect()); - bool noQuirksMode = m_inlineFlowBox.lineLayoutItem().document().inNoQuirksMode(); + bool noQuirksMode = m_inlineFlowBox.getLineLayoutItem().document().inNoQuirksMode(); if (!noQuirksMode && !m_inlineFlowBox.hasTextChildren() && !(m_inlineFlowBox.descendantsHaveSameLineHeightAndBaseline() && m_inlineFlowBox.hasTextDescendants())) { const RootInlineBox& rootBox = m_inlineFlowBox.root(); LayoutUnit logicalTop = m_inlineFlowBox.isHorizontal() ? rect.y() : rect.x();
diff --git a/third_party/WebKit/Source/core/paint/InlinePainter.cpp b/third_party/WebKit/Source/core/paint/InlinePainter.cpp index c3e9cfa..acbdb21 100644 --- a/third_party/WebKit/Source/core/paint/InlinePainter.cpp +++ b/third_party/WebKit/Source/core/paint/InlinePainter.cpp
@@ -28,7 +28,7 @@ // Set previousPaintOffset here in case that m_layoutInline paints nothing and no // LayoutObjectDrawingRecorder updates its previousPaintOffset. // TODO(wangxianzhu): Integrate paint offset checking into new paint invalidation. - m_layoutInline.mutableForPainting().setPreviousPaintOffset(paintOffset); + m_layoutInline.getMutableForPainting().setPreviousPaintOffset(paintOffset); } if (paintInfo.phase == PaintPhaseForeground && paintInfo.isPrinting())
diff --git a/third_party/WebKit/Source/core/paint/InlineTextBoxPainter.cpp b/third_party/WebKit/Source/core/paint/InlineTextBoxPainter.cpp index f1c52bb0..9636bd1 100644 --- a/third_party/WebKit/Source/core/paint/InlineTextBoxPainter.cpp +++ b/third_party/WebKit/Source/core/paint/InlineTextBoxPainter.cpp
@@ -78,7 +78,7 @@ bool isPrinting = paintInfo.isPrinting(); // Determine whether or not we're selected. - bool haveSelection = !isPrinting && paintInfo.phase != PaintPhaseTextClip && m_inlineTextBox.selectionState() != SelectionNone; + bool haveSelection = !isPrinting && paintInfo.phase != PaintPhaseTextClip && m_inlineTextBox.getSelectionState() != SelectionNone; if (!haveSelection && paintInfo.phase == PaintPhaseSelection) { // When only painting the selection, don't bother to paint if there is none. return; @@ -92,14 +92,14 @@ return; LayoutRect paintRect(logicalVisualOverflow); m_inlineTextBox.logicalRectToPhysicalRect(paintRect); - if (paintInfo.phase != PaintPhaseSelection && (haveSelection || paintsMarkerHighlights(*LineLayoutAPIShim::layoutObjectFrom(m_inlineTextBox.lineLayoutItem())))) + if (paintInfo.phase != PaintPhaseSelection && (haveSelection || paintsMarkerHighlights(*LineLayoutAPIShim::layoutObjectFrom(m_inlineTextBox.getLineLayoutItem())))) paintRect.unite(m_inlineTextBox.localSelectionRect(m_inlineTextBox.start(), m_inlineTextBox.start() + m_inlineTextBox.len())); paintRect.moveBy(adjustedPaintOffset); drawingRecorder.emplace(paintInfo.context, m_inlineTextBox, DisplayItem::paintPhaseToDrawingType(paintInfo.phase), FloatRect(paintRect)); } if (m_inlineTextBox.truncation() != cNoTruncation) { - if (m_inlineTextBox.lineLayoutItem().containingBlock().style()->isLeftToRightDirection() != m_inlineTextBox.isLeftToRightDirection()) { + if (m_inlineTextBox.getLineLayoutItem().containingBlock().style()->isLeftToRightDirection() != m_inlineTextBox.isLeftToRightDirection()) { // Make the visible fragment of text hug the edge closest to the rest of the run by moving the origin // at which we start drawing text. // e.g. In the case of LTR text truncated in an RTL Context, the correct behavior is: @@ -108,7 +108,7 @@ // farther to the right. // NOTE: WebKit's behavior differs from that of IE which appears to just overlay the ellipsis on top of the // truncated string i.e. |Hello|CBA| -> |...lo|CBA| - LayoutUnit widthOfVisibleText = LayoutUnit(m_inlineTextBox.lineLayoutItem().width( + LayoutUnit widthOfVisibleText = LayoutUnit(m_inlineTextBox.getLineLayoutItem().width( m_inlineTextBox.start(), m_inlineTextBox.truncation(), m_inlineTextBox.textPos(), m_inlineTextBox.isLeftToRightDirection() ? LTR : RTL, m_inlineTextBox.isFirstLineStyle())); LayoutUnit widthOfHiddenText = m_inlineTextBox.logicalWidth() - widthOfVisibleText; @@ -119,7 +119,7 @@ } GraphicsContext& context = paintInfo.context; - const ComputedStyle& styleToUse = m_inlineTextBox.lineLayoutItem().styleRef(m_inlineTextBox.isFirstLineStyle()); + const ComputedStyle& styleToUse = m_inlineTextBox.getLineLayoutItem().styleRef(m_inlineTextBox.isFirstLineStyle()); LayoutPoint boxOrigin(m_inlineTextBox.locationIncludingFlipping()); boxOrigin.move(adjustedPaintOffset.x(), adjustedPaintOffset.y()); @@ -128,8 +128,8 @@ bool shouldRotate = false; LayoutTextCombine* combinedText = nullptr; if (!m_inlineTextBox.isHorizontal()) { - if (styleToUse.hasTextCombine() && m_inlineTextBox.lineLayoutItem().isCombineText()) { - combinedText = &toLayoutTextCombine(*LineLayoutAPIShim::layoutObjectFrom(m_inlineTextBox.lineLayoutItem())); + if (styleToUse.hasTextCombine() && m_inlineTextBox.getLineLayoutItem().isCombineText()) { + combinedText = &toLayoutTextCombine(*LineLayoutAPIShim::layoutObjectFrom(m_inlineTextBox.getLineLayoutItem())); if (!combinedText->isCombined()) combinedText = nullptr; } @@ -143,8 +143,8 @@ } // Determine text colors. - TextPainter::Style textStyle = TextPainter::textPaintingStyle(m_inlineTextBox.lineLayoutItem(), styleToUse, paintInfo); - TextPainter::Style selectionStyle = TextPainter::selectionPaintingStyle(m_inlineTextBox.lineLayoutItem(), haveSelection, paintInfo, textStyle); + TextPainter::Style textStyle = TextPainter::textPaintingStyle(m_inlineTextBox.getLineLayoutItem(), styleToUse, paintInfo); + TextPainter::Style selectionStyle = TextPainter::selectionPaintingStyle(m_inlineTextBox.getLineLayoutItem(), haveSelection, paintInfo, textStyle); bool paintSelectedTextOnly = (paintInfo.phase == PaintPhaseSelection); bool paintSelectedTextSeparately = !paintSelectedTextOnly && textStyle != selectionStyle; @@ -158,7 +158,7 @@ if (paintInfo.phase != PaintPhaseSelection && paintInfo.phase != PaintPhaseTextClip && !isPrinting) { paintDocumentMarkers(paintInfo, boxOrigin, styleToUse, font, DocumentMarkerPaintPhase::Background); - const LayoutObject& textBoxLayoutObject = *LineLayoutAPIShim::layoutObjectFrom(m_inlineTextBox.lineLayoutItem()); + const LayoutObject& textBoxLayoutObject = *LineLayoutAPIShim::layoutObjectFrom(m_inlineTextBox.getLineLayoutItem()); if (haveSelection && !paintsCompositionMarkers(textBoxLayoutObject)) { if (combinedText) paintSelection<InlineTextBoxPainter::PaintOptions::CombinedText>(context, boxRect, styleToUse, font, selectionStyle.fillColor, combinedText); @@ -169,11 +169,11 @@ // 2. Now paint the foreground, including text and decorations like underline/overline (in quirks mode only). int length = m_inlineTextBox.len(); - StringView string = m_inlineTextBox.lineLayoutItem().text().createView(); + StringView string = m_inlineTextBox.getLineLayoutItem().text().createView(); ASSERT(m_inlineTextBox.start() + length <= string.length()); if (static_cast<unsigned>(length) != string.length() || m_inlineTextBox.start()) string.narrow(m_inlineTextBox.start(), length); - int maximumLength = m_inlineTextBox.lineLayoutItem().textLength() - m_inlineTextBox.start(); + int maximumLength = m_inlineTextBox.getLineLayoutItem().textLength() - m_inlineTextBox.start(); StringBuilder charactersWithHyphen; TextRun textRun = m_inlineTextBox.constructTextRun(styleToUse, font, string, maximumLength, m_inlineTextBox.hasHyphen() ? &charactersWithHyphen : 0); @@ -260,7 +260,7 @@ // This code path is only called in PaintPhaseForeground whereas we would // expect PaintPhaseSelection. The existing haveSelection logic in paint() // tests for != PaintPhaseTextClip. - if (m_inlineTextBox.lineLayoutItem().style()->visibility() != VISIBLE + if (m_inlineTextBox.getLineLayoutItem().style()->visibility() != VISIBLE || m_inlineTextBox.truncation() == cFullTruncation || !m_inlineTextBox.len()) return false; @@ -290,7 +290,7 @@ if (sPos >= ePos) return; - int deltaY = m_inlineTextBox.lineLayoutItem().style()->isFlippedLinesWritingMode() ? m_inlineTextBox.root().selectionBottom() - m_inlineTextBox.logicalBottom() : m_inlineTextBox.logicalTop() - m_inlineTextBox.root().selectionTop(); + int deltaY = m_inlineTextBox.getLineLayoutItem().style()->isFlippedLinesWritingMode() ? m_inlineTextBox.root().selectionBottom() - m_inlineTextBox.logicalBottom() : m_inlineTextBox.logicalTop() - m_inlineTextBox.root().selectionTop(); int selHeight = m_inlineTextBox.root().selectionHeight(); FloatPoint localOrigin(boxOrigin.x().toFloat(), boxOrigin.y().toFloat() - deltaY); context.drawHighlightForText(font, m_inlineTextBox.constructTextRun(style, font), localOrigin, selHeight, backgroundColor, sPos, ePos); @@ -298,10 +298,10 @@ void InlineTextBoxPainter::paintDocumentMarkers(const PaintInfo& paintInfo, const LayoutPoint& boxOrigin, const ComputedStyle& style, const Font& font, DocumentMarkerPaintPhase markerPaintPhase) { - if (!m_inlineTextBox.lineLayoutItem().node()) + if (!m_inlineTextBox.getLineLayoutItem().node()) return; - DocumentMarkerVector markers = m_inlineTextBox.lineLayoutItem().document().markers().markersFor(m_inlineTextBox.lineLayoutItem().node()); + DocumentMarkerVector markers = m_inlineTextBox.getLineLayoutItem().document().markers().markersFor(m_inlineTextBox.getLineLayoutItem().node()); DocumentMarkerVector::const_iterator markerIt = markers.begin(); // Give any document markers that touch this run a chance to draw before the text has been drawn. @@ -378,7 +378,7 @@ void InlineTextBoxPainter::paintDocumentMarker(GraphicsContext& context, const LayoutPoint& boxOrigin, DocumentMarker* marker, const ComputedStyle& style, const Font& font, bool grammar) { // Never print spelling/grammar markers (5327887) - if (m_inlineTextBox.lineLayoutItem().document().printing()) + if (m_inlineTextBox.getLineLayoutItem().document().printing()) return; if (m_inlineTextBox.truncation() == cFullTruncation) @@ -404,7 +404,7 @@ endPosition = std::min<int>(endPosition, m_inlineTextBox.truncation()); // Calculate start & width - int deltaY = m_inlineTextBox.lineLayoutItem().style()->isFlippedLinesWritingMode() ? m_inlineTextBox.root().selectionBottom() - m_inlineTextBox.logicalBottom() : m_inlineTextBox.logicalTop() - m_inlineTextBox.root().selectionTop(); + int deltaY = m_inlineTextBox.getLineLayoutItem().style()->isFlippedLinesWritingMode() ? m_inlineTextBox.root().selectionBottom() - m_inlineTextBox.logicalBottom() : m_inlineTextBox.logicalTop() - m_inlineTextBox.root().selectionTop(); int selHeight = m_inlineTextBox.root().selectionHeight(); LayoutPoint startPoint(boxOrigin.x(), boxOrigin.y() - deltaY); TextRun run = m_inlineTextBox.constructTextRun(style, font); @@ -422,7 +422,7 @@ // So, we generally place the underline at the bottom of the text, but in larger fonts that's not so good so // we pin to two pixels under the baseline. int lineThickness = misspellingLineThickness; - int baseline = m_inlineTextBox.lineLayoutItem().style(m_inlineTextBox.isFirstLineStyle())->fontMetrics().ascent(); + int baseline = m_inlineTextBox.getLineLayoutItem().style(m_inlineTextBox.isFirstLineStyle())->fontMetrics().ascent(); int descent = m_inlineTextBox.logicalHeight() - baseline; int underlineOffset; if (descent <= (lineThickness + 2)) { @@ -444,7 +444,7 @@ if (sPos >= ePos) return; - Color c = m_inlineTextBox.lineLayoutItem().selectionBackgroundColor(); + Color c = m_inlineTextBox.getLineLayoutItem().selectionBackgroundColor(); if (!c.alpha()) return; @@ -456,14 +456,14 @@ // If the text is truncated, let the thing being painted in the truncation // draw its own highlight. int length = m_inlineTextBox.truncation() != cNoTruncation ? m_inlineTextBox.truncation() : m_inlineTextBox.len(); - StringView string = m_inlineTextBox.lineLayoutItem().text().createView(); + StringView string = m_inlineTextBox.getLineLayoutItem().text().createView(); if (string.length() != static_cast<unsigned>(length) || m_inlineTextBox.start()) string.narrow(m_inlineTextBox.start(), length); StringBuilder charactersWithHyphen; bool respectHyphen = ePos == length && m_inlineTextBox.hasHyphen(); - TextRun textRun = m_inlineTextBox.constructTextRun(style, font, string, m_inlineTextBox.lineLayoutItem().textLength() - m_inlineTextBox.start(), respectHyphen ? &charactersWithHyphen : 0); + TextRun textRun = m_inlineTextBox.constructTextRun(style, font, string, m_inlineTextBox.getLineLayoutItem().textLength() - m_inlineTextBox.start(), respectHyphen ? &charactersWithHyphen : 0); if (respectHyphen) ePos = textRun.length(); @@ -483,7 +483,7 @@ LayoutUnit selectionBottom = m_inlineTextBox.root().selectionBottom(); LayoutUnit selectionTop = m_inlineTextBox.root().selectionTop(); - int deltaY = roundToInt(m_inlineTextBox.lineLayoutItem().style()->isFlippedLinesWritingMode() ? selectionBottom - m_inlineTextBox.logicalBottom() : m_inlineTextBox.logicalTop() - selectionTop); + int deltaY = roundToInt(m_inlineTextBox.getLineLayoutItem().style()->isFlippedLinesWritingMode() ? selectionBottom - m_inlineTextBox.logicalBottom() : m_inlineTextBox.logicalTop() - selectionTop); int selHeight = std::max(0, roundToInt(selectionBottom - selectionTop)); FloatPoint localOrigin(boxRect.x().toFloat(), (boxRect.y() - deltaY).toFloat()); @@ -629,7 +629,7 @@ */ static void strokeWavyTextDecoration(GraphicsContext& context, FloatPoint p1, FloatPoint p2, float strokeThickness) { - context.adjustLineToPixelBoundaries(p1, p2, strokeThickness, context.strokeStyle()); + context.adjustLineToPixelBoundaries(p1, p2, strokeThickness, context.getStrokeStyle()); Path path; path.moveTo(p1); @@ -738,7 +738,7 @@ LayoutUnit width = m_inlineTextBox.logicalWidth(); if (m_inlineTextBox.truncation() != cNoTruncation) { - width = LayoutUnit(m_inlineTextBox.lineLayoutItem().width( + width = LayoutUnit(m_inlineTextBox.getLineLayoutItem().width( m_inlineTextBox.start(), m_inlineTextBox.truncation(), m_inlineTextBox.textPos(), m_inlineTextBox.isLeftToRightDirection() ? LTR : RTL, m_inlineTextBox.isFirstLineStyle())); if (!m_inlineTextBox.isLeftToRightDirection()) @@ -747,7 +747,7 @@ // Get the text decoration colors. LayoutObject::AppliedTextDecoration underline, overline, linethrough; - LayoutObject& textBoxLayoutObject = *LineLayoutAPIShim::layoutObjectFrom(m_inlineTextBox.lineLayoutItem()); + LayoutObject& textBoxLayoutObject = *LineLayoutAPIShim::layoutObjectFrom(m_inlineTextBox.getLineLayoutItem()); textBoxLayoutObject.getTextDecorations(deco, underline, overline, linethrough, true); if (m_inlineTextBox.isFirstLineStyle()) textBoxLayoutObject.getTextDecorations(deco, underline, overline, linethrough, true, true); @@ -800,10 +800,10 @@ // start of line to draw float start = paintStart == static_cast<unsigned>(m_inlineTextBox.start()) ? 0 : - m_inlineTextBox.lineLayoutItem().width(m_inlineTextBox.start(), paintStart - m_inlineTextBox.start(), m_inlineTextBox.textPos(), m_inlineTextBox.isLeftToRightDirection() ? LTR : RTL, m_inlineTextBox.isFirstLineStyle()); + m_inlineTextBox.getLineLayoutItem().width(m_inlineTextBox.start(), paintStart - m_inlineTextBox.start(), m_inlineTextBox.textPos(), m_inlineTextBox.isLeftToRightDirection() ? LTR : RTL, m_inlineTextBox.isFirstLineStyle()); // how much line to draw float width = (paintStart == static_cast<unsigned>(m_inlineTextBox.start()) && paintEnd == static_cast<unsigned>(m_inlineTextBox.end()) + 1) ? m_inlineTextBox.logicalWidth().toFloat() : - m_inlineTextBox.lineLayoutItem().width(paintStart, paintEnd - paintStart, LayoutUnit(m_inlineTextBox.textPos() + start), m_inlineTextBox.isLeftToRightDirection() ? LTR : RTL, m_inlineTextBox.isFirstLineStyle()); + m_inlineTextBox.getLineLayoutItem().width(paintStart, paintEnd - paintStart, LayoutUnit(m_inlineTextBox.textPos() + start), m_inlineTextBox.isLeftToRightDirection() ? LTR : RTL, m_inlineTextBox.isFirstLineStyle()); // In RTL mode, start and width are computed from the right end of the text box: // starting at |logicalWidth| - |start| and continuing left by |width| to // |logicalWidth| - |start| - |width|. We will draw that line, but @@ -816,7 +816,7 @@ // All other marked text underlines are 1px thick. // If there's not enough space the underline will touch or overlap characters. int lineThickness = 1; - int baseline = m_inlineTextBox.lineLayoutItem().style(m_inlineTextBox.isFirstLineStyle())->fontMetrics().ascent(); + int baseline = m_inlineTextBox.getLineLayoutItem().style(m_inlineTextBox.isFirstLineStyle())->fontMetrics().ascent(); if (underline.thick && m_inlineTextBox.logicalHeight() - baseline >= 2) lineThickness = 2; @@ -827,12 +827,12 @@ context.setStrokeColor(underline.color); context.setStrokeThickness(lineThickness); - context.drawLineForText(FloatPoint(boxOrigin.x() + start, (boxOrigin.y() + m_inlineTextBox.logicalHeight() - lineThickness).toFloat()), width, m_inlineTextBox.lineLayoutItem().document().printing()); + context.drawLineForText(FloatPoint(boxOrigin.x() + start, (boxOrigin.y() + m_inlineTextBox.logicalHeight() - lineThickness).toFloat()), width, m_inlineTextBox.getLineLayoutItem().document().printing()); } void InlineTextBoxPainter::paintTextMatchMarkerForeground(const PaintInfo& paintInfo, const LayoutPoint& boxOrigin, DocumentMarker* marker, const ComputedStyle& style, const Font& font) { - if (!LineLayoutAPIShim::layoutObjectFrom(m_inlineTextBox.lineLayoutItem())->frame()->editor().markedTextMatchesAreHighlighted()) + if (!LineLayoutAPIShim::layoutObjectFrom(m_inlineTextBox.getLineLayoutItem())->frame()->editor().markedTextMatchesAreHighlighted()) return; // TODO(ramya.v): Extract this into a helper function and share many copies of this code. @@ -857,12 +857,12 @@ void InlineTextBoxPainter::paintTextMatchMarkerBackground(const PaintInfo& paintInfo, const LayoutPoint& boxOrigin, DocumentMarker* marker, const ComputedStyle& style, const Font& font) { - if (!LineLayoutAPIShim::layoutObjectFrom(m_inlineTextBox.lineLayoutItem())->frame()->editor().markedTextMatchesAreHighlighted()) + if (!LineLayoutAPIShim::layoutObjectFrom(m_inlineTextBox.getLineLayoutItem())->frame()->editor().markedTextMatchesAreHighlighted()) return; // Use same y positioning and height as for selection, so that when the selection and this highlight are on // the same word there are no pieces sticking out. - int deltaY = m_inlineTextBox.lineLayoutItem().style()->isFlippedLinesWritingMode() ? m_inlineTextBox.root().selectionBottom() - m_inlineTextBox.logicalBottom() : m_inlineTextBox.logicalTop() - m_inlineTextBox.root().selectionTop(); + int deltaY = m_inlineTextBox.getLineLayoutItem().style()->isFlippedLinesWritingMode() ? m_inlineTextBox.root().selectionBottom() - m_inlineTextBox.logicalBottom() : m_inlineTextBox.logicalTop() - m_inlineTextBox.root().selectionTop(); int selHeight = m_inlineTextBox.root().selectionHeight(); int sPos = std::max(marker->startOffset() - m_inlineTextBox.start(), (unsigned)0);
diff --git a/third_party/WebKit/Source/core/paint/LayerClipRecorderTest.cpp b/third_party/WebKit/Source/core/paint/LayerClipRecorderTest.cpp index a59a43fd..51cdc062 100644 --- a/third_party/WebKit/Source/core/paint/LayerClipRecorderTest.cpp +++ b/third_party/WebKit/Source/core/paint/LayerClipRecorderTest.cpp
@@ -67,9 +67,9 @@ drawRectInClip(context, layoutView(), PaintPhaseForeground, bound); rootPaintController().commitNewDisplayItems(); EXPECT_EQ((size_t)3, rootPaintController().displayItemList().size()); - EXPECT_TRUE(DisplayItem::isClipType(rootPaintController().displayItemList()[0].type())); - EXPECT_TRUE(DisplayItem::isDrawingType(rootPaintController().displayItemList()[1].type())); - EXPECT_TRUE(DisplayItem::isEndClipType(rootPaintController().displayItemList()[2].type())); + EXPECT_TRUE(DisplayItem::isClipType(rootPaintController().displayItemList()[0].getType())); + EXPECT_TRUE(DisplayItem::isDrawingType(rootPaintController().displayItemList()[1].getType())); + EXPECT_TRUE(DisplayItem::isEndClipType(rootPaintController().displayItemList()[2].getType())); } TEST_F(LayerClipRecorderTest, Empty)
diff --git a/third_party/WebKit/Source/core/paint/LayoutObjectDrawingRecorder.h b/third_party/WebKit/Source/core/paint/LayoutObjectDrawingRecorder.h index 5ba038079..a29c02e 100644 --- a/third_party/WebKit/Source/core/paint/LayoutObjectDrawingRecorder.h +++ b/third_party/WebKit/Source/core/paint/LayoutObjectDrawingRecorder.h
@@ -74,7 +74,7 @@ else ASSERT(!paintController.paintOffsetWasInvalidated(layoutObject) || !paintController.clientCacheIsValid(layoutObject)); - layoutObject.mutableForPainting().setPreviousPaintOffset(paintOffset); + layoutObject.getMutableForPainting().setPreviousPaintOffset(paintOffset); } Optional<DisplayItemCacheSkipper> m_cacheSkipper;
diff --git a/third_party/WebKit/Source/core/paint/LineBoxListPainter.cpp b/third_party/WebKit/Source/core/paint/LineBoxListPainter.cpp index 94156063..e89d9a9 100644 --- a/third_party/WebKit/Source/core/paint/LineBoxListPainter.cpp +++ b/third_party/WebKit/Source/core/paint/LineBoxListPainter.cpp
@@ -64,7 +64,7 @@ { paintController.invalidatePaintOffset(*inlineBox); for (InlineBox* child = inlineBox->firstChild(); child; child = child->nextOnLine()) { - if (!child->lineLayoutItem().isText() && child->boxModelObject().hasSelfPaintingLayer()) + if (!child->getLineLayoutItem().isText() && child->boxModelObject().hasSelfPaintingLayer()) continue; if (child->isInlineFlowBox()) invalidateLineBoxPaintOffsetsInternal(paintController, toInlineFlowBox(child));
diff --git a/third_party/WebKit/Source/core/paint/ListMarkerPainter.cpp b/third_party/WebKit/Source/core/paint/ListMarkerPainter.cpp index 3e6a0cb..3238cec 100644 --- a/third_party/WebKit/Source/core/paint/ListMarkerPainter.cpp +++ b/third_party/WebKit/Source/core/paint/ListMarkerPainter.cpp
@@ -72,7 +72,7 @@ if (m_layoutListMarker.isImage()) { context.drawImage(m_layoutListMarker.image()->image( &m_layoutListMarker, marker.size(), m_layoutListMarker.styleRef().effectiveZoom()).get(), marker); - if (m_layoutListMarker.selectionState() != SelectionNone) { + if (m_layoutListMarker.getSelectionState() != SelectionNone) { LayoutRect selRect = m_layoutListMarker.localSelectionRect(); selRect.moveBy(boxOrigin); context.fillRect(pixelSnappedIntRect(selRect), m_layoutListMarker.listItem()->selectionBackgroundColor());
diff --git a/third_party/WebKit/Source/core/paint/ObjectPainter.cpp b/third_party/WebKit/Source/core/paint/ObjectPainter.cpp index 97a574b..5c3fb5d 100644 --- a/third_party/WebKit/Source/core/paint/ObjectPainter.cpp +++ b/third_party/WebKit/Source/core/paint/ObjectPainter.cpp
@@ -342,7 +342,7 @@ ASSERT(thickness > 0); bool wasAntialiased = graphicsContext.shouldAntialias(); - StrokeStyle oldStrokeStyle = graphicsContext.strokeStyle(); + StrokeStyle oldStrokeStyle = graphicsContext.getStrokeStyle(); graphicsContext.setShouldAntialias(antialias); graphicsContext.setStrokeColor(color); graphicsContext.setStrokeThickness(thickness); @@ -373,7 +373,7 @@ ASSERT(thirdOfThickness > 0); if (!adjacentWidth1 && !adjacentWidth2) { - StrokeStyle oldStrokeStyle = graphicsContext.strokeStyle(); + StrokeStyle oldStrokeStyle = graphicsContext.getStrokeStyle(); graphicsContext.setStrokeStyle(NoStroke); graphicsContext.setFillColor(color);
diff --git a/third_party/WebKit/Source/core/paint/PaintControllerPaintTest.h b/third_party/WebKit/Source/core/paint/PaintControllerPaintTest.h index a5b71214..cee7dab 100644 --- a/third_party/WebKit/Source/core/paint/PaintControllerPaintTest.h +++ b/third_party/WebKit/Source/core/paint/PaintControllerPaintTest.h
@@ -86,7 +86,7 @@ bool displayItemListContains(const DisplayItemList& displayItemList, DisplayItemClient& client, DisplayItem::Type type) { for (auto& item : displayItemList) { - if (item.client() == client && item.type() == type) + if (item.client() == client && item.getType() == type) return true; } return false; @@ -140,7 +140,7 @@ for (size_t index = 0; index < std::min<size_t>(actual.size(), expectedSize); index++) { \ TRACE_DISPLAY_ITEMS(index, expected[index], actual[index]); \ EXPECT_EQ(expected[index].client(), actual[index].client()); \ - EXPECT_EQ(expected[index].type(), actual[index].type()); \ + EXPECT_EQ(expected[index].getType(), actual[index].getType()); \ } \ } while (false);
diff --git a/third_party/WebKit/Source/core/paint/PaintLayer.cpp b/third_party/WebKit/Source/core/paint/PaintLayer.cpp index 2a34031c..4ae5132 100644 --- a/third_party/WebKit/Source/core/paint/PaintLayer.cpp +++ b/third_party/WebKit/Source/core/paint/PaintLayer.cpp
@@ -2452,6 +2452,14 @@ parent()->dirtyAncestorChainHasSelfPaintingLayerDescendantStatus(); } +PaintLayer* PaintLayer::enclosingSelfPaintingLayer() +{ + PaintLayer* layer = this; + while (layer && !layer->isSelfPaintingLayer()) + layer = layer->parent(); + return layer; +} + bool PaintLayer::hasNonEmptyChildLayoutObjects() const { // Some HTML can cause whitespace text nodes to have layoutObjects, like:
diff --git a/third_party/WebKit/Source/core/paint/PaintLayer.h b/third_party/WebKit/Source/core/paint/PaintLayer.h index 3468e4b0..4749c706 100644 --- a/third_party/WebKit/Source/core/paint/PaintLayer.h +++ b/third_party/WebKit/Source/core/paint/PaintLayer.h
@@ -610,6 +610,9 @@ void updateOrRemoveFilterEffectBuilder(); void updateSelfPaintingLayer(); + // This is O(depth) so avoid calling this in loops. Instead use optimizations like + // those in PaintInvalidationState. + PaintLayer* enclosingSelfPaintingLayer(); PaintLayer* enclosingTransformedAncestor() const; LayoutPoint computeOffsetFromTransformedAncestor() const;
diff --git a/third_party/WebKit/Source/core/paint/PartPainter.cpp b/third_party/WebKit/Source/core/paint/PartPainter.cpp index 8af5a805..fa2d3ea 100644 --- a/third_party/WebKit/Source/core/paint/PartPainter.cpp +++ b/third_party/WebKit/Source/core/paint/PartPainter.cpp
@@ -19,7 +19,7 @@ bool PartPainter::isSelected() const { - SelectionState s = m_layoutPart.selectionState(); + SelectionState s = m_layoutPart.getSelectionState(); if (s == SelectionNone) return false; if (s == SelectionInside)
diff --git a/third_party/WebKit/Source/core/paint/ReplacedPainter.cpp b/third_party/WebKit/Source/core/paint/ReplacedPainter.cpp index fd4878c..0d0a0303 100644 --- a/third_party/WebKit/Source/core/paint/ReplacedPainter.cpp +++ b/third_party/WebKit/Source/core/paint/ReplacedPainter.cpp
@@ -50,7 +50,7 @@ return; if (paintInfo.phase == PaintPhaseSelection) - if (m_layoutReplaced.selectionState() == SelectionNone) + if (m_layoutReplaced.getSelectionState() == SelectionNone) return; { @@ -84,7 +84,7 @@ // The selection tint never gets clipped by border-radius rounding, since we want it to run right up to the edges of // surrounding content. - bool drawSelectionTint = paintInfo.phase == PaintPhaseForeground && m_layoutReplaced.selectionState() != SelectionNone && !paintInfo.isPrinting(); + bool drawSelectionTint = paintInfo.phase == PaintPhaseForeground && m_layoutReplaced.getSelectionState() != SelectionNone && !paintInfo.isPrinting(); if (drawSelectionTint && !LayoutObjectDrawingRecorder::useCachedDrawingIfPossible(paintInfo.context, m_layoutReplaced, DisplayItem::SelectionTint, adjustedPaintOffset)) { LayoutRect selectionPaintingRect = m_layoutReplaced.localSelectionRect(); selectionPaintingRect.moveBy(adjustedPaintOffset);
diff --git a/third_party/WebKit/Source/core/paint/RootInlineBoxPainter.cpp b/third_party/WebKit/Source/core/paint/RootInlineBoxPainter.cpp index 8c6bda6..f23c69e4 100644 --- a/third_party/WebKit/Source/core/paint/RootInlineBoxPainter.cpp +++ b/third_party/WebKit/Source/core/paint/RootInlineBoxPainter.cpp
@@ -13,7 +13,7 @@ void RootInlineBoxPainter::paintEllipsisBox(const PaintInfo& paintInfo, const LayoutPoint& paintOffset, LayoutUnit lineTop, LayoutUnit lineBottom) const { - if (m_rootInlineBox.hasEllipsisBox() && m_rootInlineBox.lineLayoutItem().style()->visibility() == VISIBLE && paintInfo.phase == PaintPhaseForeground) + if (m_rootInlineBox.hasEllipsisBox() && m_rootInlineBox.getLineLayoutItem().style()->visibility() == VISIBLE && paintInfo.phase == PaintPhaseForeground) m_rootInlineBox.ellipsisBox()->paint(paintInfo, paintOffset, lineTop, lineBottom); }
diff --git a/third_party/WebKit/Source/core/paint/SVGInlineFlowBoxPainter.cpp b/third_party/WebKit/Source/core/paint/SVGInlineFlowBoxPainter.cpp index 588b9fbf..b967cc6 100644 --- a/third_party/WebKit/Source/core/paint/SVGInlineFlowBoxPainter.cpp +++ b/third_party/WebKit/Source/core/paint/SVGInlineFlowBoxPainter.cpp
@@ -32,7 +32,7 @@ { ASSERT(paintInfo.phase == PaintPhaseForeground || paintInfo.phase == PaintPhaseSelection); - SVGPaintContext paintContext(*LineLayoutAPIShim::constLayoutObjectFrom(m_svgInlineFlowBox.lineLayoutItem()), paintInfo); + SVGPaintContext paintContext(*LineLayoutAPIShim::constLayoutObjectFrom(m_svgInlineFlowBox.getLineLayoutItem()), paintInfo); if (paintContext.applyClipMaskAndFilterIfNecessary()) { for (InlineBox* child = m_svgInlineFlowBox.firstChild(); child; child = child->nextOnLine()) child->paint(paintContext.paintInfo(), paintOffset, LayoutUnit(), LayoutUnit());
diff --git a/third_party/WebKit/Source/core/paint/SVGInlineTextBoxPainter.cpp b/third_party/WebKit/Source/core/paint/SVGInlineTextBoxPainter.cpp index e977a294..f2dc154 100644 --- a/third_party/WebKit/Source/core/paint/SVGInlineTextBoxPainter.cpp +++ b/third_party/WebKit/Source/core/paint/SVGInlineTextBoxPainter.cpp
@@ -34,7 +34,7 @@ bool SVGInlineTextBoxPainter::shouldPaintSelection(const PaintInfo& paintInfo) const { - return !paintInfo.isPrinting() && m_svgInlineTextBox.selectionState() != SelectionNone; + return !paintInfo.isPrinting() && m_svgInlineTextBox.getSelectionState() != SelectionNone; } void SVGInlineTextBoxPainter::paint(const PaintInfo& paintInfo, const LayoutPoint& paintOffset) @@ -42,7 +42,7 @@ ASSERT(paintInfo.phase == PaintPhaseForeground || paintInfo.phase == PaintPhaseSelection); ASSERT(m_svgInlineTextBox.truncation() == cNoTruncation); - if (m_svgInlineTextBox.lineLayoutItem().style()->visibility() != VISIBLE) + if (m_svgInlineTextBox.getLineLayoutItem().style()->visibility() != VISIBLE) return; // We're explicitly not supporting composition & custom underlines and custom highlighters -- unlike InlineTextBox. @@ -51,13 +51,13 @@ if (paintInfo.phase == PaintPhaseSelection && !shouldPaintSelection(paintInfo)) return; - LayoutSVGInlineText& textLayoutObject = toLayoutSVGInlineText(*LineLayoutAPIShim::layoutObjectFrom(m_svgInlineTextBox.lineLayoutItem())); + LayoutSVGInlineText& textLayoutObject = toLayoutSVGInlineText(*LineLayoutAPIShim::layoutObjectFrom(m_svgInlineTextBox.getLineLayoutItem())); if (!textShouldBePainted(textLayoutObject)) return; DisplayItem::Type displayItemType = DisplayItem::paintPhaseToDrawingType(paintInfo.phase); if (!DrawingRecorder::useCachedDrawingIfPossible(paintInfo.context, m_svgInlineTextBox, displayItemType)) { - LayoutObject& parentLayoutObject = *LineLayoutAPIShim::layoutObjectFrom(m_svgInlineTextBox.parent()->lineLayoutItem()); + LayoutObject& parentLayoutObject = *LineLayoutAPIShim::layoutObjectFrom(m_svgInlineTextBox.parent()->getLineLayoutItem()); const ComputedStyle& style = parentLayoutObject.styleRef(); // TODO(chrishtr): passing the cull rect is incorrect. @@ -148,7 +148,7 @@ void SVGInlineTextBoxPainter::paintSelectionBackground(const PaintInfo& paintInfo) { - if (m_svgInlineTextBox.lineLayoutItem().style()->visibility() != VISIBLE) + if (m_svgInlineTextBox.getLineLayoutItem().style()->visibility() != VISIBLE) return; ASSERT(!paintInfo.isPrinting()); @@ -156,15 +156,15 @@ if (paintInfo.phase == PaintPhaseSelection || !shouldPaintSelection(paintInfo)) return; - Color backgroundColor = m_svgInlineTextBox.lineLayoutItem().selectionBackgroundColor(); + Color backgroundColor = m_svgInlineTextBox.getLineLayoutItem().selectionBackgroundColor(); if (!backgroundColor.alpha()) return; - LayoutSVGInlineText& textLayoutObject = toLayoutSVGInlineText(*LineLayoutAPIShim::layoutObjectFrom(m_svgInlineTextBox.lineLayoutItem())); + LayoutSVGInlineText& textLayoutObject = toLayoutSVGInlineText(*LineLayoutAPIShim::layoutObjectFrom(m_svgInlineTextBox.getLineLayoutItem())); if (!textShouldBePainted(textLayoutObject)) return; - const ComputedStyle& style = m_svgInlineTextBox.parent()->lineLayoutItem().styleRef(); + const ComputedStyle& style = m_svgInlineTextBox.parent()->getLineLayoutItem().styleRef(); int startPosition, endPosition; m_svgInlineTextBox.selectionStartEnd(startPosition, endPosition); @@ -186,7 +186,7 @@ // Lookup first layout object in parent hierarchy which has text-decoration set. LayoutObject* layoutObject = 0; while (parentBox) { - layoutObject = LineLayoutAPIShim::layoutObjectFrom(parentBox->lineLayoutItem()); + layoutObject = LineLayoutAPIShim::layoutObjectFrom(parentBox->getLineLayoutItem()); if (layoutObject->style() && layoutObject->style()->textDecoration() != TextDecorationNone) break; @@ -223,7 +223,7 @@ void SVGInlineTextBoxPainter::paintDecoration(const PaintInfo& paintInfo, TextDecoration decoration, const SVGTextFragment& fragment) { - if (m_svgInlineTextBox.lineLayoutItem().style()->textDecorationsInEffect() == TextDecorationNone) + if (m_svgInlineTextBox.getLineLayoutItem().style()->textDecorationsInEffect() == TextDecorationNone) return; if (fragment.width <= 0) @@ -289,7 +289,7 @@ bool SVGInlineTextBoxPainter::setupTextPaint(const PaintInfo& paintInfo, const ComputedStyle& style, LayoutSVGResourceMode resourceMode, SkPaint& paint) { - LayoutSVGInlineText& textLayoutObject = toLayoutSVGInlineText(*LineLayoutAPIShim::layoutObjectFrom(m_svgInlineTextBox.lineLayoutItem())); + LayoutSVGInlineText& textLayoutObject = toLayoutSVGInlineText(*LineLayoutAPIShim::layoutObjectFrom(m_svgInlineTextBox.getLineLayoutItem())); float scalingFactor = textLayoutObject.scalingFactor(); ASSERT(scalingFactor); @@ -308,7 +308,7 @@ additionalPaintServerTransform = &paintServerTransform; } - if (!SVGPaintContext::paintForLayoutObject(paintInfo, style, *LineLayoutAPIShim::layoutObjectFrom(m_svgInlineTextBox.parent()->lineLayoutItem()), resourceMode, paint, additionalPaintServerTransform)) + if (!SVGPaintContext::paintForLayoutObject(paintInfo, style, *LineLayoutAPIShim::layoutObjectFrom(m_svgInlineTextBox.parent()->getLineLayoutItem()), resourceMode, paint, additionalPaintServerTransform)) return false; paint.setAntiAlias(true); @@ -320,7 +320,7 @@ if (resourceMode == ApplyToStrokeMode) { StrokeData strokeData; - SVGLayoutSupport::applyStrokeStyleToStrokeData(strokeData, style, *LineLayoutAPIShim::layoutObjectFrom(m_svgInlineTextBox.parent()->lineLayoutItem()), 1); + SVGLayoutSupport::applyStrokeStyleToStrokeData(strokeData, style, *LineLayoutAPIShim::layoutObjectFrom(m_svgInlineTextBox.parent()->getLineLayoutItem()), 1); if (style.svgStyle().vectorEffect() != VE_NON_SCALING_STROKE) strokeData.setThickness(strokeData.thickness() * scalingFactor); strokeData.setupPaint(&paint); @@ -330,7 +330,7 @@ void SVGInlineTextBoxPainter::paintText(const PaintInfo& paintInfo, TextRun& textRun, const SVGTextFragment& fragment, int startPosition, int endPosition, const SkPaint& paint) { - LayoutSVGInlineText& textLayoutObject = toLayoutSVGInlineText(*LineLayoutAPIShim::layoutObjectFrom(m_svgInlineTextBox.lineLayoutItem())); + LayoutSVGInlineText& textLayoutObject = toLayoutSVGInlineText(*LineLayoutAPIShim::layoutObjectFrom(m_svgInlineTextBox.getLineLayoutItem())); const Font& scaledFont = textLayoutObject.scaledFont(); float scalingFactor = textLayoutObject.scalingFactor(); @@ -391,7 +391,7 @@ if (style != selectionStyle) { StyleDifference diff; diff.setNeedsPaintInvalidationObject(); - SVGResourcesCache::clientStyleChanged(LineLayoutAPIShim::layoutObjectFrom(m_svgInlineTextBox.parent()->lineLayoutItem()), diff, selectionStyle); + SVGResourcesCache::clientStyleChanged(LineLayoutAPIShim::layoutObjectFrom(m_svgInlineTextBox.parent()->getLineLayoutItem()), diff, selectionStyle); } SkPaint paint; @@ -401,7 +401,7 @@ if (style != selectionStyle) { StyleDifference diff; diff.setNeedsPaintInvalidationObject(); - SVGResourcesCache::clientStyleChanged(LineLayoutAPIShim::layoutObjectFrom(m_svgInlineTextBox.parent()->lineLayoutItem()), diff, style); + SVGResourcesCache::clientStyleChanged(LineLayoutAPIShim::layoutObjectFrom(m_svgInlineTextBox.parent()->getLineLayoutItem()), diff, style); } // Eventually draw text using regular style from the end position of the selection to the end of the current chunk part @@ -420,7 +420,7 @@ if (marker->type() != DocumentMarker::TextMatch) return emptyTextMatchList; - if (!LineLayoutAPIShim::layoutObjectFrom(m_svgInlineTextBox.lineLayoutItem())->frame()->editor().markedTextMatchesAreHighlighted()) + if (!LineLayoutAPIShim::layoutObjectFrom(m_svgInlineTextBox.getLineLayoutItem())->frame()->editor().markedTextMatchesAreHighlighted()) return emptyTextMatchList; int markerStartPosition = std::max<int>(marker->startOffset() - m_svgInlineTextBox.start(), 0);
diff --git a/third_party/WebKit/Source/core/paint/SVGRootInlineBoxPainter.cpp b/third_party/WebKit/Source/core/paint/SVGRootInlineBoxPainter.cpp index 208cb1f..a3e2f71 100644 --- a/third_party/WebKit/Source/core/paint/SVGRootInlineBoxPainter.cpp +++ b/third_party/WebKit/Source/core/paint/SVGRootInlineBoxPainter.cpp
@@ -21,12 +21,12 @@ { ASSERT(paintInfo.phase == PaintPhaseForeground || paintInfo.phase == PaintPhaseSelection); - bool hasSelection = !paintInfo.isPrinting() && m_svgRootInlineBox.selectionState() != SelectionNone; + bool hasSelection = !paintInfo.isPrinting() && m_svgRootInlineBox.getSelectionState() != SelectionNone; PaintInfo paintInfoBeforeFiltering(paintInfo); - if (hasSelection && !LayoutObjectDrawingRecorder::useCachedDrawingIfPossible(paintInfoBeforeFiltering.context, *LineLayoutAPIShim::constLayoutObjectFrom(m_svgRootInlineBox.lineLayoutItem()), + if (hasSelection && !LayoutObjectDrawingRecorder::useCachedDrawingIfPossible(paintInfoBeforeFiltering.context, *LineLayoutAPIShim::constLayoutObjectFrom(m_svgRootInlineBox.getLineLayoutItem()), paintInfoBeforeFiltering.phase, paintOffset)) { - LayoutObjectDrawingRecorder recorder(paintInfoBeforeFiltering.context, *LineLayoutAPIShim::constLayoutObjectFrom(m_svgRootInlineBox.lineLayoutItem()), paintInfoBeforeFiltering.phase, + LayoutObjectDrawingRecorder recorder(paintInfoBeforeFiltering.context, *LineLayoutAPIShim::constLayoutObjectFrom(m_svgRootInlineBox.getLineLayoutItem()), paintInfoBeforeFiltering.phase, paintInfoBeforeFiltering.cullRect().m_rect, paintOffset); for (InlineBox* child = m_svgRootInlineBox.firstChild(); child; child = child->nextOnLine()) { if (child->isSVGInlineTextBox()) @@ -36,7 +36,7 @@ } } - SVGPaintContext paintContext(*LineLayoutAPIShim::constLayoutObjectFrom(m_svgRootInlineBox.lineLayoutItem()), paintInfoBeforeFiltering); + SVGPaintContext paintContext(*LineLayoutAPIShim::constLayoutObjectFrom(m_svgRootInlineBox.getLineLayoutItem()), paintInfoBeforeFiltering); if (paintContext.applyClipMaskAndFilterIfNecessary()) { for (InlineBox* child = m_svgRootInlineBox.firstChild(); child; child = child->nextOnLine()) child->paint(paintContext.paintInfo(), paintOffset, LayoutUnit(), LayoutUnit());
diff --git a/third_party/WebKit/Source/core/svg/graphics/filters/SVGFEImage.h b/third_party/WebKit/Source/core/svg/graphics/filters/SVGFEImage.h index 9ca13f93..4b9f8875 100644 --- a/third_party/WebKit/Source/core/svg/graphics/filters/SVGFEImage.h +++ b/third_party/WebKit/Source/core/svg/graphics/filters/SVGFEImage.h
@@ -40,7 +40,7 @@ FloatRect determineAbsolutePaintRect(const FloatRect& requestedRect) override; - FilterEffectType filterEffectType() const override { return FilterEffectTypeImage; } + FilterEffectType getFilterEffectType() const override { return FilterEffectTypeImage; } // feImage does not perform color interpolation of any kind, so doesn't // depend on the value of color-interpolation-filters.
diff --git a/third_party/WebKit/Source/core/workers/WorkerInspectorProxy.cpp b/third_party/WebKit/Source/core/workers/WorkerInspectorProxy.cpp index 204b90e..3c34665 100644 --- a/third_party/WebKit/Source/core/workers/WorkerInspectorProxy.cpp +++ b/third_party/WebKit/Source/core/workers/WorkerInspectorProxy.cpp
@@ -9,9 +9,9 @@ #include "core/inspector/InspectorTraceEvents.h" #include "core/inspector/WorkerInspectorController.h" #include "core/workers/WorkerThread.h" -#include "platform/Task.h" #include "platform/TraceEvent.h" #include "platform/weborigin/KURL.h" +#include "public/platform/WebTaskRunner.h" #include "public/platform/WebTraceLocation.h" namespace blink { @@ -59,7 +59,7 @@ return; ASSERT(!m_pageInspector); m_pageInspector = pageInspector; - addDebuggerTaskForWorker(BLINK_FROM_HERE, adoptPtr(new Task(threadSafeBind(connectToWorkerGlobalScopeInspectorTask, AllowCrossThreadAccess(m_workerThread))))); + addDebuggerTaskForWorker(BLINK_FROM_HERE, threadSafeBind(connectToWorkerGlobalScopeInspectorTask, AllowCrossThreadAccess(m_workerThread))); } static void disconnectFromWorkerGlobalScopeInspectorTask(WorkerThread* workerThread) @@ -72,7 +72,7 @@ m_pageInspector = nullptr; if (!m_workerThread) return; - addDebuggerTaskForWorker(BLINK_FROM_HERE, adoptPtr(new Task(threadSafeBind(disconnectFromWorkerGlobalScopeInspectorTask, AllowCrossThreadAccess(m_workerThread))))); + addDebuggerTaskForWorker(BLINK_FROM_HERE, threadSafeBind(disconnectFromWorkerGlobalScopeInspectorTask, AllowCrossThreadAccess(m_workerThread))); } static void dispatchOnInspectorBackendTask(const String& message, WorkerThread* workerThread) @@ -84,7 +84,7 @@ { if (!m_workerThread) return; - addDebuggerTaskForWorker(BLINK_FROM_HERE, adoptPtr(new Task(threadSafeBind(dispatchOnInspectorBackendTask, message, AllowCrossThreadAccess(m_workerThread))))); + addDebuggerTaskForWorker(BLINK_FROM_HERE, threadSafeBind(dispatchOnInspectorBackendTask, message, AllowCrossThreadAccess(m_workerThread))); m_workerThread->interruptAndDispatchInspectorCommands(); } @@ -100,10 +100,10 @@ workerThread->runDebuggerTask(WorkerThread::DontWaitForTask); } -void WorkerInspectorProxy::addDebuggerTaskForWorker(const WebTraceLocation& location, PassOwnPtr<WebTaskRunner::Task> task) +void WorkerInspectorProxy::addDebuggerTaskForWorker(const WebTraceLocation& location, PassOwnPtr<Closure> task) { m_workerThread->appendDebuggerTask(task); - m_workerThread->backingThread().postTask(location, new Task(threadSafeBind(&runDebuggerTaskForWorker, AllowCrossThreadAccess(m_workerThread)))); + m_workerThread->backingThread().postTask(location, threadSafeBind(&runDebuggerTaskForWorker, AllowCrossThreadAccess(m_workerThread))); } DEFINE_TRACE(WorkerInspectorProxy)
diff --git a/third_party/WebKit/Source/core/workers/WorkerInspectorProxy.h b/third_party/WebKit/Source/core/workers/WorkerInspectorProxy.h index a86a431..be673603 100644 --- a/third_party/WebKit/Source/core/workers/WorkerInspectorProxy.h +++ b/third_party/WebKit/Source/core/workers/WorkerInspectorProxy.h
@@ -7,7 +7,6 @@ #include "core/CoreExport.h" #include "platform/heap/Handle.h" -#include "public/platform/WebTaskRunner.h" #include "wtf/Forward.h" namespace blink { @@ -52,7 +51,7 @@ private: WorkerInspectorProxy(); - void addDebuggerTaskForWorker(const WebTraceLocation&, PassOwnPtr<WebTaskRunner::Task>); + void addDebuggerTaskForWorker(const WebTraceLocation&, PassOwnPtr<Closure>); WorkerThread* m_workerThread; RawPtrWillBeMember<ExecutionContext> m_executionContext;
diff --git a/third_party/WebKit/Source/core/workers/WorkerThread.cpp b/third_party/WebKit/Source/core/workers/WorkerThread.cpp index 7531f85..bb5bb46 100644 --- a/third_party/WebKit/Source/core/workers/WorkerThread.cpp +++ b/third_party/WebKit/Source/core/workers/WorkerThread.cpp
@@ -37,7 +37,6 @@ #include "core/workers/WorkerClients.h" #include "core/workers/WorkerReportingProxy.h" #include "core/workers/WorkerThreadStartupData.h" -#include "platform/Task.h" #include "platform/ThreadSafeFunctional.h" #include "platform/WaitableEvent.h" #include "platform/heap/SafePoint.h" @@ -46,6 +45,7 @@ #include "public/platform/Platform.h" #include "public/platform/WebScheduler.h" #include "public/platform/WebThread.h" +#include "wtf/Functional.h" #include "wtf/Noncopyable.h" #include "wtf/WeakPtr.h" #include "wtf/text/WTFString.h" @@ -122,7 +122,7 @@ InspectorInstrumentation::didPerformExecutionContextTask(globalScope); } -WebTaskRunner::Task* WorkerThread::createWorkerThreadTask(PassOwnPtr<ExecutionContextTask> task, bool isInstrumented) +PassOwnPtr<Closure> WorkerThread::createWorkerThreadTask(PassOwnPtr<ExecutionContextTask> task, bool isInstrumented) { if (isInstrumented) isInstrumented = !task->taskNameForInstrumentation().isEmpty(); @@ -131,13 +131,13 @@ // https://crbug.com/588497 InspectorInstrumentation::didPostExecutionContextTask(workerGlobalScope(), task.get()); } - return new Task(threadSafeBind(&WorkerThread::performTask, AllowCrossThreadAccess(this), task, isInstrumented)); + return threadSafeBind(&WorkerThread::performTask, AllowCrossThreadAccess(this), task, isInstrumented); } class WorkerThread::DebuggerTaskQueue { WTF_MAKE_NONCOPYABLE(DebuggerTaskQueue); public: - using Task = WebTaskRunner::Task; + using Task = WTF::Closure; using Result = WorkerThread::TaskQueueResult; DebuggerTaskQueue() { } @@ -229,7 +229,7 @@ return; m_started = true; - backingThread().postTask(BLINK_FROM_HERE, new Task(threadSafeBind(&WorkerThread::initialize, AllowCrossThreadAccess(this), startupData))); + backingThread().postTask(BLINK_FROM_HERE, threadSafeBind(&WorkerThread::initialize, AllowCrossThreadAccess(this), startupData)); } void WorkerThread::interruptAndDispatchInspectorCommands() @@ -406,7 +406,7 @@ InspectorInstrumentation::didKillAllExecutionContextTasks(m_workerGlobalScope.get()); m_debuggerTaskQueue->kill(); - backingThread().postTask(BLINK_FROM_HERE, new Task(threadSafeBind(&WorkerThread::shutdown, AllowCrossThreadAccess(this)))); + backingThread().postTask(BLINK_FROM_HERE, threadSafeBind(&WorkerThread::shutdown, AllowCrossThreadAccess(this))); } void WorkerThread::didStartWorkerThread() @@ -494,7 +494,7 @@ m_isolate->TerminateExecution(); } -void WorkerThread::appendDebuggerTask(PassOwnPtr<WebTaskRunner::Task> task) +void WorkerThread::appendDebuggerTask(PassOwnPtr<Closure> task) { { MutexLocker lock(m_threadStateMutex); @@ -509,7 +509,7 @@ ASSERT(isCurrentThread()); TaskQueueResult result; double absoluteTime = DebuggerTaskQueue::infiniteTime(); - OwnPtr<WebTaskRunner::Task> task; + OwnPtr<Closure> task; { if (waitMode == DontWaitForTask) absoluteTime = 0.0; @@ -519,7 +519,7 @@ if (result == TaskReceived) { InspectorInstrumentation::willProcessTask(workerGlobalScope()); - task->run(); + (*task)(); InspectorInstrumentation::didProcessTask(workerGlobalScope()); }
diff --git a/third_party/WebKit/Source/core/workers/WorkerThread.h b/third_party/WebKit/Source/core/workers/WorkerThread.h index f25b045..3282ee4 100644 --- a/third_party/WebKit/Source/core/workers/WorkerThread.h +++ b/third_party/WebKit/Source/core/workers/WorkerThread.h
@@ -35,6 +35,7 @@ #include "platform/WebThreadSupportingGC.h" #include "platform/weborigin/SecurityOrigin.h" #include "wtf/Forward.h" +#include "wtf/Functional.h" #include "wtf/OwnPtr.h" #include "wtf/PassRefPtr.h" #include "wtf/RefCounted.h" @@ -95,7 +96,7 @@ WorkerReportingProxy& workerReportingProxy() const { return m_workerReportingProxy; } void postTask(const WebTraceLocation&, PassOwnPtr<ExecutionContextTask>); - void appendDebuggerTask(PassOwnPtr<WebTaskRunner::Task>); + void appendDebuggerTask(PassOwnPtr<Closure>); enum WaitMode { WaitForTask, DontWaitForTask }; enum TaskQueueResult { @@ -145,7 +146,7 @@ class DebuggerTaskQueue; friend class WorkerMicrotaskRunner; - WebTaskRunner::Task* createWorkerThreadTask(PassOwnPtr<ExecutionContextTask>, bool isInstrumented); + PassOwnPtr<Closure> createWorkerThreadTask(PassOwnPtr<ExecutionContextTask>, bool isInstrumented); // Called on the main thread. void terminateInternal();
diff --git a/third_party/WebKit/Source/core/workers/WorkerThreadTest.cpp b/third_party/WebKit/Source/core/workers/WorkerThreadTest.cpp index eb93613..ee00437 100644 --- a/third_party/WebKit/Source/core/workers/WorkerThreadTest.cpp +++ b/third_party/WebKit/Source/core/workers/WorkerThreadTest.cpp
@@ -191,7 +191,7 @@ void waitForInit() { OwnPtr<WaitableEvent> completionEvent = adoptPtr(new WaitableEvent()); - m_workerThread->backingThread().postTask(BLINK_FROM_HERE, new Task(threadSafeBind(&WaitableEvent::signal, AllowCrossThreadAccess(completionEvent.get())))); + m_workerThread->backingThread().postTask(BLINK_FROM_HERE, threadSafeBind(&WaitableEvent::signal, AllowCrossThreadAccess(completionEvent.get()))); completionEvent->wait(); }
diff --git a/third_party/WebKit/Source/devtools/front_end/elements/ComputedStyleWidget.js b/third_party/WebKit/Source/devtools/front_end/elements/ComputedStyleWidget.js index 9aab9a7..bc6dced 100644 --- a/third_party/WebKit/Source/devtools/front_end/elements/ComputedStyleWidget.js +++ b/third_party/WebKit/Source/devtools/front_end/elements/ComputedStyleWidget.js
@@ -167,9 +167,11 @@ colon.textContent = ":"; propertyNameElement.appendChild(colon); - var propertyValueElement = renderer.renderValue(); - propertyValueElement.classList.add("property-value"); - propertyElement.appendChild(propertyValueElement); + var propertyValueElement = propertyElement.createChild("span", "property-value"); + + var propertyValueText = renderer.renderValue(); + propertyValueText.classList.add("property-value-text"); + propertyValueElement.appendChild(propertyValueText); var semicolon = createElementWithClass("span", "delimeter"); semicolon.textContent = ";";
diff --git a/third_party/WebKit/Source/devtools/front_end/elements/computedStyleSidebarPane.css b/third_party/WebKit/Source/devtools/front_end/elements/computedStyleSidebarPane.css index d453c83..34828965 100644 --- a/third_party/WebKit/Source/devtools/front_end/elements/computedStyleSidebarPane.css +++ b/third_party/WebKit/Source/devtools/front_end/elements/computedStyleSidebarPane.css
@@ -10,18 +10,31 @@ .computed-style-property { display: flex; - flex-wrap: wrap; + overflow: hidden; + flex: auto; } .computed-style-property .property-name { - width: 16em; + min-width: 5em; text-overflow: ellipsis; overflow: hidden; + flex-shrink: 1; + flex-basis: 16em; + flex-grow: 1; } .computed-style-property .property-value { - min-width: 5em; + margin-left: 2em; position: relative; + display: flex; + flex-shrink: 0; + flex-basis: 5em; + flex-grow: 10; +} + +.computed-style-property .property-value-text { + overflow: hidden; + text-overflow: ellipsis; } .tree-outline li:hover .goto-source-icon {
diff --git a/third_party/WebKit/Source/devtools/front_end/timeline/TimelineFlameChart.js b/third_party/WebKit/Source/devtools/front_end/timeline/TimelineFlameChart.js index 647086cc..05b2e7d 100644 --- a/third_party/WebKit/Source/devtools/front_end/timeline/TimelineFlameChart.js +++ b/third_party/WebKit/Source/devtools/front_end/timeline/TimelineFlameChart.js
@@ -82,7 +82,7 @@ */ groupSeparatorHeight: function() { - return 12; + return 3; }, /**
diff --git a/third_party/WebKit/Source/devtools/front_end/ui_lazy/FlameChart.js b/third_party/WebKit/Source/devtools/front_end/ui_lazy/FlameChart.js index 71745a7..3cc6b6d 100644 --- a/third_party/WebKit/Source/devtools/front_end/ui_lazy/FlameChart.js +++ b/third_party/WebKit/Source/devtools/front_end/ui_lazy/FlameChart.js
@@ -1356,22 +1356,19 @@ this._drawCollapsedOverviewForGroup(offset + 1, group.startLevel, endLevel); }); - var headerX = 2; + var headerLeftPadding = 6; var arrowSide = 8; - var arrowHeight = arrowSide * Math.sqrt(3) / 2; - var expansionArrowX = headerX + arrowHeight; + var expansionArrowX = headerLeftPadding + arrowSide / 2; context.font = "11px " + WebInspector.fontFamily(); context.save(); context.fillStyle = "rgba(255, 255, 255, 0.5)"; - context.shadowColor = "#fff"; - context.shadowBlur = 10; forEachGroup(firstVisibleGroup, drawBackground.bind(this)); context.restore(); - context.fillStyle = "#888888"; + context.fillStyle = "#6e6e6e"; context.beginPath(); - forEachGroup(firstVisibleGroup, (offset, index, group) => drawExpansionArrow(expansionArrowX, offset + barHeight / 2, group.expanded)); + forEachGroup(firstVisibleGroup, (offset, index, group) => drawExpansionArrow(expansionArrowX, offset + textBaseHeight - arrowSide / 2, group.expanded)); context.fill(); context.fillStyle = "#222"; @@ -1405,10 +1402,10 @@ */ function drawBackground(offset, index, group) { - var backgroundPadding = 3; - var textPadding = 4; - var width = this._measureWidth(context, group.name) + textPadding + 2 * arrowSide; - context.fillRect(headerX, offset + backgroundPadding, width, barHeight - 2 * backgroundPadding); + var vPadding = 2; + var hPadding = 3; + var width = this._measureWidth(context, group.name) + 1.5 * arrowSide + 2 * hPadding; + context.fillRect(headerLeftPadding - hPadding, offset + vPadding, width, barHeight - 2 * vPadding); } /** @@ -1418,14 +1415,14 @@ */ function drawExpansionArrow(x, y, expanded) { - var arrowCenterOffset = arrowHeight / 3; + var arrowHeight = arrowSide * Math.sqrt(3) / 2; + var arrowCenterOffset = Math.round(arrowHeight / 2); context.save(); context.translate(x, y); context.rotate(expanded ? Math.PI / 2 : 0); context.moveTo(-arrowCenterOffset, -arrowSide / 2); context.lineTo(-arrowCenterOffset, arrowSide / 2); - context.lineTo(2 * arrowCenterOffset, 0); - context.lineTo(-arrowCenterOffset, -arrowSide / 2); + context.lineTo(arrowHeight - arrowCenterOffset, 0); context.restore(); }
diff --git a/third_party/WebKit/Source/modules/accessibility/AXInlineTextBox.cpp b/third_party/WebKit/Source/modules/accessibility/AXInlineTextBox.cpp index 312eca6..a6bf970 100644 --- a/third_party/WebKit/Source/modules/accessibility/AXInlineTextBox.cpp +++ b/third_party/WebKit/Source/modules/accessibility/AXInlineTextBox.cpp
@@ -127,7 +127,7 @@ if (!m_inlineTextBox || !m_axObjectCache) return 0; - LineLayoutText lineLayoutText = m_inlineTextBox->lineLayoutItem(); + LineLayoutText lineLayoutText = m_inlineTextBox->getLineLayoutItem(); return m_axObjectCache->getOrCreate(lineLayoutText); }
diff --git a/third_party/WebKit/Source/modules/accessibility/AXLayoutObject.cpp b/third_party/WebKit/Source/modules/accessibility/AXLayoutObject.cpp index 63ffc61..b9a4bc3 100644 --- a/third_party/WebKit/Source/modules/accessibility/AXLayoutObject.cpp +++ b/third_party/WebKit/Source/modules/accessibility/AXLayoutObject.cpp
@@ -1006,7 +1006,7 @@ AXObject* result = 0; for (InlineBox* next = inlineBox->nextOnLine(); next; next = next->nextOnLine()) { - LayoutObject* layoutObject = LineLayoutAPIShim::layoutObjectFrom(next->lineLayoutItem()); + LayoutObject* layoutObject = LineLayoutAPIShim::layoutObjectFrom(next->getLineLayoutItem()); result = axObjectCache().getOrCreate(layoutObject); if (result) break; @@ -1035,7 +1035,7 @@ AXObject* result = 0; for (InlineBox* prev = inlineBox->prevOnLine(); prev; prev = prev->prevOnLine()) { - LayoutObject* layoutObject = LineLayoutAPIShim::layoutObjectFrom(prev->lineLayoutItem()); + LayoutObject* layoutObject = LineLayoutAPIShim::layoutObjectFrom(prev->getLineLayoutItem()); result = axObjectCache().getOrCreate(layoutObject); if (result) break;
diff --git a/third_party/WebKit/Source/modules/background_sync/SyncCallbacks.cpp b/third_party/WebKit/Source/modules/background_sync/SyncCallbacks.cpp index 9b8f3b82..a8b1fac 100644 --- a/third_party/WebKit/Source/modules/background_sync/SyncCallbacks.cpp +++ b/third_party/WebKit/Source/modules/background_sync/SyncCallbacks.cpp
@@ -46,35 +46,6 @@ m_resolver->reject(SyncError::take(m_resolver.get(), error)); } -SyncUnregistrationCallbacks::SyncUnregistrationCallbacks(ScriptPromiseResolver* resolver, ServiceWorkerRegistration* serviceWorkerRegistration) - : m_resolver(resolver) - , m_serviceWorkerRegistration(serviceWorkerRegistration) -{ - ASSERT(m_resolver); - ASSERT(m_serviceWorkerRegistration); -} - -SyncUnregistrationCallbacks::~SyncUnregistrationCallbacks() -{ -} - -void SyncUnregistrationCallbacks::onSuccess(bool status) -{ - if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped()) { - return; - } - - m_resolver->resolve(status); -} - -void SyncUnregistrationCallbacks::onError(const WebSyncError& error) -{ - if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped()) { - return; - } - m_resolver->reject(SyncError::take(m_resolver.get(), error)); -} - SyncGetRegistrationsCallbacks::SyncGetRegistrationsCallbacks(ScriptPromiseResolver* resolver, ServiceWorkerRegistration* serviceWorkerRegistration) : m_resolver(resolver) , m_serviceWorkerRegistration(serviceWorkerRegistration)
diff --git a/third_party/WebKit/Source/modules/background_sync/SyncCallbacks.h b/third_party/WebKit/Source/modules/background_sync/SyncCallbacks.h index a7594558..d4ad487 100644 --- a/third_party/WebKit/Source/modules/background_sync/SyncCallbacks.h +++ b/third_party/WebKit/Source/modules/background_sync/SyncCallbacks.h
@@ -42,28 +42,6 @@ Persistent<ServiceWorkerRegistration> m_serviceWorkerRegistration; }; -// SyncUnregistrationCallbacks is an implementation of -// WebSyncUnregistrationCallbacks that will resolve the underlying promise -// depending on the result passed to the callback. It takes a -// ServiceWorkerRegistration in its constructor and will pass it to the -// SyncProvider. -class SyncUnregistrationCallbacks final : public WebSyncUnregistrationCallbacks { - WTF_MAKE_NONCOPYABLE(SyncUnregistrationCallbacks); - // FIXME(tasak): when making public/platform classes to use PartitionAlloc, - // the following macro should be moved to WebCallbacks defined in public/platformWebCallbacks.h. - USING_FAST_MALLOC(SyncUnregistrationCallbacks); -public: - SyncUnregistrationCallbacks(ScriptPromiseResolver*, ServiceWorkerRegistration*); - ~SyncUnregistrationCallbacks() override; - - void onSuccess(bool) override; - void onError(const WebSyncError&) override; - -private: - Persistent<ScriptPromiseResolver> m_resolver; - Persistent<ServiceWorkerRegistration> m_serviceWorkerRegistration; -}; - // SyncGetRegistrationsCallbacks is an implementation of WebSyncGetRegistrationsCallbacks // that will resolve the underlying promise depending on the result passed to // the callback. It takes a ServiceWorkerRegistration in its constructor and
diff --git a/third_party/WebKit/Source/modules/bluetooth/BluetoothError.cpp b/third_party/WebKit/Source/modules/bluetooth/BluetoothError.cpp index 5070f4b..ff601f92 100644 --- a/third_party/WebKit/Source/modules/bluetooth/BluetoothError.cpp +++ b/third_party/WebKit/Source/modules/bluetooth/BluetoothError.cpp
@@ -48,9 +48,11 @@ MAP_ERROR(NoBluetoothAdapter, NotFoundError, "Bluetooth adapter not available."); MAP_ERROR(ChosenDeviceVanished, NotFoundError, "User selected a device that doesn't exist anymore."); MAP_ERROR(ChooserCancelled, NotFoundError, "User cancelled the requestDevice() chooser."); + MAP_ERROR(ChooserDisabled, NotFoundError, "User or their enterprise policy has disabled Web Bluetooth globally."); MAP_ERROR(ChooserDeniedPermission, NotFoundError, "User denied the browser permission to scan for Bluetooth devices."); MAP_ERROR(ServiceNotFound, NotFoundError, "Service not found in device."); - MAP_ERROR(CharacteristicNotFound, NotFoundError, "Characteristic not found in device."); + MAP_ERROR(CharacteristicNotFound, NotFoundError, "No Characteristics with specified UUID found in Service."); + MAP_ERROR(NoCharacteristicsFound, NotFoundError, "No Characteristics found in service."); // NotSupportedErrors: MAP_ERROR(GATTUnknownError, NotSupportedError, "GATT Error Unknown.");
diff --git a/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTService.cpp b/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTService.cpp index 9c71c57..7216862 100644 --- a/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTService.cpp +++ b/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTService.cpp
@@ -46,4 +46,46 @@ return promise; } +ScriptPromise BluetoothRemoteGATTService::getCharacteristics(ScriptState* scriptState, ExceptionState&) +{ + return getCharacteristicsImpl(scriptState, String()); +} + +ScriptPromise BluetoothRemoteGATTService::getCharacteristics(ScriptState* scriptState, const StringOrUnsignedLong& characteristic, ExceptionState& exceptionState) +{ + String characteristicUUID = BluetoothUUID::getCharacteristic(characteristic, exceptionState); + if (exceptionState.hadException()) + return exceptionState.reject(scriptState); + + return getCharacteristicsImpl(scriptState, characteristicUUID); +} + +// Class that allows us to use CallbackPromiseAdapter to resolve a promise with a +// vector owning BluetoothRemoteGATTCharacteristics. +class RemoteCharacteristicArray { + STATIC_ONLY(RemoteCharacteristicArray); +public: + using WebType = OwnPtr<WebVector<WebBluetoothRemoteGATTCharacteristicInit*>>; + static HeapVector<Member<BluetoothRemoteGATTCharacteristic>> take(ScriptPromiseResolver* resolver, PassOwnPtr<WebVector<WebBluetoothRemoteGATTCharacteristicInit*>> webCharacteristics) + { + HeapVector<Member<BluetoothRemoteGATTCharacteristic>> characteristics; + characteristics.reserveInitialCapacity(webCharacteristics->size()); + for (WebBluetoothRemoteGATTCharacteristicInit* webCharacteristic : *webCharacteristics) { + characteristics.append(BluetoothRemoteGATTCharacteristic::take(resolver, adoptPtr(webCharacteristic))); + } + return characteristics; + } +}; + +ScriptPromise BluetoothRemoteGATTService::getCharacteristicsImpl(ScriptState* scriptState, String characteristicsUUID) +{ + ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); + ScriptPromise promise = resolver->promise(); + + WebBluetooth* webbluetooth = BluetoothSupplement::fromScriptState(scriptState); + webbluetooth->getCharacteristics(m_webService->serviceInstanceID, characteristicsUUID, new CallbackPromiseAdapter<RemoteCharacteristicArray, BluetoothError>(resolver)); + + return promise; +} + } // namespace blink
diff --git a/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTService.h b/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTService.h index 55d64d0..10553a1 100644 --- a/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTService.h +++ b/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTService.h
@@ -45,8 +45,12 @@ String uuid() { return m_webService->uuid; } bool isPrimary() { return m_webService->isPrimary; } ScriptPromise getCharacteristic(ScriptState*, const StringOrUnsignedLong& characteristic, ExceptionState&); + ScriptPromise getCharacteristics(ScriptState*, ExceptionState&); + ScriptPromise getCharacteristics(ScriptState*, const StringOrUnsignedLong& characteristic, ExceptionState&); private: + ScriptPromise getCharacteristicsImpl(ScriptState*, String characteristicUUID); + OwnPtr<WebBluetoothRemoteGATTService> m_webService; };
diff --git a/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTService.idl b/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTService.idl index 6579a6c..281e5bb 100644 --- a/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTService.idl +++ b/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTService.idl
@@ -17,7 +17,7 @@ // the original device. // readonly attribute BluetoothDevice device; [RaisesException, CallWith=ScriptState] Promise<BluetoothRemoteGATTCharacteristic> getCharacteristic(BluetoothCharacteristicUUID characteristic); - // Promise<sequence<BluetoothRemoteGATTCharacteristic>> getCharacteristics(optional BluetoothCharacteristicUUID characteristic); + [RaisesException, CallWith=ScriptState] Promise<sequence<BluetoothRemoteGATTCharacteristic>> getCharacteristics(optional BluetoothCharacteristicUUID characteristic); // Promise<BluetoothRemoteGATTService> getIncludedService(BluetoothServiceUUID service); // Promise<sequence<BluetoothRemoteGATTService>> getIncludedServices(optional BluetoothServiceUUID service); };
diff --git a/third_party/WebKit/Source/modules/encryptedmedia/HTMLMediaElementEncryptedMedia.cpp b/third_party/WebKit/Source/modules/encryptedmedia/HTMLMediaElementEncryptedMedia.cpp index ac87706..b143bf7 100644 --- a/third_party/WebKit/Source/modules/encryptedmedia/HTMLMediaElementEncryptedMedia.cpp +++ b/third_party/WebKit/Source/modules/encryptedmedia/HTMLMediaElementEncryptedMedia.cpp
@@ -119,7 +119,7 @@ { WTF_LOG(Media, "SetMediaKeysHandler::SetMediaKeysHandler"); - // 3. Run the remaining steps asynchronously. + // 5. Run the following steps in parallel. m_timer.startOneShot(0, BLINK_FROM_HERE); } @@ -137,12 +137,14 @@ WTF_LOG(Media, "SetMediaKeysHandler::clearExistingMediaKeys"); HTMLMediaElementEncryptedMedia& thisElement = HTMLMediaElementEncryptedMedia::from(*m_element); - // 3.1 If mediaKeys is not null, it is already in use by another media - // element, and the user agent is unable to use it with this element, - // reject promise with a new DOMException whose name is - // "QuotaExceededError". + // 5.1 If mediaKeys is not null, the CDM instance represented by + // mediaKeys is already in use by another media element, and + // the user agent is unable to use it with this element, let + // this object's attaching media keys value be false and + // reject promise with a QuotaExceededError. if (m_newMediaKeys) { if (!m_newMediaKeys->reserveForMediaElement(m_element.get())) { + thisElement.m_isAttachingMediaKeys = false; fail(QuotaExceededError, "The MediaKeys object is already in use by another media element."); return; } @@ -151,17 +153,17 @@ m_madeReservation = true; } - // 3.2 If the mediaKeys attribute is not null, run the following steps: + // 5.2 If the mediaKeys attribute is not null, run the following steps: if (thisElement.m_mediaKeys) { WebMediaPlayer* mediaPlayer = m_element->webMediaPlayer(); if (mediaPlayer) { - // 3.2.1 If the user agent or CDM do not support removing the - // association, return a promise rejected with a new - // DOMException whose name is "NotSupportedError". - // 3.2.2 If the association cannot currently be removed (i.e. - // during playback), return a promise rejected with a new - // DOMException whose name is "InvalidStateError". - // 3.2.3 Stop using the CDM instance represented by the mediaKeys + // 5.2.1 If the user agent or CDM do not support removing the + // association, let this object's attaching media keys + // value be false and reject promise with a NotSupportedError. + // 5.2.2 If the association cannot currently be removed, + // let this object's attaching media keys value be false + // and reject promise with an InvalidStateError. + // 5.2.3 Stop using the CDM instance represented by the mediaKeys // attribute to decrypt media data and remove the association // with the media element. // (All 3 steps handled as needed in Chromium.) @@ -183,16 +185,14 @@ { WTF_LOG(Media, "SetMediaKeysHandler::setNewMediaKeys"); - // 3.3 If mediaKeys is not null, run the following steps: + // 5.3 If mediaKeys is not null, run the following steps: if (m_newMediaKeys) { - // 3.3.1 Associate the CDM instance represented by mediaKeys with the + // 5.3.1 Associate the CDM instance represented by mediaKeys with the // media element for decrypting media data. - // 3.3.2 If the preceding step failed, run the following steps: + // 5.3.2 If the preceding step failed, run the following steps: // (done in setFailed()). - // 3.3.3 Run the Attempt to Resume Playback If Necessary algorithm on - // the media element. The user agent may choose to skip this - // step if it knows resuming will fail (i.e. mediaKeys has no - // sessions). + // 5.3.3 Queue a task to run the Attempt to Resume Playback If Necessary + // algorithm on the media element. // (Handled in Chromium). if (m_element->webMediaPlayer()) { OwnPtr<SuccessCallback> successCallback = bind(&SetMediaKeysHandler::finish, this); @@ -214,14 +214,17 @@ WTF_LOG(Media, "SetMediaKeysHandler::finish"); HTMLMediaElementEncryptedMedia& thisElement = HTMLMediaElementEncryptedMedia::from(*m_element); - // 3.4 Set the mediaKeys attribute to mediaKeys. + // 5.4 Set the mediaKeys attribute to mediaKeys. if (thisElement.m_mediaKeys) thisElement.m_mediaKeys->clearMediaElement(); thisElement.m_mediaKeys = m_newMediaKeys; if (m_madeReservation) m_newMediaKeys->acceptReservation(); - // 3.5 Resolve promise with undefined. + // 5.5 Let this object's attaching media keys value be false. + thisElement.m_isAttachingMediaKeys = false; + + // 5.6 Resolve promise with undefined. resolve(); } @@ -231,6 +234,9 @@ if (m_madeReservation) m_newMediaKeys->cancelReservation(); + // Make sure attaching media keys value is false. + DCHECK(!HTMLMediaElementEncryptedMedia::from(*m_element).m_isAttachingMediaKeys); + // Reject promise with an appropriate error. reject(DOMException::create(code, errorMessage)); } @@ -238,11 +244,12 @@ void SetMediaKeysHandler::clearFailed(ExceptionCode code, const String& errorMessage) { WTF_LOG(Media, "SetMediaKeysHandler::clearFailed (%d, %s)", code, errorMessage.ascii().data()); + HTMLMediaElementEncryptedMedia& thisElement = HTMLMediaElementEncryptedMedia::from(*m_element); - // 3.2.4 If the preceding step failed (in setContentDecryptionModule() - // called from clearExistingMediaKeys()), reject promise with a new - // DOMException whose name is the appropriate error name and that - // has an appropriate message. + // 5.2.4 If the preceding step failed, let this object's attaching media + // keys value be false and reject promise with an appropriate + // error name. + thisElement.m_isAttachingMediaKeys = false; fail(code, errorMessage); } @@ -251,13 +258,16 @@ WTF_LOG(Media, "SetMediaKeysHandler::setFailed (%d, %s)", code, errorMessage.ascii().data()); HTMLMediaElementEncryptedMedia& thisElement = HTMLMediaElementEncryptedMedia::from(*m_element); - // 3.3.2 If the preceding step failed (in setContentDecryptionModule() + // 5.3.2 If the preceding step failed (in setContentDecryptionModule() // called from setNewMediaKeys()), run the following steps: - // 3.3.2.1 Set the mediaKeys attribute to null. + // 5.3.2.1 Set the mediaKeys attribute to null. thisElement.m_mediaKeys.clear(); - // 3.3.2.2 Reject promise with a new DOMException whose name is the - // appropriate error name and that has an appropriate message. + // 5.3.2.2 Let this object's attaching media keys value be false. + thisElement.m_isAttachingMediaKeys = false; + + // 5.3.2.3 Reject promise with a new DOMException whose name is the + // appropriate error name. fail(code, errorMessage); } @@ -271,6 +281,7 @@ HTMLMediaElementEncryptedMedia::HTMLMediaElementEncryptedMedia(HTMLMediaElement& element) : m_mediaElement(&element) , m_isWaitingForKey(false) + , m_isAttachingMediaKeys(false) { } @@ -309,12 +320,24 @@ HTMLMediaElementEncryptedMedia& thisElement = HTMLMediaElementEncryptedMedia::from(element); WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::setMediaKeys current(%p), new(%p)", thisElement.m_mediaKeys.get(), mediaKeys); - // 1. If mediaKeys and the mediaKeys attribute are the same object, return - // a promise resolved with undefined. + // From http://w3c.github.io/encrypted-media/#setMediaKeys + + // 1. If mediaKeys and the mediaKeys attribute are the same object, + // return a resolved promise. if (thisElement.m_mediaKeys == mediaKeys) return ScriptPromise::cast(scriptState, v8::Undefined(scriptState->isolate())); - // 2. Let promise be a new promise. Remaining steps done in handler. + // 2. If this object's attaching media keys value is true, return a + // promise rejected with an InvalidStateError. + if (thisElement.m_isAttachingMediaKeys) { + return ScriptPromise::rejectWithDOMException( + scriptState, DOMException::create(InvalidStateError, "Another request is in progress.")); + } + + // 3. Let this object's attaching media keys value be true. + thisElement.m_isAttachingMediaKeys = true; + + // 4. Let promise be a new promise. Remaining steps done in handler. return SetMediaKeysHandler::create(scriptState, element, mediaKeys); }
diff --git a/third_party/WebKit/Source/modules/encryptedmedia/HTMLMediaElementEncryptedMedia.h b/third_party/WebKit/Source/modules/encryptedmedia/HTMLMediaElementEncryptedMedia.h index 5664b37..7d4682a 100644 --- a/third_party/WebKit/Source/modules/encryptedmedia/HTMLMediaElementEncryptedMedia.h +++ b/third_party/WebKit/Source/modules/encryptedmedia/HTMLMediaElementEncryptedMedia.h
@@ -56,7 +56,13 @@ RawPtrWillBeMember<HTMLMediaElement> m_mediaElement; + // Internal values specified by the EME spec: + // http://w3c.github.io/encrypted-media/#idl-def-HTMLMediaElement + // The following internal values are added to the HTMLMediaElement: + // - waiting for key, which shall have a boolean value + // - attaching media keys, which shall have a boolean value bool m_isWaitingForKey; + bool m_isAttachingMediaKeys; PersistentWillBeMember<MediaKeys> m_mediaKeys; };
diff --git a/third_party/WebKit/Source/modules/fetch/CompositeDataConsumerHandle.cpp b/third_party/WebKit/Source/modules/fetch/CompositeDataConsumerHandle.cpp index 3dba2104..b5d68149 100644 --- a/third_party/WebKit/Source/modules/fetch/CompositeDataConsumerHandle.cpp +++ b/third_party/WebKit/Source/modules/fetch/CompositeDataConsumerHandle.cpp
@@ -4,9 +4,9 @@ #include "modules/fetch/CompositeDataConsumerHandle.h" -#include "platform/Task.h" #include "platform/ThreadSafeFunctional.h" #include "public/platform/Platform.h" +#include "public/platform/WebTaskRunner.h" #include "public/platform/WebThread.h" #include "public/platform/WebTraceLocation.h" #include "wtf/Locker.h" @@ -140,7 +140,7 @@ return; } ++m_token; - m_readerThread->taskRunner()->postTask(BLINK_FROM_HERE, new Task(threadSafeBind(&Context::updateReader, this, m_token))); + m_readerThread->taskRunner()->postTask(BLINK_FROM_HERE, threadSafeBind(&Context::updateReader, this, m_token)); } OwnPtr<Reader> m_reader;
diff --git a/third_party/WebKit/Source/modules/fetch/CompositeDataConsumerHandleTest.cpp b/third_party/WebKit/Source/modules/fetch/CompositeDataConsumerHandleTest.cpp index f6c0e385..c5e9a41 100644 --- a/third_party/WebKit/Source/modules/fetch/CompositeDataConsumerHandleTest.cpp +++ b/third_party/WebKit/Source/modules/fetch/CompositeDataConsumerHandleTest.cpp
@@ -5,7 +5,6 @@ #include "modules/fetch/CompositeDataConsumerHandle.h" #include "modules/fetch/DataConsumerHandleTestUtil.h" -#include "platform/Task.h" #include "platform/ThreadSafeFunctional.h" #include "platform/WaitableEvent.h" #include "platform/heap/Handle.h" @@ -60,8 +59,8 @@ ThreadHolder holder(this); m_waitableEvent = adoptPtr(new WaitableEvent()); - postTaskToUpdatingThreadAndWait(BLINK_FROM_HERE, new Task(threadSafeBind(&Self::createHandle, this))); - postTaskToReadingThreadAndWait(BLINK_FROM_HERE, new Task(threadSafeBind(&Self::obtainReader, this))); + postTaskToUpdatingThreadAndWait(BLINK_FROM_HERE, threadSafeBind(&Self::createHandle, this)); + postTaskToReadingThreadAndWait(BLINK_FROM_HERE, threadSafeBind(&Self::obtainReader, this)); } private: @@ -75,14 +74,14 @@ void obtainReader() { m_reader = m_handle->obtainReader(&m_client); - postTaskToUpdatingThread(BLINK_FROM_HERE, new Task(threadSafeBind(&Self::update, this))); + postTaskToUpdatingThread(BLINK_FROM_HERE, threadSafeBind(&Self::update, this)); } void update() { m_updater->update(DataConsumerHandle::create("handle2", m_context)); m_updater.clear(); - postTaskToReadingThread(BLINK_FROM_HERE, new Task(threadSafeBind(&Self::resetReader, this))); - postTaskToReadingThread(BLINK_FROM_HERE, new Task(threadSafeBind(&Self::signalDone, this))); + postTaskToReadingThread(BLINK_FROM_HERE, threadSafeBind(&Self::resetReader, this)); + postTaskToReadingThread(BLINK_FROM_HERE, threadSafeBind(&Self::signalDone, this)); } OwnPtr<WebDataConsumerHandle> m_handle; @@ -99,8 +98,8 @@ ThreadHolder holder(this); m_waitableEvent = adoptPtr(new WaitableEvent()); - postTaskToUpdatingThreadAndWait(BLINK_FROM_HERE, new Task(threadSafeBind(&Self::createHandle, this))); - postTaskToReadingThreadAndWait(BLINK_FROM_HERE, new Task(threadSafeBind(&Self::obtainReader, this))); + postTaskToUpdatingThreadAndWait(BLINK_FROM_HERE, threadSafeBind(&Self::createHandle, this)); + postTaskToReadingThreadAndWait(BLINK_FROM_HERE, threadSafeBind(&Self::obtainReader, this)); } private: @@ -115,15 +114,15 @@ void obtainReader() { m_reader = m_handle->obtainReader(&m_client); - postTaskToUpdatingThread(BLINK_FROM_HERE, new Task(threadSafeBind(&Self::update, this))); + postTaskToUpdatingThread(BLINK_FROM_HERE, threadSafeBind(&Self::update, this)); } void update() { m_updater->update(DataConsumerHandle::create("handle2", m_context)); m_updater.clear(); m_handle = nullptr; - postTaskToReadingThread(BLINK_FROM_HERE, new Task(threadSafeBind(&Self::resetReader, this))); - postTaskToReadingThread(BLINK_FROM_HERE, new Task(threadSafeBind(&Self::signalDone, this))); + postTaskToReadingThread(BLINK_FROM_HERE, threadSafeBind(&Self::resetReader, this)); + postTaskToReadingThread(BLINK_FROM_HERE, threadSafeBind(&Self::signalDone, this)); } OwnPtr<WebDataConsumerHandle> m_handle; @@ -140,8 +139,8 @@ ThreadHolder holder(this); m_waitableEvent = adoptPtr(new WaitableEvent()); - postTaskToUpdatingThreadAndWait(BLINK_FROM_HERE, new Task(threadSafeBind(&Self::createHandle, this))); - postTaskToReadingThreadAndWait(BLINK_FROM_HERE, new Task(threadSafeBind(&Self::obtainReader, this))); + postTaskToUpdatingThreadAndWait(BLINK_FROM_HERE, threadSafeBind(&Self::createHandle, this)); + postTaskToReadingThreadAndWait(BLINK_FROM_HERE, threadSafeBind(&Self::obtainReader, this)); } private: @@ -156,15 +155,15 @@ void obtainReader() { m_reader = m_handle->obtainReader(&m_client); - postTaskToUpdatingThread(BLINK_FROM_HERE, new Task(threadSafeBind(&Self::update, this))); + postTaskToUpdatingThread(BLINK_FROM_HERE, threadSafeBind(&Self::update, this)); } void update() { - postTaskToReadingThread(BLINK_FROM_HERE, new Task(threadSafeBind(&Self::resetReader, this))); + postTaskToReadingThread(BLINK_FROM_HERE, threadSafeBind(&Self::resetReader, this)); m_updater->update(DataConsumerHandle::create("handle2", m_context)); m_updater.clear(); - postTaskToReadingThread(BLINK_FROM_HERE, new Task(threadSafeBind(&Self::resetReader, this))); - postTaskToReadingThread(BLINK_FROM_HERE, new Task(threadSafeBind(&Self::signalDone, this))); + postTaskToReadingThread(BLINK_FROM_HERE, threadSafeBind(&Self::resetReader, this)); + postTaskToReadingThread(BLINK_FROM_HERE, threadSafeBind(&Self::signalDone, this)); } OwnPtr<WebDataConsumerHandle> m_handle; @@ -182,8 +181,8 @@ m_waitableEvent = adoptPtr(new WaitableEvent()); m_updateEvent = adoptPtr(new WaitableEvent()); - postTaskToUpdatingThreadAndWait(BLINK_FROM_HERE, new Task(threadSafeBind(&Self::createHandle, this))); - postTaskToReadingThreadAndWait(BLINK_FROM_HERE, new Task(threadSafeBind(&Self::obtainReader, this))); + postTaskToUpdatingThreadAndWait(BLINK_FROM_HERE, threadSafeBind(&Self::createHandle, this)); + postTaskToReadingThreadAndWait(BLINK_FROM_HERE, threadSafeBind(&Self::obtainReader, this)); } private: @@ -198,17 +197,17 @@ void obtainReader() { m_reader = m_handle->obtainReader(&m_client); - postTaskToUpdatingThread(BLINK_FROM_HERE, new Task(threadSafeBind(&Self::update, this))); + postTaskToUpdatingThread(BLINK_FROM_HERE, threadSafeBind(&Self::update, this)); m_updateEvent->wait(); } void update() { - postTaskToReadingThread(BLINK_FROM_HERE, new Task(threadSafeBind(&Self::reobtainReader, this))); + postTaskToReadingThread(BLINK_FROM_HERE, threadSafeBind(&Self::reobtainReader, this)); m_updater->update(DataConsumerHandle::create("handle2", m_context)); m_updater.clear(); - postTaskToReadingThread(BLINK_FROM_HERE, new Task(threadSafeBind(&Self::resetReader, this))); - postTaskToReadingThread(BLINK_FROM_HERE, new Task(threadSafeBind(&Self::signalDone, this))); + postTaskToReadingThread(BLINK_FROM_HERE, threadSafeBind(&Self::resetReader, this)); + postTaskToReadingThread(BLINK_FROM_HERE, threadSafeBind(&Self::signalDone, this)); m_updateEvent->signal(); } @@ -234,8 +233,8 @@ m_waitableEvent = adoptPtr(new WaitableEvent()); m_updateEvent = adoptPtr(new WaitableEvent()); - postTaskToUpdatingThreadAndWait(BLINK_FROM_HERE, new Task(threadSafeBind(&Self::createHandle, this))); - postTaskToReadingThreadAndWait(BLINK_FROM_HERE, new Task(threadSafeBind(&Self::obtainReader, this))); + postTaskToUpdatingThreadAndWait(BLINK_FROM_HERE, threadSafeBind(&Self::createHandle, this)); + postTaskToReadingThreadAndWait(BLINK_FROM_HERE, threadSafeBind(&Self::obtainReader, this)); } private: @@ -250,7 +249,7 @@ void obtainReader() { m_reader = m_handle->obtainReader(&m_client); - postTaskToUpdatingThread(BLINK_FROM_HERE, new Task(threadSafeBind(&Self::update, this))); + postTaskToUpdatingThread(BLINK_FROM_HERE, threadSafeBind(&Self::update, this)); // Stalls this thread while updating handles. m_updateEvent->wait(); } @@ -260,8 +259,8 @@ m_updater->update(DataConsumerHandle::create("handle3", m_context)); m_updateEvent->signal(); m_updater.clear(); - postTaskToReadingThread(BLINK_FROM_HERE, new Task(threadSafeBind(&Self::resetReader, this))); - postTaskToReadingThread(BLINK_FROM_HERE, new Task(threadSafeBind(&Self::signalDone, this))); + postTaskToReadingThread(BLINK_FROM_HERE, threadSafeBind(&Self::resetReader, this)); + postTaskToReadingThread(BLINK_FROM_HERE, threadSafeBind(&Self::signalDone, this)); } OwnPtr<WebDataConsumerHandle> m_handle;
diff --git a/third_party/WebKit/Source/modules/fetch/DataConsumerHandleTestUtil.cpp b/third_party/WebKit/Source/modules/fetch/DataConsumerHandleTestUtil.cpp index b526e10..2a839c7 100644 --- a/third_party/WebKit/Source/modules/fetch/DataConsumerHandleTestUtil.cpp +++ b/third_party/WebKit/Source/modules/fetch/DataConsumerHandleTestUtil.cpp
@@ -13,13 +13,13 @@ , m_initializationPolicy(initializationPolicy) , m_waitableEvent(adoptPtr(new WaitableEvent())) { - m_thread->postTask(BLINK_FROM_HERE, new Task(threadSafeBind(&Thread::initialize, AllowCrossThreadAccess(this)))); + m_thread->postTask(BLINK_FROM_HERE, threadSafeBind(&Thread::initialize, AllowCrossThreadAccess(this))); m_waitableEvent->wait(); } DataConsumerHandleTestUtil::Thread::~Thread() { - m_thread->postTask(BLINK_FROM_HERE, new Task(threadSafeBind(&Thread::shutdown, AllowCrossThreadAccess(this)))); + m_thread->postTask(BLINK_FROM_HERE, threadSafeBind(&Thread::shutdown, AllowCrossThreadAccess(this))); m_waitableEvent->wait(); } @@ -193,7 +193,7 @@ if (!m_client) return; ASSERT(m_readerThread); - m_readerThread->taskRunner()->postTask(BLINK_FROM_HERE, new Task(threadSafeBind(&Context::notifyInternal, this))); + m_readerThread->taskRunner()->postTask(BLINK_FROM_HERE, threadSafeBind(&Context::notifyInternal, this)); } void DataConsumerHandleTestUtil::ReplayingHandle::Context::notifyInternal() @@ -250,7 +250,7 @@ } OwnPtr<HandleReadResult> result = adoptPtr(new HandleReadResult(r, m_data)); m_data.clear(); - Platform::current()->currentThread()->taskRunner()->postTask(BLINK_FROM_HERE, new Task(bind(&HandleReader::runOnFinishedReading, this, result.release()))); + Platform::current()->currentThread()->taskRunner()->postTask(BLINK_FROM_HERE, bind(&HandleReader::runOnFinishedReading, this, result.release())); m_reader = nullptr; } @@ -284,7 +284,7 @@ } OwnPtr<HandleReadResult> result = adoptPtr(new HandleReadResult(r, m_data)); m_data.clear(); - Platform::current()->currentThread()->taskRunner()->postTask(BLINK_FROM_HERE, new Task(bind(&HandleTwoPhaseReader::runOnFinishedReading, this, result.release()))); + Platform::current()->currentThread()->taskRunner()->postTask(BLINK_FROM_HERE, bind(&HandleTwoPhaseReader::runOnFinishedReading, this, result.release())); m_reader = nullptr; }
diff --git a/third_party/WebKit/Source/modules/fetch/DataConsumerHandleTestUtil.h b/third_party/WebKit/Source/modules/fetch/DataConsumerHandleTestUtil.h index 50704e3..66fd9696 100644 --- a/third_party/WebKit/Source/modules/fetch/DataConsumerHandleTestUtil.h +++ b/third_party/WebKit/Source/modules/fetch/DataConsumerHandleTestUtil.h
@@ -11,7 +11,6 @@ #include "modules/fetch/DataConsumerHandleUtil.h" #include "modules/fetch/FetchDataConsumerHandle.h" #include "modules/fetch/FetchDataLoader.h" -#include "platform/Task.h" #include "platform/ThreadSafeFunctional.h" #include "platform/WaitableEvent.h" #include "platform/WebThreadSupportingGC.h" @@ -116,13 +115,13 @@ ASSERT(m_holder); m_holder = nullptr; } - void postTaskToReadingThread(const WebTraceLocation& location, Task* task) + void postTaskToReadingThread(const WebTraceLocation& location, PassOwnPtr<Closure> task) { MutexLocker locker(m_holderMutex); ASSERT(m_holder); m_holder->readingThread()->postTask(location, task); } - void postTaskToUpdatingThread(const WebTraceLocation& location, Task* task) + void postTaskToUpdatingThread(const WebTraceLocation& location, PassOwnPtr<Closure> task) { MutexLocker locker(m_holderMutex); ASSERT(m_holder); @@ -219,20 +218,20 @@ void resetReader() { m_reader = nullptr; } void signalDone() { m_waitableEvent->signal(); } const String& result() { return m_context->result(); } - void postTaskToReadingThread(const WebTraceLocation& location, Task* task) + void postTaskToReadingThread(const WebTraceLocation& location, PassOwnPtr<Closure> task) { m_context->postTaskToReadingThread(location, task); } - void postTaskToUpdatingThread(const WebTraceLocation& location, Task* task) + void postTaskToUpdatingThread(const WebTraceLocation& location, PassOwnPtr<Closure> task) { m_context->postTaskToUpdatingThread(location, task); } - void postTaskToReadingThreadAndWait(const WebTraceLocation& location, Task* task) + void postTaskToReadingThreadAndWait(const WebTraceLocation& location, PassOwnPtr<Closure> task) { postTaskToReadingThread(location, task); m_waitableEvent->wait(); } - void postTaskToUpdatingThreadAndWait(const WebTraceLocation& location, Task* task) + void postTaskToUpdatingThreadAndWait(const WebTraceLocation& location, PassOwnPtr<Closure> task) { postTaskToUpdatingThread(location, task); m_waitableEvent->wait(); @@ -258,7 +257,7 @@ m_waitableEvent = adoptPtr(new WaitableEvent()); m_handle = handle; - postTaskToReadingThreadAndWait(BLINK_FROM_HERE, new Task(threadSafeBind(&Self::obtainReader, this))); + postTaskToReadingThreadAndWait(BLINK_FROM_HERE, threadSafeBind(&Self::obtainReader, this)); } private: @@ -269,8 +268,8 @@ } void didGetReadable() override { - postTaskToReadingThread(BLINK_FROM_HERE, new Task(threadSafeBind(&Self::resetReader, this))); - postTaskToReadingThread(BLINK_FROM_HERE, new Task(threadSafeBind(&Self::signalDone, this))); + postTaskToReadingThread(BLINK_FROM_HERE, threadSafeBind(&Self::resetReader, this)); + postTaskToReadingThread(BLINK_FROM_HERE, threadSafeBind(&Self::signalDone, this)); } OwnPtr<WebDataConsumerHandle> m_handle; @@ -287,7 +286,7 @@ m_waitableEvent = adoptPtr(new WaitableEvent()); m_handle = handle; - postTaskToReadingThreadAndWait(BLINK_FROM_HERE, new Task(threadSafeBind(&Self::obtainReader, this))); + postTaskToReadingThreadAndWait(BLINK_FROM_HERE, threadSafeBind(&Self::obtainReader, this)); } private: @@ -296,7 +295,7 @@ { m_reader = m_handle->obtainReader(this); m_reader = nullptr; - postTaskToReadingThread(BLINK_FROM_HERE, new Task(threadSafeBind(&Self::signalDone, this))); + postTaskToReadingThread(BLINK_FROM_HERE, threadSafeBind(&Self::signalDone, this)); } void didGetReadable() override { @@ -501,7 +500,7 @@ , m_event(adoptPtr(new WaitableEvent())) , m_isDone(false) { - m_thread->thread()->postTask(BLINK_FROM_HERE, new Task(threadSafeBind(&HandleReaderRunner::start, AllowCrossThreadAccess(this), handle))); + m_thread->thread()->postTask(BLINK_FROM_HERE, threadSafeBind(&HandleReaderRunner::start, AllowCrossThreadAccess(this), handle)); } ~HandleReaderRunner() {
diff --git a/third_party/WebKit/Source/modules/fetch/DataConsumerHandleUtil.cpp b/third_party/WebKit/Source/modules/fetch/DataConsumerHandleUtil.cpp index a18b431..88d3860 100644 --- a/third_party/WebKit/Source/modules/fetch/DataConsumerHandleUtil.cpp +++ b/third_party/WebKit/Source/modules/fetch/DataConsumerHandleUtil.cpp
@@ -4,9 +4,9 @@ #include "modules/fetch/DataConsumerHandleUtil.h" -#include "platform/Task.h" #include "platform/blob/BlobData.h" #include "public/platform/Platform.h" +#include "public/platform/WebTaskRunner.h" #include "public/platform/WebThread.h" #include "public/platform/WebTraceLocation.h" #include "wtf/Functional.h" @@ -129,7 +129,7 @@ return; // Note we don't need thread safety here because this object is // bound to the current thread. - Platform::current()->currentThread()->taskRunner()->postTask(BLINK_FROM_HERE, new Task(bind(&NotifyOnReaderCreationHelper::notify, m_factory.createWeakPtr(), client))); + Platform::current()->currentThread()->taskRunner()->postTask(BLINK_FROM_HERE, bind(&NotifyOnReaderCreationHelper::notify, m_factory.createWeakPtr(), client)); } void NotifyOnReaderCreationHelper::notify(WebDataConsumerHandle::Client* client)
diff --git a/third_party/WebKit/Source/modules/fetch/DataConsumerTee.cpp b/third_party/WebKit/Source/modules/fetch/DataConsumerTee.cpp index 3aa54b4a..39b41f7 100644 --- a/third_party/WebKit/Source/modules/fetch/DataConsumerTee.cpp +++ b/third_party/WebKit/Source/modules/fetch/DataConsumerTee.cpp
@@ -8,10 +8,10 @@ #include "core/dom/ExecutionContext.h" #include "modules/fetch/DataConsumerHandleUtil.h" #include "modules/fetch/FetchBlobDataConsumerHandle.h" -#include "platform/Task.h" #include "platform/ThreadSafeFunctional.h" #include "platform/heap/Handle.h" #include "public/platform/Platform.h" +#include "public/platform/WebTaskRunner.h" #include "public/platform/WebThread.h" #include "public/platform/WebTraceLocation.h" #include "wtf/Deque.h" @@ -183,7 +183,7 @@ } ASSERT(m_readerThread); if (!m_readerThread->isCurrentThread()) { - m_readerThread->taskRunner()->postTask(BLINK_FROM_HERE, new Task(threadSafeBind(&DestinationContext::notify, this))); + m_readerThread->taskRunner()->postTask(BLINK_FROM_HERE, threadSafeBind(&DestinationContext::notify, this)); return; } } @@ -270,7 +270,7 @@ // We need to use threadSafeBind here to retain the context. Note // |context()| return value is of type DestinationContext*, not // PassRefPtr<DestinationContext>. - Platform::current()->currentThread()->taskRunner()->postTask(BLINK_FROM_HERE, new Task(threadSafeBind(&DestinationContext::notify, context()))); + Platform::current()->currentThread()->taskRunner()->postTask(BLINK_FROM_HERE, threadSafeBind(&DestinationContext::notify, context())); } } ~DestinationReader() override
diff --git a/third_party/WebKit/Source/modules/fetch/DataConsumerTeeTest.cpp b/third_party/WebKit/Source/modules/fetch/DataConsumerTeeTest.cpp index fb261c5..e80ffd7c 100644 --- a/third_party/WebKit/Source/modules/fetch/DataConsumerTeeTest.cpp +++ b/third_party/WebKit/Source/modules/fetch/DataConsumerTeeTest.cpp
@@ -7,7 +7,6 @@ #include "core/testing/DummyPageHolder.h" #include "core/testing/NullExecutionContext.h" #include "modules/fetch/DataConsumerHandleTestUtil.h" -#include "platform/Task.h" #include "platform/ThreadSafeFunctional.h" #include "platform/WaitableEvent.h" #include "platform/WebThreadSupportingGC.h" @@ -58,7 +57,7 @@ { m_thread = adoptPtr(new Thread("src thread", Thread::WithExecutionContext)); m_waitableEvent = adoptPtr(new WaitableEvent()); - m_thread->thread()->postTask(BLINK_FROM_HERE, new Task(threadSafeBind(&TeeCreationThread<Handle>::runInternal, AllowCrossThreadAccess(this), src, AllowCrossThreadAccess(dest1), AllowCrossThreadAccess(dest2)))); + m_thread->thread()->postTask(BLINK_FROM_HERE, threadSafeBind(&TeeCreationThread<Handle>::runInternal, AllowCrossThreadAccess(this), src, AllowCrossThreadAccess(dest1), AllowCrossThreadAccess(dest2))); m_waitableEvent->wait(); } @@ -213,7 +212,7 @@ // We can pass a raw pointer because the subsequent |wait| calls ensure // t->thread() is alive. - t->thread()->thread()->postTask(BLINK_FROM_HERE, new Task(threadSafeBind(postStop, AllowCrossThreadAccess(t->thread())))); + t->thread()->thread()->postTask(BLINK_FROM_HERE, threadSafeBind(postStop, AllowCrossThreadAccess(t->thread()))); OwnPtr<HandleReadResult> res1 = r1.wait(); OwnPtr<HandleReadResult> res2 = r2.wait();
diff --git a/third_party/WebKit/Source/modules/fetch/FetchManager.cpp b/third_party/WebKit/Source/modules/fetch/FetchManager.cpp index f980ff7..2556742 100644 --- a/third_party/WebKit/Source/modules/fetch/FetchManager.cpp +++ b/third_party/WebKit/Source/modules/fetch/FetchManager.cpp
@@ -274,7 +274,6 @@ responseData->headerList()->append(it.key, it.value); responseData->setURL(response.url()); responseData->setMIMEType(response.mimeType()); - responseData->setResponseTime(response.responseTime()); FetchResponseData* taintedResponse = nullptr;
diff --git a/third_party/WebKit/Source/modules/fetch/FetchResponseData.cpp b/third_party/WebKit/Source/modules/fetch/FetchResponseData.cpp index 09da38b..45d5dc22 100644 --- a/third_party/WebKit/Source/modules/fetch/FetchResponseData.cpp +++ b/third_party/WebKit/Source/modules/fetch/FetchResponseData.cpp
@@ -168,7 +168,6 @@ newResponse->m_statusMessage = m_statusMessage; newResponse->m_headerList = m_headerList->clone(); newResponse->m_mimeType = m_mimeType; - newResponse->m_responseTime = m_responseTime; switch (m_type) { case BasicType: @@ -217,7 +216,6 @@ response.setStatus(status()); response.setStatusText(statusMessage()); response.setResponseType(fetchTypeToWebType(m_type)); - response.setResponseTime(responseTime()); for (size_t i = 0; i < headerList()->size(); ++i) { const FetchHeaderList::Header* header = headerList()->list()[i].get(); response.appendHeader(header->first, header->second); @@ -229,7 +227,6 @@ , m_status(status) , m_statusMessage(statusMessage) , m_headerList(FetchHeaderList::create()) - , m_responseTime(0) { }
diff --git a/third_party/WebKit/Source/modules/fetch/FetchResponseData.h b/third_party/WebKit/Source/modules/fetch/FetchResponseData.h index f696711..54e07510 100644 --- a/third_party/WebKit/Source/modules/fetch/FetchResponseData.h +++ b/third_party/WebKit/Source/modules/fetch/FetchResponseData.h
@@ -50,13 +50,11 @@ String mimeType() const; BodyStreamBuffer* internalBuffer() const; String internalMIMEType() const; - int64_t responseTime() const { return m_responseTime; } void setURL(const KURL& url) { m_url = url; } void setStatus(unsigned short status) { m_status = status; } void setStatusMessage(AtomicString statusMessage) { m_statusMessage = statusMessage; } void setMIMEType(const String& type) { m_mimeType = type; } - void setResponseTime(int64_t responseTime) { m_responseTime = responseTime; } // If the type is Default, replaces |m_buffer|. // If the type is Basic or CORS, replaces |m_buffer| and @@ -81,7 +79,6 @@ Member<FetchResponseData> m_internalResponse; Member<BodyStreamBuffer> m_buffer; String m_mimeType; - int64_t m_responseTime; }; } // namespace blink
diff --git a/third_party/WebKit/Source/modules/fetch/Response.cpp b/third_party/WebKit/Source/modules/fetch/Response.cpp index d9aa411e..71a5782 100644 --- a/third_party/WebKit/Source/modules/fetch/Response.cpp +++ b/third_party/WebKit/Source/modules/fetch/Response.cpp
@@ -45,7 +45,6 @@ response->setURL(webResponse.url()); response->setStatus(webResponse.status()); response->setStatusMessage(webResponse.statusText()); - response->setResponseTime(webResponse.responseTime()); for (HTTPHeaderMap::const_iterator i = webResponse.headers().begin(), end = webResponse.headers().end(); i != end; ++i) { response->headerList()->append(i->key, i->value);
diff --git a/third_party/WebKit/Source/modules/mediacapturefromelement/OnRequestCanvasDrawListener.cpp b/third_party/WebKit/Source/modules/mediacapturefromelement/OnRequestCanvasDrawListener.cpp index df9057a..4f81c7f 100644 --- a/third_party/WebKit/Source/modules/mediacapturefromelement/OnRequestCanvasDrawListener.cpp +++ b/third_party/WebKit/Source/modules/mediacapturefromelement/OnRequestCanvasDrawListener.cpp
@@ -4,11 +4,6 @@ #include "modules/mediacapturefromelement/OnRequestCanvasDrawListener.h" -#include "platform/Task.h" -#include "public/platform/Platform.h" -#include "public/platform/WebTaskRunner.h" -#include "public/platform/WebTraceLocation.h" - namespace blink { OnRequestCanvasDrawListener::OnRequestCanvasDrawListener(const PassOwnPtr<WebCanvasCaptureHandler>& handler)
diff --git a/third_party/WebKit/Source/modules/mediacapturefromelement/TimedCanvasDrawListener.cpp b/third_party/WebKit/Source/modules/mediacapturefromelement/TimedCanvasDrawListener.cpp index 28e9ca0..c57578a 100644 --- a/third_party/WebKit/Source/modules/mediacapturefromelement/TimedCanvasDrawListener.cpp +++ b/third_party/WebKit/Source/modules/mediacapturefromelement/TimedCanvasDrawListener.cpp
@@ -4,7 +4,6 @@ #include "modules/mediacapturefromelement/TimedCanvasDrawListener.h" -#include "platform/Task.h" #include "public/platform/Platform.h" #include "public/platform/WebTaskRunner.h" #include "public/platform/WebTraceLocation.h" @@ -36,7 +35,7 @@ void TimedCanvasDrawListener::postRequestFrameCaptureTask() { m_frameCaptureRequested = true; - Platform::current()->currentThread()->taskRunner()->postDelayedTask(BLINK_FROM_HERE, new Task(bind(&TimedCanvasDrawListener::postRequestFrameCaptureTask, this)), m_frameInterval); + Platform::current()->currentThread()->taskRunner()->postDelayedTask(BLINK_FROM_HERE, bind(&TimedCanvasDrawListener::postRequestFrameCaptureTask, this), m_frameInterval); } } // namespace blink
diff --git a/third_party/WebKit/Source/modules/modules.gypi b/third_party/WebKit/Source/modules/modules.gypi index 5b2dd28..5715144 100644 --- a/third_party/WebKit/Source/modules/modules.gypi +++ b/third_party/WebKit/Source/modules/modules.gypi
@@ -507,6 +507,7 @@ 'serviceworkers/ExtendableEventInit.idl', 'serviceworkers/ExtendableMessageEventInit.idl', 'serviceworkers/FetchEventInit.idl', + 'serviceworkers/ForeignFetchOptions.idl', 'serviceworkers/RegistrationOptions.idl', 'serviceworkers/ServiceWorkerMessageEventInit.idl', 'speech/SpeechRecognitionErrorInit.idl', @@ -668,6 +669,8 @@ '<(blink_modules_output_dir)/serviceworkers/ExtendableMessageEventInit.h', '<(blink_modules_output_dir)/serviceworkers/FetchEventInit.cpp', '<(blink_modules_output_dir)/serviceworkers/FetchEventInit.h', + '<(blink_modules_output_dir)/serviceworkers/ForeignFetchOptions.cpp', + '<(blink_modules_output_dir)/serviceworkers/ForeignFetchOptions.h', '<(blink_modules_output_dir)/serviceworkers/RegistrationOptions.cpp', '<(blink_modules_output_dir)/serviceworkers/RegistrationOptions.h', '<(blink_modules_output_dir)/serviceworkers/ServiceWorkerMessageEventInit.cpp',
diff --git a/third_party/WebKit/Source/modules/serviceworkers/ForeignFetchOptions.idl b/third_party/WebKit/Source/modules/serviceworkers/ForeignFetchOptions.idl new file mode 100644 index 0000000..61455fa --- /dev/null +++ b/third_party/WebKit/Source/modules/serviceworkers/ForeignFetchOptions.idl
@@ -0,0 +1,12 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// https://slightlyoff.github.io/ServiceWorker/spec/service_worker/index.html#dictdef-installevent-foreignfetchoptions + +[ + RuntimeEnabled=ForeignFetch +] dictionary ForeignFetchOptions { + required sequence<USVString> scopes; + required sequence<USVString> origins; +};
diff --git a/third_party/WebKit/Source/modules/serviceworkers/InstallEvent.cpp b/third_party/WebKit/Source/modules/serviceworkers/InstallEvent.cpp index 051f4a8..84715af 100644 --- a/third_party/WebKit/Source/modules/serviceworkers/InstallEvent.cpp +++ b/third_party/WebKit/Source/modules/serviceworkers/InstallEvent.cpp
@@ -30,23 +30,18 @@ { } -void InstallEvent::registerForeignFetchScopes(ExecutionContext* executionContext, const Vector<String>& subScopes, const USVStringOrUSVStringSequence& origins, ExceptionState& exceptionState) +void InstallEvent::registerForeignFetch(ExecutionContext* executionContext, const ForeignFetchOptions& options, ExceptionState& exceptionState) { if (!isBeingDispatched()) { exceptionState.throwDOMException(InvalidStateError, "The event handler is already finished."); return; } - Vector<String> originList; - if (origins.isUSVString()) { - originList.append(origins.getAsUSVString()); - } else if (origins.isUSVStringSequence()) { - originList = origins.getAsUSVStringSequence(); - } - if (originList.isEmpty()) { + if (!options.hasOrigins() || options.origins().isEmpty()) { exceptionState.throwTypeError("At least one origin is required"); return; } + const Vector<String>& originList = options.origins(); // The origins parameter is either just a "*" to indicate all origins, or an // explicit list of origins as absolute URLs. Internally an empty list of @@ -70,6 +65,11 @@ String scopePath = static_cast<KURL>(client->scope()).path(); RefPtr<SecurityOrigin> origin = executionContext->securityOrigin(); + if (!options.hasScopes() || options.scopes().isEmpty()) { + exceptionState.throwTypeError("At least one scope is required"); + return; + } + const Vector<String>& subScopes = options.scopes(); Vector<KURL> subScopeURLs(subScopes.size()); for (size_t i = 0; i < subScopes.size(); ++i) { subScopeURLs[i] = executionContext->completeURL(subScopes[i]);
diff --git a/third_party/WebKit/Source/modules/serviceworkers/InstallEvent.h b/third_party/WebKit/Source/modules/serviceworkers/InstallEvent.h index ddd96c9..345a9c4e 100644 --- a/third_party/WebKit/Source/modules/serviceworkers/InstallEvent.h +++ b/third_party/WebKit/Source/modules/serviceworkers/InstallEvent.h
@@ -8,6 +8,7 @@ #include "modules/EventModules.h" #include "modules/ModulesExport.h" #include "modules/serviceworkers/ExtendableEvent.h" +#include "modules/serviceworkers/ForeignFetchOptions.h" namespace blink { @@ -23,7 +24,7 @@ ~InstallEvent() override; - void registerForeignFetchScopes(ExecutionContext*, const Vector<String>& subScopes, const USVStringOrUSVStringSequence& origins, ExceptionState&); + void registerForeignFetch(ExecutionContext*, const ForeignFetchOptions&, ExceptionState&); const AtomicString& interfaceName() const override;
diff --git a/third_party/WebKit/Source/modules/serviceworkers/InstallEvent.idl b/third_party/WebKit/Source/modules/serviceworkers/InstallEvent.idl index dc9ee12..534fc7bb 100644 --- a/third_party/WebKit/Source/modules/serviceworkers/InstallEvent.idl +++ b/third_party/WebKit/Source/modules/serviceworkers/InstallEvent.idl
@@ -2,11 +2,12 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// https://slightlyoff.github.io/ServiceWorker/spec/service_worker/index.html#fetch-event-interface +// https://slightlyoff.github.io/ServiceWorker/spec/service_worker/index.html#installevent-installevent + [ Constructor(DOMString type, optional ExtendableEventInit eventInitDict), Exposed=ServiceWorker, RuntimeEnabled=ForeignFetch, ] interface InstallEvent : ExtendableEvent { - [CallWith=ExecutionContext, RaisesException] void registerForeignFetchScopes(sequence<USVString> subScopes, (USVString or sequence<USVString>) origins); + [CallWith=ExecutionContext, RaisesException] void registerForeignFetch(ForeignFetchOptions options); };
diff --git a/third_party/WebKit/Source/modules/storage/StorageArea.cpp b/third_party/WebKit/Source/modules/storage/StorageArea.cpp index 35e82b6..fae4403 100644 --- a/third_party/WebKit/Source/modules/storage/StorageArea.cpp +++ b/third_party/WebKit/Source/modules/storage/StorageArea.cpp
@@ -159,7 +159,7 @@ return m_storageArea->memoryBytesUsedByCache(); } -void StorageArea::dispatchLocalStorageEvent(const String& key, const String& oldValue, const String& newValue, SecurityOrigin* securityOrigin, const KURL& pageURL, WebStorageArea* sourceAreaInstance, bool originatedInProcess) +void StorageArea::dispatchLocalStorageEvent(const String& key, const String& oldValue, const String& newValue, SecurityOrigin* securityOrigin, const KURL& pageURL, WebStorageArea* sourceAreaInstance) { // Iterate over all pages that have a StorageNamespaceController supplement. for (Page* page : Page::ordinaryPages()) { @@ -190,7 +190,7 @@ return nullptr; } -void StorageArea::dispatchSessionStorageEvent(const String& key, const String& oldValue, const String& newValue, SecurityOrigin* securityOrigin, const KURL& pageURL, const WebStorageNamespace& sessionNamespace, WebStorageArea* sourceAreaInstance, bool originatedInProcess) +void StorageArea::dispatchSessionStorageEvent(const String& key, const String& oldValue, const String& newValue, SecurityOrigin* securityOrigin, const KURL& pageURL, const WebStorageNamespace& sessionNamespace, WebStorageArea* sourceAreaInstance) { Page* page = findPageWithSessionStorageNamespace(sessionNamespace); if (!page)
diff --git a/third_party/WebKit/Source/modules/storage/StorageArea.h b/third_party/WebKit/Source/modules/storage/StorageArea.h index 6415753..eed3283 100644 --- a/third_party/WebKit/Source/modules/storage/StorageArea.h +++ b/third_party/WebKit/Source/modules/storage/StorageArea.h
@@ -68,10 +68,9 @@ size_t memoryBytesUsedByCache(); static void dispatchLocalStorageEvent(const String& key, const String& oldValue, const String& newValue, - SecurityOrigin*, const KURL& pageURL, WebStorageArea* sourceAreaInstance, bool originatedInProcess); + SecurityOrigin*, const KURL& pageURL, WebStorageArea* sourceAreaInstance); static void dispatchSessionStorageEvent(const String& key, const String& oldValue, const String& newValue, - SecurityOrigin*, const KURL& pageURL, const WebStorageNamespace&, - WebStorageArea* sourceAreaInstance, bool originatedInProcess); + SecurityOrigin*, const KURL& pageURL, const WebStorageNamespace&, WebStorageArea* sourceAreaInstance); DECLARE_TRACE();
diff --git a/third_party/WebKit/Source/modules/webaudio/AsyncAudioDecoder.cpp b/third_party/WebKit/Source/modules/webaudio/AsyncAudioDecoder.cpp index 7da05af..b01feaa1 100644 --- a/third_party/WebKit/Source/modules/webaudio/AsyncAudioDecoder.cpp +++ b/third_party/WebKit/Source/modules/webaudio/AsyncAudioDecoder.cpp
@@ -27,7 +27,6 @@ #include "modules/webaudio/AbstractAudioContext.h" #include "modules/webaudio/AudioBuffer.h" #include "modules/webaudio/AudioBufferCallback.h" -#include "platform/Task.h" #include "platform/ThreadSafeFunctional.h" #include "platform/audio/AudioBus.h" #include "platform/audio/AudioFileReader.h" @@ -58,7 +57,7 @@ RefPtr<DOMArrayBuffer> audioDataRef(audioData); // The leak references to successCallback and errorCallback are picked up on notifyComplete. - m_thread->taskRunner()->postTask(BLINK_FROM_HERE, new Task(threadSafeBind(&AsyncAudioDecoder::decode, AllowCrossThreadAccess(audioDataRef.release().leakRef()), sampleRate, successCallback, errorCallback, resolver, context))); + m_thread->taskRunner()->postTask(BLINK_FROM_HERE, threadSafeBind(&AsyncAudioDecoder::decode, AllowCrossThreadAccess(audioDataRef.release().leakRef()), sampleRate, successCallback, errorCallback, resolver, context)); } void AsyncAudioDecoder::decode(DOMArrayBuffer* audioData, float sampleRate, AudioBufferCallback* successCallback, AudioBufferCallback* errorCallback, ScriptPromiseResolver* resolver, AbstractAudioContext* context) @@ -85,4 +84,3 @@ } } // namespace blink -
diff --git a/third_party/WebKit/Source/modules/webaudio/OfflineAudioDestinationNode.cpp b/third_party/WebKit/Source/modules/webaudio/OfflineAudioDestinationNode.cpp index 3c91875..b93ce46 100644 --- a/third_party/WebKit/Source/modules/webaudio/OfflineAudioDestinationNode.cpp +++ b/third_party/WebKit/Source/modules/webaudio/OfflineAudioDestinationNode.cpp
@@ -28,7 +28,6 @@ #include "modules/webaudio/AudioNodeInput.h" #include "modules/webaudio/AudioNodeOutput.h" #include "modules/webaudio/OfflineAudioContext.h" -#include "platform/Task.h" #include "platform/audio/AudioBus.h" #include "platform/audio/DenormalDisabler.h" #include "platform/audio/HRTFDatabaseLoader.h" @@ -105,7 +104,7 @@ if (!m_isRenderingStarted) { m_isRenderingStarted = true; m_renderThread->taskRunner()->postTask(BLINK_FROM_HERE, - new Task(threadSafeBind(&OfflineAudioDestinationHandler::startOfflineRendering, this))); + threadSafeBind(&OfflineAudioDestinationHandler::startOfflineRendering, this)); return; } @@ -313,4 +312,3 @@ } } // namespace blink -
diff --git a/third_party/WebKit/Source/modules/webaudio/RealtimeAnalyser.cpp b/third_party/WebKit/Source/modules/webaudio/RealtimeAnalyser.cpp index 78088ad..902e7900 100644 --- a/third_party/WebKit/Source/modules/webaudio/RealtimeAnalyser.cpp +++ b/third_party/WebKit/Source/modules/webaudio/RealtimeAnalyser.cpp
@@ -188,7 +188,6 @@ void RealtimeAnalyser::convertFloatToDb(DOMFloat32Array* destinationArray) { // Convert from linear magnitude to floating-point decibels. - const double minDecibels = m_minDecibels; unsigned sourceLength = magnitudeBuffer().size(); size_t len = std::min(sourceLength, destinationArray->length()); if (len > 0) { @@ -197,7 +196,7 @@ for (unsigned i = 0; i < len; ++i) { float linearValue = source[i]; - double dbMag = !linearValue ? minDecibels : AudioUtilities::linearToDecibels(linearValue); + double dbMag = AudioUtilities::linearToDecibels(linearValue); destination[i] = float(dbMag); } } @@ -234,7 +233,7 @@ for (unsigned i = 0; i < len; ++i) { float linearValue = source[i]; - double dbMag = !linearValue ? minDecibels : AudioUtilities::linearToDecibels(linearValue); + double dbMag = AudioUtilities::linearToDecibels(linearValue); // The range m_minDecibels to m_maxDecibels will be scaled to byte values from 0 to UCHAR_MAX. double scaledValue = UCHAR_MAX * (dbMag - minDecibels) * rangeScaleFactor;
diff --git a/third_party/WebKit/Source/modules/webdatabase/DatabaseTask.h b/third_party/WebKit/Source/modules/webdatabase/DatabaseTask.h index b1760161..84deeb1 100644 --- a/third_party/WebKit/Source/modules/webdatabase/DatabaseTask.h +++ b/third_party/WebKit/Source/modules/webdatabase/DatabaseTask.h
@@ -33,7 +33,6 @@ #include "modules/webdatabase/DatabaseBasicTypes.h" #include "modules/webdatabase/DatabaseError.h" #include "modules/webdatabase/SQLTransactionBackend.h" -#include "platform/Task.h" #include "platform/TaskSynchronizer.h" #include "platform/heap/Handle.h" #include "wtf/OwnPtr.h"
diff --git a/third_party/WebKit/Source/modules/webdatabase/DatabaseThread.cpp b/third_party/WebKit/Source/modules/webdatabase/DatabaseThread.cpp index 87d51bd..9ee6e7e 100644 --- a/third_party/WebKit/Source/modules/webdatabase/DatabaseThread.cpp +++ b/third_party/WebKit/Source/modules/webdatabase/DatabaseThread.cpp
@@ -66,7 +66,7 @@ if (m_thread) return; m_thread = WebThreadSupportingGC::create("WebCore: Database"); - m_thread->postTask(BLINK_FROM_HERE, new Task(threadSafeBind(&DatabaseThread::setupDatabaseThread, this))); + m_thread->postTask(BLINK_FROM_HERE, threadSafeBind(&DatabaseThread::setupDatabaseThread, this)); } void DatabaseThread::setupDatabaseThread() @@ -84,7 +84,7 @@ m_terminationRequested = true; m_cleanupSync = &sync; WTF_LOG(StorageAPI, "DatabaseThread %p was asked to terminate\n", this); - m_thread->postTask(BLINK_FROM_HERE, new Task(threadSafeBind(&DatabaseThread::cleanupDatabaseThread, this))); + m_thread->postTask(BLINK_FROM_HERE, threadSafeBind(&DatabaseThread::cleanupDatabaseThread, this)); } sync.waitForTaskCompletion(); // The WebThread destructor blocks until all the tasks of the database @@ -112,7 +112,7 @@ } m_openDatabaseSet.clear(); - m_thread->postTask(BLINK_FROM_HERE, new Task(WTF::bind(&DatabaseThread::cleanupDatabaseThreadCompleted, this))); + m_thread->postTask(BLINK_FROM_HERE, WTF::bind(&DatabaseThread::cleanupDatabaseThreadCompleted, this)); } void DatabaseThread::cleanupDatabaseThreadCompleted() @@ -170,7 +170,7 @@ } #endif // WebThread takes ownership of the task. - m_thread->postTask(BLINK_FROM_HERE, new Task(threadSafeBind(&DatabaseTask::run, task))); + m_thread->postTask(BLINK_FROM_HERE, threadSafeBind(&DatabaseTask::run, task)); } } // namespace blink
diff --git a/third_party/WebKit/Source/platform/CrossThreadCopier.h b/third_party/WebKit/Source/platform/CrossThreadCopier.h index 5124406..113eebf 100644 --- a/third_party/WebKit/Source/platform/CrossThreadCopier.h +++ b/third_party/WebKit/Source/platform/CrossThreadCopier.h
@@ -156,6 +156,11 @@ } }; +template<typename T> +struct CrossThreadCopier<CrossThreadWeakPersistentThisPointer<T>> : public CrossThreadCopierPassThrough<CrossThreadWeakPersistentThisPointer<T>> { + STATIC_ONLY(CrossThreadCopier); +}; + template <> struct CrossThreadCopier<KURL> { STATIC_ONLY(CrossThreadCopier);
diff --git a/third_party/WebKit/Source/platform/PODInterval.h b/third_party/WebKit/Source/platform/PODInterval.h index 0304735..68307e2 100644 --- a/third_party/WebKit/Source/platform/PODInterval.h +++ b/third_party/WebKit/Source/platform/PODInterval.h
@@ -62,10 +62,10 @@ // available: // // template<> struct ValueToString<T> { -// static String string(const T& t); +// static String toString(const T& t); // }; // template<> struct ValueToString<UserData> { -// static String string(const UserData& t); +// static String toString(const UserData& t); // }; // // Note that this class requires a copy constructor and assignment @@ -143,13 +143,13 @@ { StringBuilder builder; builder.appendLiteral("[PODInterval ("); - builder.append(ValueToString<T>::string(low())); + builder.append(ValueToString<T>::toString(low())); builder.appendLiteral(", "); - builder.append(ValueToString<T>::string(high())); + builder.append(ValueToString<T>::toString(high())); builder.appendLiteral("), data="); - builder.append(ValueToString<UserData>::string(data())); + builder.append(ValueToString<UserData>::toString(data())); builder.appendLiteral(", maxHigh="); - builder.append(ValueToString<T>::string(maxHigh())); + builder.append(ValueToString<T>::toString(maxHigh())); builder.append(']'); return builder.toString(); }
diff --git a/third_party/WebKit/Source/platform/PODIntervalTree.h b/third_party/WebKit/Source/platform/PODIntervalTree.h index e1de084..59a46ddd 100644 --- a/third_party/WebKit/Source/platform/PODIntervalTree.h +++ b/third_party/WebKit/Source/platform/PODIntervalTree.h
@@ -240,7 +240,7 @@ localMaxValue = node->data().high(); if (!(localMaxValue == node->data().maxHigh())) { #ifndef NDEBUG - String localMaxValueString = ValueToString<T>::string(localMaxValue); + String localMaxValueString = ValueToString<T>::toString(localMaxValue); WTF_LOG_ERROR("PODIntervalTree verification failed at node 0x%p: localMaxValue=%s and data=%s", node, localMaxValueString.utf8().data(), node->data().toString().utf8().data()); #endif @@ -256,7 +256,7 @@ // Support for printing PODIntervals at the PODRedBlackTree level. template<class T, class UserData> struct ValueToString<PODInterval<T, UserData>> { - static String string(const PODInterval<T, UserData>& interval) + static String toString(const PODInterval<T, UserData>& interval) { return interval.toString(); }
diff --git a/third_party/WebKit/Source/platform/PODIntervalTreeTest.cpp b/third_party/WebKit/Source/platform/PODIntervalTreeTest.cpp index cc9b662..dcc041f 100644 --- a/third_party/WebKit/Source/platform/PODIntervalTreeTest.cpp +++ b/third_party/WebKit/Source/platform/PODIntervalTreeTest.cpp
@@ -41,12 +41,12 @@ #ifndef NDEBUG template<> struct ValueToString<float> { - static String string(const float& value) { return String::number(value); } + static String toString(const float& value) { return String::number(value); } }; template<> struct ValueToString<void*> { - static String string(void* const& value) + static String toString(void* const& value) { return String::format("0x%p", value); } @@ -87,7 +87,7 @@ #ifndef NDEBUG template<> struct ValueToString<int*> { - static String string(int* const& value) + static String toString(int* const& value) { return String::format("0x%p", value); } @@ -130,7 +130,7 @@ #ifndef NDEBUG template<> struct ValueToString<UserData1> { - static String string(const UserData1& value) + static String toString(const UserData1& value) { return String("[UserData1 a=") + String::number(value.a) + " b=" + String::number(value.b) + "]"; } @@ -187,7 +187,7 @@ #ifndef NDEBUG template<> struct ValueToString<EndpointType1> { - static String string(const EndpointType1& value) + static String toString(const EndpointType1& value) { return String("[EndpointType1 value=") + String::number(value.value()) + "]"; } @@ -208,7 +208,7 @@ #ifndef NDEBUG template<> struct ValueToString<int> { - static String string(const int& value) { return String::number(value); } + static String toString(const int& value) { return String::number(value); } }; #endif
diff --git a/third_party/WebKit/Source/platform/PODRedBlackTree.h b/third_party/WebKit/Source/platform/PODRedBlackTree.h index c7bcdddc..e791558 100644 --- a/third_party/WebKit/Source/platform/PODRedBlackTree.h +++ b/third_party/WebKit/Source/platform/PODRedBlackTree.h
@@ -45,7 +45,7 @@ // enabled. This requires the template specialization to be available: // // template<> struct ValueToString<T> { -// static String string(const T& t); +// static String toString(const T& t); // }; // // Note that when complex types are stored in this red/black tree, it
diff --git a/third_party/WebKit/Source/platform/RuntimeEnabledFeatures.in b/third_party/WebKit/Source/platform/RuntimeEnabledFeatures.in index 6e3dd5b..6b797b2 100644 --- a/third_party/WebKit/Source/platform/RuntimeEnabledFeatures.in +++ b/third_party/WebKit/Source/platform/RuntimeEnabledFeatures.in
@@ -75,7 +75,7 @@ EventListenerOptions status=stable ExperimentalCanvasFeatures status=test ExperimentalContentSecurityPolicyFeatures status=experimental -ExperimentalFramework status=test +ExperimentalFramework status=stable // Define a sample API for testing integration with the Experimental Framework. // The sample API is used in both unit and layout tests for the Experimental // Framework. Do not change this flag to stable, as it exists solely to generate
diff --git a/third_party/WebKit/Source/platform/WebScheduler.cpp b/third_party/WebKit/Source/platform/WebScheduler.cpp index d5bbb464..adcd1f66 100644 --- a/third_party/WebKit/Source/platform/WebScheduler.cpp +++ b/third_party/WebKit/Source/platform/WebScheduler.cpp
@@ -4,7 +4,6 @@ #include "public/platform/WebScheduler.h" -#include "platform/Task.h" #include "public/platform/WebFrameScheduler.h" #include "public/platform/WebTraceLocation.h" #include "wtf/Assertions.h"
diff --git a/third_party/WebKit/Source/platform/WebThreadSupportingGC.h b/third_party/WebKit/Source/platform/WebThreadSupportingGC.h index 792faef..b9fb4e79 100644 --- a/third_party/WebKit/Source/platform/WebThreadSupportingGC.h +++ b/third_party/WebKit/Source/platform/WebThreadSupportingGC.h
@@ -33,12 +33,12 @@ static PassOwnPtr<WebThreadSupportingGC> createForThread(WebThread*); ~WebThreadSupportingGC(); - void postTask(const WebTraceLocation& location, WebTaskRunner::Task* task) + void postTask(const WebTraceLocation& location, PassOwnPtr<Closure> task) { m_thread->taskRunner()->postTask(location, task); } - void postDelayedTask(const WebTraceLocation& location, WebTaskRunner::Task* task, long long delayMs) + void postDelayedTask(const WebTraceLocation& location, PassOwnPtr<Closure> task, long long delayMs) { m_thread->taskRunner()->postDelayedTask(location, task, delayMs); }
diff --git a/third_party/WebKit/Source/platform/audio/AudioUtilities.cpp b/third_party/WebKit/Source/platform/audio/AudioUtilities.cpp index e716d6c..f162c6be 100644 --- a/third_party/WebKit/Source/platform/audio/AudioUtilities.cpp +++ b/third_party/WebKit/Source/platform/audio/AudioUtilities.cpp
@@ -37,11 +37,7 @@ float linearToDecibels(float linear) { - // It's not possible to calculate decibels for a zero linear value since it would be -Inf. - // -1000.0 dB represents a very tiny linear value in case we ever reach this case. - ASSERT(linear); - if (!linear) - return -1000; + ASSERT(linear >= 0); return 20 * log10f(linear); }
diff --git a/third_party/WebKit/Source/platform/audio/HRTFDatabaseLoader.cpp b/third_party/WebKit/Source/platform/audio/HRTFDatabaseLoader.cpp index 4b53bf8e..c6c5a09 100644 --- a/third_party/WebKit/Source/platform/audio/HRTFDatabaseLoader.cpp +++ b/third_party/WebKit/Source/platform/audio/HRTFDatabaseLoader.cpp
@@ -27,10 +27,10 @@ */ #include "platform/audio/HRTFDatabaseLoader.h" -#include "platform/Task.h" #include "platform/TaskSynchronizer.h" #include "platform/ThreadSafeFunctional.h" #include "public/platform/Platform.h" +#include "public/platform/WebTaskRunner.h" #include "public/platform/WebTraceLocation.h" #include "wtf/MainThread.h" @@ -95,7 +95,7 @@ // Start the asynchronous database loading process. m_thread = adoptPtr(Platform::current()->createThread("HRTF database loader")); // TODO(alexclarke): Should this be posted as a loading task? - m_thread->taskRunner()->postTask(BLINK_FROM_HERE, new Task(threadSafeBind(&HRTFDatabaseLoader::loadTask, AllowCrossThreadAccess(this)))); + m_thread->taskRunner()->postTask(BLINK_FROM_HERE, threadSafeBind(&HRTFDatabaseLoader::loadTask, AllowCrossThreadAccess(this))); } } @@ -119,10 +119,9 @@ TaskSynchronizer sync; // TODO(alexclarke): Should this be posted as a loading task? - m_thread->taskRunner()->postTask(BLINK_FROM_HERE, new Task(threadSafeBind(&HRTFDatabaseLoader::cleanupTask, AllowCrossThreadAccess(this), AllowCrossThreadAccess(&sync)))); + m_thread->taskRunner()->postTask(BLINK_FROM_HERE, threadSafeBind(&HRTFDatabaseLoader::cleanupTask, AllowCrossThreadAccess(this), AllowCrossThreadAccess(&sync))); sync.waitForTaskCompletion(); m_thread.clear(); } } // namespace blink -
diff --git a/third_party/WebKit/Source/platform/audio/ReverbConvolver.cpp b/third_party/WebKit/Source/platform/audio/ReverbConvolver.cpp index 541f56b..75766ddd 100644 --- a/third_party/WebKit/Source/platform/audio/ReverbConvolver.cpp +++ b/third_party/WebKit/Source/platform/audio/ReverbConvolver.cpp
@@ -27,11 +27,11 @@ */ #include "platform/audio/ReverbConvolver.h" -#include "platform/Task.h" #include "platform/ThreadSafeFunctional.h" #include "platform/audio/AudioBus.h" #include "platform/audio/VectorMath.h" #include "public/platform/Platform.h" +#include "public/platform/WebTaskRunner.h" #include "public/platform/WebThread.h" #include "public/platform/WebTraceLocation.h" @@ -169,7 +169,7 @@ // Now that we've buffered more input, post another task to the background thread. if (m_backgroundThread) - m_backgroundThread->taskRunner()->postTask(BLINK_FROM_HERE, new Task(threadSafeBind(&ReverbConvolver::processInBackground, AllowCrossThreadAccess(this)))); + m_backgroundThread->taskRunner()->postTask(BLINK_FROM_HERE, threadSafeBind(&ReverbConvolver::processInBackground, AllowCrossThreadAccess(this))); } void ReverbConvolver::reset() @@ -190,4 +190,3 @@ } } // namespace blink -
diff --git a/third_party/WebKit/Source/platform/exported/WebServiceWorkerResponse.cpp b/third_party/WebKit/Source/platform/exported/WebServiceWorkerResponse.cpp index 89cb85a..49dd39e 100644 --- a/third_party/WebKit/Source/platform/exported/WebServiceWorkerResponse.cpp +++ b/third_party/WebKit/Source/platform/exported/WebServiceWorkerResponse.cpp
@@ -17,7 +17,6 @@ : status(0) , responseType(WebServiceWorkerResponseTypeDefault) , error(WebServiceWorkerResponseErrorUnknown) - , responseTime(0) { } WebURL url; @@ -28,7 +27,6 @@ RefPtr<BlobDataHandle> blobDataHandle; WebURL streamURL; WebServiceWorkerResponseError error; - int64_t responseTime; }; WebServiceWorkerResponse::WebServiceWorkerResponse() @@ -172,14 +170,4 @@ return m_private->error; } -void WebServiceWorkerResponse::setResponseTime(int64_t time) -{ - m_private->responseTime = time; -} - -int64_t WebServiceWorkerResponse::responseTime() const -{ - return m_private->responseTime; -} - } // namespace blink
diff --git a/third_party/WebKit/Source/platform/geometry/FloatPolygon.h b/third_party/WebKit/Source/platform/geometry/FloatPolygon.h index 070dfa5..0799fa6 100644 --- a/third_party/WebKit/Source/platform/geometry/FloatPolygon.h +++ b/third_party/WebKit/Source/platform/geometry/FloatPolygon.h
@@ -144,12 +144,12 @@ #ifndef NDEBUG template <> struct ValueToString<float> { STATIC_ONLY(ValueToString); - static String string(const float value) { return String::number(value); } + static String toString(const float value) { return String::number(value); } }; template<> struct ValueToString<FloatPolygonEdge*> { STATIC_ONLY(ValueToString); - static String string(const FloatPolygonEdge* edge) { return String::format("%p (%f,%f %f,%f)", edge, edge->vertex1().x(), edge->vertex1().y(), edge->vertex2().x(), edge->vertex2().y()); } + static String toString(const FloatPolygonEdge* edge) { return String::format("%p (%f,%f %f,%f)", edge, edge->vertex1().x(), edge->vertex1().y(), edge->vertex2().x(), edge->vertex2().y()); } }; #endif
diff --git a/third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridge.cpp b/third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridge.cpp index 49a2d787..25df126 100644 --- a/third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridge.cpp +++ b/third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridge.cpp
@@ -207,6 +207,9 @@ void Canvas2DLayerBridge::hibernate() { ASSERT(!isHibernating()); + ASSERT(m_hibernationScheduled); + + m_hibernationScheduled = false; if (m_destructionInProgress) { m_logger->reportHibernationEvent(HibernationAbortedDueToPendingDestruction); @@ -421,10 +424,11 @@ return; m_isHidden = newHiddenValue; - if (m_surface && isHidden() && !m_destructionInProgress) { + if (m_surface && isHidden() && !m_destructionInProgress && !m_hibernationScheduled) { if (m_layer) m_layer->clearTexture(); m_logger->reportHibernationEvent(HibernationScheduled); + m_hibernationScheduled = true; Platform::current()->currentThread()->scheduler()->postIdleTask(BLINK_FROM_HERE, WTF::bind<double>(&hibernateWrapper, m_weakPtrFactory.createWeakPtr())); } if (!isHidden() && m_softwareRenderingWhileHidden) {
diff --git a/third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridge.h b/third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridge.h index 6c139d20..d2dfc7e 100644 --- a/third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridge.h +++ b/third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridge.h
@@ -162,6 +162,7 @@ bool m_renderingTaskCompletedForCurrentFrame; bool m_softwareRenderingWhileHidden; bool m_surfaceCreationFailedAtLeastOnce = false; + bool m_hibernationScheduled = false; friend class Canvas2DLayerBridgeTest;
diff --git a/third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridgeTest.cpp b/third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridgeTest.cpp index 1fa3796..31dc7430 100644 --- a/third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridgeTest.cpp +++ b/third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridgeTest.cpp
@@ -502,6 +502,54 @@ ::testing::Mock::VerifyAndClearExpectations(&mainMock); } +TEST_F(Canvas2DLayerBridgeTest, HibernationReEntry) +{ + MockCanvasContext mainMock; + OwnPtr<WebThread> testThread = adoptPtr(Platform::current()->createThread("TestThread")); + + // The Canvas2DLayerBridge has to be created on the thread that will use it + // to avoid WeakPtr thread check issues. + Canvas2DLayerBridgePtr bridge; + postAndWaitCreateBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge, &mainMock, this); + + // Register an alternate Logger for tracking hibernation events + OwnPtr<MockLogger> mockLogger = adoptPtr(new MockLogger); + MockLogger* mockLoggerPtr = mockLogger.get(); + bridge->setLoggerForTesting(mockLogger.release()); + + // Test entering hibernation + OwnPtr<WaitableEvent> hibernationStartedEvent = adoptPtr(new WaitableEvent()); + EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::HibernationScheduled)); + EXPECT_CALL(*mockLoggerPtr, didStartHibernating()) + .WillOnce(testing::Invoke(hibernationStartedEvent.get(), &WaitableEvent::signal)); + postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), true); + // Toggle visibility before the idle tasks that enters hibernation gets a + // chance to run. + postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), false); + postSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), true); + + hibernationStartedEvent->wait(); + ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); + EXPECT_FALSE(bridge->isAccelerated()); + EXPECT_TRUE(bridge->isHibernating()); + EXPECT_TRUE(bridge->checkSurfaceValid()); + + // Test exiting hibernation + EXPECT_CALL(*mockLoggerPtr, reportHibernationEvent(Canvas2DLayerBridge::HibernationEndedNormally)); + postAndWaitSetIsHiddenTask(BLINK_FROM_HERE, testThread.get(), bridge.get(), false); + ::testing::Mock::VerifyAndClearExpectations(mockLoggerPtr); + EXPECT_TRUE(bridge->isAccelerated()); + EXPECT_FALSE(bridge->isHibernating()); + EXPECT_TRUE(bridge->checkSurfaceValid()); + + // Tear down the bridge on the thread so that 'bridge' can go out of scope + // without crashing due to thread checks + postAndWaitDestroyBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge); + + ::testing::Mock::VerifyAndClearExpectations(&mainMock); + +} + TEST_F(Canvas2DLayerBridgeTest, HibernationLifeCycleWithDeferredRenderingDisabled) { MockCanvasContext mainMock;
diff --git a/third_party/WebKit/Source/platform/graphics/DeferredImageDecoderTest.cpp b/third_party/WebKit/Source/platform/graphics/DeferredImageDecoderTest.cpp index bb60190..6c189e6 100644 --- a/third_party/WebKit/Source/platform/graphics/DeferredImageDecoderTest.cpp +++ b/third_party/WebKit/Source/platform/graphics/DeferredImageDecoderTest.cpp
@@ -26,12 +26,12 @@ #include "platform/graphics/DeferredImageDecoder.h" #include "platform/SharedBuffer.h" -#include "platform/Task.h" #include "platform/ThreadSafeFunctional.h" #include "platform/graphics/ImageDecodingStore.h" #include "platform/graphics/ImageFrameGenerator.h" #include "platform/graphics/test/MockImageDecoder.h" #include "public/platform/Platform.h" +#include "public/platform/WebTaskRunner.h" #include "public/platform/WebThread.h" #include "public/platform/WebTraceLocation.h" #include "testing/gtest/include/gtest/gtest.h" @@ -225,7 +225,7 @@ // Create a thread to rasterize SkPicture. OwnPtr<WebThread> thread = adoptPtr(Platform::current()->createThread("RasterThread")); - thread->taskRunner()->postTask(BLINK_FROM_HERE, new Task(threadSafeBind(&rasterizeMain, AllowCrossThreadAccess(m_surface->getCanvas()), AllowCrossThreadAccess(picture.get())))); + thread->taskRunner()->postTask(BLINK_FROM_HERE, threadSafeBind(&rasterizeMain, AllowCrossThreadAccess(m_surface->getCanvas()), AllowCrossThreadAccess(picture.get()))); thread.clear(); EXPECT_EQ(0, m_decodeRequestCount);
diff --git a/third_party/WebKit/Source/platform/graphics/GraphicsContext.cpp b/third_party/WebKit/Source/platform/graphics/GraphicsContext.cpp index 35d922a..98ebcb8 100644 --- a/third_party/WebKit/Source/platform/graphics/GraphicsContext.cpp +++ b/third_party/WebKit/Source/platform/graphics/GraphicsContext.cpp
@@ -483,7 +483,7 @@ return; ASSERT(m_canvas); - StrokeStyle penStyle = strokeStyle(); + StrokeStyle penStyle = getStrokeStyle(); if (penStyle == NoStroke) return; @@ -499,7 +499,7 @@ int length = SkScalarRoundToInt(disp.width() + disp.height()); SkPaint paint(immutableState()->strokePaint(length)); - if (strokeStyle() == DottedStroke || strokeStyle() == DashedStroke) { + if (getStrokeStyle() == DottedStroke || getStrokeStyle() == DashedStroke) { // Do a rect fill of our endpoints. This ensures we always have the // appearance of being a border. We then draw the actual dotted/dashed line. SkRect r1, r2; @@ -662,7 +662,7 @@ return; SkPaint paint; - switch (strokeStyle()) { + switch (getStrokeStyle()) { case NoStroke: case SolidStroke: case DoubleStroke: @@ -738,7 +738,7 @@ drawText(immutableState()->fillPaint()); } - if ((modeFlags & TextModeStroke) && strokeStyle() != NoStroke && strokeThickness() > 0) { + if ((modeFlags & TextModeStroke) && getStrokeStyle() != NoStroke && strokeThickness() > 0) { SkPaint paintForStroking(immutableState()->strokePaint()); if (modeFlags & TextModeFill) { paintForStroking.setLooper(0); // shadow was already applied during fill pass
diff --git a/third_party/WebKit/Source/platform/graphics/GraphicsContext.h b/third_party/WebKit/Source/platform/graphics/GraphicsContext.h index 899200b..c819176 100644 --- a/third_party/WebKit/Source/platform/graphics/GraphicsContext.h +++ b/third_party/WebKit/Source/platform/graphics/GraphicsContext.h
@@ -92,7 +92,7 @@ float strokeThickness() const { return immutableState()->strokeData().thickness(); } void setStrokeThickness(float thickness) { mutableState()->setStrokeThickness(thickness); } - StrokeStyle strokeStyle() const { return immutableState()->strokeData().style(); } + StrokeStyle getStrokeStyle() const { return immutableState()->strokeData().style(); } void setStrokeStyle(StrokeStyle style) { mutableState()->setStrokeStyle(style); } Color strokeColor() const { return immutableState()->strokeColor(); } @@ -118,7 +118,7 @@ TextDrawingModeFlags textDrawingMode() const { return immutableState()->textDrawingMode(); } void setImageInterpolationQuality(InterpolationQuality quality) { mutableState()->setInterpolationQuality(quality); } - InterpolationQuality imageInterpolationQuality() const { return immutableState()->interpolationQuality(); } + InterpolationQuality imageInterpolationQuality() const { return immutableState()->getInterpolationQuality(); } // Specify the device scale factor which may change the way document markers // and fonts are rendered.
diff --git a/third_party/WebKit/Source/platform/graphics/GraphicsContextState.h b/third_party/WebKit/Source/platform/graphics/GraphicsContextState.h index 42edcae..d4c9418 100644 --- a/third_party/WebKit/Source/platform/graphics/GraphicsContextState.h +++ b/third_party/WebKit/Source/platform/graphics/GraphicsContextState.h
@@ -103,7 +103,7 @@ void setColorFilter(PassRefPtr<SkColorFilter>); // Image interpolation control. - InterpolationQuality interpolationQuality() const { return m_interpolationQuality; } + InterpolationQuality getInterpolationQuality() const { return m_interpolationQuality; } void setInterpolationQuality(InterpolationQuality); bool shouldAntialias() const { return m_shouldAntialias; }
diff --git a/third_party/WebKit/Source/platform/graphics/GraphicsLayer.cpp b/third_party/WebKit/Source/platform/graphics/GraphicsLayer.cpp index 75065b1..a4eeb81 100644 --- a/third_party/WebKit/Source/platform/graphics/GraphicsLayer.cpp +++ b/third_party/WebKit/Source/platform/graphics/GraphicsLayer.cpp
@@ -365,7 +365,7 @@ if (!m_painted) { DisplayItemList& itemList = m_paintController->newDisplayItemList(); for (DisplayItem& item : itemList) { - DisplayItem::Type type = item.type(); + DisplayItem::Type type = item.getType(); if (DisplayItem::isDrawingType(type) && type != DisplayItem::DocumentBackground && type != DisplayItem::DebugRedFill && static_cast<const DrawingDisplayItem&>(item).picture()) { m_painted = true; m_client->notifyFirstPaint(); @@ -779,7 +779,7 @@ bool debug = flags & LayerTreeIncludesDebugInfo; RefPtr<JSONArray> compositingReasonsJSON = JSONArray::create(); for (size_t i = 0; i < kNumberOfCompositingReasons; ++i) { - if (m_debugInfo.compositingReasons() & kCompositingReasonStringMap[i].reason) + if (m_debugInfo.getCompositingReasons() & kCompositingReasonStringMap[i].reason) compositingReasonsJSON->pushString(debug ? kCompositingReasonStringMap[i].description : kCompositingReasonStringMap[i].shortName); } json->setArray("compositingReasons", compositingReasonsJSON);
diff --git a/third_party/WebKit/Source/platform/graphics/GraphicsLayer.h b/third_party/WebKit/Source/platform/graphics/GraphicsLayer.h index a565bc6..0b9b9ac0df 100644 --- a/third_party/WebKit/Source/platform/graphics/GraphicsLayer.h +++ b/third_party/WebKit/Source/platform/graphics/GraphicsLayer.h
@@ -85,7 +85,7 @@ GraphicsLayerDebugInfo& debugInfo(); void setCompositingReasons(CompositingReasons); - CompositingReasons compositingReasons() const { return m_debugInfo.compositingReasons(); } + CompositingReasons getCompositingReasons() const { return m_debugInfo.getCompositingReasons(); } void setSquashingDisallowedReasons(SquashingDisallowedReasons); void setOwnerNodeId(int);
diff --git a/third_party/WebKit/Source/platform/graphics/GraphicsLayerDebugInfo.h b/third_party/WebKit/Source/platform/graphics/GraphicsLayerDebugInfo.h index fd79f680..49a4b83 100644 --- a/third_party/WebKit/Source/platform/graphics/GraphicsLayerDebugInfo.h +++ b/third_party/WebKit/Source/platform/graphics/GraphicsLayerDebugInfo.h
@@ -57,7 +57,7 @@ scoped_refptr<base::trace_event::TracedValue> asTracedValue() const; - CompositingReasons compositingReasons() const { return m_compositingReasons; } + CompositingReasons getCompositingReasons() const { return m_compositingReasons; } void setCompositingReasons(CompositingReasons reasons) { m_compositingReasons = reasons; } SquashingDisallowedReasons squashingDisallowedReasons() const { return m_squashingDisallowedReasons; }
diff --git a/third_party/WebKit/Source/platform/graphics/ImageBufferSurface.h b/third_party/WebKit/Source/platform/graphics/ImageBufferSurface.h index 364b979..17988d9 100644 --- a/third_party/WebKit/Source/platform/graphics/ImageBufferSurface.h +++ b/third_party/WebKit/Source/platform/graphics/ImageBufferSurface.h
@@ -84,7 +84,7 @@ // May return nullptr if the surface is GPU-backed and the GPU context was lost. virtual PassRefPtr<SkImage> newImageSnapshot(AccelerationHint, SnapshotReason) = 0; - OpacityMode opacityMode() const { return m_opacityMode; } + OpacityMode getOpacityMode() const { return m_opacityMode; } const IntSize& size() const { return m_size; } void notifyIsValidChanged(bool isValid) const;
diff --git a/third_party/WebKit/Source/platform/graphics/ImageFrameGeneratorTest.cpp b/third_party/WebKit/Source/platform/graphics/ImageFrameGeneratorTest.cpp index 59c482c..60edb54 100644 --- a/third_party/WebKit/Source/platform/graphics/ImageFrameGeneratorTest.cpp +++ b/third_party/WebKit/Source/platform/graphics/ImageFrameGeneratorTest.cpp
@@ -26,11 +26,11 @@ #include "platform/graphics/ImageFrameGenerator.h" #include "platform/SharedBuffer.h" -#include "platform/Task.h" #include "platform/ThreadSafeFunctional.h" #include "platform/graphics/ImageDecodingStore.h" #include "platform/graphics/test/MockImageDecoder.h" #include "public/platform/Platform.h" +#include "public/platform/WebTaskRunner.h" #include "public/platform/WebThread.h" #include "public/platform/WebTraceLocation.h" #include "testing/gtest/include/gtest/gtest.h" @@ -198,7 +198,7 @@ data = m_generator->refEncodedData(); EXPECT_EQ(nullptr, data); OwnPtr<WebThread> thread = adoptPtr(Platform::current()->createThread("DecodeThread")); - thread->taskRunner()->postTask(BLINK_FROM_HERE, new Task(threadSafeBind(&decodeThreadMain, AllowCrossThreadAccess(m_generator.get())))); + thread->taskRunner()->postTask(BLINK_FROM_HERE, threadSafeBind(&decodeThreadMain, AllowCrossThreadAccess(m_generator.get()))); thread.clear(); EXPECT_EQ(2, m_decodeRequestCount); EXPECT_EQ(1, m_decodersDestroyed); @@ -215,7 +215,7 @@ // Thread will also ref and unref the data. thread = adoptPtr(Platform::current()->createThread("RefEncodedDataThread")); - thread->taskRunner()->postTask(BLINK_FROM_HERE, new Task(threadSafeBind(&decodeThreadWithRefEncodedMain, AllowCrossThreadAccess(m_generator.get())))); + thread->taskRunner()->postTask(BLINK_FROM_HERE, threadSafeBind(&decodeThreadWithRefEncodedMain, AllowCrossThreadAccess(m_generator.get()))); thread.clear(); EXPECT_EQ(4, m_decodeRequestCount);
diff --git a/third_party/WebKit/Source/platform/graphics/RecordingImageBufferSurface.cpp b/third_party/WebKit/Source/platform/graphics/RecordingImageBufferSurface.cpp index afc2ba9..406f0cb 100644 --- a/third_party/WebKit/Source/platform/graphics/RecordingImageBufferSurface.cpp +++ b/third_party/WebKit/Source/platform/graphics/RecordingImageBufferSurface.cpp
@@ -78,7 +78,7 @@ DEFINE_THREAD_SAFE_STATIC_LOCAL(EnumerationHistogram, canvasFallbackHistogram, new EnumerationHistogram("Canvas.DisplayListFallbackReason", FallbackReasonCount)); canvasFallbackHistogram.count(reason); - m_fallbackSurface = m_fallbackFactory->createSurface(size(), opacityMode()); + m_fallbackSurface = m_fallbackFactory->createSurface(size(), getOpacityMode()); m_fallbackSurface->setImageBuffer(m_imageBuffer); if (m_previousFrame) {
diff --git a/third_party/WebKit/Source/platform/graphics/StrokeData.h b/third_party/WebKit/Source/platform/graphics/StrokeData.h index ae9043db..2dfedd85 100644 --- a/third_party/WebKit/Source/platform/graphics/StrokeData.h +++ b/third_party/WebKit/Source/platform/graphics/StrokeData.h
@@ -62,10 +62,8 @@ float thickness() const { return m_thickness; } void setThickness(float thickness) { m_thickness = thickness; } - LineCap lineCap() const { return (LineCap)m_lineCap; } void setLineCap(LineCap cap) { m_lineCap = (SkPaint::Cap)cap; } - LineJoin lineJoin() const { return (LineJoin)m_lineJoin; } void setLineJoin(LineJoin join) { m_lineJoin = (SkPaint::Join)join; } float miterLimit() const { return m_miterLimit; }
diff --git a/third_party/WebKit/Source/platform/graphics/compositing/PaintArtifactCompositor.cpp b/third_party/WebKit/Source/platform/graphics/compositing/PaintArtifactCompositor.cpp index 061be13..4f89ff8 100644 --- a/third_party/WebKit/Source/platform/graphics/compositing/PaintArtifactCompositor.cpp +++ b/third_party/WebKit/Source/platform/graphics/compositing/PaintArtifactCompositor.cpp
@@ -79,7 +79,7 @@ static void appendDisplayItemToCcDisplayItemList(const DisplayItem& displayItem, cc::DisplayItemList* list) { - if (DisplayItem::isDrawingType(displayItem.type())) { + if (DisplayItem::isDrawingType(displayItem.getType())) { const SkPicture* picture = static_cast<const DrawingDisplayItem&>(displayItem).picture(); if (!picture) return;
diff --git a/third_party/WebKit/Source/platform/graphics/filters/FETile.h b/third_party/WebKit/Source/platform/graphics/filters/FETile.h index 69a29a0..22d6de1 100644 --- a/third_party/WebKit/Source/platform/graphics/filters/FETile.h +++ b/third_party/WebKit/Source/platform/graphics/filters/FETile.h
@@ -33,7 +33,7 @@ FloatRect mapPaintRect(const FloatRect&, bool forward = true) final; - FilterEffectType filterEffectType() const override { return FilterEffectTypeTile; } + FilterEffectType getFilterEffectType() const override { return FilterEffectTypeTile; } TextStream& externalRepresentation(TextStream&, int indention) const override;
diff --git a/third_party/WebKit/Source/platform/graphics/filters/FilterEffect.cpp b/third_party/WebKit/Source/platform/graphics/filters/FilterEffect.cpp index e3f5b93..344dd0c 100644 --- a/third_party/WebKit/Source/platform/graphics/filters/FilterEffect.cpp +++ b/third_party/WebKit/Source/platform/graphics/filters/FilterEffect.cpp
@@ -164,7 +164,7 @@ } // After calling determineFilterPrimitiveSubregion on the target effect, reset the subregion again for <feTile>. - if (filterEffectType() == FilterEffectTypeTile) + if (getFilterEffectType() == FilterEffectTypeTile) subregion = filter->filterRegion(); if (flags & MapRectForward) { @@ -208,7 +208,7 @@ bool FilterEffect::hasConnectedInput() const { for (unsigned i = 0; i < m_inputEffects.size(); i++) { - if (m_inputEffects[i] && m_inputEffects[i]->filterEffectType() != FilterEffectTypeSourceInput) { + if (m_inputEffects[i] && m_inputEffects[i]->getFilterEffectType() != FilterEffectTypeSourceInput) { return true; } }
diff --git a/third_party/WebKit/Source/platform/graphics/filters/FilterEffect.h b/third_party/WebKit/Source/platform/graphics/filters/FilterEffect.h index eeb0e7d1..568c25f 100644 --- a/third_party/WebKit/Source/platform/graphics/filters/FilterEffect.h +++ b/third_party/WebKit/Source/platform/graphics/filters/FilterEffect.h
@@ -103,7 +103,7 @@ } FloatRect mapRectRecursive(const FloatRect&); - virtual FilterEffectType filterEffectType() const { return FilterEffectTypeUnknown; } + virtual FilterEffectType getFilterEffectType() const { return FilterEffectTypeUnknown; } virtual TextStream& externalRepresentation(TextStream&, int indention = 0) const;
diff --git a/third_party/WebKit/Source/platform/graphics/filters/PaintFilterEffect.h b/third_party/WebKit/Source/platform/graphics/filters/PaintFilterEffect.h index ddfaaa4..d972c4b 100644 --- a/third_party/WebKit/Source/platform/graphics/filters/PaintFilterEffect.h +++ b/third_party/WebKit/Source/platform/graphics/filters/PaintFilterEffect.h
@@ -15,7 +15,7 @@ static PassRefPtrWillBeRawPtr<PaintFilterEffect> create(Filter*, const SkPaint&); ~PaintFilterEffect() override; - FilterEffectType filterEffectType() const override { return FilterEffectTypeSourceInput; } + FilterEffectType getFilterEffectType() const override { return FilterEffectTypeSourceInput; } TextStream& externalRepresentation(TextStream&, int indention) const override; PassRefPtr<SkImageFilter> createImageFilter(SkiaImageFilterBuilder&) override;
diff --git a/third_party/WebKit/Source/platform/graphics/filters/SourceAlpha.h b/third_party/WebKit/Source/platform/graphics/filters/SourceAlpha.h index 96961e9..8537da5 100644 --- a/third_party/WebKit/Source/platform/graphics/filters/SourceAlpha.h +++ b/third_party/WebKit/Source/platform/graphics/filters/SourceAlpha.h
@@ -31,7 +31,7 @@ FloatRect determineAbsolutePaintRect(const FloatRect& requestedRect) override; - FilterEffectType filterEffectType() const override { return FilterEffectTypeSourceInput; } + FilterEffectType getFilterEffectType() const override { return FilterEffectTypeSourceInput; } TextStream& externalRepresentation(TextStream&, int indention) const override; PassRefPtr<SkImageFilter> createImageFilter(SkiaImageFilterBuilder&) override;
diff --git a/third_party/WebKit/Source/platform/graphics/filters/SourceGraphic.h b/third_party/WebKit/Source/platform/graphics/filters/SourceGraphic.h index c03a1a24..1add9e1 100644 --- a/third_party/WebKit/Source/platform/graphics/filters/SourceGraphic.h +++ b/third_party/WebKit/Source/platform/graphics/filters/SourceGraphic.h
@@ -36,7 +36,7 @@ FloatRect determineAbsolutePaintRect(const FloatRect& requestedRect) override; - FilterEffectType filterEffectType() const override { return FilterEffectTypeSourceInput; } + FilterEffectType getFilterEffectType() const override { return FilterEffectTypeSourceInput; } TextStream& externalRepresentation(TextStream&, int indention) const override; PassRefPtr<SkImageFilter> createImageFilter(SkiaImageFilterBuilder&) override;
diff --git a/third_party/WebKit/Source/platform/graphics/gpu/WebGLImageConversion.h b/third_party/WebKit/Source/platform/graphics/gpu/WebGLImageConversion.h index 5f17e62..378be340 100644 --- a/third_party/WebKit/Source/platform/graphics/gpu/WebGLImageConversion.h +++ b/third_party/WebKit/Source/platform/graphics/gpu/WebGLImageConversion.h
@@ -137,7 +137,6 @@ DataFormat imageSourceFormat() { return m_imageSourceFormat; } AlphaOp imageAlphaOp() { return m_alphaOp; } unsigned imageSourceUnpackAlignment() { return m_imageSourceUnpackAlignment; } - ImageHtmlDomSource imageHtmlDomSource() { return m_imageHtmlDomSource; } private: // Extract the image and keeps track of its status, such as width, height, Source Alignment, // format and AlphaOp etc. This needs to lock the resources or relevant data if needed.
diff --git a/third_party/WebKit/Source/platform/graphics/paint/DisplayItem.cpp b/third_party/WebKit/Source/platform/graphics/paint/DisplayItem.cpp index 780d954..775c7a35 100644 --- a/third_party/WebKit/Source/platform/graphics/paint/DisplayItem.cpp +++ b/third_party/WebKit/Source/platform/graphics/paint/DisplayItem.cpp
@@ -234,7 +234,7 @@ stringBuilder.append(clientDebugString()); } stringBuilder.append("\", type: \""); - stringBuilder.append(typeAsDebugString(type())); + stringBuilder.append(typeAsDebugString(getType())); stringBuilder.append('"'); if (m_skippedCache) stringBuilder.append(", skippedCache: true");
diff --git a/third_party/WebKit/Source/platform/graphics/paint/DisplayItem.h b/third_party/WebKit/Source/platform/graphics/paint/DisplayItem.h index 1756042..fc44e8ea 100644 --- a/third_party/WebKit/Source/platform/graphics/paint/DisplayItem.h +++ b/third_party/WebKit/Source/platform/graphics/paint/DisplayItem.h
@@ -248,7 +248,7 @@ virtual void replay(GraphicsContext&) const { } const DisplayItemClient& client() const { ASSERT(m_client); return *m_client; } - Type type() const { return m_type; } + Type getType() const { return m_type; } void setScope(unsigned scope) { m_scope = scope; } unsigned scope() { return m_scope; } @@ -268,7 +268,7 @@ // See comments of enum Type for usage of the following macros. #define DEFINE_CATEGORY_METHODS(Category) \ static bool is##Category##Type(Type type) { return type >= Category##First && type <= Category##Last; } \ - bool is##Category() const { return is##Category##Type(type()); } + bool is##Category() const { return is##Category##Type(getType()); } #define DEFINE_CONVERSION_METHODS(Category1, category1, Category2, category2) \ static Type category1##TypeTo##Category2##Type(Type type) \
diff --git a/third_party/WebKit/Source/platform/graphics/paint/DrawingDisplayItem.cpp b/third_party/WebKit/Source/platform/graphics/paint/DrawingDisplayItem.cpp index 97d361d..b630917e 100644 --- a/third_party/WebKit/Source/platform/graphics/paint/DrawingDisplayItem.cpp +++ b/third_party/WebKit/Source/platform/graphics/paint/DrawingDisplayItem.cpp
@@ -75,7 +75,7 @@ if (!picture || !otherPicture) return false; - switch (underInvalidationCheckingMode()) { + switch (getUnderInvalidationCheckingMode()) { case DrawingDisplayItem::CheckPicture: { if (picture->approximateOpCount() != otherPicture->approximateOpCount()) return false;
diff --git a/third_party/WebKit/Source/platform/graphics/paint/DrawingDisplayItem.h b/third_party/WebKit/Source/platform/graphics/paint/DrawingDisplayItem.h index 825d58b..94a5238 100644 --- a/third_party/WebKit/Source/platform/graphics/paint/DrawingDisplayItem.h +++ b/third_party/WebKit/Source/platform/graphics/paint/DrawingDisplayItem.h
@@ -50,7 +50,7 @@ bool knownToBeOpaque() const { ASSERT(RuntimeEnabledFeatures::slimmingPaintV2Enabled()); return m_knownToBeOpaque; } #if ENABLE(ASSERT) - UnderInvalidationCheckingMode underInvalidationCheckingMode() const { return m_underInvalidationCheckingMode; } + UnderInvalidationCheckingMode getUnderInvalidationCheckingMode() const { return m_underInvalidationCheckingMode; } bool equals(const DisplayItem& other) const final; #endif
diff --git a/third_party/WebKit/Source/platform/graphics/paint/PaintArtifactToSkCanvas.cpp b/third_party/WebKit/Source/platform/graphics/paint/PaintArtifactToSkCanvas.cpp index 18ca925..a04abf5 100644 --- a/third_party/WebKit/Source/platform/graphics/paint/PaintArtifactToSkCanvas.cpp +++ b/third_party/WebKit/Source/platform/graphics/paint/PaintArtifactToSkCanvas.cpp
@@ -23,7 +23,7 @@ void paintDisplayItemToSkCanvas(const DisplayItem& displayItem, SkCanvas* canvas) { - DisplayItem::Type type = displayItem.type(); + DisplayItem::Type type = displayItem.getType(); if (DisplayItem::isDrawingType(type)) { canvas->drawPicture(static_cast<const DrawingDisplayItem&>(displayItem).picture());
diff --git a/third_party/WebKit/Source/platform/graphics/paint/PaintController.cpp b/third_party/WebKit/Source/platform/graphics/paint/PaintController.cpp index f14c0f14..0ef0044b 100644 --- a/third_party/WebKit/Source/platform/graphics/paint/PaintController.cpp +++ b/third_party/WebKit/Source/platform/graphics/paint/PaintController.cpp
@@ -65,8 +65,8 @@ // Verify noop begin/end pairs have been removed. if (m_newDisplayItemList.size() >= 2 && displayItem.isEnd()) { const auto& beginDisplayItem = m_newDisplayItemList[m_newDisplayItemList.size() - 2]; - if (beginDisplayItem.isBegin() && beginDisplayItem.type() != DisplayItem::Subsequence && !beginDisplayItem.drawsContent()) - ASSERT(!displayItem.isEndAndPairedWith(beginDisplayItem.type())); + if (beginDisplayItem.isBegin() && beginDisplayItem.getType() != DisplayItem::Subsequence && !beginDisplayItem.drawsContent()) + ASSERT(!displayItem.isEndAndPairedWith(beginDisplayItem.getType())); } #endif @@ -242,7 +242,7 @@ void PaintController::copyCachedSubsequence(const DisplayItemList& currentList, DisplayItemList::iterator& currentIt, DisplayItemList& updatedList) { - ASSERT(currentIt->type() == DisplayItem::Subsequence); + ASSERT(currentIt->getType() == DisplayItem::Subsequence); ASSERT(!currentIt->scope()); DisplayItem::Id endSubsequenceId(currentIt->client(), DisplayItem::EndSubsequence, 0); do { @@ -335,7 +335,7 @@ for (DisplayItemList::iterator newIt = m_newDisplayItemList.begin(); newIt != m_newDisplayItemList.end(); ++newIt) { const DisplayItem& newDisplayItem = *newIt; const DisplayItem::Id newDisplayItemId = newDisplayItem.nonCachedId(); - bool newDisplayItemHasCachedType = newDisplayItem.type() != newDisplayItemId.type; + bool newDisplayItemHasCachedType = newDisplayItem.getType() != newDisplayItemId.type; bool isSynchronized = currentIt != currentEnd && newDisplayItemId.matches(*currentIt); @@ -367,9 +367,9 @@ updatedList.appendByMoving(*currentIt, m_currentPaintArtifact.displayItemList().visualRect(currentIt - m_currentPaintArtifact.displayItemList().begin())); ++currentIt; } else { - ASSERT(newDisplayItem.type() == DisplayItem::CachedSubsequence); + ASSERT(newDisplayItem.getType() == DisplayItem::CachedSubsequence); copyCachedSubsequence(m_currentPaintArtifact.displayItemList(), currentIt, updatedList); - ASSERT(updatedList.last().type() == DisplayItem::EndSubsequence); + ASSERT(updatedList.last().getType() == DisplayItem::EndSubsequence); } } else { ASSERT(!newDisplayItem.isDrawing() @@ -452,16 +452,16 @@ ASSERT(newIt->isCached()); // When under-invalidation-checking is enabled, the forced painting is following the cached display item. - DisplayItem::Type nextItemType = DisplayItem::nonCachedType(newIt->type()); + DisplayItem::Type nextItemType = DisplayItem::nonCachedType(newIt->getType()); ++newIt; - ASSERT(newIt->type() == nextItemType); + ASSERT(newIt->getType() == nextItemType); if (newIt->isDrawing()) { checkCachedDisplayItemIsUnchanged("", *newIt, *currentIt); return; } - ASSERT(newIt->type() == DisplayItem::Subsequence); + ASSERT(newIt->getType() == DisplayItem::Subsequence); #ifndef NDEBUG CString messagePrefix = String::format("(In CachedSubsequence of %s)", newIt->clientDebugString().utf8().data()).utf8();
diff --git a/third_party/WebKit/Source/platform/graphics/paint/PaintControllerTest.cpp b/third_party/WebKit/Source/platform/graphics/paint/PaintControllerTest.cpp index 0e616f6..fd24cc3 100644 --- a/third_party/WebKit/Source/platform/graphics/paint/PaintControllerTest.cpp +++ b/third_party/WebKit/Source/platform/graphics/paint/PaintControllerTest.cpp
@@ -83,7 +83,7 @@ for (size_t index = 0; index < std::min<size_t>(actual.size(), expectedSize); index++) { \ TRACE_DISPLAY_ITEMS(index, expected[index], actual[index]); \ EXPECT_EQ(expected[index].client(), actual[index].client()); \ - EXPECT_EQ(expected[index].type(), actual[index].type()); \ + EXPECT_EQ(expected[index].getType(), actual[index].getType()); \ } \ } while (false);
diff --git a/third_party/WebKit/Source/platform/graphics/paint/SubsequenceDisplayItem.h b/third_party/WebKit/Source/platform/graphics/paint/SubsequenceDisplayItem.h index 1d56b3c..e3e9ad52 100644 --- a/third_party/WebKit/Source/platform/graphics/paint/SubsequenceDisplayItem.h +++ b/third_party/WebKit/Source/platform/graphics/paint/SubsequenceDisplayItem.h
@@ -27,7 +27,7 @@ #if ENABLE(ASSERT) bool isEndAndPairedWith(DisplayItem::Type otherType) const final { - return type() == EndSubsequence && otherType == Subsequence; + return getType() == EndSubsequence && otherType == Subsequence; } #endif };
diff --git a/third_party/WebKit/Source/platform/graphics/paint/Transform3DDisplayItem.h b/third_party/WebKit/Source/platform/graphics/paint/Transform3DDisplayItem.h index d480b5c..cb028bcb 100644 --- a/third_party/WebKit/Source/platform/graphics/paint/Transform3DDisplayItem.h +++ b/third_party/WebKit/Source/platform/graphics/paint/Transform3DDisplayItem.h
@@ -65,7 +65,7 @@ #if ENABLE(ASSERT) bool isEndAndPairedWith(DisplayItem::Type otherType) const final { - return DisplayItem::transform3DTypeToEndTransform3DType(otherType) == type(); + return DisplayItem::transform3DTypeToEndTransform3DType(otherType) == getType(); } #endif };
diff --git a/third_party/WebKit/Source/platform/heap/Handle.h b/third_party/WebKit/Source/platform/heap/Handle.h index f3eed6e..3fd7ded 100644 --- a/third_party/WebKit/Source/platform/heap/Handle.h +++ b/third_party/WebKit/Source/platform/heap/Handle.h
@@ -1321,6 +1321,16 @@ // (like CrossThreadWeakPersistent<>), drop the restriction on weak persistent // use by function closures (and rename this ad-hoc type.) template<typename T> +class WeakPersistentThisPointer { + STACK_ALLOCATED(); +public: + explicit WeakPersistentThisPointer(T* value) : m_value(value) { } + WeakPersistent<T> value() const { return m_value; } +private: + WeakPersistent<T> m_value; +}; + +template<typename T> class CrossThreadWeakPersistentThisPointer { STACK_ALLOCATED(); public: @@ -1455,6 +1465,22 @@ }; template<typename T> +struct ParamStorageTraits<blink::WeakPersistentThisPointer<T>> { + STATIC_ONLY(ParamStorageTraits); + static_assert(sizeof(T), "T must be fully defined"); + using StorageType = blink::WeakPersistent<T>; + + static StorageType wrap(const blink::WeakPersistentThisPointer<T>& value) { return value.value(); } + + // WTF::FunctionWrapper<> handles WeakPtr<>, so recast this weak persistent + // into it. + // + // TODO(sof): remove this hack once wtf/Functional.h can also work with a type like + // WeakPersistent<>. + static WeakPtr<T> unwrap(const StorageType& value) { return WeakPtr<T>(WeakReference<T>::create(value.get())); } +}; + +template<typename T> struct ParamStorageTraits<blink::CrossThreadWeakPersistentThisPointer<T>> { STATIC_ONLY(ParamStorageTraits); static_assert(sizeof(T), "T must be fully defined");
diff --git a/third_party/WebKit/Source/platform/heap/HeapPage.cpp b/third_party/WebKit/Source/platform/heap/HeapPage.cpp index 771c7f6..36a6325 100644 --- a/third_party/WebKit/Source/platform/heap/HeapPage.cpp +++ b/third_party/WebKit/Source/platform/heap/HeapPage.cpp
@@ -31,7 +31,6 @@ #include "platform/heap/HeapPage.h" #include "platform/ScriptForbiddenScope.h" -#include "platform/Task.h" #include "platform/TraceEvent.h" #include "platform/heap/BlinkGCMemoryDumpProvider.h" #include "platform/heap/CallbackStack.h"
diff --git a/third_party/WebKit/Source/platform/heap/HeapTest.cpp b/third_party/WebKit/Source/platform/heap/HeapTest.cpp index 965d1bb1..1d0be051 100644 --- a/third_party/WebKit/Source/platform/heap/HeapTest.cpp +++ b/third_party/WebKit/Source/platform/heap/HeapTest.cpp
@@ -28,7 +28,6 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include "platform/Task.h" #include "platform/ThreadSafeFunctional.h" #include "platform/heap/Handle.h" #include "platform/heap/Heap.h" @@ -39,6 +38,7 @@ #include "platform/heap/Visitor.h" #include "platform/testing/UnitTestHelpers.h" #include "public/platform/Platform.h" +#include "public/platform/WebTaskRunner.h" #include "public/platform/WebTraceLocation.h" #include "testing/gtest/include/gtest/gtest.h" #include "wtf/HashTraits.h" @@ -461,7 +461,7 @@ Vector<OwnPtr<WebThread>, numberOfThreads> m_threads; for (int i = 0; i < numberOfThreads; i++) { m_threads.append(adoptPtr(Platform::current()->createThread("blink gc testing thread"))); - m_threads.last()->taskRunner()->postTask(BLINK_FROM_HERE, new Task(threadSafeBind(threadFunc, AllowCrossThreadAccess(tester)))); + m_threads.last()->taskRunner()->postTask(BLINK_FROM_HERE, threadSafeBind(threadFunc, AllowCrossThreadAccess(tester))); } while (tester->m_threadsToFinish) { SafePointScope scope(BlinkGC::NoHeapPointersOnStack); @@ -4703,7 +4703,7 @@ static void test() { OwnPtr<WebThread> sleepingThread = adoptPtr(Platform::current()->createThread("SleepingThread")); - sleepingThread->taskRunner()->postTask(BLINK_FROM_HERE, new Task(threadSafeBind(sleeperMainFunc))); + sleepingThread->taskRunner()->postTask(BLINK_FROM_HERE, threadSafeBind(sleeperMainFunc)); // Wait for the sleeper to run. while (!s_sleeperRunning) { @@ -5373,7 +5373,7 @@ MutexLocker locker(mainThreadMutex()); OwnPtr<WebThread> workerThread = adoptPtr(Platform::current()->createThread("Test Worker Thread")); - workerThread->taskRunner()->postTask(BLINK_FROM_HERE, new Task(threadSafeBind(workerThreadMain))); + workerThread->taskRunner()->postTask(BLINK_FROM_HERE, threadSafeBind(workerThreadMain)); // Wait for the worker thread to have done its initialization, // IE. the worker allocates an object and then throw aways any @@ -5476,7 +5476,7 @@ MutexLocker locker(mainThreadMutex()); OwnPtr<WebThread> workerThread = adoptPtr(Platform::current()->createThread("Test Worker Thread")); - workerThread->taskRunner()->postTask(BLINK_FROM_HERE, new Task(threadSafeBind(workerThreadMain))); + workerThread->taskRunner()->postTask(BLINK_FROM_HERE, threadSafeBind(workerThreadMain)); // Wait for the worker thread initialization. The worker // allocates a weak collection where both collection and @@ -5679,7 +5679,7 @@ MutexLocker locker(mainThreadMutex()); OwnPtr<WebThread> workerThread = adoptPtr(Platform::current()->createThread("Test Worker Thread")); - workerThread->taskRunner()->postTask(BLINK_FROM_HERE, new Task(threadSafeBind(workerThreadMain))); + workerThread->taskRunner()->postTask(BLINK_FROM_HERE, threadSafeBind(workerThreadMain)); // Park the main thread until the worker thread has initialized. parkMainThread(); @@ -5753,7 +5753,7 @@ { MutexLocker locker(mainThreadMutex()); OwnPtr<WebThread> workerThread = adoptPtr(Platform::current()->createThread("Test Worker Thread")); - workerThread->taskRunner()->postTask(BLINK_FROM_HERE, new Task(threadSafeBind(workerThreadMain))); + workerThread->taskRunner()->postTask(BLINK_FROM_HERE, threadSafeBind(workerThreadMain)); parkMainThread(); @@ -6472,7 +6472,7 @@ MutexLocker mainThreadMutexLocker(mainThreadMutex()); OwnPtr<WebThread> workerThread = adoptPtr(Platform::current()->createThread("Test Worker Thread")); DestructorLockingObject* object = nullptr; - workerThread->taskRunner()->postTask(BLINK_FROM_HERE, new Task(threadSafeBind(workerThreadMainForCrossThreadWeakPersistentTest, AllowCrossThreadAccessWrapper<DestructorLockingObject**>(&object)))); + workerThread->taskRunner()->postTask(BLINK_FROM_HERE, threadSafeBind(workerThreadMainForCrossThreadWeakPersistentTest, AllowCrossThreadAccessWrapper<DestructorLockingObject**>(&object))); parkMainThread(); // Step 3: Set up a CrossThreadWeakPersistent.
diff --git a/third_party/WebKit/Source/platform/text/BidiResolver.h b/third_party/WebKit/Source/platform/text/BidiResolver.h index bf81eab..3a72bab 100644 --- a/third_party/WebKit/Source/platform/text/BidiResolver.h +++ b/third_party/WebKit/Source/platform/text/BidiResolver.h
@@ -66,8 +66,8 @@ // Adding a pair of midpoints before a character will split it out into a new line box. void ensureCharacterGetsLineBox(Iterator& textParagraphSeparator) { - startIgnoringSpaces(Iterator(0, textParagraphSeparator.lineLayoutItem(), textParagraphSeparator.offset() - 1)); - stopIgnoringSpaces(Iterator(0, textParagraphSeparator.lineLayoutItem(), textParagraphSeparator.offset())); + startIgnoringSpaces(Iterator(0, textParagraphSeparator.getLineLayoutItem(), textParagraphSeparator.offset() - 1)); + stopIgnoringSpaces(Iterator(0, textParagraphSeparator.getLineLayoutItem(), textParagraphSeparator.offset())); } void checkMidpoints(Iterator& lBreak) @@ -75,7 +75,7 @@ // Check to see if our last midpoint is a start point beyond the line break. If so, // shave it off the list, and shave off a trailing space if the previous end point doesn't // preserve whitespace. - if (lBreak.lineLayoutItem() && m_numMidpoints && !(m_numMidpoints % 2)) { + if (lBreak.getLineLayoutItem() && m_numMidpoints && !(m_numMidpoints % 2)) { Iterator* midpointsIterator = m_midpoints.data(); Iterator& endpoint = midpointsIterator[m_numMidpoints - 2]; const Iterator& startpoint = midpointsIterator[m_numMidpoints - 1]; @@ -85,7 +85,7 @@ if (currpoint == lBreak) { // We hit the line break before the start point. Shave off the start point. m_numMidpoints--; - if (endpoint.lineLayoutItem().style()->collapseWhiteSpace() && endpoint.lineLayoutItem().isText()) + if (endpoint.getLineLayoutItem().style()->collapseWhiteSpace() && endpoint.getLineLayoutItem().isText()) endpoint.setOffset(endpoint.offset() - 1); } }
diff --git a/third_party/WebKit/Source/web/WebFrameWidgetImpl.cpp b/third_party/WebKit/Source/web/WebFrameWidgetImpl.cpp index 033a49e59..b34b41e6 100644 --- a/third_party/WebKit/Source/web/WebFrameWidgetImpl.cpp +++ b/third_party/WebKit/Source/web/WebFrameWidgetImpl.cpp
@@ -98,6 +98,7 @@ , m_layerTreeViewClosed(false) , m_suppressNextKeypressEvent(false) , m_ignoreInputEvents(false) + , m_isTransparent(false) #if ENABLE(OILPAN) , m_selfKeepAlive(this) #endif @@ -106,6 +107,9 @@ initializeLayerTreeView(); m_localRoot->setFrameWidget(this); allInstances().add(this); + + if (localRoot->parent()) + setIsTransparent(true); } WebFrameWidgetImpl::~WebFrameWidgetImpl() @@ -278,7 +282,7 @@ if (!m_layerTreeView) return; - m_layerTreeView->setBackgroundColor(alphaChannel(view()->backgroundColorOverride()) ? view()->backgroundColorOverride() : view()->backgroundColor()); + m_layerTreeView->setBackgroundColor(backgroundColor()); } void WebFrameWidgetImpl::updateLayerTreeDeviceScaleFactor() @@ -290,10 +294,17 @@ m_layerTreeView->setDeviceScaleFactor(deviceScaleFactor); } +void WebFrameWidgetImpl::setIsTransparent(bool isTransparent) +{ + m_isTransparent = isTransparent; + + if (m_layerTreeView) + m_layerTreeView->setHasTransparentBackground(isTransparent); +} + bool WebFrameWidgetImpl::isTransparent() const { - // FIXME: This might need to proxy to the WebView's isTransparent(). - return false; + return m_isTransparent; } void WebFrameWidgetImpl::layoutAndPaintAsync(WebLayoutAndPaintAsyncCallback* callback) @@ -381,6 +392,18 @@ return true; } +void WebFrameWidgetImpl::setBaseBackgroundColor(WebColor color) +{ + if (m_baseBackgroundColor == color) + return; + + m_baseBackgroundColor = color; + + m_localRoot->frameView()->setBaseBackgroundColor(color); + + updateAllLifecyclePhases(); +} + void WebFrameWidgetImpl::scheduleAnimation() { if (m_layerTreeView) { @@ -483,7 +506,7 @@ if (isTransparent()) return Color::transparent; if (!m_localRoot->frameView()) - return view()->backgroundColor(); + return m_baseBackgroundColor; FrameView* view = m_localRoot->frameView(); return view->documentBackgroundColor().rgb(); }
diff --git a/third_party/WebKit/Source/web/WebFrameWidgetImpl.h b/third_party/WebKit/Source/web/WebFrameWidgetImpl.h index 686f1a49..a9629b3 100644 --- a/third_party/WebKit/Source/web/WebFrameWidgetImpl.h +++ b/third_party/WebKit/Source/web/WebFrameWidgetImpl.h
@@ -115,6 +115,13 @@ void willCloseLayerTreeView() override; void didChangeWindowResizerRect() override; + // WebFrameWidget implementation. + void setVisibilityState(WebPageVisibilityState, bool) override; + bool isTransparent() const override; + void setIsTransparent(bool) override; + void setBaseBackgroundColor(WebColor) override; + void scheduleAnimation() override; + WebWidgetClient* client() const { return m_client; } Frame* focusedCoreFrame() const; @@ -122,15 +129,11 @@ // Returns the currently focused Element or null if no element has focus. Element* focusedElement() const; - void scheduleAnimation() override; - PaintLayerCompositor* compositor() const; void setRootGraphicsLayer(GraphicsLayer*); void attachCompositorAnimationTimeline(CompositorAnimationTimeline*); void detachCompositorAnimationTimeline(CompositorAnimationTimeline*); - void setVisibilityState(WebPageVisibilityState, bool) override; - // Exposed for the purpose of overriding device metrics. void sendResizeEventAndRepaint(); @@ -153,6 +156,8 @@ ScrollDirection*, ScrollGranularity*); + Color baseBackgroundColor() const { return m_baseBackgroundColor; } + DECLARE_TRACE(); private: @@ -182,8 +187,6 @@ void updateLayerTreeBackgroundColor(); void updateLayerTreeDeviceScaleFactor(); - bool isTransparent() const; - // PageWidgetEventHandler functions void handleMouseLeave(LocalFrame&, const WebMouseEvent&) override; void handleMouseDown(LocalFrame&, const WebMouseEvent&) override; @@ -217,8 +220,13 @@ bool m_ignoreInputEvents; + // Whether the WebFrameWidget is rendering transparently. + bool m_isTransparent; + static const WebInputEvent* m_currentInputEvent; + WebColor m_baseBackgroundColor; + #if ENABLE(OILPAN) SelfKeepAlive<WebFrameWidgetImpl> m_selfKeepAlive; #endif
diff --git a/third_party/WebKit/Source/web/WebLocalFrameImpl.cpp b/third_party/WebKit/Source/web/WebLocalFrameImpl.cpp index 9c74502..bdb9f837 100644 --- a/third_party/WebKit/Source/web/WebLocalFrameImpl.cpp +++ b/third_party/WebKit/Source/web/WebLocalFrameImpl.cpp
@@ -1647,8 +1647,9 @@ bool isMainFrame = !parent(); IntSize initialSize = (isMainFrame || !frameWidget()) ? webView->mainFrameSize() : (IntSize)frameWidget()->size(); + bool isTransparent = !isMainFrame && parent()->isWebRemoteFrame() ? true : webView->isTransparent(); - frame()->createView(initialSize, webView->baseBackgroundColor(), webView->isTransparent()); + frame()->createView(initialSize, webView->baseBackgroundColor(), isTransparent); if (webView->shouldAutoResize() && frame()->isLocalRoot()) frame()->view()->enableAutoSizeMode(webView->minAutoSize(), webView->maxAutoSize());
diff --git a/third_party/WebKit/Source/web/WebNode.cpp b/third_party/WebKit/Source/web/WebNode.cpp index 0438944..e5bb1448 100644 --- a/third_party/WebKit/Source/web/WebNode.cpp +++ b/third_party/WebKit/Source/web/WebNode.cpp
@@ -45,7 +45,6 @@ #include "core/layout/LayoutPart.h" #include "modules/accessibility/AXObject.h" #include "modules/accessibility/AXObjectCacheImpl.h" -#include "platform/Task.h" #include "platform/Widget.h" #include "public/platform/WebString.h" #include "public/platform/WebSuspendableTask.h"
diff --git a/third_party/WebKit/Source/web/WebStorageEventDispatcherImpl.cpp b/third_party/WebKit/Source/web/WebStorageEventDispatcherImpl.cpp index 8888ac4..c0a333f 100644 --- a/third_party/WebKit/Source/web/WebStorageEventDispatcherImpl.cpp +++ b/third_party/WebKit/Source/web/WebStorageEventDispatcherImpl.cpp
@@ -42,25 +42,24 @@ void WebStorageEventDispatcher::dispatchLocalStorageEvent( const WebString& key, const WebString& oldValue, const WebString& newValue, const WebURL& origin, - const WebURL& pageURL, WebStorageArea* sourceAreaInstance, - bool originatedInProcess) + const WebURL& pageURL, WebStorageArea* sourceAreaInstance) { RefPtr<SecurityOrigin> securityOrigin = SecurityOrigin::create(origin); StorageArea::dispatchLocalStorageEvent( key, oldValue, newValue, securityOrigin.get(), pageURL, - sourceAreaInstance, originatedInProcess); + sourceAreaInstance); } void WebStorageEventDispatcher::dispatchSessionStorageEvent( const WebString& key, const WebString& oldValue, const WebString& newValue, const WebURL& origin, const WebURL& pageURL, const WebStorageNamespace& sessionNamespace, - WebStorageArea* sourceAreaInstance, bool originatedInProcess) + WebStorageArea* sourceAreaInstance) { RefPtr<SecurityOrigin> securityOrigin = SecurityOrigin::create(origin); StorageArea::dispatchSessionStorageEvent( key, oldValue, newValue, securityOrigin.get(), pageURL, - sessionNamespace, sourceAreaInstance, originatedInProcess); + sessionNamespace, sourceAreaInstance); } } // namespace blink
diff --git a/third_party/WebKit/Source/web/WebViewFrameWidget.cpp b/third_party/WebKit/Source/web/WebViewFrameWidget.cpp index 2a60f15..86f9d4b3 100644 --- a/third_party/WebKit/Source/web/WebViewFrameWidget.cpp +++ b/third_party/WebKit/Source/web/WebViewFrameWidget.cpp
@@ -265,6 +265,21 @@ return m_webView->setVisibilityState(visibilityState, isInitialState); } +void WebViewFrameWidget::setIsTransparent(bool isTransparent) +{ + m_webView->setIsTransparent(isTransparent); +} + +bool WebViewFrameWidget::isTransparent() const +{ + return m_webView->isTransparent(); +} + +void WebViewFrameWidget::setBaseBackgroundColor(WebColor color) +{ + m_webView->setBaseBackgroundColor(color); +} + void WebViewFrameWidget::scheduleAnimation() { m_webView->scheduleAnimation();
diff --git a/third_party/WebKit/Source/web/WebViewFrameWidget.h b/third_party/WebKit/Source/web/WebViewFrameWidget.h index 559ca6d..870f2d2 100644 --- a/third_party/WebKit/Source/web/WebViewFrameWidget.h +++ b/third_party/WebKit/Source/web/WebViewFrameWidget.h
@@ -94,6 +94,9 @@ void setTopControlsHeight(float height, bool topControlsShrinkLayoutSize) override; void updateTopControlsState(WebTopControlsState constraints, WebTopControlsState current, bool animate) override; void setVisibilityState(WebPageVisibilityState, bool isInitialState) override; + bool isTransparent() const override; + void setIsTransparent(bool) override; + void setBaseBackgroundColor(WebColor) override; bool forSubframe() const { return false; } void scheduleAnimation() override;
diff --git a/third_party/WebKit/Source/web/WebViewImpl.h b/third_party/WebKit/Source/web/WebViewImpl.h index 9858b0af..adab552 100644 --- a/third_party/WebKit/Source/web/WebViewImpl.h +++ b/third_party/WebKit/Source/web/WebViewImpl.h
@@ -168,9 +168,6 @@ WebSettings* settings() override; WebString pageEncoding() const override; void setPageEncoding(const WebString&) override; - bool isTransparent() const override; - void setIsTransparent(bool value) override; - void setBaseBackgroundColor(WebColor) override; bool tabsToLinks() const override; void setTabsToLinks(bool value) override; bool tabKeyCyclesThroughElements() const override; @@ -294,6 +291,7 @@ void invalidateRect(const IntRect&); void setIgnoreInputEvents(bool newValue); + void setBaseBackgroundColor(WebColor); void setBackgroundColorOverride(WebColor); void setZoomFactorOverride(float); void updateShowFPSCounter(); @@ -537,6 +535,9 @@ // Use in Slimming Paint v2 to update the layer tree for the content. PaintArtifactCompositor& paintArtifactCompositor() { return m_paintArtifactCompositor; } + bool isTransparent() const; + void setIsTransparent(bool value); + private: InspectorOverlay* inspectorOverlay();
diff --git a/third_party/WebKit/Source/web/tests/SpinLockTest.cpp b/third_party/WebKit/Source/web/tests/SpinLockTest.cpp index 54544f76..e0dbaf1 100644 --- a/third_party/WebKit/Source/web/tests/SpinLockTest.cpp +++ b/third_party/WebKit/Source/web/tests/SpinLockTest.cpp
@@ -30,9 +30,9 @@ #include "wtf/SpinLock.h" -#include "platform/Task.h" #include "platform/ThreadSafeFunctional.h" #include "public/platform/Platform.h" +#include "public/platform/WebTaskRunner.h" #include "public/platform/WebThread.h" #include "public/platform/WebTraceLocation.h" #include "testing/gtest/include/gtest/gtest.h" @@ -80,8 +80,8 @@ OwnPtr<WebThread> thread1 = adoptPtr(Platform::current()->createThread("thread1")); OwnPtr<WebThread> thread2 = adoptPtr(Platform::current()->createThread("thread2")); - thread1->taskRunner()->postTask(BLINK_FROM_HERE, new Task(threadSafeBind(&threadMain, AllowCrossThreadAccess(static_cast<char*>(sharedBuffer))))); - thread2->taskRunner()->postTask(BLINK_FROM_HERE, new Task(threadSafeBind(&threadMain, AllowCrossThreadAccess(static_cast<char*>(sharedBuffer))))); + thread1->taskRunner()->postTask(BLINK_FROM_HERE, threadSafeBind(&threadMain, AllowCrossThreadAccess(static_cast<char*>(sharedBuffer)))); + thread2->taskRunner()->postTask(BLINK_FROM_HERE, threadSafeBind(&threadMain, AllowCrossThreadAccess(static_cast<char*>(sharedBuffer)))); thread1.clear(); thread2.clear();
diff --git a/third_party/WebKit/Source/web/tests/VisualViewportTest.cpp b/third_party/WebKit/Source/web/tests/VisualViewportTest.cpp index 14fea8c..e178f58e 100644 --- a/third_party/WebKit/Source/web/tests/VisualViewportTest.cpp +++ b/third_party/WebKit/Source/web/tests/VisualViewportTest.cpp
@@ -1478,7 +1478,8 @@ // Test that the various window.scroll and document.body.scroll properties and // methods work unchanged from the pre-virtual viewport mode. -TEST_P(ParameterizedVisualViewportTest, bodyAndWindowScrollPropertiesAccountForViewport) +// TODO(crbug.com/590435) +MAYBE_TEST_P(bodyAndWindowScrollPropertiesAccountForViewport) { initializeWithAndroidSettings();
diff --git a/third_party/WebKit/Source/web/tests/WebFrameTest.cpp b/third_party/WebKit/Source/web/tests/WebFrameTest.cpp index 6626bf2..41c5d4ce 100644 --- a/third_party/WebKit/Source/web/tests/WebFrameTest.cpp +++ b/third_party/WebKit/Source/web/tests/WebFrameTest.cpp
@@ -6899,6 +6899,15 @@ EXPECT_EQ(0, memcmp(bitmap.getPixels(), dragBitmap.getPixels(), bitmap.getSize())); } +TEST_P(ParameterizedWebFrameTest, NodeImageTestCSSTransformDescendant) +{ + FrameTestHelpers::WebViewHelper webViewHelper(this); + OwnPtr<DragImage> dragImage = nodeImageTestSetup(&webViewHelper, std::string("case-css-3dtransform-descendant")); + EXPECT_TRUE(dragImage); + + nodeImageTestValidation(IntSize(40, 40), dragImage.get()); +} + TEST_P(ParameterizedWebFrameTest, NodeImageTestCSSTransform) { FrameTestHelpers::WebViewHelper webViewHelper(this); @@ -6914,7 +6923,7 @@ OwnPtr<DragImage> dragImage = nodeImageTestSetup(&webViewHelper, std::string("case-css-3dtransform")); EXPECT_TRUE(dragImage); - nodeImageTestValidation(IntSize(20, 40), dragImage.get()); + nodeImageTestValidation(IntSize(40, 40), dragImage.get()); } TEST_P(ParameterizedWebFrameTest, NodeImageTestInlineBlock)
diff --git a/third_party/WebKit/Source/web/tests/WebViewTest.cpp b/third_party/WebKit/Source/web/tests/WebViewTest.cpp index 7c637ec3..791db5b 100644 --- a/third_party/WebKit/Source/web/tests/WebViewTest.cpp +++ b/third_party/WebKit/Source/web/tests/WebViewTest.cpp
@@ -536,7 +536,7 @@ { const WebColor kBlue = 0xFF0000FF; FrameTestHelpers::TestWebViewClient webViewClient; - WebView* webView = WebViewImpl::create(&webViewClient); + WebViewImpl* webView = WebViewImpl::create(&webViewClient); EXPECT_NE(kBlue, webView->backgroundColor()); // webView does not have a frame yet, but we should still be able to set the background color. webView->setBaseBackgroundColor(kBlue); @@ -554,7 +554,7 @@ const int kWidth = 100; const int kHeight = 100; - WebView* webView = m_webViewHelper.initialize(); + WebViewImpl* webView = m_webViewHelper.initialize(); // Set WebView background to green with alpha. webView->setBaseBackgroundColor(kAlphaGreen);
diff --git a/third_party/WebKit/Source/web/tests/data/nodeimage.html b/third_party/WebKit/Source/web/tests/data/nodeimage.html index 846a2db4..37cf41f 100644 --- a/third_party/WebKit/Source/web/tests/data/nodeimage.html +++ b/third_party/WebKit/Source/web/tests/data/nodeimage.html
@@ -1,5 +1,12 @@ <!DOCTYPE html> <div style="width: 40px"> + <div draggable="true" id="case-css-3dtransform-descendant" style="width: 40px; height: 40px; background-color: #ff0000;"> + <div style="background-color: #00ff00; width: 20px; height: 40px;"></div> + <div style="transform: translate3d(20px, -40px, 0); background-color: #00ff00; width: 20px; height: 40px;"></div> + </div> +</div> + +<div style="width: 40px"> <div style="transform:translate(40px,40px)"> <div draggable="true" id="case-css-transform" style="background-color: #00ff00;width: 40px;height: 40px;"></div> </div>
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/common/system/platforminfo.py b/third_party/WebKit/Tools/Scripts/webkitpy/common/system/platforminfo.py index 54df9fc..c9d1e21 100644 --- a/third_party/WebKit/Tools/Scripts/webkitpy/common/system/platforminfo.py +++ b/third_party/WebKit/Tools/Scripts/webkitpy/common/system/platforminfo.py
@@ -145,17 +145,12 @@ raise AssertionError('unrecognized platform string "%s"' % sys_platform) def _determine_mac_version(self, mac_version_string): - release_version = int(mac_version_string.split('.')[1]) - version_strings = { - 6: 'snowleopard', - 7: 'lion', - 8: 'mountainlion', - 9: 'mavericks', - 10: 'mac10.10', - 11: 'mac10.11', - } - assert release_version >= min(version_strings.keys()) - return version_strings.get(release_version, 'future') + minor_release = int(mac_version_string.split('.')[1]) + # FIXME: This should really be >= 9, and we should get rid of 'future'. + assert minor_release >= 6, 'Unsupported mac os version: %s' % mac_version_string + if minor_release in (9, 10, 11): + return 'mac10.%d' % minor_release + return 'future' def _determine_linux_version(self, platform_module): # Default to trusty if version is not recognized, this supports third party integrations.
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/common/system/platforminfo_unittest.py b/third_party/WebKit/Tools/Scripts/webkitpy/common/system/platforminfo_unittest.py index 85b64c2..e65eb54a 100644 --- a/third_party/WebKit/Tools/Scripts/webkitpy/common/system/platforminfo_unittest.py +++ b/third_party/WebKit/Tools/Scripts/webkitpy/common/system/platforminfo_unittest.py
@@ -137,7 +137,7 @@ def test_os_version(self): self.assertRaises(AssertionError, self.make_info, fake_sys('darwin'), fake_platform('10.4.3')) - self.assertEqual(self.make_info(fake_sys('darwin'), fake_platform('10.9.0')).os_version, 'mavericks') + self.assertEqual(self.make_info(fake_sys('darwin'), fake_platform('10.9.0')).os_version, 'mac10.9') self.assertEqual(self.make_info(fake_sys('darwin'), fake_platform('10.10.0')).os_version, 'mac10.10') self.assertEqual(self.make_info(fake_sys('darwin'), fake_platform('10.11.0')).os_version, 'mac10.11') self.assertEqual(self.make_info(fake_sys('darwin'), fake_platform('10.12.0')).os_version, 'future')
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/models/test_expectations.py b/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/models/test_expectations.py index 45b0df6..4fa8626 100644 --- a/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/models/test_expectations.py +++ b/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/models/test_expectations.py
@@ -59,17 +59,6 @@ NEEDS_REBASELINE_KEYWORD = 'NeedsRebaseline' NEEDS_MANUAL_REBASELINE_KEYWORD = 'NeedsManualRebaseline' -# TODO(ojan): Don't add new platforms here. New mac platforms -# should use the version number directly instead of the english -# language names throughout the code. -MAC_VERSION_MAPPING = { - 'mac10.9': 'mavericks', - 'mac10.10': 'mac10.10', - 'mac10.11': 'mac10.11', -} - -INVERTED_MAC_VERSION_MAPPING = {value: name for name, value in MAC_VERSION_MAPPING.items()} - class ParseError(Exception): def __init__(self, warnings): @@ -162,8 +151,7 @@ self._parse_expectations(expectation_line) def _parse_specifier(self, specifier): - specifier = specifier.lower() - return MAC_VERSION_MAPPING.get(specifier, specifier) + return specifier.lower() def _parse_specifiers(self, expectation_line): if self._is_lint_mode: @@ -522,7 +510,6 @@ result = [] result.extend(sorted(self.parsed_specifiers)) result.extend(test_configuration_converter.specifier_sorter().sort_specifiers(specifiers)) - result = [INVERTED_MAC_VERSION_MAPPING.get(specifier, specifier) for specifier in result] return ' '.join(result) @staticmethod
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/port/base.py b/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/port/base.py index af68cf4..35cab69 100644 --- a/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/port/base.py +++ b/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/port/base.py
@@ -98,7 +98,7 @@ # we need to test and support baselines across multiple O/S versions. ('retina', 'x86'), - ('mavericks', 'x86'), + ('mac10.9', 'x86'), ('mac10.10', 'x86'), ('mac10.11', 'x86'), ('win7', 'x86'), @@ -111,7 +111,7 @@ ) CONFIGURATION_SPECIFIER_MACROS = { - 'mac': ['retina', 'mavericks', 'mac10.10', 'mac10.11'], + 'mac': ['retina', 'mac10.9', 'mac10.10', 'mac10.11'], 'win': ['win7', 'win10'], 'linux': ['precise', 'trusty'], 'android': ['icecreamsandwich'],
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/port/builders.py b/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/port/builders.py index 531f5e3..63220c72 100644 --- a/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/port/builders.py +++ b/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/port/builders.py
@@ -45,7 +45,7 @@ "WebKit Linux": {"port_name": "linux-precise", "specifiers": ['Precise', 'Release']}, "WebKit Linux Trusty": {"port_name": "linux-trusty", "specifiers": ['Trusty', 'Release']}, "WebKit Linux (dbg)": {"port_name": "linux-precise", "specifiers": ['Precise', 'Debug']}, - "WebKit Mac10.9": {"port_name": "mac-mavericks", "specifiers": ['Mavericks', 'Release']}, + "WebKit Mac10.9": {"port_name": "mac-mac10.9", "specifiers": ['Mac10.9', 'Release']}, "WebKit Mac10.10": {"port_name": "mac-mac10.10", "specifiers": ['Mac10.10', 'Release']}, "WebKit Mac10.11": {"port_name": "mac-mac10.11", "specifiers": ['10.11', 'Release']}, "WebKit Mac10.11 (dbg)": {"port_name": "mac-mac10.11", "specifiers": ['10.11', 'Debug']},
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/port/mac.py b/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/port/mac.py index 8da35f5..fa84eaa 100644 --- a/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/port/mac.py +++ b/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/port/mac.py
@@ -38,7 +38,7 @@ class MacPort(base.Port): - SUPPORTED_VERSIONS = ('retina', 'mavericks', 'mac10.10', 'mac10.11') + SUPPORTED_VERSIONS = ('mac10.9', 'mac10.10', 'mac10.11', 'retina') port_name = 'mac' # FIXME: We treat Retina (High-DPI) devices as if they are running @@ -50,9 +50,9 @@ FALLBACK_PATHS = {} FALLBACK_PATHS['mac10.11'] = ['mac'] - FALLBACK_PATHS['retina'] = ['mac-retina'] + FALLBACK_PATHS['mac10.11'] FALLBACK_PATHS['mac10.10'] = ['mac-mac10.10'] + FALLBACK_PATHS['mac10.11'] - FALLBACK_PATHS['mavericks'] = ['mac-mavericks'] + FALLBACK_PATHS['mac10.10'] + FALLBACK_PATHS['mac10.9'] = ['mac-mac10.9'] + FALLBACK_PATHS['mac10.10'] + FALLBACK_PATHS['retina'] = ['mac-retina', 'mac'] DEFAULT_BUILD_DIRECTORIES = ('xcodebuild', 'out')
diff --git a/third_party/WebKit/public/platform/WebMediaPlayer.h b/third_party/WebKit/public/platform/WebMediaPlayer.h index b3739b4d..aebc9980 100644 --- a/third_party/WebKit/public/platform/WebMediaPlayer.h +++ b/third_party/WebKit/public/platform/WebMediaPlayer.h
@@ -143,8 +143,8 @@ virtual double currentTime() const = 0; // Internal states of loading and network. - virtual NetworkState networkState() const = 0; - virtual ReadyState readyState() const = 0; + virtual NetworkState getNetworkState() const = 0; + virtual ReadyState getReadyState() const = 0; virtual bool didLoadingProgress() = 0;
diff --git a/third_party/WebKit/public/platform/modules/background_sync/WebSyncProvider.h b/third_party/WebKit/public/platform/modules/background_sync/WebSyncProvider.h index c1d7d6e7..6101d6350 100644 --- a/third_party/WebKit/public/platform/modules/background_sync/WebSyncProvider.h +++ b/third_party/WebKit/public/platform/modules/background_sync/WebSyncProvider.h
@@ -17,7 +17,6 @@ class WebServiceWorkerRegistration; using WebSyncRegistrationCallbacks = WebCallbacks<WebPassOwnPtr<WebSyncRegistration>, const WebSyncError&>; -using WebSyncUnregistrationCallbacks = WebCallbacks<bool, const WebSyncError&>; using WebSyncGetRegistrationsCallbacks = WebCallbacks<const WebVector<WebSyncRegistration*>&, const WebSyncError&>; class WebSyncProvider { @@ -28,10 +27,6 @@ // Does not take ownership of the WebServiceWorkerRegistration. virtual void registerBackgroundSync(const WebSyncRegistration*, WebServiceWorkerRegistration*, bool, WebSyncRegistrationCallbacks*) = 0; - // Takes ownership of the WebSyncUnregistrationCallbacks. - // Does not take ownership of the WebServiceWorkerRegistration. - virtual void unregisterBackgroundSync(int64_t handleId, WebServiceWorkerRegistration*, WebSyncUnregistrationCallbacks*) = 0; - // Takes ownership of the WebSyncGetRegistrationsCallbacks. // Does not take ownership of the WebServiceWorkerRegistration. virtual void getRegistrations(WebServiceWorkerRegistration*, WebSyncGetRegistrationsCallbacks*) = 0;
diff --git a/third_party/WebKit/public/platform/modules/bluetooth/WebBluetooth.h b/third_party/WebKit/public/platform/modules/bluetooth/WebBluetooth.h index 090e5c65..b6352ab 100644 --- a/third_party/WebKit/public/platform/modules/bluetooth/WebBluetooth.h +++ b/third_party/WebKit/public/platform/modules/bluetooth/WebBluetooth.h
@@ -32,6 +32,10 @@ // Success and failure callbacks for getCharacteristic. using WebBluetoothGetCharacteristicCallbacks = WebCallbacks<WebPassOwnPtr<WebBluetoothRemoteGATTCharacteristicInit>, const WebBluetoothError&>; +// Success and failure callbacks for getCharacteristics. +using WebBluetoothGetCharacteristicsCallbacks = + WebCallbacks<WebPassOwnPtr<WebVector<WebBluetoothRemoteGATTCharacteristicInit*>>, const WebBluetoothError&>; + // Success and failure callbacks for readValue. using WebBluetoothReadValueCallbacks = WebCallbacks<const WebVector<uint8_t>&, const WebBluetoothError&>; @@ -68,6 +72,9 @@ virtual void getCharacteristic(const WebString& serviceInstanceID, const WebString& characteristicUUID, WebBluetoothGetCharacteristicCallbacks*) { } + virtual void getCharacteristics(const WebString& serviceInstanceID, + const WebString& characteristicsUUID, + WebBluetoothGetCharacteristicsCallbacks*) = 0; // BluetoothRemoteGATTCharacteristic methods: // See https://webbluetoothchrome.github.io/web-bluetooth/#bluetoothgattcharacteristic
diff --git a/third_party/WebKit/public/platform/modules/bluetooth/WebBluetoothError.h b/third_party/WebKit/public/platform/modules/bluetooth/WebBluetoothError.h index b9aef69..4504625 100644 --- a/third_party/WebKit/public/platform/modules/bluetooth/WebBluetoothError.h +++ b/third_party/WebKit/public/platform/modules/bluetooth/WebBluetoothError.h
@@ -44,9 +44,11 @@ NoBluetoothAdapter, ChosenDeviceVanished, ChooserCancelled, + ChooserDisabled, ChooserDeniedPermission, ServiceNotFound, CharacteristicNotFound, + NoCharacteristicsFound, // NotSupportedError: GATTUnknownError, GATTUnknownFailure,
diff --git a/third_party/WebKit/public/platform/modules/bluetooth/WebBluetoothRemoteGATTCharacteristicInit.h b/third_party/WebKit/public/platform/modules/bluetooth/WebBluetoothRemoteGATTCharacteristicInit.h index a07f917..052daeb 100644 --- a/third_party/WebKit/public/platform/modules/bluetooth/WebBluetoothRemoteGATTCharacteristicInit.h +++ b/third_party/WebKit/public/platform/modules/bluetooth/WebBluetoothRemoteGATTCharacteristicInit.h
@@ -13,8 +13,8 @@ // Contains members corresponding to BluetoothRemoteGATTCharacteristic attributes as // specified in the IDL. struct WebBluetoothRemoteGATTCharacteristicInit { - WebBluetoothRemoteGATTCharacteristicInit(const WebString& characteristicInstanceID, - const WebString& serviceInstanceID, + WebBluetoothRemoteGATTCharacteristicInit(const WebString& serviceInstanceID, + const WebString& characteristicInstanceID, const WebString& uuid, uint32_t characteristicProperties) : characteristicInstanceID(characteristicInstanceID)
diff --git a/third_party/WebKit/public/platform/modules/serviceworker/WebServiceWorkerResponse.h b/third_party/WebKit/public/platform/modules/serviceworker/WebServiceWorkerResponse.h index 30198279..74bdad6 100644 --- a/third_party/WebKit/public/platform/modules/serviceworker/WebServiceWorkerResponse.h +++ b/third_party/WebKit/public/platform/modules/serviceworker/WebServiceWorkerResponse.h
@@ -76,9 +76,6 @@ void setError(WebServiceWorkerResponseError); WebServiceWorkerResponseError error() const; - void setResponseTime(int64_t); - int64_t responseTime() const; - #if INSIDE_BLINK const HTTPHeaderMap& headers() const;
diff --git a/third_party/WebKit/public/web/WebFrameWidget.h b/third_party/WebKit/public/web/WebFrameWidget.h index 559de403..72092e4 100644 --- a/third_party/WebKit/public/web/WebFrameWidget.h +++ b/third_party/WebKit/public/web/WebFrameWidget.h
@@ -55,6 +55,21 @@ // it needs to draw or not. virtual void setVisibilityState(WebPageVisibilityState visibilityState, bool isInitialState) { } + // Makes the WebFrameWidget transparent. This is useful if you want to have + // some custom background rendered behind it. + virtual bool isTransparent() const = 0; + virtual void setIsTransparent(bool) = 0; + + // Sets the base color used for this WebFrameWidget's background. This is in + // effect the default background color used for pages with no + // background-color style in effect, or used as the alpha-blended basis for + // any pages with translucent background-color style. (For pages with opaque + // background-color style, this property is effectively ignored). + // Setting this takes effect for the currently loaded page, if any, and + // persists across subsequent navigations. Defaults to white prior to the + // first call to this method. + virtual void setBaseBackgroundColor(WebColor) = 0; + // TODO(dcheng): Temporary: there should only be one WebFrameWidget // implementation but the Blink API is currently in a transition state. // See https://goo.gl/7yVrnb. These methods should only be used inside
diff --git a/third_party/WebKit/public/web/WebStorageEventDispatcher.h b/third_party/WebKit/public/web/WebStorageEventDispatcher.h index aa681fd2..4090e88 100644 --- a/third_party/WebKit/public/web/WebStorageEventDispatcher.h +++ b/third_party/WebKit/public/web/WebStorageEventDispatcher.h
@@ -45,15 +45,14 @@ BLINK_EXPORT static void dispatchLocalStorageEvent( const WebString& key, const WebString& oldValue, const WebString& newValue, const WebURL& origin, - const WebURL& pageUrl, WebStorageArea* sourceAreaInstance, - bool originatedInProcess); + const WebURL& pageUrl, WebStorageArea* sourceAreaInstance); // Dispatch a session storage event to appropiate documents. BLINK_EXPORT static void dispatchSessionStorageEvent( const WebString& key, const WebString& oldValue, const WebString& newValue, const WebURL& origin, const WebURL& pageUrl, const WebStorageNamespace&, - WebStorageArea* sourceAreaInstance, bool originatedInProcess); + WebStorageArea* sourceAreaInstance); private: WebStorageEventDispatcher() { }
diff --git a/third_party/WebKit/public/web/WebView.h b/third_party/WebKit/public/web/WebView.h index 66eb058..a04be6d 100644 --- a/third_party/WebKit/public/web/WebView.h +++ b/third_party/WebKit/public/web/WebView.h
@@ -109,21 +109,6 @@ virtual WebString pageEncoding() const = 0; virtual void setPageEncoding(const WebString&) = 0; - // Makes the WebView transparent. This is useful if you want to have - // some custom background rendered behind it. - virtual bool isTransparent() const = 0; - virtual void setIsTransparent(bool) = 0; - - // Sets the base color used for this WebView's background. This is in effect - // the default background color used for pages with no background-color - // style in effect, or used as the alpha-blended basis for any pages with - // translucent background-color style. (For pages with opaque - // background-color style, this property is effectively ignored). - // Setting this takes effect for the currently loaded page, if any, and - // persists across subsequent navigations. Defaults to white prior to the - // first call to this method. - virtual void setBaseBackgroundColor(WebColor) = 0; - // Controls whether pressing Tab key advances focus to links. virtual bool tabsToLinks() const = 0; virtual void setTabsToLinks(bool) = 0;
diff --git a/third_party/sqlite/patches/0005-Virtual-table-supporting-recovery-of-corrupted-datab.patch b/third_party/sqlite/patches/0005-Virtual-table-supporting-recovery-of-corrupted-datab.patch index 35a29b9..7d925c4 100644 --- a/third_party/sqlite/patches/0005-Virtual-table-supporting-recovery-of-corrupted-datab.patch +++ b/third_party/sqlite/patches/0005-Virtual-table-supporting-recovery-of-corrupted-datab.patch
@@ -1,7 +1,7 @@ -From 29b8ad9263dbc700c002e9044c7c712a566a26d7 Mon Sep 17 00:00:00 2001 +From 31dd2fd1cdeba87223f6a46cc19bcea9eb8b2f38 Mon Sep 17 00:00:00 2001 From: Scott Hess <shess@chromium.org> Date: Sat, 20 Jul 2013 11:42:21 -0700 -Subject: [PATCH 05/10] Virtual table supporting recovery of corrupted +Subject: [PATCH 05/13] Virtual table supporting recovery of corrupted databases. "recover" implements a virtual table which uses the SQLite pager layer @@ -19,14 +19,14 @@ third_party/sqlite/src/Makefile.linux-gcc | 4 + third_party/sqlite/src/main.mk | 5 +- third_party/sqlite/src/src/main.c | 8 + - third_party/sqlite/src/src/recover.c | 2167 ++++++++++++++++++++++++++++ + third_party/sqlite/src/src/recover.c | 2281 ++++++++++++++++++++++++++++ third_party/sqlite/src/src/sqlite.h.in | 16 + - third_party/sqlite/src/test/recover.test | 147 ++ + third_party/sqlite/src/test/recover.test | 164 ++ third_party/sqlite/src/test/recover0.test | 532 +++++++ third_party/sqlite/src/test/recover1.test | 429 ++++++ third_party/sqlite/src/test/recover2.test | 157 ++ third_party/sqlite/src/tool/mksqlite3c.tcl | 2 + - 11 files changed, 3467 insertions(+), 1 deletion(-) + 11 files changed, 3598 insertions(+), 1 deletion(-) create mode 100644 third_party/sqlite/src/src/recover.c create mode 100644 third_party/sqlite/src/test/recover.test create mode 100644 third_party/sqlite/src/test/recover0.test @@ -111,10 +111,10 @@ rc = sqlite3IcuInit(db); diff --git a/third_party/sqlite/src/src/recover.c b/third_party/sqlite/src/src/recover.c new file mode 100644 -index 0000000..8e3929d +index 0000000..5ff6f78 --- /dev/null +++ b/third_party/sqlite/src/src/recover.c -@@ -0,0 +1,2167 @@ +@@ -0,0 +1,2281 @@ +/* +** 2012 Jan 11 +** @@ -354,6 +354,15 @@ +static const unsigned char kTableLeafPage = 0x0D; +static const unsigned char kTableInteriorPage = 0x05; + ++/* From section 1.2. */ ++static const unsigned kiHeaderPageSizeOffset = 16; ++static const unsigned kiHeaderReservedSizeOffset = 20; ++static const unsigned kiHeaderEncodingOffset = 56; ++/* TODO(shess) |static const unsigned| fails creating the header in GetPager() ++** because |knHeaderSize| isn't |constexpr|. But this isn't C++, either. ++*/ ++enum { knHeaderSize = 100}; ++ +/* From section 1.5. */ +static const unsigned kiPageTypeOffset = 0; +static const unsigned kiPageFreeBlockOffset = 1; @@ -487,9 +496,104 @@ + return ascii_strncasecmp(s1, s2, strlen(s1)+1); +} + ++/* Provide access to the pages of a SQLite database in a way similar to SQLite's ++** Pager. ++*/ ++typedef struct RecoverPager RecoverPager; ++struct RecoverPager { ++ sqlite3_file *pSqliteFile; /* Reference to database's file handle */ ++ u32 nPageSize; /* Size of pages in pSqliteFile */ ++}; ++ ++static void pagerDestroy(RecoverPager *pPager){ ++ pPager->pSqliteFile->pMethods->xUnlock(pPager->pSqliteFile, SQLITE_LOCK_NONE); ++ memset(pPager, 0xA5, sizeof(*pPager)); ++ sqlite3_free(pPager); ++} ++ ++/* pSqliteFile should already have a SHARED lock. */ ++static int pagerCreate(sqlite3_file *pSqliteFile, u32 nPageSize, ++ RecoverPager **ppPager){ ++ RecoverPager *pPager = sqlite3_malloc(sizeof(RecoverPager)); ++ if( !pPager ){ ++ return SQLITE_NOMEM; ++ } ++ ++ memset(pPager, 0, sizeof(*pPager)); ++ pPager->pSqliteFile = pSqliteFile; ++ pPager->nPageSize = nPageSize; ++ *ppPager = pPager; ++ return SQLITE_OK; ++} ++ ++/* Matches DbPage (aka PgHdr) from SQLite internals. */ ++/* TODO(shess): SQLite by default allocates page metadata in a single allocation ++** such that the page's data and metadata are contiguous, see pcache1AllocPage ++** in pcache1.c. I believe this was intended to reduce malloc churn. It means ++** that Chromium's automated tooling would be unlikely to see page-buffer ++** overruns. I believe that this code is safe, but for now replicate SQLite's ++** approach with kExcessSpace. ++*/ ++const int kExcessSpace = 128; ++typedef struct RecoverPage RecoverPage; ++struct RecoverPage { ++ Pgno pgno; /* Page number for this page */ ++ void *pData; /* Page data for pgno */ ++ RecoverPager *pPager; /* The pager this page is part of */ ++}; ++ ++static void pageDestroy(RecoverPage *pPage){ ++ sqlite3_free(pPage->pData); ++ memset(pPage, 0xA5, sizeof(*pPage)); ++ sqlite3_free(pPage); ++} ++ ++static int pageCreate(RecoverPager *pPager, u32 pgno, RecoverPage **ppPage){ ++ RecoverPage *pPage = sqlite3_malloc(sizeof(RecoverPage)); ++ if( !pPage ){ ++ return SQLITE_NOMEM; ++ } ++ ++ memset(pPage, 0, sizeof(*pPage)); ++ pPage->pPager = pPager; ++ pPage->pgno = pgno; ++ pPage->pData = sqlite3_malloc(pPager->nPageSize + kExcessSpace); ++ if( pPage->pData==NULL ){ ++ pageDestroy(pPage); ++ return SQLITE_NOMEM; ++ } ++ memset((u8 *)pPage->pData + pPager->nPageSize, 0, kExcessSpace); ++ ++ *ppPage = pPage; ++ return SQLITE_OK; ++} ++ ++static int pagerGetPage(RecoverPager *pPager, u32 iPage, RecoverPage **ppPage) { ++ sqlite3_int64 iOfst; ++ sqlite3_file *pFile = pPager->pSqliteFile; ++ RecoverPage *pPage; ++ int rc = pageCreate(pPager, iPage, &pPage); ++ if( rc!=SQLITE_OK ){ ++ return rc; ++ } ++ ++ /* xRead() can return SQLITE_IOERR_SHORT_READ, which should be treated as ++ ** SQLITE_OK plus an EOF indicator. The excess space is zero-filled. ++ */ ++ iOfst = ((sqlite3_int64)iPage - 1) * pPager->nPageSize; ++ rc = pFile->pMethods->xRead(pFile, pPage->pData, pPager->nPageSize, iOfst); ++ if( rc!=SQLITE_OK && rc!=SQLITE_IOERR_SHORT_READ ){ ++ pageDestroy(pPage); ++ return rc; ++ } ++ ++ *ppPage = pPage; ++ return SQLITE_OK; ++} ++ +/* For some reason I kept making mistakes with offset calculations. */ -+static const unsigned char *PageData(DbPage *pPage, unsigned iOffset){ -+ assert( iOffset<=pPage->nPageSize ); ++static const unsigned char *PageData(RecoverPage *pPage, unsigned iOffset){ ++ assert( iOffset<=pPage->pPager->nPageSize ); + return (unsigned char *)pPage->pData + iOffset; +} + @@ -498,10 +602,9 @@ + * the offsets in the page's header information are relative to the + * beginning of the page, NOT the end of the page header. + */ -+static const unsigned char *PageHeader(DbPage *pPage){ ++static const unsigned char *PageHeader(RecoverPage *pPage){ + if( pPage->pgno==1 ){ -+ const unsigned nDatabaseHeader = 100; -+ return PageData(pPage, nDatabaseHeader); ++ return PageData(pPage, knHeaderSize); + }else{ + return PageData(pPage, 0); + } @@ -509,22 +612,74 @@ + +/* Helper to fetch the pager and page size for the named database. */ +static int GetPager(sqlite3 *db, const char *zName, -+ Pager **pPager, unsigned *pnPageSize){ -+ Btree *pBt = NULL; -+ int i; -+ for( i=0; i<db->nDb; ++i ){ -+ if( ascii_strcasecmp(db->aDb[i].zName, zName)==0 ){ -+ pBt = db->aDb[i].pBt; -+ break; -+ } -+ } -+ if( !pBt ){ -+ return SQLITE_ERROR; ++ RecoverPager **ppPager, unsigned *pnPageSize, ++ int *piEncoding){ ++ int rc, iEncoding; ++ unsigned nPageSize, nReservedSize; ++ unsigned char header[knHeaderSize]; ++ sqlite3_file *pFile = NULL; ++ RecoverPager *pPager; ++ ++ rc = sqlite3_file_control(db, zName, SQLITE_FCNTL_FILE_POINTER, &pFile); ++ if( rc!=SQLITE_OK ) { ++ return rc; ++ } else if( pFile==NULL ){ ++ /* The documentation for sqlite3PagerFile() indicates it can return NULL if ++ ** the file has not yet been opened. That should not be possible here... ++ */ ++ return SQLITE_MISUSE; + } + -+ *pPager = sqlite3BtreePager(pBt); -+ *pnPageSize = -+ sqlite3BtreeGetPageSize(pBt) - sqlite3BtreeGetOptimalReserve(pBt); ++ /* Get a shared lock to make sure the on-disk version of the file is truth. */ ++ rc = pFile->pMethods->xLock(pFile, SQLITE_LOCK_SHARED); ++ if( rc != SQLITE_OK ){ ++ return rc; ++ } ++ ++ /* Read the Initial header information. In case of SQLITE_IOERR_SHORT_READ, ++ ** the header is incomplete, which means no data could be recovered anyhow. ++ */ ++ rc = pFile->pMethods->xRead(pFile, header, sizeof(header), 0); ++ if( rc != SQLITE_OK ){ ++ pFile->pMethods->xUnlock(pFile, SQLITE_LOCK_NONE); ++ if( rc==SQLITE_IOERR_SHORT_READ ){ ++ return SQLITE_CORRUPT; ++ } ++ return rc; ++ } ++ ++ /* Page size must be a power of two between 512 and 32768 inclusive. */ ++ nPageSize = decodeUnsigned16(header + kiHeaderPageSizeOffset); ++ if( (nPageSize&(nPageSize-1)) || nPageSize>32768 || nPageSize<512 ){ ++ pFile->pMethods->xUnlock(pFile, SQLITE_LOCK_NONE); ++ return rc; ++ } ++ ++ /* Space reserved a the end of the page for extensions. Usually 0. */ ++ nReservedSize = header[kiHeaderReservedSizeOffset]; ++ ++ /* 1 for UTF-8, 2 for UTF-16le, 3 for UTF-16be. */ ++ iEncoding = decodeUnsigned32(header + kiHeaderEncodingOffset); ++ if( iEncoding==3 ){ ++ *piEncoding = SQLITE_UTF16BE; ++ } else if( iEncoding==2 ){ ++ *piEncoding = SQLITE_UTF16LE; ++ } else if( iEncoding==1 ){ ++ *piEncoding = SQLITE_UTF8; ++ } else { ++ /* This case should not be possible. */ ++ *piEncoding = SQLITE_UTF8; ++ } ++ ++ rc = pagerCreate(pFile, nPageSize, &pPager); ++ if( rc!=SQLITE_OK ){ ++ pFile->pMethods->xUnlock(pFile, SQLITE_LOCK_NONE); ++ return rc; ++ } ++ ++ *ppPager = pPager; ++ *pnPageSize = nPageSize - nReservedSize; ++ *piEncoding = iEncoding; + return SQLITE_OK; +} + @@ -548,7 +703,7 @@ + case 7 : return 8; /* 64-bit float. */ + case 8 : return 0; /* Constant 0. */ + case 9 : return 0; /* Constant 1. */ -+ case 10 : case 11 : assert( !"RESERVED TYPE"); return 0; ++ case 10 : case 11 : assert( "RESERVED TYPE"==NULL ); return 0; + } + return (u32)((iSerialType>>1) - 6); +} @@ -574,8 +729,8 @@ + case 7 : return (mask&MASK_FLOAT)!=0; + case 8 : return (mask&MASK_INTEGER)!=0; + case 9 : return (mask&MASK_INTEGER)!=0; -+ case 10 : assert( !"RESERVED TYPE"); return 0; -+ case 11 : assert( !"RESERVED TYPE"); return 0; ++ case 10 : assert( "RESERVED TYPE"==NULL ); return 0; ++ case 11 : assert( "RESERVED TYPE"==NULL ); return 0; + } + return (mask&(SerialTypeIsBlob(iSerialType) ? MASK_BLOB : MASK_TEXT)); +} @@ -651,57 +806,6 @@ + return rc; +} + -+static int getEncoding(sqlite3 *db, const char *zDb, int* piEncoding){ -+ sqlite3_stmt *pStmt; -+ int rc; -+ char *zSql = sqlite3_mprintf("PRAGMA %s.encoding", zDb); -+ if( !zSql ){ -+ return SQLITE_NOMEM; -+ } -+ -+ rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0); -+ sqlite3_free(zSql); -+ if( rc!=SQLITE_OK ){ -+ return rc; -+ } -+ -+ /* Require a result. */ -+ rc = sqlite3_step(pStmt); -+ if( rc==SQLITE_DONE ){ -+ /* This case should not be possible. */ -+ rc = SQLITE_CORRUPT; -+ }else if( rc==SQLITE_ROW ){ -+ if( sqlite3_column_type(pStmt, 0)==SQLITE_TEXT ){ -+ const char* z = (const char *)sqlite3_column_text(pStmt, 0); -+ /* These strings match the literals in pragma.c. */ -+ if( !strcmp(z, "UTF-16le") ){ -+ *piEncoding = SQLITE_UTF16LE; -+ }else if( !strcmp(z, "UTF-16be") ){ -+ *piEncoding = SQLITE_UTF16BE; -+ }else if( !strcmp(z, "UTF-8") ){ -+ *piEncoding = SQLITE_UTF8; -+ }else{ -+ /* This case should not be possible. */ -+ *piEncoding = SQLITE_UTF8; -+ } -+ }else{ -+ /* This case should not be possible. */ -+ *piEncoding = SQLITE_UTF8; -+ } -+ -+ /* Require only one result. */ -+ rc = sqlite3_step(pStmt); -+ if( rc==SQLITE_DONE ){ -+ rc = SQLITE_OK; -+ }else if( rc==SQLITE_ROW ){ -+ /* This case should not be possible. */ -+ rc = SQLITE_CORRUPT; -+ } -+ } -+ sqlite3_finalize(pStmt); -+ return rc; -+} -+ +/* Cursor for iterating interior nodes. Interior page cells contain a + * child page number and a rowid. The child page contains items left + * of the rowid (less than). The rightmost page of the subtree is @@ -737,7 +841,7 @@ +typedef struct RecoverInteriorCursor RecoverInteriorCursor; +struct RecoverInteriorCursor { + RecoverInteriorCursor *pParent; /* Parent node to this node. */ -+ DbPage *pPage; /* Reference to leaf page. */ ++ RecoverPage *pPage; /* Reference to leaf page. */ + unsigned nPageSize; /* Size of page. */ + unsigned nChildren; /* Number of children on the page. */ + unsigned iChild; /* Index of next child to return. */ @@ -750,7 +854,7 @@ + pCursor = pCursor->pParent; + + if( p->pPage ){ -+ sqlite3PagerUnref(p->pPage); ++ pageDestroy(p->pPage); + p->pPage = NULL; + } + @@ -761,13 +865,13 @@ + +/* Internal helper. Reset storage in preparation for iterating pPage. */ +static void interiorCursorSetPage(RecoverInteriorCursor *pCursor, -+ DbPage *pPage){ ++ RecoverPage *pPage){ + const unsigned knMinCellLength = 2 + 4 + 1; + unsigned nMaxChildren; + assert( PageHeader(pPage)[kiPageTypeOffset]==kTableInteriorPage ); + + if( pCursor->pPage ){ -+ sqlite3PagerUnref(pCursor->pPage); ++ pageDestroy(pCursor->pPage); + pCursor->pPage = NULL; + } + pCursor->pPage = pPage; @@ -798,7 +902,7 @@ +} + +static int interiorCursorCreate(RecoverInteriorCursor *pParent, -+ DbPage *pPage, int nPageSize, ++ RecoverPage *pPage, int nPageSize, + RecoverInteriorCursor **ppCursor){ + RecoverInteriorCursor *pCursor = + sqlite3_malloc(sizeof(RecoverInteriorCursor)); @@ -883,7 +987,7 @@ + * reverse the list during traversal. + */ +static int interiorCursorNextPage(RecoverInteriorCursor **ppCursor, -+ DbPage **ppPage){ ++ RecoverPage **ppPage){ + RecoverInteriorCursor *pCursor = *ppCursor; + while( 1 ){ + int rc; @@ -896,7 +1000,7 @@ + if( interiorCursorPageInUse(pCursor, iPage) ){ + fprintf(stderr, "Loop detected at %d\n", iPage); + }else{ -+ int rc = sqlite3PagerGet(pCursor->pPage->pPager, iPage, ppPage, 0); ++ int rc = pagerGetPage(pCursor->pPage->pPager, iPage, ppPage); + if( rc==SQLITE_OK ){ + return SQLITE_ROW; + } @@ -950,7 +1054,7 @@ +typedef struct RecoverOverflow RecoverOverflow; +struct RecoverOverflow { + RecoverOverflow *pNextOverflow; -+ DbPage *pPage; ++ RecoverPage *pPage; + unsigned nPageSize; +}; + @@ -960,7 +1064,7 @@ + pOverflow = p->pNextOverflow; + + if( p->pPage ){ -+ sqlite3PagerUnref(p->pPage); ++ pageDestroy(p->pPage); + p->pPage = NULL; + } + @@ -987,7 +1091,7 @@ + * overflowGetSegment() will do the right thing regardless of whether + * those values are set to be in-page or not. + */ -+static int overflowMaybeCreate(DbPage *pPage, unsigned nPageSize, ++static int overflowMaybeCreate(RecoverPage *pPage, unsigned nPageSize, + unsigned iRecordOffset, unsigned nRecordBytes, + unsigned *pnLocalRecordBytes, + RecoverOverflow **ppOverflow){ @@ -1040,14 +1144,14 @@ + while( iNextPage && nBytes<nRecordBytes ){ + RecoverOverflow *pOverflow; /* New overflow page for the list. */ + -+ rc = sqlite3PagerGet(pPage->pPager, iNextPage, &pPage, 0); ++ rc = pagerGetPage(pPage->pPager, iNextPage, &pPage); + if( rc!=SQLITE_OK ){ + break; + } + + pOverflow = sqlite3_malloc(sizeof(RecoverOverflow)); + if( !pOverflow ){ -+ sqlite3PagerUnref(pPage); ++ pageDestroy(pPage); + rc = SQLITE_NOMEM; + break; + } @@ -1111,7 +1215,7 @@ + * and overflow pages consistently by adjusting the values + * appropriately. + */ -+static int overflowGetSegment(DbPage *pPage, unsigned iRecordOffset, ++static int overflowGetSegment(RecoverPage *pPage, unsigned iRecordOffset, + unsigned nLocalRecordBytes, + RecoverOverflow *pOverflow, + unsigned iRequestOffset, unsigned nRequestBytes, @@ -1218,7 +1322,8 @@ +typedef struct RecoverLeafCursor RecoverLeafCursor; +struct RecoverLeafCursor { + RecoverInteriorCursor *pParent; /* Parent node to this node. */ -+ DbPage *pPage; /* Reference to leaf page. */ ++ RecoverPager *pPager; /* Page provider. */ ++ RecoverPage *pPage; /* Current leaf page. */ + unsigned nPageSize; /* Size of pPage. */ + unsigned nCells; /* Number of cells in pPage. */ + unsigned iCell; /* Current cell. */ @@ -1253,12 +1358,13 @@ + * If SQLITE_OK is returned, the caller no longer owns pPage, + * otherwise the caller is responsible for discarding it. + */ -+static int leafCursorLoadPage(RecoverLeafCursor *pCursor, DbPage *pPage){ ++static int leafCursorLoadPage(RecoverLeafCursor *pCursor, RecoverPage *pPage){ + const unsigned char *pPageHeader; /* Header of *pPage */ ++ unsigned nCells; /* Number of cells in the page */ + + /* Release the current page. */ + if( pCursor->pPage ){ -+ sqlite3PagerUnref(pCursor->pPage); ++ pageDestroy(pCursor->pPage); + pCursor->pPage = NULL; + pCursor->iCell = pCursor->nCells = 0; + } @@ -1280,14 +1386,21 @@ + + /* Not a leaf page, skip it. */ + if( pPageHeader[kiPageTypeOffset]!=kTableLeafPage ){ -+ sqlite3PagerUnref(pPage); ++ pageDestroy(pPage); ++ return SQLITE_OK; ++ } ++ ++ /* Leaf contains no data, skip it. Empty tables, for instance. */ ++ nCells = decodeUnsigned16(pPageHeader + kiPageCellCountOffset);; ++ if( nCells<1 ){ ++ pageDestroy(pPage); + return SQLITE_OK; + } + + /* Take ownership of the page and start decoding. */ + pCursor->pPage = pPage; + pCursor->iCell = 0; -+ pCursor->nCells = decodeUnsigned16(pPageHeader + kiPageCellCountOffset); ++ pCursor->nCells = nCells; + return SQLITE_OK; +} + @@ -1302,7 +1415,7 @@ + + /* Repeatedly load the parent's next child page until a leaf is found. */ + do { -+ DbPage *pNextPage; ++ RecoverPage *pNextPage; + int rc = interiorCursorNextPage(&pCursor->pParent, &pNextPage); + if( rc!=SQLITE_ROW ){ + assert( rc==SQLITE_DONE ); @@ -1311,7 +1424,7 @@ + + rc = leafCursorLoadPage(pCursor, pNextPage); + if( rc!=SQLITE_OK ){ -+ sqlite3PagerUnref(pNextPage); ++ pageDestroy(pNextPage); + return rc; + } + } while( !pCursor->pPage ); @@ -1341,10 +1454,15 @@ + } + + if( pCursor->pPage ){ -+ sqlite3PagerUnref(pCursor->pPage); ++ pageDestroy(pCursor->pPage); + pCursor->pPage = NULL; + } + ++ if( pCursor->pPager ){ ++ pagerDestroy(pCursor->pPager); ++ pCursor->pPager = NULL; ++ } ++ + memset(pCursor, 0xA5, sizeof(*pCursor)); + sqlite3_free(pCursor); +} @@ -1362,30 +1480,31 @@ + * - pPage is a valid interior page who's leaves contain no valid cells. + * - pPage is not a valid leaf or interior page. + */ -+static int leafCursorCreate(Pager *pPager, unsigned nPageSize, ++static int leafCursorCreate(RecoverPager *pPager, unsigned nPageSize, + u32 iRootPage, RecoverLeafCursor **ppCursor){ -+ DbPage *pPage; /* Reference to page at iRootPage. */ ++ RecoverPage *pPage; /* Reference to page at iRootPage. */ + RecoverLeafCursor *pCursor; /* Leaf cursor being constructed. */ + int rc; + + /* Start out with the root page. */ -+ rc = sqlite3PagerGet(pPager, iRootPage, &pPage, 0); ++ rc = pagerGetPage(pPager, iRootPage, &pPage); + if( rc!=SQLITE_OK ){ + return rc; + } + + pCursor = sqlite3_malloc(sizeof(RecoverLeafCursor)); + if( !pCursor ){ -+ sqlite3PagerUnref(pPage); ++ pageDestroy(pPage); + return SQLITE_NOMEM; + } + memset(pCursor, 0, sizeof(*pCursor)); + + pCursor->nPageSize = nPageSize; ++ pCursor->pPager = pPager; + + rc = leafCursorLoadPage(pCursor, pPage); + if( rc!=SQLITE_OK ){ -+ sqlite3PagerUnref(pPage); ++ pageDestroy(pPage); + leafCursorDestroy(pCursor); + return rc; + } @@ -1728,7 +1847,7 @@ + u32 iRootPage; /* Root page of the backing table. */ + int iEncoding; /* UTF encoding for backing database. */ + unsigned nPageSize; /* Size of pages in backing database. */ -+ Pager *pPager; /* Backing database pager. */ ++ RecoverPager *pPager; /* Backing database pager. */ + RecoverLeafCursor *pLeafCursor; /* Cursor to read table's leaf pages. */ + RecoverCursor *pCursor; /* Cursor to read rows from leaves. */ + int rc; @@ -1742,19 +1861,14 @@ + return rc; + } + -+ iEncoding = 0; -+ rc = getEncoding(pRecover->db, pRecover->zDb, &iEncoding); -+ if( rc!=SQLITE_OK ){ -+ return rc; -+ } -+ -+ rc = GetPager(pRecover->db, pRecover->zDb, &pPager, &nPageSize); ++ rc = GetPager(pRecover->db, pRecover->zDb, &pPager, &nPageSize, &iEncoding); + if( rc!=SQLITE_OK ){ + return rc; + } + + rc = leafCursorCreate(pPager, nPageSize, iRootPage, &pLeafCursor); + if( rc!=SQLITE_OK ){ ++ pagerDestroy(pPager); + return rc; + } + @@ -2311,10 +2425,10 @@ ** DO NOT EXTEND THE USE OF THIS. diff --git a/third_party/sqlite/src/test/recover.test b/third_party/sqlite/src/test/recover.test new file mode 100644 -index 0000000..b5aa182 +index 0000000..bfb7888 --- /dev/null +++ b/third_party/sqlite/src/test/recover.test -@@ -0,0 +1,147 @@ +@@ -0,0 +1,164 @@ +# 2012 January 11 {} +# +# The author disclaims copyright to this source code. In place of @@ -2427,6 +2541,23 @@ + execsql {SELECT t, n FROM leaf_recover ORDER BY rowid} +} {{Leaf-node-generating line 0} 0 {Leaf-node-generating line 1} 1 {Leaf-node-generating line 2} 2 {Leaf-node-generating line 3} 3 {Leaf-node-generating line 4} 4 {Leaf-node-generating line 5} 5 {Leaf-node-generating line 6} 6 {Leaf-node-generating line 7} 7 {Leaf-node-generating line 8} 8 {Leaf-node-generating line 9} 9} + ++# Empty table gives empty results. ++do_test recover-leaf-2.0 { ++ db close ++ sqlite3 db test.db ++ generate "empty" "Leaf-node-generating line " 0 ++ ++ db eval { ++ DROP TABLE IF EXISTS temp.leaf_recover; ++ CREATE VIRTUAL TABLE temp.leaf_recover USING recover( ++ empty, ++ t TEXT, ++ n INTEGER ++ ); ++ } ++ execsql {SELECT t, n FROM leaf_recover ORDER BY rowid} ++} {} ++ +# Single level of interior node. +do_test recover-interior-1.0 { + db close
diff --git a/third_party/sqlite/patches/0013-icu-Fix-buffer-overflow-when-case-mapping-expands-to.patch b/third_party/sqlite/patches/0013-icu-Fix-buffer-overflow-when-case-mapping-expands-to.patch new file mode 100644 index 0000000..9239314e --- /dev/null +++ b/third_party/sqlite/patches/0013-icu-Fix-buffer-overflow-when-case-mapping-expands-to.patch
@@ -0,0 +1,101 @@ +From e2beb15e5092bd882ba261e403daf76ef1b26456 Mon Sep 17 00:00:00 2001 +From: Scott Hess <shess@chromium.org> +Date: Fri, 26 Feb 2016 10:49:33 -0800 +Subject: [PATCH 13/13] [icu] Fix buffer overflow when case mapping expands too + far. + +Previously the buffer was doubled in size to accomodate cases where the +case-mapped version was larger, but some cases expand by more than +double. Detect U_BUFFER_OVERFLOW_ERROR and expand to the provided size. + +Original Chromium checkin: +https://codereview.chromium.org/1704103002 +--- + third_party/sqlite/src/ext/icu/icu.c | 31 +++++++++++++++++++++++++------ + third_party/sqlite/src/test/icu.test | 7 +++++++ + 2 files changed, 32 insertions(+), 6 deletions(-) + +diff --git a/third_party/sqlite/src/ext/icu/icu.c b/third_party/sqlite/src/ext/icu/icu.c +index 7e2b800..d384f71 100644 +--- a/third_party/sqlite/src/ext/icu/icu.c ++++ b/third_party/sqlite/src/ext/icu/icu.c +@@ -341,26 +341,45 @@ static void icuCaseFunc16(sqlite3_context *p, int nArg, sqlite3_value **apArg){ + if( !zInput ){ + return; + } +- nInput = sqlite3_value_bytes16(apArg[0]); ++ nOutput = nInput = sqlite3_value_bytes16(apArg[0]); + +- nOutput = nInput * 2 + 2; + zOutput = sqlite3_malloc(nOutput); + if( !zOutput ){ + return; + } + + if( sqlite3_user_data(p) ){ +- u_strToUpper(zOutput, nOutput/2, zInput, nInput/2, zLocale, &status); ++ nOutput = u_strToUpper( ++ zOutput, nOutput/2, zInput, nInput/2, zLocale, &status) * 2; + }else{ +- u_strToLower(zOutput, nOutput/2, zInput, nInput/2, zLocale, &status); ++ nOutput = u_strToLower( ++ zOutput, nOutput/2, zInput, nInput/2, zLocale, &status) * 2; + } + +- if( !U_SUCCESS(status) ){ ++ if ( status == U_BUFFER_OVERFLOW_ERROR ) { ++ UChar* newOutput = sqlite3_realloc(zOutput, nOutput); ++ if( !newOutput ){ ++ sqlite3_free(zOutput); ++ return; ++ } ++ zOutput = newOutput; ++ status = U_ZERO_ERROR; ++ if( sqlite3_user_data(p) ){ ++ nOutput = u_strToUpper( ++ zOutput, nOutput/2, zInput, nInput/2, zLocale, &status) * 2; ++ }else{ ++ nOutput = u_strToLower( ++ zOutput, nOutput/2, zInput, nInput/2, zLocale, &status) * 2; ++ } ++ } ++ ++ if( U_FAILURE(status) ){ + icuFunctionError(p, "u_strToLower()/u_strToUpper", status); ++ sqlite3_free(zOutput); + return; + } + +- sqlite3_result_text16(p, zOutput, -1, xFree); ++ sqlite3_result_text16(p, zOutput, nOutput, xFree); + } + + /* +diff --git a/third_party/sqlite/src/test/icu.test b/third_party/sqlite/src/test/icu.test +index 73cb9b9..22948aa 100644 +--- a/third_party/sqlite/src/test/icu.test ++++ b/third_party/sqlite/src/test/icu.test +@@ -56,6 +56,10 @@ set ::ograve "\xF2" + # + set ::szlig "\xDF" + ++# U+FB03 (ffi ligature) and U+FB04 (ffl ligature). They're uppercased ++# to 'FFI' and 'FFL'. ++set ::ffi_ffl "\ufb03\ufb04" ++ + # Tests of the upper()/lower() functions. + # + test_expr icu-2.1 {i1='HellO WorlD'} {upper(i1)} {HELLO WORLD} +@@ -72,6 +76,9 @@ test_expr icu-2.6 {i1=$::OGRAVE} {upper(i1)} $::OGRAVE + test_expr icu-2.7 {i1=$::szlig} {upper(i1)} "SS" + test_expr icu-2.8 {i1='SS'} {lower(i1)} "ss" + ++test_expr icu-2.9 {i1=$::ffi_ffl} {upper(i1)} "FFIFFL" ++test_expr icu-2.10 {i1=$::ffi_ffl} {lower(i1)} $::ffi_ffl ++ + # In turkish (locale="tr_TR"), the lower case version of I + # is "small dotless i" (code point 0x131 (decimal 305)). + # +-- +2.7.0 +
diff --git a/tools/battor_agent/battor_agent_bin.cc b/tools/battor_agent/battor_agent_bin.cc index 7ba898f..7b256ae 100644 --- a/tools/battor_agent/battor_agent_bin.cc +++ b/tools/battor_agent/battor_agent_bin.cc
@@ -5,7 +5,31 @@ // This file provides a thin binary wrapper around the BattOr Agent // library. This binary wrapper provides a means for non-C++ tracing // controllers, such as Telemetry and Android Systrace, to issue high-level -// tracing commands to the BattOr.. +// tracing commands to the BattOr through an interactive shell. +// +// Example usage of how an external trace controller might use this binary: +// +// 1) Telemetry's PowerTracingAgent is told to start recording power samples +// 2) PowerTracingAgent opens up a BattOr agent binary subprocess +// 3) PowerTracingAgent sends the subprocess the StartTracing message via +// STDIN +// 4) PowerTracingAgent waits for the subprocess to write a line to STDOUT +// ('Done.' if successful, some error message otherwise) +// 5) If the last command was successful, PowerTracingAgent waits for the +// duration of the trace +// 6) When the tracing should end, PowerTracingAgent records the clock sync +// start timestamp and sends the subprocess the RecordClockSyncMark <marker>' +// message via STDIN. +// 7) PowerTracingAgent waits for the subprocess to write a line to STDOUT +// ('Done.' if successful, some error message otherwise) +// 8) If the last command was successful, PowerTracingAgent records the clock +// sync end timestamp and sends the subprocess the StopTracing message via +// STDIN +// 9) PowerTracingAgent continues to read trace output lines from STDOUT until +// the binary exits with an exit code of 1 (indicating failure) or the +// 'Done.' line is printed to STDOUT, signaling the last line of the trace +// 10) PowerTracingAgent returns the battery trace to the Telemetry trace +// controller #include <stdint.h> @@ -23,7 +47,6 @@ #include "tools/battor_agent/battor_error.h" #include "tools/battor_agent/battor_finder.h" -using std::cout; using std::endl; namespace { @@ -33,39 +56,26 @@ const char kUiThreadName[] = "BattOr UI Thread"; const int32_t kBattOrCommandTimeoutSeconds = 10; -void PrintUsage() { - cout << "Usage: battor_agent <command> <arguments> <switches>" << endl - << endl - << "Commands:" << endl - << endl - << " StartTracing" << endl - << " StopTracing" << endl - << " SupportsExplicitClockSync" << endl - << " RecordClockSyncMarker <marker>" << endl - << " IssueClockSyncMarker" << endl - << " Help" << endl - << endl - << "Switches:" << endl - << endl - << " --battor-path=<path> Uses the specified BattOr path." << endl; -} +const char kUsage[] = + "Start the battor_agent shell with:\n" + "\n" + " battor_agent <switches>\n" + "\n" + "Switches: \n" + " --battor-path=<path> Uses the specified BattOr path.\n" + "\n" + "Once in the shell, you can issue the following commands:\n" + "\n" + " StartTracing\n" + " StopTracing\n" + " SupportsExplicitClockSync\n" + " RecordClockSyncMarker <marker>\n" + " Exit\n" + " Help\n" + "\n"; void PrintSupportsExplicitClockSync() { - cout << battor::BattOrAgent::SupportsExplicitClockSync() << endl; -} - -// Retrieves argument argnum from the argument list, or an empty string if the -// argument doesn't exist. -std::string GetArg(size_t argnum, base::CommandLine::StringVector args) { - if (argnum >= args.size()) { - return std::string(); - } - -#if defined(OS_WIN) - return base::WideToUTF8(args[argnum]); -#else - return args[argnum]; -#endif + std::cout << battor::BattOrAgent::SupportsExplicitClockSync() << endl; } // Checks if an error occurred and, if it did, prints the error and exits @@ -96,43 +106,36 @@ ~BattOrAgentBin() { DCHECK(!agent_); } - // Runs the BattOr binary and returns the exit code. + // Starts the interactive BattOr agent shell and eventually returns an exit + // code. int Run(int argc, char* argv[]) { - base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); - std::string cmd = GetArg(0, command_line->GetArgs()); - if (cmd.empty()) { - PrintUsage(); - exit(1); - } - - // SupportsExplicitClockSync doesn't need to use the serial connection, so - // handle it separately. - if (cmd == "SupportsExplicitClockSync") { - PrintSupportsExplicitClockSync(); - return 0; - } - // If we don't have any BattOr to use, exit. std::string path = BattOrFinder::FindBattOr(); if (path.empty()) { - cout << "Unable to find a BattOr." << endl; + std::cout << "Unable to find a BattOr." << endl; exit(1); } SetUp(path); - if (cmd == "StartTracing") { - StartTracing(); - } else if (cmd == "StopTracing") { - StopTracing(); - } else if (cmd == "RecordClockSyncMarker") { - // TODO(charliea): Write RecordClockSyncMarker. - } else if (cmd == "IssueClockSyncMarker") { - // TODO(charliea): Write IssueClockSyncMarker. - } else { - TearDown(); - PrintUsage(); - return 1; + std::string cmd; + for (;;) { + std::getline(std::cin, cmd); + + if (cmd == "StartTracing") { + StartTracing(); + } else if (cmd == "StopTracing") { + StopTracing(); + break; + } else if (cmd == "SupportsExplicitClockSync") { + PrintSupportsExplicitClockSync(); + } else if (cmd == "RecordClockSyncMarker") { + // TODO(charliea): Write RecordClockSyncMarker. + } else if (cmd == "Exit") { + break; + } else { + std::cout << kUsage << endl; + } } TearDown(); @@ -172,6 +175,7 @@ void OnStartTracingComplete(BattOrError error) override { error_ = error; + std::cout << "Done." << endl; done_.Signal(); } @@ -187,7 +191,9 @@ error_ = error; if (error == BATTOR_ERROR_NONE) - cout << trace << endl; + std::cout << trace; + + std::cout << "Done." << endl; done_.Signal(); }
diff --git a/tools/chrome_proxy/testserver/app.yaml b/tools/chrome_proxy/testserver/app.yaml index 6a89db7..a73e1ee9 100644 --- a/tools/chrome_proxy/testserver/app.yaml +++ b/tools/chrome_proxy/testserver/app.yaml
@@ -1,3 +1,7 @@ +# Copyright 2016 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + application: chromeproxy-test version: 1 runtime: go
diff --git a/tools/chrome_proxy/testserver/server.go b/tools/chrome_proxy/testserver/server.go index c40bc5ee..698e45c 100644 --- a/tools/chrome_proxy/testserver/server.go +++ b/tools/chrome_proxy/testserver/server.go
@@ -1,3 +1,7 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// // Test server to facilitate the data reduction proxy Telemetry tests. // // The server runs at http://chromeproxy-test.appspot.com/. Please contact
diff --git a/tools/chrome_proxy/testserver/server_test.go b/tools/chrome_proxy/testserver/server_test.go index d2151311..d369b55 100644 --- a/tools/chrome_proxy/testserver/server_test.go +++ b/tools/chrome_proxy/testserver/server_test.go
@@ -1,3 +1,7 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + package server import (
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml index 5f5a88ef..b4817c6edf 100644 --- a/tools/metrics/histograms/histograms.xml +++ b/tools/metrics/histograms/histograms.xml
@@ -3060,6 +3060,9 @@ <histogram name="BackgroundSync.Unregistration.OneShot" enum="BackgroundSyncStatus"> <owner>iclelland@chromium.org</owner> + <obsolete> + Stopped recording as of 2/2016. + </obsolete> <summary> Records the result of attempting to unregister a one-shot sync. </summary> @@ -3551,7 +3554,31 @@ <owner>scheib@chromium.org</owner> <summary> Records the outcome of a call to getCharacteristic(). Used to understand - what errors developers are getting so we can target efforst toward the most + what errors developers are getting so we can target efforts toward the most + common ones. + </summary> +</histogram> + +<histogram name="Bluetooth.Web.GetCharacteristics.Characteristic" + enum="GATTCharacteristicHash"> + <owner>jyasskin@chromium.org</owner> + <owner>ortuno@chromium.org</owner> + <owner>scheib@chromium.org</owner> + <summary> + Records the UUIDs used when getting characteristics. The recorded value is a + 31-bit hash of the UUID. Used to know what types of characteristics to + target when building libraries that use the Web Bluetooth API. + </summary> +</histogram> + +<histogram name="Bluetooth.Web.GetCharacteristics.Outcome" + enum="WebBluetoothGetCharacteristicOutcome"> + <owner>jyasskin@chromium.org</owner> + <owner>ortuno@chromium.org</owner> + <owner>scheib@chromium.org</owner> + <summary> + Records the outcome of a call to getCharacteristics(). Used to understand + what errors developers are getting so we can target efforts toward the most common ones. </summary> </histogram> @@ -5592,6 +5619,14 @@ </summary> </histogram> +<histogram name="ContentSettings.DefaultWebBluetoothGuardSetting" + enum="ContentSetting"> + <owner>jyasskin@chromium.org</owner> + <summary> + The default permission setting for Web Bluetooth at profile open. + </summary> +</histogram> + <histogram name="ContentSettings.LastSettingParsed" enum="LastSettingParsed"> <obsolete> Deprecated 2015-10-05 in Issue 433475. Histogram was used temorarily for @@ -6635,9 +6670,9 @@ data saver proxy. An HTTP request may not go through data saver proxy if the config was - unavailable, local bypass rules or server side bypasses. If data saver is - turned on, this metric is recorded every time proxy is resolved for an HTTP - request. + unavailable, due to local bypass rules, or due to server side bypasses. If + data saver is turned on, this metric is recorded every time proxy is + resolved for an HTTP request. </summary> </histogram> @@ -22619,6 +22654,16 @@ </summary> </histogram> +<histogram name="NCN.CellularConnectionSubtype" enum="ConnectionSubtype"> + <owner>bmcquade@chromium.org</owner> + <summary> + The connection subtype of the network the client is connected to, when the + client is on a cellular connection. This histogram is logged once per UMA + record, if the user is on a cellular connection, at the time the record is + finalized. + </summary> +</histogram> + <histogram name="NCN.CM.FastestRTTOn2G" units="ms"> <owner>pauljensen@chromium.org</owner> <summary> @@ -32179,6 +32224,24 @@ <summary>Size of the saved copy of an offline page.</summary> </histogram> +<histogram name="OfflinePages.RedirectToOfflineCount" units="count"> + <owner>jianli@chromium.org</owner> + <summary> + Number of times an offline copy was loaded instead when the user is trying + to load the online version of a saved page and there is no network + connection. + </summary> +</histogram> + +<histogram name="OfflinePages.RedirectToOnlineCount" units="count"> + <owner>jianli@chromium.org</owner> + <summary> + Number of times an online version was loaded instead when the user is trying + to load the offline copy of a saved page and there is network connection. + connection. + </summary> +</histogram> + <histogram name="OfflinePages.SavedPageCount" units="pages"> <owner>jianli@chromium.org</owner> <summary> @@ -33287,6 +33350,14 @@ </summary> </histogram> +<histogram name="PageLoad.Timing2.ForegroundToFirstPaint" units="ms"> + <owner>pkotwicz@chromium.org</owner> + <summary> + Measures the time from a background tab being switched to the foreground to + the time the first paint is performed, for main frame documents. + </summary> +</histogram> + <histogram name="PageLoad.Timing2.NavigationToCommit" units="ms"> <owner>bmcquade@chromium.org</owner> <owner>csharrison@chromium.org</owner> @@ -52580,6 +52651,11 @@ </summary> </histogram> +<histogram name="Translate.BubbleUiEvent" enum="TranslateBubbleUiEvent"> + <owner>groby@google.com</owner> + <summary>Tracks UI events related to the translate bubble.</summary> +</histogram> + <histogram name="Translate.CaptureText" units="ms"> <owner>kenjibaheux@google.com</owner> <summary> @@ -58768,6 +58844,8 @@ label="Upload not offered, addresses had conflicting zip codes"/> <int value="5" label="Upload not offered, no zip code available"/> <int value="6" label="Upload not offered, get upload details RPC failed"/> + <int value="7" + label="Upload not offered, card and/or addresses had conflicting names"/> </enum> <enum name="AutofillCreditCardInfoBar" type="int"> @@ -60765,6 +60843,42 @@ <int value="2" label="Online"/> </enum> +<enum name="ConnectionSubtype" type="int"> + <int value="0" label="UNKNOWN"/> + <int value="1" label="NONE"/> + <int value="2" label="OTHER"/> + <int value="3" label="GSM"/> + <int value="4" label="IDEN"/> + <int value="5" label="CDMA"/> + <int value="6" label="1XRTT"/> + <int value="7" label="GPRS"/> + <int value="8" label="EDGE"/> + <int value="9" label="UMTS"/> + <int value="10" label="EVDO_REV_0"/> + <int value="11" label="EVDO_REV_A"/> + <int value="12" label="HSPA"/> + <int value="13" label="EVDO_REV_B"/> + <int value="14" label="HSDPA"/> + <int value="15" label="HSUPA"/> + <int value="16" label="EHRPD"/> + <int value="17" label="HSPAP"/> + <int value="18" label="LTE"/> + <int value="19" label="LTE_ADVANCED"/> + <int value="20" label="BLUETOOTH_1_2"/> + <int value="21" label="BLUETOOTH_2_1"/> + <int value="22" label="BLUETOOTH_3_0"/> + <int value="23" label="BLUETOOTH_4_0"/> + <int value="24" label="ETHERNET"/> + <int value="25" label="FAST_ETHERNET"/> + <int value="26" label="GIGABIT_ETHERNET"/> + <int value="27" label="10_GIGABIT_ETHERNET"/> + <int value="28" label="WIFI_B"/> + <int value="29" label="WIFI_G"/> + <int value="30" label="WIFI_N"/> + <int value="31" label="WIFI_AC"/> + <int value="32" label="WIFI_AD"/> +</enum> + <enum name="ConnectionType" type="int"> <summary> Connection type as defined in net/base/connection_type_histograms.h @@ -61621,8 +61735,8 @@ </enum> <enum name="DataReductionProxyConfigServiceHTTPRequests" type="int"> - <int value="0" label="Request went through data saver proxy"/> - <int value="1" label="Request did not go through data saver proxy"/> + <int value="0" label="Request did not go through data saver proxy"/> + <int value="1" label="Request went through data saver proxy"/> </enum> <enum name="DataReductionProxyEnabledState" type="int"> @@ -63712,6 +63826,7 @@ <int value="319" label="Allow the auto launched with zero delay kiosk app to control ChromeOS version"/> + <int value="320" label="Control use of the Web Bluetooth API"/> </enum> <enum name="EnterprisePolicyInvalidations" type="int"> @@ -81932,6 +82047,11 @@ <int value="24" label="kGoogleServicesLastAccountId"/> </enum> +<enum name="TranslateBubbleUiEvent" type="int"> + <int value="1" label="Switch to Options page"/> + <int value="2" label="Leave Options page"/> +</enum> + <enum name="TranslateError" type="int"> <int value="0" label="No error"/> <int value="1" label="Network error"/> @@ -82877,12 +82997,13 @@ <int value="0" label="requestDevice()"/> <int value="1" label="connectGATT()"/> <int value="2" label="RemoteGATTServer.getPrimaryService()"/> - <int value="3" label="getCharacteristic()"/> + <int value="3" label="Service.getCharacteristic()"/> <int value="4" label="Characteristic.readValue()"/> <int value="5" label="Characteristic.writeValue()"/> <int value="6" label="Characteristic.startNotifications()"/> <int value="7" label="Characteristic.stopNotifications()"/> <int value="8" label="RemoteGATTServer.disconnect()"/> + <int value="9" label="Service.getCharacteristics()"/> </enum> <enum name="WebBluetoothGATTOperationOutcome" type="int"> @@ -82908,6 +83029,7 @@ <int value="2" label="No service"/> <int value="3" label="Not found"/> <int value="4" label="Blacklisted"/> + <int value="5" label="No characteristics"/> </enum> <enum name="WebBluetoothGetPrimaryServiceOutcome" type="int"> @@ -82935,6 +83057,9 @@ <int value="12" label="Bluetooth Overview Help link pressed."/> <int value="13" label="Adapter Off Help link pressed."/> <int value="14" label="Need Location Help link pressed."/> + <int value="15" + label="Chooser insta-closed because user or enterprise policy has + disabled it"/> </enum> <enum name="WebCertVerifyAgreement" type="int">
diff --git a/tools/perf/page_sets/memory_health_story.py b/tools/perf/page_sets/memory_health_story.py index fe1f15a7..aad57d4 100644 --- a/tools/perf/page_sets/memory_health_story.py +++ b/tools/perf/page_sets/memory_health_story.py
@@ -41,7 +41,7 @@ def _TakeMemoryMeasurement(self, action_runner, phase): action_runner.Wait(1) # See crbug.com/540022#c17. with action_runner.CreateInteraction(phase): - action_runner.Wait(DUMP_WAIT_TIME * 8) + action_runner.Wait(DUMP_WAIT_TIME) action_runner.ForceGarbageCollection() action_runner.tab.browser.platform.FlushEntireSystemCache() action_runner.Wait(DUMP_WAIT_TIME)
diff --git a/ui/aura/mus/mus_util.cc b/ui/aura/mus/mus_util.cc index ed57f6a..468b336 100644 --- a/ui/aura/mus/mus_util.cc +++ b/ui/aura/mus/mus_util.cc
@@ -5,17 +5,26 @@ #include "ui/aura/mus/mus_util.h" #include "ui/aura/window.h" +#include "ui/aura/window_property.h" namespace aura { +namespace { + +// This code uses Set/GetNativeWindowProperty instead of Set/GetProperty to +// avoid a dependency on mus. +const char kMusWindowKey[] = "mus"; + +} // namespace mus::Window* GetMusWindow(Window* window) { if (!window) return nullptr; - return static_cast<mus::Window*>(window->GetNativeWindowProperty("mus")); + return static_cast<mus::Window*>( + window->GetNativeWindowProperty(kMusWindowKey)); } void SetMusWindow(Window* window, mus::Window* mus_window) { - window->SetNativeWindowProperty("mus", mus_window); + window->SetNativeWindowProperty(kMusWindowKey, mus_window); } } // namespace aura
diff --git a/ui/file_manager/file_manager/foreground/js/file_tasks.js b/ui/file_manager/file_manager/foreground/js/file_tasks.js index a1c2566..10962151 100644 --- a/ui/file_manager/file_manager/foreground/js/file_tasks.js +++ b/ui/file_manager/file_manager/foreground/js/file_tasks.js
@@ -827,7 +827,7 @@ FileTasks.prototype.showTaskPicker = function(taskDialog, title, message, onSuccess, opt_hideGenericFileHandler) { - var items = !!opt_hideGenericFileHandler ? this.createItems_() : + var items = !opt_hideGenericFileHandler ? this.createItems_() : this.createItems_().filter(function(item) { return !item.isGenericFileHandler; });
diff --git a/ui/native_theme/common_theme.cc b/ui/native_theme/common_theme.cc index 2c1dd9af..50dba80 100644 --- a/ui/native_theme/common_theme.cc +++ b/ui/native_theme/common_theme.cc
@@ -460,9 +460,11 @@ canvas->drawRect(gfx::RectToSkRect(rect), paint); } -void CommonThemePaintMenuItemBackground(SkCanvas* canvas, - NativeTheme::State state, - const gfx::Rect& rect) { +void CommonThemePaintMenuItemBackground( + SkCanvas* canvas, + NativeTheme::State state, + const gfx::Rect& rect, + const NativeTheme::MenuItemExtraParams& menu_item) { SkPaint paint; switch (state) { case NativeTheme::kNormal: @@ -478,6 +480,11 @@ NOTREACHED() << "Invalid state " << state; break; } + if (menu_item.corner_radius > 0) { + const SkScalar radius = SkIntToScalar(menu_item.corner_radius); + canvas->drawRoundRect(gfx::RectToSkRect(rect), radius, radius, paint); + return; + } canvas->drawRect(gfx::RectToSkRect(rect), paint); }
diff --git a/ui/native_theme/common_theme.h b/ui/native_theme/common_theme.h index b30b68d..ca40765c 100644 --- a/ui/native_theme/common_theme.h +++ b/ui/native_theme/common_theme.h
@@ -45,7 +45,8 @@ void NATIVE_THEME_EXPORT CommonThemePaintMenuItemBackground( SkCanvas* canvas, NativeTheme::State state, - const gfx::Rect& rect); + const gfx::Rect& rect, + const NativeTheme::MenuItemExtraParams& menu_item); // Creates a gfx::Canvas wrapping an SkCanvas. scoped_ptr<gfx::Canvas> NATIVE_THEME_EXPORT CommonThemeCreateCanvas(
diff --git a/ui/native_theme/native_theme.cc b/ui/native_theme/native_theme.cc index f15f144..96b0072c 100644 --- a/ui/native_theme/native_theme.cc +++ b/ui/native_theme/native_theme.cc
@@ -4,10 +4,16 @@ #include "ui/native_theme/native_theme.h" +#include <cstring> + #include "ui/native_theme/native_theme_observer.h" namespace ui { +NativeTheme::ExtraParams::ExtraParams() { + memset(this, 0, sizeof(*this)); +} + void NativeTheme::SetScrollbarColors(unsigned inactive_color, unsigned active_color, unsigned track_color) {
diff --git a/ui/native_theme/native_theme.h b/ui/native_theme/native_theme.h index b09dd15..f4dbd69 100644 --- a/ui/native_theme/native_theme.h +++ b/ui/native_theme/native_theme.h
@@ -132,6 +132,7 @@ struct MenuItemExtraParams { bool is_selected; + int corner_radius; }; struct MenuListExtraParams { @@ -196,7 +197,9 @@ int classic_state; // Used on Windows when uxtheme is not available. }; - union ExtraParams { + union NATIVE_THEME_EXPORT ExtraParams { + ExtraParams(); + ButtonExtraParams button; InnerSpinButtonExtraParams inner_spin; MenuArrowExtraParams menu_arrow;
diff --git a/ui/native_theme/native_theme_aura.cc b/ui/native_theme/native_theme_aura.cc index 223969f4..0afdd11 100644 --- a/ui/native_theme/native_theme_aura.cc +++ b/ui/native_theme/native_theme_aura.cc
@@ -130,8 +130,8 @@ SkCanvas* canvas, State state, const gfx::Rect& rect, - const MenuListExtraParams& menu_list) const { - CommonThemePaintMenuItemBackground(canvas, state, rect); + const MenuItemExtraParams& menu_item) const { + CommonThemePaintMenuItemBackground(canvas, state, rect, menu_item); } void NativeThemeAura::PaintArrowButton(SkCanvas* canvas,
diff --git a/ui/native_theme/native_theme_aura.h b/ui/native_theme/native_theme_aura.h index d9503f6..85ce5bc 100644 --- a/ui/native_theme/native_theme_aura.h +++ b/ui/native_theme/native_theme_aura.h
@@ -29,7 +29,7 @@ SkCanvas* canvas, State state, const gfx::Rect& rect, - const MenuListExtraParams& menu_list) const override; + const MenuItemExtraParams& menu_item) const override; void PaintArrowButton(SkCanvas* gc, const gfx::Rect& rect, Part direction,
diff --git a/ui/native_theme/native_theme_base.cc b/ui/native_theme/native_theme_base.cc index 1a7837ef..4da1497 100644 --- a/ui/native_theme/native_theme_base.cc +++ b/ui/native_theme/native_theme_base.cc
@@ -213,7 +213,7 @@ PaintMenuPopupBackground(canvas, rect.size(), extra.menu_background); break; case kMenuItemBackground: - PaintMenuItemBackground(canvas, state, rect, extra.menu_list); + PaintMenuItemBackground(canvas, state, rect, extra.menu_item); break; case kProgressBar: PaintProgressBar(canvas, state, rect, extra.progress_bar); @@ -792,7 +792,7 @@ SkCanvas* canvas, State state, const gfx::Rect& rect, - const MenuListExtraParams& menu_list) const { + const MenuItemExtraParams& menu_item) const { // By default don't draw anything over the normal background. }
diff --git a/ui/native_theme/native_theme_base.h b/ui/native_theme/native_theme_base.h index 5b91753..a8677d3 100644 --- a/ui/native_theme/native_theme_base.h +++ b/ui/native_theme/native_theme_base.h
@@ -108,7 +108,7 @@ SkCanvas* canvas, State state, const gfx::Rect& rect, - const MenuListExtraParams& menu_list) const; + const MenuItemExtraParams& menu_item) const; virtual void PaintSliderTrack( SkCanvas* canvas,
diff --git a/ui/native_theme/native_theme_mac.h b/ui/native_theme/native_theme_mac.h index ca9ac071..6fe3f61 100644 --- a/ui/native_theme/native_theme_mac.h +++ b/ui/native_theme/native_theme_mac.h
@@ -28,7 +28,7 @@ SkCanvas* canvas, State state, const gfx::Rect& rect, - const MenuListExtraParams& menu_list) const override; + const MenuItemExtraParams& menu_item) const override; private: NativeThemeMac();
diff --git a/ui/native_theme/native_theme_mac.mm b/ui/native_theme/native_theme_mac.mm index e81c60c..f9627ff 100644 --- a/ui/native_theme/native_theme_mac.mm +++ b/ui/native_theme/native_theme_mac.mm
@@ -245,7 +245,7 @@ SkCanvas* canvas, State state, const gfx::Rect& rect, - const MenuListExtraParams& menu_list) const { + const MenuItemExtraParams& menu_item) const { SkPaint paint; switch (state) { case NativeTheme::kNormal:
diff --git a/ui/native_theme/native_theme_win.cc b/ui/native_theme/native_theme_win.cc index be5109a7..745af69 100644 --- a/ui/native_theme/native_theme_win.cc +++ b/ui/native_theme/native_theme_win.cc
@@ -257,7 +257,7 @@ CommonThemePaintMenuBackground(canvas, rect); return; case kMenuItemBackground: - CommonThemePaintMenuItemBackground(canvas, state, rect); + CommonThemePaintMenuItemBackground(canvas, state, rect, extra.menu_item); return; default: break;
diff --git a/ui/views/animation/button_ink_drop_delegate.h b/ui/views/animation/button_ink_drop_delegate.h index 9b8637c3..9184309 100644 --- a/ui/views/animation/button_ink_drop_delegate.h +++ b/ui/views/animation/button_ink_drop_delegate.h
@@ -21,7 +21,7 @@ class InkDropHost; class View; -// An InkDropDelegate that handles animations for toolbar buttons. +// An InkDropDelegate that handles animations for things that act like buttons. class VIEWS_EXPORT ButtonInkDropDelegate : public InkDropDelegate, public ui::EventHandler { public:
diff --git a/ui/views/animation/flood_fill_ink_drop_animation.cc b/ui/views/animation/flood_fill_ink_drop_animation.cc new file mode 100644 index 0000000..77db9b26 --- /dev/null +++ b/ui/views/animation/flood_fill_ink_drop_animation.cc
@@ -0,0 +1,331 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ui/views/animation/flood_fill_ink_drop_animation.h" + +#include <algorithm> + +#include "base/logging.h" +#include "third_party/skia/include/core/SkColor.h" +#include "ui/compositor/layer.h" +#include "ui/compositor/layer_animation_sequence.h" +#include "ui/compositor/scoped_layer_animation_settings.h" +#include "ui/gfx/geometry/point_conversions.h" +#include "ui/gfx/geometry/vector2d_f.h" + +namespace { + +// The minimum radius to use when scaling the painted layers. Smaller values +// were causing visual anomalies. +const float kMinRadius = 0.01f; + +// All the sub animations that are used to animate each of the InkDropStates. +// These are used to get time durations with +// GetAnimationDuration(InkDropSubAnimations). Note that in general a sub +// animation defines the duration for either a transformation animation or an +// opacity animation but there are some exceptions where an entire InkDropState +// animation consists of only 1 sub animation and it defines the duration for +// both the transformation and opacity animations. +enum InkDropSubAnimations { + // HIDDEN sub animations. + + // The HIDDEN sub animation that is fading out to a hidden opacity. + HIDDEN_FADE_OUT, + + // The HIDDEN sub animation that transform the circle to a small one. + HIDDEN_TRANSFORM, + + // ACTION_PENDING sub animations. + + // The ACTION_PENDING sub animation that fades in to the visible opacity. + ACTION_PENDING_FADE_IN, + + // The ACTION_PENDING sub animation that transforms the circle to fill the + // bounds. + ACTION_PENDING_TRANSFORM, + + // QUICK_ACTION sub animations. + + // The QUICK_ACTION sub animation that is fading out to a hidden opacity. + QUICK_ACTION_FADE_OUT, + + // SLOW_ACTION_PENDING sub animations. + + // The SLOW_ACTION_PENDING animation has only one sub animation which animates + // the circleto fill the bounds at visible opacity. + SLOW_ACTION_PENDING, + + // SLOW_ACTION sub animations. + + // The SLOW_ACTION sub animation that is fading out to a hidden opacity. + SLOW_ACTION_FADE_OUT, + + // ACTIVATED sub animations. + + // The ACTIVATED sub animation that is fading in to the visible opacity. + ACTIVATED_FADE_IN, + + // The ACTIVATED sub animation that transforms the circle to fill the entire + // bounds. + ACTIVATED_TRANSFORM, + + // DEACTIVATED sub animations. + + // The DEACTIVATED sub animation that is fading out to a hidden opacity. + DEACTIVATED_FADE_OUT, +}; + +// Duration constants for InkDropStateSubAnimations. See the +// InkDropStateSubAnimations enum documentation for more info. +int kAnimationDurationInMs[] = { + 200, // HIDDEN_FADE_OUT + 300, // HIDDEN_TRANSFORM + 0, // ACTION_PENDING_FADE_IN + 240, // ACTION_PENDING_TRANSFORM + 300, // QUICK_ACTION_FADE_OUT + 200, // SLOW_ACTION_PENDING + 300, // SLOW_ACTION_FADE_OUT + 150, // ACTIVATED_FADE_IN + 200, // ACTIVATED_TRANSFORM + 300, // DEACTIVATED_FADE_OUT +}; + +// Returns the InkDropState sub animation duration for the given |state|. +base::TimeDelta GetAnimationDuration(InkDropSubAnimations state) { + return base::TimeDelta::FromMilliseconds( + (views::InkDropAnimation::UseFastAnimations() + ? 1 + : views::InkDropAnimation::kSlowAnimationDurationFactor) * + kAnimationDurationInMs[state]); +} + +// Calculates the largest distance from |point| to the corners of a rectangle +// with origin (0, 0) and the given |size|. +float CalculateLargestDistanceToCorners(const gfx::Size& size, + const gfx::Point& point) { + const float top_left_distance = gfx::Vector2dF(point.x(), point.y()).Length(); + const float top_right_distance = + gfx::Vector2dF(size.width() - point.x(), point.y()).Length(); + const float bottom_left_distance = + gfx::Vector2dF(point.x(), size.height() - point.y()).Length(); + const float bottom_right_distance = + gfx::Vector2dF(size.width() - point.x(), size.height() - point.y()) + .Length(); + + float largest_distance = std::max(top_left_distance, top_right_distance); + largest_distance = std::max(largest_distance, bottom_left_distance); + largest_distance = std::max(largest_distance, bottom_right_distance); + return largest_distance; +} + +} // namespace + +namespace views { + +FloodFillInkDropAnimation::FloodFillInkDropAnimation( + const gfx::Size& size, + const gfx::Point& center_point, + SkColor color) + : size_(size), + center_point_(center_point), + root_layer_(ui::LAYER_NOT_DRAWN), + circle_layer_delegate_(color, + std::max(size_.width(), size_.height()) / 2.f), + ink_drop_state_(InkDropState::HIDDEN) { + root_layer_.set_name("FloodFillInkDropAnimation:ROOT_LAYER"); + root_layer_.SetMasksToBounds(true); + root_layer_.SetBounds(gfx::Rect(size_)); + + const int painted_size_length = 2 * std::max(size_.width(), size_.height()); + + painted_layer_.SetBounds(gfx::Rect(painted_size_length, painted_size_length)); + painted_layer_.SetFillsBoundsOpaquely(false); + painted_layer_.set_delegate(&circle_layer_delegate_); + painted_layer_.SetVisible(true); + painted_layer_.SetOpacity(1.0); + painted_layer_.SetMasksToBounds(false); + painted_layer_.set_name("FloodFillInkDropAnimation:PAINTED_LAYER"); + + root_layer_.Add(&painted_layer_); + + SetStateToHidden(); +} + +FloodFillInkDropAnimation::~FloodFillInkDropAnimation() { + // Explicitly aborting all the animations ensures all callbacks are invoked + // while this instance still exists. + AbortAllAnimations(); +} + +ui::Layer* FloodFillInkDropAnimation::GetRootLayer() { + return &root_layer_; +} + +bool FloodFillInkDropAnimation::IsVisible() const { + return root_layer_.visible(); +} + +void FloodFillInkDropAnimation::AnimateStateChange( + InkDropState old_ink_drop_state, + InkDropState new_ink_drop_state, + ui::LayerAnimationObserver* animation_observer) { + switch (new_ink_drop_state) { + case InkDropState::HIDDEN: + if (!IsVisible()) { + SetStateToHidden(); + break; + } else { + AnimateToOpacity(kHiddenOpacity, GetAnimationDuration(HIDDEN_FADE_OUT), + ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET, + gfx::Tween::EASE_IN_OUT, animation_observer); + const gfx::Transform transform = CalculateTransform(kMinRadius); + AnimateToTransform(transform, GetAnimationDuration(HIDDEN_TRANSFORM), + ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET, + gfx::Tween::EASE_IN_OUT, animation_observer); + } + break; + case InkDropState::ACTION_PENDING: { + DCHECK(old_ink_drop_state == InkDropState::HIDDEN); + + AnimateToOpacity(kVisibleOpacity, + GetAnimationDuration(ACTION_PENDING_FADE_IN), + ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET, + gfx::Tween::EASE_IN, animation_observer); + AnimateToOpacity(kVisibleOpacity, + GetAnimationDuration(ACTION_PENDING_TRANSFORM) - + GetAnimationDuration(ACTION_PENDING_FADE_IN), + ui::LayerAnimator::ENQUEUE_NEW_ANIMATION, + gfx::Tween::EASE_IN, animation_observer); + + const gfx::Transform transform = CalculateTransform( + CalculateLargestDistanceToCorners(size_, center_point_)); + AnimateToTransform(transform, + GetAnimationDuration(ACTION_PENDING_TRANSFORM), + ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET, + gfx::Tween::FAST_OUT_SLOW_IN, animation_observer); + break; + } + case InkDropState::QUICK_ACTION: { + DCHECK(old_ink_drop_state == InkDropState::HIDDEN || + old_ink_drop_state == InkDropState::ACTION_PENDING); + + AnimateToOpacity(kHiddenOpacity, + GetAnimationDuration(QUICK_ACTION_FADE_OUT), + ui::LayerAnimator::ENQUEUE_NEW_ANIMATION, + gfx::Tween::EASE_IN_OUT, animation_observer); + break; + } + case InkDropState::SLOW_ACTION_PENDING: { + DCHECK(old_ink_drop_state == InkDropState::ACTION_PENDING); + AnimateToOpacity(kVisibleOpacity, + GetAnimationDuration(SLOW_ACTION_PENDING), + ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET, + gfx::Tween::EASE_IN, animation_observer); + const gfx::Transform transform = CalculateTransform( + CalculateLargestDistanceToCorners(size_, center_point_)); + AnimateToTransform(transform, GetAnimationDuration(SLOW_ACTION_PENDING), + ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET, + gfx::Tween::EASE_IN_OUT, animation_observer); + break; + } + case InkDropState::SLOW_ACTION: + DCHECK(old_ink_drop_state == InkDropState::SLOW_ACTION_PENDING); + AnimateToOpacity(kHiddenOpacity, + GetAnimationDuration(SLOW_ACTION_FADE_OUT), + ui::LayerAnimator::ENQUEUE_NEW_ANIMATION, + gfx::Tween::EASE_IN_OUT, animation_observer); + break; + case InkDropState::ACTIVATED: { + AnimateToOpacity(kVisibleOpacity, GetAnimationDuration(ACTIVATED_FADE_IN), + ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET, + gfx::Tween::EASE_IN, animation_observer); + const gfx::Transform transform = CalculateTransform( + CalculateLargestDistanceToCorners(size_, center_point_)); + AnimateToTransform(transform, GetAnimationDuration(ACTIVATED_TRANSFORM), + ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET, + gfx::Tween::EASE_IN_OUT, animation_observer); + break; + } + case InkDropState::DEACTIVATED: + AnimateToOpacity(kHiddenOpacity, + GetAnimationDuration(DEACTIVATED_FADE_OUT), + ui::LayerAnimator::ENQUEUE_NEW_ANIMATION, + gfx::Tween::EASE_IN_OUT, animation_observer); + break; + } +} + +void FloodFillInkDropAnimation::SetStateToHidden() { + gfx::Transform transform = CalculateTransform(kMinRadius); + painted_layer_.SetTransform(transform); + root_layer_.SetOpacity(InkDropAnimation::kHiddenOpacity); + root_layer_.SetVisible(false); +} + +void FloodFillInkDropAnimation::AbortAllAnimations() { + root_layer_.GetAnimator()->AbortAllAnimations(); + painted_layer_.GetAnimator()->AbortAllAnimations(); +} + +void FloodFillInkDropAnimation::AnimateToTransform( + const gfx::Transform& transform, + base::TimeDelta duration, + ui::LayerAnimator::PreemptionStrategy preemption_strategy, + gfx::Tween::Type tween, + ui::LayerAnimationObserver* animation_observer) { + ui::LayerAnimator* animator = painted_layer_.GetAnimator(); + ui::ScopedLayerAnimationSettings animation(animator); + animation.SetPreemptionStrategy(preemption_strategy); + animation.SetTweenType(tween); + ui::LayerAnimationElement* element = + ui::LayerAnimationElement::CreateTransformElement(transform, duration); + ui::LayerAnimationSequence* sequence = + new ui::LayerAnimationSequence(element); + + if (animation_observer) + sequence->AddObserver(animation_observer); + + animator->StartAnimation(sequence); +} + +void FloodFillInkDropAnimation::SetOpacity(float opacity) { + root_layer_.SetOpacity(opacity); +} + +void FloodFillInkDropAnimation::AnimateToOpacity( + float opacity, + base::TimeDelta duration, + ui::LayerAnimator::PreemptionStrategy preemption_strategy, + gfx::Tween::Type tween, + ui::LayerAnimationObserver* animation_observer) { + ui::LayerAnimator* animator = root_layer_.GetAnimator(); + ui::ScopedLayerAnimationSettings animation_settings(animator); + animation_settings.SetPreemptionStrategy(preemption_strategy); + animation_settings.SetTweenType(tween); + ui::LayerAnimationElement* animation_element = + ui::LayerAnimationElement::CreateOpacityElement(opacity, duration); + ui::LayerAnimationSequence* animation_sequence = + new ui::LayerAnimationSequence(animation_element); + + if (animation_observer) + animation_sequence->AddObserver(animation_observer); + + animator->StartAnimation(animation_sequence); +} + +gfx::Transform FloodFillInkDropAnimation::CalculateTransform( + float target_radius) const { + const float target_scale = target_radius / circle_layer_delegate_.radius(); + const gfx::Point drawn_center_point = + ToRoundedPoint(circle_layer_delegate_.GetCenterPoint()); + + gfx::Transform transform = gfx::Transform(); + transform.Translate(center_point_.x(), center_point_.y()); + transform.Scale(target_scale, target_scale); + transform.Translate(-drawn_center_point.x(), -drawn_center_point.y()); + + return transform; +} + +} // namespace views
diff --git a/ui/views/animation/flood_fill_ink_drop_animation.h b/ui/views/animation/flood_fill_ink_drop_animation.h new file mode 100644 index 0000000..fa6942f --- /dev/null +++ b/ui/views/animation/flood_fill_ink_drop_animation.h
@@ -0,0 +1,126 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef UI_VIEWS_ANIMATION_FLOOD_FILL_INK_DROP_ANIMATION_H_ +#define UI_VIEWS_ANIMATION_FLOOD_FILL_INK_DROP_ANIMATION_H_ + +#include <string> + +#include "base/macros.h" +#include "base/memory/scoped_ptr.h" +#include "base/time/time.h" +#include "third_party/skia/include/core/SkColor.h" +#include "ui/compositor/layer.h" +#include "ui/compositor/layer_animator.h" +#include "ui/gfx/animation/tween.h" +#include "ui/gfx/geometry/point.h" +#include "ui/gfx/geometry/size.h" +#include "ui/gfx/transform.h" +#include "ui/views/animation/ink_drop_animation.h" +#include "ui/views/animation/ink_drop_painted_layer_delegates.h" +#include "ui/views/animation/ink_drop_state.h" +#include "ui/views/views_export.h" + +namespace ui { +class Layer; +} // namespace ui + +namespace views { +class CircleLayerDelegate; + +namespace test { +class FloodFillInkDropAnimationTestApi; +} // namespace test + +// An ink drop animation that starts as a small circle and flood fills a +// rectangle of the given size. The circle is clipped to the rectangles bounds. +// +// The valid InkDropState transitions are defined below: +// +// {All InkDropStates} => HIDDEN +// HIDDEN => ACTION_PENDING +// HIDDEN, ACTION_PENDING => QUICK_ACTION +// ACTION_PENDING => SLOW_ACTION_PENDING +// SLOW_ACTION_PENDING => SLOW_ACTION +// {All InkDropStates} => ACTIVATED +// {All InkDropStates} => DEACTIVATED +// +class VIEWS_EXPORT FloodFillInkDropAnimation : public InkDropAnimation { + public: + FloodFillInkDropAnimation(const gfx::Size& size, + const gfx::Point& center_point, + SkColor color); + ~FloodFillInkDropAnimation() override; + + // InkDropAnimation: + ui::Layer* GetRootLayer() override; + bool IsVisible() const override; + + private: + friend class test::FloodFillInkDropAnimationTestApi; + + // InkDropAnimation: + void AnimateStateChange(InkDropState old_ink_drop_state, + InkDropState new_ink_drop_state, + ui::LayerAnimationObserver* observer) override; + void SetStateToHidden() override; + void AbortAllAnimations() override; + + // Animates the |painted_layer_| to the specified |transform|. The animation + // will be configured with the given |duration|, |tween|, and + // |preemption_strategy| values. The |observer| will be added to all + // LayerAnimationSequences if not null. + void AnimateToTransform( + const gfx::Transform& transform, + base::TimeDelta duration, + ui::LayerAnimator::PreemptionStrategy preemption_strategy, + gfx::Tween::Type tween, + ui::LayerAnimationObserver* observer); + + // Sets the opacity of the ink drop. Note that this does not perform any + // animation. + void SetOpacity(float opacity); + + // Animates the |painted_layer_| to the specified |opacity|. The animation + // will be configured with the given |duration|, |tween|, and + // |preemption_strategy| values. The |observer| will be added to all + // LayerAnimationSequences if not null. + void AnimateToOpacity( + float opacity, + base::TimeDelta duration, + ui::LayerAnimator::PreemptionStrategy preemption_strategy, + gfx::Tween::Type tween, + ui::LayerAnimationObserver* observer); + + // Returns the Transform to be applied to the |painted_layer_| for the given + // |target_radius|. + gfx::Transform CalculateTransform(float target_radius) const; + + // The clip Size. + const gfx::Size size_; + + // The point where the Center of the ink drop's circle should be drawn. + gfx::Point center_point_; + + // The root layer that parents the animating layer. The root layer is used to + // manipulate opacity and clipping bounds, and it child is used to manipulate + // the different shape of the ink drop. + ui::Layer root_layer_; + + // ui::LayerDelegate to paint the |painted_layer_|. + CircleLayerDelegate circle_layer_delegate_; + + // Child ui::Layer of |root_layer_|. Used to manipulate the different size + // and shape of the ink drop. + ui::Layer painted_layer_; + + // The current ink drop state. + InkDropState ink_drop_state_; + + DISALLOW_COPY_AND_ASSIGN(FloodFillInkDropAnimation); +}; + +} // namespace views + +#endif // UI_VIEWS_ANIMATION_FLOOD_FILL_INK_DROP_ANIMATION_H_
diff --git a/ui/views/animation/ink_drop_animation.cc b/ui/views/animation/ink_drop_animation.cc index 111e910..2f55a25ff 100644 --- a/ui/views/animation/ink_drop_animation.cc +++ b/ui/views/animation/ink_drop_animation.cc
@@ -4,24 +4,93 @@ #include "ui/views/animation/ink_drop_animation.h" +#include "base/bind.h" +#include "base/bind_helpers.h" +#include "base/command_line.h" +#include "ui/base/ui_base_switches.h" +#include "ui/compositor/callback_layer_animation_observer.h" +#include "ui/compositor/layer.h" + namespace views { +const double InkDropAnimation::kSlowAnimationDurationFactor = 3.0; + +bool InkDropAnimation::UseFastAnimations() { + static bool fast = + base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( + (::switches::kMaterialDesignInkDropAnimationSpeed)) != + ::switches::kMaterialDesignInkDropAnimationSpeedSlow; + return fast; +} + const float InkDropAnimation::kHiddenOpacity = 0.f; const float InkDropAnimation::kVisibleOpacity = 0.175f; -InkDropAnimation::InkDropAnimation() : observer_(nullptr) {} +InkDropAnimation::InkDropAnimation() + : target_ink_drop_state_(InkDropState::HIDDEN), observer_(nullptr) {} InkDropAnimation::~InkDropAnimation() {} -void InkDropAnimation::NotifyAnimationStarted(InkDropState ink_drop_state) { +void InkDropAnimation::AnimateToState(InkDropState ink_drop_state) { + // Does not return early if |target_ink_drop_state_| == |ink_drop_state| for + // two reasons. + // 1. The attached observers must be notified of all animations started and + // ended. + // 2. Not all state transitions is are valid, especially no-op transitions, + // and these should be detected by DCHECKs in AnimateStateChange(). + + // |animation_observer| will be deleted when AnimationEndedCallback() returns + // true. + // TODO(bruthig): Implement a safer ownership model for the + // |animation_observer|. + ui::CallbackLayerAnimationObserver* animation_observer = + new ui::CallbackLayerAnimationObserver( + base::Bind(&InkDropAnimation::AnimationStartedCallback, + base::Unretained(this), ink_drop_state), + base::Bind(&InkDropAnimation::AnimationEndedCallback, + base::Unretained(this), ink_drop_state)); + + InkDropState old_ink_drop_state = target_ink_drop_state_; + // Assign to |target_ink_drop_state_| before calling AnimateStateChange() so + // that any observers notified as a side effect of the AnimateStateChange() + // will get the target InkDropState when calling GetInkDropState(). + target_ink_drop_state_ = ink_drop_state; + + if (old_ink_drop_state == InkDropState::HIDDEN && + target_ink_drop_state_ != InkDropState::HIDDEN) { + GetRootLayer()->SetVisible(true); + } + + AnimateStateChange(old_ink_drop_state, target_ink_drop_state_, + animation_observer); + animation_observer->SetActive(); + // |this| may be deleted! |animation_observer| might synchronously call + // AnimationEndedCallback which can delete |this|. +} + +void InkDropAnimation::HideImmediately() { + AbortAllAnimations(); + SetStateToHidden(); + target_ink_drop_state_ = InkDropState::HIDDEN; +} + +void InkDropAnimation::AnimationStartedCallback( + InkDropState ink_drop_state, + const ui::CallbackLayerAnimationObserver& observer) { observer_->InkDropAnimationStarted(ink_drop_state); } -void InkDropAnimation::NotifyAnimationEnded( +bool InkDropAnimation::AnimationEndedCallback( InkDropState ink_drop_state, - InkDropAnimationObserver::InkDropAnimationEndedReason reason) { - observer_->InkDropAnimationEnded(ink_drop_state, reason); + const ui::CallbackLayerAnimationObserver& observer) { + if (ink_drop_state == InkDropState::HIDDEN) + SetStateToHidden(); + observer_->InkDropAnimationEnded(ink_drop_state, + observer.aborted_count() + ? InkDropAnimationObserver::PRE_EMPTED + : InkDropAnimationObserver::SUCCESS); // |this| may be deleted! + return true; } } // namespace views
diff --git a/ui/views/animation/ink_drop_animation.h b/ui/views/animation/ink_drop_animation.h index 63b8330..52eba9c9 100644 --- a/ui/views/animation/ink_drop_animation.h +++ b/ui/views/animation/ink_drop_animation.h
@@ -12,7 +12,9 @@ #include "ui/views/views_export.h" namespace ui { +class CallbackLayerAnimationObserver; class Layer; +class LayerAnimationObserver; } // namespace ui namespace views { @@ -24,6 +26,17 @@ // the doc here. class VIEWS_EXPORT InkDropAnimation { public: + // TODO(bruthig): Remove UseFastAnimations() and kSlowAnimationDurationFactor. + // See http://crbug.com/584681 + + // Checks CommandLine switches to determine if the visual feedback should have + // a fast animations speed. + static bool UseFastAnimations(); + + // The factor at which to increase the animation durations if + // UseFastAnimations() returns true. + static const double kSlowAnimationDurationFactor; + // The opacity of the ink drop when it is not visible. static const float kHiddenOpacity; @@ -37,15 +50,19 @@ observer_ = observer; } - // Gets the target InkDropState, i.e. the last |ink_drop_state| passed to - // AnimateToState() or set by HideImmediately(). - virtual InkDropState GetTargetInkDropState() const = 0; - // Animates from the current InkDropState to the new |ink_drop_state|. // // NOTE: GetTargetInkDropState() should return the new |ink_drop_state| value // to any observers being notified as a result of the call. - virtual void AnimateToState(InkDropState ink_drop_state) = 0; + void AnimateToState(InkDropState ink_drop_state); + + InkDropState target_ink_drop_state() const { return target_ink_drop_state_; } + + // Immediately aborts all in-progress animations and hides the ink drop. + // + // NOTE: This will NOT raise InkDropAnimation(Started|Ended) events for the + // state transition to HIDDEN! + void HideImmediately(); // The root Layer that can be added in to a Layer tree. virtual ui::Layer* GetRootLayer() = 0; @@ -55,22 +72,37 @@ // animates to the target HIDDEN state. virtual bool IsVisible() const = 0; - // Immediately aborts all in-progress animations and hides the ink drop. - // - // NOTE: This will NOT raise InkDropAnimation(Started|Ended) events for the - // state transition to HIDDEN! - virtual void HideImmediately() = 0; - protected: - // Notify the |observers_| that an animation has started. - void NotifyAnimationStarted(InkDropState ink_drop_state); + // Animates the ripple from the |old_ink_drop_state| to the + // |new_ink_drop_state|. |observer| is added to all LayerAnimationSequence's + // used if not null. + virtual void AnimateStateChange(InkDropState old_ink_drop_state, + InkDropState new_ink_drop_state, + ui::LayerAnimationObserver* observer) = 0; - // Notify the |observers_| that an animation has ended. - void NotifyAnimationEnded( - InkDropState ink_drop_state, - InkDropAnimationObserver::InkDropAnimationEndedReason reason); + // Updates the transforms, opacity, and visibility to a HIDDEN state. + virtual void SetStateToHidden() = 0; + + virtual void AbortAllAnimations() = 0; private: + // The Callback invoked when all of the animation sequences for the specific + // |ink_drop_state| animation have started. |observer| is the + // ui::CallbackLayerAnimationObserver which is notifying the callback. + void AnimationStartedCallback( + InkDropState ink_drop_state, + const ui::CallbackLayerAnimationObserver& observer); + + // The Callback invoked when all of the animation sequences for the specific + // |ink_drop_state| animation have finished. |observer| is the + // ui::CallbackLayerAnimationObserver which is notifying the callback. + bool AnimationEndedCallback( + InkDropState ink_drop_state, + const ui::CallbackLayerAnimationObserver& observer); + + // The target InkDropState. + InkDropState target_ink_drop_state_; + InkDropAnimationObserver* observer_; DISALLOW_COPY_AND_ASSIGN(InkDropAnimation);
diff --git a/ui/views/animation/ink_drop_animation_controller_impl.cc b/ui/views/animation/ink_drop_animation_controller_impl.cc index 7ca5a0d..f7dbd12 100644 --- a/ui/views/animation/ink_drop_animation_controller_impl.cc +++ b/ui/views/animation/ink_drop_animation_controller_impl.cc
@@ -69,7 +69,7 @@ InkDropState InkDropAnimationControllerImpl::GetTargetInkDropState() const { if (!ink_drop_animation_) return InkDropState::HIDDEN; - return ink_drop_animation_->GetTargetInkDropState(); + return ink_drop_animation_->target_ink_drop_state(); } bool InkDropAnimationControllerImpl::IsVisible() const { @@ -88,8 +88,8 @@ // Make sure the ink drop starts from the HIDDEN state it was going to auto // transition to it. - if (ink_drop_animation_->GetTargetInkDropState() == InkDropState::HIDDEN || - ShouldAnimateToHidden(ink_drop_animation_->GetTargetInkDropState())) { + if (ink_drop_animation_->target_ink_drop_state() == InkDropState::HIDDEN || + ShouldAnimateToHidden(ink_drop_animation_->target_ink_drop_state())) { ink_drop_animation_->HideImmediately(); } ink_drop_animation_->AnimateToState(ink_drop_state);
diff --git a/ui/views/animation/ink_drop_animation_controller_impl_unittest.cc b/ui/views/animation/ink_drop_animation_controller_impl_unittest.cc index a32ba606..633c332 100644 --- a/ui/views/animation/ink_drop_animation_controller_impl_unittest.cc +++ b/ui/views/animation/ink_drop_animation_controller_impl_unittest.cc
@@ -2,12 +2,13 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include "ui/views/animation/ink_drop_animation_controller_impl.h" + #include "base/macros.h" #include "base/test/test_simple_task_runner.h" #include "base/thread_task_runner_handle.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/compositor/scoped_animation_duration_scale_mode.h" -#include "ui/views/animation/ink_drop_animation_controller_impl.h" #include "ui/views/animation/test/test_ink_drop_host.h" namespace views {
diff --git a/ui/views/animation/ink_drop_animation_unittest.cc b/ui/views/animation/ink_drop_animation_unittest.cc index c832e70a..6f98549 100644 --- a/ui/views/animation/ink_drop_animation_unittest.cc +++ b/ui/views/animation/ink_drop_animation_unittest.cc
@@ -9,10 +9,12 @@ #include "base/memory/scoped_ptr.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/gfx/geometry/size.h" +#include "ui/views/animation/flood_fill_ink_drop_animation.h" #include "ui/views/animation/ink_drop_animation.h" #include "ui/views/animation/ink_drop_animation_observer.h" #include "ui/views/animation/ink_drop_state.h" #include "ui/views/animation/square_ink_drop_animation.h" +#include "ui/views/animation/test/flood_fill_ink_drop_animation_test_api.h" #include "ui/views/animation/test/ink_drop_animation_test_api.h" #include "ui/views/animation/test/square_ink_drop_animation_test_api.h" #include "ui/views/animation/test/test_ink_drop_animation_observer.h" @@ -22,7 +24,10 @@ // Represents all the derivatives of the InkDropAnimation class. To be used with // the InkDropAnimationTest fixture to test all derviatives. -enum InkDropAnimationTestTypes { SQUARE_INK_DROP_ANIMATION }; +enum InkDropAnimationTestTypes { + SQUARE_INK_DROP_ANIMATION, + FLOOD_FILL_INK_DROP_ANIMATION +}; // Test fixture for all InkDropAnimation class derivatives. // @@ -52,12 +57,21 @@ InkDropAnimationTest::InkDropAnimationTest() { switch (GetParam()) { case SQUARE_INK_DROP_ANIMATION: { - SquareInkDropAnimation* typed_ink_drop_animation = + SquareInkDropAnimation* square_ink_drop_animation = new SquareInkDropAnimation(gfx::Size(10, 10), 2, gfx::Size(8, 8), 1, gfx::Point(), SK_ColorBLACK); - ink_drop_animation_.reset(typed_ink_drop_animation); + ink_drop_animation_.reset(square_ink_drop_animation); test_api_.reset( - new SquareInkDropAnimationTestApi(typed_ink_drop_animation)); + new SquareInkDropAnimationTestApi(square_ink_drop_animation)); + break; + } + case FLOOD_FILL_INK_DROP_ANIMATION: { + FloodFillInkDropAnimation* flood_fill_ink_drop_animation = + new FloodFillInkDropAnimation(gfx::Size(10, 10), gfx::Point(), + SK_ColorBLACK); + ink_drop_animation_.reset(flood_fill_ink_drop_animation); + test_api_.reset( + new FloodFillInkDropAnimationTestApi(flood_fill_ink_drop_animation)); break; } } @@ -72,16 +86,17 @@ // (it's a prefix for the generated test cases) INSTANTIATE_TEST_CASE_P(, InkDropAnimationTest, - testing::Values(SQUARE_INK_DROP_ANIMATION)); + testing::Values(SQUARE_INK_DROP_ANIMATION, + FLOOD_FILL_INK_DROP_ANIMATION)); TEST_P(InkDropAnimationTest, InitialStateAfterConstruction) { EXPECT_EQ(views::InkDropState::HIDDEN, - ink_drop_animation_->GetTargetInkDropState()); + ink_drop_animation_->target_ink_drop_state()); } // Verify no animations are used when animating from HIDDEN to HIDDEN. TEST_P(InkDropAnimationTest, AnimateToHiddenFromInvisibleState) { - EXPECT_EQ(InkDropState::HIDDEN, ink_drop_animation_->GetTargetInkDropState()); + EXPECT_EQ(InkDropState::HIDDEN, ink_drop_animation_->target_ink_drop_state()); ink_drop_animation_->AnimateToState(InkDropState::HIDDEN); EXPECT_EQ(1, observer_.last_animation_started_ordinal()); @@ -96,7 +111,7 @@ EXPECT_EQ(1, observer_.last_animation_started_ordinal()); EXPECT_EQ(2, observer_.last_animation_ended_ordinal()); - EXPECT_NE(InkDropState::HIDDEN, ink_drop_animation_->GetTargetInkDropState()); + EXPECT_NE(InkDropState::HIDDEN, ink_drop_animation_->target_ink_drop_state()); ink_drop_animation_->AnimateToState(InkDropState::HIDDEN); test_api_->CompleteAnimations(); @@ -206,7 +221,7 @@ ink_drop_animation_->AnimateToState(views::InkDropState::ACTION_PENDING); ink_drop_animation_->AnimateToState(views::InkDropState::ACTIVATED); EXPECT_EQ(views::InkDropState::ACTIVATED, - ink_drop_animation_->GetTargetInkDropState()); + ink_drop_animation_->target_ink_drop_state()); } TEST_P(InkDropAnimationTest, HideImmediatelyWithoutActiveAnimations) { @@ -216,13 +231,13 @@ EXPECT_EQ(2, observer_.last_animation_ended_ordinal()); EXPECT_FALSE(test_api_->HasActiveAnimations()); - EXPECT_NE(InkDropState::HIDDEN, ink_drop_animation_->GetTargetInkDropState()); + EXPECT_NE(InkDropState::HIDDEN, ink_drop_animation_->target_ink_drop_state()); ink_drop_animation_->HideImmediately(); EXPECT_FALSE(test_api_->HasActiveAnimations()); EXPECT_EQ(views::InkDropState::HIDDEN, - ink_drop_animation_->GetTargetInkDropState()); + ink_drop_animation_->target_ink_drop_state()); EXPECT_EQ(1, observer_.last_animation_started_ordinal()); EXPECT_EQ(2, observer_.last_animation_ended_ordinal()); @@ -235,14 +250,14 @@ TEST_P(InkDropAnimationTest, HideImmediatelyWithActiveAnimations) { ink_drop_animation_->AnimateToState(views::InkDropState::ACTION_PENDING); EXPECT_TRUE(test_api_->HasActiveAnimations()); - EXPECT_NE(InkDropState::HIDDEN, ink_drop_animation_->GetTargetInkDropState()); + EXPECT_NE(InkDropState::HIDDEN, ink_drop_animation_->target_ink_drop_state()); EXPECT_EQ(1, observer_.last_animation_started_ordinal()); ink_drop_animation_->HideImmediately(); EXPECT_FALSE(test_api_->HasActiveAnimations()); EXPECT_EQ(views::InkDropState::HIDDEN, - ink_drop_animation_->GetTargetInkDropState()); + ink_drop_animation_->target_ink_drop_state()); EXPECT_EQ(1, observer_.last_animation_started_ordinal()); EXPECT_EQ(2, observer_.last_animation_ended_ordinal()); EXPECT_EQ(InkDropState::ACTION_PENDING, @@ -255,12 +270,12 @@ } TEST_P(InkDropAnimationTest, AnimateToVisibleFromHidden) { - EXPECT_EQ(InkDropState::HIDDEN, ink_drop_animation_->GetTargetInkDropState()); + EXPECT_EQ(InkDropState::HIDDEN, ink_drop_animation_->target_ink_drop_state()); ink_drop_animation_->AnimateToState(views::InkDropState::ACTION_PENDING); EXPECT_TRUE(ink_drop_animation_->IsVisible()); } -// Verifies that the value of InkDropAnimation::GetTargetInkDropState() returns +// Verifies that the value of InkDropAnimation::target_ink_drop_state() returns // the most recent value passed to AnimateToState() when notifying observers // that an animation has started within the AnimateToState() function call. TEST_P(InkDropAnimationTest, TargetInkDropStateOnAnimationStarted) { @@ -272,7 +287,7 @@ observer_.target_state_at_last_animation_started()); } -// Verifies that the value of InkDropAnimation::GetTargetInkDropState() returns +// Verifies that the value of InkDropAnimation::target_ink_drop_state() returns // the most recent value passed to AnimateToState() when notifying observers // that an animation has ended within the AnimateToState() function call. TEST_P(InkDropAnimationTest, TargetInkDropStateOnAnimationEnded) {
diff --git a/ui/views/animation/square_ink_drop_animation.cc b/ui/views/animation/square_ink_drop_animation.cc index ea603a1..eb6890e 100644 --- a/ui/views/animation/square_ink_drop_animation.cc +++ b/ui/views/animation/square_ink_drop_animation.cc
@@ -6,11 +6,7 @@ #include <algorithm> -#include "base/command_line.h" #include "base/logging.h" -#include "third_party/skia/include/core/SkColor.h" -#include "ui/base/ui_base_switches.h" -#include "ui/compositor/callback_layer_animation_observer.h" #include "ui/compositor/layer.h" #include "ui/compositor/layer_animation_sequence.h" #include "ui/compositor/scoped_layer_animation_settings.h" @@ -106,19 +102,6 @@ // The scale factor used to burst the QUICK_ACTION bubble as it fades out. const float kQuickActionBurstScale = 1.3f; -// A multiplicative factor used to slow down InkDropState animations. -const int kSlowAnimationDurationFactor = 3; - -// Checks CommandLine switches to determine if the visual feedback should have -// a fast animations speed. -bool UseFastAnimations() { - static bool fast = - base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( - (::switches::kMaterialDesignInkDropAnimationSpeed)) != - ::switches::kMaterialDesignInkDropAnimationSpeedSlow; - return fast; -} - // Duration constants for InkDropStateSubAnimations. See the // InkDropStateSubAnimations enum documentation for more info. int kAnimationDurationInMs[] = { @@ -140,7 +123,9 @@ // Returns the InkDropState sub animation duration for the given |state|. base::TimeDelta GetAnimationDuration(InkDropSubAnimations state) { return base::TimeDelta::FromMilliseconds( - (UseFastAnimations() ? 1 : kSlowAnimationDurationFactor) * + (views::InkDropAnimation::UseFastAnimations() + ? 1 + : views::InkDropAnimation::kSlowAnimationDurationFactor) * kAnimationDurationInMs[state]); } @@ -188,8 +173,7 @@ color, std::min(large_size_.width(), large_size_.height()) / 2)), rect_layer_delegate_(new RectangleLayerDelegate(color, large_size_)), - root_layer_(ui::LAYER_NOT_DRAWN), - ink_drop_state_(InkDropState::HIDDEN) { + root_layer_(ui::LAYER_NOT_DRAWN) { root_layer_.set_name("SquareInkDropAnimation:ROOT_LAYER"); for (int i = 0; i < PAINTED_SHAPE_COUNT; ++i) @@ -215,10 +199,6 @@ return &root_layer_; } -InkDropState SquareInkDropAnimation::GetTargetInkDropState() const { - return ink_drop_state_; -} - bool SquareInkDropAnimation::IsVisible() const { return root_layer_.visible(); } @@ -227,48 +207,6 @@ return root_layer_.opacity(); } -void SquareInkDropAnimation::AnimateToState(InkDropState ink_drop_state) { - // Does not return early if |ink_drop_state_| == |ink_drop_state| for two - // reasons. - // 1. The attached observers must be notified of all animations started and - // ended. - // 2. Not all state transitions is are valid, especially no-op transitions, - // and these should be detected by DCHECKs in AnimateStateChange(). - - // |animation_observer| will be deleted when AnimationEndedCallback() returns - // true. - // TODO(bruthig): Implement a safer ownership model for the - // |animation_observer|. - ui::CallbackLayerAnimationObserver* animation_observer = - new ui::CallbackLayerAnimationObserver( - base::Bind(&SquareInkDropAnimation::AnimationStartedCallback, - base::Unretained(this), ink_drop_state), - base::Bind(&SquareInkDropAnimation::AnimationEndedCallback, - base::Unretained(this), ink_drop_state)); - - InkDropState old_ink_drop_state = ink_drop_state_; - // Assign to |ink_drop_state_| before calling AnimateStateChange() so that any - // observers notified as a side effect of the AnimateStateChange() will get - // the target InkDropState when calling GetInkDropState(). - ink_drop_state_ = ink_drop_state; - - if (old_ink_drop_state == InkDropState::HIDDEN && - ink_drop_state_ != InkDropState::HIDDEN) { - root_layer_.SetVisible(true); - } - - AnimateStateChange(old_ink_drop_state, ink_drop_state_, animation_observer); - animation_observer->SetActive(); - // |this| may be deleted! |animation_observer| might synchronously call - // AnimationEndedCallback which can delete |this|. -} - -void SquareInkDropAnimation::HideImmediately() { - AbortAllAnimations(); - SetStateToHidden(); - ink_drop_state_ = InkDropState::HIDDEN; -} - std::string SquareInkDropAnimation::ToLayerName(PaintedShape painted_shape) { switch (painted_shape) { case TOP_LEFT_CIRCLE: @@ -424,6 +362,21 @@ } } +void SquareInkDropAnimation::SetStateToHidden() { + InkDropTransforms transforms; + // Use non-zero size to avoid visual anomalies. + CalculateCircleTransforms(gfx::Size(1, 1), &transforms); + SetTransforms(transforms); + root_layer_.SetOpacity(InkDropAnimation::kHiddenOpacity); + root_layer_.SetVisible(false); +} + +void SquareInkDropAnimation::AbortAllAnimations() { + root_layer_.GetAnimator()->AbortAllAnimations(); + for (int i = 0; i < PAINTED_SHAPE_COUNT; ++i) + painted_layers_[i]->GetAnimator()->AbortAllAnimations(); +} + void SquareInkDropAnimation::AnimateToTransforms( const InkDropTransforms transforms, base::TimeDelta duration, @@ -448,15 +401,6 @@ } } -void SquareInkDropAnimation::SetStateToHidden() { - InkDropTransforms transforms; - // Use non-zero size to avoid visual anomalies. - CalculateCircleTransforms(gfx::Size(1, 1), &transforms); - SetTransforms(transforms); - root_layer_.SetOpacity(InkDropAnimation::kHiddenOpacity); - root_layer_.SetVisible(false); -} - void SquareInkDropAnimation::SetTransforms(const InkDropTransforms transforms) { for (int i = 0; i < PAINTED_SHAPE_COUNT; ++i) painted_layers_[i]->SetTransform(transforms[i]); @@ -586,28 +530,4 @@ painted_layers_[painted_shape].reset(layer); } -void SquareInkDropAnimation::AbortAllAnimations() { - root_layer_.GetAnimator()->AbortAllAnimations(); - for (int i = 0; i < PAINTED_SHAPE_COUNT; ++i) - painted_layers_[i]->GetAnimator()->AbortAllAnimations(); -} - -void SquareInkDropAnimation::AnimationStartedCallback( - InkDropState ink_drop_state, - const ui::CallbackLayerAnimationObserver& observer) { - NotifyAnimationStarted(ink_drop_state); -} - -bool SquareInkDropAnimation::AnimationEndedCallback( - InkDropState ink_drop_state, - const ui::CallbackLayerAnimationObserver& observer) { - if (ink_drop_state == InkDropState::HIDDEN) - SetStateToHidden(); - NotifyAnimationEnded(ink_drop_state, - observer.aborted_count() - ? InkDropAnimationObserver::PRE_EMPTED - : InkDropAnimationObserver::SUCCESS); - return true; -} - } // namespace views
diff --git a/ui/views/animation/square_ink_drop_animation.h b/ui/views/animation/square_ink_drop_animation.h index c0fd3b1..9a0bfcb 100644 --- a/ui/views/animation/square_ink_drop_animation.h +++ b/ui/views/animation/square_ink_drop_animation.h
@@ -10,23 +10,19 @@ #include "base/macros.h" #include "base/memory/scoped_ptr.h" #include "base/time/time.h" +#include "third_party/skia/include/core/SkColor.h" #include "ui/compositor/layer.h" #include "ui/compositor/layer_animator.h" #include "ui/gfx/animation/tween.h" +#include "ui/gfx/geometry/point.h" #include "ui/gfx/geometry/size.h" #include "ui/gfx/transform.h" #include "ui/views/animation/ink_drop_animation.h" #include "ui/views/animation/ink_drop_state.h" #include "ui/views/views_export.h" -namespace gfx { -class Point; -} // namespace gfx - namespace ui { -class CallbackLayerAnimationObserver; class Layer; -class LayerAnimationObserver; } // namespace ui namespace views { @@ -64,10 +60,7 @@ // InkDropAnimation: ui::Layer* GetRootLayer() override; - InkDropState GetTargetInkDropState() const override; bool IsVisible() const override; - void AnimateToState(InkDropState ink_drop_state) override; - void HideImmediately() override; private: friend class test::SquareInkDropAnimationTestApi; @@ -93,12 +86,12 @@ float GetCurrentOpacity() const; - // Animates the ripple from the |old_ink_drop_state| to the - // |new_ink_drop_state|. |observer| is added to all LayerAnimationSequence's - // used if not null. + // InkDropAnimation: void AnimateStateChange(InkDropState old_ink_drop_state, InkDropState new_ink_drop_state, - ui::LayerAnimationObserver* observer); + ui::LayerAnimationObserver* observer) override; + void SetStateToHidden() override; + void AbortAllAnimations() override; // Animates all of the painted shape layers to the specified |transforms|. The // animation will be configured with the given |duration|, |tween|, and @@ -111,9 +104,6 @@ gfx::Tween::Type tween, ui::LayerAnimationObserver* observer); - // Updates the transforms, opacity, and visibility to a HIDDEN state. - void SetStateToHidden(); - // Sets the |transforms| on all of the shape layers. Note that this does not // perform any animation. void SetTransforms(const InkDropTransforms transforms); @@ -151,22 +141,6 @@ // Adds and configures a new |painted_shape| layer to |painted_layers_|. void AddPaintLayer(PaintedShape painted_shape); - void AbortAllAnimations(); - - // The Callback invoked when all of the animation sequences for the specific - // |ink_drop_state| animation have started. |observer| is the - // ui::CallbackLayerAnimationObserver which is notifying the callback. - void AnimationStartedCallback( - InkDropState ink_drop_state, - const ui::CallbackLayerAnimationObserver& observer); - - // The Callback invoked when all of the animation sequences for the specific - // |ink_drop_state| animation have finished. |observer| is the - // ui::CallbackLayerAnimationObserver which is notifying the callback. - bool AnimationEndedCallback( - InkDropState ink_drop_state, - const ui::CallbackLayerAnimationObserver& observer); - // Maximum size that an ink drop will be drawn to for any InkDropState whose // final frame should be large. gfx::Size large_size_; @@ -197,9 +171,6 @@ // ui::Layers for all of the painted shape layers that compose the ink drop. scoped_ptr<ui::Layer> painted_layers_[PAINTED_SHAPE_COUNT]; - // The current ink drop state. - InkDropState ink_drop_state_; - DISALLOW_COPY_AND_ASSIGN(SquareInkDropAnimation); };
diff --git a/ui/views/animation/test/flood_fill_ink_drop_animation_test_api.cc b/ui/views/animation/test/flood_fill_ink_drop_animation_test_api.cc new file mode 100644 index 0000000..7378e63 --- /dev/null +++ b/ui/views/animation/test/flood_fill_ink_drop_animation_test_api.cc
@@ -0,0 +1,43 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ui/views/animation/test/flood_fill_ink_drop_animation_test_api.h" + +#include <vector> + +#include "base/time/time.h" +#include "ui/compositor/layer.h" +#include "ui/compositor/layer_animator.h" +#include "ui/compositor/test/layer_animator_test_controller.h" +#include "ui/views/animation/ink_drop_animation.h" + +namespace views { +namespace test { + +FloodFillInkDropAnimationTestApi::FloodFillInkDropAnimationTestApi( + FloodFillInkDropAnimation* ink_drop_animation) + : InkDropAnimationTestApi(ink_drop_animation) {} + +FloodFillInkDropAnimationTestApi::~FloodFillInkDropAnimationTestApi() {} + +gfx::Transform FloodFillInkDropAnimationTestApi::CalculateTransform( + float target_radius) const { + return ink_drop_animation()->CalculateTransform(target_radius); +} + +float FloodFillInkDropAnimationTestApi::GetCurrentOpacity() const { + return ink_drop_animation()->root_layer_.opacity(); +} + +std::vector<ui::LayerAnimator*> +FloodFillInkDropAnimationTestApi::GetLayerAnimators() const { + std::vector<ui::LayerAnimator*> animators = + InkDropAnimationTestApi::GetLayerAnimators(); + animators.push_back(ink_drop_animation()->GetRootLayer()->GetAnimator()); + animators.push_back(ink_drop_animation()->painted_layer_.GetAnimator()); + return animators; +} + +} // namespace test +} // namespace views
diff --git a/ui/views/animation/test/flood_fill_ink_drop_animation_test_api.h b/ui/views/animation/test/flood_fill_ink_drop_animation_test_api.h new file mode 100644 index 0000000..61446cf --- /dev/null +++ b/ui/views/animation/test/flood_fill_ink_drop_animation_test_api.h
@@ -0,0 +1,56 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef UI_VIEWS_ANIMATION_TEST_FLOOD_FILL_INK_DROP_ANIMATION_TEST_API_H_ +#define UI_VIEWS_ANIMATION_TEST_FLOOD_FILL_INK_DROP_ANIMATION_TEST_API_H_ + +#include <vector> + +#include "base/macros.h" +#include "ui/gfx/geometry/size.h" +#include "ui/views/animation/flood_fill_ink_drop_animation.h" +#include "ui/views/animation/test/ink_drop_animation_test_api.h" + +namespace ui { +class LayerAnimator; +} // namespace ui + +namespace views { +namespace test { + +// Test API to provide internal access to a FloodFillInkDropAnimation. +class FloodFillInkDropAnimationTestApi : public InkDropAnimationTestApi { + public: + explicit FloodFillInkDropAnimationTestApi( + FloodFillInkDropAnimation* ink_drop_animation); + ~FloodFillInkDropAnimationTestApi() override; + + // Wrapper functions to the wrapped InkDropAnimation: + gfx::Transform CalculateTransform(float target_radius) const; + + // InkDropAnimationTestApi: + float GetCurrentOpacity() const override; + + protected: + // InkDropAnimationTestApi: + std::vector<ui::LayerAnimator*> GetLayerAnimators() const override; + + private: + FloodFillInkDropAnimation* ink_drop_animation() { + return static_cast<const FloodFillInkDropAnimationTestApi*>(this) + ->ink_drop_animation(); + } + + FloodFillInkDropAnimation* ink_drop_animation() const { + return static_cast<FloodFillInkDropAnimation*>( + InkDropAnimationTestApi::ink_drop_animation()); + } + + DISALLOW_COPY_AND_ASSIGN(FloodFillInkDropAnimationTestApi); +}; + +} // namespace test +} // namespace views + +#endif // UI_VIEWS_ANIMATION_TEST_FLOOD_FILL_INK_DROP_ANIMATION_TEST_API_H_
diff --git a/ui/views/animation/test/test_ink_drop_animation_observer.cc b/ui/views/animation/test/test_ink_drop_animation_observer.cc index fdf4e3a9..0dd5a77 100644 --- a/ui/views/animation/test/test_ink_drop_animation_observer.cc +++ b/ui/views/animation/test/test_ink_drop_animation_observer.cc
@@ -58,7 +58,7 @@ last_animation_state_started_ = ink_drop_state; if (ink_drop_animation_) { target_state_at_last_animation_started_ = - ink_drop_animation_->GetTargetInkDropState(); + ink_drop_animation_->target_ink_drop_state(); } } @@ -70,7 +70,7 @@ last_animation_ended_reason_ = reason; if (ink_drop_animation_) { target_state_at_last_animation_ended_ = - ink_drop_animation_->GetTargetInkDropState(); + ink_drop_animation_->target_ink_drop_state(); } }
diff --git a/ui/views/background.cc b/ui/views/background.cc index 5338f37..56f1eb3 100644 --- a/ui/views/background.cc +++ b/ui/views/background.cc
@@ -61,34 +61,16 @@ Background::Background() : color_(SK_ColorWHITE) -#if defined(OS_WIN) - , native_control_brush_(NULL) -#endif { } Background::~Background() { -#if defined(OS_WIN) - DeleteObject(native_control_brush_); -#endif } void Background::SetNativeControlColor(SkColor color) { color_ = color; -#if defined(OS_WIN) - DeleteObject(native_control_brush_); - native_control_brush_ = NULL; -#endif } -#if defined(OS_WIN) -HBRUSH Background::GetNativeControlBrush() const { - if (!native_control_brush_) - native_control_brush_ = CreateSolidBrush(skia::SkColorToCOLORREF(color_)); - return native_control_brush_; -} -#endif - // static Background* Background::CreateSolidBackground(SkColor color) { return new SolidBackground(color);
diff --git a/ui/views/background.h b/ui/views/background.h index 0d7d65c..d00418a 100644 --- a/ui/views/background.h +++ b/ui/views/background.h
@@ -90,19 +90,8 @@ // backgrounds, this is not useful (returns a default color). SkColor get_color() const { return color_; } -#if defined(OS_WIN) - // TODO(port): Make GetNativeControlBrush portable (currently uses HBRUSH). - - // Get the brush that was specified by SetNativeControlColor - HBRUSH GetNativeControlBrush() const; -#endif // defined(OS_WIN) - private: SkColor color_; -#if defined(OS_WIN) - // TODO(port): Create portable replacement for HBRUSH. - mutable HBRUSH native_control_brush_; -#endif // defined(OS_WIN) DISALLOW_COPY_AND_ASSIGN(Background); };
diff --git a/ui/views/controls/button/custom_button.cc b/ui/views/controls/button/custom_button.cc index 11ea15b..c18a936 100644 --- a/ui/views/controls/button/custom_button.cc +++ b/ui/views/controls/button/custom_button.cc
@@ -375,6 +375,10 @@ return IsTriggerableEvent(event); } +bool CustomButton::ShouldShowInkDropHover() const { + return enabled() && IsMouseHovered() && !InDrag(); +} + bool CustomButton::ShouldEnterHoveredState() { if (!visible()) return false; @@ -425,8 +429,4 @@ Button::OnClickCanceled(event); } -bool CustomButton::ShouldShowInkDropHover() const { - return enabled() && IsMouseHovered() && !InDrag(); -} - } // namespace views
diff --git a/ui/views/controls/button/custom_button.h b/ui/views/controls/button/custom_button.h index 1ec88a0..dfd0384 100644 --- a/ui/views/controls/button/custom_button.h +++ b/ui/views/controls/button/custom_button.h
@@ -122,6 +122,9 @@ // we simply return IsTriggerableEvent(event). virtual bool ShouldEnterPushedState(const ui::Event& event); + // Returns true if hover effect should be visible. + virtual bool ShouldShowInkDropHover() const; + void set_has_ink_drop_action_on_click(bool has_ink_drop_action_on_click) { has_ink_drop_action_on_click_ = has_ink_drop_action_on_click; } @@ -151,8 +154,6 @@ } private: - bool ShouldShowInkDropHover() const; - ButtonState state_; gfx::ThrobAnimation hover_animation_;
diff --git a/ui/views/controls/button/label_button.cc b/ui/views/controls/button/label_button.cc index bc8bf5d5..0ca69a3 100644 --- a/ui/views/controls/button/label_button.cc +++ b/ui/views/controls/button/label_button.cc
@@ -17,6 +17,8 @@ #include "ui/gfx/font_list.h" #include "ui/gfx/geometry/vector2d.h" #include "ui/native_theme/native_theme.h" +#include "ui/views/animation/flood_fill_ink_drop_animation.h" +#include "ui/views/animation/ink_drop_hover.h" #include "ui/views/background.h" #include "ui/views/controls/button/label_button_border.h" #include "ui/views/painter.h" @@ -64,6 +66,7 @@ : CustomButton(listener), image_(new ImageView()), label_(new Label()), + ink_drop_container_(new View()), cached_normal_font_list_(GetDefaultNormalFontList()), cached_bold_font_list_(GetDefaultBoldFontList()), button_state_images_(), @@ -77,6 +80,11 @@ SetAnimationDuration(kHoverAnimationDurationMs); SetText(text); + AddChildView(ink_drop_container_); + ink_drop_container_->SetPaintToLayer(true); + ink_drop_container_->SetFillsBoundsOpaquely(false); + ink_drop_container_->SetVisible(false); + AddChildView(image_); image_->set_interactive(false); @@ -278,6 +286,8 @@ } void LabelButton::Layout() { + ink_drop_container_->SetBoundsRect(GetLocalBounds()); + // By default, GetChildAreaBounds() ignores the top and bottom border, but we // want the image to respect it. gfx::Rect child_area(GetChildAreaBounds()); @@ -380,6 +390,38 @@ InvalidateLayout(); } +void LabelButton::AddInkDropLayer(ui::Layer* ink_drop_layer) { + image()->SetPaintToLayer(true); + image()->SetFillsBoundsOpaquely(false); + ink_drop_container_->SetVisible(true); + ink_drop_container_->layer()->Add(ink_drop_layer); +} + +void LabelButton::RemoveInkDropLayer(ui::Layer* ink_drop_layer) { + image()->SetPaintToLayer(false); + ink_drop_container_->layer()->Remove(ink_drop_layer); + ink_drop_container_->SetVisible(false); +} + +scoped_ptr<views::InkDropAnimation> LabelButton::CreateInkDropAnimation() + const { + // TODO(bruthig): Make the flood fill ink drops centered on the LocatedEvent + // that triggered them. + return GetText().empty() + ? CustomButton::CreateInkDropAnimation() + : make_scoped_ptr(new views::FloodFillInkDropAnimation( + size(), GetInkDropCenter(), GetInkDropBaseColor())); +} + +scoped_ptr<views::InkDropHover> LabelButton::CreateInkDropHover() const { + if (!ShouldShowInkDropHover()) + return nullptr; + return GetText().empty() + ? CustomButton::CreateInkDropHover() + : make_scoped_ptr(new views::InkDropHover( + size(), 0, GetInkDropCenter(), GetInkDropBaseColor())); +} + void LabelButton::StateChanged() { const gfx::Size previous_image_size(image_->GetPreferredSize()); UpdateImage();
diff --git a/ui/views/controls/button/label_button.h b/ui/views/controls/button/label_button.h index 2d69ac5..eee771e 100644 --- a/ui/views/controls/button/label_button.h +++ b/ui/views/controls/button/label_button.h
@@ -18,6 +18,8 @@ namespace views { +class InkDropAnimation; +class InkDropHover; class LabelButtonBorder; class Painter; @@ -99,6 +101,10 @@ void Layout() override; const char* GetClassName() const override; void EnableCanvasFlippingForRTLUI(bool flip) override; + void AddInkDropLayer(ui::Layer* ink_drop_layer) override; + void RemoveInkDropLayer(ui::Layer* ink_drop_layer) override; + scoped_ptr<InkDropAnimation> CreateInkDropAnimation() const override; + scoped_ptr<InkDropHover> CreateInkDropHover() const override; protected: ImageView* image() const { return image_; } @@ -162,6 +168,11 @@ ImageView* image_; Label* label_; + // A separate view is necessary to hold the ink drop layer so that it can + // be stacked below |image_| and on top of |label_|, without resorting to + // drawing |label_| on a layer (which can mess with subpixel anti-aliasing). + View* ink_drop_container_; + // The cached font lists in the normal and bold style. gfx::FontList cached_normal_font_list_; gfx::FontList cached_bold_font_list_;
diff --git a/ui/views/controls/menu/menu_controller.cc b/ui/views/controls/menu/menu_controller.cc index a3af4c13..9a84fee9 100644 --- a/ui/views/controls/menu/menu_controller.cc +++ b/ui/views/controls/menu/menu_controller.cc
@@ -53,16 +53,6 @@ using base::TimeDelta; using ui::OSExchangeData; -// Period of the scroll timer (in milliseconds). -static const int kScrollTimerMS = 30; - -// Amount of time from when the drop exits the menu and the menu is hidden. -static const int kCloseOnExitTime = 1200; - -// If a context menu is invoked by touch, we shift the menu by this offset so -// that the finger does not obscure the menu. -static const int kCenteredContextMenuYOffset = -15; - namespace views { namespace { @@ -70,7 +60,17 @@ // When showing context menu on mouse down, the user might accidentally select // the menu item on the subsequent mouse up. To prevent this, we add the // following delay before the user is able to select an item. -static int menu_selection_hold_time_ms = kMinimumMsPressedToActivate; +int menu_selection_hold_time_ms = kMinimumMsPressedToActivate; + +// Period of the scroll timer (in milliseconds). +const int kScrollTimerMS = 30; + +// Amount of time from when the drop exits the menu and the menu is hidden. +const int kCloseOnExitTime = 1200; + +// If a context menu is invoked by touch, we shift the menu by this offset so +// that the finger does not obscure the menu. +const int kCenteredContextMenuYOffset = -15; // The spacing offset for the bubble tip. const int kBubbleTipSizeLeftRight = 12; @@ -97,7 +97,7 @@ } // Returns the first descendant of |view| that is hot tracked. -static CustomButton* GetFirstHotTrackedView(View* view) { +CustomButton* GetFirstHotTrackedView(View* view) { if (!view) return NULL; CustomButton* button = CustomButton::AsCustomButton(view); @@ -119,7 +119,7 @@ // the first view (if |forward| is false, iterating starts at the last view). If // |forward| is true the children are considered first to last, otherwise last // to first. -static View* GetFirstFocusableView(View* view, int start, bool forward) { +View* GetFirstFocusableView(View* view, int start, bool forward) { if (forward) { for (int i = start == -1 ? 0 : start; i < view->child_count(); ++i) { View* deepest = GetFirstFocusableView(view->child_at(i), -1, forward); @@ -137,15 +137,13 @@ } // Returns the first child of |start| that is focusable. -static View* GetInitialFocusableView(View* start, bool forward) { +View* GetInitialFocusableView(View* start, bool forward) { return GetFirstFocusableView(start, -1, forward); } // Returns the next view after |start_at| that is focusable. Returns NULL if // there are no focusable children of |ancestor| after |start_at|. -static View* GetNextFocusableView(View* ancestor, - View* start_at, - bool forward) { +View* GetNextFocusableView(View* ancestor, View* start_at, bool forward) { DCHECK(ancestor->Contains(start_at)); View* parent = start_at; do { @@ -719,6 +717,9 @@ MenuHostRootView* root_view = GetRootView(source, event.location()); if (root_view) root_view->ProcessMouseMoved(event); + // TODO(varkha): It is possible that another child CustomButton has become + // hot-tracked as a result of this event. We need to track it for accurate + // hot-tracking when both mouse and keyboard are used to navigate the menu. HandleMouseLocation(source, event.location()); } @@ -2086,8 +2087,7 @@ // select the first menu item that is visible and enabled. if (item->GetSubmenu()->GetMenuItemCount()) { MenuItemView* to_select = FindInitialSelectableMenuItem(item, direction); - if (to_select) - SetSelection(to_select, SELECTION_DEFAULT); + SetInitialHotTrackedView(to_select, direction); return; } } @@ -2122,14 +2122,7 @@ if (parent->GetSubmenu()->GetMenuItemAt(i) == item) { MenuItemView* to_select = FindNextSelectableMenuItem(parent, i, direction); - if (!to_select) - break; - SetSelection(to_select, SELECTION_DEFAULT); - View* to_make_hot = GetInitialFocusableView( - to_select, direction == INCREMENT_SELECTION_DOWN); - CustomButton* button_hot = CustomButton::AsCustomButton(to_make_hot); - if (button_hot) - button_hot->SetHotTracked(true); + SetInitialHotTrackedView(to_select, direction); break; } } @@ -2465,8 +2458,7 @@ void MenuController::SetExitType(ExitType type) { exit_type_ = type; // Exit nested message loops as soon as possible. We do this as - // MessagePumpDispatcher is only invoked before native events, which means - // its entirely possible for a Widget::CloseNow() task to be processed before + // it's entirely possible for a Widget::CloseNow() task to be processed before // the next native message. We quite the nested message loop as soon as // possible to avoid having deleted views classes (such as widgets and // rootviews) on the stack when the nested message loop stops. @@ -2611,4 +2603,17 @@ } } +void MenuController::SetInitialHotTrackedView( + MenuItemView* item, + SelectionIncrementDirectionType direction) { + if (!item) + return; + SetSelection(item, SELECTION_DEFAULT); + View* hot_view = + GetInitialFocusableView(item, direction == INCREMENT_SELECTION_DOWN); + CustomButton* hot_button = CustomButton::AsCustomButton(hot_view); + if (hot_button) + hot_button->SetHotTracked(true); +} + } // namespace views
diff --git a/ui/views/controls/menu/menu_controller.h b/ui/views/controls/menu/menu_controller.h index 2b743f7..a5eb5691 100644 --- a/ui/views/controls/menu/menu_controller.h +++ b/ui/views/controls/menu/menu_controller.h
@@ -26,9 +26,6 @@ #include "ui/views/controls/menu/menu_delegate.h" #include "ui/views/widget/widget_observer.h" -namespace base { -class MessagePumpDispatcher; -} namespace gfx { class Screen; } @@ -499,11 +496,10 @@ void SelectByChar(base::char16 key); // For Windows and Aura we repost an event which dismisses the |source| menu. - // The menu is also canceled dependent on the target of the event. The event - // is then reprocessed to cause its result if the menu had not been present. - // On non-aura Windows, a new mouse event is generated and posted to - // the window (if there is one) at the location of the event. On - // aura, the event is reposted on the RootWindow. + // The menu may also be canceled depending on the target of the event. |event| + // is then processed without the menu present. On non-aura Windows, a new + // mouse event is generated and posted to the window (if there is one) at the + // location of the event. On aura, the event is reposted on the RootWindow. void RepostEventAndCancel(SubmenuView* source, const ui::LocatedEvent* event); // Sets the drop target to new_item. @@ -558,6 +554,10 @@ void HandleMouseLocation(SubmenuView* source, const gfx::Point& mouse_location); + // Sets hot-tracked state to the first focusable descendant view of |item|. + void SetInitialHotTrackedView(MenuItemView* item, + SelectionIncrementDirectionType direction); + // The active instance. static MenuController* active_instance_;
diff --git a/ui/views/controls/menu/menu_controller_unittest.cc b/ui/views/controls/menu/menu_controller_unittest.cc index a25610c..4030092e 100644 --- a/ui/views/controls/menu/menu_controller_unittest.cc +++ b/ui/views/controls/menu/menu_controller_unittest.cc
@@ -876,7 +876,7 @@ false, false, &mouse_event_flags); EXPECT_EQ(run_result, nullptr); - // Show a sub menu to targert with a pointer selection. However have the event + // Show a sub menu to target with a pointer selection. However have the event // occur outside of the bounds of the entire menu. SubmenuView* sub_menu = item->GetSubmenu(); sub_menu->ShowAt(owner(), item->bounds(), false); @@ -975,7 +975,7 @@ false, false, &mouse_event_flags); EXPECT_EQ(run_result, nullptr); - // Show a sub menu to targert with a pointer selection. However have the event + // Show a sub menu to target with a pointer selection. However have the event // occur outside of the bounds of the entire menu. SubmenuView* sub_menu = item->GetSubmenu(); sub_menu->ShowAt(owner(), item->bounds(), true);
diff --git a/ui/views/controls/menu/menu_message_loop_aura.h b/ui/views/controls/menu/menu_message_loop_aura.h index bdb83522..fce8858 100644 --- a/ui/views/controls/menu/menu_message_loop_aura.h +++ b/ui/views/controls/menu/menu_message_loop_aura.h
@@ -11,10 +11,6 @@ #include "base/memory/scoped_ptr.h" #include "ui/views/controls/menu/menu_message_loop.h" -namespace base { -class MessagePumpDispatcher; -} - namespace ui { class ScopedEventDispatcher; }
diff --git a/ui/views/controls/menu/menu_scroll_view_container.cc b/ui/views/controls/menu/menu_scroll_view_container.cc index fa71a83..381bef70 100644 --- a/ui/views/controls/menu/menu_scroll_view_container.cc +++ b/ui/views/controls/menu/menu_scroll_view_container.cc
@@ -76,7 +76,6 @@ // The background. gfx::Rect item_bounds(0, 0, width(), height()); NativeTheme::ExtraParams extra; - extra.menu_item.is_selected = false; GetNativeTheme()->Paint(canvas->sk_canvas(), NativeTheme::kMenuItemBackground, NativeTheme::kNormal, item_bounds, extra);
diff --git a/ui/views/views.gyp b/ui/views/views.gyp index 14d92ce4..8adfc68 100644 --- a/ui/views/views.gyp +++ b/ui/views/views.gyp
@@ -37,6 +37,8 @@ 'animation/ink_drop_state.h', 'animation/scroll_animator.cc', 'animation/scroll_animator.h', + 'animation/flood_fill_ink_drop_animation.cc', + 'animation/flood_fill_ink_drop_animation.h', 'animation/square_ink_drop_animation.cc', 'animation/square_ink_drop_animation.h', 'background.cc', @@ -480,6 +482,8 @@ 'widget/desktop_aura/desktop_window_tree_host_ozone.cc', ], 'views_test_support_sources': [ + 'animation/test/flood_fill_ink_drop_animation_test_api.cc', + 'animation/test/flood_fill_ink_drop_animation_test_api.h', 'animation/test/ink_drop_animation_test_api.cc', 'animation/test/ink_drop_animation_test_api.h', 'animation/test/square_ink_drop_animation_test_api.cc',