Import Cobalt 19.master.0.188393
Includes the following patches:
https://cobalt-review.googlesource.com/c/cobalt/+/4970
by milko.leporis@mips.com
https://cobalt-review.googlesource.com/c/cobalt/+/4990
by z102.zhang@samsung.com
Change-Id: I9ac637c775da20fe2ddf4a1337b70c896cee4e27
diff --git a/src/README.md b/src/README.md
index 29c40c8..ced1010 100644
--- a/src/README.md
+++ b/src/README.md
@@ -223,11 +223,16 @@
out/linux-x64x11_debug/cobalt [--url=<url>]
- * If you want to use `http` instead of `https`, you must pass the
- `--allow_http` flag to the Cobalt command-line.
* If you want to connect to an `https` host that doesn't have a
certificate validatable by our set of root CAs, you must pass the
`--ignore_certificate_errors` flag to the Cobalt command-line.
+ * Cobalt requires that the HTML5 content be fetched over HTTPS and
+ enforces CSP when compiled in the "gold" configuration. However, if
+ CSP is served in other builds, Cobalt still respects it. Currently
+ Cobalt is at CSP level 2.
+ * When the HTML5 content is served with a special "h5vcc-location-src"
+ CSP directive, a navigation jail is enabled in Cobalt that cannot be
+ disabled via Cobalt options.
* See [`cobalt/browser/switches.cc`](cobalt/browser/switches.cc) for more
command-line options.
diff --git a/src/base/test/test_suite.cc b/src/base/test/test_suite.cc
index 57de666..ff17a7a 100644
--- a/src/base/test/test_suite.cc
+++ b/src/base/test/test_suite.cc
@@ -301,4 +301,5 @@
}
void TestSuite::Shutdown() {
+ logging::CloseLogFile();
}
diff --git a/src/base/threading/post_task_and_reply_impl.cc b/src/base/threading/post_task_and_reply_impl.cc
index 192198b..855364f 100644
--- a/src/base/threading/post_task_and_reply_impl.cc
+++ b/src/base/threading/post_task_and_reply_impl.cc
@@ -5,6 +5,7 @@
#include "base/threading/post_task_and_reply_impl.h"
#include "base/bind.h"
+#include "base/debug/leak_annotations.h"
#include "base/location.h"
#include "base/message_loop_proxy.h"
@@ -74,6 +75,11 @@
const tracked_objects::Location& from_here,
const Closure& task,
const Closure& reply) {
+ // As mentioned in a comment above, this code is prepared to leak in the case
+ // that the original calling message loop goes away while the task is being
+ // processed. Therefore, explicitly recognize this possibility by allowing
+ // memory leaks here.
+ ANNOTATE_SCOPED_MEMORY_LEAK;
PostTaskAndReplyRelay* relay =
new PostTaskAndReplyRelay(from_here, task, reply);
if (!PostTask(from_here, Bind(&PostTaskAndReplyRelay::Run,
diff --git a/src/cobalt/CHANGELOG.md b/src/cobalt/CHANGELOG.md
index 464062d..433e565 100644
--- a/src/cobalt/CHANGELOG.md
+++ b/src/cobalt/CHANGELOG.md
@@ -2,6 +2,11 @@
This document records all notable changes made to Cobalt since the last release.
+## Version 20
+ - **Improvements and Bug Fixes**
+ - Fix bug where Cobalt would not refresh the layout when the textContent
+ property of a DOM TextNode is modified.
+
## Version 19
- **Add support for V8 JavaScript Engine**
diff --git a/src/cobalt/base/console_commands.cc b/src/cobalt/base/console_commands.cc
index 293958c..4db73b5 100644
--- a/src/cobalt/base/console_commands.cc
+++ b/src/cobalt/base/console_commands.cc
@@ -26,10 +26,10 @@
#if defined(ENABLE_DEBUG_CONSOLE)
ConsoleCommandManager::CommandHandler::CommandHandler(
- const std::string& channel,
+ const std::string& command,
const ConsoleCommandManager::CommandCallback& callback,
const std::string& short_help, const std::string& long_help)
- : channel_(channel),
+ : command_(command),
callback_(callback),
short_help_(short_help),
long_help_(long_help) {
@@ -44,84 +44,69 @@
manager->UnregisterCommandHandler(this);
}
-void ConsoleCommandManager::HandleCommand(const std::string& channel,
+void ConsoleCommandManager::HandleCommand(const std::string& command,
const std::string& message) const {
- DCHECK_GT(channel.length(), size_t(0));
+ DCHECK_GT(command.length(), size_t(0));
base::AutoLock auto_lock(lock_);
- CommandHandlerMap::const_iterator iter =
- command_channel_map_.lower_bound(channel);
- bool handler_found = false;
- while (iter != command_channel_map_.end() && iter->first == channel) {
- handler_found = true;
+ CommandHandlerMap::const_iterator iter = command_command_map_.find(command);
+ if (iter != command_command_map_.end()) {
iter->second->callback().Run(message);
- ++iter;
- }
- if (!handler_found) {
- DLOG(WARNING) << "No command handler registered for channel: " << channel;
+ } else {
+ DLOG(WARNING) << "No handler registered for command: " << command;
}
}
-std::set<std::string> ConsoleCommandManager::GetRegisteredChannels() const {
+std::set<std::string> ConsoleCommandManager::GetRegisteredCommands() const {
std::set<std::string> result;
base::AutoLock auto_lock(lock_);
- for (CommandHandlerMap::const_iterator iter = command_channel_map_.begin();
- iter != command_channel_map_.end(); ++iter) {
+ for (CommandHandlerMap::const_iterator iter = command_command_map_.begin();
+ iter != command_command_map_.end(); ++iter) {
result.insert(iter->first);
}
return result;
}
std::string ConsoleCommandManager::GetShortHelp(
- const std::string& channel) const {
+ const std::string& command) const {
base::AutoLock auto_lock(lock_);
- for (CommandHandlerMap::const_iterator iter =
- command_channel_map_.lower_bound(channel);
- iter != command_channel_map_.end() && iter->first == channel; ++iter) {
+ CommandHandlerMap::const_iterator iter = command_command_map_.find(command);
+ if (iter != command_command_map_.end()) {
return iter->second->short_help();
}
- return "No help available for unregistered channel: " + channel;
+ return "No help available for unregistered command: " + command;
}
std::string ConsoleCommandManager::GetLongHelp(
- const std::string& channel) const {
+ const std::string& command) const {
base::AutoLock auto_lock(lock_);
- for (CommandHandlerMap::const_iterator iter =
- command_channel_map_.lower_bound(channel);
- iter != command_channel_map_.end() && iter->first == channel; ++iter) {
+ CommandHandlerMap::const_iterator iter = command_command_map_.find(command);
+ if (iter != command_command_map_.end()) {
return iter->second->long_help();
}
- return "No help available for unregistered channel: " + channel;
+ return "No help available for unregistered command: " + command;
}
void ConsoleCommandManager::RegisterCommandHandler(
const CommandHandler* handler) {
- DCHECK_GT(handler->channel().length(), size_t(0));
+ DCHECK_GT(handler->command().length(), size_t(0));
base::AutoLock auto_lock(lock_);
- command_channel_map_.insert(std::make_pair(handler->channel(), handler));
+ command_command_map_[handler->command()] = handler;
}
void ConsoleCommandManager::UnregisterCommandHandler(
const CommandHandler* handler) {
- const std::string& channel = handler->channel();
- DCHECK_GT(channel.length(), size_t(0));
+ DCHECK_GT(handler->command().length(), size_t(0));
base::AutoLock auto_lock(lock_);
- for (CommandHandlerMap::iterator iter =
- command_channel_map_.lower_bound(channel);
- iter != command_channel_map_.end() && iter->first == channel; ++iter) {
- if (iter->second == handler) {
- command_channel_map_.erase(iter);
- break;
- }
- }
+ command_command_map_.erase(handler->command());
}
#else // ENABLE_DEBUG_CONSOLE
ConsoleCommandManager::CommandHandler::CommandHandler(
- const std::string& channel,
+ const std::string& command,
const ConsoleCommandManager::CommandCallback& callback,
const std::string& short_help, const std::string& long_help) {
- UNREFERENCED_PARAMETER(channel);
+ UNREFERENCED_PARAMETER(command);
UNREFERENCED_PARAMETER(callback);
UNREFERENCED_PARAMETER(short_help);
UNREFERENCED_PARAMETER(long_help);
@@ -129,25 +114,25 @@
ConsoleCommandManager::CommandHandler::~CommandHandler() {}
-void ConsoleCommandManager::HandleCommand(const std::string& channel,
+void ConsoleCommandManager::HandleCommand(const std::string& command,
const std::string& message) const {
- UNREFERENCED_PARAMETER(channel);
+ UNREFERENCED_PARAMETER(command);
UNREFERENCED_PARAMETER(message);
}
-std::set<std::string> ConsoleCommandManager::GetRegisteredChannels() const {
+std::set<std::string> ConsoleCommandManager::GetRegisteredCommands() const {
return std::set<std::string>();
}
std::string ConsoleCommandManager::GetShortHelp(
- const std::string& channel) const {
- UNREFERENCED_PARAMETER(channel);
+ const std::string& command) const {
+ UNREFERENCED_PARAMETER(command);
return "";
}
std::string ConsoleCommandManager::GetLongHelp(
- const std::string& channel) const {
- UNREFERENCED_PARAMETER(channel);
+ const std::string& command) const {
+ UNREFERENCED_PARAMETER(command);
return "";
}
#endif // ENABLE_DEBUG_CONSOLE
diff --git a/src/cobalt/base/console_commands.h b/src/cobalt/base/console_commands.h
index 55fa7f6..1dc465f 100644
--- a/src/cobalt/base/console_commands.h
+++ b/src/cobalt/base/console_commands.h
@@ -29,15 +29,14 @@
// triggered by the debug console.
//
// Any component can create a handler object of the CommandHandler class to
-// listen for commands on a particular channel. A CommandHandler object
-// automatically registers itself with the ConsoleCommandManager singleton on
-// construction and unregisters itself on destruction.
+// listen for commands. A CommandHandler object automatically registers itself
+// with the ConsoleCommandManager singleton on construction and unregisters
+// itself on destruction.
//
-// Each CommandHandler object specifies a callback and a help string. When the
-// ConsoleCommandManager receives a command broadcast on a particular channel,
-// it runs the callback of the CommandHandler object registered to that
-// channel. The help string is used within the debug console to document the
-// channels that have been registered to listen for commands.
+// Each CommandHandler object specifies a callback and a help string. The
+// ConsoleCommandManager handles a particular command by running the callback of
+// the CommandHandler object registered for that command. The help string is
+// used within the debug console to document the registered commands.
class ConsoleCommandManager {
public:
@@ -47,17 +46,17 @@
// Command handler that registers itself with this object.
class CommandHandler {
public:
- CommandHandler(const std::string& channel, const CommandCallback& callback,
+ CommandHandler(const std::string& command, const CommandCallback& callback,
const std::string& short_help, const std::string& long_help);
~CommandHandler();
- const std::string& channel() const { return channel_; }
+ const std::string& command() const { return command_; }
const CommandCallback& callback() const { return callback_; }
const std::string& short_help() const { return short_help_; }
const std::string& long_help() const { return long_help_; }
private:
- std::string channel_;
+ std::string command_;
CommandCallback callback_;
std::string short_help_;
std::string long_help_;
@@ -69,16 +68,16 @@
static ConsoleCommandManager* GetInstance();
// Handles a command by posting the message to the handler registered for
- // the specified channel, if any.
- void HandleCommand(const std::string& channel,
+ // the specified command, if any.
+ void HandleCommand(const std::string& command,
const std::string& message) const;
- // Returns a set of all the currently registered channels.
- std::set<std::string> GetRegisteredChannels() const;
+ // Returns a set of all the currently registered commands.
+ std::set<std::string> GetRegisteredCommands() const;
- // Returns the help strings for a channel.
- std::string GetShortHelp(const std::string& channel) const;
- std::string GetLongHelp(const std::string& channel) const;
+ // Returns the help strings for a command.
+ std::string GetShortHelp(const std::string& command) const;
+ std::string GetLongHelp(const std::string& command) const;
private:
// Class can only be instanced via the singleton
@@ -87,7 +86,7 @@
#if defined(ENABLE_DEBUG_CONSOLE)
// Command handler map type.
- typedef std::multimap<std::string, const CommandHandler*> CommandHandlerMap;
+ typedef std::map<std::string, const CommandHandler*> CommandHandlerMap;
// Methods to register/unregister command handlers.
// These are intended only to be called from the command handler objects.
@@ -97,8 +96,8 @@
mutable base::Lock lock_;
- // Map of command handlers, one for each channel.
- CommandHandlerMap command_channel_map_;
+ // Map of command handlers, one for each command.
+ CommandHandlerMap command_command_map_;
#endif // ENABLE_DEBUG_CONSOLE
};
diff --git a/src/cobalt/base/copy_i18n_data.gypi b/src/cobalt/base/copy_i18n_data.gypi
index 07b467a..6edde23 100644
--- a/src/cobalt/base/copy_i18n_data.gypi
+++ b/src/cobalt/base/copy_i18n_data.gypi
@@ -33,7 +33,7 @@
'all_dependent_settings': {
'variables': {
- 'content_deploy_subdirs': [ 'icu' ]
+ 'content_deploy_subdirs': [ 'i18n' ]
}
},
}
diff --git a/src/cobalt/base/token.cc b/src/cobalt/base/token.cc
index c6b5443..ba5b852 100644
--- a/src/cobalt/base/token.cc
+++ b/src/cobalt/base/token.cc
@@ -19,6 +19,7 @@
#include "base/logging.h"
#include "base/memory/singleton.h"
+#include "base/string_piece.h"
#include "base/synchronization/lock.h"
namespace base {
@@ -54,12 +55,14 @@
#if defined(BASE_HASH_USE_HASH_STRUCT)
uint32 hash(const char* str) {
- return BASE_HASH_NAMESPACE::hash<const char*>()(str);
+ return BASE_HASH_NAMESPACE::hash<base::StringPiece>()(str);
}
#else
-uint32 hash(const char* str) { return BASE_HASH_NAMESPACE::hash_value(str); }
+uint32 hash(const char* str) {
+ return BASE_HASH_NAMESPACE::hash_value(base::StringPiece(str));
+}
#endif // COMPILER
diff --git a/src/cobalt/black_box_tests/black_box_tests.py b/src/cobalt/black_box_tests/black_box_tests.py
index e15fce0..faa1693 100644
--- a/src/cobalt/black_box_tests/black_box_tests.py
+++ b/src/cobalt/black_box_tests/black_box_tests.py
@@ -26,8 +26,7 @@
]
# These tests only need app launchers with webdriver.
_TESTS_NO_SIGNAL = [
- # TODO: Re-enable cookie test after its flakiness is resovled.
- # 'persistent_cookie',
+ 'persistent_cookie',
'allow_eval',
'disable_eval_with_csp',
]
@@ -64,13 +63,13 @@
return new_runner
-def LoadTests(platform, config):
+def LoadTests(platform, config, device_id):
launcher = abstract_launcher.LauncherFactory(
platform,
'cobalt',
config,
- device_id=None,
+ device_id=device_id,
target_params=None,
output_file=None,
out_directory=None)
@@ -101,7 +100,7 @@
suite = unittest.TestLoader().loadTestsFromModule(
importlib.import_module(_TEST_DIR_PATH + self.test_name))
else:
- suite = LoadTests(_device_params.platform, _device_params.config)
+ suite = LoadTests(_device_params.platform, _device_params.config, _device_params.device_id)
return_code = not unittest.TextTestRunner(
verbosity=0, stream=sys.stdout).run(suite).wasSuccessful()
return return_code
@@ -123,4 +122,4 @@
# make module-owned variables like device_param accessible to the tests.
main_module = importlib.import_module(
'cobalt.black_box_tests.black_box_tests')
- main_module.main()
+ sys.exit(main_module.main())
diff --git a/src/cobalt/black_box_tests/testdata/persistent_cookie.html b/src/cobalt/black_box_tests/testdata/persistent_cookie.html
index dd4c75f..d7e838f 100644
--- a/src/cobalt/black_box_tests/testdata/persistent_cookie.html
+++ b/src/cobalt/black_box_tests/testdata/persistent_cookie.html
@@ -67,8 +67,6 @@
} else if (event.keyCode === 99) {
thirdRun();
}
- // Flush local storage to ensure cookie is written before closing.
- h5vcc.storage.flush();
onEndTest();
}
setupFinished();
diff --git a/src/cobalt/black_box_tests/threaded_web_server.py b/src/cobalt/black_box_tests/threaded_web_server.py
index b1cb297..8291375 100644
--- a/src/cobalt/black_box_tests/threaded_web_server.py
+++ b/src/cobalt/black_box_tests/threaded_web_server.py
@@ -62,27 +62,34 @@
def __init__(self,
handler=MakeRequestHandlerClass(os.path.dirname(__file__))):
_ThreadedTCPServer.allow_reuse_address = True
- # Get the socket address for the ANY interface. Doing it this way
- # has it so that it will work for IPv4, and IPv6 only networks.
- # Note that putting '::' as the hostname does not work at this time
- # (see https://bugs.python.org/issue20215). Instead, the following code
- # was inspired by https://docs.python.org/2/library/socket.html.
- for result in socket.getaddrinfo(None, 0, socket.AF_UNSPEC,
- socket.SOCK_STREAM, 0, socket.AI_PASSIVE):
- # This is (0.0.0.0, 0) or equivalent in IPv6 (could be more than 2
- # elements).
- socket_address = result[4]
- break
- self._server = _ThreadedTCPServer(socket_address, handler)
+ try:
+ self._server = _ThreadedTCPServer(('0.0.0.0', 8000), handler)
+ except socket.error:
+ # Get the socket address for the ANY interface. Doing it this way
+ # has it so that it will work for IPv4. IPv6 is not supported yet because
+ # SocketServer.TCPServer can not take '::' as the hostname at this time.
+ # (see https://bugs.python.org/issue20215). Instead, the following code
+ # was inspired by https://docs.python.org/2/library/socket.html.
+ for result in socket.getaddrinfo(None, 0, socket.AF_UNSPEC,
+ socket.SOCK_STREAM, 0, socket.AI_PASSIVE
+ ):
+ if len(result[4]) == 2:
+ # This is (0.0.0.0, 0).
+ socket_address = result[4]
+ break
+ self._server = _ThreadedTCPServer(socket_address, handler)
+
self._server_thread = None
self._bound_port = self._server.server_address[1]
address_pack_list = socket.getaddrinfo(socket.gethostname(),
self._bound_port)
- first_address_pack = address_pack_list[0]
- self._bound_ip, _ = first_address_pack[4]
- self._bound_host, _ = first_address_pack[4]
+ for address_pack in address_pack_list:
+ if len(address_pack[4]) == 2:
+ self._bound_ip, _ = address_pack[4]
+ self._bound_host, _ = address_pack[4]
+ break
def GetURL(self, file_name):
"""Given a |file_name|, return a HTTP URI that can be fetched.
diff --git a/src/cobalt/browser/application.cc b/src/cobalt/browser/application.cc
index 7fee6c2..35b2953 100644
--- a/src/cobalt/browser/application.cc
+++ b/src/cobalt/browser/application.cc
@@ -868,6 +868,7 @@
const network::NetworkEvent* network_event =
base::polymorphic_downcast<const network::NetworkEvent*>(event);
if (network_event->type() == network::NetworkEvent::kDisconnection) {
+ LOG(INFO) << "Detected a network disconnection.";
network_status_ = kDisconnectedNetworkStatus;
++network_disconnect_count_;
browser_module_->Navigate(GURL("h5vcc://network-failure"));
diff --git a/src/cobalt/browser/browser_bindings_gen.gyp b/src/cobalt/browser/browser_bindings_gen.gyp
index 2c708e9..cf277ee 100644
--- a/src/cobalt/browser/browser_bindings_gen.gyp
+++ b/src/cobalt/browser/browser_bindings_gen.gyp
@@ -226,6 +226,7 @@
'generated_header_idl_files': [
'../audio/audio_node_channel_count_mode.idl',
'../audio/audio_node_channel_interpretation.idl',
+ '../debug/console_command.idl',
'../dom/blob_property_bag.idl',
'../dom/captions/caption_character_edge_style.idl',
'../dom/captions/caption_color.idl',
diff --git a/src/cobalt/browser/browser_module.cc b/src/cobalt/browser/browser_module.cc
index 3e6bffb..5daa9c4 100644
--- a/src/cobalt/browser/browser_module.cc
+++ b/src/cobalt/browser/browser_module.cc
@@ -337,6 +337,15 @@
options_.web_module_options.injected_window_attributes["h5vcc"] =
base::Bind(&CreateH5VCC, h5vcc_settings);
+ if (command_line->HasSwitch(switches::kDisableTimerResolutionLimit)) {
+ options_.web_module_options.limit_performance_timer_resolution = false;
+ }
+
+#if defined(ENABLE_PARTIAL_LAYOUT_CONTROL)
+ options_.web_module_options.enable_partial_layout =
+ !command_line->HasSwitch(switches::kDisablePartialLayout);
+#endif // defined(ENABLE_PARTIAL_LAYOUT_CONTROL)
+
base::optional<std::string> extension_object_name =
GetWebAPIExtensionObjectPropertyName();
if (extension_object_name) {
@@ -1036,6 +1045,14 @@
}
#if defined(ENABLE_DEBUG_CONSOLE)
+ // If the debug console is fully visible, it gets the next chance to handle
+ // pointer events.
+ if (debug_console_->GetMode() >= debug::DebugHub::kDebugConsoleOn) {
+ if (!debug_console_->FilterPointerEvent(type, event)) {
+ return;
+ }
+ }
+
trace_manager_.OnInputEventProduced();
#endif // defined(ENABLE_DEBUG_CONSOLE)
@@ -1054,6 +1071,14 @@
}
#if defined(ENABLE_DEBUG_CONSOLE)
+ // If the debug console is fully visible, it gets the next chance to handle
+ // wheel events.
+ if (debug_console_->GetMode() >= debug::DebugHub::kDebugConsoleOn) {
+ if (!debug_console_->FilterWheelEvent(type, event)) {
+ return;
+ }
+ }
+
trace_manager_.OnInputEventProduced();
#endif // defined(ENABLE_DEBUG_CONSOLE)
@@ -1116,6 +1141,8 @@
on_error_triggered_count_++;
#endif
+ LOG(INFO) << "Network error: " << error;
+
// Set |pending_navigate_url_| to the url where the error occurred. This will
// cause the OnError callback to Navigate() to this URL if it receives a
// positive response; otherwise, if Cobalt is currently preloaded or
diff --git a/src/cobalt/browser/cobalt.gyp b/src/cobalt/browser/cobalt.gyp
index 3d5fd8b..b06913c 100644
--- a/src/cobalt/browser/cobalt.gyp
+++ b/src/cobalt/browser/cobalt.gyp
@@ -24,6 +24,11 @@
'<(DEPTH)/cobalt/browser/browser.gyp:browser',
],
'conditions': [
+ ['clang and target_os not in ["tvos", "android", "orbis"]', {
+ 'dependencies': [
+ '<(DEPTH)/third_party/musl/musl.gyp:c'
+ ],
+ }],
['cobalt_enable_lib == 1', {
'sources': [
'lib/cobalt.def',
diff --git a/src/cobalt/browser/debug_console.cc b/src/cobalt/browser/debug_console.cc
index bf5143e..a71be63 100644
--- a/src/cobalt/browser/debug_console.cc
+++ b/src/cobalt/browser/debug_console.cc
@@ -211,6 +211,22 @@
return false;
}
+bool DebugConsole::FilterWheelEvent(base::Token type,
+ const dom::WheelEventInit& event) {
+ // Assume here the full debug console is visible - pass all events to its
+ // web module, and return false to indicate the event has been consumed.
+ web_module_->InjectWheelEvent(type, event);
+ return false;
+}
+
+bool DebugConsole::FilterPointerEvent(base::Token type,
+ const dom::PointerEventInit& event) {
+ // Assume here the full debug console is visible - pass all events to its
+ // web module, and return false to indicate the event has been consumed.
+ web_module_->InjectPointerEvent(type, event);
+ return false;
+}
+
#if SB_HAS(ON_SCREEN_KEYBOARD)
bool DebugConsole::InjectOnScreenKeyboardInputEvent(
base::Token type, const dom::InputEventInit& event) {
diff --git a/src/cobalt/browser/debug_console.h b/src/cobalt/browser/debug_console.h
index 20f7049..dcf7d41 100644
--- a/src/cobalt/browser/debug_console.h
+++ b/src/cobalt/browser/debug_console.h
@@ -27,6 +27,8 @@
#include "cobalt/debug/debug_hub.h"
#include "cobalt/dom/input_event_init.h"
#include "cobalt/dom/keyboard_event_init.h"
+#include "cobalt/dom/pointer_event_init.h"
+#include "cobalt/dom/wheel_event_init.h"
#include "cobalt/dom/window.h"
#include "googleurl/src/gurl.h"
@@ -53,6 +55,16 @@
// false if it was consumed within this function.
bool FilterKeyEvent(base::Token type, const dom::KeyboardEventInit& event);
+ // Filters a pointer event.
+ // Returns true if the event should be passed on to other handlers,
+ // false if it was consumed within this function.
+ bool FilterPointerEvent(base::Token type, const dom::PointerEventInit& event);
+
+ // Filters a wheel event.
+ // Returns true if the event should be passed on to other handlers,
+ // false if it was consumed within this function.
+ bool FilterWheelEvent(base::Token type, const dom::WheelEventInit& event);
+
#if SB_HAS(ON_SCREEN_KEYBOARD)
// Inject an on screen keyboard input event.
// Returns true if the event should be passed on to other handlers,
diff --git a/src/cobalt/browser/debug_console/debug_commands.js b/src/cobalt/browser/debug_console/debug_commands.js
index 755a4be..a6dbbc7 100644
--- a/src/cobalt/browser/debug_console/debug_commands.js
+++ b/src/cobalt/browser/debug_console/debug_commands.js
@@ -103,7 +103,7 @@
'Get the debugger client. The debugger client can be used to issue ' +
'JavaScript debugging commands to the main web module.';
- addUserCommands();
+ addConsoleCommands();
}
function help(command) {
@@ -148,21 +148,18 @@
executeMain(js);
}
-function addUserCommands() {
- var channelString = window.debugHub.getCommandChannels();
- var channels = channelString.split(' ');
- for (var i = 0; i < channels.length; i++) {
- addSingleUserCommand(channels[i])
+function addConsoleCommands() {
+ var consoleCommands = window.debugHub.debugger.consoleCommands;
+ for (var i = 0; i < consoleCommands.length; i++) {
+ var c = consoleCommands[i];
+ addOneConsoleCommand(c.command, c.shortHelp, c.longHelp);
}
}
-function addSingleUserCommand(channel) {
- var channelHelp = window.debugHub.getCommandChannelShortHelp(channel);
- debug[channel] = function(message) {
- window.debugHub.sendCommand(channel, message);
+function addOneConsoleCommand(command, shortHelp, longHelp) {
+ debug[command] = function(message) {
+ window.debugHub.debugger.sendConsoleCommand(command, message);
}
- debug[channel].shortHelp =
- window.debugHub.getCommandChannelShortHelp(channel);
- debug[channel].longHelp =
- window.debugHub.getCommandChannelLongHelp(channel);
+ debug[command].shortHelp = shortHelp;
+ debug[command].longHelp = longHelp;
}
diff --git a/src/cobalt/browser/debug_console/debug_console.js b/src/cobalt/browser/debug_console/debug_console.js
index 5878b5c..ba503ff 100644
--- a/src/cobalt/browser/debug_console/debug_console.js
+++ b/src/cobalt/browser/debug_console/debug_console.js
@@ -229,6 +229,14 @@
executeCommand(command);
}
+function onWheel(event) {
+ if (event.deltaY > 0) {
+ messageLog.scrollDown(event.deltaY);
+ } else if (event.deltaY < 0) {
+ messageLog.scrollUp(-event.deltaY);
+ }
+}
+
function onKeydown(event) {
var key = event.key;
if (key == 'Unidentified') {
@@ -313,6 +321,7 @@
createConsoleValues();
initDebugCommands();
addLogMessageCallback();
+ document.addEventListener('wheel', onWheel);
document.addEventListener('keypress', onKeypress);
document.addEventListener('keydown', onKeydown);
document.addEventListener('keyup', onKeyup);
diff --git a/src/cobalt/browser/debug_console/message_log.js b/src/cobalt/browser/debug_console/message_log.js
index d51a915..4f378f5 100644
--- a/src/cobalt/browser/debug_console/message_log.js
+++ b/src/cobalt/browser/debug_console/message_log.js
@@ -189,8 +189,8 @@
}
}
-MessageLog.prototype.pageUp = function() {
- this.displayPos += this.SCROLL_SIZE;
+MessageLog.prototype.scrollUp = function(size) {
+ this.displayPos += size;
var max = this.buffer.size - this.DISPLAY_AT_HEAD;
if (this.displayPos > max) {
this.displayPos = max;
@@ -198,14 +198,22 @@
this.displayMessages();
}
-MessageLog.prototype.pageDown = function() {
- this.displayPos -= this.SCROLL_SIZE;
+MessageLog.prototype.scrollDown = function(size) {
+ this.displayPos -= size;
if (this.displayPos < 0) {
this.displayPos = 0;
}
this.displayMessages();
}
+MessageLog.prototype.pageUp = function() {
+ this.scrollUp(this.SCROLL_SIZE);
+}
+
+MessageLog.prototype.pageDown = function() {
+ this.scrollDown(this.SCROLL_SIZE);
+}
+
MessageLog.prototype.toHead = function() {
this.displayPos = this.buffer.size - this.DISPLAY_AT_HEAD;
this.displayMessages();
diff --git a/src/cobalt/browser/memory_tracker/tool/leak_finder_tool.cc b/src/cobalt/browser/memory_tracker/tool/leak_finder_tool.cc
index 69dfa9b..3f0f188 100644
--- a/src/cobalt/browser/memory_tracker/tool/leak_finder_tool.cc
+++ b/src/cobalt/browser/memory_tracker/tool/leak_finder_tool.cc
@@ -31,6 +31,9 @@
namespace browser {
namespace memory_tracker {
+// Number of output values to display in the csv.
+const size_t kNumberOfOutputColumns = 40;
+
LeakFinderTool::LeakFinderTool(StackTraceMode mode)
: string_pool_(128),
frame_map_(128),
@@ -202,14 +205,13 @@
std::vector<AllocationProfile> alloc_profiles;
GenerateTopLeakingAllocationProfiles(time_values, map_allocations,
&alloc_profiles);
-
if (alloc_profiles.empty()) {
params->logger()->Output(
"MemoryTrackerLeakFinder: alloc_profiles was "
"empty and nothing is written.");
} else {
- if (alloc_profiles.size() > 20) {
- alloc_profiles.resize(20);
+ if (alloc_profiles.size() > kNumberOfOutputColumns) {
+ alloc_profiles.resize(kNumberOfOutputColumns);
}
std::string csv_str = GenerateCSV(time_values, alloc_profiles);
@@ -319,8 +321,12 @@
ss << kNewLine << kNewLine;
// HEADER
- ss << "// Allocation in megabytes." << kNewLine;
- ss << kQuote << "Time(min)" << kQuote << kDelimiter;
+ ss << "// Allocation in megabytes. Keep in mind that only" << kNewLine
+ << "// the N top allocations will be displayed, sorted" << kNewLine
+ << "// by slope steepness. Negative slopping allocations" << kNewLine
+ << "// and allocations that have few blocks may be filtered" << kNewLine
+ << "// out." << kNewLine
+ << kQuote << "Time(min)" << kQuote << kDelimiter;
for (size_t i = 0; i < data.size(); ++i) {
const AllocationProfile& alloc_profile = data[i];
const std::string& name = *alloc_profile.name_;
diff --git a/src/cobalt/browser/screen_shot_writer.cc b/src/cobalt/browser/screen_shot_writer.cc
index 925b96f..3f25781 100644
--- a/src/cobalt/browser/screen_shot_writer.cc
+++ b/src/cobalt/browser/screen_shot_writer.cc
@@ -28,9 +28,7 @@
: pipeline_(pipeline),
screenshot_thread_("Screenshot IO thread") {
DCHECK(pipeline);
- base::Thread::Options options;
- options.message_loop_type = MessageLoop::TYPE_IO;
- screenshot_thread_.StartWithOptions(options);
+ screenshot_thread_.Start();
}
void ScreenShotWriter::RequestScreenshotToFile(
diff --git a/src/cobalt/browser/switches.cc b/src/cobalt/browser/switches.cc
index 98fbd7a..65b0cfa 100644
--- a/src/cobalt/browser/switches.cc
+++ b/src/cobalt/browser/switches.cc
@@ -108,8 +108,10 @@
"sessions and no data being persisted to future sessions. It effectively "
"makes the app run as if it has no local storage.";
-const char kPartialLayout[] = "partial_layout";
-const char kPartialLayoutHelp[] = "Switches partial layout: on | off";
+const char kDisablePartialLayout[] = "disable_partial_layout";
+const char kDisablePartialLayoutHelp[] =
+ "Causes layout to re-compute the boxes for the entire DOM rather than "
+ "re-using boxes for elements that have not been invalidated.";
const char kProd[] = "prod";
const char kProdHelp[] =
@@ -191,6 +193,13 @@
const char kDisableJavaScriptJitHelp[] =
"Specifies that javascript jit should be disabled.";
+const char kDisableTimerResolutionLimit[] = "disable_timer_resolution_limit";
+const char kDisableTimerResolutionLimitHelp[] =
+ "By default, window.performance.now() will return values at a clamped "
+ "minimum resolution of 20us. By specifying this flag, the limit will be "
+ "removed and the resolution will be 1us (or larger depending on the "
+ "platform.";
+
const char kEnableMapToMeshRectanglar[] = "enable_map_to_mesh_rectangular";
const char kEnableMapToMeshRectanglarHelp[] =
"If toggled and map-to-mesh is supported on this platform, this allows it "
@@ -364,7 +373,7 @@
{kMinLogLevel, kMinLogLevelHelp},
{kNullAudioStreamer, kNullAudioStreamerHelp},
{kNullSavegame, kNullSavegameHelp},
- {kPartialLayout, kPartialLayoutHelp}, {kProd, kProdHelp},
+ {kDisablePartialLayout, kDisablePartialLayoutHelp}, {kProd, kProdHelp},
{kProxy, kProxyHelp}, {kRemoteDebuggingPort, kRemoteDebuggingPortHelp},
{kRequireCSP, kRequireCSPHelp},
{kRequireHTTPSLocation, kRequireHTTPSLocationHelp},
@@ -379,6 +388,7 @@
#endif // ENABLE_DEBUG_COMMAND_LINE_SWITCHES
{kDisableJavaScriptJit, kDisableJavaScriptJitHelp},
+ {kDisableTimerResolutionLimit, kDisableTimerResolutionLimitHelp},
{kEnableMapToMeshRectanglar, kEnableMapToMeshRectanglarHelp},
{kForceMigrationForStoragePartitioning,
kForceMigrationForStoragePartitioningHelp},
diff --git a/src/cobalt/browser/switches.h b/src/cobalt/browser/switches.h
index 9c9e4fc..ed76f19 100644
--- a/src/cobalt/browser/switches.h
+++ b/src/cobalt/browser/switches.h
@@ -56,8 +56,8 @@
extern const char kNullAudioStreamerHelp[];
extern const char kNullSavegame[];
extern const char kNullSavegameHelp[];
-extern const char kPartialLayout[];
-extern const char kPartialLayoutHelp[];
+extern const char kDisablePartialLayout[];
+extern const char kDisablePartialLayoutHelp[];
extern const char kProd[];
extern const char kProdHelp[];
extern const char kProxy[];
@@ -90,6 +90,8 @@
extern const char kDisableJavaScriptJit[];
extern const char kDisableJavaScriptJitHelp[];
+extern const char kDisableTimerResolutionLimit[];
+extern const char kDisableTimerResolutionLimitHelp[];
extern const char kEnableMapToMeshRectanglar[];
extern const char kForceMigrationForStoragePartitioning[];
extern const char kFPSPrint[];
diff --git a/src/cobalt/browser/testdata/mse-eme-conformance-tests/media/car-20120827-85.mp4 b/src/cobalt/browser/testdata/mse-eme-conformance-tests/media/car-20120827-85.mp4
deleted file mode 100644
index 831859e..0000000
--- a/src/cobalt/browser/testdata/mse-eme-conformance-tests/media/car-20120827-85.mp4
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/browser/testdata/mse-eme-conformance-tests/media/car-20120827-86.mp4 b/src/cobalt/browser/testdata/mse-eme-conformance-tests/media/car-20120827-86.mp4
deleted file mode 100644
index fe5f3ca..0000000
--- a/src/cobalt/browser/testdata/mse-eme-conformance-tests/media/car-20120827-86.mp4
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/browser/testdata/mse-eme-conformance-tests/media/car-20120827-8b.mp4 b/src/cobalt/browser/testdata/mse-eme-conformance-tests/media/car-20120827-8b.mp4
deleted file mode 100644
index 703415a..0000000
--- a/src/cobalt/browser/testdata/mse-eme-conformance-tests/media/car-20120827-8b.mp4
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/browser/testdata/mse-eme-conformance-tests/media/car-20120827-8c.mp4 b/src/cobalt/browser/testdata/mse-eme-conformance-tests/media/car-20120827-8c.mp4
deleted file mode 100644
index 381ffa9..0000000
--- a/src/cobalt/browser/testdata/mse-eme-conformance-tests/media/car-20120827-8c.mp4
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/browser/testdata/mse-eme-conformance-tests/media/car-20120827-8d.mp4 b/src/cobalt/browser/testdata/mse-eme-conformance-tests/media/car-20120827-8d.mp4
deleted file mode 100644
index 3e9abdd..0000000
--- a/src/cobalt/browser/testdata/mse-eme-conformance-tests/media/car-20120827-8d.mp4
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/browser/testdata/mse-eme-conformance-tests/media/car-audio-1MB-trunc.mp4 b/src/cobalt/browser/testdata/mse-eme-conformance-tests/media/car-audio-1MB-trunc.mp4
deleted file mode 100644
index 5a8e3aa..0000000
--- a/src/cobalt/browser/testdata/mse-eme-conformance-tests/media/car-audio-1MB-trunc.mp4
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/browser/testdata/mse-eme-conformance-tests/media/car_20130125_18.mp4 b/src/cobalt/browser/testdata/mse-eme-conformance-tests/media/car_20130125_18.mp4
deleted file mode 100644
index cb88666..0000000
--- a/src/cobalt/browser/testdata/mse-eme-conformance-tests/media/car_20130125_18.mp4
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/browser/testdata/mse-eme-conformance-tests/media/car_cenc-20120827-85.mp4 b/src/cobalt/browser/testdata/mse-eme-conformance-tests/media/car_cenc-20120827-85.mp4
deleted file mode 100644
index 2abd243..0000000
--- a/src/cobalt/browser/testdata/mse-eme-conformance-tests/media/car_cenc-20120827-85.mp4
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/browser/testdata/mse-eme-conformance-tests/media/car_cenc-20120827-8b.mp4 b/src/cobalt/browser/testdata/mse-eme-conformance-tests/media/car_cenc-20120827-8b.mp4
deleted file mode 100644
index 4f89212..0000000
--- a/src/cobalt/browser/testdata/mse-eme-conformance-tests/media/car_cenc-20120827-8b.mp4
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/browser/testdata/mse-eme-conformance-tests/media/car_cenc-20120827-8c.mp4 b/src/cobalt/browser/testdata/mse-eme-conformance-tests/media/car_cenc-20120827-8c.mp4
deleted file mode 100644
index 899fa90..0000000
--- a/src/cobalt/browser/testdata/mse-eme-conformance-tests/media/car_cenc-20120827-8c.mp4
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/browser/testdata/mse-eme-conformance-tests/media/car_cenc-20120827-8d.mp4 b/src/cobalt/browser/testdata/mse-eme-conformance-tests/media/car_cenc-20120827-8d.mp4
deleted file mode 100644
index 60237b0..0000000
--- a/src/cobalt/browser/testdata/mse-eme-conformance-tests/media/car_cenc-20120827-8d.mp4
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/browser/testdata/mse-eme-conformance-tests/media/nq-frames23-tfdt24.mp4 b/src/cobalt/browser/testdata/mse-eme-conformance-tests/media/nq-frames23-tfdt24.mp4
deleted file mode 100644
index ebf0935..0000000
--- a/src/cobalt/browser/testdata/mse-eme-conformance-tests/media/nq-frames23-tfdt24.mp4
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/browser/testdata/mse-eme-conformance-tests/media/nq-frames24-tfdt23.mp4 b/src/cobalt/browser/testdata/mse-eme-conformance-tests/media/nq-frames24-tfdt23.mp4
deleted file mode 100644
index 75b6afb..0000000
--- a/src/cobalt/browser/testdata/mse-eme-conformance-tests/media/nq-frames24-tfdt23.mp4
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/browser/testdata/mse-eme-conformance-tests/media/oops_cenc-20121114-145-143.mp4 b/src/cobalt/browser/testdata/mse-eme-conformance-tests/media/oops_cenc-20121114-145-143.mp4
deleted file mode 100644
index 6007fd8..0000000
--- a/src/cobalt/browser/testdata/mse-eme-conformance-tests/media/oops_cenc-20121114-145-143.mp4
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/browser/testdata/mse-eme-conformance-tests/media/sintel-trunc.mp4 b/src/cobalt/browser/testdata/mse-eme-conformance-tests/media/sintel-trunc.mp4
deleted file mode 100644
index e9692fa..0000000
--- a/src/cobalt/browser/testdata/mse-eme-conformance-tests/media/sintel-trunc.mp4
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/browser/testdata/mse-eme-conformance-tests/media/test-video-1MB.mp4 b/src/cobalt/browser/testdata/mse-eme-conformance-tests/media/test-video-1MB.mp4
deleted file mode 100644
index 217a71a..0000000
--- a/src/cobalt/browser/testdata/mse-eme-conformance-tests/media/test-video-1MB.mp4
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/browser/trace_manager.cc b/src/cobalt/browser/trace_manager.cc
index 77e059c..059e207 100644
--- a/src/cobalt/browser/trace_manager.cc
+++ b/src/cobalt/browser/trace_manager.cc
@@ -23,10 +23,10 @@
namespace browser {
namespace {
-// Name of the channel to listen for trace commands from the debug console.
-const char kTraceCommandChannel[] = "trace";
+// Name of the trace command from the debug console.
+const char kTraceCommand[] = "trace";
-// Help strings for the trace command channel.
+// Help strings for the trace command.
const char kTraceCommandShortHelp[] = "Starts/stops execution tracing.";
const char kTraceCommandLongHelp[] =
"If a trace is currently running, stops it and saves the result; "
@@ -51,7 +51,7 @@
TraceManager::TraceManager()
: self_message_loop_(MessageLoop::current()),
ALLOW_THIS_IN_INITIALIZER_LIST(trace_command_handler_(
- kTraceCommandChannel,
+ kTraceCommand,
base::Bind(&TraceManager::OnTraceMessage, base::Unretained(this)),
kTraceCommandShortHelp, kTraceCommandLongHelp)),
ALLOW_THIS_IN_INITIALIZER_LIST(input_trace_command_handler_(
diff --git a/src/cobalt/browser/web_module.cc b/src/cobalt/browser/web_module.cc
index cb9a1ae..cf84a18 100644
--- a/src/cobalt/browser/web_module.cc
+++ b/src/cobalt/browser/web_module.cc
@@ -34,8 +34,8 @@
#include "cobalt/base/type_id.h"
#include "cobalt/browser/splash_screen_cache.h"
#include "cobalt/browser/stack_size_constants.h"
-#include "cobalt/browser/switches.h"
#include "cobalt/browser/web_module_stat_tracker.h"
+#include "cobalt/browser/switches.h"
#include "cobalt/css_parser/parser.h"
#include "cobalt/debug/debug_server_module.h"
#include "cobalt/dom/blob.h"
@@ -77,27 +77,6 @@
// deeper than this could be discarded, and will not be rendered.
const int kDOMMaxElementDepth = 32;
-#if defined(ENABLE_PARTIAL_LAYOUT_CONTROL)
-// Help string for the 'partial_layout' command.
-const char kPartialLayoutCommandShortHelp[] =
- "Controls partial layout: on | off | wipe | wipe,off";
-const char kPartialLayoutCommandLongHelp[] =
- "Controls partial layout.\n"
- "\n"
- "Syntax:\n"
- " debug.partial_layout('CMD [, CMD ...]')\n"
- "\n"
- "Where CMD can be:\n"
- " on : turn partial layout on.\n"
- " off : turn partial layout off.\n"
- " wipe : wipe the box tree.\n"
- "\n"
- "Example:\n"
- " debug.partial_layout('off,wipe')\n"
- "\n"
- "To wipe the box tree and turn partial layout off.";
-#endif // defined(ENABLE_PARTIAL_LAYOUT_CONTROL)
-
bool CacheUrlContent(SplashScreenCache* splash_screen_cache, const GURL& url,
const std::string& content) {
base::optional<std::string> key = SplashScreenCache::GetKeyForStartUrl(url);
@@ -198,10 +177,6 @@
// so that the message loop can easily exit
void ClearAllIntervalsAndTimeouts();
-#if defined(ENABLE_PARTIAL_LAYOUT_CONTROL)
- void OnPartialLayoutConsoleCommandReceived(const std::string& message);
-#endif // defined(ENABLE_PARTIAL_LAYOUT_CONTROL)
-
#if defined(ENABLE_WEBDRIVER)
// Creates a new webdriver::WindowDriver that interacts with the Window that
// is owned by this WebModule instance.
@@ -428,12 +403,6 @@
// DocumentObserver that observes the loading document.
scoped_ptr<DocumentLoadedObserver> document_load_observer_;
-#if defined(ENABLE_PARTIAL_LAYOUT_CONTROL)
- // Handles the 'partial_layout' command.
- scoped_ptr<base::ConsoleCommandManager::CommandHandler>
- partial_layout_command_handler_;
-#endif // defined(ENABLE_PARTIAL_LAYOUT_CONTROL)
-
scoped_ptr<media_session::MediaSessionClient> media_session_client_;
scoped_ptr<layout::TopmostEventTarget> topmost_event_target_;
@@ -611,6 +580,11 @@
global_environment_->AddRoot(&mutation_observer_task_manager_);
global_environment_->AddRoot(media_source_registry_.get());
+ bool log_tts = false;
+#if defined(ENABLE_DEBUG_COMMAND_LINE_SWITCHES)
+ log_tts = CommandLine::ForCurrentProcess()->HasSwitch(switches::kUseTTS);
+#endif
+
window_ = new dom::Window(
data.window_dimensions.width(), data.window_dimensions.height(),
data.video_pixel_ratio, data.initial_application_state, css_parser_.get(),
@@ -646,11 +620,13 @@
#if defined(ENABLE_TEST_RUNNER)
data.options.layout_trigger == layout::LayoutManager::kTestRunnerMode
? dom::Window::kClockTypeTestRunner
- : dom::Window::kClockTypeSystemTime,
+ : (data.options.limit_performance_timer_resolution
+ ? dom::Window::kClockTypeResolutionLimitedSystemTime
+ : dom::Window::kClockTypeSystemTime),
#else
dom::Window::kClockTypeSystemTime,
#endif
- splash_screen_cache_callback, system_caption_settings_);
+ splash_screen_cache_callback, system_caption_settings_, log_tts);
DCHECK(window_);
window_weak_ = base::AsWeakPtr(window_.get());
@@ -714,6 +690,10 @@
window_->document()->AddObserver(document_load_observer_.get());
}
+#if defined(ENABLE_PARTIAL_LAYOUT_CONTROL)
+ window_->document()->SetPartialLayout(data.options.enable_partial_layout);
+#endif // defined(ENABLE_PARTIAL_LAYOUT_CONTROL)
+
is_running_ = true;
}
@@ -942,17 +922,6 @@
synchronous_loader_interrupt_.Signal();
}
-#if defined(ENABLE_PARTIAL_LAYOUT_CONTROL)
-void WebModule::Impl::OnPartialLayoutConsoleCommandReceived(
- const std::string& message) {
- DCHECK(thread_checker_.CalledOnValidThread());
- DCHECK(is_running_);
- DCHECK(window_);
- DCHECK(window_->document());
- window_->document()->SetPartialLayout(message);
-}
-#endif // defined(ENABLE_PARTIAL_LAYOUT_CONTROL)
-
void WebModule::Impl::OnCspPolicyChanged() {
DCHECK(thread_checker_.CalledOnValidThread());
DCHECK(is_running_);
@@ -1329,30 +1298,11 @@
message_loop()->PostBlockingTask(
FROM_HERE, base::Bind(&WebModule::Initialize, base::Unretained(this),
construction_data));
-
-#if defined(ENABLE_PARTIAL_LAYOUT_CONTROL)
- CommandLine* command_line = CommandLine::ForCurrentProcess();
- if (command_line->HasSwitch(browser::switches::kPartialLayout)) {
- const std::string partial_layout_string =
- command_line->GetSwitchValueASCII(browser::switches::kPartialLayout);
- OnPartialLayoutConsoleCommandReceived(partial_layout_string);
- }
- partial_layout_command_handler_.reset(
- new base::ConsoleCommandManager::CommandHandler(
- browser::switches::kPartialLayout,
- base::Bind(&WebModule::OnPartialLayoutConsoleCommandReceived,
- base::Unretained(this)),
- kPartialLayoutCommandShortHelp, kPartialLayoutCommandLongHelp));
-#endif // defined(ENABLE_PARTIAL_LAYOUT_CONTROL)
}
WebModule::~WebModule() {
DCHECK(message_loop());
-#if defined(ENABLE_PARTIAL_LAYOUT_CONTROL)
- partial_layout_command_handler_.reset();
-#endif // defined(ENABLE_PARTIAL_LAYOUT_CONTROL)
-
// Create a destruction observer to shut down the WebModule once all pending
// tasks have been executed and the message loop is about to be destroyed.
// This allows us to safely stop the thread, drain the task queue, then
@@ -1524,19 +1474,6 @@
}
}
-#if defined(ENABLE_PARTIAL_LAYOUT_CONTROL)
-void WebModule::OnPartialLayoutConsoleCommandReceived(
- const std::string& message) {
- DCHECK(message_loop());
- DCHECK(impl_);
-
- message_loop()->PostTask(
- FROM_HERE,
- base::Bind(&WebModule::Impl::OnPartialLayoutConsoleCommandReceived,
- base::Unretained(impl_.get()), message));
-}
-#endif // defined(ENABLE_PARTIAL_LAYOUT_CONTROL)
-
#if defined(ENABLE_WEBDRIVER)
scoped_ptr<webdriver::WindowDriver> WebModule::CreateWindowDriver(
const webdriver::protocol::WindowId& window_id) {
diff --git a/src/cobalt/browser/web_module.h b/src/cobalt/browser/web_module.h
index 06163fb..4b7a43a 100644
--- a/src/cobalt/browser/web_module.h
+++ b/src/cobalt/browser/web_module.h
@@ -232,6 +232,16 @@
// color of transparent will replace existing pixel values, effectively
// clearing the screen.
bool clear_window_with_background_color;
+
+ // As a preventative measure against Spectre attacks, we explicitly limit
+ // the resolution of the performance timer by default. Setting this option
+ // can allow the limit to be disabled.
+ bool limit_performance_timer_resolution = true;
+
+#if defined(ENABLE_PARTIAL_LAYOUT_CONTROL)
+ // Whether layout is optimized to re-use boxes for still-valid elements.
+ bool enable_partial_layout = true;
+#endif // defined(ENABLE_PARTIAL_LAYOUT_CONTROL)
};
typedef layout::LayoutManager::LayoutResults LayoutResults;
@@ -416,10 +426,6 @@
void CancelSynchronousLoads();
-#if defined(ENABLE_PARTIAL_LAYOUT_CONTROL)
- void OnPartialLayoutConsoleCommandReceived(const std::string& message);
-#endif // defined(ENABLE_PARTIAL_LAYOUT_CONTROL)
-
// The message loop this object is running on.
MessageLoop* message_loop() const { return thread_.message_loop(); }
@@ -430,12 +436,6 @@
// All sub-objects of this object are created on this thread, and all public
// member functions are re-posted to this thread if necessary.
base::Thread thread_;
-
-#if defined(ENABLE_PARTIAL_LAYOUT_CONTROL)
- // Handles the 'partial_layout' command.
- scoped_ptr<base::ConsoleCommandManager::CommandHandler>
- partial_layout_command_handler_;
-#endif // defined(ENABLE_PARTIAL_LAYOUT_CONTROL)
};
} // namespace browser
diff --git a/src/cobalt/build/build.id b/src/cobalt/build/build.id
index a23811b..6ec0091 100644
--- a/src/cobalt/build/build.id
+++ b/src/cobalt/build/build.id
@@ -1 +1 @@
-186250
\ No newline at end of file
+188393
\ No newline at end of file
diff --git a/src/cobalt/content/ssl/certs/2c11d503.0 b/src/cobalt/content/ssl/certs/2c11d503.0
deleted file mode 100644
index acedb11..0000000
--- a/src/cobalt/content/ssl/certs/2c11d503.0
+++ /dev/null
@@ -1,12 +0,0 @@
------BEGIN CERTIFICATE-----
-MIICITCCAaagAwIBAgISESDm+Ez8JLC+BUCs2oMbNGA/MAoGCCqGSM49BAMDMEAxCzAJBgNVBAYT
-AkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9wZW5UcnVzdCBSb290IENBIEczMB4X
-DTE0MDUyNjAwMDAwMFoXDTM4MDExNTAwMDAwMFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9w
-ZW5UcnVzdDEdMBsGA1UEAwwUT3BlblRydXN0IFJvb3QgQ0EgRzMwdjAQBgcqhkjOPQIBBgUrgQQA
-IgNiAARK7liuTcpm3gY6oxH84Bjwbhy6LTAMidnW7ptzg6kjFYwvWYpa3RTqnVkrQ7cG7DK2uu5B
-ta1doYXM6h0UZqNnfkbilPPntlahFVmhTzeXuSIevRHr9LIfXsMUmuXZl5mjYzBhMA4GA1UdDwEB
-/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRHd8MUi2I5DMlv4VBN0BBY3JWIbTAf
-BgNVHSMEGDAWgBRHd8MUi2I5DMlv4VBN0BBY3JWIbTAKBggqhkjOPQQDAwNpADBmAjEAj6jcnboM
-BBf6Fek9LykBl7+BFjNAk2z8+e2AcG+qj9uEwov1NcoG3GRvaBbhj5G5AjEA2Euly8LQCGzpGPta
-3U1fJAuwACEl74+nBCZx4nxp5V2a+EEfOzmTk51V6s2N8fvB
------END CERTIFICATE-----
diff --git a/src/cobalt/content/ssl/certs/451b5485.0 b/src/cobalt/content/ssl/certs/451b5485.0
deleted file mode 100644
index bf864ae..0000000
--- a/src/cobalt/content/ssl/certs/451b5485.0
+++ /dev/null
@@ -1,12 +0,0 @@
------BEGIN CERTIFICATE-----
-MIICHDCCAaKgAwIBAgISESDZkc6uo+jF5//pAq/Pc7xVMAoGCCqGSM49BAMDMD4xCzAJBgNVBAYT
-AkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBsdXMgUm9vdCBDQSBHMjAeFw0x
-NDA1MjYwMDAwMDBaFw0zODAxMTUwMDAwMDBaMD4xCzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0
-cGx1czEcMBoGA1UEAwwTQ2VydHBsdXMgUm9vdCBDQSBHMjB2MBAGByqGSM49AgEGBSuBBAAiA2IA
-BM0PW1aC3/BFGtat93nwHcmsltaeTpwftEIRyoa/bfuFo8XlGVzX7qY/aWfYeOKmycTbLXku54uN
-Am8xIk0G42ByRZ0OQneezs/lf4WbGOT8zC5y0xaTTsqZY1yhBSpsBqNjMGEwDgYDVR0PAQH/BAQD
-AgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNqDYwJ5jtpMxjwjFNiPwyCrKGBZMB8GA1Ud
-IwQYMBaAFNqDYwJ5jtpMxjwjFNiPwyCrKGBZMAoGCCqGSM49BAMDA2gAMGUCMHD+sAvZ94OX7PNV
-HdTcswYO/jOYnYs5kGuUIe22113WTNchp+e/IQ8rzfcq3IUHnQIxAIYUFuXcsGXCwI4Un78kFmjl
-vPl5adytRSv3tjFzzAalU5ORGpOucGpnutee5WEaXw==
------END CERTIFICATE-----
diff --git a/src/cobalt/content/ssl/certs/608a55ad.0 b/src/cobalt/content/ssl/certs/608a55ad.0
deleted file mode 100644
index eb2e84f..0000000
--- a/src/cobalt/content/ssl/certs/608a55ad.0
+++ /dev/null
@@ -1,27 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIFbzCCA1egAwIBAgISESChaRu/vbm9UpaPI+hIvyYRMA0GCSqGSIb3DQEBDQUAMEAxCzAJBgNV
-BAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9wZW5UcnVzdCBSb290IENBIEcy
-MB4XDTE0MDUyNjAwMDAwMFoXDTM4MDExNTAwMDAwMFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoM
-CU9wZW5UcnVzdDEdMBsGA1UEAwwUT3BlblRydXN0IFJvb3QgQ0EgRzIwggIiMA0GCSqGSIb3DQEB
-AQUAA4ICDwAwggIKAoICAQDMtlelM5QQgTJT32F+D3Y5z1zCU3UdSXqWON2ic2rxb95eolq5cSG+
-Ntmh/LzubKh8NBpxGuga2F8ORAbtp+Dz0mEL4DKiltE48MLaARf85KxP6O6JHnSrT78eCbY2albz
-4e6WiWYkBuTNQjpK3eCasMSCRbP+yatcfD7J6xcvDH1urqWPyKwlCm/61UWY0jUJ9gNDlP7ZvyCV
-eYCYitmJNbtRG6Q3ffyZO6v/v6wNj0OxmXsWEH4db0fEFY8ElggGQgT4hNYdvJGmQr5J1WqIP7wt
-UdGejeBSzFfdNTVY27SPJIjki9/ca1TSgSuyzpJLHB9G+h3Ykst2Z7UJmQnlrBcUVXDGPKBWCgOz
-3GIZ38i1MH/1PCZ1Eb3XG7OHngevZXHloM8apwkQHZOJZlvoPGIytbU6bumFAYueQ4xncyhZW+vj
-3CzMpSZyYhK05pyDRPZRpOLAeiRXyg6lPzq1O4vldu5w5pLeFlwoW5cZJ5L+epJUzpM5ChaHvGOz
-9bGTXOBut9Dq+WIyiET7vycotjCVXRIouZW+j1MY5aIYFuJWpLIsEPUdN6b4t/bQWVyJ98LVtZR0
-0dX+G7bw5tYee9I8y6jj9RjzIR9u701oBnstXW5DiabA+aC/gh7PU3+06yzbXfZqfUAkBXKJOAGT
-y3HCOV0GEfZvePg3DTmEJwIDAQABo2MwYTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
-/zAdBgNVHQ4EFgQUajn6QiL35okATV59M4PLuG53hq8wHwYDVR0jBBgwFoAUajn6QiL35okATV59
-M4PLuG53hq8wDQYJKoZIhvcNAQENBQADggIBAJjLq0A85TMCl38th6aP1F5Kr7ge57tx+4BkJamz
-Gj5oXScmp7oq4fBXgwpkTx4idBvpkF/wrM//T2h6OKQQbA2xx6R3gBi2oihEdqc0nXGEL8pZ0keI
-mUEiyTCYYW49qKgFbdEfwFFEVn8nNQLdXpgKQuswv42hm1GqO+qTRmTFAHneIWv2V6CG1wZy7HBG
-S4tz3aAhdT7cHcCP009zHIXZ/n9iyJVvttN7jLpTwm+bREx50B1ws9efAvSyB7DH5fitIw6mVskp
-EndI2S9G/Tvw/HRwkqWOOAgfZDC2t0v7NqwQjqBSM2OdAzVWxWm9xiNaJ5T2pBL4LTM8oValX9YZ
-6e18CL13zSdkzJTaTkZQh+D5wVOAHrut+0dSixv9ovneDiK3PTNZbNTe9ZUGMg1RGUFcPk8G97kr
-gCf2o6p6fAbhQ8MTOWIaNr3gKC6UAuQpLmBVrkA9sHSSXvAgZJY/X0VdiLWK2gKgW0VU3jg9CcCo
-SmVGFvyqv1ROTVu+OEO3KMqLM6oaJbolXCkvW0pujOotnCr2BXbgd5eAiN1nE28daCSLT7d0geX0
-YJ96Vdc+N9oWaz53rK4YcJUIeSkDiv7BO7M/Gg+kO14fWKGVyasvc0rQLW6aWQ9VGHgtPFGml4vm
-u7JwqkwR3v98KzfUetF3NI/n+UL3PIEMS1IK
------END CERTIFICATE-----
diff --git a/src/cobalt/content/ssl/certs/773e07ad.0 b/src/cobalt/content/ssl/certs/773e07ad.0
new file mode 100644
index 0000000..4e0d8e9
--- /dev/null
+++ b/src/cobalt/content/ssl/certs/773e07ad.0
@@ -0,0 +1,13 @@
+-----BEGIN CERTIFICATE-----
+MIICaTCCAe+gAwIBAgIQISpWDK7aDKtARb8roi066jAKBggqhkjOPQQDAzBtMQswCQYDVQQGEwJD
+SDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEo
+MCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQyBDQTAeFw0xNzA1MDkwOTQ4MzRa
+Fw00MjA1MDkwOTU4MzNaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQL
+ExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh
+bCBSb290IEdDIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAETOlQwMYPchi82PG6s4nieUqjFqdr
+VCTbUf/q9Akkwwsin8tqJ4KBDdLArzHkdIJuyiXZjHWd8dvQmqJLIX4Wp2OQ0jnUsYd4XxiWD1Ab
+NTcPasbc2RNNpI6QN+a9WzGRo1QwUjAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd
+BgNVHQ4EFgQUSIcUrOPDnpBgOtfKie7TrYy0UGYwEAYJKwYBBAGCNxUBBAMCAQAwCgYIKoZIzj0E
+AwMDaAAwZQIwJsdpW9zV57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtk
+AjEA2zQgMgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9
+-----END CERTIFICATE-----
diff --git a/src/cobalt/content/ssl/certs/87229d21.0 b/src/cobalt/content/ssl/certs/87229d21.0
deleted file mode 100644
index 90c8eb7..0000000
--- a/src/cobalt/content/ssl/certs/87229d21.0
+++ /dev/null
@@ -1,27 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIFbzCCA1egAwIBAgISESCzkFU5fX82bWTCp59rY45nMA0GCSqGSIb3DQEBCwUAMEAxCzAJBgNV
-BAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9wZW5UcnVzdCBSb290IENBIEcx
-MB4XDTE0MDUyNjA4NDU1MFoXDTM4MDExNTAwMDAwMFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoM
-CU9wZW5UcnVzdDEdMBsGA1UEAwwUT3BlblRydXN0IFJvb3QgQ0EgRzEwggIiMA0GCSqGSIb3DQEB
-AQUAA4ICDwAwggIKAoICAQD4eUbalsUwXopxAy1wpLuwxQjczeY1wICkES3d5oeuXT2R0odsN7fa
-Yp6bwiTXj/HbpqbfRm9RpnHLPhsxZ2L3EVs0J9V5ToybWL0iEA1cJwzdMOWo010hOHQX/uMftk87
-ay3bfWAfjH1MBcLrARYVmBSO0ZB3Ij/swjm4eTrwSSTilZHcYTSSjFR077F9jAHiOH3BX2pfJLKO
-YheteSCtqx234LSWSE9mQxAGFiQD4eCcjsZGT44ameGPuY4zbGneWK2gDqdkVBFpRGZPTBKnjix9
-xNRbxQA0MMHZmf4yzgeEtE7NCv82TWLxp2NX5Ntqp66/K7nJ5rInieV+mhxNaMbBGN4zK1FGSxyO
-9z0M+Yo0FMT7MzUj8czxKselu7Cizv5Ta01BG2Yospb6p64KTrk5M0ScdMGTHPjgniQlQ/GbI4Kq
-3ywgsNw2TgOzfALU5nsaqocTvz6hdLubDuHAk5/XpGbKuxs74zD0M1mKB3IDVedzagMxbm+WG+Oi
-n6+Sx+31QrclTDsTBM8clq8cIqPQqwWyTBIjUtz9GVsnnB47ev1CI9sjgBPwvFEVVJSmdz7QdFG9
-URQIOTfLHzSpMJ1ShC5VkLG631UAC9hWLbFJSXKAqWLXwPYYEQRVzXR7z2FwefR7LFxckvzluFqr
-TJOVoSfupb7PcSNCupt2LQIDAQABo2MwYTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
-/zAdBgNVHQ4EFgQUl0YhVyE12jZVx/PxN3DlCPaTKbYwHwYDVR0jBBgwFoAUl0YhVyE12jZVx/Px
-N3DlCPaTKbYwDQYJKoZIhvcNAQELBQADggIBAB3dAmB84DWn5ph76kTOZ0BP8pNuZtQ5iSas000E
-PLuHIT839HEl2ku6q5aCgZG27dmxpGWX4m9kWaSW7mDKHyP7Rbr/jyTwyqkxf3kfgLMtMrpkZ2Cv
-uVnN35pJ06iCsfmYlIrM4LvgBBuZYLFGZdwIorJGnkSI6pN+VxbSFXJfLkur1J1juONI5f6ELlgK
-n0Md/rcYkoZDSw6cMoYsYPXpSOqV7XAp8dUv/TW0V8/bhUiZucJvbI/NeJWsZCj9VrDDb8O+WVLh
-X4SPgPL0DTatdrOjteFkdjpY3H1PXlZs5VVZV6Xf8YpmMIzUUmI4d7S+KNfKNsSbBfD4Fdvb8e80
-nR14SohWZ25g/4/Ii+GOvUKpMwpZQhISKvqxnUOOBZuZ2mKtVzazHbYNeS2WuOvyDEsMpZTGMKcm
-GS3tTAZQMPH9WD25SxdfGbRqhFS0OE85og2WaMMolP3tLR9Ka0OWLpABEPs4poEL0L9109S5zvE/
-bw4cHjdx5RiHdRk/ULlepEU0rbDK5uUTdg8xFKmOLZTW1YVNcxVPS/KyPu1svf0OnWZzsD2097+o
-4BGkxK51CUpjAEggpsadCwmKtODmzj7HPiY46SvepghJAwSQiumPv+i2tCqjI40cHLI5kqiPAlxA
-OXXUc0ECd97N4EOH1uS6SsNsEn/+KuYj1oxx
------END CERTIFICATE-----
diff --git a/src/cobalt/content/ssl/certs/9168f543.0 b/src/cobalt/content/ssl/certs/9168f543.0
deleted file mode 100644
index c037748..0000000
--- a/src/cobalt/content/ssl/certs/9168f543.0
+++ /dev/null
@@ -1,27 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIFazCCA1OgAwIBAgISESBVg+QtPlRWhS2DN7cs3EYRMA0GCSqGSIb3DQEBDQUAMD4xCzAJBgNV
-BAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBsdXMgUm9vdCBDQSBHMTAe
-Fw0xNDA1MjYwMDAwMDBaFw0zODAxMTUwMDAwMDBaMD4xCzAJBgNVBAYTAkZSMREwDwYDVQQKDAhD
-ZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBsdXMgUm9vdCBDQSBHMTCCAiIwDQYJKoZIhvcNAQEBBQAD
-ggIPADCCAgoCggIBANpQh7bauKk+nWT6VjOaVj0W5QOVsjQcmm1iBdTYj+eJZJ+622SLZOZ5KmHN
-r49aiZFluVj8tANfkT8tEBXgfs+8/H9DZ6itXjYj2JizTfNDnjl8KvzsiNWI7nC9hRYt6kuJPKNx
-Qv4c/dMcLRC4hlTqQ7jbxofaqK6AJc96Jh2qkbBIb6613p7Y1/oA/caP0FG7Yn2ksYyy/yARujVj
-BYZHYEMzkPZHogNPlk2dT8Hq6pyi/jQu3rfKG3akt62f6ajUeD94/vI4CTYd0hYCyOwqaK/1jpTv
-LRN6HkJKHRUxrgwEV/xhc/MxVoYxgKDEEW4wduOU8F8ExKyHcomYxZ3MVwia9Az8fXoFOvpHgDm2
-z4QTd28n6v+WZxcIbekN1iNQMLAVdBM+5S//Ds3EC0pd8NgAM0lm66EYfFkuPSi5YXHLtaW6uOrc
-4nBvCGrch2c0798wct3zyT8j/zXhviEpIDCB5BmlIOklynMxdCm+4kLV87ImZsdo/Rmz5yCTmehd
-4F6H50boJZwKKSTUzViGUkAksnsPmBIgJPaQbEfIDbsYIC7Z/fyL8inqh3SV4EJQeIQEQWGw9CEj
-jy3LKCHyamz0GqbFFLQ3ZU+V/YDI+HLlJWvEYLF7bY5KinPOWftwenMGE9nTdDckQQoRb5fc5+R+
-ob0V8rqHDz1oihYHAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0G
-A1UdDgQWBBSowcCbkahDFXxdBie0KlHYlwuBsTAfBgNVHSMEGDAWgBSowcCbkahDFXxdBie0KlHY
-lwuBsTANBgkqhkiG9w0BAQ0FAAOCAgEAnFZvAX7RvUz1isbwJh/k4DgYzDLDKTudQSk0YcbX8ACh
-66Ryj5QXvBMsdbRX7gp8CXrc1cqh0DQT+Hern+X+2B50ioUHj3/MeXrKls3N/U/7/SMNkPX0XtPG
-YX2eEeAC7gkE2Qfdpoq3DIMku4NQkv5gdRE+2J2winq14J2by5BSS7CTKtQ+FjPlnsZlFT5kOwQ/
-2wyPX1wdaR+v8+khjPPvl/aatxm2hHSco1S1cE5j2FddUyGbQJJD+tZ3VTNPZNX70Cxqjm0lpu+F
-6ALEUz65noe8zDUa3qHpimOHZR4RKttjd5cUvpoUmRGywO6wT/gUITJDT5+rosuoD6o7BlXGEilX
-CNQ314cnrUlZp5GrRHpejXDbl85IULFzk/bwg2D5zfHhMf1bfHEhYxQUqq/F3pN+aLHsIqKqkHWe
-tUNy6mSjhEv9DKgma3GX7lZjZuhCVPnHHd/Qj1vfyDBviP4NxDMcU6ij/UgQ8uQKTuEVV/xuZDDC
-VRHc6qnNSlSsKWNEz0pAoNZoWRsz+e86i9sgktxChL8Bq4fA1SCC28a5g4VCXA9DO2pJNdWY9BW/
-+mGBDAkgGNLQFwzLSABQ6XaCjGTXOqAHVcweMcDvOrRl++O/QmueD6i9a5jc2NvLi6Td11n0bt3+
-qsOR0C5CB8AMTVPNJLFMWx5R9N/pkvo=
------END CERTIFICATE-----
diff --git a/src/cobalt/content/ssl/certs/dc4d6a89.0 b/src/cobalt/content/ssl/certs/dc4d6a89.0
new file mode 100644
index 0000000..097abc0
--- /dev/null
+++ b/src/cobalt/content/ssl/certs/dc4d6a89.0
@@ -0,0 +1,27 @@
+-----BEGIN CERTIFICATE-----
+MIIFgzCCA2ugAwIBAgIORea7A4Mzw4VlSOb/RVEwDQYJKoZIhvcNAQEMBQAwTDEgMB4GA1UECxMX
+R2xvYmFsU2lnbiBSb290IENBIC0gUjYxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkds
+b2JhbFNpZ24wHhcNMTQxMjEwMDAwMDAwWhcNMzQxMjEwMDAwMDAwWjBMMSAwHgYDVQQLExdHbG9i
+YWxTaWduIFJvb3QgQ0EgLSBSNjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFs
+U2lnbjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAJUH6HPKZvnsFMp7PPcNCPG0RQss
+grRIxutbPK6DuEGSMxSkb3/pKszGsIhrxbaJ0cay/xTOURQh7ErdG1rG1ofuTToVBu1kZguSgMpE
+3nOUTvOniX9PeGMIyBJQbUJmL025eShNUhqKGoC3GYEOfsSKvGRMIRxDaNc9PIrFsmbVkJq3MQbF
+vuJtMgamHvm566qjuL++gmNQ0PAYid/kD3n16qIfKtJwLnvnvJO7bVPiSHyMEAc4/2ayd2F+4OqM
+PKq0pPbzlUoSB239jLKJz9CgYXfIWHSw1CM69106yqLbnQneXUQtkPGBzVeS+n68UARjNN9rkxi+
+azayOeSsJDa38O+2HBNXk7besvjihbdzorg1qkXy4J02oW9UivFyVm4uiMVRQkQVlO6jxTiWm05O
+WgtH8wY2SXcwvHE35absIQh1/OZhFj931dmRl4QKbNQCTXTAFO39OfuD8l4UoQSwC+n+7o/hbguy
+CLNhZglqsQY6ZZZZwPA1/cnaKI0aEYdwgQqomnUdnjqGBQCe24DWJfncBZ4nWUx2OVvq+aWh2IMP
+0f/fMBH5hc8zSPXKbWQULHpYT9NLCEnFlWQaYw55PfWzjMpYrZxCRXluDocZXFSxZba/jJvcE+kN
+b7gu3GduyYsRtYQUigAZcIN5kZeR1BonvzceMgfYFGM8KEyvAgMBAAGjYzBhMA4GA1UdDwEB/wQE
+AwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSubAWjkxPioufi1xzWx/B/yGdToDAfBgNV
+HSMEGDAWgBSubAWjkxPioufi1xzWx/B/yGdToDANBgkqhkiG9w0BAQwFAAOCAgEAgyXt6NH9lVLN
+nsAEoJFp5lzQhN7craJP6Ed41mWYqVuoPId8AorRbrcWc+ZfwFSY1XS+wc3iEZGtIxg93eFyRJa0
+lV7Ae46ZeBZDE1ZXs6KzO7V33EByrKPrmzU+sQghoefEQzd5Mr6155wsTLxDKZmOMNOsIeDjHfrY
+BzN2VAAiKrlNIC5waNrlU/yDXNOd8v9EDERm8tLjvUYAGm0CuiVdjaExUd1URhxN25mW7xocBFym
+Fe944Hn+Xds+qkxV/ZoVqW/hpvvfcDDpw+5CRu3CkwWJ+n1jez/QcYF8AOiYrg54NMMl+68KnyBr
+3TsTjxKM4kEaSHpzoHdpx7Zcf4LIHv5YGygrqGytXm3ABdJ7t+uA/iU3/gKbaKxCXcPu9czc8FB1
+0jZpnOZ7BN9uBmm23goJSFmH63sUYHpkqmlD75HHTOwY3WzvUy2MmeFe8nI+z1TIvWfspA9MRf/T
+uTAjB0yPEL+GltmZWrSZVxykzLsViVO6LAUP5MSeGbEYNNVMnbrt9x+vJJUEeKgDu+6B5dpffItK
+oZB0JaezPkvILFa9x8jvOOJckvB595yEunQtYQEgfn7R8k8HWV+LLUNS60YMlOH1Zkd5d9VUWx+t
+JDfLRVpOoERIyNiwmcUVhAn21klJwGW45hpxbqCo8YLoRT5s1gLXCmeDBVrJpBA=
+-----END CERTIFICATE-----
diff --git a/src/cobalt/css_parser/scanner.cc b/src/cobalt/css_parser/scanner.cc
index ce0bc8c..872fe85 100644
--- a/src/cobalt/css_parser/scanner.cc
+++ b/src/cobalt/css_parser/scanner.cc
@@ -666,8 +666,6 @@
number.begin = input_iterator_;
// Negative numbers are handled in the grammar.
- // Scientific notation is required by the standard but is not supported
- // neither by WebKit nor Blink.
bool dot_seen(false);
while (true) {
if (!IsAsciiDigit(input_iterator_[0])) {
@@ -681,7 +679,6 @@
}
++input_iterator_;
}
- number.end = input_iterator_;
if (UNLIKELY(parsing_mode_ == kNthChildMode) && !dot_seen &&
IsAsciiAlphaCaselessEqual(*input_iterator_, 'n')) {
@@ -696,16 +693,38 @@
return kNthToken;
}
+ // Handle numbers in scientific notation.
+ bool is_scientific(false);
+ if (IsAsciiAlphaCaselessEqual(*input_iterator_, 'e')) {
+ // Only one exponent symbol is allowed for a number,
+ // and it must be followed by a sign and digits, or just digits.
+ int exponent_prefix = 0;
+ if ((input_iterator_[1] == '-' || input_iterator_[1] == '+') &&
+ IsAsciiDigit(input_iterator_[2])) {
+ exponent_prefix = 3;
+ }
+ if (IsAsciiDigit(input_iterator_[1])) {
+ exponent_prefix = 2;
+ }
+ if (exponent_prefix > 0) {
+ is_scientific = true;
+ input_iterator_ = input_iterator_ + exponent_prefix;
+ }
+ while (IsAsciiDigit(input_iterator_[0])) {
+ ++input_iterator_;
+ }
+ }
+
+ number.end = input_iterator_;
char* number_end(const_cast<char*>(number.end));
// We parse into |double| for two reasons:
// - C++03 doesn't have std::strtof() function;
// - |float|'s significand is not large enough to represent |int| precisely.
// |number_end| is used by std::strtod() as a pure output parameter - it's
// input value is not used. std::strtod() may parse more of the number than
- // we expect, e.g. in the case of scientific notation or hexadecimal format.
- // In these cases (number_end != number.end), return an invalid number token.
+ // we expect, e.g. in the case of hexadecimal format. In these cases
+ // (number_end != number.end), return an invalid number token.
double real_as_double(std::strtod(number.begin, &number_end));
-
if (number_end != number.end ||
real_as_double != real_as_double || // n != n if and only if it's NaN.
real_as_double == std::numeric_limits<float>::infinity() ||
@@ -740,7 +759,8 @@
return kPercentageToken;
}
- if (!dot_seen && real_as_double <= std::numeric_limits<int>::max()) {
+ if (!dot_seen && !is_scientific &&
+ real_as_double <= std::numeric_limits<int>::max()) {
token_value->integer = static_cast<int>(real_as_double);
return kIntegerToken;
}
diff --git a/src/cobalt/css_parser/scanner_test.cc b/src/cobalt/css_parser/scanner_test.cc
index 0327be8..5089c71 100644
--- a/src/cobalt/css_parser/scanner_test.cc
+++ b/src/cobalt/css_parser/scanner_test.cc
@@ -381,17 +381,29 @@
ASSERT_EQ(kEndOfFileToken, yylex(&token_value_, &token_location_, &scanner));
}
-TEST_F(ScannerTest, ScansScientificNotationNumber) {
- // Scientific notation is required by the standard but is not supported
- // by WebKit or Blink. So we don't support it either.
+TEST_F(ScannerTest, ScansScientificNotationNumberWithNegativeExponent) {
Scanner scanner("1e-14", &string_pool_);
- ASSERT_EQ(kInvalidNumberToken,
- yylex(&token_value_, &token_location_, &scanner));
- ASSERT_EQ("1", token_value_.string);
+ ASSERT_EQ(kRealToken, yylex(&token_value_, &token_location_, &scanner));
+ ASSERT_FLOAT_EQ(0.00000000000001f, token_value_.real);
- ASSERT_EQ(kIdentifierToken, yylex(&token_value_, &token_location_, &scanner));
- ASSERT_EQ("e-14", token_value_.string);
+ ASSERT_EQ(kEndOfFileToken, yylex(&token_value_, &token_location_, &scanner));
+}
+
+TEST_F(ScannerTest, ScansScientificNotationNumberWithPositiveExponent) {
+ Scanner scanner("2.5e+6", &string_pool_);
+
+ ASSERT_EQ(kRealToken, yylex(&token_value_, &token_location_, &scanner));
+ ASSERT_EQ(2500000, token_value_.real);
+
+ ASSERT_EQ(kEndOfFileToken, yylex(&token_value_, &token_location_, &scanner));
+}
+
+TEST_F(ScannerTest, ScansScientificNotationNumberWithUnsignedExponent) {
+ Scanner scanner("3e5", &string_pool_);
+
+ ASSERT_EQ(kRealToken, yylex(&token_value_, &token_location_, &scanner));
+ ASSERT_EQ(300000, token_value_.real);
ASSERT_EQ(kEndOfFileToken, yylex(&token_value_, &token_location_, &scanner));
}
diff --git a/src/cobalt/debug/component_connector.cc b/src/cobalt/debug/component_connector.cc
index be921bc..b249ad8 100644
--- a/src/cobalt/debug/component_connector.cc
+++ b/src/cobalt/debug/component_connector.cc
@@ -95,6 +95,27 @@
}
}
+void ComponentConnector::SendScriptEvent(const std::string& method,
+ const std::string& command,
+ const JSONObject& params) {
+ if (!server_) {
+ DLOG(WARNING) << "Not attached to debug server. Not sending " << method;
+ return;
+ }
+
+ script::ScriptDebugger::ScopedPauseOnExceptionsState no_pause(
+ script_debugger_, script::ScriptDebugger::kNone);
+ JSONObject command_result = server_->RunScriptCommand(command, params);
+ base::DictionaryValue* event;
+ if (command_result->GetDictionary(DebugServer::kResult, &event)) {
+ server_->OnEvent(method, JSONObject(event->DeepCopy()));
+ } else {
+ std::string error;
+ command_result->GetString(DebugServer::kErrorMessage, &error);
+ DLOG(ERROR) << "Script event failed (" << method << "): " << error;
+ }
+}
+
void ComponentConnector::SendEvent(const std::string& method,
const JSONObject& params) {
if (server_) {
diff --git a/src/cobalt/debug/component_connector.h b/src/cobalt/debug/component_connector.h
index ef2b6e0..2c3e911 100644
--- a/src/cobalt/debug/component_connector.h
+++ b/src/cobalt/debug/component_connector.h
@@ -58,6 +58,12 @@
// Creates a Runtime.Remote object from an ValueHandleHolder.
JSONObject CreateRemoteObject(const script::ValueHandleHolder* object);
+ // Runs a JavaScript function with JSON parameters, and sends the event it
+ // returns to the |DebugServer| referenced by this object.
+ void SendScriptEvent(const std::string& method,
+ const std::string& command,
+ const JSONObject& params);
+
// Sends an event to the |DebugServer| referenced by this object.
void SendEvent(const std::string& method, const JSONObject& params);
diff --git a/src/cobalt/debug/console_command.idl b/src/cobalt/debug/console_command.idl
new file mode 100644
index 0000000..972b00e
--- /dev/null
+++ b/src/cobalt/debug/console_command.idl
@@ -0,0 +1,23 @@
+// Copyright 2018 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Custom dictionary to advertise registered app commands to the debug console.
+
+[
+ Conditional=ENABLE_DEBUG_CONSOLE
+] dictionary ConsoleCommand {
+ DOMString command;
+ DOMString shortHelp;
+ DOMString longHelp;
+};
diff --git a/src/cobalt/debug/content/backend/runtime.js b/src/cobalt/debug/content/backend/runtime.js
index 7f21dfb..5d33494 100644
--- a/src/cobalt/debug/content/backend/runtime.js
+++ b/src/cobalt/debug/content/backend/runtime.js
@@ -37,6 +37,22 @@
devtoolsBackend.runtime = {};
+// Creates an executionContextCreated event.
+// https://chromedevtools.github.io/devtools-protocol/1-3/Runtime#event-executionContextCreated
+devtoolsBackend.runtime.executionContextCreatedEvent = function() {
+ var event = {
+ context: {
+ id: 1,
+ origin: window.location.origin,
+ name: "Cobalt",
+ auxData: {
+ isDefault: true
+ }
+ }
+ };
+ return JSON.stringify(event);
+}
+
// Calls a function on a previously accessed RemoteObject with an argument list
// and returns a new RemoteObject. Used extensively by devtools for
// auto-completion. The new RemoteObject uses the same |objectGroup| as the
@@ -64,7 +80,7 @@
}
// Evaluates a string and returns a RemoteObject.
-// https://developer.chrome.com/devtools/docs/protocol/1.1/runtime#command-evaluate
+// https://chromedevtools.github.io/devtools-protocol/1-3/Runtime#method-evaluate
devtoolsBackend.runtime.evaluate = function(params) {
var result = {};
var value = null;
@@ -111,6 +127,14 @@
return JSON.stringify(result);
}
+// Returns all let, const and class variables from global scope.
+// https://chromedevtools.github.io/devtools-protocol/1-3/Runtime#method-globalLexicalScopeNames
+devtoolsBackend.runtime.globalLexicalScopeNames = function(params) {
+ var result = [];
+ // TODO: Get the globals.
+ return JSON.stringify(result);
+}
+
// Returns the properties of a previously accessed object as an array of
// PropertyDescriptor objects.
// The parameters specifify several options:
diff --git a/src/cobalt/debug/content/devtools/Images/breakpoint.png b/src/cobalt/debug/content/devtools/Images/breakpoint.png
deleted file mode 100644
index 1eaea29..0000000
--- a/src/cobalt/debug/content/devtools/Images/breakpoint.png
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/debug/content/devtools/Images/breakpointConditional.png b/src/cobalt/debug/content/devtools/Images/breakpointConditional.png
deleted file mode 100644
index 8a22283..0000000
--- a/src/cobalt/debug/content/devtools/Images/breakpointConditional.png
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/debug/content/devtools/Images/breakpointConditional_2x.png b/src/cobalt/debug/content/devtools/Images/breakpointConditional_2x.png
deleted file mode 100644
index 851adfc..0000000
--- a/src/cobalt/debug/content/devtools/Images/breakpointConditional_2x.png
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/debug/content/devtools/Images/breakpoint_2x.png b/src/cobalt/debug/content/devtools/Images/breakpoint_2x.png
deleted file mode 100644
index a227bac..0000000
--- a/src/cobalt/debug/content/devtools/Images/breakpoint_2x.png
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/debug/content/devtools/Images/checkboxCheckmark.png b/src/cobalt/debug/content/devtools/Images/checkboxCheckmark.png
deleted file mode 100644
index 3a80164..0000000
--- a/src/cobalt/debug/content/devtools/Images/checkboxCheckmark.png
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/debug/content/devtools/Images/checkboxCheckmark_2x.png b/src/cobalt/debug/content/devtools/Images/checkboxCheckmark_2x.png
deleted file mode 100644
index 237e419..0000000
--- a/src/cobalt/debug/content/devtools/Images/checkboxCheckmark_2x.png
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/debug/content/devtools/Images/chevrons.png b/src/cobalt/debug/content/devtools/Images/chevrons.png
deleted file mode 100644
index 460aafb..0000000
--- a/src/cobalt/debug/content/devtools/Images/chevrons.png
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/debug/content/devtools/Images/chevrons_2x.png b/src/cobalt/debug/content/devtools/Images/chevrons_2x.png
deleted file mode 100644
index 091217f..0000000
--- a/src/cobalt/debug/content/devtools/Images/chevrons_2x.png
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/debug/content/devtools/Images/errorWave.png b/src/cobalt/debug/content/devtools/Images/errorWave.png
deleted file mode 100644
index 32b1b68..0000000
--- a/src/cobalt/debug/content/devtools/Images/errorWave.png
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/debug/content/devtools/Images/errorWave_2x.png b/src/cobalt/debug/content/devtools/Images/errorWave_2x.png
deleted file mode 100644
index ffecbf8..0000000
--- a/src/cobalt/debug/content/devtools/Images/errorWave_2x.png
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/debug/content/devtools/Images/largeIcons.png b/src/cobalt/debug/content/devtools/Images/largeIcons.png
deleted file mode 100644
index 381fbdd..0000000
--- a/src/cobalt/debug/content/devtools/Images/largeIcons.png
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/debug/content/devtools/Images/largeIcons_2x.png b/src/cobalt/debug/content/devtools/Images/largeIcons_2x.png
deleted file mode 100644
index c771c2c..0000000
--- a/src/cobalt/debug/content/devtools/Images/largeIcons_2x.png
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/debug/content/devtools/Images/mediumIcons.png b/src/cobalt/debug/content/devtools/Images/mediumIcons.png
deleted file mode 100644
index 6dc3bb4..0000000
--- a/src/cobalt/debug/content/devtools/Images/mediumIcons.png
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/debug/content/devtools/Images/mediumIcons_2x.png b/src/cobalt/debug/content/devtools/Images/mediumIcons_2x.png
deleted file mode 100644
index ae6e2b6..0000000
--- a/src/cobalt/debug/content/devtools/Images/mediumIcons_2x.png
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/debug/content/devtools/Images/securityIcons.png b/src/cobalt/debug/content/devtools/Images/securityIcons.png
deleted file mode 100644
index 5271256..0000000
--- a/src/cobalt/debug/content/devtools/Images/securityIcons.png
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/debug/content/devtools/Images/securityIcons_2x.png b/src/cobalt/debug/content/devtools/Images/securityIcons_2x.png
deleted file mode 100644
index d67c76d..0000000
--- a/src/cobalt/debug/content/devtools/Images/securityIcons_2x.png
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/debug/content/devtools/Images/smallIcons.png b/src/cobalt/debug/content/devtools/Images/smallIcons.png
deleted file mode 100644
index 1e23959..0000000
--- a/src/cobalt/debug/content/devtools/Images/smallIcons.png
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/debug/content/devtools/Images/smallIcons_2x.png b/src/cobalt/debug/content/devtools/Images/smallIcons_2x.png
deleted file mode 100644
index 9c50439..0000000
--- a/src/cobalt/debug/content/devtools/Images/smallIcons_2x.png
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/debug/content/devtools/Images/treeoutlineTriangles.png b/src/cobalt/debug/content/devtools/Images/treeoutlineTriangles.png
deleted file mode 100644
index 71a09d3..0000000
--- a/src/cobalt/debug/content/devtools/Images/treeoutlineTriangles.png
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/debug/content/devtools/Images/treeoutlineTriangles_2x.png b/src/cobalt/debug/content/devtools/Images/treeoutlineTriangles_2x.png
deleted file mode 100644
index 1d8aa0e..0000000
--- a/src/cobalt/debug/content/devtools/Images/treeoutlineTriangles_2x.png
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/debug/content/devtools/Images/whatsnew.png b/src/cobalt/debug/content/devtools/Images/whatsnew.png
deleted file mode 100644
index d8ebe05..0000000
--- a/src/cobalt/debug/content/devtools/Images/whatsnew.png
+++ /dev/null
Binary files differ
diff --git a/src/cobalt/debug/content/devtools/Tests.js b/src/cobalt/debug/content/devtools/Tests.js
deleted file mode 100644
index e6c0d06..0000000
--- a/src/cobalt/debug/content/devtools/Tests.js
+++ /dev/null
@@ -1,1223 +0,0 @@
-/*
- * Copyright (C) 2010 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- * * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-/* eslint-disable indent */
-
-/**
- * @fileoverview This file contains small testing framework along with the
- * test suite for the frontend. These tests are a part of the continues build
- * and are executed by the devtools_sanity_unittest.cc as a part of the
- * Interactive UI Test suite.
- * FIXME: change field naming style to use trailing underscore.
- */
-
-(function createTestSuite(window) {
-
- /**
- * @unrestricted
- */
- var TestSuite = class {
- /**
- * Test suite for interactive UI tests.
- * @param {Object} domAutomationController DomAutomationController instance.
- */
- constructor(domAutomationController) {
- this.domAutomationController_ = domAutomationController;
- this.controlTaken_ = false;
- this.timerId_ = -1;
- this._asyncInvocationId = 0;
- }
-
- /**
- * Key event with given key identifier.
- */
- static createKeyEvent(key) {
- return new KeyboardEvent('keydown', {bubbles: true, cancelable: true, key: key});
- }
- };
-
- /**
- * Reports test failure.
- * @param {string} message Failure description.
- */
- TestSuite.prototype.fail = function(message) {
- if (this.controlTaken_)
- this.reportFailure_(message);
- else
- throw message;
- };
-
- /**
- * Equals assertion tests that expected === actual.
- * @param {!Object|boolean} expected Expected object.
- * @param {!Object|boolean} actual Actual object.
- * @param {string} opt_message User message to print if the test fails.
- */
- TestSuite.prototype.assertEquals = function(expected, actual, opt_message) {
- if (expected !== actual) {
- var message = 'Expected: \'' + expected + '\', but was \'' + actual + '\'';
- if (opt_message)
- message = opt_message + '(' + message + ')';
- this.fail(message);
- }
- };
-
- /**
- * True assertion tests that value == true.
- * @param {!Object} value Actual object.
- * @param {string} opt_message User message to print if the test fails.
- */
- TestSuite.prototype.assertTrue = function(value, opt_message) {
- this.assertEquals(true, !!value, opt_message);
- };
-
- /**
- * Takes control over execution.
- */
- TestSuite.prototype.takeControl = function() {
- this.controlTaken_ = true;
- // Set up guard timer.
- var self = this;
- this.timerId_ = setTimeout(function() {
- self.reportFailure_('Timeout exceeded: 20 sec');
- }, 20000);
- };
-
- /**
- * Releases control over execution.
- */
- TestSuite.prototype.releaseControl = function() {
- if (this.timerId_ !== -1) {
- clearTimeout(this.timerId_);
- this.timerId_ = -1;
- }
- this.controlTaken_ = false;
- this.reportOk_();
- };
-
- /**
- * Async tests use this one to report that they are completed.
- */
- TestSuite.prototype.reportOk_ = function() {
- this.domAutomationController_.send('[OK]');
- };
-
- /**
- * Async tests use this one to report failures.
- */
- TestSuite.prototype.reportFailure_ = function(error) {
- if (this.timerId_ !== -1) {
- clearTimeout(this.timerId_);
- this.timerId_ = -1;
- }
- this.domAutomationController_.send('[FAILED] ' + error);
- };
-
- /**
- * Run specified test on a fresh instance of the test suite.
- * @param {Array<string>} args method name followed by its parameters.
- */
- TestSuite.prototype.dispatchOnTestSuite = function(args) {
- var methodName = args.shift();
- try {
- this[methodName].apply(this, args);
- if (!this.controlTaken_)
- this.reportOk_();
- } catch (e) {
- this.reportFailure_(e);
- }
- };
-
- /**
- * Wrap an async method with TestSuite.{takeControl(), releaseControl()}
- * and invoke TestSuite.reportOk_ upon completion.
- * @param {Array<string>} args method name followed by its parameters.
- */
- TestSuite.prototype.waitForAsync = function(var_args) {
- var args = Array.prototype.slice.call(arguments);
- this.takeControl();
- args.push(this.releaseControl.bind(this));
- this.dispatchOnTestSuite(args);
- };
-
- /**
- * Overrides the method with specified name until it's called first time.
- * @param {!Object} receiver An object whose method to override.
- * @param {string} methodName Name of the method to override.
- * @param {!Function} override A function that should be called right after the
- * overridden method returns.
- * @param {?boolean} opt_sticky Whether restore original method after first run
- * or not.
- */
- TestSuite.prototype.addSniffer = function(receiver, methodName, override, opt_sticky) {
- var orig = receiver[methodName];
- if (typeof orig !== 'function')
- this.fail('Cannot find method to override: ' + methodName);
- var test = this;
- receiver[methodName] = function(var_args) {
- try {
- var result = orig.apply(this, arguments);
- } finally {
- if (!opt_sticky)
- receiver[methodName] = orig;
- }
- // In case of exception the override won't be called.
- try {
- override.apply(this, arguments);
- } catch (e) {
- test.fail('Exception in overriden method \'' + methodName + '\': ' + e);
- }
- return result;
- };
- };
-
- /**
- * Waits for current throttler invocations, if any.
- * @param {!Common.Throttler} throttler
- * @param {function()} callback
- */
- TestSuite.prototype.waitForThrottler = function(throttler, callback) {
- var test = this;
- var scheduleShouldFail = true;
- test.addSniffer(throttler, 'schedule', onSchedule);
-
- function hasSomethingScheduled() {
- return throttler._isRunningProcess || throttler._process;
- }
-
- function checkState() {
- if (!hasSomethingScheduled()) {
- scheduleShouldFail = false;
- callback();
- return;
- }
-
- test.addSniffer(throttler, '_processCompletedForTests', checkState);
- }
-
- function onSchedule() {
- if (scheduleShouldFail)
- test.fail('Unexpected Throttler.schedule');
- }
-
- checkState();
- };
-
- /**
- * @param {string} panelName Name of the panel to show.
- */
- TestSuite.prototype.showPanel = function(panelName) {
- return UI.inspectorView.showPanel(panelName);
- };
-
- // UI Tests
-
- /**
- * Tests that scripts tab can be open and populated with inspected scripts.
- */
- TestSuite.prototype.testShowScriptsTab = function() {
- var test = this;
- this.showPanel('sources').then(function() {
- // There should be at least main page script.
- this._waitUntilScriptsAreParsed(['debugger_test_page.html'], function() {
- test.releaseControl();
- });
- }.bind(this));
- // Wait until all scripts are added to the debugger.
- this.takeControl();
- };
-
- /**
- * Tests that scripts tab is populated with inspected scripts even if it
- * hadn't been shown by the moment inspected paged refreshed.
- * @see http://crbug.com/26312
- */
- TestSuite.prototype.testScriptsTabIsPopulatedOnInspectedPageRefresh = function() {
- var test = this;
- var debuggerModel = SDK.targetManager.mainTarget().model(SDK.DebuggerModel);
- debuggerModel.addEventListener(SDK.DebuggerModel.Events.GlobalObjectCleared, waitUntilScriptIsParsed);
-
- this.showPanel('elements').then(function() {
- // Reload inspected page. It will reset the debugger agent.
- test.evaluateInConsole_('window.location.reload(true);', function(resultText) {});
- });
-
- function waitUntilScriptIsParsed() {
- debuggerModel.removeEventListener(SDK.DebuggerModel.Events.GlobalObjectCleared, waitUntilScriptIsParsed);
- test.showPanel('sources').then(function() {
- test._waitUntilScriptsAreParsed(['debugger_test_page.html'], function() {
- test.releaseControl();
- });
- });
- }
-
- // Wait until all scripts are added to the debugger.
- this.takeControl();
- };
-
- /**
- * Tests that scripts list contains content scripts.
- */
- TestSuite.prototype.testContentScriptIsPresent = function() {
- var test = this;
- this.showPanel('sources').then(function() {
- test._waitUntilScriptsAreParsed(['page_with_content_script.html', 'simple_content_script.js'], function() {
- test.releaseControl();
- });
- });
-
- // Wait until all scripts are added to the debugger.
- this.takeControl();
- };
-
- /**
- * Tests that scripts are not duplicaed on Scripts tab switch.
- */
- TestSuite.prototype.testNoScriptDuplicatesOnPanelSwitch = function() {
- var test = this;
-
- function switchToElementsTab() {
- test.showPanel('elements').then(function() {
- setTimeout(switchToScriptsTab, 0);
- });
- }
-
- function switchToScriptsTab() {
- test.showPanel('sources').then(function() {
- setTimeout(checkScriptsPanel, 0);
- });
- }
-
- function checkScriptsPanel() {
- test.assertTrue(test._scriptsAreParsed(['debugger_test_page.html']), 'Some scripts are missing.');
- checkNoDuplicates();
- test.releaseControl();
- }
-
- function checkNoDuplicates() {
- var uiSourceCodes = test.nonAnonymousUISourceCodes_();
- for (var i = 0; i < uiSourceCodes.length; i++) {
- for (var j = i + 1; j < uiSourceCodes.length; j++) {
- test.assertTrue(
- uiSourceCodes[i].url() !== uiSourceCodes[j].url(),
- 'Found script duplicates: ' + test.uiSourceCodesToString_(uiSourceCodes));
- }
- }
- }
-
- this.showPanel('sources').then(function() {
- test._waitUntilScriptsAreParsed(['debugger_test_page.html'], function() {
- checkNoDuplicates();
- setTimeout(switchToElementsTab, 0);
- });
- });
-
- // Wait until all scripts are added to the debugger.
- this.takeControl();
- };
-
- // Tests that debugger works correctly if pause event occurs when DevTools
- // frontend is being loaded.
- TestSuite.prototype.testPauseWhenLoadingDevTools = function() {
- var debuggerModel = SDK.targetManager.mainTarget().model(SDK.DebuggerModel);
- if (debuggerModel.debuggerPausedDetails)
- return;
-
- this.showPanel('sources').then(function() {
- // Script execution can already be paused.
-
- this._waitForScriptPause(this.releaseControl.bind(this));
- }.bind(this));
-
- this.takeControl();
- };
-
- // Tests that pressing "Pause" will pause script execution if the script
- // is already running.
- TestSuite.prototype.testPauseWhenScriptIsRunning = function() {
- this.showPanel('sources').then(function() {
- this.evaluateInConsole_('setTimeout("handleClick()", 0)', didEvaluateInConsole.bind(this));
- }.bind(this));
-
- function didEvaluateInConsole(resultText) {
- this.assertTrue(!isNaN(resultText), 'Failed to get timer id: ' + resultText);
- // Wait for some time to make sure that inspected page is running the
- // infinite loop.
- setTimeout(testScriptPause.bind(this), 300);
- }
-
- function testScriptPause() {
- // The script should be in infinite loop. Click "Pause" button to
- // pause it and wait for the result.
- UI.panels.sources._togglePause();
-
- this._waitForScriptPause(this.releaseControl.bind(this));
- }
-
- this.takeControl();
- };
-
- /**
- * Tests network size.
- */
- TestSuite.prototype.testNetworkSize = function() {
- var test = this;
-
- function finishRequest(request, finishTime) {
- test.assertEquals(25, request.resourceSize, 'Incorrect total data length');
- test.releaseControl();
- }
-
- this.addSniffer(SDK.NetworkDispatcher.prototype, '_finishNetworkRequest', finishRequest);
-
- // Reload inspected page to sniff network events
- test.evaluateInConsole_('window.location.reload(true);', function(resultText) {});
-
- this.takeControl();
- };
-
- /**
- * Tests network sync size.
- */
- TestSuite.prototype.testNetworkSyncSize = function() {
- var test = this;
-
- function finishRequest(request, finishTime) {
- test.assertEquals(25, request.resourceSize, 'Incorrect total data length');
- test.releaseControl();
- }
-
- this.addSniffer(SDK.NetworkDispatcher.prototype, '_finishNetworkRequest', finishRequest);
-
- // Send synchronous XHR to sniff network events
- test.evaluateInConsole_(
- 'var xhr = new XMLHttpRequest(); xhr.open("GET", "chunked", false); xhr.send(null);', function() {});
-
- this.takeControl();
- };
-
- /**
- * Tests network raw headers text.
- */
- TestSuite.prototype.testNetworkRawHeadersText = function() {
- var test = this;
-
- function finishRequest(request, finishTime) {
- if (!request.responseHeadersText)
- test.fail('Failure: resource does not have response headers text');
- var index = request.responseHeadersText.indexOf('Date:');
- test.assertEquals(
- 112, request.responseHeadersText.substring(index).length, 'Incorrect response headers text length');
- test.releaseControl();
- }
-
- this.addSniffer(SDK.NetworkDispatcher.prototype, '_finishNetworkRequest', finishRequest);
-
- // Reload inspected page to sniff network events
- test.evaluateInConsole_('window.location.reload(true);', function(resultText) {});
-
- this.takeControl();
- };
-
- /**
- * Tests network timing.
- */
- TestSuite.prototype.testNetworkTiming = function() {
- var test = this;
-
- function finishRequest(request, finishTime) {
- // Setting relaxed expectations to reduce flakiness.
- // Server sends headers after 100ms, then sends data during another 100ms.
- // We expect these times to be measured at least as 70ms.
- test.assertTrue(
- request.timing.receiveHeadersEnd - request.timing.connectStart >= 70,
- 'Time between receiveHeadersEnd and connectStart should be >=70ms, but was ' +
- 'receiveHeadersEnd=' + request.timing.receiveHeadersEnd + ', connectStart=' +
- request.timing.connectStart + '.');
- test.assertTrue(
- request.responseReceivedTime - request.startTime >= 0.07,
- 'Time between responseReceivedTime and startTime should be >=0.07s, but was ' +
- 'responseReceivedTime=' + request.responseReceivedTime + ', startTime=' + request.startTime + '.');
- test.assertTrue(
- request.endTime - request.startTime >= 0.14,
- 'Time between endTime and startTime should be >=0.14s, but was ' +
- 'endtime=' + request.endTime + ', startTime=' + request.startTime + '.');
-
- test.releaseControl();
- }
-
- this.addSniffer(SDK.NetworkDispatcher.prototype, '_finishNetworkRequest', finishRequest);
-
- // Reload inspected page to sniff network events
- test.evaluateInConsole_('window.location.reload(true);', function(resultText) {});
-
- this.takeControl();
- };
-
- TestSuite.prototype.testPushTimes = function(url) {
- var test = this;
- var pendingRequestCount = 2;
-
- function finishRequest(request, finishTime) {
- test.assertTrue(
- typeof request.timing.pushStart === 'number' && request.timing.pushStart > 0,
- `pushStart is invalid: ${request.timing.pushStart}`);
- test.assertTrue(typeof request.timing.pushEnd === 'number', `pushEnd is invalid: ${request.timing.pushEnd}`);
- test.assertTrue(request.timing.pushStart < request.startTime, 'pushStart should be before startTime');
- if (request.url().endsWith('?pushUseNullEndTime')) {
- test.assertTrue(request.timing.pushEnd === 0, `pushEnd should be 0 but is ${request.timing.pushEnd}`);
- } else {
- test.assertTrue(
- request.timing.pushStart < request.timing.pushEnd,
- `pushStart should be before pushEnd (${request.timing.pushStart} >= ${request.timing.pushEnd})`);
- // The below assertion is just due to the way we generate times in the moch URLRequestJob and is not generally an invariant.
- test.assertTrue(request.timing.pushEnd < request.endTime, 'pushEnd should be before endTime');
- test.assertTrue(request.startTime < request.timing.pushEnd, 'pushEnd should be after startTime');
- }
- if (!--pendingRequestCount)
- test.releaseControl();
- }
-
- this.addSniffer(SDK.NetworkDispatcher.prototype, '_finishNetworkRequest', finishRequest, true);
-
- test.evaluateInConsole_('addImage(\'' + url + '\')', function(resultText) {});
- test.evaluateInConsole_('addImage(\'' + url + '?pushUseNullEndTime\')', function(resultText) {});
- this.takeControl();
- };
-
- TestSuite.prototype.testConsoleOnNavigateBack = function() {
-
- function filteredMessages() {
- return ConsoleModel.consoleModel.messages().filter(
- a => a.source !== ConsoleModel.ConsoleMessage.MessageSource.Violation);
- }
-
- if (filteredMessages().length === 1) {
- firstConsoleMessageReceived.call(this, null);
- } else {
- ConsoleModel.consoleModel.addEventListener(
- ConsoleModel.ConsoleModel.Events.MessageAdded, firstConsoleMessageReceived, this);
- }
-
-
- function firstConsoleMessageReceived(event) {
- if (event && event.data.source === ConsoleModel.ConsoleMessage.MessageSource.Violation)
- return;
- ConsoleModel.consoleModel.removeEventListener(
- ConsoleModel.ConsoleModel.Events.MessageAdded, firstConsoleMessageReceived, this);
- this.evaluateInConsole_('clickLink();', didClickLink.bind(this));
- }
-
- function didClickLink() {
- // Check that there are no new messages(command is not a message).
- this.assertEquals(3, filteredMessages().length);
- this.evaluateInConsole_('history.back();', didNavigateBack.bind(this));
- }
-
- function didNavigateBack() {
- // Make sure navigation completed and possible console messages were pushed.
- this.evaluateInConsole_('void 0;', didCompleteNavigation.bind(this));
- }
-
- function didCompleteNavigation() {
- this.assertEquals(7, filteredMessages().length);
- this.releaseControl();
- }
-
- this.takeControl();
- };
-
- TestSuite.prototype.testSharedWorker = function() {
- function didEvaluateInConsole(resultText) {
- this.assertEquals('2011', resultText);
- this.releaseControl();
- }
- this.evaluateInConsole_('globalVar', didEvaluateInConsole.bind(this));
- this.takeControl();
- };
-
- TestSuite.prototype.testPauseInSharedWorkerInitialization1 = function() {
- // Make sure the worker is loaded.
- this.takeControl();
- this._waitForTargets(2, callback.bind(this));
-
- function callback() {
- Protocol.InspectorBackend.deprecatedRunAfterPendingDispatches(this.releaseControl.bind(this));
- }
- };
-
- TestSuite.prototype.testPauseInSharedWorkerInitialization2 = function() {
- this.takeControl();
- this._waitForTargets(2, callback.bind(this));
-
- function callback() {
- var debuggerModel = SDK.targetManager.models(SDK.DebuggerModel)[0];
- if (debuggerModel.isPaused()) {
- this.releaseControl();
- return;
- }
- this._waitForScriptPause(this.releaseControl.bind(this));
- }
- };
-
- TestSuite.prototype.enableTouchEmulation = function() {
- var deviceModeModel = new Emulation.DeviceModeModel(function() {});
- deviceModeModel._target = SDK.targetManager.mainTarget();
- deviceModeModel._applyTouch(true, true);
- };
-
- TestSuite.prototype.enableAutoAttachToCreatedPages = function() {
- Common.settingForTest('autoAttachToCreatedPages').set(true);
- };
-
- TestSuite.prototype.waitForDebuggerPaused = function() {
- var debuggerModel = SDK.targetManager.mainTarget().model(SDK.DebuggerModel);
- if (debuggerModel.debuggerPausedDetails)
- return;
-
- this.takeControl();
- this._waitForScriptPause(this.releaseControl.bind(this));
- };
-
- TestSuite.prototype.switchToPanel = function(panelName) {
- this.showPanel(panelName).then(this.releaseControl.bind(this));
- this.takeControl();
- };
-
- // Regression test for crbug.com/370035.
- TestSuite.prototype.testDeviceMetricsOverrides = function() {
- function dumpPageMetrics() {
- return JSON.stringify(
- {width: window.innerWidth, height: window.innerHeight, deviceScaleFactor: window.devicePixelRatio});
- }
-
- var test = this;
-
- async function testOverrides(params, metrics, callback) {
- await SDK.targetManager.mainTarget().emulationAgent().invoke_setDeviceMetricsOverride(params);
- test.evaluateInConsole_('(' + dumpPageMetrics.toString() + ')()', checkMetrics);
-
- function checkMetrics(consoleResult) {
- test.assertEquals(
- '"' + JSON.stringify(metrics) + '"', consoleResult, 'Wrong metrics for params: ' + JSON.stringify(params));
- callback();
- }
- }
-
- function step1() {
- testOverrides(
- {width: 1200, height: 1000, deviceScaleFactor: 1, mobile: false, fitWindow: true},
- {width: 1200, height: 1000, deviceScaleFactor: 1}, step2);
- }
-
- function step2() {
- testOverrides(
- {width: 1200, height: 1000, deviceScaleFactor: 1, mobile: false, fitWindow: false},
- {width: 1200, height: 1000, deviceScaleFactor: 1}, step3);
- }
-
- function step3() {
- testOverrides(
- {width: 1200, height: 1000, deviceScaleFactor: 3, mobile: false, fitWindow: true},
- {width: 1200, height: 1000, deviceScaleFactor: 3}, step4);
- }
-
- function step4() {
- testOverrides(
- {width: 1200, height: 1000, deviceScaleFactor: 3, mobile: false, fitWindow: false},
- {width: 1200, height: 1000, deviceScaleFactor: 3}, finish);
- }
-
- function finish() {
- test.releaseControl();
- }
-
- test.takeControl();
- step1();
- };
-
- TestSuite.prototype.testDispatchKeyEventShowsAutoFill = function() {
- var test = this;
- var receivedReady = false;
-
- function signalToShowAutofill() {
- SDK.targetManager.mainTarget().inputAgent().invoke_dispatchKeyEvent(
- {type: 'rawKeyDown', key: 'Down', windowsVirtualKeyCode: 40, nativeVirtualKeyCode: 40});
- SDK.targetManager.mainTarget().inputAgent().invoke_dispatchKeyEvent(
- {type: 'keyUp', key: 'Down', windowsVirtualKeyCode: 40, nativeVirtualKeyCode: 40});
- }
-
- function selectTopAutoFill() {
- SDK.targetManager.mainTarget().inputAgent().invoke_dispatchKeyEvent(
- {type: 'rawKeyDown', key: 'Down', windowsVirtualKeyCode: 40, nativeVirtualKeyCode: 40});
- SDK.targetManager.mainTarget().inputAgent().invoke_dispatchKeyEvent(
- {type: 'keyUp', key: 'Down', windowsVirtualKeyCode: 40, nativeVirtualKeyCode: 40});
- SDK.targetManager.mainTarget().inputAgent().invoke_dispatchKeyEvent(
- {type: 'rawKeyDown', key: 'Enter', windowsVirtualKeyCode: 13, nativeVirtualKeyCode: 13});
- SDK.targetManager.mainTarget().inputAgent().invoke_dispatchKeyEvent(
- {type: 'keyUp', key: 'Enter', windowsVirtualKeyCode: 13, nativeVirtualKeyCode: 13});
-
- test.evaluateInConsole_('document.getElementById("name").value', onResultOfInput);
- }
-
- function onResultOfInput(value) {
- // Console adds "" around the response.
- test.assertEquals('"Abbf"', value);
- test.releaseControl();
- }
-
- function onConsoleMessage(event) {
- var message = event.data.messageText;
- if (message === 'ready' && !receivedReady) {
- receivedReady = true;
- signalToShowAutofill();
- }
- // This log comes from the browser unittest code.
- if (message === 'didShowSuggestions')
- selectTopAutoFill();
- }
-
- this.takeControl();
-
- // It is possible for the ready console messagage to be already received but not handled
- // or received later. This ensures we can catch both cases.
- ConsoleModel.consoleModel.addEventListener(ConsoleModel.ConsoleModel.Events.MessageAdded, onConsoleMessage, this);
-
- var messages = ConsoleModel.consoleModel.messages();
- if (messages.length) {
- var text = messages[0].messageText;
- this.assertEquals('ready', text);
- signalToShowAutofill();
- }
- };
-
- TestSuite.prototype.testDispatchKeyEventDoesNotCrash = function() {
- SDK.targetManager.mainTarget().inputAgent().invoke_dispatchKeyEvent(
- {type: 'rawKeyDown', windowsVirtualKeyCode: 0x23, key: 'End'});
- SDK.targetManager.mainTarget().inputAgent().invoke_dispatchKeyEvent(
- {type: 'keyUp', windowsVirtualKeyCode: 0x23, key: 'End'});
- };
-
- // Simple sanity check to make sure network throttling is wired up
- // See crbug.com/747724
- TestSuite.prototype.testOfflineNetworkConditions = async function() {
- var test = this;
- SDK.multitargetNetworkManager.setNetworkConditions(SDK.NetworkManager.OfflineConditions);
-
- function finishRequest(request) {
- test.assertEquals(
- 'net::ERR_INTERNET_DISCONNECTED', request.localizedFailDescription, 'Request should have failed');
- test.releaseControl();
- }
-
- this.addSniffer(SDK.NetworkDispatcher.prototype, '_finishNetworkRequest', finishRequest);
-
- test.takeControl();
- test.evaluateInConsole_('window.location.reload(true);', function(resultText) {});
- };
-
- TestSuite.prototype.testEmulateNetworkConditions = function() {
- var test = this;
-
- function testPreset(preset, messages, next) {
- function onConsoleMessage(event) {
- var index = messages.indexOf(event.data.messageText);
- if (index === -1) {
- test.fail('Unexpected message: ' + event.data.messageText);
- return;
- }
-
- messages.splice(index, 1);
- if (!messages.length) {
- ConsoleModel.consoleModel.removeEventListener(
- ConsoleModel.ConsoleModel.Events.MessageAdded, onConsoleMessage, this);
- next();
- }
- }
-
- ConsoleModel.consoleModel.addEventListener(ConsoleModel.ConsoleModel.Events.MessageAdded, onConsoleMessage, this);
- SDK.multitargetNetworkManager.setNetworkConditions(preset);
- }
-
- test.takeControl();
- step1();
-
- function step1() {
- testPreset(
- MobileThrottling.networkPresets[2],
- ['offline event: online = false', 'connection change event: type = none; downlinkMax = 0'], step2);
- }
-
- function step2() {
- testPreset(
- MobileThrottling.networkPresets[1],
- ['online event: online = true', 'connection change event: type = cellular; downlinkMax = 0.390625'], step3);
- }
-
- function step3() {
- testPreset(
- MobileThrottling.networkPresets[0],
- ['connection change event: type = cellular; downlinkMax = 1.4400000000000002'],
- test.releaseControl.bind(test));
- }
- };
-
- TestSuite.prototype.testScreenshotRecording = function() {
- var test = this;
-
- function performActionsInPage(callback) {
- var count = 0;
- var div = document.createElement('div');
- div.setAttribute('style', 'left: 0px; top: 0px; width: 100px; height: 100px; position: absolute;');
- document.body.appendChild(div);
- requestAnimationFrame(frame);
- function frame() {
- var color = [0, 0, 0];
- color[count % 3] = 255;
- div.style.backgroundColor = 'rgb(' + color.join(',') + ')';
- if (++count > 10)
- requestAnimationFrame(callback);
- else
- requestAnimationFrame(frame);
- }
- }
-
- var captureFilmStripSetting = Common.settings.createSetting('timelineCaptureFilmStrip', false);
- captureFilmStripSetting.set(true);
- test.evaluateInConsole_(performActionsInPage.toString(), function() {});
- test.invokeAsyncWithTimeline_('performActionsInPage', onTimelineDone);
-
- function onTimelineDone() {
- captureFilmStripSetting.set(false);
- var filmStripModel = UI.panels.timeline._performanceModel.filmStripModel();
- var frames = filmStripModel.frames();
- test.assertTrue(frames.length > 4 && typeof frames.length === 'number');
- loadFrameImages(frames);
- }
-
- function loadFrameImages(frames) {
- var readyImages = [];
- for (var frame of frames)
- frame.imageDataPromise().then(onGotImageData);
-
- function onGotImageData(data) {
- var image = new Image();
- test.assertTrue(!!data, 'No image data for frame');
- image.addEventListener('load', onLoad);
- image.src = 'data:image/jpg;base64,' + data;
- }
-
- function onLoad(event) {
- readyImages.push(event.target);
- if (readyImages.length === frames.length)
- validateImagesAndCompleteTest(readyImages);
- }
- }
-
- function validateImagesAndCompleteTest(images) {
- var redCount = 0;
- var greenCount = 0;
- var blueCount = 0;
-
- var canvas = document.createElement('canvas');
- var ctx = canvas.getContext('2d');
- for (var image of images) {
- test.assertTrue(image.naturalWidth > 10);
- test.assertTrue(image.naturalHeight > 10);
- canvas.width = image.naturalWidth;
- canvas.height = image.naturalHeight;
- ctx.drawImage(image, 0, 0);
- var data = ctx.getImageData(0, 0, 1, 1);
- var color = Array.prototype.join.call(data.data, ',');
- if (data.data[0] > 200)
- redCount++;
- else if (data.data[1] > 200)
- greenCount++;
- else if (data.data[2] > 200)
- blueCount++;
- else
- test.fail('Unexpected color: ' + color);
- }
- test.assertTrue(redCount && greenCount && blueCount, 'Color sanity check failed');
- test.releaseControl();
- }
-
- test.takeControl();
- };
-
- TestSuite.prototype.testSettings = function() {
- var test = this;
-
- createSettings();
- test.takeControl();
- setTimeout(reset, 0);
-
- function createSettings() {
- var localSetting = Common.settings.createLocalSetting('local', undefined);
- localSetting.set({s: 'local', n: 1});
- var globalSetting = Common.settings.createSetting('global', undefined);
- globalSetting.set({s: 'global', n: 2});
- }
-
- function reset() {
- Runtime.experiments.clearForTest();
- InspectorFrontendHost.getPreferences(gotPreferences);
- }
-
- function gotPreferences(prefs) {
- Main.Main._instanceForTest._createSettings(prefs);
-
- var localSetting = Common.settings.createLocalSetting('local', undefined);
- test.assertEquals('object', typeof localSetting.get());
- test.assertEquals('local', localSetting.get().s);
- test.assertEquals(1, localSetting.get().n);
- var globalSetting = Common.settings.createSetting('global', undefined);
- test.assertEquals('object', typeof globalSetting.get());
- test.assertEquals('global', globalSetting.get().s);
- test.assertEquals(2, globalSetting.get().n);
- test.releaseControl();
- }
- };
-
- TestSuite.prototype.testWindowInitializedOnNavigateBack = function() {
- var messages = ConsoleModel.consoleModel.messages();
- this.assertEquals(1, messages.length);
- var text = messages[0].messageText;
- if (text.indexOf('Uncaught') !== -1)
- this.fail(text);
- };
-
- TestSuite.prototype.testConsoleContextNames = function() {
- var test = this;
- test.takeControl();
- this.showPanel('console').then(() => this._waitForExecutionContexts(2, onExecutionContexts.bind(this)));
-
- function onExecutionContexts() {
- var consoleView = Console.ConsoleView.instance();
- var selector = consoleView._consoleContextSelector;
- var values = [];
- for (var item of selector._items)
- values.push(selector.titleFor(item));
- test.assertEquals('top', values[0]);
- test.assertEquals('Simple content script', values[1]);
- test.releaseControl();
- }
- };
-
- TestSuite.prototype.testRawHeadersWithHSTS = function(url) {
- var test = this;
- test.takeControl();
- SDK.targetManager.addModelListener(
- SDK.NetworkManager, SDK.NetworkManager.Events.ResponseReceived, onResponseReceived);
-
- this.evaluateInConsole_(`
- var img = document.createElement('img');
- img.src = "${url}";
- document.body.appendChild(img);
- `, () => {});
-
- var count = 0;
- function onResponseReceived(event) {
- var networkRequest = event.data;
- if (!networkRequest.url().startsWith('http'))
- return;
- switch (++count) {
- case 1: // Original redirect
- test.assertEquals(301, networkRequest.statusCode);
- test.assertEquals('Moved Permanently', networkRequest.statusText);
- test.assertTrue(url.endsWith(networkRequest.responseHeaderValue('Location')));
- break;
-
- case 2: // HSTS internal redirect
- test.assertTrue(networkRequest.url().startsWith('http://'));
- test.assertEquals(undefined, networkRequest.requestHeadersText());
- test.assertEquals(307, networkRequest.statusCode);
- test.assertEquals('Internal Redirect', networkRequest.statusText);
- test.assertEquals('HSTS', networkRequest.responseHeaderValue('Non-Authoritative-Reason'));
- test.assertTrue(networkRequest.responseHeaderValue('Location').startsWith('https://'));
- break;
-
- case 3: // Final response
- test.assertTrue(networkRequest.url().startsWith('https://'));
- test.assertTrue(networkRequest.requestHeaderValue('Referer').startsWith('http://127.0.0.1'));
- test.assertEquals(200, networkRequest.statusCode);
- test.assertEquals('OK', networkRequest.statusText);
- test.assertEquals('132', networkRequest.responseHeaderValue('Content-Length'));
- test.releaseControl();
- }
- }
- };
-
- TestSuite.prototype.testDOMWarnings = function() {
- var messages = ConsoleModel.consoleModel.messages();
- this.assertEquals(1, messages.length);
- var expectedPrefix = '[DOM] Found 2 elements with non-unique id #dup:';
- this.assertTrue(messages[0].messageText.startsWith(expectedPrefix));
- };
-
- TestSuite.prototype.waitForTestResultsInConsole = function() {
- var messages = ConsoleModel.consoleModel.messages();
- for (var i = 0; i < messages.length; ++i) {
- var text = messages[i].messageText;
- if (text === 'PASS')
- return;
- else if (/^FAIL/.test(text))
- this.fail(text); // This will throw.
- }
- // Neither PASS nor FAIL, so wait for more messages.
- function onConsoleMessage(event) {
- var text = event.data.messageText;
- if (text === 'PASS')
- this.releaseControl();
- else if (/^FAIL/.test(text))
- this.fail(text);
- }
-
- ConsoleModel.consoleModel.addEventListener(ConsoleModel.ConsoleModel.Events.MessageAdded, onConsoleMessage, this);
- this.takeControl();
- };
-
- TestSuite.prototype._overrideMethod = function(receiver, methodName, override) {
- var original = receiver[methodName];
- if (typeof original !== 'function') {
- this.fail(`TestSuite._overrideMethod: $[methodName] is not a function`);
- return;
- }
- receiver[methodName] = function() {
- try {
- var value = original.apply(receiver, arguments);
- } finally {
- receiver[methodName] = original;
- }
- override.apply(original, arguments);
- return value;
- };
- };
-
- TestSuite.prototype.startTimeline = function(callback) {
- var test = this;
- this.showPanel('timeline').then(function() {
- var timeline = UI.panels.timeline;
- test._overrideMethod(timeline, '_recordingStarted', callback);
- timeline._toggleRecording();
- });
- };
-
- TestSuite.prototype.stopTimeline = function(callback) {
- var timeline = UI.panels.timeline;
- this._overrideMethod(timeline, 'loadingComplete', callback);
- timeline._toggleRecording();
- };
-
- TestSuite.prototype.invokePageFunctionAsync = function(functionName, opt_args, callback_is_always_last) {
- var callback = arguments[arguments.length - 1];
- var doneMessage = `DONE: ${functionName}.${++this._asyncInvocationId}`;
- var argsString = arguments.length < 3 ?
- '' :
- Array.prototype.slice.call(arguments, 1, -1).map(arg => JSON.stringify(arg)).join(',') + ',';
- this.evaluateInConsole_(
- `${functionName}(${argsString} function() { console.log('${doneMessage}'); });`, function() {});
- ConsoleModel.consoleModel.addEventListener(ConsoleModel.ConsoleModel.Events.MessageAdded, onConsoleMessage);
-
- function onConsoleMessage(event) {
- var text = event.data.messageText;
- if (text === doneMessage) {
- ConsoleModel.consoleModel.removeEventListener(ConsoleModel.ConsoleModel.Events.MessageAdded, onConsoleMessage);
- callback();
- }
- }
- };
-
- TestSuite.prototype.invokeAsyncWithTimeline_ = function(functionName, callback) {
- var test = this;
-
- this.startTimeline(onRecordingStarted);
-
- function onRecordingStarted() {
- test.invokePageFunctionAsync(functionName, pageActionsDone);
- }
-
- function pageActionsDone() {
- test.stopTimeline(callback);
- }
- };
-
- TestSuite.prototype.enableExperiment = function(name) {
- Runtime.experiments.enableForTest(name);
- };
-
- TestSuite.prototype.checkInputEventsPresent = function() {
- var expectedEvents = new Set(arguments);
- var model = UI.panels.timeline._performanceModel.timelineModel();
- var asyncEvents = model.mainThreadAsyncEvents();
- var input = asyncEvents.get(TimelineModel.TimelineModel.AsyncEventGroup.input) || [];
- var prefix = 'InputLatency::';
- for (var e of input) {
- if (!e.name.startsWith(prefix))
- continue;
- if (e.steps.length < 2)
- continue;
- if (e.name.startsWith(prefix + 'Mouse') &&
- typeof TimelineModel.TimelineData.forEvent(e.steps[0]).timeWaitingForMainThread !== 'number')
- throw `Missing timeWaitingForMainThread on ${e.name}`;
- expectedEvents.delete(e.name.substr(prefix.length));
- }
- if (expectedEvents.size)
- throw 'Some expected events are not found: ' + Array.from(expectedEvents.keys()).join(',');
- };
-
- /**
- * Serializes array of uiSourceCodes to string.
- * @param {!Array.<!Workspace.UISourceCode>} uiSourceCodes
- * @return {string}
- */
- TestSuite.prototype.uiSourceCodesToString_ = function(uiSourceCodes) {
- var names = [];
- for (var i = 0; i < uiSourceCodes.length; i++)
- names.push('"' + uiSourceCodes[i].url() + '"');
- return names.join(',');
- };
-
- /**
- * Returns all loaded non anonymous uiSourceCodes.
- * @return {!Array.<!Workspace.UISourceCode>}
- */
- TestSuite.prototype.nonAnonymousUISourceCodes_ = function() {
- /**
- * @param {!Workspace.UISourceCode} uiSourceCode
- */
- function filterOutService(uiSourceCode) {
- return !uiSourceCode.project().isServiceProject();
- }
-
- var uiSourceCodes = Workspace.workspace.uiSourceCodes();
- return uiSourceCodes.filter(filterOutService);
- };
-
- /*
- * Evaluates the code in the console as if user typed it manually and invokes
- * the callback when the result message is received and added to the console.
- * @param {string} code
- * @param {function(string)} callback
- */
- TestSuite.prototype.evaluateInConsole_ = function(code, callback) {
- function innerEvaluate() {
- UI.context.removeFlavorChangeListener(SDK.ExecutionContext, showConsoleAndEvaluate, this);
- var consoleView = Console.ConsoleView.instance();
- consoleView._prompt._appendCommand(code);
-
- this.addSniffer(Console.ConsoleView.prototype, '_consoleMessageAddedForTest', function(viewMessage) {
- callback(viewMessage.toMessageElement().deepTextContent());
- }.bind(this));
- }
-
- function showConsoleAndEvaluate() {
- Common.console.showPromise().then(innerEvaluate.bind(this));
- }
-
- if (!UI.context.flavor(SDK.ExecutionContext)) {
- UI.context.addFlavorChangeListener(SDK.ExecutionContext, showConsoleAndEvaluate, this);
- return;
- }
- showConsoleAndEvaluate.call(this);
- };
-
- /**
- * Checks that all expected scripts are present in the scripts list
- * in the Scripts panel.
- * @param {!Array.<string>} expected Regular expressions describing
- * expected script names.
- * @return {boolean} Whether all the scripts are in "scripts-files" select
- * box
- */
- TestSuite.prototype._scriptsAreParsed = function(expected) {
- var uiSourceCodes = this.nonAnonymousUISourceCodes_();
- // Check that at least all the expected scripts are present.
- var missing = expected.slice(0);
- for (var i = 0; i < uiSourceCodes.length; ++i) {
- for (var j = 0; j < missing.length; ++j) {
- if (uiSourceCodes[i].name().search(missing[j]) !== -1) {
- missing.splice(j, 1);
- break;
- }
- }
- }
- return missing.length === 0;
- };
-
- /**
- * Waits for script pause, checks expectations, and invokes the callback.
- * @param {function():void} callback
- */
- TestSuite.prototype._waitForScriptPause = function(callback) {
- this.addSniffer(SDK.DebuggerModel.prototype, '_pausedScript', callback);
- };
-
- /**
- * Waits until all the scripts are parsed and invokes the callback.
- */
- TestSuite.prototype._waitUntilScriptsAreParsed = function(expectedScripts, callback) {
- var test = this;
-
- function waitForAllScripts() {
- if (test._scriptsAreParsed(expectedScripts))
- callback();
- else
- test.addSniffer(UI.panels.sources.sourcesView(), '_addUISourceCode', waitForAllScripts);
- }
-
- waitForAllScripts();
- };
-
- TestSuite.prototype._waitForTargets = function(n, callback) {
- checkTargets.call(this);
-
- function checkTargets() {
- if (SDK.targetManager.targets().length >= n)
- callback.call(null);
- else
- this.addSniffer(SDK.TargetManager.prototype, 'addTarget', checkTargets.bind(this));
- }
- };
-
- TestSuite.prototype._waitForExecutionContexts = function(n, callback) {
- var runtimeModel = SDK.targetManager.mainTarget().model(SDK.RuntimeModel);
- checkForExecutionContexts.call(this);
-
- function checkForExecutionContexts() {
- if (runtimeModel.executionContexts().length >= n)
- callback.call(null);
- else
- this.addSniffer(SDK.RuntimeModel.prototype, '_executionContextCreated', checkForExecutionContexts.bind(this));
- }
- };
-
-
- window.uiTests = new TestSuite(window.domAutomationController);
-})(window);
diff --git a/src/cobalt/debug/content/devtools/animation/animation_module.js b/src/cobalt/debug/content/devtools/animation/animation_module.js
deleted file mode 100644
index 3b37406..0000000
--- a/src/cobalt/debug/content/devtools/animation/animation_module.js
+++ /dev/null
@@ -1,279 +0,0 @@
-Animation.AnimationModel=class extends SDK.SDKModel{constructor(target){super(target);this._runtimeModel=(target.model(SDK.RuntimeModel));this._agent=target.animationAgent();target.registerAnimationDispatcher(new Animation.AnimationDispatcher(this));this._animationsById=new Map();this._animationGroups=new Map();this._pendingAnimations=[];this._playbackRate=1;var resourceTreeModel=(target.model(SDK.ResourceTreeModel));resourceTreeModel.addEventListener(SDK.ResourceTreeModel.Events.MainFrameNavigated,this._reset,this);var screenCaptureModel=target.model(SDK.ScreenCaptureModel);if(screenCaptureModel)
-this._screenshotCapture=new Animation.AnimationModel.ScreenshotCapture(this,screenCaptureModel);}
-_reset(){this._animationsById.clear();this._animationGroups.clear();this._pendingAnimations=[];this.dispatchEventToListeners(Animation.AnimationModel.Events.ModelReset);}
-animationCreated(id){this._pendingAnimations.push(id);}
-_animationCanceled(id){this._pendingAnimations.remove(id);this._flushPendingAnimationsIfNeeded();}
-animationStarted(payload){if(!payload.source||!payload.source.backendNodeId)
-return;var animation=Animation.AnimationModel.Animation.parsePayload(this,payload);if(animation.type()==='WebAnimation'&&animation.source().keyframesRule().keyframes().length===0){this._pendingAnimations.remove(animation.id());}else{this._animationsById.set(animation.id(),animation);if(this._pendingAnimations.indexOf(animation.id())===-1)
-this._pendingAnimations.push(animation.id());}
-this._flushPendingAnimationsIfNeeded();}
-_flushPendingAnimationsIfNeeded(){for(var id of this._pendingAnimations){if(!this._animationsById.get(id))
-return;}
-while(this._pendingAnimations.length)
-this._matchExistingGroups(this._createGroupFromPendingAnimations());}
-_matchExistingGroups(incomingGroup){var matchedGroup=null;for(var group of this._animationGroups.values()){if(group._matches(incomingGroup)){matchedGroup=group;group._update(incomingGroup);break;}}
-if(!matchedGroup){this._animationGroups.set(incomingGroup.id(),incomingGroup);if(this._screenshotCapture)
-this._screenshotCapture.captureScreenshots(incomingGroup.finiteDuration(),incomingGroup._screenshots);}
-this.dispatchEventToListeners(Animation.AnimationModel.Events.AnimationGroupStarted,matchedGroup||incomingGroup);return!!matchedGroup;}
-_createGroupFromPendingAnimations(){console.assert(this._pendingAnimations.length);var groupedAnimations=[this._animationsById.get(this._pendingAnimations.shift())];var remainingAnimations=[];for(var id of this._pendingAnimations){var anim=this._animationsById.get(id);if(anim.startTime()===groupedAnimations[0].startTime())
-groupedAnimations.push(anim);else
-remainingAnimations.push(id);}
-this._pendingAnimations=remainingAnimations;return new Animation.AnimationModel.AnimationGroup(this,groupedAnimations[0].id(),groupedAnimations);}
-setPlaybackRate(playbackRate){this._playbackRate=playbackRate;this._agent.setPlaybackRate(playbackRate);}
-_releaseAnimations(animations){this._agent.releaseAnimations(animations);}
-suspendModel(){this._reset();return this._agent.disable();}
-resumeModel(){if(!this._enabled)
-return Promise.resolve();return this._agent.enable();}
-ensureEnabled(){if(this._enabled)
-return;this._agent.enable();this._enabled=true;}};SDK.SDKModel.register(Animation.AnimationModel,SDK.Target.Capability.DOM,false);Animation.AnimationModel.Events={AnimationGroupStarted:Symbol('AnimationGroupStarted'),ModelReset:Symbol('ModelReset')};Animation.AnimationModel.Animation=class{constructor(animationModel,payload){this._animationModel=animationModel;this._payload=payload;this._source=new Animation.AnimationModel.AnimationEffect(animationModel,(this._payload.source));}
-static parsePayload(animationModel,payload){return new Animation.AnimationModel.Animation(animationModel,payload);}
-payload(){return this._payload;}
-id(){return this._payload.id;}
-name(){return this._payload.name;}
-paused(){return this._payload.pausedState;}
-playState(){return this._playState||this._payload.playState;}
-setPlayState(playState){this._playState=playState;}
-playbackRate(){return this._payload.playbackRate;}
-startTime(){return this._payload.startTime;}
-endTime(){if(!this.source().iterations)
-return Infinity;return this.startTime()+this.source().delay()+this.source().duration()*this.source().iterations()+
-this.source().endDelay();}
-_finiteDuration(){var iterations=Math.min(this.source().iterations(),3);return this.source().delay()+this.source().duration()*iterations;}
-currentTime(){return this._payload.currentTime;}
-source(){return this._source;}
-type(){return(this._payload.type);}
-overlaps(animation){if(!this.source().iterations()||!animation.source().iterations())
-return true;var firstAnimation=this.startTime()<animation.startTime()?this:animation;var secondAnimation=firstAnimation===this?animation:this;return firstAnimation.endTime()>=secondAnimation.startTime();}
-setTiming(duration,delay){this._source.node().then(this._updateNodeStyle.bind(this,duration,delay));this._source._duration=duration;this._source._delay=delay;this._animationModel._agent.setTiming(this.id(),duration,delay);}
-_updateNodeStyle(duration,delay,node){var animationPrefix;if(this.type()===Animation.AnimationModel.Animation.Type.CSSTransition)
-animationPrefix='transition-';else if(this.type()===Animation.AnimationModel.Animation.Type.CSSAnimation)
-animationPrefix='animation-';else
-return;var cssModel=node.domModel().cssModel();cssModel.setEffectivePropertyValueForNode(node.id,animationPrefix+'duration',duration+'ms');cssModel.setEffectivePropertyValueForNode(node.id,animationPrefix+'delay',delay+'ms');}
-remoteObjectPromise(){return this._animationModel._agent.resolveAnimation(this.id()).then(payload=>payload&&this._animationModel._runtimeModel.createRemoteObject(payload));}
-_cssId(){return this._payload.cssId||'';}};Animation.AnimationModel.Animation.Type={CSSTransition:'CSSTransition',CSSAnimation:'CSSAnimation',WebAnimation:'WebAnimation'};Animation.AnimationModel.AnimationEffect=class{constructor(animationModel,payload){this._animationModel=animationModel;this._payload=payload;if(payload.keyframesRule)
-this._keyframesRule=new Animation.AnimationModel.KeyframesRule(payload.keyframesRule);this._delay=this._payload.delay;this._duration=this._payload.duration;}
-delay(){return this._delay;}
-endDelay(){return this._payload.endDelay;}
-iterationStart(){return this._payload.iterationStart;}
-iterations(){if(!this.delay()&&!this.endDelay()&&!this.duration())
-return 0;return this._payload.iterations||Infinity;}
-duration(){return this._duration;}
-direction(){return this._payload.direction;}
-fill(){return this._payload.fill;}
-node(){if(!this._deferredNode)
-this._deferredNode=new SDK.DeferredDOMNode(this._animationModel.target(),this.backendNodeId());return this._deferredNode.resolvePromise();}
-deferredNode(){return new SDK.DeferredDOMNode(this._animationModel.target(),this.backendNodeId());}
-backendNodeId(){return(this._payload.backendNodeId);}
-keyframesRule(){return this._keyframesRule;}
-easing(){return this._payload.easing;}};Animation.AnimationModel.KeyframesRule=class{constructor(payload){this._payload=payload;this._keyframes=this._payload.keyframes.map(function(keyframeStyle){return new Animation.AnimationModel.KeyframeStyle(keyframeStyle);});}
-_setKeyframesPayload(payload){this._keyframes=payload.map(function(keyframeStyle){return new Animation.AnimationModel.KeyframeStyle(keyframeStyle);});}
-name(){return this._payload.name;}
-keyframes(){return this._keyframes;}};Animation.AnimationModel.KeyframeStyle=class{constructor(payload){this._payload=payload;this._offset=this._payload.offset;}
-offset(){return this._offset;}
-setOffset(offset){this._offset=offset*100+'%';}
-offsetAsNumber(){return parseFloat(this._offset)/100;}
-easing(){return this._payload.easing;}};Animation.AnimationModel.AnimationGroup=class{constructor(animationModel,id,animations){this._animationModel=animationModel;this._id=id;this._animations=animations;this._paused=false;this._screenshots=[];this._screenshotImages=[];}
-id(){return this._id;}
-animations(){return this._animations;}
-release(){this._animationModel._animationGroups.remove(this.id());this._animationModel._releaseAnimations(this._animationIds());}
-_animationIds(){function extractId(animation){return animation.id();}
-return this._animations.map(extractId);}
-startTime(){return this._animations[0].startTime();}
-finiteDuration(){var maxDuration=0;for(var i=0;i<this._animations.length;++i)
-maxDuration=Math.max(maxDuration,this._animations[i]._finiteDuration());return maxDuration;}
-seekTo(currentTime){this._animationModel._agent.seekAnimations(this._animationIds(),currentTime);}
-paused(){return this._paused;}
-togglePause(paused){if(paused===this._paused)
-return;this._paused=paused;this._animationModel._agent.setPaused(this._animationIds(),paused);}
-currentTimePromise(){var longestAnim=null;for(var anim of this._animations){if(!longestAnim||anim.endTime()>longestAnim.endTime())
-longestAnim=anim;}
-return this._animationModel._agent.getCurrentTime(longestAnim.id()).then(currentTime=>currentTime||0);}
-_matches(group){function extractId(anim){if(anim.type()===Animation.AnimationModel.Animation.Type.WebAnimation)
-return anim.type()+anim.id();else
-return anim._cssId();}
-if(this._animations.length!==group._animations.length)
-return false;var left=this._animations.map(extractId).sort();var right=group._animations.map(extractId).sort();for(var i=0;i<left.length;i++){if(left[i]!==right[i])
-return false;}
-return true;}
-_update(group){this._animationModel._releaseAnimations(this._animationIds());this._animations=group._animations;}
-screenshots(){for(var i=0;i<this._screenshots.length;++i){var image=new Image();image.src='data:image/jpeg;base64,'+this._screenshots[i];this._screenshotImages.push(image);}
-this._screenshots=[];return this._screenshotImages;}};Animation.AnimationDispatcher=class{constructor(animationModel){this._animationModel=animationModel;}
-animationCreated(id){this._animationModel.animationCreated(id);}
-animationCanceled(id){this._animationModel._animationCanceled(id);}
-animationStarted(payload){this._animationModel.animationStarted(payload);}};Animation.AnimationModel.ScreenshotCapture=class{constructor(animationModel,screenCaptureModel){this._requests=[];this._screenCaptureModel=screenCaptureModel;this._animationModel=animationModel;this._animationModel.addEventListener(Animation.AnimationModel.Events.ModelReset,this._stopScreencast,this);}
-captureScreenshots(duration,screenshots){var screencastDuration=Math.min(duration/this._animationModel._playbackRate,3000);var endTime=screencastDuration+window.performance.now();this._requests.push({endTime:endTime,screenshots:screenshots});if(!this._endTime||endTime>this._endTime){clearTimeout(this._stopTimer);this._stopTimer=setTimeout(this._stopScreencast.bind(this),screencastDuration);this._endTime=endTime;}
-if(this._capturing)
-return;this._capturing=true;this._screenCaptureModel.startScreencast('jpeg',80,undefined,300,2,this._screencastFrame.bind(this),visible=>{});}
-_screencastFrame(base64Data,metadata){function isAnimating(request){return request.endTime>=now;}
-if(!this._capturing)
-return;var now=window.performance.now();this._requests=this._requests.filter(isAnimating);for(var request of this._requests)
-request.screenshots.push(base64Data);}
-_stopScreencast(){if(!this._capturing)
-return;delete this._stopTimer;delete this._endTime;this._requests=[];this._capturing=false;this._screenCaptureModel.stopScreencast();}};Animation.AnimationModel.ScreenshotCapture.Request;;Animation.AnimationGroupPreviewUI=class{constructor(model){this._model=model;this.element=createElementWithClass('div','animation-buffer-preview');this.element.createChild('div','animation-paused fill');this._removeButton=this.element.createChild('div','animation-remove-button');this._removeButton.textContent='\u2715';this._replayOverlayElement=this.element.createChild('div','animation-buffer-preview-animation');this._svg=this.element.createSVGChild('svg');this._svg.setAttribute('width','100%');this._svg.setAttribute('preserveAspectRatio','none');this._svg.setAttribute('height','100%');this._viewBoxHeight=32;this._svg.setAttribute('viewBox','0 0 100 '+this._viewBoxHeight);this._svg.setAttribute('shape-rendering','crispEdges');this._render();}
-_groupDuration(){var duration=0;for(var anim of this._model.animations()){var animDuration=anim.source().delay()+anim.source().duration();if(animDuration>duration)
-duration=animDuration;}
-return duration;}
-removeButton(){return this._removeButton;}
-replay(){this._replayOverlayElement.animate([{offset:0,width:'0%',opacity:1},{offset:0.9,width:'100%',opacity:1},{offset:1,width:'100%',opacity:0}],{duration:200,easing:'cubic-bezier(0, 0, 0.2, 1)'});}
-_render(){this._svg.removeChildren();var maxToShow=10;var numberOfAnimations=Math.min(this._model.animations().length,maxToShow);var timeToPixelRatio=100/Math.max(this._groupDuration(),750);for(var i=0;i<numberOfAnimations;i++){var effect=this._model.animations()[i].source();var line=this._svg.createSVGChild('line');line.setAttribute('x1',effect.delay()*timeToPixelRatio);line.setAttribute('x2',(effect.delay()+effect.duration())*timeToPixelRatio);var y=Math.floor(this._viewBoxHeight/Math.max(6,numberOfAnimations)*i+1);line.setAttribute('y1',y);line.setAttribute('y2',y);line.style.stroke=Animation.AnimationUI.Color(this._model.animations()[i]);}}};;Animation.AnimationScreenshotPopover=class extends UI.VBox{constructor(images){super(true);console.assert(images.length);this.registerRequiredCSS('animation/animationScreenshotPopover.css');this.contentElement.classList.add('animation-screenshot-popover');this._frames=images;for(var image of images){this.contentElement.appendChild(image);image.style.display='none';}
-this._currentFrame=0;this._frames[0].style.display='block';this._progressBar=this.contentElement.createChild('div','animation-progress');}
-wasShown(){this._rafId=this.contentElement.window().requestAnimationFrame(this._changeFrame.bind(this));}
-willHide(){this.contentElement.window().cancelAnimationFrame(this._rafId);delete this._endDelay;}
-_changeFrame(){this._rafId=this.contentElement.window().requestAnimationFrame(this._changeFrame.bind(this));if(this._endDelay){this._endDelay--;return;}
-this._showFrame=!this._showFrame;if(!this._showFrame)
-return;var numFrames=this._frames.length;this._frames[this._currentFrame%numFrames].style.display='none';this._currentFrame++;this._frames[(this._currentFrame)%numFrames].style.display='block';if(this._currentFrame%numFrames===numFrames-1)
-this._endDelay=50;this._progressBar.style.width=(this._currentFrame%numFrames+1)/numFrames*100+'%';}};;Animation.AnimationTimeline=class extends UI.VBox{constructor(){super(true);this.registerRequiredCSS('animation/animationTimeline.css');this.element.classList.add('animations-timeline');this._grid=this.contentElement.createSVGChild('svg','animation-timeline-grid');this._playbackRate=1;this._allPaused=false;this._createHeader();this._animationsContainer=this.contentElement.createChild('div','animation-timeline-rows');var timelineHint=this.contentElement.createChild('div','animation-timeline-rows-hint');timelineHint.textContent=Common.UIString('Select an effect above to inspect and modify.');this._defaultDuration=100;this._duration=this._defaultDuration;this._timelineControlsWidth=150;this._nodesMap=new Map();this._uiAnimations=[];this._groupBuffer=[];this._previewMap=new Map();this._symbol=Symbol('animationTimeline');this._animationsMap=new Map();SDK.targetManager.addModelListener(SDK.DOMModel,SDK.DOMModel.Events.NodeRemoved,this._nodeRemoved,this);SDK.targetManager.observeModels(Animation.AnimationModel,this);UI.context.addFlavorChangeListener(SDK.DOMNode,this._nodeChanged,this);}
-wasShown(){for(var animationModel of SDK.targetManager.models(Animation.AnimationModel))
-this._addEventListeners(animationModel);}
-willHide(){for(var animationModel of SDK.targetManager.models(Animation.AnimationModel))
-this._removeEventListeners(animationModel);this._popoverHelper.hidePopover();}
-modelAdded(animationModel){if(this.isShowing())
-this._addEventListeners(animationModel);}
-modelRemoved(animationModel){this._removeEventListeners(animationModel);}
-_addEventListeners(animationModel){animationModel.ensureEnabled();animationModel.addEventListener(Animation.AnimationModel.Events.AnimationGroupStarted,this._animationGroupStarted,this);animationModel.addEventListener(Animation.AnimationModel.Events.ModelReset,this._reset,this);}
-_removeEventListeners(animationModel){animationModel.removeEventListener(Animation.AnimationModel.Events.AnimationGroupStarted,this._animationGroupStarted,this);animationModel.removeEventListener(Animation.AnimationModel.Events.ModelReset,this._reset,this);}
-_nodeChanged(){for(var nodeUI of this._nodesMap.values())
-nodeUI._nodeChanged();}
-_createScrubber(){this._timelineScrubber=createElementWithClass('div','animation-scrubber hidden');this._timelineScrubberLine=this._timelineScrubber.createChild('div','animation-scrubber-line');this._timelineScrubberLine.createChild('div','animation-scrubber-head');this._timelineScrubber.createChild('div','animation-time-overlay');return this._timelineScrubber;}
-_createHeader(){var toolbarContainer=this.contentElement.createChild('div','animation-timeline-toolbar-container');var topToolbar=new UI.Toolbar('animation-timeline-toolbar',toolbarContainer);var clearButton=new UI.ToolbarButton(Common.UIString('Clear all'),'largeicon-clear');clearButton.addEventListener(UI.ToolbarButton.Events.Click,this._reset.bind(this));topToolbar.appendToolbarItem(clearButton);topToolbar.appendSeparator();this._pauseButton=new UI.ToolbarToggle(Common.UIString('Pause all'),'largeicon-pause','largeicon-resume');this._pauseButton.addEventListener(UI.ToolbarButton.Events.Click,this._togglePauseAll.bind(this));topToolbar.appendToolbarItem(this._pauseButton);var playbackRateControl=toolbarContainer.createChild('div','animation-playback-rate-control');this._playbackRateButtons=[];for(var playbackRate of Animation.AnimationTimeline.GlobalPlaybackRates){var button=playbackRateControl.createChild('div','animation-playback-rate-button');button.textContent=playbackRate?Common.UIString(playbackRate*100+'%'):Common.UIString('Pause');button.playbackRate=playbackRate;button.addEventListener('click',this._setPlaybackRate.bind(this,playbackRate));button.title=Common.UIString('Set speed to ')+button.textContent;this._playbackRateButtons.push(button);}
-this._updatePlaybackControls();this._previewContainer=this.contentElement.createChild('div','animation-timeline-buffer');this._popoverHelper=new UI.PopoverHelper(this._previewContainer,this._getPopoverRequest.bind(this));this._popoverHelper.setDisableOnClick(true);this._popoverHelper.setTimeout(0);var emptyBufferHint=this.contentElement.createChild('div','animation-timeline-buffer-hint');emptyBufferHint.textContent=Common.UIString('Listening for animations...');var container=this.contentElement.createChild('div','animation-timeline-header');var controls=container.createChild('div','animation-controls');this._currentTime=controls.createChild('div','animation-timeline-current-time monospace');var toolbar=new UI.Toolbar('animation-controls-toolbar',controls);this._controlButton=new UI.ToolbarToggle(Common.UIString('Replay timeline'),'largeicon-replay-animation');this._controlState=Animation.AnimationTimeline._ControlState.Replay;this._controlButton.setToggled(true);this._controlButton.addEventListener(UI.ToolbarButton.Events.Click,this._controlButtonToggle.bind(this));toolbar.appendToolbarItem(this._controlButton);var gridHeader=container.createChild('div','animation-grid-header');UI.installDragHandle(gridHeader,this._repositionScrubber.bind(this),this._scrubberDragMove.bind(this),this._scrubberDragEnd.bind(this),'text');container.appendChild(this._createScrubber());UI.installDragHandle(this._timelineScrubberLine,this._scrubberDragStart.bind(this),this._scrubberDragMove.bind(this),this._scrubberDragEnd.bind(this),'col-resize');this._currentTime.textContent='';return container;}
-_getPopoverRequest(event){var element=event.target;if(!element.isDescendant(this._previewContainer))
-return null;return{box:event.target.boxInWindow(),show:popover=>{var animGroup;for(var group of this._previewMap.keysArray()){if(this._previewMap.get(group).element===element.parentElement)
-animGroup=group;}
-console.assert(animGroup);var screenshots=animGroup.screenshots();if(!screenshots.length)
-return Promise.resolve(false);var fulfill;var promise=new Promise(x=>fulfill=x);if(!screenshots[0].complete)
-screenshots[0].onload=onFirstScreenshotLoaded.bind(null,screenshots);else
-onFirstScreenshotLoaded(screenshots);return promise;function onFirstScreenshotLoaded(screenshots){new Animation.AnimationScreenshotPopover(screenshots).show(popover.contentElement);fulfill(true);}}};}
-_togglePauseAll(){this._allPaused=!this._allPaused;this._pauseButton.setToggled(this._allPaused);this._setPlaybackRate(this._playbackRate);this._pauseButton.setTitle(this._allPaused?Common.UIString('Resume all'):Common.UIString('Pause all'));}
-_setPlaybackRate(playbackRate){this._playbackRate=playbackRate;for(var animationModel of SDK.targetManager.models(Animation.AnimationModel))
-animationModel.setPlaybackRate(this._allPaused?0:this._playbackRate);Host.userMetrics.actionTaken(Host.UserMetrics.Action.AnimationsPlaybackRateChanged);if(this._scrubberPlayer)
-this._scrubberPlayer.playbackRate=this._effectivePlaybackRate();this._updatePlaybackControls();}
-_updatePlaybackControls(){for(var button of this._playbackRateButtons){var selected=this._playbackRate===button.playbackRate;button.classList.toggle('selected',selected);}}
-_controlButtonToggle(){if(this._controlState===Animation.AnimationTimeline._ControlState.Play)
-this._togglePause(false);else if(this._controlState===Animation.AnimationTimeline._ControlState.Replay)
-this._replay();else
-this._togglePause(true);}
-_updateControlButton(){this._controlButton.setEnabled(!!this._selectedGroup);if(this._selectedGroup&&this._selectedGroup.paused()){this._controlState=Animation.AnimationTimeline._ControlState.Play;this._controlButton.setToggled(true);this._controlButton.setTitle(Common.UIString('Play timeline'));this._controlButton.setGlyph('largeicon-play-animation');}else if(!this._scrubberPlayer||this._scrubberPlayer.currentTime>=this.duration()){this._controlState=Animation.AnimationTimeline._ControlState.Replay;this._controlButton.setToggled(true);this._controlButton.setTitle(Common.UIString('Replay timeline'));this._controlButton.setGlyph('largeicon-replay-animation');}else{this._controlState=Animation.AnimationTimeline._ControlState.Pause;this._controlButton.setToggled(false);this._controlButton.setTitle(Common.UIString('Pause timeline'));this._controlButton.setGlyph('largeicon-pause-animation');}}
-_effectivePlaybackRate(){return(this._allPaused||(this._selectedGroup&&this._selectedGroup.paused()))?0:this._playbackRate;}
-_togglePause(pause){this._selectedGroup.togglePause(pause);if(this._scrubberPlayer)
-this._scrubberPlayer.playbackRate=this._effectivePlaybackRate();this._previewMap.get(this._selectedGroup).element.classList.toggle('paused',pause);this._updateControlButton();}
-_replay(){if(!this._selectedGroup)
-return;this._selectedGroup.seekTo(0);this._animateTime(0);this._updateControlButton();}
-duration(){return this._duration;}
-setDuration(duration){this._duration=duration;this.scheduleRedraw();}
-_clearTimeline(){this._uiAnimations=[];this._nodesMap.clear();this._animationsMap.clear();this._animationsContainer.removeChildren();this._duration=this._defaultDuration;this._timelineScrubber.classList.add('hidden');delete this._selectedGroup;if(this._scrubberPlayer)
-this._scrubberPlayer.cancel();delete this._scrubberPlayer;this._currentTime.textContent='';this._updateControlButton();}
-_reset(){this._clearTimeline();if(this._allPaused)
-this._togglePauseAll();else
-this._setPlaybackRate(this._playbackRate);for(var group of this._groupBuffer)
-group.release();this._groupBuffer=[];this._previewMap.clear();this._previewContainer.removeChildren();this._popoverHelper.hidePopover();this._renderGrid();}
-_animationGroupStarted(event){this._addAnimationGroup((event.data));}
-_addAnimationGroup(group){function startTimeComparator(left,right){return left.startTime()>right.startTime();}
-if(this._previewMap.get(group)){if(this._selectedGroup===group)
-this._syncScrubber();else
-this._previewMap.get(group).replay();return;}
-this._groupBuffer.sort(startTimeComparator);var groupsToDiscard=[];var bufferSize=this.width()/50;while(this._groupBuffer.length>bufferSize){var toDiscard=this._groupBuffer.splice(this._groupBuffer[0]===this._selectedGroup?1:0,1);groupsToDiscard.push(toDiscard[0]);}
-for(var g of groupsToDiscard){this._previewMap.get(g).element.remove();this._previewMap.delete(g);g.release();}
-var preview=new Animation.AnimationGroupPreviewUI(group);this._groupBuffer.push(group);this._previewMap.set(group,preview);this._previewContainer.appendChild(preview.element);preview.removeButton().addEventListener('click',this._removeAnimationGroup.bind(this,group));preview.element.addEventListener('click',this._selectAnimationGroup.bind(this,group));}
-_removeAnimationGroup(group,event){this._groupBuffer.remove(group);this._previewMap.get(group).element.remove();this._previewMap.delete(group);group.release();event.consume(true);if(this._selectedGroup===group){this._clearTimeline();this._renderGrid();}}
-_selectAnimationGroup(group){function applySelectionClass(ui,group){ui.element.classList.toggle('selected',this._selectedGroup===group);}
-if(this._selectedGroup===group){this._togglePause(false);this._replay();return;}
-this._clearTimeline();this._selectedGroup=group;this._previewMap.forEach(applySelectionClass,this);this.setDuration(Math.max(500,group.finiteDuration()+100));for(var anim of group.animations())
-this._addAnimation(anim);this.scheduleRedraw();this._timelineScrubber.classList.remove('hidden');this._togglePause(false);this._replay();}
-_addAnimation(animation){function nodeResolved(node){nodeUI.nodeResolved(node);uiAnimation.setNode(node);if(node)
-node[this._symbol]=nodeUI;}
-var nodeUI=this._nodesMap.get(animation.source().backendNodeId());if(!nodeUI){nodeUI=new Animation.AnimationTimeline.NodeUI(animation.source());this._animationsContainer.appendChild(nodeUI.element);this._nodesMap.set(animation.source().backendNodeId(),nodeUI);}
-var nodeRow=nodeUI.createNewRow();var uiAnimation=new Animation.AnimationUI(animation,this,nodeRow);animation.source().deferredNode().resolve(nodeResolved.bind(this));this._uiAnimations.push(uiAnimation);this._animationsMap.set(animation.id(),animation);}
-_nodeRemoved(event){var node=event.data.node;if(node[this._symbol])
-node[this._symbol].nodeRemoved();}
-_renderGrid(){var gridSize=250;this._grid.setAttribute('width',this.width()+10);this._grid.setAttribute('height',this._cachedTimelineHeight+30);this._grid.setAttribute('shape-rendering','crispEdges');this._grid.removeChildren();var lastDraw=undefined;for(var time=0;time<this.duration();time+=gridSize){var line=this._grid.createSVGChild('rect','animation-timeline-grid-line');line.setAttribute('x',time*this.pixelMsRatio()+10);line.setAttribute('y',23);line.setAttribute('height','100%');line.setAttribute('width',1);}
-for(var time=0;time<this.duration();time+=gridSize){var gridWidth=time*this.pixelMsRatio();if(lastDraw===undefined||gridWidth-lastDraw>50){lastDraw=gridWidth;var label=this._grid.createSVGChild('text','animation-timeline-grid-label');label.textContent=Common.UIString(Number.millisToString(time));label.setAttribute('x',gridWidth+10);label.setAttribute('y',16);}}}
-scheduleRedraw(){this._renderQueue=[];for(var ui of this._uiAnimations)
-this._renderQueue.push(ui);if(this._redrawing)
-return;this._redrawing=true;this._renderGrid();this._animationsContainer.window().requestAnimationFrame(this._render.bind(this));}
-_render(timestamp){while(this._renderQueue.length&&(!timestamp||window.performance.now()-timestamp<50))
-this._renderQueue.shift().redraw();if(this._renderQueue.length)
-this._animationsContainer.window().requestAnimationFrame(this._render.bind(this));else
-delete this._redrawing;}
-onResize(){this._cachedTimelineWidth=Math.max(0,this._animationsContainer.offsetWidth-this._timelineControlsWidth)||0;this._cachedTimelineHeight=this._animationsContainer.offsetHeight;this.scheduleRedraw();if(this._scrubberPlayer)
-this._syncScrubber();delete this._gridOffsetLeft;}
-width(){return this._cachedTimelineWidth||0;}
-_resizeWindow(animation){var resized=false;var duration=animation.source().duration()*Math.min(2,animation.source().iterations());var requiredDuration=animation.source().delay()+duration+animation.source().endDelay();if(requiredDuration>this._duration){resized=true;this._duration=requiredDuration+200;}
-return resized;}
-_syncScrubber(){if(!this._selectedGroup)
-return;this._selectedGroup.currentTimePromise().then(this._animateTime.bind(this)).then(this._updateControlButton.bind(this));}
-_animateTime(currentTime){if(this._scrubberPlayer)
-this._scrubberPlayer.cancel();this._scrubberPlayer=this._timelineScrubber.animate([{transform:'translateX(0px)'},{transform:'translateX('+this.width()+'px)'}],{duration:this.duration(),fill:'forwards'});this._scrubberPlayer.playbackRate=this._effectivePlaybackRate();this._scrubberPlayer.onfinish=this._updateControlButton.bind(this);this._scrubberPlayer.currentTime=currentTime;this.element.window().requestAnimationFrame(this._updateScrubber.bind(this));}
-pixelMsRatio(){return this.width()/this.duration()||0;}
-_updateScrubber(timestamp){if(!this._scrubberPlayer)
-return;this._currentTime.textContent=Common.UIString(Number.millisToString(this._scrubberPlayer.currentTime));if(this._scrubberPlayer.playState==='pending'||this._scrubberPlayer.playState==='running')
-this.element.window().requestAnimationFrame(this._updateScrubber.bind(this));else if(this._scrubberPlayer.playState==='finished')
-this._currentTime.textContent='';}
-_repositionScrubber(event){if(!this._selectedGroup)
-return false;if(!this._gridOffsetLeft)
-this._gridOffsetLeft=this._grid.totalOffsetLeft()+10;var seekTime=Math.max(0,event.x-this._gridOffsetLeft)/this.pixelMsRatio();this._selectedGroup.seekTo(seekTime);this._togglePause(true);this._animateTime(seekTime);this._originalScrubberTime=seekTime;this._originalMousePosition=event.x;return true;}
-_scrubberDragStart(event){if(!this._scrubberPlayer||!this._selectedGroup)
-return false;this._originalScrubberTime=this._scrubberPlayer.currentTime;this._timelineScrubber.classList.remove('animation-timeline-end');this._scrubberPlayer.pause();this._originalMousePosition=event.x;this._togglePause(true);return true;}
-_scrubberDragMove(event){var delta=event.x-this._originalMousePosition;var currentTime=Math.max(0,Math.min(this._originalScrubberTime+delta/this.pixelMsRatio(),this.duration()));this._scrubberPlayer.currentTime=currentTime;this._currentTime.textContent=Common.UIString(Number.millisToString(Math.round(currentTime)));this._selectedGroup.seekTo(currentTime);}
-_scrubberDragEnd(event){var currentTime=Math.max(0,this._scrubberPlayer.currentTime);this._scrubberPlayer.play();this._scrubberPlayer.currentTime=currentTime;this._currentTime.window().requestAnimationFrame(this._updateScrubber.bind(this));}};Animation.AnimationTimeline.GlobalPlaybackRates=[1,0.25,0.1];Animation.AnimationTimeline._ControlState={Play:'play-outline',Replay:'replay-outline',Pause:'pause-outline'};Animation.AnimationTimeline.NodeUI=class{constructor(animationEffect){this.element=createElementWithClass('div','animation-node-row');this._description=this.element.createChild('div','animation-node-description');this._timelineElement=this.element.createChild('div','animation-node-timeline');}
-nodeResolved(node){if(!node){this._description.createTextChild(Common.UIString('<node>'));return;}
-this._node=node;this._nodeChanged();this._description.appendChild(Components.DOMPresentationUtils.linkifyNodeReference(node));if(!node.ownerDocument)
-this.nodeRemoved();}
-createNewRow(){return this._timelineElement.createChild('div','animation-timeline-row');}
-nodeRemoved(){this.element.classList.add('animation-node-removed');this._node=null;}
-_nodeChanged(){this.element.classList.toggle('animation-node-selected',this._node&&this._node===UI.context.flavor(SDK.DOMNode));}};Animation.AnimationTimeline.StepTimingFunction=class{constructor(steps,stepAtPosition){this.steps=steps;this.stepAtPosition=stepAtPosition;}
-static parse(text){var match=text.match(/^steps\((\d+), (start|middle)\)$/);if(match)
-return new Animation.AnimationTimeline.StepTimingFunction(parseInt(match[1],10),match[2]);match=text.match(/^steps\((\d+)\)$/);if(match)
-return new Animation.AnimationTimeline.StepTimingFunction(parseInt(match[1],10),'end');return null;}};;Animation.AnimationUI=class{constructor(animation,timeline,parentElement){this._animation=animation;this._timeline=timeline;this._parentElement=parentElement;if(this._animation.source().keyframesRule())
-this._keyframes=this._animation.source().keyframesRule().keyframes();this._nameElement=parentElement.createChild('div','animation-name');this._nameElement.textContent=this._animation.name();this._svg=parentElement.createSVGChild('svg','animation-ui');this._svg.setAttribute('height',Animation.AnimationUI.Options.AnimationSVGHeight);this._svg.style.marginLeft='-'+Animation.AnimationUI.Options.AnimationMargin+'px';this._svg.addEventListener('contextmenu',this._onContextMenu.bind(this));this._activeIntervalGroup=this._svg.createSVGChild('g');UI.installDragHandle(this._activeIntervalGroup,this._mouseDown.bind(this,Animation.AnimationUI.MouseEvents.AnimationDrag,null),this._mouseMove.bind(this),this._mouseUp.bind(this),'-webkit-grabbing','-webkit-grab');this._cachedElements=[];this._movementInMs=0;this._color=Animation.AnimationUI.Color(this._animation);}
-static Color(animation){var names=Object.keys(Animation.AnimationUI.Colors);var color=Animation.AnimationUI.Colors[names[String.hashCode(animation.name()||animation.id())%names.length]];return color.asString(Common.Color.Format.RGB);}
-animation(){return this._animation;}
-setNode(node){this._node=node;}
-_createLine(parentElement,className){var line=parentElement.createSVGChild('line',className);line.setAttribute('x1',Animation.AnimationUI.Options.AnimationMargin);line.setAttribute('y1',Animation.AnimationUI.Options.AnimationHeight);line.setAttribute('y2',Animation.AnimationUI.Options.AnimationHeight);line.style.stroke=this._color;return line;}
-_drawAnimationLine(iteration,parentElement){var cache=this._cachedElements[iteration];if(!cache.animationLine)
-cache.animationLine=this._createLine(parentElement,'animation-line');cache.animationLine.setAttribute('x2',(this._duration()*this._timeline.pixelMsRatio()+Animation.AnimationUI.Options.AnimationMargin).toFixed(2));}
-_drawDelayLine(parentElement){if(!this._delayLine){this._delayLine=this._createLine(parentElement,'animation-delay-line');this._endDelayLine=this._createLine(parentElement,'animation-delay-line');}
-var fill=this._animation.source().fill();this._delayLine.classList.toggle('animation-fill',fill==='backwards'||fill==='both');var margin=Animation.AnimationUI.Options.AnimationMargin;this._delayLine.setAttribute('x1',margin);this._delayLine.setAttribute('x2',(this._delay()*this._timeline.pixelMsRatio()+margin).toFixed(2));var forwardsFill=fill==='forwards'||fill==='both';this._endDelayLine.classList.toggle('animation-fill',forwardsFill);var leftMargin=Math.min(this._timeline.width(),(this._delay()+this._duration()*this._animation.source().iterations())*this._timeline.pixelMsRatio());this._endDelayLine.style.transform='translateX('+leftMargin.toFixed(2)+'px)';this._endDelayLine.setAttribute('x1',margin);this._endDelayLine.setAttribute('x2',forwardsFill?(this._timeline.width()-leftMargin+margin).toFixed(2):(this._animation.source().endDelay()*this._timeline.pixelMsRatio()+margin).toFixed(2));}
-_drawPoint(iteration,parentElement,x,keyframeIndex,attachEvents){if(this._cachedElements[iteration].keyframePoints[keyframeIndex]){this._cachedElements[iteration].keyframePoints[keyframeIndex].setAttribute('cx',x.toFixed(2));return;}
-var circle=parentElement.createSVGChild('circle',keyframeIndex<=0?'animation-endpoint':'animation-keyframe-point');circle.setAttribute('cx',x.toFixed(2));circle.setAttribute('cy',Animation.AnimationUI.Options.AnimationHeight);circle.style.stroke=this._color;circle.setAttribute('r',Animation.AnimationUI.Options.AnimationMargin/2);if(keyframeIndex<=0)
-circle.style.fill=this._color;this._cachedElements[iteration].keyframePoints[keyframeIndex]=circle;if(!attachEvents)
-return;var eventType;if(keyframeIndex===0)
-eventType=Animation.AnimationUI.MouseEvents.StartEndpointMove;else if(keyframeIndex===-1)
-eventType=Animation.AnimationUI.MouseEvents.FinishEndpointMove;else
-eventType=Animation.AnimationUI.MouseEvents.KeyframeMove;UI.installDragHandle(circle,this._mouseDown.bind(this,eventType,keyframeIndex),this._mouseMove.bind(this),this._mouseUp.bind(this),'ew-resize');}
-_renderKeyframe(iteration,keyframeIndex,parentElement,leftDistance,width,easing){function createStepLine(parentElement,x,strokeColor){var line=parentElement.createSVGChild('line');line.setAttribute('x1',x);line.setAttribute('x2',x);line.setAttribute('y1',Animation.AnimationUI.Options.AnimationMargin);line.setAttribute('y2',Animation.AnimationUI.Options.AnimationHeight);line.style.stroke=strokeColor;}
-var bezier=UI.Geometry.CubicBezier.parse(easing);var cache=this._cachedElements[iteration].keyframeRender;if(!cache[keyframeIndex]){cache[keyframeIndex]=bezier?parentElement.createSVGChild('path','animation-keyframe'):parentElement.createSVGChild('g','animation-keyframe-step');}
-var group=cache[keyframeIndex];group.style.transform='translateX('+leftDistance.toFixed(2)+'px)';if(easing==='linear'){group.style.fill=this._color;var height=InlineEditor.BezierUI.Height;group.setAttribute('d',['M',0,height,'L',0,5,'L',width.toFixed(2),5,'L',width.toFixed(2),height,'Z'].join(' '));}else if(bezier){group.style.fill=this._color;InlineEditor.BezierUI.drawVelocityChart(bezier,group,width);}else{var stepFunction=Animation.AnimationTimeline.StepTimingFunction.parse(easing);group.removeChildren();var offsetMap={'start':0,'middle':0.5,'end':1};var offsetWeight=offsetMap[stepFunction.stepAtPosition];for(var i=0;i<stepFunction.steps;i++)
-createStepLine(group,(i+offsetWeight)*width/stepFunction.steps,this._color);}}
-redraw(){var maxWidth=this._timeline.width()-Animation.AnimationUI.Options.AnimationMargin;this._svg.setAttribute('width',(maxWidth+2*Animation.AnimationUI.Options.AnimationMargin).toFixed(2));this._activeIntervalGroup.style.transform='translateX('+(this._delay()*this._timeline.pixelMsRatio()).toFixed(2)+'px)';this._nameElement.style.transform='translateX('+
-(this._delay()*this._timeline.pixelMsRatio()+Animation.AnimationUI.Options.AnimationMargin).toFixed(2)+'px)';this._nameElement.style.width=(this._duration()*this._timeline.pixelMsRatio()).toFixed(2)+'px';this._drawDelayLine(this._svg);if(this._animation.type()==='CSSTransition'){this._renderTransition();return;}
-this._renderIteration(this._activeIntervalGroup,0);if(!this._tailGroup)
-this._tailGroup=this._activeIntervalGroup.createSVGChild('g','animation-tail-iterations');var iterationWidth=this._duration()*this._timeline.pixelMsRatio();for(var iteration=1;iteration<this._animation.source().iterations()&&iterationWidth*(iteration-1)<this._timeline.width();iteration++)
-this._renderIteration(this._tailGroup,iteration);while(iteration<this._cachedElements.length)
-this._cachedElements.pop().group.remove();}
-_renderTransition(){if(!this._cachedElements[0])
-this._cachedElements[0]={animationLine:null,keyframePoints:{},keyframeRender:{},group:null};this._drawAnimationLine(0,this._activeIntervalGroup);this._renderKeyframe(0,0,this._activeIntervalGroup,Animation.AnimationUI.Options.AnimationMargin,this._duration()*this._timeline.pixelMsRatio(),this._animation.source().easing());this._drawPoint(0,this._activeIntervalGroup,Animation.AnimationUI.Options.AnimationMargin,0,true);this._drawPoint(0,this._activeIntervalGroup,this._duration()*this._timeline.pixelMsRatio()+Animation.AnimationUI.Options.AnimationMargin,-1,true);}
-_renderIteration(parentElement,iteration){if(!this._cachedElements[iteration]){this._cachedElements[iteration]={animationLine:null,keyframePoints:{},keyframeRender:{},group:parentElement.createSVGChild('g')};}
-var group=this._cachedElements[iteration].group;group.style.transform='translateX('+(iteration*this._duration()*this._timeline.pixelMsRatio()).toFixed(2)+'px)';this._drawAnimationLine(iteration,group);console.assert(this._keyframes.length>1);for(var i=0;i<this._keyframes.length-1;i++){var leftDistance=this._offset(i)*this._duration()*this._timeline.pixelMsRatio()+
-Animation.AnimationUI.Options.AnimationMargin;var width=this._duration()*(this._offset(i+1)-this._offset(i))*this._timeline.pixelMsRatio();this._renderKeyframe(iteration,i,group,leftDistance,width,this._keyframes[i].easing());if(i||(!i&&iteration===0))
-this._drawPoint(iteration,group,leftDistance,i,iteration===0);}
-this._drawPoint(iteration,group,this._duration()*this._timeline.pixelMsRatio()+Animation.AnimationUI.Options.AnimationMargin,-1,iteration===0);}
-_delay(){var delay=this._animation.source().delay();if(this._mouseEventType===Animation.AnimationUI.MouseEvents.AnimationDrag||this._mouseEventType===Animation.AnimationUI.MouseEvents.StartEndpointMove)
-delay+=this._movementInMs;return Math.max(0,delay);}
-_duration(){var duration=this._animation.source().duration();if(this._mouseEventType===Animation.AnimationUI.MouseEvents.FinishEndpointMove)
-duration+=this._movementInMs;else if(this._mouseEventType===Animation.AnimationUI.MouseEvents.StartEndpointMove)
-duration-=Math.max(this._movementInMs,-this._animation.source().delay());return Math.max(0,duration);}
-_offset(i){var offset=this._keyframes[i].offsetAsNumber();if(this._mouseEventType===Animation.AnimationUI.MouseEvents.KeyframeMove&&i===this._keyframeMoved){console.assert(i>0&&i<this._keyframes.length-1,'First and last keyframe cannot be moved');offset+=this._movementInMs/this._animation.source().duration();offset=Math.max(offset,this._keyframes[i-1].offsetAsNumber());offset=Math.min(offset,this._keyframes[i+1].offsetAsNumber());}
-return offset;}
-_mouseDown(mouseEventType,keyframeIndex,event){if(event.buttons===2)
-return false;if(this._svg.enclosingNodeOrSelfWithClass('animation-node-removed'))
-return false;this._mouseEventType=mouseEventType;this._keyframeMoved=keyframeIndex;this._downMouseX=event.clientX;event.consume(true);if(this._node)
-Common.Revealer.reveal(this._node);return true;}
-_mouseMove(event){this._movementInMs=(event.clientX-this._downMouseX)/this._timeline.pixelMsRatio();if(this._delay()+this._duration()>this._timeline.duration()*0.8)
-this._timeline.setDuration(this._timeline.duration()*1.2);this.redraw();}
-_mouseUp(event){this._movementInMs=(event.clientX-this._downMouseX)/this._timeline.pixelMsRatio();if(this._mouseEventType===Animation.AnimationUI.MouseEvents.KeyframeMove)
-this._keyframes[this._keyframeMoved].setOffset(this._offset(this._keyframeMoved));else
-this._animation.setTiming(this._duration(),this._delay());this._movementInMs=0;this.redraw();delete this._mouseEventType;delete this._downMouseX;delete this._keyframeMoved;}
-_onContextMenu(event){function showContextMenu(remoteObject){if(!remoteObject)
-return;var contextMenu=new UI.ContextMenu(event);contextMenu.appendApplicableItems(remoteObject);contextMenu.show();}
-this._animation.remoteObjectPromise().then(showContextMenu);event.consume(true);}};Animation.AnimationUI.MouseEvents={AnimationDrag:'AnimationDrag',KeyframeMove:'KeyframeMove',StartEndpointMove:'StartEndpointMove',FinishEndpointMove:'FinishEndpointMove'};Animation.AnimationUI.Options={AnimationHeight:26,AnimationSVGHeight:50,AnimationMargin:7,EndpointsClickRegionSize:10,GridCanvasHeight:40};Animation.AnimationUI.Colors={'Purple':Common.Color.parse('#9C27B0'),'Light Blue':Common.Color.parse('#03A9F4'),'Deep Orange':Common.Color.parse('#FF5722'),'Blue':Common.Color.parse('#5677FC'),'Lime':Common.Color.parse('#CDDC39'),'Blue Grey':Common.Color.parse('#607D8B'),'Pink':Common.Color.parse('#E91E63'),'Green':Common.Color.parse('#0F9D58'),'Brown':Common.Color.parse('#795548'),'Cyan':Common.Color.parse('#00BCD4')};;Runtime.cachedResources["animation/animationScreenshotPopover.css"]="/*\n * Copyright (c) 2015 The Chromium Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style license that can be\n * found in the LICENSE file.\n */\n\nimg {\n max-height: 300px;\n border-radius: 2px;\n}\n\n.animation-progress {\n position: absolute;\n height: 2px;\n bottom: 0;\n left: 0;\n background: hsl(217, 89%, 61%);\n}\n\n/*# sourceURL=animation/animationScreenshotPopover.css */";Runtime.cachedResources["animation/animationTimeline.css"]="/*\n * Copyright (c) 2015 The Chromium Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style license that can be\n * found in the LICENSE file.\n */\n\n:host {\n overflow: hidden;\n}\n\n.animation-node-row {\n width: 100%;\n display: flex;\n border-bottom: 1px dashed hsla(0,0%,94%,1);\n}\n\n.animation-node-description {\n width: 150px;\n padding-left: 8px;\n overflow: hidden;\n position: relative;\n transform-style: preserve-3d;\n border-bottom: 1px solid hsl(0, 0%, 90%);\n margin-bottom: -1px;\n background-color: hsl(0, 0%, 98%);\n display: flex;\n align-items: center;\n flex: 0 0 150px;\n}\n\n.animation-node-description > * {\n flex: 0 0 auto;\n}\n\n.animation-timeline-row {\n height: 32px;\n position: relative;\n}\n\npath.animation-keyframe {\n fill-opacity: 0.2;\n}\n\nsvg.animation-ui g:first-child:hover path.animation-keyframe {\n fill-opacity: 0.4;\n}\n\n.animation-node-selected path.animation-keyframe {\n fill-opacity: 0.4;\n}\n\nline.animation-line {\n stroke-width: 2px;\n stroke-linecap: round;\n fill: none;\n}\n\nline.animation-delay-line {\n stroke-width: 2px;\n stroke-dasharray: 6, 4;\n}\n\nline.animation-delay-line.animation-fill {\n stroke-dasharray: none;\n}\n\ncircle.animation-endpoint, circle.animation-keyframe-point {\n stroke-width: 2px;\n transition: transform 100ms cubic-bezier(0, 0, 0.2, 1);\n transform: scale(1);\n transform-origin: 50% 50%;\n}\n\n.animation-ui circle.animation-endpoint:hover, .animation-ui circle.animation-keyframe-point:hover {\n transform: scale(1.2);\n}\n\ncircle.animation-endpoint:active, circle.animation-keyframe-point:active {\n transform: scale(1);\n}\n\ncircle.animation-keyframe-point {\n fill: white;\n}\n\n.animation-name {\n position: absolute;\n top: 8px;\n color: #333;\n text-align: center;\n margin-left: -8px;\n white-space: nowrap;\n}\n\n.animation-timeline-toolbar-container {\n display: flex;\n border-bottom: 1px solid #ccc;\n flex: 0 0;\n}\n\n.animation-timeline-toolbar {\n display: inline-block;\n}\n\n.animation-timeline-header {\n height: 28px;\n border-bottom: 1px solid #ccc;\n flex-shrink: 0;\n display: flex;\n}\n\n.animation-timeline-header:after {\n content: \"\";\n height: calc(100% - 48px - 28px);\n position: absolute;\n width: 150px;\n left: 0;\n margin-top: 28px;\n background-color: hsl(0, 0%, 98%);\n z-index: 0;\n border-right: 1px solid hsl(0, 0%, 90%);\n}\n\n.animation-controls {\n flex: 0 0 150px;\n position: relative;\n display: flex;\n justify-content: flex-end;\n padding-right: 8px;\n}\n\n.animation-timeline-current-time {flex: 0 0 auto;line-height: 28px;margin-right: 5px;}\n.animation-grid-header {\n flex: 1 0 auto;\n z-index: 1;\n cursor: text;\n}\n\n.animation-timeline-buffer, .animation-timeline-buffer-hint {\n height: 48px;\n flex: 0 0 auto;\n border-bottom: 1px solid #ccc;\n display: flex;\n padding: 0 2px;\n}\n\n.animation-timeline-buffer:empty, .animation-timeline-buffer-hint {\n display: none;\n}\n\n.animation-timeline-buffer:empty ~ .animation-timeline-buffer-hint {\n align-items: center;\n justify-content: center;\n font-size: 14px;\n z-index: 101;\n display: flex;\n}\n\n.animation-time-overlay {\n background-color: black;\n opacity: 0.05;\n position: absolute;\n height: 100%;\n width: 100%;\n z-index: -1;\n}\n\n.animation-timeline-end > .animation-time-overlay {\n visibility: hidden;\n}\n\n.animation-scrubber {\n opacity: 1;\n position: absolute;\n left: 150px;\n height: calc(100% - 103px);\n width: calc(100% - 150px);\n top: 103px;\n border-left: 1px solid hsla(4,90%,58%,1);\n z-index: 1;\n}\n\n.animation-scrubber-line {\n width: 11px;\n background: linear-gradient(to right, transparent 5px, hsla(4,90%,58%,1) 5px, hsla(4,90%,58%,1) 6px, transparent 6px);\n position: absolute;\n top: -28px;\n height: 28px;\n left: -6px;\n padding: 0 5px;\n z-index: 2;\n}\n\n.animation-scrubber-head {\n width: 7px;\n height: 7px;\n transform: rotate(45deg);\n background: red;\n position: absolute;\n left: 2px;\n top: 1px;\n}\n\nsvg.animation-timeline-grid {\n position: absolute;\n left: 140px;\n top: 76px;\n z-index: 0;\n}\n\nrect.animation-timeline-grid-line {\n fill: hsla(0,0%,93%,1);\n}\n\n.animation-timeline-row > svg.animation-ui {\n position: absolute;\n}\n\n.animation-node-timeline {\n flex-grow: 1;\n}\n\n.animation-node-description > div {\n position: absolute;\n top: 50%;\n transform: translateY(-50%);\n max-height: 100%;\n}\n\n.animation-node-removed {\n -webkit-filter: saturate(0);\n cursor: not-allowed;\n}\n\nsvg.animation-ui g:first-child {\n opacity: 1;\n}\n\n.animation-tail-iterations {\n opacity: 0.5;\n}\n\n.animation-keyframe-step line {\n stroke-width: 2;\n stroke-opacity: 0.3;\n}\n\ntext.animation-timeline-grid-label {\n font-size: 10px;\n fill: #5a5a5a;\n text-anchor: middle;\n}\n\n.animation-timeline-rows, .animation-timeline-rows-hint {\n flex-grow: 1;\n overflow-y: auto;\n z-index: 1;\n overflow-x: hidden;\n}\n\n.animation-timeline-rows-hint {\n display: none;\n}\n\n.animation-timeline-buffer:not(:empty) ~ .animation-timeline-rows:empty {\n flex-grow: 0;\n}\n\n.animation-timeline-buffer:not(:empty) ~ .animation-timeline-rows:empty ~ .animation-timeline-rows-hint {\n font-size: 14px;\n display: flex;\n align-items: center;\n justify-content: center;\n margin-left: 150px;\n padding: 10px;\n}\n\n.toolbar.animation-controls-toolbar {\n flex: 0 0 auto;\n}\n\n.animation-node-row.animation-node-selected {\n background-color: hsla(216, 71%, 53%, 0.08);\n}\n\n.animation-node-selected > .animation-node-description {\n background-color: #EFF4FD;\n}\n\n.animation-timeline-empty-message {\n padding-left: 230px;\n padding-right: 30px;\n text-align: center;\n position: absolute;\n font-size: 20px;\n line-height: 32px;\n align-items: center; justify-content: center;\n width: 100%;\n height: calc(100% - 44px);\n display: flex;\n}\n\n.animation-buffer-preview {\n height: 40px;\n margin: 4px 2px;\n background-color: #F3F3F3;\n border-radius: 2px;\n flex: 1 1;\n padding: 4px;\n max-width: 100px;\n animation: newGroupAnim 200ms;\n position: relative;\n}\n\n.animation-buffer-preview-animation {\n width: 100%;\n height: 100%;\n border-radius: 2px 0 0 2px;\n position: absolute;\n top: 0;\n left: 0;\n background: hsla(219, 100%, 66%, 0.27);\n opacity: 0;\n border-right: 1px solid #A7A7A7;\n cursor: pointer;\n}\n\n.animation-buffer-preview:not(.selected):hover {\n background-color: hsla(217,90%,92%,1);\n}\n\n.animation-buffer-preview.selected {\n background-color: hsl(217, 89%, 61%);\n}\n\n.animation-paused {\n display: flex;\n align-items: center;\n justify-content: center;\n background-color: hsla(0,0%,70%,0.5);\n display: none;\n}\n\n.animation-paused:before, .animation-paused:after {\n content: \"\";\n background: hsl(0, 100%, 100%);\n width: 7px;\n height: 20px;\n border-radius: 2px;\n margin: 2px;\n border: 1px solid #ccc;\n}\n\n.animation-buffer-preview.paused .animation-paused {\n display: flex;\n}\n\n.animation-buffer-preview.selected > svg > line {\n stroke: white !important;\n}\n\n.animation-buffer-preview > svg > line {\n stroke-width: 1px;\n}\n\n@keyframes newGroupAnim {\n from {\n -webkit-clip-path: polygon(0% 0%, 0% 100%, 0% 100%, 0% 0%);\n }\n to {\n -webkit-clip-path: polygon(0% 0%, 0% 100%, 100% 100%, 100% 0%);\n }\n}\n\n.animation-playback-rate-control {\n margin: 4px 0 4px 2px;\n display: flex;\n width: 120px;\n}\n\n.animation-playback-rate-button:first-child {\n border-radius: 4px 0 0 4px;\n}\n\n.animation-playback-rate-button:last-child {\n border-radius: 0 4px 4px 0;\n}\n\n.animation-playback-rate-button {\n border: 1px solid #ccc;\n display: inline-block;\n margin-right: -1px;\n padding: 1px 4px;\n background: white;\n flex: 1 0 auto;\n text-align: center;\n cursor: pointer;\n}\n\n.animation-playback-rate-button:not(.selected):hover {\n background: hsl(211, 100%, 95%);\n}\n\n.animation-playback-rate-button.selected {\n color: hsl(0, 100%, 100%);\n background-color: hsl(217, 89%, 61%);\n border-color: hsl(217, 89%, 61%);\n z-index: 1;\n}\n\n.animation-playback-rate-button.selected:first-child {\n color: hsl(217, 89%, 61%);\n background-color: hsl(217, 89%, 100%);\n}\n\n.animation-remove-button {\n position: absolute;\n top: -3px;\n right: -3px;\n background: #7B7B7B;\n border-radius: 12px;\n height: 16px;\n width: 16px;\n align-items: center;\n font-size: 10px;\n justify-content: center;\n box-shadow: 0 1px 4px 0 rgb(185, 185, 185);\n z-index: 100;\n display: none;\n cursor: pointer;\n font-weight: 700;\n color: white;\n}\n\n.animation-remove-button:hover {\n background: #585858;\n}\n\n.animation-buffer-preview:hover .animation-remove-button {\n display: flex;\n}\n\n/*# sourceURL=animation/animationTimeline.css */";
\ No newline at end of file
diff --git a/src/cobalt/debug/content/devtools/audits2/audits2_module.js b/src/cobalt/debug/content/devtools/audits2/audits2_module.js
deleted file mode 100644
index 8442c06..0000000
--- a/src/cobalt/debug/content/devtools/audits2/audits2_module.js
+++ /dev/null
@@ -1,221 +0,0 @@
-'use strict';const ELLIPSIS='\u2026';const NBSP='\xa0';const RATINGS={PASS:{label:'pass',minScore:75},AVERAGE:{label:'average',minScore:45},FAIL:{label:'fail'},};class Util{static calculateRating(score){let rating=RATINGS.FAIL.label;if(score>=RATINGS.PASS.minScore){rating=RATINGS.PASS.label;}else if(score>=RATINGS.AVERAGE.minScore){rating=RATINGS.AVERAGE.label;}
-return rating;}
-static formatNumber(number,decimalPlaces=1){return number.toLocaleString(undefined,{maximumFractionDigits:decimalPlaces});}
-static formatBytesToKB(size,decimalPlaces=2){const kbs=(size/1024).toLocaleString(undefined,{maximumFractionDigits:decimalPlaces});return`${kbs}${NBSP}KB`;}
-static formatMilliseconds(ms,granularity=10){const coarseTime=Math.round(ms/granularity)*granularity;return`${coarseTime.toLocaleString()}${NBSP}ms`;}
-static formatDateTime(date){const options={month:'short',day:'numeric',year:'numeric',hour:'numeric',minute:'numeric',timeZoneName:'short',};let formatter=new Intl.DateTimeFormat('en-US',options);const tz=formatter.resolvedOptions().timeZone;if(!tz||tz.toLowerCase()==='etc/unknown'){options.timeZone='UTC';formatter=new Intl.DateTimeFormat('en-US',options);}
-return formatter.format(new Date(date));}
-static getURLDisplayName(parsedUrl,options={}){const numPathParts=options.numPathParts!==undefined?options.numPathParts:2;const preserveQuery=options.preserveQuery!==undefined?options.preserveQuery:true;const preserveHost=options.preserveHost||false;let name;if(parsedUrl.protocol==='about:'||parsedUrl.protocol==='data:'){name=parsedUrl.href;}else{name=parsedUrl.pathname;const parts=name.split('/').filter(part=>part.length);if(numPathParts&&parts.length>numPathParts){name=ELLIPSIS+parts.slice(-1*numPathParts).join('/');}
-if(preserveHost){name=`${parsedUrl.host}/${name.replace(/^\//, '')}`;}
-if(preserveQuery){name=`${name}${parsedUrl.search}`;}}
-const MAX_LENGTH=64;name=name.replace(/([a-f0-9]{7})[a-f0-9]{13}[a-f0-9]*/g,`$1${ELLIPSIS}`);if(name.length>MAX_LENGTH&&name.includes('?')){name=name.replace(/\?([^=]*)(=)?.*/,`?$1$2${ELLIPSIS}`);if(name.length>MAX_LENGTH){name=name.replace(/\?.*/,`?${ELLIPSIS}`);}}
-if(name.length>MAX_LENGTH){const dotIndex=name.lastIndexOf('.');if(dotIndex>=0){name=name.slice(0,MAX_LENGTH-1-(name.length-dotIndex))+`${ELLIPSIS}${name.slice(dotIndex)}`;}else{name=name.slice(0,MAX_LENGTH-1)+ELLIPSIS;}}
-return name;}
-static parseURL(url){const parsedUrl=new URL(url);return{file:Util.getURLDisplayName(parsedUrl),hostname:parsedUrl.hostname};}
-static chainDuration(startTime,endTime){return Util.formatNumber((endTime-startTime)*1000);}}
-if(typeof module!=='undefined'&&module.exports){module.exports=Util;}else{self.Util=Util;};'use strict';class DOM{constructor(document){this._document=document;}
-createElement(name,className,attrs={}){const element=this._document.createElement(name);if(className){element.className=className;}
-Object.keys(attrs).forEach(key=>{const value=attrs[key];if(typeof value!=='undefined'){element.setAttribute(key,value);}});return element;}
-createChildOf(parentElem,elementName,className,attrs){const element=this.createElement(elementName,className,attrs);parentElem.appendChild(element);return element;}
-cloneTemplate(selector,context){const template=(context.querySelector(selector));if(!template){throw new Error(`Template not found: template${selector}`);}
-const clone=(this._document.importNode(template.content,true));if(template.hasAttribute('data-stamped')){this.findAll('style',clone).forEach(style=>style.remove());}
-template.setAttribute('data-stamped',true);return clone;}
-resetTemplates(){this.findAll('template[data-stamped]',this._document).forEach(t=>{t.removeAttribute('data-stamped');});}
-convertMarkdownLinkSnippets(text){const element=this.createElement('span');const parts=text.split(/\[([^\]]*?)\]\((https?:\/\/.*?)\)/g);while(parts.length){const[preambleText,linkText,linkHref]=parts.splice(0,3);element.appendChild(this._document.createTextNode(preambleText));if(linkText&&linkHref){const a=(this.createElement('a'));a.rel='noopener';a.target='_blank';a.textContent=linkText;a.href=(new URL(linkHref)).href;element.appendChild(a);}}
-return element;}
-convertMarkdownCodeSnippets(text){const element=this.createElement('span');const parts=text.split(/`(.*?)`/g);while(parts.length){const[preambleText,codeText]=parts.splice(0,2);element.appendChild(this._document.createTextNode(preambleText));if(codeText){const pre=(this.createElement('code'));pre.textContent=codeText;element.appendChild(pre);}}
-return element;}
-document(){return this._document;}
-find(query,context){const result=context.querySelector(query);if(result===null){throw new Error(`query ${query} not found`);}
-return result;}
-findAll(query,context){return Array.from(context.querySelectorAll(query));}}
-if(typeof module!=='undefined'&&module.exports){module.exports=DOM;}else{self.DOM=DOM;};'use strict';class CategoryRenderer{constructor(dom,detailsRenderer){this._dom=dom;this._detailsRenderer=detailsRenderer;this._templateContext=this._dom.document();this._detailsRenderer.setTemplateContext(this._templateContext);}
-_renderAuditScore(audit){const tmpl=this._dom.cloneTemplate('#tmpl-lh-audit-score',this._templateContext);const scoringMode=audit.result.scoringMode;const description=audit.result.helpText;let title=audit.result.description;if(audit.result.displayValue){title+=`: ${audit.result.displayValue}`;}
-if(audit.result.optimalValue){title+=` (target: ${audit.result.optimalValue})`;}
-if(audit.result.debugString){const debugStrEl=tmpl.appendChild(this._dom.createElement('div','lh-debug'));debugStrEl.textContent=audit.result.debugString;}
-const header=(this._dom.find('.lh-score__header',tmpl));if(audit.result.details){header.appendChild(this._detailsRenderer.render(audit.result.details));}
-const scoreEl=this._dom.find('.lh-score',tmpl);if(audit.result.informative){scoreEl.classList.add('lh-score--informative');}
-if(audit.result.manual){scoreEl.classList.add('lh-score--manual');}
-return this._populateScore(tmpl,audit.score,scoringMode,title,description);}
-_populateScore(element,score,scoringMode,title,description){const valueEl=this._dom.find('.lh-score__value',element);valueEl.textContent=Util.formatNumber(score);valueEl.classList.add(`lh-score__value--${Util.calculateRating(score)}`,`lh-score__value--${scoringMode}`);this._dom.find('.lh-score__title',element).appendChild(this._dom.convertMarkdownCodeSnippets(title));this._dom.find('.lh-score__description',element).appendChild(this._dom.convertMarkdownLinkSnippets(description));return(element);}
-_renderCategoryScore(category){const tmpl=this._dom.cloneTemplate('#tmpl-lh-category-score',this._templateContext);const score=Math.round(category.score);const gaugeContainerEl=this._dom.find('.lh-score__gauge',tmpl);const gaugeEl=this.renderScoreGauge(category);gaugeContainerEl.appendChild(gaugeEl);return this._populateScore(tmpl,score,'numeric',category.name,category.description);}
-_renderAudit(audit){const element=this._dom.createElement('div','lh-audit');element.appendChild(this._renderAuditScore(audit));return element;}
-_renderTimelineMetricAudit(audit,scale){const tmpl=this._dom.cloneTemplate('#tmpl-lh-timeline-metric',this._templateContext);const element=this._dom.find('.lh-timeline-metric',tmpl);element.classList.add(`lh-timeline-metric--${Util.calculateRating(audit.score)}`);const titleEl=this._dom.find('.lh-timeline-metric__title',tmpl);titleEl.textContent=audit.result.description;const valueEl=this._dom.find('.lh-timeline-metric__value',tmpl);valueEl.textContent=audit.result.displayValue;const descriptionEl=this._dom.find('.lh-timeline-metric__description',tmpl);descriptionEl.appendChild(this._dom.convertMarkdownLinkSnippets(audit.result.helpText));if(typeof audit.result.rawValue!=='number'){const debugStrEl=this._dom.createChildOf(element,'div','lh-debug');debugStrEl.textContent=audit.result.debugString||'Report error: no metric information';return element;}
-const sparklineBarEl=this._dom.find('.lh-sparkline__bar',tmpl);sparklineBarEl.style.width=`${audit.result.rawValue / scale * 100}%`;return element;}
-_renderPerfHintAudit(audit,scale){const extendedInfo=(audit.result.extendedInfo);const tooltipAttrs={title:audit.result.displayValue};const element=this._dom.createElement('details',['lh-perf-hint',`lh-perf-hint--${Util.calculateRating(audit.score)}`,'lh-expandable-details',].join(' '));const summary=this._dom.createChildOf(element,'summary','lh-perf-hint__summary '+'lh-expandable-details__summary');const titleEl=this._dom.createChildOf(summary,'div','lh-perf-hint__title');titleEl.textContent=audit.result.description;this._dom.createChildOf(summary,'div','lh-toggle-arrow',{title:'See resources'});if(!extendedInfo||typeof audit.result.rawValue!=='number'){const debugStrEl=this._dom.createChildOf(summary,'div','lh-debug');debugStrEl.textContent=audit.result.debugString||'Report error: no extended information';return element;}
-const sparklineContainerEl=this._dom.createChildOf(summary,'div','lh-perf-hint__sparkline',tooltipAttrs);const sparklineEl=this._dom.createChildOf(sparklineContainerEl,'div','lh-sparkline');const sparklineBarEl=this._dom.createChildOf(sparklineEl,'div','lh-sparkline__bar');sparklineBarEl.style.width=audit.result.rawValue/scale*100+'%';const statsEl=this._dom.createChildOf(summary,'div','lh-perf-hint__stats',tooltipAttrs);const statsMsEl=this._dom.createChildOf(statsEl,'div','lh-perf-hint__primary-stat');statsMsEl.textContent=Util.formatMilliseconds(audit.result.rawValue);if(extendedInfo.value.wastedKb){const statsKbEl=this._dom.createChildOf(statsEl,'div','lh-perf-hint__secondary-stat');statsKbEl.textContent=Util.formatNumber(extendedInfo.value.wastedKb)+' KB';}
-const descriptionEl=this._dom.createChildOf(element,'div','lh-perf-hint__description');descriptionEl.appendChild(this._dom.convertMarkdownLinkSnippets(audit.result.helpText));if(audit.result.debugString){const debugStrEl=this._dom.createChildOf(summary,'div','lh-debug');debugStrEl.textContent=audit.result.debugString;}
-if(audit.result.details){element.appendChild(this._detailsRenderer.render(audit.result.details));}
-return element;}
-_renderAuditGroup(group,opts){const expandable=opts.expandable;const element=this._dom.createElement(expandable?'details':'div','lh-audit-group');const summmaryEl=this._dom.createChildOf(element,'summary','lh-audit-group__summary');const headerEl=this._dom.createChildOf(summmaryEl,'div','lh-audit-group__header');this._dom.createChildOf(summmaryEl,'div',`lh-toggle-arrow ${expandable ? '' : ' lh-toggle-arrow-unexpandable'}`,{title:'See audits',});if(group.description){const auditGroupDescription=this._dom.createElement('div','lh-audit-group__description');auditGroupDescription.appendChild(this._dom.convertMarkdownLinkSnippets(group.description));element.appendChild(auditGroupDescription);}
-headerEl.textContent=group.title;return element;}
-_renderPassedAuditsSection(elements){const passedElem=this._renderAuditGroup({title:`${elements.length} Passed Audits`,},{expandable:true});passedElem.classList.add('lh-passed-audits');elements.forEach(elem=>passedElem.appendChild(elem));return passedElem;}
-_renderManualAudits(manualAudits,groupDefinitions,element){const auditsGroupedByGroup=({});manualAudits.forEach(audit=>{const group=auditsGroupedByGroup[audit.group]||[];group.push(audit);auditsGroupedByGroup[audit.group]=group;});Object.keys(auditsGroupedByGroup).forEach(groupId=>{const group=groupDefinitions[groupId];const auditGroupElem=this._renderAuditGroup(group,{expandable:true});auditGroupElem.classList.add('lh-audit-group--manual');auditsGroupedByGroup[groupId].forEach(audit=>{auditGroupElem.appendChild(this._renderAudit(audit));});element.appendChild(auditGroupElem);});}
-setTemplateContext(context){this._templateContext=context;this._detailsRenderer.setTemplateContext(context);}
-renderScoreGauge(category){const tmpl=this._dom.cloneTemplate('#tmpl-lh-gauge',this._templateContext);this._dom.find('.lh-gauge__wrapper',tmpl).href=`#${category.id}`;this._dom.find('.lh-gauge__label',tmpl).textContent=category.name;const score=Math.round(category.score);const fillRotation=Math.floor((score/100)*180);const gauge=this._dom.find('.lh-gauge',tmpl);gauge.setAttribute('data-progress',score);gauge.classList.add(`lh-gauge--${Util.calculateRating(score)}`);this._dom.findAll('.lh-gauge__fill',gauge).forEach(el=>{el.style.transform=`rotate(${fillRotation}deg)`;});this._dom.find('.lh-gauge__mask--full',gauge).style.transform=`rotate(${fillRotation}deg)`;this._dom.find('.lh-gauge__fill--fix',gauge).style.transform=`rotate(${fillRotation * 2}deg)`;this._dom.find('.lh-gauge__percentage',gauge).textContent=score;return tmpl;}
-render(category,groups){switch(category.id){case'performance':return this._renderPerformanceCategory(category,groups);case'accessibility':return this._renderAccessibilityCategory(category,groups);default:return this._renderDefaultCategory(category,groups);}}
-_renderDefaultCategory(category,groupDefinitions){const element=this._dom.createElement('div','lh-category');this._createPermalinkSpan(element,category.id);element.appendChild(this._renderCategoryScore(category));const manualAudits=category.audits.filter(audit=>audit.result.manual);const nonManualAudits=category.audits.filter(audit=>!manualAudits.includes(audit));const passedAudits=nonManualAudits.filter(audit=>audit.score===100&&!audit.result.debugString);const nonPassedAudits=nonManualAudits.filter(audit=>!passedAudits.includes(audit));const nonPassedElem=this._renderAuditGroup({title:`${nonPassedAudits.length} Failed Audits`,},{expandable:false});nonPassedElem.classList.add('lh-failed-audits');nonPassedAudits.forEach(audit=>nonPassedElem.appendChild(this._renderAudit(audit)));element.appendChild(nonPassedElem);if(passedAudits.length){const passedElem=this._renderPassedAuditsSection(passedAudits.map(audit=>this._renderAudit(audit)));element.appendChild(passedElem);}
-this._renderManualAudits(manualAudits,groupDefinitions,element);return element;}
-_renderPerformanceCategory(category,groups){const element=this._dom.createElement('div','lh-category');this._createPermalinkSpan(element,category.id);element.appendChild(this._renderCategoryScore(category));const metricAudits=category.audits.filter(audit=>audit.group==='perf-metric');const metricAuditsEl=this._renderAuditGroup(groups['perf-metric'],{expandable:false});const timelineContainerEl=this._dom.createChildOf(metricAuditsEl,'div','lh-timeline-container');const timelineEl=this._dom.createChildOf(timelineContainerEl,'div','lh-timeline');let perfTimelineScale=0;metricAudits.forEach(audit=>{if(typeof audit.result.rawValue==='number'&&audit.result.rawValue){perfTimelineScale=Math.max(perfTimelineScale,audit.result.rawValue);}});const thumbnailAudit=category.audits.find(audit=>audit.id==='screenshot-thumbnails');const thumbnailResult=thumbnailAudit&&thumbnailAudit.result;if(thumbnailResult&&thumbnailResult.details){const thumbnailDetails=(thumbnailResult.details);perfTimelineScale=Math.max(perfTimelineScale,thumbnailDetails.scale);const filmstripEl=this._detailsRenderer.render(thumbnailDetails);timelineEl.appendChild(filmstripEl);}
-metricAudits.forEach(item=>{if(item.id==='speed-index-metric'||item.id==='estimated-input-latency'){return metricAuditsEl.appendChild(this._renderAudit(item));}
-timelineEl.appendChild(this._renderTimelineMetricAudit(item,perfTimelineScale));});metricAuditsEl.open=true;element.appendChild(metricAuditsEl);const hintAudits=category.audits.filter(audit=>audit.group==='perf-hint'&&audit.score<100).sort((auditA,auditB)=>auditB.result.rawValue-auditA.result.rawValue);if(hintAudits.length){const maxWaste=Math.max(...hintAudits.map(audit=>audit.result.rawValue));const scale=Math.ceil(maxWaste/1000)*1000;const hintAuditsEl=this._renderAuditGroup(groups['perf-hint'],{expandable:false});hintAudits.forEach(item=>hintAuditsEl.appendChild(this._renderPerfHintAudit(item,scale)));hintAuditsEl.open=true;element.appendChild(hintAuditsEl);}
-const infoAudits=category.audits.filter(audit=>audit.group==='perf-info'&&audit.score<100);if(infoAudits.length){const infoAuditsEl=this._renderAuditGroup(groups['perf-info'],{expandable:false});infoAudits.forEach(item=>infoAuditsEl.appendChild(this._renderAudit(item)));infoAuditsEl.open=true;element.appendChild(infoAuditsEl);}
-const passedElements=category.audits.filter(audit=>(audit.group==='perf-hint'||audit.group==='perf-info')&&audit.score===100).map(audit=>this._renderAudit(audit));if(!passedElements.length)return element;const passedElem=this._renderPassedAuditsSection(passedElements);element.appendChild(passedElem);return element;}
-_renderAccessibilityCategory(category,groupDefinitions){const element=this._dom.createElement('div','lh-category');this._createPermalinkSpan(element,category.id);element.appendChild(this._renderCategoryScore(category));const auditsGroupedByGroup=({});category.audits.forEach(audit=>{const groupId=audit.group;const groups=auditsGroupedByGroup[groupId]||{passed:[],failed:[]};if(audit.score===100){groups.passed.push(audit);}else{groups.failed.push(audit);}
-auditsGroupedByGroup[groupId]=groups;});const passedElements=([]);Object.keys(auditsGroupedByGroup).forEach(groupId=>{const group=groupDefinitions[groupId];const groups=auditsGroupedByGroup[groupId];if(groups.failed.length){const auditGroupElem=this._renderAuditGroup(group,{expandable:false});groups.failed.forEach(item=>auditGroupElem.appendChild(this._renderAudit(item)));auditGroupElem.open=true;element.appendChild(auditGroupElem);}
-if(groups.passed.length){const auditGroupElem=this._renderAuditGroup(group,{expandable:true});groups.passed.forEach(item=>auditGroupElem.appendChild(this._renderAudit(item)));passedElements.push(auditGroupElem);}});if(!passedElements.length)return element;const passedElem=this._renderPassedAuditsSection(passedElements);element.appendChild(passedElem);return element;}
-_createPermalinkSpan(element,id){const permalinkEl=this._dom.createChildOf(element,'span','lh-permalink');permalinkEl.id=id;}}
-if(typeof module!=='undefined'&&module.exports){module.exports=CategoryRenderer;}else{self.CategoryRenderer=CategoryRenderer;}
-CategoryRenderer.PerfHintExtendedInfo;;'use strict';class DetailsRenderer{constructor(dom){this._dom=dom;this._templateContext;}
-setTemplateContext(context){this._templateContext=context;}
-render(details){switch(details.type){case'text':return this._renderText(details);case'url':return this._renderTextURL(details);case'link':return this._renderLink((details));case'thumbnail':return this._renderThumbnail((details));case'filmstrip':return this._renderFilmstrip((details));case'cards':return this._renderCards((details));case'table':return this._renderTable((details));case'code':return this._renderCode(details);case'node':return this.renderNode((details));case'criticalrequestchain':return CriticalRequestChainRenderer.render(this._dom,this._templateContext,(details));case'list':return this._renderList((details));default:throw new Error(`Unknown type: ${details.type}`);}}
-_renderTextURL(text){const url=text.text||'';let displayedURL;let title;try{displayedURL=Util.parseURL(url).file;title=url;}catch(e){if(!(e instanceof TypeError)){throw e;}
-displayedURL=url;}
-const element=this._renderText({type:'url',text:displayedURL,});element.classList.add('lh-text__url');if(title){element.title=url;}
-return element;}
-_renderLink(details){const allowedProtocols=['https:','http:'];const url=new URL(details.url);if(!allowedProtocols.includes(url.protocol)){return this._renderText(details);}
-const a=(this._dom.createElement('a'));a.rel='noopener';a.target='_blank';a.textContent=details.text;a.href=url.href;return a;}
-_renderText(text){const element=this._dom.createElement('div','lh-text');element.textContent=text.text;return element;}
-_renderThumbnail(value){if(/^image/.test(value.mimeType)===false){return this._dom.createElement('span');}
-const element=this._dom.createElement('img','lh-thumbnail');element.src=value.url;element.alt='';element.title=value.url;return element;}
-_renderList(list){if(!list.items.length)return this._dom.createElement('span');const element=this._dom.createElement('details','lh-details');element.open=true;if(list.header){const summary=this._dom.createElement('summary','lh-list__header');summary.textContent=list.header.text;element.appendChild(summary);}
-const itemsElem=this._dom.createChildOf(element,'div','lh-list__items');for(const item of list.items){const itemElem=this._dom.createChildOf(itemsElem,'span','lh-list__item');itemElem.appendChild(this.render(item));}
-return element;}
-_renderTable(details){if(!details.items.length)return this._dom.createElement('span');const element=this._dom.createElement('details','lh-details');element.open=true;if(details.header){element.appendChild(this._dom.createElement('summary')).textContent=details.header;}
-const tableElem=this._dom.createChildOf(element,'table','lh-table');const theadElem=this._dom.createChildOf(tableElem,'thead');const theadTrElem=this._dom.createChildOf(theadElem,'tr');for(const heading of details.itemHeaders){const itemType=heading.itemType||'text';const classes=`lh-table-column--${itemType}`;this._dom.createChildOf(theadTrElem,'th',classes).appendChild(this.render(heading));}
-const tbodyElem=this._dom.createChildOf(tableElem,'tbody');for(const row of details.items){const rowElem=this._dom.createChildOf(tbodyElem,'tr');for(const columnItem of row){const classes=`lh-table-column--${columnItem.type}`;this._dom.createChildOf(rowElem,'td',classes).appendChild(this.render(columnItem));}}
-return element;}
-renderNode(item){const element=this._dom.createElement('span','lh-node');element.textContent=item.snippet;element.title=item.selector;if(item.text)element.setAttribute('data-text',item.text);if(item.path)element.setAttribute('data-path',item.path);if(item.selector)element.setAttribute('data-selector',item.selector);if(item.snippet)element.setAttribute('data-snippet',item.snippet);return element;}
-_renderCards(details){const element=this._dom.createElement('details','lh-details');element.open=true;if(details.header){element.appendChild(this._dom.createElement('summary')).textContent=details.header.text;}
-const cardsParent=this._dom.createElement('div','lh-scorecards');for(const item of details.items){const card=cardsParent.appendChild(this._dom.createElement('div','lh-scorecard',{title:item.snippet}));const titleEl=this._dom.createElement('div','lh-scorecard__title');const valueEl=this._dom.createElement('div','lh-scorecard__value');const targetEl=this._dom.createElement('div','lh-scorecard__target');card.appendChild(titleEl).textContent=item.title;card.appendChild(valueEl).textContent=item.value;if(item.target){card.appendChild(targetEl).textContent=`target: ${item.target}`;}}
-element.appendChild(cardsParent);return element;}
-_renderFilmstrip(details){const filmstripEl=this._dom.createElement('div','lh-filmstrip');for(const thumbnail of details.items){const frameEl=this._dom.createChildOf(filmstripEl,'div','lh-filmstrip__frame');let timing=Util.formatMilliseconds(thumbnail.timing,1);if(thumbnail.timing>1000){timing=Util.formatNumber(thumbnail.timing/1000)+' s';}
-const timingEl=this._dom.createChildOf(frameEl,'div','lh-filmstrip__timestamp');timingEl.textContent=timing;const base64data=thumbnail.data;this._dom.createChildOf(frameEl,'img','lh-filmstrip__thumbnail',{src:`data:image/jpeg;base64,${base64data}`,alt:`Screenshot at ${timing}`,});}
-return filmstripEl;}
-_renderCode(details){const pre=this._dom.createElement('pre','lh-code');pre.textContent=details.text;return pre;}}
-if(typeof module!=='undefined'&&module.exports){module.exports=DetailsRenderer;}else{self.DetailsRenderer=DetailsRenderer;}
-DetailsRenderer.DetailsJSON;DetailsRenderer.ListDetailsJSON;DetailsRenderer.NodeDetailsJSON;DetailsRenderer.CardsDetailsJSON;DetailsRenderer.TableHeaderJSON;DetailsRenderer.NodeDetailsJSON;DetailsRenderer.TableDetailsJSON;DetailsRenderer.ThumbnailDetails;DetailsRenderer.LinkDetailsJSON;DetailsRenderer.FilmstripDetails;;'use strict';class CriticalRequestChainRenderer{static initTree(tree){let startTime=0;const rootNodes=Object.keys(tree);if(rootNodes.length>0){const node=tree[rootNodes[0]];startTime=node.request.startTime;}
-return{tree,startTime,transferSize:0};}
-static createSegment(parent,id,startTime,transferSize,treeMarkers,parentIsLastChild){const node=parent[id];const siblings=Object.keys(parent);const isLastChild=siblings.indexOf(id)===(siblings.length-1);const hasChildren=Object.keys(node.children).length>0;const newTreeMarkers=Array.isArray(treeMarkers)?treeMarkers.slice(0):[];if(typeof parentIsLastChild!=='undefined'){newTreeMarkers.push(!parentIsLastChild);}
-return{node,isLastChild,hasChildren,startTime,transferSize:transferSize+node.request.transferSize,treeMarkers:newTreeMarkers,};}
-static createChainNode(dom,tmpl,segment){const chainsEl=dom.cloneTemplate('#tmpl-lh-crc__chains',tmpl);dom.find('.crc-node',chainsEl).setAttribute('title',segment.node.request.url);const treeMarkeEl=dom.find('.crc-node__tree-marker',chainsEl);segment.treeMarkers.forEach(separator=>{if(separator){treeMarkeEl.appendChild(dom.createElement('span','tree-marker vert'));treeMarkeEl.appendChild(dom.createElement('span','tree-marker'));}else{treeMarkeEl.appendChild(dom.createElement('span','tree-marker'));treeMarkeEl.appendChild(dom.createElement('span','tree-marker'));}});if(segment.isLastChild){treeMarkeEl.appendChild(dom.createElement('span','tree-marker up-right'));treeMarkeEl.appendChild(dom.createElement('span','tree-marker right'));}else{treeMarkeEl.appendChild(dom.createElement('span','tree-marker vert-right'));treeMarkeEl.appendChild(dom.createElement('span','tree-marker right'));}
-if(segment.hasChildren){treeMarkeEl.appendChild(dom.createElement('span','tree-marker horiz-down'));}else{treeMarkeEl.appendChild(dom.createElement('span','tree-marker right'));}
-const{file,hostname}=Util.parseURL(segment.node.request.url);const treevalEl=dom.find('.crc-node__tree-value',chainsEl);dom.find('.crc-node__tree-file',treevalEl).textContent=`${file}`;dom.find('.crc-node__tree-hostname',treevalEl).textContent=`(${hostname})`;if(!segment.hasChildren){const span=dom.createElement('span','crc-node__chain-duration');span.textContent=' - '+Util.chainDuration(segment.node.request.startTime,segment.node.request.endTime)+'ms, ';const span2=dom.createElement('span','crc-node__chain-duration');span2.textContent=Util.formatBytesToKB(segment.node.request.transferSize);treevalEl.appendChild(span);treevalEl.appendChild(span2);}
-return chainsEl;}
-static buildTree(dom,tmpl,segment,detailsEl,details){detailsEl.appendChild(CriticalRequestChainRenderer.createChainNode(dom,tmpl,segment));for(const key of Object.keys(segment.node.children)){const childSegment=CriticalRequestChainRenderer.createSegment(segment.node.children,key,segment.startTime,segment.transferSize,segment.treeMarkers,segment.isLastChild);CriticalRequestChainRenderer.buildTree(dom,tmpl,childSegment,detailsEl,details);}}
-static render(dom,templateContext,details){const tmpl=dom.cloneTemplate('#tmpl-lh-crc',templateContext);dom.find('.lh-crc__longest_duration',tmpl).textContent=Util.formatNumber(details.longestChain.duration)+'ms';dom.find('.lh-crc__longest_length',tmpl).textContent=details.longestChain.length;dom.find('.lh-crc__longest_transfersize',tmpl).textContent=Util.formatBytesToKB(details.longestChain.transferSize);const detailsEl=dom.find('.lh-details',tmpl);detailsEl.open=true;dom.find('.lh-details > summary',tmpl).textContent=details.header.text;const root=CriticalRequestChainRenderer.initTree(details.chains);for(const key of Object.keys(root.tree)){const segment=CriticalRequestChainRenderer.createSegment(root.tree,key,root.startTime,root.transferSize);CriticalRequestChainRenderer.buildTree(dom,tmpl,segment,detailsEl,details);}
-return tmpl;}}
-if(typeof module!=='undefined'&&module.exports){module.exports=CriticalRequestChainRenderer;}else{self.CriticalRequestChainRenderer=CriticalRequestChainRenderer;}
-CriticalRequestChainRenderer.CRCDetailsJSON;CriticalRequestChainRenderer.CRCRequest;CriticalRequestChainRenderer.CRCNode=function(){};CriticalRequestChainRenderer.CRCNode.prototype.children;CriticalRequestChainRenderer.CRCNode.prototype.request;CriticalRequestChainRenderer.CRCSegment;;'use strict';class ReportRenderer{constructor(dom,categoryRenderer){this._dom=dom;this._categoryRenderer=categoryRenderer;this._templateContext=this._dom.document();}
-renderReport(report,container){container.textContent='';const element=container.appendChild(this._renderReport(report));return(element);}
-setTemplateContext(context){this._templateContext=context;this._categoryRenderer.setTemplateContext(context);}
-_renderReportHeader(report){const header=this._dom.cloneTemplate('#tmpl-lh-heading',this._templateContext);this._dom.find('.lh-config__timestamp',header).textContent=Util.formatDateTime(report.generatedTime);const url=this._dom.find('.lh-metadata__url',header);url.href=report.url;url.textContent=report.url;this._dom.find('.lh-env__item__ua',header).textContent=report.userAgent;const env=this._dom.find('.lh-env__items',header);report.runtimeConfig.environment.forEach(runtime=>{const item=this._dom.cloneTemplate('#tmpl-lh-env__items',env);this._dom.find('.lh-env__name',item).textContent=runtime.name;this._dom.find('.lh-env__description',item).textContent=runtime.description;this._dom.find('.lh-env__enabled',item).textContent=runtime.enabled?'Enabled':'Disabled';env.appendChild(item);});return header;}
-_renderReportFooter(report){const footer=this._dom.cloneTemplate('#tmpl-lh-footer',this._templateContext);this._dom.find('.lh-footer__version',footer).textContent=report.lighthouseVersion;this._dom.find('.lh-footer__timestamp',footer).textContent=Util.formatDateTime(report.generatedTime);return footer;}
-_renderReportNav(report){const leftNav=this._dom.cloneTemplate('#tmpl-lh-leftnav',this._templateContext);this._dom.find('.leftnav__header__version',leftNav).textContent=`Version: ${report.lighthouseVersion}`;const nav=this._dom.find('.lh-leftnav',leftNav);for(const category of report.reportCategories){const itemsTmpl=this._dom.cloneTemplate('#tmpl-lh-leftnav__items',leftNav);const navItem=this._dom.find('.lh-leftnav__item',itemsTmpl);navItem.href=`#${category.id}`;this._dom.find('.leftnav-item__category',navItem).textContent=category.name;const score=this._dom.find('.leftnav-item__score',navItem);score.classList.add(`lh-score__value--${Util.calculateRating(category.score)}`);score.textContent=Math.round(category.score);nav.appendChild(navItem);}
-return leftNav;}
-_renderReport(report){const container=this._dom.createElement('div','lh-container');container.appendChild(this._renderReportHeader(report));container.appendChild(this._renderReportNav(report));const reportSection=container.appendChild(this._dom.createElement('div','lh-report'));let scoreHeader;const isSoloCategory=report.reportCategories.length===1;if(!isSoloCategory){scoreHeader=reportSection.appendChild(this._dom.createElement('div','lh-scores-header'));}
-const categories=reportSection.appendChild(this._dom.createElement('div','lh-categories'));for(const category of report.reportCategories){if(scoreHeader){scoreHeader.appendChild(this._categoryRenderer.renderScoreGauge(category));}
-categories.appendChild(this._categoryRenderer.render(category,report.reportGroups));}
-reportSection.appendChild(this._renderReportFooter(report));return container;}}
-if(typeof module!=='undefined'&&module.exports){module.exports=ReportRenderer;}else{self.ReportRenderer=ReportRenderer;}
-ReportRenderer.AuditJSON;ReportRenderer.CategoryJSON;ReportRenderer.GroupJSON;ReportRenderer.ReportJSON;;Audits2.Audits2Panel=class extends UI.Panel{constructor(){super('audits2');this.registerRequiredCSS('audits2/lighthouse/report-styles.css');this.registerRequiredCSS('audits2/audits2Panel.css');this._protocolService=new Audits2.ProtocolService();this._protocolService.registerStatusCallback(msg=>this._updateStatus(Common.UIString(msg)));var toolbar=new UI.Toolbar('',this.element);var newButton=new UI.ToolbarButton(Common.UIString('New audit\u2026'),'largeicon-add');toolbar.appendToolbarItem(newButton);newButton.addEventListener(UI.ToolbarButton.Events.Click,this._showLauncherUI.bind(this));var downloadButton=new UI.ToolbarButton(Common.UIString('Download report'),'largeicon-download');toolbar.appendToolbarItem(downloadButton);downloadButton.addEventListener(UI.ToolbarButton.Events.Click,this._downloadSelected.bind(this));toolbar.appendSeparator();this._reportSelector=new Audits2.ReportSelector();toolbar.appendToolbarItem(this._reportSelector.comboBox());var clearButton=new UI.ToolbarButton(Common.UIString('Clear all'),'largeicon-clear');toolbar.appendToolbarItem(clearButton);clearButton.addEventListener(UI.ToolbarButton.Events.Click,this._clearAll.bind(this));this._auditResultsElement=this.contentElement.createChild('div','audits2-results-container');this._dropTarget=new UI.DropTarget(this.contentElement,[UI.DropTarget.Type.File],Common.UIString('Drop audit file here'),this._handleDrop.bind(this));for(var preset of Audits2.Audits2Panel.Presets)
-preset.setting.addChangeListener(this._updateStartButtonEnabled.bind(this));this._showLandingPage();SDK.targetManager.observeModels(SDK.ServiceWorkerManager,this);SDK.targetManager.addEventListener(SDK.TargetManager.Events.InspectedURLChanged,this._updateStartButtonEnabled,this);}
-modelAdded(serviceWorkerManager){if(this._manager)
-return;this._manager=serviceWorkerManager;this._serviceWorkerListeners=[this._manager.addEventListener(SDK.ServiceWorkerManager.Events.RegistrationUpdated,this._updateStartButtonEnabled,this),this._manager.addEventListener(SDK.ServiceWorkerManager.Events.RegistrationDeleted,this._updateStartButtonEnabled,this),];this._updateStartButtonEnabled();}
-modelRemoved(serviceWorkerManager){if(!this._manager||this._manager!==serviceWorkerManager)
-return;Common.EventTarget.removeEventListeners(this._serviceWorkerListeners);this._manager=null;this._serviceWorkerListeners=null;this._updateStartButtonEnabled();}
-_hasActiveServiceWorker(){if(!this._manager)
-return false;var mainTarget=SDK.targetManager.mainTarget();if(!mainTarget)
-return false;var inspectedURL=mainTarget.inspectedURL().asParsedURL();var inspectedOrigin=inspectedURL&&inspectedURL.securityOrigin();for(var registration of this._manager.registrations().values()){if(registration.securityOrigin!==inspectedOrigin)
-continue;for(var version of registration.versions.values()){if(version.controlledClients.length>1)
-return true;}}
-return false;}
-_hasAtLeastOneCategory(){return Audits2.Audits2Panel.Presets.some(preset=>preset.setting.get());}
-_unauditablePageMessage(){if(!this._manager)
-return null;var mainTarget=SDK.targetManager.mainTarget();var inspectedURL=mainTarget&&mainTarget.inspectedURL();if(inspectedURL&&!/^(http|chrome-extension)/.test(inspectedURL)){return Common.UIString('Can only audit HTTP/HTTPS pages and Chrome extensions. '+'Navigate to a different page to start an audit.');}
-if(!Host.isUnderTest()&&!Runtime.queryParam('can_dock'))
-return Common.UIString('Can only audit tabs. Navigate to this page in a separate tab to start an audit.');return null;}
-_updateStartButtonEnabled(){var hasActiveServiceWorker=this._hasActiveServiceWorker();var hasAtLeastOneCategory=this._hasAtLeastOneCategory();var unauditablePageMessage=this._unauditablePageMessage();var isDisabled=hasActiveServiceWorker||!hasAtLeastOneCategory||!!unauditablePageMessage;if(this._dialogHelpText&&hasActiveServiceWorker){this._dialogHelpText.textContent=Common.UIString('Multiple tabs are being controlled by the same service worker. '+'Close your other tabs on the same origin to audit this page.');}
-if(this._dialogHelpText&&!hasAtLeastOneCategory)
-this._dialogHelpText.textContent=Common.UIString('At least one category must be selected.');if(this._dialogHelpText&&unauditablePageMessage)
-this._dialogHelpText.textContent=unauditablePageMessage;if(this._dialogHelpText)
-this._dialogHelpText.classList.toggle('hidden',!isDisabled);if(this._startButton)
-this._startButton.disabled=isDisabled;}
-_clearAll(){this._reportSelector.clearAll();this._showLandingPage();}
-_downloadSelected(){this._reportSelector.downloadSelected();}
-_showLandingPage(){if(this._reportSelector.comboBox().size())
-return;this._auditResultsElement.removeChildren();var landingPage=this._auditResultsElement.createChild('div','vbox audits2-landing-page');var landingCenter=landingPage.createChild('div','vbox audits2-landing-center');landingCenter.createChild('div','audits2-logo');var text=landingCenter.createChild('div','audits2-landing-text');text.createChild('span','audits2-landing-bold-text').textContent=Common.UIString('Audits');text.createChild('span').textContent=Common.UIString(' help you identify and fix common problems that affect'+' your site\'s performance, accessibility, and user experience. ');var link=text.createChild('span','link');link.textContent=Common.UIString('Learn more');link.addEventListener('click',()=>InspectorFrontendHost.openInNewTab('https://developers.google.com/web/tools/lighthouse/'));var newButton=UI.createTextButton(Common.UIString('Perform an audit\u2026'),this._showLauncherUI.bind(this),'',true);landingCenter.appendChild(newButton);this.setDefaultFocusedElement(newButton);}
-_showLauncherUI(){this._dialog=new UI.Dialog();this._dialog.setOutsideClickCallback(event=>event.consume(true));var root=UI.createShadowRootWithCoreStyles(this._dialog.contentElement,'audits2/audits2Dialog.css');var auditsViewElement=root.createChild('div','audits2-view');var closeButton=auditsViewElement.createChild('div','dialog-close-button','dt-close-button');closeButton.addEventListener('click',()=>this._cancelAndClose());var uiElement=auditsViewElement.createChild('div');var headerElement=uiElement.createChild('header');this._headerTitleElement=headerElement.createChild('p');this._headerTitleElement.textContent=Common.UIString('Audits to perform');uiElement.appendChild(headerElement);this._auditSelectorForm=uiElement.createChild('form','audits2-form');for(var preset of Audits2.Audits2Panel.Presets){preset.setting.setTitle(preset.title);var checkbox=new UI.ToolbarSettingCheckbox(preset.setting);var row=this._auditSelectorForm.createChild('div','vbox audits2-launcher-row');row.appendChild(checkbox.element);row.createChild('span','audits2-launcher-description dimmed').textContent=preset.description;}
-this._statusView=this._createStatusView(uiElement);this._dialogHelpText=uiElement.createChild('div','audits2-dialog-help-text');var buttonsRow=uiElement.createChild('div','audits2-dialog-buttons hbox');this._startButton=UI.createTextButton(Common.UIString('Run audit'),this._start.bind(this),'',true);this._startButton.autofocus=true;this._updateStartButtonEnabled();buttonsRow.appendChild(this._startButton);this._cancelButton=UI.createTextButton(Common.UIString('Cancel'),this._cancel.bind(this));buttonsRow.appendChild(this._cancelButton);this._dialog.setSizeBehavior(UI.GlassPane.SizeBehavior.SetExactWidthMaxHeight);this._dialog.setMaxContentSize(new UI.Size(500,400));this._dialog.show(this._auditResultsElement);auditsViewElement.tabIndex=0;auditsViewElement.focus();}
-_createStatusView(launcherUIElement){var statusView=launcherUIElement.createChild('div','audits2-status vbox hidden');this._statusIcon=statusView.createChild('div','icon');this._statusElement=statusView.createChild('div');this._updateStatus(Common.UIString('Loading...'));return statusView;}
-_updateInspectedURL(){var mainTarget=SDK.targetManager.mainTarget();var runtimeModel=mainTarget.model(SDK.RuntimeModel);var executionContext=runtimeModel&&runtimeModel.defaultExecutionContext();this._inspectedURL=mainTarget.inspectedURL();if(!executionContext)
-return Promise.resolve();return executionContext.evaluate({expression:'window.location.href',objectGroup:'audits',includeCommandLineAPI:false,silent:false,returnByValue:true,generatePreview:false},false,false).then(result=>{if(!result.exceptionDetails&&result.object){this._inspectedURL=result.object.value;result.object.release();}});}
-_start(){var emulationModel=self.singleton(Emulation.DeviceModeModel);this._emulationEnabledBefore=emulationModel.enabledSetting().get();this._emulationOutlineEnabledBefore=emulationModel.deviceOutlineSetting().get();emulationModel.enabledSetting().set(true);emulationModel.deviceOutlineSetting().set(true);emulationModel.toolbarControlsEnabledSetting().set(false);for(var device of Emulation.EmulatedDevicesList.instance().standard()){if(device.title==='Nexus 5X')
-emulationModel.emulate(Emulation.DeviceModeModel.Type.Device,device,device.modes[0],1);}
-this._dialog.setCloseOnEscape(false);var categoryIDs=[];for(var preset of Audits2.Audits2Panel.Presets){if(preset.setting.get())
-categoryIDs.push(preset.configID);}
-Host.userMetrics.actionTaken(Host.UserMetrics.Action.Audits2Started);return Promise.resolve().then(_=>this._updateInspectedURL()).then(_=>this._protocolService.attach()).then(_=>{this._auditRunning=true;this._updateButton();this._updateStatus(Common.UIString('Loading\u2026'));}).then(_=>this._protocolService.startLighthouse(this._inspectedURL,categoryIDs)).then(lighthouseResult=>{if(lighthouseResult&&lighthouseResult.fatal){const error=new Error(lighthouseResult.message);error.stack=lighthouseResult.stack;throw error;}
-return this._stopAndReattach().then(()=>this._buildReportUI(lighthouseResult));}).catch(err=>{if(err instanceof Error)
-this._renderBugReport(err);});}
-_hideDialog(){if(!this._dialog)
-return;this._dialog.hide();delete this._dialog;delete this._statusView;delete this._statusIcon;delete this._statusElement;delete this._startButton;delete this._cancelButton;delete this._auditSelectorForm;delete this._headerTitleElement;delete this._emulationEnabledBefore;delete this._emulationOutlineEnabledBefore;}
-_cancelAndClose(){this._cancel();this._hideDialog();}
-_cancel(){if(this._auditRunning){this._updateStatus(Common.UIString('Cancelling\u2026'));this._stopAndReattach();}else{this._hideDialog();}}
-_updateButton(){if(!this._dialog)
-return;this._startButton.classList.toggle('hidden',this._auditRunning);this._startButton.disabled=this._auditRunning;this._statusView.classList.toggle('hidden',!this._auditRunning);this._auditSelectorForm.classList.toggle('hidden',this._auditRunning);if(this._auditRunning)
-this._headerTitleElement.textContent=Common.UIString('Auditing your web page \u2026');else
-this._headerTitleElement.textContent=Common.UIString('Audits to perform');}
-_updateStatus(statusMessage){if(!this._dialog)
-return;this._statusElement.textContent=statusMessage;}
-async _stopAndReattach(){await this._protocolService.detach();var emulationModel=self.singleton(Emulation.DeviceModeModel);emulationModel.enabledSetting().set(this._emulationEnabledBefore);emulationModel.deviceOutlineSetting().set(this._emulationOutlineEnabledBefore);emulationModel.toolbarControlsEnabledSetting().set(true);Emulation.InspectedPagePlaceholder.instance().update(true);Host.userMetrics.actionTaken(Host.UserMetrics.Action.Audits2Finished);var resourceTreeModel=SDK.targetManager.mainTarget().model(SDK.ResourceTreeModel);await resourceTreeModel.navigate(this._inspectedURL);this._auditRunning=false;this._updateButton();}
-_buildReportUI(lighthouseResult){if(lighthouseResult===null){this._updateStatus(Common.UIString('Auditing failed.'));return;}
-var optionElement=new Audits2.ReportSelector.Item(lighthouseResult,this._auditResultsElement,this._showLandingPage.bind(this));this._reportSelector.prepend(optionElement);this._hideDialog();}
-_renderBugReport(err){console.error(err);this._statusElement.textContent='';this._statusIcon.classList.add('error');this._statusElement.createTextChild(Common.UIString('Ah, sorry! We ran into an error: '));this._statusElement.createChild('em').createTextChild(err.message);if(Audits2.Audits2Panel.KnownBugPatterns.some(pattern=>pattern.test(err.message))){var message=Common.UIString('Try to navigate to the URL in a fresh Chrome profile without any other tabs or '+'extensions open and try again.');this._statusElement.createChild('p').createTextChild(message);}else{this._createBugReportLink(err,this._statusElement);}}
-_createBugReportLink(err,parentElem){var baseURI='https://github.com/GoogleChrome/lighthouse/issues/new?';var title=encodeURI('title=DevTools Error: '+err.message.substring(0,60));var issueBody=`
-**Initial URL**: ${this._inspectedURL}
-**Chrome Version**: ${navigator.userAgent.match(/Chrome\/(\S+)/)[1]}
-**Error Message**: ${err.message}
-**Stack Trace**:
-\`\`\`
-${err.stack}
-\`\`\`
- `;var body='&body='+encodeURIComponent(issueBody.trim());var reportErrorEl=parentElem.createChild('a','audits2-link audits2-report-error');reportErrorEl.href=baseURI+title+body;reportErrorEl.textContent=Common.UIString('Report this bug');reportErrorEl.target='_blank';}
-_handleDrop(dataTransfer){var items=dataTransfer.items;if(!items.length)
-return;var item=items[0];if(item.kind==='file'){var entry=items[0].webkitGetAsEntry();if(!entry.isFile)
-return;entry.file(file=>{var reader=new FileReader();reader.onload=()=>this._loadedFromFile((reader.result));reader.readAsText(file);});}}
-_loadedFromFile(profile){var data=JSON.parse(profile);if(!data['lighthouseVersion'])
-return;this._buildReportUI((data));}};Audits2.Audits2Panel.ReportRenderer=class extends ReportRenderer{_renderReportNav(){return createDocumentFragment();}
-_renderReportHeader(report){return createDocumentFragment();}};class ReportUIFeatures{initFeatures(report){}}
-Audits2.Audits2Panel.KnownBugPatterns=[/Tracing already started/,/^Unable to load the page/,/^You must provide a url to the runner/,/^You probably have multiple tabs open/,];Audits2.Audits2Panel.Preset;Audits2.Audits2Panel.Presets=[{setting:Common.settings.createSetting('audits2.cat_pwa',true),configID:'pwa',title:'Progressive Web App',description:'Does this page meet the standard of a Progressive Web App'},{setting:Common.settings.createSetting('audits2.cat_perf',true),configID:'performance',title:'Performance',description:'How long does this app take to show content and become usable'},{setting:Common.settings.createSetting('audits2.cat_best_practices',true),configID:'best-practices',title:'Best practices',description:'Does this page follow best practices for modern web development'},{setting:Common.settings.createSetting('audits2.cat_a11y',true),configID:'accessibility',title:'Accessibility',description:'Is this page usable by people with disabilities or impairments'},];Audits2.ProtocolService=class extends Common.Object{constructor(){super();this._rawConnection=null;this._backend=null;this._backendPromise=null;this._status=null;}
-attach(){return SDK.targetManager.interceptMainConnection(this._dispatchProtocolMessage.bind(this)).then(rawConnection=>{this._rawConnection=rawConnection;});}
-startLighthouse(inspectedURL,categoryIDs){return this._send('start',{url:inspectedURL,categoryIDs});}
-detach(){return Promise.resolve().then(()=>this._send('stop')).then(()=>this._backend.dispose()).then(()=>{delete this._backend;delete this._backendPromise;return this._rawConnection.disconnect();});}
-registerStatusCallback(callback){this._status=callback;}
-_dispatchProtocolMessage(message){this._send('dispatchProtocolMessage',{message:message});}
-_initWorker(){this._backendPromise=Services.serviceManager.createAppService('audits2_worker','Audits2Service').then(backend=>{if(this._backend)
-return;this._backend=backend;this._backend.on('statusUpdate',result=>this._status(result.message));this._backend.on('sendProtocolMessage',result=>this._sendProtocolMessage(result.message));});}
-_sendProtocolMessage(message){this._rawConnection.sendMessage(message);}
-_send(method,params){if(!this._backendPromise)
-this._initWorker();return this._backendPromise.then(_=>this._backend.send(method,params));}};Audits2.ReportSelector=class{constructor(){this._comboBox=new UI.ToolbarComboBox(this._handleChange.bind(this),'audits2-report');this._comboBox.setMaxWidth(270);this._comboBox.setMinWidth(200);this._itemByOptionElement=new Map();}
-_handleChange(event){var item=this._selectedItem();if(item)
-item.select();}
-_selectedItem(){var option=this._comboBox.selectedOption();return this._itemByOptionElement.get(option);}
-comboBox(){return this._comboBox;}
-prepend(item){var optionEl=item.optionElement();var selectEl=this._comboBox.selectElement();this._itemByOptionElement.set(optionEl,item);selectEl.insertBefore(optionEl,selectEl.firstElementChild);this._comboBox.select(optionEl);item.select();}
-clearAll(){for(var elem of this._comboBox.options())
-this._itemByOptionElement.get(elem).delete();}
-downloadSelected(){var item=this._selectedItem();item.download();}};Audits2.ReportSelector.Item=class{constructor(lighthouseResult,resultsView,showLandingCallback){this._lighthouseResult=lighthouseResult;this._resultsView=resultsView;this._showLandingCallback=showLandingCallback;this._reportContainer=null;var url=new Common.ParsedURL(lighthouseResult.url);var timestamp=lighthouseResult.generatedTime;this._element=createElement('option');this._element.label=`${url.domain()} ${new Date(timestamp).toLocaleString()}`;}
-select(){this._renderReport();}
-optionElement(){return this._element;}
-delete(){if(this._element)
-this._element.remove();this._showLandingCallback();}
-download(){var url=new Common.ParsedURL(this._lighthouseResult.url).domain();var timestamp=this._lighthouseResult.generatedTime;var fileName=`${url}-${new Date(timestamp).toISO8601Compact()}.json`;Workspace.fileManager.save(fileName,JSON.stringify(this._lighthouseResult),true);}
-_renderReport(){this._resultsView.removeChildren();if(this._reportContainer){this._resultsView.appendChild(this._reportContainer);return;}
-this._reportContainer=this._resultsView.createChild('div','lh-vars lh-root lh-devtools');var dom=new DOM((this._resultsView.ownerDocument));var detailsRenderer=new Audits2.DetailsRenderer(dom);var categoryRenderer=new CategoryRenderer(dom,detailsRenderer);var renderer=new Audits2.Audits2Panel.ReportRenderer(dom,categoryRenderer);var templatesHTML=Runtime.cachedResources['audits2/lighthouse/templates.html'];var templatesDOM=new DOMParser().parseFromString(templatesHTML,'text/html');if(!templatesDOM)
-return;renderer.setTemplateContext(templatesDOM);renderer.renderReport(this._lighthouseResult,this._reportContainer);}};Audits2.DetailsRenderer=class extends DetailsRenderer{constructor(dom){super(dom);this._onMainFrameNavigatedPromise=null;}
-renderNode(item){var element=super.renderNode(item);this._replaceWithDeferredNodeBlock(element,item);return element;}
-async _replaceWithDeferredNodeBlock(origElement,detailsItem){var mainTarget=SDK.targetManager.mainTarget();if(!this._onMainFrameNavigatedPromise){var resourceTreeModel=mainTarget.model(SDK.ResourceTreeModel);this._onMainFrameNavigatedPromise=resourceTreeModel.once(SDK.ResourceTreeModel.Events.MainFrameNavigated);}
-await this._onMainFrameNavigatedPromise;var domModel=mainTarget.model(SDK.DOMModel);if(!detailsItem.path)
-return;var nodeId=await domModel.pushNodeByPathToFrontend(detailsItem.path);if(!nodeId)
-return;var node=domModel.nodeForId(nodeId);if(!node)
-return;var element=Components.DOMPresentationUtils.linkifyNodeReference(node,undefined,detailsItem.snippet);origElement.title='';origElement.textContent='';origElement.appendChild(element);}};;Runtime.cachedResources["audits2/audits2Dialog.css"]="/*\n * Copyright 2017 The Chromium Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style license that can be\n * found in the LICENSE file.\n */\n\n.audits2-view {\n margin: 7px 20px;\n flex: auto;\n align-items: center;\n}\n\n.audits2-view .dialog-close-button {\n position: absolute;\n top: 10px;\n right: 10px;\n}\n\nheader {\n color: #666;\n font-weight: bold;\n font-size: 14px;\n}\n\n.audits2-form label {\n display: flex;\n}\n\n.audits2-form label div {\n display: inline;\n}\n\n.audits2-status {\n flex: auto;\n align-items: center;\n color: #666;\n}\n\n.audits2-status .icon {\n width: 64px;\n height: 64px;\n margin: 20px;\n animation: spinner-animation 1200ms linear infinite;\n transform-origin: 50% 50%;\n padding: 4px;\n}\n\n.audits2-status .icon::before {\n display: inline-block;\n border: 4px solid #1565C0;\n border-radius: 28px;\n width: 56px;\n height: 56px;\n content: \"\";\n position: absolute;\n box-sizing: border-box;\n}\n\n.audits2-status .icon::after {\n display: inline-block;\n width: 24px;\n height: 28px;\n background: white;\n position: absolute;\n content: \"\";\n}\n\n.audits2-report-error {\n display: block;\n margin-top: 5px;\n}\n\nbutton {\n margin: 15px 10px;\n}\n\n.audits2-status .icon.error,\n.audits2-status .icon.error::before,\n.audits2-status .icon.error::after {\n display: none;\n}\n\n.audits2-launcher-row {\n padding: 6px;\n}\n\n.audits2-launcher-description {\n padding: 3px 0 0 22px;\n}\n\n.audits2-dialog-help-text {\n color: red;\n margin-top: 10px;\n}\n\n.audits2-dialog-buttons {\n justify-content: center;\n}\n\n@keyframes spinner-animation {\n from { transform: rotate(0); }\n to { transform: rotate(360deg); }\n\n/*# sourceURL=audits2/audits2Dialog.css */";Runtime.cachedResources["audits2/audits2Panel.css"]="/*\n * Copyright 2017 The Chromium Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style license that can be\n * found in the LICENSE file.\n */\n\n.toolbar {\n border-bottom: 1px solid #ccc;\n}\n\n.audits2-logo {\n width: 210px;\n height: 200px;\n flex-shrink: 0;\n background-repeat: no-repeat;\n background-size: contain;\n margin-top: 10px;\n background-image: url(Images/audits_logo.svg);\n}\n\n.audits2-landing-page {\n display: flex;\n align-items: center;\n justify-content: center;\n overflow: auto;\n}\n\n\n.audits2-landing-center {\n display: flex;\n align-items: center;\n justify-content: center;\n max-width: 400px;\n margin: 50px;\n}\n\n.audits2-landing-center > * {\n flex-shrink: 0;\n}\n\n.audits2-landing-text {\n color: #666;\n}\n\n.audits2-landing-bold-text {\n font-weight: bold;\n}\n\n.lh-root {\n --report-menu-width: 0;\n user-select: initial;\n background: #fff;\n}\n\n.lh-root .lh-container {\n word-wrap: normal;\n}\n\n.audits2-landing-center button {\n margin-top: 20px;\n}\n\n.audits2-results-container {\n overflow-y: scroll;\n position: relative;\n}\n\n/*# sourceURL=audits2/audits2Panel.css */";Runtime.cachedResources["audits2/lighthouse/report-styles.css"]="/**\n * @license Copyright 2017 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.\n */\n\n.lh-vars {\n --text-font-family: Roboto, Helvetica, Arial, sans-serif;\n --monospace-font-family: 'Menlo', 'dejavu sans mono', 'Consolas', 'Lucida Console', monospace;\n --body-font-size: 14px;\n --body-line-height: 18px;\n --subheader-font-size: 16px;\n --subheader-line-height: 20px;\n --header-font-size: 20px;\n --header-line-height: 24px;\n --title-font-size: 24px;\n --title-line-height: 28px;\n --caption-font-size: 12px;\n --caption-line-height: 16px;\n --default-padding: 12px;\n --section-padding: 20px;\n --section-indent: 16px;\n --audit-group-indent: 16px;\n --audit-indent: 16px;\n --expandable-indent: 20px;\n --secondary-text-color: #565656;\n /*--accent-color: #3879d9;*/\n --fail-color: #df332f;\n --pass-color: #2b882f;\n --informative-color: #0c50c7;\n --manual-color: #757575;\n --average-color: #ef6c00; /* md orange 800 */\n --warning-color: #ffab00; /* md amber a700 */\n --report-border-color: #ccc;\n --report-secondary-border-color: #ebebeb;\n --metric-timeline-rule-color: #b3b3b3;\n --report-width: calc(60 * var(--body-font-size));\n --report-menu-width: calc(20 * var(--body-font-size));\n --report-content-width: calc(var(--report-width) + var(--report-menu-width));\n --navitem-font-size: var(--body-font-size);\n --navitem-line-height: var(--body-line-height);\n --navitem-hpadding: var(--body-font-size);\n --navitem-vpadding: calc(var(--navitem-line-height) / 2);\n --lh-score-highlight-bg: #fafafa;\n --lh-score-icon-background-size: 24px;\n --lh-score-margin: 12px;\n --lh-table-header-bg: #ccc;\n --lh-table-higlight-bg: #fafafa;\n --lh-sparkline-height: 5px;\n --lh-sparkline-thin-height: 3px;\n --lh-filmstrip-thumbnail-width: 60px;\n --lh-audit-score-width: calc(5 * var(--body-font-size));\n --lh-category-score-width: calc(5 * var(--body-font-size));\n --lh-audit-vpadding: 8px;\n --lh-audit-hgap: 12px;\n --lh-audit-group-vpadding: 12px;\n --lh-section-vpadding: 12px;\n --pass-icon-url: url('data:image/svg+xml;utf8,<svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" xmlns=\"http://www.w3.org/2000/svg\"><path stroke=\"#007F04\" stroke-width=\"1.5\" d=\"M1 5.75l3.5 3.5 6.5-6.5\" fill=\"none\" fill-rule=\"evenodd\"/></svg>');\n --fail-icon-url: url('data:image/svg+xml;utf8,<svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" xmlns=\"http://www.w3.org/2000/svg\"><g stroke=\"#EE1D0A\" stroke-width=\"1.5\" fill=\"none\" fill-rule=\"evenodd\"><path d=\"M2 10l8-8M10 10L2 2\"/></g></svg>');\n --collapsed-icon-url: url('data:image/svg+xml;utf8,<svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" xmlns=\"http://www.w3.org/2000/svg\"><g fill=\"none\" fill-rule=\"evenodd\"><path fill=\"none\" d=\"M0 0h12v12H0z\"/><path fill=\"hsl(0, 0%, 60%)\" d=\"M3 2l6 4-6 4z\"/></g></svg>');\n --expanded-icon-url: url('data:image/svg+xml;utf8,<svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" xmlns=\"http://www.w3.org/2000/svg\"><g fill=\"none\" fill-rule=\"evenodd\"><path fill=\"none\" d=\"M0 0h12v12H0z\"/><path fill=\"hsl(0, 0%, 60%)\" d=\"M10 3L6 9 2 3z\"/></g></svg>');\n}\n\n.lh-vars.lh-devtools {\n --text-font-family: '.SFNSDisplay-Regular', 'Helvetica Neue', 'Lucida Grande', sans-serif;\n --monospace-font-family: 'Menlo', 'dejavu sans mono', 'Consolas', 'Lucida Console', monospace;\n --body-font-size: 12px;\n --body-line-height: 16px;\n --subheader-font-size: 14px;\n --subheader-line-height: 18px;\n --header-font-size: 16px;\n --header-line-height: 20px;\n --title-font-size: 20px;\n --title-line-height: 24px;\n --caption-font-size: 11px;\n --caption-line-height: 14px;\n --default-padding: 12px;\n --section-padding: 16px;\n --section-indent: 16px;\n --audit-group-indent: 16px;\n --audit-indent: 16px;\n --expandable-indent: 16px;\n\n --lh-audit-vpadding: 4px;\n --lh-audit-hgap: 12px;\n --lh-audit-group-vpadding: 8px;\n --lh-section-vpadding: 8px;\n}\n\n@keyframes fadeIn {\n 0% { opacity: 0;}\n 100% { opacity: 0.6;}\n}\n\n.lh-root * {\n box-sizing: border-box;\n}\n\n.lh-root {\n font-family: var(--text-font-family);\n font-size: var(--body-font-size);\n margin: 0;\n line-height: var(--body-line-height);\n background: #f5f5f5;\n scroll-behavior: smooth;\n}\n\n.lh-root :focus {\n outline: -webkit-focus-ring-color auto 3px;\n}\n\n.lh-root [hidden] {\n display: none !important;\n}\n\na {\n color: #0c50c7;\n}\n\nsummary {\n cursor: pointer;\n}\n\n.lh-details {\n font-size: var(--body-font-size);\n margin-top: var(--default-padding);\n}\n\n.lh-details[open] summary {\n margin-bottom: var(--default-padding);\n}\n\n.lh-details summary::-webkit-details-marker {\n color: #9e9e9e;\n}\n\n.lh-details.flex .lh-code {\n max-width: 70%;\n}\n\n/* Report header */\n\n.report-icon {\n opacity: 0.7;\n}\n.report-icon:hover {\n opacity: 1;\n}\n.report-icon[disabled] {\n opacity: 0.3;\n pointer-events: none;\n}\n\n.report-icon--share {\n background-image: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0z\"/><path d=\"M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7s-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81 1.66 0 3-1.34 3-3s-1.34-3-3-3-3 1.34-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9c-1.66 0-3 1.34-3 3s1.34 3 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.16c-.05.21-.08.43-.08.65 0 1.61 1.31 2.92 2.92 2.92 1.61 0 2.92-1.31 2.92-2.92s-1.31-2.92-2.92-2.92z\"/></svg>');\n}\n.report-icon--print {\n background-image: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path d=\"M19 8H5c-1.66 0-3 1.34-3 3v6h4v4h12v-4h4v-6c0-1.66-1.34-3-3-3zm-3 11H8v-5h8v5zm3-7c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1zm-1-9H6v4h12V3z\"/><path fill=\"none\" d=\"M0 0h24v24H0z\"/></svg>');\n}\n.report-icon--copy {\n background-image: url('data:image/svg+xml;utf8,<svg height=\"24\" viewBox=\"0 0 24 24\" width=\"24\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M0 0h24v24H0z\" fill=\"none\"/><path d=\"M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z\"/></svg>');\n}\n.report-icon--open {\n background-image: url('data:image/svg+xml;utf8,<svg height=\"24\" viewBox=\"0 0 24 24\" width=\"24\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M0 0h24v24H0z\" fill=\"none\"/><path d=\"M19 4H5c-1.11 0-2 .9-2 2v12c0 1.1.89 2 2 2h4v-2H5V8h14v10h-4v2h4c1.1 0 2-.9 2-2V6c0-1.1-.89-2-2-2zm-7 6l-4 4h3v6h2v-6h3l-4-4z\"/></svg>');\n}\n.report-icon--download {\n background-image: url('data:image/svg+xml;utf8,<svg height=\"24\" viewBox=\"0 0 24 24\" width=\"24\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M19 9h-4V3H9v6H5l7 7 7-7zM5 18v2h14v-2H5z\"/><path d=\"M0 0h24v24H0z\" fill=\"none\"/></svg>');\n}\n\n/* List */\n.lh-list {\n font-size: smaller;\n margin-top: var(--default-padding);\n}\n\n.lh-list__items {\n padding-left: var(--default-padding);\n}\n\n.lh-list__item {\n margin-bottom: 2px;\n}\n\n/* Node */\n.lh-node {\n display: block;\n font-family: var(--monospace-font-family);\n word-break: break-word;\n color: hsl(174, 100%, 27%);\n}\nspan.lh-node:hover {\n background: hsl(0, 0%, 98%);\n border-radius: 2px;\n}\n\n/* Card */\n.lh-scorecards {\n display: flex;\n flex-wrap: wrap;\n}\n.lh-scorecard {\n display: flex;\n align-items: center;\n justify-content: center;\n flex: 0 0 calc(12 * var(--body-font-size));\n flex-direction: column;\n padding: var(--default-padding);\n padding-top: calc(32px + var(--default-padding));\n border-radius: 3px;\n margin-right: var(--default-padding);\n position: relative;\n line-height: inherit;\n border: 1px solid #ebebeb;\n}\n.lh-scorecard__title {\n background-color: #eee;\n position: absolute;\n top: 0;\n right: 0;\n left: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: calc(var(--default-padding) / 2);\n}\n.lh-scorecard__value {\n font-size: calc(1.6 * var(--body-font-size));\n}\n.lh-scorecard__target {\n margin-top: calc(var(--default-padding) / 2);\n}\n\n/* Score */\n\n.lh-score {\n display: flex;\n align-items: flex-start;\n}\n\n.lh-score__value {\n flex: none;\n margin-left: var(--lh-score-margin);\n width: calc(var(--lh-audit-score-width) - var(--lh-score-margin));\n position: relative;\n font-weight: bold;\n top: 1px;\n text-align: right;\n}\n\n.lh-score__value::after {\n content: '';\n position: absolute;\n right: 0;\n top: 0;\n bottom: 0;\n border-radius: inherit;\n width: 16px;\n}\n\n.lh-score--informative .lh-score__value {\n color: var(--informative-color);\n border-radius: 50%;\n top: 3px;\n}\n\n.lh-score--informative .lh-score__value::after {\n display: none;\n background: url('data:image/svg+xml;utf8,<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\"><title>info</title><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z\" fill=\"hsl(218, 89%, 41%)\"/></svg>') no-repeat 50% 50%;\n background-size: var(--lh-score-icon-background-size);\n}\n\n.lh-score--manual .lh-score__value::after {\n background: url('data:image/svg+xml;utf8,<svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" xmlns=\"http://www.w3.org/2000/svg\"><title>manual</title><path d=\"M2 5h8v2H2z\" fill=\"hsl(0, 0%, 100%)\" fill-rule=\"evenodd\"/></svg>') no-repeat 50% 50%;\n background-size: 18px;\n background-color: var(--manual-color);\n width: 20px;\n height: 20px;\n position: relative;\n}\n\n.lh-score__value--binary {\n color: transparent !important;\n}\n\n/* No icon for audits with number scores. */\n.lh-score__value:not(.lh-score__value--binary)::after {\n content: none;\n}\n\n.lh-score__value--pass {\n color: var(--pass-color);\n}\n\n.lh-score__value--pass::after {\n background: var(--pass-icon-url) no-repeat center center / 12px 12px;\n}\n\n.lh-score__value--average {\n color: var(--average-color);\n}\n\n.lh-score__value--average::after {\n background: none;\n content: '!';\n color: var(--average-color);\n display: flex;\n justify-content: center;\n align-items: center;\n font-weight: 500;\n font-size: 15px;\n}\n\n.lh-score__value--fail {\n color: var(--fail-color);\n}\n\n.lh-score__value--fail::after {\n background: var(--fail-icon-url) no-repeat center center / 12px 12px;\n}\n\n.lh-score__description {\n font-size: var(--body-font-size);\n color: var(--secondary-text-color);\n line-height: var(--body-line-height);\n}\n\n.lh-score__snippet {\n align-items: center;\n justify-content: space-between;\n /*outline: none;*/\n}\n\n.lh-score__snippet::-moz-list-bullet {\n display: none;\n}\n\n.lh-score__title {\n flex: 1;\n}\n\n.lh-toggle-arrow {\n background: var(--collapsed-icon-url) no-repeat center center / 12px 12px;\n background-color: transparent;\n width: 12px;\n height: 12px;\n flex: none;\n transition: transform 150ms ease-in-out;\n cursor: pointer;\n border: none;\n order: -1;\n margin-right: calc(var(--expandable-indent) - 12px);\n align-self: flex-start;\n}\n\n.lh-toggle-arrow-unexpandable {\n visibility: hidden;\n}\n\n/* Expandable Details (Audit Groups, Audits) */\n\n.lh-score__header {\n order: -1;\n flex: 1;\n}\n\n.lh-expandable-details {\n padding-left: var(--expandable-indent);\n}\n\n.lh-expandable-details__summary {\n display: flex;\n align-items: center;\n cursor: pointer;\n margin-left: calc(0px - var(--expandable-indent));\n}\n\n.lh-audit-group[open] > .lh-audit-group__summary > .lh-toggle-arrow,\n.lh-expandable-details[open] > .lh-expandable-details__summary > .lh-toggle-arrow {\n background-image: var(--expanded-icon-url);\n}\n\n.lh-audit-group__summary::-webkit-details-marker,\n.lh-expandable-details__summary::-webkit-details-marker {\n display: none;\n}\n\n.lh-score__snippet .lh-toggle-arrow {\n margin-top: calc((var(--body-line-height) - 12px) / 2);\n}\n\n/* Perf Timeline */\n\n.lh-timeline-container {\n overflow: hidden;\n border-top: 1px solid var(--metric-timeline-rule-color);\n}\n\n.lh-timeline {\n padding: 0;\n padding-bottom: 0;\n width: calc(var(--lh-filmstrip-thumbnail-width) * 10 + var(--default-padding) * 2);\n}\n\n.lh-narrow .lh-timeline-container {\n width: calc(100vw - var(--section-padding) * 2);\n overflow-x: scroll;\n}\n\n.lh-devtools .lh-timeline-container {\n width: 100%;\n overflow-x: scroll;\n}\n\n/* Perf Timeline Metric */\n\n.lh-timeline-metric {\n position: relative;\n margin-bottom: calc(2 * var(--lh-audit-vpadding));\n padding-top: var(--lh-audit-vpadding);\n border-top: 1px solid var(--report-secondary-border-color);\n}\n\n.lh-timeline-metric__header {\n display: flex;\n}\n\n.lh-timeline-metric__details {\n order: -1;\n}\n\n.lh-timeline-metric__title {\n font-size: var(--body-font-size);\n line-height: var(--body-line-height);\n display: flex;\n}\n\n.lh-timeline-metric__name {\n flex: 1;\n}\n\n.lh-timeline-metric__description {\n color: var(--secondary-text-color);\n}\n\n.lh-timeline-metric__value {\n width: var(--lh-audit-score-width);\n text-align: right;\n}\n\n.lh-timeline-metric--pass .lh-timeline-metric__value {\n color: var(--pass-color);\n}\n\n.lh-timeline-metric--average .lh-timeline-metric__value {\n color: var(--average-color);\n}\n\n.lh-timeline-metric--fail .lh-timeline-metric__value {\n color: var(--fail-color);\n}\n\n.lh-timeline-metric__sparkline {\n position: absolute;\n left: 0;\n right: 0;\n top: -1px;\n height: 3px;\n width: 100%;\n}\n\n.lh-timeline-metric__sparkline .lh-sparkline__bar {\n float: none;\n}\n\n.lh-timeline-metric--pass .lh-sparkline__bar {\n background: var(--pass-color);\n}\n\n.lh-timeline-metric--average .lh-sparkline__bar {\n background: var(--average-color);\n}\n\n.lh-timeline-metric--fail .lh-sparkline__bar {\n background: var(--fail-color);\n}\n\n.lh-timeline-metric .lh-debug {\n margin-left: var(--expandable-indent);\n}\n\n/* Perf Hint */\n\n.lh-perf-hint {\n padding-top: var(--lh-audit-vpadding);\n padding-bottom: var(--lh-audit-vpadding);\n border-top: 1px solid var(--report-secondary-border-color);\n}\n\n.lh-perf-hint:last-of-type {\n border-bottom: none;\n}\n\n.lh-perf-hint__summary {\n display: flex;\n align-items: flex-start;\n flex-wrap: wrap;\n min-height: calc(var(--body-line-height) + var(--caption-line-height));\n}\n\n.lh-perf-hint__summary .lh-toggle-arrow {\n margin-top: calc((var(--subheader-line-height) - 12px) / 2);\n}\n\n.lh-perf-hint__summary .lh-debug {\n width: calc(100% - var(--expandable-indent));\n margin: 0 var(--expandable-indent);\n}\n\n.lh-perf-hint__title {\n font-size: var(--body-font-size);\n flex: 10;\n}\n\n.lh-perf-hint__sparkline {\n flex: 0 0 50%;\n margin-top: calc((var(--body-line-height) - var(--lh-sparkline-height)) / 2);\n}\n\n.lh-perf-hint__sparkline .lh-sparkline {\n width: 100%;\n float: right;\n margin: 0;\n}\n\n.lh-perf-hint__stats {\n text-align: right;\n flex: 0 0 var(--lh-audit-score-width);\n}\n\n.lh-perf-hint__primary-stat {\n font-size: var(--body-font-size);\n line-height: var(--body-line-height);\n}\n\n.lh-perf-hint__secondary-stat {\n font-size: var(--caption-font-size);\n line-height: var(--caption-line-height);\n}\n\n.lh-perf-hint__description {\n color: var(--secondary-text-color);\n margin-top: calc(var(--default-padding) / 2);\n}\n\n.lh-perf-hint--pass .lh-perf-hint__stats {\n color: var(--pass-color);\n}\n\n.lh-perf-hint--pass .lh-sparkline__bar {\n background: var(--pass-color);\n}\n\n.lh-perf-hint--average .lh-sparkline__bar {\n background: var(--average-color);\n}\n\n.lh-perf-hint--average .lh-perf-hint__stats {\n color: var(--average-color);\n}\n\n.lh-perf-hint--fail .lh-sparkline__bar {\n background: var(--fail-color);\n}\n\n.lh-perf-hint--fail .lh-perf-hint__stats {\n color: var(--fail-color);\n}\n\n/* Filmstrip */\n\n.lh-filmstrip {\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n padding-bottom: var(--default-padding);\n}\n\n.lh-filmstrip__frame {\n text-align: right;\n position: relative;\n}\n\n.lh-filmstrip__timestamp {\n margin-bottom: calc(0.5 * var(--caption-line-height));\n font-size: var(--caption-font-size);\n line-height: var(--caption-line-height);\n padding-top: 1px;\n padding-right: 6px;\n}\n\n.lh-filmstrip__timestamp::before {\n content: '';\n height: 7px;\n width: 2px;\n background: var(--metric-timeline-rule-color);\n position: absolute;\n right: 0;\n top: -2px;\n}\n\n.lh-filmstrip__thumbnail {\n border: 1px solid var(--report-secondary-border-color);\n max-height: 100px;\n}\n\n/* Sparkline */\n\n.lh-sparkline {\n margin: 5px;\n height: var(--lh-sparkline-height);\n width: 100%;\n}\n\n.lh-sparkline--thin {\n height: calc(var(--lh-sparkline-height) / 2);\n}\n\n.lh-sparkline__bar {\n background: var(--warning-color);\n height: 100%;\n float: right;\n position: relative;\n}\n\n/* correlate metric end location with sparkline */\n.lh-timeline-metric:hover .lh-sparkline__bar::after {\n content: '';\n height: 100vh;\n width: 2px;\n background: inherit;\n position: absolute;\n right: 0;\n bottom: 0;\n opacity: 0;\n animation: fadeIn 150ms;\n animation-fill-mode: forwards;\n}\n\n/* Audit */\n\n.lh-audit {\n margin-bottom: var(--lh-audit-vpadding);\n padding-top: var(--lh-audit-vpadding);\n border-top: 1px solid var(--report-secondary-border-color);\n}\n\n.lh-audit:last-of-type {\n border-bottom: none;\n}\n\n.lh-audit > .lh-score {\n font-size: var(--body-font-size);\n}\n\n.lh-audit .lh-debug {\n margin-left: var(--expandable-indent);\n margin-right: var(--lh-audit-score-width);\n}\n\n/* Audit Group */\n\n.lh-audit-group {\n padding-top: var(--lh-audit-group-vpadding);\n border-top: 1px solid var(--report-secondary-border-color);\n padding-left: var(--expandable-indent);\n}\n\n.lh-audit-group__header {\n font-size: var(--subheader-font-size);\n line-height: var(--subheader-line-height);\n}\n\n.lh-audit-group__summary {\n display: flex;\n align-items: center;\n margin-bottom: var(--lh-audit-group-vpadding);\n margin-left: calc(0px - var(--expandable-indent));\n}\n\n.lh-audit-group__summary .lh-toggle-arrow {\n margin-top: calc((var(--subheader-line-height) - 12px) / 2);\n}\n\n.lh-audit-group__description {\n font-size: var(--body-font-size);\n color: var(--secondary-text-color);\n margin-top: calc(0px - var(--lh-audit-group-vpadding));\n margin-bottom: var(--lh-audit-group-vpadding);\n line-height: var(--body-line-height);\n}\n\n\n.lh-debug {\n font-size: var(--caption-font-size);\n line-height: var(--caption-line-height);\n color: var(--fail-color);\n margin-top: 3px;\n}\n\n.lh-debug::before {\n display: none;\n content: '';\n background: url('data:image/svg+xml;utf8,<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\"><title>warn</title><path d=\"M0 0h24v24H0z\" fill=\"none\"/><path d=\"M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z\" fill=\"hsl(40, 100%, 50%)\"/></svg>') no-repeat 50% 50%;\n background-size: contain;\n width: 20px;\n height: 20px;\n position: relative;\n margin-right: calc(var(--default-padding) / 2);\n top: 5px;\n}\n\n\n/* Report */\n\n.lh-container {\n display: flex;\n max-width: var(--report-content-width);\n word-wrap: break-word;\n margin: 0 auto;\n}\n\n.lh-report {\n margin-left: var(--report-menu-width);\n background-color: #fff;\n padding-top: var(--report-header-height);\n}\n@media screen {\n .lh-report {\n width: var(--report-width);\n }\n}\n\n.lh-exception {\n font-size: large;\n}\n\n.lh-text__url {\n white-space: nowrap;\n}\n\n.lh-code {\n text-overflow: ellipsis;\n white-space: pre-line;\n margin-top: 0;\n}\n\n.lh-scores-header {\n display: flex;\n justify-content: center;\n overflow-x: hidden;\n padding: var(--section-padding);\n border-bottom: 1px solid var(--report-border-color);\n}\n.lh-scores-header__solo {\n padding: 0;\n border: 0;\n}\n\n.lh-categories {\n width: 100%;\n overflow: hidden;\n}\n\n.lh-category {\n padding: var(--section-padding);\n border-top: 1px solid var(--report-border-color);\n}\n\n/* section hash link jump should preserve fixed header\n https://css-tricks.com/hash-tag-links-padding/\n*/\n.lh-category > .lh-permalink {\n margin-top: calc((var(--report-header-height) + var(--default-padding)) * -1);\n padding-bottom: calc(var(--report-header-height) + var(--default-padding));\n display: block;\n visibility: hidden;\n}\n\n.lh-category:first-of-type {\n border: none;\n}\n\n.lh-category > .lh-score {\n font-size: var(--header-font-size);\n padding-bottom: var(--lh-section-vpadding);\n}\n\n.lh-category > .lh-score .lh-score__value,\n.lh-category > .lh-score .lh-score__gauge .lh-gauge__label {\n display: none;\n}\n\n.lh-category .lh-score__gauge {\n margin-left: var(--section-indent);\n flex-basis: var(--circle-size);\n flex-shrink: 0;\n}\n\n.lh-category .lh-score__gauge .lh-gauge {\n --circle-size: calc(2.5 * var(--header-font-size));\n}\n\n/* Category snippet shouldnt have pointer cursor. */\n.lh-category > .lh-score .lh-score__snippet {\n cursor: initial;\n}\n\n.lh-category > .lh-score .lh-score__title {\n font-size: var(--header-font-size);\n line-height: var(--header-line-height);\n}\n\n.lh-passed-audits[open] summary.lh-passed-audits-summary {\n margin-bottom: calc(var(--default-padding) * 2);\n}\n\nsummary.lh-passed-audits-summary {\n margin: calc(var(--default-padding) * 2) var(--default-padding);\n margin-left: var(--default-padding);\n margin-bottom: 0;\n font-size: 15px;\n display: flex;\n align-items: center;\n}\n\n#lh-log {\n position: fixed;\n background-color: #323232;\n color: #fff;\n min-height: 48px;\n min-width: 288px;\n padding: 16px 24px;\n box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.26);\n border-radius: 2px;\n margin: 12px;\n font-size: 14px;\n cursor: default;\n transition: transform 0.3s, opacity 0.3s;\n transform: translateY(100px);\n opacity: 0;\n -webkit-font-smoothing: antialiased;\n bottom: 0;\n left: 0;\n z-index: 3;\n}\n\n#lh-log.show {\n opacity: 1;\n transform: translateY(0);\n}\n\n/* 964 fits the min-width of the filmstrip */\n@media screen and (max-width: 964px) {\n .lh-report {\n margin-left: 0;\n width: 100%;\n min-width: 400px;\n }\n}\n\n@media print {\n body {\n -webkit-print-color-adjust: exact; /* print background colors */\n }\n .lh-container {\n display: block;\n }\n .lh-report {\n margin-left: 0;\n padding-top: 0;\n }\n .lh-categories {\n margin-top: 0;\n }\n}\n\n.lh-table {\n --image-preview-size: 24px;\n border: 1px solid var(--report-secondary-border-color);\n border-collapse: collapse;\n table-layout: fixed;\n width: 100%;\n}\n\n.lh-table thead {\n background: var(--lh-table-header-bg);\n}\n\n.lh-table tbody tr:nth-child(even) {\n background-color: var(--lh-table-higlight-bg);\n}\n\n.lh-table th,\n.lh-table td {\n padding: 10px;\n overflow: auto;\n}\n\n.lh-table-column--text {\n text-align: right;\n}\n\n.lh-table-column--thumbnail {\n width: calc(var(--image-preview-size) * 2);\n}\n\n.lh-table-column--url {\n text-align: left;\n min-width: 250px;\n white-space: nowrap;\n}\n\n.lh-thumbnail {\n height: var(--image-preview-size);\n width: var(--image-preview-size);\n object-fit: contain;\n}\n\n/*# sourceURL=report.styles.css */\n\n/*# sourceURL=audits2/lighthouse/report-styles.css */";Runtime.cachedResources["audits2/lighthouse/templates.html"]="<!-- Lighthouse category score -->\n<template id=\"tmpl-lh-category-score\">\n <div class=\"lh-score\">\n <div class=\"lh-score__value\"><!-- fill me --></div>\n <div class=\"lh-score__gauge\"></div>\n <div class=\"lh-score__header\">\n <div class=\"lh-score__snippet\">\n <span class=\"lh-score__title\"><!-- fill me --></span>\n </div>\n <div class=\"lh-score__description\"><!-- fill me --></div>\n </div>\n </div>\n</template>\n\n<!-- Lighthouse audit score -->\n<template id=\"tmpl-lh-audit-score\">\n <div class=\"lh-score\">\n <div class=\"lh-score__value\"><!-- fill me --></div>\n <details class=\"lh-score__header lh-expandable-details\">\n <summary class=\"lh-score__snippet lh-expandable-details__summary\">\n <span class=\"lh-score__title\"><!-- fill me --></span>\n <div class=\"lh-toggle-arrow\" title=\"See audits\"></div>\n </summary>\n <div class=\"lh-score__description\"><!-- fill me --></div>\n </details>\n </div>\n</template>\n\n<!-- Lighthouse timeline metric -->\n<template id=\"tmpl-lh-timeline-metric\">\n <div class=\"lh-timeline-metric\">\n <div class=\"lh-timeline-metric__sparkline\">\n <div class=\"lh-sparkline__bar\"></div>\n </div>\n <div class=\"lh-timeline-metric__header\">\n <div class=\"lh-timeline-metric__value\"><!-- fill me --></div>\n <details class=\"lh-timeline-metric__details lh-expandable-details\">\n <summary class=\"lh-timeline-metric__summary lh-expandable-details__summary\">\n <span class=\"lh-timeline-metric__title\"><!-- fill me --></span>\n <div class=\"lh-toggle-arrow\" title=\"See audits\"></div>\n </summary>\n <div class=\"lh-timeline-metric__description\"><!-- fill me --></div>\n </details>\n </div>\n </div>\n</template>\n\n<!-- Lighthouse left nav -->\n<template id=\"tmpl-lh-leftnav\">\n <style>\n .lh-leftnav {\n width: var(--report-menu-width);\n border-right: 1px solid var(--report-border-color);\n position: fixed;\n height: 100%;\n background: #fff;\n will-change: transform; /* prevent excessive paints */\n z-index: 2;\n }\n .lh-leftnav__item {\n padding: var(--navitem-vpadding) var(--navitem-hpadding);\n color: var(--secondary-text-color);\n font-size: var(--navitem-font-size);\n line-height: var(--navitem-line-height);\n display: flex;\n justify-content: space-between;\n text-decoration: none;\n color: inherit;\n }\n .leftnav-item__score {\n background: transparent;\n }\n .leftnav-item__score::after {\n content: '';\n }\n .leftnav-item__score.lh-score__value--pass {\n color: var(--pass-color);\n }\n .leftnav-item__score.lh-score__value--average {\n color: var(--average-color);\n }\n .leftnav-item__score.lh-score__value--fail {\n color: var(--fail-color);\n }\n .leftnav__header {\n padding: 0 20px;\n margin-bottom: var(--navitem-vpadding);\n height: 115px;\n font-size: 18px;\n display: flex;\n flex-direction: column;\n justify-content: center;\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZoAAADeCAYAAAAEuMatAABPH0lEQVR4Ae3dBZyk1ZX38d+59z5PSfv0uMPg7iQB4oRkIbrZbGSz7Js368mbrLtE1903nuzGVuIGgQgxCBbIAAPjru1d8sg9b091fxhBMsN0T1V13+/ncz5VNRaFP+ee89zi8QRBEARBEARBEARBEARBIARB0BTZuru7Be0HOoFYlcirAqgIiaoMGKtbAaWNBYFkD9/JzAuC4H3/57KeZKB0Wb/jea9YVrowFbNC0KVAj4Cr50olzTACCKCy11j/QLG/tlmEb5bXp18GdtFmgkDSy3lS7qxzLKsWzSfVcWCMIAiOzxfvuIZV3S+lp/hSUk5DYSzzCIcIkORKJcsQDqOg3gBgUj8qyP8YlU8DnyEI2oTsfc4ynkjvm65eaJ9z8cuMdQvwmoCpgAwiOlH2AERDCONABZUxICUIgob6R7/ynOz7D/+yjlRuEE8BryAccixBczQBUXCj+Xc73difhcAJ2oFUn1PmcV19dnfxZ1/yM2CXkucJIEeWGsCD1IAKSBUvIyCDGD0AphFEUz9fb9QcEATZvetPSd/7uT/2ef56CpFgDIecYNBMUSOAYES+YJ37XeA+WlQQyN6Xr+bxzP+XX3upJEPPIPdVnpwB5LBXEBQa5UHGgFGQUXIzBDIETFakg6B1IGMWCILq337+NfnajX8lxcISjDBl2oPmcCIMl7fXfh/4R1pQEMjwhX0cLfq5a1eUXn3lGxgZtSCeE2MeLcEAOZABOaIJyDAwAAxh4iFERqaCaQzrhwGlxQWBfv3+qP4/t/xZVo9+RZxhykkJGgCNDEZ4rxV5C1ChtQSho1nO0fr/6NWvMPN6Lif3dWaGABzVCZmpSoAaUMdSRRgGBkEGcbof0RGgAlIBMoKgSe5ev6KcRoVC18Z1C0758Hve7p39SZwBOMlBc4hFPmeM3AgM0iKCwEmqHK7nRef1miXzz6JST5k5etir50gCFIAiOX3AUkBAIUUQqaIyBhMlOlGMAIMoQzg9gGUMJQFSQDlOQbB7sLsDm5f/4+tXdW7b1rM0sqxQdInAotTbRV+9/8z+pEp3LnQV8aU/tz+39PSC70kkotly9MWo/9SY6XtNWIVuFYFsePHZHG78rTc+/fxz6jdQI6U1CWAOKwV8o+RgSRUYRhhBGUAZQnQIzBCqw+BrIYACgA994+m9Y2OF00yUnXLHnlWrvn3XmhVdsEpFVwBLKnWzMMuwIkxSEIFyQfEiGFL+2Pw6L+E/qVFGEYCmdjQABWrcaZ73wG8W/uPm3fPjnRbdirLJCI+IMAgoJ1EQyIpfyJnCaZ25fOqtf/36nrR6FpiE9iOPE0QeSBBJUFJEx0GGEBkE9qN+GBgDxhEZAZRgVvnSHWeVXSlddd8jq9d89vbzzi0V9FxVOXvTvu4VWUqXCOWCgUIBlENElMejQBXhzfLX/LK8m+qhkGmJoBGUAhU+ZH6Pf+U36aChKjAK7BR4QIW1ueUhYKsxbAH2MUOCQC55hTKFC/vW9r3/Tz76C4wXSoBn9pAnKIOQg1SBg1UBHQUZRBgAOYD3gwg1aFRK0NLW7Z7fsXt/39L33HTVeXGUP21guPviezb2L7OWJc7SFztAaYic8lRUEJ4nX+Ov5KcxeDIcQMsEDYAhx+L5Q/cRviYvpIjyBKoi7B4fZHNW415V+a6HtcBuYIBpEASy6gplCl/9t387/7SF219LEtWZO44MHhAmKQ2SIkxtwukoMAIyBAwjcgCfDwFZo0664LaHTu/64t1nnke9+MzP337uBanlTIFzvacIYA0UI0WZHhlCHwO817yMNTxEjRJAywUNQEyNHXIab7Zf4YD0EaE8EWMBYQqKss5Y1lq4R+EbKfJDYATwBMFxcvNW8ah0xK5iIcrcolMFkPMYKih9QD9gaNAcyFFyRGogI8AwRgbI/QDCKDCKyBAwzrQJ/ufWS1099pd86juXPX3z7r6nZXn89OFxWWYNrqOoOB5LmT4Z8Fp5L2ewlgqdtLKEIqv0QV6tf8/fyR8R8cR8zuEEOMvnnJXCjwO5ovtR7rQi30G402V8BxgjCI6BXH6DAvCMNevkz3//Yz8fj8kKkJTgyQjA46xoWwBEEqAO1EArIMPAIEYOkPv9wDhQmXr1BE/qextWnvuhW64+f/POeS9Yv2PeVRksLxcoOwMIGFFOhgThNDbwPvNiuhgmwwG0bEcDYMmoSwe/aG9ho5xKAWUaeOPZauCutCZf3rOOO1S4H1CC4HHIolUKwOtf84P+v/iNj7+RkVInkBNM53Hc4T+mIBXQcZAxiMeBySCSxkzoAFADkkbNQVv29/R84JZrTt+8e97131q79PkYLoosncZA7JRmUIQa8LvyB/y0/DPjdAK0fNCA0MEwn7Rv4S/MuyijTBcVEEAMVRV+oMLtqvIZ4F5gkCCYIhf8uALwyivvOeMPbvyv11MpekCZSYE5VCqAAh5BQXJgMnxERlAdBIanPg+hfgDVFPDMIg9tX1z87D1nPfPOh8684f7Ni5/rvZwLUC4orSBBWM5OPmReSB8HyHBtEjQQkTDAYt4U3cxOlhChzLBHVLnVeG4e7JObgRGCOc2NlGm48fnfWUg9ioAaMy3wUwUIj1IABOgCelA1gAFyIJ0skyCMggwh/gCqEyUjj86FoEKb+M7Dqwp/d8fVz9r24MIbSAo/tmsgXl0uYouRAkoryYBnyK0sZCdVOmgnGRGL2cIl+nU2y2uImHGni3A6lp/vqOpWb/nynsXyhTp8ExgimHPcvnk0dEWVhSCeoNl0qjyHSKNUC0AR6AFdgWJABEhAqqBVvKsiZnJF2+T7yQr70KgC1BBt+rU9P9i+oPjNe8666LaHlr30we2LXpqmnB1FIAK9nUorUoQIz/Pkc4DQbhQhw/Ec/2m+Yn8SxSAoM02BOGEl8HOnbNSf8ykbxg9wi4p8TOD7wDhzQuCWfRdWnlkR63QB4AlakR56fVyCahnoQFIBBAAPmBRE6iBjiB/BuxGIRoAhxA+QR/ungigDUmbIr9/03FOHHu77iVsfWPby2HIlQCGCUlFpdSmwWrazhnVkRLSjjIg1ej+djDBML5aTQ4WGXIAiazpXsgb05wTuxvNFKcgnpcBawDNrBXL5jcrPveBrpTdee/P/Y7wYFgFmJzlsJmSYlCPkqOSIVEGGER3EuwF8NAwMoYxQYBio8xR8/BsXlbfumn/DR799/ktG6/bFkdJdLihKe6kgvEBu5m/lddQoAgLQNjMaAINHEd7t3sPNcgNFlJYg1FX4qop8PEr57Oyc5wTOD0BhWHuBCFBmo0CBfLKERykCWFS7QHtQVkNisIkH6igJSp2IKsgAogOo3U9eGAYqCOPAKEf59HfPP+O9X73iVQ9unPdTKGd2laA7VgCU9mOg8dyMJQOEduQxdDDKGl3LFxtB0yKUgijXC3q9wmbj+S9V+ShwL7NG4Mgh7ZBefAiaNjQDt2jLoQCCMjllMuYBy0EEvEGq+VTQVIARjB1Mk6jy/YdPWfr7n7/2RYPbup9jnfbP68ypp5YkAxHBCIiAESaJIrQ2RXDASjbgsbQzwVPWYQytyRtW55bfENU3E3MzVt6rwteAUYK25rIesOQ9gANSggB0qiYJRxOMdwhd1Wph2cM7F527bseiC/YNdS99zXn34s8Xxusx47UCo9UiY7WDFTNaKTJUKTFWLZB7g5+ozINXEMAYpoJIaSUGWC5byLG0s5SYFWygm4wEh0VpNaIAFKnzYtCJ4h6FD8WpfBTYR9CWXDQEL7/qni6qBfukQRMEAhifgeZDo539D25dcvEjuxZfPBEgfaA46/EIAnQV6/SUapj+IUDJvWlU5i311DbCZqRSYvhg8NQKVA4G00SNVYtU6hGqNCiThEPdkIgy01KEjEkCdDLMyaAzfHzWowcQlCpgESLAoTwV3gtJDtZAZJVpJTQIXHywfKS/Jrl8RHM+DKwjaCtyyQuV7/7du14ex/kVQJ2jBYGgGJ+j6IGhrkVrty29aP2uhReN1wpdzipGPD+KAIgCIAKCYmSyEEgyO1GOWhJRT10jfIbGywxO1ESQUU0d9SSi2vh5g+pU6BxeAJx4ECUI8xnkeXyOpbINUF4qH6OL4RntanJVMq/MFEPOKPO41byCGmU2s4Zv6I8xQgcRyvHIvFBwGacu2sS+4QXsHemd+VsbBIADAh8zKv8KrCVoC/K6X97p3vuWD766GKVnAylBcDibZ6joroG+ZfdvXnbl5j3zz03SqGBNjjHK9DgUPiL66PsGARTqWcR4bbLrqUzUwSAaHi9PVImRarERTlluSHNLltMgAuY4u6AEYTWb+DPzc5zH9/E4QKhRQhFmmjBzFMHgialiUIScb3Mtv+3/hSH6j7mz8SqU4grv+Mm38dwLb2HrvlX84cf/mLs2nk/BKSfJuCqfVZW/B75H0NLkNW/a2fH+t3zotUVXXwmSEwQA1mcounugZ8n9m5dfuWnPgguT1EXOekSUk01EMVMloiiC9wfL4FWoJlFjHjRSKTJaK07OhyZq4nPjOC7NLKrgG3XUUZxRBFCEFOWP5Dd5lfwb4/Qx23UwxN/r2/lnfQsllGNRqQsvvuwW/vINb4U8gtIoX/r2T/LWD7yTcgFAOYkyVfkE8A/A7QQtyWW5iVHKIEoAhIBBNN83ETD3bFz19C17+8+vp67gjCdyOc2iKuQHiyMJYIzSWazTXaqxfP5kGOVeGt1NmrmJspMdUKV0MHgar9WDnVESUZnqkNIccqBb6pxu7ieVInAokWYrT8xF8j1U38KxEgOj1S7II3AJoAxXulGawono64BXCHxCkb8FfkDQUuR3fmv9oj964yd/puDSMqDMTYFRj/Hp0Ejn/B9sXHHlwzsXX1JLXCma6mDakYgicMRxXONVlCw31NKoETjVg4GTxAxVyoyOxfxK9Te5OPkmtawAaQZpDl7BCFjDbNLBKJ/hdfym/wfKKMdCAVXPG5/3YW648lNs2H42f/6ZX2fX4AKcVZpsTOAjxjQC52GCliB619+eyryR14I65p5AVLF5MjZe7vnBppVXrtu2+NLxetzlrMeIMlsdCqBDCwkopMScyoM8N/8spl4nq+ZQT9BaSj5Sw+8agiwHYQYICDPKyKH/XWPqjNHFm/3HuIOnUUCPq8OsZ1CMlCQTjNAImRYyCLzHO/kbYDdNFYhu/aOLyM0NgGOOCQHj06QeFddtW3reDzYvv3pwrGOBszlGlLlL8Ahnyf2ca+6lJFUQQUUoZGP4u9eh1QREmHbqwecgwkwQYLxeppoUEFF2sZz/0F/kq/pCIkBQjpeqtHTHK45NQzvkr8cH+AAwTlMEolvecTXePwewzClhk2z9jkVn3b1h9bP2DXetEFGs8QQAQoajSIUCdRTwavixp9/N/Pm7IQcQpp/C4B6ojoIYppUo2Ix//tKNfPS7z6cjVoboY5QCRQCU2cpYEOFuQd4BfJrjpB30qNIjUGRSAowCBwiOiejmt12HckUImjkyhxGf7RvsWXz3+tXXbNi94CJVcNYTPJbHoAgAuTe86nnfY9GqPaAWVJl2YiCrw96tkCUgMu1B8+7/eTP/dut1dBXAABZlLokyPm28vAu4kyfgu+jP+rjCC9dV53GONSxVZZ4IJSbVUYaBnSiPqHKLV24DdhI8LgdSBhWC2UsAmyfVaqF8z4aVz3pg67Kn1ZKo7GyOGJ5AYPAcouA9ZB48M8SDRFDug4HdIExv0KhifUYMRChzURLxMtDnCfKP3vCXwABTagu4uL6AnykrL1FhNYA9+iraQxYBZwDPFvhZa9iP50uqfBC4leBxg4bZLTwPs2H74jPvePjU5+8f6Vwa2ZzI5bSiQKHcA2NDkNRAhGB68xboAv0d43mJyeV3h5awTubzK7HwUx05HQoIx0mZj/B6EV4twmeBdwL3EjQ4lCIgBLNx2J8MT6wr377u1Gdt2LXgYo+Y2GW0sEAVrJ0Mm6QKCDMgUMBzbjqPTxfnMaDQjwflhEUKP64511W28Bfe86dAEoJGNEYJZhPjM/XG3Ld+9ZV3r1/17PFa3OOsx4knaJOwKXXAqIN82rfQAgUMZIuFvB9B6UeZPgpi6Ow6g7chXK7KzwK753jQMMuCJnQxBwa7F333oTXXbtk7/xwjvh2PyULQRAVwMeRVgukPmXQZ+D4gZ8b4FARu8I7Pbt3OK4GtzFEOJAYlaP9ZjM+NTHQxT7vnkVXPHU/izsjmBG0sLkK9AgjBNBHIlgq+F8hPUq55Ll9R5n+yUW4A9jAHORQHCG0tPHg5ONzV/50HTnvBxj0LznPG0+4hEwi4AiggBNPBQ7ZEyOcBOSeNerC9XObm8T6ElwEZc4wDNQTtyfgcFX1w87KLvrduzbXj1UJvGPbPEgJYByjBNPDgeyCfD3hOOvWNul7ht4B3Mcc4wBC0H5cnlWqh4ztrz3jBup2LLjNomMXMNiKNOkGBAhFkiwQE8DSNgd/0yufn2g3TDhFBlaBNiHpsnm7dvXDNtx847cf2j3QueZIbloMgUMjmgZaAnKZS6Eb4A+CVzCFhPtNOrM99buWuB0951l0bVj0nz20cu5xgFlLA+xOd0QQKWgDfJ+BpCQIvF8MzgW8yRzi8KiC0tsBlyeh4ufub9591/cbd88+LrMfZnGAWy1NOTCAKebegMa0UNCaHX8wM95cMw4CfC0dnHlVDSwvPxmzbveDU2x444/qBkY4lc6GLCRTSOgjBU6WgFnwXLUUB4/mJ2PNMEWoC6wVuQ7kF+C6zkAP1tKbAaK6ov/fh1U+fuKfsusybeI4M/AP1kNQAIXjqNAZfAjytxgJLMwWFU4EXAG+zwje85W+AzzGLOIQcpQWFBzBr9Tj+9trTrntw29IrrPU445kDAjFQG4P8hL4qINCpkLGAp2UJjzJeeY5mPAflw1h+HdjHLOBAUtBwsWYribL64GD3gq/df9ZLdg70rpljXUwgQHUMcg/G8AQCzyHCIXroVUtCuxEA4adRzspyXgVsoc050DrQRcsI85ituxas+fp9Z71spFrqD0/4zzEikNahMgJGCB6HBwxoGXwn+JKgEQ2iQB1MVbEjoBHtS7kisnwmHeF6YAdtzKEkBK0RMqLZ2k0rLv3W2tNfnHsTz8WQCQRGDkCeghiCo3jwXZD3C74TMBxBATrAi5AnoAJ42pfhQp/wntoOXgYk7dzRJDRXYHyuKnz3gdOfc+/Glc8VVKzxzDGBMVAZhfFhQDhMoIBAtkjIFwAG8I16QuoApa1pDoWFvKi0hJ8F/ok25RBTQb0CQnDy2TxLkjj6+n1n3vDwzsWXOBOe8p+TxEBah6E9oAoiBEeFzFIhnwco4PnRlFlBc8hzfgvhk8C+dn1gswIoQTNCJh2vljq/es85r9i6r/+MyOUISvMEXs0T/7gIGAGEaSUCSQ0GdkKegDVMOwGMoGLIgRzhaAYQlJajU7cu9wM5c9UK8bwC+DfakEO0gtIE4VLM/YM9C2/9wdmv3DvUtaz5ty4HRjwFk/B4cjFInkEtA2+YPgK1MRjci9brIMcwVJCncDONKNiMOB2nm1E6UQ5RFKFGGY9tzVuX+wHPnKbCq9s3aKwbJ8sITiKX1Xbt61/51XvPeeVIpbSg+evLQeojTu3cwrVLv0nuHQACIAKAihDtSknv2AtpBiJMH0VrCdkdD0Oag/Ckqt6TAsLxe3n9d3mReRuS8ShLTpUyb7cf4CE5nwilZRjI5wtICBrgfIFlwI42DJp0hEyU4OSIstq2ifXlm+8991XVetzd3PvKAhFFAGs8TnIilxIhAKgCuQfvIVd8LYPUQy4gTB9jIFG0kkGW/8gQ0zTDe0U4fmWp0SEKemTQVOjAkaAt2M34MuAJoFuFs9oyaP7s6y8e+ZUrv5LHJo0AZeYELq9v3Lb43FvuO+fHk8yWQsic1AfgAMXIZIkoAGnuqGeWSlZmODHQMUYuRUgydKLIPZr7Q4EjAobpZQSt1EEVjAHhyRnhqfJYHkvIcShCSxHIOwED5AQQAYtpQ+62HSuSt6jUgRKgBDMWMg9tWX7xN+4/4yW5N4Vwncz0E0DMkUHiveD1YBnSzDFSLTI6UePVmNFakZFKkbFagX3VLq5KDvATV27Gz18GWU6DMEVAhBkhgg6NQZaDs0wJDGhJwDMlUKVIG3IlmyagM3p7X3jaP68/sGnFZd/44ZkvQ8WGZ2ROIEhEpwoE5VECWW4Yqxao1GOqScxItcBwpcToeInhaolqPSLNLVluJkoeveHFCFQF8B72DcHC5WCEk0IEkhS/fxiMcJhAAMdhAoE6bcgZpA4yDgjB9BIU45O1G1de/s0fnvFSBGueNGQCEQA9LFR4tEPJvVBPo4ly1DPXCJShgyEyXn60M6klEbXUkUxUmoMRkEPVIICzekTzYBAwAjsH0NU1pFQA75lx1uB3DaDDVTCGKYGCGlDhkCATwx7akJNIEzSvAIZgehmf3rd+1dO//eDpP4aoNaIcEkwFCOZgGcWrkOV2srw5GBqNIBmplBrHXaO1AuMTVanFjNdjkswggB7R8RyqQqTHP5Sv1sk37sadtwoEUGaOEbSekm/YxWMF4kEAJUBAc4aTAzxAG3J33r9UudZVcLkhmM7LMev3r1/59G89ePr1ImrmYMgc6kamCkBVUAWvQiWJGKsWGas3AmSi4smjrkZ3UqSWOLwKuRe8BwWMHOpSIqtMO2PwW/fh+7swy/ohzZkxIuTrd6JDFXCGwwQCKJADjkBAPWtdDztoQ871wKc3Xjj66gtvU5ICJygQYGom860HTn+xiIoRneUzE4DJV+HQ5zS3jNViKvVCIzTGapMzk6GxcmMoX6nHjV+TZpYkE1TBmENBIgCiWHOwTmI6eiX/4VYoxpj+rukPGxFwQr5xD37THp7gP1zgQaqgRUDDkXJ9Fx+nTbn6Ltj5YHGIyzUlOeFONbB5/cGpwT+CGNFZtBoMcth6cJabRkjUs4gks42OZGi8fLAaQVKtxxMVUUliaqnF50fNSmSqgNgpLcPI5AOUd2/AXXQKZn4P5B5UOWFTKZpv2E3+4DYahODxKJhRxfdJyFzYVjX8D23KVQ2YNX6ElAxwIWhO7AvL1m1efuFEyLwUsEa0PWcmRhEUr2bq2MqQedvoQEarxcbcZOJ1alZSaAziD75muQCgOlkcdszljIKhfdjJeU1253rsmcuxKxeAtZDnPCUiYA1aT/HrtpNv2QcCiPAEAgN2DPIaaBHwzFmJ5y86lrOXNuU6lkOn+CGYCpqnLDzxv2nH4rO+PhEyCq4FQ+bILS4UAAUEIVeoJVEjMMarxcaR13C12JiXTA3jSb0hb6wGG3IPHD4zMYo1yqxiDGQ5+Q83o/uGsWuWIH2dYAAPqAfliclhSZvl+O37G52MDo+BtRyDIAV3QEmXC3ORCkSGr3QY3kMbc/McfHn9paOvPueu8c64WsIbguPksmT77vmn3nLv2a/Mc1O0xrfMarCgGFEUoZ5Z6knUCJTqRI1MBcnkcVeJetZYC278fJo/9u+VwiTTCBXmBpFG+d2D+P0jmAU9mGXzkJ4OpBhDZEAB1aN+D5Bk6HiC7h/B7ziAHxoD5XhCJrBgBsB2QN4H5MwdBiTlIfH8dAI12phLKvBIpS9PE7ePAguBnOMSrvrfvb9/2c33nPeqehp1nKxrZUSOnJmAkuWWqQcSG6ExVi0wWikx2JiZFKgmcWNuMvm8iUUfM9g/9HrUzCSwBrzH7xpolJQLSFcJKRehFCOxo0EVradotY6OTdRoBerpVGIbMARPgdulqBN8F5Az+1mQcYh2aJlElgF7aWNO1tNQNPk+wAIpwTGHzPBoZ9/BTqZSj3uczWfkKXgjCnJoNVhVSHLbWAkeO1jVIsOVIqPVwkQVD1YjVLyXRuUKqiACZqqcVYKnMmcRALSaoON1GgwgQoMCKPjD/gt3lhMQCJBBtFVJlwq+F9BGzT4GUDAD4HYrkrIS0f8GuRbY2L5B42lYu/b0PZc9424lNxyDwPqsXi8Uv3rv2T8+0TEsjI4zZARAjlwJFhQEBMi8aWxs1dJoagg/GSgjjWF8ufF5qoMhzQzZYU/BGwMCMDXYNwTTbSqxn3hNzxBMJwFyiLYr+biQ94MWOURpX8IkDzIG9gDYEaXBAHCqop/0yHXAAdqQy4WG/3rw9AOXPev2cepRDHieWGDU+8zYiZB5xc6B3tWxy580TI5+eNFMXaeSZo4ks40aqxcad3KN1A52JxOv40VqU9etVBtPwYPIVHHke2OUgiEIZjehwR5Q7DD4TvBdgi8CBlRAaDMeJAVTBRnVxiseMBxB4FKDfsyovAyo0GacUxpKqe73uR01sOBJgiYQnYD/+v1n3rBx98JzYpcBIKJHBIki5I3trIMlVJP40WtURiuNMGmsB1eSyZlJNXGgNCgcCieOuE4lCAID5GCGwAwrCKgFDO1FQXLAA8ok06jHJXCtyfWfXcYbAE8bcXFdAfjy7efVX3vdyr1nrN6+iCTiMQJB1OCy2n0Pn3rV+p2LrywXEqZQSx3j1UIjOMZrcePZkpFqibHGVfSFxtPxuZep4AFVMHLYMb5RjlEQBDJVUySjPcmhOhaZ48aJ2gC8gzbiakUeFTu/Gbhgzv9fVxFQAcyhH9c6pfruu3549iWfvf3C68brMaNTYTI8PvnAYpJaktyRpIbcHxkkIjSIKJGlBQUGD9SJKfB4shxUAWFGGQEB9InHgxOlyFN+KJcjWHIyHIKnbQlzgtDwNlFZD3yMNuGMClP4yNev2PIHr/9Uwuy+NFWYZB4twQAZUAcSIptgzSjKAdBBusoH6JAD7/i7Z57xpW+f87bhasEAiDz+avDUFfRBGxGgoh3s4HQqdPAYCj09OZEDVWaMAEkqZDlPqFY2pIBwfERgvOao1CKMKFMw5NQoUaMDIWgDoqLvSXLZCnybNiDn3KBM4fzVO6OP/+E/vpGx4nKElPZ2eJAI4B8tLznoGCoDGB0hZQjPCDCI6DAdpWEg5TB37Ty9+6ff+fJbNOOyMC+ZvQTlaKqQ5cJvvWGQs9ck1BNhpkRWueehIht2uCdZQReeCmeVBzYWeHBDTOR4HErQVjYoPBvYTotzh1+1/tC2JemB8d4t/XZ8Jd7S4g4dbSkCCJMEUESqwDDoOCmjwADIAIYBhnSIROuIJkDO0QarHO7OTSvNL3zs+vdIzmVxCJlZzWM4mgLWgnUCGBBhxhgFDNooZVoJGAMKqADa5qdPwRoR3q/Ii4E6LcwhwuE+e9OlP/yZF996pdStAErzCMBRQWIapQCSAOOI1ihQRWQYZB/4ARIGQSvAOGiVCE+D0tDPcfm/7/6pt2d59Kq5+7R86GjiWImsoqqgzBxVQJGpmk6C4owigKgSzALKtaL6V8CbaGFOvHK4j9125fb/88LbtiF6CirpSR7EW8CACkKGkjZeY6kBQygDCIP06jCiYyhDGB0FasyQt7//xT8+Xo1+p7usKHNRoAjOeVwjaGhbChijiBDMJsIvA3cD76dFOYQj7Bvt8A9tX37XWadsOYV6NF1dzZEdCQqgh90AmYKMgQ6BDONLI8DBGsDoAGUdATLAA5BwUrzjo88/7QP/e+k/9HaqUdpLkgkCRE45QYFC5MA52p41IKJMJ++FegJewVmIoxBmTfCXGLkXuJsW5DDC0f7iw1ev/dff3XxlZHQlXpLj3whXATFTr4KQA1NHWTKOxiMIA6gOYO0A3Z3DoAlQAzJawL++75LyP3/y0g8sXswSlLahCEkGK/r34L1lx8D8E3zYM1DAWW2UqtC2VLAWjIACwolLUqFYUC48c4zOzpRde4us21zGWbBGOTkCEfryTD+wa508Bxigxbgda3mMHWvPSn7r515w8xnLv/jTjJcdQgYIU47qTgyCAlNBIXXUjTVCRMwBvB8kYxiRCqpjwNgRWZLkUBmg1Xzq3vP+on8+V6NKO0kz5bVX/y8/+4J/w6vwL196E//zvRefwG3MgSrEUx2N0r4UsFYRAVVATjxkli+q80e/uJ5nXDIINmdsLOaTX1jKP3xsJV4FI8rMC1TBGC5Yfq7+A/A6Woxbfq7yeF79zms2/O/v3PXF1Wt2v4jUxkA+WeJBKogMgg7hoyHUjQIjiA6jdgCo8yhLu/n5v3rda9bt7PqleZ2KajuFjLC49wC/cO2/M3/eThDPm174L9x83/Op1EoYowTHTxUiB1Gbz2hQsAaMQK6cEK+Cs57ffeNGnnH5fsgsJI7Ocs4bfnIzewciPvDppZRLnFzBa9Nxvg38My3EpeM8oRf//ltv/9Nf+d+9jNpTERlD9AA+HkRdBUiBjFlmy76+0773yLK/6i0rqrQXgdw7kiwGkwNKksZ4b0A4AYFzOlG0PWMUkenoZuC8NVWedsEQeAteaMgEYuGFV+/nEzctIc/lZB+hhc4m5h1JVb4F3EeLcFkuPJlf/8sf3wRsYg5QT4zjX4pllghKu4mssm+kh7/5/Fv55Rf9UyNg/v6Lb2asVghHZyfc0SjOKr7dt86sRYQTHtKoh45yTqHgwXMUoaOUUyp4RsctJ1GgYCzzSt3670bluUCFFuA6ugim5J7fRvT5tLHYKV+4+3nc9tBVqAqj1UJTlwFUBQARbf+gcUo9EdqRGosKdGYDRMwjoYCgJ9DhwZZdRXbvK7B4aRUS4RDPI1vLDAxbirFy8gXqudKj7wbeSgtwXhUIRLka4bdpf41gqdSLyNT7Zq5YR/bQ+3buqiIH1tBmBDUWUOLxAboGNtAxvJWSXs8YBU5E5JSde2Pe8z/L+f1fegSJcyYpe3aXed//rsAaECFoEoU3Gy83AV+kyZx4Ya5TodOL/iNQYpawRpu+mPDMs2/nLTf8Lbka/v7zb+FbD13RnmEjUIg9SpsQwYtF1FMc20PngY2Uhndg8xqIwZkMPCesVFA+/uXFHBiOecXz9tDVnbJpa5kPf3YpD28pU4iVoKmMN/q3InInsJcmcmqZ88aL+q6OCheqMA0Cr0JXqcrvv/JdLFvyCAj89sv+gtf/wwcYrnTirNJOBCjGCtoOAeMwPqU8sp2u/esbQWN8hheLNxEGTyzptKw3i0DklC9/ex5fmag4gmodIkcImRahcHqk+hfAjU1eplHmMoe8IK/ySypMk0CByGV0FschiwDoKIwT2RSl/YhAIVaU1qQiYCwmS+gc3krnwEaKY3tBPdoIGAdTRJRIUqaLyGRnowqqQkdJCVqHACm83iBfAD5Jk7gcYa6q7qdHO/UvSiWmMW8DIzAw1sW/3/xGfunH/hFV4X23/h/2jvYRGdpSK/4TuopBxWKzKh0HNtF5YD1xdRDUo8aBGB5PbFJUpj+MRZSg9SgI6J/1WfkGsIcmcH2WOcsu5I9S5QJVgmm/JRg+/I3X8I0HngkKW/YvI7KKtHNHo7QEFYuKIUrG6BjcQsfAJqLa0KHhvxieiAAFk4ICAhB4FbwHY8CIMtsI4GH1/lz/FPg/NIHbnytz0f7N8rwFp+ibUGZAIALWwMa9yxAgsiAA7Ro0BW2JFWUQotownQObKQ9uJqqPosagxnFslILJmBTkXjAC/V1DDFV6yf3sfcBU4MahnfIZ4NOcZG54pzDXdPTTOREyfw5EzJhARCm42RGahQhQmmIqRIgrA435S3loKy6tomLwNuJ4CBwxowlLK2P81kv+mqed9W1uf/jp/PlnfoXhSs9sDRuZt1L/DOQbwCAnkZu3kjnH57wJ5RKC4JgoxYKiJ3uDzFhEtTHYn1xR3o7N6/ipAf9TFZGiBJU6/NTVn+cl13wU0iIvfuZ/sm7Hmfz7La+ho8Cs5DPOUOG3gd/iJHJ5ztxiOcegv6UEwY+mj3Y0Hj1J8xdvY0RzyiO76dr3CMWx3YetKDtOlCNlUhBFCQigFlAil6DKrCaqb/bCfwPf5yRxijJXjOzDdHbxp1KglyA4RgKNjgZlxqiZDJhiMkDf7g1UNhygo7bniBXl6aE4MiAoxfCZ79/AFWu+z0Vn3M4P7n0hn73reooRs5ooJYG/3LNIrgUSTgK3d6EwVxQjXhlV9cVKEBwjBZGZu8rH2wg1jrhygAWbv8Oy9V+gsm0F++rnoNaAGKaTAFYzILBGOTA6j//3gb+lv3sfB0bmU88cziqzmQoIPHPeADcC7zk5M5oB5oRinT4VfZtaguC4OAvOgSrTRPDWocZRHNnFwo3fYNGGWykObQeTomY1ahyQMt0UsJJjhGAqbNLcsvPAYowBZ5S5opDo74nwOWA3M8wVU2VOsLxVlbMIguOgCnGsWKOATEPARCDSeP5l4fpbWbDpNuLR3WAcuBhEmFmCJcOhKIKghAeMFWOZeyyr6qP8LvD/mGGuPs6sVx2Rs3qW6VtQguC4qApx5DEG9EQCxsWI+sb9Y4sfuZn5W76DrQyCdRCVOFkUsOKxeDIsc1egHlyZ/ytePgjczQxyUVGY7Uq9/F6W0kMQHCcF4miqo1GOi4ppBIzxGT277mPJRMDM2/Z9TG0EXAGiIiefYMmxkpOqRZjLAhHK4vhD4GXMICeO2U24Jkv11TwFQaAKhUgx5ngDpoBLK/RtuYOl675Ez64fIGl1KmBKNIsqOMlxkqEaEwSq+lLgBuDzzBCnqsxahkhy/hjBcYIUQEGEOSRQnepoLOixPAPjYqLaKAs33dY4Iuva8wD4DGzcCJhmUwRnPFY8KCAQBAp/LCq3AhVmgEOF2ao6yMvLffpcPE+ZKtQTwTmInFJPBfXh+zbm1tEZGDmWFeUB5j/y3YmA+Sod+x8B9eBiMI5W4iRvFEEwxSiX1or6U8C/MwNcvajMRuOdUuqp6++gJxYyWS68/Ln7eNWLdtE/r86mbR188H+X8937u8P3oc8FCoVDM5rHX1Ee3cPCTd9k0SO3UBzeCgjYCBBajQKWyaBRDgkCl/Mb1ZJ8Ehhimrk0FmajZQO8rlriIlWesloi3PiSXfzOLz5Cgworlla54txh/t+fns037+qlVFCC2b7e7LEWcn/kinJ5aBuL1t/C/E23URjZBcaBjQGhdQmWvFHKpCBQAZdyWlfK/wX+imnmukaYdayntyb66xiesjwXFs5L+ZmX7gAEEgNTip2TP37H/d14bzBGCWb31pkxkJoCeN+44LKxorz5W7jKAJipFeU2oIAjx5ATBIdTAUHfIiofAfYyjZww+9QtP2XhTE5AlsOKRTX6ulPIhSOosLLxczn7Bg3GEMxSquAKESZy9Gy9n4WPfJX5Ww+uKA+BmxrwtxXBkGPwIATBERRW5OjPA+9gGrkMZTYxnl5n+FUVTogxMDgSUU8MxY4ccg4RZWjMMV41GCGYzSwsGl3H2V/7AMUN9yFp5dCKctvyODIeTxAY4Ze95z3AbqaJQ5lVROQNKnoKJyhyyqadRb7y7QW86sXbwFjwAk4B4dO3LmJ4zFIuKsHspAhxDOft/SKlka+B6W0ETPsTXPg65ycWLDoYNsAfME2cEWYNL9Kj8ItME2fhbz6yEms91z9rH8VSxsBQzEc+s5z/umkxpQKzXTg2M9ARZ+BKoIbZIibjCQWB8EaQfwZ2MQ0cIswWBm4EPW36gkYZqzre9i+n8YFPL6e7K2XfQMyOPQWiSBEhmOWcKJ1RFVSYTSJJEeGJBMFihJ8F3j5NQcOs4A09NtdfUqaXs4pX2LSjiGoRYyCeEyETKOAkp2xq4IXZQoFIwtFZ8ORU9Y058i/APk6Qy5RZwRpepjlnMgOMTIbL3BNYySnNsqABIZYMEZ5QEAisMJbXAH/PCXLG0vb21Ijnj+mb4m5Qz7QIAgUMOUVqgDCbxCYlCJ6MKCj6i3sXynuBCifA7VlI2+sf4kVxlcvUM62CwOIpzLKgUaAgKUHwZFTA5py1bDs/AXyIE+CWbaetqSBi9Jc80y8IDDkFnX0dTWRShCD40bzTX1DkY0DCU+RyR3tTrhR4LtMsCBQQ9UR+tgWNEJERBMdEeRpWnw3cxFPkMEo7k1zeCDhmQBA4UqxPQZhVnKYEwbEynp8/oaAxnrY1ulNWdyzWV4ow7YJAgbJUEfGzbkZjJUNQguBYeOX6eUbOA37IU+B6RWhXbon+dAI9zIAgUKDLVTEos43B4yQnUxcCJ/iRBApDXt8A/CpPgRvySjvKPB3G8JPCzAgCVeiJK4goKLOCqEd8huCxeDKC4Ngo/DiedwCDHCennrZUynhuvcA5KDMiCBTojiogHlRmQcB48qhIre8UtsqZ1IcjBCUIjoUKKwuZ3AB8hOPk4kxoR2msbxRlxgSBBzpdFVBA2jZg0Jw87mS8dxXjfavJu/pIBgyqIEIQHBNRSGJ9AyL/ASjHwSUF2o7COaI8nxkUBKrQYaogSrsRnwNKVuhuhMvYvNVkhS5AcXlGJAYhIgiO09UevRL4HsfBeZR2EyfyijSmLMqMCoKSVAEPWFqfIt4DSlrqY2zeqYz3riCPO2BqNgOgBqwFhDYQqAoAIkqzCTjNedVxB43mtBeRUhbrT4oyo4JAgRLtcHSmiM9BDPWO+Yz1r6HSs4w8KjV+XHzG0Ywo1kDuQQhaVT0VjAHvQUSInTZ/Nd7wciPydmCIY+QiK7QTD89COY8ZFgQKFLUK+JYOGDWOWtcSRvtPo9azhNzEiOaYPOWJiIA1Sp4LCEELSjLhGWfexY3P+RC1pMQ/f+UXeGTXKURWaSphdZZyHfAJjpHLUtqKi/Q1npMjCCKtAdqCA36PGkeldxVj/adS61yEGjsZMD7lR5gKGoIWleXCgu5B/vAn3snKFWtBlN7SCG/8139GVZp6jGYE6jV97XEFTVpT2kWlLIvmwbWcDEEgEOU1UG2ZgBHNyV2RavcyxuafRq3cD2IOHZEdCwURMEYBIWg9uUJXcZwlvbugVgaXsWrBFiKXk+YOoXm8h2I31xRgNbCZY+B6umkfRZ7rKywRZlYQKIIViKUOSEsETBZ1UOld2ehgklLfoeG/ZhwPBYwBawkrzi0qsrDtwGL+5/ZX8MqrPkFWL/CRb76OauKIndJs6unLM7kO+DeOgcsToV10JPqaNAKUGRUECsQCJUlApWkryoKSxl2Mz1vdWFNOit0IiviMEyEyFTQErciIknvHn336N7jl/udRSwrcu/k8Iqu0iiTSVx9z0CSR0g6sl9UKzxBlVlIVVMEYJWg+VShaT9nVOal0MkTMRKWlHsbnncJ43yqyyRXlxo9PB0GxRglalzWKqvCtBy9FBAqR0kpEuRzkHOABfgQnKrSDzPI84+mfrYO/3EMhUqqJUIxaYmc+bJzZlLKtA4YZpx7yFGze2CA7sPAK0r7FZIetKE8nY8AaQAVQgtYkohRjWlWH8bwQeGDWfE2AoC9VZp/MC/O7Bnnri/+O5Qs3cfNdN/Cxb78SmrpZEqhCbNLJjsYLM0chq4MrMLz0Qg6cex2bRq9idE8nkWSYPGUmiIAxoDx1QaBWX6xe/hbwPAnnhZZnhGUqXI3Oxm4GfuY5H+alz/wPyGIuXXUfa7efxZ3rz6cY00xhRmMyimaGgkZzyBKISgysega7z7iWoaUXYYoF/P3SCBixyoxQEAPWKKBND/R6ImQ5GAPFOBwftxNVnqY5pwPr2v5mAF/gOnL6mIVEYGnfLvAOkhKURpnXMYQSND1oJKUgCSBMG59BnuALPQyccs1EwLyA4YVn402EzevYtIpoETAz/MVnYG1zj85yL3gPF505xtLFNUZGHfc+1M14zVCIlLYQFK3R639k0LT6QDDOReqi1ymzlMLHv/NKLjr1Hnq7DvD9e6/jro0XEzmCJlIgIqUgdVABmY6ASck6+tm36ir2nH4tY/PXAGDyFJvVTvrZvzWK0hzeC3Hk+fUbN/Gya/dQLKXgLXf8oJc//MfT2La7SBzCpi0oXBfJkx+fOSdCK6sYXWAyns0sVYiU7667jBv/4QMs6dvND7eeS6VewFklaC5HRsQJdjR5CupJuhaz99RnsWfNsxvPwogqJksApVmMBRGaolqHN7x8F69+yXbILSQODFxx8QF+942GN/3J2WiYU7YHy9N3bNCVwGaegNuxSWll3QvlilKPLvQ5zOaw2bp/KZv2LCWOCCHTAhSwpIgmIBwnfTRgaj0r2HPac9k7ETAHr4kRzRvdSytwTZrR5F7o6fQ8/8r9gEAuNHggt1xx/jCnr6zwwMaOMKdsA6p09S3l6U8aNH1LaWmurNf7nFkvsjpRBM2ioHrYew9RWod8CLQAGBALGECefEUZqCw4g12nP58Dq55GvTz/0PFYi9AmdjSqUIg9pWIOCEdQKERKuehRpU0ErsSLgY/xBJwr0bKMl06vejUzJAjUAwomAhuDLYEpCJGF8bifz5Vfy7xsiFXZVvrzfZT8IGBAYkBoUIW8DjZmdMn57DrzOg6suIIs7sLkSWPA33JUcFYx0pwHEQ8MOR7e0sGpp44Chkc5z/adJbbsLIY5ZTtRno5IHzDI43AgtKrhbs7sGuEMhGkXhIARIOqCeL4Q94DrBAyI0DDEIv5KfwUBYvWsTjdxcf1erqp9k/OT+8HXwAu4AgMrn8aeM17A4NKLyKMSJjsYMJXWPhq0IAIKCCePCIiBf//vFVxwxihLl40DAihp3fHPn1jJnoGIclFpE4GwMk64CPgaj8PFCS2rXOFpCDFtJvdCmoM1tNLdRMHhx2LdUFoO8TzBRICC6mGvgAARk3IMD8VruH+iPtXxEi6r3cWra//N6kUR209/IQMLz8Xb+NEV5XbgDJMUkJM/l3xoU5mff/u5vO76XaxeMc7wcMz/3rKI2+7qDSHTbhSTW572hEGTW1qWy/Q6lfa7TqYUJ5yxZBv7Ruazf7SHglOUoNnUgzFQPkUoLwOJQD1ozo8kQKwQA5lEfKP8NO6YqCsXJTx3YY0uWyfNarQNBWMUEVClKQqxsmlHiT/8p1MpxlBPwQgUC0r7CbzRFwB/wuNw3mirzmfmqeEStL06md6OYd792j/kmnNuY/2u0/id/3wXD2w/vQWu9g4hYwvQebpQWACaN+opMUBJIQe+sTlm+5DwE+emLOrISHKhHRx+dNZMkdOJAq9CqaCI0KYChQuNyjJgR9tcqpkZvUyURbSRegrPPe+bXHPBVyEtcdqp9/CKKz/N2m2/gSIIStCkkClC95kQzQPNmBYWsBY2DkV8+Ae9vP6CIRZ3tk/YWAMitAQjStsLenOjzwD+i6O43CgtyculiDraiAiMVLtALbgEUMaqXShB0yiYCLrOEKI+0IxpV7Cwa8zysR/2cONFQ/QVPKmn5VmryPQNaIJAQC5/3KABoQWJiD6DNlOI4Btrr+bfv/RLvOiyL/DDTRfxn996Nc4QupkmUYXOU4S4HzRjxhQsbBtxfOahbl53/hBGwCstSxWcDUdV0ysQ1SuACEg5jBNVWo0aehQuF23Db8VTx99+8Rf4l5t+niQXjEBkFeVkCzSHwgIoLQbNmXGxhR/ujbljR4lrVlWoZ0IrsyFoplkgcImKLDx6TuMQodWo5yKDLqQNGVEKDlSF2CoAStAMxkF5pYAAnhkngBG4bUsH5y6s013w5J6WJQLGMG2CQKEL1UseGzSqtJoCPD0BEdqXiBI0j+ZQXCJEXaCek8YZ2Fsx3LO7yAvXjJHkglfwKqiC0jrksK8LFmG6BMHVwOc4jKMFiXARylMTBArGQmERIJx0kYE7dpQpO09sob+c0V/K6Yg8CmReaAUi4CzTKghUuIijOBVai5euOnq28NQFgSkz2c3kzVkbHqwa/vfBbkTACI2gOXN+nYsX11jenTbCxitNZ4yiTJ8gEOV0PPOB/UxxktNajC4BziAIjpVyiDB1xYyABTxNYQQQUCZr77hlx1iZ7+8ocdXKKs9ePUZktHndjYaOZsYEq3CsOiJocLQUUTlPVQsEwZNQD3gQe7AO/Zjmk+U6QQyop6nksC7HArVc+PL6MttHHK88e4SuQt6UsFFABKxTQABlmgSBQeVC4C6mOFRoJap6OcGTCQEjU7cu9wuuA0x02LclVyAZVGwBUFqOFbBucg069T381PlDlCJP7oVmsAZUmV5BoHoZ8P6W3ToT5QIVguAxNAfbAR0rIZ4vGMckZZLQUFoqAGhOyyo6WLc/4qYNnbz8rBF8E3JRRDDWoEy7ILigZbfOjJcONXoqjyMIIRP3Q9fpgi3/iEsxDaC0vNjC7TtKnLewxhn9yUm8I01QY1HxdMkoTroAwzQKghWozAMGWu7oLDe6WmApRwtCyPRBz9mCONCMJ6e0BSNQz+FbWztYMy89aQGDeopje+k58DDl8Tob7fOoaBGDMk2CYKEYPR24HcCJUVpFlLIyjehGaQgC1anr/U8TJALNmVUiA1uGI/aMWRZ15swIEVQs4jNKwzvpPLCB0uhOnE9ItA8RBWU6BUExyzn10aDJclqGWDkdVYLgUR6KS8B1gubMOiIwlghbhmOWd1fImT4qBhWL8QkdQzvoPPAIhfF9GJ/jjWuU9YrBo0yvIBAjpzHFiRFaRS6cI8qkIFAwMRQXCeqZlQTIFfZXLF4B4cSJwRuDTauNgOkY2Eihsh9UUWMbAQOgCE4yLDkoIEybIDCiZzHFGVFahnI2QTBFPcTdgikwq1mBSmLIvOCsnlAHgxhsUqFraAudBzYS14ZQpmYzwmM0gkY8yjQLAuVsFRyQOaU1uFzKip7qDUETeS8T1TpXyLvyoQcvZzPlqVNjUQxRbZjOwc10TJSrjwHgjeOJKIIjx+CZAUGw0ov0AvudF6EVpJaVRukmaAqvQq0GnWWlsytj/1CEVyjGStMoiAMM4Jm1vEIpUqwoelwbZAaAuDpE54FNlIe24NIKKgY1lmNhJMdJxgwIgk6Tc2ojaExOSxDR1UAHJ13gPYDyhpfv5seevZeuUsb23UXe898ruWNtV1PDRhVQZjUR6C9lWAM5P5oaB+opjO2j6+AG2fAObF5DZWr+cpxiSZgBQVCY+vv6HU5EaQUCKxQsJ11QT4W3vHYrv/j6zUwSVq8a44IzR/nld57LnQ80L2x8Cujs7mY6ImV5T0rmBTH6I1aUc0oju+gcmAwYyTMwBm8inqqCpCjTLwgUVgO0zowmlZVprIhyEgVpJpyytMZrfmw3qEBqmGTo7k14/Yt3cPeDZ+IVjHByGchGFc0FDKDMOpmH1X0Zyzszcg/OPP6KsvUppeFtdB1YT2FsL+Iz1FjUOk6UI2O6BYEA3rMSwKmnJWSOlaKcZEGWw8oldXq7MsiFI8nEz9Xo6coZHXcYq5xMYiAbm6yoB1SZVRQwwFUrKjirJLkcETDeTq4ol4d3NI7I4vEDgJ8MGOOYLpGkTLcgUMAalgM4a2gB4lR0GcpJFlihMfiv1gylTg+ewygDQxGVqsUITaE5VHcqUY/Mutvs6xlcuqTOuQvqpF4A8DZqlEvG6TmwlY7BLcTVAfTR4b9jmp3kZYBwglBPQBWcg2KsiDBrKSxFKDkVmk6ML5PLYk66IIqUdZvLfP3OebzouTvBOfCAU/DCp29dRK0ulIpKM4iB+j6o90NxMfiMWaGew4runOvPGEWA3MSoGLoHN7Fo407qG8YoZSMogjeOmeQkZ+YF1bpw5uoq11wySKGY8+AjnXzr3j6YepxgllqoaIdTlGarDkix2MVSMZxkgchkvfu9p5Dm8OwrB+gqerbvjPnwp5bzpW/Np1hQmkYAhdENiikIUR9oDihtySskOazqyXj1+SN0dTqSXOjcv55F629h4ZavMbLvPHZkF854wAAIEEnGzApqdeG6Zwzwx7+0nr7+KgA+t/zXF5bwp+87FVUQYTZaVEil7Aqp0Gx5Kn0q2iMEzeCsMjQS8bt/dwanrajS1ZGxY0+BHftiSoUWaO0FfAIjDygda4TiQsCAekBpeQqoQuohtvC0FXWuOzOh23lKOx5iybovMW/7nZjaCDgldzGaGyBnmoX15ibIcmHZooTf/7kN9PXXIHEAGKf85Et2sHZjF5/48kLKRWUWKuYq/S5XodmiBSxTxRA0jXOKKjy8pYRXcJaW+j++GPAJjD6kJAegtERw3YCACCBMqyQFryCcGCOTVYqU8+alXLLSc3b3CL0772X+uluYt+MuSKtgY4hKIAknWyQpCDMkSFK49OxhFiyoQ2p5VCYQw9UXD/DpWxfgVTCizDZZzDKXxTSdKIsImk4ECrHSsgwNtT1Q36+4TiZKMDGIZVqoghG48oIaXR0e709s0aJgPf2dwpI+Yb4ZZuHOO5l3+0307F4LeQKu0AiYZookm8FLNQNVsJYnZI1iBJTZyaALnUFpNoWFBMExEgsopCOQDiso00YVIgfXvniMJfMzslxO6A6y3BZw4weYt/l7LHz4Zsr714PPwcbgirSCiJRg5hRiuOehLoYGY3r765AYGqwCyvfu76Val7Y9OvMqpBkgEFsQUQ6nqgucqtJsgixUjkMQCIgw7VTBRAoGqpkhzzluOvVdL8WRvSzcfBuLHrmF0uBmwICNwDlahU51NJEoiiBo697Fl4AIFCMQ0baagW7eUeQvPria3/+FDZQ6EiYJX7x1CZ+6ZRHFuH1DxpmcS864jyQp8sPtZ4OCCIeRBQ4kdDRBMAWFOAJrAeW4eBujYhoPWC7a8DUWTlQ8uhtEwBVpRYpgG0GTkmhMK8q9UIrrXHfhbVSTIt966Kq2m2cUC8r/3rKQrbtKPPfKA8RFz9p1nXzl2wtIMmmEUbtRBMj5rZf9Ba+6+uNkueNvPverfOjrr8VZEJQpCwwtwAvzaAFBoEAhVkSUYyIG7woTVaRzYCNrbn8PF375d1l+z38Sj+8DVwAb08ocOZFkKK3He8GahD985bv48zf8Cn//c2/iTS/8F9KMtlOMlbse6OLd71nN2/7xVP7nqwvJPW0ZMgB5Dsv79/LyKz4DanBRwque/t/0livknkkCqvQ6VZpOlE6EpgsCVaEQ+R89nBUhtwWMz+je+wBLHvoK87bdga0NgW0M+NvmP6+TqaBRQGgpaQ5nLNrNtRfcArlDTMZLLv8c//7V/0s9LSCibTav0YmaHbsXIjBaLbN/tJ8lS9aDydk1uIRa6jBMUUAoO4QmE2PQDqX5gkAV4lgx5skDxmZ1+rd9n8WP3Dy5opxUplaUy7QbQ44lR2k91sC+kXls3HsKZ53+PQAe2nEmlSTGGaVdCe3PGmVgrIff/eg7ef1zPkStXubfbv55amlMZJXDFB1NJlBSKNMigiCOwIg+ZoPM2xiXjLNg27dY/PBN9O66D/LkUAfTpiweR9a6DxOPd/JHn/wDXnfNR6kmZT74tRtRFUBpriCyyh3rL+LeTRfhFTIPBacohwiUndBcAkWFDlpAEKhCIVKMARTUOHIbE9cGGwP+JetuomP/w+CzyYBxRdqZIhjxWPEorSl2yg+3nslvfPhtKFBwEFtFCVrlfx+vgsjke+UxSo4mU7QAlFrlvFoEQAnmcNDECs6R2YjC6B7mb/oWi9Z/jfLABkDAxuAcs4WhETQt/zezyAkCQKuFTGBEeRKFVgiaSJC4Fb5l0hqmtkAEZxQlmItBExUs5epeFjz8NRZMBExhZCeIAVdkNjIohpxWJyhtKYgdTScRUKCJ0ly45uzvc8MVn2HX/uV88OuvZ6xWxhqCOSazcNaBW7ngy/+AHRoEE4ErMnsJIh5BUYJgRkSOJhOIgJgmSTJhzaJt/PXP/Bod3XvBZhSiOn/26bdgjRLMLWpgyeiDWLsbXC+znQIGj8UTBDMkNjRbk4Mm97Codw8dPXvx1R5IC5y9/CGMIZhjFCESiF0GJmKuEJTIJAhBMCMiQ/NZwNEkkYWHdpzO/euejimNkGcFPvv9G8g9wRwUCZRNDRDmCgVKUiMIZog1NJmCaf6efg9vfv/f8Jvv/1ve+I8f4LN3Xk/BKcEcXAQwSperg86loBFKUscQBDPCOppMwLTCQ2EHRnv57B3XYQRiByIEc4wCkcnocFVQw9whlEwVEYJgJhhH85lWeQLZWYK5HjSS02Frc6yjgYIkCMz0VwUEIWjCtT9B4CSnaOqQC8dFOUQf53OD8BjKkUQopoZC6ojE84QElEkqAPrYzwIKqChPToglQVAUYZoFgTiCIGhQwJFRliqoHBkEhz4fWQgIYISalamC1CmpUfKp8gdLFDUKoiQGcgEz9T4VsCi5y/lObZBNtW3E3gNgVbC5AcB4wXmDUcH6g2UO/djUZ+uFKDdEmcUdfM0doqACioKAF300hIxRSmSIF1QABESZLkHgaD5PEDSjiVYQBXJQD5qDoYDzOVVxJNaS2cmQGImVfSXYV1b2d+SMFXOqsSePcnKXkUQ5SexJo4xarNScklgltZ7MKrmdChvjwSgCgGJQhElGPE48t4449td3gXiekBfIDW6qotzi/KHPcWYppG6ibKNKqaNUjykljnI9oqtaaFR3NaazbqknVTSuQx4juWASAQU1gAGVqfcCoByHIPBy0Us9TXY5cAfTLQhUjggSD6iZLBHAebLOAbRnN653F65zP/0927h26acYLtXY36GMFjOSQoZzKc5mWJtOdSegoqiAoFgFg2JRppoWBBAVBEBpECbpobA7QiQ5Xxw+n021hSA5T0oO/0OPei+H/7wCwmFnaeAFUcGoNDqfqNJFPj4fV+0iGu8hGp2HrXQTjfcRjfbhKj1EI/3YpAAK4gEFODqIlCA4StoKQXMpcCdB8BSJCuoBD6qThUIeQVauYnp2E3Xtw3bvxS7YSLz0IQp92ykVR+gojBAVhzGFCiauYiQn80UiBTNVqIAeHg7CTIkl40vD57GpthgkY8Yc3ZmIB+NB/KH3KpAWkaSAyQrYtIAb7yUeWExxcDHx4BKikXlElV5cpQs31odNQAVo1KH3agCUYE6qt0LQXAzczY8UBALKZOVANvVSBDqHiUpDaP827Mr7KC9eR0fXHsqd+3A9uxvdSsHVKOIxKqgaUEER8FPvMYcCpUkKJuNLQ+excSpomk50KnwA/NRnPRRGWYSt9GCrnUQHQ2hwEcV9KylNVGFwSePHG1W3iIJaUAMqc+gYLqi2QtBcANwFOILgKOIFMvAecgsaK6Y4Sr70YeIV99HZu43SvK24JQ9T7N1BVzxKwSYgHgGMN6h34C2qgkdoYY2g+crQuayvLQHJaHmHh47kIBw6R0sj4pEFFBrdz2KK+1dQ2rOK4oEVuGoHkllMBmqYCiAlmJVGWyFozgLuJHz5WaACGaiCB0Qg7R6Fxesp9m+iOBEm8cp76Vn4CD3lfdjiGNYmRCqQOdQ7vBoUoV0VJOOmkXN4pLoEJKetiYLJD1UeIUkRk5Qp7l9KefepFPespjiwbOLzcqKxTlAmayp8VJS2Fww4mk1JEeohaOYgL6Cg+WRlRWDRdgrzdhCvvpPO075Lb/8GCr27iMqDlCTD5g4/FShkEaQxGS0pfO+KCuSuUQ2iqE3Jy0OMrz7A+Jp7AEEqXVPHbkvo2H4GHdvOojjxPh5eiK2aqW4HkDbteoKkFTqalcD3gCUEs5yABzLIPeRlj+3eg5x6Nx2n3E7vwocpLn2Acu8OOkyCqIC3jdKJ8gizXUEybhk5i4eqy0By5gSTH7aIoKBgR+dT3L+M0t5T6Nx6Dh07zsCN9+CqEQqoa6MFg2Cro9lEE1TqBLOTCqTgFdSBdowhp9xF54r76FjzXbpW3k1v+QDW1bCAZDE+dXgi5iIFDMqc4m2jDpeXhxk/ZT/jp/6A/Zd/HlProLTnFDq3nUV55xl0bD+LaLQbyQUEvANEaUlB6mg2lQSoE8wScsQDkHkBdPWDlFffQ/ncm5i/9Id09OxqrBTH3qBZAX/wtd5BTgAg4W+YR4WP4uMq46fcx/iauyEpNVapO3aeRtfGi+nYfnqj87F1QQ2TZQGUlhDUHU0nVdBx2legAgpkkCn4vmGi+ZspnPtV+k+/je5l99PRtZeCF/zUBpjWOsgQfrQQNIGACqQxEIN4su79DPfuYfi8b2LGeynuW9E4Yut+5DJKe1cRjXaCCGpb4IgtqDiaTJWawChCOwoBk0BmQDoqmDV3MO/8r9B12rfoXfQwHa6KKJDF+EawBNNwnXmgBvKD5QAa3U5l5QNUVq1l7zM+RXEiaDq2nU3PI5fSsfVcXKWMeEGjJm2xBVVHk4moIlRQ2kAgXvAZKJCX69izv0fvWd+k57yvMH/eBuLiKDaL8AfDJS8TnNyts3DMBrVFm6ktXc+BS25q3GLQs/5SujZdSOeW83DjRZCT+dxOIFBxQvPFhtFaDkLQumuqoBkkJcWdeg+dl36KBWd+na4F6ykXRjBpgdw7tNZJRvDUCQYFlOApyqLJEiXp38m+ieDZd8XnKexfTvdE6PSuu7KxUOCqFu9m+o62wAvjcuHLPE2n/JvAz9F6QsDUIY3ALNxG8cIv0H/el+k75Xa641HwDs0ivFqmRxBLzu3jp3DX2GoQzzQJxIPNwWaQxo2g6XnoSvoefAaFgcVIBj4KgTMTBD7ojNJ0CntoHUEm5DloZ43okptYfP5EuJzzVXo792BRNC2Q1ztpG+HoLFADmXm006mseIDKyrXsuep/6N54EX1rr6Z7/WW4aoQ3oE6ZHoHCPqe0At0DQhMFXtAMvIJfvIPOi77I/Cs+2lhHLkZVSErkB4tgJikgBDP/bFfh0UWCofO/ztDZ36G4dzXz7ns2vQ9dSXHfYhBQd+ILBIHucaA0ncouhGYJAZNAVlSiM+6m7+kfZdE5N9HTvwmXOfI8Jq91cvIERjwnSaAGkhKIUlu8kZ3L1rH3Gf9L9yNX0H/v8+ncdiYmOaGNtUDNbocamk2F3YJyEgVe8An4jhR74VdZds0HWXjm1+hwFchj/Jwb6oejs3Cha9SorGOYgUu/yMAFtza21frveR49D18xeawWh8A5XiLsdSI0XVHYU1e8giGYWbngM8g7a5Se/jn6n/FhFq2+nZKtomk5zF5C0AS5myxRRs+4g9E1dzeuvOm/+zp6H3wG0VgBHx3renSQ5exxWU7TeWHYGPYDCwlmjgc/byelSz7L4qf/J/1L7ydWJc+K5HkHrSEwBK3zQHIRUMZXPNCovU/7DP33PJ++tc/AjfeBEDy5cTE6+P8BW01E00mieO8AAAAASUVORK5CYII=) no-repeat 150% 100%;\n background-color: #2238b3;\n background-size: 205px;\n background-blend-mode: luminosity;\n }\n .leftnav__header__title {\n font-family: var(--text-font-family);\n font-size: var(--title-font-size);\n line-height: var(--title-line-height);\n font-weight: 300;\n color: #fff;\n margin: 0;\n padding: 0;\n }\n .leftnav__header__version {\n color: #aab3ed;\n font-family: var(--text-font-family);\n font-size: var(--body-font-size);\n line-height: var(--body-line-height);\n }\n @media screen and (max-width: 964px) {\n .lh-leftnav {\n display: none;\n }\n }\n @media print {\n .lh-leftnav {\n display: none;\n }\n }\n </style>\n <nav class=\"lh-leftnav\">\n <div class=\"leftnav__header\">\n <h1 class=\"leftnav__header__title\">Lighthouse</h1>\n <div class=\"leftnav__header__version\"><!-- fill me --></div>\n </div>\n <template id=\"tmpl-lh-leftnav__items\">\n <a href=\"#\" class=\"lh-leftnav__item\">\n <span class=\"leftnav-item__category\"><!-- fill me --></span>\n <span class=\"leftnav-item__score\"><!-- fill me --></span>\n </a>\n </template>\n </nav>\n</template>\n\n<!-- Lighthouse header -->\n<template id=\"tmpl-lh-heading\">\n <style>\n :root {\n --report-header-height: 58px;\n --report-header-bg-color: #fafafa;\n }\n .lh-header {\n display: flex;\n height: var(--report-header-height);\n left: 0;\n right: 0;\n max-width: 100%; /* support text-overflow on url */\n border-bottom: 1px solid var(--report-secondary-border-color);\n position: fixed;\n z-index: 1;\n will-change: transform;\n background-color: var(--report-header-bg-color);\n margin-left: var(--report-menu-width);\n align-items: center;\n padding: 0 calc(var(--default-padding) * 2);\n }\n .lh-metadata {\n flex: 1 1 0;\n padding-right: calc(var(--default-padding) / 2);\n line-height: 20px;\n color: var(--secondary-text-color);\n overflow-x: hidden;\n }\n .lh-metadata__results {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .lh-metadata__url {\n color: currentColor;\n }\n .lh-export {\n position: relative;\n }\n .lh-export__button {\n background-color: #fff;\n border: 1px solid var(--report-border-color);\n border-radius: 3px;\n cursor: pointer;\n outline: none;\n height: 32px;\n width: 48px;\n background-repeat: no-repeat;\n background-size: 20px;\n background-position: 50% 50%;\n }\n .lh-export__button:focus,\n .lh-export__button.active {\n box-shadow: 1px 1px 3px #ccc;\n }\n .lh-export__button.active + .lh-export__dropdown {\n opacity: 1;\n clip: rect(0, 164px, 200px, 0);\n }\n .lh-export__dropdown {\n position: absolute;\n background-color: #fff;\n border: 1px solid var(--report-border-color);\n border-radius: 3px;\n padding: calc(var(--default-padding) / 2) 0;\n cursor: pointer;\n top: 36px;\n right: 0;\n box-shadow: 1px 1px 3px #ccc;\n min-width: 125px;\n clip: rect(0, 164px, 0, 0);\n opacity: 0;\n transition: all 200ms cubic-bezier(0,0,0.2,1);\n }\n .lh-export__dropdown a {\n display: block;\n color: currentColor;\n text-decoration: none;\n white-space: nowrap;\n padding: 0 12px;\n line-height: 2;\n }\n .lh-export__dropdown a:hover,\n .lh-export__dropdown a:focus {\n background-color: #efefef;\n outline: none;\n }\n .lh-export__dropdown .report-icon {\n cursor: pointer;\n background-repeat: no-repeat;\n background-position: 8px 50%;\n background-size: 18px;\n background-color: transparent;\n text-indent: 18px;\n }\n /* copy icon needs slight adjustments to look great */\n .lh-export__dropdown .report-icon--copy {\n background-size: 16px;\n background-position: 9px 50%;\n }\n /* save-as-gist option hidden in report */\n .lh-export__dropdown .lh-export--gist {\n display: none;\n }\n .lh-config {\n display: flex;\n }\n .lh-env {\n padding: var(--default-padding) 0 var(--default-padding) calc(var(--default-padding) * 2);\n left: 0;\n top: 100%;\n position: absolute;\n width: 100%;\n background-color: var(--report-header-bg-color);\n border-top: 1px solid var(--report-secondary-border-color);\n border-bottom: 1px solid var(--report-secondary-border-color);\n }\n .lh-env__title {\n font-size: var(--header-font-size);\n }\n .lh-env__items {\n margin: var(--default-padding) 0 0 0;\n }\n .lh-config__timestamp {\n margin-right: 6px;\n }\n .lh-config__settings-toggle {\n margin-left: 6px;\n }\n .lh-config__timestamp,\n .lh-config__settings-toggle summary {\n color: var(--secondary-text-color);\n }\n .lh-config__settings-toggle summary {\n display: flex;\n align-items: center;\n }\n .lh-config__settings-toggle .lh-toggle-arrow {\n width: 16px;\n height: 16px;\n margin-left: 2px;\n }\n .lh-config__settings-toggle[open] .lh-toggle-arrow {\n transform: rotateZ(90deg);\n }\n .lh-config__settings-toggle summary::-moz-list-bullet {\n display: none;\n }\n .lh-config__settings-toggle summary::-webkit-details-marker {\n display: none;\n }\n @media screen and (min-width: 965px) {\n .lh-header {\n width: var(--report-width);\n right: initial;\n left: initial;\n }\n }\n @media screen and (max-width: 964px) {\n .lh-export__dropdown {\n right: 0;\n left: initial;\n }\n .lh-header {\n padding: 0 var(--default-padding);\n margin-left: 0;\n }\n }\n @media print {\n .lh-header {\n position: static;\n margin-left: 0;\n }\n }\n </style>\n <div class=\"lh-header\">\n <div class=\"lh-metadata\">\n <div class=\"lh-metadata__results\">Results for: <a href=\"\" class=\"lh-metadata__url\" target=\"_blank\" rel=\"noopener\"><!-- fill me --></a></div>\n <div class=\"lh-config\">\n <span class=\"lh-config__timestamp\"><!-- fill me --></span> •\n <details class=\"lh-config__settings-toggle\">\n <summary>\n <span>Runtime settings</span>\n <span class=\"lh-toggle-arrow\" title=\"See report's runtime settings\"></span>\n </summary>\n <div class=\"lh-env\">\n <div class=\"lh-env__title\">Runtime environment</div>\n <ul class=\"lh-env__items\">\n <li class=\"lh-env__item\">\n <span class=\"lh-env__name\">User agent:</span>\n <b class=\"lh-env__item__ua\"><!-- fill me --></b>\n </li>\n <template id=\"tmpl-lh-env__items\">\n <li class=\"lh-env__item\">\n <span class=\"lh-env__name\"><!-- fill me --></span>\n <span class=\"lh-env__description\"><!-- fill me --></span>:\n <b class=\"lh-env__enabled\"><!-- fill me --></b>\n </li>\n </template>\n </ul>\n </div>\n </details>\n </div>\n </div>\n <div class=\"lh-export\">\n <button class=\"report-icon report-icon--share lh-export__button\" title=\"Export report\"></button>\n <div class=\"lh-export__dropdown\">\n <a href=\"#\" class=\"report-icon report-icon--print\" data-action=\"print\">Print...</a>\n <a href=\"#\" class=\"report-icon report-icon--copy\" data-action=\"copy\">Copy JSON</a>\n <a href=\"#\" class=\"report-icon report-icon--download\" data-action=\"save-html\">Save as HTML</a>\n <a href=\"#\" class=\"report-icon report-icon--download\" data-action=\"save-json\">Save as JSON</a>\n <a href=\"#\" class=\"report-icon report-icon--open lh-export--viewer\" data-action=\"open-viewer\">Open in Viewer</a>\n <a href=\"#\" class=\"report-icon report-icon--open lh-export--gist\" data-action=\"save-gist\">Save as Gist</a>\n </div>\n </div>\n </div>\n</template>\n\n<!-- Lighthouse footer -->\n<template id=\"tmpl-lh-footer\">\n <style>\n .lh-footer {\n min-height: 90px;\n display: flex;\n align-items: center;\n justify-content: center;\n background-color: var(--report-header-bg-color);\n border-top: 1px solid var(--report-secondary-border-color);\n }\n\n .lh-footer span {\n text-align: center;\n }\n </style>\n <footer class=\"lh-footer\">\n <span>\n Generated by <b>Lighthouse</b> <span class=\"lh-footer__version\"><!-- fill me --></span> on\n <span class=\"lh-footer__timestamp\"><!-- fill me --></span> |\n <a href=\"https://github.com/GoogleChrome/Lighthouse/issues\" target=\"_blank\" rel=\"noopener\">File an issue</a>\n </span>\n </footer>\n</template>\n\n<!-- Lighthouse score gauge -->\n<template id=\"tmpl-lh-gauge\">\n <style>\n .lh-gauge {\n --circle-size: calc(2.5 * var(--header-font-size));\n --circle-size-half: calc(var(--circle-size) / 2);\n --circle-background: #ccc;\n --circle-border-width: 2px;\n --inset-size: calc(var(--circle-size) - 2 * var(--circle-border-width));\n --inset-color: #fff;\n --transition-length: 1s;\n width: var(--circle-size);\n height: var(--circle-size);\n background-color: var(--circle-background);\n border-radius: 50%;\n }\n .lh-gauge--pass {\n --circle-color: var(--pass-color);\n color: var(--circle-color);\n }\n .lh-gauge--average {\n --circle-color: var(--average-color);\n color: var(--circle-color);\n }\n .lh-gauge--fail {\n --circle-color: var(--fail-color);\n color: var(--circle-color);\n }\n .lh-gauge__mask,\n .lh-gauge__fill {\n width: var(--circle-size);\n height: var(--circle-size);\n position: absolute;\n transition: transform var(--transition-length);\n border-radius: 50%;\n }\n .lh-gauge__mask {\n clip: rect(0px, var(--circle-size), var(--circle-size), var(--circle-size-half));\n }\n .lh-gauge__mask .lh-gauge__fill {\n clip: rect(0px, var(--circle-size-half), var(--circle-size), 0px);\n background-color: var(--circle-color);\n backface-visibility: hidden;\n }\n .lh-gauge__percentage {\n --spacer: calc((var(--circle-size) - var(--inset-size)) / 2);\n width: var(--inset-size);\n height: var(--inset-size);\n position: absolute;\n margin-left: var(--spacer);\n margin-top: var(--spacer);\n background-color: var(--inset-color);\n border-radius: inherit;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: var(--header-font-size);\n }\n .lh-gauge__wrapper {\n display: inline-flex;\n align-items: center;\n flex-direction: column;\n text-decoration: none;\n color: inherit;\n flex: 1;\n min-width: auto;\n position: relative;\n }\n .lh-scores-header .lh-gauge__wrapper {\n width: calc(10.5 * var(--body-font-size));\n }\n .lh-gauge__label {\n font-size: var(--body-font-size);\n line-height: var(--body-line-height);\n margin-top: calc(0.5 * var(--body-line-height));\n text-align: center;\n }\n </style>\n <a href=\"#\" class=\"lh-gauge__wrapper\">\n <div class=\"lh-gauge\" data-progress=\"0\">\n <div class=\"lh-gauge__circle\">\n <div class=\"lh-gauge__mask lh-gauge__mask--full\">\n <div class=\"lh-gauge__fill\"></div>\n </div>\n <div class=\"lh-gauge__mask lh-gauge__mask--half\">\n <div class=\"lh-gauge__fill\"></div>\n <div class=\"lh-gauge__fill lh-gauge__fill--fix\"></div>\n </div>\n </div>\n <div class=\"lh-gauge__percentage\"></div>\n </div>\n <div class=\"lh-gauge__label\"><!-- fill me --></div>\n </a>\n</template>\n\n<!-- Lighthouse crtiical request chains component -->\n<template id=\"tmpl-lh-crc\">\n <style>\n .lh-crc .tree-marker {\n width: 12px;\n height: 26px;\n display: block;\n float: left;\n background-position: top left;\n }\n .lh-crc .horiz-down {\n background: url('data:image/svg+xml;utf8,<svg width=\"16\" height=\"26\" viewBox=\"0 0 16 26\" xmlns=\"http://www.w3.org/2000/svg\"><g fill=\"#D8D8D8\" fill-rule=\"evenodd\"><path d=\"M16 12v2H-2v-2z\"/><path d=\"M9 12v14H7V12z\"/></g></svg>');\n }\n .lh-crc .right {\n background: url('data:image/svg+xml;utf8,<svg width=\"16\" height=\"26\" viewBox=\"0 0 16 26\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M16 12v2H0v-2z\" fill=\"#D8D8D8\" fill-rule=\"evenodd\"/></svg>');\n }\n .lh-crc .up-right {\n background: url('data:image/svg+xml;utf8,<svg width=\"16\" height=\"26\" viewBox=\"0 0 16 26\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M7 0h2v14H7zm2 12h7v2H9z\" fill=\"#D8D8D8\" fill-rule=\"evenodd\"/></svg>');\n }\n .lh-crc .vert-right {\n background: url('data:image/svg+xml;utf8,<svg width=\"16\" height=\"26\" viewBox=\"0 0 16 26\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M7 0h2v27H7zm2 12h7v2H9z\" fill=\"#D8D8D8\" fill-rule=\"evenodd\"/></svg>');\n }\n .lh-crc .vert {\n background: url('data:image/svg+xml;utf8,<svg width=\"16\" height=\"26\" viewBox=\"0 0 16 26\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M7 0h2v26H7z\" fill=\"#D8D8D8\" fill-rule=\"evenodd\"/></svg>');\n }\n .lh-crc .crc-tree {\n font-size: 14px;\n width: 100%;\n overflow-x: auto;\n }\n .lh-crc .crc-node {\n height: 26px;\n line-height: 26px;\n white-space: nowrap;\n }\n .lh-crc .crc-node__tree-value {\n margin-left: 10px;\n }\n .lh-crc .crc-node__chain-duration {\n font-weight: 700;\n }\n .lh-crc .crc-node__tree-hostname {\n color: #595959;\n }\n .lh-crc .crc-initial-nav {\n color: #595959;\n font-style: italic;\n }\n </style>\n <div class=\"lh-score__description\">\n Longest chain: <b class=\"lh-crc__longest_duration\"><!-- fill me: longestChain.duration --></b>\n over <b class=\"lh-crc__longest_length\"><!-- fill me: longestChain.length --></b> requests, totalling\n <b class=\"lh-crc__longest_transfersize\"><!-- fill me: longestChain.length --></b>\n </div>\n <div class=\"lh-crc\">\n <details class=\"lh-details\">\n <summary><!-- fill me --></summary>\n <div class=\"crc-initial-nav\">Initial Navigation</div>\n <!-- stamp for each chain -->\n <template id=\"tmpl-lh-crc__chains\">\n <div class=\"crc-node\">\n <span class=\"crc-node__tree-marker\">\n <!-- fill me -->\n </span>\n <span class=\"crc-node__tree-value\">\n <span class=\"crc-node__tree-file\"><!-- fill me: node.request.url.file --></span>\n <span class=\"crc-node__tree-hostname\">(<!-- fill me: node.request.url.host -->)</span>\n <!-- fill me -->\n </span>\n </div>\n </template>\n </details>\n </div>\n</template>\n\n/*# sourceURL=audits2/lighthouse/templates.html */";
\ No newline at end of file
diff --git a/src/cobalt/debug/content/devtools/audits2_worker.js b/src/cobalt/debug/content/devtools/audits2_worker.js
deleted file mode 100644
index fd16039..0000000
--- a/src/cobalt/debug/content/devtools/audits2_worker.js
+++ /dev/null
@@ -1,154 +0,0 @@
-var allDescriptors=[{"skip_compilation":["lighthouse/lighthouse-background.js"],"dependencies":["worker_service"],"extensions":[{"factoryName":"Audits2Service","type":"@Service","name":"Audits2Service"}],"name":"audits2_worker","scripts":["audits2_worker_module.js"]},{"name":"worker_service"}];var applicationDescriptor;var _loadedScripts={};for(var k of[]){}
-(function(){var baseUrl=self.location?self.location.origin+self.location.pathname:'';self._importScriptPathPrefix=baseUrl.substring(0,baseUrl.lastIndexOf('/')+1);})();var Runtime=class{constructor(descriptors){this._modules=[];this._modulesMap={};this._extensions=[];this._cachedTypeClasses={};this._descriptorsMap={};for(var i=0;i<descriptors.length;++i)
-this._registerModule(descriptors[i]);}
-static loadResourcePromise(url){return new Promise(load);function load(fulfill,reject){var xhr=new XMLHttpRequest();xhr.open('GET',url,true);xhr.onreadystatechange=onreadystatechange;function onreadystatechange(e){if(xhr.readyState!==XMLHttpRequest.DONE)
-return;if([0,200,304].indexOf(xhr.status)===-1)
-reject(new Error('While loading from url '+url+' server responded with a status of '+xhr.status));else
-fulfill(e.target.response);}
-xhr.send(null);}}
-static normalizePath(path){if(path.indexOf('..')===-1&&path.indexOf('.')===-1)
-return path;var normalizedSegments=[];var segments=path.split('/');for(var i=0;i<segments.length;i++){var segment=segments[i];if(segment==='.')
-continue;else if(segment==='..')
-normalizedSegments.pop();else if(segment)
-normalizedSegments.push(segment);}
-var normalizedPath=normalizedSegments.join('/');if(normalizedPath[normalizedPath.length-1]==='/')
-return normalizedPath;if(path[0]==='/'&&normalizedPath)
-normalizedPath='/'+normalizedPath;if((path[path.length-1]==='/')||(segments[segments.length-1]==='.')||(segments[segments.length-1]==='..'))
-normalizedPath=normalizedPath+'/';return normalizedPath;}
-static _loadScriptsPromise(scriptNames,base){var promises=[];var urls=[];var sources=new Array(scriptNames.length);var scriptToEval=0;for(var i=0;i<scriptNames.length;++i){var scriptName=scriptNames[i];var sourceURL=(base||self._importScriptPathPrefix)+scriptName;var schemaIndex=sourceURL.indexOf('://')+3;var pathIndex=sourceURL.indexOf('/',schemaIndex);if(pathIndex===-1)
-pathIndex=sourceURL.length;sourceURL=sourceURL.substring(0,pathIndex)+Runtime.normalizePath(sourceURL.substring(pathIndex));if(_loadedScripts[sourceURL])
-continue;urls.push(sourceURL);promises.push(Runtime.loadResourcePromise(sourceURL).then(scriptSourceLoaded.bind(null,i),scriptSourceLoaded.bind(null,i,undefined)));}
-return Promise.all(promises).then(undefined);function scriptSourceLoaded(scriptNumber,scriptSource){sources[scriptNumber]=scriptSource||'';while(typeof sources[scriptToEval]!=='undefined'){evaluateScript(urls[scriptToEval],sources[scriptToEval]);++scriptToEval;}}
-function evaluateScript(sourceURL,scriptSource){_loadedScripts[sourceURL]=true;if(!scriptSource){console.error('Empty response arrived for script \''+sourceURL+'\'');return;}
-self.eval(scriptSource+'\n//# sourceURL='+sourceURL);}}
-static _loadResourceIntoCache(url,appendSourceURL){return Runtime.loadResourcePromise(url).then(cacheResource.bind(this,url),cacheResource.bind(this,url,undefined));function cacheResource(path,content){if(!content){console.error('Failed to load resource: '+path);return;}
-var sourceURL=appendSourceURL?Runtime.resolveSourceURL(path):'';Runtime.cachedResources[path]=content+sourceURL;}}
-static startApplication(appName){console.timeStamp('Runtime.startApplication');var allDescriptorsByName={};for(var i=0;i<allDescriptors.length;++i){var d=allDescriptors[i];allDescriptorsByName[d['name']]=d;}
-var applicationPromise;if(applicationDescriptor)
-applicationPromise=Promise.resolve(applicationDescriptor);else
-applicationPromise=Runtime.loadResourcePromise(appName+'.json').then(JSON.parse.bind(JSON));return applicationPromise.then(parseModuleDescriptors);function parseModuleDescriptors(appDescriptor){var configuration=appDescriptor.modules;var moduleJSONPromises=[];var coreModuleNames=[];for(var i=0;i<configuration.length;++i){var descriptor=configuration[i];var name=descriptor['name'];var moduleJSON=allDescriptorsByName[name];if(moduleJSON)
-moduleJSONPromises.push(Promise.resolve(moduleJSON));else
-moduleJSONPromises.push(Runtime.loadResourcePromise(name+'/module.json').then(JSON.parse.bind(JSON)));if(descriptor['type']==='autostart')
-coreModuleNames.push(name);}
-return Promise.all(moduleJSONPromises).then(instantiateRuntime);function instantiateRuntime(moduleDescriptors){for(var i=0;i<moduleDescriptors.length;++i){moduleDescriptors[i].name=configuration[i]['name'];moduleDescriptors[i].condition=configuration[i]['condition'];moduleDescriptors[i].remote=configuration[i]['type']==='remote';}
-self.runtime=new Runtime(moduleDescriptors);if(coreModuleNames)
-return(self.runtime._loadAutoStartModules(coreModuleNames));return Promise.resolve();}}}
-static startWorker(appName){return Runtime.startApplication(appName).then(sendWorkerReady);function sendWorkerReady(){self.postMessage('workerReady');}}
-static queryParam(name){return Runtime._queryParamsObject[name]||null;}
-static queryParamsString(){return location.search;}
-static _experimentsSetting(){try{return(JSON.parse(self.localStorage&&self.localStorage['experiments']?self.localStorage['experiments']:'{}'));}catch(e){console.error('Failed to parse localStorage[\'experiments\']');return{};}}
-static _assert(value,message){if(value)
-return;Runtime._originalAssert.call(Runtime._console,value,message+' '+new Error().stack);}
-static setPlatform(platform){Runtime._platform=platform;}
-static _isDescriptorEnabled(descriptor){var activatorExperiment=descriptor['experiment'];if(activatorExperiment==='*')
-return Runtime.experiments.supportEnabled();if(activatorExperiment&&activatorExperiment.startsWith('!')&&Runtime.experiments.isEnabled(activatorExperiment.substring(1)))
-return false;if(activatorExperiment&&!activatorExperiment.startsWith('!')&&!Runtime.experiments.isEnabled(activatorExperiment))
-return false;var condition=descriptor['condition'];if(condition&&!condition.startsWith('!')&&!Runtime.queryParam(condition))
-return false;if(condition&&condition.startsWith('!')&&Runtime.queryParam(condition.substring(1)))
-return false;return true;}
-static resolveSourceURL(path){var sourceURL=self.location.href;if(self.location.search)
-sourceURL=sourceURL.replace(self.location.search,'');sourceURL=sourceURL.substring(0,sourceURL.lastIndexOf('/')+1)+path;return'\n/*# sourceURL='+sourceURL+' */';}
-useTestBase(){Runtime._remoteBase='http://localhost:8000/inspector-sources/';if(Runtime.queryParam('debugFrontend'))
-Runtime._remoteBase+='debug/';}
-_registerModule(descriptor){var module=new Runtime.Module(this,descriptor);this._modules.push(module);this._modulesMap[descriptor['name']]=module;}
-loadModulePromise(moduleName){return this._modulesMap[moduleName]._loadPromise();}
-_loadAutoStartModules(moduleNames){var promises=[];for(var i=0;i<moduleNames.length;++i)
-promises.push(this.loadModulePromise(moduleNames[i]));return Promise.all(promises);}
-_checkExtensionApplicability(extension,predicate){if(!predicate)
-return false;var contextTypes=extension.descriptor().contextTypes;if(!contextTypes)
-return true;for(var i=0;i<contextTypes.length;++i){var contextType=this._resolve(contextTypes[i]);var isMatching=!!contextType&&predicate(contextType);if(isMatching)
-return true;}
-return false;}
-isExtensionApplicableToContext(extension,context){if(!context)
-return true;return this._checkExtensionApplicability(extension,isInstanceOf);function isInstanceOf(targetType){return context instanceof targetType;}}
-isExtensionApplicableToContextTypes(extension,currentContextTypes){if(!extension.descriptor().contextTypes)
-return true;return this._checkExtensionApplicability(extension,currentContextTypes?isContextTypeKnown:null);function isContextTypeKnown(targetType){return currentContextTypes.has(targetType);}}
-extensions(type,context,sortByTitle){return this._extensions.filter(filter).sort(sortByTitle?titleComparator:orderComparator);function filter(extension){if(extension._type!==type&&extension._typeClass()!==type)
-return false;if(!extension.enabled())
-return false;return!context||extension.isApplicable(context);}
-function orderComparator(extension1,extension2){var order1=extension1.descriptor()['order']||0;var order2=extension2.descriptor()['order']||0;return order1-order2;}
-function titleComparator(extension1,extension2){var title1=extension1.title()||'';var title2=extension2.title()||'';return title1.localeCompare(title2);}}
-extension(type,context){return this.extensions(type,context)[0]||null;}
-allInstances(type,context){return Promise.all(this.extensions(type,context).map(extension=>extension.instance()));}
-_resolve(typeName){if(!this._cachedTypeClasses[typeName]){var path=typeName.split('.');var object=self;for(var i=0;object&&(i<path.length);++i)
-object=object[path[i]];if(object)
-this._cachedTypeClasses[typeName]=(object);}
-return this._cachedTypeClasses[typeName]||null;}
-sharedInstance(constructorFunction){if(Runtime._instanceSymbol in constructorFunction)
-return constructorFunction[Runtime._instanceSymbol];var instance=new constructorFunction();constructorFunction[Runtime._instanceSymbol]=instance;return instance;}};Runtime._queryParamsObject={__proto__:null};Runtime._instanceSymbol=Symbol('instance');Runtime.cachedResources={__proto__:null};Runtime._console=console;Runtime._originalAssert=console.assert;Runtime._platform='';Runtime.ModuleDescriptor=class{constructor(){this.name;this.extensions;this.dependencies;this.scripts;this.condition;this.remote;}};Runtime.ExtensionDescriptor=class{constructor(){this.type;this.className;this.factoryName;this.contextTypes;}};Runtime.Module=class{constructor(manager,descriptor){this._manager=manager;this._descriptor=descriptor;this._name=descriptor.name;this._extensions=[];this._extensionsByClassName=new Map();var extensions=(descriptor.extensions);for(var i=0;extensions&&i<extensions.length;++i){var extension=new Runtime.Extension(this,extensions[i]);this._manager._extensions.push(extension);this._extensions.push(extension);}
-this._loadedForTest=false;}
-name(){return this._name;}
-enabled(){return Runtime._isDescriptorEnabled(this._descriptor);}
-resource(name){var fullName=this._name+'/'+name;var content=Runtime.cachedResources[fullName];if(!content)
-throw new Error(fullName+' not preloaded. Check module.json');return content;}
-_loadPromise(){if(!this.enabled())
-return Promise.reject(new Error('Module '+this._name+' is not enabled'));if(this._pendingLoadPromise)
-return this._pendingLoadPromise;var dependencies=this._descriptor.dependencies;var dependencyPromises=[];for(var i=0;dependencies&&i<dependencies.length;++i)
-dependencyPromises.push(this._manager._modulesMap[dependencies[i]]._loadPromise());this._pendingLoadPromise=Promise.all(dependencyPromises).then(this._loadResources.bind(this)).then(this._loadScripts.bind(this)).then(()=>this._loadedForTest=true);return this._pendingLoadPromise;}
-_loadResources(){var resources=this._descriptor['resources'];if(!resources||!resources.length)
-return Promise.resolve();var promises=[];for(var i=0;i<resources.length;++i){var url=this._modularizeURL(resources[i]);promises.push(Runtime._loadResourceIntoCache(url,true));}
-return Promise.all(promises).then(undefined);}
-_loadScripts(){if(!this._descriptor.scripts||!this._descriptor.scripts.length)
-return Promise.resolve();const specialCases={'sdk':'SDK','ui':'UI','object_ui':'ObjectUI','perf_ui':'PerfUI','har_importer':'HARImporter','sass_test_runner':'SASSTestRunner','sdk_test_runner':'SDKTestRunner'};var namespace=specialCases[this._name]||this._name.split('_').map(a=>a.substring(0,1).toUpperCase()+a.substring(1)).join('');self[namespace]=self[namespace]||{};return Runtime._loadScriptsPromise(this._descriptor.scripts.map(this._modularizeURL,this),this._remoteBase());}
-_modularizeURL(resourceName){return Runtime.normalizePath(this._name+'/'+resourceName);}
-_remoteBase(){return!Runtime.queryParam('debugFrontend')&&this._descriptor.remote&&Runtime._remoteBase||undefined;}
-substituteURL(value){var base=this._remoteBase()||'';return value.replace(/@url\(([^\)]*?)\)/g,convertURL.bind(this));function convertURL(match,url){return base+this._modularizeURL(url);}}};Runtime.Extension=class{constructor(module,descriptor){this._module=module;this._descriptor=descriptor;this._type=descriptor.type;this._hasTypeClass=this._type.charAt(0)==='@';this._className=descriptor.className||null;this._factoryName=descriptor.factoryName||null;}
-descriptor(){return this._descriptor;}
-module(){return this._module;}
-enabled(){return this._module.enabled()&&Runtime._isDescriptorEnabled(this.descriptor());}
-_typeClass(){if(!this._hasTypeClass)
-return null;return this._module._manager._resolve(this._type.substring(1));}
-isApplicable(context){return this._module._manager.isExtensionApplicableToContext(this,context);}
-instance(){return this._module._loadPromise().then(this._createInstance.bind(this));}
-_createInstance(){var className=this._className||this._factoryName;if(!className)
-throw new Error('Could not instantiate extension with no class');var constructorFunction=self.eval((className));if(!(constructorFunction instanceof Function))
-throw new Error('Could not instantiate: '+className);if(this._className)
-return this._module._manager.sharedInstance(constructorFunction);return new constructorFunction(this);}
-title(){return this._descriptor['title-'+Runtime._platform]||this._descriptor['title'];}
-hasContextType(contextType){var contextTypes=this.descriptor().contextTypes;if(!contextTypes)
-return false;for(var i=0;i<contextTypes.length;++i){if(contextType===this._module._manager._resolve(contextTypes[i]))
-return true;}
-return false;}};Runtime.ExperimentsSupport=class{constructor(){this._supportEnabled=Runtime.queryParam('experiments')!==null;this._experiments=[];this._experimentNames={};this._enabledTransiently={};}
-allConfigurableExperiments(){var result=[];for(var i=0;i<this._experiments.length;i++){var experiment=this._experiments[i];if(!this._enabledTransiently[experiment.name])
-result.push(experiment);}
-return result;}
-supportEnabled(){return this._supportEnabled;}
-_setExperimentsSetting(value){if(!self.localStorage)
-return;self.localStorage['experiments']=JSON.stringify(value);}
-register(experimentName,experimentTitle,hidden){Runtime._assert(!this._experimentNames[experimentName],'Duplicate registration of experiment '+experimentName);this._experimentNames[experimentName]=true;this._experiments.push(new Runtime.Experiment(this,experimentName,experimentTitle,!!hidden));}
-isEnabled(experimentName){this._checkExperiment(experimentName);if(this._enabledTransiently[experimentName])
-return true;if(!this.supportEnabled())
-return false;return!!Runtime._experimentsSetting()[experimentName];}
-setEnabled(experimentName,enabled){this._checkExperiment(experimentName);var experimentsSetting=Runtime._experimentsSetting();experimentsSetting[experimentName]=enabled;this._setExperimentsSetting(experimentsSetting);}
-setDefaultExperiments(experimentNames){for(var i=0;i<experimentNames.length;++i){this._checkExperiment(experimentNames[i]);this._enabledTransiently[experimentNames[i]]=true;}}
-enableForTest(experimentName){this._checkExperiment(experimentName);this._enabledTransiently[experimentName]=true;}
-clearForTest(){this._experiments=[];this._experimentNames={};this._enabledTransiently={};}
-cleanUpStaleExperiments(){var experimentsSetting=Runtime._experimentsSetting();var cleanedUpExperimentSetting={};for(var i=0;i<this._experiments.length;++i){var experimentName=this._experiments[i].name;if(experimentsSetting[experimentName])
-cleanedUpExperimentSetting[experimentName]=true;}
-this._setExperimentsSetting(cleanedUpExperimentSetting);}
-_checkExperiment(experimentName){Runtime._assert(this._experimentNames[experimentName],'Unknown experiment '+experimentName);}};Runtime.Experiment=class{constructor(experiments,name,title,hidden){this.name=name;this.title=title;this.hidden=hidden;this._experiments=experiments;}
-isEnabled(){return this._experiments.isEnabled(this.name);}
-setEnabled(enabled){this._experiments.setEnabled(this.name,enabled);}};{(function parseQueryParameters(){var queryParams=Runtime.queryParamsString();if(!queryParams)
-return;var params=queryParams.substring(1).split('&');for(var i=0;i<params.length;++i){var pair=params[i].split('=');var name=pair.shift();Runtime._queryParamsObject[name]=pair.join('=');}})();}
-Runtime.experiments=new Runtime.ExperimentsSupport();Runtime._remoteBase;(function validateRemoteBase(){if(location.href.startsWith('chrome-devtools://devtools/bundled/')&&Runtime.queryParam('remoteBase')){var versionMatch=/\/serve_file\/(@[0-9a-zA-Z]+)\/?$/.exec(Runtime.queryParam('remoteBase'));if(versionMatch)
-Runtime._remoteBase=`${location.origin}/remote/serve_file/${versionMatch[1]}/`;}})();function ServicePort(){}
-ServicePort.prototype={setHandlers(messageHandler,closeHandler){},send(message){},close(){}};var runtime;self['WorkerService']=self['WorkerService']||{};function Service(){}
-Service.prototype={dispose(){},setNotify(notify){}};var ServiceDispatcher=class{constructor(port){this._objects=new Map();this._lastObjectId=1;this._port=port;this._port.setHandlers(this._dispatchMessageWrapped.bind(this),this._connectionClosed.bind(this));}
-_dispatchMessageWrapped(data){try{var message=JSON.parse(data);if(!(message instanceof Object)){this._sendErrorResponse(message['id'],'Malformed message');return;}
-this._dispatchMessage(message);}catch(e){this._sendErrorResponse(message['id'],e.toString()+' '+e.stack);}}
-_dispatchMessage(message){var domainAndMethod=message['method'].split('.');var serviceName=domainAndMethod[0];var method=domainAndMethod[1];if(method==='create'){var extensions=self.runtime.extensions(Service).filter(extension=>extension.descriptor()['name']===serviceName);if(!extensions.length){this._sendErrorResponse(message['id'],'Could not resolve service \''+serviceName+'\'');return;}
-extensions[0].instance().then(object=>{var id=String(this._lastObjectId++);object.setNotify(this._notify.bind(this,id,serviceName));this._objects.set(id,object);this._sendResponse(message['id'],{id:id});});}else if(method==='dispose'){var object=this._objects.get(message['params']['id']);if(!object){console.error('Could not look up object with id for '+JSON.stringify(message));return;}
-this._objects.delete(message['params']['id']);object.dispose().then(()=>this._sendResponse(message['id'],{}));}else{if(!message['params']){console.error('No params in the message: '+JSON.stringify(message));return;}
-var object=this._objects.get(message['params']['id']);if(!object){console.error('Could not look up object with id for '+JSON.stringify(message));return;}
-var handler=object[method];if(!(handler instanceof Function)){console.error('Handler for \''+method+'\' is missing.');return;}
-object[method](message['params']).then(result=>this._sendResponse(message['id'],result));}}
-_connectionClosed(){for(var object of this._objects.values())
-object.dispose();this._objects.clear();}
-_notify(objectId,serviceName,method,params){params['id']=objectId;var message={method:serviceName+'.'+method,params:params};this._port.send(JSON.stringify(message));}
-_sendResponse(messageId,result){var message={id:messageId,result:result};this._port.send(JSON.stringify(message));}
-_sendErrorResponse(messageId,error){var message={id:messageId,error:error};this._port.send(JSON.stringify(message));}};var WorkerServicePort=class{constructor(port){this._port=port;this._port.onmessage=this._onMessage.bind(this);this._port.onerror=console.error;}
-setHandlers(messageHandler,closeHandler){this._messageHandler=messageHandler;this._closeHandler=closeHandler;}
-send(data){this._port.postMessage(data);return Promise.resolve();}
-close(){return Promise.resolve();}
-_onMessage(event){this._messageHandler(event.data);}};var dispatchers=[];var worker=(self);var servicePort=new WorkerServicePort((worker));dispatchers.push(new ServiceDispatcher(servicePort));;applicationDescriptor={"has_html":false,"modules":[{"type":"remote","name":"audits2_worker"},{"type":"autostart","name":"worker_service"}]};if(!self.Runtime)
-self.importScripts('Runtime.js');Runtime.startWorker('audits2_worker');
\ No newline at end of file
diff --git a/src/cobalt/debug/content/devtools/changes/changes_module.js b/src/cobalt/debug/content/devtools/changes/changes_module.js
deleted file mode 100644
index 222f89c..0000000
--- a/src/cobalt/debug/content/devtools/changes/changes_module.js
+++ /dev/null
@@ -1,69 +0,0 @@
-Changes.ChangesHighlighter=function(config,parserConfig){var diffRows=parserConfig.diffRows;var baselineLines=parserConfig.baselineLines;var currentLines=parserConfig.currentLines;var syntaxHighlightMode=CodeMirror.getMode({},parserConfig.mimeType);function fastForward(state,baselineLineNumber,currentLineNumber){if(baselineLineNumber>state.baselineLineNumber){fastForwardSyntaxHighlighter(state.baselineSyntaxState,state.baselineLineNumber,baselineLineNumber,baselineLines);state.baselineLineNumber=baselineLineNumber;}
-if(currentLineNumber>state.currentLineNumber){fastForwardSyntaxHighlighter(state.currentSyntaxState,state.currentLineNumber,currentLineNumber,currentLines);state.currentLineNumber=currentLineNumber;}}
-function fastForwardSyntaxHighlighter(syntaxState,from,to,lines){var lineNumber=from;while(lineNumber<to&&lineNumber<lines.length){var stream=new CodeMirror.StringStream(lines[lineNumber]);if(stream.eol()&&syntaxHighlightMode.blankLine)
-syntaxHighlightMode.blankLine(syntaxState);while(!stream.eol()){syntaxHighlightMode.token(stream,syntaxState);stream.start=stream.pos;}
-lineNumber++;}}
-return{startState:function(){return{rowNumber:0,diffTokenIndex:0,currentLineNumber:0,baselineLineNumber:0,currentSyntaxState:CodeMirror.startState(syntaxHighlightMode),baselineSyntaxState:CodeMirror.startState(syntaxHighlightMode),syntaxPosition:0,diffPosition:0,syntaxStyle:'',diffStyle:''};},token:function(stream,state){var diffRow=diffRows[state.rowNumber];if(!diffRow){stream.next();return'';}
-fastForward(state,diffRow.baselineLineNumber-1,diffRow.currentLineNumber-1);var classes='';if(stream.pos===0)
-classes+=' line-background-'+diffRow.type+' line-'+diffRow.type;var syntaxHighlighterNeedsRefresh=state.diffPosition>=state.syntaxPosition;if(state.diffPosition<=state.syntaxPosition){state.diffPosition+=diffRow.tokens[state.diffTokenIndex].text.length;state.diffStyle=diffRow.tokens[state.diffTokenIndex].className;state.diffTokenIndex++;}
-if(syntaxHighlighterNeedsRefresh){if(diffRow.type===Changes.ChangesView.RowType.Deletion||diffRow.type===Changes.ChangesView.RowType.Addition||diffRow.type===Changes.ChangesView.RowType.Equal){state.syntaxStyle=syntaxHighlightMode.token(stream,diffRow.type===Changes.ChangesView.RowType.Deletion?state.baselineSyntaxState:state.currentSyntaxState);state.syntaxPosition=stream.pos;}else{state.syntaxStyle='';state.syntaxPosition=Infinity;}}
-stream.pos=Math.min(state.syntaxPosition,state.diffPosition);classes+=' '+state.syntaxStyle;classes+=' '+state.diffStyle;if(stream.eol()){state.rowNumber++;if(diffRow.type===Changes.ChangesView.RowType.Deletion)
-state.baselineLineNumber++;else
-state.currentLineNumber++;state.diffPosition=0;state.syntaxPosition=0;state.diffTokenIndex=0;}
-return classes;},blankLine:function(state){var diffRow=diffRows[state.rowNumber];state.rowNumber++;state.syntaxPosition=0;state.diffPosition=0;state.diffTokenIndex=0;if(!diffRow)
-return'';var style='';if(syntaxHighlightMode.blankLine){if(diffRow.type===Changes.ChangesView.RowType.Equal||diffRow.type===Changes.ChangesView.RowType.Addition){style=syntaxHighlightMode.blankLine(state.currentSyntaxState);state.currentLineNumber++;}else if(diffRow.type===Changes.ChangesView.RowType.Deletion){style=syntaxHighlightMode.blankLine(state.baselineSyntaxState);state.baselineLineNumber++;}}
-return style+' line-background-'+diffRow.type+' line-'+diffRow.type;},copyState:function(state){var newState=Object.assign({},state);newState.currentSyntaxState=CodeMirror.copyState(syntaxHighlightMode,state.currentSyntaxState);newState.baselineSyntaxState=CodeMirror.copyState(syntaxHighlightMode,state.baselineSyntaxState);return(newState);}};};Changes.ChangesHighlighter.DiffState;CodeMirror.defineMode('devtools-diff',Changes.ChangesHighlighter);;Changes.ChangesView=class extends UI.VBox{constructor(){super(true);this.registerRequiredCSS('changes/changesView.css');var splitWidget=new UI.SplitWidget(true,false);var mainWidget=new UI.Widget();splitWidget.setMainWidget(mainWidget);splitWidget.show(this.contentElement);this._emptyWidget=new UI.EmptyWidget(Common.UIString('No changes'));this._emptyWidget.show(mainWidget.element);this._workspaceDiff=WorkspaceDiff.workspaceDiff();this._changesSidebar=new Changes.ChangesSidebar(this._workspaceDiff);this._changesSidebar.addEventListener(Changes.ChangesSidebar.Events.SelectedUISourceCodeChanged,this._selectedUISourceCodeChanged,this);splitWidget.setSidebarWidget(this._changesSidebar);this._selectedUISourceCode=null;this._diffRows=[];this._maxLineDigits=1;this._editor=new TextEditor.CodeMirrorTextEditor({lineNumbers:true,lineWrapping:false,maxHighlightLength:Infinity});this._editor.setReadOnly(true);this._editor.show(mainWidget.element.createChild('div','editor-container'));this._editor.hideWidget();this._editor.element.addEventListener('click',this._click.bind(this),false);this._toolbar=new UI.Toolbar('changes-toolbar',mainWidget.element);var revertButton=new UI.ToolbarButton(Common.UIString('Revert all changes'),'largeicon-undo');revertButton.addEventListener(UI.ToolbarButton.Events.Click,this._revert.bind(this));this._toolbar.appendToolbarItem(revertButton);this._diffStats=new UI.ToolbarText('');this._toolbar.appendToolbarItem(this._diffStats);this._toolbar.setEnabled(false);this._selectedUISourceCodeChanged();}
-_selectedUISourceCodeChanged(){this._revealUISourceCode(this._changesSidebar.selectedUISourceCode());}
-_revert(){var uiSourceCode=this._selectedUISourceCode;if(!uiSourceCode)
-return;uiSourceCode.requestOriginalContent().then(original=>uiSourceCode.addRevision(original||''));}
-_click(event){var selection=this._editor.selection();if(!selection.isEmpty())
-return;var row=this._diffRows[selection.startLine];Common.Revealer.reveal(this._selectedUISourceCode.uiLocation(row.currentLineNumber-1,selection.startColumn),false);event.consume(true);}
-_revealUISourceCode(uiSourceCode){if(this._selectedUISourceCode===uiSourceCode)
-return;if(this._selectedUISourceCode)
-this._workspaceDiff.unsubscribeFromDiffChange(this._selectedUISourceCode,this._refreshDiff,this);if(uiSourceCode&&this.isShowing())
-this._workspaceDiff.subscribeToDiffChange(uiSourceCode,this._refreshDiff,this);this._selectedUISourceCode=uiSourceCode;this._refreshDiff();}
-wasShown(){this._refreshDiff();}
-_refreshDiff(){if(!this.isShowing())
-return;if(!this._selectedUISourceCode){this._renderDiffRows(null);return;}
-var uiSourceCode=this._selectedUISourceCode;this._workspaceDiff.requestDiff(uiSourceCode).then(diff=>{if(this._selectedUISourceCode!==uiSourceCode)
-return;this._renderDiffRows(diff);});}
-_renderDiffRows(diff){this._diffRows=[];if(!diff||(diff.length===1&&diff[0][0]===Diff.Diff.Operation.Equal)){this._diffStats.setText('');this._toolbar.setEnabled(false);this._editor.hideWidget();this._emptyWidget.showWidget();return;}
-var insertions=0;var deletions=0;var currentLineNumber=0;var baselineLineNumber=0;var paddingLines=3;var originalLines=[];var currentLines=[];for(var i=0;i<diff.length;++i){var token=diff[i];switch(token[0]){case Diff.Diff.Operation.Equal:this._diffRows.pushAll(createEqualRows(token[1],i===0,i===diff.length-1));originalLines.pushAll(token[1]);currentLines.pushAll(token[1]);break;case Diff.Diff.Operation.Insert:for(var line of token[1])
-this._diffRows.push(createRow(line,Changes.ChangesView.RowType.Addition));insertions+=token[1].length;currentLines.pushAll(token[1]);break;case Diff.Diff.Operation.Delete:deletions+=token[1].length;originalLines.pushAll(token[1]);if(diff[i+1]&&diff[i+1][0]===Diff.Diff.Operation.Insert){i++;this._diffRows.pushAll(createModifyRows(token[1].join('\n'),diff[i][1].join('\n')));insertions+=diff[i][1].length;currentLines.pushAll(diff[i][1]);}else{for(var line of token[1])
-this._diffRows.push(createRow(line,Changes.ChangesView.RowType.Deletion));}
-break;}}
-this._maxLineDigits=Math.ceil(Math.log10(Math.max(currentLineNumber,baselineLineNumber)));this._diffStats.setText(Common.UIString('%d insertion%s (+), %d deletion%s (-)',insertions,insertions!==1?'s':'',deletions,deletions!==1?'s':''));this._toolbar.setEnabled(true);this._emptyWidget.hideWidget();this._editor.operation(()=>{this._editor.showWidget();this._editor.setHighlightMode({name:'devtools-diff',diffRows:this._diffRows,mimeType:(this._selectedUISourceCode).mimeType(),baselineLines:originalLines,currentLines:currentLines});this._editor.setText(this._diffRows.map(row=>row.tokens.map(t=>t.text).join('')).join('\n'));this._editor.setLineNumberFormatter(this._lineFormatter.bind(this));});function createEqualRows(lines,atStart,atEnd){var equalRows=[];if(!atStart){for(var i=0;i<paddingLines&&i<lines.length;i++)
-equalRows.push(createRow(lines[i],Changes.ChangesView.RowType.Equal));if(lines.length>paddingLines*2+1&&!atEnd){equalRows.push(createRow(Common.UIString('( \u2026 Skipping ')+(lines.length-paddingLines*2)+
-Common.UIString(' matching lines \u2026 )'),Changes.ChangesView.RowType.Spacer));}}
-if(!atEnd){var start=Math.max(lines.length-paddingLines-1,atStart?0:paddingLines);var skip=lines.length-paddingLines-1;if(!atStart)
-skip-=paddingLines;if(skip>0){baselineLineNumber+=skip;currentLineNumber+=skip;}
-for(var i=start;i<lines.length;i++)
-equalRows.push(createRow(lines[i],Changes.ChangesView.RowType.Equal));}
-return equalRows;}
-function createModifyRows(before,after){var internalDiff=Diff.Diff.charDiff(before,after,true);var deletionRows=[createRow('',Changes.ChangesView.RowType.Deletion)];var insertionRows=[createRow('',Changes.ChangesView.RowType.Addition)];for(var token of internalDiff){var text=token[1];var type=token[0];var className=type===Diff.Diff.Operation.Equal?'':'inner-diff';var lines=text.split('\n');for(var i=0;i<lines.length;i++){if(i>0&&type!==Diff.Diff.Operation.Insert)
-deletionRows.push(createRow('',Changes.ChangesView.RowType.Deletion));if(i>0&&type!==Diff.Diff.Operation.Delete)
-insertionRows.push(createRow('',Changes.ChangesView.RowType.Addition));if(!lines[i])
-continue;if(type!==Diff.Diff.Operation.Insert)
-deletionRows[deletionRows.length-1].tokens.push({text:lines[i],className});if(type!==Diff.Diff.Operation.Delete)
-insertionRows[insertionRows.length-1].tokens.push({text:lines[i],className});}}
-return deletionRows.concat(insertionRows);}
-function createRow(text,type){if(type===Changes.ChangesView.RowType.Addition)
-currentLineNumber++;if(type===Changes.ChangesView.RowType.Deletion)
-baselineLineNumber++;if(type===Changes.ChangesView.RowType.Equal){baselineLineNumber++;currentLineNumber++;}
-return{baselineLineNumber,currentLineNumber,tokens:text?[{text,className:'inner-diff'}]:[],type};}}
-_lineFormatter(lineNumber){var row=this._diffRows[lineNumber-1];var showBaseNumber=row.type===Changes.ChangesView.RowType.Deletion;var showCurrentNumber=row.type===Changes.ChangesView.RowType.Addition;if(row.type===Changes.ChangesView.RowType.Equal){showBaseNumber=true;showCurrentNumber=true;}
-var base=showBaseNumber?numberToStringWithSpacesPadding(row.baselineLineNumber,this._maxLineDigits):spacesPadding(this._maxLineDigits);var current=showCurrentNumber?numberToStringWithSpacesPadding(row.currentLineNumber,this._maxLineDigits):spacesPadding(this._maxLineDigits);return base+spacesPadding(1)+current;}};Changes.ChangesView.Row;Changes.ChangesView.RowType={Deletion:'deletion',Addition:'addition',Equal:'equal',Spacer:'spacer'};;Changes.ChangesSidebar=class extends UI.Widget{constructor(workspaceDiff){super();this._treeoutline=new UI.TreeOutlineInShadow();this._treeoutline.registerRequiredCSS('changes/changesSidebar.css');this._treeoutline.setComparator((a,b)=>a.titleAsText().compareTo(b.titleAsText()));this._treeoutline.addEventListener(UI.TreeOutline.Events.ElementSelected,this._selectionChanged,this);this.element.appendChild(this._treeoutline.element);this._treeElements=new Map();this._workspaceDiff=workspaceDiff;this._workspaceDiff.modifiedUISourceCodes().forEach(this._addUISourceCode.bind(this));this._workspaceDiff.addEventListener(WorkspaceDiff.Events.ModifiedStatusChanged,this._uiSourceCodeMofiedStatusChanged,this);}
-selectedUISourceCode(){return this._treeoutline.selectedTreeElement?this._treeoutline.selectedTreeElement.uiSourceCode:null;}
-_selectionChanged(){this.dispatchEventToListeners(Changes.ChangesSidebar.Events.SelectedUISourceCodeChanged);}
-_uiSourceCodeMofiedStatusChanged(event){if(event.data.isModified)
-this._addUISourceCode(event.data.uiSourceCode);else
-this._removeUISourceCode(event.data.uiSourceCode);}
-_removeUISourceCode(uiSourceCode){var treeElement=this._treeElements.get(uiSourceCode);this._treeElements.delete(uiSourceCode);if(this._treeoutline.selectedTreeElement===treeElement){var nextElementToSelect=treeElement.previousSibling||treeElement.nextSibling;if(nextElementToSelect){nextElementToSelect.select(true);}else{treeElement.deselect();this._selectionChanged();}}
-this._treeoutline.removeChild(treeElement);treeElement.dispose();}
-_addUISourceCode(uiSourceCode){var treeElement=new Changes.ChangesSidebar.UISourceCodeTreeElement(uiSourceCode);this._treeElements.set(uiSourceCode,treeElement);this._treeoutline.appendChild(treeElement);if(!this._treeoutline.selectedTreeElement)
-treeElement.select(true);}};Changes.ChangesSidebar.Events={SelectedUISourceCodeChanged:Symbol('SelectedUISourceCodeChanged')};Changes.ChangesSidebar.UISourceCodeTreeElement=class extends UI.TreeElement{constructor(uiSourceCode){super();this.uiSourceCode=uiSourceCode;this.listItemElement.classList.add('navigator-'+uiSourceCode.contentType().name()+'-tree-item');var iconType='largeicon-navigator-file';if(this.uiSourceCode.contentType()===Common.resourceTypes.Snippet)
-iconType='largeicon-navigator-snippet';var defaultIcon=UI.Icon.create(iconType,'icon');this.setLeadingIcons([defaultIcon]);this._eventListeners=[uiSourceCode.addEventListener(Workspace.UISourceCode.Events.TitleChanged,this._updateTitle,this),uiSourceCode.addEventListener(Workspace.UISourceCode.Events.WorkingCopyChanged,this._updateTitle,this),uiSourceCode.addEventListener(Workspace.UISourceCode.Events.WorkingCopyCommitted,this._updateTitle,this)];this._updateTitle();}
-_updateTitle(){var titleText=this.uiSourceCode.displayName();if(this.uiSourceCode.isDirty())
-titleText='*'+titleText;this.title=titleText;var tooltip=this.uiSourceCode.url();if(this.uiSourceCode.contentType().isFromSourceMap())
-tooltip=Common.UIString('%s (from source map)',this.uiSourceCode.displayName());this.tooltip=tooltip;}
-dispose(){Common.EventTarget.removeEventListeners(this._eventListeners);}};;Runtime.cachedResources["changes/changesView.css"]="/*\n * Copyright (c) 2017 The Chromium Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style license that can be\n * found in the LICENSE file.\n */\n.insertion-point-main{\n flex-direction: column;\n display: flex;\n}\n\n.insertion-point-sidebar {\n overflow: auto;\n}\n.editor-container{\n flex: 1;\n}\n\n:focus.selected {\n background-color: rgb(56, 121, 217);\n color: #FFF;\n}\n\n.CodeMirror-lines:not(:active) {\n cursor: default !important;\n}\n\n.CodeMirror-line:hover {\n cursor: default !important;\n background-color: rgba(0,0,255,0.05);\n}\n\n.CodeMirror .CodeMirror-linebackground.spacer {\n text-align: center;\n color: rgba(0, 0, 0, 0.5);\n background-color: rgba(0, 0, 255, 0.1);\n}\n\n.CodeMirror .equal > span > span {\n opacity: .5;\n}\n\n.CodeMirror .CodeMirror-selectedtext:not(.CodeMirror-persist-highlight) {\n opacity: 1.0;\n}\n\n.CodeMirror .CodeMirror-linebackground.addition, -theme-preserve {\n background-color: hsla(144, 55%, 49%, .2);\n}\n\n.CodeMirror .CodeMirror-linebackground.deletion, -theme-preserve {\n background-color: rgba(255, 0, 0, .2);\n}\n\n.CodeMirror .addition .cm-inner-diff:not(.CodeMirror-selectedtext), -theme-preserve {\n background-color: hsla(144, 55%, 49%, .3);\n}\n\n.CodeMirror .deletion .cm-inner-diff:not(.CodeMirror-selectedtext), -theme-preserve {\n background-color: rgba(255, 0, 0, .3);\n}\n\n.changes-toolbar {\n background-color: #f3f3f3;\n border-top: 1px solid #dadada;\n}\n\n/*# sourceURL=changes/changesView.css */";Runtime.cachedResources["changes/changesSidebar.css"]="li .icon {\n margin: -3px -5px -3px -5px;\n background: linear-gradient(45deg, hsl(0, 0%, 50%), hsl(0, 0%, 70%));\n}\n\n.tree-outline li {\n min-height: 20px;\n}\n\n.tree-outline li:hover:not(.selected) .selection {\n display: block;\n background-color: rgba(56, 121, 217, 0.1);\n}\n\n.navigator-fs-tree-item .icon{\n background: linear-gradient(45deg, hsl(28, 75%, 50%), hsl(28, 75%, 70%));\n}\n\n.navigator-sm-script-tree-item .icon,\n.navigator-script-tree-item .icon,\n.navigator-snippet-tree-item .icon {\n background: linear-gradient(45deg, hsl(48, 70%, 50%), hsl(48, 70%, 70%));\n}\n\n.navigator-sm-stylesheet-tree-item .icon,\n.navigator-stylesheet-tree-item .icon {\n background: linear-gradient(45deg, hsl(256, 50%, 50%), hsl(256, 50%, 70%));\n}\n\n.navigator-image-tree-item .icon,\n.navigator-font-tree-item .icon {\n background: linear-gradient(45deg, hsl(109, 33%, 50%), hsl(109, 33%, 70%));\n}\n/*# sourceURL=changes/changesSidebar.css */";
\ No newline at end of file
diff --git a/src/cobalt/debug/content/devtools/cm/cm_module.js b/src/cobalt/debug/content/devtools/cm/cm_module.js
deleted file mode 100644
index 96d97a3..0000000
--- a/src/cobalt/debug/content/devtools/cm/cm_module.js
+++ /dev/null
@@ -1,4175 +0,0 @@
-(function(global,factory){typeof exports==='object'&&typeof module!=='undefined'?module.exports=factory():typeof define==='function'&&define.amd?define(factory):(global.CodeMirror=factory());}(this,(function(){'use strict';var userAgent=navigator.userAgent
-var platform=navigator.platform
-var gecko=/gecko\/\d/i.test(userAgent)
-var ie_upto10=/MSIE \d/.test(userAgent)
-var ie_11up=/Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(userAgent)
-var edge=/Edge\/(\d+)/.exec(userAgent)
-var ie=ie_upto10||ie_11up||edge
-var ie_version=ie&&(ie_upto10?document.documentMode||6:+(edge||ie_11up)[1])
-var webkit=!edge&&/WebKit\//.test(userAgent)
-var qtwebkit=webkit&&/Qt\/\d+\.\d+/.test(userAgent)
-var chrome=!edge&&/Chrome\//.test(userAgent)
-var presto=/Opera\//.test(userAgent)
-var safari=/Apple Computer/.test(navigator.vendor)
-var mac_geMountainLion=/Mac OS X 1\d\D([8-9]|\d\d)\D/.test(userAgent)
-var phantom=/PhantomJS/.test(userAgent)
-var ios=!edge&&/AppleWebKit/.test(userAgent)&&/Mobile\/\w+/.test(userAgent)
-var android=/Android/.test(userAgent)
-var mobile=ios||android||/webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(userAgent)
-var mac=ios||/Mac/.test(platform)
-var chromeOS=/\bCrOS\b/.test(userAgent)
-var windows=/win/i.test(platform)
-var presto_version=presto&&userAgent.match(/Version\/(\d*\.\d*)/)
-if(presto_version){presto_version=Number(presto_version[1])}
-if(presto_version&&presto_version>=15){presto=false;webkit=true}
-var flipCtrlCmd=mac&&(qtwebkit||presto&&(presto_version==null||presto_version<12.11))
-var captureRightClick=gecko||(ie&&ie_version>=9)
-function classTest(cls){return new RegExp("(^|\\s)"+cls+"(?:$|\\s)\\s*")}
-var rmClass=function(node,cls){var current=node.className
-var match=classTest(cls).exec(current)
-if(match){var after=current.slice(match.index+match[0].length)
-node.className=current.slice(0,match.index)+(after?match[1]+after:"")}}
-function removeChildren(e){for(var count=e.childNodes.length;count>0;--count)
-{e.removeChild(e.firstChild)}
-return e}
-function removeChildrenAndAdd(parent,e){return removeChildren(parent).appendChild(e)}
-function elt(tag,content,className,style){var e=document.createElement(tag)
-if(className){e.className=className}
-if(style){e.style.cssText=style}
-if(typeof content=="string"){e.appendChild(document.createTextNode(content))}
-else if(content){for(var i=0;i<content.length;++i){e.appendChild(content[i])}}
-return e}
-function eltP(tag,content,className,style){var e=elt(tag,content,className,style)
-e.setAttribute("role","presentation")
-return e}
-var range
-if(document.createRange){range=function(node,start,end,endNode){var r=document.createRange()
-r.setEnd(endNode||node,end)
-r.setStart(node,start)
-return r}}
-else{range=function(node,start,end){var r=document.body.createTextRange()
-try{r.moveToElementText(node.parentNode)}
-catch(e){return r}
-r.collapse(true)
-r.moveEnd("character",end)
-r.moveStart("character",start)
-return r}}
-function contains(parent,child){if(child.nodeType==3)
-{child=child.parentNode}
-if(parent.contains)
-{return parent.contains(child)}
-do{if(child.nodeType==11){child=child.host}
-if(child==parent){return true}}while(child=child.parentNode)}
-function activeElt(){var activeElement
-try{activeElement=document.activeElement}catch(e){activeElement=document.body||null}
-while(activeElement&&activeElement.shadowRoot&&activeElement.shadowRoot.activeElement)
-{activeElement=activeElement.shadowRoot.activeElement}
-return activeElement}
-function addClass(node,cls){var current=node.className
-if(!classTest(cls).test(current)){node.className+=(current?" ":"")+cls}}
-function joinClasses(a,b){var as=a.split(" ")
-for(var i=0;i<as.length;i++)
-{if(as[i]&&!classTest(as[i]).test(b)){b+=" "+as[i]}}
-return b}
-var selectInput=function(node){node.select()}
-if(ios)
-{selectInput=function(node){node.selectionStart=0;node.selectionEnd=node.value.length}}
-else if(ie)
-{selectInput=function(node){try{node.select()}catch(_e){}}}
-function bind(f){var args=Array.prototype.slice.call(arguments,1)
-return function(){return f.apply(null,args)}}
-function copyObj(obj,target,overwrite){if(!target){target={}}
-for(var prop in obj)
-{if(obj.hasOwnProperty(prop)&&(overwrite!==false||!target.hasOwnProperty(prop)))
-{target[prop]=obj[prop]}}
-return target}
-function countColumn(string,end,tabSize,startIndex,startValue){if(end==null){end=string.search(/[^\s\u00a0]/)
-if(end==-1){end=string.length}}
-for(var i=startIndex||0,n=startValue||0;;){var nextTab=string.indexOf("\t",i)
-if(nextTab<0||nextTab>=end)
-{return n+(end-i)}
-n+=nextTab-i
-n+=tabSize-(n%tabSize)
-i=nextTab+1}}
-var Delayed=function Delayed(){this.id=null};Delayed.prototype.set=function set(ms,f){clearTimeout(this.id)
-this.id=setTimeout(f,ms)};function indexOf(array,elt){for(var i=0;i<array.length;++i)
-{if(array[i]==elt){return i}}
-return-1}
-var scrollerGap=30
-var Pass={toString:function(){return"CodeMirror.Pass"}}
-var sel_dontScroll={scroll:false};var sel_mouse={origin:"*mouse"};var sel_move={origin:"+move"};function findColumn(string,goal,tabSize){for(var pos=0,col=0;;){var nextTab=string.indexOf("\t",pos)
-if(nextTab==-1){nextTab=string.length}
-var skipped=nextTab-pos
-if(nextTab==string.length||col+skipped>=goal)
-{return pos+Math.min(skipped,goal-col)}
-col+=nextTab-pos
-col+=tabSize-(col%tabSize)
-pos=nextTab+1
-if(col>=goal){return pos}}}
-var spaceStrs=[""]
-function spaceStr(n){while(spaceStrs.length<=n)
-{spaceStrs.push(lst(spaceStrs)+" ")}
-return spaceStrs[n]}
-function lst(arr){return arr[arr.length-1]}
-function map(array,f){var out=[]
-for(var i=0;i<array.length;i++){out[i]=f(array[i],i)}
-return out}
-function insertSorted(array,value,score){var pos=0,priority=score(value)
-while(pos<array.length&&score(array[pos])<=priority){pos++}
-array.splice(pos,0,value)}
-function nothing(){}
-function createObj(base,props){var inst
-if(Object.create){inst=Object.create(base)}else{nothing.prototype=base
-inst=new nothing()}
-if(props){copyObj(props,inst)}
-return inst}
-var nonASCIISingleCaseWordChar=/[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/
-function isWordCharBasic(ch){return/\w/.test(ch)||ch>"\x80"&&(ch.toUpperCase()!=ch.toLowerCase()||nonASCIISingleCaseWordChar.test(ch))}
-function isWordChar(ch,helper){if(!helper){return isWordCharBasic(ch)}
-if(helper.source.indexOf("\\w")>-1&&isWordCharBasic(ch)){return true}
-return helper.test(ch)}
-function isEmpty(obj){for(var n in obj){if(obj.hasOwnProperty(n)&&obj[n]){return false}}
-return true}
-var extendingChars=/[\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065e\u0670\u06d6-\u06dc\u06de-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0900-\u0902\u093c\u0941-\u0948\u094d\u0951-\u0955\u0962\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81\u0a82\u0abc\u0ac1-\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86\u0f87\u0f90-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039\u103a\u103d\u103e\u1058\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085\u1086\u108d\u109d\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193b\u1a17\u1a18\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80\u1b81\u1ba2-\u1ba5\u1ba8\u1ba9\u1c2c-\u1c33\u1c36\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1dc0-\u1de6\u1dfd-\u1dff\u200c\u200d\u20d0-\u20f0\u2cef-\u2cf1\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua67c\ua67d\ua6f0\ua6f1\ua802\ua806\ua80b\ua825\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\uaa29-\uaa2e\uaa31\uaa32\uaa35\uaa36\uaa43\uaa4c\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uabe5\uabe8\uabed\udc00-\udfff\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\uff9e\uff9f]/
-function isExtendingChar(ch){return ch.charCodeAt(0)>=768&&extendingChars.test(ch)}
-function skipExtendingChars(str,pos,dir){while((dir<0?pos>0:pos<str.length)&&isExtendingChar(str.charAt(pos))){pos+=dir}
-return pos}
-function findFirst(pred,from,to){for(;;){if(Math.abs(from-to)<=1){return pred(from)?from:to}
-var mid=Math.floor((from+to)/2)
-if(pred(mid)){to=mid}
-else{from=mid}}}
-function Display(place,doc,input){var d=this
-this.input=input
-d.scrollbarFiller=elt("div",null,"CodeMirror-scrollbar-filler")
-d.scrollbarFiller.setAttribute("cm-not-content","true")
-d.gutterFiller=elt("div",null,"CodeMirror-gutter-filler")
-d.gutterFiller.setAttribute("cm-not-content","true")
-d.lineDiv=eltP("div",null,"CodeMirror-code")
-d.selectionDiv=elt("div",null,null,"position: relative; z-index: 1")
-d.cursorDiv=elt("div",null,"CodeMirror-cursors")
-d.measure=elt("div",null,"CodeMirror-measure")
-d.lineMeasure=elt("div",null,"CodeMirror-measure")
-d.lineSpace=eltP("div",[d.measure,d.lineMeasure,d.selectionDiv,d.cursorDiv,d.lineDiv],null,"position: relative; outline: none")
-var lines=eltP("div",[d.lineSpace],"CodeMirror-lines")
-d.mover=elt("div",[lines],null,"position: relative")
-d.sizer=elt("div",[d.mover],"CodeMirror-sizer")
-d.sizerWidth=null
-d.heightForcer=elt("div",null,null,"position: absolute; height: "+scrollerGap+"px; width: 1px;")
-d.gutters=elt("div",null,"CodeMirror-gutters")
-d.lineGutter=null
-d.scroller=elt("div",[d.sizer,d.heightForcer,d.gutters],"CodeMirror-scroll")
-d.scroller.setAttribute("tabIndex","-1")
-d.wrapper=elt("div",[d.scrollbarFiller,d.gutterFiller,d.scroller],"CodeMirror")
-if(ie&&ie_version<8){d.gutters.style.zIndex=-1;d.scroller.style.paddingRight=0}
-if(!webkit&&!(gecko&&mobile)){d.scroller.draggable=true}
-if(place){if(place.appendChild){place.appendChild(d.wrapper)}
-else{place(d.wrapper)}}
-d.viewFrom=d.viewTo=doc.first
-d.reportedViewFrom=d.reportedViewTo=doc.first
-d.view=[]
-d.renderedView=null
-d.externalMeasured=null
-d.viewOffset=0
-d.lastWrapHeight=d.lastWrapWidth=0
-d.updateLineNumbers=null
-d.nativeBarWidth=d.barHeight=d.barWidth=0
-d.scrollbarsClipped=false
-d.lineNumWidth=d.lineNumInnerWidth=d.lineNumChars=null
-d.alignWidgets=false
-d.cachedCharWidth=d.cachedTextHeight=d.cachedPaddingH=null
-d.maxLine=null
-d.maxLineLength=0
-d.maxLineChanged=false
-d.wheelDX=d.wheelDY=d.wheelStartX=d.wheelStartY=null
-d.shift=false
-d.selForContextMenu=null
-d.activeTouch=null
-input.init(d)}
-function getLine(doc,n){n-=doc.first
-if(n<0||n>=doc.size){throw new Error("There is no line "+(n+doc.first)+" in the document.")}
-var chunk=doc
-while(!chunk.lines){for(var i=0;;++i){var child=chunk.children[i],sz=child.chunkSize()
-if(n<sz){chunk=child;break}
-n-=sz}}
-return chunk.lines[n]}
-function getBetween(doc,start,end){var out=[],n=start.line
-doc.iter(start.line,end.line+1,function(line){var text=line.text
-if(n==end.line){text=text.slice(0,end.ch)}
-if(n==start.line){text=text.slice(start.ch)}
-out.push(text)
-++n})
-return out}
-function getLines(doc,from,to){var out=[]
-doc.iter(from,to,function(line){out.push(line.text)})
-return out}
-function updateLineHeight(line,height){var diff=height-line.height
-if(diff){for(var n=line;n;n=n.parent){n.height+=diff}}}
-function lineNo(line){if(line.parent==null){return null}
-var cur=line.parent,no=indexOf(cur.lines,line)
-for(var chunk=cur.parent;chunk;cur=chunk,chunk=chunk.parent){for(var i=0;;++i){if(chunk.children[i]==cur){break}
-no+=chunk.children[i].chunkSize()}}
-return no+cur.first}
-function lineAtHeight(chunk,h){var n=chunk.first
-outer:do{for(var i$1=0;i$1<chunk.children.length;++i$1){var child=chunk.children[i$1],ch=child.height
-if(h<ch){chunk=child;continue outer}
-h-=ch
-n+=child.chunkSize()}
-return n}while(!chunk.lines)
-var i=0
-for(;i<chunk.lines.length;++i){var line=chunk.lines[i],lh=line.height
-if(h<lh){break}
-h-=lh}
-return n+i}
-function isLine(doc,l){return l>=doc.first&&l<doc.first+doc.size}
-function lineNumberFor(options,i){return String(options.lineNumberFormatter(i+options.firstLineNumber))}
-function Pos(line,ch,sticky){if(sticky===void 0)sticky=null;if(!(this instanceof Pos)){return new Pos(line,ch,sticky)}
-this.line=line
-this.ch=ch
-this.sticky=sticky}
-function cmp(a,b){return a.line-b.line||a.ch-b.ch}
-function equalCursorPos(a,b){return a.sticky==b.sticky&&cmp(a,b)==0}
-function copyPos(x){return Pos(x.line,x.ch)}
-function maxPos(a,b){return cmp(a,b)<0?b:a}
-function minPos(a,b){return cmp(a,b)<0?a:b}
-function clipLine(doc,n){return Math.max(doc.first,Math.min(n,doc.first+doc.size-1))}
-function clipPos(doc,pos){if(pos.line<doc.first){return Pos(doc.first,0)}
-var last=doc.first+doc.size-1
-if(pos.line>last){return Pos(last,getLine(doc,last).text.length)}
-return clipToLen(pos,getLine(doc,pos.line).text.length)}
-function clipToLen(pos,linelen){var ch=pos.ch
-if(ch==null||ch>linelen){return Pos(pos.line,linelen)}
-else if(ch<0){return Pos(pos.line,0)}
-else{return pos}}
-function clipPosArray(doc,array){var out=[]
-for(var i=0;i<array.length;i++){out[i]=clipPos(doc,array[i])}
-return out}
-var sawReadOnlySpans=false;var sawCollapsedSpans=false;function seeReadOnlySpans(){sawReadOnlySpans=true}
-function seeCollapsedSpans(){sawCollapsedSpans=true}
-function MarkedSpan(marker,from,to){this.marker=marker
-this.from=from;this.to=to}
-function getMarkedSpanFor(spans,marker){if(spans){for(var i=0;i<spans.length;++i){var span=spans[i]
-if(span.marker==marker){return span}}}}
-function removeMarkedSpan(spans,span){var r
-for(var i=0;i<spans.length;++i)
-{if(spans[i]!=span){(r||(r=[])).push(spans[i])}}
-return r}
-function addMarkedSpan(line,span){line.markedSpans=line.markedSpans?line.markedSpans.concat([span]):[span]
-span.marker.attachLine(line)}
-function markedSpansBefore(old,startCh,isInsert){var nw
-if(old){for(var i=0;i<old.length;++i){var span=old[i],marker=span.marker
-var startsBefore=span.from==null||(marker.inclusiveLeft?span.from<=startCh:span.from<startCh)
-if(startsBefore||span.from==startCh&&marker.type=="bookmark"&&(!isInsert||!span.marker.insertLeft)){var endsAfter=span.to==null||(marker.inclusiveRight?span.to>=startCh:span.to>startCh);(nw||(nw=[])).push(new MarkedSpan(marker,span.from,endsAfter?null:span.to))}}}
-return nw}
-function markedSpansAfter(old,endCh,isInsert){var nw
-if(old){for(var i=0;i<old.length;++i){var span=old[i],marker=span.marker
-var endsAfter=span.to==null||(marker.inclusiveRight?span.to>=endCh:span.to>endCh)
-if(endsAfter||span.from==endCh&&marker.type=="bookmark"&&(!isInsert||span.marker.insertLeft)){var startsBefore=span.from==null||(marker.inclusiveLeft?span.from<=endCh:span.from<endCh);(nw||(nw=[])).push(new MarkedSpan(marker,startsBefore?null:span.from-endCh,span.to==null?null:span.to-endCh))}}}
-return nw}
-function stretchSpansOverChange(doc,change){if(change.full){return null}
-var oldFirst=isLine(doc,change.from.line)&&getLine(doc,change.from.line).markedSpans
-var oldLast=isLine(doc,change.to.line)&&getLine(doc,change.to.line).markedSpans
-if(!oldFirst&&!oldLast){return null}
-var startCh=change.from.ch,endCh=change.to.ch,isInsert=cmp(change.from,change.to)==0
-var first=markedSpansBefore(oldFirst,startCh,isInsert)
-var last=markedSpansAfter(oldLast,endCh,isInsert)
-var sameLine=change.text.length==1,offset=lst(change.text).length+(sameLine?startCh:0)
-if(first){for(var i=0;i<first.length;++i){var span=first[i]
-if(span.to==null){var found=getMarkedSpanFor(last,span.marker)
-if(!found){span.to=startCh}
-else if(sameLine){span.to=found.to==null?null:found.to+offset}}}}
-if(last){for(var i$1=0;i$1<last.length;++i$1){var span$1=last[i$1]
-if(span$1.to!=null){span$1.to+=offset}
-if(span$1.from==null){var found$1=getMarkedSpanFor(first,span$1.marker)
-if(!found$1){span$1.from=offset
-if(sameLine){(first||(first=[])).push(span$1)}}}else{span$1.from+=offset
-if(sameLine){(first||(first=[])).push(span$1)}}}}
-if(first){first=clearEmptySpans(first)}
-if(last&&last!=first){last=clearEmptySpans(last)}
-var newMarkers=[first]
-if(!sameLine){var gap=change.text.length-2,gapMarkers
-if(gap>0&&first)
-{for(var i$2=0;i$2<first.length;++i$2)
-{if(first[i$2].to==null)
-{(gapMarkers||(gapMarkers=[])).push(new MarkedSpan(first[i$2].marker,null,null))}}}
-for(var i$3=0;i$3<gap;++i$3)
-{newMarkers.push(gapMarkers)}
-newMarkers.push(last)}
-return newMarkers}
-function clearEmptySpans(spans){for(var i=0;i<spans.length;++i){var span=spans[i]
-if(span.from!=null&&span.from==span.to&&span.marker.clearWhenEmpty!==false)
-{spans.splice(i--,1)}}
-if(!spans.length){return null}
-return spans}
-function removeReadOnlyRanges(doc,from,to){var markers=null
-doc.iter(from.line,to.line+1,function(line){if(line.markedSpans){for(var i=0;i<line.markedSpans.length;++i){var mark=line.markedSpans[i].marker
-if(mark.readOnly&&(!markers||indexOf(markers,mark)==-1))
-{(markers||(markers=[])).push(mark)}}}})
-if(!markers){return null}
-var parts=[{from:from,to:to}]
-for(var i=0;i<markers.length;++i){var mk=markers[i],m=mk.find(0)
-for(var j=0;j<parts.length;++j){var p=parts[j]
-if(cmp(p.to,m.from)<0||cmp(p.from,m.to)>0){continue}
-var newParts=[j,1],dfrom=cmp(p.from,m.from),dto=cmp(p.to,m.to)
-if(dfrom<0||!mk.inclusiveLeft&&!dfrom)
-{newParts.push({from:p.from,to:m.from})}
-if(dto>0||!mk.inclusiveRight&&!dto)
-{newParts.push({from:m.to,to:p.to})}
-parts.splice.apply(parts,newParts)
-j+=newParts.length-3}}
-return parts}
-function detachMarkedSpans(line){var spans=line.markedSpans
-if(!spans){return}
-for(var i=0;i<spans.length;++i)
-{spans[i].marker.detachLine(line)}
-line.markedSpans=null}
-function attachMarkedSpans(line,spans){if(!spans){return}
-for(var i=0;i<spans.length;++i)
-{spans[i].marker.attachLine(line)}
-line.markedSpans=spans}
-function extraLeft(marker){return marker.inclusiveLeft?-1:0}
-function extraRight(marker){return marker.inclusiveRight?1:0}
-function compareCollapsedMarkers(a,b){var lenDiff=a.lines.length-b.lines.length
-if(lenDiff!=0){return lenDiff}
-var aPos=a.find(),bPos=b.find()
-var fromCmp=cmp(aPos.from,bPos.from)||extraLeft(a)-extraLeft(b)
-if(fromCmp){return-fromCmp}
-var toCmp=cmp(aPos.to,bPos.to)||extraRight(a)-extraRight(b)
-if(toCmp){return toCmp}
-return b.id-a.id}
-function collapsedSpanAtSide(line,start){var sps=sawCollapsedSpans&&line.markedSpans,found
-if(sps){for(var sp=(void 0),i=0;i<sps.length;++i){sp=sps[i]
-if(sp.marker.collapsed&&(start?sp.from:sp.to)==null&&(!found||compareCollapsedMarkers(found,sp.marker)<0))
-{found=sp.marker}}}
-return found}
-function collapsedSpanAtStart(line){return collapsedSpanAtSide(line,true)}
-function collapsedSpanAtEnd(line){return collapsedSpanAtSide(line,false)}
-function conflictingCollapsedRange(doc,lineNo,from,to,marker){var line=getLine(doc,lineNo)
-var sps=sawCollapsedSpans&&line.markedSpans
-if(sps){for(var i=0;i<sps.length;++i){var sp=sps[i]
-if(!sp.marker.collapsed){continue}
-var found=sp.marker.find(0)
-var fromCmp=cmp(found.from,from)||extraLeft(sp.marker)-extraLeft(marker)
-var toCmp=cmp(found.to,to)||extraRight(sp.marker)-extraRight(marker)
-if(fromCmp>=0&&toCmp<=0||fromCmp<=0&&toCmp>=0){continue}
-if(fromCmp<=0&&(sp.marker.inclusiveRight&&marker.inclusiveLeft?cmp(found.to,from)>=0:cmp(found.to,from)>0)||fromCmp>=0&&(sp.marker.inclusiveRight&&marker.inclusiveLeft?cmp(found.from,to)<=0:cmp(found.from,to)<0))
-{return true}}}}
-function visualLine(line){var merged
-while(merged=collapsedSpanAtStart(line))
-{line=merged.find(-1,true).line}
-return line}
-function visualLineEnd(line){var merged
-while(merged=collapsedSpanAtEnd(line))
-{line=merged.find(1,true).line}
-return line}
-function visualLineContinued(line){var merged,lines
-while(merged=collapsedSpanAtEnd(line)){line=merged.find(1,true).line;(lines||(lines=[])).push(line)}
-return lines}
-function visualLineNo(doc,lineN){var line=getLine(doc,lineN),vis=visualLine(line)
-if(line==vis){return lineN}
-return lineNo(vis)}
-function visualLineEndNo(doc,lineN){if(lineN>doc.lastLine()){return lineN}
-var line=getLine(doc,lineN),merged
-if(!lineIsHidden(doc,line)){return lineN}
-while(merged=collapsedSpanAtEnd(line))
-{line=merged.find(1,true).line}
-return lineNo(line)+1}
-function lineIsHidden(doc,line){var sps=sawCollapsedSpans&&line.markedSpans
-if(sps){for(var sp=(void 0),i=0;i<sps.length;++i){sp=sps[i]
-if(!sp.marker.collapsed){continue}
-if(sp.from==null){return true}
-if(sp.marker.widgetNode){continue}
-if(sp.from==0&&sp.marker.inclusiveLeft&&lineIsHiddenInner(doc,line,sp))
-{return true}}}}
-function lineIsHiddenInner(doc,line,span){if(span.to==null){var end=span.marker.find(1,true)
-return lineIsHiddenInner(doc,end.line,getMarkedSpanFor(end.line.markedSpans,span.marker))}
-if(span.marker.inclusiveRight&&span.to==line.text.length)
-{return true}
-for(var sp=(void 0),i=0;i<line.markedSpans.length;++i){sp=line.markedSpans[i]
-if(sp.marker.collapsed&&!sp.marker.widgetNode&&sp.from==span.to&&(sp.to==null||sp.to!=span.from)&&(sp.marker.inclusiveLeft||span.marker.inclusiveRight)&&lineIsHiddenInner(doc,line,sp)){return true}}}
-function heightAtLine(lineObj){lineObj=visualLine(lineObj)
-var h=0,chunk=lineObj.parent
-for(var i=0;i<chunk.lines.length;++i){var line=chunk.lines[i]
-if(line==lineObj){break}
-else{h+=line.height}}
-for(var p=chunk.parent;p;chunk=p,p=chunk.parent){for(var i$1=0;i$1<p.children.length;++i$1){var cur=p.children[i$1]
-if(cur==chunk){break}
-else{h+=cur.height}}}
-return h}
-function lineLength(line){if(line.height==0){return 0}
-var len=line.text.length,merged,cur=line
-while(merged=collapsedSpanAtStart(cur)){var found=merged.find(0,true)
-cur=found.from.line
-len+=found.from.ch-found.to.ch}
-cur=line
-while(merged=collapsedSpanAtEnd(cur)){var found$1=merged.find(0,true)
-len-=cur.text.length-found$1.from.ch
-cur=found$1.to.line
-len+=cur.text.length-found$1.to.ch}
-return len}
-function findMaxLine(cm){var d=cm.display,doc=cm.doc
-d.maxLine=getLine(doc,doc.first)
-d.maxLineLength=lineLength(d.maxLine)
-d.maxLineChanged=true
-doc.iter(function(line){var len=lineLength(line)
-if(len>d.maxLineLength){d.maxLineLength=len
-d.maxLine=line}})}
-function iterateBidiSections(order,from,to,f){if(!order){return f(from,to,"ltr")}
-var found=false
-for(var i=0;i<order.length;++i){var part=order[i]
-if(part.from<to&&part.to>from||from==to&&part.to==from){f(Math.max(part.from,from),Math.min(part.to,to),part.level==1?"rtl":"ltr")
-found=true}}
-if(!found){f(from,to,"ltr")}}
-var bidiOther=null
-function getBidiPartAt(order,ch,sticky){var found
-bidiOther=null
-for(var i=0;i<order.length;++i){var cur=order[i]
-if(cur.from<ch&&cur.to>ch){return i}
-if(cur.to==ch){if(cur.from!=cur.to&&sticky=="before"){found=i}
-else{bidiOther=i}}
-if(cur.from==ch){if(cur.from!=cur.to&&sticky!="before"){found=i}
-else{bidiOther=i}}}
-return found!=null?found:bidiOther}
-var bidiOrdering=(function(){var lowTypes="bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN"
-var arabicTypes="nnnnnnNNr%%r,rNNmmmmmmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmmmnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmnNmmmmmmrrmmNmmmmrr1111111111"
-function charType(code){if(code<=0xf7){return lowTypes.charAt(code)}
-else if(0x590<=code&&code<=0x5f4){return"R"}
-else if(0x600<=code&&code<=0x6f9){return arabicTypes.charAt(code-0x600)}
-else if(0x6ee<=code&&code<=0x8ac){return"r"}
-else if(0x2000<=code&&code<=0x200b){return"w"}
-else if(code==0x200c){return"b"}
-else{return"L"}}
-var bidiRE=/[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/
-var isNeutral=/[stwN]/,isStrong=/[LRr]/,countsAsLeft=/[Lb1n]/,countsAsNum=/[1n]/
-function BidiSpan(level,from,to){this.level=level
-this.from=from;this.to=to}
-return function(str,direction){var outerType=direction=="ltr"?"L":"R"
-if(str.length==0||direction=="ltr"&&!bidiRE.test(str)){return false}
-var len=str.length,types=[]
-for(var i=0;i<len;++i)
-{types.push(charType(str.charCodeAt(i)))}
-for(var i$1=0,prev=outerType;i$1<len;++i$1){var type=types[i$1]
-if(type=="m"){types[i$1]=prev}
-else{prev=type}}
-for(var i$2=0,cur=outerType;i$2<len;++i$2){var type$1=types[i$2]
-if(type$1=="1"&&cur=="r"){types[i$2]="n"}
-else if(isStrong.test(type$1)){cur=type$1;if(type$1=="r"){types[i$2]="R"}}}
-for(var i$3=1,prev$1=types[0];i$3<len-1;++i$3){var type$2=types[i$3]
-if(type$2=="+"&&prev$1=="1"&&types[i$3+1]=="1"){types[i$3]="1"}
-else if(type$2==","&&prev$1==types[i$3+1]&&(prev$1=="1"||prev$1=="n")){types[i$3]=prev$1}
-prev$1=type$2}
-for(var i$4=0;i$4<len;++i$4){var type$3=types[i$4]
-if(type$3==","){types[i$4]="N"}
-else if(type$3=="%"){var end=(void 0)
-for(end=i$4+1;end<len&&types[end]=="%";++end){}
-var replace=(i$4&&types[i$4-1]=="!")||(end<len&&types[end]=="1")?"1":"N"
-for(var j=i$4;j<end;++j){types[j]=replace}
-i$4=end-1}}
-for(var i$5=0,cur$1=outerType;i$5<len;++i$5){var type$4=types[i$5]
-if(cur$1=="L"&&type$4=="1"){types[i$5]="L"}
-else if(isStrong.test(type$4)){cur$1=type$4}}
-for(var i$6=0;i$6<len;++i$6){if(isNeutral.test(types[i$6])){var end$1=(void 0)
-for(end$1=i$6+1;end$1<len&&isNeutral.test(types[end$1]);++end$1){}
-var before=(i$6?types[i$6-1]:outerType)=="L"
-var after=(end$1<len?types[end$1]:outerType)=="L"
-var replace$1=before==after?(before?"L":"R"):outerType
-for(var j$1=i$6;j$1<end$1;++j$1){types[j$1]=replace$1}
-i$6=end$1-1}}
-var order=[],m
-for(var i$7=0;i$7<len;){if(countsAsLeft.test(types[i$7])){var start=i$7
-for(++i$7;i$7<len&&countsAsLeft.test(types[i$7]);++i$7){}
-order.push(new BidiSpan(0,start,i$7))}else{var pos=i$7,at=order.length
-for(++i$7;i$7<len&&types[i$7]!="L";++i$7){}
-for(var j$2=pos;j$2<i$7;){if(countsAsNum.test(types[j$2])){if(pos<j$2){order.splice(at,0,new BidiSpan(1,pos,j$2))}
-var nstart=j$2
-for(++j$2;j$2<i$7&&countsAsNum.test(types[j$2]);++j$2){}
-order.splice(at,0,new BidiSpan(2,nstart,j$2))
-pos=j$2}else{++j$2}}
-if(pos<i$7){order.splice(at,0,new BidiSpan(1,pos,i$7))}}}
-if(order[0].level==1&&(m=str.match(/^\s+/))){order[0].from=m[0].length
-order.unshift(new BidiSpan(0,0,m[0].length))}
-if(lst(order).level==1&&(m=str.match(/\s+$/))){lst(order).to-=m[0].length
-order.push(new BidiSpan(0,len-m[0].length,len))}
-return direction=="rtl"?order.reverse():order}})()
-function getOrder(line,direction){var order=line.order
-if(order==null){order=line.order=bidiOrdering(line.text,direction)}
-return order}
-function moveCharLogically(line,ch,dir){var target=skipExtendingChars(line.text,ch+dir,dir)
-return target<0||target>line.text.length?null:target}
-function moveLogically(line,start,dir){var ch=moveCharLogically(line,start.ch,dir)
-return ch==null?null:new Pos(start.line,ch,dir<0?"after":"before")}
-function endOfLine(visually,cm,lineObj,lineNo,dir){if(visually){var order=getOrder(lineObj,cm.doc.direction)
-if(order){var part=dir<0?lst(order):order[0]
-var moveInStorageOrder=(dir<0)==(part.level==1)
-var sticky=moveInStorageOrder?"after":"before"
-var ch
-if(part.level>0){var prep=prepareMeasureForLine(cm,lineObj)
-ch=dir<0?lineObj.text.length-1:0
-var targetTop=measureCharPrepared(cm,prep,ch).top
-ch=findFirst(function(ch){return measureCharPrepared(cm,prep,ch).top==targetTop;},(dir<0)==(part.level==1)?part.from:part.to-1,ch)
-if(sticky=="before"){ch=moveCharLogically(lineObj,ch,1,true)}}else{ch=dir<0?part.to:part.from}
-return new Pos(lineNo,ch,sticky)}}
-return new Pos(lineNo,dir<0?lineObj.text.length:0,dir<0?"before":"after")}
-function moveVisually(cm,line,start,dir){var bidi=getOrder(line,cm.doc.direction)
-if(!bidi){return moveLogically(line,start,dir)}
-if(start.ch>=line.text.length){start.ch=line.text.length
-start.sticky="before"}else if(start.ch<=0){start.ch=0
-start.sticky="after"}
-var partPos=getBidiPartAt(bidi,start.ch,start.sticky),part=bidi[partPos]
-if(cm.doc.direction=="ltr"&&part.level%2==0&&(dir>0?part.to>start.ch:part.from<start.ch)){return moveLogically(line,start,dir)}
-var mv=function(pos,dir){return moveCharLogically(line,pos instanceof Pos?pos.ch:pos,dir);}
-var prep
-var getWrappedLineExtent=function(ch){if(!cm.options.lineWrapping){return{begin:0,end:line.text.length}}
-prep=prep||prepareMeasureForLine(cm,line)
-return wrappedLineExtentChar(cm,line,prep,ch)}
-var wrappedLineExtent=getWrappedLineExtent(start.sticky=="before"?mv(start,-1):start.ch)
-if(cm.doc.direction=="rtl"||part.level==1){var moveInStorageOrder=(part.level==1)==(dir<0)
-var ch=mv(start,moveInStorageOrder?1:-1)
-if(ch!=null&&(!moveInStorageOrder?ch>=part.from&&ch>=wrappedLineExtent.begin:ch<=part.to&&ch<=wrappedLineExtent.end)){var sticky=moveInStorageOrder?"before":"after"
-return new Pos(start.line,ch,sticky)}}
-var searchInVisualLine=function(partPos,dir,wrappedLineExtent){var getRes=function(ch,moveInStorageOrder){return moveInStorageOrder?new Pos(start.line,mv(ch,1),"before"):new Pos(start.line,ch,"after");}
-for(;partPos>=0&&partPos<bidi.length;partPos+=dir){var part=bidi[partPos]
-var moveInStorageOrder=(dir>0)==(part.level!=1)
-var ch=moveInStorageOrder?wrappedLineExtent.begin:mv(wrappedLineExtent.end,-1)
-if(part.from<=ch&&ch<part.to){return getRes(ch,moveInStorageOrder)}
-ch=moveInStorageOrder?part.from:mv(part.to,-1)
-if(wrappedLineExtent.begin<=ch&&ch<wrappedLineExtent.end){return getRes(ch,moveInStorageOrder)}}}
-var res=searchInVisualLine(partPos+dir,dir,wrappedLineExtent)
-if(res){return res}
-var nextCh=dir>0?wrappedLineExtent.end:mv(wrappedLineExtent.begin,-1)
-if(nextCh!=null&&!(dir>0&&nextCh==line.text.length)){res=searchInVisualLine(dir>0?0:bidi.length-1,dir,getWrappedLineExtent(nextCh))
-if(res){return res}}
-return null}
-var noHandlers=[]
-var on=function(emitter,type,f){if(emitter.addEventListener){emitter.addEventListener(type,f,false)}else if(emitter.attachEvent){emitter.attachEvent("on"+type,f)}else{var map=emitter._handlers||(emitter._handlers={})
-map[type]=(map[type]||noHandlers).concat(f)}}
-function getHandlers(emitter,type){return emitter._handlers&&emitter._handlers[type]||noHandlers}
-function off(emitter,type,f){if(emitter.removeEventListener){emitter.removeEventListener(type,f,false)}else if(emitter.detachEvent){emitter.detachEvent("on"+type,f)}else{var map=emitter._handlers,arr=map&&map[type]
-if(arr){var index=indexOf(arr,f)
-if(index>-1)
-{map[type]=arr.slice(0,index).concat(arr.slice(index+1))}}}}
-function signal(emitter,type){var handlers=getHandlers(emitter,type)
-if(!handlers.length){return}
-var args=Array.prototype.slice.call(arguments,2)
-for(var i=0;i<handlers.length;++i){handlers[i].apply(null,args)}}
-function signalDOMEvent(cm,e,override){if(typeof e=="string")
-{e={type:e,preventDefault:function(){this.defaultPrevented=true}}}
-signal(cm,override||e.type,cm,e)
-return e_defaultPrevented(e)||e.codemirrorIgnore}
-function signalCursorActivity(cm){var arr=cm._handlers&&cm._handlers.cursorActivity
-if(!arr){return}
-var set=cm.curOp.cursorActivityHandlers||(cm.curOp.cursorActivityHandlers=[])
-for(var i=0;i<arr.length;++i){if(indexOf(set,arr[i])==-1)
-{set.push(arr[i])}}}
-function hasHandler(emitter,type){return getHandlers(emitter,type).length>0}
-function eventMixin(ctor){ctor.prototype.on=function(type,f){on(this,type,f)}
-ctor.prototype.off=function(type,f){off(this,type,f)}}
-function e_preventDefault(e){if(e.preventDefault){e.preventDefault()}
-else{e.returnValue=false}}
-function e_stopPropagation(e){if(e.stopPropagation){e.stopPropagation()}
-else{e.cancelBubble=true}}
-function e_defaultPrevented(e){return e.defaultPrevented!=null?e.defaultPrevented:e.returnValue==false}
-function e_stop(e){e_preventDefault(e);e_stopPropagation(e)}
-function e_target(e){return e.target||e.srcElement}
-function e_button(e){var b=e.which
-if(b==null){if(e.button&1){b=1}
-else if(e.button&2){b=3}
-else if(e.button&4){b=2}}
-if(mac&&e.ctrlKey&&b==1){b=3}
-return b}
-var dragAndDrop=function(){if(ie&&ie_version<9){return false}
-var div=elt('div')
-return"draggable"in div||"dragDrop"in div}()
-var zwspSupported
-function zeroWidthElement(measure){if(zwspSupported==null){var test=elt("span","\u200b")
-removeChildrenAndAdd(measure,elt("span",[test,document.createTextNode("x")]))
-if(measure.firstChild.offsetHeight!=0)
-{zwspSupported=test.offsetWidth<=1&&test.offsetHeight>2&&!(ie&&ie_version<8)}}
-var node=zwspSupported?elt("span","\u200b"):elt("span","\u00a0",null,"display: inline-block; width: 1px; margin-right: -1px")
-node.setAttribute("cm-text","")
-return node}
-var badBidiRects
-function hasBadBidiRects(measure){if(badBidiRects!=null){return badBidiRects}
-var txt=removeChildrenAndAdd(measure,document.createTextNode("A\u062eA"))
-var r0=range(txt,0,1).getBoundingClientRect()
-var r1=range(txt,1,2).getBoundingClientRect()
-removeChildren(measure)
-if(!r0||r0.left==r0.right){return false}
-return badBidiRects=(r1.right-r0.right<3)}
-var splitLinesAuto="\n\nb".split(/\n/).length!=3?function(string){var pos=0,result=[],l=string.length
-while(pos<=l){var nl=string.indexOf("\n",pos)
-if(nl==-1){nl=string.length}
-var line=string.slice(pos,string.charAt(nl-1)=="\r"?nl-1:nl)
-var rt=line.indexOf("\r")
-if(rt!=-1){result.push(line.slice(0,rt))
-pos+=rt+1}else{result.push(line)
-pos=nl+1}}
-return result}:function(string){return string.split(/\r\n?|\n/);}
-var hasSelection=window.getSelection?function(te){try{return te.selectionStart!=te.selectionEnd}
-catch(e){return false}}:function(te){var range
-try{range=te.ownerDocument.selection.createRange()}
-catch(e){}
-if(!range||range.parentElement()!=te){return false}
-return range.compareEndPoints("StartToEnd",range)!=0}
-var hasCopyEvent=(function(){var e=elt("div")
-if("oncopy"in e){return true}
-e.setAttribute("oncopy","return;")
-return typeof e.oncopy=="function"})()
-var badZoomedRects=null
-function hasBadZoomedRects(measure){if(badZoomedRects!=null){return badZoomedRects}
-var node=removeChildrenAndAdd(measure,elt("span","x"))
-var normal=node.getBoundingClientRect()
-var fromRange=range(node,0,1).getBoundingClientRect()
-return badZoomedRects=Math.abs(normal.left-fromRange.left)>1}
-var modes={};var mimeModes={};function defineMode(name,mode){if(arguments.length>2)
-{mode.dependencies=Array.prototype.slice.call(arguments,2)}
-modes[name]=mode}
-function defineMIME(mime,spec){mimeModes[mime]=spec}
-function resolveMode(spec){if(typeof spec=="string"&&mimeModes.hasOwnProperty(spec)){spec=mimeModes[spec]}else if(spec&&typeof spec.name=="string"&&mimeModes.hasOwnProperty(spec.name)){var found=mimeModes[spec.name]
-if(typeof found=="string"){found={name:found}}
-spec=createObj(found,spec)
-spec.name=found.name}else if(typeof spec=="string"&&/^[\w\-]+\/[\w\-]+\+xml$/.test(spec)){return resolveMode("application/xml")}else if(typeof spec=="string"&&/^[\w\-]+\/[\w\-]+\+json$/.test(spec)){return resolveMode("application/json")}
-if(typeof spec=="string"){return{name:spec}}
-else{return spec||{name:"null"}}}
-function getMode(options,spec){spec=resolveMode(spec)
-var mfactory=modes[spec.name]
-if(!mfactory){return getMode(options,"text/plain")}
-var modeObj=mfactory(options,spec)
-if(modeExtensions.hasOwnProperty(spec.name)){var exts=modeExtensions[spec.name]
-for(var prop in exts){if(!exts.hasOwnProperty(prop)){continue}
-if(modeObj.hasOwnProperty(prop)){modeObj["_"+prop]=modeObj[prop]}
-modeObj[prop]=exts[prop]}}
-modeObj.name=spec.name
-if(spec.helperType){modeObj.helperType=spec.helperType}
-if(spec.modeProps){for(var prop$1 in spec.modeProps)
-{modeObj[prop$1]=spec.modeProps[prop$1]}}
-return modeObj}
-var modeExtensions={}
-function extendMode(mode,properties){var exts=modeExtensions.hasOwnProperty(mode)?modeExtensions[mode]:(modeExtensions[mode]={})
-copyObj(properties,exts)}
-function copyState(mode,state){if(state===true){return state}
-if(mode.copyState){return mode.copyState(state)}
-var nstate={}
-for(var n in state){var val=state[n]
-if(val instanceof Array){val=val.concat([])}
-nstate[n]=val}
-return nstate}
-function innerMode(mode,state){var info
-while(mode.innerMode){info=mode.innerMode(state)
-if(!info||info.mode==mode){break}
-state=info.state
-mode=info.mode}
-return info||{mode:mode,state:state}}
-function startState(mode,a1,a2){return mode.startState?mode.startState(a1,a2):true}
-var StringStream=function StringStream(string,tabSize){this.pos=this.start=0
-this.string=string
-this.tabSize=tabSize||8
-this.lastColumnPos=this.lastColumnValue=0
-this.lineStart=0};StringStream.prototype.eol=function eol(){return this.pos>=this.string.length};StringStream.prototype.sol=function sol(){return this.pos==this.lineStart};StringStream.prototype.peek=function peek(){return this.string.charAt(this.pos)||undefined};StringStream.prototype.next=function next(){if(this.pos<this.string.length)
-{return this.string.charAt(this.pos++)}};StringStream.prototype.eat=function eat(match){var ch=this.string.charAt(this.pos)
-var ok
-if(typeof match=="string"){ok=ch==match}
-else{ok=ch&&(match.test?match.test(ch):match(ch))}
-if(ok){++this.pos;return ch}};StringStream.prototype.eatWhile=function eatWhile(match){var start=this.pos
-while(this.eat(match)){}
-return this.pos>start};StringStream.prototype.eatSpace=function eatSpace(){var this$1=this;var start=this.pos
-while(/[\s\u00a0]/.test(this.string.charAt(this.pos))){++this$1.pos}
-return this.pos>start};StringStream.prototype.skipToEnd=function skipToEnd(){this.pos=this.string.length};StringStream.prototype.skipTo=function skipTo(ch){var found=this.string.indexOf(ch,this.pos)
-if(found>-1){this.pos=found;return true}};StringStream.prototype.backUp=function backUp(n){this.pos-=n};StringStream.prototype.column=function column(){if(this.lastColumnPos<this.start){this.lastColumnValue=countColumn(this.string,this.start,this.tabSize,this.lastColumnPos,this.lastColumnValue)
-this.lastColumnPos=this.start}
-return this.lastColumnValue-(this.lineStart?countColumn(this.string,this.lineStart,this.tabSize):0)};StringStream.prototype.indentation=function indentation(){return countColumn(this.string,null,this.tabSize)-
-(this.lineStart?countColumn(this.string,this.lineStart,this.tabSize):0)};StringStream.prototype.match=function match(pattern,consume,caseInsensitive){if(typeof pattern=="string"){var cased=function(str){return caseInsensitive?str.toLowerCase():str;}
-var substr=this.string.substr(this.pos,pattern.length)
-if(cased(substr)==cased(pattern)){if(consume!==false){this.pos+=pattern.length}
-return true}}else{var match=this.string.slice(this.pos).match(pattern)
-if(match&&match.index>0){return null}
-if(match&&consume!==false){this.pos+=match[0].length}
-return match}};StringStream.prototype.current=function current(){return this.string.slice(this.start,this.pos)};StringStream.prototype.hideFirstChars=function hideFirstChars(n,inner){this.lineStart+=n
-try{return inner()}
-finally{this.lineStart-=n}};function highlightLine(cm,line,state,forceToEnd){var st=[cm.state.modeGen],lineClasses={}
-runMode(cm,line.text,cm.doc.mode,state,function(end,style){return st.push(end,style);},lineClasses,forceToEnd)
-var loop=function(o){var overlay=cm.state.overlays[o],i=1,at=0
-runMode(cm,line.text,overlay.mode,true,function(end,style){var start=i
-while(at<end){var i_end=st[i]
-if(i_end>end)
-{st.splice(i,1,end,st[i+1],i_end)}
-i+=2
-at=Math.min(end,i_end)}
-if(!style){return}
-if(overlay.opaque){st.splice(start,i-start,end,"overlay "+style)
-i=start+2}else{for(;start<i;start+=2){var cur=st[start+1]
-st[start+1]=(cur?cur+" ":"")+"overlay "+style}}},lineClasses)};for(var o=0;o<cm.state.overlays.length;++o)loop(o);return{styles:st,classes:lineClasses.bgClass||lineClasses.textClass?lineClasses:null}}
-function getLineStyles(cm,line,updateFrontier){if(!line.styles||line.styles[0]!=cm.state.modeGen){var state=getStateBefore(cm,lineNo(line))
-var result=highlightLine(cm,line,line.text.length>cm.options.maxHighlightLength?copyState(cm.doc.mode,state):state)
-line.stateAfter=state
-line.styles=result.styles
-if(result.classes){line.styleClasses=result.classes}
-else if(line.styleClasses){line.styleClasses=null}
-if(updateFrontier===cm.doc.frontier){cm.doc.frontier++}}
-return line.styles}
-function getStateBefore(cm,n,precise){var doc=cm.doc,display=cm.display
-if(!doc.mode.startState){return true}
-var pos=findStartLine(cm,n,precise),state=pos>doc.first&&getLine(doc,pos-1).stateAfter
-if(!state){state=startState(doc.mode)}
-else{state=copyState(doc.mode,state)}
-doc.iter(pos,n,function(line){processLine(cm,line.text,state)
-var save=pos==n-1||pos%5==0||pos>=display.viewFrom&&pos<display.viewTo
-line.stateAfter=save?copyState(doc.mode,state):null
-++pos})
-if(precise){doc.frontier=pos}
-return state}
-function processLine(cm,text,state,startAt){var mode=cm.doc.mode
-var stream=new StringStream(text,cm.options.tabSize)
-stream.start=stream.pos=startAt||0
-if(text==""){callBlankLine(mode,state)}
-while(!stream.eol()){readToken(mode,stream,state)
-stream.start=stream.pos}}
-function callBlankLine(mode,state){if(mode.blankLine){return mode.blankLine(state)}
-if(!mode.innerMode){return}
-var inner=innerMode(mode,state)
-if(inner.mode.blankLine){return inner.mode.blankLine(inner.state)}}
-function readToken(mode,stream,state,inner){for(var i=0;i<10;i++){if(inner){inner[0]=innerMode(mode,state).mode}
-var style=mode.token(stream,state)
-if(stream.pos>stream.start){return style}}
-throw new Error("Mode "+mode.name+" failed to advance stream.")}
-function takeToken(cm,pos,precise,asArray){var getObj=function(copy){return({start:stream.start,end:stream.pos,string:stream.current(),type:style||null,state:copy?copyState(doc.mode,state):state});}
-var doc=cm.doc,mode=doc.mode,style
-pos=clipPos(doc,pos)
-var line=getLine(doc,pos.line),state=getStateBefore(cm,pos.line,precise)
-var stream=new StringStream(line.text,cm.options.tabSize),tokens
-if(asArray){tokens=[]}
-while((asArray||stream.pos<pos.ch)&&!stream.eol()){stream.start=stream.pos
-style=readToken(mode,stream,state)
-if(asArray){tokens.push(getObj(true))}}
-return asArray?tokens:getObj()}
-function extractLineClasses(type,output){if(type){for(;;){var lineClass=type.match(/(?:^|\s+)line-(background-)?(\S+)/)
-if(!lineClass){break}
-type=type.slice(0,lineClass.index)+type.slice(lineClass.index+lineClass[0].length)
-var prop=lineClass[1]?"bgClass":"textClass"
-if(output[prop]==null)
-{output[prop]=lineClass[2]}
-else if(!(new RegExp("(?:^|\s)"+lineClass[2]+"(?:$|\s)")).test(output[prop]))
-{output[prop]+=" "+lineClass[2]}}}
-return type}
-function runMode(cm,text,mode,state,f,lineClasses,forceToEnd){var flattenSpans=mode.flattenSpans
-if(flattenSpans==null){flattenSpans=cm.options.flattenSpans}
-var curStart=0,curStyle=null
-var stream=new StringStream(text,cm.options.tabSize),style
-var inner=cm.options.addModeClass&&[null]
-if(text==""){extractLineClasses(callBlankLine(mode,state),lineClasses)}
-while(!stream.eol()){if(stream.pos>cm.options.maxHighlightLength){flattenSpans=false
-if(forceToEnd){processLine(cm,text,state,stream.pos)}
-stream.pos=text.length
-style=null}else{style=extractLineClasses(readToken(mode,stream,state,inner),lineClasses)}
-if(inner){var mName=inner[0].name
-if(mName){style="m-"+(style?mName+" "+style:mName)}}
-if(!flattenSpans||curStyle!=style){while(curStart<stream.start){curStart=Math.min(stream.start,curStart+5000)
-f(curStart,curStyle)}
-curStyle=style}
-stream.start=stream.pos}
-while(curStart<stream.pos){var pos=Math.min(stream.pos,curStart+5000)
-f(pos,curStyle)
-curStart=pos}}
-function findStartLine(cm,n,precise){var minindent,minline,doc=cm.doc
-var lim=precise?-1:n-(cm.doc.mode.innerMode?1000:100)
-for(var search=n;search>lim;--search){if(search<=doc.first){return doc.first}
-var line=getLine(doc,search-1)
-if(line.stateAfter&&(!precise||search<=doc.frontier)){return search}
-var indented=countColumn(line.text,null,cm.options.tabSize)
-if(minline==null||minindent>indented){minline=search-1
-minindent=indented}}
-return minline}
-var Line=function Line(text,markedSpans,estimateHeight){this.text=text
-attachMarkedSpans(this,markedSpans)
-this.height=estimateHeight?estimateHeight(this):1};Line.prototype.lineNo=function lineNo$1(){return lineNo(this)};eventMixin(Line)
-function updateLine(line,text,markedSpans,estimateHeight){line.text=text
-if(line.stateAfter){line.stateAfter=null}
-if(line.styles){line.styles=null}
-if(line.order!=null){line.order=null}
-detachMarkedSpans(line)
-attachMarkedSpans(line,markedSpans)
-var estHeight=estimateHeight?estimateHeight(line):1
-if(estHeight!=line.height){updateLineHeight(line,estHeight)}}
-function cleanUpLine(line){line.parent=null
-detachMarkedSpans(line)}
-var styleToClassCache={};var styleToClassCacheWithMode={};function interpretTokenStyle(style,options){if(!style||/^\s*$/.test(style)){return null}
-var cache=options.addModeClass?styleToClassCacheWithMode:styleToClassCache
-return cache[style]||(cache[style]=style.replace(/\S+/g,"cm-$&"))}
-function buildLineContent(cm,lineView){var content=eltP("span",null,null,webkit?"padding-right: .1px":null)
-var builder={pre:eltP("pre",[content],"CodeMirror-line"),content:content,col:0,pos:0,cm:cm,trailingSpace:false,splitSpaces:(ie||webkit)&&cm.getOption("lineWrapping")}
-lineView.measure={}
-for(var i=0;i<=(lineView.rest?lineView.rest.length:0);i++){var line=i?lineView.rest[i-1]:lineView.line,order=(void 0)
-builder.pos=0
-builder.addToken=buildToken
-if(hasBadBidiRects(cm.display.measure)&&(order=getOrder(line,cm.doc.direction)))
-{builder.addToken=buildTokenBadBidi(builder.addToken,order)}
-builder.map=[]
-var allowFrontierUpdate=lineView!=cm.display.externalMeasured&&lineNo(line)
-insertLineContent(line,builder,getLineStyles(cm,line,allowFrontierUpdate))
-if(line.styleClasses){if(line.styleClasses.bgClass)
-{builder.bgClass=joinClasses(line.styleClasses.bgClass,builder.bgClass||"")}
-if(line.styleClasses.textClass)
-{builder.textClass=joinClasses(line.styleClasses.textClass,builder.textClass||"")}}
-if(builder.map.length==0)
-{builder.map.push(0,0,builder.content.appendChild(zeroWidthElement(cm.display.measure)))}
-if(i==0){lineView.measure.map=builder.map
-lineView.measure.cache={}}else{;(lineView.measure.maps||(lineView.measure.maps=[])).push(builder.map);(lineView.measure.caches||(lineView.measure.caches=[])).push({})}}
-if(webkit){var last=builder.content.lastChild
-if(/\bcm-tab\b/.test(last.className)||(last.querySelector&&last.querySelector(".cm-tab")))
-{builder.content.className="cm-tab-wrap-hack"}}
-signal(cm,"renderLine",cm,lineView.line,builder.pre)
-if(builder.pre.className)
-{builder.textClass=joinClasses(builder.pre.className,builder.textClass||"")}
-return builder}
-function defaultSpecialCharPlaceholder(ch){var token=elt("span","\u2022","cm-invalidchar")
-token.title="\\u"+ch.charCodeAt(0).toString(16)
-token.setAttribute("aria-label",token.title)
-return token}
-function buildToken(builder,text,style,startStyle,endStyle,title,css){if(!text){return}
-var displayText=builder.splitSpaces?splitSpaces(text,builder.trailingSpace):text
-var special=builder.cm.state.specialChars,mustWrap=false
-var content
-if(!special.test(text)){builder.col+=text.length
-content=document.createTextNode(displayText)
-builder.map.push(builder.pos,builder.pos+text.length,content)
-if(ie&&ie_version<9){mustWrap=true}
-builder.pos+=text.length}else{content=document.createDocumentFragment()
-var pos=0
-while(true){special.lastIndex=pos
-var m=special.exec(text)
-var skipped=m?m.index-pos:text.length-pos
-if(skipped){var txt=document.createTextNode(displayText.slice(pos,pos+skipped))
-if(ie&&ie_version<9){content.appendChild(elt("span",[txt]))}
-else{content.appendChild(txt)}
-builder.map.push(builder.pos,builder.pos+skipped,txt)
-builder.col+=skipped
-builder.pos+=skipped}
-if(!m){break}
-pos+=skipped+1
-var txt$1=(void 0)
-if(m[0]=="\t"){var tabSize=builder.cm.options.tabSize,tabWidth=tabSize-builder.col%tabSize
-txt$1=content.appendChild(elt("span",spaceStr(tabWidth),"cm-tab"))
-txt$1.setAttribute("role","presentation")
-txt$1.setAttribute("cm-text","\t")
-builder.col+=tabWidth}else if(m[0]=="\r"||m[0]=="\n"){txt$1=content.appendChild(elt("span",m[0]=="\r"?"\u240d":"\u2424","cm-invalidchar"))
-txt$1.setAttribute("cm-text",m[0])
-builder.col+=1}else{txt$1=builder.cm.options.specialCharPlaceholder(m[0])
-txt$1.setAttribute("cm-text",m[0])
-if(ie&&ie_version<9){content.appendChild(elt("span",[txt$1]))}
-else{content.appendChild(txt$1)}
-builder.col+=1}
-builder.map.push(builder.pos,builder.pos+1,txt$1)
-builder.pos++}}
-builder.trailingSpace=displayText.charCodeAt(text.length-1)==32
-if(style||startStyle||endStyle||mustWrap||css){var fullStyle=style||""
-if(startStyle){fullStyle+=startStyle}
-if(endStyle){fullStyle+=endStyle}
-var token=elt("span",[content],fullStyle,css)
-if(title){token.title=title}
-return builder.content.appendChild(token)}
-builder.content.appendChild(content)}
-function splitSpaces(text,trailingBefore){if(text.length>1&&!/ /.test(text)){return text}
-var spaceBefore=trailingBefore,result=""
-for(var i=0;i<text.length;i++){var ch=text.charAt(i)
-if(ch==" "&&spaceBefore&&(i==text.length-1||text.charCodeAt(i+1)==32))
-{ch="\u00a0"}
-result+=ch
-spaceBefore=ch==" "}
-return result}
-function buildTokenBadBidi(inner,order){return function(builder,text,style,startStyle,endStyle,title,css){style=style?style+" cm-force-border":"cm-force-border"
-var start=builder.pos,end=start+text.length
-for(;;){var part=(void 0)
-for(var i=0;i<order.length;i++){part=order[i]
-if(part.to>start&&part.from<=start){break}}
-if(part.to>=end){return inner(builder,text,style,startStyle,endStyle,title,css)}
-inner(builder,text.slice(0,part.to-start),style,startStyle,null,title,css)
-startStyle=null
-text=text.slice(part.to-start)
-start=part.to}}}
-function buildCollapsedSpan(builder,size,marker,ignoreWidget){var widget=!ignoreWidget&&marker.widgetNode
-if(widget){builder.map.push(builder.pos,builder.pos+size,widget)}
-if(!ignoreWidget&&builder.cm.display.input.needsContentAttribute){if(!widget)
-{widget=builder.content.appendChild(document.createElement("span"))}
-widget.setAttribute("cm-marker",marker.id)}
-if(widget){builder.cm.display.input.setUneditable(widget)
-builder.content.appendChild(widget)}
-builder.pos+=size
-builder.trailingSpace=false}
-function insertLineContent(line,builder,styles){var spans=line.markedSpans,allText=line.text,at=0
-if(!spans){for(var i$1=1;i$1<styles.length;i$1+=2)
-{builder.addToken(builder,allText.slice(at,at=styles[i$1]),interpretTokenStyle(styles[i$1+1],builder.cm.options))}
-return}
-var len=allText.length,pos=0,i=1,text="",style,css
-var nextChange=0,spanStyle,spanEndStyle,spanStartStyle,title,collapsed
-for(;;){if(nextChange==pos){spanStyle=spanEndStyle=spanStartStyle=title=css=""
-collapsed=null;nextChange=Infinity
-var foundBookmarks=[],endStyles=(void 0)
-for(var j=0;j<spans.length;++j){var sp=spans[j],m=sp.marker
-if(m.type=="bookmark"&&sp.from==pos&&m.widgetNode){foundBookmarks.push(m)}else if(sp.from<=pos&&(sp.to==null||sp.to>pos||m.collapsed&&sp.to==pos&&sp.from==pos)){if(sp.to!=null&&sp.to!=pos&&nextChange>sp.to){nextChange=sp.to
-spanEndStyle=""}
-if(m.className){spanStyle+=" "+m.className}
-if(m.css){css=(css?css+";":"")+m.css}
-if(m.startStyle&&sp.from==pos){spanStartStyle+=" "+m.startStyle}
-if(m.endStyle&&sp.to==nextChange){(endStyles||(endStyles=[])).push(m.endStyle,sp.to)}
-if(m.title&&!title){title=m.title}
-if(m.collapsed&&(!collapsed||compareCollapsedMarkers(collapsed.marker,m)<0))
-{collapsed=sp}}else if(sp.from>pos&&nextChange>sp.from){nextChange=sp.from}}
-if(endStyles){for(var j$1=0;j$1<endStyles.length;j$1+=2)
-{if(endStyles[j$1+1]==nextChange){spanEndStyle+=" "+endStyles[j$1]}}}
-if(!collapsed||collapsed.from==pos){for(var j$2=0;j$2<foundBookmarks.length;++j$2)
-{buildCollapsedSpan(builder,0,foundBookmarks[j$2])}}
-if(collapsed&&(collapsed.from||0)==pos){buildCollapsedSpan(builder,(collapsed.to==null?len+1:collapsed.to)-pos,collapsed.marker,collapsed.from==null)
-if(collapsed.to==null){return}
-if(collapsed.to==pos){collapsed=false}}}
-if(pos>=len){break}
-var upto=Math.min(len,nextChange)
-while(true){if(text){var end=pos+text.length
-if(!collapsed){var tokenText=end>upto?text.slice(0,upto-pos):text
-builder.addToken(builder,tokenText,style?style+spanStyle:spanStyle,spanStartStyle,pos+tokenText.length==nextChange?spanEndStyle:"",title,css)}
-if(end>=upto){text=text.slice(upto-pos);pos=upto;break}
-pos=end
-spanStartStyle=""}
-text=allText.slice(at,at=styles[i++])
-style=interpretTokenStyle(styles[i++],builder.cm.options)}}}
-function LineView(doc,line,lineN){this.line=line
-this.rest=visualLineContinued(line)
-this.size=this.rest?lineNo(lst(this.rest))-lineN+1:1
-this.node=this.text=null
-this.hidden=lineIsHidden(doc,line)}
-function buildViewArray(cm,from,to){var array=[],nextPos
-for(var pos=from;pos<to;pos=nextPos){var view=new LineView(cm.doc,getLine(cm.doc,pos),pos)
-nextPos=pos+view.size
-array.push(view)}
-return array}
-var operationGroup=null
-function pushOperation(op){if(operationGroup){operationGroup.ops.push(op)}else{op.ownsGroup=operationGroup={ops:[op],delayedCallbacks:[]}}}
-function fireCallbacksForOps(group){var callbacks=group.delayedCallbacks,i=0
-do{for(;i<callbacks.length;i++)
-{callbacks[i].call(null)}
-for(var j=0;j<group.ops.length;j++){var op=group.ops[j]
-if(op.cursorActivityHandlers)
-{while(op.cursorActivityCalled<op.cursorActivityHandlers.length)
-{op.cursorActivityHandlers[op.cursorActivityCalled++].call(null,op.cm)}}}}while(i<callbacks.length)}
-function finishOperation(op,endCb){var group=op.ownsGroup
-if(!group){return}
-try{fireCallbacksForOps(group)}
-finally{operationGroup=null
-endCb(group)}}
-var orphanDelayedCallbacks=null
-function signalLater(emitter,type){var arr=getHandlers(emitter,type)
-if(!arr.length){return}
-var args=Array.prototype.slice.call(arguments,2),list
-if(operationGroup){list=operationGroup.delayedCallbacks}else if(orphanDelayedCallbacks){list=orphanDelayedCallbacks}else{list=orphanDelayedCallbacks=[]
-setTimeout(fireOrphanDelayed,0)}
-var loop=function(i){list.push(function(){return arr[i].apply(null,args);})};for(var i=0;i<arr.length;++i)
-loop(i);}
-function fireOrphanDelayed(){var delayed=orphanDelayedCallbacks
-orphanDelayedCallbacks=null
-for(var i=0;i<delayed.length;++i){delayed[i]()}}
-function updateLineForChanges(cm,lineView,lineN,dims){for(var j=0;j<lineView.changes.length;j++){var type=lineView.changes[j]
-if(type=="text"){updateLineText(cm,lineView)}
-else if(type=="gutter"){updateLineGutter(cm,lineView,lineN,dims)}
-else if(type=="class"){updateLineClasses(cm,lineView)}
-else if(type=="widget"){updateLineWidgets(cm,lineView,dims)}}
-lineView.changes=null}
-function ensureLineWrapped(lineView){if(lineView.node==lineView.text){lineView.node=elt("div",null,null,"position: relative")
-if(lineView.text.parentNode)
-{lineView.text.parentNode.replaceChild(lineView.node,lineView.text)}
-lineView.node.appendChild(lineView.text)
-if(ie&&ie_version<8){lineView.node.style.zIndex=2}}
-return lineView.node}
-function updateLineBackground(cm,lineView){var cls=lineView.bgClass?lineView.bgClass+" "+(lineView.line.bgClass||""):lineView.line.bgClass
-if(cls){cls+=" CodeMirror-linebackground"}
-if(lineView.background){if(cls){lineView.background.className=cls}
-else{lineView.background.parentNode.removeChild(lineView.background);lineView.background=null}}else if(cls){var wrap=ensureLineWrapped(lineView)
-lineView.background=wrap.insertBefore(elt("div",null,cls),wrap.firstChild)
-cm.display.input.setUneditable(lineView.background)}}
-function getLineContent(cm,lineView){var ext=cm.display.externalMeasured
-if(ext&&ext.line==lineView.line){cm.display.externalMeasured=null
-lineView.measure=ext.measure
-return ext.built}
-return buildLineContent(cm,lineView)}
-function updateLineText(cm,lineView){var cls=lineView.text.className
-var built=getLineContent(cm,lineView)
-if(lineView.text==lineView.node){lineView.node=built.pre}
-lineView.text.parentNode.replaceChild(built.pre,lineView.text)
-lineView.text=built.pre
-if(built.bgClass!=lineView.bgClass||built.textClass!=lineView.textClass){lineView.bgClass=built.bgClass
-lineView.textClass=built.textClass
-updateLineClasses(cm,lineView)}else if(cls){lineView.text.className=cls}}
-function updateLineClasses(cm,lineView){updateLineBackground(cm,lineView)
-if(lineView.line.wrapClass)
-{ensureLineWrapped(lineView).className=lineView.line.wrapClass}
-else if(lineView.node!=lineView.text)
-{lineView.node.className=""}
-var textClass=lineView.textClass?lineView.textClass+" "+(lineView.line.textClass||""):lineView.line.textClass
-lineView.text.className=textClass||""}
-function updateLineGutter(cm,lineView,lineN,dims){if(lineView.gutter){lineView.node.removeChild(lineView.gutter)
-lineView.gutter=null}
-if(lineView.gutterBackground){lineView.node.removeChild(lineView.gutterBackground)
-lineView.gutterBackground=null}
-if(lineView.line.gutterClass){var wrap=ensureLineWrapped(lineView)
-lineView.gutterBackground=elt("div",null,"CodeMirror-gutter-background "+lineView.line.gutterClass,("left: "+(cm.options.fixedGutter?dims.fixedPos:-dims.gutterTotalWidth)+"px; width: "+(dims.gutterTotalWidth)+"px"))
-cm.display.input.setUneditable(lineView.gutterBackground)
-wrap.insertBefore(lineView.gutterBackground,lineView.text)}
-var markers=lineView.line.gutterMarkers
-if(cm.options.lineNumbers||markers){var wrap$1=ensureLineWrapped(lineView)
-var gutterWrap=lineView.gutter=elt("div",null,"CodeMirror-gutter-wrapper",("left: "+(cm.options.fixedGutter?dims.fixedPos:-dims.gutterTotalWidth)+"px"))
-cm.display.input.setUneditable(gutterWrap)
-wrap$1.insertBefore(gutterWrap,lineView.text)
-if(lineView.line.gutterClass)
-{gutterWrap.className+=" "+lineView.line.gutterClass}
-if(cm.options.lineNumbers&&(!markers||!markers["CodeMirror-linenumbers"]))
-{lineView.lineNumber=gutterWrap.appendChild(elt("div",lineNumberFor(cm.options,lineN),"CodeMirror-linenumber CodeMirror-gutter-elt",("left: "+(dims.gutterLeft["CodeMirror-linenumbers"])+"px; width: "+(cm.display.lineNumInnerWidth)+"px")))}
-if(markers){for(var k=0;k<cm.options.gutters.length;++k){var id=cm.options.gutters[k],found=markers.hasOwnProperty(id)&&markers[id]
-if(found)
-{gutterWrap.appendChild(elt("div",[found],"CodeMirror-gutter-elt",("left: "+(dims.gutterLeft[id])+"px; width: "+(dims.gutterWidth[id])+"px")))}}}}}
-function updateLineWidgets(cm,lineView,dims){if(lineView.alignable){lineView.alignable=null}
-for(var node=lineView.node.firstChild,next=(void 0);node;node=next){next=node.nextSibling
-if(node.className=="CodeMirror-linewidget")
-{lineView.node.removeChild(node)}}
-insertLineWidgets(cm,lineView,dims)}
-function buildLineElement(cm,lineView,lineN,dims){var built=getLineContent(cm,lineView)
-lineView.text=lineView.node=built.pre
-if(built.bgClass){lineView.bgClass=built.bgClass}
-if(built.textClass){lineView.textClass=built.textClass}
-updateLineClasses(cm,lineView)
-updateLineGutter(cm,lineView,lineN,dims)
-insertLineWidgets(cm,lineView,dims)
-return lineView.node}
-function insertLineWidgets(cm,lineView,dims){insertLineWidgetsFor(cm,lineView.line,lineView,dims,true)
-if(lineView.rest){for(var i=0;i<lineView.rest.length;i++)
-{insertLineWidgetsFor(cm,lineView.rest[i],lineView,dims,false)}}}
-function insertLineWidgetsFor(cm,line,lineView,dims,allowAbove){if(!line.widgets){return}
-var wrap=ensureLineWrapped(lineView)
-for(var i=0,ws=line.widgets;i<ws.length;++i){var widget=ws[i],node=elt("div",[widget.node],"CodeMirror-linewidget")
-if(!widget.handleMouseEvents){node.setAttribute("cm-ignore-events","true")}
-positionLineWidget(widget,node,lineView,dims)
-cm.display.input.setUneditable(node)
-if(allowAbove&&widget.above)
-{wrap.insertBefore(node,lineView.gutter||lineView.text)}
-else
-{wrap.appendChild(node)}
-signalLater(widget,"redraw")}}
-function positionLineWidget(widget,node,lineView,dims){if(widget.noHScroll){;(lineView.alignable||(lineView.alignable=[])).push(node)
-var width=dims.wrapperWidth
-node.style.left=dims.fixedPos+"px"
-if(!widget.coverGutter){width-=dims.gutterTotalWidth
-node.style.paddingLeft=dims.gutterTotalWidth+"px"}
-node.style.width=width+"px"}
-if(widget.coverGutter){node.style.zIndex=5
-node.style.position="relative"
-if(!widget.noHScroll){node.style.marginLeft=-dims.gutterTotalWidth+"px"}}}
-function widgetHeight(widget){if(widget.height!=null){return widget.height}
-var cm=widget.doc.cm
-if(!cm){return 0}
-if(!contains(document.body,widget.node)){var parentStyle="position: relative;"
-if(widget.coverGutter)
-{parentStyle+="margin-left: -"+cm.display.gutters.offsetWidth+"px;"}
-if(widget.noHScroll)
-{parentStyle+="width: "+cm.display.wrapper.clientWidth+"px;"}
-removeChildrenAndAdd(cm.display.measure,elt("div",[widget.node],null,parentStyle))}
-return widget.height=widget.node.parentNode.offsetHeight}
-function eventInWidget(display,e){for(var n=e_target(e);n!=display.wrapper;n=n.parentNode){if(!n||(n.nodeType==1&&n.getAttribute("cm-ignore-events")=="true")||(n.parentNode==display.sizer&&n!=display.mover))
-{return true}}}
-function paddingTop(display){return display.lineSpace.offsetTop}
-function paddingVert(display){return display.mover.offsetHeight-display.lineSpace.offsetHeight}
-function paddingH(display){if(display.cachedPaddingH){return display.cachedPaddingH}
-var e=removeChildrenAndAdd(display.measure,elt("pre","x"))
-var style=window.getComputedStyle?window.getComputedStyle(e):e.currentStyle
-var data={left:parseInt(style.paddingLeft),right:parseInt(style.paddingRight)}
-if(!isNaN(data.left)&&!isNaN(data.right)){display.cachedPaddingH=data}
-return data}
-function scrollGap(cm){return scrollerGap-cm.display.nativeBarWidth}
-function displayWidth(cm){return cm.display.scroller.clientWidth-scrollGap(cm)-cm.display.barWidth}
-function displayHeight(cm){return cm.display.scroller.clientHeight-scrollGap(cm)-cm.display.barHeight}
-function ensureLineHeights(cm,lineView,rect){var wrapping=cm.options.lineWrapping
-var curWidth=wrapping&&displayWidth(cm)
-if(!lineView.measure.heights||wrapping&&lineView.measure.width!=curWidth){var heights=lineView.measure.heights=[]
-if(wrapping){lineView.measure.width=curWidth
-var rects=lineView.text.firstChild.getClientRects()
-for(var i=0;i<rects.length-1;i++){var cur=rects[i],next=rects[i+1]
-if(Math.abs(cur.bottom-next.bottom)>2)
-{heights.push((cur.bottom+next.top)/2-rect.top)}}}
-heights.push(rect.bottom-rect.top)}}
-function mapFromLineView(lineView,line,lineN){if(lineView.line==line)
-{return{map:lineView.measure.map,cache:lineView.measure.cache}}
-for(var i=0;i<lineView.rest.length;i++)
-{if(lineView.rest[i]==line)
-{return{map:lineView.measure.maps[i],cache:lineView.measure.caches[i]}}}
-for(var i$1=0;i$1<lineView.rest.length;i$1++)
-{if(lineNo(lineView.rest[i$1])>lineN)
-{return{map:lineView.measure.maps[i$1],cache:lineView.measure.caches[i$1],before:true}}}}
-function updateExternalMeasurement(cm,line){line=visualLine(line)
-var lineN=lineNo(line)
-var view=cm.display.externalMeasured=new LineView(cm.doc,line,lineN)
-view.lineN=lineN
-var built=view.built=buildLineContent(cm,view)
-view.text=built.pre
-removeChildrenAndAdd(cm.display.lineMeasure,built.pre)
-return view}
-function measureChar(cm,line,ch,bias){return measureCharPrepared(cm,prepareMeasureForLine(cm,line),ch,bias)}
-function findViewForLine(cm,lineN){if(lineN>=cm.display.viewFrom&&lineN<cm.display.viewTo)
-{return cm.display.view[findViewIndex(cm,lineN)]}
-var ext=cm.display.externalMeasured
-if(ext&&lineN>=ext.lineN&&lineN<ext.lineN+ext.size)
-{return ext}}
-function prepareMeasureForLine(cm,line){var lineN=lineNo(line)
-var view=findViewForLine(cm,lineN)
-if(view&&!view.text){view=null}else if(view&&view.changes){updateLineForChanges(cm,view,lineN,getDimensions(cm))
-cm.curOp.forceUpdate=true}
-if(!view)
-{view=updateExternalMeasurement(cm,line)}
-var info=mapFromLineView(view,line,lineN)
-return{line:line,view:view,rect:null,map:info.map,cache:info.cache,before:info.before,hasHeights:false}}
-function measureCharPrepared(cm,prepared,ch,bias,varHeight){if(prepared.before){ch=-1}
-var key=ch+(bias||""),found
-if(prepared.cache.hasOwnProperty(key)){found=prepared.cache[key]}else{if(!prepared.rect)
-{prepared.rect=prepared.view.text.getBoundingClientRect()}
-if(!prepared.hasHeights){ensureLineHeights(cm,prepared.view,prepared.rect)
-prepared.hasHeights=true}
-found=measureCharInner(cm,prepared,ch,bias)
-if(!found.bogus){prepared.cache[key]=found}}
-return{left:found.left,right:found.right,top:varHeight?found.rtop:found.top,bottom:varHeight?found.rbottom:found.bottom}}
-var nullRect={left:0,right:0,top:0,bottom:0}
-function nodeAndOffsetInLineMap(map,ch,bias){var node,start,end,collapse,mStart,mEnd
-for(var i=0;i<map.length;i+=3){mStart=map[i]
-mEnd=map[i+1]
-if(ch<mStart){start=0;end=1
-collapse="left"}else if(ch<mEnd){start=ch-mStart
-end=start+1}else if(i==map.length-3||ch==mEnd&&map[i+3]>ch){end=mEnd-mStart
-start=end-1
-if(ch>=mEnd){collapse="right"}}
-if(start!=null){node=map[i+2]
-if(mStart==mEnd&&bias==(node.insertLeft?"left":"right"))
-{collapse=bias}
-if(bias=="left"&&start==0)
-{while(i&&map[i-2]==map[i-3]&&map[i-1].insertLeft){node=map[(i-=3)+2]
-collapse="left"}}
-if(bias=="right"&&start==mEnd-mStart)
-{while(i<map.length-3&&map[i+3]==map[i+4]&&!map[i+5].insertLeft){node=map[(i+=3)+2]
-collapse="right"}}
-break}}
-return{node:node,start:start,end:end,collapse:collapse,coverStart:mStart,coverEnd:mEnd}}
-function getUsefulRect(rects,bias){var rect=nullRect
-if(bias=="left"){for(var i=0;i<rects.length;i++){if((rect=rects[i]).left!=rect.right){break}}}else{for(var i$1=rects.length-1;i$1>=0;i$1--){if((rect=rects[i$1]).left!=rect.right){break}}}
-return rect}
-function measureCharInner(cm,prepared,ch,bias){var place=nodeAndOffsetInLineMap(prepared.map,ch,bias)
-var node=place.node,start=place.start,end=place.end,collapse=place.collapse
-var rect
-if(node.nodeType==3){for(var i$1=0;i$1<4;i$1++){while(start&&isExtendingChar(prepared.line.text.charAt(place.coverStart+start))){--start}
-while(place.coverStart+end<place.coverEnd&&isExtendingChar(prepared.line.text.charAt(place.coverStart+end))){++end}
-if(ie&&ie_version<9&&start==0&&end==place.coverEnd-place.coverStart)
-{rect=node.parentNode.getBoundingClientRect()}
-else
-{rect=getUsefulRect(range(node,start,end).getClientRects(),bias)}
-if(rect.left||rect.right||start==0){break}
-end=start
-start=start-1
-collapse="right"}
-if(ie&&ie_version<11){rect=maybeUpdateRectForZooming(cm.display.measure,rect)}}else{if(start>0){collapse=bias="right"}
-var rects
-if(cm.options.lineWrapping&&(rects=node.getClientRects()).length>1)
-{rect=rects[bias=="right"?rects.length-1:0]}
-else
-{rect=node.getBoundingClientRect()}}
-if(ie&&ie_version<9&&!start&&(!rect||!rect.left&&!rect.right)){var rSpan=node.parentNode.getClientRects()[0]
-if(rSpan)
-{rect={left:rSpan.left,right:rSpan.left+charWidth(cm.display),top:rSpan.top,bottom:rSpan.bottom}}
-else
-{rect=nullRect}}
-var rtop=rect.top-prepared.rect.top,rbot=rect.bottom-prepared.rect.top
-var mid=(rtop+rbot)/2
-var heights=prepared.view.measure.heights
-var i=0
-for(;i<heights.length-1;i++)
-{if(mid<heights[i]){break}}
-var top=i?heights[i-1]:0,bot=heights[i]
-var result={left:(collapse=="right"?rect.right:rect.left)-prepared.rect.left,right:(collapse=="left"?rect.left:rect.right)-prepared.rect.left,top:top,bottom:bot}
-if(!rect.left&&!rect.right){result.bogus=true}
-if(!cm.options.singleCursorHeightPerLine){result.rtop=rtop;result.rbottom=rbot}
-return result}
-function maybeUpdateRectForZooming(measure,rect){if(!window.screen||screen.logicalXDPI==null||screen.logicalXDPI==screen.deviceXDPI||!hasBadZoomedRects(measure))
-{return rect}
-var scaleX=screen.logicalXDPI/screen.deviceXDPI
-var scaleY=screen.logicalYDPI/screen.deviceYDPI
-return{left:rect.left*scaleX,right:rect.right*scaleX,top:rect.top*scaleY,bottom:rect.bottom*scaleY}}
-function clearLineMeasurementCacheFor(lineView){if(lineView.measure){lineView.measure.cache={}
-lineView.measure.heights=null
-if(lineView.rest){for(var i=0;i<lineView.rest.length;i++)
-{lineView.measure.caches[i]={}}}}}
-function clearLineMeasurementCache(cm){cm.display.externalMeasure=null
-removeChildren(cm.display.lineMeasure)
-for(var i=0;i<cm.display.view.length;i++)
-{clearLineMeasurementCacheFor(cm.display.view[i])}}
-function clearCaches(cm){clearLineMeasurementCache(cm)
-cm.display.cachedCharWidth=cm.display.cachedTextHeight=cm.display.cachedPaddingH=null
-if(!cm.options.lineWrapping){cm.display.maxLineChanged=true}
-cm.display.lineNumChars=null}
-function pageScrollX(){return window.pageXOffset||(document.documentElement||document.body).scrollLeft}
-function pageScrollY(){return window.pageYOffset||(document.documentElement||document.body).scrollTop}
-function intoCoordSystem(cm,lineObj,rect,context,includeWidgets){if(!includeWidgets&&lineObj.widgets){for(var i=0;i<lineObj.widgets.length;++i){if(lineObj.widgets[i].above){var size=widgetHeight(lineObj.widgets[i])
-rect.top+=size;rect.bottom+=size}}}
-if(context=="line"){return rect}
-if(!context){context="local"}
-var yOff=heightAtLine(lineObj)
-if(context=="local"){yOff+=paddingTop(cm.display)}
-else{yOff-=cm.display.viewOffset}
-if(context=="page"||context=="window"){var lOff=cm.display.lineSpace.getBoundingClientRect()
-yOff+=lOff.top+(context=="window"?0:pageScrollY())
-var xOff=lOff.left+(context=="window"?0:pageScrollX())
-rect.left+=xOff;rect.right+=xOff}
-rect.top+=yOff;rect.bottom+=yOff
-return rect}
-function fromCoordSystem(cm,coords,context){if(context=="div"){return coords}
-var left=coords.left,top=coords.top
-if(context=="page"){left-=pageScrollX()
-top-=pageScrollY()}else if(context=="local"||!context){var localBox=cm.display.sizer.getBoundingClientRect()
-left+=localBox.left
-top+=localBox.top}
-var lineSpaceBox=cm.display.lineSpace.getBoundingClientRect()
-return{left:left-lineSpaceBox.left,top:top-lineSpaceBox.top}}
-function charCoords(cm,pos,context,lineObj,bias){if(!lineObj){lineObj=getLine(cm.doc,pos.line)}
-return intoCoordSystem(cm,lineObj,measureChar(cm,lineObj,pos.ch,bias),context)}
-function cursorCoords(cm,pos,context,lineObj,preparedMeasure,varHeight){lineObj=lineObj||getLine(cm.doc,pos.line)
-if(!preparedMeasure){preparedMeasure=prepareMeasureForLine(cm,lineObj)}
-function get(ch,right){var m=measureCharPrepared(cm,preparedMeasure,ch,right?"right":"left",varHeight)
-if(right){m.left=m.right;}else{m.right=m.left}
-return intoCoordSystem(cm,lineObj,m,context)}
-var order=getOrder(lineObj,cm.doc.direction),ch=pos.ch,sticky=pos.sticky
-if(ch>=lineObj.text.length){ch=lineObj.text.length
-sticky="before"}else if(ch<=0){ch=0
-sticky="after"}
-if(!order){return get(sticky=="before"?ch-1:ch,sticky=="before")}
-function getBidi(ch,partPos,invert){var part=order[partPos],right=(part.level%2)!=0
-return get(invert?ch-1:ch,right!=invert)}
-var partPos=getBidiPartAt(order,ch,sticky)
-var other=bidiOther
-var val=getBidi(ch,partPos,sticky=="before")
-if(other!=null){val.other=getBidi(ch,other,sticky!="before")}
-return val}
-function estimateCoords(cm,pos){var left=0
-pos=clipPos(cm.doc,pos)
-if(!cm.options.lineWrapping){left=charWidth(cm.display)*pos.ch}
-var lineObj=getLine(cm.doc,pos.line)
-var top=heightAtLine(lineObj)+paddingTop(cm.display)
-return{left:left,right:left,top:top,bottom:top+lineObj.height}}
-function PosWithInfo(line,ch,sticky,outside,xRel){var pos=Pos(line,ch,sticky)
-pos.xRel=xRel
-if(outside){pos.outside=true}
-return pos}
-function coordsChar(cm,x,y){var doc=cm.doc
-y+=cm.display.viewOffset
-if(y<0){return PosWithInfo(doc.first,0,null,true,-1)}
-var lineN=lineAtHeight(doc,y),last=doc.first+doc.size-1
-if(lineN>last)
-{return PosWithInfo(doc.first+doc.size-1,getLine(doc,last).text.length,null,true,1)}
-if(x<0){x=0}
-var lineObj=getLine(doc,lineN)
-for(;;){var found=coordsCharInner(cm,lineObj,lineN,x,y)
-var merged=collapsedSpanAtEnd(lineObj)
-var mergedPos=merged&&merged.find(0,true)
-if(merged&&(found.ch>mergedPos.from.ch||found.ch==mergedPos.from.ch&&found.xRel>0))
-{lineN=lineNo(lineObj=mergedPos.to.line)}
-else
-{return found}}}
-function wrappedLineExtent(cm,lineObj,preparedMeasure,y){var measure=function(ch){return intoCoordSystem(cm,lineObj,measureCharPrepared(cm,preparedMeasure,ch),"line");}
-var end=lineObj.text.length
-var begin=findFirst(function(ch){return measure(ch-1).bottom<=y;},end,0)
-end=findFirst(function(ch){return measure(ch).top>y;},begin,end)
-return{begin:begin,end:end}}
-function wrappedLineExtentChar(cm,lineObj,preparedMeasure,target){var targetTop=intoCoordSystem(cm,lineObj,measureCharPrepared(cm,preparedMeasure,target),"line").top
-return wrappedLineExtent(cm,lineObj,preparedMeasure,targetTop)}
-function coordsCharInner(cm,lineObj,lineNo,x,y){y-=heightAtLine(lineObj)
-var begin=0,end=lineObj.text.length
-var preparedMeasure=prepareMeasureForLine(cm,lineObj)
-var pos
-var order=getOrder(lineObj,cm.doc.direction)
-if(order){if(cm.options.lineWrapping){;var assign;((assign=wrappedLineExtent(cm,lineObj,preparedMeasure,y),begin=assign.begin,end=assign.end))}
-pos=new Pos(lineNo,begin)
-var beginLeft=cursorCoords(cm,pos,"line",lineObj,preparedMeasure).left
-var dir=beginLeft<x?1:-1
-var prevDiff,diff=beginLeft-x,prevPos
-do{prevDiff=diff
-prevPos=pos
-pos=moveVisually(cm,lineObj,pos,dir)
-if(pos==null||pos.ch<begin||end<=(pos.sticky=="before"?pos.ch-1:pos.ch)){pos=prevPos
-break}
-diff=cursorCoords(cm,pos,"line",lineObj,preparedMeasure).left-x}while((dir<0)!=(diff<0)&&(Math.abs(diff)<=Math.abs(prevDiff)))
-if(Math.abs(diff)>Math.abs(prevDiff)){if((diff<0)==(prevDiff<0)){throw new Error("Broke out of infinite loop in coordsCharInner")}
-pos=prevPos}}else{var ch=findFirst(function(ch){var box=intoCoordSystem(cm,lineObj,measureCharPrepared(cm,preparedMeasure,ch),"line")
-if(box.top>y){end=Math.min(ch,end)
-return true}
-else if(box.bottom<=y){return false}
-else if(box.left>x){return true}
-else if(box.right<x){return false}
-else{return(x-box.left<box.right-x)}},begin,end)
-ch=skipExtendingChars(lineObj.text,ch,1)
-pos=new Pos(lineNo,ch,ch==end?"before":"after")}
-var coords=cursorCoords(cm,pos,"line",lineObj,preparedMeasure)
-if(y<coords.top||coords.bottom<y){pos.outside=true}
-pos.xRel=x<coords.left?-1:(x>coords.right?1:0)
-return pos}
-var measureText
-function textHeight(display){if(display.cachedTextHeight!=null){return display.cachedTextHeight}
-if(measureText==null){measureText=elt("pre")
-for(var i=0;i<49;++i){measureText.appendChild(document.createTextNode("x"))
-measureText.appendChild(elt("br"))}
-measureText.appendChild(document.createTextNode("x"))}
-removeChildrenAndAdd(display.measure,measureText)
-var height=measureText.offsetHeight/50
-if(height>3){display.cachedTextHeight=height}
-removeChildren(display.measure)
-return height||1}
-function charWidth(display){if(display.cachedCharWidth!=null){return display.cachedCharWidth}
-var anchor=elt("span","xxxxxxxxxx")
-var pre=elt("pre",[anchor])
-removeChildrenAndAdd(display.measure,pre)
-var rect=anchor.getBoundingClientRect(),width=(rect.right-rect.left)/10
-if(width>2){display.cachedCharWidth=width}
-return width||10}
-function getDimensions(cm){var d=cm.display,left={},width={}
-var gutterLeft=d.gutters.clientLeft
-for(var n=d.gutters.firstChild,i=0;n;n=n.nextSibling,++i){left[cm.options.gutters[i]]=n.offsetLeft+n.clientLeft+gutterLeft
-width[cm.options.gutters[i]]=n.clientWidth}
-return{fixedPos:compensateForHScroll(d),gutterTotalWidth:d.gutters.offsetWidth,gutterLeft:left,gutterWidth:width,wrapperWidth:d.wrapper.clientWidth}}
-function compensateForHScroll(display){return display.scroller.getBoundingClientRect().left-display.sizer.getBoundingClientRect().left}
-function estimateHeight(cm){var th=textHeight(cm.display),wrapping=cm.options.lineWrapping
-var perLine=wrapping&&Math.max(5,cm.display.scroller.clientWidth/charWidth(cm.display)-3)
-return function(line){if(lineIsHidden(cm.doc,line)){return 0}
-var widgetsHeight=0
-if(line.widgets){for(var i=0;i<line.widgets.length;i++){if(line.widgets[i].height){widgetsHeight+=line.widgets[i].height}}}
-if(wrapping)
-{return widgetsHeight+(Math.ceil(line.text.length/perLine)||1)*th}
-else
-{return widgetsHeight+th}}}
-function estimateLineHeights(cm){var doc=cm.doc,est=estimateHeight(cm)
-doc.iter(function(line){var estHeight=est(line)
-if(estHeight!=line.height){updateLineHeight(line,estHeight)}})}
-function posFromMouse(cm,e,liberal,forRect){var display=cm.display
-if(!liberal&&e_target(e).getAttribute("cm-not-content")=="true"){return null}
-var x,y,space=display.lineSpace.getBoundingClientRect()
-try{x=e.clientX-space.left;y=e.clientY-space.top}
-catch(e){return null}
-var coords=coordsChar(cm,x,y),line
-if(forRect&&coords.xRel==1&&(line=getLine(cm.doc,coords.line).text).length==coords.ch){var colDiff=countColumn(line,line.length,cm.options.tabSize)-line.length
-coords=Pos(coords.line,Math.max(0,Math.round((x-paddingH(cm.display).left)/charWidth(cm.display))-colDiff))}
-return coords}
-function findViewIndex(cm,n){if(n>=cm.display.viewTo){return null}
-n-=cm.display.viewFrom
-if(n<0){return null}
-var view=cm.display.view
-for(var i=0;i<view.length;i++){n-=view[i].size
-if(n<0){return i}}}
-function updateSelection(cm){cm.display.input.showSelection(cm.display.input.prepareSelection())}
-function prepareSelection(cm,primary){var doc=cm.doc,result={}
-var curFragment=result.cursors=document.createDocumentFragment()
-var selFragment=result.selection=document.createDocumentFragment()
-for(var i=0;i<doc.sel.ranges.length;i++){if(primary===false&&i==doc.sel.primIndex){continue}
-var range=doc.sel.ranges[i]
-if(range.from().line>=cm.display.viewTo||range.to().line<cm.display.viewFrom){continue}
-var collapsed=range.empty()
-if(collapsed||cm.options.showCursorWhenSelecting)
-{drawSelectionCursor(cm,range.head,curFragment)}
-if(!collapsed)
-{drawSelectionRange(cm,range,selFragment)}}
-return result}
-function drawSelectionCursor(cm,head,output){var pos=cursorCoords(cm,head,"div",null,null,!cm.options.singleCursorHeightPerLine)
-var cursor=output.appendChild(elt("div","\u00a0","CodeMirror-cursor"))
-cursor.style.left=pos.left+"px"
-cursor.style.top=pos.top+"px"
-cursor.style.height=Math.max(0,pos.bottom-pos.top)*cm.options.cursorHeight+"px"
-if(pos.other){var otherCursor=output.appendChild(elt("div","\u00a0","CodeMirror-cursor CodeMirror-secondarycursor"))
-otherCursor.style.display=""
-otherCursor.style.left=pos.other.left+"px"
-otherCursor.style.top=pos.other.top+"px"
-otherCursor.style.height=(pos.other.bottom-pos.other.top)*.85+"px"}}
-function drawSelectionRange(cm,range,output){var display=cm.display,doc=cm.doc
-var fragment=document.createDocumentFragment()
-var padding=paddingH(cm.display),leftSide=padding.left
-var rightSide=Math.max(display.sizerWidth,displayWidth(cm)-display.sizer.offsetLeft)-padding.right
-function add(left,top,width,bottom){if(top<0){top=0}
-top=Math.round(top)
-bottom=Math.round(bottom)
-fragment.appendChild(elt("div",null,"CodeMirror-selected",("position: absolute; left: "+left+"px;\n top: "+top+"px; width: "+(width==null?rightSide-left:width)+"px;\n height: "+(bottom-top)+"px")))}
-function drawForLine(line,fromArg,toArg){var lineObj=getLine(doc,line)
-var lineLen=lineObj.text.length
-var start,end
-function coords(ch,bias){return charCoords(cm,Pos(line,ch),"div",lineObj,bias)}
-iterateBidiSections(getOrder(lineObj,doc.direction),fromArg||0,toArg==null?lineLen:toArg,function(from,to,dir){var leftPos=coords(from,"left"),rightPos,left,right
-if(from==to){rightPos=leftPos
-left=right=leftPos.left}else{rightPos=coords(to-1,"right")
-if(dir=="rtl"){var tmp=leftPos;leftPos=rightPos;rightPos=tmp}
-left=leftPos.left
-right=rightPos.right}
-if(fromArg==null&&from==0){left=leftSide}
-if(rightPos.top-leftPos.top>3){add(left,leftPos.top,null,leftPos.bottom)
-left=leftSide
-if(leftPos.bottom<rightPos.top){add(left,leftPos.bottom,null,rightPos.top)}}
-if(toArg==null&&to==lineLen){right=rightSide}
-if(!start||leftPos.top<start.top||leftPos.top==start.top&&leftPos.left<start.left)
-{start=leftPos}
-if(!end||rightPos.bottom>end.bottom||rightPos.bottom==end.bottom&&rightPos.right>end.right)
-{end=rightPos}
-if(left<leftSide+1){left=leftSide}
-add(left,rightPos.top,right-left,rightPos.bottom)})
-return{start:start,end:end}}
-var sFrom=range.from(),sTo=range.to()
-if(sFrom.line==sTo.line){drawForLine(sFrom.line,sFrom.ch,sTo.ch)}else{var fromLine=getLine(doc,sFrom.line),toLine=getLine(doc,sTo.line)
-var singleVLine=visualLine(fromLine)==visualLine(toLine)
-var leftEnd=drawForLine(sFrom.line,sFrom.ch,singleVLine?fromLine.text.length+1:null).end
-var rightStart=drawForLine(sTo.line,singleVLine?0:null,sTo.ch).start
-if(singleVLine){if(leftEnd.top<rightStart.top-2){add(leftEnd.right,leftEnd.top,null,leftEnd.bottom)
-add(leftSide,rightStart.top,rightStart.left,rightStart.bottom)}else{add(leftEnd.right,leftEnd.top,rightStart.left-leftEnd.right,leftEnd.bottom)}}
-if(leftEnd.bottom<rightStart.top)
-{add(leftSide,leftEnd.bottom,null,rightStart.top)}}
-output.appendChild(fragment)}
-function restartBlink(cm){if(!cm.state.focused){return}
-var display=cm.display
-clearInterval(display.blinker)
-var on=true
-display.cursorDiv.style.visibility=""
-if(cm.options.cursorBlinkRate>0)
-{display.blinker=setInterval(function(){return display.cursorDiv.style.visibility=(on=!on)?"":"hidden";},cm.options.cursorBlinkRate)}
-else if(cm.options.cursorBlinkRate<0)
-{display.cursorDiv.style.visibility="hidden"}}
-function ensureFocus(cm){if(!cm.state.focused){cm.display.input.focus();onFocus(cm)}}
-function delayBlurEvent(cm){cm.state.delayingBlurEvent=true
-setTimeout(function(){if(cm.state.delayingBlurEvent){cm.state.delayingBlurEvent=false
-onBlur(cm)}},100)}
-function onFocus(cm,e){if(cm.state.delayingBlurEvent){cm.state.delayingBlurEvent=false}
-if(cm.options.readOnly=="nocursor"){return}
-if(!cm.state.focused){signal(cm,"focus",cm,e)
-cm.state.focused=true
-addClass(cm.display.wrapper,"CodeMirror-focused")
-if(!cm.curOp&&cm.display.selForContextMenu!=cm.doc.sel){cm.display.input.reset()
-if(webkit){setTimeout(function(){return cm.display.input.reset(true);},20)}}
-cm.display.input.receivedFocus()}
-restartBlink(cm)}
-function onBlur(cm,e){if(cm.state.delayingBlurEvent){return}
-if(cm.state.focused){signal(cm,"blur",cm,e)
-cm.state.focused=false
-rmClass(cm.display.wrapper,"CodeMirror-focused")}
-clearInterval(cm.display.blinker)
-setTimeout(function(){if(!cm.state.focused){cm.display.shift=false}},150)}
-function alignHorizontally(cm){var display=cm.display,view=display.view
-if(!display.alignWidgets&&(!display.gutters.firstChild||!cm.options.fixedGutter)){return}
-var comp=compensateForHScroll(display)-display.scroller.scrollLeft+cm.doc.scrollLeft
-var gutterW=display.gutters.offsetWidth,left=comp+"px"
-for(var i=0;i<view.length;i++){if(!view[i].hidden){if(cm.options.fixedGutter){if(view[i].gutter)
-{view[i].gutter.style.left=left}
-if(view[i].gutterBackground)
-{view[i].gutterBackground.style.left=left}}
-var align=view[i].alignable
-if(align){for(var j=0;j<align.length;j++)
-{align[j].style.left=left}}}}
-if(cm.options.fixedGutter)
-{display.gutters.style.left=(comp+gutterW)+"px"}}
-function maybeUpdateLineNumberWidth(cm){if(!cm.options.lineNumbers){return false}
-var doc=cm.doc,last=lineNumberFor(cm.options,doc.first+doc.size-1),display=cm.display
-if(last.length!=display.lineNumChars){var test=display.measure.appendChild(elt("div",[elt("div",last)],"CodeMirror-linenumber CodeMirror-gutter-elt"))
-var innerW=test.firstChild.offsetWidth,padding=test.offsetWidth-innerW
-display.lineGutter.style.width=""
-display.lineNumInnerWidth=Math.max(innerW,display.lineGutter.offsetWidth-padding)+1
-display.lineNumWidth=display.lineNumInnerWidth+padding
-display.lineNumChars=display.lineNumInnerWidth?last.length:-1
-display.lineGutter.style.width=display.lineNumWidth+"px"
-updateGutterSpace(cm)
-return true}
-return false}
-function updateHeightsInViewport(cm){var display=cm.display
-var prevBottom=display.lineDiv.offsetTop
-for(var i=0;i<display.view.length;i++){var cur=display.view[i],height=(void 0)
-if(cur.hidden){continue}
-if(ie&&ie_version<8){var bot=cur.node.offsetTop+cur.node.offsetHeight
-height=bot-prevBottom
-prevBottom=bot}else{var box=cur.node.getBoundingClientRect()
-height=box.bottom-box.top}
-var diff=cur.line.height-height
-if(height<2){height=textHeight(display)}
-if(diff>.001||diff<-.001){updateLineHeight(cur.line,height)
-updateWidgetHeight(cur.line)
-if(cur.rest){for(var j=0;j<cur.rest.length;j++)
-{updateWidgetHeight(cur.rest[j])}}}}}
-function updateWidgetHeight(line){if(line.widgets){for(var i=0;i<line.widgets.length;++i)
-{line.widgets[i].height=line.widgets[i].node.parentNode.offsetHeight}}}
-function visibleLines(display,doc,viewport){var top=viewport&&viewport.top!=null?Math.max(0,viewport.top):display.scroller.scrollTop
-top=Math.floor(top-paddingTop(display))
-var bottom=viewport&&viewport.bottom!=null?viewport.bottom:top+display.wrapper.clientHeight
-var from=lineAtHeight(doc,top),to=lineAtHeight(doc,bottom)
-if(viewport&&viewport.ensure){var ensureFrom=viewport.ensure.from.line,ensureTo=viewport.ensure.to.line
-if(ensureFrom<from){from=ensureFrom
-to=lineAtHeight(doc,heightAtLine(getLine(doc,ensureFrom))+display.wrapper.clientHeight)}else if(Math.min(ensureTo,doc.lastLine())>=to){from=lineAtHeight(doc,heightAtLine(getLine(doc,ensureTo))-display.wrapper.clientHeight)
-to=ensureTo}}
-return{from:from,to:Math.max(to,from+1)}}
-function setScrollTop(cm,val){if(Math.abs(cm.doc.scrollTop-val)<2){return}
-cm.doc.scrollTop=val
-if(!gecko){updateDisplaySimple(cm,{top:val})}
-if(cm.display.scroller.scrollTop!=val){cm.display.scroller.scrollTop=val}
-cm.display.scrollbars.setScrollTop(val)
-if(gecko){updateDisplaySimple(cm)}
-startWorker(cm,100)}
-function setScrollLeft(cm,val,isScroller){if(isScroller?val==cm.doc.scrollLeft:Math.abs(cm.doc.scrollLeft-val)<2){return}
-val=Math.min(val,cm.display.scroller.scrollWidth-cm.display.scroller.clientWidth)
-cm.doc.scrollLeft=val
-alignHorizontally(cm)
-if(cm.display.scroller.scrollLeft!=val){cm.display.scroller.scrollLeft=val}
-cm.display.scrollbars.setScrollLeft(val)}
-var wheelSamples=0;var wheelPixelsPerUnit=null;if(ie){wheelPixelsPerUnit=-.53}
-else if(gecko){wheelPixelsPerUnit=15}
-else if(chrome){wheelPixelsPerUnit=-.7}
-else if(safari){wheelPixelsPerUnit=-1/3}
-function wheelEventDelta(e){var dx=e.wheelDeltaX,dy=e.wheelDeltaY
-if(dx==null&&e.detail&&e.axis==e.HORIZONTAL_AXIS){dx=e.detail}
-if(dy==null&&e.detail&&e.axis==e.VERTICAL_AXIS){dy=e.detail}
-else if(dy==null){dy=e.wheelDelta}
-return{x:dx,y:dy}}
-function wheelEventPixels(e){var delta=wheelEventDelta(e)
-delta.x*=wheelPixelsPerUnit
-delta.y*=wheelPixelsPerUnit
-return delta}
-function onScrollWheel(cm,e){var delta=wheelEventDelta(e),dx=delta.x,dy=delta.y
-var display=cm.display,scroll=display.scroller
-var canScrollX=scroll.scrollWidth>scroll.clientWidth
-var canScrollY=scroll.scrollHeight>scroll.clientHeight
-if(!(dx&&canScrollX||dy&&canScrollY)){return}
-if(dy&&mac&&webkit){outer:for(var cur=e.target,view=display.view;cur!=scroll;cur=cur.parentNode){for(var i=0;i<view.length;i++){if(view[i].node==cur){cm.display.currentWheelTarget=cur
-break outer}}}}
-if(dx&&!gecko&&!presto&&wheelPixelsPerUnit!=null){if(dy&&canScrollY)
-{setScrollTop(cm,Math.max(0,Math.min(scroll.scrollTop+dy*wheelPixelsPerUnit,scroll.scrollHeight-scroll.clientHeight)))}
-setScrollLeft(cm,Math.max(0,Math.min(scroll.scrollLeft+dx*wheelPixelsPerUnit,scroll.scrollWidth-scroll.clientWidth)))
-if(!dy||(dy&&canScrollY))
-{e_preventDefault(e)}
-display.wheelStartX=null
-return}
-if(dy&&wheelPixelsPerUnit!=null){var pixels=dy*wheelPixelsPerUnit
-var top=cm.doc.scrollTop,bot=top+display.wrapper.clientHeight
-if(pixels<0){top=Math.max(0,top+pixels-50)}
-else{bot=Math.min(cm.doc.height,bot+pixels+50)}
-updateDisplaySimple(cm,{top:top,bottom:bot})}
-if(wheelSamples<20){if(display.wheelStartX==null){display.wheelStartX=scroll.scrollLeft;display.wheelStartY=scroll.scrollTop
-display.wheelDX=dx;display.wheelDY=dy
-setTimeout(function(){if(display.wheelStartX==null){return}
-var movedX=scroll.scrollLeft-display.wheelStartX
-var movedY=scroll.scrollTop-display.wheelStartY
-var sample=(movedY&&display.wheelDY&&movedY/display.wheelDY)||(movedX&&display.wheelDX&&movedX/display.wheelDX)
-display.wheelStartX=display.wheelStartY=null
-if(!sample){return}
-wheelPixelsPerUnit=(wheelPixelsPerUnit*wheelSamples+sample)/(wheelSamples+1)
-++wheelSamples},200)}else{display.wheelDX+=dx;display.wheelDY+=dy}}}
-function measureForScrollbars(cm){var d=cm.display,gutterW=d.gutters.offsetWidth
-var docH=Math.round(cm.doc.height+paddingVert(cm.display))
-return{clientHeight:d.scroller.clientHeight,viewHeight:d.wrapper.clientHeight,scrollWidth:d.scroller.scrollWidth,clientWidth:d.scroller.clientWidth,viewWidth:d.wrapper.clientWidth,barLeft:cm.options.fixedGutter?gutterW:0,docHeight:docH,scrollHeight:docH+scrollGap(cm)+d.barHeight,nativeBarWidth:d.nativeBarWidth,gutterWidth:gutterW}}
-var NativeScrollbars=function NativeScrollbars(place,scroll,cm){this.cm=cm
-var vert=this.vert=elt("div",[elt("div",null,null,"min-width: 1px")],"CodeMirror-vscrollbar")
-var horiz=this.horiz=elt("div",[elt("div",null,null,"height: 100%; min-height: 1px")],"CodeMirror-hscrollbar")
-place(vert);place(horiz)
-on(vert,"scroll",function(){if(vert.clientHeight){scroll(vert.scrollTop,"vertical")}})
-on(horiz,"scroll",function(){if(horiz.clientWidth){scroll(horiz.scrollLeft,"horizontal")}})
-this.checkedZeroWidth=false
-if(ie&&ie_version<8){this.horiz.style.minHeight=this.vert.style.minWidth="18px"}};NativeScrollbars.prototype.update=function update(measure){var needsH=measure.scrollWidth>measure.clientWidth+1
-var needsV=measure.scrollHeight>measure.clientHeight+1
-var sWidth=measure.nativeBarWidth
-if(needsV){this.vert.style.display="block"
-this.vert.style.bottom=needsH?sWidth+"px":"0"
-var totalHeight=measure.viewHeight-(needsH?sWidth:0)
-this.vert.firstChild.style.height=Math.max(0,measure.scrollHeight-measure.clientHeight+totalHeight)+"px"}else{this.vert.style.display=""
-this.vert.firstChild.style.height="0"}
-if(needsH){this.horiz.style.display="block"
-this.horiz.style.right=needsV?sWidth+"px":"0"
-this.horiz.style.left=measure.barLeft+"px"
-var totalWidth=measure.viewWidth-measure.barLeft-(needsV?sWidth:0)
-this.horiz.firstChild.style.width=Math.max(0,measure.scrollWidth-measure.clientWidth+totalWidth)+"px"}else{this.horiz.style.display=""
-this.horiz.firstChild.style.width="0"}
-if(!this.checkedZeroWidth&&measure.clientHeight>0){if(sWidth==0){this.zeroWidthHack()}
-this.checkedZeroWidth=true}
-return{right:needsV?sWidth:0,bottom:needsH?sWidth:0}};NativeScrollbars.prototype.setScrollLeft=function setScrollLeft$1(pos){if(this.horiz.scrollLeft!=pos){this.horiz.scrollLeft=pos}
-if(this.disableHoriz){this.enableZeroWidthBar(this.horiz,this.disableHoriz)}};NativeScrollbars.prototype.setScrollTop=function setScrollTop$1(pos){if(this.vert.scrollTop!=pos){this.vert.scrollTop=pos}
-if(this.disableVert){this.enableZeroWidthBar(this.vert,this.disableVert)}};NativeScrollbars.prototype.zeroWidthHack=function zeroWidthHack(){var w=mac&&!mac_geMountainLion?"12px":"18px"
-this.horiz.style.height=this.vert.style.width=w
-this.horiz.style.pointerEvents=this.vert.style.pointerEvents="none"
-this.disableHoriz=new Delayed
-this.disableVert=new Delayed};NativeScrollbars.prototype.enableZeroWidthBar=function enableZeroWidthBar(bar,delay){bar.style.pointerEvents="auto"
-function maybeDisable(){var box=bar.getBoundingClientRect()
-var elt=document.elementFromPoint(box.left+1,box.bottom-1)
-if(elt!=bar){bar.style.pointerEvents="none"}
-else{delay.set(1000,maybeDisable)}}
-delay.set(1000,maybeDisable)};NativeScrollbars.prototype.clear=function clear(){var parent=this.horiz.parentNode
-parent.removeChild(this.horiz)
-parent.removeChild(this.vert)};var NullScrollbars=function NullScrollbars(){};NullScrollbars.prototype.update=function update(){return{bottom:0,right:0}};NullScrollbars.prototype.setScrollLeft=function setScrollLeft$2(){};NullScrollbars.prototype.setScrollTop=function setScrollTop$2(){};NullScrollbars.prototype.clear=function clear(){};function updateScrollbars(cm,measure){if(!measure){measure=measureForScrollbars(cm)}
-var startWidth=cm.display.barWidth,startHeight=cm.display.barHeight
-updateScrollbarsInner(cm,measure)
-for(var i=0;i<4&&startWidth!=cm.display.barWidth||startHeight!=cm.display.barHeight;i++){if(startWidth!=cm.display.barWidth&&cm.options.lineWrapping)
-{updateHeightsInViewport(cm)}
-updateScrollbarsInner(cm,measureForScrollbars(cm))
-startWidth=cm.display.barWidth;startHeight=cm.display.barHeight}}
-function updateScrollbarsInner(cm,measure){var d=cm.display
-var sizes=d.scrollbars.update(measure)
-d.sizer.style.paddingRight=(d.barWidth=sizes.right)+"px"
-d.sizer.style.paddingBottom=(d.barHeight=sizes.bottom)+"px"
-d.heightForcer.style.borderBottom=sizes.bottom+"px solid transparent"
-if(sizes.right&&sizes.bottom){d.scrollbarFiller.style.display="block"
-d.scrollbarFiller.style.height=sizes.bottom+"px"
-d.scrollbarFiller.style.width=sizes.right+"px"}else{d.scrollbarFiller.style.display=""}
-if(sizes.bottom&&cm.options.coverGutterNextToScrollbar&&cm.options.fixedGutter){d.gutterFiller.style.display="block"
-d.gutterFiller.style.height=sizes.bottom+"px"
-d.gutterFiller.style.width=measure.gutterWidth+"px"}else{d.gutterFiller.style.display=""}}
-var scrollbarModel={"native":NativeScrollbars,"null":NullScrollbars}
-function initScrollbars(cm){if(cm.display.scrollbars){cm.display.scrollbars.clear()
-if(cm.display.scrollbars.addClass)
-{rmClass(cm.display.wrapper,cm.display.scrollbars.addClass)}}
-cm.display.scrollbars=new scrollbarModel[cm.options.scrollbarStyle](function(node){cm.display.wrapper.insertBefore(node,cm.display.scrollbarFiller)
-on(node,"mousedown",function(){if(cm.state.focused){setTimeout(function(){return cm.display.input.focus();},0)}})
-node.setAttribute("cm-not-content","true")},function(pos,axis){if(axis=="horizontal"){setScrollLeft(cm,pos)}
-else{setScrollTop(cm,pos)}},cm)
-if(cm.display.scrollbars.addClass)
-{addClass(cm.display.wrapper,cm.display.scrollbars.addClass)}}
-function maybeScrollWindow(cm,rect){if(signalDOMEvent(cm,"scrollCursorIntoView")){return}
-var display=cm.display,box=display.sizer.getBoundingClientRect(),doScroll=null
-if(rect.top+box.top<0){doScroll=true}
-else if(rect.bottom+box.top>(window.innerHeight||document.documentElement.clientHeight)){doScroll=false}
-if(doScroll!=null&&!phantom){var scrollNode=elt("div","\u200b",null,("position: absolute;\n top: "+(rect.top-display.viewOffset-paddingTop(cm.display))+"px;\n height: "+(rect.bottom-rect.top+scrollGap(cm)+display.barHeight)+"px;\n left: "+(rect.left)+"px; width: "+(Math.max(2,rect.right-rect.left))+"px;"))
-cm.display.lineSpace.appendChild(scrollNode)
-scrollNode.scrollIntoView(doScroll)
-cm.display.lineSpace.removeChild(scrollNode)}}
-function scrollPosIntoView(cm,pos,end,margin){if(margin==null){margin=0}
-var rect
-for(var limit=0;limit<5;limit++){var changed=false
-var coords=cursorCoords(cm,pos)
-var endCoords=!end||end==pos?coords:cursorCoords(cm,end)
-rect={left:Math.min(coords.left,endCoords.left),top:Math.min(coords.top,endCoords.top)-margin,right:Math.max(coords.left,endCoords.left),bottom:Math.max(coords.bottom,endCoords.bottom)+margin}
-var scrollPos=calculateScrollPos(cm,rect)
-var startTop=cm.doc.scrollTop,startLeft=cm.doc.scrollLeft
-if(scrollPos.scrollTop!=null){setScrollTop(cm,scrollPos.scrollTop)
-if(Math.abs(cm.doc.scrollTop-startTop)>1){changed=true}}
-if(scrollPos.scrollLeft!=null){setScrollLeft(cm,scrollPos.scrollLeft)
-if(Math.abs(cm.doc.scrollLeft-startLeft)>1){changed=true}}
-if(!changed){break}}
-return rect}
-function scrollIntoView(cm,rect){var scrollPos=calculateScrollPos(cm,rect)
-if(scrollPos.scrollTop!=null){setScrollTop(cm,scrollPos.scrollTop)}
-if(scrollPos.scrollLeft!=null){setScrollLeft(cm,scrollPos.scrollLeft)}}
-function calculateScrollPos(cm,rect){var display=cm.display,snapMargin=textHeight(cm.display)
-if(rect.top<0){rect.top=0}
-var screentop=cm.curOp&&cm.curOp.scrollTop!=null?cm.curOp.scrollTop:display.scroller.scrollTop
-var screen=displayHeight(cm),result={}
-if(rect.bottom-rect.top>screen){rect.bottom=rect.top+screen}
-var docBottom=cm.doc.height+paddingVert(display)
-var atTop=rect.top<snapMargin,atBottom=rect.bottom>docBottom-snapMargin
-if(rect.top<screentop){result.scrollTop=atTop?0:rect.top}else if(rect.bottom>screentop+screen){var newTop=Math.min(rect.top,(atBottom?docBottom:rect.bottom)-screen)
-if(newTop!=screentop){result.scrollTop=newTop}}
-var screenleft=cm.curOp&&cm.curOp.scrollLeft!=null?cm.curOp.scrollLeft:display.scroller.scrollLeft
-var screenw=displayWidth(cm)-(cm.options.fixedGutter?display.gutters.offsetWidth:0)
-var tooWide=rect.right-rect.left>screenw
-if(tooWide){rect.right=rect.left+screenw}
-if(rect.left<10)
-{result.scrollLeft=0}
-else if(rect.left<screenleft)
-{result.scrollLeft=Math.max(0,rect.left-(tooWide?0:10))}
-else if(rect.right>screenw+screenleft-3)
-{result.scrollLeft=rect.right+(tooWide?0:10)-screenw}
-return result}
-function addToScrollPos(cm,left,top){if(left!=null||top!=null){resolveScrollToPos(cm)}
-if(left!=null)
-{cm.curOp.scrollLeft=(cm.curOp.scrollLeft==null?cm.doc.scrollLeft:cm.curOp.scrollLeft)+left}
-if(top!=null)
-{cm.curOp.scrollTop=(cm.curOp.scrollTop==null?cm.doc.scrollTop:cm.curOp.scrollTop)+top}}
-function ensureCursorVisible(cm){resolveScrollToPos(cm)
-var cur=cm.getCursor(),from=cur,to=cur
-if(!cm.options.lineWrapping){from=cur.ch?Pos(cur.line,cur.ch-1):cur
-to=Pos(cur.line,cur.ch+1)}
-cm.curOp.scrollToPos={from:from,to:to,margin:cm.options.cursorScrollMargin}}
-function resolveScrollToPos(cm){var range=cm.curOp.scrollToPos
-if(range){cm.curOp.scrollToPos=null
-var from=estimateCoords(cm,range.from),to=estimateCoords(cm,range.to)
-var sPos=calculateScrollPos(cm,{left:Math.min(from.left,to.left),top:Math.min(from.top,to.top)-range.margin,right:Math.max(from.right,to.right),bottom:Math.max(from.bottom,to.bottom)+range.margin})
-cm.scrollTo(sPos.scrollLeft,sPos.scrollTop)}}
-var nextOpId=0
-function startOperation(cm){cm.curOp={cm:cm,viewChanged:false,startHeight:cm.doc.height,forceUpdate:false,updateInput:null,typing:false,changeObjs:null,cursorActivityHandlers:null,cursorActivityCalled:0,selectionChanged:false,updateMaxLine:false,scrollLeft:null,scrollTop:null,scrollToPos:null,focus:false,id:++nextOpId}
-pushOperation(cm.curOp)}
-function endOperation(cm){var op=cm.curOp
-finishOperation(op,function(group){for(var i=0;i<group.ops.length;i++)
-{group.ops[i].cm.curOp=null}
-endOperations(group)})}
-function endOperations(group){var ops=group.ops
-for(var i=0;i<ops.length;i++)
-{endOperation_R1(ops[i])}
-for(var i$1=0;i$1<ops.length;i$1++)
-{endOperation_W1(ops[i$1])}
-for(var i$2=0;i$2<ops.length;i$2++)
-{endOperation_R2(ops[i$2])}
-for(var i$3=0;i$3<ops.length;i$3++)
-{endOperation_W2(ops[i$3])}
-for(var i$4=0;i$4<ops.length;i$4++)
-{endOperation_finish(ops[i$4])}}
-function endOperation_R1(op){var cm=op.cm,display=cm.display
-maybeClipScrollbars(cm)
-if(op.updateMaxLine){findMaxLine(cm)}
-op.mustUpdate=op.viewChanged||op.forceUpdate||op.scrollTop!=null||op.scrollToPos&&(op.scrollToPos.from.line<display.viewFrom||op.scrollToPos.to.line>=display.viewTo)||display.maxLineChanged&&cm.options.lineWrapping
-op.update=op.mustUpdate&&new DisplayUpdate(cm,op.mustUpdate&&{top:op.scrollTop,ensure:op.scrollToPos},op.forceUpdate)}
-function endOperation_W1(op){op.updatedDisplay=op.mustUpdate&&updateDisplayIfNeeded(op.cm,op.update)}
-function endOperation_R2(op){var cm=op.cm,display=cm.display
-if(op.updatedDisplay){updateHeightsInViewport(cm)}
-op.barMeasure=measureForScrollbars(cm)
-if(display.maxLineChanged&&!cm.options.lineWrapping){op.adjustWidthTo=measureChar(cm,display.maxLine,display.maxLine.text.length).left+3
-cm.display.sizerWidth=op.adjustWidthTo
-op.barMeasure.scrollWidth=Math.max(display.scroller.clientWidth,display.sizer.offsetLeft+op.adjustWidthTo+scrollGap(cm)+cm.display.barWidth)
-op.maxScrollLeft=Math.max(0,display.sizer.offsetLeft+op.adjustWidthTo-displayWidth(cm))}
-if(op.updatedDisplay||op.selectionChanged)
-{op.preparedSelection=display.input.prepareSelection(op.focus)}}
-function endOperation_W2(op){var cm=op.cm
-if(op.adjustWidthTo!=null){cm.display.sizer.style.minWidth=op.adjustWidthTo+"px"
-if(op.maxScrollLeft<cm.doc.scrollLeft)
-{setScrollLeft(cm,Math.min(cm.display.scroller.scrollLeft,op.maxScrollLeft),true)}
-cm.display.maxLineChanged=false}
-var takeFocus=op.focus&&op.focus==activeElt()&&(!document.hasFocus||document.hasFocus())
-if(op.preparedSelection)
-{cm.display.input.showSelection(op.preparedSelection,takeFocus)}
-if(op.updatedDisplay||op.startHeight!=cm.doc.height)
-{updateScrollbars(cm,op.barMeasure)}
-if(op.updatedDisplay)
-{setDocumentHeight(cm,op.barMeasure)}
-if(op.selectionChanged){restartBlink(cm)}
-if(cm.state.focused&&op.updateInput)
-{cm.display.input.reset(op.typing)}
-if(takeFocus){ensureFocus(op.cm)}}
-function endOperation_finish(op){var cm=op.cm,display=cm.display,doc=cm.doc
-if(op.updatedDisplay){postUpdateDisplay(cm,op.update)}
-if(display.wheelStartX!=null&&(op.scrollTop!=null||op.scrollLeft!=null||op.scrollToPos))
-{display.wheelStartX=display.wheelStartY=null}
-if(op.scrollTop!=null&&(display.scroller.scrollTop!=op.scrollTop||op.forceScroll)){doc.scrollTop=Math.max(0,Math.min(display.scroller.scrollHeight-display.scroller.clientHeight,op.scrollTop))
-display.scrollbars.setScrollTop(doc.scrollTop)
-display.scroller.scrollTop=doc.scrollTop}
-if(op.scrollLeft!=null&&(display.scroller.scrollLeft!=op.scrollLeft||op.forceScroll)){doc.scrollLeft=Math.max(0,Math.min(display.scroller.scrollWidth-display.scroller.clientWidth,op.scrollLeft))
-display.scrollbars.setScrollLeft(doc.scrollLeft)
-display.scroller.scrollLeft=doc.scrollLeft
-alignHorizontally(cm)}
-if(op.scrollToPos){var rect=scrollPosIntoView(cm,clipPos(doc,op.scrollToPos.from),clipPos(doc,op.scrollToPos.to),op.scrollToPos.margin)
-maybeScrollWindow(cm,rect)}
-var hidden=op.maybeHiddenMarkers,unhidden=op.maybeUnhiddenMarkers
-if(hidden){for(var i=0;i<hidden.length;++i)
-{if(!hidden[i].lines.length){signal(hidden[i],"hide")}}}
-if(unhidden){for(var i$1=0;i$1<unhidden.length;++i$1)
-{if(unhidden[i$1].lines.length){signal(unhidden[i$1],"unhide")}}}
-if(display.wrapper.offsetHeight)
-{doc.scrollTop=cm.display.scroller.scrollTop}
-if(op.changeObjs)
-{signal(cm,"changes",cm,op.changeObjs)}
-if(op.update)
-{op.update.finish()}}
-function runInOp(cm,f){if(cm.curOp){return f()}
-startOperation(cm)
-try{return f()}
-finally{endOperation(cm)}}
-function operation(cm,f){return function(){if(cm.curOp){return f.apply(cm,arguments)}
-startOperation(cm)
-try{return f.apply(cm,arguments)}
-finally{endOperation(cm)}}}
-function methodOp(f){return function(){if(this.curOp){return f.apply(this,arguments)}
-startOperation(this)
-try{return f.apply(this,arguments)}
-finally{endOperation(this)}}}
-function docMethodOp(f){return function(){var cm=this.cm
-if(!cm||cm.curOp){return f.apply(this,arguments)}
-startOperation(cm)
-try{return f.apply(this,arguments)}
-finally{endOperation(cm)}}}
-function regChange(cm,from,to,lendiff){if(from==null){from=cm.doc.first}
-if(to==null){to=cm.doc.first+cm.doc.size}
-if(!lendiff){lendiff=0}
-var display=cm.display
-if(lendiff&&to<display.viewTo&&(display.updateLineNumbers==null||display.updateLineNumbers>from))
-{display.updateLineNumbers=from}
-cm.curOp.viewChanged=true
-if(from>=display.viewTo){if(sawCollapsedSpans&&visualLineNo(cm.doc,from)<display.viewTo)
-{resetView(cm)}}else if(to<=display.viewFrom){if(sawCollapsedSpans&&visualLineEndNo(cm.doc,to+lendiff)>display.viewFrom){resetView(cm)}else{display.viewFrom+=lendiff
-display.viewTo+=lendiff}}else if(from<=display.viewFrom&&to>=display.viewTo){resetView(cm)}else if(from<=display.viewFrom){var cut=viewCuttingPoint(cm,to,to+lendiff,1)
-if(cut){display.view=display.view.slice(cut.index)
-display.viewFrom=cut.lineN
-display.viewTo+=lendiff}else{resetView(cm)}}else if(to>=display.viewTo){var cut$1=viewCuttingPoint(cm,from,from,-1)
-if(cut$1){display.view=display.view.slice(0,cut$1.index)
-display.viewTo=cut$1.lineN}else{resetView(cm)}}else{var cutTop=viewCuttingPoint(cm,from,from,-1)
-var cutBot=viewCuttingPoint(cm,to,to+lendiff,1)
-if(cutTop&&cutBot){display.view=display.view.slice(0,cutTop.index).concat(buildViewArray(cm,cutTop.lineN,cutBot.lineN)).concat(display.view.slice(cutBot.index))
-display.viewTo+=lendiff}else{resetView(cm)}}
-var ext=display.externalMeasured
-if(ext){if(to<ext.lineN)
-{ext.lineN+=lendiff}
-else if(from<ext.lineN+ext.size)
-{display.externalMeasured=null}}}
-function regLineChange(cm,line,type){cm.curOp.viewChanged=true
-var display=cm.display,ext=cm.display.externalMeasured
-if(ext&&line>=ext.lineN&&line<ext.lineN+ext.size)
-{display.externalMeasured=null}
-if(line<display.viewFrom||line>=display.viewTo){return}
-var lineView=display.view[findViewIndex(cm,line)]
-if(lineView.node==null){return}
-var arr=lineView.changes||(lineView.changes=[])
-if(indexOf(arr,type)==-1){arr.push(type)}}
-function resetView(cm){cm.display.viewFrom=cm.display.viewTo=cm.doc.first
-cm.display.view=[]
-cm.display.viewOffset=0}
-function viewCuttingPoint(cm,oldN,newN,dir){var index=findViewIndex(cm,oldN),diff,view=cm.display.view
-if(!sawCollapsedSpans||newN==cm.doc.first+cm.doc.size)
-{return{index:index,lineN:newN}}
-var n=cm.display.viewFrom
-for(var i=0;i<index;i++)
-{n+=view[i].size}
-if(n!=oldN){if(dir>0){if(index==view.length-1){return null}
-diff=(n+view[index].size)-oldN
-index++}else{diff=n-oldN}
-oldN+=diff;newN+=diff}
-while(visualLineNo(cm.doc,newN)!=newN){if(index==(dir<0?0:view.length-1)){return null}
-newN+=dir*view[index-(dir<0?1:0)].size
-index+=dir}
-return{index:index,lineN:newN}}
-function adjustView(cm,from,to){var display=cm.display,view=display.view
-if(view.length==0||from>=display.viewTo||to<=display.viewFrom){display.view=buildViewArray(cm,from,to)
-display.viewFrom=from}else{if(display.viewFrom>from)
-{display.view=buildViewArray(cm,from,display.viewFrom).concat(display.view)}
-else if(display.viewFrom<from)
-{display.view=display.view.slice(findViewIndex(cm,from))}
-display.viewFrom=from
-if(display.viewTo<to)
-{display.view=display.view.concat(buildViewArray(cm,display.viewTo,to))}
-else if(display.viewTo>to)
-{display.view=display.view.slice(0,findViewIndex(cm,to))}}
-display.viewTo=to}
-function countDirtyView(cm){var view=cm.display.view,dirty=0
-for(var i=0;i<view.length;i++){var lineView=view[i]
-if(!lineView.hidden&&(!lineView.node||lineView.changes)){++dirty}}
-return dirty}
-function startWorker(cm,time){if(cm.doc.mode.startState&&cm.doc.frontier<cm.display.viewTo)
-{cm.state.highlight.set(time,bind(highlightWorker,cm))}}
-function highlightWorker(cm){var doc=cm.doc
-if(doc.frontier<doc.first){doc.frontier=doc.first}
-if(doc.frontier>=cm.display.viewTo){return}
-var end=+new Date+cm.options.workTime
-var state=copyState(doc.mode,getStateBefore(cm,doc.frontier))
-var changedLines=[]
-doc.iter(doc.frontier,Math.min(doc.first+doc.size,cm.display.viewTo+500),function(line){if(doc.frontier>=cm.display.viewFrom){var oldStyles=line.styles,tooLong=line.text.length>cm.options.maxHighlightLength
-var highlighted=highlightLine(cm,line,tooLong?copyState(doc.mode,state):state,true)
-line.styles=highlighted.styles
-var oldCls=line.styleClasses,newCls=highlighted.classes
-if(newCls){line.styleClasses=newCls}
-else if(oldCls){line.styleClasses=null}
-var ischange=!oldStyles||oldStyles.length!=line.styles.length||oldCls!=newCls&&(!oldCls||!newCls||oldCls.bgClass!=newCls.bgClass||oldCls.textClass!=newCls.textClass)
-for(var i=0;!ischange&&i<oldStyles.length;++i){ischange=oldStyles[i]!=line.styles[i]}
-if(ischange){changedLines.push(doc.frontier)}
-line.stateAfter=tooLong?state:copyState(doc.mode,state)}else{if(line.text.length<=cm.options.maxHighlightLength)
-{processLine(cm,line.text,state)}
-line.stateAfter=doc.frontier%5==0?copyState(doc.mode,state):null}
-++doc.frontier
-if(+new Date>end){startWorker(cm,cm.options.workDelay)
-return true}})
-if(changedLines.length){runInOp(cm,function(){for(var i=0;i<changedLines.length;i++)
-{regLineChange(cm,changedLines[i],"text")}})}}
-var DisplayUpdate=function DisplayUpdate(cm,viewport,force){var display=cm.display
-this.viewport=viewport
-this.visible=visibleLines(display,cm.doc,viewport)
-this.editorIsHidden=!display.wrapper.offsetWidth
-this.wrapperHeight=display.wrapper.clientHeight
-this.wrapperWidth=display.wrapper.clientWidth
-this.oldDisplayWidth=displayWidth(cm)
-this.force=force
-this.dims=getDimensions(cm)
-this.events=[]};DisplayUpdate.prototype.signal=function signal$1(emitter,type){if(hasHandler(emitter,type))
-{this.events.push(arguments)}};DisplayUpdate.prototype.finish=function finish(){var this$1=this;for(var i=0;i<this.events.length;i++)
-{signal.apply(null,this$1.events[i])}};function maybeClipScrollbars(cm){var display=cm.display
-if(!display.scrollbarsClipped&&display.scroller.offsetWidth){display.nativeBarWidth=display.scroller.offsetWidth-display.scroller.clientWidth
-display.heightForcer.style.height=scrollGap(cm)+"px"
-display.sizer.style.marginBottom=-display.nativeBarWidth+"px"
-display.sizer.style.borderRightWidth=scrollGap(cm)+"px"
-display.scrollbarsClipped=true}}
-function updateDisplayIfNeeded(cm,update){var display=cm.display,doc=cm.doc
-if(update.editorIsHidden){resetView(cm)
-return false}
-if(!update.force&&update.visible.from>=display.viewFrom&&update.visible.to<=display.viewTo&&(display.updateLineNumbers==null||display.updateLineNumbers>=display.viewTo)&&display.renderedView==display.view&&countDirtyView(cm)==0)
-{return false}
-if(maybeUpdateLineNumberWidth(cm)){resetView(cm)
-update.dims=getDimensions(cm)}
-var end=doc.first+doc.size
-var from=Math.max(update.visible.from-cm.options.viewportMargin,doc.first)
-var to=Math.min(end,update.visible.to+cm.options.viewportMargin)
-if(display.viewFrom<from&&from-display.viewFrom<20){from=Math.max(doc.first,display.viewFrom)}
-if(display.viewTo>to&&display.viewTo-to<20){to=Math.min(end,display.viewTo)}
-if(sawCollapsedSpans){from=visualLineNo(cm.doc,from)
-to=visualLineEndNo(cm.doc,to)}
-var different=from!=display.viewFrom||to!=display.viewTo||display.lastWrapHeight!=update.wrapperHeight||display.lastWrapWidth!=update.wrapperWidth
-adjustView(cm,from,to)
-display.viewOffset=heightAtLine(getLine(cm.doc,display.viewFrom))
-cm.display.mover.style.top=display.viewOffset+"px"
-var toUpdate=countDirtyView(cm)
-if(!different&&toUpdate==0&&!update.force&&display.renderedView==display.view&&(display.updateLineNumbers==null||display.updateLineNumbers>=display.viewTo))
-{return false}
-var focused=activeElt()
-if(toUpdate>4){display.lineDiv.style.display="none"}
-patchDisplay(cm,display.updateLineNumbers,update.dims)
-if(toUpdate>4){display.lineDiv.style.display=""}
-display.renderedView=display.view
-if(focused&&activeElt()!=focused&&focused.offsetHeight){focused.focus()}
-removeChildren(display.cursorDiv)
-removeChildren(display.selectionDiv)
-display.gutters.style.height=display.sizer.style.minHeight=0
-if(different){display.lastWrapHeight=update.wrapperHeight
-display.lastWrapWidth=update.wrapperWidth
-startWorker(cm,400)}
-display.updateLineNumbers=null
-return true}
-function postUpdateDisplay(cm,update){var viewport=update.viewport
-for(var first=true;;first=false){if(!first||!cm.options.lineWrapping||update.oldDisplayWidth==displayWidth(cm)){if(viewport&&viewport.top!=null)
-{viewport={top:Math.min(cm.doc.height+paddingVert(cm.display)-displayHeight(cm),viewport.top)}}
-update.visible=visibleLines(cm.display,cm.doc,viewport)
-if(update.visible.from>=cm.display.viewFrom&&update.visible.to<=cm.display.viewTo)
-{break}}
-if(!updateDisplayIfNeeded(cm,update)){break}
-updateHeightsInViewport(cm)
-var barMeasure=measureForScrollbars(cm)
-updateSelection(cm)
-updateScrollbars(cm,barMeasure)
-setDocumentHeight(cm,barMeasure)}
-update.signal(cm,"update",cm)
-if(cm.display.viewFrom!=cm.display.reportedViewFrom||cm.display.viewTo!=cm.display.reportedViewTo){update.signal(cm,"viewportChange",cm,cm.display.viewFrom,cm.display.viewTo)
-cm.display.reportedViewFrom=cm.display.viewFrom;cm.display.reportedViewTo=cm.display.viewTo}}
-function updateDisplaySimple(cm,viewport){var update=new DisplayUpdate(cm,viewport)
-if(updateDisplayIfNeeded(cm,update)){updateHeightsInViewport(cm)
-postUpdateDisplay(cm,update)
-var barMeasure=measureForScrollbars(cm)
-updateSelection(cm)
-updateScrollbars(cm,barMeasure)
-setDocumentHeight(cm,barMeasure)
-update.finish()}}
-function patchDisplay(cm,updateNumbersFrom,dims){var display=cm.display,lineNumbers=cm.options.lineNumbers
-var container=display.lineDiv,cur=container.firstChild
-function rm(node){var next=node.nextSibling
-if(webkit&&mac&&cm.display.currentWheelTarget==node)
-{node.style.display="none"}
-else
-{node.parentNode.removeChild(node)}
-return next}
-var view=display.view,lineN=display.viewFrom
-for(var i=0;i<view.length;i++){var lineView=view[i]
-if(lineView.hidden){}else if(!lineView.node||lineView.node.parentNode!=container){var node=buildLineElement(cm,lineView,lineN,dims)
-container.insertBefore(node,cur)}else{while(cur!=lineView.node){cur=rm(cur)}
-var updateNumber=lineNumbers&&updateNumbersFrom!=null&&updateNumbersFrom<=lineN&&lineView.lineNumber
-if(lineView.changes){if(indexOf(lineView.changes,"gutter")>-1){updateNumber=false}
-updateLineForChanges(cm,lineView,lineN,dims)}
-if(updateNumber){removeChildren(lineView.lineNumber)
-lineView.lineNumber.appendChild(document.createTextNode(lineNumberFor(cm.options,lineN)))}
-cur=lineView.node.nextSibling}
-lineN+=lineView.size}
-while(cur){cur=rm(cur)}}
-function updateGutterSpace(cm){var width=cm.display.gutters.offsetWidth
-cm.display.sizer.style.marginLeft=width+"px"}
-function setDocumentHeight(cm,measure){cm.display.sizer.style.minHeight=measure.docHeight+"px"
-cm.display.heightForcer.style.top=measure.docHeight+"px"
-cm.display.gutters.style.height=(measure.docHeight+cm.display.barHeight+scrollGap(cm))+"px"}
-function updateGutters(cm){var gutters=cm.display.gutters,specs=cm.options.gutters
-removeChildren(gutters)
-var i=0
-for(;i<specs.length;++i){var gutterClass=specs[i]
-var gElt=gutters.appendChild(elt("div",null,"CodeMirror-gutter "+gutterClass))
-if(gutterClass=="CodeMirror-linenumbers"){cm.display.lineGutter=gElt
-gElt.style.width=(cm.display.lineNumWidth||1)+"px"}}
-gutters.style.display=i?"":"none"
-updateGutterSpace(cm)}
-function setGuttersForLineNumbers(options){var found=indexOf(options.gutters,"CodeMirror-linenumbers")
-if(found==-1&&options.lineNumbers){options.gutters=options.gutters.concat(["CodeMirror-linenumbers"])}else if(found>-1&&!options.lineNumbers){options.gutters=options.gutters.slice(0)
-options.gutters.splice(found,1)}}
-var Selection=function Selection(ranges,primIndex){this.ranges=ranges
-this.primIndex=primIndex};Selection.prototype.primary=function primary(){return this.ranges[this.primIndex]};Selection.prototype.equals=function equals(other){var this$1=this;if(other==this){return true}
-if(other.primIndex!=this.primIndex||other.ranges.length!=this.ranges.length){return false}
-for(var i=0;i<this.ranges.length;i++){var here=this$1.ranges[i],there=other.ranges[i]
-if(!equalCursorPos(here.anchor,there.anchor)||!equalCursorPos(here.head,there.head)){return false}}
-return true};Selection.prototype.deepCopy=function deepCopy(){var this$1=this;var out=[]
-for(var i=0;i<this.ranges.length;i++)
-{out[i]=new Range(copyPos(this$1.ranges[i].anchor),copyPos(this$1.ranges[i].head))}
-return new Selection(out,this.primIndex)};Selection.prototype.somethingSelected=function somethingSelected(){var this$1=this;for(var i=0;i<this.ranges.length;i++)
-{if(!this$1.ranges[i].empty()){return true}}
-return false};Selection.prototype.contains=function contains(pos,end){var this$1=this;if(!end){end=pos}
-for(var i=0;i<this.ranges.length;i++){var range=this$1.ranges[i]
-if(cmp(end,range.from())>=0&&cmp(pos,range.to())<=0)
-{return i}}
-return-1};var Range=function Range(anchor,head){this.anchor=anchor;this.head=head};Range.prototype.from=function from(){return minPos(this.anchor,this.head)};Range.prototype.to=function to(){return maxPos(this.anchor,this.head)};Range.prototype.empty=function empty(){return this.head.line==this.anchor.line&&this.head.ch==this.anchor.ch};function normalizeSelection(ranges,primIndex){var prim=ranges[primIndex]
-ranges.sort(function(a,b){return cmp(a.from(),b.from());})
-primIndex=indexOf(ranges,prim)
-for(var i=1;i<ranges.length;i++){var cur=ranges[i],prev=ranges[i-1]
-if(cmp(prev.to(),cur.from())>=0){var from=minPos(prev.from(),cur.from()),to=maxPos(prev.to(),cur.to())
-var inv=prev.empty()?cur.from()==cur.head:prev.from()==prev.head
-if(i<=primIndex){--primIndex}
-ranges.splice(--i,2,new Range(inv?to:from,inv?from:to))}}
-return new Selection(ranges,primIndex)}
-function simpleSelection(anchor,head){return new Selection([new Range(anchor,head||anchor)],0)}
-function changeEnd(change){if(!change.text){return change.to}
-return Pos(change.from.line+change.text.length-1,lst(change.text).length+(change.text.length==1?change.from.ch:0))}
-function adjustForChange(pos,change){if(cmp(pos,change.from)<0){return pos}
-if(cmp(pos,change.to)<=0){return changeEnd(change)}
-var line=pos.line+change.text.length-(change.to.line-change.from.line)-1,ch=pos.ch
-if(pos.line==change.to.line){ch+=changeEnd(change).ch-change.to.ch}
-return Pos(line,ch)}
-function computeSelAfterChange(doc,change){var out=[]
-for(var i=0;i<doc.sel.ranges.length;i++){var range=doc.sel.ranges[i]
-out.push(new Range(adjustForChange(range.anchor,change),adjustForChange(range.head,change)))}
-return normalizeSelection(out,doc.sel.primIndex)}
-function offsetPos(pos,old,nw){if(pos.line==old.line)
-{return Pos(nw.line,pos.ch-old.ch+nw.ch)}
-else
-{return Pos(nw.line+(pos.line-old.line),pos.ch)}}
-function computeReplacedSel(doc,changes,hint){var out=[]
-var oldPrev=Pos(doc.first,0),newPrev=oldPrev
-for(var i=0;i<changes.length;i++){var change=changes[i]
-var from=offsetPos(change.from,oldPrev,newPrev)
-var to=offsetPos(changeEnd(change),oldPrev,newPrev)
-oldPrev=change.to
-newPrev=to
-if(hint=="around"){var range=doc.sel.ranges[i],inv=cmp(range.head,range.anchor)<0
-out[i]=new Range(inv?to:from,inv?from:to)}else{out[i]=new Range(from,from)}}
-return new Selection(out,doc.sel.primIndex)}
-function loadMode(cm){cm.doc.mode=getMode(cm.options,cm.doc.modeOption)
-resetModeState(cm)}
-function resetModeState(cm){cm.doc.iter(function(line){if(line.stateAfter){line.stateAfter=null}
-if(line.styles){line.styles=null}})
-cm.doc.frontier=cm.doc.first
-startWorker(cm,100)
-cm.state.modeGen++
-if(cm.curOp){regChange(cm)}}
-function isWholeLineUpdate(doc,change){return change.from.ch==0&&change.to.ch==0&&lst(change.text)==""&&(!doc.cm||doc.cm.options.wholeLineUpdateBefore)}
-function updateDoc(doc,change,markedSpans,estimateHeight){function spansFor(n){return markedSpans?markedSpans[n]:null}
-function update(line,text,spans){updateLine(line,text,spans,estimateHeight)
-signalLater(line,"change",line,change)}
-function linesFor(start,end){var result=[]
-for(var i=start;i<end;++i)
-{result.push(new Line(text[i],spansFor(i),estimateHeight))}
-return result}
-var from=change.from,to=change.to,text=change.text
-var firstLine=getLine(doc,from.line),lastLine=getLine(doc,to.line)
-var lastText=lst(text),lastSpans=spansFor(text.length-1),nlines=to.line-from.line
-if(change.full){doc.insert(0,linesFor(0,text.length))
-doc.remove(text.length,doc.size-text.length)}else if(isWholeLineUpdate(doc,change)){var added=linesFor(0,text.length-1)
-update(lastLine,lastLine.text,lastSpans)
-if(nlines){doc.remove(from.line,nlines)}
-if(added.length){doc.insert(from.line,added)}}else if(firstLine==lastLine){if(text.length==1){update(firstLine,firstLine.text.slice(0,from.ch)+lastText+firstLine.text.slice(to.ch),lastSpans)}else{var added$1=linesFor(1,text.length-1)
-added$1.push(new Line(lastText+firstLine.text.slice(to.ch),lastSpans,estimateHeight))
-update(firstLine,firstLine.text.slice(0,from.ch)+text[0],spansFor(0))
-doc.insert(from.line+1,added$1)}}else if(text.length==1){update(firstLine,firstLine.text.slice(0,from.ch)+text[0]+lastLine.text.slice(to.ch),spansFor(0))
-doc.remove(from.line+1,nlines)}else{update(firstLine,firstLine.text.slice(0,from.ch)+text[0],spansFor(0))
-update(lastLine,lastText+lastLine.text.slice(to.ch),lastSpans)
-var added$2=linesFor(1,text.length-1)
-if(nlines>1){doc.remove(from.line+1,nlines-1)}
-doc.insert(from.line+1,added$2)}
-signalLater(doc,"change",doc,change)}
-function linkedDocs(doc,f,sharedHistOnly){function propagate(doc,skip,sharedHist){if(doc.linked){for(var i=0;i<doc.linked.length;++i){var rel=doc.linked[i]
-if(rel.doc==skip){continue}
-var shared=sharedHist&&rel.sharedHist
-if(sharedHistOnly&&!shared){continue}
-f(rel.doc,shared)
-propagate(rel.doc,doc,shared)}}}
-propagate(doc,null,true)}
-function attachDoc(cm,doc){if(doc.cm){throw new Error("This document is already in use.")}
-cm.doc=doc
-doc.cm=cm
-estimateLineHeights(cm)
-loadMode(cm)
-setDirectionClass(cm)
-if(!cm.options.lineWrapping){findMaxLine(cm)}
-cm.options.mode=doc.modeOption
-regChange(cm)}
-function setDirectionClass(cm){;(cm.doc.direction=="rtl"?addClass:rmClass)(cm.display.lineDiv,"CodeMirror-rtl")}
-function directionChanged(cm){runInOp(cm,function(){setDirectionClass(cm)
-regChange(cm)})}
-function History(startGen){this.done=[];this.undone=[]
-this.undoDepth=Infinity
-this.lastModTime=this.lastSelTime=0
-this.lastOp=this.lastSelOp=null
-this.lastOrigin=this.lastSelOrigin=null
-this.generation=this.maxGeneration=startGen||1}
-function historyChangeFromChange(doc,change){var histChange={from:copyPos(change.from),to:changeEnd(change),text:getBetween(doc,change.from,change.to)}
-attachLocalSpans(doc,histChange,change.from.line,change.to.line+1)
-linkedDocs(doc,function(doc){return attachLocalSpans(doc,histChange,change.from.line,change.to.line+1);},true)
-return histChange}
-function clearSelectionEvents(array){while(array.length){var last=lst(array)
-if(last.ranges){array.pop()}
-else{break}}}
-function lastChangeEvent(hist,force){if(force){clearSelectionEvents(hist.done)
-return lst(hist.done)}else if(hist.done.length&&!lst(hist.done).ranges){return lst(hist.done)}else if(hist.done.length>1&&!hist.done[hist.done.length-2].ranges){hist.done.pop()
-return lst(hist.done)}}
-function addChangeToHistory(doc,change,selAfter,opId){var hist=doc.history
-hist.undone.length=0
-var time=+new Date,cur
-var last
-if((hist.lastOp==opId||hist.lastOrigin==change.origin&&change.origin&&((change.origin.charAt(0)=="+"&&doc.cm&&hist.lastModTime>time-doc.cm.options.historyEventDelay)||change.origin.charAt(0)=="*"))&&(cur=lastChangeEvent(hist,hist.lastOp==opId))){last=lst(cur.changes)
-if(cmp(change.from,change.to)==0&&cmp(change.from,last.to)==0){last.to=changeEnd(change)}else{cur.changes.push(historyChangeFromChange(doc,change))}}else{var before=lst(hist.done)
-if(!before||!before.ranges)
-{pushSelectionToHistory(doc.sel,hist.done)}
-cur={changes:[historyChangeFromChange(doc,change)],generation:hist.generation}
-hist.done.push(cur)
-while(hist.done.length>hist.undoDepth){hist.done.shift()
-if(!hist.done[0].ranges){hist.done.shift()}}}
-hist.done.push(selAfter)
-hist.generation=++hist.maxGeneration
-hist.lastModTime=hist.lastSelTime=time
-hist.lastOp=hist.lastSelOp=opId
-hist.lastOrigin=hist.lastSelOrigin=change.origin
-if(!last){signal(doc,"historyAdded")}}
-function selectionEventCanBeMerged(doc,origin,prev,sel){var ch=origin.charAt(0)
-return ch=="*"||ch=="+"&&prev.ranges.length==sel.ranges.length&&prev.somethingSelected()==sel.somethingSelected()&&new Date-doc.history.lastSelTime<=(doc.cm?doc.cm.options.historyEventDelay:500)}
-function addSelectionToHistory(doc,sel,opId,options){var hist=doc.history,origin=options&&options.origin
-if(opId==hist.lastSelOp||(origin&&hist.lastSelOrigin==origin&&(hist.lastModTime==hist.lastSelTime&&hist.lastOrigin==origin||selectionEventCanBeMerged(doc,origin,lst(hist.done),sel))))
-{hist.done[hist.done.length-1]=sel}
-else
-{pushSelectionToHistory(sel,hist.done)}
-hist.lastSelTime=+new Date
-hist.lastSelOrigin=origin
-hist.lastSelOp=opId
-if(options&&options.clearRedo!==false)
-{clearSelectionEvents(hist.undone)}}
-function pushSelectionToHistory(sel,dest){var top=lst(dest)
-if(!(top&&top.ranges&&top.equals(sel)))
-{dest.push(sel)}}
-function attachLocalSpans(doc,change,from,to){var existing=change["spans_"+doc.id],n=0
-doc.iter(Math.max(doc.first,from),Math.min(doc.first+doc.size,to),function(line){if(line.markedSpans)
-{(existing||(existing=change["spans_"+doc.id]={}))[n]=line.markedSpans}
-++n})}
-function removeClearedSpans(spans){if(!spans){return null}
-var out
-for(var i=0;i<spans.length;++i){if(spans[i].marker.explicitlyCleared){if(!out){out=spans.slice(0,i)}}
-else if(out){out.push(spans[i])}}
-return!out?spans:out.length?out:null}
-function getOldSpans(doc,change){var found=change["spans_"+doc.id]
-if(!found){return null}
-var nw=[]
-for(var i=0;i<change.text.length;++i)
-{nw.push(removeClearedSpans(found[i]))}
-return nw}
-function mergeOldSpans(doc,change){var old=getOldSpans(doc,change)
-var stretched=stretchSpansOverChange(doc,change)
-if(!old){return stretched}
-if(!stretched){return old}
-for(var i=0;i<old.length;++i){var oldCur=old[i],stretchCur=stretched[i]
-if(oldCur&&stretchCur){spans:for(var j=0;j<stretchCur.length;++j){var span=stretchCur[j]
-for(var k=0;k<oldCur.length;++k)
-{if(oldCur[k].marker==span.marker){continue spans}}
-oldCur.push(span)}}else if(stretchCur){old[i]=stretchCur}}
-return old}
-function copyHistoryArray(events,newGroup,instantiateSel){var copy=[]
-for(var i=0;i<events.length;++i){var event=events[i]
-if(event.ranges){copy.push(instantiateSel?Selection.prototype.deepCopy.call(event):event)
-continue}
-var changes=event.changes,newChanges=[]
-copy.push({changes:newChanges})
-for(var j=0;j<changes.length;++j){var change=changes[j],m=(void 0)
-newChanges.push({from:change.from,to:change.to,text:change.text})
-if(newGroup){for(var prop in change){if(m=prop.match(/^spans_(\d+)$/)){if(indexOf(newGroup,Number(m[1]))>-1){lst(newChanges)[prop]=change[prop]
-delete change[prop]}}}}}}
-return copy}
-function extendRange(doc,range,head,other){if(doc.cm&&doc.cm.display.shift||doc.extend){var anchor=range.anchor
-if(other){var posBefore=cmp(head,anchor)<0
-if(posBefore!=(cmp(other,anchor)<0)){anchor=head
-head=other}else if(posBefore!=(cmp(head,other)<0)){head=other}}
-return new Range(anchor,head)}else{return new Range(other||head,head)}}
-function extendSelection(doc,head,other,options){setSelection(doc,new Selection([extendRange(doc,doc.sel.primary(),head,other)],0),options)}
-function extendSelections(doc,heads,options){var out=[]
-for(var i=0;i<doc.sel.ranges.length;i++)
-{out[i]=extendRange(doc,doc.sel.ranges[i],heads[i],null)}
-var newSel=normalizeSelection(out,doc.sel.primIndex)
-setSelection(doc,newSel,options)}
-function replaceOneSelection(doc,i,range,options){var ranges=doc.sel.ranges.slice(0)
-ranges[i]=range
-setSelection(doc,normalizeSelection(ranges,doc.sel.primIndex),options)}
-function setSimpleSelection(doc,anchor,head,options){setSelection(doc,simpleSelection(anchor,head),options)}
-function filterSelectionChange(doc,sel,options){var obj={ranges:sel.ranges,update:function(ranges){var this$1=this;this.ranges=[]
-for(var i=0;i<ranges.length;i++)
-{this$1.ranges[i]=new Range(clipPos(doc,ranges[i].anchor),clipPos(doc,ranges[i].head))}},origin:options&&options.origin}
-signal(doc,"beforeSelectionChange",doc,obj)
-if(doc.cm){signal(doc.cm,"beforeSelectionChange",doc.cm,obj)}
-if(obj.ranges!=sel.ranges){return normalizeSelection(obj.ranges,obj.ranges.length-1)}
-else{return sel}}
-function setSelectionReplaceHistory(doc,sel,options){var done=doc.history.done,last=lst(done)
-if(last&&last.ranges){done[done.length-1]=sel
-setSelectionNoUndo(doc,sel,options)}else{setSelection(doc,sel,options)}}
-function setSelection(doc,sel,options){setSelectionNoUndo(doc,sel,options)
-addSelectionToHistory(doc,doc.sel,doc.cm?doc.cm.curOp.id:NaN,options)}
-function setSelectionNoUndo(doc,sel,options){if(hasHandler(doc,"beforeSelectionChange")||doc.cm&&hasHandler(doc.cm,"beforeSelectionChange"))
-{sel=filterSelectionChange(doc,sel,options)}
-var bias=options&&options.bias||(cmp(sel.primary().head,doc.sel.primary().head)<0?-1:1)
-setSelectionInner(doc,skipAtomicInSelection(doc,sel,bias,true))
-if(!(options&&options.scroll===false)&&doc.cm)
-{ensureCursorVisible(doc.cm)}}
-function setSelectionInner(doc,sel){if(sel.equals(doc.sel)){return}
-doc.sel=sel
-if(doc.cm){doc.cm.curOp.updateInput=doc.cm.curOp.selectionChanged=true
-signalCursorActivity(doc.cm)}
-signalLater(doc,"cursorActivity",doc)}
-function reCheckSelection(doc){setSelectionInner(doc,skipAtomicInSelection(doc,doc.sel,null,false),sel_dontScroll)}
-function skipAtomicInSelection(doc,sel,bias,mayClear){var out
-for(var i=0;i<sel.ranges.length;i++){var range=sel.ranges[i]
-var old=sel.ranges.length==doc.sel.ranges.length&&doc.sel.ranges[i]
-var newAnchor=skipAtomic(doc,range.anchor,old&&old.anchor,bias,mayClear)
-var newHead=skipAtomic(doc,range.head,old&&old.head,bias,mayClear)
-if(out||newAnchor!=range.anchor||newHead!=range.head){if(!out){out=sel.ranges.slice(0,i)}
-out[i]=new Range(newAnchor,newHead)}}
-return out?normalizeSelection(out,sel.primIndex):sel}
-function skipAtomicInner(doc,pos,oldPos,dir,mayClear){var line=getLine(doc,pos.line)
-if(line.markedSpans){for(var i=0;i<line.markedSpans.length;++i){var sp=line.markedSpans[i],m=sp.marker
-if((sp.from==null||(m.inclusiveLeft?sp.from<=pos.ch:sp.from<pos.ch))&&(sp.to==null||(m.inclusiveRight?sp.to>=pos.ch:sp.to>pos.ch))){if(mayClear){signal(m,"beforeCursorEnter")
-if(m.explicitlyCleared){if(!line.markedSpans){break}
-else{--i;continue}}}
-if(!m.atomic){continue}
-if(oldPos){var near=m.find(dir<0?1:-1),diff=(void 0)
-if(dir<0?m.inclusiveRight:m.inclusiveLeft)
-{near=movePos(doc,near,-dir,near&&near.line==pos.line?line:null)}
-if(near&&near.line==pos.line&&(diff=cmp(near,oldPos))&&(dir<0?diff<0:diff>0))
-{return skipAtomicInner(doc,near,pos,dir,mayClear)}}
-var far=m.find(dir<0?-1:1)
-if(dir<0?m.inclusiveLeft:m.inclusiveRight)
-{far=movePos(doc,far,dir,far.line==pos.line?line:null)}
-return far?skipAtomicInner(doc,far,pos,dir,mayClear):null}}}
-return pos}
-function skipAtomic(doc,pos,oldPos,bias,mayClear){var dir=bias||1
-var found=skipAtomicInner(doc,pos,oldPos,dir,mayClear)||(!mayClear&&skipAtomicInner(doc,pos,oldPos,dir,true))||skipAtomicInner(doc,pos,oldPos,-dir,mayClear)||(!mayClear&&skipAtomicInner(doc,pos,oldPos,-dir,true))
-if(!found){doc.cantEdit=true
-return Pos(doc.first,0)}
-return found}
-function movePos(doc,pos,dir,line){if(dir<0&&pos.ch==0){if(pos.line>doc.first){return clipPos(doc,Pos(pos.line-1))}
-else{return null}}else if(dir>0&&pos.ch==(line||getLine(doc,pos.line)).text.length){if(pos.line<doc.first+doc.size-1){return Pos(pos.line+1,0)}
-else{return null}}else{return new Pos(pos.line,pos.ch+dir)}}
-function selectAll(cm){cm.setSelection(Pos(cm.firstLine(),0),Pos(cm.lastLine()),sel_dontScroll)}
-function filterChange(doc,change,update){var obj={canceled:false,from:change.from,to:change.to,text:change.text,origin:change.origin,cancel:function(){return obj.canceled=true;}}
-if(update){obj.update=function(from,to,text,origin){if(from){obj.from=clipPos(doc,from)}
-if(to){obj.to=clipPos(doc,to)}
-if(text){obj.text=text}
-if(origin!==undefined){obj.origin=origin}}}
-signal(doc,"beforeChange",doc,obj)
-if(doc.cm){signal(doc.cm,"beforeChange",doc.cm,obj)}
-if(obj.canceled){return null}
-return{from:obj.from,to:obj.to,text:obj.text,origin:obj.origin}}
-function makeChange(doc,change,ignoreReadOnly){if(doc.cm){if(!doc.cm.curOp){return operation(doc.cm,makeChange)(doc,change,ignoreReadOnly)}
-if(doc.cm.state.suppressEdits){return}}
-if(hasHandler(doc,"beforeChange")||doc.cm&&hasHandler(doc.cm,"beforeChange")){change=filterChange(doc,change,true)
-if(!change){return}}
-var split=sawReadOnlySpans&&!ignoreReadOnly&&removeReadOnlyRanges(doc,change.from,change.to)
-if(split){for(var i=split.length-1;i>=0;--i)
-{makeChangeInner(doc,{from:split[i].from,to:split[i].to,text:i?[""]:change.text})}}else{makeChangeInner(doc,change)}}
-function makeChangeInner(doc,change){if(change.text.length==1&&change.text[0]==""&&cmp(change.from,change.to)==0){return}
-var selAfter=computeSelAfterChange(doc,change)
-addChangeToHistory(doc,change,selAfter,doc.cm?doc.cm.curOp.id:NaN)
-makeChangeSingleDoc(doc,change,selAfter,stretchSpansOverChange(doc,change))
-var rebased=[]
-linkedDocs(doc,function(doc,sharedHist){if(!sharedHist&&indexOf(rebased,doc.history)==-1){rebaseHist(doc.history,change)
-rebased.push(doc.history)}
-makeChangeSingleDoc(doc,change,null,stretchSpansOverChange(doc,change))})}
-function makeChangeFromHistory(doc,type,allowSelectionOnly){if(doc.cm&&doc.cm.state.suppressEdits&&!allowSelectionOnly){return}
-var hist=doc.history,event,selAfter=doc.sel
-var source=type=="undo"?hist.done:hist.undone,dest=type=="undo"?hist.undone:hist.done
-var i=0
-for(;i<source.length;i++){event=source[i]
-if(allowSelectionOnly?event.ranges&&!event.equals(doc.sel):!event.ranges)
-{break}}
-if(i==source.length){return}
-hist.lastOrigin=hist.lastSelOrigin=null
-for(;;){event=source.pop()
-if(event.ranges){pushSelectionToHistory(event,dest)
-if(allowSelectionOnly&&!event.equals(doc.sel)){setSelection(doc,event,{clearRedo:false})
-return}
-selAfter=event}
-else{break}}
-var antiChanges=[]
-pushSelectionToHistory(selAfter,dest)
-dest.push({changes:antiChanges,generation:hist.generation})
-hist.generation=event.generation||++hist.maxGeneration
-var filter=hasHandler(doc,"beforeChange")||doc.cm&&hasHandler(doc.cm,"beforeChange")
-var loop=function(i){var change=event.changes[i]
-change.origin=type
-if(filter&&!filterChange(doc,change,false)){source.length=0
-return{}}
-antiChanges.push(historyChangeFromChange(doc,change))
-var after=i?computeSelAfterChange(doc,change):lst(source)
-makeChangeSingleDoc(doc,change,after,mergeOldSpans(doc,change))
-if(!i&&doc.cm){doc.cm.scrollIntoView({from:change.from,to:changeEnd(change)})}
-var rebased=[]
-linkedDocs(doc,function(doc,sharedHist){if(!sharedHist&&indexOf(rebased,doc.history)==-1){rebaseHist(doc.history,change)
-rebased.push(doc.history)}
-makeChangeSingleDoc(doc,change,null,mergeOldSpans(doc,change))})};for(var i$1=event.changes.length-1;i$1>=0;--i$1){var returned=loop(i$1);if(returned)return returned.v;}}
-function shiftDoc(doc,distance){if(distance==0){return}
-doc.first+=distance
-doc.sel=new Selection(map(doc.sel.ranges,function(range){return new Range(Pos(range.anchor.line+distance,range.anchor.ch),Pos(range.head.line+distance,range.head.ch));}),doc.sel.primIndex)
-if(doc.cm){regChange(doc.cm,doc.first,doc.first-distance,distance)
-for(var d=doc.cm.display,l=d.viewFrom;l<d.viewTo;l++)
-{regLineChange(doc.cm,l,"gutter")}}}
-function makeChangeSingleDoc(doc,change,selAfter,spans){if(doc.cm&&!doc.cm.curOp)
-{return operation(doc.cm,makeChangeSingleDoc)(doc,change,selAfter,spans)}
-if(change.to.line<doc.first){shiftDoc(doc,change.text.length-1-(change.to.line-change.from.line))
-return}
-if(change.from.line>doc.lastLine()){return}
-if(change.from.line<doc.first){var shift=change.text.length-1-(doc.first-change.from.line)
-shiftDoc(doc,shift)
-change={from:Pos(doc.first,0),to:Pos(change.to.line+shift,change.to.ch),text:[lst(change.text)],origin:change.origin}}
-var last=doc.lastLine()
-if(change.to.line>last){change={from:change.from,to:Pos(last,getLine(doc,last).text.length),text:[change.text[0]],origin:change.origin}}
-change.removed=getBetween(doc,change.from,change.to)
-if(!selAfter){selAfter=computeSelAfterChange(doc,change)}
-if(doc.cm){makeChangeSingleDocInEditor(doc.cm,change,spans)}
-else{updateDoc(doc,change,spans)}
-setSelectionNoUndo(doc,selAfter,sel_dontScroll)}
-function makeChangeSingleDocInEditor(cm,change,spans){var doc=cm.doc,display=cm.display,from=change.from,to=change.to
-var recomputeMaxLength=false,checkWidthStart=from.line
-if(!cm.options.lineWrapping){checkWidthStart=lineNo(visualLine(getLine(doc,from.line)))
-doc.iter(checkWidthStart,to.line+1,function(line){if(line==display.maxLine){recomputeMaxLength=true
-return true}})}
-if(doc.sel.contains(change.from,change.to)>-1)
-{signalCursorActivity(cm)}
-updateDoc(doc,change,spans,estimateHeight(cm))
-if(!cm.options.lineWrapping){doc.iter(checkWidthStart,from.line+change.text.length,function(line){var len=lineLength(line)
-if(len>display.maxLineLength){display.maxLine=line
-display.maxLineLength=len
-display.maxLineChanged=true
-recomputeMaxLength=false}})
-if(recomputeMaxLength){cm.curOp.updateMaxLine=true}}
-doc.frontier=Math.min(doc.frontier,from.line)
-startWorker(cm,400)
-var lendiff=change.text.length-(to.line-from.line)-1
-if(change.full)
-{regChange(cm)}
-else if(from.line==to.line&&change.text.length==1&&!isWholeLineUpdate(cm.doc,change))
-{regLineChange(cm,from.line,"text")}
-else
-{regChange(cm,from.line,to.line+1,lendiff)}
-var changesHandler=hasHandler(cm,"changes"),changeHandler=hasHandler(cm,"change")
-if(changeHandler||changesHandler){var obj={from:from,to:to,text:change.text,removed:change.removed,origin:change.origin}
-if(changeHandler){signalLater(cm,"change",cm,obj)}
-if(changesHandler){(cm.curOp.changeObjs||(cm.curOp.changeObjs=[])).push(obj)}}
-cm.display.selForContextMenu=null}
-function replaceRange(doc,code,from,to,origin){if(!to){to=from}
-if(cmp(to,from)<0){var tmp=to;to=from;from=tmp}
-if(typeof code=="string"){code=doc.splitLines(code)}
-makeChange(doc,{from:from,to:to,text:code,origin:origin})}
-function rebaseHistSelSingle(pos,from,to,diff){if(to<pos.line){pos.line+=diff}else if(from<pos.line){pos.line=from
-pos.ch=0}}
-function rebaseHistArray(array,from,to,diff){for(var i=0;i<array.length;++i){var sub=array[i],ok=true
-if(sub.ranges){if(!sub.copied){sub=array[i]=sub.deepCopy();sub.copied=true}
-for(var j=0;j<sub.ranges.length;j++){rebaseHistSelSingle(sub.ranges[j].anchor,from,to,diff)
-rebaseHistSelSingle(sub.ranges[j].head,from,to,diff)}
-continue}
-for(var j$1=0;j$1<sub.changes.length;++j$1){var cur=sub.changes[j$1]
-if(to<cur.from.line){cur.from=Pos(cur.from.line+diff,cur.from.ch)
-cur.to=Pos(cur.to.line+diff,cur.to.ch)}else if(from<=cur.to.line){ok=false
-break}}
-if(!ok){array.splice(0,i+1)
-i=0}}}
-function rebaseHist(hist,change){var from=change.from.line,to=change.to.line,diff=change.text.length-(to-from)-1
-rebaseHistArray(hist.done,from,to,diff)
-rebaseHistArray(hist.undone,from,to,diff)}
-function changeLine(doc,handle,changeType,op){var no=handle,line=handle
-if(typeof handle=="number"){line=getLine(doc,clipLine(doc,handle))}
-else{no=lineNo(handle)}
-if(no==null){return null}
-if(op(line,no)&&doc.cm){regLineChange(doc.cm,no,changeType)}
-return line}
-var LeafChunk=function LeafChunk(lines){var this$1=this;this.lines=lines
-this.parent=null
-var height=0
-for(var i=0;i<lines.length;++i){lines[i].parent=this$1
-height+=lines[i].height}
-this.height=height};LeafChunk.prototype.chunkSize=function chunkSize(){return this.lines.length};LeafChunk.prototype.removeInner=function removeInner(at,n){var this$1=this;for(var i=at,e=at+n;i<e;++i){var line=this$1.lines[i]
-this$1.height-=line.height
-cleanUpLine(line)
-signalLater(line,"delete")}
-this.lines.splice(at,n)};LeafChunk.prototype.collapse=function collapse(lines){lines.push.apply(lines,this.lines)};LeafChunk.prototype.insertInner=function insertInner(at,lines,height){var this$1=this;this.height+=height
-this.lines=this.lines.slice(0,at).concat(lines).concat(this.lines.slice(at))
-for(var i=0;i<lines.length;++i){lines[i].parent=this$1}};LeafChunk.prototype.iterN=function iterN(at,n,op){var this$1=this;for(var e=at+n;at<e;++at)
-{if(op(this$1.lines[at])){return true}}};var BranchChunk=function BranchChunk(children){var this$1=this;this.children=children
-var size=0,height=0
-for(var i=0;i<children.length;++i){var ch=children[i]
-size+=ch.chunkSize();height+=ch.height
-ch.parent=this$1}
-this.size=size
-this.height=height
-this.parent=null};BranchChunk.prototype.chunkSize=function chunkSize(){return this.size};BranchChunk.prototype.removeInner=function removeInner(at,n){var this$1=this;this.size-=n
-for(var i=0;i<this.children.length;++i){var child=this$1.children[i],sz=child.chunkSize()
-if(at<sz){var rm=Math.min(n,sz-at),oldHeight=child.height
-child.removeInner(at,rm)
-this$1.height-=oldHeight-child.height
-if(sz==rm){this$1.children.splice(i--,1);child.parent=null}
-if((n-=rm)==0){break}
-at=0}else{at-=sz}}
-if(this.size-n<25&&(this.children.length>1||!(this.children[0]instanceof LeafChunk))){var lines=[]
-this.collapse(lines)
-this.children=[new LeafChunk(lines)]
-this.children[0].parent=this}};BranchChunk.prototype.collapse=function collapse(lines){var this$1=this;for(var i=0;i<this.children.length;++i){this$1.children[i].collapse(lines)}};BranchChunk.prototype.insertInner=function insertInner(at,lines,height){var this$1=this;this.size+=lines.length
-this.height+=height
-for(var i=0;i<this.children.length;++i){var child=this$1.children[i],sz=child.chunkSize()
-if(at<=sz){child.insertInner(at,lines,height)
-if(child.lines&&child.lines.length>50){var remaining=child.lines.length%25+25
-for(var pos=remaining;pos<child.lines.length;){var leaf=new LeafChunk(child.lines.slice(pos,pos+=25))
-child.height-=leaf.height
-this$1.children.splice(++i,0,leaf)
-leaf.parent=this$1}
-child.lines=child.lines.slice(0,remaining)
-this$1.maybeSpill()}
-break}
-at-=sz}};BranchChunk.prototype.maybeSpill=function maybeSpill(){if(this.children.length<=10){return}
-var me=this
-do{var spilled=me.children.splice(me.children.length-5,5)
-var sibling=new BranchChunk(spilled)
-if(!me.parent){var copy=new BranchChunk(me.children)
-copy.parent=me
-me.children=[copy,sibling]
-me=copy}else{me.size-=sibling.size
-me.height-=sibling.height
-var myIndex=indexOf(me.parent.children,me)
-me.parent.children.splice(myIndex+1,0,sibling)}
-sibling.parent=me.parent}while(me.children.length>10)
-me.parent.maybeSpill()};BranchChunk.prototype.iterN=function iterN(at,n,op){var this$1=this;for(var i=0;i<this.children.length;++i){var child=this$1.children[i],sz=child.chunkSize()
-if(at<sz){var used=Math.min(n,sz-at)
-if(child.iterN(at,used,op)){return true}
-if((n-=used)==0){break}
-at=0}else{at-=sz}}};var LineWidget=function LineWidget(doc,node,options){var this$1=this;if(options){for(var opt in options){if(options.hasOwnProperty(opt))
-{this$1[opt]=options[opt]}}}
-this.doc=doc
-this.node=node};LineWidget.prototype.clear=function clear(){var this$1=this;var cm=this.doc.cm,ws=this.line.widgets,line=this.line,no=lineNo(line)
-if(no==null||!ws){return}
-for(var i=0;i<ws.length;++i){if(ws[i]==this$1){ws.splice(i--,1)}}
-if(!ws.length){line.widgets=null}
-var height=widgetHeight(this)
-updateLineHeight(line,Math.max(0,line.height-height))
-if(cm){runInOp(cm,function(){adjustScrollWhenAboveVisible(cm,line,-height)
-regLineChange(cm,no,"widget")})
-signalLater(cm,"lineWidgetCleared",cm,this,no)}};LineWidget.prototype.changed=function changed(){var this$1=this;var oldH=this.height,cm=this.doc.cm,line=this.line
-this.height=null
-var diff=widgetHeight(this)-oldH
-if(!diff){return}
-updateLineHeight(line,line.height+diff)
-if(cm){runInOp(cm,function(){cm.curOp.forceUpdate=true
-adjustScrollWhenAboveVisible(cm,line,diff)
-signalLater(cm,"lineWidgetChanged",cm,this$1,lineNo(line))})}};eventMixin(LineWidget)
-function adjustScrollWhenAboveVisible(cm,line,diff){if(heightAtLine(line)<((cm.curOp&&cm.curOp.scrollTop)||cm.doc.scrollTop))
-{addToScrollPos(cm,null,diff)}}
-function addLineWidget(doc,handle,node,options){var widget=new LineWidget(doc,node,options)
-var cm=doc.cm
-if(cm&&widget.noHScroll){cm.display.alignWidgets=true}
-changeLine(doc,handle,"widget",function(line){var widgets=line.widgets||(line.widgets=[])
-if(widget.insertAt==null){widgets.push(widget)}
-else{widgets.splice(Math.min(widgets.length-1,Math.max(0,widget.insertAt)),0,widget)}
-widget.line=line
-if(cm&&!lineIsHidden(doc,line)){var aboveVisible=heightAtLine(line)<doc.scrollTop
-updateLineHeight(line,line.height+widgetHeight(widget))
-if(aboveVisible){addToScrollPos(cm,null,widget.height)}
-cm.curOp.forceUpdate=true}
-return true})
-signalLater(cm,"lineWidgetAdded",cm,widget,typeof handle=="number"?handle:lineNo(handle))
-return widget}
-var nextMarkerId=0
-var TextMarker=function TextMarker(doc,type){this.lines=[]
-this.type=type
-this.doc=doc
-this.id=++nextMarkerId};TextMarker.prototype.clear=function clear(){var this$1=this;if(this.explicitlyCleared){return}
-var cm=this.doc.cm,withOp=cm&&!cm.curOp
-if(withOp){startOperation(cm)}
-if(hasHandler(this,"clear")){var found=this.find()
-if(found){signalLater(this,"clear",found.from,found.to)}}
-var min=null,max=null
-for(var i=0;i<this.lines.length;++i){var line=this$1.lines[i]
-var span=getMarkedSpanFor(line.markedSpans,this$1)
-if(cm&&!this$1.collapsed){regLineChange(cm,lineNo(line),"text")}
-else if(cm){if(span.to!=null){max=lineNo(line)}
-if(span.from!=null){min=lineNo(line)}}
-line.markedSpans=removeMarkedSpan(line.markedSpans,span)
-if(span.from==null&&this$1.collapsed&&!lineIsHidden(this$1.doc,line)&&cm)
-{updateLineHeight(line,textHeight(cm.display))}}
-if(cm&&this.collapsed&&!cm.options.lineWrapping){for(var i$1=0;i$1<this.lines.length;++i$1){var visual=visualLine(this$1.lines[i$1]),len=lineLength(visual)
-if(len>cm.display.maxLineLength){cm.display.maxLine=visual
-cm.display.maxLineLength=len
-cm.display.maxLineChanged=true}}}
-if(min!=null&&cm&&this.collapsed){regChange(cm,min,max+1)}
-this.lines.length=0
-this.explicitlyCleared=true
-if(this.atomic&&this.doc.cantEdit){this.doc.cantEdit=false
-if(cm){reCheckSelection(cm.doc)}}
-if(cm){signalLater(cm,"markerCleared",cm,this,min,max)}
-if(withOp){endOperation(cm)}
-if(this.parent){this.parent.clear()}};TextMarker.prototype.find=function find(side,lineObj){var this$1=this;if(side==null&&this.type=="bookmark"){side=1}
-var from,to
-for(var i=0;i<this.lines.length;++i){var line=this$1.lines[i]
-var span=getMarkedSpanFor(line.markedSpans,this$1)
-if(span.from!=null){from=Pos(lineObj?line:lineNo(line),span.from)
-if(side==-1){return from}}
-if(span.to!=null){to=Pos(lineObj?line:lineNo(line),span.to)
-if(side==1){return to}}}
-return from&&{from:from,to:to}};TextMarker.prototype.changed=function changed(){var this$1=this;var pos=this.find(-1,true),widget=this,cm=this.doc.cm
-if(!pos||!cm){return}
-runInOp(cm,function(){var line=pos.line,lineN=lineNo(pos.line)
-var view=findViewForLine(cm,lineN)
-if(view){clearLineMeasurementCacheFor(view)
-cm.curOp.selectionChanged=cm.curOp.forceUpdate=true}
-cm.curOp.updateMaxLine=true
-if(!lineIsHidden(widget.doc,line)&&widget.height!=null){var oldHeight=widget.height
-widget.height=null
-var dHeight=widgetHeight(widget)-oldHeight
-if(dHeight)
-{updateLineHeight(line,line.height+dHeight)}}
-signalLater(cm,"markerChanged",cm,this$1)})};TextMarker.prototype.attachLine=function attachLine(line){if(!this.lines.length&&this.doc.cm){var op=this.doc.cm.curOp
-if(!op.maybeHiddenMarkers||indexOf(op.maybeHiddenMarkers,this)==-1)
-{(op.maybeUnhiddenMarkers||(op.maybeUnhiddenMarkers=[])).push(this)}}
-this.lines.push(line)};TextMarker.prototype.detachLine=function detachLine(line){this.lines.splice(indexOf(this.lines,line),1)
-if(!this.lines.length&&this.doc.cm){var op=this.doc.cm.curOp;(op.maybeHiddenMarkers||(op.maybeHiddenMarkers=[])).push(this)}};eventMixin(TextMarker)
-function markText(doc,from,to,options,type){if(options&&options.shared){return markTextShared(doc,from,to,options,type)}
-if(doc.cm&&!doc.cm.curOp){return operation(doc.cm,markText)(doc,from,to,options,type)}
-var marker=new TextMarker(doc,type),diff=cmp(from,to)
-if(options){copyObj(options,marker,false)}
-if(diff>0||diff==0&&marker.clearWhenEmpty!==false)
-{return marker}
-if(marker.replacedWith){marker.collapsed=true
-marker.widgetNode=eltP("span",[marker.replacedWith],"CodeMirror-widget")
-if(!options.handleMouseEvents){marker.widgetNode.setAttribute("cm-ignore-events","true")}
-if(options.insertLeft){marker.widgetNode.insertLeft=true}}
-if(marker.collapsed){if(conflictingCollapsedRange(doc,from.line,from,to,marker)||from.line!=to.line&&conflictingCollapsedRange(doc,to.line,from,to,marker))
-{throw new Error("Inserting collapsed marker partially overlapping an existing one")}
-seeCollapsedSpans()}
-if(marker.addToHistory)
-{addChangeToHistory(doc,{from:from,to:to,origin:"markText"},doc.sel,NaN)}
-var curLine=from.line,cm=doc.cm,updateMaxLine
-doc.iter(curLine,to.line+1,function(line){if(cm&&marker.collapsed&&!cm.options.lineWrapping&&visualLine(line)==cm.display.maxLine)
-{updateMaxLine=true}
-if(marker.collapsed&&curLine!=from.line){updateLineHeight(line,0)}
-addMarkedSpan(line,new MarkedSpan(marker,curLine==from.line?from.ch:null,curLine==to.line?to.ch:null))
-++curLine})
-if(marker.collapsed){doc.iter(from.line,to.line+1,function(line){if(lineIsHidden(doc,line)){updateLineHeight(line,0)}})}
-if(marker.clearOnEnter){on(marker,"beforeCursorEnter",function(){return marker.clear();})}
-if(marker.readOnly){seeReadOnlySpans()
-if(doc.history.done.length||doc.history.undone.length)
-{doc.clearHistory()}}
-if(marker.collapsed){marker.id=++nextMarkerId
-marker.atomic=true}
-if(cm){if(updateMaxLine){cm.curOp.updateMaxLine=true}
-if(marker.collapsed)
-{regChange(cm,from.line,to.line+1)}
-else if(marker.className||marker.title||marker.startStyle||marker.endStyle||marker.css)
-{for(var i=from.line;i<=to.line;i++){regLineChange(cm,i,"text")}}
-if(marker.atomic){reCheckSelection(cm.doc)}
-signalLater(cm,"markerAdded",cm,marker)}
-return marker}
-var SharedTextMarker=function SharedTextMarker(markers,primary){var this$1=this;this.markers=markers
-this.primary=primary
-for(var i=0;i<markers.length;++i)
-{markers[i].parent=this$1}};SharedTextMarker.prototype.clear=function clear(){var this$1=this;if(this.explicitlyCleared){return}
-this.explicitlyCleared=true
-for(var i=0;i<this.markers.length;++i)
-{this$1.markers[i].clear()}
-signalLater(this,"clear")};SharedTextMarker.prototype.find=function find(side,lineObj){return this.primary.find(side,lineObj)};eventMixin(SharedTextMarker)
-function markTextShared(doc,from,to,options,type){options=copyObj(options)
-options.shared=false
-var markers=[markText(doc,from,to,options,type)],primary=markers[0]
-var widget=options.widgetNode
-linkedDocs(doc,function(doc){if(widget){options.widgetNode=widget.cloneNode(true)}
-markers.push(markText(doc,clipPos(doc,from),clipPos(doc,to),options,type))
-for(var i=0;i<doc.linked.length;++i)
-{if(doc.linked[i].isParent){return}}
-primary=lst(markers)})
-return new SharedTextMarker(markers,primary)}
-function findSharedMarkers(doc){return doc.findMarks(Pos(doc.first,0),doc.clipPos(Pos(doc.lastLine())),function(m){return m.parent;})}
-function copySharedMarkers(doc,markers){for(var i=0;i<markers.length;i++){var marker=markers[i],pos=marker.find()
-var mFrom=doc.clipPos(pos.from),mTo=doc.clipPos(pos.to)
-if(cmp(mFrom,mTo)){var subMark=markText(doc,mFrom,mTo,marker.primary,marker.primary.type)
-marker.markers.push(subMark)
-subMark.parent=marker}}}
-function detachSharedMarkers(markers){var loop=function(i){var marker=markers[i],linked=[marker.primary.doc]
-linkedDocs(marker.primary.doc,function(d){return linked.push(d);})
-for(var j=0;j<marker.markers.length;j++){var subMarker=marker.markers[j]
-if(indexOf(linked,subMarker.doc)==-1){subMarker.parent=null
-marker.markers.splice(j--,1)}}};for(var i=0;i<markers.length;i++)loop(i);}
-var nextDocId=0
-var Doc=function(text,mode,firstLine,lineSep,direction){if(!(this instanceof Doc)){return new Doc(text,mode,firstLine,lineSep,direction)}
-if(firstLine==null){firstLine=0}
-BranchChunk.call(this,[new LeafChunk([new Line("",null)])])
-this.first=firstLine
-this.scrollTop=this.scrollLeft=0
-this.cantEdit=false
-this.cleanGeneration=1
-this.frontier=firstLine
-var start=Pos(firstLine,0)
-this.sel=simpleSelection(start)
-this.history=new History(null)
-this.id=++nextDocId
-this.modeOption=mode
-this.lineSep=lineSep
-this.direction=(direction=="rtl")?"rtl":"ltr"
-this.extend=false
-if(typeof text=="string"){text=this.splitLines(text)}
-updateDoc(this,{from:start,to:start,text:text})
-setSelection(this,simpleSelection(start),sel_dontScroll)}
-Doc.prototype=createObj(BranchChunk.prototype,{constructor:Doc,iter:function(from,to,op){if(op){this.iterN(from-this.first,to-from,op)}
-else{this.iterN(this.first,this.first+this.size,from)}},insert:function(at,lines){var height=0
-for(var i=0;i<lines.length;++i){height+=lines[i].height}
-this.insertInner(at-this.first,lines,height)},remove:function(at,n){this.removeInner(at-this.first,n)},getValue:function(lineSep){var lines=getLines(this,this.first,this.first+this.size)
-if(lineSep===false){return lines}
-return lines.join(lineSep||this.lineSeparator())},setValue:docMethodOp(function(code){var top=Pos(this.first,0),last=this.first+this.size-1
-makeChange(this,{from:top,to:Pos(last,getLine(this,last).text.length),text:this.splitLines(code),origin:"setValue",full:true},true)
-setSelection(this,simpleSelection(top))}),replaceRange:function(code,from,to,origin){from=clipPos(this,from)
-to=to?clipPos(this,to):from
-replaceRange(this,code,from,to,origin)},getRange:function(from,to,lineSep){var lines=getBetween(this,clipPos(this,from),clipPos(this,to))
-if(lineSep===false){return lines}
-return lines.join(lineSep||this.lineSeparator())},getLine:function(line){var l=this.getLineHandle(line);return l&&l.text},getLineHandle:function(line){if(isLine(this,line)){return getLine(this,line)}},getLineNumber:function(line){return lineNo(line)},getLineHandleVisualStart:function(line){if(typeof line=="number"){line=getLine(this,line)}
-return visualLine(line)},lineCount:function(){return this.size},firstLine:function(){return this.first},lastLine:function(){return this.first+this.size-1},clipPos:function(pos){return clipPos(this,pos)},getCursor:function(start){var range=this.sel.primary(),pos
-if(start==null||start=="head"){pos=range.head}
-else if(start=="anchor"){pos=range.anchor}
-else if(start=="end"||start=="to"||start===false){pos=range.to()}
-else{pos=range.from()}
-return pos},listSelections:function(){return this.sel.ranges},somethingSelected:function(){return this.sel.somethingSelected()},setCursor:docMethodOp(function(line,ch,options){setSimpleSelection(this,clipPos(this,typeof line=="number"?Pos(line,ch||0):line),null,options)}),setSelection:docMethodOp(function(anchor,head,options){setSimpleSelection(this,clipPos(this,anchor),clipPos(this,head||anchor),options)}),extendSelection:docMethodOp(function(head,other,options){extendSelection(this,clipPos(this,head),other&&clipPos(this,other),options)}),extendSelections:docMethodOp(function(heads,options){extendSelections(this,clipPosArray(this,heads),options)}),extendSelectionsBy:docMethodOp(function(f,options){var heads=map(this.sel.ranges,f)
-extendSelections(this,clipPosArray(this,heads),options)}),setSelections:docMethodOp(function(ranges,primary,options){var this$1=this;if(!ranges.length){return}
-var out=[]
-for(var i=0;i<ranges.length;i++)
-{out[i]=new Range(clipPos(this$1,ranges[i].anchor),clipPos(this$1,ranges[i].head))}
-if(primary==null){primary=Math.min(ranges.length-1,this.sel.primIndex)}
-setSelection(this,normalizeSelection(out,primary),options)}),addSelection:docMethodOp(function(anchor,head,options){var ranges=this.sel.ranges.slice(0)
-ranges.push(new Range(clipPos(this,anchor),clipPos(this,head||anchor)))
-setSelection(this,normalizeSelection(ranges,ranges.length-1),options)}),getSelection:function(lineSep){var this$1=this;var ranges=this.sel.ranges,lines
-for(var i=0;i<ranges.length;i++){var sel=getBetween(this$1,ranges[i].from(),ranges[i].to())
-lines=lines?lines.concat(sel):sel}
-if(lineSep===false){return lines}
-else{return lines.join(lineSep||this.lineSeparator())}},getSelections:function(lineSep){var this$1=this;var parts=[],ranges=this.sel.ranges
-for(var i=0;i<ranges.length;i++){var sel=getBetween(this$1,ranges[i].from(),ranges[i].to())
-if(lineSep!==false){sel=sel.join(lineSep||this$1.lineSeparator())}
-parts[i]=sel}
-return parts},replaceSelection:function(code,collapse,origin){var dup=[]
-for(var i=0;i<this.sel.ranges.length;i++)
-{dup[i]=code}
-this.replaceSelections(dup,collapse,origin||"+input")},replaceSelections:docMethodOp(function(code,collapse,origin){var this$1=this;var changes=[],sel=this.sel
-for(var i=0;i<sel.ranges.length;i++){var range=sel.ranges[i]
-changes[i]={from:range.from(),to:range.to(),text:this$1.splitLines(code[i]),origin:origin}}
-var newSel=collapse&&collapse!="end"&&computeReplacedSel(this,changes,collapse)
-for(var i$1=changes.length-1;i$1>=0;i$1--)
-{makeChange(this$1,changes[i$1])}
-if(newSel){setSelectionReplaceHistory(this,newSel)}
-else if(this.cm){ensureCursorVisible(this.cm)}}),undo:docMethodOp(function(){makeChangeFromHistory(this,"undo")}),redo:docMethodOp(function(){makeChangeFromHistory(this,"redo")}),undoSelection:docMethodOp(function(){makeChangeFromHistory(this,"undo",true)}),redoSelection:docMethodOp(function(){makeChangeFromHistory(this,"redo",true)}),setExtending:function(val){this.extend=val},getExtending:function(){return this.extend},historySize:function(){var hist=this.history,done=0,undone=0
-for(var i=0;i<hist.done.length;i++){if(!hist.done[i].ranges){++done}}
-for(var i$1=0;i$1<hist.undone.length;i$1++){if(!hist.undone[i$1].ranges){++undone}}
-return{undo:done,redo:undone}},clearHistory:function(){this.history=new History(this.history.maxGeneration)},markClean:function(){this.cleanGeneration=this.changeGeneration(true)},changeGeneration:function(forceSplit){if(forceSplit)
-{this.history.lastOp=this.history.lastSelOp=this.history.lastOrigin=null}
-return this.history.generation},isClean:function(gen){return this.history.generation==(gen||this.cleanGeneration)},getHistory:function(){return{done:copyHistoryArray(this.history.done),undone:copyHistoryArray(this.history.undone)}},setHistory:function(histData){var hist=this.history=new History(this.history.maxGeneration)
-hist.done=copyHistoryArray(histData.done.slice(0),null,true)
-hist.undone=copyHistoryArray(histData.undone.slice(0),null,true)},setGutterMarker:docMethodOp(function(line,gutterID,value){return changeLine(this,line,"gutter",function(line){var markers=line.gutterMarkers||(line.gutterMarkers={})
-markers[gutterID]=value
-if(!value&&isEmpty(markers)){line.gutterMarkers=null}
-return true})}),clearGutter:docMethodOp(function(gutterID){var this$1=this;this.iter(function(line){if(line.gutterMarkers&&line.gutterMarkers[gutterID]){changeLine(this$1,line,"gutter",function(){line.gutterMarkers[gutterID]=null
-if(isEmpty(line.gutterMarkers)){line.gutterMarkers=null}
-return true})}})}),lineInfo:function(line){var n
-if(typeof line=="number"){if(!isLine(this,line)){return null}
-n=line
-line=getLine(this,line)
-if(!line){return null}}else{n=lineNo(line)
-if(n==null){return null}}
-return{line:n,handle:line,text:line.text,gutterMarkers:line.gutterMarkers,textClass:line.textClass,bgClass:line.bgClass,wrapClass:line.wrapClass,widgets:line.widgets}},addLineClass:docMethodOp(function(handle,where,cls){return changeLine(this,handle,where=="gutter"?"gutter":"class",function(line){var prop=where=="text"?"textClass":where=="background"?"bgClass":where=="gutter"?"gutterClass":"wrapClass"
-if(!line[prop]){line[prop]=cls}
-else if(classTest(cls).test(line[prop])){return false}
-else{line[prop]+=" "+cls}
-return true})}),removeLineClass:docMethodOp(function(handle,where,cls){return changeLine(this,handle,where=="gutter"?"gutter":"class",function(line){var prop=where=="text"?"textClass":where=="background"?"bgClass":where=="gutter"?"gutterClass":"wrapClass"
-var cur=line[prop]
-if(!cur){return false}
-else if(cls==null){line[prop]=null}
-else{var found=cur.match(classTest(cls))
-if(!found){return false}
-var end=found.index+found[0].length
-line[prop]=cur.slice(0,found.index)+(!found.index||end==cur.length?"":" ")+cur.slice(end)||null}
-return true})}),addLineWidget:docMethodOp(function(handle,node,options){return addLineWidget(this,handle,node,options)}),removeLineWidget:function(widget){widget.clear()},markText:function(from,to,options){return markText(this,clipPos(this,from),clipPos(this,to),options,options&&options.type||"range")},setBookmark:function(pos,options){var realOpts={replacedWith:options&&(options.nodeType==null?options.widget:options),insertLeft:options&&options.insertLeft,clearWhenEmpty:false,shared:options&&options.shared,handleMouseEvents:options&&options.handleMouseEvents}
-pos=clipPos(this,pos)
-return markText(this,pos,pos,realOpts,"bookmark")},findMarksAt:function(pos){pos=clipPos(this,pos)
-var markers=[],spans=getLine(this,pos.line).markedSpans
-if(spans){for(var i=0;i<spans.length;++i){var span=spans[i]
-if((span.from==null||span.from<=pos.ch)&&(span.to==null||span.to>=pos.ch))
-{markers.push(span.marker.parent||span.marker)}}}
-return markers},findMarks:function(from,to,filter){from=clipPos(this,from);to=clipPos(this,to)
-var found=[],lineNo=from.line
-this.iter(from.line,to.line+1,function(line){var spans=line.markedSpans
-if(spans){for(var i=0;i<spans.length;i++){var span=spans[i]
-if(!(span.to!=null&&lineNo==from.line&&from.ch>=span.to||span.from==null&&lineNo!=from.line||span.from!=null&&lineNo==to.line&&span.from>=to.ch)&&(!filter||filter(span.marker)))
-{found.push(span.marker.parent||span.marker)}}}
-++lineNo})
-return found},getAllMarks:function(){var markers=[]
-this.iter(function(line){var sps=line.markedSpans
-if(sps){for(var i=0;i<sps.length;++i)
-{if(sps[i].from!=null){markers.push(sps[i].marker)}}}})
-return markers},posFromIndex:function(off){var ch,lineNo=this.first,sepSize=this.lineSeparator().length
-this.iter(function(line){var sz=line.text.length+sepSize
-if(sz>off){ch=off;return true}
-off-=sz
-++lineNo})
-return clipPos(this,Pos(lineNo,ch))},indexFromPos:function(coords){coords=clipPos(this,coords)
-var index=coords.ch
-if(coords.line<this.first||coords.ch<0){return 0}
-var sepSize=this.lineSeparator().length
-this.iter(this.first,coords.line,function(line){index+=line.text.length+sepSize})
-return index},copy:function(copyHistory){var doc=new Doc(getLines(this,this.first,this.first+this.size),this.modeOption,this.first,this.lineSep,this.direction)
-doc.scrollTop=this.scrollTop;doc.scrollLeft=this.scrollLeft
-doc.sel=this.sel
-doc.extend=false
-if(copyHistory){doc.history.undoDepth=this.history.undoDepth
-doc.setHistory(this.getHistory())}
-return doc},linkedDoc:function(options){if(!options){options={}}
-var from=this.first,to=this.first+this.size
-if(options.from!=null&&options.from>from){from=options.from}
-if(options.to!=null&&options.to<to){to=options.to}
-var copy=new Doc(getLines(this,from,to),options.mode||this.modeOption,from,this.lineSep,this.direction)
-if(options.sharedHist){copy.history=this.history;}(this.linked||(this.linked=[])).push({doc:copy,sharedHist:options.sharedHist})
-copy.linked=[{doc:this,isParent:true,sharedHist:options.sharedHist}]
-copySharedMarkers(copy,findSharedMarkers(this))
-return copy},unlinkDoc:function(other){var this$1=this;if(other instanceof CodeMirror){other=other.doc}
-if(this.linked){for(var i=0;i<this.linked.length;++i){var link=this$1.linked[i]
-if(link.doc!=other){continue}
-this$1.linked.splice(i,1)
-other.unlinkDoc(this$1)
-detachSharedMarkers(findSharedMarkers(this$1))
-break}}
-if(other.history==this.history){var splitIds=[other.id]
-linkedDocs(other,function(doc){return splitIds.push(doc.id);},true)
-other.history=new History(null)
-other.history.done=copyHistoryArray(this.history.done,splitIds)
-other.history.undone=copyHistoryArray(this.history.undone,splitIds)}},iterLinkedDocs:function(f){linkedDocs(this,f)},getMode:function(){return this.mode},getEditor:function(){return this.cm},splitLines:function(str){if(this.lineSep){return str.split(this.lineSep)}
-return splitLinesAuto(str)},lineSeparator:function(){return this.lineSep||"\n"},setDirection:docMethodOp(function(dir){if(dir!="rtl"){dir="ltr"}
-if(dir==this.direction){return}
-this.direction=dir
-this.iter(function(line){return line.order=null;})
-if(this.cm){directionChanged(this.cm)}})})
-Doc.prototype.eachLine=Doc.prototype.iter
-var lastDrop=0
-function onDrop(e){var cm=this
-clearDragCursor(cm)
-if(signalDOMEvent(cm,e)||eventInWidget(cm.display,e))
-{return}
-e_preventDefault(e)
-if(ie){lastDrop=+new Date}
-var pos=posFromMouse(cm,e,true),files=e.dataTransfer.files
-if(!pos||cm.isReadOnly()){return}
-if(files&&files.length&&window.FileReader&&window.File){var n=files.length,text=Array(n),read=0
-var loadFile=function(file,i){if(cm.options.allowDropFileTypes&&indexOf(cm.options.allowDropFileTypes,file.type)==-1)
-{return}
-var reader=new FileReader
-reader.onload=operation(cm,function(){var content=reader.result
-if(/[\x00-\x08\x0e-\x1f]{2}/.test(content)){content=""}
-text[i]=content
-if(++read==n){pos=clipPos(cm.doc,pos)
-var change={from:pos,to:pos,text:cm.doc.splitLines(text.join(cm.doc.lineSeparator())),origin:"paste"}
-makeChange(cm.doc,change)
-setSelectionReplaceHistory(cm.doc,simpleSelection(pos,changeEnd(change)))}})
-reader.readAsText(file)}
-for(var i=0;i<n;++i){loadFile(files[i],i)}}else{if(cm.state.draggingText&&cm.doc.sel.contains(pos)>-1){cm.state.draggingText(e)
-setTimeout(function(){return cm.display.input.focus();},20)
-return}
-try{var text$1=e.dataTransfer.getData("Text")
-if(text$1){var selected
-if(cm.state.draggingText&&!cm.state.draggingText.copy)
-{selected=cm.listSelections()}
-setSelectionNoUndo(cm.doc,simpleSelection(pos,pos))
-if(selected){for(var i$1=0;i$1<selected.length;++i$1)
-{replaceRange(cm.doc,"",selected[i$1].anchor,selected[i$1].head,"drag")}}
-cm.replaceSelection(text$1,"around","paste")
-cm.display.input.focus()}}
-catch(e){}}}
-function onDragStart(cm,e){if(ie&&(!cm.state.draggingText||+new Date-lastDrop<100)){e_stop(e);return}
-if(signalDOMEvent(cm,e)||eventInWidget(cm.display,e)){return}
-e.dataTransfer.setData("Text",cm.getSelection())
-e.dataTransfer.effectAllowed="copyMove"
-if(e.dataTransfer.setDragImage&&!safari){var img=elt("img",null,null,"position: fixed; left: 0; top: 0;")
-img.src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="
-if(presto){img.width=img.height=1
-cm.display.wrapper.appendChild(img)
-img._top=img.offsetTop}
-e.dataTransfer.setDragImage(img,0,0)
-if(presto){img.parentNode.removeChild(img)}}}
-function onDragOver(cm,e){var pos=posFromMouse(cm,e)
-if(!pos){return}
-var frag=document.createDocumentFragment()
-drawSelectionCursor(cm,pos,frag)
-if(!cm.display.dragCursor){cm.display.dragCursor=elt("div",null,"CodeMirror-cursors CodeMirror-dragcursors")
-cm.display.lineSpace.insertBefore(cm.display.dragCursor,cm.display.cursorDiv)}
-removeChildrenAndAdd(cm.display.dragCursor,frag)}
-function clearDragCursor(cm){if(cm.display.dragCursor){cm.display.lineSpace.removeChild(cm.display.dragCursor)
-cm.display.dragCursor=null}}
-function forEachCodeMirror(f){if(!document.body.getElementsByClassName){return}
-var byClass=document.body.getElementsByClassName("CodeMirror")
-for(var i=0;i<byClass.length;i++){var cm=byClass[i].CodeMirror
-if(cm){f(cm)}}}
-var globalsRegistered=false
-function ensureGlobalHandlers(){if(globalsRegistered){return}
-registerGlobalHandlers()
-globalsRegistered=true}
-function registerGlobalHandlers(){var resizeTimer
-on(window,"resize",function(){if(resizeTimer==null){resizeTimer=setTimeout(function(){resizeTimer=null
-forEachCodeMirror(onResize)},100)}})
-on(window,"blur",function(){return forEachCodeMirror(onBlur);})}
-function onResize(cm){var d=cm.display
-if(d.lastWrapHeight==d.wrapper.clientHeight&&d.lastWrapWidth==d.wrapper.clientWidth)
-{return}
-d.cachedCharWidth=d.cachedTextHeight=d.cachedPaddingH=null
-d.scrollbarsClipped=false
-cm.setSize()}
-var keyNames={3:"Enter",8:"Backspace",9:"Tab",13:"Enter",16:"Shift",17:"Ctrl",18:"Alt",19:"Pause",20:"CapsLock",27:"Esc",32:"Space",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"Left",38:"Up",39:"Right",40:"Down",44:"PrintScrn",45:"Insert",46:"Delete",59:";",61:"=",91:"Mod",92:"Mod",93:"Mod",106:"*",107:"=",109:"-",110:".",111:"/",127:"Delete",173:"-",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'",63232:"Up",63233:"Down",63234:"Left",63235:"Right",63272:"Delete",63273:"Home",63275:"End",63276:"PageUp",63277:"PageDown",63302:"Insert"}
-for(var i=0;i<10;i++){keyNames[i+48]=keyNames[i+96]=String(i)}
-for(var i$1=65;i$1<=90;i$1++){keyNames[i$1]=String.fromCharCode(i$1)}
-for(var i$2=1;i$2<=12;i$2++){keyNames[i$2+111]=keyNames[i$2+63235]="F"+i$2}
-var keyMap={}
-keyMap.basic={"Left":"goCharLeft","Right":"goCharRight","Up":"goLineUp","Down":"goLineDown","End":"goLineEnd","Home":"goLineStartSmart","PageUp":"goPageUp","PageDown":"goPageDown","Delete":"delCharAfter","Backspace":"delCharBefore","Shift-Backspace":"delCharBefore","Tab":"defaultTab","Shift-Tab":"indentAuto","Enter":"newlineAndIndent","Insert":"toggleOverwrite","Esc":"singleSelection"}
-keyMap.pcDefault={"Ctrl-A":"selectAll","Ctrl-D":"deleteLine","Ctrl-Z":"undo","Shift-Ctrl-Z":"redo","Ctrl-Y":"redo","Ctrl-Home":"goDocStart","Ctrl-End":"goDocEnd","Ctrl-Up":"goLineUp","Ctrl-Down":"goLineDown","Ctrl-Left":"goGroupLeft","Ctrl-Right":"goGroupRight","Alt-Left":"goLineStart","Alt-Right":"goLineEnd","Ctrl-Backspace":"delGroupBefore","Ctrl-Delete":"delGroupAfter","Ctrl-S":"save","Ctrl-F":"find","Ctrl-G":"findNext","Shift-Ctrl-G":"findPrev","Shift-Ctrl-F":"replace","Shift-Ctrl-R":"replaceAll","Ctrl-[":"indentLess","Ctrl-]":"indentMore","Ctrl-U":"undoSelection","Shift-Ctrl-U":"redoSelection","Alt-U":"redoSelection",fallthrough:"basic"}
-keyMap.emacsy={"Ctrl-F":"goCharRight","Ctrl-B":"goCharLeft","Ctrl-P":"goLineUp","Ctrl-N":"goLineDown","Alt-F":"goWordRight","Alt-B":"goWordLeft","Ctrl-A":"goLineStart","Ctrl-E":"goLineEnd","Ctrl-V":"goPageDown","Shift-Ctrl-V":"goPageUp","Ctrl-D":"delCharAfter","Ctrl-H":"delCharBefore","Alt-D":"delWordAfter","Alt-Backspace":"delWordBefore","Ctrl-K":"killLine","Ctrl-T":"transposeChars","Ctrl-O":"openLine"}
-keyMap.macDefault={"Cmd-A":"selectAll","Cmd-D":"deleteLine","Cmd-Z":"undo","Shift-Cmd-Z":"redo","Cmd-Y":"redo","Cmd-Home":"goDocStart","Cmd-Up":"goDocStart","Cmd-End":"goDocEnd","Cmd-Down":"goDocEnd","Alt-Left":"goGroupLeft","Alt-Right":"goGroupRight","Cmd-Left":"goLineLeft","Cmd-Right":"goLineRight","Alt-Backspace":"delGroupBefore","Ctrl-Alt-Backspace":"delGroupAfter","Alt-Delete":"delGroupAfter","Cmd-S":"save","Cmd-F":"find","Cmd-G":"findNext","Shift-Cmd-G":"findPrev","Cmd-Alt-F":"replace","Shift-Cmd-Alt-F":"replaceAll","Cmd-[":"indentLess","Cmd-]":"indentMore","Cmd-Backspace":"delWrappedLineLeft","Cmd-Delete":"delWrappedLineRight","Cmd-U":"undoSelection","Shift-Cmd-U":"redoSelection","Ctrl-Up":"goDocStart","Ctrl-Down":"goDocEnd",fallthrough:["basic","emacsy"]}
-keyMap["default"]=mac?keyMap.macDefault:keyMap.pcDefault
-function normalizeKeyName(name){var parts=name.split(/-(?!$)/)
-name=parts[parts.length-1]
-var alt,ctrl,shift,cmd
-for(var i=0;i<parts.length-1;i++){var mod=parts[i]
-if(/^(cmd|meta|m)$/i.test(mod)){cmd=true}
-else if(/^a(lt)?$/i.test(mod)){alt=true}
-else if(/^(c|ctrl|control)$/i.test(mod)){ctrl=true}
-else if(/^s(hift)?$/i.test(mod)){shift=true}
-else{throw new Error("Unrecognized modifier name: "+mod)}}
-if(alt){name="Alt-"+name}
-if(ctrl){name="Ctrl-"+name}
-if(cmd){name="Cmd-"+name}
-if(shift){name="Shift-"+name}
-return name}
-function normalizeKeyMap(keymap){var copy={}
-for(var keyname in keymap){if(keymap.hasOwnProperty(keyname)){var value=keymap[keyname]
-if(/^(name|fallthrough|(de|at)tach)$/.test(keyname)){continue}
-if(value=="..."){delete keymap[keyname];continue}
-var keys=map(keyname.split(" "),normalizeKeyName)
-for(var i=0;i<keys.length;i++){var val=(void 0),name=(void 0)
-if(i==keys.length-1){name=keys.join(" ")
-val=value}else{name=keys.slice(0,i+1).join(" ")
-val="..."}
-var prev=copy[name]
-if(!prev){copy[name]=val}
-else if(prev!=val){throw new Error("Inconsistent bindings for "+name)}}
-delete keymap[keyname]}}
-for(var prop in copy){keymap[prop]=copy[prop]}
-return keymap}
-function lookupKey(key,map,handle,context){map=getKeyMap(map)
-var found=map.call?map.call(key,context):map[key]
-if(found===false){return"nothing"}
-if(found==="..."){return"multi"}
-if(found!=null&&handle(found)){return"handled"}
-if(map.fallthrough){if(Object.prototype.toString.call(map.fallthrough)!="[object Array]")
-{return lookupKey(key,map.fallthrough,handle,context)}
-for(var i=0;i<map.fallthrough.length;i++){var result=lookupKey(key,map.fallthrough[i],handle,context)
-if(result){return result}}}}
-function isModifierKey(value){var name=typeof value=="string"?value:keyNames[value.keyCode]
-return name=="Ctrl"||name=="Alt"||name=="Shift"||name=="Mod"}
-function keyName(event,noShift){if(presto&&event.keyCode==34&&event["char"]){return false}
-var base=keyNames[event.keyCode],name=base
-if(name==null||event.altGraphKey){return false}
-if(event.altKey&&base!="Alt"){name="Alt-"+name}
-if((flipCtrlCmd?event.metaKey:event.ctrlKey)&&base!="Ctrl"){name="Ctrl-"+name}
-if((flipCtrlCmd?event.ctrlKey:event.metaKey)&&base!="Cmd"){name="Cmd-"+name}
-if(!noShift&&event.shiftKey&&base!="Shift"){name="Shift-"+name}
-return name}
-function getKeyMap(val){return typeof val=="string"?keyMap[val]:val}
-function deleteNearSelection(cm,compute){var ranges=cm.doc.sel.ranges,kill=[]
-for(var i=0;i<ranges.length;i++){var toKill=compute(ranges[i])
-while(kill.length&&cmp(toKill.from,lst(kill).to)<=0){var replaced=kill.pop()
-if(cmp(replaced.from,toKill.from)<0){toKill.from=replaced.from
-break}}
-kill.push(toKill)}
-runInOp(cm,function(){for(var i=kill.length-1;i>=0;i--)
-{replaceRange(cm.doc,"",kill[i].from,kill[i].to,"+delete")}
-ensureCursorVisible(cm)})}
-var commands={selectAll:selectAll,singleSelection:function(cm){return cm.setSelection(cm.getCursor("anchor"),cm.getCursor("head"),sel_dontScroll);},killLine:function(cm){return deleteNearSelection(cm,function(range){if(range.empty()){var len=getLine(cm.doc,range.head.line).text.length
-if(range.head.ch==len&&range.head.line<cm.lastLine())
-{return{from:range.head,to:Pos(range.head.line+1,0)}}
-else
-{return{from:range.head,to:Pos(range.head.line,len)}}}else{return{from:range.from(),to:range.to()}}});},deleteLine:function(cm){return deleteNearSelection(cm,function(range){return({from:Pos(range.from().line,0),to:clipPos(cm.doc,Pos(range.to().line+1,0))});});},delLineLeft:function(cm){return deleteNearSelection(cm,function(range){return({from:Pos(range.from().line,0),to:range.from()});});},delWrappedLineLeft:function(cm){return deleteNearSelection(cm,function(range){var top=cm.charCoords(range.head,"div").top+5
-var leftPos=cm.coordsChar({left:0,top:top},"div")
-return{from:leftPos,to:range.from()}});},delWrappedLineRight:function(cm){return deleteNearSelection(cm,function(range){var top=cm.charCoords(range.head,"div").top+5
-var rightPos=cm.coordsChar({left:cm.display.lineDiv.offsetWidth+100,top:top},"div")
-return{from:range.from(),to:rightPos}});},undo:function(cm){return cm.undo();},redo:function(cm){return cm.redo();},undoSelection:function(cm){return cm.undoSelection();},redoSelection:function(cm){return cm.redoSelection();},goDocStart:function(cm){return cm.extendSelection(Pos(cm.firstLine(),0));},goDocEnd:function(cm){return cm.extendSelection(Pos(cm.lastLine()));},goLineStart:function(cm){return cm.extendSelectionsBy(function(range){return lineStart(cm,range.head.line);},{origin:"+move",bias:1});},goLineStartSmart:function(cm){return cm.extendSelectionsBy(function(range){return lineStartSmart(cm,range.head);},{origin:"+move",bias:1});},goLineEnd:function(cm){return cm.extendSelectionsBy(function(range){return lineEnd(cm,range.head.line);},{origin:"+move",bias:-1});},goLineRight:function(cm){return cm.extendSelectionsBy(function(range){var top=cm.charCoords(range.head,"div").top+5
-return cm.coordsChar({left:cm.display.lineDiv.offsetWidth+100,top:top},"div")},sel_move);},goLineLeft:function(cm){return cm.extendSelectionsBy(function(range){var top=cm.charCoords(range.head,"div").top+5
-return cm.coordsChar({left:0,top:top},"div")},sel_move);},goLineLeftSmart:function(cm){return cm.extendSelectionsBy(function(range){var top=cm.charCoords(range.head,"div").top+5
-var pos=cm.coordsChar({left:0,top:top},"div")
-if(pos.ch<cm.getLine(pos.line).search(/\S/)){return lineStartSmart(cm,range.head)}
-return pos},sel_move);},goLineUp:function(cm){return cm.moveV(-1,"line");},goLineDown:function(cm){return cm.moveV(1,"line");},goPageUp:function(cm){return cm.moveV(-1,"page");},goPageDown:function(cm){return cm.moveV(1,"page");},goCharLeft:function(cm){return cm.moveH(-1,"char");},goCharRight:function(cm){return cm.moveH(1,"char");},goColumnLeft:function(cm){return cm.moveH(-1,"column");},goColumnRight:function(cm){return cm.moveH(1,"column");},goWordLeft:function(cm){return cm.moveH(-1,"word");},goGroupRight:function(cm){return cm.moveH(1,"group");},goGroupLeft:function(cm){return cm.moveH(-1,"group");},goWordRight:function(cm){return cm.moveH(1,"word");},delCharBefore:function(cm){return cm.deleteH(-1,"char");},delCharAfter:function(cm){return cm.deleteH(1,"char");},delWordBefore:function(cm){return cm.deleteH(-1,"word");},delWordAfter:function(cm){return cm.deleteH(1,"word");},delGroupBefore:function(cm){return cm.deleteH(-1,"group");},delGroupAfter:function(cm){return cm.deleteH(1,"group");},indentAuto:function(cm){return cm.indentSelection("smart");},indentMore:function(cm){return cm.indentSelection("add");},indentLess:function(cm){return cm.indentSelection("subtract");},insertTab:function(cm){return cm.replaceSelection("\t");},insertSoftTab:function(cm){var spaces=[],ranges=cm.listSelections(),tabSize=cm.options.tabSize
-for(var i=0;i<ranges.length;i++){var pos=ranges[i].from()
-var col=countColumn(cm.getLine(pos.line),pos.ch,tabSize)
-spaces.push(spaceStr(tabSize-col%tabSize))}
-cm.replaceSelections(spaces)},defaultTab:function(cm){if(cm.somethingSelected()){cm.indentSelection("add")}
-else{cm.execCommand("insertTab")}},transposeChars:function(cm){return runInOp(cm,function(){var ranges=cm.listSelections(),newSel=[]
-for(var i=0;i<ranges.length;i++){if(!ranges[i].empty()){continue}
-var cur=ranges[i].head,line=getLine(cm.doc,cur.line).text
-if(line){if(cur.ch==line.length){cur=new Pos(cur.line,cur.ch-1)}
-if(cur.ch>0){cur=new Pos(cur.line,cur.ch+1)
-cm.replaceRange(line.charAt(cur.ch-1)+line.charAt(cur.ch-2),Pos(cur.line,cur.ch-2),cur,"+transpose")}else if(cur.line>cm.doc.first){var prev=getLine(cm.doc,cur.line-1).text
-if(prev){cur=new Pos(cur.line,1)
-cm.replaceRange(line.charAt(0)+cm.doc.lineSeparator()+
-prev.charAt(prev.length-1),Pos(cur.line-1,prev.length-1),cur,"+transpose")}}}
-newSel.push(new Range(cur,cur))}
-cm.setSelections(newSel)});},newlineAndIndent:function(cm){return runInOp(cm,function(){var sels=cm.listSelections()
-for(var i=sels.length-1;i>=0;i--)
-{cm.replaceRange(cm.doc.lineSeparator(),sels[i].anchor,sels[i].head,"+input")}
-sels=cm.listSelections()
-for(var i$1=0;i$1<sels.length;i$1++)
-{cm.indentLine(sels[i$1].from().line,null,true)}
-ensureCursorVisible(cm)});},openLine:function(cm){return cm.replaceSelection("\n","start");},toggleOverwrite:function(cm){return cm.toggleOverwrite();}}
-function lineStart(cm,lineN){var line=getLine(cm.doc,lineN)
-var visual=visualLine(line)
-if(visual!=line){lineN=lineNo(visual)}
-return endOfLine(true,cm,visual,lineN,1)}
-function lineEnd(cm,lineN){var line=getLine(cm.doc,lineN)
-var visual=visualLineEnd(line)
-if(visual!=line){lineN=lineNo(visual)}
-return endOfLine(true,cm,line,lineN,-1)}
-function lineStartSmart(cm,pos){var start=lineStart(cm,pos.line)
-var line=getLine(cm.doc,start.line)
-var order=getOrder(line,cm.doc.direction)
-if(!order||order[0].level==0){var firstNonWS=Math.max(0,line.text.search(/\S/))
-var inWS=pos.line==start.line&&pos.ch<=firstNonWS&&pos.ch
-return Pos(start.line,inWS?0:firstNonWS,start.sticky)}
-return start}
-function doHandleBinding(cm,bound,dropShift){if(typeof bound=="string"){bound=commands[bound]
-if(!bound){return false}}
-cm.display.input.ensurePolled()
-var prevShift=cm.display.shift,done=false
-try{if(cm.isReadOnly()){cm.state.suppressEdits=true}
-if(dropShift){cm.display.shift=false}
-done=bound(cm)!=Pass}finally{cm.display.shift=prevShift
-cm.state.suppressEdits=false}
-return done}
-function lookupKeyForEditor(cm,name,handle){for(var i=0;i<cm.state.keyMaps.length;i++){var result=lookupKey(name,cm.state.keyMaps[i],handle,cm)
-if(result){return result}}
-return(cm.options.extraKeys&&lookupKey(name,cm.options.extraKeys,handle,cm))||lookupKey(name,cm.options.keyMap,handle,cm)}
-var stopSeq=new Delayed
-function dispatchKey(cm,name,e,handle){var seq=cm.state.keySeq
-if(seq){if(isModifierKey(name)){return"handled"}
-stopSeq.set(50,function(){if(cm.state.keySeq==seq){cm.state.keySeq=null
-cm.display.input.reset()}})
-name=seq+" "+name}
-var result=lookupKeyForEditor(cm,name,handle)
-if(result=="multi")
-{cm.state.keySeq=name}
-if(result=="handled")
-{signalLater(cm,"keyHandled",cm,name,e)}
-if(result=="handled"||result=="multi"){e_preventDefault(e)
-restartBlink(cm)}
-if(seq&&!result&&/\'$/.test(name)){e_preventDefault(e)
-return true}
-return!!result}
-function handleKeyBinding(cm,e){var name=keyName(e,true)
-if(!name){return false}
-if(e.shiftKey&&!cm.state.keySeq){return dispatchKey(cm,"Shift-"+name,e,function(b){return doHandleBinding(cm,b,true);})||dispatchKey(cm,name,e,function(b){if(typeof b=="string"?/^go[A-Z]/.test(b):b.motion)
-{return doHandleBinding(cm,b)}})}else{return dispatchKey(cm,name,e,function(b){return doHandleBinding(cm,b);})}}
-function handleCharBinding(cm,e,ch){return dispatchKey(cm,"'"+ch+"'",e,function(b){return doHandleBinding(cm,b,true);})}
-var lastStoppedKey=null
-function onKeyDown(e){var cm=this
-cm.curOp.focus=activeElt()
-if(signalDOMEvent(cm,e)){return}
-if(ie&&ie_version<11&&e.keyCode==27){e.returnValue=false}
-var code=e.keyCode
-cm.display.shift=code==16||e.shiftKey
-var handled=handleKeyBinding(cm,e)
-if(presto){lastStoppedKey=handled?code:null
-if(!handled&&code==88&&!hasCopyEvent&&(mac?e.metaKey:e.ctrlKey))
-{cm.replaceSelection("",null,"cut")}}
-if(code==18&&!/\bCodeMirror-crosshair\b/.test(cm.display.lineDiv.className))
-{showCrossHair(cm)}}
-function showCrossHair(cm){var lineDiv=cm.display.lineDiv
-addClass(lineDiv,"CodeMirror-crosshair")
-function up(e){if(e.keyCode==18||!e.altKey){rmClass(lineDiv,"CodeMirror-crosshair")
-off(document,"keyup",up)
-off(document,"mouseover",up)}}
-on(document,"keyup",up)
-on(document,"mouseover",up)}
-function onKeyUp(e){if(e.keyCode==16){this.doc.sel.shift=false}
-signalDOMEvent(this,e)}
-function onKeyPress(e){var cm=this
-if(eventInWidget(cm.display,e)||signalDOMEvent(cm,e)||e.ctrlKey&&!e.altKey||mac&&e.metaKey){return}
-var keyCode=e.keyCode,charCode=e.charCode
-if(presto&&keyCode==lastStoppedKey){lastStoppedKey=null;e_preventDefault(e);return}
-if((presto&&(!e.which||e.which<10))&&handleKeyBinding(cm,e)){return}
-var ch=String.fromCharCode(charCode==null?keyCode:charCode)
-if(ch=="\x08"){return}
-if(handleCharBinding(cm,e,ch)){return}
-cm.display.input.onKeyPress(e)}
-function onMouseDown(e){var cm=this,display=cm.display
-if(signalDOMEvent(cm,e)||display.activeTouch&&display.input.supportsTouch()){return}
-display.input.ensurePolled()
-display.shift=e.shiftKey
-if(eventInWidget(display,e)){if(!webkit){display.scroller.draggable=false
-setTimeout(function(){return display.scroller.draggable=true;},100)}
-return}
-if(clickInGutter(cm,e)){return}
-var start=posFromMouse(cm,e)
-window.focus()
-switch(e_button(e)){case 1:if(cm.state.selectingText)
-{cm.state.selectingText(e)}
-else if(start)
-{leftButtonDown(cm,e,start)}
-else if(e_target(e)==display.scroller)
-{e_preventDefault(e)}
-break
-case 2:if(webkit){cm.state.lastMiddleDown=+new Date}
-if(start){extendSelection(cm.doc,start)}
-setTimeout(function(){return display.input.focus();},20)
-e_preventDefault(e)
-break
-case 3:if(captureRightClick){onContextMenu(cm,e)}
-else{delayBlurEvent(cm)}
-break}}
-var lastClick;var lastDoubleClick;function leftButtonDown(cm,e,start){if(ie){setTimeout(bind(ensureFocus,cm),0)}
-else{cm.curOp.focus=activeElt()}
-var now=+new Date,type
-if(lastDoubleClick&&lastDoubleClick.time>now-400&&cmp(lastDoubleClick.pos,start)==0){type="triple"}else if(lastClick&&lastClick.time>now-400&&cmp(lastClick.pos,start)==0){type="double"
-lastDoubleClick={time:now,pos:start}}else{type="single"
-lastClick={time:now,pos:start}}
-var sel=cm.doc.sel,modifier=mac?e.metaKey:e.ctrlKey,contained
-if(cm.options.dragDrop&&dragAndDrop&&!cm.isReadOnly()&&type=="single"&&(contained=sel.contains(start))>-1&&(cmp((contained=sel.ranges[contained]).from(),start)<0||start.xRel>0)&&(cmp(contained.to(),start)>0||start.xRel<0))
-{leftButtonStartDrag(cm,e,start,modifier)}
-else
-{leftButtonSelect(cm,e,start,type,modifier)}}
-function leftButtonStartDrag(cm,e,start,modifier){var display=cm.display,startTime=+new Date
-var dragEnd=operation(cm,function(e2){if(webkit){display.scroller.draggable=false}
-cm.state.draggingText=false
-off(document,"mouseup",dragEnd)
-off(display.scroller,"drop",dragEnd)
-if(Math.abs(e.clientX-e2.clientX)+Math.abs(e.clientY-e2.clientY)<10){e_preventDefault(e2)
-if(!modifier&&+new Date-200<startTime)
-{extendSelection(cm.doc,start)}
-if(webkit||ie&&ie_version==9)
-{setTimeout(function(){document.body.focus();display.input.focus()},20)}
-else
-{display.input.focus()}}})
-if(webkit){display.scroller.draggable=true}
-cm.state.draggingText=dragEnd
-dragEnd.copy=mac?e.altKey:e.ctrlKey
-if(display.scroller.dragDrop){display.scroller.dragDrop()}
-on(document,"mouseup",dragEnd)
-on(display.scroller,"drop",dragEnd)}
-function leftButtonSelect(cm,e,start,type,addNew){var display=cm.display,doc=cm.doc
-e_preventDefault(e)
-var ourRange,ourIndex,startSel=doc.sel,ranges=startSel.ranges
-if(addNew&&!e.shiftKey){ourIndex=doc.sel.contains(start)
-if(ourIndex>-1)
-{ourRange=ranges[ourIndex]}
-else
-{ourRange=new Range(start,start)}}else{ourRange=doc.sel.primary()
-ourIndex=doc.sel.primIndex}
-if(chromeOS?e.shiftKey&&e.metaKey:e.altKey){type="rect"
-if(!addNew){ourRange=new Range(start,start)}
-start=posFromMouse(cm,e,true,true)
-ourIndex=-1}else if(type=="double"){var word=cm.findWordAt(start)
-if(cm.display.shift||doc.extend)
-{ourRange=extendRange(doc,ourRange,word.anchor,word.head)}
-else
-{ourRange=word}}else if(type=="triple"){var line=new Range(Pos(start.line,0),clipPos(doc,Pos(start.line+1,0)))
-if(cm.display.shift||doc.extend)
-{ourRange=extendRange(doc,ourRange,line.anchor,line.head)}
-else
-{ourRange=line}}else{ourRange=extendRange(doc,ourRange,start)}
-if(!addNew){ourIndex=0
-setSelection(doc,new Selection([ourRange],0),sel_mouse)
-startSel=doc.sel}else if(ourIndex==-1){ourIndex=ranges.length
-setSelection(doc,normalizeSelection(ranges.concat([ourRange]),ourIndex),{scroll:false,origin:"*mouse"})}else if(ranges.length>1&&ranges[ourIndex].empty()&&type=="single"&&!e.shiftKey){setSelection(doc,normalizeSelection(ranges.slice(0,ourIndex).concat(ranges.slice(ourIndex+1)),0),{scroll:false,origin:"*mouse"})
-startSel=doc.sel}else{replaceOneSelection(doc,ourIndex,ourRange,sel_mouse)}
-var lastPos=start
-function extendTo(pos){if(cmp(lastPos,pos)==0){return}
-lastPos=pos
-if(type=="rect"){var ranges=[],tabSize=cm.options.tabSize
-var startCol=countColumn(getLine(doc,start.line).text,start.ch,tabSize)
-var posCol=countColumn(getLine(doc,pos.line).text,pos.ch,tabSize)
-var left=Math.min(startCol,posCol),right=Math.max(startCol,posCol)
-for(var line=Math.min(start.line,pos.line),end=Math.min(cm.lastLine(),Math.max(start.line,pos.line));line<=end;line++){var text=getLine(doc,line).text,leftPos=findColumn(text,left,tabSize)
-if(left==right)
-{ranges.push(new Range(Pos(line,leftPos),Pos(line,leftPos)))}
-else if(text.length>leftPos)
-{ranges.push(new Range(Pos(line,leftPos),Pos(line,findColumn(text,right,tabSize))))}}
-if(!ranges.length){ranges.push(new Range(start,start))}
-setSelection(doc,normalizeSelection(startSel.ranges.slice(0,ourIndex).concat(ranges),ourIndex),{origin:"*mouse",scroll:false})
-cm.scrollIntoView(pos)}else{var oldRange=ourRange
-var anchor=oldRange.anchor,head=pos
-if(type!="single"){var range
-if(type=="double")
-{range=cm.findWordAt(pos)}
-else
-{range=new Range(Pos(pos.line,0),clipPos(doc,Pos(pos.line+1,0)))}
-if(cmp(range.anchor,anchor)>0){head=range.head
-anchor=minPos(oldRange.from(),range.anchor)}else{head=range.anchor
-anchor=maxPos(oldRange.to(),range.head)}}
-var ranges$1=startSel.ranges.slice(0)
-ranges$1[ourIndex]=new Range(clipPos(doc,anchor),head)
-setSelection(doc,normalizeSelection(ranges$1,ourIndex),sel_mouse)}}
-var editorSize=display.wrapper.getBoundingClientRect()
-var counter=0
-function extend(e){var curCount=++counter
-var cur=posFromMouse(cm,e,true,type=="rect")
-if(!cur){return}
-if(cmp(cur,lastPos)!=0){cm.curOp.focus=activeElt()
-extendTo(cur)
-var visible=visibleLines(display,doc)
-if(cur.line>=visible.to||cur.line<visible.from)
-{setTimeout(operation(cm,function(){if(counter==curCount){extend(e)}}),150)}}else{var outside=e.clientY<editorSize.top?-20:e.clientY>editorSize.bottom?20:0
-if(outside){setTimeout(operation(cm,function(){if(counter!=curCount){return}
-display.scroller.scrollTop+=outside
-extend(e)}),50)}}}
-function done(e){cm.state.selectingText=false
-counter=Infinity
-e_preventDefault(e)
-display.input.focus()
-off(document,"mousemove",move)
-off(document,"mouseup",up)
-doc.history.lastSelOrigin=null}
-var move=operation(cm,function(e){if(!e_button(e)){done(e)}
-else{extend(e)}})
-var up=operation(cm,done)
-cm.state.selectingText=up
-on(document,"mousemove",move)
-on(document,"mouseup",up)}
-function gutterEvent(cm,e,type,prevent){var mX,mY
-try{mX=e.clientX;mY=e.clientY}
-catch(e){return false}
-if(mX>=Math.floor(cm.display.gutters.getBoundingClientRect().right)){return false}
-if(prevent){e_preventDefault(e)}
-var display=cm.display
-var lineBox=display.lineDiv.getBoundingClientRect()
-if(mY>lineBox.bottom||!hasHandler(cm,type)){return e_defaultPrevented(e)}
-mY-=lineBox.top-display.viewOffset
-for(var i=0;i<cm.options.gutters.length;++i){var g=display.gutters.childNodes[i]
-if(g&&g.getBoundingClientRect().right>=mX){var line=lineAtHeight(cm.doc,mY)
-var gutter=cm.options.gutters[i]
-signal(cm,type,cm,line,gutter,e)
-return e_defaultPrevented(e)}}}
-function clickInGutter(cm,e){return gutterEvent(cm,e,"gutterClick",true)}
-function onContextMenu(cm,e){if(eventInWidget(cm.display,e)||contextMenuInGutter(cm,e)){return}
-if(signalDOMEvent(cm,e,"contextmenu")){return}
-cm.display.input.onContextMenu(e)}
-function contextMenuInGutter(cm,e){if(!hasHandler(cm,"gutterContextMenu")){return false}
-return gutterEvent(cm,e,"gutterContextMenu",false)}
-function themeChanged(cm){cm.display.wrapper.className=cm.display.wrapper.className.replace(/\s*cm-s-\S+/g,"")+
-cm.options.theme.replace(/(^|\s)\s*/g," cm-s-")
-clearCaches(cm)}
-var Init={toString:function(){return"CodeMirror.Init"}}
-var defaults={}
-var optionHandlers={}
-function defineOptions(CodeMirror){var optionHandlers=CodeMirror.optionHandlers
-function option(name,deflt,handle,notOnInit){CodeMirror.defaults[name]=deflt
-if(handle){optionHandlers[name]=notOnInit?function(cm,val,old){if(old!=Init){handle(cm,val,old)}}:handle}}
-CodeMirror.defineOption=option
-CodeMirror.Init=Init
-option("value","",function(cm,val){return cm.setValue(val);},true)
-option("mode",null,function(cm,val){cm.doc.modeOption=val
-loadMode(cm)},true)
-option("indentUnit",2,loadMode,true)
-option("indentWithTabs",false)
-option("smartIndent",true)
-option("tabSize",4,function(cm){resetModeState(cm)
-clearCaches(cm)
-regChange(cm)},true)
-option("lineSeparator",null,function(cm,val){cm.doc.lineSep=val
-if(!val){return}
-var newBreaks=[],lineNo=cm.doc.first
-cm.doc.iter(function(line){for(var pos=0;;){var found=line.text.indexOf(val,pos)
-if(found==-1){break}
-pos=found+val.length
-newBreaks.push(Pos(lineNo,found))}
-lineNo++})
-for(var i=newBreaks.length-1;i>=0;i--)
-{replaceRange(cm.doc,val,newBreaks[i],Pos(newBreaks[i].line,newBreaks[i].ch+val.length))}})
-option("specialChars",/[\u0000-\u001f\u007f-\u009f\u00ad\u061c\u200b-\u200f\u2028\u2029\ufeff]/g,function(cm,val,old){cm.state.specialChars=new RegExp(val.source+(val.test("\t")?"":"|\t"),"g")
-if(old!=Init){cm.refresh()}})
-option("specialCharPlaceholder",defaultSpecialCharPlaceholder,function(cm){return cm.refresh();},true)
-option("electricChars",true)
-option("inputStyle",mobile?"contenteditable":"textarea",function(){throw new Error("inputStyle can not (yet) be changed in a running editor")},true)
-option("spellcheck",false,function(cm,val){return cm.getInputField().spellcheck=val;},true)
-option("rtlMoveVisually",!windows)
-option("wholeLineUpdateBefore",true)
-option("theme","default",function(cm){themeChanged(cm)
-guttersChanged(cm)},true)
-option("keyMap","default",function(cm,val,old){var next=getKeyMap(val)
-var prev=old!=Init&&getKeyMap(old)
-if(prev&&prev.detach){prev.detach(cm,next)}
-if(next.attach){next.attach(cm,prev||null)}})
-option("extraKeys",null)
-option("lineWrapping",false,wrappingChanged,true)
-option("gutters",[],function(cm){setGuttersForLineNumbers(cm.options)
-guttersChanged(cm)},true)
-option("fixedGutter",true,function(cm,val){cm.display.gutters.style.left=val?compensateForHScroll(cm.display)+"px":"0"
-cm.refresh()},true)
-option("coverGutterNextToScrollbar",false,function(cm){return updateScrollbars(cm);},true)
-option("scrollbarStyle","native",function(cm){initScrollbars(cm)
-updateScrollbars(cm)
-cm.display.scrollbars.setScrollTop(cm.doc.scrollTop)
-cm.display.scrollbars.setScrollLeft(cm.doc.scrollLeft)},true)
-option("lineNumbers",false,function(cm){setGuttersForLineNumbers(cm.options)
-guttersChanged(cm)},true)
-option("firstLineNumber",1,guttersChanged,true)
-option("lineNumberFormatter",function(integer){return integer;},guttersChanged,true)
-option("showCursorWhenSelecting",false,updateSelection,true)
-option("resetSelectionOnContextMenu",true)
-option("lineWiseCopyCut",true)
-option("readOnly",false,function(cm,val){if(val=="nocursor"){onBlur(cm)
-cm.display.input.blur()
-cm.display.disabled=true}else{cm.display.disabled=false}
-cm.display.input.readOnlyChanged(val)})
-option("disableInput",false,function(cm,val){if(!val){cm.display.input.reset()}},true)
-option("dragDrop",true,dragDropChanged)
-option("allowDropFileTypes",null)
-option("cursorBlinkRate",530)
-option("cursorScrollMargin",0)
-option("cursorHeight",1,updateSelection,true)
-option("singleCursorHeightPerLine",true,updateSelection,true)
-option("workTime",100)
-option("workDelay",100)
-option("flattenSpans",true,resetModeState,true)
-option("addModeClass",false,resetModeState,true)
-option("pollInterval",100)
-option("undoDepth",200,function(cm,val){return cm.doc.history.undoDepth=val;})
-option("historyEventDelay",1250)
-option("viewportMargin",10,function(cm){return cm.refresh();},true)
-option("maxHighlightLength",10000,resetModeState,true)
-option("moveInputWithCursor",true,function(cm,val){if(!val){cm.display.input.resetPosition()}})
-option("tabindex",null,function(cm,val){return cm.display.input.getField().tabIndex=val||"";})
-option("autofocus",null)
-option("direction","ltr",function(cm,val){return cm.doc.setDirection(val);},true)}
-function guttersChanged(cm){updateGutters(cm)
-regChange(cm)
-alignHorizontally(cm)}
-function dragDropChanged(cm,value,old){var wasOn=old&&old!=Init
-if(!value!=!wasOn){var funcs=cm.display.dragFunctions
-var toggle=value?on:off
-toggle(cm.display.scroller,"dragstart",funcs.start)
-toggle(cm.display.scroller,"dragenter",funcs.enter)
-toggle(cm.display.scroller,"dragover",funcs.over)
-toggle(cm.display.scroller,"dragleave",funcs.leave)
-toggle(cm.display.scroller,"drop",funcs.drop)}}
-function wrappingChanged(cm){if(cm.options.lineWrapping){addClass(cm.display.wrapper,"CodeMirror-wrap")
-cm.display.sizer.style.minWidth=""
-cm.display.sizerWidth=null}else{rmClass(cm.display.wrapper,"CodeMirror-wrap")
-findMaxLine(cm)}
-estimateLineHeights(cm)
-regChange(cm)
-clearCaches(cm)
-setTimeout(function(){return updateScrollbars(cm);},100)}
-function CodeMirror(place,options){var this$1=this;if(!(this instanceof CodeMirror)){return new CodeMirror(place,options)}
-this.options=options=options?copyObj(options):{}
-copyObj(defaults,options,false)
-setGuttersForLineNumbers(options)
-var doc=options.value
-if(typeof doc=="string"){doc=new Doc(doc,options.mode,null,options.lineSeparator,options.direction)}
-this.doc=doc
-var input=new CodeMirror.inputStyles[options.inputStyle](this)
-var display=this.display=new Display(place,doc,input)
-display.wrapper.CodeMirror=this
-updateGutters(this)
-themeChanged(this)
-if(options.lineWrapping)
-{this.display.wrapper.className+=" CodeMirror-wrap"}
-initScrollbars(this)
-this.state={keyMaps:[],overlays:[],modeGen:0,overwrite:false,delayingBlurEvent:false,focused:false,suppressEdits:false,pasteIncoming:false,cutIncoming:false,selectingText:false,draggingText:false,highlight:new Delayed(),keySeq:null,specialChars:null}
-if(options.autofocus&&!mobile){display.input.focus()}
-if(ie&&ie_version<11){setTimeout(function(){return this$1.display.input.reset(true);},20)}
-registerEventHandlers(this)
-ensureGlobalHandlers()
-startOperation(this)
-this.curOp.forceUpdate=true
-attachDoc(this,doc)
-if((options.autofocus&&!mobile)||this.hasFocus())
-{setTimeout(bind(onFocus,this),20)}
-else
-{onBlur(this)}
-for(var opt in optionHandlers){if(optionHandlers.hasOwnProperty(opt))
-{optionHandlers[opt](this$1,options[opt],Init)}}
-maybeUpdateLineNumberWidth(this)
-if(options.finishInit){options.finishInit(this)}
-for(var i=0;i<initHooks.length;++i){initHooks[i](this$1)}
-endOperation(this)
-if(webkit&&options.lineWrapping&&getComputedStyle(display.lineDiv).textRendering=="optimizelegibility")
-{display.lineDiv.style.textRendering="auto"}}
-CodeMirror.defaults=defaults
-CodeMirror.optionHandlers=optionHandlers
-function registerEventHandlers(cm){var d=cm.display
-on(d.scroller,"mousedown",operation(cm,onMouseDown))
-if(ie&&ie_version<11)
-{on(d.scroller,"dblclick",operation(cm,function(e){if(signalDOMEvent(cm,e)){return}
-var pos=posFromMouse(cm,e)
-if(!pos||clickInGutter(cm,e)||eventInWidget(cm.display,e)){return}
-e_preventDefault(e)
-var word=cm.findWordAt(pos)
-extendSelection(cm.doc,word.anchor,word.head)}))}
-else
-{on(d.scroller,"dblclick",function(e){return signalDOMEvent(cm,e)||e_preventDefault(e);})}
-if(!captureRightClick){on(d.scroller,"contextmenu",function(e){return onContextMenu(cm,e);})}
-var touchFinished,prevTouch={end:0}
-function finishTouch(){if(d.activeTouch){touchFinished=setTimeout(function(){return d.activeTouch=null;},1000)
-prevTouch=d.activeTouch
-prevTouch.end=+new Date}}
-function isMouseLikeTouchEvent(e){if(e.touches.length!=1){return false}
-var touch=e.touches[0]
-return touch.radiusX<=1&&touch.radiusY<=1}
-function farAway(touch,other){if(other.left==null){return true}
-var dx=other.left-touch.left,dy=other.top-touch.top
-return dx*dx+dy*dy>20*20}
-on(d.scroller,"touchstart",function(e){if(!signalDOMEvent(cm,e)&&!isMouseLikeTouchEvent(e)){d.input.ensurePolled()
-clearTimeout(touchFinished)
-var now=+new Date
-d.activeTouch={start:now,moved:false,prev:now-prevTouch.end<=300?prevTouch:null}
-if(e.touches.length==1){d.activeTouch.left=e.touches[0].pageX
-d.activeTouch.top=e.touches[0].pageY}}})
-on(d.scroller,"touchmove",function(){if(d.activeTouch){d.activeTouch.moved=true}})
-on(d.scroller,"touchend",function(e){var touch=d.activeTouch
-if(touch&&!eventInWidget(d,e)&&touch.left!=null&&!touch.moved&&new Date-touch.start<300){var pos=cm.coordsChar(d.activeTouch,"page"),range
-if(!touch.prev||farAway(touch,touch.prev))
-{range=new Range(pos,pos)}
-else if(!touch.prev.prev||farAway(touch,touch.prev.prev))
-{range=cm.findWordAt(pos)}
-else
-{range=new Range(Pos(pos.line,0),clipPos(cm.doc,Pos(pos.line+1,0)))}
-cm.setSelection(range.anchor,range.head)
-cm.focus()
-e_preventDefault(e)}
-finishTouch()})
-on(d.scroller,"touchcancel",finishTouch)
-on(d.scroller,"scroll",function(){if(d.scroller.clientHeight){setScrollTop(cm,d.scroller.scrollTop)
-setScrollLeft(cm,d.scroller.scrollLeft,true)
-signal(cm,"scroll",cm)}})
-on(d.scroller,"mousewheel",function(e){return onScrollWheel(cm,e);})
-on(d.scroller,"DOMMouseScroll",function(e){return onScrollWheel(cm,e);})
-on(d.wrapper,"scroll",function(){return d.wrapper.scrollTop=d.wrapper.scrollLeft=0;})
-d.dragFunctions={enter:function(e){if(!signalDOMEvent(cm,e)){e_stop(e)}},over:function(e){if(!signalDOMEvent(cm,e)){onDragOver(cm,e);e_stop(e)}},start:function(e){return onDragStart(cm,e);},drop:operation(cm,onDrop),leave:function(e){if(!signalDOMEvent(cm,e)){clearDragCursor(cm)}}}
-var inp=d.input.getField()
-on(inp,"keyup",function(e){return onKeyUp.call(cm,e);})
-on(inp,"keydown",operation(cm,onKeyDown))
-on(inp,"keypress",operation(cm,onKeyPress))
-on(inp,"focus",function(e){return onFocus(cm,e);})
-on(inp,"blur",function(e){return onBlur(cm,e);})}
-var initHooks=[]
-CodeMirror.defineInitHook=function(f){return initHooks.push(f);}
-function indentLine(cm,n,how,aggressive){var doc=cm.doc,state
-if(how==null){how="add"}
-if(how=="smart"){if(!doc.mode.indent){how="prev"}
-else{state=getStateBefore(cm,n)}}
-var tabSize=cm.options.tabSize
-var line=getLine(doc,n),curSpace=countColumn(line.text,null,tabSize)
-if(line.stateAfter){line.stateAfter=null}
-var curSpaceString=line.text.match(/^\s*/)[0],indentation
-if(!aggressive&&!/\S/.test(line.text)){indentation=0
-how="not"}else if(how=="smart"){indentation=doc.mode.indent(state,line.text.slice(curSpaceString.length),line.text)
-if(indentation==Pass||indentation>150){if(!aggressive){return}
-how="prev"}}
-if(how=="prev"){if(n>doc.first){indentation=countColumn(getLine(doc,n-1).text,null,tabSize)}
-else{indentation=0}}else if(how=="add"){indentation=curSpace+cm.options.indentUnit}else if(how=="subtract"){indentation=curSpace-cm.options.indentUnit}else if(typeof how=="number"){indentation=curSpace+how}
-indentation=Math.max(0,indentation)
-var indentString="",pos=0
-if(cm.options.indentWithTabs)
-{for(var i=Math.floor(indentation/tabSize);i;--i){pos+=tabSize;indentString+="\t"}}
-if(pos<indentation){indentString+=spaceStr(indentation-pos)}
-if(indentString!=curSpaceString){replaceRange(doc,indentString,Pos(n,0),Pos(n,curSpaceString.length),"+input")
-line.stateAfter=null
-return true}else{for(var i$1=0;i$1<doc.sel.ranges.length;i$1++){var range=doc.sel.ranges[i$1]
-if(range.head.line==n&&range.head.ch<curSpaceString.length){var pos$1=Pos(n,curSpaceString.length)
-replaceOneSelection(doc,i$1,new Range(pos$1,pos$1))
-break}}}}
-var lastCopied=null
-function setLastCopied(newLastCopied){lastCopied=newLastCopied}
-function applyTextInput(cm,inserted,deleted,sel,origin){var doc=cm.doc
-cm.display.shift=false
-if(!sel){sel=doc.sel}
-var paste=cm.state.pasteIncoming||origin=="paste"
-var textLines=splitLinesAuto(inserted),multiPaste=null
-if(paste&&sel.ranges.length>1){if(lastCopied&&lastCopied.text.join("\n")==inserted){if(sel.ranges.length%lastCopied.text.length==0){multiPaste=[]
-for(var i=0;i<lastCopied.text.length;i++)
-{multiPaste.push(doc.splitLines(lastCopied.text[i]))}}}else if(textLines.length==sel.ranges.length){multiPaste=map(textLines,function(l){return[l];})}}
-var updateInput
-for(var i$1=sel.ranges.length-1;i$1>=0;i$1--){var range=sel.ranges[i$1]
-var from=range.from(),to=range.to()
-if(range.empty()){if(deleted&&deleted>0)
-{from=Pos(from.line,from.ch-deleted)}
-else if(cm.state.overwrite&&!paste)
-{to=Pos(to.line,Math.min(getLine(doc,to.line).text.length,to.ch+lst(textLines).length))}
-else if(lastCopied&&lastCopied.lineWise&&lastCopied.text.join("\n")==inserted)
-{from=to=Pos(from.line,0)}}
-updateInput=cm.curOp.updateInput
-var changeEvent={from:from,to:to,text:multiPaste?multiPaste[i$1%multiPaste.length]:textLines,origin:origin||(paste?"paste":cm.state.cutIncoming?"cut":"+input")}
-makeChange(cm.doc,changeEvent)
-signalLater(cm,"inputRead",cm,changeEvent)}
-if(inserted&&!paste)
-{triggerElectric(cm,inserted)}
-ensureCursorVisible(cm)
-cm.curOp.updateInput=updateInput
-cm.curOp.typing=true
-cm.state.pasteIncoming=cm.state.cutIncoming=false}
-function handlePaste(e,cm){var pasted=e.clipboardData&&e.clipboardData.getData("Text")
-if(pasted){e.preventDefault()
-if(!cm.isReadOnly()&&!cm.options.disableInput)
-{runInOp(cm,function(){return applyTextInput(cm,pasted,0,null,"paste");})}
-return true}}
-function triggerElectric(cm,inserted){if(!cm.options.electricChars||!cm.options.smartIndent){return}
-var sel=cm.doc.sel
-for(var i=sel.ranges.length-1;i>=0;i--){var range=sel.ranges[i]
-if(range.head.ch>100||(i&&sel.ranges[i-1].head.line==range.head.line)){continue}
-var mode=cm.getModeAt(range.head)
-var indented=false
-if(mode.electricChars){for(var j=0;j<mode.electricChars.length;j++)
-{if(inserted.indexOf(mode.electricChars.charAt(j))>-1){indented=indentLine(cm,range.head.line,"smart")
-break}}}else if(mode.electricInput){if(mode.electricInput.test(getLine(cm.doc,range.head.line).text.slice(0,range.head.ch)))
-{indented=indentLine(cm,range.head.line,"smart")}}
-if(indented){signalLater(cm,"electricInput",cm,range.head.line)}}}
-function copyableRanges(cm){var text=[],ranges=[]
-for(var i=0;i<cm.doc.sel.ranges.length;i++){var line=cm.doc.sel.ranges[i].head.line
-var lineRange={anchor:Pos(line,0),head:Pos(line+1,0)}
-ranges.push(lineRange)
-text.push(cm.getRange(lineRange.anchor,lineRange.head))}
-return{text:text,ranges:ranges}}
-function disableBrowserMagic(field,spellcheck){field.setAttribute("autocorrect","off")
-field.setAttribute("autocapitalize","off")
-field.setAttribute("spellcheck",!!spellcheck)}
-function hiddenTextarea(){var te=elt("textarea",null,null,"position: absolute; bottom: -1em; padding: 0; width: 1px; height: 1em; outline: none")
-var div=elt("div",[te],null,"overflow: hidden; position: relative; width: 3px; height: 0px;")
-if(webkit){te.style.width="1000px"}
-else{te.setAttribute("wrap","off")}
-if(ios){te.style.border="1px solid black"}
-disableBrowserMagic(te)
-return div}
-function addEditorMethods(CodeMirror){var optionHandlers=CodeMirror.optionHandlers
-var helpers=CodeMirror.helpers={}
-CodeMirror.prototype={constructor:CodeMirror,focus:function(){window.focus();this.display.input.focus()},setOption:function(option,value){var options=this.options,old=options[option]
-if(options[option]==value&&option!="mode"){return}
-options[option]=value
-if(optionHandlers.hasOwnProperty(option))
-{operation(this,optionHandlers[option])(this,value,old)}
-signal(this,"optionChange",this,option)},getOption:function(option){return this.options[option]},getDoc:function(){return this.doc},addKeyMap:function(map,bottom){this.state.keyMaps[bottom?"push":"unshift"](getKeyMap(map))},removeKeyMap:function(map){var maps=this.state.keyMaps
-for(var i=0;i<maps.length;++i)
-{if(maps[i]==map||maps[i].name==map){maps.splice(i,1)
-return true}}},addOverlay:methodOp(function(spec,options){var mode=spec.token?spec:CodeMirror.getMode(this.options,spec)
-if(mode.startState){throw new Error("Overlays may not be stateful.")}
-insertSorted(this.state.overlays,{mode:mode,modeSpec:spec,opaque:options&&options.opaque,priority:(options&&options.priority)||0},function(overlay){return overlay.priority;})
-this.state.modeGen++
-regChange(this)}),removeOverlay:methodOp(function(spec){var this$1=this;var overlays=this.state.overlays
-for(var i=0;i<overlays.length;++i){var cur=overlays[i].modeSpec
-if(cur==spec||typeof spec=="string"&&cur.name==spec){overlays.splice(i,1)
-this$1.state.modeGen++
-regChange(this$1)
-return}}}),indentLine:methodOp(function(n,dir,aggressive){if(typeof dir!="string"&&typeof dir!="number"){if(dir==null){dir=this.options.smartIndent?"smart":"prev"}
-else{dir=dir?"add":"subtract"}}
-if(isLine(this.doc,n)){indentLine(this,n,dir,aggressive)}}),indentSelection:methodOp(function(how){var this$1=this;var ranges=this.doc.sel.ranges,end=-1
-for(var i=0;i<ranges.length;i++){var range=ranges[i]
-if(!range.empty()){var from=range.from(),to=range.to()
-var start=Math.max(end,from.line)
-end=Math.min(this$1.lastLine(),to.line-(to.ch?0:1))+1
-for(var j=start;j<end;++j)
-{indentLine(this$1,j,how)}
-var newRanges=this$1.doc.sel.ranges
-if(from.ch==0&&ranges.length==newRanges.length&&newRanges[i].from().ch>0)
-{replaceOneSelection(this$1.doc,i,new Range(from,newRanges[i].to()),sel_dontScroll)}}else if(range.head.line>end){indentLine(this$1,range.head.line,how,true)
-end=range.head.line
-if(i==this$1.doc.sel.primIndex){ensureCursorVisible(this$1)}}}}),getTokenAt:function(pos,precise){return takeToken(this,pos,precise)},getLineTokens:function(line,precise){return takeToken(this,Pos(line),precise,true)},getTokenTypeAt:function(pos){pos=clipPos(this.doc,pos)
-var styles=getLineStyles(this,getLine(this.doc,pos.line))
-var before=0,after=(styles.length-1)/2,ch=pos.ch
-var type
-if(ch==0){type=styles[2]}
-else{for(;;){var mid=(before+after)>>1
-if((mid?styles[mid*2-1]:0)>=ch){after=mid}
-else if(styles[mid*2+1]<ch){before=mid+1}
-else{type=styles[mid*2+2];break}}}
-var cut=type?type.indexOf("overlay "):-1
-return cut<0?type:cut==0?null:type.slice(0,cut-1)},getModeAt:function(pos){var mode=this.doc.mode
-if(!mode.innerMode){return mode}
-return CodeMirror.innerMode(mode,this.getTokenAt(pos).state).mode},getHelper:function(pos,type){return this.getHelpers(pos,type)[0]},getHelpers:function(pos,type){var this$1=this;var found=[]
-if(!helpers.hasOwnProperty(type)){return found}
-var help=helpers[type],mode=this.getModeAt(pos)
-if(typeof mode[type]=="string"){if(help[mode[type]]){found.push(help[mode[type]])}}else if(mode[type]){for(var i=0;i<mode[type].length;i++){var val=help[mode[type][i]]
-if(val){found.push(val)}}}else if(mode.helperType&&help[mode.helperType]){found.push(help[mode.helperType])}else if(help[mode.name]){found.push(help[mode.name])}
-for(var i$1=0;i$1<help._global.length;i$1++){var cur=help._global[i$1]
-if(cur.pred(mode,this$1)&&indexOf(found,cur.val)==-1)
-{found.push(cur.val)}}
-return found},getStateAfter:function(line,precise){var doc=this.doc
-line=clipLine(doc,line==null?doc.first+doc.size-1:line)
-return getStateBefore(this,line+1,precise)},cursorCoords:function(start,mode){var pos,range=this.doc.sel.primary()
-if(start==null){pos=range.head}
-else if(typeof start=="object"){pos=clipPos(this.doc,start)}
-else{pos=start?range.from():range.to()}
-return cursorCoords(this,pos,mode||"page")},charCoords:function(pos,mode){return charCoords(this,clipPos(this.doc,pos),mode||"page")},coordsChar:function(coords,mode){coords=fromCoordSystem(this,coords,mode||"page")
-return coordsChar(this,coords.left,coords.top)},lineAtHeight:function(height,mode){height=fromCoordSystem(this,{top:height,left:0},mode||"page").top
-return lineAtHeight(this.doc,height+this.display.viewOffset)},heightAtLine:function(line,mode,includeWidgets){var end=false,lineObj
-if(typeof line=="number"){var last=this.doc.first+this.doc.size-1
-if(line<this.doc.first){line=this.doc.first}
-else if(line>last){line=last;end=true}
-lineObj=getLine(this.doc,line)}else{lineObj=line}
-return intoCoordSystem(this,lineObj,{top:0,left:0},mode||"page",includeWidgets||end).top+
-(end?this.doc.height-heightAtLine(lineObj):0)},defaultTextHeight:function(){return textHeight(this.display)},defaultCharWidth:function(){return charWidth(this.display)},getViewport:function(){return{from:this.display.viewFrom,to:this.display.viewTo}},addWidget:function(pos,node,scroll,vert,horiz){var display=this.display
-pos=cursorCoords(this,clipPos(this.doc,pos))
-var top=pos.bottom,left=pos.left
-node.style.position="absolute"
-node.setAttribute("cm-ignore-events","true")
-this.display.input.setUneditable(node)
-display.sizer.appendChild(node)
-if(vert=="over"){top=pos.top}else if(vert=="above"||vert=="near"){var vspace=Math.max(display.wrapper.clientHeight,this.doc.height),hspace=Math.max(display.sizer.clientWidth,display.lineSpace.clientWidth)
-if((vert=='above'||pos.bottom+node.offsetHeight>vspace)&&pos.top>node.offsetHeight)
-{top=pos.top-node.offsetHeight}
-else if(pos.bottom+node.offsetHeight<=vspace)
-{top=pos.bottom}
-if(left+node.offsetWidth>hspace)
-{left=hspace-node.offsetWidth}}
-node.style.top=top+"px"
-node.style.left=node.style.right=""
-if(horiz=="right"){left=display.sizer.clientWidth-node.offsetWidth
-node.style.right="0px"}else{if(horiz=="left"){left=0}
-else if(horiz=="middle"){left=(display.sizer.clientWidth-node.offsetWidth)/2}
-node.style.left=left+"px"}
-if(scroll)
-{scrollIntoView(this,{left:left,top:top,right:left+node.offsetWidth,bottom:top+node.offsetHeight})}},triggerOnKeyDown:methodOp(onKeyDown),triggerOnKeyPress:methodOp(onKeyPress),triggerOnKeyUp:onKeyUp,execCommand:function(cmd){if(commands.hasOwnProperty(cmd))
-{return commands[cmd].call(null,this)}},triggerElectric:methodOp(function(text){triggerElectric(this,text)}),findPosH:function(from,amount,unit,visually){var this$1=this;var dir=1
-if(amount<0){dir=-1;amount=-amount}
-var cur=clipPos(this.doc,from)
-for(var i=0;i<amount;++i){cur=findPosH(this$1.doc,cur,dir,unit,visually)
-if(cur.hitSide){break}}
-return cur},moveH:methodOp(function(dir,unit){var this$1=this;this.extendSelectionsBy(function(range){if(this$1.display.shift||this$1.doc.extend||range.empty())
-{return findPosH(this$1.doc,range.head,dir,unit,this$1.options.rtlMoveVisually)}
-else
-{return dir<0?range.from():range.to()}},sel_move)}),deleteH:methodOp(function(dir,unit){var sel=this.doc.sel,doc=this.doc
-if(sel.somethingSelected())
-{doc.replaceSelection("",null,"+delete")}
-else
-{deleteNearSelection(this,function(range){var other=findPosH(doc,range.head,dir,unit,false)
-return dir<0?{from:other,to:range.head}:{from:range.head,to:other}})}}),findPosV:function(from,amount,unit,goalColumn){var this$1=this;var dir=1,x=goalColumn
-if(amount<0){dir=-1;amount=-amount}
-var cur=clipPos(this.doc,from)
-for(var i=0;i<amount;++i){var coords=cursorCoords(this$1,cur,"div")
-if(x==null){x=coords.left}
-else{coords.left=x}
-cur=findPosV(this$1,coords,dir,unit)
-if(cur.hitSide){break}}
-return cur},moveV:methodOp(function(dir,unit){var this$1=this;var doc=this.doc,goals=[]
-var collapse=!this.display.shift&&!doc.extend&&doc.sel.somethingSelected()
-doc.extendSelectionsBy(function(range){if(collapse)
-{return dir<0?range.from():range.to()}
-var headPos=cursorCoords(this$1,range.head,"div")
-if(range.goalColumn!=null){headPos.left=range.goalColumn}
-goals.push(headPos.left)
-var pos=findPosV(this$1,headPos,dir,unit)
-if(unit=="page"&&range==doc.sel.primary())
-{addToScrollPos(this$1,null,charCoords(this$1,pos,"div").top-headPos.top)}
-return pos},sel_move)
-if(goals.length){for(var i=0;i<doc.sel.ranges.length;i++)
-{doc.sel.ranges[i].goalColumn=goals[i]}}}),findWordAt:function(pos){var doc=this.doc,line=getLine(doc,pos.line).text
-var start=pos.ch,end=pos.ch
-if(line){var helper=this.getHelper(pos,"wordChars")
-if((pos.sticky=="before"||end==line.length)&&start){--start;}else{++end}
-var startChar=line.charAt(start)
-var check=isWordChar(startChar,helper)?function(ch){return isWordChar(ch,helper);}:/\s/.test(startChar)?function(ch){return/\s/.test(ch);}:function(ch){return(!/\s/.test(ch)&&!isWordChar(ch));}
-while(start>0&&check(line.charAt(start-1))){--start}
-while(end<line.length&&check(line.charAt(end))){++end}}
-return new Range(Pos(pos.line,start),Pos(pos.line,end))},toggleOverwrite:function(value){if(value!=null&&value==this.state.overwrite){return}
-if(this.state.overwrite=!this.state.overwrite)
-{addClass(this.display.cursorDiv,"CodeMirror-overwrite")}
-else
-{rmClass(this.display.cursorDiv,"CodeMirror-overwrite")}
-signal(this,"overwriteToggle",this,this.state.overwrite)},hasFocus:function(){return this.display.input.getField()==activeElt()},isReadOnly:function(){return!!(this.options.readOnly||this.doc.cantEdit)},scrollTo:methodOp(function(x,y){if(x!=null||y!=null){resolveScrollToPos(this)}
-if(x!=null){this.curOp.scrollLeft=x}
-if(y!=null){this.curOp.scrollTop=y}}),getScrollInfo:function(){var scroller=this.display.scroller
-return{left:scroller.scrollLeft,top:scroller.scrollTop,height:scroller.scrollHeight-scrollGap(this)-this.display.barHeight,width:scroller.scrollWidth-scrollGap(this)-this.display.barWidth,clientHeight:displayHeight(this),clientWidth:displayWidth(this)}},scrollIntoView:methodOp(function(range,margin){if(range==null){range={from:this.doc.sel.primary().head,to:null}
-if(margin==null){margin=this.options.cursorScrollMargin}}else if(typeof range=="number"){range={from:Pos(range,0),to:null}}else if(range.from==null){range={from:range,to:null}}
-if(!range.to){range.to=range.from}
-range.margin=margin||0
-if(range.from.line!=null){resolveScrollToPos(this)
-this.curOp.scrollToPos=range}else{var sPos=calculateScrollPos(this,{left:Math.min(range.from.left,range.to.left),top:Math.min(range.from.top,range.to.top)-range.margin,right:Math.max(range.from.right,range.to.right),bottom:Math.max(range.from.bottom,range.to.bottom)+range.margin})
-this.scrollTo(sPos.scrollLeft,sPos.scrollTop)}}),setSize:methodOp(function(width,height){var this$1=this;var interpret=function(val){return typeof val=="number"||/^\d+$/.test(String(val))?val+"px":val;}
-if(width!=null){this.display.wrapper.style.width=interpret(width)}
-if(height!=null){this.display.wrapper.style.height=interpret(height)}
-if(this.options.lineWrapping){clearLineMeasurementCache(this)}
-var lineNo=this.display.viewFrom
-this.doc.iter(lineNo,this.display.viewTo,function(line){if(line.widgets){for(var i=0;i<line.widgets.length;i++)
-{if(line.widgets[i].noHScroll){regLineChange(this$1,lineNo,"widget");break}}}
-++lineNo})
-this.curOp.forceUpdate=true
-signal(this,"refresh",this)}),operation:function(f){return runInOp(this,f)},refresh:methodOp(function(){var oldHeight=this.display.cachedTextHeight
-regChange(this)
-this.curOp.forceUpdate=true
-clearCaches(this)
-this.scrollTo(this.doc.scrollLeft,this.doc.scrollTop)
-updateGutterSpace(this)
-if(oldHeight==null||Math.abs(oldHeight-textHeight(this.display))>.5)
-{estimateLineHeights(this)}
-signal(this,"refresh",this)}),swapDoc:methodOp(function(doc){var old=this.doc
-old.cm=null
-attachDoc(this,doc)
-clearCaches(this)
-this.display.input.reset()
-this.scrollTo(doc.scrollLeft,doc.scrollTop)
-this.curOp.forceScroll=true
-signalLater(this,"swapDoc",this,old)
-return old}),getInputField:function(){return this.display.input.getField()},getWrapperElement:function(){return this.display.wrapper},getScrollerElement:function(){return this.display.scroller},getGutterElement:function(){return this.display.gutters}}
-eventMixin(CodeMirror)
-CodeMirror.registerHelper=function(type,name,value){if(!helpers.hasOwnProperty(type)){helpers[type]=CodeMirror[type]={_global:[]}}
-helpers[type][name]=value}
-CodeMirror.registerGlobalHelper=function(type,name,predicate,value){CodeMirror.registerHelper(type,name,value)
-helpers[type]._global.push({pred:predicate,val:value})}}
-function findPosH(doc,pos,dir,unit,visually){var oldPos=pos
-var origDir=dir
-var lineObj=getLine(doc,pos.line)
-function findNextLine(){var l=pos.line+dir
-if(l<doc.first||l>=doc.first+doc.size){return false}
-pos=new Pos(l,pos.ch,pos.sticky)
-return lineObj=getLine(doc,l)}
-function moveOnce(boundToLine){var next
-if(visually){next=moveVisually(doc.cm,lineObj,pos,dir)}else{next=moveLogically(lineObj,pos,dir)}
-if(next==null){if(!boundToLine&&findNextLine())
-{pos=endOfLine(visually,doc.cm,lineObj,pos.line,dir)}
-else
-{return false}}else{pos=next}
-return true}
-if(unit=="char"){moveOnce()}else if(unit=="column"){moveOnce(true)}else if(unit=="word"||unit=="group"){var sawType=null,group=unit=="group"
-var helper=doc.cm&&doc.cm.getHelper(pos,"wordChars")
-for(var first=true;;first=false){if(dir<0&&!moveOnce(!first)){break}
-var cur=lineObj.text.charAt(pos.ch)||"\n"
-var type=isWordChar(cur,helper)?"w":group&&cur=="\n"?"n":!group||/\s/.test(cur)?null:"p"
-if(group&&!first&&!type){type="s"}
-if(sawType&&sawType!=type){if(dir<0){dir=1;moveOnce();pos.sticky="after"}
-break}
-if(type){sawType=type}
-if(dir>0&&!moveOnce(!first)){break}}}
-var result=skipAtomic(doc,pos,oldPos,origDir,true)
-if(equalCursorPos(oldPos,result)){result.hitSide=true}
-return result}
-function findPosV(cm,pos,dir,unit){var doc=cm.doc,x=pos.left,y
-if(unit=="page"){var pageSize=Math.min(cm.display.wrapper.clientHeight,window.innerHeight||document.documentElement.clientHeight)
-var moveAmount=Math.max(pageSize-.5*textHeight(cm.display),3)
-y=(dir>0?pos.bottom:pos.top)+dir*moveAmount}else if(unit=="line"){y=dir>0?pos.bottom+3:pos.top-3}
-var target
-for(;;){target=coordsChar(cm,x,y)
-if(!target.outside){break}
-if(dir<0?y<=0:y>=doc.height){target.hitSide=true;break}
-y+=dir*5}
-return target}
-var ContentEditableInput=function ContentEditableInput(cm){this.cm=cm
-this.lastAnchorNode=this.lastAnchorOffset=this.lastFocusNode=this.lastFocusOffset=null
-this.polling=new Delayed()
-this.composing=null
-this.gracePeriod=false
-this.readDOMTimeout=null};ContentEditableInput.prototype.init=function init(display){var this$1=this;var input=this,cm=input.cm
-var div=input.div=display.lineDiv
-disableBrowserMagic(div,cm.options.spellcheck)
-on(div,"paste",function(e){if(signalDOMEvent(cm,e)||handlePaste(e,cm)){return}
-if(ie_version<=11){setTimeout(operation(cm,function(){return this$1.updateFromDOM();}),20)}})
-on(div,"compositionstart",function(e){this$1.composing={data:e.data,done:false}})
-on(div,"compositionupdate",function(e){if(!this$1.composing){this$1.composing={data:e.data,done:false}}})
-on(div,"compositionend",function(e){if(this$1.composing){if(e.data!=this$1.composing.data){this$1.readFromDOMSoon()}
-this$1.composing.done=true}})
-on(div,"touchstart",function(){return input.forceCompositionEnd();})
-on(div,"input",function(){if(!this$1.composing){this$1.readFromDOMSoon()}})
-function onCopyCut(e){if(signalDOMEvent(cm,e)){return}
-if(cm.somethingSelected()){setLastCopied({lineWise:false,text:cm.getSelections()})
-if(e.type=="cut"){cm.replaceSelection("",null,"cut")}}else if(!cm.options.lineWiseCopyCut){return}else{var ranges=copyableRanges(cm)
-setLastCopied({lineWise:true,text:ranges.text})
-if(e.type=="cut"){cm.operation(function(){cm.setSelections(ranges.ranges,0,sel_dontScroll)
-cm.replaceSelection("",null,"cut")})}}
-if(e.clipboardData){e.clipboardData.clearData()
-var content=lastCopied.text.join("\n")
-e.clipboardData.setData("Text",content)
-if(e.clipboardData.getData("Text")==content){e.preventDefault()
-return}}
-var kludge=hiddenTextarea(),te=kludge.firstChild
-cm.display.lineSpace.insertBefore(kludge,cm.display.lineSpace.firstChild)
-te.value=lastCopied.text.join("\n")
-var hadFocus=document.activeElement
-selectInput(te)
-setTimeout(function(){cm.display.lineSpace.removeChild(kludge)
-hadFocus.focus()
-if(hadFocus==div){input.showPrimarySelection()}},50)}
-on(div,"copy",onCopyCut)
-on(div,"cut",onCopyCut)};ContentEditableInput.prototype.prepareSelection=function prepareSelection$1(){var result=prepareSelection(this.cm,false)
-result.focus=this.cm.state.focused
-return result};ContentEditableInput.prototype.showSelection=function showSelection(info,takeFocus){if(!info||!this.cm.display.view.length){return}
-if(info.focus||takeFocus){this.showPrimarySelection()}
-this.showMultipleSelections(info)};ContentEditableInput.prototype.showPrimarySelection=function showPrimarySelection(){var sel=window.getSelection(),prim=this.cm.doc.sel.primary()
-var curAnchor=domToPos(this.cm,sel.anchorNode,sel.anchorOffset)
-var curFocus=domToPos(this.cm,sel.focusNode,sel.focusOffset)
-if(curAnchor&&!curAnchor.bad&&curFocus&&!curFocus.bad&&cmp(minPos(curAnchor,curFocus),prim.from())==0&&cmp(maxPos(curAnchor,curFocus),prim.to())==0)
-{return}
-var start=posToDOM(this.cm,prim.from())
-var end=posToDOM(this.cm,prim.to())
-if(!start&&!end){sel.removeAllRanges()
-return}
-var view=this.cm.display.view
-var old=sel.rangeCount&&sel.getRangeAt(0)
-if(!start){start={node:view[0].measure.map[2],offset:0}}else if(!end){var measure=view[view.length-1].measure
-var map=measure.maps?measure.maps[measure.maps.length-1]:measure.map
-end={node:map[map.length-1],offset:map[map.length-2]-map[map.length-3]}}
-var rng
-try{rng=range(start.node,start.offset,end.offset,end.node)}
-catch(e){}
-if(rng){if(!gecko&&this.cm.state.focused){sel.collapse(start.node,start.offset)
-if(!rng.collapsed){sel.removeAllRanges()
-sel.addRange(rng)}}else{sel.removeAllRanges()
-sel.addRange(rng)}
-if(old&&sel.anchorNode==null){sel.addRange(old)}
-else if(gecko){this.startGracePeriod()}}
-this.rememberSelection()};ContentEditableInput.prototype.startGracePeriod=function startGracePeriod(){var this$1=this;clearTimeout(this.gracePeriod)
-this.gracePeriod=setTimeout(function(){this$1.gracePeriod=false
-if(this$1.selectionChanged())
-{this$1.cm.operation(function(){return this$1.cm.curOp.selectionChanged=true;})}},20)};ContentEditableInput.prototype.showMultipleSelections=function showMultipleSelections(info){removeChildrenAndAdd(this.cm.display.cursorDiv,info.cursors)
-removeChildrenAndAdd(this.cm.display.selectionDiv,info.selection)};ContentEditableInput.prototype.rememberSelection=function rememberSelection(){var sel=window.getSelection()
-this.lastAnchorNode=sel.anchorNode;this.lastAnchorOffset=sel.anchorOffset
-this.lastFocusNode=sel.focusNode;this.lastFocusOffset=sel.focusOffset};ContentEditableInput.prototype.selectionInEditor=function selectionInEditor(){var sel=window.getSelection()
-if(!sel.rangeCount){return false}
-var node=sel.getRangeAt(0).commonAncestorContainer
-return contains(this.div,node)};ContentEditableInput.prototype.focus=function focus(){if(this.cm.options.readOnly!="nocursor"){if(!this.selectionInEditor())
-{this.showSelection(this.prepareSelection(),true)}
-this.div.focus()}};ContentEditableInput.prototype.blur=function blur(){this.div.blur()};ContentEditableInput.prototype.getField=function getField(){return this.div};ContentEditableInput.prototype.supportsTouch=function supportsTouch(){return true};ContentEditableInput.prototype.receivedFocus=function receivedFocus(){var input=this
-if(this.selectionInEditor())
-{this.pollSelection()}
-else
-{runInOp(this.cm,function(){return input.cm.curOp.selectionChanged=true;})}
-function poll(){if(input.cm.state.focused){input.pollSelection()
-input.polling.set(input.cm.options.pollInterval,poll)}}
-this.polling.set(this.cm.options.pollInterval,poll)};ContentEditableInput.prototype.selectionChanged=function selectionChanged(){var sel=window.getSelection()
-return sel.anchorNode!=this.lastAnchorNode||sel.anchorOffset!=this.lastAnchorOffset||sel.focusNode!=this.lastFocusNode||sel.focusOffset!=this.lastFocusOffset};ContentEditableInput.prototype.pollSelection=function pollSelection(){if(this.readDOMTimeout!=null||this.gracePeriod||!this.selectionChanged()){return}
-var sel=window.getSelection(),cm=this.cm
-if(android&&chrome&&this.cm.options.gutters.length&&isInGutter(sel.anchorNode)){this.cm.triggerOnKeyDown({type:"keydown",keyCode:8,preventDefault:Math.abs})
-this.blur()
-this.focus()
-return}
-if(this.composing){return}
-this.rememberSelection()
-var anchor=domToPos(cm,sel.anchorNode,sel.anchorOffset)
-var head=domToPos(cm,sel.focusNode,sel.focusOffset)
-if(anchor&&head){runInOp(cm,function(){setSelection(cm.doc,simpleSelection(anchor,head),sel_dontScroll)
-if(anchor.bad||head.bad){cm.curOp.selectionChanged=true}})}};ContentEditableInput.prototype.pollContent=function pollContent(){if(this.readDOMTimeout!=null){clearTimeout(this.readDOMTimeout)
-this.readDOMTimeout=null}
-var cm=this.cm,display=cm.display,sel=cm.doc.sel.primary()
-var from=sel.from(),to=sel.to()
-if(from.ch==0&&from.line>cm.firstLine())
-{from=Pos(from.line-1,getLine(cm.doc,from.line-1).length)}
-if(to.ch==getLine(cm.doc,to.line).text.length&&to.line<cm.lastLine())
-{to=Pos(to.line+1,0)}
-if(from.line<display.viewFrom||to.line>display.viewTo-1){return false}
-var fromIndex,fromLine,fromNode
-if(from.line==display.viewFrom||(fromIndex=findViewIndex(cm,from.line))==0){fromLine=lineNo(display.view[0].line)
-fromNode=display.view[0].node}else{fromLine=lineNo(display.view[fromIndex].line)
-fromNode=display.view[fromIndex-1].node.nextSibling}
-var toIndex=findViewIndex(cm,to.line)
-var toLine,toNode
-if(toIndex==display.view.length-1){toLine=display.viewTo-1
-toNode=display.lineDiv.lastChild}else{toLine=lineNo(display.view[toIndex+1].line)-1
-toNode=display.view[toIndex+1].node.previousSibling}
-if(!fromNode){return false}
-var newText=cm.doc.splitLines(domTextBetween(cm,fromNode,toNode,fromLine,toLine))
-var oldText=getBetween(cm.doc,Pos(fromLine,0),Pos(toLine,getLine(cm.doc,toLine).text.length))
-while(newText.length>1&&oldText.length>1){if(lst(newText)==lst(oldText)){newText.pop();oldText.pop();toLine--}
-else if(newText[0]==oldText[0]){newText.shift();oldText.shift();fromLine++}
-else{break}}
-var cutFront=0,cutEnd=0
-var newTop=newText[0],oldTop=oldText[0],maxCutFront=Math.min(newTop.length,oldTop.length)
-while(cutFront<maxCutFront&&newTop.charCodeAt(cutFront)==oldTop.charCodeAt(cutFront))
-{++cutFront}
-var newBot=lst(newText),oldBot=lst(oldText)
-var maxCutEnd=Math.min(newBot.length-(newText.length==1?cutFront:0),oldBot.length-(oldText.length==1?cutFront:0))
-while(cutEnd<maxCutEnd&&newBot.charCodeAt(newBot.length-cutEnd-1)==oldBot.charCodeAt(oldBot.length-cutEnd-1))
-{++cutEnd}
-if(newText.length==1&&oldText.length==1&&fromLine==from.line){while(cutFront&&cutFront>from.ch&&newBot.charCodeAt(newBot.length-cutEnd-1)==oldBot.charCodeAt(oldBot.length-cutEnd-1)){cutFront--
-cutEnd++}}
-newText[newText.length-1]=newBot.slice(0,newBot.length-cutEnd).replace(/^\u200b+/,"")
-newText[0]=newText[0].slice(cutFront).replace(/\u200b+$/,"")
-var chFrom=Pos(fromLine,cutFront)
-var chTo=Pos(toLine,oldText.length?lst(oldText).length-cutEnd:0)
-if(newText.length>1||newText[0]||cmp(chFrom,chTo)){replaceRange(cm.doc,newText,chFrom,chTo,"+input")
-return true}};ContentEditableInput.prototype.ensurePolled=function ensurePolled(){this.forceCompositionEnd()};ContentEditableInput.prototype.reset=function reset(){this.forceCompositionEnd()};ContentEditableInput.prototype.forceCompositionEnd=function forceCompositionEnd(){if(!this.composing){return}
-clearTimeout(this.readDOMTimeout)
-this.composing=null
-this.updateFromDOM()
-this.div.blur()
-this.div.focus()};ContentEditableInput.prototype.readFromDOMSoon=function readFromDOMSoon(){var this$1=this;if(this.readDOMTimeout!=null){return}
-this.readDOMTimeout=setTimeout(function(){this$1.readDOMTimeout=null
-if(this$1.composing){if(this$1.composing.done){this$1.composing=null}
-else{return}}
-this$1.updateFromDOM()},80)};ContentEditableInput.prototype.updateFromDOM=function updateFromDOM(){var this$1=this;if(this.cm.isReadOnly()||!this.pollContent())
-{runInOp(this.cm,function(){return regChange(this$1.cm);})}};ContentEditableInput.prototype.setUneditable=function setUneditable(node){node.contentEditable="false"};ContentEditableInput.prototype.onKeyPress=function onKeyPress(e){if(e.charCode==0){return}
-e.preventDefault()
-if(!this.cm.isReadOnly())
-{operation(this.cm,applyTextInput)(this.cm,String.fromCharCode(e.charCode==null?e.keyCode:e.charCode),0)}};ContentEditableInput.prototype.readOnlyChanged=function readOnlyChanged(val){this.div.contentEditable=String(val!="nocursor")};ContentEditableInput.prototype.onContextMenu=function onContextMenu(){};ContentEditableInput.prototype.resetPosition=function resetPosition(){};ContentEditableInput.prototype.needsContentAttribute=true
-function posToDOM(cm,pos){var view=findViewForLine(cm,pos.line)
-if(!view||view.hidden){return null}
-var line=getLine(cm.doc,pos.line)
-var info=mapFromLineView(view,line,pos.line)
-var order=getOrder(line,cm.doc.direction),side="left"
-if(order){var partPos=getBidiPartAt(order,pos.ch)
-side=partPos%2?"right":"left"}
-var result=nodeAndOffsetInLineMap(info.map,pos.ch,side)
-result.offset=result.collapse=="right"?result.end:result.start
-return result}
-function isInGutter(node){for(var scan=node;scan;scan=scan.parentNode)
-{if(/CodeMirror-gutter-wrapper/.test(scan.className)){return true}}
-return false}
-function badPos(pos,bad){if(bad){pos.bad=true;}return pos}
-function domTextBetween(cm,from,to,fromLine,toLine){var text="",closing=false,lineSep=cm.doc.lineSeparator()
-function recognizeMarker(id){return function(marker){return marker.id==id;}}
-function close(){if(closing){text+=lineSep
-closing=false}}
-function addText(str){if(str){close()
-text+=str}}
-function walk(node){if(node.nodeType==1){var cmText=node.getAttribute("cm-text")
-if(cmText!=null){addText(cmText||node.textContent.replace(/\u200b/g,""))
-return}
-var markerID=node.getAttribute("cm-marker"),range
-if(markerID){var found=cm.findMarks(Pos(fromLine,0),Pos(toLine+1,0),recognizeMarker(+markerID))
-if(found.length&&(range=found[0].find()))
-{addText(getBetween(cm.doc,range.from,range.to).join(lineSep))}
-return}
-if(node.getAttribute("contenteditable")=="false"){return}
-var isBlock=/^(pre|div|p)$/i.test(node.nodeName)
-if(isBlock){close()}
-for(var i=0;i<node.childNodes.length;i++)
-{walk(node.childNodes[i])}
-if(isBlock){closing=true}}else if(node.nodeType==3){addText(node.nodeValue)}}
-for(;;){walk(from)
-if(from==to){break}
-from=from.nextSibling}
-return text}
-function domToPos(cm,node,offset){var lineNode
-if(node==cm.display.lineDiv){lineNode=cm.display.lineDiv.childNodes[offset]
-if(!lineNode){return badPos(cm.clipPos(Pos(cm.display.viewTo-1)),true)}
-node=null;offset=0}else{for(lineNode=node;;lineNode=lineNode.parentNode){if(!lineNode||lineNode==cm.display.lineDiv){return null}
-if(lineNode.parentNode&&lineNode.parentNode==cm.display.lineDiv){break}}}
-for(var i=0;i<cm.display.view.length;i++){var lineView=cm.display.view[i]
-if(lineView.node==lineNode)
-{return locateNodeInLineView(lineView,node,offset)}}}
-function locateNodeInLineView(lineView,node,offset){var wrapper=lineView.text.firstChild,bad=false
-if(!node||!contains(wrapper,node)){return badPos(Pos(lineNo(lineView.line),0),true)}
-if(node==wrapper){bad=true
-node=wrapper.childNodes[offset]
-offset=0
-if(!node){var line=lineView.rest?lst(lineView.rest):lineView.line
-return badPos(Pos(lineNo(line),line.text.length),bad)}}
-var textNode=node.nodeType==3?node:null,topNode=node
-if(!textNode&&node.childNodes.length==1&&node.firstChild.nodeType==3){textNode=node.firstChild
-if(offset){offset=textNode.nodeValue.length}}
-while(topNode.parentNode!=wrapper){topNode=topNode.parentNode}
-var measure=lineView.measure,maps=measure.maps
-function find(textNode,topNode,offset){for(var i=-1;i<(maps?maps.length:0);i++){var map=i<0?measure.map:maps[i]
-for(var j=0;j<map.length;j+=3){var curNode=map[j+2]
-if(curNode==textNode||curNode==topNode){var line=lineNo(i<0?lineView.line:lineView.rest[i])
-var ch=map[j]+offset
-if(offset<0||curNode!=textNode){ch=map[j+(offset?1:0)]}
-return Pos(line,ch)}}}}
-var found=find(textNode,topNode,offset)
-if(found){return badPos(found,bad)}
-for(var after=topNode.nextSibling,dist=textNode?textNode.nodeValue.length-offset:0;after;after=after.nextSibling){found=find(after,after.firstChild,0)
-if(found)
-{return badPos(Pos(found.line,found.ch-dist),bad)}
-else
-{dist+=after.textContent.length}}
-for(var before=topNode.previousSibling,dist$1=offset;before;before=before.previousSibling){found=find(before,before.firstChild,-1)
-if(found)
-{return badPos(Pos(found.line,found.ch+dist$1),bad)}
-else
-{dist$1+=before.textContent.length}}}
-var TextareaInput=function TextareaInput(cm){this.cm=cm
-this.prevInput=""
-this.pollingFast=false
-this.polling=new Delayed()
-this.inaccurateSelection=false
-this.hasSelection=false
-this.composing=null};TextareaInput.prototype.init=function init(display){var this$1=this;var input=this,cm=this.cm
-var div=this.wrapper=hiddenTextarea()
-var te=this.textarea=div.firstChild
-display.wrapper.insertBefore(div,display.wrapper.firstChild)
-if(ios){te.style.width="0px"}
-on(te,"input",function(){if(ie&&ie_version>=9&&this$1.hasSelection){this$1.hasSelection=null}
-input.poll()})
-on(te,"paste",function(e){if(signalDOMEvent(cm,e)||handlePaste(e,cm)){return}
-cm.state.pasteIncoming=true
-input.fastPoll()})
-function prepareCopyCut(e){if(signalDOMEvent(cm,e)){return}
-if(cm.somethingSelected()){setLastCopied({lineWise:false,text:cm.getSelections()})
-if(input.inaccurateSelection){input.prevInput=""
-input.inaccurateSelection=false
-te.value=lastCopied.text.join("\n")
-selectInput(te)}}else if(!cm.options.lineWiseCopyCut){return}else{var ranges=copyableRanges(cm)
-setLastCopied({lineWise:true,text:ranges.text})
-if(e.type=="cut"){cm.setSelections(ranges.ranges,null,sel_dontScroll)}else{input.prevInput=""
-te.value=ranges.text.join("\n")
-selectInput(te)}}
-if(e.type=="cut"){cm.state.cutIncoming=true}}
-on(te,"cut",prepareCopyCut)
-on(te,"copy",prepareCopyCut)
-on(display.scroller,"paste",function(e){if(eventInWidget(display,e)||signalDOMEvent(cm,e)){return}
-cm.state.pasteIncoming=true
-input.focus()})
-on(display.lineSpace,"selectstart",function(e){if(!eventInWidget(display,e)){e_preventDefault(e)}})
-on(te,"compositionstart",function(){var start=cm.getCursor("from")
-if(input.composing){input.composing.range.clear()}
-input.composing={start:start,range:cm.markText(start,cm.getCursor("to"),{className:"CodeMirror-composing"})}})
-on(te,"compositionend",function(){if(input.composing){input.poll()
-input.composing.range.clear()
-input.composing=null}})};TextareaInput.prototype.prepareSelection=function prepareSelection$1(){var cm=this.cm,display=cm.display,doc=cm.doc
-var result=prepareSelection(cm)
-if(cm.options.moveInputWithCursor){var headPos=cursorCoords(cm,doc.sel.primary().head,"div")
-var wrapOff=display.wrapper.getBoundingClientRect(),lineOff=display.lineDiv.getBoundingClientRect()
-result.teTop=Math.max(0,Math.min(display.wrapper.clientHeight-10,headPos.top+lineOff.top-wrapOff.top))
-result.teLeft=Math.max(0,Math.min(display.wrapper.clientWidth-10,headPos.left+lineOff.left-wrapOff.left))}
-return result};TextareaInput.prototype.showSelection=function showSelection(drawn){var cm=this.cm,display=cm.display
-removeChildrenAndAdd(display.cursorDiv,drawn.cursors)
-removeChildrenAndAdd(display.selectionDiv,drawn.selection)
-if(drawn.teTop!=null){this.wrapper.style.top=drawn.teTop+"px"
-this.wrapper.style.left=drawn.teLeft+"px"}};TextareaInput.prototype.reset=function reset(typing){if(this.contextMenuPending){return}
-var minimal,selected,cm=this.cm,doc=cm.doc
-if(cm.somethingSelected()){this.prevInput=""
-var range=doc.sel.primary()
-minimal=hasCopyEvent&&(range.to().line-range.from().line>100||(selected=cm.getSelection()).length>1000)
-var content=minimal?"-":selected||cm.getSelection()
-this.textarea.value=content
-if(cm.state.focused){selectInput(this.textarea)}
-if(ie&&ie_version>=9){this.hasSelection=content}}else if(!typing){this.prevInput=this.textarea.value=""
-if(ie&&ie_version>=9){this.hasSelection=null}}
-this.inaccurateSelection=minimal};TextareaInput.prototype.getField=function getField(){return this.textarea};TextareaInput.prototype.supportsTouch=function supportsTouch(){return false};TextareaInput.prototype.focus=function focus(){if(this.cm.options.readOnly!="nocursor"&&(!mobile||activeElt()!=this.textarea)){try{this.textarea.focus()}
-catch(e){}}};TextareaInput.prototype.blur=function blur(){this.textarea.blur()};TextareaInput.prototype.resetPosition=function resetPosition(){this.wrapper.style.top=this.wrapper.style.left=0};TextareaInput.prototype.receivedFocus=function receivedFocus(){this.slowPoll()};TextareaInput.prototype.slowPoll=function slowPoll(){var this$1=this;if(this.pollingFast){return}
-this.polling.set(this.cm.options.pollInterval,function(){this$1.poll()
-if(this$1.cm.state.focused){this$1.slowPoll()}})};TextareaInput.prototype.fastPoll=function fastPoll(){var missed=false,input=this
-input.pollingFast=true
-function p(){var changed=input.poll()
-if(!changed&&!missed){missed=true;input.polling.set(60,p)}
-else{input.pollingFast=false;input.slowPoll()}}
-input.polling.set(20,p)};TextareaInput.prototype.poll=function poll(){var this$1=this;var cm=this.cm,input=this.textarea,prevInput=this.prevInput
-if(this.contextMenuPending||!cm.state.focused||(hasSelection(input)&&!prevInput&&!this.composing)||cm.isReadOnly()||cm.options.disableInput||cm.state.keySeq)
-{return false}
-var text=input.value
-if(text==prevInput&&!cm.somethingSelected()){return false}
-if(ie&&ie_version>=9&&this.hasSelection===text||mac&&/[\uf700-\uf7ff]/.test(text)){cm.display.input.reset()
-return false}
-if(cm.doc.sel==cm.display.selForContextMenu){var first=text.charCodeAt(0)
-if(first==0x200b&&!prevInput){prevInput="\u200b"}
-if(first==0x21da){this.reset();return this.cm.execCommand("undo")}}
-var same=0,l=Math.min(prevInput.length,text.length)
-while(same<l&&prevInput.charCodeAt(same)==text.charCodeAt(same)){++same}
-runInOp(cm,function(){applyTextInput(cm,text.slice(same),prevInput.length-same,null,this$1.composing?"*compose":null)
-if(text.length>1000||text.indexOf("\n")>-1){input.value=this$1.prevInput=""}
-else{this$1.prevInput=text}
-if(this$1.composing){this$1.composing.range.clear()
-this$1.composing.range=cm.markText(this$1.composing.start,cm.getCursor("to"),{className:"CodeMirror-composing"})}})
-return true};TextareaInput.prototype.ensurePolled=function ensurePolled(){if(this.pollingFast&&this.poll()){this.pollingFast=false}};TextareaInput.prototype.onKeyPress=function onKeyPress(){if(ie&&ie_version>=9){this.hasSelection=null}
-this.fastPoll()};TextareaInput.prototype.onContextMenu=function onContextMenu(e){var input=this,cm=input.cm,display=cm.display,te=input.textarea
-var pos=posFromMouse(cm,e),scrollPos=display.scroller.scrollTop
-if(!pos||presto){return}
-var reset=cm.options.resetSelectionOnContextMenu
-if(reset&&cm.doc.sel.contains(pos)==-1)
-{operation(cm,setSelection)(cm.doc,simpleSelection(pos),sel_dontScroll)}
-var oldCSS=te.style.cssText,oldWrapperCSS=input.wrapper.style.cssText
-input.wrapper.style.cssText="position: absolute"
-var wrapperBox=input.wrapper.getBoundingClientRect()
-te.style.cssText="position: absolute; width: 30px; height: 30px;\n top: "+(e.clientY-wrapperBox.top-5)+"px; left: "+(e.clientX-wrapperBox.left-5)+"px;\n z-index: 1000; background: "+(ie?"rgba(255, 255, 255, .05)":"transparent")+";\n outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);"
-var oldScrollY
-if(webkit){oldScrollY=window.scrollY}
-display.input.focus()
-if(webkit){window.scrollTo(null,oldScrollY)}
-display.input.reset()
-if(!cm.somethingSelected()){te.value=input.prevInput=" "}
-input.contextMenuPending=true
-display.selForContextMenu=cm.doc.sel
-clearTimeout(display.detectingSelectAll)
-function prepareSelectAllHack(){if(te.selectionStart!=null){var selected=cm.somethingSelected()
-var extval="\u200b"+(selected?te.value:"")
-te.value="\u21da"
-te.value=extval
-input.prevInput=selected?"":"\u200b"
-te.selectionStart=1;te.selectionEnd=extval.length
-display.selForContextMenu=cm.doc.sel}}
-function rehide(){input.contextMenuPending=false
-input.wrapper.style.cssText=oldWrapperCSS
-te.style.cssText=oldCSS
-if(ie&&ie_version<9){display.scrollbars.setScrollTop(display.scroller.scrollTop=scrollPos)}
-if(te.selectionStart!=null){if(!ie||(ie&&ie_version<9)){prepareSelectAllHack()}
-var i=0,poll=function(){if(display.selForContextMenu==cm.doc.sel&&te.selectionStart==0&&te.selectionEnd>0&&input.prevInput=="\u200b"){operation(cm,selectAll)(cm)}else if(i++<10){display.detectingSelectAll=setTimeout(poll,500)}else{display.selForContextMenu=null
-display.input.reset()}}
-display.detectingSelectAll=setTimeout(poll,200)}}
-if(ie&&ie_version>=9){prepareSelectAllHack()}
-if(captureRightClick){e_stop(e)
-var mouseup=function(){off(window,"mouseup",mouseup)
-setTimeout(rehide,20)}
-on(window,"mouseup",mouseup)}else{setTimeout(rehide,50)}};TextareaInput.prototype.readOnlyChanged=function readOnlyChanged(val){if(!val){this.reset()}};TextareaInput.prototype.setUneditable=function setUneditable(){};TextareaInput.prototype.needsContentAttribute=false
-function fromTextArea(textarea,options){options=options?copyObj(options):{}
-options.value=textarea.value
-if(!options.tabindex&&textarea.tabIndex)
-{options.tabindex=textarea.tabIndex}
-if(!options.placeholder&&textarea.placeholder)
-{options.placeholder=textarea.placeholder}
-if(options.autofocus==null){var hasFocus=activeElt()
-options.autofocus=hasFocus==textarea||textarea.getAttribute("autofocus")!=null&&hasFocus==document.body}
-function save(){textarea.value=cm.getValue()}
-var realSubmit
-if(textarea.form){on(textarea.form,"submit",save)
-if(!options.leaveSubmitMethodAlone){var form=textarea.form
-realSubmit=form.submit
-try{var wrappedSubmit=form.submit=function(){save()
-form.submit=realSubmit
-form.submit()
-form.submit=wrappedSubmit}}catch(e){}}}
-options.finishInit=function(cm){cm.save=save
-cm.getTextArea=function(){return textarea;}
-cm.toTextArea=function(){cm.toTextArea=isNaN
-save()
-textarea.parentNode.removeChild(cm.getWrapperElement())
-textarea.style.display=""
-if(textarea.form){off(textarea.form,"submit",save)
-if(typeof textarea.form.submit=="function")
-{textarea.form.submit=realSubmit}}}}
-textarea.style.display="none"
-var cm=CodeMirror(function(node){return textarea.parentNode.insertBefore(node,textarea.nextSibling);},options)
-return cm}
-function addLegacyProps(CodeMirror){CodeMirror.off=off
-CodeMirror.on=on
-CodeMirror.wheelEventPixels=wheelEventPixels
-CodeMirror.Doc=Doc
-CodeMirror.splitLines=splitLinesAuto
-CodeMirror.countColumn=countColumn
-CodeMirror.findColumn=findColumn
-CodeMirror.isWordChar=isWordCharBasic
-CodeMirror.Pass=Pass
-CodeMirror.signal=signal
-CodeMirror.Line=Line
-CodeMirror.changeEnd=changeEnd
-CodeMirror.scrollbarModel=scrollbarModel
-CodeMirror.Pos=Pos
-CodeMirror.cmpPos=cmp
-CodeMirror.modes=modes
-CodeMirror.mimeModes=mimeModes
-CodeMirror.resolveMode=resolveMode
-CodeMirror.getMode=getMode
-CodeMirror.modeExtensions=modeExtensions
-CodeMirror.extendMode=extendMode
-CodeMirror.copyState=copyState
-CodeMirror.startState=startState
-CodeMirror.innerMode=innerMode
-CodeMirror.commands=commands
-CodeMirror.keyMap=keyMap
-CodeMirror.keyName=keyName
-CodeMirror.isModifierKey=isModifierKey
-CodeMirror.lookupKey=lookupKey
-CodeMirror.normalizeKeyMap=normalizeKeyMap
-CodeMirror.StringStream=StringStream
-CodeMirror.SharedTextMarker=SharedTextMarker
-CodeMirror.TextMarker=TextMarker
-CodeMirror.LineWidget=LineWidget
-CodeMirror.e_preventDefault=e_preventDefault
-CodeMirror.e_stopPropagation=e_stopPropagation
-CodeMirror.e_stop=e_stop
-CodeMirror.addClass=addClass
-CodeMirror.contains=contains
-CodeMirror.rmClass=rmClass
-CodeMirror.keyNames=keyNames}
-defineOptions(CodeMirror)
-addEditorMethods(CodeMirror)
-var dontDelegate="iter insert remove copy getEditor constructor".split(" ")
-for(var prop in Doc.prototype){if(Doc.prototype.hasOwnProperty(prop)&&indexOf(dontDelegate,prop)<0)
-{CodeMirror.prototype[prop]=(function(method){return function(){return method.apply(this.doc,arguments)}})(Doc.prototype[prop])}}
-eventMixin(Doc)
-CodeMirror.inputStyles={"textarea":TextareaInput,"contenteditable":ContentEditableInput}
-CodeMirror.defineMode=function(name){if(!CodeMirror.defaults.mode&&name!="null"){CodeMirror.defaults.mode=name}
-defineMode.apply(this,arguments)}
-CodeMirror.defineMIME=defineMIME
-CodeMirror.defineMode("null",function(){return({token:function(stream){return stream.skipToEnd();}});})
-CodeMirror.defineMIME("text/plain","null")
-CodeMirror.defineExtension=function(name,func){CodeMirror.prototype[name]=func}
-CodeMirror.defineDocExtension=function(name,func){Doc.prototype[name]=func}
-CodeMirror.fromTextArea=fromTextArea
-addLegacyProps(CodeMirror)
-CodeMirror.version="5.25.1"
-return CodeMirror;})));;(function(mod){if(typeof exports=="object"&&typeof module=="object")
-mod(require("../../lib/codemirror"));else if(typeof define=="function"&&define.amd)
-define(["../../lib/codemirror"],mod);else
-mod(CodeMirror);})(function(CodeMirror){"use strict";CodeMirror.multiplexingMode=function(outer){var others=Array.prototype.slice.call(arguments,1);function indexOf(string,pattern,from,returnEnd){if(typeof pattern=="string"){var found=string.indexOf(pattern,from);return returnEnd&&found>-1?found+pattern.length:found;}
-var m=pattern.exec(from?string.slice(from):string);return m?m.index+from+(returnEnd?m[0].length:0):-1;}
-return{startState:function(){return{outer:CodeMirror.startState(outer),innerActive:null,inner:null};},copyState:function(state){return{outer:CodeMirror.copyState(outer,state.outer),innerActive:state.innerActive,inner:state.innerActive&&CodeMirror.copyState(state.innerActive.mode,state.inner)};},token:function(stream,state){if(!state.innerActive){var cutOff=Infinity,oldContent=stream.string;for(var i=0;i<others.length;++i){var other=others[i];var found=indexOf(oldContent,other.open,stream.pos);if(found==stream.pos){if(!other.parseDelimiters)stream.match(other.open);state.innerActive=other;state.inner=CodeMirror.startState(other.mode,outer.indent?outer.indent(state.outer,""):0);return other.delimStyle&&(other.delimStyle+" "+other.delimStyle+"-open");}else if(found!=-1&&found<cutOff){cutOff=found;}}
-if(cutOff!=Infinity)stream.string=oldContent.slice(0,cutOff);var outerToken=outer.token(stream,state.outer);if(cutOff!=Infinity)stream.string=oldContent;return outerToken;}else{var curInner=state.innerActive,oldContent=stream.string;if(!curInner.close&&stream.sol()){state.innerActive=state.inner=null;return this.token(stream,state);}
-var found=curInner.close?indexOf(oldContent,curInner.close,stream.pos,curInner.parseDelimiters):-1;if(found==stream.pos&&!curInner.parseDelimiters){stream.match(curInner.close);state.innerActive=state.inner=null;return curInner.delimStyle&&(curInner.delimStyle+" "+curInner.delimStyle+"-close");}
-if(found>-1)stream.string=oldContent.slice(0,found);var innerToken=curInner.mode.token(stream,state.inner);if(found>-1)stream.string=oldContent;if(found==stream.pos&&curInner.parseDelimiters)
-state.innerActive=state.inner=null;if(curInner.innerStyle){if(innerToken)innerToken=innerToken+" "+curInner.innerStyle;else innerToken=curInner.innerStyle;}
-return innerToken;}},indent:function(state,textAfter){var mode=state.innerActive?state.innerActive.mode:outer;if(!mode.indent)return CodeMirror.Pass;return mode.indent(state.innerActive?state.inner:state.outer,textAfter);},blankLine:function(state){var mode=state.innerActive?state.innerActive.mode:outer;if(mode.blankLine){mode.blankLine(state.innerActive?state.inner:state.outer);}
-if(!state.innerActive){for(var i=0;i<others.length;++i){var other=others[i];if(other.open==="\n"){state.innerActive=other;state.inner=CodeMirror.startState(other.mode,mode.indent?mode.indent(state.outer,""):0);}}}else if(state.innerActive.close==="\n"){state.innerActive=state.inner=null;}},electricChars:outer.electricChars,innerMode:function(state){return state.inner?{state:state.inner,mode:state.innerActive.mode}:{state:state.outer,mode:outer};}};};});;(function(mod){if(typeof exports=="object"&&typeof module=="object")
-mod(require("../../lib/codemirror"));else if(typeof define=="function"&&define.amd)
-define(["../../lib/codemirror"],mod);else
-mod(CodeMirror);})(function(CodeMirror){var ie_lt8=/MSIE \d/.test(navigator.userAgent)&&(document.documentMode==null||document.documentMode<8);var Pos=CodeMirror.Pos;var matching={"(":")>",")":"(<","[":"]>","]":"[<","{":"}>","}":"{<"};function findMatchingBracket(cm,where,strict,config){var line=cm.getLineHandle(where.line),pos=where.ch-1;var match=(pos>=0&&matching[line.text.charAt(pos)])||matching[line.text.charAt(++pos)];if(!match)return null;var dir=match.charAt(1)==">"?1:-1;if(strict&&(dir>0)!=(pos==where.ch))return null;var style=cm.getTokenTypeAt(Pos(where.line,pos+1));var found=scanForBracket(cm,Pos(where.line,pos+(dir>0?1:0)),dir,style||null,config);if(found==null)return null;return{from:Pos(where.line,pos),to:found&&found.pos,match:found&&found.ch==match.charAt(0),forward:dir>0};}
-function scanForBracket(cm,where,dir,style,config){var maxScanLen=(config&&config.maxScanLineLength)||10000;var maxScanLines=(config&&config.maxScanLines)||1000;var stack=[];var re=config&&config.bracketRegex?config.bracketRegex:/[(){}[\]]/;var lineEnd=dir>0?Math.min(where.line+maxScanLines,cm.lastLine()+1):Math.max(cm.firstLine()-1,where.line-maxScanLines);for(var lineNo=where.line;lineNo!=lineEnd;lineNo+=dir){var line=cm.getLine(lineNo);if(!line)continue;var pos=dir>0?0:line.length-1,end=dir>0?line.length:-1;if(line.length>maxScanLen)continue;if(lineNo==where.line)pos=where.ch-(dir<0?1:0);for(;pos!=end;pos+=dir){var ch=line.charAt(pos);if(re.test(ch)&&(style===undefined||cm.getTokenTypeAt(Pos(lineNo,pos+1))==style)){var match=matching[ch];if((match.charAt(1)==">")==(dir>0))stack.push(ch);else if(!stack.length)return{pos:Pos(lineNo,pos),ch:ch};else stack.pop();}}}
-return lineNo-dir==(dir>0?cm.lastLine():cm.firstLine())?false:null;}
-function matchBrackets(cm,autoclear,config){var maxHighlightLen=cm.state.matchBrackets.maxHighlightLineLength||1000;var marks=[],ranges=cm.listSelections();for(var i=0;i<ranges.length;i++){var match=ranges[i].empty()&&findMatchingBracket(cm,ranges[i].head,false,config);if(match&&cm.getLine(match.from.line).length<=maxHighlightLen){var style=match.match?"CodeMirror-matchingbracket":"CodeMirror-nonmatchingbracket";marks.push(cm.markText(match.from,Pos(match.from.line,match.from.ch+1),{className:style}));if(match.to&&cm.getLine(match.to.line).length<=maxHighlightLen)
-marks.push(cm.markText(match.to,Pos(match.to.line,match.to.ch+1),{className:style}));}}
-if(marks.length){if(ie_lt8&&cm.state.focused)cm.focus();var clear=function(){cm.operation(function(){for(var i=0;i<marks.length;i++)marks[i].clear();});};if(autoclear)setTimeout(clear,800);else return clear;}}
-var currentlyHighlighted=null;function doMatchBrackets(cm){cm.operation(function(){if(currentlyHighlighted){currentlyHighlighted();currentlyHighlighted=null;}
-currentlyHighlighted=matchBrackets(cm,false,cm.state.matchBrackets);});}
-CodeMirror.defineOption("matchBrackets",false,function(cm,val,old){if(old&&old!=CodeMirror.Init){cm.off("cursorActivity",doMatchBrackets);if(currentlyHighlighted){currentlyHighlighted();currentlyHighlighted=null;}}
-if(val){cm.state.matchBrackets=typeof val=="object"?val:{};cm.on("cursorActivity",doMatchBrackets);}});CodeMirror.defineExtension("matchBrackets",function(){matchBrackets(this,true);});CodeMirror.defineExtension("findMatchingBracket",function(pos,strict,config){return findMatchingBracket(this,pos,strict,config);});CodeMirror.defineExtension("scanForBracket",function(pos,dir,style,config){return scanForBracket(this,pos,dir,style,config);});});;(function(mod){if(typeof exports=="object"&&typeof module=="object")
-mod(require("../../lib/codemirror"));else if(typeof define=="function"&&define.amd)
-define(["../../lib/codemirror"],mod);else
-mod(CodeMirror);})(function(CodeMirror){var defaults={pairs:"()[]{}''\"\"",triples:"",explode:"[]{}"};var Pos=CodeMirror.Pos;CodeMirror.defineOption("autoCloseBrackets",false,function(cm,val,old){if(old&&old!=CodeMirror.Init){cm.removeKeyMap(keyMap);cm.state.closeBrackets=null;}
-if(val){cm.state.closeBrackets=val;cm.addKeyMap(keyMap);}});function getOption(conf,name){if(name=="pairs"&&typeof conf=="string")return conf;if(typeof conf=="object"&&conf[name]!=null)return conf[name];return defaults[name];}
-var bind=defaults.pairs+"`";var keyMap={Backspace:handleBackspace,Enter:handleEnter};for(var i=0;i<bind.length;i++)
-keyMap["'"+bind.charAt(i)+"'"]=handler(bind.charAt(i));function handler(ch){return function(cm){return handleChar(cm,ch);};}
-function getConfig(cm){var deflt=cm.state.closeBrackets;if(!deflt||deflt.override)return deflt;var mode=cm.getModeAt(cm.getCursor());return mode.closeBrackets||deflt;}
-function handleBackspace(cm){var conf=getConfig(cm);if(!conf||cm.getOption("disableInput"))return CodeMirror.Pass;var pairs=getOption(conf,"pairs");var ranges=cm.listSelections();for(var i=0;i<ranges.length;i++){if(!ranges[i].empty())return CodeMirror.Pass;var around=charsAround(cm,ranges[i].head);if(!around||pairs.indexOf(around)%2!=0)return CodeMirror.Pass;}
-for(var i=ranges.length-1;i>=0;i--){var cur=ranges[i].head;cm.replaceRange("",Pos(cur.line,cur.ch-1),Pos(cur.line,cur.ch+1),"+delete");}}
-function handleEnter(cm){var conf=getConfig(cm);var explode=conf&&getOption(conf,"explode");if(!explode||cm.getOption("disableInput"))return CodeMirror.Pass;var ranges=cm.listSelections();for(var i=0;i<ranges.length;i++){if(!ranges[i].empty())return CodeMirror.Pass;var around=charsAround(cm,ranges[i].head);if(!around||explode.indexOf(around)%2!=0)return CodeMirror.Pass;}
-cm.operation(function(){cm.replaceSelection("\n\n",null);cm.execCommand("goCharLeft");ranges=cm.listSelections();for(var i=0;i<ranges.length;i++){var line=ranges[i].head.line;cm.indentLine(line,null,true);cm.indentLine(line+1,null,true);}});}
-function contractSelection(sel){var inverted=CodeMirror.cmpPos(sel.anchor,sel.head)>0;return{anchor:new Pos(sel.anchor.line,sel.anchor.ch+(inverted?-1:1)),head:new Pos(sel.head.line,sel.head.ch+(inverted?1:-1))};}
-function handleChar(cm,ch){var conf=getConfig(cm);if(!conf||cm.getOption("disableInput"))return CodeMirror.Pass;var pairs=getOption(conf,"pairs");var pos=pairs.indexOf(ch);if(pos==-1)return CodeMirror.Pass;var triples=getOption(conf,"triples");var identical=pairs.charAt(pos+1)==ch;var ranges=cm.listSelections();var opening=pos%2==0;var type;for(var i=0;i<ranges.length;i++){var range=ranges[i],cur=range.head,curType;var next=cm.getRange(cur,Pos(cur.line,cur.ch+1));if(opening&&!range.empty()){curType="surround";}else if((identical||!opening)&&next==ch){if(identical&&stringStartsAfter(cm,cur))
-curType="both";else if(triples.indexOf(ch)>=0&&cm.getRange(cur,Pos(cur.line,cur.ch+3))==ch+ch+ch)
-curType="skipThree";else
-curType="skip";}else if(identical&&cur.ch>1&&triples.indexOf(ch)>=0&&cm.getRange(Pos(cur.line,cur.ch-2),cur)==ch+ch&&(cur.ch<=2||cm.getRange(Pos(cur.line,cur.ch-3),Pos(cur.line,cur.ch-2))!=ch)){curType="addFour";}else if(identical){if(!CodeMirror.isWordChar(next)&&enteringString(cm,cur,ch))curType="both";else return CodeMirror.Pass;}else if(opening&&(cm.getLine(cur.line).length==cur.ch||isClosingBracket(next,pairs)||/\s/.test(next))){curType="both";}else{return CodeMirror.Pass;}
-if(!type)type=curType;else if(type!=curType)return CodeMirror.Pass;}
-var left=pos%2?pairs.charAt(pos-1):ch;var right=pos%2?ch:pairs.charAt(pos+1);cm.operation(function(){if(type=="skip"){cm.execCommand("goCharRight");}else if(type=="skipThree"){for(var i=0;i<3;i++)
-cm.execCommand("goCharRight");}else if(type=="surround"){var sels=cm.getSelections();for(var i=0;i<sels.length;i++)
-sels[i]=left+sels[i]+right;cm.replaceSelections(sels,"around");sels=cm.listSelections().slice();for(var i=0;i<sels.length;i++)
-sels[i]=contractSelection(sels[i]);cm.setSelections(sels);}else if(type=="both"){cm.replaceSelection(left+right,null);cm.triggerElectric(left+right);cm.execCommand("goCharLeft");}else if(type=="addFour"){cm.replaceSelection(left+left+left+left,"before");cm.execCommand("goCharRight");}});}
-function isClosingBracket(ch,pairs){var pos=pairs.lastIndexOf(ch);return pos>-1&&pos%2==1;}
-function charsAround(cm,pos){var str=cm.getRange(Pos(pos.line,pos.ch-1),Pos(pos.line,pos.ch+1));return str.length==2?str:null;}
-function enteringString(cm,pos,ch){var line=cm.getLine(pos.line);var token=cm.getTokenAt(pos);if(/\bstring2?\b/.test(token.type)||stringStartsAfter(cm,pos))return false;var stream=new CodeMirror.StringStream(line.slice(0,pos.ch)+ch+line.slice(pos.ch),4);stream.pos=stream.start=token.start;for(;;){var type1=cm.getMode().token(stream,token.state);if(stream.pos>=pos.ch+1)return/\bstring2?\b/.test(type1);stream.start=stream.pos;}}
-function stringStartsAfter(cm,pos){var token=cm.getTokenAt(Pos(pos.line,pos.ch+1))
-return/\bstring/.test(token.type)&&token.start==pos.ch}});;(function(mod){if(typeof exports=="object"&&typeof module=="object")
-mod(require("../../lib/codemirror"));else if(typeof define=="function"&&define.amd)
-define(["../../lib/codemirror"],mod);else
-mod(CodeMirror);})(function(CodeMirror){"use strict";CodeMirror.defineOption("styleSelectedText",false,function(cm,val,old){var prev=old&&old!=CodeMirror.Init;if(val&&!prev){cm.state.markedSelection=[];cm.state.markedSelectionStyle=typeof val=="string"?val:"CodeMirror-selectedtext";reset(cm);cm.on("cursorActivity",onCursorActivity);cm.on("change",onChange);}else if(!val&&prev){cm.off("cursorActivity",onCursorActivity);cm.off("change",onChange);clear(cm);cm.state.markedSelection=cm.state.markedSelectionStyle=null;}});function onCursorActivity(cm){if(cm.state.markedSelection)
-cm.operation(function(){update(cm);});}
-function onChange(cm){if(cm.state.markedSelection&&cm.state.markedSelection.length)
-cm.operation(function(){clear(cm);});}
-var CHUNK_SIZE=8;var Pos=CodeMirror.Pos;var cmp=CodeMirror.cmpPos;function coverRange(cm,from,to,addAt){if(cmp(from,to)==0)return;var array=cm.state.markedSelection;var cls=cm.state.markedSelectionStyle;for(var line=from.line;;){var start=line==from.line?from:Pos(line,0);var endLine=line+CHUNK_SIZE,atEnd=endLine>=to.line;var end=atEnd?to:Pos(endLine,0);var mark=cm.markText(start,end,{className:cls});if(addAt==null)array.push(mark);else array.splice(addAt++,0,mark);if(atEnd)break;line=endLine;}}
-function clear(cm){var array=cm.state.markedSelection;for(var i=0;i<array.length;++i)array[i].clear();array.length=0;}
-function reset(cm){clear(cm);var ranges=cm.listSelections();for(var i=0;i<ranges.length;i++)
-coverRange(cm,ranges[i].from(),ranges[i].to());}
-function update(cm){if(!cm.somethingSelected())return clear(cm);if(cm.listSelections().length>1)return reset(cm);var from=cm.getCursor("start"),to=cm.getCursor("end");var array=cm.state.markedSelection;if(!array.length)return coverRange(cm,from,to);var coverStart=array[0].find(),coverEnd=array[array.length-1].find();if(!coverStart||!coverEnd||to.line-from.line<CHUNK_SIZE||cmp(from,coverEnd.to)>=0||cmp(to,coverStart.from)<=0)
-return reset(cm);while(cmp(from,coverStart.from)>0){array.shift().clear();coverStart=array[0].find();}
-if(cmp(from,coverStart.from)<0){if(coverStart.to.line-from.line<CHUNK_SIZE){array.shift().clear();coverRange(cm,from,coverStart.to,0);}else{coverRange(cm,from,coverStart.from,0);}}
-while(cmp(to,coverEnd.to)<0){array.pop().clear();coverEnd=array[array.length-1].find();}
-if(cmp(to,coverEnd.to)>0){if(to.line-coverEnd.from.line<CHUNK_SIZE){array.pop().clear();coverRange(cm,coverEnd.from,to);}else{coverRange(cm,coverEnd.to,to);}}}});;(function(mod){if(typeof exports=="object"&&typeof module=="object")
-mod(require("../../lib/codemirror"));else if(typeof define=="function"&&define.amd)
-define(["../../lib/codemirror"],mod);else
-mod(CodeMirror);})(function(CodeMirror){"use strict";var noOptions={};var nonWS=/[^\s\u00a0]/;var Pos=CodeMirror.Pos;function firstNonWS(str){var found=str.search(nonWS);return found==-1?0:found;}
-CodeMirror.commands.toggleComment=function(cm){cm.toggleComment();};CodeMirror.defineExtension("toggleComment",function(options){if(!options)options=noOptions;var cm=this;var minLine=Infinity,ranges=this.listSelections(),mode=null;for(var i=ranges.length-1;i>=0;i--){var from=ranges[i].from(),to=ranges[i].to();if(from.line>=minLine)continue;if(to.line>=minLine)to=Pos(minLine,0);minLine=from.line;if(mode==null){if(cm.uncomment(from,to,options))mode="un";else{cm.lineComment(from,to,options);mode="line";}}else if(mode=="un"){cm.uncomment(from,to,options);}else{cm.lineComment(from,to,options);}}});function probablyInsideString(cm,pos,line){return/\bstring\b/.test(cm.getTokenTypeAt(Pos(pos.line,0)))&&!/^[\'\"\`]/.test(line)}
-function getMode(cm,pos){var mode=cm.getMode()
-return mode.useInnerComments===false||!mode.innerMode?mode:cm.getModeAt(pos)}
-CodeMirror.defineExtension("lineComment",function(from,to,options){if(!options)options=noOptions;var self=this,mode=getMode(self,from);var firstLine=self.getLine(from.line);if(firstLine==null||probablyInsideString(self,from,firstLine))return;var commentString=options.lineComment||mode.lineComment;if(!commentString){if(options.blockCommentStart||mode.blockCommentStart){options.fullLines=true;self.blockComment(from,to,options);}
-return;}
-var end=Math.min(to.ch!=0||to.line==from.line?to.line+1:to.line,self.lastLine()+1);var pad=options.padding==null?" ":options.padding;var blankLines=options.commentBlankLines||from.line==to.line;self.operation(function(){if(options.indent){var baseString=null;for(var i=from.line;i<end;++i){var line=self.getLine(i);var whitespace=line.slice(0,firstNonWS(line));if(baseString==null||baseString.length>whitespace.length){baseString=whitespace;}}
-for(var i=from.line;i<end;++i){var line=self.getLine(i),cut=baseString.length;if(!blankLines&&!nonWS.test(line))continue;if(line.slice(0,cut)!=baseString)cut=firstNonWS(line);self.replaceRange(baseString+commentString+pad,Pos(i,0),Pos(i,cut));}}else{for(var i=from.line;i<end;++i){if(blankLines||nonWS.test(self.getLine(i)))
-self.replaceRange(commentString+pad,Pos(i,0));}}});});CodeMirror.defineExtension("blockComment",function(from,to,options){if(!options)options=noOptions;var self=this,mode=getMode(self,from);var startString=options.blockCommentStart||mode.blockCommentStart;var endString=options.blockCommentEnd||mode.blockCommentEnd;if(!startString||!endString){if((options.lineComment||mode.lineComment)&&options.fullLines!=false)
-self.lineComment(from,to,options);return;}
-if(/\bcomment\b/.test(self.getTokenTypeAt(Pos(from.line,0))))return
-var end=Math.min(to.line,self.lastLine());if(end!=from.line&&to.ch==0&&nonWS.test(self.getLine(end)))--end;var pad=options.padding==null?" ":options.padding;if(from.line>end)return;self.operation(function(){if(options.fullLines!=false){var lastLineHasText=nonWS.test(self.getLine(end));self.replaceRange(pad+endString,Pos(end));self.replaceRange(startString+pad,Pos(from.line,0));var lead=options.blockCommentLead||mode.blockCommentLead;if(lead!=null)for(var i=from.line+1;i<=end;++i)
-if(i!=end||lastLineHasText)
-self.replaceRange(lead+pad,Pos(i,0));}else{self.replaceRange(endString,to);self.replaceRange(startString,from);}});});CodeMirror.defineExtension("uncomment",function(from,to,options){if(!options)options=noOptions;var self=this,mode=getMode(self,from);var end=Math.min(to.ch!=0||to.line==from.line?to.line:to.line-1,self.lastLine()),start=Math.min(from.line,end);var lineString=options.lineComment||mode.lineComment,lines=[];var pad=options.padding==null?" ":options.padding,didSomething;lineComment:{if(!lineString)break lineComment;for(var i=start;i<=end;++i){var line=self.getLine(i);var found=line.indexOf(lineString);if(found>-1&&!/comment/.test(self.getTokenTypeAt(Pos(i,found+1))))found=-1;if(found==-1&&nonWS.test(line))break lineComment;if(found>-1&&nonWS.test(line.slice(0,found)))break lineComment;lines.push(line);}
-self.operation(function(){for(var i=start;i<=end;++i){var line=lines[i-start];var pos=line.indexOf(lineString),endPos=pos+lineString.length;if(pos<0)continue;if(line.slice(endPos,endPos+pad.length)==pad)endPos+=pad.length;didSomething=true;self.replaceRange("",Pos(i,pos),Pos(i,endPos));}});if(didSomething)return true;}
-var startString=options.blockCommentStart||mode.blockCommentStart;var endString=options.blockCommentEnd||mode.blockCommentEnd;if(!startString||!endString)return false;var lead=options.blockCommentLead||mode.blockCommentLead;var startLine=self.getLine(start),open=startLine.indexOf(startString)
-if(open==-1)return false
-var endLine=end==start?startLine:self.getLine(end)
-var close=endLine.indexOf(endString,end==start?open+startString.length:0);if(close==-1&&start!=end){endLine=self.getLine(--end);close=endLine.indexOf(endString);}
-var insideStart=Pos(start,open+1),insideEnd=Pos(end,close+1)
-if(close==-1||!/comment/.test(self.getTokenTypeAt(insideStart))||!/comment/.test(self.getTokenTypeAt(insideEnd))||self.getRange(insideStart,insideEnd,"\n").indexOf(endString)>-1)
-return false;var lastStart=startLine.lastIndexOf(startString,from.ch);var firstEnd=lastStart==-1?-1:startLine.slice(0,from.ch).indexOf(endString,lastStart+startString.length);if(lastStart!=-1&&firstEnd!=-1&&firstEnd+endString.length!=from.ch)return false;firstEnd=endLine.indexOf(endString,to.ch);var almostLastStart=endLine.slice(to.ch).lastIndexOf(startString,firstEnd-to.ch);lastStart=(firstEnd==-1||almostLastStart==-1)?-1:to.ch+almostLastStart;if(firstEnd!=-1&&lastStart!=-1&&lastStart!=to.ch)return false;self.operation(function(){self.replaceRange("",Pos(end,close-(pad&&endLine.slice(close-pad.length,close)==pad?pad.length:0)),Pos(end,close+endString.length));var openEnd=open+startString.length;if(pad&&startLine.slice(openEnd,openEnd+pad.length)==pad)openEnd+=pad.length;self.replaceRange("",Pos(start,open),Pos(start,openEnd));if(lead)for(var i=start+1;i<=end;++i){var line=self.getLine(i),found=line.indexOf(lead);if(found==-1||nonWS.test(line.slice(0,found)))continue;var foundEnd=found+lead.length;if(pad&&line.slice(foundEnd,foundEnd+pad.length)==pad)foundEnd+=pad.length;self.replaceRange("",Pos(i,found),Pos(i,foundEnd));}});return true;});});;(function(mod){if(typeof exports=="object"&&typeof module=="object")
-mod(require("../../lib/codemirror"));else if(typeof define=="function"&&define.amd)
-define(["../../lib/codemirror"],mod);else
-mod(CodeMirror);})(function(CodeMirror){"use strict";CodeMirror.overlayMode=function(base,overlay,combine){return{startState:function(){return{base:CodeMirror.startState(base),overlay:CodeMirror.startState(overlay),basePos:0,baseCur:null,overlayPos:0,overlayCur:null,streamSeen:null};},copyState:function(state){return{base:CodeMirror.copyState(base,state.base),overlay:CodeMirror.copyState(overlay,state.overlay),basePos:state.basePos,baseCur:null,overlayPos:state.overlayPos,overlayCur:null};},token:function(stream,state){if(stream!=state.streamSeen||Math.min(state.basePos,state.overlayPos)<stream.start){state.streamSeen=stream;state.basePos=state.overlayPos=stream.start;}
-if(stream.start==state.basePos){state.baseCur=base.token(stream,state.base);state.basePos=stream.pos;}
-if(stream.start==state.overlayPos){stream.pos=stream.start;state.overlayCur=overlay.token(stream,state.overlay);state.overlayPos=stream.pos;}
-stream.pos=Math.min(state.basePos,state.overlayPos);if(state.overlayCur==null)return state.baseCur;else if(state.baseCur!=null&&state.overlay.combineTokens||combine&&state.overlay.combineTokens==null)
-return state.baseCur+" "+state.overlayCur;else return state.overlayCur;},indent:base.indent&&function(state,textAfter){return base.indent(state.base,textAfter);},electricChars:base.electricChars,innerMode:function(state){return{state:state.base,mode:base};},blankLine:function(state){var baseToken,overlayToken;if(base.blankLine)baseToken=base.blankLine(state.base);if(overlay.blankLine)overlayToken=overlay.blankLine(state.overlay);return overlayToken==null?baseToken:(combine&&baseToken!=null?baseToken+" "+overlayToken:overlayToken);}};};});;(function(mod){if(typeof exports=="object"&&typeof module=="object")
-mod(require("../../lib/codemirror"));else if(typeof define=="function"&&define.amd)
-define(["../../lib/codemirror"],mod);else
-mod(CodeMirror);})(function(CodeMirror){"use strict";var WRAP_CLASS="CodeMirror-activeline";var BACK_CLASS="CodeMirror-activeline-background";var GUTT_CLASS="CodeMirror-activeline-gutter";CodeMirror.defineOption("styleActiveLine",false,function(cm,val,old){var prev=old==CodeMirror.Init?false:old;if(val==prev)return
-if(prev){cm.off("beforeSelectionChange",selectionChange);clearActiveLines(cm);delete cm.state.activeLines;}
-if(val){cm.state.activeLines=[];updateActiveLines(cm,cm.listSelections());cm.on("beforeSelectionChange",selectionChange);}});function clearActiveLines(cm){for(var i=0;i<cm.state.activeLines.length;i++){cm.removeLineClass(cm.state.activeLines[i],"wrap",WRAP_CLASS);cm.removeLineClass(cm.state.activeLines[i],"background",BACK_CLASS);cm.removeLineClass(cm.state.activeLines[i],"gutter",GUTT_CLASS);}}
-function sameArray(a,b){if(a.length!=b.length)return false;for(var i=0;i<a.length;i++)
-if(a[i]!=b[i])return false;return true;}
-function updateActiveLines(cm,ranges){var active=[];for(var i=0;i<ranges.length;i++){var range=ranges[i];var option=cm.getOption("styleActiveLine");if(typeof option=="object"&&option.nonEmpty?range.anchor.line!=range.head.line:!range.empty())
-continue
-var line=cm.getLineHandleVisualStart(range.head.line);if(active[active.length-1]!=line)active.push(line);}
-if(sameArray(cm.state.activeLines,active))return;cm.operation(function(){clearActiveLines(cm);for(var i=0;i<active.length;i++){cm.addLineClass(active[i],"wrap",WRAP_CLASS);cm.addLineClass(active[i],"background",BACK_CLASS);cm.addLineClass(active[i],"gutter",GUTT_CLASS);}
-cm.state.activeLines=active;});}
-function selectionChange(cm,sel){updateActiveLines(cm,sel.ranges);}});;Runtime.cachedResources["cm/codemirror.css"]="/* BASICS */\n\n.CodeMirror {\n /* Set height, width, borders, and global font properties here */\n font-family: monospace;\n height: 300px;\n color: black;\n}\n\n/* PADDING */\n\n.CodeMirror-lines {\n padding: 4px 0; /* Vertical padding around content */\n}\n.CodeMirror pre {\n padding: 0 4px; /* Horizontal padding of content */\n}\n\n.CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {\n background-color: white; /* The little square between H and V scrollbars */\n}\n\n/* GUTTER */\n\n.CodeMirror-gutters {\n border-right: 1px solid #ddd;\n background-color: #f7f7f7;\n white-space: nowrap;\n}\n.CodeMirror-linenumbers {}\n.CodeMirror-linenumber {\n padding: 0 3px 0 5px;\n min-width: 20px;\n text-align: right;\n color: #999;\n white-space: nowrap;\n}\n\n.CodeMirror-guttermarker { color: black; }\n.CodeMirror-guttermarker-subtle { color: #999; }\n\n/* CURSOR */\n\n.CodeMirror-cursor {\n border-left: 1px solid black;\n border-right: none;\n width: 0;\n}\n/* Shown when moving in bi-directional text */\n.CodeMirror div.CodeMirror-secondarycursor {\n border-left: 1px solid silver;\n}\n.cm-fat-cursor .CodeMirror-cursor {\n width: auto;\n border: 0 !important;\n background: #7e7;\n}\n.cm-fat-cursor div.CodeMirror-cursors {\n z-index: 1;\n}\n\n.cm-animate-fat-cursor {\n width: auto;\n border: 0;\n -webkit-animation: blink 1.06s steps(1) infinite;\n -moz-animation: blink 1.06s steps(1) infinite;\n animation: blink 1.06s steps(1) infinite;\n background-color: #7e7;\n}\n@-moz-keyframes blink {\n 0% {}\n 50% { background-color: transparent; }\n 100% {}\n}\n@-webkit-keyframes blink {\n 0% {}\n 50% { background-color: transparent; }\n 100% {}\n}\n@keyframes blink {\n 0% {}\n 50% { background-color: transparent; }\n 100% {}\n}\n\n/* Can style cursor different in overwrite (non-insert) mode */\n.CodeMirror-overwrite .CodeMirror-cursor {}\n\n.cm-tab { display: inline-block; text-decoration: inherit; }\n\n.CodeMirror-rulers {\n position: absolute;\n left: 0; right: 0; top: -50px; bottom: -20px;\n overflow: hidden;\n}\n.CodeMirror-ruler {\n border-left: 1px solid #ccc;\n top: 0; bottom: 0;\n position: absolute;\n}\n\n/* DEFAULT THEME */\n\n.cm-s-default .cm-header {color: blue;}\n.cm-s-default .cm-quote {color: #090;}\n.cm-negative {color: #d44;}\n.cm-positive {color: #292;}\n.cm-header, .cm-strong {font-weight: bold;}\n.cm-em {font-style: italic;}\n.cm-link {text-decoration: underline;}\n.cm-strikethrough {text-decoration: line-through;}\n\n.cm-s-default .cm-keyword {color: #708;}\n.cm-s-default .cm-atom {color: #219;}\n.cm-s-default .cm-number {color: #164;}\n.cm-s-default .cm-def {color: #00f;}\n.cm-s-default .cm-variable,\n.cm-s-default .cm-punctuation,\n.cm-s-default .cm-property,\n.cm-s-default .cm-operator {}\n.cm-s-default .cm-variable-2 {color: #05a;}\n.cm-s-default .cm-variable-3 {color: #085;}\n.cm-s-default .cm-comment {color: #a50;}\n.cm-s-default .cm-string {color: #a11;}\n.cm-s-default .cm-string-2 {color: #f50;}\n.cm-s-default .cm-meta {color: #555;}\n.cm-s-default .cm-qualifier {color: #555;}\n.cm-s-default .cm-builtin {color: #30a;}\n.cm-s-default .cm-bracket {color: #997;}\n.cm-s-default .cm-tag {color: #170;}\n.cm-s-default .cm-attribute {color: #00c;}\n.cm-s-default .cm-hr {color: #999;}\n.cm-s-default .cm-link {color: #00c;}\n\n.cm-s-default .cm-error {color: #f00;}\n.cm-invalidchar {color: #f00;}\n\n.CodeMirror-composing { border-bottom: 2px solid; }\n\n/* Default styles for common addons */\n\ndiv.CodeMirror span.CodeMirror-matchingbracket {color: #0f0;}\ndiv.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;}\n.CodeMirror-matchingtag { background: rgba(255, 150, 0, .3); }\n.CodeMirror-activeline-background {background: #e8f2ff;}\n\n/* STOP */\n\n/* The rest of this file contains styles related to the mechanics of\n the editor. You probably shouldn't touch them. */\n\n.CodeMirror {\n position: relative;\n overflow: hidden;\n background: white;\n}\n\n.CodeMirror-scroll {\n overflow: scroll !important; /* Things will break if this is overridden */\n /* 30px is the magic margin used to hide the element's real scrollbars */\n /* See overflow: hidden in .CodeMirror */\n margin-bottom: -30px; margin-right: -30px;\n padding-bottom: 30px;\n height: 100%;\n outline: none; /* Prevent dragging from highlighting the element */\n position: relative;\n}\n.CodeMirror-sizer {\n position: relative;\n border-right: 30px solid transparent;\n}\n\n/* The fake, visible scrollbars. Used to force redraw during scrolling\n before actual scrolling happens, thus preventing shaking and\n flickering artifacts. */\n.CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {\n position: absolute;\n z-index: 6;\n display: none;\n}\n.CodeMirror-vscrollbar {\n right: 0; top: 0;\n overflow-x: hidden;\n overflow-y: scroll;\n}\n.CodeMirror-hscrollbar {\n bottom: 0; left: 0;\n overflow-y: hidden;\n overflow-x: scroll;\n}\n.CodeMirror-scrollbar-filler {\n right: 0; bottom: 0;\n}\n.CodeMirror-gutter-filler {\n left: 0; bottom: 0;\n}\n\n.CodeMirror-gutters {\n position: absolute; left: 0; top: 0;\n min-height: 100%;\n z-index: 3;\n}\n.CodeMirror-gutter {\n white-space: normal;\n height: 100%;\n display: inline-block;\n vertical-align: top;\n margin-bottom: -30px;\n}\n.CodeMirror-gutter-wrapper {\n position: absolute;\n z-index: 4;\n background: none !important;\n border: none !important;\n}\n.CodeMirror-gutter-background {\n position: absolute;\n top: 0; bottom: 0;\n z-index: 4;\n}\n.CodeMirror-gutter-elt {\n position: absolute;\n cursor: default;\n z-index: 4;\n}\n.CodeMirror-gutter-wrapper ::selection { background-color: transparent }\n.CodeMirror-gutter-wrapper ::-moz-selection { background-color: transparent }\n\n.CodeMirror-lines {\n cursor: text;\n min-height: 1px; /* prevents collapsing before first draw */\n}\n.CodeMirror pre {\n /* Reset some styles that the rest of the page might have set */\n -moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0;\n border-width: 0;\n background: transparent;\n font-family: inherit;\n font-size: inherit;\n margin: 0;\n white-space: pre;\n word-wrap: normal;\n line-height: inherit;\n color: inherit;\n z-index: 2;\n position: relative;\n overflow: visible;\n -webkit-tap-highlight-color: transparent;\n -webkit-font-variant-ligatures: contextual;\n font-variant-ligatures: contextual;\n}\n.CodeMirror-wrap pre {\n word-wrap: break-word;\n white-space: pre-wrap;\n word-break: normal;\n}\n\n.CodeMirror-linebackground {\n position: absolute;\n left: 0; right: 0; top: 0; bottom: 0;\n z-index: 0;\n}\n\n.CodeMirror-linewidget {\n position: relative;\n z-index: 2;\n overflow: auto;\n}\n\n.CodeMirror-widget {}\n\n.CodeMirror-rtl pre { direction: rtl; }\n\n.CodeMirror-code {\n outline: none;\n}\n\n/* Force content-box sizing for the elements where we expect it */\n.CodeMirror-scroll,\n.CodeMirror-sizer,\n.CodeMirror-gutter,\n.CodeMirror-gutters,\n.CodeMirror-linenumber {\n -moz-box-sizing: content-box;\n box-sizing: content-box;\n}\n\n.CodeMirror-measure {\n position: absolute;\n width: 100%;\n height: 0;\n overflow: hidden;\n visibility: hidden;\n}\n\n.CodeMirror-cursor {\n position: absolute;\n pointer-events: none;\n}\n.CodeMirror-measure pre { position: static; }\n\ndiv.CodeMirror-cursors {\n visibility: hidden;\n position: relative;\n z-index: 3;\n}\ndiv.CodeMirror-dragcursors {\n visibility: visible;\n}\n\n.CodeMirror-focused div.CodeMirror-cursors {\n visibility: visible;\n}\n\n.CodeMirror-selected { background: #d9d9d9; }\n.CodeMirror-focused .CodeMirror-selected { background: #d7d4f0; }\n.CodeMirror-crosshair { cursor: crosshair; }\n.CodeMirror-line::selection, .CodeMirror-line > span::selection, .CodeMirror-line > span > span::selection { background: #d7d4f0; }\n.CodeMirror-line::-moz-selection, .CodeMirror-line > span::-moz-selection, .CodeMirror-line > span > span::-moz-selection { background: #d7d4f0; }\n\n.cm-searching {\n background: #ffa;\n background: rgba(255, 255, 0, .4);\n}\n\n/* Used to force a border model for a node */\n.cm-force-border { padding-right: .1px; }\n\n@media print {\n /* Hide the cursor when printing */\n .CodeMirror div.CodeMirror-cursors {\n visibility: hidden;\n }\n}\n\n/* See issue #2901 */\n.cm-tab-wrap-hack:after { content: ''; }\n\n/* Help users use markselection to safely style text background */\nspan.CodeMirror-selectedtext { background: none; }\n\n/*# sourceURL=cm/codemirror.css */";
\ No newline at end of file
diff --git a/src/cobalt/debug/content/devtools/color_picker/color_picker_module.js b/src/cobalt/debug/content/devtools/color_picker/color_picker_module.js
deleted file mode 100644
index 0728f2f..0000000
--- a/src/cobalt/debug/content/devtools/color_picker/color_picker_module.js
+++ /dev/null
@@ -1,203 +0,0 @@
-ColorPicker.ContrastInfo=class{constructor(){this._fgColor=null;this._bgColor=null;this._gradient=null;this._contrastRatio=null;this._contrastRatioThresholds=null;this._colorString='';}
-setContrastInfo(contrastInfo){this._contrastRatio=null;this._contrastRatioThresholds=null;this._bgColor=null;this._gradient=null;if(contrastInfo.computedFontSize&&contrastInfo.computedFontWeight&&contrastInfo.computedBodyFontSize){var isLargeFont=ColorPicker.ContrastInfo.computeIsLargeFont(contrastInfo.computedFontSize,contrastInfo.computedFontWeight,contrastInfo.computedBodyFontSize);this._contrastRatioThresholds=ColorPicker.ContrastInfo._ContrastThresholds[(isLargeFont?'largeFont':'normalFont')];}
-if(!contrastInfo.backgroundColors||!contrastInfo.backgroundColors.length)
-return;if(contrastInfo.backgroundColors.length>1){this._gradient=[];for(var bgColorText of contrastInfo.backgroundColors){var bgColor=Common.Color.parse(bgColorText);if(bgColor)
-this._gradient.push(bgColor);}
-if(this._fgColor)
-this._updateBgColorFromGradient();}else{var bgColorText=contrastInfo.backgroundColors[0];var bgColor=Common.Color.parse(bgColorText);if(bgColor)
-this.setBgColor(bgColor);}}
-setColor(hsva,colorString){this._fgColor=Common.Color.fromHSVA(hsva);this._colorString=colorString;if(this._gradient)
-this._updateBgColorFromGradient();else
-this._updateContrastRatio();}
-contrastRatio(){return this._contrastRatio;}
-colorString(){return this._colorString;}
-hsva(){return this._fgColor.hsva();}
-setBgColor(bgColor){this._bgColor=bgColor;if(!this._fgColor)
-return;var fgRGBA=this._fgColor.rgba();if(bgColor.hasAlpha){var blendedRGBA=[];Common.Color.blendColors(bgColor.rgba(),fgRGBA,blendedRGBA);this._bgColor=new Common.Color(blendedRGBA,Common.Color.Format.RGBA);}
-this._contrastRatio=Common.Color.calculateContrastRatio(fgRGBA,this._bgColor.rgba());}
-bgColor(){return this._bgColor;}
-gradient(){return this._gradient;}
-_updateContrastRatio(){if(!this._bgColor||!this._fgColor)
-return;this._contrastRatio=Common.Color.calculateContrastRatio(this._fgColor.rgba(),this._bgColor.rgba());}
-_updateBgColorFromGradient(){if(!this._gradient||!this._fgColor)
-return;var fgLuminance=Common.Color.luminance(this._fgColor.rgba());var luminanceDiff=2;var closestBgColor=null;for(var bgColor of this._gradient){var bgLuminance=Common.Color.luminance(bgColor.rgba());var currentLuminanceDiff=Math.abs(fgLuminance-bgLuminance);if(currentLuminanceDiff<luminanceDiff){closestBgColor=bgColor;luminanceDiff=currentLuminanceDiff;}}
-if(closestBgColor)
-this.setBgColor(closestBgColor);}
-contrastRatioThreshold(level){if(!this._contrastRatioThresholds)
-return null;return this._contrastRatioThresholds[level];}
-static computeIsLargeFont(fontSize,fontWeight,bodyFontSize){const boldWeights=['bold','bolder','600','700','800','900'];var fontSizePx=parseFloat(fontSize.replace('px',''));var isBold=(boldWeights.indexOf(fontWeight)!==-1);if(bodyFontSize){var bodyFontSizePx=parseFloat(bodyFontSize.replace('px',''));if(isBold){if(fontSizePx>=(bodyFontSizePx*1.2))
-return true;}else if(fontSizePx>=(bodyFontSizePx*1.5)){return true;}
-return false;}
-var fontSizePt=Math.ceil(fontSizePx*72/96);if(isBold)
-return fontSizePt>=14;else
-return fontSizePt>=18;}};ColorPicker.ContrastInfo._ContrastThresholds={largeFont:{AA:3.0,AAA:4.5},normalFont:{AA:4.5,AAA:7.0}};ColorPicker.ContrastOverlay=class{constructor(colorElement,contentElement,toggleMainColorPickerCallback){this._contrastInfo=new ColorPicker.ContrastInfo();var contrastRatioSVG=colorElement.createSVGChild('svg','spectrum-contrast-container fill');this._contrastRatioLine=contrastRatioSVG.createSVGChild('path','spectrum-contrast-line');this._contrastValueBubble=colorElement.createChild('button','spectrum-contrast-info');this._contrastValueBubble.classList.add('force-white-icons');UI.ARIAUtils.setExpanded(this._contrastValueBubble,false);this._contrastValueBubble.createChild('span','low-contrast').textContent=Common.UIString('Low contrast');this._contrastValue=this._contrastValueBubble.createChild('span','value');this._contrastValueBubble.appendChild(UI.Icon.create('smallicon-contrast-ratio'));this._contrastValueBubble.title=Common.UIString('Click to toggle contrast ratio details');this._contrastValueBubble.addEventListener('mousedown',this._toggleContrastDetails.bind(this),true);this._contrastValueBubble.addEventListener('click',this._onToggleClick.bind(this),true);this._contrastValueBubbleBoxInWindow=new AnchorBox(0,0,0,0);this._contrastDetails=new ColorPicker.ContrastDetails(this._contrastInfo,contentElement,toggleMainColorPickerCallback,this._update.bind(this));UI.ARIAUtils.setControls(this._contrastValueBubble,this._contrastDetails.element());this._width=0;this._height=0;this._contrastRatioLineThrottler=new Common.Throttler(0);this._drawContrastRatioLineBound=this._drawContrastRatioLine.bind(this);this._hueForCurrentLine=null;this._alphaForCurrentLine=null;this._bgColorForCurrentLine=null;}
-setContrastInfo(contrastInfo){this._contrastInfo.setContrastInfo(contrastInfo);this._update();}
-setColor(hsva,colorString){this._contrastInfo.setColor(hsva,colorString);this._update();}
-moveAwayFrom(x,y){if(!this._contrastValueBubbleBoxInWindow.width||!this._contrastValueBubbleBoxInWindow.height||!this._contrastValueBubbleBoxInWindow.contains(x,y))
-return;var bubble=this._contrastValueBubble;if(bubble.offsetWidth>((bubble.offsetParent.offsetWidth/2)-10))
-bubble.classList.toggle('contrast-info-top');else
-bubble.classList.toggle('contrast-info-left');}
-_update(){UI.ARIAUtils.setExpanded(this._contrastValueBubble,this._contrastDetails.visible());var AA=this._contrastInfo.contrastRatioThreshold('AA');if(!AA)
-return;this._contrastValue.textContent='';if(this._contrastInfo.contrastRatio()!==null){this._contrastValue.textContent=this._contrastInfo.contrastRatio().toFixed(2);this._contrastRatioLineThrottler.schedule(this._drawContrastRatioLineBound);var passesAA=this._contrastInfo.contrastRatio()>=AA;this._contrastValueBubble.classList.toggle('contrast-fail',!passesAA);this._contrastValueBubble.classList.remove('contrast-unknown');}else{this._contrastValueBubble.classList.remove('contrast-fail');this._contrastValueBubble.classList.add('contrast-unknown');}
-this._contrastValueBubbleBoxInWindow=this._contrastValueBubble.boxInWindow();this._contrastDetails.update();}
-show(width,height,dragX,dragY){if(this._contrastInfo.contrastRatioThreshold('AA')===null){this.hide();return;}
-this._width=width;this._height=height;this._update();this._contrastValueBubble.classList.remove('hidden');this.moveAwayFrom(dragX,dragY);}
-hide(){this._contrastValueBubble.classList.add('hidden');}
-_toggleContrastDetails(event){if('button'in event&&event.button!==0)
-return;event.consume();this._contrastDetails.toggleVisible();UI.ARIAUtils.setExpanded(this._contrastValueBubble,this._contrastDetails.visible());}
-_onToggleClick(event){if(event.screenX||event.screenY)
-return;event.consume();this._toggleContrastDetails(event);}
-_drawContrastRatioLine(){var width=this._width;var height=this._height;var requiredContrast=this._contrastInfo.contrastRatioThreshold('AA');if(!width||!height||!requiredContrast)
-return Promise.resolve();const dS=0.02;const epsilon=0.0002;const H=0;const S=1;const V=2;const A=3;var hsva=this._contrastInfo.hsva();var bgColor=this._contrastInfo.bgColor();if(!hsva||!bgColor)
-return Promise.resolve();var bgColorString=bgColor.asString(Common.Color.Format.RGBA);if(hsva[H]===this._hueForCurrentLine&&hsva[A]===this._alphaForCurrentLine&&bgColorString===this._bgColorForCurrentLine)
-return Promise.resolve();var fgRGBA=[];Common.Color.hsva2rgba(hsva,fgRGBA);var bgRGBA=bgColor.rgba();var bgLuminance=Common.Color.luminance(bgRGBA);var blendedRGBA=[];Common.Color.blendColors(fgRGBA,bgRGBA,blendedRGBA);var fgLuminance=Common.Color.luminance(blendedRGBA);this._contrastValueBubble.classList.toggle('light',fgLuminance>0.5);var fgIsLighter=fgLuminance>bgLuminance;var desiredLuminance=Common.Color.desiredLuminance(bgLuminance,requiredContrast,fgIsLighter);var lastV=hsva[V];var currentSlope=0;var candidateHSVA=[hsva[H],0,0,hsva[A]];var pathBuilder=[];var candidateRGBA=[];Common.Color.hsva2rgba(candidateHSVA,candidateRGBA);Common.Color.blendColors(candidateRGBA,bgRGBA,blendedRGBA);function updateCandidateAndComputeDelta(index,x){candidateHSVA[index]=x;Common.Color.hsva2rgba(candidateHSVA,candidateRGBA);Common.Color.blendColors(candidateRGBA,bgRGBA,blendedRGBA);return Common.Color.luminance(blendedRGBA)-desiredLuminance;}
-function approach(index){var x=candidateHSVA[index];var multiplier=1;var dLuminance=updateCandidateAndComputeDelta(index,x);var previousSign=Math.sign(dLuminance);for(var guard=100;guard;guard--){if(Math.abs(dLuminance)<epsilon)
-return x;var sign=Math.sign(dLuminance);if(sign!==previousSign){multiplier/=2;previousSign=sign;}else if(x<0||x>1){return null;}
-x+=multiplier*(index===V?-dLuminance:dLuminance);dLuminance=updateCandidateAndComputeDelta(index,x);}
-console.error('Loop exited unexpectedly');return null;}
-for(var s=0;s<1+dS;s+=dS){s=Math.min(1,s);candidateHSVA[S]=s;candidateHSVA[V]=lastV+currentSlope*dS;var v=approach(V);if(v===null)
-break;currentSlope=s===0?0:(v-lastV)/dS;lastV=v;pathBuilder.push(pathBuilder.length?'L':'M');pathBuilder.push((s*width).toFixed(2));pathBuilder.push(((1-v)*height).toFixed(2));}
-if(s<1+dS){s-=dS;candidateHSVA[V]=1;s=approach(S);if(s!==null)
-pathBuilder=pathBuilder.concat(['L',(s*width).toFixed(2),'-0.1']);}
-this._contrastRatioLine.setAttribute('d',pathBuilder.join(' '));this._bgColorForCurrentLine=bgColorString;this._hueForCurrentLine=hsva[H];this._alphaForCurrentLine=hsva[A];return Promise.resolve();}};ColorPicker.ContrastDetails=class{constructor(contrastInfo,contentElement,toggleMainColorPickerCallback,updateContrastOverlayCallback){this._contrastInfo=contrastInfo;this._toggleMainColorPicker=toggleMainColorPickerCallback;this._updateContrastOverlayCallback=updateContrastOverlayCallback;this._visible=false;this._contrastDetails=contentElement.createChild('div','spectrum-contrast-details');this._contrastDetails.id='contrast-ratio-details';var contrastValueRow=this._contrastDetails.createChild('div');contrastValueRow.createTextChild(Common.UIString('Contrast Ratio'));contrastValueRow.createTextChild(' ');var linkName=Common.UIString('Color and contrast on Web Fundamentals');var contrastLink=UI.createExternalLink('https://developers.google.com/web/fundamentals/accessibility/accessible-styles#color_and_contrast',linkName,'contrast-link');contrastLink.textContent='';contrastValueRow.appendChild(contrastLink);UI.ARIAUtils.setAccessibleName(contrastLink,linkName);contrastLink.appendChild(UI.Icon.create('mediumicon-info'));this._contrastValueBubble=contrastValueRow.createChild('span','contrast-details-value force-white-icons');this._contrastValue=this._contrastValueBubble.createChild('span');this._contrastValueBubbleIcons=[];this._contrastValueBubbleIcons.push(this._contrastValueBubble.appendChild(UI.Icon.create('smallicon-checkmark-square')));this._contrastValueBubbleIcons.push(this._contrastValueBubble.appendChild(UI.Icon.create('smallicon-checkmark-behind')));this._contrastValueBubbleIcons.push(this._contrastValueBubble.appendChild(UI.Icon.create('smallicon-no')));this._contrastValueBubble.addEventListener('mouseenter',this._toggleContrastValueHovered.bind(this));this._contrastValueBubble.addEventListener('mouseleave',this._toggleContrastValueHovered.bind(this));var toolbar=new UI.Toolbar('',contrastValueRow);var closeButton=new UI.ToolbarButton('Hide contrast ratio details','largeicon-delete');closeButton.addEventListener(UI.ToolbarButton.Events.Click,this.hide.bind(this));toolbar.appendToolbarItem(closeButton);this._chooseBgColor=this._contrastDetails.createChild('div','contrast-choose-bg-color');this._chooseBgColor.textContent=Common.UIString('Please select background color to compute contrast ratio.');this._contrastThresholds=this._contrastDetails.createChild('div','contrast-thresholds');this._contrastAA=this._contrastThresholds.createChild('div','contrast-threshold');this._contrastAA.appendChild(UI.Icon.create('smallicon-checkmark-square'));this._contrastAA.appendChild(UI.Icon.create('smallicon-no'));this._contrastPassFailAA=this._contrastAA.createChild('span','contrast-pass-fail');this._contrastAAA=this._contrastThresholds.createChild('div','contrast-threshold');this._contrastAAA.appendChild(UI.Icon.create('smallicon-checkmark-square'));this._contrastAAA.appendChild(UI.Icon.create('smallicon-no'));this._contrastPassFailAAA=this._contrastAAA.createChild('span','contrast-pass-fail');var bgColorRow=this._contrastDetails.createChild('div');bgColorRow.createTextChild(Common.UIString('Background color:'));this._bgColorSwatch=new ColorPicker.ContrastDetails.Swatch(bgColorRow);this._bgColorPicker=bgColorRow.createChild('button','background-color-picker');this._bgColorPicker.appendChild(UI.Icon.create('largeicon-eyedropper'));this._bgColorPicker.addEventListener('click',this._toggleBackgroundColorPicker.bind(this,undefined));this._bgColorPickedBound=this._bgColorPicked.bind(this);}
-update(){var AA=this._contrastInfo.contrastRatioThreshold('AA');var AAA=this._contrastInfo.contrastRatioThreshold('AAA');if(!AA)
-return;var contrastRatio=this._contrastInfo.contrastRatio();var bgColor=this._contrastInfo.bgColor();if(!contrastRatio||!bgColor){this._contrastValue.textContent='?';this._contrastValueBubble.classList.add('contrast-unknown');this._chooseBgColor.classList.remove('hidden');this._contrastThresholds.classList.add('hidden');return;}
-this._chooseBgColor.classList.add('hidden');this._contrastThresholds.classList.remove('hidden');this._contrastValueBubble.classList.remove('contrast-unknown');this._contrastValue.textContent=contrastRatio.toFixed(2);var gradient=this._contrastInfo.gradient();if(gradient&&gradient.length){var darkest=null;var lightness=null;for(var color of gradient){var hsla=color.hsla();if(!darkest||hsla[2]<lightness){darkest=color;lightness=hsla[2];}}
-var gradientStrings=gradient.map(color=>color.asString(Common.Color.Format.RGBA));var gradientString=String.sprintf('linear-gradient(90deg, %s)',gradientStrings.join(', '));this._bgColorSwatch.setColor((darkest),gradientString);}else{this._bgColorSwatch.setColor(bgColor);}
-var passesAA=this._contrastInfo.contrastRatio()>=AA;this._contrastPassFailAA.textContent='';this._contrastPassFailAA.createTextChild(passesAA?Common.UIString('Passes '):Common.UIString('Fails '));this._contrastPassFailAA.createChild('strong').textContent=Common.UIString('AA (%s)',AA.toFixed(1));this._contrastAA.classList.toggle('pass',passesAA);this._contrastAA.classList.toggle('fail',!passesAA);var passesAAA=this._contrastInfo.contrastRatio()>=AAA;this._contrastPassFailAAA.textContent='';this._contrastPassFailAAA.createTextChild(passesAAA?Common.UIString('Passes '):Common.UIString('Fails '));this._contrastPassFailAAA.createChild('strong').textContent=Common.UIString('AAA (%s)',AAA.toFixed(1));this._contrastAAA.classList.toggle('pass',passesAAA);this._contrastAAA.classList.toggle('fail',!passesAAA);this._contrastValueBubble.classList.toggle('contrast-fail',!passesAA);this._contrastValueBubble.classList.toggle('contrast-aa',passesAA);this._contrastValueBubble.classList.toggle('contrast-aaa',passesAAA);this._contrastValueBubble.style.color=this._contrastInfo.colorString();for(var i=0;i<this._contrastValueBubbleIcons.length;i++)
-this._contrastValueBubbleIcons[i].style.setProperty('background',this._contrastInfo.colorString(),'important');var isWhite=(this._contrastInfo.bgColor().hsla()[2]>0.9);this._contrastValueBubble.style.background=(this._contrastInfo.bgColor().asString(Common.Color.Format.RGBA));this._contrastValueBubble.classList.toggle('contrast-color-white',isWhite);if(isWhite){this._contrastValueBubble.style.removeProperty('border-color');}else{this._contrastValueBubble.style.borderColor=(this._contrastInfo.bgColor().asString(Common.Color.Format.RGBA));}}
-toggleVisible(){this._visible=!this._visible;this._contrastDetails.classList.toggle('visible',this._visible);if(this._visible)
-this._toggleMainColorPicker(false);else
-this._toggleBackgroundColorPicker(false);}
-hide(){this._contrastDetails.classList.remove('visible');this._toggleBackgroundColorPicker(false);this._updateContrastOverlayCallback();}
-element(){return this._contrastDetails;}
-visible(){return this._visible;}
-_toggleBackgroundColorPicker(enabled){if(enabled===undefined){this._bgColorPicker.classList.toggle('active');enabled=this._bgColorPicker.classList.contains('active');}else{this._bgColorPicker.classList.toggle('active',enabled);}
-UI.ARIAUtils.setPressed(this._bgColorPicker,enabled);InspectorFrontendHost.setEyeDropperActive(enabled);if(enabled){InspectorFrontendHost.events.addEventListener(InspectorFrontendHostAPI.Events.EyeDropperPickedColor,this._bgColorPickedBound);}else{InspectorFrontendHost.events.removeEventListener(InspectorFrontendHostAPI.Events.EyeDropperPickedColor,this._bgColorPickedBound);}}
-_bgColorPicked(event){var rgbColor=(event.data);var rgba=[rgbColor.r,rgbColor.g,rgbColor.b,(rgbColor.a/2.55|0)/100];var color=Common.Color.fromRGBA(rgba);this._contrastInfo.setBgColor(color);this.update();this._updateContrastOverlayCallback();InspectorFrontendHost.bringToFront();}
-_toggleContrastValueHovered(event){if(!this._contrastValueBubble.classList.contains('contrast-fail'))
-return;if(event.type==='mouseenter'){this._contrastValueBubble.classList.add('hover');for(var i=0;i<this._contrastValueBubbleIcons.length;i++)
-this._contrastValueBubbleIcons[i].style.setProperty('background','#333','important');}else{this._contrastValueBubble.classList.remove('hover');for(var i=0;i<this._contrastValueBubbleIcons.length;i++){this._contrastValueBubbleIcons[i].style.setProperty('background',this._contrastInfo.colorString(),'important');}}}};ColorPicker.ContrastDetails.Swatch=class{constructor(parentElement){this._parentElement=parentElement;this._swatchElement=parentElement.createChild('span','swatch contrast');this._swatchInnerElement=this._swatchElement.createChild('span','swatch-inner');}
-setColor(color,colorString){if(!colorString)
-colorString=(color.asString(Common.Color.Format.RGBA));this._swatchInnerElement.style.background=colorString;UI.ARIAUtils.setAccessibleName(this._swatchElement,colorString);this._swatchElement.classList.toggle('swatch-inner-white',color.hsla()[2]>0.9);}};;ColorPicker.Spectrum=class extends UI.VBox{constructor(){function appendSwitcherIcon(parentElement){var icon=parentElement.createSVGChild('svg');icon.setAttribute('height',16);icon.setAttribute('width',16);var path=icon.createSVGChild('path');path.setAttribute('d','M5,6 L11,6 L8,2 Z M5,10 L11,10 L8,14 Z');return icon;}
-super(true);this.registerRequiredCSS('color_picker/spectrum.css');this.contentElement.tabIndex=0;this.setDefaultFocusedElement(this.contentElement);this._colorElement=this.contentElement.createChild('div','spectrum-color');this._colorDragElement=this._colorElement.createChild('div','spectrum-sat fill').createChild('div','spectrum-val fill').createChild('div','spectrum-dragger');this._dragX=0;this._dragY=0;if(Runtime.experiments.isEnabled('colorContrastRatio')){var boundToggleColorPicker=this._toggleColorPicker.bind(this);this._contrastOverlay=new ColorPicker.ContrastOverlay(this._colorElement,this.contentElement,boundToggleColorPicker);}
-var toolbar=new UI.Toolbar('spectrum-eye-dropper',this.contentElement);this._colorPickerButton=new UI.ToolbarToggle(Common.UIString('Toggle color picker'),'largeicon-eyedropper');this._colorPickerButton.setToggled(true);this._colorPickerButton.addEventListener(UI.ToolbarButton.Events.Click,this._toggleColorPicker.bind(this,undefined));toolbar.appendToolbarItem(this._colorPickerButton);this._swatch=new ColorPicker.Spectrum.Swatch(this.contentElement);this._hueElement=this.contentElement.createChild('div','spectrum-hue');this._hueSlider=this._hueElement.createChild('div','spectrum-slider');this._alphaElement=this.contentElement.createChild('div','spectrum-alpha');this._alphaElementBackground=this._alphaElement.createChild('div','spectrum-alpha-background');this._alphaSlider=this._alphaElement.createChild('div','spectrum-slider');var displaySwitcher=this.contentElement.createChild('div','spectrum-display-switcher spectrum-switcher');appendSwitcherIcon(displaySwitcher);displaySwitcher.addEventListener('click',this._formatViewSwitch.bind(this));this._displayContainer=this.contentElement.createChild('div','spectrum-text source-code');this._textValues=[];for(var i=0;i<4;++i){var inputValue=UI.createInput('spectrum-text-value');this._displayContainer.appendChild(inputValue);inputValue.maxLength=4;this._textValues.push(inputValue);inputValue.addEventListener('keydown',this._inputChanged.bind(this),false);inputValue.addEventListener('input',this._inputChanged.bind(this),false);inputValue.addEventListener('mousewheel',this._inputChanged.bind(this),false);}
-this._textLabels=this._displayContainer.createChild('div','spectrum-text-label');this._hexContainer=this.contentElement.createChild('div','spectrum-text spectrum-text-hex source-code');this._hexValue=UI.createInput('spectrum-text-value');this._hexContainer.appendChild(this._hexValue);this._hexValue.maxLength=9;this._hexValue.addEventListener('keydown',this._inputChanged.bind(this),false);this._hexValue.addEventListener('input',this._inputChanged.bind(this),false);this._hexValue.addEventListener('mousewheel',this._inputChanged.bind(this),false);var label=this._hexContainer.createChild('div','spectrum-text-label');label.textContent='HEX';UI.installDragHandle(this._hueElement,dragStart.bind(this,positionHue.bind(this)),positionHue.bind(this),null,'default');UI.installDragHandle(this._alphaElement,dragStart.bind(this,positionAlpha.bind(this)),positionAlpha.bind(this),null,'default');UI.installDragHandle(this._colorElement,dragStart.bind(this,positionColor.bind(this)),positionColor.bind(this),null,'default');this.element.classList.add('palettes-enabled','flex-none');this._palettes=new Map();this._palettePanel=this.contentElement.createChild('div','palette-panel');this._palettePanelShowing=false;this._paletteContainer=this.contentElement.createChild('div','spectrum-palette');this._paletteContainer.addEventListener('contextmenu',this._showPaletteColorContextMenu.bind(this,-1));this._shadesContainer=this.contentElement.createChild('div','palette-color-shades hidden');UI.installDragHandle(this._paletteContainer,this._paletteDragStart.bind(this),this._paletteDrag.bind(this),this._paletteDragEnd.bind(this),'default');var paletteSwitcher=this.contentElement.createChild('div','spectrum-palette-switcher spectrum-switcher');appendSwitcherIcon(paletteSwitcher);paletteSwitcher.addEventListener('click',this._togglePalettePanel.bind(this,true));this._deleteIconToolbar=new UI.Toolbar('delete-color-toolbar');this._deleteButton=new UI.ToolbarButton('','largeicon-trash-bin');this._deleteIconToolbar.appendToolbarItem(this._deleteButton);var overlay=this.contentElement.createChild('div','spectrum-overlay fill');overlay.addEventListener('click',this._togglePalettePanel.bind(this,false));this._addColorToolbar=new UI.Toolbar('add-color-toolbar');var addColorButton=new UI.ToolbarButton(Common.UIString('Add to palette'),'largeicon-add');addColorButton.addEventListener(UI.ToolbarButton.Events.Click,this._addColorToCustomPalette,this);this._addColorToolbar.appendToolbarItem(addColorButton);this._colorPickedBound=this._colorPicked.bind(this);this._loadPalettes();new ColorPicker.Spectrum.PaletteGenerator(this._generatedPaletteLoaded.bind(this));function dragStart(callback,event){this._hueAlphaLeft=this._hueElement.totalOffsetLeft();this._colorOffset=this._colorElement.totalOffset();callback(event);return true;}
-function positionHue(event){var hsva=this._hsv.slice();hsva[0]=Number.constrain(1-(event.x-this._hueAlphaLeft)/this._hueAlphaWidth,0,1);this._innerSetColor(hsva,'',undefined,ColorPicker.Spectrum._ChangeSource.Other);}
-function positionAlpha(event){var newAlpha=Math.round((event.x-this._hueAlphaLeft)/this._hueAlphaWidth*100)/100;var hsva=this._hsv.slice();hsva[3]=Number.constrain(newAlpha,0,1);this._innerSetColor(hsva,'',undefined,ColorPicker.Spectrum._ChangeSource.Other);}
-function positionColor(event){var hsva=this._hsv.slice();hsva[1]=Number.constrain((event.x-this._colorOffset.left)/this.dragWidth,0,1);hsva[2]=Number.constrain(1-(event.y-this._colorOffset.top)/this.dragHeight,0,1);if(this._contrastOverlay)
-this._contrastOverlay.moveAwayFrom(event.x,event.y);this._innerSetColor(hsva,'',undefined,ColorPicker.Spectrum._ChangeSource.Other);}}
-_updatePalettePanel(){this._palettePanel.removeChildren();var title=this._palettePanel.createChild('div','palette-title');title.textContent=Common.UIString('Color Palettes');var toolbar=new UI.Toolbar('',this._palettePanel);var closeButton=new UI.ToolbarButton('Return to color picker','largeicon-delete');closeButton.addEventListener(UI.ToolbarButton.Events.Click,this._togglePalettePanel.bind(this,false));toolbar.appendToolbarItem(closeButton);for(var palette of this._palettes.values())
-this._palettePanel.appendChild(this._createPreviewPaletteElement(palette));}
-_togglePalettePanel(show){if(this._palettePanelShowing===show)
-return;if(show)
-this._updatePalettePanel();this._focus();this._palettePanelShowing=show;this.contentElement.classList.toggle('palette-panel-showing',show);}
-_focus(){if(this.isShowing())
-this.contentElement.focus();}
-_createPaletteColor(colorText,animationDelay){var element=createElementWithClass('div','spectrum-palette-color');element.style.background=String.sprintf('linear-gradient(%s, %s), url(Images/checker.png)',colorText,colorText);if(animationDelay)
-element.animate([{opacity:0},{opacity:1}],{duration:100,delay:animationDelay,fill:'backwards'});element.title=colorText;return element;}
-_showPalette(palette,animate,event){this._resizeForSelectedPalette();this._paletteContainer.removeChildren();for(var i=0;i<palette.colors.length;i++){var animationDelay=animate?i*100/palette.colors.length:0;var colorElement=this._createPaletteColor(palette.colors[i],animationDelay);colorElement.addEventListener('mousedown',this._paletteColorSelected.bind(this,palette.colors[i],palette.matchUserFormat));if(palette.mutable){colorElement.__mutable=true;colorElement.__color=palette.colors[i];colorElement.addEventListener('contextmenu',this._showPaletteColorContextMenu.bind(this,i));}else if(palette===ColorPicker.Spectrum.MaterialPalette){colorElement.classList.add('has-material-shades');var shadow=colorElement.createChild('div','spectrum-palette-color spectrum-palette-color-shadow');shadow.style.background=palette.colors[i];shadow=colorElement.createChild('div','spectrum-palette-color spectrum-palette-color-shadow');shadow.style.background=palette.colors[i];colorElement.title=Common.UIString(palette.colors[i]+'. Long-click to show alternate shades.');new UI.LongClickController(colorElement,this._showLightnessShades.bind(this,colorElement,palette.colors[i]));}
-this._paletteContainer.appendChild(colorElement);}
-this._paletteContainerMutable=palette.mutable;if(palette.mutable){this._paletteContainer.appendChild(this._addColorToolbar.element);this._paletteContainer.appendChild(this._deleteIconToolbar.element);}else{this._addColorToolbar.element.remove();this._deleteIconToolbar.element.remove();}
-this._togglePalettePanel(false);this._focus();}
-_showLightnessShades(colorElement,colorText,event){function closeLightnessShades(element){this._shadesContainer.classList.add('hidden');element.classList.remove('spectrum-shades-shown');this._shadesContainer.ownerDocument.removeEventListener('mousedown',this._shadesCloseHandler,true);delete this._shadesCloseHandler;}
-if(this._shadesCloseHandler)
-this._shadesCloseHandler();this._shadesContainer.classList.remove('hidden');this._shadesContainer.removeChildren();this._shadesContainer.animate([{transform:'scaleY(0)',opacity:'0'},{transform:'scaleY(1)',opacity:'1'}],{duration:200,easing:'cubic-bezier(0.4, 0, 0.2, 1)'});this._shadesContainer.style.top=colorElement.offsetTop+colorElement.parentElement.offsetTop+'px';this._shadesContainer.style.left=colorElement.offsetLeft+'px';colorElement.classList.add('spectrum-shades-shown');var shades=ColorPicker.Spectrum.MaterialPaletteShades[colorText];for(var i=shades.length-1;i>=0;i--){var shadeElement=this._createPaletteColor(shades[i],i*200/shades.length+100);shadeElement.addEventListener('mousedown',this._paletteColorSelected.bind(this,shades[i],false));this._shadesContainer.appendChild(shadeElement);}
-this._shadesContainer.focus();this._shadesCloseHandler=closeLightnessShades.bind(this,colorElement);this._shadesContainer.ownerDocument.addEventListener('mousedown',this._shadesCloseHandler,true);}
-_slotIndexForEvent(e){var localX=e.pageX-this._paletteContainer.totalOffsetLeft();var localY=e.pageY-this._paletteContainer.totalOffsetTop();var col=Math.min(localX/ColorPicker.Spectrum._colorChipSize|0,ColorPicker.Spectrum._itemsPerPaletteRow-1);var row=(localY/ColorPicker.Spectrum._colorChipSize)|0;return Math.min(row*ColorPicker.Spectrum._itemsPerPaletteRow+col,this._customPaletteSetting.get().colors.length-1);}
-_isDraggingToBin(e){return e.pageX>this._deleteIconToolbar.element.totalOffsetLeft();}
-_paletteDragStart(e){var element=e.deepElementFromPoint();if(!element||!element.__mutable)
-return false;var index=this._slotIndexForEvent(e);this._dragElement=element;this._dragHotSpotX=e.pageX-(index%ColorPicker.Spectrum._itemsPerPaletteRow)*ColorPicker.Spectrum._colorChipSize;this._dragHotSpotY=e.pageY-(index/ColorPicker.Spectrum._itemsPerPaletteRow|0)*ColorPicker.Spectrum._colorChipSize;return true;}
-_paletteDrag(e){if(e.pageX<this._paletteContainer.totalOffsetLeft()||e.pageY<this._paletteContainer.totalOffsetTop())
-return;var newIndex=this._slotIndexForEvent(e);var offsetX=e.pageX-(newIndex%ColorPicker.Spectrum._itemsPerPaletteRow)*ColorPicker.Spectrum._colorChipSize;var offsetY=e.pageY-(newIndex/ColorPicker.Spectrum._itemsPerPaletteRow|0)*ColorPicker.Spectrum._colorChipSize;var isDeleting=this._isDraggingToBin(e);this._deleteIconToolbar.element.classList.add('dragging');this._deleteIconToolbar.element.classList.toggle('delete-color-toolbar-active',isDeleting);var dragElementTransform='translateX('+(offsetX-this._dragHotSpotX)+'px) translateY('+(offsetY-this._dragHotSpotY)+'px)';this._dragElement.style.transform=isDeleting?dragElementTransform+' scale(0.8)':dragElementTransform;var children=Array.prototype.slice.call(this._paletteContainer.children);var index=children.indexOf(this._dragElement);var swatchOffsets=new Map();for(var swatch of children)
-swatchOffsets.set(swatch,swatch.totalOffset());if(index!==newIndex)
-this._paletteContainer.insertBefore(this._dragElement,children[newIndex>index?newIndex+1:newIndex]);for(var swatch of children){if(swatch===this._dragElement)
-continue;var before=swatchOffsets.get(swatch);var after=swatch.totalOffset();if(before.left!==after.left||before.top!==after.top){swatch.animate([{transform:'translateX('+(before.left-after.left)+'px) translateY('+(before.top-after.top)+'px)'},{transform:'none'}],{duration:100,easing:'cubic-bezier(0, 0, 0.2, 1)'});}}}
-_paletteDragEnd(e){if(this._isDraggingToBin(e))
-this._dragElement.remove();this._dragElement.style.removeProperty('transform');var children=this._paletteContainer.children;var colors=[];for(var i=0;i<children.length;++i){if(children[i].__color)
-colors.push(children[i].__color);}
-var palette=this._customPaletteSetting.get();palette.colors=colors;this._customPaletteSetting.set(palette);this._showPalette(this._customPaletteSetting.get(),false);this._deleteIconToolbar.element.classList.remove('dragging');this._deleteIconToolbar.element.classList.remove('delete-color-toolbar-active');}
-_loadPalettes(){this._palettes.set(ColorPicker.Spectrum.MaterialPalette.title,ColorPicker.Spectrum.MaterialPalette);var defaultCustomPalette={title:'Custom',colors:[],mutable:true};this._customPaletteSetting=Common.settings.createSetting('customColorPalette',defaultCustomPalette);this._palettes.set(this._customPaletteSetting.get().title,this._customPaletteSetting.get());this._selectedColorPalette=Common.settings.createSetting('selectedColorPalette',ColorPicker.Spectrum.GeneratedPaletteTitle);var palette=this._palettes.get(this._selectedColorPalette.get());if(palette)
-this._showPalette(palette,true);}
-_generatedPaletteLoaded(generatedPalette){if(generatedPalette.colors.length)
-this._palettes.set(generatedPalette.title,generatedPalette);if(this._selectedColorPalette.get()!==generatedPalette.title){return;}else if(!generatedPalette.colors.length){this._paletteSelected(ColorPicker.Spectrum.MaterialPalette);return;}
-this._showPalette(generatedPalette,true);}
-_createPreviewPaletteElement(palette){var colorsPerPreviewRow=5;var previewElement=createElementWithClass('div','palette-preview');var titleElement=previewElement.createChild('div','palette-preview-title');titleElement.textContent=palette.title;for(var i=0;i<colorsPerPreviewRow&&i<palette.colors.length;i++)
-previewElement.appendChild(this._createPaletteColor(palette.colors[i]));for(;i<colorsPerPreviewRow;i++)
-previewElement.createChild('div','spectrum-palette-color empty-color');previewElement.addEventListener('click',this._paletteSelected.bind(this,palette));return previewElement;}
-_paletteSelected(palette){this._selectedColorPalette.set(palette.title);this._showPalette(palette,true);}
-_resizeForSelectedPalette(){var palette=this._palettes.get(this._selectedColorPalette.get());if(!palette)
-return;var numColors=palette.colors.length;if(palette===this._customPaletteSetting.get())
-numColors++;var rowsNeeded=Math.max(1,Math.ceil(numColors/ColorPicker.Spectrum._itemsPerPaletteRow));if(this._numPaletteRowsShown===rowsNeeded)
-return;this._numPaletteRowsShown=rowsNeeded;var paletteColorHeight=12;var paletteMargin=12;var paletteTop=235;this.element.style.height=(paletteTop+paletteMargin+(paletteColorHeight+paletteMargin)*rowsNeeded)+'px';this.dispatchEventToListeners(ColorPicker.Spectrum.Events.SizeChanged);}
-_paletteColorSelected(colorText,matchUserFormat){var color=Common.Color.parse(colorText);if(!color)
-return;this._innerSetColor(color.hsva(),colorText,matchUserFormat?this._colorFormat:color.format(),ColorPicker.Spectrum._ChangeSource.Other);}
-_addColorToCustomPalette(event){var palette=this._customPaletteSetting.get();palette.colors.push(this.colorString());this._customPaletteSetting.set(palette);this._showPalette(this._customPaletteSetting.get(),false);}
-_showPaletteColorContextMenu(colorIndex,event){if(!this._paletteContainerMutable)
-return;var contextMenu=new UI.ContextMenu(event);if(colorIndex!==-1){contextMenu.defaultSection().appendItem(Common.UIString('Remove color'),this._deletePaletteColors.bind(this,colorIndex,false));contextMenu.defaultSection().appendItem(Common.UIString('Remove all to the right'),this._deletePaletteColors.bind(this,colorIndex,true));}
-contextMenu.defaultSection().appendItem(Common.UIString('Clear palette'),this._deletePaletteColors.bind(this,-1,true));contextMenu.show();}
-_deletePaletteColors(colorIndex,toRight){var palette=this._customPaletteSetting.get();if(toRight)
-palette.colors.splice(colorIndex+1,palette.colors.length-colorIndex-1);else
-palette.colors.splice(colorIndex,1);this._customPaletteSetting.set(palette);this._showPalette(this._customPaletteSetting.get(),false);}
-setColor(color,colorFormat){this._originalFormat=colorFormat;this._innerSetColor(color.hsva(),'',colorFormat,ColorPicker.Spectrum._ChangeSource.Model);}
-setContrastInfo(contrastInfo){if(this._contrastOverlay)
-this._contrastOverlay.setContrastInfo(contrastInfo);}
-_innerSetColor(hsva,colorString,colorFormat,changeSource){if(hsva!==undefined)
-this._hsv=hsva;if(colorString!==undefined)
-this._colorString=colorString;if(colorFormat!==undefined){var cf=Common.Color.Format;console.assert(colorFormat!==cf.Original,'Spectrum\'s color format cannot be Original');if(colorFormat===cf.RGBA)
-colorFormat=cf.RGB;else if(colorFormat===cf.HSLA)
-colorFormat=cf.HSL;else if(colorFormat===cf.HEXA)
-colorFormat=cf.HEX;else if(colorFormat===cf.ShortHEXA)
-colorFormat=cf.ShortHEX;this._colorFormat=colorFormat;}
-if(hsva&&this._contrastOverlay)
-this._contrastOverlay.setColor(hsva,this.colorString());this._updateHelperLocations();this._updateUI();if(changeSource!==ColorPicker.Spectrum._ChangeSource.Input)
-this._updateInput();if(changeSource!==ColorPicker.Spectrum._ChangeSource.Model)
-this.dispatchEventToListeners(ColorPicker.Spectrum.Events.ColorChanged,this.colorString());}
-_color(){return Common.Color.fromHSVA(this._hsv);}
-colorString(){if(this._colorString)
-return this._colorString;var cf=Common.Color.Format;var color=this._color();var colorString=color.asString(this._colorFormat);if(colorString)
-return colorString;if(this._colorFormat===cf.Nickname)
-colorString=color.asString(color.hasAlpha()?cf.HEXA:cf.HEX);else if(this._colorFormat===cf.ShortHEX)
-colorString=color.asString(color.detectHEXFormat());else if(this._colorFormat===cf.HEX)
-colorString=color.asString(cf.HEXA);else if(this._colorFormat===cf.HSL)
-colorString=color.asString(cf.HSLA);else
-colorString=color.asString(cf.RGBA);console.assert(colorString);return colorString||'';}
-_updateHelperLocations(){var h=this._hsv[0];var s=this._hsv[1];var v=this._hsv[2];var alpha=this._hsv[3];this._dragX=s*this.dragWidth;this._dragY=this.dragHeight-(v*this.dragHeight);var dragX=Math.max(-this._colorDragElementHeight,Math.min(this.dragWidth-this._colorDragElementHeight,this._dragX-this._colorDragElementHeight));var dragY=Math.max(-this._colorDragElementHeight,Math.min(this.dragHeight-this._colorDragElementHeight,this._dragY-this._colorDragElementHeight));this._colorDragElement.positionAt(dragX,dragY);var hueSlideX=(1-h)*this._hueAlphaWidth-this.slideHelperWidth;this._hueSlider.style.left=hueSlideX+'px';var alphaSlideX=alpha*this._hueAlphaWidth-this.slideHelperWidth;this._alphaSlider.style.left=alphaSlideX+'px';}
-_updateInput(){var cf=Common.Color.Format;if(this._colorFormat===cf.HEX||this._colorFormat===cf.ShortHEX||this._colorFormat===cf.Nickname){this._hexContainer.hidden=false;this._displayContainer.hidden=true;if(this._colorFormat===cf.ShortHEX){this._hexValue.value=this._color().asString(this._color().detectHEXFormat());}else{this._hexValue.value=this._color().asString(this._color().hasAlpha()?cf.HEXA:cf.HEX);}}else{this._hexContainer.hidden=true;this._displayContainer.hidden=false;var isRgb=this._colorFormat===cf.RGB;this._textLabels.textContent=isRgb?'RGBA':'HSLA';var colorValues=isRgb?this._color().canonicalRGBA():this._color().canonicalHSLA();for(var i=0;i<3;++i){this._textValues[i].value=colorValues[i];if(!isRgb&&(i===1||i===2))
-this._textValues[i].value+='%';}
-this._textValues[3].value=Math.round(colorValues[3]*100)/100;}}
-_updateUI(){var h=Common.Color.fromHSVA([this._hsv[0],1,1,1]);this._colorElement.style.backgroundColor=(h.asString(Common.Color.Format.RGB));if(this._contrastOverlay){if(this.dragWidth)
-this._contrastOverlay.show(this.dragWidth,this.dragHeight,this._dragX,this._dragY);else
-this._contrastOverlay.hide();}
-this._swatch.setColor(this._color(),this.colorString());this._colorDragElement.style.backgroundColor=(this._color().asString(Common.Color.Format.RGBA));var noAlpha=Common.Color.fromHSVA(this._hsv.slice(0,3).concat(1));this._alphaElementBackground.style.backgroundImage=String.sprintf('linear-gradient(to right, rgba(0,0,0,0), %s)',noAlpha.asString(Common.Color.Format.RGB));}
-_formatViewSwitch(){var cf=Common.Color.Format;var format=cf.RGB;if(this._colorFormat===cf.RGB)
-format=cf.HSL;else if(this._colorFormat===cf.HSL)
-format=(this._originalFormat===cf.ShortHEX||this._originalFormat===cf.ShortHEXA)?cf.ShortHEX:cf.HEX;this._innerSetColor(undefined,'',format,ColorPicker.Spectrum._ChangeSource.Other);}
-_inputChanged(event){function elementValue(element){return element.value;}
-var inputElement=(event.currentTarget);var newValue=UI.createReplacementString(inputElement.value,event);if(newValue){inputElement.value=newValue;inputElement.selectionStart=0;inputElement.selectionEnd=newValue.length;event.consume(true);}
-const cf=Common.Color.Format;var colorString;if(this._colorFormat===cf.Nickname||this._colorFormat===cf.HEX||this._colorFormat===cf.ShortHEX){colorString=this._hexValue.value;}else{var format=this._colorFormat===cf.RGB?'rgba':'hsla';var values=this._textValues.map(elementValue).join(', ');colorString=String.sprintf('%s(%s)',format,values);}
-var color=Common.Color.parse(colorString);if(!color)
-return;var colorFormat=undefined;if(this._colorFormat===cf.HEX||this._colorFormat===cf.ShortHEX)
-colorFormat=color.detectHEXFormat();this._innerSetColor(color.hsva(),colorString,colorFormat,ColorPicker.Spectrum._ChangeSource.Input);}
-wasShown(){this._hueAlphaWidth=this._hueElement.offsetWidth;this.slideHelperWidth=this._hueSlider.offsetWidth/2;this.dragWidth=this._colorElement.offsetWidth;this.dragHeight=this._colorElement.offsetHeight;this._colorDragElementHeight=this._colorDragElement.offsetHeight/2;this._innerSetColor(undefined,undefined,undefined,ColorPicker.Spectrum._ChangeSource.Model);this._toggleColorPicker(true);}
-willHide(){this._toggleColorPicker(false);}
-_toggleColorPicker(enabled,event){if(enabled===undefined)
-enabled=!this._colorPickerButton.toggled();this._colorPickerButton.setToggled(enabled);InspectorFrontendHost.setEyeDropperActive(enabled);if(enabled){InspectorFrontendHost.events.addEventListener(InspectorFrontendHostAPI.Events.EyeDropperPickedColor,this._colorPickedBound);}else{InspectorFrontendHost.events.removeEventListener(InspectorFrontendHostAPI.Events.EyeDropperPickedColor,this._colorPickedBound);}}
-_colorPicked(event){var rgbColor=(event.data);var rgba=[rgbColor.r,rgbColor.g,rgbColor.b,(rgbColor.a/2.55|0)/100];var color=Common.Color.fromRGBA(rgba);this._innerSetColor(color.hsva(),'',undefined,ColorPicker.Spectrum._ChangeSource.Other);InspectorFrontendHost.bringToFront();}};ColorPicker.Spectrum._ChangeSource={Input:'Input',Model:'Model',Other:'Other'};ColorPicker.Spectrum.Events={ColorChanged:Symbol('ColorChanged'),SizeChanged:Symbol('SizeChanged')};ColorPicker.Spectrum._colorChipSize=24;ColorPicker.Spectrum._itemsPerPaletteRow=8;ColorPicker.Spectrum.Palette;ColorPicker.Spectrum.GeneratedPaletteTitle='Page colors';ColorPicker.Spectrum.PaletteGenerator=class{constructor(callback){this._callback=callback;this._frequencyMap=new Map();var stylesheetPromises=[];for(var cssModel of SDK.targetManager.models(SDK.CSSModel)){for(var stylesheet of cssModel.allStyleSheets())
-stylesheetPromises.push(this._processStylesheet(stylesheet));}
-Promise.all(stylesheetPromises).catchException(null).then(this._finish.bind(this));}
-_frequencyComparator(a,b){return this._frequencyMap.get(b)-this._frequencyMap.get(a);}
-_finish(){function hueComparator(a,b){var hsva=paletteColors.get(a).hsva();var hsvb=paletteColors.get(b).hsva();if(hsvb[1]<0.12&&hsva[1]<0.12)
-return hsvb[2]*hsvb[3]-hsva[2]*hsva[3];if(hsvb[1]<0.12)
-return-1;if(hsva[1]<0.12)
-return 1;if(hsvb[0]===hsva[0])
-return hsvb[1]*hsvb[3]-hsva[1]*hsva[3];return(hsvb[0]+0.94)%1-(hsva[0]+0.94)%1;}
-var colors=this._frequencyMap.keysArray();colors=colors.sort(this._frequencyComparator.bind(this));var paletteColors=new Map();var colorsPerRow=24;while(paletteColors.size<colorsPerRow&&colors.length){var colorText=colors.shift();var color=Common.Color.parse(colorText);if(!color||color.nickname()==='white'||color.nickname()==='black')
-continue;paletteColors.set(colorText,color);}
-this._callback({title:ColorPicker.Spectrum.GeneratedPaletteTitle,colors:paletteColors.keysArray().sort(hueComparator),mutable:false});}
-async _processStylesheet(stylesheet){var text=await stylesheet.requestContent()||'';text=text.toLowerCase();var regexResult=text.match(/((?:rgb|hsl)a?\([^)]+\)|#[0-9a-f]{6}|#[0-9a-f]{3})/g)||[];for(var c of regexResult){var frequency=this._frequencyMap.get(c)||0;this._frequencyMap.set(c,++frequency);}}};ColorPicker.Spectrum.MaterialPaletteShades={'#F44336':['#FFEBEE','#FFCDD2','#EF9A9A','#E57373','#EF5350','#F44336','#E53935','#D32F2F','#C62828','#B71C1C'],'#E91E63':['#FCE4EC','#F8BBD0','#F48FB1','#F06292','#EC407A','#E91E63','#D81B60','#C2185B','#AD1457','#880E4F'],'#9C27B0':['#F3E5F5','#E1BEE7','#CE93D8','#BA68C8','#AB47BC','#9C27B0','#8E24AA','#7B1FA2','#6A1B9A','#4A148C'],'#673AB7':['#EDE7F6','#D1C4E9','#B39DDB','#9575CD','#7E57C2','#673AB7','#5E35B1','#512DA8','#4527A0','#311B92'],'#3F51B5':['#E8EAF6','#C5CAE9','#9FA8DA','#7986CB','#5C6BC0','#3F51B5','#3949AB','#303F9F','#283593','#1A237E'],'#2196F3':['#E3F2FD','#BBDEFB','#90CAF9','#64B5F6','#42A5F5','#2196F3','#1E88E5','#1976D2','#1565C0','#0D47A1'],'#03A9F4':['#E1F5FE','#B3E5FC','#81D4FA','#4FC3F7','#29B6F6','#03A9F4','#039BE5','#0288D1','#0277BD','#01579B'],'#00BCD4':['#E0F7FA','#B2EBF2','#80DEEA','#4DD0E1','#26C6DA','#00BCD4','#00ACC1','#0097A7','#00838F','#006064'],'#009688':['#E0F2F1','#B2DFDB','#80CBC4','#4DB6AC','#26A69A','#009688','#00897B','#00796B','#00695C','#004D40'],'#4CAF50':['#E8F5E9','#C8E6C9','#A5D6A7','#81C784','#66BB6A','#4CAF50','#43A047','#388E3C','#2E7D32','#1B5E20'],'#8BC34A':['#F1F8E9','#DCEDC8','#C5E1A5','#AED581','#9CCC65','#8BC34A','#7CB342','#689F38','#558B2F','#33691E'],'#CDDC39':['#F9FBE7','#F0F4C3','#E6EE9C','#DCE775','#D4E157','#CDDC39','#C0CA33','#AFB42B','#9E9D24','#827717'],'#FFEB3B':['#FFFDE7','#FFF9C4','#FFF59D','#FFF176','#FFEE58','#FFEB3B','#FDD835','#FBC02D','#F9A825','#F57F17'],'#FFC107':['#FFF8E1','#FFECB3','#FFE082','#FFD54F','#FFCA28','#FFC107','#FFB300','#FFA000','#FF8F00','#FF6F00'],'#FF9800':['#FFF3E0','#FFE0B2','#FFCC80','#FFB74D','#FFA726','#FF9800','#FB8C00','#F57C00','#EF6C00','#E65100'],'#FF5722':['#FBE9E7','#FFCCBC','#FFAB91','#FF8A65','#FF7043','#FF5722','#F4511E','#E64A19','#D84315','#BF360C'],'#795548':['#EFEBE9','#D7CCC8','#BCAAA4','#A1887F','#8D6E63','#795548','#6D4C41','#5D4037','#4E342E','#3E2723'],'#9E9E9E':['#FAFAFA','#F5F5F5','#EEEEEE','#E0E0E0','#BDBDBD','#9E9E9E','#757575','#616161','#424242','#212121'],'#607D8B':['#ECEFF1','#CFD8DC','#B0BEC5','#90A4AE','#78909C','#607D8B','#546E7A','#455A64','#37474F','#263238']};ColorPicker.Spectrum.MaterialPalette={title:'Material',mutable:false,matchUserFormat:true,colors:Object.keys(ColorPicker.Spectrum.MaterialPaletteShades)};ColorPicker.Spectrum.Swatch=class{constructor(parentElement){this._colorString;var swatchElement=parentElement.createChild('span','swatch');this._swatchInnerElement=swatchElement.createChild('span','swatch-inner');this._swatchOverlayElement=swatchElement.createChild('span','swatch-overlay');this._swatchOverlayElement.addEventListener('click',this._onCopyIconClick.bind(this));this._swatchOverlayElement.addEventListener('mouseout',this._onCopyIconMouseout.bind(this));this._swatchCopyIcon=UI.Icon.create('largeicon-copy','copy-color-icon');this._swatchCopyIcon.title=Common.UIString('Copy color to clipboard');this._swatchOverlayElement.appendChild(this._swatchCopyIcon);}
-setColor(color,colorString){this._swatchInnerElement.style.backgroundColor=(color.asString(Common.Color.Format.RGBA));this._swatchInnerElement.classList.toggle('swatch-inner-white',color.hsla()[2]>0.9);this._colorString=colorString||null;if(colorString)
-this._swatchOverlayElement.hidden=false;else
-this._swatchOverlayElement.hidden=true;}
-_onCopyIconClick(){this._swatchCopyIcon.setIconType('largeicon-checkmark');InspectorFrontendHost.copyText(this._colorString);}
-_onCopyIconMouseout(){this._swatchCopyIcon.setIconType('largeicon-copy');}};;Runtime.cachedResources["color_picker/spectrum.css"]="/* https://github.com/bgrins/spectrum */\n:host {\n width: 232px;\n height: 240px;\n -webkit-user-select: none;\n overflow: hidden;\n}\n\n:host-context(.palettes-enabled) {\n height: 319px;\n}\n\n.spectrum-color {\n position: relative;\n width: 232px;\n height: 124px;\n border-radius: 2px 2px 0 0;\n overflow: hidden;\n}\n\n.spectrum-display-value {\n -webkit-user-select: text;\n display: inline-block;\n padding-left: 2px;\n}\n\n.spectrum-hue {\n top: 140px;\n}\n\n.spectrum-alpha {\n top: 159px;\n background-image: url(Images/checker.png);\n background-size: 12px 11px;\n}\n\n.spectrum-alpha-background {\n height: 100%;\n border-radius: 2px;\n}\n\n.spectrum-hue, .spectrum-alpha {\n position: absolute;\n left: 86px;\n width: 130px;\n height: 11px;\n border-radius: 2px;\n}\n\n.spectrum-dragger,\n.spectrum-slider {\n -webkit-user-select: none;\n}\n\n.spectrum-sat,\n.-theme-preserve {\n background-image: linear-gradient(to right, white, rgba(204, 154, 129, 0));\n}\n\n.spectrum-val,\n.-theme-preserve {\n background-image: linear-gradient(to top, black, rgba(204, 154, 129, 0));\n}\n\n.spectrum-hue {\n background: linear-gradient(to left, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%);\n}\n\n.spectrum-dragger {\n border-radius: 12px;\n height: 12px;\n width: 12px;\n border: 1px solid white;\n cursor: pointer;\n position: absolute;\n top: 0;\n left: 0;\n background: black;\n box-shadow: 0 0 2px 0px rgba(0, 0, 0, 0.24);\n}\n\n.spectrum-slider {\n position: absolute;\n top: -1px;\n cursor: pointer;\n width: 13px;\n height: 13px;\n border-radius: 13px;\n background-color: rgb(248, 248, 248);\n box-shadow: 0 1px 4px 0 rgba(0, 0, 0, 0.37);\n}\n\n.spectrum-contrast-info {\n position: absolute;\n right: 10px;\n left: auto;\n bottom: 10px;\n color: white;\n border-radius: 2px;\n border: 0;\n padding: 3px 3px 2px;\n background-color: rgba(255, 255, 255, 0.2);\n align-items: center;\n transition: right .05s ease-out, left .05s ease-out, bottom .05s ease-out, top .05s ease-out;\n cursor: pointer;\n}\n\n.spectrum-contrast-info.contrast-unknown .value {\n display: none;\n}\n\n.spectrum-contrast-info .low-contrast {\n display: none;\n margin-right: 3px;\n}\n\n.spectrum-contrast-info.contrast-fail .low-contrast {\n display: initial;\n}\n\n.spectrum-contrast-info.contrast-info-left {\n left: 10px;\n right: auto;\n}\n\n.spectrum-contrast-info.contrast-info-top {\n top: 10px;\n bottom: auto;\n background-color: rgba(0, 0, 0, 0.2);\n}\n\n.spectrum-contrast-info.contrast-fail {\n background-color: #b40202;\n}\n\n.spectrum-contrast-info .value {\n margin-right: 4px;\n}\n\n.spectrum-contrast-details {\n position: absolute;\n background-color: white;\n width: 100%;\n height: 111px;\n top: 124px;\n z-index: 13;\n font-size: 13px;\n color: #333;\n display: none;\n line-height: initial;\n}\n\n.spectrum-contrast-details div.toolbar {\n position: absolute;\n right: 6px;\n top: 6px;\n margin: 0;\n}\n\n.spectrum-contrast-details div.toolbar [is=ui-icon] {\n position: absolute;\n right: 6px;\n top: 6px;\n margin: 0;\n background: transparent;\n}\n\n.spectrum-contrast-details.visible {\n display: initial;\n}\n\n.spectrum-contrast-details div {\n margin: 12px;\n}\n\n.contrast-pass-fail {\n margin-left: 0.5em;\n}\n\n.contrast-threshold .smallicon-checkmark-square,\n.contrast-threshold .smallicon-no{\n display: none;\n}\n\n.contrast-threshold.pass .smallicon-checkmark-square {\n display: inline-block;\n background-color: #00b06f;\n}\n\n.contrast-threshold.fail .smallicon-no {\n display: inline-block;\n background-color: #b40202;\n}\n\n.contrast-threshold-value {\n font-weight: bold;\n}\n.spectrum-contrast-details .contrast-thresholds div {\n margin: 0;\n}\n\n.contrast-link {\n margin-left: 0.5em;\n}\n\n.contrast-link .mediumicon-info {\n margin-top: -3px;\n background-color: #333;\n}\n\n.contrast-details-value {\n color: white;\n border-radius: 2px;\n margin-left: 0.5em;\n padding: 1px 3px;\n align-items: baseline;\n position: absolute;\n margin-top: -2px;\n border: 1px solid transparent;\n}\n\n.contrast-details-value.contrast-unknown {\n background-color: white;\n color: #333;\n border: 1px solid #ddd;\n width: 3em;\n text-align: center;\n}\n\n.contrast-details-value.contrast-color-white {\n border-color: #ddd;\n}\n\n.contrast-details-value.contrast-fail.hover {\n color: #333 !important;\n background-color: white !important;\n}\n\n.contrast-details-value.contrast-fail.hover [is=ui-icon] {\n background-color: black !important;\n}\n\n.contrast-details-value [is=ui-icon] {\n display: none;\n margin-left: 0.5em;\n}\n\n.contrast-details-value .smallicon-checkmark-behind {\n margin-left: -6px;\n}\n\n.contrast-details-value.contrast-fail .smallicon-no {\n display: inline-block;\n}\n\n.contrast-details-value.contrast-fail .smallicon-no {\n display: inline-block;\n}\n\n.contrast-details-value.contrast-aa .smallicon-checkmark-square {\n display: inline-block;\n}\n\n.contrast-details-value.contrast-aaa .smallicon-checkmark-behind {\n display: inline-block;\n}\n\n.swatch {\n width: 32px;\n height: 32px;\n margin: 0;\n position: absolute;\n top: 139px;\n left: 44px;\n background-image: url(Images/checker.png);\n border-radius: 16px;\n}\n\n.swatch-inner,\n.swatch-overlay {\n position: absolute;\n width: 100%;\n height: 100%;\n display: inline-block;\n border-radius: 16px;\n}\n\n.swatch-inner-white {\n border: 1px solid #ddd;\n}\n\n.swatch-overlay {\n cursor: pointer;\n opacity: 0;\n padding: 4px;\n}\n\n.swatch-overlay:hover {\n background-color: rgba(0, 0, 0, .3);\n opacity: 1;\n}\n\n.swatch-overlay:active {\n background-color: rgba(0, 0, 0, .5);\n}\n\n.copy-color-icon {\n background-color: white;\n}\n\n.spectrum-text {\n position: absolute;\n top: 184px;\n left: 16px;\n}\n\n.spectrum-text-value {\n display: inline-block;\n width: 40px;\n overflow: hidden;\n text-align: center;\n border: 1px solid #dadada;\n border-radius: 2px;\n margin-right: 6px;\n line-height: 20px;\n padding: 0;\n color: #333;\n white-space: nowrap;\n}\n\n.spectrum-text-label {\n letter-spacing: 39.5px;\n margin-top: 8px;\n display: block;\n color: #969696;\n margin-left: 16px;\n width: 174px;\n}\n\n.spectrum-text-hex > .spectrum-text-value {\n width: 178px;\n}\n\n.spectrum-text-hex > .spectrum-text-label {\n letter-spacing: normal;\n margin-left: 0px;\n text-align: center;\n}\n\n.spectrum-palette-value {\n background-color: rgb(65, 75, 217);\n border-radius: 2px;\n margin-top: 12px;\n margin-left: 12px;\n width: 12px;\n height: 12px;\n display: inline-block;\n}\n\n.spectrum-switcher {\n border-radius: 2px;\n height: 20px;\n width: 20px;\n padding: 2px;\n}\n\n:host-context(.-theme-with-dark-background) .spectrum-switcher {\n -webkit-filter: invert(60%);\n}\n\n.spectrum-display-switcher {\n top: 196px;\n position: absolute;\n right: 10px;\n}\n\n.spectrum-switcher:hover {\n background-color: #EEEEEE;\n}\n\n.spectrum-eye-dropper {\n width: 32px;\n height: 24px;\n position: absolute;\n left: 8px;\n top: 141px;\n cursor: pointer;\n}\n\n.spectrum-palette {\n border-top: 1px solid #dadada;\n position: absolute;\n top: 235px;\n width: 100%;\n padding: 6px 24px 6px 6px;\n display: flex;\n flex-wrap: wrap;\n}\n\n.spectrum-palette-color {\n width: 12px;\n height: 12px;\n flex: 0 0 12px;\n border-radius: 2px;\n margin: 6px;\n cursor: pointer;\n position: relative;\n border: 1px solid rgba(0, 0, 0, 0.1);\n background-position: -1px !important;\n}\n\n.spectrum-palette-color:hover:not(.spectrum-shades-shown) > .spectrum-palette-color-shadow {\n opacity: 0.2;\n}\n\n.spectrum-palette-color:hover:not(.spectrum-shades-shown) > .spectrum-palette-color-shadow:first-child {\n opacity: 0.6;\n top: -3px;\n left: 1px;\n}\n\n.spectrum-palette-color-shadow {\n position: absolute;\n opacity: 0;\n margin: 0;\n top: -5px;\n left: 3px;\n}\n\n.palette-color-shades {\n position: absolute;\n background-color: white;\n height: 228px;\n width: 28px;\n box-shadow: 0 4px 5px 0 rgba(0, 0, 0, 0.14), 0 1px 10px 0 rgba(0, 0, 0, 0.12), 0 2px 4px -1px rgba(0, 0, 0, 0.4);\n z-index: 14;\n border-radius: 2px;\n transform-origin: 0px 228px;\n margin-top: -208px;\n margin-left: -8px;\n}\n\n.spectrum-palette > .spectrum-palette-color.spectrum-shades-shown {\n z-index: 15;\n}\n\n.palette-color-shades > .spectrum-palette-color {\n margin: 8px 0 0 0;\n margin-left: 8px;\n width: 12px;\n}\n\n.spectrum-palette > .spectrum-palette-color {\n transition: transform 100ms cubic-bezier(0, 0, 0.2, 1);\n will-change: transform;\n z-index: 13;\n}\n\n.spectrum-palette > .spectrum-palette-color.empty-color {\n border-color: transparent;\n}\n\n.spectrum-palette > .spectrum-palette-color:not(.empty-color):not(.has-material-shades):hover,\n.palette-color-shades > .spectrum-palette-color:not(.empty-color):hover {\n transform: scale(1.15);\n}\n\n.add-color-toolbar {\n margin-left: -3px;\n margin-top: -1px;\n}\n\n.spectrum-palette-switcher {\n right: 10px;\n top: 235px;\n margin-top: 9px;\n position: absolute;\n}\n\n.palette-panel {\n width: 100%;\n height: 100%;\n position: absolute;\n top: 100%;\n display: flex;\n flex-direction: column;\n background-color: white;\n z-index: 14;\n transition: transform 200ms cubic-bezier(0, 0, 0.2, 1), visibility 0s 200ms;\n border-top: 1px solid #dadada;\n visibility: hidden;\n}\n\n.palette-panel-showing > .palette-panel {\n transform: translateY(calc(-100% + 117px));\n transition-delay: 0s;\n visibility: visible;\n}\n\n.palette-panel > div.toolbar {\n position: absolute;\n right: 6px;\n top: 6px;\n}\n\n.palette-panel > div:not(.toolbar) {\n flex: 0 0 38px;\n border-bottom: 1px solid #dadada;\n padding: 12px;\n line-height: 14px;\n color: #333;\n}\n\n.palette-panel > div.palette-title {\n font-size: 14px;\n line-height: 16px;\n color: #333;\n flex-basis: 40px;\n}\n\ndiv.palette-preview {\n display: flex;\n cursor: pointer;\n}\n\n.palette-preview-title {\n flex: 0 0 84px;\n}\n\n.palette-preview > .spectrum-palette-color {\n margin-top: 1px;\n}\n\n.palette-preview:hover {\n background-color: #eee;\n}\n\n.spectrum-overlay {\n z-index: 13;\n visibility: hidden;\n background-color: hsla(0, 0%, 0%, 0.5);\n opacity: 0;\n transition: opacity 100ms cubic-bezier(0, 0, 0.2, 1), visibility 0s 100ms;\n}\n\n.palette-panel-showing > .spectrum-overlay {\n transition-delay: 0s;\n visibility: visible;\n opacity: 1;\n}\n\n.spectrum-contrast-container {\n width: 100%;\n height: 100%;\n}\n\n.spectrum-contrast-line {\n fill: none;\n stroke: white;\n opacity: 0.7;\n stroke-width: 1.5px;\n}\n\n.delete-color-toolbar {\n position: absolute;\n right: 0;\n top: 0;\n background-color: #EFEFEF;\n visibility: hidden;\n z-index: 3;\n width: 36px;\n display: flex;\n align-items: center;\n padding-left: 4px;\n bottom: 2px;\n border-bottom-right-radius: 2px;\n}\n\n@keyframes showDeleteToolbar {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n.delete-color-toolbar.dragging {\n visibility: visible;\n animation: showDeleteToolbar 100ms 150ms cubic-bezier(0, 0, 0.2, 1) backwards;\n}\n\n.delete-color-toolbar-active {\n background-color: #ddd;\n color: white;\n}\n\n.swatch.contrast {\n width: 20px;\n height: 20px;\n margin: -10px;\n position: relative;\n top: -5px;\n left: 17px;\n background-image: url(Images/checker.png);\n border-radius: 10px;\n display: inline-block;\n}\n\n.swatch.contrast .swatch-overlay {\n padding: 0;\n}\n\n.swatch.contrast [is=ui-icon] {\n margin: -2px;\n}\n\nbutton.background-color-picker {\n border: 0;\n padding: 0;\n background: none;\n position: relative;\n margin-top: -12px;\n left: 26px;\n top: 7px;\n}\n\nbutton.background-color-picker.active [is=ui-icon].largeicon-eyedropper.icon-mask{\n background-color: hsl(218, 81%, 59%);\n}\n\n/*# sourceURL=color_picker/spectrum.css */";
\ No newline at end of file
diff --git a/src/cobalt/debug/content/devtools/console/console_module.js b/src/cobalt/debug/content/devtools/console/console_module.js
deleted file mode 100644
index 9205ad8..0000000
--- a/src/cobalt/debug/content/devtools/console/console_module.js
+++ /dev/null
@@ -1,639 +0,0 @@
-Console.ConsoleContextSelector=class{constructor(){this._items=new UI.ListModel();this._dropDown=new UI.SoftDropDown(this._items,this);this._dropDown.setRowHeight(36);this._toolbarItem=new UI.ToolbarItem(this._dropDown.element);this._badgePoolForExecutionContext=new Map();this._toolbarItem.element.classList.add('toolbar-has-dropdown');SDK.targetManager.addModelListener(SDK.RuntimeModel,SDK.RuntimeModel.Events.ExecutionContextCreated,this._onExecutionContextCreated,this);SDK.targetManager.addModelListener(SDK.RuntimeModel,SDK.RuntimeModel.Events.ExecutionContextChanged,this._onExecutionContextChanged,this);SDK.targetManager.addModelListener(SDK.RuntimeModel,SDK.RuntimeModel.Events.ExecutionContextDestroyed,this._onExecutionContextDestroyed,this);SDK.targetManager.addModelListener(SDK.ResourceTreeModel,SDK.ResourceTreeModel.Events.FrameNavigated,this._frameNavigated,this);UI.context.addFlavorChangeListener(SDK.ExecutionContext,this._executionContextChangedExternally,this);UI.context.addFlavorChangeListener(SDK.DebuggerModel.CallFrame,this._callFrameSelectedInUI,this);SDK.targetManager.observeModels(SDK.RuntimeModel,this);SDK.targetManager.addModelListener(SDK.DebuggerModel,SDK.DebuggerModel.Events.CallFrameSelected,this._callFrameSelectedInModel,this);}
-toolbarItem(){return this._toolbarItem;}
-highlightedItemChanged(from,to,fromElement,toElement){SDK.OverlayModel.hideDOMNodeHighlight();if(to&&to.frameId){var overlayModel=to.target().model(SDK.OverlayModel);if(overlayModel)
-overlayModel.highlightFrame(to.frameId);}
-if(fromElement)
-fromElement.classList.remove('highlighted');if(toElement)
-toElement.classList.add('highlighted');}
-titleFor(executionContext){var target=executionContext.target();var label=executionContext.label()?target.decorateLabel(executionContext.label()):'';if(executionContext.frameId){var resourceTreeModel=target.model(SDK.ResourceTreeModel);var frame=resourceTreeModel&&resourceTreeModel.frameForId(executionContext.frameId);if(frame)
-label=label||frame.displayName();}
-label=label||executionContext.origin;return label;}
-_depthFor(executionContext){var target=executionContext.target();var depth=0;if(!executionContext.isDefault)
-depth++;if(executionContext.frameId){var resourceTreeModel=target.model(SDK.ResourceTreeModel);var frame=resourceTreeModel&&resourceTreeModel.frameForId(executionContext.frameId);while(frame&&frame.parentFrame){depth++;frame=frame.parentFrame;}}
-var targetDepth=0;while(target.parentTarget()){if(target.parentTarget().hasJSCapability()){targetDepth++;}else{targetDepth=0;break;}
-target=target.parentTarget();}
-depth+=targetDepth;return depth;}
-_badgeFor(executionContext){if(!executionContext.frameId||!executionContext.isDefault)
-return null;var resourceTreeModel=executionContext.target().model(SDK.ResourceTreeModel);var frame=resourceTreeModel&&resourceTreeModel.frameForId(executionContext.frameId);if(!frame)
-return null;var badgePool=new ProductRegistry.BadgePool();this._badgePoolForExecutionContext.set(executionContext,badgePool);return badgePool.badgeForFrame(frame);}
-_disposeExecutionContextBadge(executionContext){var badgePool=this._badgePoolForExecutionContext.get(executionContext);if(!badgePool)
-return;badgePool.reset();this._badgePoolForExecutionContext.delete(executionContext);}
-_executionContextCreated(executionContext){if(!executionContext.target().hasJSCapability())
-return;this._items.insertWithComparator(executionContext,executionContext.runtimeModel.executionContextComparator());if(executionContext===UI.context.flavor(SDK.ExecutionContext))
-this._dropDown.selectItem(executionContext);}
-_onExecutionContextCreated(event){var executionContext=(event.data);this._executionContextCreated(executionContext);}
-_onExecutionContextChanged(event){var executionContext=(event.data);if(this._items.indexOf(executionContext)===-1)
-return;this._executionContextDestroyed(executionContext);this._executionContextCreated(executionContext);}
-_executionContextDestroyed(executionContext){var index=this._items.indexOf(executionContext);if(index===-1)
-return;this._disposeExecutionContextBadge(executionContext);this._items.remove(index);}
-_onExecutionContextDestroyed(event){var executionContext=(event.data);this._executionContextDestroyed(executionContext);}
-_executionContextChangedExternally(event){var executionContext=(event.data);this._dropDown.selectItem(executionContext);}
-_isTopContext(executionContext){if(!executionContext||!executionContext.isDefault)
-return false;var resourceTreeModel=executionContext.target().model(SDK.ResourceTreeModel);var frame=executionContext.frameId&&resourceTreeModel&&resourceTreeModel.frameForId(executionContext.frameId);if(!frame)
-return false;return frame.isMainFrame();}
-_hasTopContext(){return this._items.some(executionContext=>this._isTopContext(executionContext));}
-modelAdded(runtimeModel){runtimeModel.executionContexts().forEach(this._executionContextCreated,this);}
-modelRemoved(runtimeModel){for(var i=0;i<this._items.length;i++){if(this._items.at(i).runtimeModel===runtimeModel)
-this._executionContextDestroyed(this._items.at(i));}}
-createElementForItem(item){var element=createElementWithClass('div');var shadowRoot=UI.createShadowRootWithCoreStyles(element,'console/consoleContextSelector.css');var title=shadowRoot.createChild('div','title');title.createTextChild(this.titleFor(item).trimEnd(100));var subTitle=shadowRoot.createChild('div','subtitle');var badgeElement=this._badgeFor(item);if(badgeElement){badgeElement.classList.add('badge');subTitle.appendChild(badgeElement);}
-subTitle.createTextChild(this._subtitleFor(item));element.style.paddingLeft=(8+this._depthFor(item)*15)+'px';return element;}
-_subtitleFor(executionContext){var target=executionContext.target();if(executionContext.frameId){var resourceTreeModel=target.model(SDK.ResourceTreeModel);var frame=resourceTreeModel&&resourceTreeModel.frameForId(executionContext.frameId);}
-if(!frame||!frame.parentFrame||frame.parentFrame.securityOrigin!==executionContext.origin){var url=executionContext&&executionContext.origin&&executionContext.origin.asParsedURL();if(url)
-return url.domain();}
-if(frame){var callFrame=frame.findCreationCallFrame(callFrame=>!!callFrame.url);if(callFrame)
-return new Common.ParsedURL(callFrame.url).domain();return Common.UIString('IFrame');}
-return'';}
-isItemSelectable(item){var callFrame=item.debuggerModel.selectedCallFrame();var callFrameContext=callFrame&&callFrame.script.executionContext();return!callFrameContext||item===callFrameContext;}
-itemSelected(item){this._toolbarItem.element.classList.toggle('warning',!this._isTopContext(item)&&this._hasTopContext());UI.context.setFlavor(SDK.ExecutionContext,item);}
-_callFrameSelectedInUI(){var callFrame=UI.context.flavor(SDK.DebuggerModel.CallFrame);var callFrameContext=callFrame&&callFrame.script.executionContext();if(callFrameContext)
-UI.context.setFlavor(SDK.ExecutionContext,callFrameContext);}
-_callFrameSelectedInModel(event){var debuggerModel=(event.data);for(var executionContext of this._items){if(executionContext.debuggerModel===debuggerModel){this._disposeExecutionContextBadge(executionContext);this._dropDown.refreshItem(executionContext);}}}
-_frameNavigated(event){var frame=(event.data);var runtimeModel=frame.resourceTreeModel().target().model(SDK.RuntimeModel);if(!runtimeModel)
-return;for(var executionContext of runtimeModel.executionContexts()){if(frame.id===executionContext.frameId){this._disposeExecutionContextBadge(executionContext);this._dropDown.refreshItem(executionContext);}}}};;Console.ConsoleFilter=class{constructor(name,parsedFilters,executionContext,levelsMask){this.name=name;this.parsedFilters=parsedFilters;this.executionContext=executionContext;this.levelsMask=levelsMask||Console.ConsoleFilter.defaultLevelsFilterValue();}
-static allLevelsFilterValue(){var result={};for(var name of Object.values(ConsoleModel.ConsoleMessage.MessageLevel))
-result[name]=true;return result;}
-static defaultLevelsFilterValue(){var result=Console.ConsoleFilter.allLevelsFilterValue();result[ConsoleModel.ConsoleMessage.MessageLevel.Verbose]=false;return result;}
-static singleLevelMask(level){var result={};result[level]=true;return result;}
-clone(){var parsedFilters=this.parsedFilters.map(TextUtils.FilterParser.cloneFilter);var levelsMask=Object.assign({},this.levelsMask);return new Console.ConsoleFilter(this.name,parsedFilters,this.executionContext,levelsMask);}
-shouldBeVisible(viewMessage){var message=viewMessage.consoleMessage();if(this.executionContext&&(this.executionContext.runtimeModel!==message.runtimeModel()||this.executionContext.id!==message.executionContextId))
-return false;if(message.type===ConsoleModel.ConsoleMessage.MessageType.Command||message.type===ConsoleModel.ConsoleMessage.MessageType.Result||message.isGroupMessage())
-return true;if(message.level&&!this.levelsMask[(message.level)])
-return false;for(var filter of this.parsedFilters){if(!filter.key){if(filter.regex&&viewMessage.matchesFilterRegex(filter.regex)===filter.negative)
-return false;if(filter.text&&viewMessage.matchesFilterText(filter.text)===filter.negative)
-return false;}else{switch(filter.key){case Console.ConsoleFilter.FilterType.Context:if(!passesFilter(filter,message.context,false))
-return false;break;case Console.ConsoleFilter.FilterType.Source:var sourceNameForMessage=message.source?ConsoleModel.ConsoleMessage.MessageSourceDisplayName.get((message.source)):message.source;if(!passesFilter(filter,sourceNameForMessage,true))
-return false;break;case Console.ConsoleFilter.FilterType.Url:if(!passesFilter(filter,message.url,false))
-return false;break;}}}
-return true;function passesFilter(filter,value,exactMatch){if(!filter.text)
-return!!value===filter.negative;if(!value)
-return!filter.text===!filter.negative;var filterText=(filter.text).toLowerCase();var lowerCaseValue=value.toLowerCase();if(exactMatch&&(lowerCaseValue===filterText)===filter.negative)
-return false;if(!exactMatch&&lowerCaseValue.includes(filterText)===filter.negative)
-return false;return true;}}};Console.ConsoleFilter.FilterType={Context:'context',Source:'source',Url:'url'};;Console.ConsoleSidebar=class extends UI.VBox{constructor(badgePool){super(true);this.setMinimumSize(125,0);this._enabled=Runtime.experiments.isEnabled('logManagement');this._tree=new UI.TreeOutlineInShadow();this._tree.registerRequiredCSS('console/consoleSidebar.css');this._tree.addEventListener(UI.TreeOutline.Events.ElementSelected,this._selectionChanged.bind(this));this.contentElement.appendChild(this._tree.element);this._selectedTreeElement=null;this._treeElements=[];var Levels=ConsoleModel.ConsoleMessage.MessageLevel;var consoleAPIParsedFilters=[{key:Console.ConsoleFilter.FilterType.Source,text:ConsoleModel.ConsoleMessage.MessageSource.ConsoleAPI,negative:false}];this._appendGroup(Console.ConsoleSidebar._groupSingularName.All,[],Console.ConsoleFilter.allLevelsFilterValue(),UI.Icon.create('mediumicon-list'),badgePool);this._appendGroup(Console.ConsoleSidebar._groupSingularName.ConsoleAPI,consoleAPIParsedFilters,Console.ConsoleFilter.allLevelsFilterValue(),UI.Icon.create('mediumicon-account-circle'),badgePool);this._appendGroup(Console.ConsoleSidebar._groupSingularName.Error,[],Console.ConsoleFilter.singleLevelMask(Levels.Error),UI.Icon.create('mediumicon-error-circle'),badgePool);this._appendGroup(Console.ConsoleSidebar._groupSingularName.Warning,[],Console.ConsoleFilter.singleLevelMask(Levels.Warning),UI.Icon.create('mediumicon-warning-triangle'),badgePool);this._appendGroup(Console.ConsoleSidebar._groupSingularName.Info,[],Console.ConsoleFilter.singleLevelMask(Levels.Info),UI.Icon.create('mediumicon-info-circle'),badgePool);this._appendGroup(Console.ConsoleSidebar._groupSingularName.Verbose,[],Console.ConsoleFilter.singleLevelMask(Levels.Verbose),UI.Icon.create('mediumicon-bug'),badgePool);this._treeElements[0].select();}
-_appendGroup(name,parsedFilters,levelsMask,icon,badgePool){var filter=new Console.ConsoleFilter(name,parsedFilters,null,levelsMask);var treeElement=new Console.ConsoleSidebar.FilterTreeElement(filter,icon,badgePool);this._tree.appendChild(treeElement);this._treeElements.push(treeElement);}
-clear(){if(!this._enabled)
-return;for(var treeElement of this._treeElements)
-treeElement.clear();}
-onMessageAdded(viewMessage){if(!this._enabled)
-return;for(var treeElement of this._treeElements)
-treeElement.onMessageAdded(viewMessage);}
-shouldBeVisible(viewMessage){if(!this._enabled||!this._selectedTreeElement)
-return true;return this._selectedTreeElement._filter.shouldBeVisible(viewMessage);}
-_selectionChanged(event){this._selectedTreeElement=(event.data);this.dispatchEventToListeners(Console.ConsoleSidebar.Events.FilterSelected);}};Console.ConsoleSidebar.Events={FilterSelected:Symbol('FilterSelected')};Console.ConsoleSidebar.URLGroupTreeElement=class extends UI.TreeElement{constructor(filter,badge){super(filter.name);this._filter=filter;this._countElement=this.listItemElement.createChild('span','count');var leadingIcons=[UI.Icon.create('largeicon-navigator-file')];if(badge)
-leadingIcons.push(badge);this.setLeadingIcons(leadingIcons);this._messageCount=0;}
-incrementAndUpdateCounter(){this._messageCount++;this._countElement.textContent=this._messageCount;}};Console.ConsoleSidebar.FilterTreeElement=class extends UI.TreeElement{constructor(filter,icon,badgePool){super(filter.name,true);this._filter=filter;this._badgePool=badgePool;this._urlTreeElements=new Map();this.setLeadingIcons([icon]);this._messageCount=0;this._updateCounter();}
-clear(){this._urlTreeElements.clear();this.removeChildren();this._messageCount=0;this._updateCounter();}
-_updateCounter(){var prefix=this._messageCount?this._messageCount:Common.UIString('No');var pluralizedName=this._messageCount===1?this._filter.name:Console.ConsoleSidebar._groupPluralNameMap.get(this._filter.name);this.title=`${prefix} ${pluralizedName}`;}
-onMessageAdded(viewMessage){var message=viewMessage.consoleMessage();var shouldIncrementCounter=message.type!==ConsoleModel.ConsoleMessage.MessageType.Command&&message.type!==ConsoleModel.ConsoleMessage.MessageType.Result&&!message.isGroupMessage();if(!this._filter.shouldBeVisible(viewMessage)||!shouldIncrementCounter)
-return;var child=this._childElement(message.url);child.incrementAndUpdateCounter();this._messageCount++;this._updateCounter();}
-_childElement(url){var urlValue=url||null;var child=this._urlTreeElements.get(urlValue);if(child)
-return child;var filter=this._filter.clone();var parsedURL=urlValue?urlValue.asParsedURL():null;if(urlValue)
-filter.name=parsedURL?parsedURL.displayName:urlValue;else
-filter.name=Common.UIString('<other>');filter.parsedFilters.push({key:Console.ConsoleFilter.FilterType.Url,text:urlValue,negative:false});var badge=parsedURL?this._badgePool.badgeForURL(parsedURL):null;child=new Console.ConsoleSidebar.URLGroupTreeElement(filter,badge);if(urlValue)
-child.tooltip=urlValue;this._urlTreeElements.set(urlValue,child);this.appendChild(child);return child;}};Console.ConsoleSidebar._groupSingularName={ConsoleAPI:Common.UIString('user message'),All:Common.UIString('message'),Error:Common.UIString('error'),Warning:Common.UIString('warning'),Info:Common.UIString('info'),Verbose:Common.UIString('verbose')};Console.ConsoleSidebar._groupPluralNameMap=new Map([[Console.ConsoleSidebar._groupSingularName.ConsoleAPI,Common.UIString('user messages')],[Console.ConsoleSidebar._groupSingularName.All,Common.UIString('messages')],[Console.ConsoleSidebar._groupSingularName.Error,Common.UIString('errors')],[Console.ConsoleSidebar._groupSingularName.Warning,Common.UIString('warnings')],[Console.ConsoleSidebar._groupSingularName.Info,Common.UIString('info')],[Console.ConsoleSidebar._groupSingularName.Verbose,Common.UIString('verbose')]]);;Console.ConsoleViewport=class{constructor(provider){this.element=createElement('div');this.element.style.overflow='auto';this._topGapElement=this.element.createChild('div');this._topGapElement.style.height='0px';this._topGapElement.style.color='transparent';this._contentElement=this.element.createChild('div');this._bottomGapElement=this.element.createChild('div');this._bottomGapElement.style.height='0px';this._bottomGapElement.style.color='transparent';this._topGapElement.textContent='\uFEFF';this._bottomGapElement.textContent='\uFEFF';this._provider=provider;this.element.addEventListener('scroll',this._onScroll.bind(this),false);this.element.addEventListener('copy',this._onCopy.bind(this),false);this.element.addEventListener('dragstart',this._onDragStart.bind(this),false);this._firstActiveIndex=0;this._lastActiveIndex=-1;this._renderedItems=[];this._anchorSelection=null;this._headSelection=null;this._itemCount=0;this._cumulativeHeights=new Int32Array(0);this._observer=new MutationObserver(this.refresh.bind(this));this._observerConfig={childList:true,subtree:true};}
-stickToBottom(){return this._stickToBottom;}
-setStickToBottom(value){this._stickToBottom=value;if(this._stickToBottom)
-this._observer.observe(this._contentElement,this._observerConfig);else
-this._observer.disconnect();}
-_onCopy(event){var text=this._selectedText();if(!text)
-return;event.preventDefault();event.clipboardData.setData('text/plain',text);}
-_onDragStart(event){var text=this._selectedText();if(!text)
-return false;event.dataTransfer.clearData();event.dataTransfer.setData('text/plain',text);event.dataTransfer.effectAllowed='copy';return true;}
-contentElement(){return this._contentElement;}
-invalidate(){delete this._cachedProviderElements;this._itemCount=this._provider.itemCount();this._rebuildCumulativeHeights();this.refresh();}
-_providerElement(index){if(!this._cachedProviderElements)
-this._cachedProviderElements=new Array(this._itemCount);var element=this._cachedProviderElements[index];if(!element){element=this._provider.itemElement(index);this._cachedProviderElements[index]=element;}
-return element;}
-_rebuildCumulativeHeights(){var firstActiveIndex=this._firstActiveIndex;var lastActiveIndex=this._lastActiveIndex;var height=0;this._cumulativeHeights=new Int32Array(this._itemCount);for(var i=0;i<this._itemCount;++i){if(firstActiveIndex<=i&&i-firstActiveIndex<this._renderedItems.length&&i<=lastActiveIndex)
-height+=this._renderedItems[i-firstActiveIndex].element().offsetHeight;else
-height+=this._provider.fastHeight(i);this._cumulativeHeights[i]=height;}}
-_cachedItemHeight(index){return index===0?this._cumulativeHeights[0]:this._cumulativeHeights[index]-this._cumulativeHeights[index-1];}
-_isSelectionBackwards(selection){if(!selection||!selection.rangeCount)
-return false;var range=document.createRange();range.setStart(selection.anchorNode,selection.anchorOffset);range.setEnd(selection.focusNode,selection.focusOffset);return range.collapsed;}
-_createSelectionModel(itemIndex,node,offset){return{item:itemIndex,node:node,offset:offset};}
-_updateSelectionModel(selection){var range=selection&&selection.rangeCount?selection.getRangeAt(0):null;if(!range||selection.isCollapsed||!this.element.hasSelection()){this._headSelection=null;this._anchorSelection=null;return false;}
-var firstSelected=Number.MAX_VALUE;var lastSelected=-1;var hasVisibleSelection=false;for(var i=0;i<this._renderedItems.length;++i){if(range.intersectsNode(this._renderedItems[i].element())){var index=i+this._firstActiveIndex;firstSelected=Math.min(firstSelected,index);lastSelected=Math.max(lastSelected,index);hasVisibleSelection=true;}}
-if(hasVisibleSelection){firstSelected=this._createSelectionModel(firstSelected,(range.startContainer),range.startOffset);lastSelected=this._createSelectionModel(lastSelected,(range.endContainer),range.endOffset);}
-var topOverlap=range.intersectsNode(this._topGapElement)&&this._topGapElement._active;var bottomOverlap=range.intersectsNode(this._bottomGapElement)&&this._bottomGapElement._active;if(!topOverlap&&!bottomOverlap&&!hasVisibleSelection){this._headSelection=null;this._anchorSelection=null;return false;}
-if(!this._anchorSelection||!this._headSelection){this._anchorSelection=this._createSelectionModel(0,this.element,0);this._headSelection=this._createSelectionModel(this._itemCount-1,this.element,this.element.children.length);this._selectionIsBackward=false;}
-var isBackward=this._isSelectionBackwards(selection);var startSelection=this._selectionIsBackward?this._headSelection:this._anchorSelection;var endSelection=this._selectionIsBackward?this._anchorSelection:this._headSelection;if(topOverlap&&bottomOverlap&&hasVisibleSelection){firstSelected=firstSelected.item<startSelection.item?firstSelected:startSelection;lastSelected=lastSelected.item>endSelection.item?lastSelected:endSelection;}else if(!hasVisibleSelection){firstSelected=startSelection;lastSelected=endSelection;}else if(topOverlap){firstSelected=isBackward?this._headSelection:this._anchorSelection;}else if(bottomOverlap){lastSelected=isBackward?this._anchorSelection:this._headSelection;}
-if(isBackward){this._anchorSelection=lastSelected;this._headSelection=firstSelected;}else{this._anchorSelection=firstSelected;this._headSelection=lastSelected;}
-this._selectionIsBackward=isBackward;return true;}
-_restoreSelection(selection){var anchorElement=null;var anchorOffset;if(this._firstActiveIndex<=this._anchorSelection.item&&this._anchorSelection.item<=this._lastActiveIndex){anchorElement=this._anchorSelection.node;anchorOffset=this._anchorSelection.offset;}else{if(this._anchorSelection.item<this._firstActiveIndex)
-anchorElement=this._topGapElement;else if(this._anchorSelection.item>this._lastActiveIndex)
-anchorElement=this._bottomGapElement;anchorOffset=this._selectionIsBackward?1:0;}
-var headElement=null;var headOffset;if(this._firstActiveIndex<=this._headSelection.item&&this._headSelection.item<=this._lastActiveIndex){headElement=this._headSelection.node;headOffset=this._headSelection.offset;}else{if(this._headSelection.item<this._firstActiveIndex)
-headElement=this._topGapElement;else if(this._headSelection.item>this._lastActiveIndex)
-headElement=this._bottomGapElement;headOffset=this._selectionIsBackward?0:1;}
-selection.setBaseAndExtent(anchorElement,anchorOffset,headElement,headOffset);}
-refresh(){this._observer.disconnect();this._innerRefresh();if(this._stickToBottom)
-this._observer.observe(this._contentElement,this._observerConfig);}
-_innerRefresh(){if(!this._visibleHeight())
-return;if(!this._itemCount){for(var i=0;i<this._renderedItems.length;++i)
-this._renderedItems[i].willHide();this._renderedItems=[];this._contentElement.removeChildren();this._topGapElement.style.height='0px';this._bottomGapElement.style.height='0px';this._firstActiveIndex=-1;this._lastActiveIndex=-1;return;}
-var selection=this.element.getComponentSelection();var shouldRestoreSelection=this._updateSelectionModel(selection);var visibleFrom=this.element.scrollTop;var visibleHeight=this._visibleHeight();for(var i=0;i<this._renderedItems.length;++i){var cachedItemHeight=this._cachedItemHeight(this._firstActiveIndex+i);if(Math.abs(cachedItemHeight-this._renderedItems[i].element().offsetHeight)>1){this._rebuildCumulativeHeights();break;}}
-var activeHeight=visibleHeight*2;if(this._stickToBottom){this._firstActiveIndex=Math.max(this._itemCount-Math.ceil(activeHeight/this._provider.minimumRowHeight()),0);this._lastActiveIndex=this._itemCount-1;}else{this._firstActiveIndex=Math.max(Int32Array.prototype.lowerBound.call(this._cumulativeHeights,visibleFrom+1-(activeHeight-visibleHeight)/2),0);this._lastActiveIndex=this._firstActiveIndex+Math.ceil(activeHeight/this._provider.minimumRowHeight())-1;this._lastActiveIndex=Math.min(this._lastActiveIndex,this._itemCount-1);}
-var topGapHeight=this._cumulativeHeights[this._firstActiveIndex-1]||0;var bottomGapHeight=this._cumulativeHeights[this._cumulativeHeights.length-1]-this._cumulativeHeights[this._lastActiveIndex];function prepare(){this._topGapElement.style.height=topGapHeight+'px';this._bottomGapElement.style.height=bottomGapHeight+'px';this._topGapElement._active=!!topGapHeight;this._bottomGapElement._active=!!bottomGapHeight;this._contentElement.style.setProperty('height','10000000px');}
-this._partialViewportUpdate(prepare.bind(this));this._contentElement.style.removeProperty('height');if(shouldRestoreSelection)
-this._restoreSelection(selection);if(this._stickToBottom)
-this.element.scrollTop=10000000;}
-_partialViewportUpdate(prepare){var itemsToRender=new Set();for(var i=this._firstActiveIndex;i<=this._lastActiveIndex;++i)
-itemsToRender.add(this._providerElement(i));var willBeHidden=this._renderedItems.filter(item=>!itemsToRender.has(item));for(var i=0;i<willBeHidden.length;++i)
-willBeHidden[i].willHide();prepare();for(var i=0;i<willBeHidden.length;++i)
-willBeHidden[i].element().remove();var wasShown=[];var anchor=this._contentElement.firstChild;for(var viewportElement of itemsToRender){var element=viewportElement.element();if(element!==anchor){var shouldCallWasShown=!element.parentElement;if(shouldCallWasShown)
-wasShown.push(viewportElement);this._contentElement.insertBefore(element,anchor);}else{anchor=anchor.nextSibling;}}
-for(var i=0;i<wasShown.length;++i)
-wasShown[i].wasShown();this._renderedItems=Array.from(itemsToRender);}
-_selectedText(){this._updateSelectionModel(this.element.getComponentSelection());if(!this._headSelection||!this._anchorSelection)
-return null;var startSelection=null;var endSelection=null;if(this._selectionIsBackward){startSelection=this._headSelection;endSelection=this._anchorSelection;}else{startSelection=this._anchorSelection;endSelection=this._headSelection;}
-var textLines=[];for(var i=startSelection.item;i<=endSelection.item;++i){var element=this._providerElement(i).element();var lineContent=element.childTextNodes().map(Components.Linkifier.untruncatedNodeText).join('');textLines.push(lineContent);}
-var endSelectionElement=this._providerElement(endSelection.item).element();if(endSelection.node&&endSelection.node.isSelfOrDescendant(endSelectionElement)){var itemTextOffset=this._textOffsetInNode(endSelectionElement,endSelection.node,endSelection.offset);textLines[textLines.length-1]=textLines.peekLast().substring(0,itemTextOffset);}
-var startSelectionElement=this._providerElement(startSelection.item).element();if(startSelection.node&&startSelection.node.isSelfOrDescendant(startSelectionElement)){var itemTextOffset=this._textOffsetInNode(startSelectionElement,startSelection.node,startSelection.offset);textLines[0]=textLines[0].substring(itemTextOffset);}
-return textLines.join('\n');}
-_textOffsetInNode(itemElement,selectionNode,offset){if(selectionNode.nodeType!==Node.TEXT_NODE){if(offset<selectionNode.childNodes.length){selectionNode=(selectionNode.childNodes.item(offset));offset=0;}else{offset=selectionNode.textContent.length;}}
-var chars=0;var node=itemElement;while((node=node.traverseNextNode(itemElement))&&node!==selectionNode){if(node.nodeType!==Node.TEXT_NODE||node.parentElement.nodeName==='STYLE'||node.parentElement.nodeName==='SCRIPT')
-continue;chars+=Components.Linkifier.untruncatedNodeText(node).length;}
-var untruncatedContainerLength=Components.Linkifier.untruncatedNodeText(selectionNode).length;if(offset>0&&untruncatedContainerLength!==selectionNode.textContent.length)
-offset=untruncatedContainerLength;return chars+offset;}
-_onScroll(event){this.refresh();}
-firstVisibleIndex(){var firstVisibleIndex=Math.max(Int32Array.prototype.lowerBound.call(this._cumulativeHeights,this.element.scrollTop+1),0);return Math.max(firstVisibleIndex,this._firstActiveIndex);}
-lastVisibleIndex(){var lastVisibleIndex;if(this._stickToBottom){lastVisibleIndex=this._itemCount-1;}else{lastVisibleIndex=this.firstVisibleIndex()+Math.ceil(this._visibleHeight()/this._provider.minimumRowHeight())-1;}
-return Math.min(lastVisibleIndex,this._lastActiveIndex);}
-renderedElementAt(index){if(index<this._firstActiveIndex)
-return null;if(index>this._lastActiveIndex)
-return null;return this._renderedItems[index-this._firstActiveIndex].element();}
-scrollItemIntoView(index,makeLast){var firstVisibleIndex=this.firstVisibleIndex();var lastVisibleIndex=this.lastVisibleIndex();if(index>firstVisibleIndex&&index<lastVisibleIndex)
-return;if(makeLast)
-this.forceScrollItemToBeLast(index);else if(index<=firstVisibleIndex)
-this.forceScrollItemToBeFirst(index);else if(index>=lastVisibleIndex)
-this.forceScrollItemToBeLast(index);}
-forceScrollItemToBeFirst(index){this.setStickToBottom(false);this.element.scrollTop=index>0?this._cumulativeHeights[index-1]:0;if(this.element.isScrolledToBottom())
-this.setStickToBottom(true);this.refresh();}
-forceScrollItemToBeLast(index){this.setStickToBottom(false);this.element.scrollTop=this._cumulativeHeights[index]-this._visibleHeight();if(this.element.isScrolledToBottom())
-this.setStickToBottom(true);this.refresh();}
-_visibleHeight(){return this.element.offsetHeight;}};Console.ConsoleViewportProvider=function(){};Console.ConsoleViewportProvider.prototype={fastHeight(index){return 0;},itemCount(){return 0;},minimumRowHeight(){return 0;},itemElement(index){return null;}};Console.ConsoleViewportElement=function(){};Console.ConsoleViewportElement.prototype={willHide(){},wasShown(){},element(){},};;Console.ConsoleViewMessage=class{constructor(consoleMessage,linkifier,badgePool,nestingLevel){this._message=consoleMessage;this._linkifier=linkifier;this._badgePool=badgePool;this._repeatCount=1;this._closeGroupDecorationCount=0;this._nestingLevel=nestingLevel;this._dataGrid=null;this._previewFormatter=new ObjectUI.RemoteObjectPreviewFormatter();this._searchRegex=null;this._messageLevelIcon=null;}
-element(){return this.toMessageElement();}
-wasShown(){if(this._dataGrid)
-this._dataGrid.updateWidths();this._isVisible=true;}
-onResize(){if(!this._isVisible)
-return;if(this._dataGrid)
-this._dataGrid.onResize();}
-willHide(){this._isVisible=false;this._cachedHeight=this.contentElement().offsetHeight;}
-fastHeight(){if(this._cachedHeight)
-return this._cachedHeight;const defaultConsoleRowHeight=19;if(this._message.type===ConsoleModel.ConsoleMessage.MessageType.Table){var table=this._message.parameters[0];if(table&&table.preview)
-return defaultConsoleRowHeight*table.preview.properties.length;}
-return defaultConsoleRowHeight;}
-consoleMessage(){return this._message;}
-_buildTableMessage(){var formattedMessage=createElement('span');UI.appendStyle(formattedMessage,'object_ui/objectValue.css');formattedMessage.className='source-code';var anchorElement=this._buildMessageAnchor();if(anchorElement)
-formattedMessage.appendChild(anchorElement);var badgeElement=this._buildMessageBadge();if(badgeElement)
-formattedMessage.appendChild(badgeElement);var table=this._message.parameters&&this._message.parameters.length?this._message.parameters[0]:null;if(table)
-table=this._parameterToRemoteObject(table);if(!table||!table.preview)
-return formattedMessage;var rawValueColumnSymbol=Symbol('rawValueColumn');var columnNames=[];var preview=table.preview;var rows=[];for(var i=0;i<preview.properties.length;++i){var rowProperty=preview.properties[i];var rowSubProperties;if(rowProperty.valuePreview)
-rowSubProperties=rowProperty.valuePreview.properties;else if(rowProperty.value)
-rowSubProperties=[{name:rawValueColumnSymbol,type:rowProperty.type,value:rowProperty.value}];else
-continue;var rowValue={};const maxColumnsToRender=20;for(var j=0;j<rowSubProperties.length;++j){var cellProperty=rowSubProperties[j];var columnRendered=columnNames.indexOf(cellProperty.name)!==-1;if(!columnRendered){if(columnNames.length===maxColumnsToRender)
-continue;columnRendered=true;columnNames.push(cellProperty.name);}
-if(columnRendered){var cellElement=this._renderPropertyPreviewOrAccessor(table,[rowProperty,cellProperty]);cellElement.classList.add('console-message-nowrap-below');rowValue[cellProperty.name]=cellElement;}}
-rows.push([rowProperty.name,rowValue]);}
-var flatValues=[];for(var i=0;i<rows.length;++i){var rowName=rows[i][0];var rowValue=rows[i][1];flatValues.push(rowName);for(var j=0;j<columnNames.length;++j)
-flatValues.push(rowValue[columnNames[j]]);}
-columnNames.unshift(Common.UIString('(index)'));var columnDisplayNames=columnNames.map(name=>name===rawValueColumnSymbol?Common.UIString('Value'):name);if(flatValues.length){this._dataGrid=DataGrid.SortableDataGrid.create(columnDisplayNames,flatValues);this._dataGrid.setStriped(true);var formattedResult=createElementWithClass('span','console-message-text');var tableElement=formattedResult.createChild('div','console-message-formatted-table');var dataGridContainer=tableElement.createChild('span');tableElement.appendChild(this._formatParameter(table,true,false));dataGridContainer.appendChild(this._dataGrid.element);formattedMessage.appendChild(formattedResult);this._dataGrid.renderInline();}
-return formattedMessage;}
-_buildMessage(){var messageElement;var messageText=this._message.messageText;if(this._message.source===ConsoleModel.ConsoleMessage.MessageSource.ConsoleAPI){switch(this._message.type){case ConsoleModel.ConsoleMessage.MessageType.Trace:messageElement=this._format(this._message.parameters||['console.trace']);break;case ConsoleModel.ConsoleMessage.MessageType.Clear:messageElement=createElementWithClass('span','console-info');if(Common.moduleSetting('preserveConsoleLog').get())
-messageElement.textContent=Common.UIString('console.clear() was prevented due to \'Preserve log\'');else
-messageElement.textContent=Common.UIString('Console was cleared');messageElement.title=Common.UIString('Clear all messages with '+UI.shortcutRegistry.shortcutTitleForAction('console.clear'));break;case ConsoleModel.ConsoleMessage.MessageType.Assert:var args=[Common.UIString('Assertion failed:')];if(this._message.parameters)
-args=args.concat(this._message.parameters);messageElement=this._format(args);break;case ConsoleModel.ConsoleMessage.MessageType.Dir:var obj=this._message.parameters?this._message.parameters[0]:undefined;var args=['%O',obj];messageElement=this._format(args);break;case ConsoleModel.ConsoleMessage.MessageType.Profile:case ConsoleModel.ConsoleMessage.MessageType.ProfileEnd:messageElement=this._format([messageText]);break;default:if(this._message.parameters&&this._message.parameters.length===1&&this._message.parameters[0].type==='string')
-messageElement=this._tryFormatAsError((this._message.parameters[0].value));var args=this._message.parameters||[messageText];messageElement=messageElement||this._format(args);}}else if(this._message.source===ConsoleModel.ConsoleMessage.MessageSource.Network){var request=this._message.request;if(request){messageElement=createElement('span');if(this._message.level===ConsoleModel.ConsoleMessage.MessageLevel.Error){messageElement.createTextChild(request.requestMethod+' ');messageElement.appendChild(Components.Linkifier.linkifyRevealable(request,request.url(),request.url()));if(request.failed)
-messageElement.createTextChildren(' ',request.localizedFailDescription);else
-messageElement.createTextChildren(' ',String(request.statusCode),' (',request.statusText,')');}else{var fragment=Console.ConsoleViewMessage._linkifyWithCustomLinkifier(messageText,title=>Components.Linkifier.linkifyRevealable((request),title,request.url()));messageElement.appendChild(fragment);}}else{messageElement=this._format([messageText]);}}else{var messageInParameters=this._message.parameters&&messageText===(this._message.parameters[0]);if(this._message.source===ConsoleModel.ConsoleMessage.MessageSource.Violation)
-messageText=Common.UIString('[Violation] %s',messageText);else if(this._message.source===ConsoleModel.ConsoleMessage.MessageSource.Intervention)
-messageText=Common.UIString('[Intervention] %s',messageText);else if(this._message.source===ConsoleModel.ConsoleMessage.MessageSource.Deprecation)
-messageText=Common.UIString('[Deprecation] %s',messageText);var args=this._message.parameters||[messageText];if(messageInParameters)
-args[0]=messageText;messageElement=this._format(args);}
-messageElement.classList.add('console-message-text');var formattedMessage=createElement('span');UI.appendStyle(formattedMessage,'object_ui/objectValue.css');formattedMessage.className='source-code';var anchorElement=this._buildMessageAnchor();if(anchorElement)
-formattedMessage.appendChild(anchorElement);var badgeElement=this._buildMessageBadge();if(badgeElement)
-formattedMessage.appendChild(badgeElement);formattedMessage.appendChild(messageElement);return formattedMessage;}
-_buildMessageAnchor(){var anchorElement=null;if(this._message.source!==ConsoleModel.ConsoleMessage.MessageSource.Network||this._message.request){if(this._message.scriptId){anchorElement=this._linkifyScriptId(this._message.scriptId,this._message.url||'',this._message.line,this._message.column);}else if(this._message.stackTrace&&this._message.stackTrace.callFrames.length){anchorElement=this._linkifyStackTraceTopFrame(this._message.stackTrace);}else if(this._message.url&&this._message.url!=='undefined'){anchorElement=this._linkifyLocation(this._message.url,this._message.line,this._message.column);}}else if(this._message.url){anchorElement=Components.Linkifier.linkifyURL(this._message.url,{maxLength:Console.ConsoleViewMessage.MaxLengthForLinks});}
-if(anchorElement){var anchorWrapperElement=createElementWithClass('span','console-message-anchor');anchorWrapperElement.appendChild(anchorElement);anchorWrapperElement.createTextChild(' ');return anchorWrapperElement;}
-return null;}
-_buildMessageBadge(){var badgeElement=this._badgeElement();if(!badgeElement)
-return null;badgeElement.classList.add('console-message-badge');return badgeElement;}
-_badgeElement(){if(this._message._url)
-return this._badgePool.badgeForURL(new Common.ParsedURL(this._message._url));if(this._message.stackTrace){var stackTrace=this._message.stackTrace;while(stackTrace){for(var callFrame of this._message.stackTrace.callFrames){if(callFrame.url)
-return this._badgePool.badgeForURL(new Common.ParsedURL(callFrame.url));}
-stackTrace=stackTrace.parent;}}
-if(!this._message.executionContextId)
-return null;var runtimeModel=this._message.runtimeModel();if(!runtimeModel)
-return null;var executionContext=runtimeModel.executionContext(this._message.executionContextId);if(!executionContext||!executionContext.frameId)
-return null;var resourceTreeModel=executionContext.target().model(SDK.ResourceTreeModel);if(!resourceTreeModel)
-return null;var frame=resourceTreeModel.frameForId(executionContext.frameId);if(!frame||!frame.parentFrame)
-return null;return this._badgePool.badgeForFrame(frame);}
-_buildMessageWithStackTrace(){var toggleElement=createElementWithClass('div','console-message-stack-trace-toggle');var contentElement=toggleElement.createChild('div','console-message-stack-trace-wrapper');var messageElement=this._buildMessage();var icon=UI.Icon.create('smallicon-triangle-right','console-message-expand-icon');var clickableElement=contentElement.createChild('div');clickableElement.appendChild(icon);clickableElement.appendChild(messageElement);var stackTraceElement=contentElement.createChild('div');var stackTracePreview=Components.DOMPresentationUtils.buildStackTracePreviewContents(this._message.runtimeModel().target(),this._linkifier,this._message.stackTrace);stackTraceElement.appendChild(stackTracePreview);stackTraceElement.classList.add('hidden');function expandStackTrace(expand){icon.setIconType(expand?'smallicon-triangle-down':'smallicon-triangle-right');stackTraceElement.classList.toggle('hidden',!expand);}
-function toggleStackTrace(event){if(event.target.hasSelection())
-return;expandStackTrace(stackTraceElement.classList.contains('hidden'));event.consume();}
-clickableElement.addEventListener('click',toggleStackTrace,false);if(this._message.type===ConsoleModel.ConsoleMessage.MessageType.Trace)
-expandStackTrace(true);toggleElement._expandStackTraceForTest=expandStackTrace.bind(null,true);return toggleElement;}
-_linkifyLocation(url,lineNumber,columnNumber){if(!this._message.runtimeModel())
-return null;return this._linkifier.linkifyScriptLocation(this._message.runtimeModel().target(),null,url,lineNumber,columnNumber);}
-_linkifyStackTraceTopFrame(stackTrace){if(!this._message.runtimeModel())
-return null;return this._linkifier.linkifyStackTraceTopFrame(this._message.runtimeModel().target(),stackTrace);}
-_linkifyScriptId(scriptId,url,lineNumber,columnNumber){if(!this._message.runtimeModel())
-return null;return this._linkifier.linkifyScriptLocation(this._message.runtimeModel().target(),scriptId,url,lineNumber,columnNumber);}
-_parameterToRemoteObject(parameter){if(parameter instanceof SDK.RemoteObject)
-return parameter;var runtimeModel=this._message.runtimeModel();if(!runtimeModel)
-return SDK.RemoteObject.fromLocalObject(parameter);if(typeof parameter==='object')
-return runtimeModel.createRemoteObject(parameter);return runtimeModel.createRemoteObjectFromPrimitiveValue(parameter);}
-_format(rawParameters){var formattedResult=createElement('span');if(!rawParameters.length)
-return formattedResult;var parameters=[];for(var i=0;i<rawParameters.length;++i)
-parameters[i]=this._parameterToRemoteObject(rawParameters[i]);var shouldFormatMessage=SDK.RemoteObject.type(((parameters))[0])==='string'&&(this._message.type!==ConsoleModel.ConsoleMessage.MessageType.Result||this._message.level===ConsoleModel.ConsoleMessage.MessageLevel.Error);if(shouldFormatMessage){var result=this._formatWithSubstitutionString((parameters[0].description),parameters.slice(1),formattedResult);parameters=result.unusedSubstitutions;if(parameters.length)
-formattedResult.createTextChild(' ');}
-for(var i=0;i<parameters.length;++i){if(shouldFormatMessage&¶meters[i].type==='string')
-formattedResult.appendChild(Console.ConsoleViewMessage._linkifyStringAsFragment(parameters[i].description));else
-formattedResult.appendChild(this._formatParameter(parameters[i],false,true));if(i<parameters.length-1)
-formattedResult.createTextChild(' ');}
-return formattedResult;}
-_formatParameter(output,forceObjectFormat,includePreview){if(output.customPreview())
-return(new ObjectUI.CustomPreviewComponent(output)).element;var type=forceObjectFormat?'object':(output.subtype||output.type);var element;switch(type){case'error':element=this._formatParameterAsError(output);break;case'function':element=this._formatParameterAsFunction(output,includePreview);break;case'array':case'arraybuffer':case'blob':case'dataview':case'generator':case'iterator':case'map':case'object':case'promise':case'proxy':case'set':case'typedarray':case'weakmap':case'weakset':element=this._formatParameterAsObject(output,includePreview);break;case'node':element=output.isNode()?this._formatParameterAsNode(output):this._formatParameterAsObject(output,false);break;case'string':element=this._formatParameterAsString(output);break;case'boolean':case'date':case'null':case'number':case'regexp':case'symbol':case'undefined':element=this._formatParameterAsValue(output);break;default:element=this._formatParameterAsValue(output);console.error('Tried to format remote object of unknown type.');}
-element.classList.add('object-value-'+type);element.classList.add('source-code');return element;}
-_formatParameterAsValue(obj){var result=createElement('span');result.createTextChild(obj.description||'');if(obj.objectId)
-result.addEventListener('contextmenu',this._contextMenuEventFired.bind(this,obj),false);return result;}
-_formatParameterAsObject(obj,includePreview){var titleElement=createElement('span');if(includePreview&&obj.preview){titleElement.classList.add('console-object-preview');this._previewFormatter.appendObjectPreview(titleElement,obj.preview,false);}else if(obj.type==='function'){ObjectUI.ObjectPropertiesSection.formatObjectAsFunction(obj,titleElement,false);titleElement.classList.add('object-value-function');}else{titleElement.createTextChild(obj.