chrome的devtool源码inspectjs

来源:互联网 发布:城市地图制作软件 编辑:程序博客网 时间:2024/05/16 09:25
var allDescriptors = [{    "dependencies": ["platform", "common", "host", "ui"],    "name": "ui_lazy",    "scripts": []}, {    "experiment": "promiseTracker",    "extensions": [{        "className": "WebInspector.PromisePane",        "order": "30",        "type": "drawer-view",        "name": "promises",        "title": "Promises"    }],    "name": "promises",    "dependencies": ["components", "ui_lazy"],    "scripts": []}, {    "experiment": "accessibilityInspection",    "extensions": [{        "className": "WebInspector.AccessibilitySidebarView",        "type": "@WebInspector.Widget",        "location": "elements-panel",        "title": "Accessibility"    }],    "name": "accessibility",    "dependencies": ["elements"],    "scripts": []}, {    "dependencies": ["source_frame", "snippets", "extensions"],    "extensions": [{        "className": "WebInspector.SourcesPanelFactory",        "order": 2,        "type": "@WebInspector.PanelFactory",        "name": "sources",        "title": "Sources"    }, {        "className": "WebInspector.AdvancedSearchView",        "order": "1",        "type": "drawer-view",        "name": "sources.search",        "title": "Search"    }, {        "className": "WebInspector.SourcesPanel.ContextMenuProvider",        "contextTypes": ["WebInspector.UISourceCode", "WebInspector.UILocation", "WebInspector.RemoteObject", "WebInspector.NetworkRequest"],        "type": "@WebInspector.ContextMenu.Provider"    }, {        "className": "WebInspector.SourcesPanel.RevealingActionDelegate",        "contextTypes": ["WebInspector.SourcesPanel", "WebInspector.ShortcutRegistry.ForwardedShortcut"],        "bindings": [{            "platform": "windows,linux",            "shortcut": "F8 Ctrl+\\"        }, {            "platform": "mac",            "shortcut": "F8 Meta+\\"        }],        "type": "@WebInspector.ActionDelegate",        "actionId": "debugger.toggle-pause"    }, {        "className": "WebInspector.SourcesPanel.DebuggingActionDelegate",        "contextTypes": ["WebInspector.SourcesPanel"],        "bindings": [{            "platform": "windows,linux",            "shortcut": "F10 Ctrl+'"        }, {            "platform": "mac",            "shortcut": "F10 Meta+'"        }],        "type": "@WebInspector.ActionDelegate",        "actionId": "debugger.step-over"    }, {        "className": "WebInspector.SourcesPanel.DebuggingActionDelegate",        "contextTypes": ["WebInspector.SourcesPanel"],        "bindings": [{            "platform": "windows,linux",            "shortcut": "F11 Ctrl+;"        }, {            "platform": "mac",            "shortcut": "F11 Meta+;"        }],        "type": "@WebInspector.ActionDelegate",        "actionId": "debugger.step-into"    }, {        "className": "WebInspector.SourcesPanel.DebuggingActionDelegate",        "experiment": "stepIntoAsync",        "contextTypes": ["WebInspector.SourcesPanel"],        "actionId": "debugger.step-into-async",        "bindings": [{            "platform": "windows,linux",            "shortcut": "Alt+F11 Alt+Ctrl+;"        }, {            "platform": "mac",            "shortcut": "Alt+F11 Alt+Meta+;"        }],        "type": "@WebInspector.ActionDelegate"    }, {        "className": "WebInspector.SourcesPanel.DebuggingActionDelegate",        "contextTypes": ["WebInspector.SourcesPanel"],        "bindings": [{            "platform": "windows,linux",            "shortcut": "Shift+F11 Shift+Ctrl+;"        }, {            "platform": "mac",            "shortcut": "Shift+F11 Shift+Meta+;"        }],        "type": "@WebInspector.ActionDelegate",        "actionId": "debugger.step-out"    }, {        "className": "WebInspector.SourcesPanel.DebuggingActionDelegate",        "contextTypes": ["WebInspector.SourcesPanel"],        "bindings": [{            "platform": "windows,linux",            "shortcut": "Ctrl+Enter"        }, {            "platform": "mac",            "shortcut": "Meta+Enter"        }],        "type": "@WebInspector.ActionDelegate",        "actionId": "debugger.run-snippet"    }, {        "className": "WebInspector.AdvancedSearchView.ActionDelegate",        "bindings": [{            "platform": "mac",            "shortcut": "Meta+Alt+F"        }, {            "platform": "windows,linux",            "shortcut": "Ctrl+Shift+F"        }],        "type": "@WebInspector.ActionDelegate",        "actionId": "sources.search.toggle"    }, {        "className": "WebInspector.SourcesPanel.UILocationRevealer",        "contextTypes": ["WebInspector.UILocation"],        "type": "@WebInspector.Revealer"    }, {        "className": "WebInspector.SourcesPanel.DebuggerLocationRevealer",        "contextTypes": ["WebInspector.DebuggerModel.Location"],        "type": "@WebInspector.Revealer"    }, {        "className": "WebInspector.SourcesPanel.UISourceCodeRevealer",        "contextTypes": ["WebInspector.UISourceCode"],        "type": "@WebInspector.Revealer"    }, {        "className": "WebInspector.SourcesPanel.DebuggerPausedDetailsRevealer",        "contextTypes": ["WebInspector.DebuggerPausedDetails"],        "type": "@WebInspector.Revealer"    }, {        "className": "WebInspector.InplaceFormatterEditorAction",        "type": "@WebInspector.SourcesView.EditorAction"    }, {        "className": "WebInspector.ScriptFormatterEditorAction",        "type": "@WebInspector.SourcesView.EditorAction"    }, {        "className": "WebInspector.SourcesNavigatorView",        "order": 1,        "type": "navigator-view",        "name": "sources",        "title": "Sources"    }, {        "className": "WebInspector.ContentScriptsNavigatorView",        "order": 2,        "type": "navigator-view",        "name": "contentScripts",        "title": "Content scripts"    }, {        "className": "WebInspector.SnippetsNavigatorView",        "order": 3,        "type": "navigator-view",        "name": "snippets",        "title": "Snippets"    }, {        "className": "WebInspector.SourcesPanel.RevealingActionDelegate",        "bindings": [{            "platform": "mac",            "shortcut": "Meta+O Meta+P"        }, {            "platform": "windows,linux",            "shortcut": "Ctrl+O Ctrl+P"        }],        "type": "@WebInspector.ActionDelegate",        "actionId": "sources.go-to-source"    }, {        "className": "WebInspector.SourcesView.SwitchFileActionDelegate",        "contextTypes": ["WebInspector.SourcesView"],        "bindings": [{            "shortcut": "Alt+O"        }],        "type": "@WebInspector.ActionDelegate",        "actionId": "sources.switch-file"    }, {        "category": "Sources",        "title": "Search in content scripts",        "defaultValue": false,        "settingName": "searchInContentScripts",        "settingType": "boolean",        "type": "setting"    }, {        "category": "Sources",        "title": "Enable JavaScript source maps",        "defaultValue": true,        "settingName": "jsSourceMapsEnabled",        "settingType": "boolean",        "type": "setting"    }, {        "category": "Sources",        "title": "Detect indentation",        "defaultValue": true,        "settingName": "textEditorAutoDetectIndent",        "settingType": "boolean",        "type": "setting"    }, {        "category": "Sources",        "title": "Autocompletion",        "defaultValue": true,        "settingName": "textEditorAutocompletion",        "settingType": "boolean",        "type": "setting"    }, {        "category": "Sources",        "title": "Bracket matching",        "defaultValue": true,        "settingName": "textEditorBracketMatching",        "settingType": "boolean",        "type": "setting"    }, {        "category": "Sources",        "title": "Show whitespace characters:",        "defaultValue": "original",        "settingName": "showWhitespacesInEditor",        "settingType": "enum",        "type": "setting",        "options": [["None", "none"], ["All", "all"], ["Trailing", "trailing"]]    }, {        "category": "Sources",        "title": "Display variable values inline while debugging",        "defaultValue": true,        "settingName": "inlineVariableValues",        "settingType": "boolean",        "type": "setting"    }, {        "category": "Sources",        "title": "Enable CSS source maps",        "defaultValue": true,        "settingName": "cssSourceMapsEnabled",        "settingType": "boolean",        "type": "setting"    }, {        "title": "Auto-reload generated CSS",        "defaultValue": false,        "parentSettingName": "cssSourceMapsEnabled",        "settingName": "cssReloadEnabled",        "settingType": "boolean",        "type": "setting"    }],    "name": "sources",    "scripts": [],    "skip_compilation": ["jsdifflib.js"]}, {    "remote": true,    "name": "emulated_devices",    "dependencies": ["emulation"],    "extensions": [{        "device": {            "show-by-default": true,            "modes": [{                "insets": {                    "top": 0,                    "right": 0,                    "bottom": 0,                    "left": 0                },                "orientation": "vertical",                "title": "default"            }, {                "insets": {                    "top": 0,                    "right": 0,                    "bottom": 0,                    "left": 0                },                "orientation": "horizontal",                "title": "default"            }],            "title": "Apple iPhone 4",            "screen": {                "horizontal": {                    "width": 480,                    "height": 320                },                "device-pixel-ratio": 2,                "vertical": {                    "width": 320,                    "height": 480                }            },            "capabilities": ["touch", "mobile"],            "user-agent": "Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_2_1 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148 Safari/6533.18.5",            "type": "phone"        },        "type": "emulated-device"    }, {        "device": {            "show-by-default": true,            "modes": [{                "insets": {                    "top": 0,                    "right": 0,                    "bottom": 0,                    "left": 0                },                "orientation": "vertical",                "title": "default"            }, {                "insets": {                    "top": 0,                    "right": 0,                    "bottom": 0,                    "left": 0                },                "orientation": "horizontal",                "title": "default"            }],            "title": "Apple iPhone 5",            "screen": {                "horizontal": {                    "width": 568,                    "height": 320                },                "device-pixel-ratio": 2,                "vertical": {                    "width": 320,                    "height": 568                }            },            "capabilities": ["touch", "mobile"],            "user-agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 7_0 like Mac OS X; en-us) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11A465 Safari/9537.53",            "type": "phone"        },        "type": "emulated-device"    }, {        "device": {            "show-by-default": true,            "modes": [{                "insets": {                    "top": 40,                    "right": 0,                    "bottom": 0,                    "left": 0                },                "orientation": "vertical",                "title": "default"            }, {                "insets": {                    "top": 64,                    "right": 0,                    "bottom": 45,                    "left": 0                },                "orientation": "vertical",                "title": "navigation bar"            }, {                "insets": {                    "top": 40,                    "right": 0,                    "bottom": 260,                    "left": 0                },                "orientation": "vertical",                "title": "keyboard"            }, {                "insets": {                    "top": 64,                    "right": 0,                    "bottom": 260,                    "left": 0                },                "orientation": "vertical",                "title": "navigation bar and keyboard"            }, {                "insets": {                    "top": 0,                    "right": 0,                    "bottom": 0,                    "left": 0                },                "orientation": "horizontal",                "title": "default"            }, {                "insets": {                    "top": 44,                    "right": 0,                    "bottom": 0,                    "left": 0                },                "orientation": "horizontal",                "title": "navigation bar"            }, {                "insets": {                    "top": 0,                    "right": 0,                    "bottom": 206,                    "left": 0                },                "orientation": "horizontal",                "title": "keyboard"            }, {                "insets": {                    "top": 44,                    "right": 0,                    "bottom": 206,                    "left": 0                },                "orientation": "horizontal",                "title": "navigation bar and keyboard"            }],            "title": "Apple iPhone 6",            "screen": {                "horizontal": {                    "width": 667,                    "height": 375                },                "device-pixel-ratio": 2,                "vertical": {                    "width": 375,                    "height": 667                }            },            "capabilities": ["touch", "mobile"],            "user-agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/600.1.3 (KHTML, like Gecko) Version/8.0 Mobile/12A4345d Safari/600.1.4",            "type": "phone"        },        "type": "emulated-device"    }, {        "device": {            "show-by-default": true,            "modes": [{                "insets": {                    "top": 0,                    "right": 0,                    "bottom": 0,                    "left": 0                },                "orientation": "vertical",                "title": "default"            }, {                "insets": {                    "top": 0,                    "right": 0,                    "bottom": 0,                    "left": 0                },                "orientation": "horizontal",                "title": "default"            }],            "title": "Apple iPhone 6 Plus",            "screen": {                "horizontal": {                    "width": 736,                    "height": 414                },                "device-pixel-ratio": 3,                "vertical": {                    "width": 414,                    "height": 736                }            },            "capabilities": ["touch", "mobile"],            "user-agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/600.1.3 (KHTML, like Gecko) Version/8.0 Mobile/12A4345d Safari/600.1.4",            "type": "phone"        },        "type": "emulated-device"    }, {        "device": {            "show-by-default": true,            "modes": [{                "insets": {                    "top": 0,                    "right": 0,                    "bottom": 0,                    "left": 0                },                "orientation": "vertical",                "title": "default"            }, {                "insets": {                    "top": 0,                    "right": 0,                    "bottom": 0,                    "left": 0                },                "orientation": "horizontal",                "title": "default"            }],            "title": "BlackBerry Z30",            "screen": {                "horizontal": {                    "width": 640,                    "height": 360                },                "device-pixel-ratio": 2,                "vertical": {                    "width": 360,                    "height": 640                }            },            "capabilities": ["touch", "mobile"],            "user-agent": "Mozilla/5.0 (BB10; Touch) AppleWebKit/537.10+ (KHTML, like Gecko) Version/10.0.9.2372 Mobile Safari/537.10+",            "type": "phone"        },        "type": "emulated-device"    }, {        "device": {            "show-by-default": true,            "modes": [{                "insets": {                    "top": 25,                    "right": 0,                    "bottom": 48,                    "left": 0                },                "orientation": "vertical",                "title": "default"            }, {                "insets": {                    "top": 80,                    "right": 0,                    "bottom": 48,                    "left": 0                },                "orientation": "vertical",                "title": "navigation bar"            }, {                "insets": {                    "top": 80,                    "right": 0,                    "bottom": 326,                    "left": 0                },                "orientation": "vertical",                "title": "keyboard"            }, {                "insets": {                    "top": 25,                    "right": 42,                    "bottom": 0,                    "left": 0                },                "orientation": "horizontal",                "title": "default"            }, {                "insets": {                    "top": 80,                    "right": 42,                    "bottom": 0,                    "left": 0                },                "orientation": "horizontal",                "title": "navigation bar"            }, {                "insets": {                    "top": 80,                    "right": 42,                    "bottom": 214,                    "left": 0                },                "orientation": "horizontal",                "title": "keyboard"            }],            "title": "Google Nexus 4",            "screen": {                "horizontal": {                    "width": 640,                    "height": 384                },                "device-pixel-ratio": 2,                "vertical": {                    "width": 384,                    "height": 640                }            },            "capabilities": ["touch", "mobile"],            "user-agent": "Mozilla/5.0 (Linux; Android 4.4.2; Nexus 4 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.122 Mobile Safari/537.36",            "type": "phone"        },        "type": "emulated-device"    }, {        "device": {            "show-by-default": true,            "modes": [{                "insets": {                    "top": 25,                    "right": 0,                    "bottom": 48,                    "left": 0                },                "orientation": "vertical",                "title": "default"            }, {                "insets": {                    "top": 80,                    "right": 0,                    "bottom": 48,                    "left": 0                },                "orientation": "vertical",                "title": "navigation bar"            }, {                "insets": {                    "top": 80,                    "right": 0,                    "bottom": 312,                    "left": 0                },                "orientation": "vertical",                "title": "keyboard"            }, {                "insets": {                    "top": 25,                    "right": 42,                    "bottom": 0,                    "left": 0                },                "orientation": "horizontal",                "title": "default"            }, {                "insets": {                    "top": 80,                    "right": 42,                    "bottom": 0,                    "left": 0                },                "orientation": "horizontal",                "title": "navigation bar"            }, {                "insets": {                    "top": 80,                    "right": 42,                    "bottom": 202,                    "left": 0                },                "orientation": "horizontal",                "title": "keyboard"            }],            "title": "Google Nexus 5",            "screen": {                "horizontal": {                    "width": 640,                    "height": 360                },                "device-pixel-ratio": 3,                "vertical": {                    "width": 360,                    "height": 640                }            },            "capabilities": ["touch", "mobile"],            "user-agent": "Mozilla/5.0 (Linux; Android 4.4.4; Nexus 5 Build/KTU84P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.114 Mobile Safari/537.36",            "type": "phone"        },        "type": "emulated-device"    }, {        "device": {            "show-by-default": true,            "modes": [{                "insets": {                    "top": 25,                    "right": 0,                    "bottom": 48,                    "left": 0                },                "orientation": "vertical",                "title": "default"            }, {                "insets": {                    "top": 80,                    "right": 0,                    "bottom": 48,                    "left": 0                },                "orientation": "vertical",                "title": "navigation bar"            }, {                "insets": {                    "top": 80,                    "right": 0,                    "bottom": 343,                    "left": 0                },                "orientation": "vertical",                "title": "keyboard"            }, {                "insets": {                    "top": 25,                    "right": 42,                    "bottom": 0,                    "left": 0                },                "orientation": "horizontal",                "title": "default"            }, {                "insets": {                    "top": 80,                    "right": 42,                    "bottom": 0,                    "left": 0                },                "orientation": "horizontal",                "title": "navigation bar"            }, {                "insets": {                    "top": 80,                    "right": 42,                    "bottom": 222,                    "left": 0                },                "orientation": "horizontal",                "title": "keyboard"            }],            "title": "Google Nexus 6",            "screen": {                "horizontal": {                    "width": 732,                    "height": 412                },                "device-pixel-ratio": 3.5,                "vertical": {                    "width": 412,                    "height": 732                }            },            "capabilities": ["touch", "mobile"],            "user-agent": "Mozilla/5.0 (Linux; Android 5.1.1; Nexus 6 Build/LYZ28E) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.20 Mobile Safari/537.36",            "type": "phone"        },        "type": "emulated-device"    }, {        "device": {            "show-by-default": true,            "modes": [{                "insets": {                    "top": 0,                    "right": 0,                    "bottom": 0,                    "left": 0                },                "orientation": "vertical",                "title": "default"            }, {                "insets": {                    "top": 0,                    "right": 0,                    "bottom": 0,                    "left": 0                },                "orientation": "horizontal",                "title": "default"            }],            "title": "LG Optimus L70",            "screen": {                "horizontal": {                    "width": 640,                    "height": 384                },                "device-pixel-ratio": 1.25,                "vertical": {                    "width": 384,                    "height": 640                }            },            "capabilities": ["touch", "mobile"],            "user-agent": "Mozilla/5.0 (Linux; U; Android 4.4.2; en-us; LGMS323 Build/KOT49I.MS32310c) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.1599.103 Mobile Safari/537.36",            "type": "phone"        },        "type": "emulated-device"    }, {        "device": {            "show-by-default": true,            "modes": [{                "insets": {                    "top": 0,                    "right": 0,                    "bottom": 0,                    "left": 0                },                "orientation": "vertical",                "title": "default"            }, {                "insets": {                    "top": 0,                    "right": 0,                    "bottom": 0,                    "left": 0                },                "orientation": "horizontal",                "title": "default"            }],            "title": "Nokia N9",            "screen": {                "horizontal": {                    "width": 640,                    "height": 360                },                "device-pixel-ratio": 1,                "vertical": {                    "width": 360,                    "height": 640                }            },            "capabilities": ["touch", "mobile"],            "user-agent": "Mozilla/5.0 (MeeGo; NokiaN9) AppleWebKit/534.13 (KHTML, like Gecko) NokiaBrowser/8.5.0 Mobile Safari/534.13",            "type": "phone"        },        "type": "emulated-device"    }, {        "device": {            "show-by-default": true,            "modes": [{                "insets": {                    "top": 0,                    "right": 0,                    "bottom": 0,                    "left": 0                },                "orientation": "vertical",                "title": "default"            }, {                "insets": {                    "top": 0,                    "right": 0,                    "bottom": 0,                    "left": 0                },                "orientation": "horizontal",                "title": "default"            }],            "title": "Nokia Lumia 520",            "screen": {                "horizontal": {                    "width": 533,                    "height": 320                },                "device-pixel-ratio": 1.4,                "vertical": {                    "width": 320,                    "height": 533                }            },            "capabilities": ["touch", "mobile"],            "user-agent": "Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch; NOKIA; Lumia 520)",            "type": "phone"        },        "type": "emulated-device"    }, {        "device": {            "show-by-default": true,            "modes": [{                "insets": {                    "top": 0,                    "right": 0,                    "bottom": 0,                    "left": 0                },                "orientation": "vertical",                "title": "default"            }, {                "insets": {                    "top": 0,                    "right": 0,                    "bottom": 0,                    "left": 0                },                "orientation": "horizontal",                "title": "default"            }],            "title": "Samsung Galaxy S III",            "screen": {                "horizontal": {                    "width": 640,                    "height": 360                },                "device-pixel-ratio": 2,                "vertical": {                    "width": 360,                    "height": 640                }            },            "capabilities": ["touch", "mobile"],            "user-agent": "Mozilla/5.0 (Linux; U; Android 4.0; en-us; GT-I9300 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30",            "type": "phone"        },        "type": "emulated-device"    }, {        "device": {            "show-by-default": true,            "modes": [{                "insets": {                    "top": 0,                    "right": 0,                    "bottom": 0,                    "left": 0                },                "orientation": "vertical",                "title": "default"            }, {                "insets": {                    "top": 0,                    "right": 0,                    "bottom": 0,                    "left": 0                },                "orientation": "horizontal",                "title": "default"            }],            "title": "Samsung Galaxy S4",            "screen": {                "horizontal": {                    "width": 640,                    "height": 360                },                "device-pixel-ratio": 3,                "vertical": {                    "width": 360,                    "height": 640                }            },            "capabilities": ["touch", "mobile"],            "user-agent": "Mozilla/5.0 (Linux; Android 4.2.2; GT-I9505 Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.59 Mobile Safari/537.36",            "type": "phone"        },        "type": "emulated-device"    }, {        "device": {            "show-by-default": true,            "modes": [{                "insets": {                    "top": 0,                    "right": 0,                    "bottom": 0,                    "left": 0                },                "orientation": "vertical",                "title": "default"            }, {                "insets": {                    "top": 0,                    "right": 0,                    "bottom": 0,                    "left": 0                },                "orientation": "horizontal",                "title": "default"            }],            "title": "Amazon Kindle Fire HDX",            "screen": {                "horizontal": {                    "width": 2560,                    "height": 1600                },                "device-pixel-ratio": 2,                "vertical": {                    "width": 1600,                    "height": 2560                }            },            "capabilities": ["touch", "mobile"],            "user-agent": "Mozilla/5.0 (Linux; U; en-us; KFAPWI Build/JDQ39) AppleWebKit/535.19 (KHTML, like Gecko) Silk/3.13 Safari/535.19 Silk-Accelerated=true",            "type": "tablet"        },        "type": "emulated-device"    }, {        "device": {            "show-by-default": true,            "modes": [{                "insets": {                    "top": 0,                    "right": 0,                    "bottom": 0,                    "left": 0                },                "orientation": "vertical",                "title": "default"            }, {                "insets": {                    "top": 0,                    "right": 0,                    "bottom": 0,                    "left": 0                },                "orientation": "horizontal",                "title": "default"            }],            "title": "Apple iPad Mini",            "screen": {                "horizontal": {                    "width": 1024,                    "height": 768                },                "device-pixel-ratio": 2,                "vertical": {                    "width": 768,                    "height": 1024                }            },            "capabilities": ["touch", "mobile"],            "user-agent": "Mozilla/5.0 (iPad; CPU OS 7_0_4 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11B554a Safari/9537.53",            "type": "tablet"        },        "type": "emulated-device"    }, {        "device": {            "show-by-default": true,            "modes": [{                "insets": {                    "top": 0,                    "right": 0,                    "bottom": 0,                    "left": 0                },                "orientation": "vertical",                "title": "default"            }, {                "insets": {                    "top": 0,                    "right": 0,                    "bottom": 0,                    "left": 0                },                "orientation": "horizontal",                "title": "default"            }],            "title": "Apple iPad",            "screen": {                "horizontal": {                    "width": 1024,                    "height": 768                },                "device-pixel-ratio": 2,                "vertical": {                    "width": 768,                    "height": 1024                }            },            "capabilities": ["touch", "mobile"],            "user-agent": "Mozilla/5.0 (iPad; CPU OS 7_0 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11A465 Safari/9537.53",            "type": "tablet"        },        "type": "emulated-device"    }, {        "device": {            "show-by-default": true,            "modes": [{                "insets": {                    "top": 0,                    "right": 0,                    "bottom": 0,                    "left": 0                },                "orientation": "vertical",                "title": "default"            }, {                "insets": {                    "top": 0,                    "right": 0,                    "bottom": 0,                    "left": 0                },                "orientation": "horizontal",                "title": "default"            }],            "title": "BlackBerry PlayBook",            "screen": {                "horizontal": {                    "width": 1024,                    "height": 600                },                "device-pixel-ratio": 1,                "vertical": {                    "width": 600,                    "height": 1024                }            },            "capabilities": ["touch", "mobile"],            "user-agent": "Mozilla/5.0 (PlayBook; U; RIM Tablet OS 2.1.0; en-US) AppleWebKit/536.2+ (KHTML like Gecko) Version/7.2.1.0 Safari/536.2+",            "type": "tablet"        },        "type": "emulated-device"    }, {        "device": {            "show-by-default": true,            "modes": [{                "insets": {                    "top": 0,                    "right": 0,                    "bottom": 0,                    "left": 0                },                "orientation": "vertical",                "title": "default"            }, {                "insets": {                    "top": 0,                    "right": 0,                    "bottom": 0,                    "left": 0                },                "orientation": "horizontal",                "title": "default"            }],            "title": "Google Nexus 10",            "screen": {                "horizontal": {                    "width": 1280,                    "height": 800                },                "device-pixel-ratio": 2,                "vertical": {                    "width": 800,                    "height": 1280                }            },            "capabilities": ["touch", "mobile"],            "user-agent": "Mozilla/5.0 (Linux; Android 4.3; Nexus 10 Build/JSS15Q) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2307.2 Safari/537.36",            "type": "tablet"        },        "type": "emulated-device"    }, {        "device": {            "show-by-default": true,            "modes": [{                "insets": {                    "top": 0,                    "right": 0,                    "bottom": 0,                    "left": 0                },                "orientation": "vertical",                "title": "default"            }, {                "insets": {                    "top": 0,                    "right": 0,                    "bottom": 0,                    "left": 0                },                "orientation": "horizontal",                "title": "default"            }],            "title": "Google Nexus 7",            "screen": {                "horizontal": {                    "width": 960,                    "height": 600                },                "device-pixel-ratio": 2,                "vertical": {                    "width": 600,                    "height": 960                }            },            "capabilities": ["touch", "mobile"],            "user-agent": "Mozilla/5.0 (Linux; Android 4.3; Nexus 7 Build/JSS15Q) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2307.2 Safari/537.36",            "type": "tablet"        },        "type": "emulated-device"    }, {        "device": {            "show-by-default": true,            "modes": [{                "insets": {                    "top": 0,                    "right": 0,                    "bottom": 0,                    "left": 0                },                "orientation": "vertical",                "title": "default"            }, {                "insets": {                    "top": 0,                    "right": 0,                    "bottom": 0,                    "left": 0                },                "orientation": "horizontal",                "title": "default"            }],            "title": "Samsung Galaxy Note 3",            "screen": {                "horizontal": {                    "width": 640,                    "height": 360                },                "device-pixel-ratio": 3,                "vertical": {                    "width": 360,                    "height": 640                }            },            "capabilities": ["touch", "mobile"],            "user-agent": "Mozilla/5.0 (Linux; U; Android 4.3; en-us; SM-N900T Build/JSS15J) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30",            "type": "phone"        },        "type": "emulated-device"    }, {        "device": {            "show-by-default": true,            "modes": [{                "insets": {                    "top": 0,                    "right": 0,                    "bottom": 0,                    "left": 0                },                "orientation": "vertical",                "title": "default"            }, {                "insets": {                    "top": 0,                    "right": 0,                    "bottom": 0,                    "left": 0                },                "orientation": "horizontal",                "title": "default"            }],            "title": "Samsung Galaxy Note II",            "screen": {                "horizontal": {                    "width": 640,                    "height": 360                },                "device-pixel-ratio": 2,                "vertical": {                    "width": 360,                    "height": 640                }            },            "capabilities": ["touch", "mobile"],            "user-agent": "Mozilla/5.0 (Linux; U; Android 4.1; en-us; GT-N7100 Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30",            "type": "phone"        },        "type": "emulated-device"    }, {        "device": {            "show-by-default": true,            "modes": [{                "insets": {                    "top": 0,                    "right": 0,                    "bottom": 0,                    "left": 0                },                "orientation": "horizontal",                "title": "default"            }],            "title": "Laptop with touch",            "screen": {                "horizontal": {                    "width": 1280,                    "height": 950                },                "device-pixel-ratio": 1,                "vertical": {                    "width": 950,                    "height": 1280                }            },            "capabilities": ["touch"],            "user-agent": "",            "type": "notebook"        },        "type": "emulated-device"    }, {        "device": {            "show-by-default": true,            "modes": [{                "insets": {                    "top": 0,                    "right": 0,                    "bottom": 0,                    "left": 0                },                "orientation": "horizontal",                "title": "default"            }],            "title": "Laptop with HiDPI screen",            "screen": {                "horizontal": {                    "width": 1440,                    "height": 900                },                "device-pixel-ratio": 2,                "vertical": {                    "width": 900,                    "height": 1440                }            },            "capabilities": [],            "user-agent": "",            "type": "notebook"        },        "type": "emulated-device"    }, {        "device": {            "show-by-default": true,            "modes": [{                "insets": {                    "top": 0,                    "right": 0,                    "bottom": 0,                    "left": 0                },                "orientation": "horizontal",                "title": "default"            }],            "title": "Laptop with MDPI screen",            "screen": {                "horizontal": {                    "width": 1280,                    "height": 800                },                "device-pixel-ratio": 1,                "vertical": {                    "width": 800,                    "height": 1280                }            },            "capabilities": [],            "user-agent": "",            "type": "notebook"        },        "type": "emulated-device"    }],    "scripts": []}, {    "dependencies": ["components", "extensions"],    "extensions": [{        "className": "WebInspector.AuditsPanelFactory",        "order": 6,        "type": "@WebInspector.PanelFactory",        "name": "audits",        "title": "Audits"    }],    "name": "audits",    "scripts": []}, {    "dependencies": ["sdk", "platform", "workspace"],    "name": "bindings",    "scripts": []}, {    "dependencies": ["bindings"],    "name": "snippets",    "scripts": []}, {    "dependencies": ["timeline"],    "extensions": [{        "className": "WebInspector.LayersPanelFactory",        "order": 7,        "type": "@WebInspector.PanelFactory",        "name": "layers",        "title": "Layers"    }, {        "className": "WebInspector.LayersPanel.LayerTreeRevealer",        "contextTypes": ["WebInspector.DeferredLayerTree"],        "type": "@WebInspector.Revealer"    }],    "experiment": "layersPanel",    "scripts": [],    "name": "layers"}, {    "dependencies": ["components", "ui_lazy"],    "extensions": [{        "className": "WebInspector.ConsolePanelFactory",        "order": 20,        "type": "@WebInspector.PanelFactory",        "name": "console",        "title": "Console"    }, {        "className": "WebInspector.ConsolePanel.WrapperView",        "order": "0",        "type": "drawer-view",        "name": "console",        "title": "Console"    }, {        "className": "WebInspector.ConsolePanel.ConsoleRevealer",        "contextTypes": ["WebInspector.Console"],        "type": "@WebInspector.Revealer"    }, {        "className": "WebInspector.ConsoleView.ShowConsoleActionDelegate",        "bindings": [{            "shortcut": "Ctrl+`"        }],        "type": "@WebInspector.ActionDelegate",        "actionId": "console.show"    }, {        "category": "Console",        "title": "Hide network messages",        "defaultValue": false,        "settingName": "hideNetworkMessages",        "settingType": "boolean",        "type": "setting"    }, {        "category": "Console",        "title": "Log XMLHttpRequests",        "defaultValue": false,        "settingName": "monitoringXHREnabled",        "settingType": "boolean",        "type": "setting"    }, {        "category": "Console",        "title": "Preserve log upon navigation",        "defaultValue": false,        "settingName": "preserveConsoleLog",        "settingType": "boolean",        "type": "setting"    }, {        "category": "Console",        "title": "Show timestamps",        "defaultValue": false,        "settingName": "consoleTimestampsEnabled",        "settingType": "boolean",        "type": "setting"    }],    "name": "console",    "scripts": []}, {    "dependencies": ["source_frame", "components_lazy", "ui_lazy"],    "extensions": [{        "className": "WebInspector.NetworkPanelFactory",        "order": 1,        "type": "@WebInspector.PanelFactory",        "name": "network",        "title": "Network"    }, {        "className": "WebInspector.NetworkPanel.ContextMenuProvider",        "contextTypes": ["WebInspector.NetworkRequest", "WebInspector.Resource", "WebInspector.UISourceCode"],        "type": "@WebInspector.ContextMenu.Provider"    }, {        "className": "WebInspector.NetworkPanel.RequestRevealer",        "contextTypes": ["WebInspector.NetworkRequest"],        "type": "@WebInspector.Revealer"    }, {        "category": "Network",        "title": "Show primary load waterfall",        "defaultValue": false,        "experiment": "showPrimaryLoadWaterfallInNetworkTimeline",        "settingName": "networkShowPrimaryLoadWaterfall",        "settingType": "boolean",        "type": "setting"    }, {        "category": "Network",        "title": "Color-code resource types",        "defaultValue": false,        "settingName": "networkColorCodeResourceTypes",        "settingType": "boolean",        "type": "setting"    }],    "name": "network",    "scripts": []}, {    "dependencies": ["sdk", "ui", "ui_lazy"],    "name": "components_lazy",    "scripts": []}, {    "remote": true,    "name": "cm_modes",    "dependencies": ["source_frame"],    "extensions": [{        "className": "WebInspector.DefaultCodeMirrorMimeMode",        "mimeTypes": ["text/x-csrc", "text/x-c", "text/x-chdr", "text/x-c++src", "text/x-c++hdr", "text/x-java", "text/x-csharp", "text/x-scala", "x-shader/x-vertex", "x-shader/x-fragment"],        "type": "@WebInspector.CodeMirrorMimeMode",        "fileName": "clike.js"    }, {        "className": "WebInspector.DefaultCodeMirrorMimeMode",        "mimeTypes": ["text/x-coffeescript"],        "type": "@WebInspector.CodeMirrorMimeMode",        "fileName": "coffeescript.js"    }, {        "className": "WebInspector.DefaultCodeMirrorMimeMode",        "mimeTypes": ["application/x-httpd-php", "application/x-httpd-php-open", "text/x-php"],        "dependencies": ["clike.js"],        "type": "@WebInspector.CodeMirrorMimeMode",        "fileName": "php.js"    }, {        "className": "WebInspector.DefaultCodeMirrorMimeMode",        "mimeTypes": ["text/x-python", "text/x-cython"],        "type": "@WebInspector.CodeMirrorMimeMode",        "fileName": "python.js"    }, {        "className": "WebInspector.DefaultCodeMirrorMimeMode",        "mimeTypes": ["text/x-sh"],        "type": "@WebInspector.CodeMirrorMimeMode",        "fileName": "shell.js"    }, {        "className": "WebInspector.DefaultCodeMirrorMimeMode",        "mimeTypes": ["text/x-livescript"],        "type": "@WebInspector.CodeMirrorMimeMode",        "fileName": "livescript.js"    }, {        "className": "WebInspector.DefaultCodeMirrorMimeMode",        "mimeTypes": ["text/x-clojure"],        "type": "@WebInspector.CodeMirrorMimeMode",        "fileName": "clojure.js"    }],    "scripts": []}, {    "dependencies": [],    "name": "platform",    "scripts": []}, {    "dependencies": ["elements"],    "extensions": [{        "className": "WebInspector.AnimationControlPane.ButtonProvider",        "type": "@WebInspector.ToolbarItem.Provider",        "order": 2,        "location": "styles-sidebarpane-toolbar"    }],    "name": "animation",    "scripts": []}, {    "dependencies": ["components"],    "extensions": [{        "className": "WebInspector.CodeMirrorUtils",        "type": "@WebInspector.InplaceEditor"    }, {        "className": "WebInspector.CodeMirrorUtils.TokenizerFactory",        "type": "@WebInspector.TokenizerFactory"    }, {        "category": "Sources",        "title": "Default indentation:",        "defaultValue": "    ",        "settingName": "textEditorIndent",        "settingType": "enum",        "type": "setting",        "options": [["2 spaces", "  "], ["4 spaces", "    "], ["8 spaces", "        "], ["Tab character", "\t"]]    }],    "name": "source_frame",    "scripts": [],    "skip_compilation": ["../cm/codemirror.js", "../cm/css.js", "../cm/javascript.js", "../cm/xml.js", "../cm/htmlmixed.js", "../cm/htmlembedded.js", "../cm/matchbrackets.js", "../cm/closebrackets.js", "../cm/markselection.js", "../cm/comment.js", "../cm/overlay.js", "../cm/activeline.js"]}, {    "dependencies": ["extensions", "host", "platform", "sdk", "emulation"],    "extensions": [{        "className": "WebInspector.AdvancedAppProvider",        "type": "@WebInspector.AppProvider",        "order": 0,        "condition": "can_dock"    }, {        "className": "WebInspector.SimpleAppProvider",        "type": "@WebInspector.AppProvider",        "order": 10    }, {        "className": "WebInspector.HandlerRegistry.ContextMenuProvider",        "contextTypes": ["WebInspector.UISourceCode", "WebInspector.Resource", "WebInspector.NetworkRequest", "Node"],        "type": "@WebInspector.ContextMenu.Provider"    }, {        "className": "WebInspector.Main.ReloadActionDelegate",        "bindings": [{            "platform": "windows,linux",            "shortcut": "F5 Ctrl+R"        }, {            "platform": "mac",            "shortcut": "Meta+R"        }],        "type": "@WebInspector.ActionDelegate",        "actionId": "main.reload"    }, {        "className": "WebInspector.Main.ReloadActionDelegate",        "bindings": [{            "platform": "windows,linux",            "shortcut": "Shift+F5 Ctrl+F5 Ctrl+Shift+F5 Shift+Ctrl+R"        }, {            "platform": "mac",            "shortcut": "Shift+Meta+R"        }],        "type": "@WebInspector.ActionDelegate",        "actionId": "main.hard-reload"    }, {        "className": "WebInspector.InspectorView.DrawerToggleActionDelegate",        "bindings": [{            "shortcut": "Esc"        }],        "type": "@WebInspector.ActionDelegate",        "actionId": "main.toggle-drawer"    }, {        "className": "WebInspector.Main.ReloadActionDelegate",        "bindings": [{            "shortcut": "Alt+R"        }],        "type": "@WebInspector.ActionDelegate",        "actionId": "main.debug-reload"    }, {        "className": "WebInspector.InspectElementModeController.ToggleSearchActionDelegate",        "contextTypes": ["WebInspector.InspectElementModeController"],        "bindings": [{            "platform": "windows,linux",            "shortcut": "Ctrl+Shift+C"        }, {            "platform": "mac",            "shortcut": "Meta+Shift+C"        }],        "type": "@WebInspector.ActionDelegate",        "actionId": "main.toggle-element-search"    }, {        "className": "WebInspector.DockController.ToggleDockActionDelegate",        "bindings": [{            "platform": "windows,linux",            "shortcut": "Ctrl+Shift+D"        }, {            "platform": "mac",            "shortcut": "Meta+Shift+D"        }],        "type": "@WebInspector.ActionDelegate",        "actionId": "main.toggle-dock"    }, {        "className": "WebInspector.Main.ZoomActionDelegate",        "bindings": [{            "platform": "windows,linux",            "shortcut": "Ctrl+Plus Ctrl+Shift+Plus Ctrl+NumpadPlus Ctrl+Shift+NumpadPlus"        }, {            "platform": "mac",            "shortcut": "Meta+Plus Meta+Shift+Plus Meta+NumpadPlus Meta+Shift+NumpadPlus"        }],        "type": "@WebInspector.ActionDelegate",        "actionId": "main.zoom-in"    }, {        "className": "WebInspector.Main.ZoomActionDelegate",        "bindings": [{            "platform": "windows,linux",            "shortcut": "Ctrl+Minus Ctrl+Shift+Minus Ctrl+NumpadMinus Ctrl+Shift+NumpadMinus"        }, {            "platform": "mac",            "shortcut": "Meta+Minus Meta+Shift+Minus Meta+NumpadMinus Meta+Shift+NumpadMinus"        }],        "type": "@WebInspector.ActionDelegate",        "actionId": "main.zoom-out"    }, {        "className": "WebInspector.Main.ZoomActionDelegate",        "bindings": [{            "platform": "windows,linux",            "shortcut": "Ctrl+0 Ctrl+Numpad0"        }, {            "platform": "mac",            "shortcut": "Meta+0 Meta+Numpad0"        }],        "type": "@WebInspector.ActionDelegate",        "actionId": "main.zoom-reset"    }, {        "className": "WebInspector.RenderingOptions.View",        "order": "11",        "type": "drawer-view",        "name": "rendering",        "title": "Rendering"    }, {        "className": "WebInspector.InspectElementModeController.ToggleButtonProvider",        "actionId": "main.toggle-element-search",        "type": "@WebInspector.ToolbarItem.Provider",        "location": "main-toolbar-left",        "order": 0    }, {        "separator": true,        "type": "@WebInspector.ToolbarItem.Provider",        "location": "main-toolbar-left",        "order": 100    }, {        "className": "WebInspector.Main.WarningErrorCounter",        "type": "@WebInspector.ToolbarItem.Provider",        "order": 1,        "location": "main-toolbar-right"    }, {        "className": "WebInspector.InspectorView.ToggleDrawerButtonProvider",        "type": "@WebInspector.ToolbarItem.Provider",        "order": 2,        "location": "main-toolbar-right"    }, {        "separator": true,        "type": "@WebInspector.ToolbarItem.Provider",        "order": 3,        "location": "main-toolbar-right"    }, {        "className": "WebInspector.DockController.ButtonProvider",        "type": "@WebInspector.ToolbarItem.Provider",        "order": 5,        "location": "main-toolbar-right"    }, {        "separator": true,        "type": "@WebInspector.ToolbarItem.Provider",        "order": 90,        "location": "main-toolbar-right"    }, {        "className": "WebInspector.DockController.CloseButtonProvider",        "type": "@WebInspector.ToolbarItem.Provider",        "order": 100,        "location": "main-toolbar-right"    }, {        "category": "",        "title": "Disable cache (while DevTools is open)",        "defaultValue": false,        "settingName": "cacheDisabled",        "settingType": "boolean",        "type": "setting"    }, {        "defaultValue": {            "latency": 0,            "throughput": -1        },        "type": "setting",        "settingName": "networkConditions",        "settingType": "object"    }, {        "category": "",        "title": "Disable JavaScript",        "defaultValue": false,        "settingName": "javaScriptDisabled",        "settingType": "boolean",        "type": "setting"    }, {        "category": "Appearance",        "title": "Split panels vertically when docked to right",        "defaultValue": true,        "settingName": "splitVerticallyWhenDockedToRight",        "settingType": "boolean",        "type": "setting"    }, {        "category": "Appearance",        "title-mac": "Enable Cmd + 1-9 shortcut to switch panels",        "title": "Enable Ctrl + 1-9 shortcut to switch panels",        "defaultValue": false,        "settingName": "shortcutPanelSwitch",        "settingType": "boolean",        "type": "setting"    }, {        "category": "Appearance",        "title": "Don't show emulation warnings",        "defaultValue": false,        "settingName": "disableOverridesWarning",        "settingType": "boolean",        "type": "setting"    }, {        "category": "Appearance",        "title": "Don't show Chrome Data Saver warning",        "defaultValue": false,        "settingName": "disableDataSaverInfobar",        "settingType": "boolean",        "type": "setting"    }, {        "category": "Appearance",        "title": "Disable paused state overlay",        "defaultValue": false,        "settingName": "disablePausedStateOverlay",        "settingType": "boolean",        "type": "setting"    }, {        "category": "Extensions",        "className": "WebInspector.HandlerRegistry.OpenAnchorLocationSettingUI",        "type": "@WebInspector.SettingUI"    }, {        "defaultValue": false,        "type": "setting",        "settingName": "showPaintRects",        "settingType": "boolean"    }, {        "defaultValue": false,        "type": "setting",        "settingName": "showDebugBorders",        "settingType": "boolean"    }, {        "defaultValue": false,        "type": "setting",        "settingName": "showFPSCounter",        "settingType": "boolean"    }, {        "defaultValue": false,        "type": "setting",        "settingName": "continuousPainting",        "settingType": "boolean"    }, {        "defaultValue": false,        "type": "setting",        "settingName": "showScrollBottleneckRects",        "settingType": "boolean"    }],    "name": "main",    "scripts": [],    "skip_compilation": ["Tests.js"]}, {    "dependencies": ["source_frame", "ui_lazy", "components_lazy"],    "extensions": [{        "className": "WebInspector.ResourcesPanelFactory",        "order": 5,        "type": "@WebInspector.PanelFactory",        "name": "resources",        "title": "Resources"    }, {        "className": "WebInspector.ResourcesPanel.ResourceRevealer",        "contextTypes": ["WebInspector.Resource"],        "type": "@WebInspector.Revealer"    }],    "name": "resources",    "scripts": []}, {    "skip_compilation": ["../acorn/acorn.js", "../cm/headlesscodemirror.js", "../cm/css.js", "../cm/xml.js", "../cm/htmlmixed.js"],    "name": "script_formatter_worker",    "scripts": []}, {    "dependencies": ["components", "extensions"],    "extensions": [{        "className": "WebInspector.ElementsPanelFactory",        "order": 0,        "type": "@WebInspector.PanelFactory",        "name": "elements",        "title": "Elements"    }, {        "className": "WebInspector.ElementsPanel.ContextMenuProvider",        "contextTypes": ["WebInspector.RemoteObject", "WebInspector.DOMNode", "WebInspector.DeferredDOMNode"],        "type": "@WebInspector.ContextMenu.Provider"    }, {        "className": "WebInspector.ElementsTreeOutline.Renderer",        "contextTypes": ["WebInspector.DOMNode", "WebInspector.RemoteObject"],        "type": "@WebInspector.Renderer"    }, {        "className": "WebInspector.ElementsPanel.DOMNodeRevealer",        "contextTypes": ["WebInspector.DOMNode", "WebInspector.DeferredDOMNode", "WebInspector.RemoteObject"],        "type": "@WebInspector.Revealer"    }, {        "category": "Elements",        "title": "Color format:",        "defaultValue": "original",        "settingName": "colorFormat",        "settingType": "enum",        "type": "setting",        "options": [["As authored", "original"], ["HEX: #DAC0DE", "hex", true], ["RGB: rgb(128, 255, 255)", "rgb", true], ["HSL: hsl(300, 80%, 90%)", "hsl", true]]    }, {        "category": "Elements",        "title": "Show user agent shadow DOM",        "defaultValue": false,        "settingName": "showUAShadowDOM",        "settingType": "boolean",        "type": "setting"    }, {        "category": "Elements",        "title": "Word wrap",        "defaultValue": true,        "settingName": "domWordWrap",        "settingType": "boolean",        "type": "setting"    }, {        "category": "Elements",        "title": "Show rulers",        "defaultValue": false,        "settingName": "showMetricsRulers",        "settingType": "boolean",        "type": "setting"    }, {        "category": "Elements",        "title": "Highlight DOM updates",        "defaultValue": true,        "settingName": "highlightDOMUpdates",        "settingType": "boolean",        "type": "setting"    }, {        "className": "WebInspector.StylesSidebarPane.AddNewRuleButtonProvider",        "type": "@WebInspector.ToolbarItem.Provider",        "order": 0,        "location": "styles-sidebarpane-toolbar"    }, {        "className": "WebInspector.ElementStatePaneWidget.ButtonProvider",        "type": "@WebInspector.ToolbarItem.Provider",        "order": 1,        "location": "styles-sidebarpane-toolbar"    }],    "name": "elements",    "scripts": []}, {    "dependencies": ["common", "host", "platform"],    "name": "workspace",    "scripts": []}, {    "dependencies": ["components", "components_lazy", "ui_lazy"],    "extensions": [{        "className": "WebInspector.TimelinePanelFactory",        "order": 3,        "type": "@WebInspector.PanelFactory",        "name": "timeline",        "title": "Timeline"    }, {        "category": "Profiler",        "title": "Hide chrome frame in Layers view",        "defaultValue": false,        "settingName": "frameViewerHideChromeWindow",        "settingType": "boolean",        "type": "setting"    }, {        "className": "WebInspector.LoadTimelineHandler",        "type": "@WebInspector.QueryParamHandler",        "name": "loadTimelineFromURL"    }],    "name": "timeline",    "scripts": []}, {    "dependencies": ["common", "platform"],    "name": "host",    "scripts": []}, {    "dependencies": ["bindings", "components", "platform", "ui"],    "extensions": [{        "className": "WebInspector.OverridesView",        "order": "10",        "type": "drawer-view",        "name": "emulation",        "title": "Emulation"    }, {        "className": "WebInspector.DeviceModeButtonProvider",        "type": "@WebInspector.ToolbarItem.Provider",        "order": 1,        "condition": "can_dock",        "location": "main-toolbar-left"    }, {        "className": "WebInspector.ToggleDeviceModeActionDelegate",        "bindings": [{            "platform": "windows,linux",            "shortcut": "Shift+Ctrl+M"        }, {            "platform": "mac",            "shortcut": "Shift+Meta+M"        }],        "type": "@WebInspector.ActionDelegate",        "actionId": "emulation.toggle-device-mode",        "condition": "can_dock"    }, {        "className": "WebInspector.OverridesView.Revealer",        "contextTypes": ["WebInspector.OverridesSupport"],        "type": "@WebInspector.Revealer"    }, {        "className": "WebInspector.DevicesSettingsTab",        "order": "30",        "type": "settings-view",        "name": "devices",        "title": "Devices"    }],    "name": "emulation",    "scripts": []}, {    "dependencies": ["platform", "common", "host"],    "name": "ui",    "scripts": []}, {    "skip_compilation": ["../InspectorBackendCommands.js", "../SupportedCSSProperties.js"],    "dependencies": ["common", "host", "platform"],    "extensions": [{        "defaultValue": "",        "type": "setting",        "settingName": "skipStackFramesPattern",        "settingType": "regex"    }, {        "defaultValue": false,        "type": "setting",        "settingName": "skipContentScripts",        "settingType": "boolean"    }, {        "defaultValue": false,        "type": "setting",        "settingName": "pauseOnExceptionEnabled",        "settingType": "boolean"    }, {        "defaultValue": false,        "type": "setting",        "settingName": "pauseOnCaughtException",        "settingType": "boolean"    }, {        "defaultValue": false,        "type": "setting",        "settingName": "enableAsyncStackTraces",        "settingType": "boolean"    }],    "name": "sdk",    "scripts": []}, {    "name": "temp_storage_shared_worker",    "scripts": []}, {    "dependencies": ["components"],    "extensions": [{        "className": "WebInspector.SettingsController.ActionDelegate",        "bindings": [{            "shortcut": "F1 Shift+?"        }],        "type": "@WebInspector.ActionDelegate",        "actionId": "settings.show"    }, {        "title": "Settings",        "elementClass": "settings-toolbar-item",        "actionId": "settings.show",        "type": "@WebInspector.ToolbarItem.Provider",        "order": 4,        "location": "main-toolbar-right"    }, {        "title": "Settings",        "elementClass": "settings-toolbar-item",        "actionId": "settings.show",        "type": "@WebInspector.ToolbarItem.Provider",        "order": 1,        "location": "elements-toolbar"    }, {        "category": "Sources",        "className": "WebInspector.SettingsScreen.SkipStackFramePatternSettingUI",        "type": "@WebInspector.SettingUI"    }],    "name": "settings",    "scripts": []}, {    "name": "heap_snapshot_worker",    "scripts": []}, {    "dependencies": ["components", "ui_lazy"],    "extensions": [{        "className": "WebInspector.ProfilesPanelFactory",        "order": 4,        "type": "@WebInspector.PanelFactory",        "name": "profiles",        "title": "Profiles"    }, {        "className": "WebInspector.ProfilesPanel.ContextMenuProvider",        "contextTypes": ["WebInspector.RemoteObject"],        "type": "@WebInspector.ContextMenu.Provider"    }, {        "category": "Profiler",        "title": "Show advanced heap snapshot properties",        "defaultValue": false,        "settingName": "showAdvancedHeapSnapshotProperties",        "settingType": "boolean",        "type": "setting"    }, {        "category": "Profiler",        "title": "Record heap allocation stack traces",        "defaultValue": false,        "settingName": "recordAllocationStacks",        "settingType": "boolean",        "type": "setting"    }, {        "category": "Profiler",        "title": "High resolution CPU profiling",        "defaultValue": false,        "settingName": "highResolutionCpuProfiling",        "settingType": "boolean",        "type": "setting"    }],    "name": "profiler",    "scripts": []}, {    "remote": true,    "name": "screencast",    "dependencies": ["components"],    "extensions": [{        "className": "WebInspector.ScreencastAppProvider",        "type": "@WebInspector.AppProvider",        "order": 1    }, {        "className": "WebInspector.ScreencastApp.ToolbarButtonProvider",        "type": "@WebInspector.ToolbarItem.Provider",        "order": 1,        "location": "main-toolbar-left"    }],    "scripts": [],    "condition": "remoteFrontend"}, {    "dependencies": ["components"],    "name": "extensions",    "scripts": []}, {    "skip_compilation": ["TestBase.js"],    "dependencies": ["platform"],    "name": "common",    "scripts": []}, {    "dependencies": ["bindings", "platform", "ui"],    "extensions": [{        "category": "Console",        "title": "Enable custom formatters",        "defaultValue": false,        "experiment": "customObjectFormatters",        "settingName": "customFormatters",        "settingType": "boolean",        "type": "setting"    }],    "name": "components",    "scripts": []}, {    "experiment": "securityPanel",    "extensions": [{        "className": "WebInspector.SecurityPanelFactory",        "order": 7,        "type": "@WebInspector.PanelFactory",        "name": "security",        "title": "Security"    }],    "name": "security",    "dependencies": ["platform", "ui", "sdk"],    "scripts": []}];var applicationDescriptor;var _loadedScripts = {};for (var k of [])    ;function 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 !== 4)                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 );    }}function 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;}function 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;        sourceURL = sourceURL.substring(0, schemaIndex) + normalizePath(sourceURL.substring(schemaIndex));        if (_loadedScripts[sourceURL])            continue;urls.push(sourceURL);        promises.push(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);    }}(function() {    var baseUrl = self.location ? self.location.origin + self.location.pathname : "";    self._importScriptPathPrefix = baseUrl.substring(0, baseUrl.lastIndexOf("/") + 1);})();function Runtime(descriptors, coreModuleNames) {    this._modules = [];    this._modulesMap = {};    this._extensions = [];    this._cachedTypeClasses = {};    this._descriptorsMap = {};    for (var i = 0; i < descriptors.length; ++i)        this._registerModule(descriptors[i]);    if (coreModuleNames)        this._loadAutoStartModules(coreModuleNames);}Runtime._queryParamsObject = {    __proto__: null };Runtime.cachedResources = {    __proto__: null };Runtime.isReleaseMode = function() {    return !!allDescriptors.length;}Runtime.startApplication = function(appName) {    console.timeStamp("Runtime.startApplication");    var allDescriptorsByName = {};    for (var i = 0; Runtime.isReleaseMode() && i < allDescriptors.length; ++i) {        var d = allDescriptors[i];        allDescriptorsByName[d["name"]] = d;    }    var applicationPromise;    if (applicationDescriptor)        applicationPromise = Promise.resolve(applicationDescriptor);    else        applicationPromise = loadResourcePromise(appName + ".json").then(JSON.parse.bind(JSON));    applicationPromise.then(parseModuleDescriptors);    function parseModuleDescriptors(configuration)     {        var moduleJSONPromises = [];        var coreModuleNames = [];        for (var i = 0; i < configuration.length; ++i) {            var descriptor = configuration[i];            if (descriptor["type"] === "worker")                continue;var name = descriptor["name"];            var moduleJSON = allDescriptorsByName[name];            if (moduleJSON)                moduleJSONPromises.push(Promise.resolve(moduleJSON));            else                moduleJSONPromises.push(loadResourcePromise(name + "/module.json").then(JSON.parse.bind(JSON)));            if (descriptor["type"] === "autostart")                coreModuleNames.push(name);        }        Promise.all(moduleJSONPromises).then(instantiateRuntime);        function instantiateRuntime(moduleDescriptors)         {            for (var i = 0; !Runtime.isReleaseMode() && i < moduleDescriptors.length; ++i) {                moduleDescriptors[i]["name"] = configuration[i]["name"];                moduleDescriptors[i]["condition"] = configuration[i]["condition"];            }            self.runtime = new Runtime(moduleDescriptors,coreModuleNames);        }    }}Runtime.queryParam = function(name) {    return Runtime._queryParamsObject[name] || null ;}Runtime.constructQueryParams = function(banned) {    var params = [];    for (var key in Runtime._queryParamsObject) {        if (!key || banned.indexOf(key) !== -1)            continue;params.push(key + "=" + Runtime._queryParamsObject[key]);    }    return params.length ? "?" + params.join("&") : "";}Runtime._experimentsSetting = function() {    try {        return ( JSON.parse(self.localStorage && self.localStorage["experiments"] ? self.localStorage["experiments"] : "{}")) ;    } catch (e) {        console.error("Failed to parse localStorage['experiments']");        return {};    }}Runtime._some = function(promises) {    var all = [];    var wasRejected = [];    for (var i = 0; i < promises.length; ++i) {        var handlerFunction = (handler.bind(promises[i], i));        all.push(promises[i].catch(handlerFunction));    }    return Promise.all(all).then(filterOutFailuresResults);    function filterOutFailuresResults(results)     {        var filtered = [];        for (var i = 0; i < results.length; ++i) {            if (!wasRejected[i])                filtered.push(results[i]);        }        return filtered;    }    function handler(index, e)     {        wasRejected[index] = true;        console.error(e.stack);    }}Runtime._console = console;Runtime._originalAssert = console.assert;Runtime._assert = function(value, message) {    if (value)        return;    Runtime._originalAssert.call(Runtime._console, value, message + " " + new Error().stack);}Runtime.prototype = {    useTestBase: function()     {        Runtime._remoteBase = "http://localhost:8000/inspector-sources/";    },    _registerModule: function(descriptor)     {        var module = new Runtime.Module(this,descriptor);        this._modules.push(module);        this._modulesMap[descriptor["name"]] = module;    },    loadModulePromise: function(moduleName)     {        return this._modulesMap[moduleName]._loadPromise();    },    _loadAutoStartModules: function(moduleNames)     {        var promises = [];        for (var i = 0; i < moduleNames.length; ++i) {            if (Runtime.isReleaseMode())                this._modulesMap[moduleNames[i]]._loaded = true;            else                promises.push(this.loadModulePromise(moduleNames[i]));        }        return Promise.all(promises);    },    _checkExtensionApplicability: function(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: function(extension, context)     {        if (!context)            return true;        return this._checkExtensionApplicability(extension, isInstanceOf);        function isInstanceOf(targetType)         {            return context instanceof targetType;        }    },    isExtensionApplicableToContextTypes: function(extension, currentContextTypes)     {        if (!extension.descriptor().contextTypes)            return true;        return this._checkExtensionApplicability(extension, currentContextTypes ? isContextTypeKnown : null );        function isContextTypeKnown(targetType)         {            return currentContextTypes.has(targetType);        }    },    extensions: function(type, context)     {        return this._extensions.filter(filter).sort(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;        }    },    extension: function(type, context)     {        return this.extensions(type, context)[0] || null ;    },    instancesPromise: function(type, context)     {        var extensions = this.extensions(type, context);        var promises = [];        for (var i = 0; i < extensions.length; ++i)            promises.push(extensions[i].instancePromise());        return Runtime._some(promises);    },    instancePromise: function(type, context)     {        var extension = this.extension(type, context);        if (!extension)            return Promise.reject(new Error("No such extension: " + type + " in given context."));        return extension.instancePromise();    },    _resolve: function(typeName)     {        if (!this._cachedTypeClasses[typeName]) {            var path = typeName.split(".");            var object = window;            for (var i = 0; object && (i < path.length); ++i)                object = object[path[i]];            if (object)                this._cachedTypeClasses[typeName] = (object);        }        return this._cachedTypeClasses[typeName] || null ;    }}Runtime.ModuleDescriptor = function() {    this.name;    this.extensions;    this.dependencies;    this.scripts;    this.remote;}Runtime.ExtensionDescriptor = function() {    this.type;    this.className;    this.contextTypes;}Runtime.Module = function(manager, descriptor) {    this._manager = manager;    this._descriptor = descriptor;    this._name = descriptor.name;    this._instanceMap = {};    var extensions = (descriptor.extensions);    for (var i = 0; extensions && i < extensions.length; ++i)        this._manager._extensions.push(new Runtime.Extension(this,extensions[i]));    this._loaded = false;}Runtime.Module.prototype = {    name: function()     {        return this._name;    },    enabled: function()     {        var activatorExperiment = this._descriptor["experiment"];        if (activatorExperiment && !Runtime.experiments.isEnabled(activatorExperiment))            return false;        var condition = this._descriptor["condition"];        if (condition && !Runtime.queryParam(condition))            return false;        return true;    },    resource: function(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: function()     {        if (this._loaded)            return Promise.resolve();        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(markAsLoaded.bind(this));        return this._pendingLoadPromise;        function markAsLoaded()         {            delete this._pendingLoadPromise;            this._loaded = true;        }    },    _loadResources: function()     {        var resources = this._descriptor["resources"];        if (!resources)            return Promise.resolve();        var promises = [];        for (var i = 0; i < resources.length; ++i) {            var url = this._modularizeURL(resources[i]);            promises.push(loadResourcePromise(url).then(cacheResource.bind(this, url), cacheResource.bind(this, url, undefined)));        }        return Promise.all(promises).then(undefined);        function cacheResource(path, content)         {            if (!content) {                console.error("Failed to load resource: " + path);                return;            }            var sourceURL = window.location.href;            if (window.location.search)                sourceURL = sourceURL.replace(window.location.search, "");            sourceURL = sourceURL.substring(0, sourceURL.lastIndexOf("/") + 1) + path;            Runtime.cachedResources[path] = content + "\n/*# sourceURL=" + sourceURL + " */";        }    },    _loadScripts: function()     {        if (!this._descriptor.scripts)            return Promise.resolve();        if (Runtime.isReleaseMode()) {            var base = this._descriptor.remote && Runtime._remoteBase || undefined;            return loadScriptsPromise([this._name + "_module.js"], base);        }        return loadScriptsPromise(this._descriptor.scripts.map(this._modularizeURL, this));    },    _modularizeURL: function(resourceName)     {        return normalizePath(this._name + "/" + resourceName);    },    _instance: function(className)     {        if (className in this._instanceMap)            return this._instanceMap[className];        var constructorFunction = window.eval(className);        if (!(constructorFunction instanceof Function)) {            this._instanceMap[className] = null ;            return null ;        }        var instance = new constructorFunction();        this._instanceMap[className] = instance;        return instance;    }}Runtime.Extension = function(module, descriptor) {    this._module = module;    this._descriptor = descriptor;    this._type = descriptor.type;    this._hasTypeClass = this._type.charAt(0) === "@";    this._className = descriptor.className || null ;}Runtime.Extension.prototype = {    descriptor: function()     {        return this._descriptor;    },    module: function()     {        return this._module;    },    enabled: function()     {        var activatorExperiment = this.descriptor()["experiment"];        if (activatorExperiment && !Runtime.experiments.isEnabled(activatorExperiment))            return false;        var condition = this.descriptor()["condition"];        if (condition && !Runtime.queryParam(condition))            return false;        return this._module.enabled();    },    _typeClass: function()     {        if (!this._hasTypeClass)            return null ;        return this._module._manager._resolve(this._type.substring(1));    },    isApplicable: function(context)     {        return this._module._manager.isExtensionApplicableToContext(this, context);    },    instancePromise: function()     {        if (!this._className)            return Promise.reject(new Error("No class name in extension"));        var className = this._className;        if (this._instance)            return Promise.resolve(this._instance);        return this._module._loadPromise().then(constructInstance.bind(this));        function constructInstance()         {            var result = this._module._instance(className);            if (!result)                return Promise.reject("Could not instantiate: " + className);            return result;        }    },    title: function(platform)     {        return this._descriptor["title-" + platform] || this._descriptor["title"];    }}Runtime.ExperimentsSupport = function() {    this._supportEnabled = Runtime.queryParam("experiments") !== null ;    this._experiments = [];    this._experimentNames = {};    this._enabledTransiently = {};}Runtime.ExperimentsSupport.prototype = {    allConfigurableExperiments: function()     {        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: function()     {        return this._supportEnabled;    },    _setExperimentsSetting: function(value)     {        if (!self.localStorage)            return;        self.localStorage["experiments"] = JSON.stringify(value);    },    register: function(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: function(experimentName)     {        this._checkExperiment(experimentName);        if (this._enabledTransiently[experimentName])            return true;        if (!this.supportEnabled())            return false;        return !!Runtime._experimentsSetting()[experimentName];    },    setEnabled: function(experimentName, enabled)     {        this._checkExperiment(experimentName);        var experimentsSetting = Runtime._experimentsSetting();        experimentsSetting[experimentName] = enabled;        this._setExperimentsSetting(experimentsSetting);    },    setDefaultExperiments: function(experimentNames)     {        for (var i = 0; i < experimentNames.length; ++i) {            this._checkExperiment(experimentNames[i]);            this._enabledTransiently[experimentNames[i]] = true;        }    },    enableForTest: function(experimentName)     {        this._checkExperiment(experimentName);        this._enabledTransiently[experimentName] = true;    },    clearForTest: function()     {        this._experiments = [];        this._experimentNames = {};        this._enabledTransiently = {};    },    cleanUpStaleExperiments: function()     {        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: function(experimentName)     {        Runtime._assert(this._experimentNames[experimentName], "Unknown experiment " + experimentName);    }}Runtime.Experiment = function(experiments, name, title, hidden) {    this.name = name;    this.title = title;    this.hidden = hidden;    this._experiments = experiments;}Runtime.Experiment.prototype = {    isEnabled: function()     {        return this._experiments.isEnabled(this.name);    },    setEnabled: function(enabled)     {        this._experiments.setEnabled(this.name, enabled);    }}{    (function parseQueryParameters()     {        var queryParams = location.search;        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 = Runtime.queryParam("remoteBase");var runtime;console = console;console.__originalAssert = console.assert;console.assert = function(value, message) {    if (value)        return;    console.__originalAssert(value, message);}var ArrayLike;Object.isEmpty = function(obj) {    for (var i in obj)        return false;    return true;}Object.values = function(obj) {    var result = Object.keys(obj);    var length = result.length;    for (var i = 0; i < length; ++i)        result[i] = obj[result[i]];    return result;}function mod(m, n) {    return ((m % n) + n) % n;}String.prototype.findAll = function(string) {    var matches = [];    var i = this.indexOf(string);    while (i !== -1) {        matches.push(i);        i = this.indexOf(string, i + string.length);    }    return matches;}String.prototype.lineEndings = function() {    if (!this._lineEndings) {        this._lineEndings = this.findAll("\n");        this._lineEndings.push(this.length);    }    return this._lineEndings;}String.prototype.lineCount = function() {    var lineEndings = this.lineEndings();    return lineEndings.length;}String.prototype.lineAt = function(lineNumber) {    var lineEndings = this.lineEndings();    var lineStart = lineNumber > 0 ? lineEndings[lineNumber - 1] + 1 : 0;    var lineEnd = lineEndings[lineNumber];    var lineContent = this.substring(lineStart, lineEnd);    if (lineContent.length > 0 && lineContent.charAt(lineContent.length - 1) === "\r")        lineContent = lineContent.substring(0, lineContent.length - 1);    return lineContent;}String.prototype.escapeCharacters = function(chars) {    var foundChar = false;    for (var i = 0; i < chars.length; ++i) {        if (this.indexOf(chars.charAt(i)) !== -1) {            foundChar = true;            break;        }    }    if (!foundChar)        return String(this);    var result = "";    for (var i = 0; i < this.length; ++i) {        if (chars.indexOf(this.charAt(i)) !== -1)            result += "\\";        result += this.charAt(i);    }    return result;}String.regexSpecialCharacters = function() {    return "^[]{}()\\.^$*+?|-,";}String.prototype.escapeForRegExp = function() {    return this.escapeCharacters(String.regexSpecialCharacters());}String.prototype.escapeHTML = function() {    return this.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """);}String.prototype.unescapeHTML = function() {    return this.replace(/</g, "<").replace(/>/g, ">").replace(/:/g, ":").replace(/"/g, "\"").replace(/</g, "<").replace(/>/g, ">").replace(/&/g, "&");}String.prototype.collapseWhitespace = function() {    return this.replace(/[\s\xA0]+/g, " ");}String.prototype.trimMiddle = function(maxLength) {    if (this.length <= maxLength)        return String(this);    var leftHalf = maxLength >> 1;    var rightHalf = maxLength - leftHalf - 1;    return this.substr(0, leftHalf) + "\u2026" + this.substr(this.length - rightHalf, rightHalf);}String.prototype.trimEnd = function(maxLength) {    if (this.length <= maxLength)        return String(this);    return this.substr(0, maxLength - 1) + "\u2026";}String.prototype.trimURL = function(baseURLDomain) {    var result = this.replace(/^(https|http|file):\/\//i, "");    if (baseURLDomain) {        if (result.toLowerCase().startsWith(baseURLDomain.toLowerCase()))            result = result.substr(baseURLDomain.length);    }    return result;}String.prototype.toTitleCase = function() {    return this.substring(0, 1).toUpperCase() + this.substring(1);}String.prototype.compareTo = function(other) {    if (this > other)        return 1;    if (this < other)        return -1;    return 0;}function sanitizeHref(href) {    return href && href.trim().toLowerCase().startsWith("javascript:") ? null  : href;}String.prototype.removeURLFragment = function() {    var fragmentIndex = this.indexOf("#");    if (fragmentIndex == -1)        fragmentIndex = this.length;    return this.substring(0, fragmentIndex);}String.prototype.startsWith = function(substring) {    return !this.lastIndexOf(substring, 0);}String.prototype.endsWith = function(substring) {    return this.indexOf(substring, this.length - substring.length) !== -1;}String.hashCode = function(string) {    if (!string)        return 0;    var result = 0;    for (var i = 0; i < string.length; ++i)        result = (result * 3 + string.charCodeAt(i)) | 0;    return result;}String.isDigitAt = function(string, index) {    var c = string.charCodeAt(index);    return 48 <= c && c <= 57;}String.prototype.toBase64 = function() {    function encodeBits(b)     {        return b < 26 ? b + 65 : b < 52 ? b + 71 : b < 62 ? b - 4 : b === 62 ? 43 : b === 63 ? 47 : 65;    }    var encoder = new TextEncoder();    var data = encoder.encode(this.toString());    var n = data.length;    var encoded = "";    if (n === 0)        return encoded;    var shift;    var v = 0;    for (var i = 0; i < n; i++) {        shift = i % 3;        v |= data[i] << (16 >>> shift & 24);        if (shift === 2) {            encoded += String.fromCharCode(encodeBits(v >>> 18 & 63), encodeBits(v >>> 12 & 63), encodeBits(v >>> 6 & 63), encodeBits(v & 63));            v = 0;        }    }    if (shift === 0)        encoded += String.fromCharCode(encodeBits(v >>> 18 & 63), encodeBits(v >>> 12 & 63), 61, 61);    else if (shift === 1)        encoded += String.fromCharCode(encodeBits(v >>> 18 & 63), encodeBits(v >>> 12 & 63), encodeBits(v >>> 6 & 63), 61);    return encoded;}String.naturalOrderComparator = function(a, b) {    var chunk = /^\d+|^\D+/;    var chunka, chunkb, anum, bnum;    while (1) {        if (a) {            if (!b)                return 1;        } else {            if (b)                return -1;            else                return 0;        }        chunka = a.match(chunk)[0];        chunkb = b.match(chunk)[0];        anum = !isNaN(chunka);        bnum = !isNaN(chunkb);        if (anum && !bnum)            return -1;        if (bnum && !anum)            return 1;        if (anum && bnum) {            var diff = chunka - chunkb;            if (diff)                return diff;            if (chunka.length !== chunkb.length) {                if (!+chunka && !+chunkb)                    return chunka.length - chunkb.length;                else                    return chunkb.length - chunka.length;            }        } else if (chunka !== chunkb)            return (chunka < chunkb) ? -1 : 1;        a = a.substring(chunka.length);        b = b.substring(chunkb.length);    }}Number.constrain = function(num, min, max) {    if (num < min)        num = min;    else if (num > max)        num = max;    return num;}Number.gcd = function(a, b) {    if (b === 0)        return a;    else        return Number.gcd(b, a % b);}Number.toFixedIfFloating = function(value) {    if (!value || isNaN(value))        return value;    var number = Number(value);    return number % 1 ? number.toFixed(3) : String(number);}Date.prototype.toISO8601Compact = function() {    function leadZero(x)     {        return (x > 9 ? "" : "0") + x;    }    return this.getFullYear() +     leadZero(this.getMonth() + 1) +     leadZero(this.getDate()) + "T" +     leadZero(this.getHours()) +     leadZero(this.getMinutes()) +     leadZero(this.getSeconds());}Date.prototype.toConsoleTime = function() {    function leadZero2(x)     {        return (x > 9 ? "" : "0") + x;    }    function leadZero3(x)     {        return "0".repeat(3 - x.toString().length) + x;    }    return this.getFullYear() + "-" +     leadZero2(this.getMonth() + 1) + "-" +     leadZero2(this.getDate()) + " " +     leadZero2(this.getHours()) + ":" +     leadZero2(this.getMinutes()) + ":" +     leadZero2(this.getSeconds()) + "." +     leadZero3(this.getMilliseconds());}Object.defineProperty(Array.prototype, "remove", {    value: function(value, firstOnly)     {        var index = this.indexOf(value);        if (index === -1)            return;        if (firstOnly) {            this.splice(index, 1);            return;        }        for (var i = index + 1, n = this.length; i < n; ++i) {            if (this[i] !== value)                this[index++] = this[i];        }        this.length = index;    }});Object.defineProperty(Array.prototype, "keySet", {    value: function()     {        var keys = {};        for (var i = 0; i < this.length; ++i)            keys[this[i]] = true;        return keys;    }});Object.defineProperty(Array.prototype, "pushAll", {    value: function(array)     {        Array.prototype.push.apply(this, array);    }});Object.defineProperty(Array.prototype, "rotate", {    value: function(index)     {        var result = [];        for (var i = index; i < index + this.length; ++i)            result.push(this[i % this.length]);        return result;    }});Object.defineProperty(Array.prototype, "sortNumbers", {    value: function()     {        function numericComparator(a, b)         {            return a - b;        }        this.sort(numericComparator);    }});Object.defineProperty(Uint32Array.prototype, "sort", {    value: Array.prototype.sort});(function() {    var partition = {        value: function(comparator, left, right, pivotIndex)         {            function swap(array, i1, i2)             {                var temp = array[i1];                array[i1] = array[i2];                array[i2] = temp;            }            var pivotValue = this[pivotIndex];            swap(this, right, pivotIndex);            var storeIndex = left;            for (var i = left; i < right; ++i) {                if (comparator(this[i], pivotValue) < 0) {                    swap(this, storeIndex, i);                    ++storeIndex;                }            }            swap(this, right, storeIndex);            return storeIndex;        }    };    Object.defineProperty(Array.prototype, "partition", partition);    Object.defineProperty(Uint32Array.prototype, "partition", partition);    var sortRange = {        value: function(comparator, leftBound, rightBound, sortWindowLeft, sortWindowRight)         {            function quickSortRange(array, comparator, left, right, sortWindowLeft, sortWindowRight)             {                if (right <= left)                    return;                var pivotIndex = Math.floor(Math.random() * (right - left)) + left;                var pivotNewIndex = array.partition(comparator, left, right, pivotIndex);                if (sortWindowLeft < pivotNewIndex)                    quickSortRange(array, comparator, left, pivotNewIndex - 1, sortWindowLeft, sortWindowRight);                if (pivotNewIndex < sortWindowRight)                    quickSortRange(array, comparator, pivotNewIndex + 1, right, sortWindowLeft, sortWindowRight);            }            if (leftBound === 0 && rightBound === (this.length - 1) && sortWindowLeft === 0 && sortWindowRight >= rightBound)                this.sort(comparator);            else                quickSortRange(this, comparator, leftBound, rightBound, sortWindowLeft, sortWindowRight);            return this;        }    }    Object.defineProperty(Array.prototype, "sortRange", sortRange);    Object.defineProperty(Uint32Array.prototype, "sortRange", sortRange);})();Object.defineProperty(Array.prototype, "stableSort", {    value: function(comparator)     {        function defaultComparator(a, b)         {            return a < b ? -1 : (a > b ? 1 : 0);        }        comparator = comparator || defaultComparator;        var indices = new Array(this.length);        for (var i = 0; i < this.length; ++i)            indices[i] = i;        var self = this;        function indexComparator(a, b)         {            var result = comparator(self[a], self[b]);            return result ? result : a - b;        }        indices.sort(indexComparator);        for (var i = 0; i < this.length; ++i) {            if (indices[i] < 0 || i === indices[i])                continue;var cyclical = i;            var saved = this[i];            while (true) {                var next = indices[cyclical];                indices[cyclical] = -1;                if (next === i) {                    this[cyclical] = saved;                    break;                } else {                    this[cyclical] = this[next];                    cyclical = next;                }            }        }        return this;    }});Object.defineProperty(Array.prototype, "qselect", {    value: function(k, comparator)     {        if (k < 0 || k >= this.length)            return;        if (!comparator)            comparator = function(a, b) {                return a - b;            }        var low = 0;        var high = this.length - 1;        for (; ; ) {            var pivotPosition = this.partition(comparator, low, high, Math.floor((high + low) / 2));            if (pivotPosition === k)                return this[k];            else if (pivotPosition > k)                high = pivotPosition - 1;            else                low = pivotPosition + 1;        }    }});Object.defineProperty(Array.prototype, "lowerBound", {    value: function(object, comparator, left, right)     {        function defaultComparator(a, b)         {            return a < b ? -1 : (a > b ? 1 : 0);        }        comparator = comparator || defaultComparator;        var l = left || 0;        var r = right !== undefined ? right : this.length;        while (l < r) {            var m = (l + r) >> 1;            if (comparator(object, this[m]) > 0)                l = m + 1;            else                r = m;        }        return r;    }});Object.defineProperty(Array.prototype, "upperBound", {    value: function(object, comparator, left, right)     {        function defaultComparator(a, b)         {            return a < b ? -1 : (a > b ? 1 : 0);        }        comparator = comparator || defaultComparator;        var l = left || 0;        var r = right !== undefined ? right : this.length;        while (l < r) {            var m = (l + r) >> 1;            if (comparator(object, this[m]) >= 0)                l = m + 1;            else                r = m;        }        return r;    }});Object.defineProperty(Uint32Array.prototype, "lowerBound", {    value: Array.prototype.lowerBound});Object.defineProperty(Uint32Array.prototype, "upperBound", {    value: Array.prototype.upperBound});Object.defineProperty(Float64Array.prototype, "lowerBound", {    value: Array.prototype.lowerBound});Object.defineProperty(Array.prototype, "binaryIndexOf", {    value: function(value, comparator)     {        var index = this.lowerBound(value, comparator);        return index < this.length && comparator(value, this[index]) === 0 ? index : -1;    }});Object.defineProperty(Array.prototype, "select", {    value: function(field)     {        var result = new Array(this.length);        for (var i = 0; i < this.length; ++i)            result[i] = this[i][field];        return result;    }});Object.defineProperty(Array.prototype, "peekLast", {    value: function()     {        return this[this.length - 1];    }});(function() {    function mergeOrIntersect(array1, array2, comparator, mergeNotIntersect)     {        var result = [];        var i = 0;        var j = 0;        while (i < array1.length && j < array2.length) {            var compareValue = comparator(array1[i], array2[j]);            if (mergeNotIntersect || !compareValue)                result.push(compareValue <= 0 ? array1[i] : array2[j]);            if (compareValue <= 0)                i++;            if (compareValue >= 0)                j++;        }        if (mergeNotIntersect) {            while (i < array1.length)                result.push(array1[i++]);            while (j < array2.length)                result.push(array2[j++]);        }        return result;    }    Object.defineProperty(Array.prototype, "intersectOrdered", {        value: function(array, comparator)         {            return mergeOrIntersect(this, array, comparator, false);        }    });    Object.defineProperty(Array.prototype, "mergeOrdered", {        value: function(array, comparator)         {            return mergeOrIntersect(this, array, comparator, true);        }    });}());function insertionIndexForObjectInListSortedByFunction(object, list, comparator, insertionIndexAfter) {    if (insertionIndexAfter)        return list.upperBound(object, comparator);    else        return list.lowerBound(object, comparator);}String.sprintf = function(format, var_arg) {    return String.vsprintf(format, Array.prototype.slice.call(arguments, 1));}String.tokenizeFormatString = function(format, formatters) {    var tokens = [];    var substitutionIndex = 0;    function addStringToken(str)     {        tokens.push({            type: "string",            value: str        });    }    function addSpecifierToken(specifier, precision, substitutionIndex)     {        tokens.push({            type: "specifier",            specifier: specifier,            precision: precision,            substitutionIndex: substitutionIndex        });    }    var index = 0;    for (var precentIndex = format.indexOf("%", index); precentIndex !== -1; precentIndex = format.indexOf("%", index)) {        if (format.length === index)            break;        addStringToken(format.substring(index, precentIndex));        index = precentIndex + 1;        if (format[index] === "%") {            addStringToken("%");            ++index;            continue;        }        if (String.isDigitAt(format, index)) {            var number = parseInt(format.substring(index), 10);            while (String.isDigitAt(format, index))                ++index;            if (number > 0 && format[index] === "$") {                substitutionIndex = (number - 1);                ++index;            }        }        var precision = -1;        if (format[index] === ".") {            ++index;            precision = parseInt(format.substring(index), 10);            if (isNaN(precision))                precision = 0;            while (String.isDigitAt(format, index))                ++index;        }        if (!(format[index] in formatters)) {            addStringToken(format.substring(precentIndex, index + 1));            ++index;            continue;        }        addSpecifierToken(format[index], precision, substitutionIndex);        ++substitutionIndex;        ++index;    }    addStringToken(format.substring(index));    return tokens;}String.standardFormatters = {    d: function(substitution)     {        return !isNaN(substitution) ? substitution : 0;    },    f: function(substitution, token)     {        if (substitution && token.precision > -1)            substitution = substitution.toFixed(token.precision);        return !isNaN(substitution) ? substitution : (token.precision > -1 ? Number(0).toFixed(token.precision) : 0);    },    s: function(substitution)     {        return substitution;    }}String.vsprintf = function(format, substitutions) {    return String.format(format, substitutions, String.standardFormatters, "", function(a, b) {        return a + b;    }    ).formattedResult;}String.format = function(format, substitutions, formatters, initialValue, append, tokenizedFormat) {    if (!format || !substitutions || !substitutions.length)        return {            formattedResult: append(initialValue, format),            unusedSubstitutions: substitutions        };    function prettyFunctionName()     {        return "String.format(\"" + format + "\", \"" + Array.prototype.join.call(substitutions, "\", \"") + "\")";    }    function warn(msg)     {        console.warn(prettyFunctionName() + ": " + msg);    }    function error(msg)     {        console.error(prettyFunctionName() + ": " + msg);    }    var result = initialValue;    var tokens = tokenizedFormat || String.tokenizeFormatString(format, formatters);    var usedSubstitutionIndexes = {};    for (var i = 0; i < tokens.length; ++i) {        var token = tokens[i];        if (token.type === "string") {            result = append(result, token.value);            continue;        }        if (token.type !== "specifier") {            error("Unknown token type \"" + token.type + "\" found.");            continue;        }        if (token.substitutionIndex >= substitutions.length) {            error("not enough substitution arguments. Had " + substitutions.length + " but needed " + (token.substitutionIndex + 1) + ", so substitution was skipped.");            result = append(result, "%" + (token.precision > -1 ? token.precision : "") + token.specifier);            continue;        }        usedSubstitutionIndexes[token.substitutionIndex] = true;        if (!(token.specifier in formatters)) {            warn("unsupported format character \u201C" + token.specifier + "\u201D. Treating as a string.");            result = append(result, substitutions[token.substitutionIndex]);            continue;        }        result = append(result, formatters[token.specifier](substitutions[token.substitutionIndex], token));    }    var unusedSubstitutions = [];    for (var i = 0; i < substitutions.length; ++i) {        if (i in usedSubstitutionIndexes)            continue;unusedSubstitutions.push(substitutions[i]);    }    return {        formattedResult: result,        unusedSubstitutions: unusedSubstitutions    };}function createSearchRegex(query, caseSensitive, isRegex) {    var regexFlags = caseSensitive ? "g" : "gi";    var regexObject;    if (isRegex) {        try {            regexObject = new RegExp(query,regexFlags);        } catch (e) {}    }    if (!regexObject)        regexObject = createPlainTextSearchRegex(query, regexFlags);    return regexObject;}function createPlainTextSearchRegex(query, flags) {    var regexSpecialCharacters = String.regexSpecialCharacters();    var regex = "";    for (var i = 0; i < query.length; ++i) {        var c = query.charAt(i);        if (regexSpecialCharacters.indexOf(c) != -1)            regex += "\\";        regex += c;    }    return new RegExp(regex,flags || "");}function countRegexMatches(regex, content) {    var text = content;    var result = 0;    var match;    while (text && (match = regex.exec(text))) {        if (match[0].length > 0)            ++result;        text = text.substring(match.index + 1);    }    return result;}function spacesPadding(spacesCount) {    return "\u00a0".repeat(spacesCount);}function numberToStringWithSpacesPadding(value, symbolsCount) {    var numberString = value.toString();    var paddingLength = Math.max(0, symbolsCount - numberString.length);    return spacesPadding(paddingLength) + numberString;}Array.from = function(iterator) {    var values = [];    for (var iteratorValue = iterator.next(); !iteratorValue.done; iteratorValue = iterator.next())        values.push(iteratorValue.value);    return values;}Set.prototype.valuesArray = function() {    return Array.from(this.values());}Map.prototype.remove = function(key) {    var value = this.get(key);    this.delete(key);    return value;}Map.prototype.valuesArray = function() {    return Array.from(this.values());}Map.prototype.keysArray = function() {    return Array.from(this.keys());}var Multimap = function() {    this._map = new Map();}Multimap.prototype = {    set: function(key, value)     {        var set = this._map.get(key);        if (!set) {            set = new Set();            this._map.set(key, set);        }        set.add(value);    },    get: function(key)     {        var result = this._map.get(key);        if (!result)            result = new Set();        return result;    },    remove: function(key, value)     {        var values = this.get(key);        values.delete(value);        if (!values.size)            this._map.delete(key);    },    removeAll: function(key)     {        this._map.delete(key);    },    keysArray: function()     {        return this._map.keysArray();    },    valuesArray: function()     {        var result = [];        var keys = this.keysArray();        for (var i = 0; i < keys.length; ++i)            result.pushAll(this.get(keys[i]).valuesArray());        return result;    },    clear: function()     {        this._map.clear();    }}function loadXHR(url) {    return new Promise(load);    function load(successCallback, failureCallback)     {        function onReadyStateChanged()         {            if (xhr.readyState !== XMLHttpRequest.DONE)                return;            if (xhr.status !== 200) {                xhr.onreadystatechange = null ;                failureCallback(new Error(xhr.status));                return;            }            xhr.onreadystatechange = null ;            successCallback(xhr.responseText);        }        var xhr = new XMLHttpRequest();        xhr.withCredentials = false;        xhr.open("GET", url, true);        xhr.onreadystatechange = onReadyStateChanged;        xhr.send(null );    }}function CallbackBarrier() {    this._pendingIncomingCallbacksCount = 0;}CallbackBarrier.prototype = {    createCallback: function(userCallback)     {        console.assert(!this._outgoingCallback, "CallbackBarrier.createCallback() is called after CallbackBarrier.callWhenDone()");        ++this._pendingIncomingCallbacksCount;        return this._incomingCallback.bind(this, userCallback);    },    callWhenDone: function(callback)     {        console.assert(!this._outgoingCallback, "CallbackBarrier.callWhenDone() is called multiple times");        this._outgoingCallback = callback;        if (!this._pendingIncomingCallbacksCount)            this._outgoingCallback();    },    _incomingCallback: function(userCallback)     {        console.assert(this._pendingIncomingCallbacksCount > 0);        if (userCallback) {            var args = Array.prototype.slice.call(arguments, 1);            userCallback.apply(null , args);        }        if (!--this._pendingIncomingCallbacksCount && this._outgoingCallback)            this._outgoingCallback();    }}function suppressUnused(value) {}self.setImmediate = function(callback) {    Promise.resolve().then(callback);    return 0;}Promise.prototype.spread = function(callback) {    return this.then(spreadPromise);    function spreadPromise(arg)     {        return callback.apply(null , arg);    }}Promise.prototype.catchException = function(defaultValue) {    return this.catch(function(error) {        console.error(error);        return defaultValue;    }    );};Node.prototype.rangeOfWord = function(offset, stopCharacters, stayWithinNode, direction) {    var startNode;    var startOffset = 0;    var endNode;    var endOffset = 0;    if (!stayWithinNode)        stayWithinNode = this;    if (!direction || direction === "backward" || direction === "both") {        var node = this;        while (node) {            if (node === stayWithinNode) {                if (!startNode)                    startNode = stayWithinNode;                break;            }            if (node.nodeType === Node.TEXT_NODE) {                var start = (node === this ? (offset - 1) : (node.nodeValue.length - 1));                for (var i = start; i >= 0; --i) {                    if (stopCharacters.indexOf(node.nodeValue[i]) !== -1) {                        startNode = node;                        startOffset = i + 1;                        break;                    }                }            }            if (startNode)                break;            node = node.traversePreviousNode(stayWithinNode);        }        if (!startNode) {            startNode = stayWithinNode;            startOffset = 0;        }    } else {        startNode = this;        startOffset = offset;    }    if (!direction || direction === "forward" || direction === "both") {        node = this;        while (node) {            if (node === stayWithinNode) {                if (!endNode)                    endNode = stayWithinNode;                break;            }            if (node.nodeType === Node.TEXT_NODE) {                var start = (node === this ? offset : 0);                for (var i = start; i < node.nodeValue.length; ++i) {                    if (stopCharacters.indexOf(node.nodeValue[i]) !== -1) {                        endNode = node;                        endOffset = i;                        break;                    }                }            }            if (endNode)                break;            node = node.traverseNextNode(stayWithinNode);        }        if (!endNode) {            endNode = stayWithinNode;            endOffset = stayWithinNode.nodeType === Node.TEXT_NODE ? stayWithinNode.nodeValue.length : stayWithinNode.childNodes.length;        }    } else {        endNode = this;        endOffset = offset;    }    var result = this.ownerDocument.createRange();    result.setStart(startNode, startOffset);    result.setEnd(endNode, endOffset);    return result;}Node.prototype.traverseNextTextNode = function(stayWithin) {    var node = this.traverseNextNode(stayWithin);    if (!node)        return null ;    var nonTextTags = {        "STYLE": 1,        "SCRIPT": 1    };    while (node && (node.nodeType !== Node.TEXT_NODE || nonTextTags[node.parentElement.nodeName]))        node = node.traverseNextNode(stayWithin);    return node;}Element.prototype.positionAt = function(x, y, relativeTo) {    var shift = {        x: 0,        y: 0    };    if (relativeTo)        shift = relativeTo.boxInWindow(this.ownerDocument.defaultView);    if (typeof x === "number")        this.style.setProperty("left", (shift.x + x) + "px");    else        this.style.removeProperty("left");    if (typeof y === "number")        this.style.setProperty("top", (shift.y + y) + "px");    else        this.style.removeProperty("top");    if (typeof x === "number" || typeof y === "number")        this.style.setProperty("position", "absolute");    else        this.style.removeProperty("position");}Element.prototype.isScrolledToBottom = function() {    return Math.abs(this.scrollTop + this.clientHeight - this.scrollHeight) <= 2;}function removeSubsequentNodes(fromNode, toNode) {    for (var node = fromNode; node && node !== toNode; ) {        var nodeToRemove = node;        node = node.nextSibling;        nodeToRemove.remove();    }}Element.prototype.containsEventPoint = function(event) {    var box = this.getBoundingClientRect();    return box.left < event.x && event.x < box.right && box.top < event.y && event.y < box.bottom;}Node.prototype.enclosingNodeOrSelfWithNodeNameInArray = function(nameArray) {    for (var node = this; node && node !== this.ownerDocument; node = node.parentNodeOrShadowHost()) {        for (var i = 0; i < nameArray.length; ++i) {            if (node.nodeName.toLowerCase() === nameArray[i].toLowerCase())                return node;        }    }    return null ;}Node.prototype.enclosingNodeOrSelfWithNodeName = function(nodeName) {    return this.enclosingNodeOrSelfWithNodeNameInArray([nodeName]);}Node.prototype.enclosingNodeOrSelfWithClass = function(className, stayWithin) {    return this.enclosingNodeOrSelfWithClassList([className], stayWithin);}Node.prototype.enclosingNodeOrSelfWithClassList = function(classNames, stayWithin) {    for (var node = this; node && node !== stayWithin && node !== this.ownerDocument; node = node.parentNodeOrShadowHost()) {        if (node.nodeType === Node.ELEMENT_NODE) {            var containsAll = true;            for (var i = 0; i < classNames.length && containsAll; ++i) {                if (!node.classList.contains(classNames[i]))                    containsAll = false;            }            if (containsAll)                return ( node) ;        }    }    return null ;}Node.prototype.parentElementOrShadowHost = function() {    var node = this.parentNode;    if (!node)        return null ;    if (node.nodeType === Node.ELEMENT_NODE)        return ( node) ;    if (node.nodeType === Node.DOCUMENT_FRAGMENT_NODE)        return ( node.host) ;    return null ;}Node.prototype.parentNodeOrShadowHost = function() {    return this.parentNode || this.host || null ;}Node.prototype.getComponentSelection = function() {    var parent = this.parentNode;    while (parent && parent.nodeType !== Node.DOCUMENT_FRAGMENT_NODE)        parent = parent.parentNode;    return parent instanceof ShadowRoot ? parent.getSelection() : this.window().getSelection();}Node.prototype.isComponentSelectionCollapsed = function() {    var selection = this.getComponentSelection();    return selection && selection.rangeCount ? selection.getRangeAt(0).collapsed : true;}Node.prototype.getDeepSelection = function() {    var activeElement = this.ownerDocument.activeElement;    var shadowRoot = null ;    while (activeElement && activeElement.shadowRoot) {        shadowRoot = activeElement.shadowRoot;        activeElement = shadowRoot.activeElement;    }    return shadowRoot ? shadowRoot.getSelection() : this.window().getSelection();}Node.prototype.window = function() {    return this.ownerDocument.defaultView;}Element.prototype.query = function(query) {    return this.ownerDocument.evaluate(query, this, null , XPathResult.FIRST_ORDERED_NODE_TYPE, null ).singleNodeValue;}Element.prototype.removeChildren = function() {    if (this.firstChild)        this.textContent = "";}Element.prototype.isInsertionCaretInside = function() {    var selection = this.getComponentSelection();    if (!selection.rangeCount || !selection.isCollapsed)        return false;    var selectionRange = selection.getRangeAt(0);    return selectionRange.startContainer.isSelfOrDescendant(this);}function createElement(tagName, customElementType) {    return document.createElement(tagName, customElementType || "");}function createEvent(type, bubbles, cancelable) {    var event = document.createEvent("Event");    event.initEvent(type, bubbles, cancelable);    return event;}function createTextNode(data) {    return document.createTextNode(data);}Document.prototype.createElementWithClass = function(elementName, className, customElementType) {    var element = this.createElement(elementName, customElementType || "");    if (className)        element.className = className;    return element;}function createElementWithClass(elementName, className, customElementType) {    return document.createElementWithClass(elementName, className, customElementType);}Document.prototype.createSVGElement = function(childType, className) {    var element = this.createElementNS("http://www.w3.org/2000/svg", childType);    if (className)        element.setAttribute("class", className);    return element;}function createSVGElement(childType, className) {    return document.createSVGElement(childType, className);}function createDocumentFragment() {    return document.createDocumentFragment();}Element.prototype.createChild = function(elementName, className, customElementType) {    var element = this.ownerDocument.createElementWithClass(elementName, className, customElementType);    this.appendChild(element);    return element;}DocumentFragment.prototype.createChild = Element.prototype.createChild;Element.prototype.createTextChild = function(text) {    var element = this.ownerDocument.createTextNode(text);    this.appendChild(element);    return element;}DocumentFragment.prototype.createTextChild = Element.prototype.createTextChild;Element.prototype.createTextChildren = function(var_args) {    for (var i = 0, n = arguments.length; i < n; ++i)        this.createTextChild(arguments[i]);}DocumentFragment.prototype.createTextChildren = Element.prototype.createTextChildren;Element.prototype.appendChildren = function(var_args) {    for (var i = 0, n = arguments.length; i < n; ++i)        this.appendChild(arguments[i]);}Element.prototype.totalOffsetLeft = function() {    return this.totalOffset().left;}Element.prototype.totalOffsetTop = function() {    return this.totalOffset().top;}Element.prototype.totalOffset = function() {    var rect = this.getBoundingClientRect();    return {        left: rect.left,        top: rect.top    };}Element.prototype.scrollOffset = function() {    var curLeft = 0;    var curTop = 0;    for (var element = this; element; element = element.scrollParent) {        curLeft += element.scrollLeft;        curTop += element.scrollTop;    }    return {        left: curLeft,        top: curTop    };}Element.prototype.createSVGChild = function(childType, className) {    var child = this.ownerDocument.createSVGElement(childType, className);    this.appendChild(child);    return child;}function AnchorBox(x, y, width, height) {    this.x = x || 0;    this.y = y || 0;    this.width = width || 0;    this.height = height || 0;}AnchorBox.prototype.relativeTo = function(box) {    return new AnchorBox(this.x - box.x,this.y - box.y,this.width,this.height);}AnchorBox.prototype.relativeToElement = function(element) {    return this.relativeTo(element.boxInWindow(element.ownerDocument.defaultView));}AnchorBox.prototype.equals = function(anchorBox) {    return !!anchorBox && this.x === anchorBox.x && this.y === anchorBox.y && this.width === anchorBox.width && this.height === anchorBox.height;}Element.prototype.offsetRelativeToWindow = function(targetWindow) {    var elementOffset = new AnchorBox();    var curElement = this;    var curWindow = this.ownerDocument.defaultView;    while (curWindow && curElement) {        elementOffset.x += curElement.totalOffsetLeft();        elementOffset.y += curElement.totalOffsetTop();        if (curWindow === targetWindow)            break;        curElement = curWindow.frameElement;        curWindow = curWindow.parent;    }    return elementOffset;}Element.prototype.boxInWindow = function(targetWindow) {    targetWindow = targetWindow || this.ownerDocument.defaultView;    var anchorBox = this.offsetRelativeToWindow(window);    anchorBox.width = Math.min(this.offsetWidth, window.innerWidth - anchorBox.x);    anchorBox.height = Math.min(this.offsetHeight, window.innerHeight - anchorBox.y);    return anchorBox;}Element.prototype.setTextAndTitle = function(text) {    this.textContent = text;    this.title = text;}KeyboardEvent.prototype.__defineGetter__("data", function() {    switch (this.type) {    case "keypress":        if (!this.ctrlKey && !this.metaKey)            return String.fromCharCode(this.charCode);        else            return "";    case "keydown":    case "keyup":        if (!this.ctrlKey && !this.metaKey && !this.altKey)            return String.fromCharCode(this.which);        else            return "";    }});Event.prototype.consume = function(preventDefault) {    this.stopImmediatePropagation();    if (preventDefault)        this.preventDefault();    this.handled = true;}Text.prototype.select = function(start, end) {    start = start || 0;    end = end || this.textContent.length;    if (start < 0)        start = end + start;    var selection = this.getComponentSelection();    selection.removeAllRanges();    var range = this.ownerDocument.createRange();    range.setStart(this, start);    range.setEnd(this, end);    selection.addRange(range);    return this;}Element.prototype.selectionLeftOffset = function() {    var selection = this.getComponentSelection();    if (!selection.containsNode(this, true))        return null ;    var leftOffset = selection.anchorOffset;    var node = selection.anchorNode;    while (node !== this) {        while (node.previousSibling) {            node = node.previousSibling;            leftOffset += node.textContent.length;        }        node = node.parentNodeOrShadowHost();    }    return leftOffset;}Node.prototype.deepTextContent = function() {    return this.childTextNodes().map(function(node) {        return node.textContent;    }    ).join("");}Node.prototype.childTextNodes = function() {    var node = this.traverseNextTextNode(this);    var result = [];    var nonTextTags = {        "STYLE": 1,        "SCRIPT": 1    };    while (node) {        if (!nonTextTags[node.parentElement.nodeName])            result.push(node);        node = node.traverseNextTextNode(this);    }    return result;}Node.prototype.isAncestor = function(node) {    if (!node)        return false;    var currentNode = node.parentNodeOrShadowHost();    while (currentNode) {        if (this === currentNode)            return true;        currentNode = currentNode.parentNodeOrShadowHost();    }    return false;}Node.prototype.isDescendant = function(descendant) {    return !!descendant && descendant.isAncestor(this);}Node.prototype.isSelfOrAncestor = function(node) {    return !!node && (node === this || this.isAncestor(node));}Node.prototype.isSelfOrDescendant = function(node) {    return !!node && (node === this || this.isDescendant(node));}Node.prototype.traverseNextNode = function(stayWithin) {    if (this.shadowRoot)        return this.shadowRoot;    var distributedNodes = this.getDistributedNodes ? this.getDistributedNodes() : [];    if (distributedNodes.length)        return distributedNodes[0];    if (this.firstChild)        return this.firstChild;    var node = this;    while (node) {        if (stayWithin && node === stayWithin)            return null ;        var sibling = nextSibling(node);        if (sibling)            return sibling;        node = insertionPoint(node) || node.parentNodeOrShadowHost();    }    function nextSibling(node)     {        var parent = insertionPoint(node);        if (!parent)            return node.nextSibling;        var distributedNodes = parent.getDistributedNodes ? parent.getDistributedNodes() : [];        var position = Array.prototype.indexOf.call(distributedNodes, node);        if (position + 1 < distributedNodes.length)            return distributedNodes[position + 1];        return null ;    }    function insertionPoint(node)     {        var insertionPoints = node.getDestinationInsertionPoints ? node.getDestinationInsertionPoints() : [];        return insertionPoints.length > 0 ? insertionPoints[insertionPoints.length - 1] : null ;    }    return null ;}Node.prototype.traversePreviousNode = function(stayWithin) {    if (stayWithin && this === stayWithin)        return null ;    var node = this.previousSibling;    while (node && node.lastChild)        node = node.lastChild;    if (node)        return node;    return this.parentNodeOrShadowHost();}Node.prototype.setTextContentTruncatedIfNeeded = function(text, placeholder) {    const maxTextContentLength = 10000;    if (typeof text === "string" && text.length > maxTextContentLength) {        this.textContent = typeof placeholder === "string" ? placeholder : text.trimMiddle(maxTextContentLength);        return true;    }    this.textContent = text;    return false;}Event.prototype.deepElementFromPoint = function() {    var node = this.target;    while (node && node.nodeType !== Node.DOCUMENT_FRAGMENT_NODE && node.nodeType !== Node.DOCUMENT_NODE)        node = node.parentNode;    if (!node)        return null ;    node = node.elementFromPoint(this.pageX, this.pageY);    while (node && node.shadowRoot)        node = node.shadowRoot.elementFromPoint(this.pageX, this.pageY);    return node;}Event.prototype.deepActiveElement = function() {    var activeElement = this.target && this.target.ownerDocument ? this.target.ownerDocument.activeElement : null ;    while (activeElement && activeElement.shadowRoot)        activeElement = activeElement.shadowRoot.activeElement;    return activeElement;}Document.prototype.deepElementFromPoint = function(x, y) {    var node = this.elementFromPoint(x, y);    while (node && node.shadowRoot)        node = node.shadowRoot.elementFromPoint(x, y);    return node;}function isEnterKey(event) {    return event.keyCode !== 229 && event.keyIdentifier === "Enter";}function isEscKey(event) {    return event.keyCode === 27;}function consumeEvent(e) {    e.consume();}function runOnWindowLoad(callback) {    function windowLoaded()     {        window.removeEventListener("DOMContentLoaded", windowLoaded, false);        callback();    }    if (document.readyState === "complete" || document.readyState === "interactive")        callback();    else        window.addEventListener("DOMContentLoaded", windowLoaded, false);};var WorkerRuntime = {};WorkerRuntime.startSharedWorker = function(moduleName, workerName) {    if (Runtime.isReleaseMode()) {        try {            var worker = new SharedWorker(moduleName + "_module.js",workerName);            return Promise.resolve(worker);        } catch (e) {            return Promise.reject(e);        }    }    return loadResourcePromise(moduleName + "/module.json").then(start, start.bind(null , undefined));    function start(content)     {        if (!content)            throw new Error("Worker is not defined: " + moduleName + " " + new Error().stack);        var scripts = JSON.parse(content)["scripts"];        if (scripts.length !== 1)            throw new Error("WorkerRuntime.startSharedWorker supports modules with only one script!");        return new SharedWorker(moduleName + "/" + scripts[0],workerName);    }}WorkerRuntime.startWorker = function(moduleName) {    if (Runtime.isReleaseMode())        return Promise.resolve(new Worker(moduleName + "_module.js"));    var loader = function() {        self.onmessage = function(event) {            self.onmessage = null ;            var scripts = event.data;            for (var i = 0; i < scripts.length; ++i) {                var source = scripts[i]["source"];                self.eval(source + "\n//# sourceURL=" + scripts[i]["url"]);            }        }        ;    }    ;    return loadResourcePromise(moduleName + "/module.json").then(start, start.bind(null , undefined));    function start(content)     {        if (!content)            throw new Error("Worker is not defined: " + moduleName + " " + new Error().stack);        var message = [];        var scripts = JSON.parse(content)["scripts"];        var promise = Promise.resolve();        for (var i = 0; i < scripts.length; ++i) {            var url = self._importScriptPathPrefix + moduleName + "/" + scripts[i];            var parts = url.split("://");            url = parts.length === 1 ? url : parts[0] + "://" + normalizePath(parts[1]);            promise = promise.then(promiseGetter(loadResourcePromise(moduleName + "/" + scripts[i]))).then(pushSource.bind(null , url), pushSource.bind(null , null , null ));        }        return promise.then(createWorker);        function promiseGetter(promise)         {            return function() {                return promise;            }            ;        }        function pushSource(url, source)         {            if (!url) {                console.error("Failed to load " + url);                return;            }            message.push({                source: source,                url: url            });        }        function createWorker()         {            var blob = new Blob(["(" + loader.toString() + ")()\n//# sourceURL=" + moduleName],{                type: "text/javascript"            });            var workerURL = window.URL.createObjectURL(blob);            try {                var worker = new Worker(workerURL);                worker.postMessage(message);                return worker;            } finally {                window.URL.revokeObjectURL(workerURL);            }        }    }}WorkerRuntime.Worker = function(moduleName, workerName) {    this._workerPromise = workerName ? WorkerRuntime.startSharedWorker(moduleName, (workerName)) : WorkerRuntime.startWorker(moduleName);}WorkerRuntime.Worker.prototype = {    postMessage: function(message)     {        this._workerPromise.then(postToWorker.bind(this));        function postToWorker(worker)         {            if (!this._disposed)                worker.postMessage(message);        }    },    dispose: function()     {        this._disposed = true;        this._workerPromise.then(terminate);        function terminate(worker)         {            worker.terminate();        }    },    terminate: function()     {        this.dispose();    },    set onmessage(listener)     {        this._workerPromise.then(setOnMessage);        function setOnMessage(worker)         {            worker.onmessage = listener;        }    },    set onerror(listener)     {        this._workerPromise.then(setOnError);        function setOnError(worker)         {            worker.onerror = listener;        }    },    get port()     {        return new WorkerRuntime.Worker.FuturePort(this);    }}WorkerRuntime.Worker.FuturePort = function(worker) {    this._worker = worker;}WorkerRuntime.Worker.FuturePort.prototype = {    set onmessage(listener)     {        this._worker._workerPromise.then(setOnMessage);        function setOnMessage(worker)         {            worker.port.onmessage = listener;        }    },    set onerror(listener)     {        this._worker._workerPromise.then(setOnError);        function setOnError(worker)         {            worker.port.onerror = listener;        }    }};self.WebInspector = {};WebInspector.TextDictionary = function() {    this._words = {};}WebInspector.TextDictionary.prototype = {    addWord: function(word)     {        if (!this._words[word])            this._words[word] = 1;        else            ++this._words[word];    },    removeWord: function(word)     {        if (!this._words[word])            return;        if (this._words[word] === 1)            delete this._words[word];        else            --this._words[word];    },    wordsWithPrefix: function(prefix)     {        var words = [];        for (var i in this._words) {            if (i.startsWith(prefix))                words.push(i);        }        return words;    },    hasWord: function(word)     {        return !!this._words[word];    },    wordCount: function(word)     {        return this._words[word] ? this._words[word] : 0;    },    reset: function()     {        this._words = {};    }};WebInspector.Object = function() {}WebInspector.Object.prototype = {    addEventListener: function(eventType, listener, thisObject)     {        if (!listener)            console.assert(false);        if (!this._listeners)            this._listeners = new Map();        if (!this._listeners.has(eventType))            this._listeners.set(eventType, []);        this._listeners.get(eventType).push({            thisObject: thisObject,            listener: listener        });    },    removeEventListener: function(eventType, listener, thisObject)     {        console.assert(listener);        if (!this._listeners || !this._listeners.has(eventType))            return;        var listeners = this._listeners.get(eventType);        for (var i = 0; i < listeners.length; ++i) {            if (listeners[i].listener === listener && listeners[i].thisObject === thisObject)                listeners.splice(i--, 1);        }        if (!listeners.length)            this._listeners.delete(eventType);    },    removeAllListeners: function()     {        delete this._listeners;    },    hasEventListeners: function(eventType)     {        if (!this._listeners || !this._listeners.has(eventType))            return false;        return true;    },    dispatchEventToListeners: function(eventType, eventData)     {        if (!this._listeners || !this._listeners.has(eventType))            return false;        var event = new WebInspector.Event(this,eventType,eventData);        var listeners = this._listeners.get(eventType).slice(0);        for (var i = 0; i < listeners.length; ++i) {            listeners[i].listener.call(listeners[i].thisObject, event);            if (event._stoppedPropagation)                break;        }        return event.defaultPrevented;    }}WebInspector.Event = function(target, type, data) {    this.target = target;    this.type = type;    this.data = data;    this.defaultPrevented = false;    this._stoppedPropagation = false;}WebInspector.Event.prototype = {    stopPropagation: function()     {        this._stoppedPropagation = true;    },    preventDefault: function()     {        this.defaultPrevented = true;    },    consume: function(preventDefault)     {        this.stopPropagation();        if (preventDefault)            this.preventDefault();    }}WebInspector.EventTarget = function() {}WebInspector.EventTarget.prototype = {    addEventListener: function(eventType, listener, thisObject) {},    removeEventListener: function(eventType, listener, thisObject) {},    removeAllListeners: function() {},    hasEventListeners: function(eventType) {},    dispatchEventToListeners: function(eventType, eventData) {},};WebInspector.NotificationService = function() {}WebInspector.NotificationService.prototype = {    __proto__: WebInspector.Object.prototype}WebInspector.NotificationService.Events = {    InspectorAgentEnabledForTests: "InspectorAgentEnabledForTests",    SelectedNodeChanged: "SelectedNodeChanged"}WebInspector.notifications = new WebInspector.NotificationService();;WebInspector.Color = function(rgba, format, originalText) {    this._rgba = rgba;    this._originalText = originalText || null ;    this._originalTextIsValid = !!this._originalText;    this._format = format;    if (typeof this._rgba[3] === "undefined")        this._rgba[3] = 1;    for (var i = 0; i < 4; ++i) {        if (this._rgba[i] < 0) {            this._rgba[i] = 0;            this._originalTextIsValid = false;        }        if (this._rgba[i] > 1) {            this._rgba[i] = 1;            this._originalTextIsValid = false;        }    }}WebInspector.Color.Format = {    Original: "original",    Nickname: "nickname",    HEX: "hex",    ShortHEX: "shorthex",    RGB: "rgb",    RGBA: "rgba",    HSL: "hsl",    HSLA: "hsla"}WebInspector.Color.parse = function(text) {    var value = text.toLowerCase().replace(/\s+/g, "");    var simple = /^(?:#([0-9a-f]{3}|[0-9a-f]{6})|rgb\(((?:-?\d+%?,){2}-?\d+%?)\)|(\w+)|hsl\((-?\d+\.?\d*(?:,-?\d+\.?\d*%){2})\))$/i;    var match = value.match(simple);    if (match) {        if (match[1]) {            var hex = match[1].toUpperCase();            var format;            if (hex.length === 3) {                format = WebInspector.Color.Format.ShortHEX;                hex = hex.charAt(0) + hex.charAt(0) + hex.charAt(1) + hex.charAt(1) + hex.charAt(2) + hex.charAt(2);            } else                format = WebInspector.Color.Format.HEX;            var r = parseInt(hex.substring(0, 2), 16);            var g = parseInt(hex.substring(2, 4), 16);            var b = parseInt(hex.substring(4, 6), 16);            return new WebInspector.Color([r / 255, g / 255, b / 255, 1],format,text);        }        if (match[2]) {            var rgbString = match[2].split(/\s*,\s*/);            var rgba = [WebInspector.Color._parseRgbNumeric(rgbString[0]), WebInspector.Color._parseRgbNumeric(rgbString[1]), WebInspector.Color._parseRgbNumeric(rgbString[2]), 1];            return new WebInspector.Color(rgba,WebInspector.Color.Format.RGB,text);        }        if (match[3]) {            var nickname = match[3].toLowerCase();            if (nickname in WebInspector.Color.Nicknames) {                var rgba = WebInspector.Color.Nicknames[nickname];                var color = WebInspector.Color.fromRGBA(rgba);                color._format = WebInspector.Color.Format.Nickname;                color._originalText = text;                return color;            }            return null ;        }        if (match[4]) {            var hslString = match[4].replace(/%/g, "").split(/\s*,\s*/);            var hsla = [WebInspector.Color._parseHueNumeric(hslString[0]), WebInspector.Color._parseSatLightNumeric(hslString[1]), WebInspector.Color._parseSatLightNumeric(hslString[2]), 1];            var rgba = WebInspector.Color._hsl2rgb(hsla);            return new WebInspector.Color(rgba,WebInspector.Color.Format.HSL,text);        }        return null ;    }    var advanced = /^(?:rgba\(((?:-?\d+%?,){3}-?\d+(?:\.\d+)?)\)|hsla\((-?\d+\.?\d*(?:,-?\d+\.?\d*%){2},-?\d+(?:\.\d+)?)\))$/;    match = value.match(advanced);    if (match) {        if (match[1]) {            var rgbaString = match[1].split(/\s*,\s*/);            var rgba = [WebInspector.Color._parseRgbNumeric(rgbaString[0]), WebInspector.Color._parseRgbNumeric(rgbaString[1]), WebInspector.Color._parseRgbNumeric(rgbaString[2]), WebInspector.Color._parseAlphaNumeric(rgbaString[3])];            return new WebInspector.Color(rgba,WebInspector.Color.Format.RGBA,text);        }        if (match[2]) {            var hslaString = match[2].replace(/%/g, "").split(/\s*,\s*/);            var hsla = [WebInspector.Color._parseHueNumeric(hslaString[0]), WebInspector.Color._parseSatLightNumeric(hslaString[1]), WebInspector.Color._parseSatLightNumeric(hslaString[2]), WebInspector.Color._parseAlphaNumeric(hslaString[3])];            var rgba = WebInspector.Color._hsl2rgb(hsla);            return new WebInspector.Color(rgba,WebInspector.Color.Format.HSLA,text);        }    }    return null ;}WebInspector.Color.fromRGBA = function(rgba) {    return new WebInspector.Color([rgba[0] / 255, rgba[1] / 255, rgba[2] / 255, rgba[3]],WebInspector.Color.Format.RGBA);}WebInspector.Color.fromHSVA = function(hsva) {    var h = hsva[0];    var s = hsva[1];    var v = hsva[2];    var t = (2 - s) * v;    if (v === 0 || s === 0)        s = 0;    else        s *= v / (t < 1 ? t : 2 - t);    var hsla = [h, s, t / 2, hsva[3]];    return new WebInspector.Color(WebInspector.Color._hsl2rgb(hsla),WebInspector.Color.Format.HSLA);}WebInspector.Color.prototype = {    format: function()     {        return this._format;    },    hsla: function()     {        if (this._hsla)            return this._hsla;        var r = this._rgba[0];        var g = this._rgba[1];        var b = this._rgba[2];        var max = Math.max(r, g, b);        var min = Math.min(r, g, b);        var diff = max - min;        var add = max + min;        if (min === max)            var h = 0;        else if (r === max)            var h = ((1 / 6 * (g - b) / diff) + 1) % 1;        else if (g === max)            var h = (1 / 6 * (b - r) / diff) + 1 / 3;        else            var h = (1 / 6 * (r - g) / diff) + 2 / 3;        var l = 0.5 * add;        if (l === 0)            var s = 0;        else if (l === 1)            var s = 1;        else if (l <= 0.5)            var s = diff / add;        else            var s = diff / (2 - add);        this._hsla = [h, s, l, this._rgba[3]];        return this._hsla;    },    canonicalHSLA: function()     {        var hsla = this.hsla();        return [Math.round(hsla[0] * 360), Math.round(hsla[1] * 100), Math.round(hsla[2] * 100), hsla[3]];    },    hsva: function()     {        var hsla = this.hsla();        var h = hsla[0];        var s = hsla[1];        var l = hsla[2];        s *= l < 0.5 ? l : 1 - l;        return [h, s !== 0 ? 2 * s / (l + s) : 0, (l + s), hsla[3]];    },    hasAlpha: function()     {        return this._rgba[3] !== 1;    },    canBeShortHex: function()     {        if (this.hasAlpha())            return false;        for (var i = 0; i < 3; ++i) {            var c = Math.round(this._rgba[i] * 255);            if (c % 17)                return false;        }        return true;    },    asString: function(format)     {        if (format === this._format && this._originalTextIsValid)            return this._originalText;        if (!format)            format = this._format;        function toRgbValue(value)         {            return Math.round(value * 255);        }        function toHexValue(value)         {            var hex = Math.round(value * 255).toString(16);            return hex.length === 1 ? "0" + hex : hex;        }        function toShortHexValue(value)         {            return (Math.round(value * 255) / 17).toString(16);        }        switch (format) {        case WebInspector.Color.Format.Original:            return this._originalText;        case WebInspector.Color.Format.RGB:            if (this.hasAlpha())                return null ;            return String.sprintf("rgb(%d, %d, %d)", toRgbValue(this._rgba[0]), toRgbValue(this._rgba[1]), toRgbValue(this._rgba[2]));        case WebInspector.Color.Format.RGBA:            return String.sprintf("rgba(%d, %d, %d, %f)", toRgbValue(this._rgba[0]), toRgbValue(this._rgba[1]), toRgbValue(this._rgba[2]), this._rgba[3]);        case WebInspector.Color.Format.HSL:            if (this.hasAlpha())                return null ;            var hsl = this.hsla();            return String.sprintf("hsl(%d, %d%, %d%)", Math.round(hsl[0] * 360), Math.round(hsl[1] * 100), Math.round(hsl[2] * 100));        case WebInspector.Color.Format.HSLA:            var hsla = this.hsla();            return String.sprintf("hsla(%d, %d%, %d%, %f)", Math.round(hsla[0] * 360), Math.round(hsla[1] * 100), Math.round(hsla[2] * 100), hsla[3]);        case WebInspector.Color.Format.HEX:            if (this.hasAlpha())                return null ;            return String.sprintf("#%s%s%s", toHexValue(this._rgba[0]), toHexValue(this._rgba[1]), toHexValue(this._rgba[2])).toUpperCase();        case WebInspector.Color.Format.ShortHEX:            if (!this.canBeShortHex())                return null ;            return String.sprintf("#%s%s%s", toShortHexValue(this._rgba[0]), toShortHexValue(this._rgba[1]), toShortHexValue(this._rgba[2])).toUpperCase();        case WebInspector.Color.Format.Nickname:            return this.nickname();        }        return this._originalText;    },    canonicalRGBA: function()     {        var rgba = new Array(4);        for (var i = 0; i < 3; ++i)            rgba[i] = Math.round(this._rgba[i] * 255);        rgba[3] = this._rgba[3];        return rgba;    },    nickname: function()     {        if (!WebInspector.Color._rgbaToNickname) {            WebInspector.Color._rgbaToNickname = {};            for (var nickname in WebInspector.Color.Nicknames) {                var rgba = WebInspector.Color.Nicknames[nickname];                if (rgba.length !== 4)                    rgba = rgba.concat(1);                WebInspector.Color._rgbaToNickname[rgba] = nickname;            }        }        return WebInspector.Color._rgbaToNickname[this.canonicalRGBA()] || null ;    },    toProtocolRGBA: function()     {        var rgba = this.canonicalRGBA();        var result = {            r: rgba[0],            g: rgba[1],            b: rgba[2]        };        if (rgba[3] !== 1)            result.a = rgba[3];        return result;    },    invert: function()     {        var rgba = [];        rgba[0] = 1 - this._rgba[0];        rgba[1] = 1 - this._rgba[1];        rgba[2] = 1 - this._rgba[2];        rgba[3] = this._rgba[3];        return new WebInspector.Color(rgba,WebInspector.Color.Format.RGBA);    },    setAlpha: function(alpha)     {        var rgba = this._rgba.slice();        rgba[3] = alpha;        return new WebInspector.Color(rgba,WebInspector.Color.Format.RGBA);    }}WebInspector.Color._parseRgbNumeric = function(value) {    var parsed = parseInt(value, 10);    if (value.indexOf("%") !== -1)        parsed /= 100;    else        parsed /= 255;    return parsed;}WebInspector.Color._parseHueNumeric = function(value) {    return isNaN(value) ? 0 : (parseFloat(value) / 360) % 1;}WebInspector.Color._parseSatLightNumeric = function(value) {    return Math.min(1, parseFloat(value) / 100);}WebInspector.Color._parseAlphaNumeric = function(value) {    return isNaN(value) ? 0 : parseFloat(value);}WebInspector.Color._hsl2rgb = function(hsl) {    var h = hsl[0];    var s = hsl[1];    var l = hsl[2];    function hue2rgb(p, q, h)     {        if (h < 0)            h += 1;        else if (h > 1)            h -= 1;        if ((h * 6) < 1)            return p + (q - p) * h * 6;        else if ((h * 2) < 1)            return q;        else if ((h * 3) < 2)            return p + (q - p) * ((2 / 3) - h) * 6;        else            return p;    }    if (s < 0)        s = 0;    if (l <= 0.5)        var q = l * (1 + s);    else        var q = l + s - (l * s);    var p = 2 * l - q;    var tr = h + (1 / 3);    var tg = h;    var tb = h - (1 / 3);    var r = hue2rgb(p, q, tr);    var g = hue2rgb(p, q, tg);    var b = hue2rgb(p, q, tb);    return [r, g, b, hsl[3]];}WebInspector.Color.Nicknames = {    "aliceblue": [240, 248, 255],    "antiquewhite": [250, 235, 215],    "aqua": [0, 255, 255],    "aquamarine": [127, 255, 212],    "azure": [240, 255, 255],    "beige": [245, 245, 220],    "bisque": [255, 228, 196],    "black": [0, 0, 0],    "blanchedalmond": [255, 235, 205],    "blue": [0, 0, 255],    "blueviolet": [138, 43, 226],    "brown": [165, 42, 42],    "burlywood": [222, 184, 135],    "cadetblue": [95, 158, 160],    "chartreuse": [127, 255, 0],    "chocolate": [210, 105, 30],    "coral": [255, 127, 80],    "cornflowerblue": [100, 149, 237],    "cornsilk": [255, 248, 220],    "crimson": [237, 20, 61],    "cyan": [0, 255, 255],    "darkblue": [0, 0, 139],    "darkcyan": [0, 139, 139],    "darkgoldenrod": [184, 134, 11],    "darkgray": [169, 169, 169],    "darkgrey": [169, 169, 169],    "darkgreen": [0, 100, 0],    "darkkhaki": [189, 183, 107],    "darkmagenta": [139, 0, 139],    "darkolivegreen": [85, 107, 47],    "darkorange": [255, 140, 0],    "darkorchid": [153, 50, 204],    "darkred": [139, 0, 0],    "darksalmon": [233, 150, 122],    "darkseagreen": [143, 188, 143],    "darkslateblue": [72, 61, 139],    "darkslategray": [47, 79, 79],    "darkslategrey": [47, 79, 79],    "darkturquoise": [0, 206, 209],    "darkviolet": [148, 0, 211],    "deeppink": [255, 20, 147],    "deepskyblue": [0, 191, 255],    "dimgray": [105, 105, 105],    "dimgrey": [105, 105, 105],    "dodgerblue": [30, 144, 255],    "firebrick": [178, 34, 34],    "floralwhite": [255, 250, 240],    "forestgreen": [34, 139, 34],    "fuchsia": [255, 0, 255],    "gainsboro": [220, 220, 220],    "ghostwhite": [248, 248, 255],    "gold": [255, 215, 0],    "goldenrod": [218, 165, 32],    "gray": [128, 128, 128],    "grey": [128, 128, 128],    "green": [0, 128, 0],    "greenyellow": [173, 255, 47],    "honeydew": [240, 255, 240],    "hotpink": [255, 105, 180],    "indianred": [205, 92, 92],    "indigo": [75, 0, 130],    "ivory": [255, 255, 240],    "khaki": [240, 230, 140],    "lavender": [230, 230, 250],    "lavenderblush": [255, 240, 245],    "lawngreen": [124, 252, 0],    "lemonchiffon": [255, 250, 205],    "lightblue": [173, 216, 230],    "lightcoral": [240, 128, 128],    "lightcyan": [224, 255, 255],    "lightgoldenrodyellow": [250, 250, 210],    "lightgreen": [144, 238, 144],    "lightgray": [211, 211, 211],    "lightgrey": [211, 211, 211],    "lightpink": [255, 182, 193],    "lightsalmon": [255, 160, 122],    "lightseagreen": [32, 178, 170],    "lightskyblue": [135, 206, 250],    "lightslategray": [119, 136, 153],    "lightslategrey": [119, 136, 153],    "lightsteelblue": [176, 196, 222],    "lightyellow": [255, 255, 224],    "lime": [0, 255, 0],    "limegreen": [50, 205, 50],    "linen": [250, 240, 230],    "magenta": [255, 0, 255],    "maroon": [128, 0, 0],    "mediumaquamarine": [102, 205, 170],    "mediumblue": [0, 0, 205],    "mediumorchid": [186, 85, 211],    "mediumpurple": [147, 112, 219],    "mediumseagreen": [60, 179, 113],    "mediumslateblue": [123, 104, 238],    "mediumspringgreen": [0, 250, 154],    "mediumturquoise": [72, 209, 204],    "mediumvioletred": [199, 21, 133],    "midnightblue": [25, 25, 112],    "mintcream": [245, 255, 250],    "mistyrose": [255, 228, 225],    "moccasin": [255, 228, 181],    "navajowhite": [255, 222, 173],    "navy": [0, 0, 128],    "oldlace": [253, 245, 230],    "olive": [128, 128, 0],    "olivedrab": [107, 142, 35],    "orange": [255, 165, 0],    "orangered": [255, 69, 0],    "orchid": [218, 112, 214],    "palegoldenrod": [238, 232, 170],    "palegreen": [152, 251, 152],    "paleturquoise": [175, 238, 238],    "palevioletred": [219, 112, 147],    "papayawhip": [255, 239, 213],    "peachpuff": [255, 218, 185],    "peru": [205, 133, 63],    "pink": [255, 192, 203],    "plum": [221, 160, 221],    "powderblue": [176, 224, 230],    "purple": [128, 0, 128],    "rebeccapurple": [102, 51, 153],    "red": [255, 0, 0],    "rosybrown": [188, 143, 143],    "royalblue": [65, 105, 225],    "saddlebrown": [139, 69, 19],    "salmon": [250, 128, 114],    "sandybrown": [244, 164, 96],    "seagreen": [46, 139, 87],    "seashell": [255, 245, 238],    "sienna": [160, 82, 45],    "silver": [192, 192, 192],    "skyblue": [135, 206, 235],    "slateblue": [106, 90, 205],    "slategray": [112, 128, 144],    "slategrey": [112, 128, 144],    "snow": [255, 250, 250],    "springgreen": [0, 255, 127],    "steelblue": [70, 130, 180],    "tan": [210, 180, 140],    "teal": [0, 128, 128],    "thistle": [216, 191, 216],    "tomato": [255, 99, 71],    "turquoise": [64, 224, 208],    "violet": [238, 130, 238],    "wheat": [245, 222, 179],    "white": [255, 255, 255],    "whitesmoke": [245, 245, 245],    "yellow": [255, 255, 0],    "yellowgreen": [154, 205, 50],    "transparent": [0, 0, 0, 0],};WebInspector.Color.PageHighlight = {    Content: WebInspector.Color.fromRGBA([111, 168, 220, .66]),    ContentLight: WebInspector.Color.fromRGBA([111, 168, 220, .5]),    ContentOutline: WebInspector.Color.fromRGBA([9, 83, 148]),    Padding: WebInspector.Color.fromRGBA([147, 196, 125, .55]),    PaddingLight: WebInspector.Color.fromRGBA([147, 196, 125, .4]),    Border: WebInspector.Color.fromRGBA([255, 229, 153, .66]),    BorderLight: WebInspector.Color.fromRGBA([255, 229, 153, .5]),    Margin: WebInspector.Color.fromRGBA([246, 178, 107, .66]),    MarginLight: WebInspector.Color.fromRGBA([246, 178, 107, .5]),    EventTarget: WebInspector.Color.fromRGBA([255, 196, 196, .66]),    Shape: WebInspector.Color.fromRGBA([96, 82, 177, 0.8]),    ShapeMargin: WebInspector.Color.fromRGBA([96, 82, 127, .6])};WebInspector.Geometry = {};WebInspector.Geometry._Eps = 1e-5;WebInspector.Geometry.Vector = function(x, y, z) {    this.x = x;    this.y = y;    this.z = z;}WebInspector.Geometry.Vector.prototype = {    length: function()     {        return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z);    },    normalize: function()     {        var length = this.length();        if (length <= WebInspector.Geometry._Eps)            return;        this.x /= length;        this.y /= length;        this.z /= length;    }}WebInspector.Geometry.Point = function(x, y) {    this.x = x;    this.y = y;}WebInspector.Geometry.Point.prototype = {    distanceTo: function(p)     {        return Math.sqrt(Math.pow(p.x - this.x, 2) + Math.pow(p.y - this.y, 2));    },    toString: function()     {        return Math.round(this.x * 100) / 100 + ", " + Math.round(this.y * 100) / 100;    }}WebInspector.Geometry.CubicBezier = function(point1, point2) {    this.controlPoints = [point1, point2];}WebInspector.Geometry.CubicBezier.KeywordValues = {    "linear": "cubic-bezier(0, 0, 1, 1)",    "ease": "cubic-bezier(0.25, 0.1, 0.25, 1)",    "ease-in": "cubic-bezier(0.42, 0, 1, 1)",    "ease-in-out": "cubic-bezier(0.42, 0, 0.58, 1)",    "ease-out": "cubic-bezier(0, 0, 0.58, 1)"}WebInspector.Geometry.CubicBezier.parse = function(text) {    var keywordValues = WebInspector.Geometry.CubicBezier.KeywordValues;    var value = text.toLowerCase().replace(/\s+/g, "");    if (Object.keys(keywordValues).indexOf(value) != -1)        return WebInspector.Geometry.CubicBezier.parse(keywordValues[value]);    var bezierRegex = /^cubic-bezier\(([^,]+),([^,]+),([^,]+),([^,]+)\)$/;    var match = value.match(bezierRegex);    if (match) {        var control1 = new WebInspector.Geometry.Point(parseFloat(match[1]),parseFloat(match[2]));        var control2 = new WebInspector.Geometry.Point(parseFloat(match[3]),parseFloat(match[4]));        return new WebInspector.Geometry.CubicBezier(control1,control2);    }    return null ;}WebInspector.Geometry.CubicBezier.prototype = {    evaluateAt: function(t)     {        function evaluate(v1, v2, t)         {            return 3 * (1 - t) * (1 - t) * t * v1 + 3 * (1 - t) * t * t * v2 + Math.pow(t, 3);        }        var x = evaluate(this.controlPoints[0].x, this.controlPoints[1].x, t);        var y = evaluate(this.controlPoints[0].y, this.controlPoints[1].y, t);        return new WebInspector.Geometry.Point(x,y);    },    asCSSText: function()     {        var raw = "cubic-bezier(" + this.controlPoints.join(", ") + ")";        var keywordValues = WebInspector.Geometry.CubicBezier.KeywordValues;        for (var keyword in keywordValues) {            if (raw === keywordValues[keyword])                return keyword;        }        return raw;    }}WebInspector.Geometry.EulerAngles = function(alpha, beta, gamma) {    this.alpha = alpha;    this.beta = beta;    this.gamma = gamma;}WebInspector.Geometry.EulerAngles.fromRotationMatrix = function(rotationMatrix) {    var beta = Math.atan2(rotationMatrix.m23, rotationMatrix.m33);    var gamma = Math.atan2(-rotationMatrix.m13, Math.sqrt(rotationMatrix.m11 * rotationMatrix.m11 + rotationMatrix.m12 * rotationMatrix.m12));    var alpha = Math.atan2(rotationMatrix.m12, rotationMatrix.m11);    return new WebInspector.Geometry.EulerAngles(WebInspector.Geometry.radToDeg(alpha),WebInspector.Geometry.radToDeg(beta),WebInspector.Geometry.radToDeg(gamma));}WebInspector.Geometry.scalarProduct = function(u, v) {    return u.x * v.x + u.y * v.y + u.z * v.z;}WebInspector.Geometry.crossProduct = function(u, v) {    var x = u.y * v.z - u.z * v.y;    var y = u.z * v.x - u.x * v.z;    var z = u.x * v.y - u.y * v.x;    return new WebInspector.Geometry.Vector(x,y,z);}WebInspector.Geometry.subtract = function(u, v) {    var x = u.x - v.x;    var y = u.y - v.y;    var z = u.z - v.z;    return new WebInspector.Geometry.Vector(x,y,z);}WebInspector.Geometry.multiplyVectorByMatrixAndNormalize = function(v, m) {    var t = v.x * m.m14 + v.y * m.m24 + v.z * m.m34 + m.m44;    var x = (v.x * m.m11 + v.y * m.m21 + v.z * m.m31 + m.m41) / t;    var y = (v.x * m.m12 + v.y * m.m22 + v.z * m.m32 + m.m42) / t;    var z = (v.x * m.m13 + v.y * m.m23 + v.z * m.m33 + m.m43) / t;    return new WebInspector.Geometry.Vector(x,y,z);}WebInspector.Geometry.calculateAngle = function(u, v) {    var uLength = u.length();    var vLength = v.length();    if (uLength <= WebInspector.Geometry._Eps || vLength <= WebInspector.Geometry._Eps)        return 0;    var cos = WebInspector.Geometry.scalarProduct(u, v) / uLength / vLength;    if (Math.abs(cos) > 1)        return 0;    return WebInspector.Geometry.radToDeg(Math.acos(cos));}WebInspector.Geometry.radToDeg = function(rad) {    return rad * 180 / Math.PI;}WebInspector.Geometry.boundsForTransformedPoints = function(matrix, points, aggregateBounds) {    if (!aggregateBounds)        aggregateBounds = {            minX: Infinity,            maxX: -Infinity,            minY: Infinity,            maxY: -Infinity        };    if (points.length % 3)        console.assert("Invalid size of points array");    for (var p = 0; p < points.length; p += 3) {        var vector = new WebInspector.Geometry.Vector(points[p],points[p + 1],points[p + 2]);        vector = WebInspector.Geometry.multiplyVectorByMatrixAndNormalize(vector, matrix);        aggregateBounds.minX = Math.min(aggregateBounds.minX, vector.x);        aggregateBounds.maxX = Math.max(aggregateBounds.maxX, vector.x);        aggregateBounds.minY = Math.min(aggregateBounds.minY, vector.y);        aggregateBounds.maxY = Math.max(aggregateBounds.maxY, vector.y);    }    return aggregateBounds;}function Size(width, height) {    this.width = width;    this.height = height;}Size.prototype.isEqual = function(size) {    return !!size && this.width === size.width && this.height === size.height;};Size.prototype.widthToMax = function(size) {    return new Size(Math.max(this.width, (typeof size === "number" ? size : size.width)),this.height);};Size.prototype.addWidth = function(size) {    return new Size(this.width + (typeof size === "number" ? size : size.width),this.height);};Size.prototype.heightToMax = function(size) {    return new Size(this.width,Math.max(this.height, (typeof size === "number" ? size : size.height)));};Size.prototype.addHeight = function(size) {    return new Size(this.width,this.height + (typeof size === "number" ? size : size.height));};function Insets(left, top, right, bottom) {    this.left = left;    this.top = top;    this.right = right;    this.bottom = bottom;}Insets.prototype = {    isEqual: function(insets)     {        return !!insets && this.left === insets.left && this.top === insets.top && this.right == insets.right && this.bottom == insets.bottom;    }}function Constraints(minimum, preferred) {    this.minimum = minimum || new Size(0,0);    this.preferred = preferred || this.minimum;    if (this.minimum.width > this.preferred.width || this.minimum.height > this.preferred.height)        throw new Error("Minimum size is greater than preferred.");}Constraints.prototype.isEqual = function(constraints) {    return !!constraints && this.minimum.isEqual(constraints.minimum) && this.preferred.isEqual(constraints.preferred);}Constraints.prototype.widthToMax = function(value) {    if (typeof value === "number")        return new Constraints(this.minimum.widthToMax(value),this.preferred.widthToMax(value));    return new Constraints(this.minimum.widthToMax(value.minimum),this.preferred.widthToMax(value.preferred));}Constraints.prototype.addWidth = function(value) {    if (typeof value === "number")        return new Constraints(this.minimum.addWidth(value),this.preferred.addWidth(value));    return new Constraints(this.minimum.addWidth(value.minimum),this.preferred.addWidth(value.preferred));}Constraints.prototype.heightToMax = function(value) {    if (typeof value === "number")        return new Constraints(this.minimum.heightToMax(value),this.preferred.heightToMax(value));    return new Constraints(this.minimum.heightToMax(value.minimum),this.preferred.heightToMax(value.preferred));}Constraints.prototype.addHeight = function(value) {    if (typeof value === "number")        return new Constraints(this.minimum.addHeight(value),this.preferred.addHeight(value));    return new Constraints(this.minimum.addHeight(value.minimum),this.preferred.addHeight(value.preferred));};WebInspector.Console = function() {    this._messages = [];}WebInspector.Console.Events = {    MessageAdded: "messageAdded"}WebInspector.Console.MessageLevel = {    Log: "log",    Warning: "warning",    Error: "error"}WebInspector.Console.Message = function(text, level, timestamp, show) {    this.text = text;    this.level = level;    this.timestamp = (typeof timestamp === "number") ? timestamp : Date.now();    this.show = show;}WebInspector.Console.UIDelegate = function() {}WebInspector.Console.UIDelegate.prototype = {    showConsole: function() {}}WebInspector.Console.prototype = {    setUIDelegate: function(uiDelegate)     {        this._uiDelegate = uiDelegate;    },    addMessage: function(text, level, show)     {        var message = new WebInspector.Console.Message(text,level || WebInspector.Console.MessageLevel.Log,Date.now(),show || false);        this._messages.push(message);        this.dispatchEventToListeners(WebInspector.Console.Events.MessageAdded, message);    },    log: function(text)     {        this.addMessage(text, WebInspector.Console.MessageLevel.Log);    },    warn: function(text)     {        this.addMessage(text, WebInspector.Console.MessageLevel.Warning);    },    error: function(text)     {        this.addMessage(text, WebInspector.Console.MessageLevel.Error, true);    },    messages: function()     {        return this._messages;    },    show: function()     {        this.showPromise();    },    showPromise: function()     {        if (this._uiDelegate)            return this._uiDelegate.showConsole();        return Promise.reject();    },    __proto__: WebInspector.Object.prototype}WebInspector.console = new WebInspector.Console();;WebInspector.ContentProvider = function() {}WebInspector.ContentProvider.prototype = {    contentURL: function() {},    contentType: function() {},    requestContent: function(callback) {},    searchInContent: function(query, caseSensitive, isRegex, callback) {}}WebInspector.ContentProvider.SearchMatch = function(lineNumber, lineContent) {    this.lineNumber = lineNumber;    this.lineContent = lineContent;}WebInspector.ContentProvider.performSearchInContent = function(content, query, caseSensitive, isRegex) {    var regex = createSearchRegex(query, caseSensitive, isRegex);    var contentString = new String(content);    var result = [];    for (var i = 0; i < contentString.lineCount(); ++i) {        var lineContent = contentString.lineAt(i);        regex.lastIndex = 0;        if (regex.exec(lineContent))            result.push(new WebInspector.ContentProvider.SearchMatch(i,lineContent));    }    return result;};WebInspector.ParsedURL = function(url) {    this.isValid = false;    this.url = url;    this.scheme = "";    this.host = "";    this.port = "";    this.path = "";    this.queryParams = "";    this.fragment = "";    this.folderPathComponents = "";    this.lastPathComponent = "";    var match = url.match(/^([A-Za-z][A-Za-z0-9+.-]*):\/\/([^\s\/:]*)(?::([\d]+))?(?:(\/[^#]*)(?:#(.*))?)?$/i);    if (match) {        this.isValid = true;        this.scheme = match[1].toLowerCase();        this.host = match[2];        this.port = match[3];        this.path = match[4] || "/";        this.fragment = match[5];    } else {        if (this.url.startsWith("data:")) {            this.scheme = "data";            return;        }        if (this.url === "about:blank") {            this.scheme = "about";            return;        }        this.path = this.url;    }    var path = this.path;    var indexOfQuery = path.indexOf("?");    if (indexOfQuery !== -1) {        this.queryParams = path.substring(indexOfQuery + 1);        path = path.substring(0, indexOfQuery);    }    var lastSlashIndex = path.lastIndexOf("/");    if (lastSlashIndex !== -1) {        this.folderPathComponents = path.substring(0, lastSlashIndex);        this.lastPathComponent = path.substring(lastSlashIndex + 1);    } else        this.lastPathComponent = path;}WebInspector.ParsedURL._decodeIfPossible = function(url) {    var decodedURL = url;    try {        decodedURL = decodeURI(url);    } catch (e) {}    return decodedURL;}WebInspector.ParsedURL.splitURLIntoPathComponents = function(url) {    var decodedURL = WebInspector.ParsedURL._decodeIfPossible(url);    var parsedURL = new WebInspector.ParsedURL(decodedURL);    var origin;    var folderPath;    var name;    if (parsedURL.isValid) {        origin = parsedURL.scheme + "://" + parsedURL.host;        if (parsedURL.port)            origin += ":" + parsedURL.port;        folderPath = parsedURL.folderPathComponents;        name = parsedURL.lastPathComponent;        if (parsedURL.queryParams)            name += "?" + parsedURL.queryParams;    } else {        origin = "";        folderPath = "";        name = url;    }    var result = [origin];    var splittedPath = folderPath.split("/");    for (var i = 1; i < splittedPath.length; ++i) {        if (!splittedPath[i])            continue;result.push(splittedPath[i]);    }    result.push(name);    return result;}WebInspector.ParsedURL.completeURL = function(baseURL, href) {    if (href) {        var trimmedHref = href.trim();        if (trimmedHref.startsWith("data:") || trimmedHref.startsWith("blob:") || trimmedHref.startsWith("javascript:"))            return href;        var parsedHref = trimmedHref.asParsedURL();        if (parsedHref && parsedHref.scheme)            return trimmedHref;    } else {        return baseURL;    }    var parsedURL = baseURL.asParsedURL();    if (parsedURL) {        if (parsedURL.isDataURL())            return href;        var path = href;        var query = path.indexOf("?");        var postfix = "";        if (query !== -1) {            postfix = path.substring(query);            path = path.substring(0, query);        } else {            var fragment = path.indexOf("#");            if (fragment !== -1) {                postfix = path.substring(fragment);                path = path.substring(0, fragment);            }        }        if (!path) {            var basePath = parsedURL.path;            if (postfix.charAt(0) === "?") {                var baseQuery = parsedURL.path.indexOf("?");                if (baseQuery !== -1)                    basePath = basePath.substring(0, baseQuery);            }            return parsedURL.scheme + "://" + parsedURL.host + (parsedURL.port ? (":" + parsedURL.port) : "") + basePath + postfix;        } else if (path.charAt(0) !== "/") {            var prefix = parsedURL.path;            var prefixQuery = prefix.indexOf("?");            if (prefixQuery !== -1)                prefix = prefix.substring(0, prefixQuery);            prefix = prefix.substring(0, prefix.lastIndexOf("/")) + "/";            path = prefix + path;        } else if (path.length > 1 && path.charAt(1) === "/") {            return parsedURL.scheme + ":" + path + postfix;        }        return parsedURL.scheme + "://" + parsedURL.host + (parsedURL.port ? (":" + parsedURL.port) : "") + normalizePath(path) + postfix;    }    return null ;}WebInspector.ParsedURL.prototype = {    get displayName()     {        if (this._displayName)            return this._displayName;        if (this.isDataURL())            return this.dataURLDisplayName();        if (this.isAboutBlank())            return this.url;        this._displayName = this.lastPathComponent;        if (!this._displayName)            this._displayName = (this.host || "") + "/";        if (this._displayName === "/")            this._displayName = this.url;        return this._displayName;    },    dataURLDisplayName: function()     {        if (this._dataURLDisplayName)            return this._dataURLDisplayName;        if (!this.isDataURL())            return "";        this._dataURLDisplayName = this.url.trimEnd(20);        return this._dataURLDisplayName;    },    isAboutBlank: function()     {        return this.url === "about:blank";    },    isDataURL: function()     {        return this.scheme === "data";    },    lastPathComponentWithFragment: function()     {        return this.lastPathComponent + (this.fragment ? "#" + this.fragment : "");    }}WebInspector.ParsedURL.splitLineAndColumn = function(string) {    var lineColumnRegEx = /(?::(\d+))?(?::(\d+))?$/;    var lineColumnMatch = lineColumnRegEx.exec(string);    var lineNumber;    var columnNumber;    console.assert(lineColumnMatch);    if (typeof (lineColumnMatch[1]) === "string") {        lineNumber = parseInt(lineColumnMatch[1], 10);        lineNumber = isNaN(lineNumber) ? undefined : lineNumber - 1;    }    if (typeof (lineColumnMatch[2]) === "string") {        columnNumber = parseInt(lineColumnMatch[2], 10);        columnNumber = isNaN(columnNumber) ? undefined : columnNumber - 1;    }    return {        url: string.substring(0, string.length - lineColumnMatch[0].length),        lineNumber: lineNumber,        columnNumber: columnNumber    };}String.prototype.asParsedURL = function() {    var parsedURL = new WebInspector.ParsedURL(this.toString());    if (parsedURL.isValid)        return parsedURL;    return null ;};WebInspector.Progress = function() {}WebInspector.Progress.prototype = {    setTotalWork: function(totalWork) {},    setTitle: function(title) {},    setWorked: function(worked, title) {},    worked: function(worked) {},    done: function() {},    isCanceled: function() {        return false;    },}WebInspector.CompositeProgress = function(parent) {    this._parent = parent;    this._children = [];    this._childrenDone = 0;    this._parent.setTotalWork(1);    this._parent.setWorked(0);}WebInspector.CompositeProgress.prototype = {    _childDone: function()     {        if (++this._childrenDone !== this._children.length)            return;        this._parent.done();    },    createSubProgress: function(weight)     {        var child = new WebInspector.SubProgress(this,weight);        this._children.push(child);        return child;    },    _update: function()     {        var totalWeights = 0;        var done = 0;        for (var i = 0; i < this._children.length; ++i) {            var child = this._children[i];            if (child._totalWork)                done += child._weight * child._worked / child._totalWork;            totalWeights += child._weight;        }        this._parent.setWorked(done / totalWeights);    }}WebInspector.SubProgress = function(composite, weight) {    this._composite = composite;    this._weight = weight || 1;    this._worked = 0;}WebInspector.SubProgress.prototype = {    isCanceled: function()     {        return this._composite._parent.isCanceled();    },    setTitle: function(title)     {        this._composite._parent.setTitle(title);    },    done: function()     {        this.setWorked(this._totalWork);        this._composite._childDone();    },    setTotalWork: function(totalWork)     {        this._totalWork = totalWork;        this._composite._update();    },    setWorked: function(worked, title)     {        this._worked = worked;        if (typeof title !== "undefined")            this.setTitle(title);        this._composite._update();    },    worked: function(worked)     {        this.setWorked(this._worked + (worked || 1));    }}WebInspector.ProgressProxy = function(delegate, doneCallback) {    this._delegate = delegate;    this._doneCallback = doneCallback;}WebInspector.ProgressProxy.prototype = {    isCanceled: function()     {        return this._delegate ? this._delegate.isCanceled() : false;    },    setTitle: function(title)     {        if (this._delegate)            this._delegate.setTitle(title);    },    done: function()     {        if (this._delegate)            this._delegate.done();        if (this._doneCallback)            this._doneCallback();    },    setTotalWork: function(totalWork)     {        if (this._delegate)            this._delegate.setTotalWork(totalWork);    },    setWorked: function(worked, title)     {        if (this._delegate)            this._delegate.setWorked(worked, title);    },    worked: function(worked)     {        if (this._delegate)            this._delegate.worked(worked);    }};WebInspector.ResourceType = function(name, title, categoryTitle, shortCategoryTitle, color, isTextType) {    this._name = name;    this._title = title;    this._categoryTitle = categoryTitle;    this._shortCategoryTitle = shortCategoryTitle;    this._color = color;    this._isTextType = isTextType;}WebInspector.ResourceType.prototype = {    name: function()     {        return this._name;    },    title: function()     {        return this._title;    },    categoryTitle: function()     {        return this._categoryTitle;    },    shortCategoryTitle: function()     {        return this._shortCategoryTitle;    },    color: function()     {        return this._color;    },    isTextType: function()     {        return this._isTextType;    },    toString: function()     {        return this._name;    },    canonicalMimeType: function()     {        if (this === WebInspector.resourceTypes.Document)            return "text/html";        if (this === WebInspector.resourceTypes.Script)            return "text/javascript";        if (this === WebInspector.resourceTypes.Stylesheet)            return "text/css";        return "";    }}WebInspector.resourceTypes = {    XHR: new WebInspector.ResourceType("xhr","XHR","XHR","XHR","rgb(231,231,10)",true),    Script: new WebInspector.ResourceType("script","Script","Scripts","JS","rgb(255,121,0)",true),    Stylesheet: new WebInspector.ResourceType("stylesheet","Stylesheet","Stylesheets","CSS","rgb(157,231,119)",true),    Image: new WebInspector.ResourceType("image","Image","Images","Img","rgb(164,60,255)",false),    Media: new WebInspector.ResourceType("media","Media","Media","Media","rgb(164,60,255)",false),    Font: new WebInspector.ResourceType("font","Font","Fonts","Font","rgb(255,82,62)",false),    Document: new WebInspector.ResourceType("document","Document","Documents","Doc","rgb(47,102,236)",true),    TextTrack: new WebInspector.ResourceType("texttrack","TextTrack","TextTracks","TextTracks","rgb(164,60,255)",true),    WebSocket: new WebInspector.ResourceType("websocket","WebSocket","WebSockets","WS","rgb(186,186,186)",false),    Other: new WebInspector.ResourceType("other","Other","Other","Other","rgb(186,186,186)",false)}WebInspector.ResourceType.mimeTypesForExtensions = {    "js": "text/javascript",    "css": "text/css",    "html": "text/html",    "htm": "text/html",    "xml": "application/xml",    "xsl": "application/xml",    "asp": "application/x-aspx",    "aspx": "application/x-aspx",    "jsp": "application/x-jsp",    "c": "text/x-c++src",    "cc": "text/x-c++src",    "cpp": "text/x-c++src",    "h": "text/x-c++src",    "m": "text/x-c++src",    "mm": "text/x-c++src",    "coffee": "text/x-coffeescript",    "dart": "text/javascript",    "ts": "text/typescript",    "json": "application/json",    "gyp": "application/json",    "gypi": "application/json",    "cs": "text/x-csharp",    "java": "text/x-java",    "less": "text/x-less",    "php": "text/x-php",    "phtml": "application/x-httpd-php",    "py": "text/x-python",    "sh": "text/x-sh",    "scss": "text/x-scss",    "vtt": "text/vtt",    "ls": "text/x-livescript",    "cljs": "text/x-clojure",    "cljc": "text/x-clojure",    "cljx": "text/x-clojure"};WebInspector.Settings = function(prefs) {    this._settingsStorage = prefs;    this._eventSupport = new WebInspector.Object();    this._registry = new Map();    this._moduleSettings = new Map();    self.runtime.extensions("setting").forEach(this._registerModuleSetting.bind(this));}WebInspector.Settings.prototype = {    _registerModuleSetting: function(extension)     {        var descriptor = extension.descriptor();        var settingName = descriptor["settingName"];        var settingType = descriptor["settingType"];        var defaultValue = descriptor["defaultValue"];        var isLocal = !!descriptor["local"];        var setting = settingType === "regex" ? this.createRegExpSetting(settingName, defaultValue, undefined, isLocal) : this.createSetting(settingName, defaultValue, isLocal);        this._moduleSettings.set(settingName, setting);    },    moduleSetting: function(settingName)     {        var setting = this._moduleSettings.get(settingName);        if (!setting)            throw new Error("No setting registered: " + settingName);        return setting;    },    settingForTest: function(settingName)     {        var setting = this._registry.get(settingName);        if (!setting)            throw new Error("No setting registered: " + settingName);        return setting;    },    createSetting: function(key, defaultValue, isLocal)     {        if (!this._registry.get(key))            this._registry.set(key, new WebInspector.Setting(this,key,defaultValue,this._eventSupport,isLocal ? (window.localStorage || {}) : this._settingsStorage));        return ( this._registry.get(key)) ;    },    createLocalSetting: function(key, defaultValue)     {        return this.createSetting(key, defaultValue, true);    },    createRegExpSetting: function(key, defaultValue, regexFlags, isLocal)     {        if (!this._registry.get(key))            this._registry.set(key, new WebInspector.RegExpSetting(this,key,defaultValue,this._eventSupport,isLocal ? (window.localStorage || {}) : this._settingsStorage,regexFlags));        return ( this._registry.get(key)) ;    },    clearAll: function()     {        if (window.localStorage)            window.localStorage.clear();        for (var key in this._settingsStorage)            delete this._settingsStorage[key];        var versionSetting = WebInspector.settings.createSetting(WebInspector.VersionController._currentVersionName, 0);        versionSetting.set(WebInspector.VersionController.currentVersion);    }}WebInspector.Setting = function(settings, name, defaultValue, eventSupport, storage) {    this._settings = settings;    this._name = name;    this._defaultValue = defaultValue;    this._eventSupport = eventSupport;    this._storage = storage;}WebInspector.Setting.prototype = {    addChangeListener: function(listener, thisObject)     {        this._eventSupport.addEventListener(this._name, listener, thisObject);    },    removeChangeListener: function(listener, thisObject)     {        this._eventSupport.removeEventListener(this._name, listener, thisObject);    },    get name()     {        return this._name;    },    get: function()     {        if (typeof this._value !== "undefined")            return this._value;        this._value = this._defaultValue;        if (this._name in this._storage) {            try {                this._value = JSON.parse(this._storage[this._name]);            } catch (e) {                this.remove();            }        }        return this._value;    },    set: function(value)     {        this._value = value;        try {            var settingString = JSON.stringify(value);            try {                this._storage[this._name] = settingString;            } catch (e) {                this._printSettingsSavingError(e.message, this._name, settingString);            }        } catch (e) {            WebInspector.console.error("Cannot stringify setting with name: " + this._name + ", error: " + e.message);        }        this._eventSupport.dispatchEventToListeners(this._name, value);    },    remove: function()     {        this._settings._registry.delete(this._name);        this._settings._moduleSettings.delete(this._name);        delete this._storage[this._name];    },    _printSettingsSavingError: function(message, name, value)     {        var errorMessage = "Error saving setting with name: " + this._name + ", value length: " + value.length + ". Error: " + message;        console.error(errorMessage);        WebInspector.console.error(errorMessage);        WebInspector.console.log("Ten largest settings: ");        var sizes = {            __proto__: null         };        for (var key in this._storage)            sizes[key] = this._storage[key].length;        var keys = Object.keys(sizes);        function comparator(key1, key2)         {            return sizes[key2] - sizes[key1];        }        keys.sort(comparator);        for (var i = 0; i < 10 && i < keys.length; ++i)            WebInspector.console.log("Setting: '" + keys[i] + "', size: " + sizes[keys[i]]);    }}WebInspector.RegExpSetting = function(settings, name, defaultValue, eventSupport, storage, regexFlags) {    WebInspector.Setting.call(this, settings, name, defaultValue ? [{        pattern: defaultValue    }] : [], eventSupport, storage);    this._regexFlags = regexFlags;}WebInspector.RegExpSetting.prototype = {    get: function()     {        var result = [];        var items = this.getAsArray();        for (var i = 0; i < items.length; ++i) {            var item = items[i];            if (item.pattern && !item.disabled)                result.push(item.pattern);        }        return result.join("|");    },    getAsArray: function()     {        return WebInspector.Setting.prototype.get.call(this);    },    set: function(value)     {        this.setAsArray([{            pattern: value        }]);    },    setAsArray: function(value)     {        delete this._regex;        WebInspector.Setting.prototype.set.call(this, value);    },    asRegExp: function()     {        if (typeof this._regex !== "undefined")            return this._regex;        this._regex = null ;        try {            var pattern = this.get();            if (pattern)                this._regex = new RegExp(pattern,this._regexFlags || "");        } catch (e) {}        return this._regex;    },    __proto__: WebInspector.Setting.prototype}WebInspector.VersionController = function() {}WebInspector.VersionController._currentVersionName = "inspectorVersion";WebInspector.VersionController.currentVersion = 14;WebInspector.VersionController.prototype = {    updateVersion: function()     {        var localStorageVersion = window.localStorage ? window.localStorage[WebInspector.VersionController._currentVersionName] : 0;        var versionSetting = WebInspector.settings.createSetting(WebInspector.VersionController._currentVersionName, 0);        var currentVersion = WebInspector.VersionController.currentVersion;        var oldVersion = parseInt(localStorageVersion || "0", 10) || versionSetting.get();        if (oldVersion === 0) {            versionSetting.set(currentVersion);            return;        }        var methodsToRun = this._methodsToRunToUpdateVersion(oldVersion, currentVersion);        for (var i = 0; i < methodsToRun.length; ++i)            this[methodsToRun[i]].call(this);        versionSetting.set(currentVersion);    },    _methodsToRunToUpdateVersion: function(oldVersion, currentVersion)     {        var result = [];        for (var i = oldVersion; i < currentVersion; ++i)            result.push("_updateVersionFrom" + i + "To" + (i + 1));        return result;    },    _updateVersionFrom0To1: function()     {        this._clearBreakpointsWhenTooMany(WebInspector.settings.createLocalSetting("breakpoints", []), 500000);    },    _updateVersionFrom1To2: function()     {        WebInspector.settings.createSetting("previouslyViewedFiles", []).set([]);    },    _updateVersionFrom2To3: function()     {        WebInspector.settings.createSetting("fileSystemMapping", {}).set({});        WebInspector.settings.createSetting("fileMappingEntries", []).remove();    },    _updateVersionFrom3To4: function()     {        var advancedMode = WebInspector.settings.createSetting("showHeaSnapshotObjectsHiddenProperties", false);        WebInspector.moduleSetting("showAdvancedHeapSnapshotProperties").set(advancedMode.get());        advancedMode.remove();    },    _updateVersionFrom4To5: function()     {        var settingNames = {            "FileSystemViewSidebarWidth": "fileSystemViewSplitViewState",            "elementsSidebarWidth": "elementsPanelSplitViewState",            "StylesPaneSplitRatio": "stylesPaneSplitViewState",            "heapSnapshotRetainersViewSize": "heapSnapshotSplitViewState",            "InspectorView.splitView": "InspectorView.splitViewState",            "InspectorView.screencastSplitView": "InspectorView.screencastSplitViewState",            "Inspector.drawerSplitView": "Inspector.drawerSplitViewState",            "layerDetailsSplitView": "layerDetailsSplitViewState",            "networkSidebarWidth": "networkPanelSplitViewState",            "sourcesSidebarWidth": "sourcesPanelSplitViewState",            "scriptsPanelNavigatorSidebarWidth": "sourcesPanelNavigatorSplitViewState",            "sourcesPanelSplitSidebarRatio": "sourcesPanelDebuggerSidebarSplitViewState",            "timeline-details": "timelinePanelDetailsSplitViewState",            "timeline-split": "timelinePanelRecorsSplitViewState",            "timeline-view": "timelinePanelTimelineStackSplitViewState",            "auditsSidebarWidth": "auditsPanelSplitViewState",            "layersSidebarWidth": "layersPanelSplitViewState",            "profilesSidebarWidth": "profilesPanelSplitViewState",            "resourcesSidebarWidth": "resourcesPanelSplitViewState"        };        var empty = {};        for (var oldName in settingNames) {            var newName = settingNames[oldName];            var oldNameH = oldName + "H";            var newValue = null ;            var oldSetting = WebInspector.settings.createSetting(oldName, empty);            if (oldSetting.get() !== empty) {                newValue = newValue || {};                newValue.vertical = {};                newValue.vertical.size = oldSetting.get();                oldSetting.remove();            }            var oldSettingH = WebInspector.settings.createSetting(oldNameH, empty);            if (oldSettingH.get() !== empty) {                newValue = newValue || {};                newValue.horizontal = {};                newValue.horizontal.size = oldSettingH.get();                oldSettingH.remove();            }            if (newValue)                WebInspector.settings.createSetting(newName, {}).set(newValue);        }    },    _updateVersionFrom5To6: function()     {        var settingNames = {            "debuggerSidebarHidden": "sourcesPanelSplitViewState",            "navigatorHidden": "sourcesPanelNavigatorSplitViewState",            "WebInspector.Drawer.showOnLoad": "Inspector.drawerSplitViewState"        };        for (var oldName in settingNames) {            var oldSetting = WebInspector.settings.createSetting(oldName, null );            if (oldSetting.get() === null ) {                oldSetting.remove();                continue;            }            var newName = settingNames[oldName];            var invert = "WebInspector.Drawer.showOnLoad" === oldName;            var hidden = oldSetting.get() !== invert;            oldSetting.remove();            var showMode = hidden ? "OnlyMain" : "Both";            var newSetting = WebInspector.settings.createSetting(newName, {});            var newValue = newSetting.get() || {};            newValue.vertical = newValue.vertical || {};            newValue.vertical.showMode = showMode;            newValue.horizontal = newValue.horizontal || {};            newValue.horizontal.showMode = showMode;            newSetting.set(newValue);        }    },    _updateVersionFrom6To7: function()     {        var settingNames = {            "sourcesPanelNavigatorSplitViewState": "sourcesPanelNavigatorSplitViewState",            "elementsPanelSplitViewState": "elementsPanelSplitViewState",            "stylesPaneSplitViewState": "stylesPaneSplitViewState",            "sourcesPanelDebuggerSidebarSplitViewState": "sourcesPanelDebuggerSidebarSplitViewState"        };        var empty = {};        for (var name in settingNames) {            var setting = WebInspector.settings.createSetting(name, empty);            var value = setting.get();            if (value === empty)                continue;if (value.vertical && value.vertical.size && value.vertical.size < 1)                value.vertical.size = 0;            if (value.horizontal && value.horizontal.size && value.horizontal.size < 1)                value.horizontal.size = 0;            setting.set(value);        }    },    _updateVersionFrom7To8: function()     {},    _updateVersionFrom8To9: function()     {        var settingNames = ["skipStackFramesPattern", "workspaceFolderExcludePattern"];        for (var i = 0; i < settingNames.length; ++i) {            var setting = WebInspector.settings.createSetting(settingNames[i], "");            var value = setting.get();            if (!value)                return;            if (typeof value === "string")                value = [value];            for (var j = 0; j < value.length; ++j) {                if (typeof value[j] === "string")                    value[j] = {                        pattern: value[j]                    };            }            setting.set(value);        }    },    _updateVersionFrom9To10: function()     {        if (!window.localStorage)            return;        for (var key in window.localStorage) {            if (key.startsWith("revision-history"))                window.localStorage.removeItem(key);        }    },    _updateVersionFrom10To11: function()     {        var oldSettingName = "customDevicePresets";        var newSettingName = "customEmulatedDeviceList";        var oldSetting = WebInspector.settings.createSetting(oldSettingName, undefined);        var list = oldSetting.get();        if (!Array.isArray(list))            return;        var newList = [];        for (var i = 0; i < list.length; ++i) {            var value = list[i];            var device = {};            device["title"] = value["title"];            device["type"] = "unknown";            device["user-agent"] = value["userAgent"];            device["capabilities"] = [];            if (value["touch"])                device["capabilities"].push("touch");            if (value["mobile"])                device["capabilities"].push("mobile");            device["screen"] = {};            device["screen"]["vertical"] = {                width: value["width"],                height: value["height"]            };            device["screen"]["horizontal"] = {                width: value["height"],                height: value["width"]            };            device["screen"]["device-pixel-ratio"] = value["deviceScaleFactor"];            device["modes"] = [];            device["show-by-default"] = true;            device["show"] = "Default";            newList.push(device);        }        if (newList.length)            WebInspector.settings.createSetting(newSettingName, []).set(newList);        oldSetting.remove();    },    _updateVersionFrom11To12: function()     {        this._migrateSettingsFromLocalStorage();    },    _updateVersionFrom12To13: function()     {        this._migrateSettingsFromLocalStorage();        WebInspector.settings.createSetting("timelineOverviewMode", "").remove();    },    _updateVersionFrom13To14: function()     {        var defaultValue = {            "throughput": -1,            "latency": 0        };        WebInspector.settings.createSetting("networkConditions", defaultValue).set(defaultValue);    },    _migrateSettingsFromLocalStorage: function()     {        var localSettings = ["advancedSearchConfig", "breakpoints", "consoleHistory", "domBreakpoints", "eventListenerBreakpoints", "fileSystemMapping", "lastSelectedSourcesSidebarPaneTab", "previouslyViewedFiles", "savedURLs", "watchExpressions", "workspaceExcludedFolders", "xhrBreakpoints"].keySet();        if (!window.localStorage)            return;        for (var key in window.localStorage) {            if (key in localSettings)                continue;var value = window.localStorage[key];            window.localStorage.removeItem(key);            WebInspector.settings._settingsStorage[key] = value;        }    },    _clearBreakpointsWhenTooMany: function(breakpointsSetting, maxBreakpointsCount)     {        if (breakpointsSetting.get().length > maxBreakpointsCount)            breakpointsSetting.set([]);    }}WebInspector.settings;WebInspector.moduleSetting = function(settingName) {    return WebInspector.settings.moduleSetting(settingName);}WebInspector.settingForTest = function(settingName) {    return WebInspector.settings.settingForTest(settingName);};WebInspector.StaticContentProvider = function(contentType, content, contentURL) {    this._content = content;    this._contentType = contentType;    this._contentURL = contentURL || "";}WebInspector.StaticContentProvider.searchInContent = function(content, query, caseSensitive, isRegex, callback) {    function performSearch()     {        callback(WebInspector.ContentProvider.performSearchInContent(content, query, caseSensitive, isRegex));    }    setTimeout(performSearch.bind(null ), 0);}WebInspector.StaticContentProvider.prototype = {    contentURL: function()     {        return this._contentURL;    },    contentType: function()     {        return this._contentType;    },    requestContent: function(callback)     {        callback(this._content);    },    searchInContent: function(query, caseSensitive, isRegex, callback)     {        WebInspector.StaticContentProvider.searchInContent(this._content, query, caseSensitive, isRegex, callback);    }};WebInspector.OutputStream = function() {}WebInspector.OutputStream.prototype = {    write: function(data, callback) {},    close: function() {}}WebInspector.StringOutputStream = function() {    this._data = "";}WebInspector.StringOutputStream.prototype = {    write: function(chunk, callback)     {        this._data += chunk;    },    close: function()     {},    data: function()     {        return this._data;    }};WebInspector.TestBase = function(domAutomationController) {    this.domAutomationController_ = domAutomationController;    this.controlTaken_ = false;    this.timerId_ = -1;};WebInspector.TestBase.prototype.fail = function(message) {    if (this.controlTaken_)        this.reportFailure_(message);    else        throw message;};WebInspector.TestBase.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);    }};WebInspector.TestBase.prototype.assertTrue = function(value, opt_message) {    this.assertEquals(true, !!value, opt_message);};WebInspector.TestBase.prototype.takeControl = function() {    this.controlTaken_ = true;    var self = this;    this.timerId_ = setTimeout(function() {        self.reportFailure_("Timeout exceeded: 20 sec");    }    , 20000);};WebInspector.TestBase.prototype.releaseControl = function() {    if (this.timerId_ !== -1) {        clearTimeout(this.timerId_);        this.timerId_ = -1;    }    this.reportOk_();};WebInspector.TestBase.prototype.reportOk_ = function() {    this.domAutomationController_.send("[OK]");};WebInspector.TestBase.prototype.reportFailure_ = function(error) {    if (this.timerId_ !== -1) {        clearTimeout(this.timerId_);        this.timerId_ = -1;    }    this.domAutomationController_.send("[FAILED] " + error);};WebInspector.TestBase.prototype.runTest = function(testName) {    try {        this[testName]();        if (!this.controlTaken_)            this.reportOk_();    } catch (e) {        this.reportFailure_(e);    }};WebInspector.TestBase.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;        }        try {            override.apply(this, arguments);        } catch (e) {            test.fail("Exception in overriden method '" + methodName + "': " + e);        }        return result;    }    ;};WebInspector.TestBase.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();};;WebInspector.TextRange = function(startLine, startColumn, endLine, endColumn) {    this.startLine = startLine;    this.startColumn = startColumn;    this.endLine = endLine;    this.endColumn = endColumn;}WebInspector.TextRange.createFromLocation = function(line, column) {    return new WebInspector.TextRange(line,column,line,column);}WebInspector.TextRange.fromObject = function(serializedTextRange) {    return new WebInspector.TextRange(serializedTextRange.startLine,serializedTextRange.startColumn,serializedTextRange.endLine,serializedTextRange.endColumn);}WebInspector.TextRange.comparator = function(range1, range2) {    return range1.compareTo(range2);}WebInspector.TextRange.prototype = {    isEmpty: function()     {        return this.startLine === this.endLine && this.startColumn === this.endColumn;    },    immediatelyPrecedes: function(range)     {        if (!range)            return false;        return this.endLine === range.startLine && this.endColumn === range.startColumn;    },    immediatelyFollows: function(range)     {        if (!range)            return false;        return range.immediatelyPrecedes(this);    },    follows: function(range)     {        return (range.endLine === this.startLine && range.endColumn <= this.startColumn) || range.endLine < this.startLine;    },    get linesCount()     {        return this.endLine - this.startLine;    },    collapseToEnd: function()     {        return new WebInspector.TextRange(this.endLine,this.endColumn,this.endLine,this.endColumn);    },    collapseToStart: function()     {        return new WebInspector.TextRange(this.startLine,this.startColumn,this.startLine,this.startColumn);    },    normalize: function()     {        if (this.startLine > this.endLine || (this.startLine === this.endLine && this.startColumn > this.endColumn))            return new WebInspector.TextRange(this.endLine,this.endColumn,this.startLine,this.startColumn);        else            return this.clone();    },    clone: function()     {        return new WebInspector.TextRange(this.startLine,this.startColumn,this.endLine,this.endColumn);    },    serializeToObject: function()     {        var serializedTextRange = {};        serializedTextRange.startLine = this.startLine;        serializedTextRange.startColumn = this.startColumn;        serializedTextRange.endLine = this.endLine;        serializedTextRange.endColumn = this.endColumn;        return serializedTextRange;    },    compareTo: function(other)     {        if (this.startLine > other.startLine)            return 1;        if (this.startLine < other.startLine)            return -1;        if (this.startColumn > other.startColumn)            return 1;        if (this.startColumn < other.startColumn)            return -1;        return 0;    },    equal: function(other)     {        return this.startLine === other.startLine && this.endLine === other.endLine && this.startColumn === other.startColumn && this.endColumn === other.endColumn;    },    shift: function(lineOffset)     {        return new WebInspector.TextRange(this.startLine + lineOffset,this.startColumn,this.endLine + lineOffset,this.endColumn);    },    relativeTo: function(line, column)     {        var relative = this.clone();        if (this.startLine == line)            relative.startColumn -= column;        if (this.endLine == line)            relative.endColumn -= column;        relative.startLine -= line;        relative.endLine -= line;        return relative;    },    toSourceRange: function(text)     {        var start = (this.startLine ? text.lineEndings()[this.startLine - 1] + 1 : 0) + this.startColumn;        var end = (this.endLine ? text.lineEndings()[this.endLine - 1] + 1 : 0) + this.endColumn;        return new WebInspector.SourceRange(start,end - start);    },    rebaseAfterTextEdit: function(originalRange, editedRange)     {        console.assert(originalRange.startLine === editedRange.startLine);        console.assert(originalRange.startColumn === editedRange.startColumn);        var rebase = this.clone();        if (!this.follows(originalRange))            return rebase;        var lineDelta = editedRange.endLine - originalRange.endLine;        var columnDelta = editedRange.endColumn - originalRange.endColumn;        rebase.startLine += lineDelta;        rebase.endLine += lineDelta;        if (rebase.startLine === editedRange.endLine)            rebase.startColumn += columnDelta;        if (rebase.endLine === editedRange.endLine)            rebase.endColumn += columnDelta;        return rebase;    },    toString: function()     {        return JSON.stringify(this);    },    replaceInText: function(text, replacement)     {        var sourceRange = this.toSourceRange(text);        return text.substring(0, sourceRange.offset) + replacement + text.substring(sourceRange.offset + sourceRange.length);    }}WebInspector.SourceRange = function(offset, length) {    this.offset = offset;    this.length = length;};WebInspector.TextUtils = {    isStopChar: function(char)     {        return (char > " " && char < "0") || (char > "9" && char < "A") || (char > "Z" && char < "_") || (char > "_" && char < "a") || (char > "z" && char <= "~");    },    isWordChar: function(char)     {        return !WebInspector.TextUtils.isStopChar(char) && !WebInspector.TextUtils.isSpaceChar(char);    },    isSpaceChar: function(char)     {        return WebInspector.TextUtils._SpaceCharRegex.test(char);    },    isWord: function(word)     {        for (var i = 0; i < word.length; ++i) {            if (!WebInspector.TextUtils.isWordChar(word.charAt(i)))                return false;        }        return true;    },    isOpeningBraceChar: function(char)     {        return char === "(" || char === "{";    },    isClosingBraceChar: function(char)     {        return char === ")" || char === "}";    },    isBraceChar: function(char)     {        return WebInspector.TextUtils.isOpeningBraceChar(char) || WebInspector.TextUtils.isClosingBraceChar(char);    },    textToWords: function(text, isWordChar, wordCallback)     {        var startWord = -1;        for (var i = 0; i < text.length; ++i) {            if (!isWordChar(text.charAt(i))) {                if (startWord !== -1)                    wordCallback(text.substring(startWord, i));                startWord = -1;            } else if (startWord === -1)                startWord = i;        }        if (startWord !== -1)            wordCallback(text.substring(startWord));    },    lineIndent: function(line)     {        var indentation = 0;        while (indentation < line.length && WebInspector.TextUtils.isSpaceChar(line.charAt(indentation)))            ++indentation;        return line.substr(0, indentation);    },    isUpperCase: function(text)     {        return text === text.toUpperCase();    },    isLowerCase: function(text)     {        return text === text.toLowerCase();    }}WebInspector.TextUtils._SpaceCharRegex = /\s/;WebInspector.TextUtils.Indent = {    TwoSpaces: "  ",    FourSpaces: "    ",    EightSpaces: "        ",    TabCharacter: "\t"}WebInspector.TextUtils.BalancedJSONTokenizer = function(callback, findMultiple) {    this._callback = callback;    this._index = 0;    this._balance = 0;    this._buffer = "";    this._findMultiple = findMultiple || false;    this._closingDoubleQuoteRegex = /[^\\](?:\\\\)*"/g;}WebInspector.TextUtils.BalancedJSONTokenizer.prototype = {    write: function(chunk)     {        this._buffer += chunk;        var lastIndex = this._buffer.length;        var buffer = this._buffer;        for (var index = this._index; index < lastIndex; ++index) {            var character = buffer[index];            if (character === "\"") {                this._closingDoubleQuoteRegex.lastIndex = index;                if (!this._closingDoubleQuoteRegex.test(buffer))                    break;                index = this._closingDoubleQuoteRegex.lastIndex - 1;            } else if (character === "{") {                ++this._balance;            } else if (character === "}") {                if (--this._balance === 0) {                    this._lastBalancedIndex = index + 1;                    if (!this._findMultiple)                        break;                }            }        }        this._index = index;        this._reportBalanced();    },    _reportBalanced: function()     {        if (!this._lastBalancedIndex)            return;        this._callback(this._buffer.slice(0, this._lastBalancedIndex));        this._buffer = this._buffer.slice(this._lastBalancedIndex);        this._index -= this._lastBalancedIndex;        this._lastBalancedIndex = 0;    },    remainder: function()     {        return this._buffer;    }}WebInspector.TokenizerFactory = function() {}WebInspector.TokenizerFactory.prototype = {    createTokenizer: function(mimeType) {}};WebInspector.Throttler = function(timeout) {    this._timeout = timeout;    this._isRunningProcess = false;    this._asSoonAsPossible = false;    this._process = null ;}WebInspector.Throttler.prototype = {    _processCompleted: function(error)     {        if (error)            console.error(error);        this._isRunningProcess = false;        if (this._process)            this._innerSchedule(false);        this._processCompletedForTests();    },    _processCompletedForTests: function()     {},    _onTimeout: function()     {        delete this._processTimeout;        this._asSoonAsPossible = false;        this._isRunningProcess = true;        var process = this._process;        this._process = null ;        try {            process(this._processCompleted.bind(this));        } catch (e) {            if (this._isRunningProcess)                this._processCompleted(e);        }    },    schedule: function(process, asSoonAsPossible)     {        this._process = process;        var hasScheduledTasks = !!this._processTimeout || this._isRunningProcess;        asSoonAsPossible = !!asSoonAsPossible || !hasScheduledTasks;        var forceTimerUpdate = asSoonAsPossible && !this._asSoonAsPossible;        this._asSoonAsPossible = this._asSoonAsPossible || asSoonAsPossible;        this._innerSchedule(forceTimerUpdate);    },    _innerSchedule: function(forceTimerUpdate)     {        if (this._isRunningProcess)            return;        if (this._processTimeout && !forceTimerUpdate)            return;        if (this._processTimeout)            this._clearTimeout(this._processTimeout);        var timeout = this._asSoonAsPossible ? 0 : this._timeout;        this._processTimeout = this._setTimeout(this._onTimeout.bind(this), timeout);    },    _clearTimeout: function(timeoutId)     {        clearTimeout(timeoutId);    },    _setTimeout: function(operation, timeout)     {        return setTimeout(operation, timeout);    }}WebInspector.Throttler.FinishCallback;;WebInspector.UIString = function(string, vararg) {    return String.vsprintf(WebInspector.localize(string), Array.prototype.slice.call(arguments, 1));}WebInspector.UIString.capitalize = function(string, vararg) {    if (WebInspector._useLowerCaseMenuTitles === undefined)        throw "WebInspector.setLocalizationPlatform() has not been called";    var localized = WebInspector.localize(string);    var capitalized;    if (WebInspector._useLowerCaseMenuTitles)        capitalized = localized.replace(/\^(.)/g, "$1");    else        capitalized = localized.replace(/\^(.)/g, function(str, char) {            return char.toUpperCase();        }        );    return String.vsprintf(capitalized, Array.prototype.slice.call(arguments, 1));}WebInspector.setLocalizationPlatform = function(platform) {    WebInspector._useLowerCaseMenuTitles = platform === "windows";}WebInspector.localize = function(string) {    return string;}WebInspector.UIStringFormat = function(format) {    this._localizedFormat = WebInspector.localize(format);    this._tokenizedFormat = String.tokenizeFormatString(this._localizedFormat, String.standardFormatters);}WebInspector.UIStringFormat._append = function(a, b) {    return a + b;}WebInspector.UIStringFormat.prototype = {    format: function(vararg)     {        return String.format(this._localizedFormat, arguments, String.standardFormatters, "", WebInspector.UIStringFormat._append, this._tokenizedFormat).formattedResult;    }};WebInspector.Renderer = function() {}WebInspector.Renderer.prototype = {    render: function(object) {}}WebInspector.Renderer.renderPromise = function(object) {    if (!object)        return Promise.reject(new Error("Can't render " + object));    return self.runtime.instancePromise(WebInspector.Renderer, object).then(render);    function render(renderer)     {        return renderer.render(object);    }}WebInspector.Revealer = function() {}WebInspector.Revealer.reveal = function(revealable, lineNumber) {    WebInspector.Revealer.revealPromise(revealable, lineNumber);}WebInspector.Revealer.revealPromise = function(revealable, lineNumber) {    if (!revealable)        return Promise.reject(new Error("Can't reveal " + revealable));    return self.runtime.instancesPromise(WebInspector.Revealer, revealable).then(reveal);    function reveal(revealers)     {        var promises = [];        for (var i = 0; i < revealers.length; ++i)            promises.push(revealers[i].reveal((revealable), lineNumber));        return Promise.race(promises);    }}WebInspector.Revealer.prototype = {    reveal: function(object, lineNumber) {}}WebInspector.App = function() {}WebInspector.App.prototype = {    presentUI: function(document) {}}WebInspector.AppProvider = function() {}WebInspector.AppProvider.prototype = {    createApp: function() {}}WebInspector.QueryParamHandler = function() {}WebInspector.QueryParamHandler.prototype = {    handleQueryParam: function(value) {}};function InspectorFrontendHostAPI() {}InspectorFrontendHostAPI.ContextMenuDescriptor;InspectorFrontendHostAPI.LoadNetworkResourceResult;InspectorFrontendHostAPI.Events = {    AddExtensions: "addExtensions",    AppendedToURL: "appendedToURL",    CanceledSaveURL: "canceledSaveURL",    ContextMenuCleared: "contextMenuCleared",    ContextMenuItemSelected: "contextMenuItemSelected",    DeviceCountUpdated: "deviceCountUpdated",    DevicesUpdated: "devicesUpdated",    DispatchMessage: "dispatchMessage",    DispatchMessageChunk: "dispatchMessageChunk",    EnterInspectElementMode: "enterInspectElementMode",    FileSystemsLoaded: "fileSystemsLoaded",    FileSystemRemoved: "fileSystemRemoved",    FileSystemAdded: "fileSystemAdded",    IndexingTotalWorkCalculated: "indexingTotalWorkCalculated",    IndexingWorked: "indexingWorked",    IndexingDone: "indexingDone",    KeyEventUnhandled: "keyEventUnhandled",    RevealSourceLine: "revealSourceLine",    SavedURL: "savedURL",    SearchCompleted: "searchCompleted",    SetInspectedTabId: "setInspectedTabId",    SetUseSoftMenu: "setUseSoftMenu",    ShowConsole: "showConsole"}InspectorFrontendHostAPI.EventDescriptors = [[InspectorFrontendHostAPI.Events.AddExtensions, ["extensions"]], [InspectorFrontendHostAPI.Events.AppendedToURL, ["url"]], [InspectorFrontendHostAPI.Events.CanceledSaveURL, ["url"]], [InspectorFrontendHostAPI.Events.ContextMenuCleared, []], [InspectorFrontendHostAPI.Events.ContextMenuItemSelected, ["id"]], [InspectorFrontendHostAPI.Events.DeviceCountUpdated, ["count"]], [InspectorFrontendHostAPI.Events.DevicesUpdated, ["devices"]], [InspectorFrontendHostAPI.Events.DispatchMessage, ["messageObject"]], [InspectorFrontendHostAPI.Events.DispatchMessageChunk, ["messageChunk", "messageSize"]], [InspectorFrontendHostAPI.Events.EnterInspectElementMode, []], [InspectorFrontendHostAPI.Events.FileSystemsLoaded, ["fileSystems"]], [InspectorFrontendHostAPI.Events.FileSystemRemoved, ["fileSystemPath"]], [InspectorFrontendHostAPI.Events.FileSystemAdded, ["errorMessage", "fileSystem"]], [InspectorFrontendHostAPI.Events.IndexingTotalWorkCalculated, ["requestId", "fileSystemPath", "totalWork"]], [InspectorFrontendHostAPI.Events.IndexingWorked, ["requestId", "fileSystemPath", "worked"]], [InspectorFrontendHostAPI.Events.IndexingDone, ["requestId", "fileSystemPath"]], [InspectorFrontendHostAPI.Events.KeyEventUnhandled, ["event"]], [InspectorFrontendHostAPI.Events.RevealSourceLine, ["url", "lineNumber", "columnNumber"]], [InspectorFrontendHostAPI.Events.SavedURL, ["url"]], [InspectorFrontendHostAPI.Events.SearchCompleted, ["requestId", "fileSystemPath", "files"]], [InspectorFrontendHostAPI.Events.SetInspectedTabId, ["tabId"]], [InspectorFrontendHostAPI.Events.SetUseSoftMenu, ["useSoftMenu"]], [InspectorFrontendHostAPI.Events.ShowConsole, []]];InspectorFrontendHostAPI.prototype = {    addFileSystem: function() {},    append: function(url, content) {},    loadCompleted: function() {},    indexPath: function(requestId, fileSystemPath) {},    getSelectionBackgroundColor: function() {},    getSelectionForegroundColor: function() {},    setInspectedPageBounds: function(bounds) {},    setWhitelistedShortcuts: function(shortcuts) {},    inspectElementCompleted: function() {},    openInNewTab: function(url) {},    removeFileSystem: function(fileSystemPath) {},    requestFileSystems: function() {},    save: function(url, content, forceSaveAs) {},    searchInPath: function(requestId, fileSystemPath, query) {},    stopIndexing: function(requestId) {},    bringToFront: function() {},    closeWindow: function() {},    copyText: function(text) {},    inspectedURLChanged: function(url) {},    isolatedFileSystem: function(fileSystemId, registeredName) {},    loadNetworkResource: function(url, headers, streamId, callback) {},    getPreferences: function(callback) {},    setPreference: function(name, value) {},    removePreference: function(name) {},    clearPreferences: function() {},    upgradeDraggedFileSystemPermissions: function(fileSystem) {},    platform: function() {},    recordEnumeratedHistogram: function(actionName, actionCode, bucketSize) {},    sendMessageToBackend: function(message) {},    setDevicesUpdatesEnabled: function(enabled) {},    setInjectedScriptForOrigin: function(origin, script) {},    setIsDocked: function(isDocked, callback) {},    zoomFactor: function() {},    zoomIn: function() {},    zoomOut: function() {},    resetZoom: function() {},    showContextMenuAtPoint: function(x, y, items, document) {},    isUnderTest: function() {},    isHostedMode: function() {}};WebInspector.InspectorFrontendHostStub = function() {    function stopEventPropagation(event)     {        var zoomModifier = WebInspector.isMac() ? event.metaKey : event.ctrlKey;        if (zoomModifier && (event.keyCode === 187 || event.keyCode === 189))            event.stopPropagation();    }    document.addEventListener("keydown", stopEventPropagation, true);}WebInspector.InspectorFrontendHostStub.prototype = {    getSelectionBackgroundColor: function()     {        return "#6e86ff";    },    getSelectionForegroundColor: function()     {        return "#ffffff";    },    platform: function()     {        var match = navigator.userAgent.match(/Windows NT/);        if (match)            return "windows";        match = navigator.userAgent.match(/Mac OS X/);        if (match)            return "mac";        return "linux";    },    loadCompleted: function()     {},    bringToFront: function()     {        this._windowVisible = true;    },    closeWindow: function()     {        this._windowVisible = false;    },    setIsDocked: function(isDocked, callback)     {        setTimeout(callback, 0);    },    setInspectedPageBounds: function(bounds)     {},    inspectElementCompleted: function()     {},    setInjectedScriptForOrigin: function(origin, script)     {},    inspectedURLChanged: function(url)     {        document.title = WebInspector.UIString("Developer Tools - %s", url);    },    copyText: function(text)     {        WebInspector.console.error("Clipboard is not enabled in hosted mode. Please inspect using chrome://inspect");    },    openInNewTab: function(url)     {        window.open(url, "_blank");    },    save: function(url, content, forceSaveAs)     {        WebInspector.console.error("Saving files is not enabled in hosted mode. Please inspect using chrome://inspect");        this.events.dispatchEventToListeners(InspectorFrontendHostAPI.Events.CanceledSaveURL, url);    },    append: function(url, content)     {        WebInspector.console.error("Saving files is not enabled in hosted mode. Please inspect using chrome://inspect");    },    sendMessageToBackend: function(message)     {},    recordEnumeratedHistogram: function(actionName, actionCode, bucketSize)     {},    requestFileSystems: function()     {},    addFileSystem: function()     {},    removeFileSystem: function(fileSystemPath)     {},    isolatedFileSystem: function(fileSystemId, registeredName)     {        return null ;    },    loadNetworkResource: function(url, headers, streamId, callback)     {        loadResourcePromise(url).then(function(text) {            WebInspector.ResourceLoader.streamWrite(streamId, text);            callback({                statusCode: 200            });        }        ).catch(function() {            callback({                statusCode: 404            });        }        );    },    getPreferences: function(callback)     {        var prefs = {};        for (var name in window.localStorage)            prefs[name] = window.localStorage[name];        callback(prefs);    },    setPreference: function(name, value)     {        window.localStorage[name] = value;    },    removePreference: function(name)     {        delete window.localStorage[name];    },    clearPreferences: function()     {        window.localStorage.clear();    },    upgradeDraggedFileSystemPermissions: function(fileSystem)     {},    indexPath: function(requestId, fileSystemPath)     {},    stopIndexing: function(requestId)     {},    searchInPath: function(requestId, fileSystemPath, query)     {},    zoomFactor: function()     {        return 1;    },    zoomIn: function()     {},    zoomOut: function()     {},    resetZoom: function()     {},    setWhitelistedShortcuts: function(shortcuts)     {},    isUnderTest: function()     {        return false;    },    setDevicesUpdatesEnabled: function(enabled)     {},    showContextMenuAtPoint: function(x, y, items, document)     {        throw "Soft context menu should be used";    },    isHostedMode: function()     {        return true;    }};var InspectorFrontendHost = window.InspectorFrontendHost || null ;(function() {    function initializeInspectorFrontendHost()     {        if (!InspectorFrontendHost) {            InspectorFrontendHost = new WebInspector.InspectorFrontendHostStub();        } else {            var proto = WebInspector.InspectorFrontendHostStub.prototype;            for (var name in proto) {                var value = proto[name];                if (typeof value !== "function" || InspectorFrontendHost[name])                    continue;InspectorFrontendHost[name] = stub.bind(null , name);            }        }        function stub(name)         {            console.error("Incompatible embedder: method InspectorFrontendHost." + name + " is missing. Using stub instead.");            var args = Array.prototype.slice.call(arguments, 1);            return proto[name].apply(InspectorFrontendHost, args);        }        InspectorFrontendHost.events = new WebInspector.Object();    }    function InspectorFrontendAPIImpl()     {        this._debugFrontend = !!Runtime.queryParam("debugFrontend") || (window["InspectorTest"] && window["InspectorTest"]["debugTest"]);        var descriptors = InspectorFrontendHostAPI.EventDescriptors;        for (var i = 0; i < descriptors.length; ++i)            this[descriptors[i][0]] = this._dispatch.bind(this, descriptors[i][0], descriptors[i][1], descriptors[i][2]);    }    InspectorFrontendAPIImpl.prototype = {        _dispatch: function(name, signature, runOnceLoaded)         {            var params = Array.prototype.slice.call(arguments, 3);            if (this._debugFrontend)                setImmediate(innerDispatch);            else                innerDispatch();            function innerDispatch()             {                if (signature.length < 2) {                    try {                        InspectorFrontendHost.events.dispatchEventToListeners(name, params[0]);                    } catch (e) {                        console.error(e + " " + e.stack);                    }                    return;                }                var data = {};                for (var i = 0; i < signature.length; ++i)                    data[signature[i]] = params[i];                try {                    InspectorFrontendHost.events.dispatchEventToListeners(name, data);                } catch (e) {                    console.error(e + " " + e.stack);                }            }        },        streamWrite: function(id, chunk)         {            WebInspector.ResourceLoader.streamWrite(id, chunk);        }    }    initializeInspectorFrontendHost();    window.InspectorFrontendAPI = new InspectorFrontendAPIImpl();    WebInspector.setLocalizationPlatform(InspectorFrontendHost.platform());})();InspectorFrontendHost.events;;WebInspector.platform = function() {    if (!WebInspector._platform)        WebInspector._platform = InspectorFrontendHost.platform();    return WebInspector._platform;}WebInspector.isMac = function() {    if (typeof WebInspector._isMac === "undefined")        WebInspector._isMac = WebInspector.platform() === "mac";    return WebInspector._isMac;}WebInspector.isWin = function() {    if (typeof WebInspector._isWin === "undefined")        WebInspector._isWin = WebInspector.platform() === "windows";    return WebInspector._isWin;}WebInspector.fontFamily = function() {    if (WebInspector._fontFamily)        return WebInspector._fontFamily;    switch (WebInspector.platform()) {    case "linux":        WebInspector._fontFamily = "Ubuntu, Arial, sans-serif";        break;    case "mac":        WebInspector._fontFamily = "'Lucida Grande', sans-serif";        break;    case "windows":        WebInspector._fontFamily = "'Segoe UI', Tahoma, sans-serif";        break;    }    return WebInspector._fontFamily;}WebInspector.monospaceFontFamily = function() {    if (WebInspector._monospaceFontFamily)        return WebInspector._monospaceFontFamily;    switch (WebInspector.platform()) {    case "linux":        WebInspector._monospaceFontFamily = "dejavu sans mono, monospace";        break;    case "mac":        WebInspector._monospaceFontFamily = "Menlo, monospace";        break;    case "windows":        WebInspector._monospaceFontFamily = "Consolas, monospace";        break;    }    return WebInspector._monospaceFontFamily;};WebInspector.ResourceLoader = {}WebInspector.ResourceLoader._lastStreamId = 0;WebInspector.ResourceLoader._boundStreams = {};WebInspector.ResourceLoader._bindOutputStream = function(stream) {    WebInspector.ResourceLoader._boundStreams[++WebInspector.ResourceLoader._lastStreamId] = stream;    return WebInspector.ResourceLoader._lastStreamId;}WebInspector.ResourceLoader._discardOutputStream = function(id) {    WebInspector.ResourceLoader._boundStreams[id].close();    delete WebInspector.ResourceLoader._boundStreams[id];}WebInspector.ResourceLoader.streamWrite = function(id, chunk) {    WebInspector.ResourceLoader._boundStreams[id].write(chunk);}WebInspector.ResourceLoader.load = function(url, headers, callback) {    var stream = new WebInspector.StringOutputStream();    WebInspector.ResourceLoader.loadAsStream(url, headers, stream, mycallback);    function mycallback(statusCode, headers)     {        callback(statusCode, headers, stream.data());    }}WebInspector.ResourceLoader.targetUserAgent = "";WebInspector.ResourceLoader.loadUsingTargetUA = function(url, headers, callback) {    if (!WebInspector.ResourceLoader.targetUserAgent) {        WebInspector.ResourceLoader.load(url, headers, callback);        return;    }    var headersWithUA = {};    if (headers) {        for (var header in headers)            headersWithUA[header] = headers[header];    }    headersWithUA["User-Agent"] = WebInspector.ResourceLoader.targetUserAgent;    WebInspector.ResourceLoader.load(url, headersWithUA, callback);}WebInspector.ResourceLoader.loadAsStream = function(url, headers, stream, callback) {    var streamId = WebInspector.ResourceLoader._bindOutputStream(stream);    var parsedURL = new WebInspector.ParsedURL(url);    if (parsedURL.isDataURL()) {        loadXHR(url).then(dataURLDecodeSuccessful).catch(dataURLDecodeFailed);        return;    }    var rawHeaders = [];    if (headers) {        for (var key in headers)            rawHeaders.push(key + ": " + headers[key]);    }    InspectorFrontendHost.loadNetworkResource(url, rawHeaders.join("\r\n"), streamId, finishedCallback);    function finishedCallback(response)     {        if (callback)            callback(response.statusCode, response.headers || {});        WebInspector.ResourceLoader._discardOutputStream(streamId);    }    function dataURLDecodeSuccessful(text)     {        WebInspector.ResourceLoader.streamWrite(streamId, text);        finishedCallback(({            statusCode: 200        }));    }    function dataURLDecodeFailed()     {        finishedCallback(({            statusCode: 404        }));    }};WebInspector.UserMetrics = function() {    for (var actionName in WebInspector.UserMetrics._ActionCodes) {        var actionCode = WebInspector.UserMetrics._ActionCodes[actionName];        this[actionName] = new WebInspector.UserMetrics._Recorder(actionCode);    }}WebInspector.UserMetrics._ActionCodes = {    WindowDocked: 1,    WindowUndocked: 2,    ScriptsBreakpointSet: 3,    TimelineStarted: 4,    ProfilesCPUProfileTaken: 5,    ProfilesHeapProfileTaken: 6,    AuditsStarted: 7,    ConsoleEvaluated: 8,    FileSavedInWorkspace: 9,    DeviceModeEnabled: 10,    AnimationsPlaybackRateChanged: 11,    RevisionApplied: 12,    FileSystemDirectoryContentReceived: 13,    StyleRuleEdited: 14,    CommandEvaluatedInConsolePanel: 15}WebInspector.UserMetrics._PanelCodes = {    elements: 1,    resources: 2,    network: 3,    sources: 4,    timeline: 5,    profiles: 6,    audits: 7,    console: 8,    layers: 9}WebInspector.UserMetrics.prototype = {    panelShown: function(panelName)     {        var code = WebInspector.UserMetrics._PanelCodes[panelName] || 0;        var size = Object.keys(WebInspector.UserMetrics._PanelCodes).length + 1;        InspectorFrontendHost.recordEnumeratedHistogram("DevTools.PanelShown", code, size);    }}WebInspector.UserMetrics._Recorder = function(actionCode) {    this._actionCode = actionCode;}WebInspector.UserMetrics._Recorder.prototype = {    record: function()     {        var size = Object.keys(WebInspector.UserMetrics._ActionCodes).length + 1;        InspectorFrontendHost.recordEnumeratedHistogram("DevTools.ActionTaken", this._actionCode, size);    }}WebInspector.userMetrics = new WebInspector.UserMetrics();;WebInspector.Widget = function(isWebComponent) {    this.contentElement = createElementWithClass("div", "widget");    if (isWebComponent) {        this.element = createElementWithClass("div", "vbox flex-auto");        this._shadowRoot = WebInspector.createShadowRootWithCoreStyles(this.element);        this._shadowRoot.appendChild(this.contentElement);    } else {        this.element = this.contentElement;    }    this._isWebComponent = isWebComponent;    this.element.__widget = this;    this._visible = true;    this._isRoot = false;    this._isShowing = false;    this._children = [];    this._hideOnDetach = false;    this._notificationDepth = 0;}WebInspector.Widget.createStyleElement = function(cssFile) {    var content = Runtime.cachedResources[cssFile] || "";    if (!content)        console.error(cssFile + " not preloaded. Check module.json");    var styleElement = createElement("style");    styleElement.type = "text/css";    styleElement.textContent = content;    return styleElement;}WebInspector.Widget.prototype = {    markAsRoot: function()     {        WebInspector.Widget.__assert(!this.element.parentElement, "Attempt to mark as root attached node");        this._isRoot = true;    },    parentWidget: function()     {        return this._parentWidget;    },    children: function()     {        return this._children;    },    childWasDetached: function(widget)     {},    isShowing: function()     {        return this._isShowing;    },    _shouldHideOnDetach: function()     {        if (this._hideOnDetach)            return true;        for (var child of this._children) {            if (child._shouldHideOnDetach())                return true;        }        return false;    },    setHideOnDetach: function()     {        this._hideOnDetach = true;    },    _inNotification: function()     {        return !!this._notificationDepth || (this._parentWidget && this._parentWidget._inNotification());    },    _parentIsShowing: function()     {        if (this._isRoot)            return true;        return this._parentWidget && this._parentWidget.isShowing();    },    _callOnVisibleChildren: function(method)     {        var copy = this._children.slice();        for (var i = 0; i < copy.length; ++i) {            if (copy[i]._parentWidget === this && copy[i]._visible)                method.call(copy[i]);        }    },    _processWillShow: function()     {        this._callOnVisibleChildren(this._processWillShow);        this._isShowing = true;    },    _processWasShown: function()     {        if (this._inNotification())            return;        this.restoreScrollPositions();        this._notify(this.wasShown);        this._callOnVisibleChildren(this._processWasShown);    },    _processWillHide: function()     {        if (this._inNotification())            return;        this.storeScrollPositions();        this._callOnVisibleChildren(this._processWillHide);        this._notify(this.willHide);        this._isShowing = false;    },    _processWasHidden: function()     {        this._callOnVisibleChildren(this._processWasHidden);    },    _processOnResize: function()     {        if (this._inNotification())            return;        if (!this.isShowing())            return;        this._notify(this.onResize);        this._callOnVisibleChildren(this._processOnResize);    },    _notify: function(notification)     {        ++this._notificationDepth;        try {            notification.call(this);        } finally {            --this._notificationDepth;        }    },    wasShown: function()     {},    willHide: function()     {},    onResize: function()     {},    onLayout: function()     {},    show: function(parentElement, insertBefore)     {        WebInspector.Widget.__assert(parentElement, "Attempt to attach widget with no parent element");        if (this.element.parentElement !== parentElement) {            if (this.element.parentElement)                this.detach();            var currentParent = parentElement;            while (currentParent && !currentParent.__widget)                currentParent = currentParent.parentElementOrShadowHost();            if (currentParent) {                this._parentWidget = currentParent.__widget;                this._parentWidget._children.push(this);                this._isRoot = false;            } else                WebInspector.Widget.__assert(this._isRoot, "Attempt to attach widget to orphan node");        } else if (this._visible) {            return;        }        this._visible = true;        if (this._parentIsShowing())            this._processWillShow();        this.element.classList.remove("hidden");        if (this.element.parentElement !== parentElement) {            WebInspector.Widget._incrementWidgetCounter(parentElement, this.element);            if (insertBefore)                WebInspector.Widget._originalInsertBefore.call(parentElement, this.element, insertBefore);            else                WebInspector.Widget._originalAppendChild.call(parentElement, this.element);        }        if (this._parentIsShowing())            this._processWasShown();        if (this._parentWidget && this._hasNonZeroConstraints())            this._parentWidget.invalidateConstraints();        else            this._processOnResize();    },    detach: function(overrideHideOnDetach)     {        var parentElement = this.element.parentElement;        if (!parentElement)            return;        if (this._parentIsShowing())            this._processWillHide();        if (!overrideHideOnDetach && this._shouldHideOnDetach()) {            this.element.classList.add("hidden");            this._visible = false;            if (this._parentIsShowing())                this._processWasHidden();            if (this._parentWidget && this._hasNonZeroConstraints())                this._parentWidget.invalidateConstraints();            return;        }        WebInspector.Widget._decrementWidgetCounter(parentElement, this.element);        WebInspector.Widget._originalRemoveChild.call(parentElement, this.element);        this._visible = false;        if (this._parentIsShowing())            this._processWasHidden();        if (this._parentWidget) {            var childIndex = this._parentWidget._children.indexOf(this);            WebInspector.Widget.__assert(childIndex >= 0, "Attempt to remove non-child widget");            this._parentWidget._children.splice(childIndex, 1);            this._parentWidget.childWasDetached(this);            var parent = this._parentWidget;            this._parentWidget = null ;            if (this._hasNonZeroConstraints())                parent.invalidateConstraints();        } else            WebInspector.Widget.__assert(this._isRoot, "Removing non-root widget from DOM");    },    detachChildWidgets: function()     {        var children = this._children.slice();        for (var i = 0; i < children.length; ++i)            children[i].detach();    },    elementsToRestoreScrollPositionsFor: function()     {        return [this.element];    },    storeScrollPositions: function()     {        var elements = this.elementsToRestoreScrollPositionsFor();        for (var i = 0; i < elements.length; ++i) {            var container = elements[i];            container._scrollTop = container.scrollTop;            container._scrollLeft = container.scrollLeft;        }    },    restoreScrollPositions: function()     {        var elements = this.elementsToRestoreScrollPositionsFor();        for (var i = 0; i < elements.length; ++i) {            var container = elements[i];            if (container._scrollTop)                container.scrollTop = container._scrollTop;            if (container._scrollLeft)                container.scrollLeft = container._scrollLeft;        }    },    doResize: function()     {        if (!this.isShowing())            return;        if (!this._inNotification())            this._callOnVisibleChildren(this._processOnResize);    },    doLayout: function()     {        if (!this.isShowing())            return;        this._notify(this.onLayout);        this.doResize();    },    registerRequiredCSS: function(cssFile)     {        (this._isWebComponent ? this._shadowRoot : this.element).appendChild(WebInspector.Widget.createStyleElement(cssFile));    },    printWidgetHierarchy: function()     {        var lines = [];        this._collectWidgetHierarchy("", lines);        console.log(lines.join("\n"));    },    _collectWidgetHierarchy: function(prefix, lines)     {        lines.push(prefix + "[" + this.element.className + "]" + (this._children.length ? " {" : ""));        for (var i = 0; i < this._children.length; ++i)            this._children[i]._collectWidgetHierarchy(prefix + "    ", lines);        if (this._children.length)            lines.push(prefix + "}");    },    defaultFocusedElement: function()     {        return this._defaultFocusedElement || this.element;    },    setDefaultFocusedElement: function(element)     {        this._defaultFocusedElement = element;    },    focus: function()     {        var element = this.defaultFocusedElement();        if (!element || element.isAncestor(this.element.ownerDocument.activeElement))            return;        WebInspector.setCurrentFocusElement(element);    },    hasFocus: function()     {        var activeElement = this.element.ownerDocument.activeElement;        return activeElement && activeElement.isSelfOrDescendant(this.element);    },    measurePreferredSize: function()     {        var document = this.element.ownerDocument;        WebInspector.Widget._originalAppendChild.call(document.body, this.element);        this.element.positionAt(0, 0);        var result = new Size(this.element.offsetWidth,this.element.offsetHeight);        this.element.positionAt(undefined, undefined);        WebInspector.Widget._originalRemoveChild.call(document.body, this.element);        return result;    },    calculateConstraints: function()     {        return new Constraints();    },    constraints: function()     {        if (typeof this._constraints !== "undefined")            return this._constraints;        if (typeof this._cachedConstraints === "undefined")            this._cachedConstraints = this.calculateConstraints();        return this._cachedConstraints;    },    setMinimumAndPreferredSizes: function(width, height, preferredWidth, preferredHeight)     {        this._constraints = new Constraints(new Size(width,height),new Size(preferredWidth,preferredHeight));        this.invalidateConstraints();    },    setMinimumSize: function(width, height)     {        this._constraints = new Constraints(new Size(width,height));        this.invalidateConstraints();    },    _hasNonZeroConstraints: function()     {        var constraints = this.constraints();        return !!(constraints.minimum.width || constraints.minimum.height || constraints.preferred.width || constraints.preferred.height);    },    invalidateConstraints: function()     {        var cached = this._cachedConstraints;        delete this._cachedConstraints;        var actual = this.constraints();        if (!actual.isEqual(cached) && this._parentWidget)            this._parentWidget.invalidateConstraints();        else            this.doLayout();    },    __proto__: WebInspector.Object.prototype}WebInspector.Widget._originalAppendChild = Element.prototype.appendChild;WebInspector.Widget._originalInsertBefore = Element.prototype.insertBefore;WebInspector.Widget._originalRemoveChild = Element.prototype.removeChild;WebInspector.Widget._originalRemoveChildren = Element.prototype.removeChildren;WebInspector.Widget._incrementWidgetCounter = function(parentElement, childElement) {    var count = (childElement.__widgetCounter || 0) + (childElement.__widget ? 1 : 0);    if (!count)        return;    while (parentElement) {        parentElement.__widgetCounter = (parentElement.__widgetCounter || 0) + count;        parentElement = parentElement.parentElementOrShadowHost();    }}WebInspector.Widget._decrementWidgetCounter = function(parentElement, childElement) {    var count = (childElement.__widgetCounter || 0) + (childElement.__widget ? 1 : 0);    if (!count)        return;    while (parentElement) {        parentElement.__widgetCounter -= count;        parentElement = parentElement.parentElementOrShadowHost();    }}WebInspector.Widget.__assert = function(condition, message) {    if (!condition) {        console.trace();        throw new Error(message);    }}WebInspector.VBox = function(isWebComponent) {    WebInspector.Widget.call(this, isWebComponent);    this.contentElement.classList.add("vbox");};WebInspector.VBox.prototype = {    calculateConstraints: function()     {        var constraints = new Constraints();        function updateForChild()         {            var child = this.constraints();            constraints = constraints.widthToMax(child);            constraints = constraints.addHeight(child);        }        this._callOnVisibleChildren(updateForChild);        return constraints;    },    __proto__: WebInspector.Widget.prototype};WebInspector.HBox = function(isWebComponent) {    WebInspector.Widget.call(this, isWebComponent);    this.contentElement.classList.add("hbox");};WebInspector.HBox.prototype = {    calculateConstraints: function()     {        var constraints = new Constraints();        function updateForChild()         {            var child = this.constraints();            constraints = constraints.addWidth(child);            constraints = constraints.heightToMax(child);        }        this._callOnVisibleChildren(updateForChild);        return constraints;    },    __proto__: WebInspector.Widget.prototype};WebInspector.VBoxWithResizeCallback = function(resizeCallback) {    WebInspector.VBox.call(this);    this._resizeCallback = resizeCallback;}WebInspector.VBoxWithResizeCallback.prototype = {    onResize: function()     {        this._resizeCallback();    },    __proto__: WebInspector.VBox.prototype}Element.prototype.appendChild = function(child) {    WebInspector.Widget.__assert(!child.__widget || child.parentElement === this, "Attempt to add widget via regular DOM operation.");    return WebInspector.Widget._originalAppendChild.call(this, child);}Element.prototype.insertBefore = function(child, anchor) {    WebInspector.Widget.__assert(!child.__widget || child.parentElement === this, "Attempt to add widget via regular DOM operation.");    return WebInspector.Widget._originalInsertBefore.call(this, child, anchor);}Element.prototype.removeChild = function(child) {    WebInspector.Widget.__assert(!child.__widgetCounter && !child.__widget, "Attempt to remove element containing widget via regular DOM operation");    return WebInspector.Widget._originalRemoveChild.call(this, child);}Element.prototype.removeChildren = function() {    WebInspector.Widget.__assert(!this.__widgetCounter, "Attempt to remove element containing widget via regular DOM operation");    WebInspector.Widget._originalRemoveChildren.call(this);};function TreeOutline(nonFocusable) {    this._createRootElement();    this.selectedTreeElement = null ;    this.expandTreeElementsWhenArrowing = false;    this._comparator = null ;    this._contentElement = this._rootElement._childrenListNode;    this._contentElement.addEventListener("keydown", this._treeKeyDown.bind(this), true);    this.setFocusable(!nonFocusable);    this.element = this._contentElement;}TreeOutline.Events = {    ElementAttached: "ElementAttached",    ElementExpanded: "ElementExpanded",    ElementCollapsed: "ElementCollapsed"}TreeOutline.prototype = {    _createRootElement: function()     {        this._rootElement = new TreeElement();        this._rootElement.treeOutline = this;        this._rootElement.root = true;        this._rootElement.selectable = false;        this._rootElement.expanded = true;        this._rootElement._childrenListNode.classList.remove("children");    },    rootElement: function()     {        return this._rootElement;    },    firstChild: function()     {        return this._rootElement.firstChild();    },    appendChild: function(child)     {        this._rootElement.appendChild(child);    },    insertChild: function(child, index)     {        this._rootElement.insertChild(child, index);    },    removeChild: function(child)     {        this._rootElement.removeChild(child);    },    removeChildren: function()     {        this._rootElement.removeChildren();    },    treeElementFromPoint: function(x, y)     {        var node = this._contentElement.ownerDocument.deepElementFromPoint(x, y);        if (!node)            return null ;        var listNode = node.enclosingNodeOrSelfWithNodeNameInArray(["ol", "li"]);        if (listNode)            return listNode.parentTreeElement || listNode.treeElement;        return null ;    },    treeElementFromEvent: function(event)     {        return event ? this.treeElementFromPoint(event.pageX, event.pageY) : null ;    },    setComparator: function(comparator)     {        this._comparator = comparator;    },    setFocusable: function(focusable)     {        if (focusable)            this._contentElement.setAttribute("tabIndex", 0);        else            this._contentElement.removeAttribute("tabIndex");    },    focus: function()     {        this._contentElement.focus();    },    _bindTreeElement: function(element)     {        if (element.treeOutline)            console.error("Binding element for the second time: " + new Error().stack);        element.treeOutline = this;        element.onbind();    },    _unbindTreeElement: function(element)     {        if (!element.treeOutline)            console.error("Unbinding element that was not bound: " + new Error().stack);        element.deselect();        element.onunbind();        element.treeOutline = null ;    },    _treeKeyDown: function(event)     {        if (event.target !== this._contentElement)            return;        if (!this.selectedTreeElement || event.shiftKey || event.metaKey || event.ctrlKey)            return;        var handled = false;        var nextSelectedElement;        if (event.keyIdentifier === "Up" && !event.altKey) {            nextSelectedElement = this.selectedTreeElement.traversePreviousTreeElement(true);            while (nextSelectedElement && !nextSelectedElement.selectable)                nextSelectedElement = nextSelectedElement.traversePreviousTreeElement(!this.expandTreeElementsWhenArrowing);            handled = nextSelectedElement ? true : false;        } else if (event.keyIdentifier === "Down" && !event.altKey) {            nextSelectedElement = this.selectedTreeElement.traverseNextTreeElement(true);            while (nextSelectedElement && !nextSelectedElement.selectable)                nextSelectedElement = nextSelectedElement.traverseNextTreeElement(!this.expandTreeElementsWhenArrowing);            handled = nextSelectedElement ? true : false;        } else if (event.keyIdentifier === "Left") {            if (this.selectedTreeElement.expanded) {                if (event.altKey)                    this.selectedTreeElement.collapseRecursively();                else                    this.selectedTreeElement.collapse();                handled = true;            } else if (this.selectedTreeElement.parent && !this.selectedTreeElement.parent.root) {                handled = true;                if (this.selectedTreeElement.parent.selectable) {                    nextSelectedElement = this.selectedTreeElement.parent;                    while (nextSelectedElement && !nextSelectedElement.selectable)                        nextSelectedElement = nextSelectedElement.parent;                    handled = nextSelectedElement ? true : false;                } else if (this.selectedTreeElement.parent)                    this.selectedTreeElement.parent.collapse();            }        } else if (event.keyIdentifier === "Right") {            if (!this.selectedTreeElement.revealed()) {                this.selectedTreeElement.reveal();                handled = true;            } else if (this.selectedTreeElement._expandable) {                handled = true;                if (this.selectedTreeElement.expanded) {                    nextSelectedElement = this.selectedTreeElement.firstChild();                    while (nextSelectedElement && !nextSelectedElement.selectable)                        nextSelectedElement = nextSelectedElement.nextSibling;                    handled = nextSelectedElement ? true : false;                } else {                    if (event.altKey)                        this.selectedTreeElement.expandRecursively();                    else                        this.selectedTreeElement.expand();                }            }        } else if (event.keyCode === 8 || event.keyCode === 46)            handled = this.selectedTreeElement.ondelete();        else if (isEnterKey(event))            handled = this.selectedTreeElement.onenter();        else if (event.keyCode === WebInspector.KeyboardShortcut.Keys.Space.code)            handled = this.selectedTreeElement.onspace();        if (nextSelectedElement) {            nextSelectedElement.reveal();            nextSelectedElement.select(false, true);        }        if (handled)            event.consume(true);    },    __proto__: WebInspector.Object.prototype}function TreeOutlineInShadow(className) {    TreeOutline.call(this);    var innerElement = this.element;    innerElement.classList.add("tree-outline");    if (className)        innerElement.classList.add(className);    this.element = createElement("div");    this._shadowRoot = WebInspector.createShadowRootWithCoreStyles(this.element);    this._shadowRoot.appendChild(WebInspector.Widget.createStyleElement("ui/treeoutline.css"));    this._shadowRoot.appendChild(innerElement);    this._renderSelection = true;}TreeOutlineInShadow.prototype = {    registerRequiredCSS: function(cssFile)     {        this._shadowRoot.appendChild(WebInspector.Widget.createStyleElement(cssFile));    },    __proto__: TreeOutline.prototype}function TreeElement(title, expandable) {    this.treeOutline = null ;    this.parent = null ;    this.previousSibling = null ;    this.nextSibling = null ;    this._listItemNode = createElement("li");    this._listItemNode.treeElement = this;    if (title)        this.title = title;    if (typeof title === "string")        this.tooltip = title;    this._listItemNode.addEventListener("mousedown", this._handleMouseDown.bind(this), false);    this._listItemNode.addEventListener("selectstart", this._treeElementSelectStart.bind(this), false);    this._listItemNode.addEventListener("click", this._treeElementToggled.bind(this), false);    this._listItemNode.addEventListener("dblclick", this._handleDoubleClick.bind(this), false);    this._childrenListNode = createElement("ol");    this._childrenListNode.parentTreeElement = this;    this._childrenListNode.classList.add("children");    this._hidden = false;    this._selectable = true;    this.expanded = false;    this.selected = false;    this.setExpandable(expandable || false);}TreeElement._ArrowToggleWidth = 10;TreeElement.prototype = {    hasAncestor: function(ancestor)     {        if (!ancestor)            return false;        var currentNode = this.parent;        while (currentNode) {            if (ancestor === currentNode)                return true;            currentNode = currentNode.parent;        }        return false;    },    hasAncestorOrSelf: function(ancestor)     {        return this === ancestor || this.hasAncestor(ancestor);    },    children: function()     {        return this._children || [];    },    childCount: function()     {        return this._children ? this._children.length : 0;    },    firstChild: function()     {        return this._children ? this._children[0] : null ;    },    lastChild: function()     {        return this._children ? this._children[this._children.length - 1] : null ;    },    childAt: function(index)     {        return this._children ? this._children[index] : null ;    },    indexOfChild: function(child)     {        return this._children ? this._children.indexOf(child) : -1;    },    appendChild: function(child)     {        if (!this._children)            this._children = [];        var insertionIndex;        if (this.treeOutline && this.treeOutline._comparator)            insertionIndex = insertionIndexForObjectInListSortedByFunction(child, this._children, this.treeOutline._comparator);        else            insertionIndex = this._children.length;        this.insertChild(child, insertionIndex);    },    insertChild: function(child, index)     {        if (!this._children)            this._children = [];        if (!child)            throw ("child can't be undefined or null");        console.assert(!child.parent, "Attempting to insert a child that is already in the tree, reparenting is not supported.");        var previousChild = (index > 0 ? this._children[index - 1] : null );        if (previousChild) {            previousChild.nextSibling = child;            child.previousSibling = previousChild;        } else {            child.previousSibling = null ;        }        var nextChild = this._children[index];        if (nextChild) {            nextChild.previousSibling = child;            child.nextSibling = nextChild;        } else {            child.nextSibling = null ;        }        this._children.splice(index, 0, child);        this.setExpandable(true);        child.parent = this;        if (this.treeOutline)            this.treeOutline._bindTreeElement(child);        for (var current = child.firstChild(); this.treeOutline && current; current = current.traverseNextTreeElement(false, child, true))            this.treeOutline._bindTreeElement(current);        child.onattach();        child._ensureSelection();        if (this.treeOutline)            this.treeOutline.dispatchEventToListeners(TreeOutline.Events.ElementAttached, child);        var nextSibling = child.nextSibling ? child.nextSibling._listItemNode : null ;        this._childrenListNode.insertBefore(child._listItemNode, nextSibling);        this._childrenListNode.insertBefore(child._childrenListNode, nextSibling);        if (child.selected)            child.select();        if (child.expanded)            child.expand();    },    removeChildAtIndex: function(childIndex)     {        if (childIndex < 0 || childIndex >= this._children.length)            throw ("childIndex out of range");        var child = this._children[childIndex];        this._children.splice(childIndex, 1);        var parent = child.parent;        if (this.treeOutline && this.treeOutline.selectedTreeElement && this.treeOutline.selectedTreeElement.hasAncestorOrSelf(child)) {            if (child.nextSibling)                child.nextSibling.select(true);            else if (child.previousSibling)                child.previousSibling.select(true);            else if (parent)                parent.select(true);        }        if (child.previousSibling)            child.previousSibling.nextSibling = child.nextSibling;        if (child.nextSibling)            child.nextSibling.previousSibling = child.previousSibling;        child.parent = null ;        if (this.treeOutline)            this.treeOutline._unbindTreeElement(child);        for (var current = child.firstChild(); this.treeOutline && current; current = current.traverseNextTreeElement(false, child, true))            this.treeOutline._unbindTreeElement(current);        child._detach();    },    removeChild: function(child)     {        if (!child)            throw ("child can't be undefined or null");        if (child.parent !== this)            return;        var childIndex = this._children.indexOf(child);        if (childIndex === -1)            throw ("child not found in this node's children");        this.removeChildAtIndex(childIndex);    },    removeChildren: function()     {        if (!this.root && this.treeOutline && this.treeOutline.selectedTreeElement && this.treeOutline.selectedTreeElement.hasAncestorOrSelf(this))            this.select(true);        for (var i = 0; this._children && i < this._children.length; ++i) {            var child = this._children[i];            child.previousSibling = null             child.nextSibling = null ;            child.parent = null ;            if (this.treeOutline)                this.treeOutline._unbindTreeElement(child);            for (var current = child.firstChild(); this.treeOutline && current; current = current.traverseNextTreeElement(false, child, true))                this.treeOutline._unbindTreeElement(current);            child._detach();        }        this._children = [];    },    get selectable()     {        if (this._hidden)            return false;        return this._selectable;    },    set selectable(x)     {        this._selectable = x;    },    get listItemElement()     {        return this._listItemNode;    },    get childrenListElement()     {        return this._childrenListNode;    },    get title()     {        return this._title;    },    set title(x)     {        this._title = x;        if (typeof this._title === "string")            this._listItemNode.textContent = this._title;        else {            this._listItemNode.removeChildren();            if (this._title)                this._listItemNode.appendChild(this._title);            this._ensureSelection();        }    },    set tooltip(x)     {        if (x)            this._listItemNode.setAttribute("title", x);        else            this._listItemNode.removeAttribute("title");    },    isExpandable: function()     {        return this._expandable;    },    setExpandable: function(expandable)     {        if (this._expandable === expandable)            return;        this._expandable = expandable;        this._listItemNode.classList.toggle("parent", expandable);        if (!expandable)            this.collapse();    },    get hidden()     {        return this._hidden;    },    set hidden(x)     {        if (this._hidden === x)            return;        this._hidden = x;        this._listItemNode.classList.toggle("hidden", x);        this._childrenListNode.classList.toggle("hidden", x);    },    invalidateChildren: function()     {        if (this._children) {            this.removeChildren();            this._children = null ;        }    },    _ensureSelection: function()     {        if (!this.treeOutline || !this.treeOutline._renderSelection)            return;        if (!this._selectionElement)            this._selectionElement = createElementWithClass("div", "selection");        this._listItemNode.insertBefore(this._selectionElement, this.listItemElement.firstChild);    },    _treeElementSelectStart: function(event)     {        event.currentTarget._selectionStarted = true;    },    _treeElementToggled: function(event)     {        var element = event.currentTarget;        if (element._selectionStarted) {            delete element._selectionStarted;            var selection = element.getComponentSelection();            if (selection && !selection.isCollapsed && element.isSelfOrAncestor(selection.anchorNode) && element.isSelfOrAncestor(selection.focusNode))                return;        }        if (element.treeElement !== this)            return;        var toggleOnClick = this.toggleOnClick && !this.selectable;        var isInTriangle = this.isEventWithinDisclosureTriangle(event);        if (!toggleOnClick && !isInTriangle)            return;        if (event.target && event.target.enclosingNodeOrSelfWithNodeName("a"))            return;        if (this.expanded) {            if (event.altKey)                this.collapseRecursively();            else                this.collapse();        } else {            if (event.altKey)                this.expandRecursively();            else                this.expand();        }        event.consume();    },    _handleMouseDown: function(event)     {        var element = event.currentTarget;        if (!element)            return;        delete element._selectionStarted;        if (!this.selectable)            return;        if (element.treeElement !== this)            return;        if (this.isEventWithinDisclosureTriangle(event))            return;        this.selectOnMouseDown(event);    },    _handleDoubleClick: function(event)     {        var element = event.currentTarget;        if (!element || element.treeElement !== this)            return;        var handled = this.ondblclick(event);        if (handled)            return;        if (this._expandable && !this.expanded)            this.expand();    },    _detach: function()     {        this._listItemNode.remove();        this._childrenListNode.remove();    },    collapse: function()     {        if (!this.expanded)            return;        this._listItemNode.classList.remove("expanded");        this._childrenListNode.classList.remove("expanded");        this.expanded = false;        this.oncollapse();        if (this.treeOutline)            this.treeOutline.dispatchEventToListeners(TreeOutline.Events.ElementCollapsed, this);    },    collapseRecursively: function()     {        var item = this;        while (item) {            if (item.expanded)                item.collapse();            item = item.traverseNextTreeElement(false, this, true);        }    },    expand: function()     {        if (!this._expandable || (this.expanded && this._children))            return;        this.expanded = true;        this._populateIfNeeded();        this._listItemNode.classList.add("expanded");        this._childrenListNode.classList.add("expanded");        this.onexpand();        if (this.treeOutline)            this.treeOutline.dispatchEventToListeners(TreeOutline.Events.ElementExpanded, this);    },    expandRecursively: function(maxDepth)     {        var item = this;        var info = {};        var depth = 0;        if (isNaN(maxDepth))            maxDepth = 3;        while (item) {            if (depth < maxDepth)                item.expand();            item = item.traverseNextTreeElement(false, this, (depth >= maxDepth), info);            depth += info.depthChange;        }    },    reveal: function()     {        var currentAncestor = this.parent;        while (currentAncestor && !currentAncestor.root) {            if (!currentAncestor.expanded)                currentAncestor.expand();            currentAncestor = currentAncestor.parent;        }        this.listItemElement.scrollIntoViewIfNeeded();        this.onreveal();    },    revealed: function()     {        var currentAncestor = this.parent;        while (currentAncestor && !currentAncestor.root) {            if (!currentAncestor.expanded)                return false;            currentAncestor = currentAncestor.parent;        }        return true;    },    selectOnMouseDown: function(event)     {        if (this.select(false, true))            event.consume(true);    },    select: function(omitFocus, selectedByUser)     {        if (!this.treeOutline || !this.selectable || this.selected)            return false;        if (this.treeOutline.selectedTreeElement)            this.treeOutline.selectedTreeElement.deselect();        this.treeOutline.selectedTreeElement = null ;        if (this.treeOutline._rootElement === this)            return false;        this.selected = true;        if (!omitFocus)            this.treeOutline.focus();        if (!this.treeOutline)            return false;        this.treeOutline.selectedTreeElement = this;        this._listItemNode.classList.add("selected");        if (this._selectionElement)            this._selectionElement.style.height = this._listItemNode.offsetHeight + "px";        return this.onselect(selectedByUser);    },    revealAndSelect: function(omitFocus)     {        this.reveal();        this.select(omitFocus);    },    deselect: function(supressOnDeselect)     {        if (!this.treeOutline || this.treeOutline.selectedTreeElement !== this || !this.selected)            return;        this.selected = false;        this.treeOutline.selectedTreeElement = null ;        this._listItemNode.classList.remove("selected");    },    _populateIfNeeded: function()     {        if (this._expandable && !this._children) {            this._children = [];            this.onpopulate();        }    },    onpopulate: function()     {},    onenter: function()     {        return false;    },    ondelete: function()     {        return false;    },    onspace: function()     {        return false;    },    onbind: function()     {},    onunbind: function()     {},    onattach: function()     {},    onexpand: function()     {},    oncollapse: function()     {},    ondblclick: function(e)     {        return false;    },    onreveal: function()     {},    onselect: function(selectedByUser)     {        return false;    },    traverseNextTreeElement: function(skipUnrevealed, stayWithin, dontPopulate, info)     {        if (!dontPopulate)            this._populateIfNeeded();        if (info)            info.depthChange = 0;        var element = skipUnrevealed ? (this.revealed() ? this.firstChild() : null ) : this.firstChild();        if (element && (!skipUnrevealed || (skipUnrevealed && this.expanded))) {            if (info)                info.depthChange = 1;            return element;        }        if (this === stayWithin)            return null ;        element = skipUnrevealed ? (this.revealed() ? this.nextSibling : null ) : this.nextSibling;        if (element)            return element;        element = this;        while (element && !element.root && !(skipUnrevealed ? (element.revealed() ? element.nextSibling : null ) : element.nextSibling) && element.parent !== stayWithin) {            if (info)                info.depthChange -= 1;            element = element.parent;        }        if (!element || element.root)            return null ;        return ( skipUnrevealed ? (element.revealed() ? element.nextSibling : null ) : element.nextSibling) ;    },    traversePreviousTreeElement: function(skipUnrevealed, dontPopulate)     {        var element = skipUnrevealed ? (this.revealed() ? this.previousSibling : null ) : this.previousSibling;        if (!dontPopulate && element)            element._populateIfNeeded();        while (element && (skipUnrevealed ? (element.revealed() && element.expanded ? element.lastChild() : null ) : element.lastChild())) {            if (!dontPopulate)                element._populateIfNeeded();            element = (skipUnrevealed ? (element.revealed() && element.expanded ? element.lastChild() : null ) : element.lastChild());        }        if (element)            return element;        if (!this.parent || this.parent.root)            return null ;        return this.parent;    },    isEventWithinDisclosureTriangle: function(event)     {        var paddingLeftValue = window.getComputedStyle(this._listItemNode).paddingLeft;        console.assert(paddingLeftValue.endsWith("px"));        var computedLeftPadding = parseFloat(paddingLeftValue);        var left = this._listItemNode.totalOffsetLeft() + computedLeftPadding;        return event.pageX >= left && event.pageX <= left + TreeElement._ArrowToggleWidth && this._expandable;    }};WebInspector.ActionRegistry = function() {    this._actionsById = new Map();    this._registerActions();}WebInspector.ActionRegistry.prototype = {    _registerActions: function()     {        self.runtime.extensions(WebInspector.ActionDelegate).forEach(registerExtension, this);        function registerExtension(extension)         {            var actionId = extension.descriptor()["actionId"];            console.assert(actionId);            console.assert(!this._actionsById.get(actionId));            this._actionsById.set(actionId, extension);        }    },    applicableActions: function(actionIds, context)     {        var extensions = [];        actionIds.forEach(function(actionId) {            var extension = this._actionsById.get(actionId);            if (extension)                extensions.push(extension);        }        , this);        return context.applicableExtensions(extensions).valuesArray().map(function(extension) {            return extension.descriptor()["actionId"];        }        );    },    execute: function(actionId)     {        var extension = this._actionsById.get(actionId);        console.assert(extension, "No action found for actionId '" + actionId + "'");        return extension.instancePromise().then(handleAction);        function handleAction(actionDelegate)         {            (actionDelegate).handleAction(WebInspector.context, actionId);        }    }}WebInspector.ActionDelegate = function() {}WebInspector.ActionDelegate.prototype = {    handleAction: function(context, actionId) {}}WebInspector.actionRegistry;;WebInspector.ShortcutRegistry = function(actionRegistry, document) {    this._actionRegistry = actionRegistry;    this._defaultKeyToActions = new Multimap();    this._defaultActionToShortcut = new Multimap();    this._registerBindings(document);}WebInspector.ShortcutRegistry.prototype = {    applicableActions: function(key)     {        return this._actionRegistry.applicableActions(this._defaultActionsForKey(key).valuesArray(), WebInspector.context);    },    _defaultActionsForKey: function(key)     {        return this._defaultKeyToActions.get(String(key));    },    shortcutDescriptorsForAction: function(actionId)     {        return this._defaultActionToShortcut.get(actionId).valuesArray();    },    keysForActions: function(actionIds)     {        var result = [];        for (var i = 0; i < actionIds.length; ++i) {            var descriptors = this.shortcutDescriptorsForAction(actionIds[i]);            for (var j = 0; j < descriptors.length; ++j)                result.push(descriptors[j].key);        }        return result;    },    handleShortcut: function(event)     {        this.handleKey(WebInspector.KeyboardShortcut.makeKeyFromEvent(event), event.keyIdentifier, event);    },    handleKey: function(key, keyIdentifier, event)     {        var keyModifiers = key >> 8;        var actionIds = this.applicableActions(key);        if (!actionIds.length)            return;        if (WebInspector.GlassPane.DefaultFocusedViewStack.length > 1) {            if (event && !isPossiblyInputKey())                event.consume(true);            return;        }        if (!isPossiblyInputKey()) {            if (event)                event.consume(true);            processNextAction.call(this);        } else {            this._pendingActionTimer = setTimeout(processNextAction.bind(this), 0);        }        function processNextAction()         {            delete this._pendingActionTimer;            var actionId = actionIds.shift();            if (!actionId)                return;            this._actionRegistry.execute(actionId).then(processNextAction.bind(this));        }        function isPossiblyInputKey()         {            if (!event || !WebInspector.isEditing() || /^F\d+|Control|Shift|Alt|Meta|Win|U\+001B$/.test(keyIdentifier))                return false;            if (!keyModifiers)                return true;            var modifiers = WebInspector.KeyboardShortcut.Modifiers;            if ((keyModifiers & (modifiers.Ctrl | modifiers.Alt)) === (modifiers.Ctrl | modifiers.Alt))                return WebInspector.isWin();            return !hasModifier(modifiers.Ctrl) && !hasModifier(modifiers.Alt) && !hasModifier(modifiers.Meta);        }        function hasModifier(mod)         {            return !!(keyModifiers & mod);        }    },    registerShortcut: function(actionId, shortcut)     {        var descriptor = WebInspector.KeyboardShortcut.makeDescriptorFromBindingShortcut(shortcut);        if (!descriptor)            return;        this._defaultActionToShortcut.set(actionId, descriptor);        this._defaultKeyToActions.set(String(descriptor.key), actionId);    },    dismissPendingShortcutAction: function()     {        if (this._pendingActionTimer) {            clearTimeout(this._pendingActionTimer);            delete this._pendingActionTimer;        }    },    _registerBindings: function(document)     {        document.addEventListener("input", this.dismissPendingShortcutAction.bind(this), true);        var extensions = self.runtime.extensions(WebInspector.ActionDelegate);        extensions.forEach(registerExtension, this);        function registerExtension(extension)         {            var descriptor = extension.descriptor();            var bindings = descriptor["bindings"];            for (var i = 0; bindings && i < bindings.length; ++i) {                if (!platformMatches(bindings[i].platform))                    continue;var shortcuts = bindings[i]["shortcut"].split(/\s+/);                shortcuts.forEach(this.registerShortcut.bind(this, descriptor["actionId"]));            }        }        function platformMatches(platformsString)         {            if (!platformsString)                return true;            var platforms = platformsString.split(",");            var isMatch = false;            var currentPlatform = WebInspector.platform();            for (var i = 0; !isMatch && i < platforms.length; ++i)                isMatch = platforms[i] === currentPlatform;            return isMatch;        }    }}WebInspector.ShortcutRegistry.ForwardedShortcut = function() {}WebInspector.ShortcutRegistry.ForwardedShortcut.instance = new WebInspector.ShortcutRegistry.ForwardedShortcut();WebInspector.shortcutRegistry;;WebInspector.ColorSwatch = function() {}WebInspector.ColorSwatch.create = function() {    if (!WebInspector.ColorSwatch._constructor)        WebInspector.ColorSwatch._constructor = registerCustomElement("span", "color-swatch", WebInspector.ColorSwatch.prototype);    return ( new WebInspector.ColorSwatch._constructor()) ;}WebInspector.ColorSwatch.prototype = {    color: function()     {        return this._color;    },    setColorText: function(colorText)     {        this._color = WebInspector.Color.parse(colorText);        console.assert(this._color, "Color text could not be parsed.");        this._format = this._color.format();        this._colorValueElement.textContent = this._color.asString(this._format);        this._swatchInner.style.backgroundColor = colorText;    },    format: function()     {        return this._format;    },    setFormat: function(format)     {        this._format = format;        this._colorValueElement.textContent = this._color.asString(this._format);    },    toggleNextFormat: function()     {        do {            this._format = WebInspector.ColorSwatch._nextColorFormat(this._color, this._format);            var currentValue = this._color.asString(this._format);        } while (currentValue === this._colorValueElement.textContent);this._colorValueElement.textContent = currentValue;    },    iconElement: function()     {        return this._iconElement;    },    createdCallback: function()     {        var root = WebInspector.createShadowRootWithCoreStyles(this);        root.appendChild(WebInspector.Widget.createStyleElement("ui/colorSwatch.css"));        this._iconElement = root.createChild("span", "color-swatch");        this._iconElement.title = WebInspector.UIString("Shift-click to change color format.");        this._swatchInner = this._iconElement.createChild("span", "color-swatch-inner");        this._swatchInner.addEventListener("dblclick", consumeEvent, false);        this._swatchInner.addEventListener("mousedown", consumeEvent, false);        this._swatchInner.addEventListener("click", this._handleClick.bind(this), true);        root.createChild("content");        this._colorValueElement = this.createChild("span");        this.setColorText("white");    },    _handleClick: function(event)     {        if (!event.shiftKey)            return;        event.target.parentNode.parentNode.host.toggleNextFormat();        event.consume(true);    },    __proto__: HTMLSpanElement.prototype}WebInspector.ColorSwatch._nextColorFormat = function(color, curFormat) {    var cf = WebInspector.Color.Format;    switch (curFormat) {    case cf.Original:        return !color.hasAlpha() ? cf.RGB : cf.RGBA;    case cf.RGB:    case cf.RGBA:        return !color.hasAlpha() ? cf.HSL : cf.HSLA;    case cf.HSL:    case cf.HSLA:        if (color.nickname())            return cf.Nickname;        if (!color.hasAlpha())            return color.canBeShortHex() ? cf.ShortHEX : cf.HEX;        else            return cf.Original;    case cf.ShortHEX:        return cf.HEX;    case cf.HEX:        return cf.Original;    case cf.Nickname:        if (!color.hasAlpha())            return color.canBeShortHex() ? cf.ShortHEX : cf.HEX;        else            return cf.Original;    default:        return cf.RGBA;    }};WebInspector.Context = function() {    this._flavors = new Map();    this._eventDispatchers = new Map();}WebInspector.Context.Events = {    FlavorChanged: "FlavorChanged"}WebInspector.Context.prototype = {    setFlavor: function(flavorType, flavorValue)     {        var value = this._flavors.get(flavorType) || null ;        if (value === flavorValue)            return;        if (flavorValue)            this._flavors.set(flavorType, flavorValue);        else            this._flavors.remove(flavorType);        this._dispatchFlavorChange(flavorType, flavorValue);    },    _dispatchFlavorChange: function(flavorType, flavorValue)     {        var dispatcher = this._eventDispatchers.get(flavorType);        if (!dispatcher)            return;        dispatcher.dispatchEventToListeners(WebInspector.Context.Events.FlavorChanged, flavorValue);    },    addFlavorChangeListener: function(flavorType, listener, thisObject)     {        var dispatcher = this._eventDispatchers.get(flavorType);        if (!dispatcher) {            dispatcher = new WebInspector.Object();            this._eventDispatchers.set(flavorType, dispatcher);        }        dispatcher.addEventListener(WebInspector.Context.Events.FlavorChanged, listener, thisObject);    },    removeFlavorChangeListener: function(flavorType, listener, thisObject)     {        var dispatcher = this._eventDispatchers.get(flavorType);        if (!dispatcher)            return;        dispatcher.removeEventListener(WebInspector.Context.Events.FlavorChanged, listener, thisObject);        if (!dispatcher.hasEventListeners(WebInspector.Context.Events.FlavorChanged))            this._eventDispatchers.remove(flavorType);    },    flavor: function(flavorType)     {        return this._flavors.get(flavorType) || null ;    },    flavors: function()     {        return new Set(this._flavors.keys());    },    applicableExtensions: function(extensions)     {        var targetExtensionSet = new Set();        var availableFlavors = this.flavors();        extensions.forEach(function(extension) {            if (self.runtime.isExtensionApplicableToContextTypes(extension, availableFlavors))                targetExtensionSet.add(extension);        }        );        return targetExtensionSet;    }}WebInspector.context = new WebInspector.Context();;WebInspector.ContextMenuItem = function(topLevelMenu, type, label, disabled, checked) {    this._type = type;    this._label = label;    this._disabled = disabled;    this._checked = checked;    this._contextMenu = topLevelMenu;    if (type === "item" || type === "checkbox")        this._id = topLevelMenu.nextId();}WebInspector.ContextMenuItem.prototype = {    id: function()     {        return this._id;    },    type: function()     {        return this._type;    },    isEnabled: function()     {        return !this._disabled;    },    setEnabled: function(enabled)     {        this._disabled = !enabled;    },    _buildDescriptor: function()     {        switch (this._type) {        case "item":            return {                type: "item",                id: this._id,                label: this._label,                enabled: !this._disabled            };        case "separator":            return {                type: "separator"            };        case "checkbox":            return {                type: "checkbox",                id: this._id,                label: this._label,                checked: !!this._checked,                enabled: !this._disabled            };        }        throw new Error("Invalid item type:" + this._type);    }}WebInspector.ContextSubMenuItem = function(topLevelMenu, label, disabled) {    WebInspector.ContextMenuItem.call(this, topLevelMenu, "subMenu", label, disabled);    this._items = [];}WebInspector.ContextSubMenuItem.prototype = {    appendItem: function(label, handler, disabled)     {        var item = new WebInspector.ContextMenuItem(this._contextMenu,"item",label,disabled);        this._pushItem(item);        this._contextMenu._setHandler(item.id(), handler);        return item;    },    appendSubMenuItem: function(label, disabled)     {        var item = new WebInspector.ContextSubMenuItem(this._contextMenu,label,disabled);        this._pushItem(item);        return item;    },    appendCheckboxItem: function(label, handler, checked, disabled)     {        var item = new WebInspector.ContextMenuItem(this._contextMenu,"checkbox",label,disabled,checked);        this._pushItem(item);        this._contextMenu._setHandler(item.id(), handler);        return item;    },    appendSeparator: function()     {        if (this._items.length)            this._pendingSeparator = true;    },    _pushItem: function(item)     {        if (this._pendingSeparator) {            this._items.push(new WebInspector.ContextMenuItem(this._contextMenu,"separator"));            delete this._pendingSeparator;        }        this._items.push(item);    },    isEmpty: function()     {        return !this._items.length;    },    _buildDescriptor: function()     {        var result = {            type: "subMenu",            label: this._label,            enabled: !this._disabled,            subItems: []        };        for (var i = 0; i < this._items.length; ++i)            result.subItems.push(this._items[i]._buildDescriptor());        return result;    },    __proto__: WebInspector.ContextMenuItem.prototype}WebInspector.ContextMenu = function(event) {    WebInspector.ContextSubMenuItem.call(this, this, "");    this._pendingPromises = [];    this._pendingTargets = [];    this._event = event;    this._x = event.x;    this._y = event.y;    this._handlers = {};    this._id = 0;}WebInspector.ContextMenu.initialize = function() {    InspectorFrontendHost.events.addEventListener(InspectorFrontendHostAPI.Events.SetUseSoftMenu, setUseSoftMenu);    function setUseSoftMenu(event)     {        WebInspector.ContextMenu._useSoftMenu = (event.data);    }}WebInspector.ContextMenu.installHandler = function(doc) {    doc.body.addEventListener("contextmenu", handler, false);    function handler(event)     {        var contextMenu = new WebInspector.ContextMenu(event);        contextMenu.appendApplicableItems((event.deepElementFromPoint()));        contextMenu.show();    }}WebInspector.ContextMenu.prototype = {    nextId: function()     {        return this._id++;    },    show: function()     {        Promise.all(this._pendingPromises).then(populateAndShow.bind(this));        WebInspector.ContextMenu._pendingMenu = this;        function populateAndShow(appendCallResults)         {            if (WebInspector.ContextMenu._pendingMenu !== this)                return;            delete WebInspector.ContextMenu._pendingMenu;            for (var i = 0; i < appendCallResults.length; ++i) {                var providers = appendCallResults[i];                var target = this._pendingTargets[i];                for (var j = 0; j < providers.length; ++j) {                    var provider = (providers[j]);                    this.appendSeparator();                    provider.appendApplicableItems(this._event, this, target);                    this.appendSeparator();                }            }            this._pendingPromises = [];            this._pendingTargets = [];            this._innerShow();        }        this._event.consume(true);    },    _innerShow: function()     {        var menuObject = this._buildDescriptors();        WebInspector._contextMenu = this;        if (WebInspector.ContextMenu._useSoftMenu || InspectorFrontendHost.isHostedMode()) {            var softMenu = new WebInspector.SoftContextMenu(menuObject,this._itemSelected.bind(this));            softMenu.show(this._event.target.ownerDocument, this._x, this._y);        } else {            InspectorFrontendHost.showContextMenuAtPoint(this._x, this._y, menuObject, this._event.target.ownerDocument);            InspectorFrontendHost.events.addEventListener(InspectorFrontendHostAPI.Events.ContextMenuCleared, this._menuCleared, this);            InspectorFrontendHost.events.addEventListener(InspectorFrontendHostAPI.Events.ContextMenuItemSelected, this._onItemSelected, this);        }    },    _setHandler: function(id, handler)     {        if (handler)            this._handlers[id] = handler;    },    _buildDescriptors: function()     {        var result = [];        for (var i = 0; i < this._items.length; ++i)            result.push(this._items[i]._buildDescriptor());        return result;    },    _onItemSelected: function(event)     {        this._itemSelected((event.data));    },    _itemSelected: function(id)     {        if (this._handlers[id])            this._handlers[id].call(this);        this._menuCleared();    },    _menuCleared: function()     {        InspectorFrontendHost.events.removeEventListener(InspectorFrontendHostAPI.Events.ContextMenuCleared, this._menuCleared, this);        InspectorFrontendHost.events.removeEventListener(InspectorFrontendHostAPI.Events.ContextMenuItemSelected, this._onItemSelected, this);    },    appendApplicableItems: function(target)     {        this._pendingPromises.push(self.runtime.instancesPromise(WebInspector.ContextMenu.Provider, target));        this._pendingTargets.push(target);    },    __proto__: WebInspector.ContextSubMenuItem.prototype}WebInspector.ContextMenu.Provider = function() {}WebInspector.ContextMenu.Provider.prototype = {    appendApplicableItems: function(event, contextMenu, target) {}};WebInspector.Dialog = function(relativeToElement, delegate) {    this._delegate = delegate;    this._relativeToElement = relativeToElement;    this._glassPane = new WebInspector.GlassPane((relativeToElement.ownerDocument));    WebInspector.GlassPane.DefaultFocusedViewStack.push(this);    this._glassPane.element.tabIndex = 0;    this._glassPane.element.addEventListener("focus", this._onGlassPaneFocus.bind(this), false);    this._element = this._glassPane.element.createChild("div");    this._element.tabIndex = 0;    this._element.addEventListener("focus", this._onFocus.bind(this), false);    this._element.addEventListener("keydown", this._onKeyDown.bind(this), false);    this._closeKeys = [WebInspector.KeyboardShortcut.Keys.Enter.code, WebInspector.KeyboardShortcut.Keys.Esc.code, ];    delegate.show(this._element);    this._position();    this._delegate.focus();}WebInspector.Dialog.currentInstance = function() {    return WebInspector.Dialog._instance;}WebInspector.Dialog.show = function(relativeToElement, delegate) {    if (WebInspector.Dialog._instance)        return;    WebInspector.Dialog._instance = new WebInspector.Dialog(relativeToElement || WebInspector.Dialog.modalHostView().element,delegate);}WebInspector.Dialog.hide = function() {    if (!WebInspector.Dialog._instance)        return;    WebInspector.Dialog._instance._hide();}WebInspector.Dialog.prototype = {    focus: function()     {        this._element.focus();    },    _hide: function()     {        if (this._isHiding)            return;        this._isHiding = true;        this._delegate.willHide();        delete WebInspector.Dialog._instance;        WebInspector.GlassPane.DefaultFocusedViewStack.pop();        this._glassPane.dispose();    },    _onGlassPaneFocus: function(event)     {        this._hide();    },    _onFocus: function(event)     {        this._delegate.focus();    },    _position: function()     {        this._delegate.position(this._element, this._relativeToElement);    },    _onKeyDown: function(event)     {        if (event.keyCode === WebInspector.KeyboardShortcut.Keys.Tab.code) {            event.preventDefault();            return;        }        if (event.keyCode === WebInspector.KeyboardShortcut.Keys.Enter.code)            this._delegate.onEnter(event);        if (!event.handled && this._closeKeys.indexOf(event.keyCode) >= 0) {            this._hide();            event.consume(true);        }    }};WebInspector.DialogDelegate = function() {    this.element = createElement("div");}WebInspector.DialogDelegate.prototype = {    show: function(element)     {        element.appendChild(this.element);        this.element.classList.add("dialog-contents");        element.classList.add("dialog");    },    position: function(element, relativeToElement)     {        var container = WebInspector.Dialog._modalHostView.element;        var box = relativeToElement.boxInWindow(window).relativeToElement(container);        var positionX = box.x + (relativeToElement.offsetWidth - element.offsetWidth) / 2;        positionX = Number.constrain(positionX, 0, container.offsetWidth - element.offsetWidth);        var positionY = box.y + (relativeToElement.offsetHeight - element.offsetHeight) / 2;        positionY = Number.constrain(positionY, 0, container.offsetHeight - element.offsetHeight);        element.style.position = "absolute";        element.positionAt(positionX, positionY, container);    },    focus: function() {},    onEnter: function(event) {},    willHide: function() {},    __proto__: WebInspector.Object.prototype}WebInspector.Dialog._modalHostView = null ;WebInspector.Dialog.setModalHostView = function(view) {    WebInspector.Dialog._modalHostView = view;};WebInspector.Dialog.modalHostView = function() {    return WebInspector.Dialog._modalHostView;};WebInspector.Dialog.modalHostRepositioned = function() {    if (WebInspector.Dialog._instance)        WebInspector.Dialog._instance._position();};;WebInspector.DOMSyntaxHighlighter = function(mimeType, stripExtraWhitespace) {    this._mimeType = mimeType;    this._stripExtraWhitespace = stripExtraWhitespace;}WebInspector.DOMSyntaxHighlighter.prototype = {    createSpan: function(content, className)     {        var span = createElement("span");        span.className = "cm-" + className;        if (this._stripExtraWhitespace && className !== "whitespace")            content = content.replace(/^[\n\r]*/, "").replace(/\s*$/, "");        span.createTextChild(content);        return span;    },    syntaxHighlightNode: function(node)     {        var lines = node.textContent.split("\n");        var plainTextStart;        var line;        return self.runtime.instancePromise(WebInspector.TokenizerFactory).then(processTokens.bind(this));        function processTokens(tokenizerFactory)         {            node.removeChildren();            var tokenize = tokenizerFactory.createTokenizer(this._mimeType);            for (var i = lines[0].length ? 0 : 1; i < lines.length; ++i) {                line = lines[i];                plainTextStart = 0;                tokenize(line, processToken.bind(this));                if (plainTextStart < line.length) {                    var plainText = line.substring(plainTextStart, line.length);                    node.createTextChild(plainText);                }                if (i < lines.length - 1)                    node.createTextChild("\n");            }        }        function processToken(token, tokenType, column, newColumn)         {            if (!tokenType)                return;            if (column > plainTextStart) {                var plainText = line.substring(plainTextStart, column);                node.createTextChild(plainText);            }            node.appendChild(this.createSpan(token, tokenType));            plainTextStart = newColumn;        }    }};WebInspector.DropDownMenu = function(element) {    this._items = [];    element.addEventListener("mousedown", this._onMouseDown.bind(this));}WebInspector.DropDownMenu.Item;WebInspector.DropDownMenu.Events = {    ItemSelected: "ItemSelected"}WebInspector.DropDownMenu.prototype = {    _onMouseDown: function(event)     {        if (event.which !== 1)            return;        var menu = new WebInspector.ContextMenu(event);        for (var item of this._items)            menu.appendCheckboxItem(item.title, this._itemHandler.bind(this, item.id), item.id === this._selectedItemId);        menu.show();    },    _itemHandler: function(id)     {        this.dispatchEventToListeners(WebInspector.DropDownMenu.Events.ItemSelected, id);    },    addItem: function(id, title)     {        this._items.push({            id: id,            title: title        });    },    selectItem: function(id)     {        this._selectedItemId = id;    },    clear: function()     {        this._items = [];        delete this._selectedItemId;    },    __proto__: WebInspector.Object.prototype};WebInspector.DropTarget = function(element, transferTypes, messageText, handleDrop) {    element.addEventListener("dragenter", this._onDragEnter.bind(this), true);    element.addEventListener("dragover", this._onDragOver.bind(this), true);    this._element = element;    this._transferTypes = transferTypes;    this._messageText = messageText;    this._handleDrop = handleDrop;    this._enabled = true;}WebInspector.DropTarget.Types = {    Files: "Files",    URIList: "text/uri-list"}WebInspector.DropTarget.prototype = {    setEnabled: function(enabled)     {        this._enabled = enabled;    },    _onDragEnter: function(event)     {        if (this._enabled && this._hasMatchingType(event))            event.consume(true);    },    _hasMatchingType: function(event)     {        for (var type of this._transferTypes) {            if (event.dataTransfer.types.indexOf(type) !== -1)                return true;        }        return false;    },    _onDragOver: function(event)     {        if (!this._enabled || !this._hasMatchingType(event))            return;        event.dataTransfer.dropEffect = "copy";        event.consume(true);        if (this._dragMaskElement)            return;        this._dragMaskElement = this._element.createChild("div", "");        var shadowRoot = WebInspector.createShadowRootWithCoreStyles(this._dragMaskElement);        shadowRoot.appendChild(WebInspector.Widget.createStyleElement("ui/dropTarget.css"));        shadowRoot.createChild("div", "drop-target-message").textContent = this._messageText;        this._dragMaskElement.addEventListener("drop", this._onDrop.bind(this), true);        this._dragMaskElement.addEventListener("dragleave", this._onDragLeave.bind(this), true);    },    _onDrop: function(event)     {        event.consume(true);        this._removeMask();        if (this._enabled)            this._handleDrop(event.dataTransfer);    },    _onDragLeave: function(event)     {        event.consume(true);        this._removeMask();    },    _removeMask: function()     {        this._dragMaskElement.remove();        delete this._dragMaskElement;    }};WebInspector.EmptyWidget = function(text) {    WebInspector.VBox.call(this);    this.registerRequiredCSS("ui/emptyWidget.css");    this.element.classList.add("empty-view");    this.textElement = this.element.createChild("span");    this._text = text;}WebInspector.EmptyWidget.prototype = {    wasShown: function()     {        this.textElement.textContent = this._text;    },    set text(text)     {        this._text = text;        if (this.isShowing())            this.textElement.textContent = this._text;    },    __proto__: WebInspector.VBox.prototype};WebInspector.FilterBar = function(name, visibleByDefault) {    this._filtersShown = false;    this._element = createElementWithClass("div", "filter-bar hidden");    this._filterButton = new WebInspector.ToolbarButton(WebInspector.UIString("Filter"),"filter-toolbar-item",3);    this._filterButton.element.addEventListener("click", this._handleFilterButtonClick.bind(this), false);    this._filters = [];    this._stateSetting = WebInspector.settings.createSetting("filterBar-" + name + "-toggled", !!visibleByDefault);    this._setState(this._stateSetting.get());}WebInspector.FilterBar.FilterBarState = {    Inactive: "inactive",    Active: "active",    Shown: "shown"};WebInspector.FilterBar.prototype = {    filterButton: function()     {        return this._filterButton;    },    filtersElement: function()     {        return this._element;    },    filtersToggled: function()     {        return this._filtersShown;    },    addFilter: function(filter)     {        this._filters.push(filter);        this._element.appendChild(filter.element());        filter.addEventListener(WebInspector.FilterUI.Events.FilterChanged, this._filterChanged, this);        this._updateFilterButton();    },    _filterChanged: function(event)     {        this._updateFilterButton();    },    _filterBarState: function()     {        if (this._filtersShown)            return WebInspector.FilterBar.FilterBarState.Shown;        var isActive = false;        for (var i = 0; i < this._filters.length; ++i) {            if (this._filters[i].isActive())                return WebInspector.FilterBar.FilterBarState.Active;        }        return WebInspector.FilterBar.FilterBarState.Inactive;    },    _updateFilterButton: function()     {        this._filterButton.setState(this._filterBarState());    },    _handleFilterButtonClick: function(event)     {        this._setState(!this._filtersShown);    },    _setState: function(filtersShown)     {        if (this._filtersShown === filtersShown)            return;        this._filtersShown = filtersShown;        if (this._stateSetting)            this._stateSetting.set(filtersShown);        this._updateFilterButton();        this._element.classList.toggle("hidden", !this._filtersShown);        if (this._filtersShown) {            for (var i = 0; i < this._filters.length; ++i) {                if (this._filters[i] instanceof WebInspector.TextFilterUI) {                    var textFilterUI = (this._filters[i]);                    textFilterUI.focus();                }            }        }    },    clear: function()     {        this._element.removeChildren();        this._filters = [];        this._updateFilterButton();    },    __proto__: WebInspector.Object.prototype}WebInspector.FilterUI = function() {}WebInspector.FilterUI.Events = {    FilterChanged: "FilterChanged"}WebInspector.FilterUI.prototype = {    isActive: function() {},    element: function() {}}WebInspector.TextFilterUI = function(supportRegex) {    this._supportRegex = !!supportRegex;    this._regex = null ;    this._filterElement = createElement("div");    this._filterElement.className = "filter-text-filter";    this._filterInputElement = (this._filterElement.createChild("input", "filter-input-field"));    this._filterInputElement.placeholder = WebInspector.UIString("Filter");    this._filterInputElement.id = "filter-input-field";    this._filterInputElement.addEventListener("mousedown", this._onFilterFieldManualFocus.bind(this), false);    this._filterInputElement.addEventListener("input", this._onInput.bind(this), false);    this._filterInputElement.addEventListener("change", this._onChange.bind(this), false);    this._filterInputElement.addEventListener("keydown", this._onInputKeyDown.bind(this), true);    this._filterInputElement.addEventListener("blur", this._onBlur.bind(this), true);    this._suggestionBuilder = null ;    this._suggestBox = new WebInspector.SuggestBox(this);    if (this._supportRegex) {        this._filterElement.classList.add("supports-regex");        var label = createCheckboxLabel(WebInspector.UIString("Regex"));        this._regexCheckBox = label.checkboxElement;        this._regexCheckBox.id = "text-filter-regex";        this._regexCheckBox.addEventListener("change", this._onInput.bind(this), false);        this._filterElement.appendChild(label);        this._regexLabel = this._filterElement.textElement;    }}WebInspector.TextFilterUI.prototype = {    isActive: function()     {        return !!this._filterInputElement.value;    },    element: function()     {        return this._filterElement;    },    value: function()     {        return this._filterInputElement.value;    },    setValue: function(value)     {        this._filterInputElement.value = value;        this._valueChanged(false);    },    regex: function()     {        return this._regex;    },    _onFilterFieldManualFocus: function(event)     {        WebInspector.setCurrentFocusElement((event.target));    },    _onBlur: function(event)     {        this._cancelSuggestion();    },    _cancelSuggestion: function()     {        if (this._suggestionBuilder && this._suggestBox.visible) {            this._suggestionBuilder.unapplySuggestion(this._filterInputElement);            this._suggestBox.hide();        }    },    _onInput: function()     {        this._valueChanged(true);    },    _onChange: function()     {        this._valueChanged(false);    },    focus: function()     {        this._filterInputElement.focus();    },    setSuggestionBuilder: function(suggestionBuilder)     {        this._cancelSuggestion();        this._suggestionBuilder = suggestionBuilder;    },    _updateSuggestions: function()     {        if (!this._suggestionBuilder)            return;        var suggestions = this._suggestionBuilder.buildSuggestions(this._filterInputElement);        if (suggestions && suggestions.length) {            if (this._suppressSuggestion)                delete this._suppressSuggestion;            else                this._suggestionBuilder.applySuggestion(this._filterInputElement, suggestions[0], true);            var anchorBox = this._filterInputElement.boxInWindow().relativeTo(new AnchorBox(-3,0));            this._suggestBox.updateSuggestions(anchorBox, suggestions, 0, true, "");        } else {            this._suggestBox.hide();        }    },    _valueChanged: function(showSuggestions)     {        if (showSuggestions)            this._updateSuggestions();        else            this._suggestBox.hide();        var filterQuery = this.value();        this._regex = null ;        this._filterInputElement.classList.remove("filter-text-invalid");        if (filterQuery) {            if (this._supportRegex && this._regexCheckBox.checked) {                try {                    this._regex = new RegExp(filterQuery,"i");                } catch (e) {                    this._filterInputElement.classList.add("filter-text-invalid");                }            } else {                this._regex = createPlainTextSearchRegex(filterQuery, "i");            }        }        this._dispatchFilterChanged();    },    _dispatchFilterChanged: function()     {        this.dispatchEventToListeners(WebInspector.FilterUI.Events.FilterChanged, null );    },    _onInputKeyDown: function(event)     {        var handled = false;        if (event.keyIdentifier === "U+0008") {            this._suppressSuggestion = true;        } else if (this._suggestBox.visible()) {            if (event.keyIdentifier === "U+001B") {                this._cancelSuggestion();                handled = true;            } else if (event.keyIdentifier === "U+0009") {                this._suggestBox.acceptSuggestion();                this._valueChanged(true);                handled = true;            } else {                handled = this._suggestBox.keyPressed((event));            }        }        if (handled)            event.consume(true);        return handled;    },    applySuggestion: function(suggestion, isIntermediateSuggestion)     {        if (!this._suggestionBuilder)            return;        this._suggestionBuilder.applySuggestion(this._filterInputElement, suggestion, !!isIntermediateSuggestion);        if (isIntermediateSuggestion)            this._dispatchFilterChanged();    },    acceptSuggestion: function()     {        this._filterInputElement.scrollLeft = this._filterInputElement.scrollWidth;        this._valueChanged(true);    },    __proto__: WebInspector.Object.prototype}WebInspector.TextFilterUI.SuggestionBuilder = function() {}WebInspector.TextFilterUI.SuggestionBuilder.prototype = {    buildSuggestions: function(input) {},    applySuggestion: function(input, suggestion, isIntermediate) {},    unapplySuggestion: function(input) {}}WebInspector.NamedBitSetFilterUI = function(items, setting) {    this._filtersElement = createElementWithClass("div", "filter-bitset-filter");    this._filtersElement.title = WebInspector.UIString("Use %s Click to select multiple types.", WebInspector.KeyboardShortcut.shortcutToString("", WebInspector.KeyboardShortcut.Modifiers.CtrlOrMeta));    this._allowedTypes = {};    this._typeFilterElements = {};    this._addBit(WebInspector.NamedBitSetFilterUI.ALL_TYPES, WebInspector.UIString("All"));    this._filtersElement.createChild("div", "filter-bitset-filter-divider");    for (var i = 0; i < items.length; ++i)        this._addBit(items[i].name, items[i].label, items[i].title);    if (setting) {        this._setting = setting;        setting.addChangeListener(this._settingChanged.bind(this));        this._settingChanged();    } else {        this._toggleTypeFilter(WebInspector.NamedBitSetFilterUI.ALL_TYPES, false);    }}WebInspector.NamedBitSetFilterUI.Item;WebInspector.NamedBitSetFilterUI.ALL_TYPES = "all";WebInspector.NamedBitSetFilterUI.prototype = {    isActive: function()     {        return !this._allowedTypes[WebInspector.NamedBitSetFilterUI.ALL_TYPES];    },    element: function()     {        return this._filtersElement;    },    accept: function(typeName)     {        return !!this._allowedTypes[WebInspector.NamedBitSetFilterUI.ALL_TYPES] || !!this._allowedTypes[typeName];    },    _settingChanged: function()     {        var allowedTypes = this._setting.get();        this._allowedTypes = {};        for (var typeName in this._typeFilterElements) {            if (allowedTypes[typeName])                this._allowedTypes[typeName] = true;        }        this._update();    },    _update: function()     {        if ((Object.keys(this._allowedTypes).length === 0) || this._allowedTypes[WebInspector.NamedBitSetFilterUI.ALL_TYPES]) {            this._allowedTypes = {};            this._allowedTypes[WebInspector.NamedBitSetFilterUI.ALL_TYPES] = true;        }        for (var typeName in this._typeFilterElements)            this._typeFilterElements[typeName].classList.toggle("selected", this._allowedTypes[typeName]);        this.dispatchEventToListeners(WebInspector.FilterUI.Events.FilterChanged, null );    },    _addBit: function(name, label, title)     {        var typeFilterElement = this._filtersElement.createChild("li", name);        typeFilterElement.typeName = name;        typeFilterElement.createTextChild(label);        if (title)            typeFilterElement.title = title;        typeFilterElement.addEventListener("click", this._onTypeFilterClicked.bind(this), false);        this._typeFilterElements[name] = typeFilterElement;    },    _onTypeFilterClicked: function(e)     {        var toggle;        if (WebInspector.isMac())            toggle = e.metaKey && !e.ctrlKey && !e.altKey && !e.shiftKey;        else            toggle = e.ctrlKey && !e.metaKey && !e.altKey && !e.shiftKey;        this._toggleTypeFilter(e.target.typeName, toggle);    },    _toggleTypeFilter: function(typeName, allowMultiSelect)     {        if (allowMultiSelect && typeName !== WebInspector.NamedBitSetFilterUI.ALL_TYPES)            this._allowedTypes[WebInspector.NamedBitSetFilterUI.ALL_TYPES] = false;        else            this._allowedTypes = {};        this._allowedTypes[typeName] = !this._allowedTypes[typeName];        if (this._setting)            this._setting.set(this._allowedTypes);        else            this._update();    },    __proto__: WebInspector.Object.prototype}WebInspector.ComboBoxFilterUI = function(options) {    this._filterElement = createElement("div");    this._filterElement.className = "filter-combobox-filter";    this._options = options;    this._filterComboBox = new WebInspector.ToolbarComboBox(this._filterChanged.bind(this));    for (var i = 0; i < options.length; ++i) {        var filterOption = options[i];        var option = createElement("option");        option.text = filterOption.label;        option.title = filterOption.title;        this._filterComboBox.addOption(option);        this._filterComboBox.element.title = this._filterComboBox.selectedOption().title;    }    this._filterElement.appendChild(this._filterComboBox.element);}WebInspector.ComboBoxFilterUI.prototype = {    isActive: function()     {        return this._filterComboBox.selectedIndex() !== 0;    },    element: function()     {        return this._filterElement;    },    value: function(typeName)     {        var option = this._options[this._filterComboBox.selectedIndex()];        return option.value;    },    setSelectedIndex: function(index)     {        this._filterComboBox.setSelectedIndex(index);    },    selectedIndex: function(index)     {        return this._filterComboBox.selectedIndex();    },    _filterChanged: function(event)     {        var option = this._options[this._filterComboBox.selectedIndex()];        this._filterComboBox.element.title = option.title;        this.dispatchEventToListeners(WebInspector.FilterUI.Events.FilterChanged, null );    },    __proto__: WebInspector.Object.prototype}WebInspector.CheckboxFilterUI = function(className, title, activeWhenChecked, setting) {    this._filterElement = createElementWithClass("div", "filter-checkbox-filter");    this._activeWhenChecked = !!activeWhenChecked;    this._label = createCheckboxLabel(title);    this._filterElement.appendChild(this._label);    this._checkboxElement = this._label.checkboxElement;    if (setting)        WebInspector.SettingsUI.bindCheckbox(this._checkboxElement, setting);    else        this._checkboxElement.checked = true;    this._checkboxElement.addEventListener("change", this._fireUpdated.bind(this), false);}WebInspector.CheckboxFilterUI.prototype = {    isActive: function()     {        return this._activeWhenChecked === this._checkboxElement.checked;    },    checked: function()     {        return this._checkboxElement.checked;    },    element: function()     {        return this._filterElement;    },    _fireUpdated: function()     {        this.dispatchEventToListeners(WebInspector.FilterUI.Events.FilterChanged, null );    },    setColor: function(backgroundColor, borderColor)     {        this._label.backgroundColor = backgroundColor;        this._label.borderColor = borderColor;    },    __proto__: WebInspector.Object.prototype};WebInspector.ForwardedInputEventHandler = function() {    InspectorFrontendHost.events.addEventListener(InspectorFrontendHostAPI.Events.KeyEventUnhandled, this._onKeyEventUnhandled, this);}WebInspector.ForwardedInputEventHandler.prototype = {    _onKeyEventUnhandled: function(event)     {        var data = event.data;        var type = (data.type);        var keyIdentifier = (data.keyIdentifier);        var keyCode = (data.keyCode);        var modifiers = (data.modifiers);        if (type !== "keydown")            return;        WebInspector.context.setFlavor(WebInspector.ShortcutRegistry.ForwardedShortcut, WebInspector.ShortcutRegistry.ForwardedShortcut.instance);        WebInspector.shortcutRegistry.handleKey(WebInspector.KeyboardShortcut.makeKey(keyCode, modifiers), keyIdentifier);        WebInspector.context.setFlavor(WebInspector.ShortcutRegistry.ForwardedShortcut, null );    }}WebInspector.forwardedEventHandler = new WebInspector.ForwardedInputEventHandler();;WebInspector.HelpScreen = function(title) {    WebInspector.VBox.call(this);    this.markAsRoot();    this.registerRequiredCSS("ui/helpScreen.css");    this.element.classList.add("help-window-outer");    this.element.addEventListener("keydown", this._onKeyDown.bind(this), false);    this.element.tabIndex = 0;    if (title) {        var mainWindow = this.element.createChild("div", "help-window-main");        var captionWindow = mainWindow.createChild("div", "help-window-caption");        captionWindow.appendChild(this.createCloseButton());        this.helpContentElement = mainWindow.createChild("div", "help-content");        captionWindow.createChild("h1", "help-window-title").textContent = title;    }}WebInspector.HelpScreen._visibleScreen = null ;WebInspector.HelpScreen.prototype = {    createCloseButton: function()     {        var closeButton = createElementWithClass("div", "help-close-button", "dt-close-button");        closeButton.gray = true;        closeButton.addEventListener("click", this.hide.bind(this), false);        return closeButton;    },    showModal: function()     {        var visibleHelpScreen = WebInspector.HelpScreen._visibleScreen;        if (visibleHelpScreen === this)            return;        if (visibleHelpScreen)            visibleHelpScreen.hide();        WebInspector.HelpScreen._visibleScreen = this;        WebInspector.GlassPane.DefaultFocusedViewStack.push(this);        this.show(WebInspector.Dialog.modalHostView().element);        this.focus();    },    hide: function()     {        if (!this.isShowing())            return;        WebInspector.HelpScreen._visibleScreen = null ;        WebInspector.GlassPane.DefaultFocusedViewStack.pop();        WebInspector.restoreFocusFromElement(this.element);        this.detach();    },    isClosingKey: function(keyCode)     {        return [WebInspector.KeyboardShortcut.Keys.Enter.code, WebInspector.KeyboardShortcut.Keys.Esc.code, WebInspector.KeyboardShortcut.Keys.Space.code, ].indexOf(keyCode) >= 0;    },    _onKeyDown: function(event)     {        if (this.isShowing() && this.isClosingKey(event.keyCode)) {            this.hide();            event.consume();        }    },    __proto__: WebInspector.VBox.prototype};WebInspector.HistoryInput = function() {}WebInspector.HistoryInput.create = function() {    if (!WebInspector.HistoryInput._constructor)        WebInspector.HistoryInput._constructor = registerCustomElement("input", "history-input", WebInspector.HistoryInput.prototype);    return ( new WebInspector.HistoryInput._constructor()) ;}WebInspector.HistoryInput.prototype = {    createdCallback: function()     {        this._history = [""];        this._historyPosition = 0;        this.addEventListener("keydown", this._onKeyDown.bind(this), false);        this.addEventListener("input", this._onInput.bind(this), false);    },    _onInput: function(event)     {        if (this._history.length === this._historyPosition + 1)            this._history[this._history.length - 1] = this.value;    },    _onKeyDown: function(event)     {        if (event.keyCode === WebInspector.KeyboardShortcut.Keys.Up.code) {            this._historyPosition = Math.max(this._historyPosition - 1, 0);            this.value = this._history[this._historyPosition];            this.dispatchEvent(createEvent("input", true, true));            event.consume(true);        } else if (event.keyCode === WebInspector.KeyboardShortcut.Keys.Down.code) {            this._historyPosition = Math.min(this._historyPosition + 1, this._history.length - 1);            this.value = this._history[this._historyPosition];            this.dispatchEvent(createEvent("input", true, true));            event.consume(true);        } else if (event.keyCode === WebInspector.KeyboardShortcut.Keys.Enter.code) {            this._saveToHistory();        }    },    _saveToHistory: function()     {        if (this._history.length > 1 && this._history[this._history.length - 2] === this.value)            return;        this._history[this._history.length - 1] = this.value;        this._historyPosition = this._history.length - 1;        this._history.push("");    },    __proto__: HTMLInputElement.prototype};WebInspector.Infobar = function(type, disableSetting) {    this.element = createElementWithClass("div");    this._shadowRoot = WebInspector.createShadowRootWithCoreStyles(this.element);    this._shadowRoot.appendChild(WebInspector.Widget.createStyleElement("ui/infobar.css"));    this._contentElement = this._shadowRoot.createChild("div", "infobar infobar-" + type);    this._contentElement.createChild("label", "icon", "dt-icon-label").type = type + "-icon";    this._contentElement.createChild("div", "content").createChild("content");    this._disableSetting = null ;    if (disableSetting) {        this._disableSetting = disableSetting;        disableSetting.addChangeListener(this._updateVisibility, this);        var disableButton = this._contentElement.createChild("div", "disable-button");        disableButton.textContent = WebInspector.UIString("Never show");        disableButton.addEventListener("click", disableSetting.set.bind(disableSetting, true), false);    }    this._closeButton = this._contentElement.createChild("div", "close-button", "dt-close-button");    this._closeButton.addEventListener("click", this.close.bind(this), false);    this._closeCallback = null ;    this.setVisible(false);}WebInspector.Infobar.Type = {    Warning: "warning",    Info: "info"}WebInspector.Infobar.prototype = {    setVisible: function(visible)     {        this._visible = visible;        if (this._disableSetting)            visible = visible && !this._disableSetting.get();        this.element.classList.toggle("hidden", !visible);    },    _updateVisibility: function()     {        this.setVisible(this._visible);    },    close: function()     {        this.setVisible(false);        if (this._closeCallback)            this._closeCallback.call(null );    },    setCloseCallback: function(callback)     {        this._closeCallback = callback;    }};WebInspector.InplaceEditor = function() {}WebInspector.InplaceEditor.Controller;WebInspector.InplaceEditor.startEditing = function(element, config) {    if (!WebInspector.InplaceEditor._defaultInstance)        WebInspector.InplaceEditor._defaultInstance = new WebInspector.InplaceEditor();    return WebInspector.InplaceEditor._defaultInstance.startEditing(element, config);}WebInspector.InplaceEditor.startMultilineEditing = function(element, config) {    return self.runtime.instancePromise(WebInspector.InplaceEditor).then(startEditing);    function startEditing(inplaceEditor)     {        var controller = (inplaceEditor).startEditing(element, config);        if (!controller)            return Promise.reject(new Error("Editing is already in progress"));        return controller;    }}WebInspector.InplaceEditor.prototype = {    editorContent: function(editingContext) {        var element = editingContext.element;        if (element.tagName === "INPUT" && element.type === "text")            return element.value;        return element.textContent;    },    setUpEditor: function(editingContext)     {        var element = editingContext.element;        element.classList.add("editing");        var oldTabIndex = element.getAttribute("tabIndex");        if (typeof oldTabIndex !== "number" || oldTabIndex < 0)            element.tabIndex = 0;        WebInspector.setCurrentFocusElement(element);        editingContext.oldTabIndex = oldTabIndex;    },    closeEditor: function(editingContext)     {        var element = editingContext.element;        element.classList.remove("editing");        if (typeof editingContext.oldTabIndex !== "number")            element.removeAttribute("tabIndex");        else            element.tabIndex = editingContext.oldTabIndex;        element.scrollTop = 0;        element.scrollLeft = 0;    },    cancelEditing: function(editingContext)     {        var element = editingContext.element;        if (element.tagName === "INPUT" && element.type === "text")            element.value = editingContext.oldText;        else            element.textContent = editingContext.oldText;    },    augmentEditingHandle: function(editingContext, handle)     {},    startEditing: function(element, config)     {        if (!WebInspector.markBeingEdited(element, true))            return null ;        config = config || new WebInspector.InplaceEditor.Config(function() {}        ,function() {}        );        var editingContext = {            element: element,            config: config        };        var committedCallback = config.commitHandler;        var cancelledCallback = config.cancelHandler;        var pasteCallback = config.pasteHandler;        var context = config.context;        var isMultiline = config.multiline || false;        var moveDirection = "";        var self = this;        function consumeCopy(e)         {            e.consume();        }        this.setUpEditor(editingContext);        editingContext.oldText = isMultiline ? config.initialValue : this.editorContent(editingContext);        function blurEventListener(e) {            if (config.blurHandler && !config.blurHandler(element, e))                return;            if (!isMultiline || !e || !e.relatedTarget || !e.relatedTarget.isSelfOrDescendant(element))                editingCommitted.call(element);        }        function cleanUpAfterEditing()         {            WebInspector.markBeingEdited(element, false);            element.removeEventListener("blur", blurEventListener, isMultiline);            element.removeEventListener("keydown", keyDownEventListener, true);            if (pasteCallback)                element.removeEventListener("paste", pasteEventListener, true);            WebInspector.restoreFocusFromElement(element);            self.closeEditor(editingContext);        }        function editingCancelled()         {            self.cancelEditing(editingContext);            cleanUpAfterEditing();            cancelledCallback(this, context);        }        function editingCommitted()         {            cleanUpAfterEditing();            committedCallback(this, self.editorContent(editingContext), editingContext.oldText, context, moveDirection);        }        function defaultFinishHandler(event)         {            var isMetaOrCtrl = WebInspector.isMac() ? event.metaKey && !event.shiftKey && !event.ctrlKey && !event.altKey : event.ctrlKey && !event.shiftKey && !event.metaKey && !event.altKey;            if (isEnterKey(event) && (event.isMetaOrCtrlForTest || !isMultiline || isMetaOrCtrl))                return "commit";            else if (event.keyCode === WebInspector.KeyboardShortcut.Keys.Esc.code || event.keyIdentifier === "U+001B")                return "cancel";            else if (!isMultiline && event.keyIdentifier === "U+0009")                return "move-" + (event.shiftKey ? "backward" : "forward");            return "";        }        function handleEditingResult(result, event)         {            if (result === "commit") {                editingCommitted.call(element);                event.consume(true);            } else if (result === "cancel") {                editingCancelled.call(element);                event.consume(true);            } else if (result && result.startsWith("move-")) {                moveDirection = result.substring(5);                if (event.keyIdentifier !== "U+0009")                    blurEventListener();            }        }        function pasteEventListener(event)         {            var result = pasteCallback(event);            handleEditingResult(result, event);        }        function keyDownEventListener(event)         {            var result = defaultFinishHandler(event);            if (!result && config.postKeydownFinishHandler)                result = config.postKeydownFinishHandler(event);            handleEditingResult(result, event);        }        element.addEventListener("blur", blurEventListener, isMultiline);        element.addEventListener("keydown", keyDownEventListener, true);        if (pasteCallback)            element.addEventListener("paste", pasteEventListener, true);        var handle = {            cancel: editingCancelled.bind(element),            commit: editingCommitted.bind(element),            setWidth: function() {}        };        this.augmentEditingHandle(editingContext, handle);        return handle;    }}WebInspector.InplaceEditor.Config = function(commitHandler, cancelHandler, context, blurHandler) {    this.commitHandler = commitHandler;    this.cancelHandler = cancelHandler;    this.context = context;    this.blurHandler = blurHandler;    this.pasteHandler;    this.multiline;    this.postKeydownFinishHandler;}WebInspector.InplaceEditor.Config.prototype = {    setPasteHandler: function(pasteHandler)     {        this.pasteHandler = pasteHandler;    },    setMultilineOptions: function(initialValue, mode, theme, lineWrapping, smartIndent)     {        this.multiline = true;        this.initialValue = initialValue;        this.mode = mode;        this.theme = theme;        this.lineWrapping = lineWrapping;        this.smartIndent = smartIndent;    },    setPostKeydownFinishHandler: function(postKeydownFinishHandler)     {        this.postKeydownFinishHandler = postKeydownFinishHandler;    }};WebInspector.KeyboardShortcut = function() {}WebInspector.KeyboardShortcut.Modifiers = {    None: 0,    Shift: 1,    Ctrl: 2,    Alt: 4,    Meta: 8,    get CtrlOrMeta()     {        return WebInspector.isMac() ? this.Meta : this.Ctrl;    },    get ShiftOrOption()     {        return WebInspector.isMac() ? this.Alt : this.Shift;    }};WebInspector.KeyboardShortcut.Key;WebInspector.KeyboardShortcut.Keys = {    Backspace: {        code: 8,        name: "\u21a4"    },    Tab: {        code: 9,        name: {            mac: "\u21e5",            other: "Tab"        }    },    Enter: {        code: 13,        name: {            mac: "\u21a9",            other: "Enter"        }    },    Shift: {        code: 16,        name: {            mac: "\u21e7",            other: "Shift"        }    },    Ctrl: {        code: 17,        name: "Ctrl"    },    Esc: {        code: 27,        name: {            mac: "\u238b",            other: "Esc"        }    },    Space: {        code: 32,        name: "Space"    },    PageUp: {        code: 33,        name: {            mac: "\u21de",            other: "PageUp"        }    },    PageDown: {        code: 34,        name: {            mac: "\u21df",            other: "PageDown"        }    },    End: {        code: 35,        name: {            mac: "\u2197",            other: "End"        }    },    Home: {        code: 36,        name: {            mac: "\u2196",            other: "Home"        }    },    Left: {        code: 37,        name: "\u2190"    },    Up: {        code: 38,        name: "\u2191"    },    Right: {        code: 39,        name: "\u2192"    },    Down: {        code: 40,        name: "\u2193"    },    Delete: {        code: 46,        name: "Del"    },    Zero: {        code: 48,        name: "0"    },    H: {        code: 72,        name: "H"    },    Meta: {        code: 91,        name: "Meta"    },    F1: {        code: 112,        name: "F1"    },    F2: {        code: 113,        name: "F2"    },    F3: {        code: 114,        name: "F3"    },    F4: {        code: 115,        name: "F4"    },    F5: {        code: 116,        name: "F5"    },    F6: {        code: 117,        name: "F6"    },    F7: {        code: 118,        name: "F7"    },    F8: {        code: 119,        name: "F8"    },    F9: {        code: 120,        name: "F9"    },    F10: {        code: 121,        name: "F10"    },    F11: {        code: 122,        name: "F11"    },    F12: {        code: 123,        name: "F12"    },    Semicolon: {        code: 186,        name: ";"    },    NumpadPlus: {        code: 107,        name: "Numpad +"    },    NumpadMinus: {        code: 109,        name: "Numpad -"    },    Numpad0: {        code: 96,        name: "Numpad 0"    },    Plus: {        code: 187,        name: "+"    },    Comma: {        code: 188,        name: ","    },    Minus: {        code: 189,        name: "-"    },    Period: {        code: 190,        name: "."    },    Slash: {        code: 191,        name: "/"    },    QuestionMark: {        code: 191,        name: "?"    },    Apostrophe: {        code: 192,        name: "`"    },    Tilde: {        code: 192,        name: "Tilde"    },    LeftSquareBracket: {        code: 219,        name: "["    },    RightSquareBracket: {        code: 221,        name: "]"    },    Backslash: {        code: 220,        name: "\\"    },    SingleQuote: {        code: 222,        name: "\'"    },    get CtrlOrMeta()     {        return WebInspector.isMac() ? this.Meta : this.Ctrl;    },};WebInspector.KeyboardShortcut.KeyBindings = {};(function() {    for (var key in WebInspector.KeyboardShortcut.Keys) {        var descriptor = WebInspector.KeyboardShortcut.Keys[key];        if (typeof descriptor === "object" && descriptor["code"]) {            var name = typeof descriptor["name"] === "string" ? descriptor["name"] : key;            WebInspector.KeyboardShortcut.KeyBindings[name] = descriptor;        }    }})();WebInspector.KeyboardShortcut.makeKey = function(keyCode, modifiers) {    if (typeof keyCode === "string")        keyCode = keyCode.charCodeAt(0) - (/^[a-z]/.test(keyCode) ? 32 : 0);    modifiers = modifiers || WebInspector.KeyboardShortcut.Modifiers.None;    return WebInspector.KeyboardShortcut._makeKeyFromCodeAndModifiers(keyCode, modifiers);}WebInspector.KeyboardShortcut.makeKeyFromEvent = function(keyboardEvent) {    var modifiers = WebInspector.KeyboardShortcut.Modifiers.None;    if (keyboardEvent.shiftKey)        modifiers |= WebInspector.KeyboardShortcut.Modifiers.Shift;    if (keyboardEvent.ctrlKey)        modifiers |= WebInspector.KeyboardShortcut.Modifiers.Ctrl;    if (keyboardEvent.altKey)        modifiers |= WebInspector.KeyboardShortcut.Modifiers.Alt;    if (keyboardEvent.metaKey)        modifiers |= WebInspector.KeyboardShortcut.Modifiers.Meta;    var keyCode = keyboardEvent.keyCode || keyboardEvent["__keyCode"];    return WebInspector.KeyboardShortcut._makeKeyFromCodeAndModifiers(keyCode, modifiers);}WebInspector.KeyboardShortcut.makeKeyFromEventIgnoringModifiers = function(keyboardEvent) {    var keyCode = keyboardEvent.keyCode || keyboardEvent["__keyCode"];    return WebInspector.KeyboardShortcut._makeKeyFromCodeAndModifiers(keyCode, WebInspector.KeyboardShortcut.Modifiers.None);}WebInspector.KeyboardShortcut.eventHasCtrlOrMeta = function(event) {    return WebInspector.isMac() ? event.metaKey && !event.ctrlKey : event.ctrlKey && !event.metaKey;}WebInspector.KeyboardShortcut.hasNoModifiers = function(event) {    return !event.ctrlKey && !event.shiftKey && !event.altKey && !event.metaKey;}WebInspector.KeyboardShortcut.Descriptor;WebInspector.KeyboardShortcut.makeDescriptor = function(key, modifiers) {    return {        key: WebInspector.KeyboardShortcut.makeKey(typeof key === "string" ? key : key.code, modifiers),        name: WebInspector.KeyboardShortcut.shortcutToString(key, modifiers)    };}WebInspector.KeyboardShortcut.makeDescriptorFromBindingShortcut = function(shortcut) {    var parts = shortcut.split(/\+(?!$)/);    var modifiers = 0;    var keyString;    for (var i = 0; i < parts.length; ++i) {        if (typeof WebInspector.KeyboardShortcut.Modifiers[parts[i]] !== "undefined") {            modifiers |= WebInspector.KeyboardShortcut.Modifiers[parts[i]];            continue;        }        console.assert(i === parts.length - 1, "Only one key other than modifier is allowed in shortcut <" + shortcut + ">");        keyString = parts[i];        break;    }    console.assert(keyString, "Modifiers-only shortcuts are not allowed (encountered <" + shortcut + ">)");    if (!keyString)        return null ;    var key = WebInspector.KeyboardShortcut.Keys[keyString] || WebInspector.KeyboardShortcut.KeyBindings[keyString];    if (key && key.shiftKey)        modifiers |= WebInspector.KeyboardShortcut.Modifiers.Shift;    return WebInspector.KeyboardShortcut.makeDescriptor(key ? key : keyString, modifiers);}WebInspector.KeyboardShortcut.shortcutToString = function(key, modifiers) {    return WebInspector.KeyboardShortcut._modifiersToString(modifiers) + WebInspector.KeyboardShortcut._keyName(key);}WebInspector.KeyboardShortcut._keyName = function(key) {    if (typeof key === "string")        return key.toUpperCase();    if (typeof key.name === "string")        return key.name;    return key.name[WebInspector.platform()] || key.name.other || '';}WebInspector.KeyboardShortcut._makeKeyFromCodeAndModifiers = function(keyCode, modifiers) {    return (keyCode & 255) | (modifiers << 8);};WebInspector.KeyboardShortcut.keyCodeAndModifiersFromKey = function(key) {    return {        keyCode: key & 255,        modifiers: key >> 8    };}WebInspector.KeyboardShortcut._modifiersToString = function(modifiers) {    const cmdKey = "\u2318";    const optKey = "\u2325";    const shiftKey = "\u21e7";    const ctrlKey = "\u2303";    var isMac = WebInspector.isMac();    var res = "";    if (modifiers & WebInspector.KeyboardShortcut.Modifiers.Ctrl)        res += isMac ? ctrlKey : "Ctrl + ";    if (modifiers & WebInspector.KeyboardShortcut.Modifiers.Alt)        res += isMac ? optKey : "Alt + ";    if (modifiers & WebInspector.KeyboardShortcut.Modifiers.Shift)        res += isMac ? shiftKey : "Shift + ";    if (modifiers & WebInspector.KeyboardShortcut.Modifiers.Meta)        res += isMac ? cmdKey : "Win + ";    return res;};WebInspector.KeyboardShortcut.SelectAll = WebInspector.KeyboardShortcut.makeKey("a", WebInspector.KeyboardShortcut.Modifiers.CtrlOrMeta);;WebInspector.Panel = function(name) {    WebInspector.VBox.call(this);    this.element.classList.add("panel");    this.element.classList.add(name);    this._panelName = name;    this._shortcuts = ({});}WebInspector.Panel.counterRightMargin = 25;WebInspector.Panel.prototype = {    get name()     {        return this._panelName;    },    reset: function()     {},    searchableView: function()     {        return null ;    },    elementsToRestoreScrollPositionsFor: function()     {        return [];    },    handleShortcut: function(event)     {        var shortcutKey = WebInspector.KeyboardShortcut.makeKeyFromEvent(event);        var handler = this._shortcuts[shortcutKey];        if (handler && handler(event)) {            event.handled = true;            return;        }        var searchableView = this.searchableView();        if (!searchableView)            return;        function handleSearchShortcuts(shortcuts, handler)         {            for (var i = 0; i < shortcuts.length; ++i) {                if (shortcuts[i].key !== shortcutKey)                    continue;return handler.call(searchableView);            }            return false;        }        if (handleSearchShortcuts(WebInspector.SearchableView.findShortcuts(), searchableView.handleFindShortcut))            event.handled = true;        else if (handleSearchShortcuts(WebInspector.SearchableView.cancelSearchShortcuts(), searchableView.handleCancelSearchShortcut))            event.handled = true;    },    registerShortcuts: function(keys, handler)     {        for (var i = 0; i < keys.length; ++i)            this._shortcuts[keys[i].key] = handler;    },    showInfobar: function(infobar)     {        infobar.setCloseCallback(this._onInfobarClosed.bind(this, infobar));        if (this.element.firstChild)            this.element.insertBefore(infobar.element, this.element.firstChild);        else            this.element.appendChild(infobar.element);        infobar.setVisible(true);        this.doResize();    },    _onInfobarClosed: function(infobar)     {        infobar.element.remove();        this.doResize();    },    __proto__: WebInspector.VBox.prototype}WebInspector.PanelWithSidebar = function(name, defaultWidth) {    WebInspector.Panel.call(this, name);    this._panelSplitWidget = new WebInspector.SplitWidget(true,false,this._panelName + "PanelSplitViewState",defaultWidth || 200);    this._panelSplitWidget.show(this.element);    this._mainWidget = new WebInspector.VBox();    this._panelSplitWidget.setMainWidget(this._mainWidget);    this._sidebarWidget = new WebInspector.VBox();    this._sidebarWidget.setMinimumSize(100, 25);    this._panelSplitWidget.setSidebarWidget(this._sidebarWidget);    this._sidebarWidget.element.classList.add("sidebar");}WebInspector.PanelWithSidebar.prototype = {    panelSidebarElement: function()     {        return this._sidebarWidget.element;    },    mainElement: function()     {        return this._mainWidget.element;    },    splitWidget: function()     {        return this._panelSplitWidget;    },    __proto__: WebInspector.Panel.prototype}WebInspector.PanelDescriptor = function() {}WebInspector.PanelDescriptor.prototype = {    name: function() {},    title: function() {},    panel: function() {}}WebInspector.PanelFactory = function() {}WebInspector.PanelFactory.prototype = {    createPanel: function() {}}WebInspector.RuntimeExtensionPanelDescriptor = function(extension) {    this._name = extension.descriptor()["name"];    this._title = WebInspector.UIString(extension.descriptor()["title"]);    this._extension = extension;}WebInspector.RuntimeExtensionPanelDescriptor.prototype = {    name: function()     {        return this._name;    },    title: function()     {        return this._title;    },    panel: function()     {        return this._extension.instancePromise().then(createPanel);        function createPanel(panelFactory)         {            return (panelFactory).createPanel();        }    }};WebInspector.Popover = function(popoverHelper) {    WebInspector.Widget.call(this);    this.markAsRoot();    this.element.className = WebInspector.Popover._classNamePrefix;    this._containerElement = createElementWithClass("div", "fill popover-container");    this._popupArrowElement = this.element.createChild("div", "arrow");    this._contentDiv = this.element.createChild("div", "content");    this._popoverHelper = popoverHelper;    this._hideBound = this.hide.bind(this);}WebInspector.Popover._classNamePrefix = "popover custom-popup-vertical-scroll custom-popup-horizontal-scroll";WebInspector.Popover.prototype = {    showForAnchor: function(element, anchor, preferredWidth, preferredHeight, arrowDirection)     {        this._innerShow(null , element, anchor, preferredWidth, preferredHeight, arrowDirection);    },    showView: function(view, anchor, preferredWidth, preferredHeight)     {        this._innerShow(view, view.element, anchor, preferredWidth, preferredHeight);    },    _innerShow: function(view, contentElement, anchor, preferredWidth, preferredHeight, arrowDirection)     {        if (this._disposed)            return;        this._contentElement = contentElement;        if (WebInspector.Popover._popover)            WebInspector.Popover._popover.hide();        WebInspector.Popover._popover = this;        var document = anchor instanceof Element ? anchor.ownerDocument : contentElement.ownerDocument;        var window = document.defaultView;        var preferredSize = view ? view.measurePreferredSize() : WebInspector.measurePreferredSize(this._contentElement);        this._preferredWidth = preferredWidth || preferredSize.width;        this._preferredHeight = preferredHeight || preferredSize.height;        window.addEventListener("resize", this._hideBound, false);        document.body.appendChild(this._containerElement);        WebInspector.Widget.prototype.show.call(this, this._containerElement);        if (view)            view.show(this._contentDiv);        else            this._contentDiv.appendChild(this._contentElement);        this.positionElement(anchor, this._preferredWidth, this._preferredHeight, arrowDirection);        if (this._popoverHelper) {            this._contentDiv.addEventListener("mousemove", this._popoverHelper._killHidePopoverTimer.bind(this._popoverHelper), true);            this.element.addEventListener("mouseout", this._popoverHelper._popoverMouseOut.bind(this._popoverHelper), true);        }    },    hide: function()     {        this._containerElement.ownerDocument.defaultView.removeEventListener("resize", this._hideBound, false);        this.detach();        this._containerElement.remove();        delete WebInspector.Popover._popover;    },    get disposed()     {        return this._disposed;    },    dispose: function()     {        if (this.isShowing())            this.hide();        this._disposed = true;    },    setCanShrink: function(canShrink)     {        this._hasFixedHeight = !canShrink;        this._contentDiv.classList.toggle("fixed-height", this._hasFixedHeight);    },    setNoMargins: function(noMargins)     {        this._hasNoMargins = noMargins;        this._contentDiv.classList.toggle("no-margin", this._hasNoMargins);    },    positionElement: function(anchorElement, preferredWidth, preferredHeight, arrowDirection)     {        const borderWidth = this._hasNoMargins ? 0 : 8;        const scrollerWidth = this._hasFixedHeight ? 0 : 11;        const arrowHeight = this._hasNoMargins ? 8 : 15;        const arrowOffset = 10;        const borderRadius = 4;        const arrowRadius = 6;        preferredWidth = preferredWidth || this._preferredWidth;        preferredHeight = preferredHeight || this._preferredHeight;        preferredWidth = Math.max(preferredWidth, 50);        const container = WebInspector.Dialog.modalHostView().element;        const totalWidth = container.offsetWidth;        const totalHeight = container.offsetHeight;        var anchorBox = anchorElement instanceof AnchorBox ? anchorElement : anchorElement.boxInWindow(window);        anchorBox = anchorBox.relativeToElement(container);        var newElementPosition = {            x: 0,            y: 0,            width: preferredWidth + scrollerWidth,            height: preferredHeight        };        var verticalAlignment;        var roomAbove = anchorBox.y;        var roomBelow = totalHeight - anchorBox.y - anchorBox.height;        if ((roomAbove > roomBelow) || (arrowDirection === WebInspector.Popover.Orientation.Bottom)) {            if ((anchorBox.y > newElementPosition.height + arrowHeight + borderRadius) || (arrowDirection === WebInspector.Popover.Orientation.Bottom))                newElementPosition.y = anchorBox.y - newElementPosition.height - arrowHeight;            else {                newElementPosition.y = borderRadius;                newElementPosition.height = anchorBox.y - borderRadius * 2 - arrowHeight;                if (this._hasFixedHeight && newElementPosition.height < preferredHeight) {                    newElementPosition.y = borderRadius;                    newElementPosition.height = preferredHeight;                }            }            verticalAlignment = WebInspector.Popover.Orientation.Bottom;        } else {            newElementPosition.y = anchorBox.y + anchorBox.height + arrowHeight;            if ((newElementPosition.y + newElementPosition.height + borderRadius >= totalHeight) && (arrowDirection !== WebInspector.Popover.Orientation.Top)) {                newElementPosition.height = totalHeight - borderRadius - newElementPosition.y;                if (this._hasFixedHeight && newElementPosition.height < preferredHeight) {                    newElementPosition.y = totalHeight - preferredHeight - borderRadius;                    newElementPosition.height = preferredHeight;                }            }            verticalAlignment = WebInspector.Popover.Orientation.Top;        }        var horizontalAlignment;        this._popupArrowElement.removeAttribute("style");        if (anchorBox.x + newElementPosition.width < totalWidth) {            newElementPosition.x = Math.max(borderRadius, anchorBox.x - borderRadius - arrowOffset);            horizontalAlignment = "left";            this._popupArrowElement.style.left = arrowOffset + "px";        } else if (newElementPosition.width + borderRadius * 2 < totalWidth) {            newElementPosition.x = totalWidth - newElementPosition.width - borderRadius - 2 * borderWidth;            horizontalAlignment = "right";            var arrowRightPosition = Math.max(0, totalWidth - anchorBox.x - anchorBox.width - borderRadius - arrowOffset);            arrowRightPosition += anchorBox.width / 2;            arrowRightPosition = Math.min(arrowRightPosition, newElementPosition.width - borderRadius - arrowOffset);            this._popupArrowElement.style.right = arrowRightPosition + "px";        } else {            newElementPosition.x = borderRadius;            newElementPosition.width = totalWidth - borderRadius * 2;            newElementPosition.height += scrollerWidth;            horizontalAlignment = "left";            if (verticalAlignment === WebInspector.Popover.Orientation.Bottom)                newElementPosition.y -= scrollerWidth;            this._popupArrowElement.style.left = Math.max(0, anchorBox.x - newElementPosition.x - borderRadius - arrowRadius + anchorBox.width / 2) + "px";        }        this.element.className = WebInspector.Popover._classNamePrefix + " " + verticalAlignment + "-" + horizontalAlignment + "-arrow";        this.element.positionAt(newElementPosition.x, newElementPosition.y - borderWidth, container);        this.element.style.width = newElementPosition.width + borderWidth * 2 + "px";        this.element.style.height = newElementPosition.height + borderWidth * 2 + "px";    },    __proto__: WebInspector.Widget.prototype}WebInspector.PopoverHelper = function(panelElement, getAnchor, showPopover, onHide, disableOnClick) {    this._getAnchor = getAnchor;    this._showPopover = showPopover;    this._onHide = onHide;    this._disableOnClick = !!disableOnClick;    panelElement.addEventListener("mousedown", this._mouseDown.bind(this), false);    panelElement.addEventListener("mousemove", this._mouseMove.bind(this), false);    panelElement.addEventListener("mouseout", this._mouseOut.bind(this), false);    this.setTimeout(1000, 500);}WebInspector.PopoverHelper.prototype = {    setTimeout: function(timeout, hideTimeout)     {        this._timeout = timeout;        if (typeof hideTimeout === "number")            this._hideTimeout = hideTimeout;        else            this._hideTimeout = timeout / 2;    },    _eventInHoverElement: function(event)     {        if (!this._hoverElement)            return false;        var box = this._hoverElement instanceof AnchorBox ? this._hoverElement : this._hoverElement.boxInWindow();        return ( box.x <= event.clientX && event.clientX <= box.x + box.width && box.y <= event.clientY && event.clientY <= box.y + box.height) ;    },    _mouseDown: function(event)     {        if (this._disableOnClick || !this._eventInHoverElement(event))            this.hidePopover();        else {            this._killHidePopoverTimer();            this._handleMouseAction(event, true);        }    },    _mouseMove: function(event)     {        if (this._eventInHoverElement(event))            return;        this._startHidePopoverTimer();        this._handleMouseAction(event, false);    },    _popoverMouseOut: function(event)     {        if (!this.isPopoverVisible())            return;        if (event.relatedTarget && !event.relatedTarget.isSelfOrDescendant(this._popover._contentDiv))            this._startHidePopoverTimer();    },    _mouseOut: function(event)     {        if (!this.isPopoverVisible())            return;        if (!this._eventInHoverElement(event))            this._startHidePopoverTimer();    },    _startHidePopoverTimer: function()     {        if (!this._popover || this._hidePopoverTimer)            return;        function doHide()         {            this._hidePopover();            delete this._hidePopoverTimer;        }        this._hidePopoverTimer = setTimeout(doHide.bind(this), this._hideTimeout);    },    _handleMouseAction: function(event, isMouseDown)     {        this._resetHoverTimer();        if (event.which && this._disableOnClick)            return;        this._hoverElement = this._getAnchor(event.target, event);        if (!this._hoverElement)            return;        const toolTipDelay = isMouseDown ? 0 : (this._popup ? this._timeout * 0.6 : this._timeout);        this._hoverTimer = setTimeout(this._mouseHover.bind(this, this._hoverElement), toolTipDelay);    },    _resetHoverTimer: function()     {        if (this._hoverTimer) {            clearTimeout(this._hoverTimer);            delete this._hoverTimer;        }    },    isPopoverVisible: function()     {        return !!this._popover;    },    hidePopover: function()     {        this._resetHoverTimer();        this._hidePopover();    },    _hidePopover: function()     {        if (!this._popover)            return;        if (this._onHide)            this._onHide();        this._popover.dispose();        delete this._popover;        this._hoverElement = null ;    },    _mouseHover: function(element)     {        delete this._hoverTimer;        this._hidePopover();        this._popover = new WebInspector.Popover(this);        this._showPopover(element, this._popover);    },    _killHidePopoverTimer: function()     {        if (this._hidePopoverTimer) {            clearTimeout(this._hidePopoverTimer);            delete this._hidePopoverTimer;            this._resetHoverTimer();        }    }}WebInspector.Popover.Orientation = {    Top: "top",    Bottom: "bottom"};WebInspector.ProgressIndicator = function() {    this.element = createElementWithClass("div", "progress-indicator");    this._shadowRoot = WebInspector.createShadowRootWithCoreStyles(this.element);    this._shadowRoot.appendChild(WebInspector.Widget.createStyleElement("ui/progressIndicator.css"));    this._contentElement = this._shadowRoot.createChild("div", "progress-indicator-shadow-container");    this._labelElement = this._contentElement.createChild("div", "title");    this._progressElement = this._contentElement.createChild("progress");    this._progressElement.value = 0;    this._stopButton = this._contentElement.createChild("button", "progress-indicator-shadow-stop-button");    this._stopButton.addEventListener("click", this.cancel.bind(this));    this._isCanceled = false;    this._worked = 0;}WebInspector.ProgressIndicator.prototype = {    show: function(parent)     {        parent.appendChild(this.element);    },    done: function()     {        if (this._isDone)            return;        this._isDone = true;        this.element.remove();    },    cancel: function()     {        this._isCanceled = true;    },    isCanceled: function()     {        return this._isCanceled;    },    setTitle: function(title)     {        this._labelElement.textContent = title;    },    setTotalWork: function(totalWork)     {        this._progressElement.max = totalWork;    },    setWorked: function(worked, title)     {        this._worked = worked;        this._progressElement.value = worked;        if (title)            this.setTitle(title);    },    worked: function(worked)     {        this.setWorked(this._worked + (worked || 1));    }};WebInspector.ResizerWidget = function() {    WebInspector.Object.call(this);    this._isEnabled = true;    this._elements = [];    this._installDragOnMouseDownBound = this._installDragOnMouseDown.bind(this);    this._cursor = "nwse-resize";};WebInspector.ResizerWidget.Events = {    ResizeStart: "ResizeStart",    ResizeUpdate: "ResizeUpdate",    ResizeEnd: "ResizeEnd"};WebInspector.ResizerWidget.prototype = {    isEnabled: function()     {        return this._isEnabled;    },    setEnabled: function(enabled)     {        this._isEnabled = enabled;        this.updateElementCursors();    },    elements: function()     {        return this._elements.slice();    },    addElement: function(element)     {        if (this._elements.indexOf(element) !== -1)            return;        this._elements.push(element);        element.addEventListener("mousedown", this._installDragOnMouseDownBound, false);        this._updateElementCursor(element);    },    removeElement: function(element)     {        if (this._elements.indexOf(element) === -1)            return;        this._elements.remove(element);        element.removeEventListener("mousedown", this._installDragOnMouseDownBound, false);        element.style.removeProperty("cursor");    },    updateElementCursors: function()     {        this._elements.forEach(this._updateElementCursor.bind(this));    },    _updateElementCursor: function(element)     {        if (this._isEnabled)            element.style.setProperty("cursor", this.cursor());        else            element.style.removeProperty("cursor");    },    cursor: function()     {        return this._cursor;    },    setCursor: function(cursor)     {        this._cursor = cursor;        this.updateElementCursors();    },    _installDragOnMouseDown: function(event)     {        if (this._elements.indexOf(event.target) === -1)            return false;        WebInspector.elementDragStart(this._dragStart.bind(this), this._drag.bind(this), this._dragEnd.bind(this), this.cursor(), event);    },    _dragStart: function(event)     {        if (!this._isEnabled)            return false;        this._startX = event.pageX;        this._startY = event.pageY;        this.sendDragStart(this._startX, this._startY);        return true;    },    sendDragStart: function(x, y)     {        this.dispatchEventToListeners(WebInspector.ResizerWidget.Events.ResizeStart, {            startX: x,            currentX: x,            startY: y,            currentY: y        });    },    _drag: function(event)     {        if (!this._isEnabled) {            this._dragEnd(event);            return true;        }        this.sendDragMove(this._startX, event.pageX, this._startY, event.pageY, event.shiftKey);        event.preventDefault();        return false;    },    sendDragMove: function(startX, currentX, startY, currentY, shiftKey)     {        this.dispatchEventToListeners(WebInspector.ResizerWidget.Events.ResizeUpdate, {            startX: startX,            currentX: currentX,            startY: startY,            currentY: currentY,            shiftKey: shiftKey        });    },    _dragEnd: function(event)     {        this.dispatchEventToListeners(WebInspector.ResizerWidget.Events.ResizeEnd);        delete this._startX;        delete this._startY;    },    __proto__: WebInspector.Object.prototype};WebInspector.SimpleResizerWidget = function() {    WebInspector.ResizerWidget.call(this);    this._isVertical = true;};WebInspector.SimpleResizerWidget.prototype = {    isVertical: function()     {        return this._isVertical;    },    setVertical: function(vertical)     {        this._isVertical = vertical;        this.updateElementCursors();    },    cursor: function()     {        return this._isVertical ? "ns-resize" : "ew-resize";    },    sendDragStart: function(x, y)     {        var position = this._isVertical ? y : x;        this.dispatchEventToListeners(WebInspector.ResizerWidget.Events.ResizeStart, {            startPosition: position,            currentPosition: position        });    },    sendDragMove: function(startX, currentX, startY, currentY, shiftKey)     {        if (this._isVertical)            this.dispatchEventToListeners(WebInspector.ResizerWidget.Events.ResizeUpdate, {                startPosition: startY,                currentPosition: currentY,                shiftKey: shiftKey            });        else            this.dispatchEventToListeners(WebInspector.ResizerWidget.Events.ResizeUpdate, {                startPosition: startX,                currentPosition: currentX,                shiftKey: shiftKey            });    },    __proto__: WebInspector.ResizerWidget.prototype};;WebInspector.RootView = function() {    WebInspector.VBox.call(this);    this.markAsRoot();    this.element.classList.add("root-view");    this.element.setAttribute("spellcheck", false);}WebInspector.RootView.prototype = {    attachToDocument: function(document)     {        document.defaultView.addEventListener("resize", this.doResize.bind(this), false);        this._window = document.defaultView;        this.doResize();        this.show(document.body);    },    doResize: function()     {        if (this._window) {            var size = this.constraints().minimum;            var zoom = WebInspector.zoomManager.zoomFactor();            var right = Math.min(0, this._window.innerWidth - size.width / zoom);            this.element.style.marginRight = right + "px";            var bottom = Math.min(0, this._window.innerHeight - size.height / zoom);            this.element.style.marginBottom = bottom + "px";        }        WebInspector.VBox.prototype.doResize.call(this);    },    __proto__: WebInspector.VBox.prototype};WebInspector.SearchableView = function(searchable, settingName) {    WebInspector.VBox.call(this, true);    this.registerRequiredCSS("ui/searchableView.css");    this._searchProvider = searchable;    this._setting = settingName ? WebInspector.settings.createSetting(settingName, {}) : null ;    this.element.addEventListener("keydown", this._onKeyDown.bind(this), false);    this.contentElement.createChild("content");    this._footerElementContainer = this.contentElement.createChild("div", "search-bar hidden");    this._footerElementContainer.style.order = 100;    var toolbar = new WebInspector.Toolbar(this._footerElementContainer);    if (this._searchProvider.supportsCaseSensitiveSearch()) {        this._caseSensitiveButton = new WebInspector.ToolbarTextButton(WebInspector.UIString("Case sensitive"),"case-sensitive-search-toolbar-item","Aa",2);        this._caseSensitiveButton.addEventListener("click", this._toggleCaseSensitiveSearch, this);        toolbar.appendToolbarItem(this._caseSensitiveButton);    }    if (this._searchProvider.supportsRegexSearch()) {        this._regexButton = new WebInspector.ToolbarTextButton(WebInspector.UIString("Regex"),"regex-search-toolbar-item",".*",2);        this._regexButton.addEventListener("click", this._toggleRegexSearch, this);        toolbar.appendToolbarItem(this._regexButton);    }    this._footerElement = this._footerElementContainer.createChild("table", "toolbar-search");    this._footerElement.cellSpacing = 0;    this._firstRowElement = this._footerElement.createChild("tr");    this._secondRowElement = this._footerElement.createChild("tr", "hidden");    var searchControlElementColumn = this._firstRowElement.createChild("td");    this._searchControlElement = searchControlElementColumn.createChild("span", "toolbar-search-control");    this._searchInputElement = WebInspector.HistoryInput.create();    this._searchInputElement.classList.add("search-replace");    this._searchControlElement.appendChild(this._searchInputElement);    this._searchInputElement.id = "search-input-field";    this._searchInputElement.placeholder = WebInspector.UIString("Find");    this._matchesElement = this._searchControlElement.createChild("label", "search-results-matches");    this._matchesElement.setAttribute("for", "search-input-field");    this._searchNavigationElement = this._searchControlElement.createChild("div", "toolbar-search-navigation-controls");    this._searchNavigationPrevElement = this._searchNavigationElement.createChild("div", "toolbar-search-navigation toolbar-search-navigation-prev");    this._searchNavigationPrevElement.addEventListener("click", this._onPrevButtonSearch.bind(this), false);    this._searchNavigationPrevElement.title = WebInspector.UIString("Search Previous");    this._searchNavigationNextElement = this._searchNavigationElement.createChild("div", "toolbar-search-navigation toolbar-search-navigation-next");    this._searchNavigationNextElement.addEventListener("click", this._onNextButtonSearch.bind(this), false);    this._searchNavigationNextElement.title = WebInspector.UIString("Search Next");    this._searchInputElement.addEventListener("mousedown", this._onSearchFieldManualFocus.bind(this), false);    this._searchInputElement.addEventListener("keydown", this._onSearchKeyDown.bind(this), true);    this._searchInputElement.addEventListener("input", this._onInput.bind(this), false);    this._replaceInputElement = this._secondRowElement.createChild("td").createChild("input", "search-replace toolbar-replace-control");    this._replaceInputElement.addEventListener("keydown", this._onReplaceKeyDown.bind(this), true);    this._replaceInputElement.placeholder = WebInspector.UIString("Replace");    this._findButtonElement = this._firstRowElement.createChild("td").createChild("button", "search-action-button hidden");    this._findButtonElement.textContent = WebInspector.UIString("Find");    this._findButtonElement.tabIndex = -1;    this._findButtonElement.addEventListener("click", this._onFindClick.bind(this), false);    this._replaceButtonElement = this._secondRowElement.createChild("td").createChild("button", "search-action-button");    this._replaceButtonElement.textContent = WebInspector.UIString("Replace");    this._replaceButtonElement.disabled = true;    this._replaceButtonElement.tabIndex = -1;    this._replaceButtonElement.addEventListener("click", this._replace.bind(this), false);    this._prevButtonElement = this._firstRowElement.createChild("td").createChild("button", "search-action-button hidden");    this._prevButtonElement.textContent = WebInspector.UIString("Previous");    this._prevButtonElement.tabIndex = -1;    this._prevButtonElement.addEventListener("click", this._onPreviousClick.bind(this), false);    this._replaceAllButtonElement = this._secondRowElement.createChild("td").createChild("button", "search-action-button");    this._replaceAllButtonElement.textContent = WebInspector.UIString("Replace All");    this._replaceAllButtonElement.addEventListener("click", this._replaceAll.bind(this), false);    this._replaceElement = this._firstRowElement.createChild("td").createChild("span");    this._replaceLabelElement = createCheckboxLabel(WebInspector.UIString("Replace"));    this._replaceCheckboxElement = this._replaceLabelElement.checkboxElement;    this._uniqueId = ++WebInspector.SearchableView._lastUniqueId;    var replaceCheckboxId = "search-replace-trigger" + this._uniqueId;    this._replaceCheckboxElement.id = replaceCheckboxId;    this._replaceCheckboxElement.addEventListener("change", this._updateSecondRowVisibility.bind(this), false);    this._replaceElement.appendChild(this._replaceLabelElement);    var cancelButtonElement = this._firstRowElement.createChild("td").createChild("button", "search-action-button");    cancelButtonElement.textContent = WebInspector.UIString("Cancel");    cancelButtonElement.tabIndex = -1;    cancelButtonElement.addEventListener("click", this.closeSearch.bind(this), false);    this._minimalSearchQuerySize = 3;    this._registerShortcuts();    this._loadSetting();}WebInspector.SearchableView._lastUniqueId = 0;WebInspector.SearchableView.findShortcuts = function() {    if (WebInspector.SearchableView._findShortcuts)        return WebInspector.SearchableView._findShortcuts;    WebInspector.SearchableView._findShortcuts = [WebInspector.KeyboardShortcut.makeDescriptor("f", WebInspector.KeyboardShortcut.Modifiers.CtrlOrMeta)];    if (!WebInspector.isMac())        WebInspector.SearchableView._findShortcuts.push(WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.F3));    return WebInspector.SearchableView._findShortcuts;}WebInspector.SearchableView.cancelSearchShortcuts = function() {    if (WebInspector.SearchableView._cancelSearchShortcuts)        return WebInspector.SearchableView._cancelSearchShortcuts;    WebInspector.SearchableView._cancelSearchShortcuts = [WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Esc)];    return WebInspector.SearchableView._cancelSearchShortcuts;}WebInspector.SearchableView.findNextShortcut = function() {    if (WebInspector.SearchableView._findNextShortcut)        return WebInspector.SearchableView._findNextShortcut;    WebInspector.SearchableView._findNextShortcut = [];    if (WebInspector.isMac())        WebInspector.SearchableView._findNextShortcut.push(WebInspector.KeyboardShortcut.makeDescriptor("g", WebInspector.KeyboardShortcut.Modifiers.Meta));    return WebInspector.SearchableView._findNextShortcut;}WebInspector.SearchableView.findPreviousShortcuts = function() {    if (WebInspector.SearchableView._findPreviousShortcuts)        return WebInspector.SearchableView._findPreviousShortcuts;    WebInspector.SearchableView._findPreviousShortcuts = [];    if (WebInspector.isMac())        WebInspector.SearchableView._findPreviousShortcuts.push(WebInspector.KeyboardShortcut.makeDescriptor("g", WebInspector.KeyboardShortcut.Modifiers.Meta | WebInspector.KeyboardShortcut.Modifiers.Shift));    return WebInspector.SearchableView._findPreviousShortcuts;}WebInspector.SearchableView.prototype = {    _toggleCaseSensitiveSearch: function()     {        this._caseSensitiveButton.setToggled(!this._caseSensitiveButton.toggled());        this._saveSetting();        this._performSearch(false, true);    },    _toggleRegexSearch: function()     {        this._regexButton.setToggled(!this._regexButton.toggled());        this._saveSetting();        this._performSearch(false, true);    },    _saveSetting: function()     {        if (!this._setting)            return;        var settingValue = this._setting.get() || {};        settingValue.caseSensitive = this._caseSensitiveButton.toggled();        settingValue.isRegex = this._regexButton.toggled();        this._setting.set(settingValue);    },    _loadSetting: function()     {        var settingValue = this._setting ? (this._setting.get() || {}) : {};        if (this._searchProvider.supportsCaseSensitiveSearch())            this._caseSensitiveButton.setToggled(!!settingValue.caseSensitive);        if (this._searchProvider.supportsRegexSearch())            this._regexButton.setToggled(!!settingValue.isRegex);    },    defaultFocusedElement: function()     {        var children = this.children();        for (var i = 0; i < children.length; ++i) {            var element = children[i].defaultFocusedElement();            if (element)                return element;        }        return WebInspector.Widget.prototype.defaultFocusedElement.call(this);    },    _onKeyDown: function(event)     {        var shortcutKey = WebInspector.KeyboardShortcut.makeKeyFromEvent((event));        var handler = this._shortcuts[shortcutKey];        if (handler && handler(event))            event.consume(true);    },    _registerShortcuts: function()     {        this._shortcuts = {};        function register(shortcuts, handler)         {            for (var i = 0; i < shortcuts.length; ++i)                this._shortcuts[shortcuts[i].key] = handler;        }        register.call(this, WebInspector.SearchableView.findShortcuts(), this.handleFindShortcut.bind(this));        register.call(this, WebInspector.SearchableView.cancelSearchShortcuts(), this.handleCancelSearchShortcut.bind(this));        register.call(this, WebInspector.SearchableView.findNextShortcut(), this.handleFindNextShortcut.bind(this));        register.call(this, WebInspector.SearchableView.findPreviousShortcuts(), this.handleFindPreviousShortcut.bind(this));    },    setMinimalSearchQuerySize: function(minimalSearchQuerySize)     {        this._minimalSearchQuerySize = minimalSearchQuerySize;    },    setPlaceholder: function(placeholder)     {        this._searchInputElement.placeholder = placeholder;    },    setReplaceable: function(replaceable)     {        this._replaceable = replaceable;    },    updateSearchMatchesCount: function(matches)     {        this._searchProvider.currentSearchMatches = matches;        this._updateSearchMatchesCountAndCurrentMatchIndex(this._searchProvider.currentQuery ? matches : 0, -1);    },    updateCurrentMatchIndex: function(currentMatchIndex)     {        this._updateSearchMatchesCountAndCurrentMatchIndex(this._searchProvider.currentSearchMatches, currentMatchIndex);    },    isSearchVisible: function()     {        return this._searchIsVisible;    },    closeSearch: function()     {        this.cancelSearch();        if (WebInspector.currentFocusElement() && WebInspector.currentFocusElement().isDescendant(this._footerElementContainer))            this.focus();    },    _toggleSearchBar: function(toggled)     {        this._footerElementContainer.classList.toggle("hidden", !toggled);        this.doResize();    },    cancelSearch: function()     {        if (!this._searchIsVisible)            return;        this.resetSearch();        delete this._searchIsVisible;        this._toggleSearchBar(false);    },    resetSearch: function()     {        this._clearSearch();        this._updateReplaceVisibility();        this._matchesElement.textContent = "";    },    refreshSearch: function()     {        if (!this._searchIsVisible)            return;        this.resetSearch();        this._performSearch(false, false);    },    handleFindNextShortcut: function()     {        if (!this._searchIsVisible)            return false;        this._searchProvider.jumpToNextSearchResult();        return true;    },    handleFindPreviousShortcut: function()     {        if (!this._searchIsVisible)            return false;        this._searchProvider.jumpToPreviousSearchResult();        return true;    },    handleFindShortcut: function()     {        this.showSearchField();        return true;    },    handleCancelSearchShortcut: function()     {        if (!this._searchIsVisible)            return false;        this.closeSearch();        return true;    },    _updateSearchNavigationButtonState: function(enabled)     {        this._replaceButtonElement.disabled = !enabled;        if (enabled) {            this._searchNavigationPrevElement.classList.add("enabled");            this._searchNavigationNextElement.classList.add("enabled");        } else {            this._searchNavigationPrevElement.classList.remove("enabled");            this._searchNavigationNextElement.classList.remove("enabled");        }    },    _updateSearchMatchesCountAndCurrentMatchIndex: function(matches, currentMatchIndex)     {        if (!this._currentQuery)            this._matchesElement.textContent = "";        else if (matches === 0 || currentMatchIndex >= 0)            this._matchesElement.textContent = WebInspector.UIString("%d of %d", currentMatchIndex + 1, matches);        else if (matches === 1)            this._matchesElement.textContent = WebInspector.UIString("1 match");        else            this._matchesElement.textContent = WebInspector.UIString("%d matches", matches);        this._updateSearchNavigationButtonState(matches > 0);    },    showSearchField: function()     {        if (this._searchIsVisible)            this.cancelSearch();        var queryCandidate;        if (WebInspector.currentFocusElement() !== this._searchInputElement) {            var selection = this._searchInputElement.getComponentSelection();            if (selection.rangeCount)                queryCandidate = selection.toString().replace(/\r?\n.*/, "");        }        this._toggleSearchBar(true);        this._updateReplaceVisibility();        if (queryCandidate)            this._searchInputElement.value = queryCandidate;        this._performSearch(false, false);        this._searchInputElement.focus();        this._searchInputElement.select();        this._searchIsVisible = true;    },    _updateReplaceVisibility: function()     {        this._replaceElement.classList.toggle("hidden", !this._replaceable);        if (!this._replaceable) {            this._replaceCheckboxElement.checked = false;            this._updateSecondRowVisibility();        }    },    _onSearchFieldManualFocus: function(event)     {        WebInspector.setCurrentFocusElement((event.target));    },    _onSearchKeyDown: function(event)     {        if (!isEnterKey(event))            return;        if (!this._currentQuery)            this._performSearch(true, true, event.shiftKey);        else            this._jumpToNextSearchResult(event.shiftKey);    },    _onReplaceKeyDown: function(event)     {        if (isEnterKey(event))            this._replace();    },    _jumpToNextSearchResult: function(isBackwardSearch)     {        if (!this._currentQuery || !this._searchNavigationPrevElement.classList.contains("enabled"))            return;        if (isBackwardSearch)            this._searchProvider.jumpToPreviousSearchResult();        else            this._searchProvider.jumpToNextSearchResult();    },    _onNextButtonSearch: function(event)     {        if (!this._searchNavigationNextElement.classList.contains("enabled"))            return;        this._jumpToNextSearchResult();        this._searchInputElement.focus();    },    _onPrevButtonSearch: function(event)     {        if (!this._searchNavigationPrevElement.classList.contains("enabled"))            return;        this._jumpToNextSearchResult(true);        this._searchInputElement.focus();    },    _onFindClick: function(event)     {        if (!this._currentQuery)            this._performSearch(true, true);        else            this._jumpToNextSearchResult();        this._searchInputElement.focus();    },    _onPreviousClick: function(event)     {        if (!this._currentQuery)            this._performSearch(true, true, true);        else            this._jumpToNextSearchResult(true);        this._searchInputElement.focus();    },    _clearSearch: function()     {        delete this._currentQuery;        if (!!this._searchProvider.currentQuery) {            delete this._searchProvider.currentQuery;            this._searchProvider.searchCanceled();        }        this._updateSearchMatchesCountAndCurrentMatchIndex(0, -1);    },    _performSearch: function(forceSearch, shouldJump, jumpBackwards)     {        var query = this._searchInputElement.value;        if (!query || (!forceSearch && query.length < this._minimalSearchQuerySize && !this._currentQuery)) {            this._clearSearch();            return;        }        this._currentQuery = query;        this._searchProvider.currentQuery = query;        var searchConfig = this._currentSearchConfig();        this._searchProvider.performSearch(searchConfig, shouldJump, jumpBackwards);    },    _currentSearchConfig: function()     {        var query = this._searchInputElement.value;        var caseSensitive = this._caseSensitiveButton ? this._caseSensitiveButton.toggled() : false;        var isRegex = this._regexButton ? this._regexButton.toggled() : false;        return new WebInspector.SearchableView.SearchConfig(query,caseSensitive,isRegex);    },    _updateSecondRowVisibility: function()     {        var secondRowVisible = this._replaceCheckboxElement.checked;        this._footerElementContainer.classList.toggle("replaceable", secondRowVisible);        this._footerElement.classList.toggle("toolbar-search-replace", secondRowVisible);        this._secondRowElement.classList.toggle("hidden", !secondRowVisible);        this._prevButtonElement.classList.toggle("hidden", !secondRowVisible);        this._findButtonElement.classList.toggle("hidden", !secondRowVisible);        this._replaceCheckboxElement.tabIndex = secondRowVisible ? -1 : 0;        if (secondRowVisible)            this._replaceInputElement.focus();        else            this._searchInputElement.focus();        this.doResize();    },    _replace: function()     {        var searchConfig = this._currentSearchConfig();        (this._searchProvider).replaceSelectionWith(searchConfig, this._replaceInputElement.value);        delete this._currentQuery;        this._performSearch(true, true);    },    _replaceAll: function()     {        var searchConfig = this._currentSearchConfig();        (this._searchProvider).replaceAllWith(searchConfig, this._replaceInputElement.value);    },    _onInput: function(event)     {        if (this._valueChangedTimeoutId)            clearTimeout(this._valueChangedTimeoutId);        var timeout = this._searchInputElement.value.length < 3 ? 200 : 0;        this._valueChangedTimeoutId = setTimeout(this._onValueChanged.bind(this), timeout);    },    _onValueChanged: function()     {        delete this._valueChangedTimeoutId;        this._performSearch(false, true);    },    __proto__: WebInspector.VBox.prototype}WebInspector.Searchable = function() {}WebInspector.Searchable.prototype = {    searchCanceled: function() {},    performSearch: function(searchConfig, shouldJump, jumpBackwards) {},    jumpToNextSearchResult: function() {},    jumpToPreviousSearchResult: function() {},    supportsCaseSensitiveSearch: function() {},    supportsRegexSearch: function() {}}WebInspector.Replaceable = function() {}WebInspector.Replaceable.prototype = {    replaceSelectionWith: function(searchConfig, replacement) {},    replaceAllWith: function(searchConfig, replacement) {}}WebInspector.SearchableView.SearchConfig = function(query, caseSensitive, isRegex) {    this.query = query;    this.caseSensitive = caseSensitive;    this.isRegex = isRegex;}WebInspector.SearchableView.SearchConfig.prototype = {    toSearchRegex: function(global)     {        var modifiers = this.caseSensitive ? "" : "i";        if (global)            modifiers += "g";        var query = this.isRegex ? "/" + this.query + "/" : this.query;        var regex;        try {            if (/^\/.+\/$/.test(query)) {                regex = new RegExp(query.substring(1, query.length - 1),modifiers);                regex.__fromRegExpQuery = true;            }        } catch (e) {}        if (!regex)            regex = createPlainTextSearchRegex(query, modifiers);        return regex;    }};WebInspector.Section = function(title, subtitle) {    this.element = createElementWithClass("div", "section");    this.element._section = this;    this.registerRequiredCSS("ui/section.css");    this.headerElement = createElementWithClass("div", "header monospace");    this.titleElement = createElementWithClass("div", "title");    this.subtitleElement = createElementWithClass("div", "subtitle");    this.headerElement.appendChild(this.subtitleElement);    this.headerElement.appendChild(this.titleElement);    this.headerElement.addEventListener("click", this.handleClick.bind(this), false);    this.element.appendChild(this.headerElement);    this.title = title;    if (subtitle) {        this._subtitle = subtitle;        this.subtitleElement.textContent = subtitle;    }    this._expanded = false;}WebInspector.Section.prototype = {    get title()     {        return this._title;    },    set title(x)     {        if (this._title === x)            return;        this._title = x;        if (x instanceof Node) {            this.titleElement.removeChildren();            this.titleElement.appendChild(x);        } else            this.titleElement.textContent = x;    },    get subtitle()     {        return this._subtitle;    },    get expanded()     {        return this._expanded;    },    repopulate: function()     {        this._populated = false;        if (this._expanded) {            this.onpopulate();            this._populated = true;        }    },    onpopulate: function()     {},    expand: function()     {        if (this._expanded)            return;        this._expanded = true;        this.element.classList.add("expanded");        if (!this._populated) {            this.onpopulate();            this._populated = true;        }    },    collapse: function()     {        if (!this._expanded)            return;        this._expanded = false;        this.element.classList.remove("expanded");    },    registerRequiredCSS: function(cssFile)     {        this.element.insertBefore(WebInspector.Widget.createStyleElement(cssFile), this.headerElement);    },    handleClick: function(event)     {        if (this._doNotExpandOnTitleClick)            return;        if (this._expanded)            this.collapse();        else            this.expand();        event.consume();    },    doNotExpandOnTitleClick: function()     {        this._doNotExpandOnTitleClick = true;    }}WebInspector.PropertiesSection = function(title, subtitle) {    WebInspector.Section.call(this, title, subtitle);    this.registerRequiredCSS("ui/propertiesSection.css");    this.propertiesTreeOutline = new TreeOutline(true);    this.propertiesElement = this.propertiesTreeOutline.element;    this.propertiesElement.classList.add("properties", "properties-tree", "monospace");    this.propertiesTreeOutline.setFocusable(false);    this.propertiesTreeOutline.section = this;    this.element.appendChild(this.propertiesElement);}WebInspector.PropertiesSection.prototype = {    __proto__: WebInspector.Section.prototype};WebInspector.SettingsUI = {}WebInspector.SettingsUI.createSettingCheckbox = function(name, setting, omitParagraphElement, tooltip) {    var label = createCheckboxLabel(name);    if (tooltip)        label.title = tooltip;    var input = label.checkboxElement;    input.name = name;    WebInspector.SettingsUI.bindCheckbox(input, setting);    if (omitParagraphElement)        return label;    var p = createElement("p");    p.appendChild(label);    return p;}WebInspector.SettingsUI.bindCheckbox = function(input, setting) {    function settingChanged()     {        if (input.checked !== setting.get())            input.checked = setting.get();    }    setting.addChangeListener(settingChanged);    settingChanged();    function inputChanged()     {        if (setting.get() !== input.checked)            setting.set(input.checked);    }    input.addEventListener("change", inputChanged, false);}WebInspector.SettingsUI.createSettingInputField = function(label, setting, numeric, maxLength, width, validatorCallback, instant, clearForZero, placeholder) {    var p = createElement("p");    var labelElement = p.createChild("label");    labelElement.textContent = label;    var inputElement = p.createChild("input");    inputElement.type = "text";    if (numeric)        inputElement.className = "numeric";    if (maxLength)        inputElement.maxLength = maxLength;    if (width)        inputElement.style.width = width;    inputElement.placeholder = placeholder || "";    if (validatorCallback || instant) {        inputElement.addEventListener("change", onInput, false);        inputElement.addEventListener("input", onInput, false);    }    inputElement.addEventListener("keydown", onKeyDown, false);    var errorMessageLabel;    if (validatorCallback)        errorMessageLabel = p.createChild("div", "field-error-message");    function onInput()     {        if (validatorCallback)            validate();        if (instant)            apply();    }    function onKeyDown(event)     {        if (isEnterKey(event))            apply();        incrementForArrows(event);    }    function incrementForArrows(event)     {        if (!numeric)            return;        var increment = event.keyIdentifier === "Up" ? 1 : event.keyIdentifier === "Down" ? -1 : 0;        if (!increment)            return;        if (event.shiftKey)            increment *= 10;        var value = inputElement.value;        if (validatorCallback && validatorCallback(value))            return;        value = Number(value);        if (clearForZero && !value)            return;        value += increment;        if (clearForZero && !value)            return;        value = String(value);        if (validatorCallback && validatorCallback(value))            return;        inputElement.value = value;        apply();        event.preventDefault();    }    function validate()     {        var error = validatorCallback(inputElement.value);        if (!error)            error = "";        inputElement.classList.toggle("error-input", !!error);        errorMessageLabel.textContent = error;    }    if (!instant)        inputElement.addEventListener("blur", apply, false);    function apply()     {        if (validatorCallback && validatorCallback(inputElement.value))            return;        setting.removeChangeListener(onSettingChange);        setting.set(numeric ? Number(inputElement.value) : inputElement.value);        setting.addChangeListener(onSettingChange);    }    setting.addChangeListener(onSettingChange);    function onSettingChange()     {        var value = setting.get();        if (clearForZero && !value)            value = "";        inputElement.value = value;    }    onSettingChange();    if (validatorCallback)        validate();    return p;}WebInspector.SettingsUI.createCustomSetting = function(name, element) {    var p = createElement("p");    var fieldsetElement = p.createChild("fieldset");    fieldsetElement.createChild("label").textContent = name;    fieldsetElement.appendChild(element);    return p;}WebInspector.SettingsUI.createSettingFieldset = function(setting) {    var fieldset = createElement("fieldset");    fieldset.disabled = !setting.get();    setting.addChangeListener(settingChanged);    return fieldset;    function settingChanged()     {        fieldset.disabled = !setting.get();    }}WebInspector.SettingsUI.regexValidator = function(text) {    var regex;    try {        regex = new RegExp(text);    } catch (e) {}    return regex ? null  : WebInspector.UIString("Invalid pattern");}WebInspector.SettingsUI.createInput = function(parentElement, id, defaultText, eventListener, numeric, size) {    var element = parentElement.createChild("input");    element.id = id;    element.type = "text";    element.maxLength = 12;    element.style.width = size || "80px";    element.value = defaultText;    element.align = "right";    if (numeric)        element.className = "numeric";    element.addEventListener("input", eventListener, false);    element.addEventListener("keydown", keyDownListener, false);    function keyDownListener(event)     {        if (isEnterKey(event))            eventListener(event);    }    return element;}WebInspector.SettingUI = function() {}WebInspector.SettingUI.prototype = {    settingElement: function() {}};WebInspector.SidebarSectionTreeElement = function(title) {    TreeElement.call(this, title.escapeHTML(), true);    this.expand();}WebInspector.SidebarSectionTreeElement.prototype = {    selectable: false,    collapse: function()     {},    get smallChildren()     {        return this._smallChildren;    },    set smallChildren(x)     {        if (this._smallChildren === x)            return;        this._smallChildren = x;        this._childrenListNode.classList.toggle("small", this._smallChildren);    },    onattach: function()     {        this.listItemElement.classList.add("sidebar-tree-section");    },    onreveal: function()     {        if (this.listItemElement)            this.listItemElement.scrollIntoViewIfNeeded(false);    },    __proto__: TreeElement.prototype}WebInspector.SidebarTreeElement = function(className, title, subtitle, expandable) {    TreeElement.call(this, "", expandable);    if (expandable)        this.disclosureButton = createElementWithClass("button", "disclosure-button");    this.iconElement = createElementWithClass("div", "icon");    this.statusElement = createElementWithClass("div", "status");    this.titlesElement = createElementWithClass("div", "titles");    this.titleContainer = this.titlesElement.createChild("span", "title-container");    this.titleElement = this.titleContainer.createChild("span", "title");    this.subtitleElement = this.titlesElement.createChild("span", "subtitle");    this.className = className;    this.mainTitle = title;    this.subtitle = subtitle;}WebInspector.SidebarTreeElement.prototype = {    get small()     {        return this._small;    },    set small(x)     {        this._small = x;        if (this.listItemElement)            this.listItemElement.classList.toggle("small", this._small);    },    get mainTitle()     {        return this._mainTitle;    },    set mainTitle(x)     {        this._mainTitle = x;        this.refreshTitles();    },    get subtitle()     {        return this._subtitle;    },    set subtitle(x)     {        this._subtitle = x;        this.refreshTitles();    },    set wait(x)     {        this.listItemElement.classList.toggle("wait", x);    },    refreshTitles: function()     {        var mainTitle = this.mainTitle;        if (this.titleElement.textContent !== mainTitle)            this.titleElement.textContent = mainTitle;        var subtitle = this.subtitle;        if (subtitle) {            if (this.subtitleElement.textContent !== subtitle)                this.subtitleElement.textContent = subtitle;            this.titlesElement.classList.remove("no-subtitle");        } else {            this.subtitleElement.textContent = "";            this.titlesElement.classList.add("no-subtitle");        }    },    isEventWithinDisclosureTriangle: function(event)     {        return event.target === this.disclosureButton;    },    onattach: function()     {        this.listItemElement.classList.add("sidebar-tree-item");        if (this.className)            this.listItemElement.classList.add(this.className);        if (this.small)            this.listItemElement.classList.add("small");        if (this.isExpandable() && this.disclosureButton)            this.listItemElement.appendChild(this.disclosureButton);        this.listItemElement.appendChildren(this.iconElement, this.statusElement, this.titlesElement);    },    onreveal: function()     {        if (this.listItemElement)            this.listItemElement.scrollIntoViewIfNeeded(false);    },    __proto__: TreeElement.prototype};WebInspector.SoftContextMenu = function(items, itemSelectedCallback, parentMenu) {    this._items = items;    this._itemSelectedCallback = itemSelectedCallback;    this._parentMenu = parentMenu;}WebInspector.SoftContextMenu.prototype = {    show: function(document, x, y)     {        if (this._contextMenuElement)            this._discardMenu(true);        if (!this._items.length)            return;        this._document = document;        this._x = x;        this._y = y;        this._time = new Date().getTime();        this._contextMenuElement = createElementWithClass("div", "soft-context-menu");        var root = WebInspector.createShadowRootWithCoreStyles(this._contextMenuElement);        root.appendChild(WebInspector.Widget.createStyleElement("ui/softContextMenu.css"));        var menuElement = root.createChild("div");        this._contextMenuElement.tabIndex = 0;        this._contextMenuElement.style.top = y + "px";        this._contextMenuElement.style.left = x + "px";        menuElement.addEventListener("mouseup", consumeEvent, false);        menuElement.addEventListener("keydown", this._menuKeyDown.bind(this), false);        for (var i = 0; i < this._items.length; ++i)            menuElement.appendChild(this._createMenuItem(this._items[i]));        if (!this._parentMenu) {            this._glassPaneElement = createElementWithClass("div", "soft-context-menu-glass-pane fill");            this._glassPaneElement.tabIndex = 0;            this._glassPaneElement.addEventListener("mouseup", this._glassPaneMouseUp.bind(this), false);            this._glassPaneElement.appendChild(this._contextMenuElement);            document.body.appendChild(this._glassPaneElement);            this._focus();        } else {            this._parentMenu._parentGlassPaneElement().appendChild(this._contextMenuElement);        }        if (document.body.offsetWidth < this._contextMenuElement.offsetLeft + this._contextMenuElement.offsetWidth)            this._contextMenuElement.style.left = Math.max(0, x - this._contextMenuElement.offsetWidth) + "px";        if (document.body.offsetHeight < this._contextMenuElement.offsetTop + this._contextMenuElement.offsetHeight)            this._contextMenuElement.style.top = Math.max(0, document.body.offsetHeight - this._contextMenuElement.offsetHeight) + "px";    },    _parentGlassPaneElement: function()     {        if (this._glassPaneElement)            return this._glassPaneElement;        if (this._parentMenu)            return this._parentMenu._parentGlassPaneElement();        return null ;    },    _createMenuItem: function(item)     {        if (item.type === "separator")            return this._createSeparator();        if (item.type === "subMenu")            return this._createSubMenu(item);        var menuItemElement = createElementWithClass("div", "soft-context-menu-item");        var checkMarkElement = menuItemElement.createChild("span", "soft-context-menu-item-checkmark");        checkMarkElement.textContent = "\u2713 ";        if (!item.checked)            checkMarkElement.style.opacity = "0";        menuItemElement.createTextChild(item.label);        menuItemElement.addEventListener("mousedown", this._menuItemMouseDown.bind(this), false);        menuItemElement.addEventListener("mouseup", this._menuItemMouseUp.bind(this), false);        menuItemElement.addEventListener("mouseover", this._menuItemMouseOver.bind(this), false);        menuItemElement.addEventListener("mouseleave", this._menuItemMouseLeave.bind(this), false);        menuItemElement._actionId = item.id;        return menuItemElement;    },    _createSubMenu: function(item)     {        var menuItemElement = createElementWithClass("div", "soft-context-menu-item");        menuItemElement._subItems = item.subItems;        var checkMarkElement = menuItemElement.createChild("span", "soft-context-menu-item-checkmark");        checkMarkElement.textContent = "\u2713 ";        checkMarkElement.style.opacity = "0";        menuItemElement.createTextChild(item.label);        var subMenuArrowElement = menuItemElement.createChild("span", "soft-context-menu-item-submenu-arrow");        subMenuArrowElement.textContent = "\u25B6";        menuItemElement.addEventListener("mousedown", this._menuItemMouseDown.bind(this), false);        menuItemElement.addEventListener("mouseup", this._menuItemMouseUp.bind(this), false);        menuItemElement.addEventListener("mouseover", this._menuItemMouseOver.bind(this), false);        menuItemElement.addEventListener("mouseleave", this._menuItemMouseLeave.bind(this), false);        return menuItemElement;    },    _createSeparator: function()     {        var separatorElement = createElementWithClass("div", "soft-context-menu-separator");        separatorElement._isSeparator = true;        separatorElement.addEventListener("mouseover", this._hideSubMenu.bind(this), false);        separatorElement.createChild("div", "separator-line");        return separatorElement;    },    _menuItemMouseDown: function(event)     {        event.consume(true);    },    _menuItemMouseUp: function(event)     {        this._triggerAction(event.target, event);        event.consume();    },    _focus: function()     {        this._contextMenuElement.focus();    },    _triggerAction: function(menuItemElement, event)     {        if (!menuItemElement._subItems) {            this._discardMenu(true, event);            if (typeof menuItemElement._actionId !== "undefined") {                this._itemSelectedCallback(menuItemElement._actionId);                delete menuItemElement._actionId;            }            return;        }        this._showSubMenu(menuItemElement);        event.consume();    },    _showSubMenu: function(menuItemElement)     {        if (menuItemElement._subMenuTimer) {            clearTimeout(menuItemElement._subMenuTimer);            delete menuItemElement._subMenuTimer;        }        if (this._subMenu)            return;        this._subMenu = new WebInspector.SoftContextMenu(menuItemElement._subItems,this._itemSelectedCallback,this);        this._subMenu.show(this._document, this._x + menuItemElement.offsetWidth - 3, this._y + menuItemElement.offsetTop - 1);    },    _hideSubMenu: function()     {        if (!this._subMenu)            return;        this._subMenu._discardSubMenus();        this._focus();    },    _menuItemMouseOver: function(event)     {        this._highlightMenuItem(event.target);    },    _menuItemMouseLeave: function(event)     {        if (!this._subMenu || !event.relatedTarget) {            this._highlightMenuItem(null );            return;        }        var relatedTarget = event.relatedTarget;        if (relatedTarget.classList.contains("soft-context-menu-glass-pane"))            this._highlightMenuItem(null );    },    _highlightMenuItem: function(menuItemElement)     {        if (this._highlightedMenuItemElement === menuItemElement)            return;        this._hideSubMenu();        if (this._highlightedMenuItemElement) {            this._highlightedMenuItemElement.classList.remove("soft-context-menu-item-mouse-over");            if (this._highlightedMenuItemElement._subItems && this._highlightedMenuItemElement._subMenuTimer) {                clearTimeout(this._highlightedMenuItemElement._subMenuTimer);                delete this._highlightedMenuItemElement._subMenuTimer;            }        }        this._highlightedMenuItemElement = menuItemElement;        if (this._highlightedMenuItemElement) {            this._highlightedMenuItemElement.classList.add("soft-context-menu-item-mouse-over");            this._contextMenuElement.focus();            if (this._highlightedMenuItemElement._subItems && !this._highlightedMenuItemElement._subMenuTimer)                this._highlightedMenuItemElement._subMenuTimer = setTimeout(this._showSubMenu.bind(this, this._highlightedMenuItemElement), 150);        }    },    _highlightPrevious: function()     {        var menuItemElement = this._highlightedMenuItemElement ? this._highlightedMenuItemElement.previousSibling : this._contextMenuElement.lastChild;        while (menuItemElement && menuItemElement._isSeparator)            menuItemElement = menuItemElement.previousSibling;        if (menuItemElement)            this._highlightMenuItem(menuItemElement);    },    _highlightNext: function()     {        var menuItemElement = this._highlightedMenuItemElement ? this._highlightedMenuItemElement.nextSibling : this._contextMenuElement.firstChild;        while (menuItemElement && menuItemElement._isSeparator)            menuItemElement = menuItemElement.nextSibling;        if (menuItemElement)            this._highlightMenuItem(menuItemElement);    },    _menuKeyDown: function(event)     {        switch (event.keyIdentifier) {        case "Up":            this._highlightPrevious();            break;        case "Down":            this._highlightNext();            break;        case "Left":            if (this._parentMenu) {                this._highlightMenuItem(null );                this._parentMenu._focus();            }            break;        case "Right":            if (!this._highlightedMenuItemElement)                break;            if (this._highlightedMenuItemElement._subItems) {                this._showSubMenu(this._highlightedMenuItemElement);                this._subMenu._focus();                this._subMenu._highlightNext();            }            break;        case "U+001B":            this._discardMenu(true, event);            break;        case "Enter":            if (!isEnterKey(event))                break;        case "U+0020":            if (this._highlightedMenuItemElement)                this._triggerAction(this._highlightedMenuItemElement, event);            break;        }        event.consume(true);    },    _glassPaneMouseUp: function(event)     {        if (event.x === this._x && event.y === this._y && new Date().getTime() - this._time < 300)            return;        this._discardMenu(true, event);        event.consume();    },    _discardMenu: function(closeParentMenus, event)     {        if (this._subMenu && !closeParentMenus)            return;        if (this._glassPaneElement) {            var glassPane = this._glassPaneElement;            delete this._glassPaneElement;            this._document.body.removeChild(glassPane);            if (this._parentMenu) {                delete this._parentMenu._subMenu;                if (closeParentMenus)                    this._parentMenu._discardMenu(closeParentMenus, event);            }            if (event)                event.consume(true);        } else if (this._parentMenu && this._contextMenuElement.parentElement) {            this._discardSubMenus();            if (closeParentMenus)                this._parentMenu._discardMenu(closeParentMenus, event);            if (event)                event.consume(true);        }    },    _discardSubMenus: function()     {        if (this._subMenu)            this._subMenu._discardSubMenus();        this._contextMenuElement.remove();        if (this._parentMenu)            delete this._parentMenu._subMenu;    }};WebInspector.SplitWidget = function(isVertical, secondIsSidebar, settingName, defaultSidebarWidth, defaultSidebarHeight, constraintsInDip) {    WebInspector.Widget.call(this, true);    this.element.classList.add("split-widget");    this.registerRequiredCSS("ui/splitWidget.css");    this.contentElement.classList.add("shadow-split-widget");    this._mainElement = this.contentElement.createChild("div", "shadow-split-widget-contents shadow-split-widget-main vbox");    this._mainElement.createChild("content").select = ".insertion-point-main";    this._sidebarElement = this.contentElement.createChild("div", "shadow-split-widget-contents shadow-split-widget-sidebar vbox");    this._sidebarElement.createChild("content").select = ".insertion-point-sidebar";    this._resizerElement = this.contentElement.createChild("div", "shadow-split-widget-resizer");    this._resizerWidget = new WebInspector.SimpleResizerWidget();    this._resizerWidget.setEnabled(true);    this._resizerWidget.addEventListener(WebInspector.ResizerWidget.Events.ResizeStart, this._onResizeStart, this);    this._resizerWidget.addEventListener(WebInspector.ResizerWidget.Events.ResizeUpdate, this._onResizeUpdate, this);    this._resizerWidget.addEventListener(WebInspector.ResizerWidget.Events.ResizeEnd, this._onResizeEnd, this);    this._defaultSidebarWidth = defaultSidebarWidth || 200;    this._defaultSidebarHeight = defaultSidebarHeight || this._defaultSidebarWidth;    this._constraintsInDip = !!constraintsInDip;    this._setting = settingName ? WebInspector.settings.createSetting(settingName, {}) : null ;    this.setSecondIsSidebar(secondIsSidebar);    this._innerSetVertical(isVertical);    this._showMode = WebInspector.SplitWidget.ShowMode.Both;    this.installResizer(this._resizerElement);}WebInspector.SplitWidget.SettingForOrientation;WebInspector.SplitWidget.ShowMode = {    Both: "Both",    OnlyMain: "OnlyMain",    OnlySidebar: "OnlySidebar"}WebInspector.SplitWidget.Events = {    SidebarSizeChanged: "SidebarSizeChanged",    ShowModeChanged: "ShowModeChanged"}WebInspector.SplitWidget.MinPadding = 20;WebInspector.SplitWidget.prototype = {    isVertical: function()     {        return this._isVertical;    },    setVertical: function(isVertical)     {        if (this._isVertical === isVertical)            return;        this._innerSetVertical(isVertical);        if (this.isShowing())            this._updateLayout();    },    _innerSetVertical: function(isVertical)     {        this.contentElement.classList.toggle("vbox", !isVertical);        this.contentElement.classList.toggle("hbox", isVertical);        this._isVertical = isVertical;        delete this._resizerElementSize;        this._sidebarSizeDIP = -1;        this._restoreSidebarSizeFromSettings();        if (this._shouldSaveShowMode)            this._restoreAndApplyShowModeFromSettings();        this._updateShowHideSidebarButton();        this._resizerWidget.setVertical(!isVertical);        this.invalidateConstraints();    },    _updateLayout: function(animate)     {        delete this._totalSizeCSS;        delete this._totalSizeOtherDimensionCSS;        this._mainElement.style.removeProperty("width");        this._mainElement.style.removeProperty("height");        this._sidebarElement.style.removeProperty("width");        this._sidebarElement.style.removeProperty("height");        this._innerSetSidebarSizeDIP(this._preferredSidebarSizeDIP(), !!animate);    },    setMainWidget: function(widget)     {        if (this._mainWidget)            this._mainWidget.detach();        this._mainWidget = widget;        if (widget) {            widget.element.classList.add("insertion-point-main");            widget.element.classList.remove("insertion-point-sidebar");            if (this._showMode === WebInspector.SplitWidget.ShowMode.OnlyMain || this._showMode === WebInspector.SplitWidget.ShowMode.Both)                widget.show(this.element);        }    },    setSidebarWidget: function(widget)     {        if (this._sidebarWidget)            this._sidebarWidget.detach();        this._sidebarWidget = widget;        if (widget) {            widget.element.classList.add("insertion-point-sidebar");            widget.element.classList.remove("insertion-point-main");            if (this._showMode === WebInspector.SplitWidget.ShowMode.OnlySidebar || this._showMode === WebInspector.SplitWidget.ShowMode.Both)                widget.show(this.element);        }    },    mainWidget: function()     {        return this._mainWidget;    },    sidebarWidget: function()     {        return this._sidebarWidget;    },    childWasDetached: function(widget)     {        if (this._detaching)            return;        if (this._mainWidget === widget)            delete this._mainWidget;        if (this._sidebarWidget === widget)            delete this._sidebarWidget;    },    isSidebarSecond: function()     {        return this._secondIsSidebar;    },    enableShowModeSaving: function()     {        this._shouldSaveShowMode = true;        this._restoreAndApplyShowModeFromSettings();    },    showMode: function()     {        return this._showMode;    },    setSecondIsSidebar: function(secondIsSidebar)     {        this.contentElement.classList.toggle("shadow-split-widget-first-is-sidebar", !secondIsSidebar);        this._secondIsSidebar = secondIsSidebar;    },    sidebarSide: function()     {        if (this._showMode !== WebInspector.SplitWidget.ShowMode.Both)            return null ;        return this._isVertical ? (this._secondIsSidebar ? "right" : "left") : (this._secondIsSidebar ? "bottom" : "top");    },    resizerElement: function()     {        return this._resizerElement;    },    hideMain: function(animate)     {        this._showOnly(this._sidebarWidget, this._mainWidget, this._sidebarElement, this._mainElement, animate);        this._updateShowMode(WebInspector.SplitWidget.ShowMode.OnlySidebar);    },    hideSidebar: function(animate)     {        this._showOnly(this._mainWidget, this._sidebarWidget, this._mainElement, this._sidebarElement, animate);        this._updateShowMode(WebInspector.SplitWidget.ShowMode.OnlyMain);    },    _showOnly: function(sideToShow, sideToHide, shadowToShow, shadowToHide, animate)     {        this._cancelAnimation();        function callback()         {            if (sideToShow) {                if (sideToShow === this._mainWidget)                    this._mainWidget.show(this.element, this._sidebarWidget ? this._sidebarWidget.element : null );                else                    this._sidebarWidget.show(this.element);            }            if (sideToHide) {                this._detaching = true;                sideToHide.detach();                delete this._detaching;            }            this._resizerElement.classList.add("hidden");            shadowToShow.classList.remove("hidden");            shadowToShow.classList.add("maximized");            shadowToHide.classList.add("hidden");            shadowToHide.classList.remove("maximized");            this._removeAllLayoutProperties();            this.doResize();        }        if (animate)            this._animate(true, callback.bind(this));        else            callback.call(this);        this._sidebarSizeDIP = -1;        this.setResizable(false);    },    _removeAllLayoutProperties: function()     {        this._sidebarElement.style.removeProperty("flexBasis");        this._mainElement.style.removeProperty("width");        this._mainElement.style.removeProperty("height");        this._sidebarElement.style.removeProperty("width");        this._sidebarElement.style.removeProperty("height");        this._resizerElement.style.removeProperty("left");        this._resizerElement.style.removeProperty("right");        this._resizerElement.style.removeProperty("top");        this._resizerElement.style.removeProperty("bottom");        this._resizerElement.style.removeProperty("margin-left");        this._resizerElement.style.removeProperty("margin-right");        this._resizerElement.style.removeProperty("margin-top");        this._resizerElement.style.removeProperty("margin-bottom");    },    showBoth: function(animate)     {        if (this._showMode === WebInspector.SplitWidget.ShowMode.Both)            animate = false;        this._cancelAnimation();        this._mainElement.classList.remove("maximized", "hidden");        this._sidebarElement.classList.remove("maximized", "hidden");        this._resizerElement.classList.remove("hidden");        if (this._sidebarWidget)            this._sidebarWidget.show(this.element);        if (this._mainWidget)            this._mainWidget.show(this.element, this._sidebarWidget ? this._sidebarWidget.element : null );        this.setSecondIsSidebar(this._secondIsSidebar);        this._sidebarSizeDIP = -1;        this.setResizable(true);        this._updateShowMode(WebInspector.SplitWidget.ShowMode.Both);        this._updateLayout(animate);    },    setResizable: function(resizable)     {        this._resizerWidget.setEnabled(resizable);    },    isResizable: function()     {        return this._resizerWidget.isEnabled();    },    setSidebarSize: function(size)     {        var sizeDIP = WebInspector.zoomManager.cssToDIP(size);        this._savedSidebarSizeDIP = sizeDIP;        this._saveSetting();        this._innerSetSidebarSizeDIP(sizeDIP, false, true);    },    sidebarSize: function()     {        var sizeDIP = Math.max(0, this._sidebarSizeDIP);        return WebInspector.zoomManager.dipToCSS(sizeDIP);    },    _totalSizeDIP: function()     {        if (!this._totalSizeCSS) {            this._totalSizeCSS = this._isVertical ? this.contentElement.offsetWidth : this.contentElement.offsetHeight;            this._totalSizeOtherDimensionCSS = this._isVertical ? this.contentElement.offsetHeight : this.contentElement.offsetWidth;        }        return WebInspector.zoomManager.cssToDIP(this._totalSizeCSS);    },    _updateShowMode: function(showMode)     {        this._showMode = showMode;        this._saveShowModeToSettings();        this._updateShowHideSidebarButton();        this.dispatchEventToListeners(WebInspector.SplitWidget.Events.ShowModeChanged, showMode);        this.invalidateConstraints();    },    _innerSetSidebarSizeDIP: function(sizeDIP, animate, userAction)     {        if (this._showMode !== WebInspector.SplitWidget.ShowMode.Both || !this.isShowing())            return;        sizeDIP = this._applyConstraints(sizeDIP, userAction);        if (this._sidebarSizeDIP === sizeDIP)            return;        if (!this._resizerElementSize)            this._resizerElementSize = this._isVertical ? this._resizerElement.offsetWidth : this._resizerElement.offsetHeight;        this._removeAllLayoutProperties();        var sidebarSizeValue = WebInspector.zoomManager.dipToCSS(sizeDIP) + "px";        var mainSizeValue = (this._totalSizeCSS - WebInspector.zoomManager.dipToCSS(sizeDIP)) + "px";        this._sidebarElement.style.flexBasis = sidebarSizeValue;        if (this._isVertical) {            this._sidebarElement.style.width = sidebarSizeValue;            this._mainElement.style.width = mainSizeValue;            this._sidebarElement.style.height = this._totalSizeOtherDimensionCSS + "px";            this._mainElement.style.height = this._totalSizeOtherDimensionCSS + "px";        } else {            this._sidebarElement.style.height = sidebarSizeValue;            this._mainElement.style.height = mainSizeValue;            this._sidebarElement.style.width = this._totalSizeOtherDimensionCSS + "px";            this._mainElement.style.width = this._totalSizeOtherDimensionCSS + "px";        }        if (this._isVertical) {            if (this._secondIsSidebar) {                this._resizerElement.style.right = sidebarSizeValue;                this._resizerElement.style.marginRight = -this._resizerElementSize / 2 + "px";            } else {                this._resizerElement.style.left = sidebarSizeValue;                this._resizerElement.style.marginLeft = -this._resizerElementSize / 2 + "px";            }        } else {            if (this._secondIsSidebar) {                this._resizerElement.style.bottom = sidebarSizeValue;                this._resizerElement.style.marginBottom = -this._resizerElementSize / 2 + "px";            } else {                this._resizerElement.style.top = sidebarSizeValue;                this._resizerElement.style.marginTop = -this._resizerElementSize / 2 + "px";            }        }        this._sidebarSizeDIP = sizeDIP;        if (animate) {            this._animate(false);        } else {            this.doResize();            this.dispatchEventToListeners(WebInspector.SplitWidget.Events.SidebarSizeChanged, this.sidebarSize());        }    },    _animate: function(reverse, callback)     {        var animationTime = 50;        this._animationCallback = callback;        var animatedMarginPropertyName;        if (this._isVertical)            animatedMarginPropertyName = this._secondIsSidebar ? "margin-right" : "margin-left";        else            animatedMarginPropertyName = this._secondIsSidebar ? "margin-bottom" : "margin-top";        var marginFrom = reverse ? "0" : "-" + WebInspector.zoomManager.dipToCSS(this._sidebarSizeDIP) + "px";        var marginTo = reverse ? "-" + WebInspector.zoomManager.dipToCSS(this._sidebarSizeDIP) + "px" : "0";        this.contentElement.style.setProperty(animatedMarginPropertyName, marginFrom);        if (!reverse) {            suppressUnused(this._mainElement.offsetWidth);            suppressUnused(this._sidebarElement.offsetWidth);        }        if (!reverse)            this._sidebarWidget.doResize();        this.contentElement.style.setProperty("transition", animatedMarginPropertyName + " " + animationTime + "ms linear");        var boundAnimationFrame;        var startTime;        function animationFrame()         {            delete this._animationFrameHandle;            if (!startTime) {                this.contentElement.style.setProperty(animatedMarginPropertyName, marginTo);                startTime = window.performance.now();            } else if (window.performance.now() < startTime + animationTime) {                if (this._mainWidget)                    this._mainWidget.doResize();            } else {                this._cancelAnimation();                if (this._mainWidget)                    this._mainWidget.doResize();                this.dispatchEventToListeners(WebInspector.SplitWidget.Events.SidebarSizeChanged, this.sidebarSize());                return;            }            this._animationFrameHandle = this.contentElement.window().requestAnimationFrame(boundAnimationFrame);        }        boundAnimationFrame = animationFrame.bind(this);        this._animationFrameHandle = this.contentElement.window().requestAnimationFrame(boundAnimationFrame);    },    _cancelAnimation: function()     {        this.contentElement.style.removeProperty("margin-top");        this.contentElement.style.removeProperty("margin-right");        this.contentElement.style.removeProperty("margin-bottom");        this.contentElement.style.removeProperty("margin-left");        this.contentElement.style.removeProperty("transition");        if (this._animationFrameHandle) {            this.contentElement.window().cancelAnimationFrame(this._animationFrameHandle);            delete this._animationFrameHandle;        }        if (this._animationCallback) {            this._animationCallback();            delete this._animationCallback;        }    },    _applyConstraints: function(sidebarSize, userAction)     {        var totalSize = this._totalSizeDIP();        var zoomFactor = this._constraintsInDip ? 1 : WebInspector.zoomManager.zoomFactor();        var constraints = this._sidebarWidget ? this._sidebarWidget.constraints() : new Constraints();        var minSidebarSize = this.isVertical() ? constraints.minimum.width : constraints.minimum.height;        if (!minSidebarSize)            minSidebarSize = WebInspector.SplitWidget.MinPadding;        minSidebarSize *= zoomFactor;        var preferredSidebarSize = this.isVertical() ? constraints.preferred.width : constraints.preferred.height;        if (!preferredSidebarSize)            preferredSidebarSize = WebInspector.SplitWidget.MinPadding;        preferredSidebarSize *= zoomFactor;        if (sidebarSize < preferredSidebarSize)            preferredSidebarSize = Math.max(sidebarSize, minSidebarSize);        preferredSidebarSize += zoomFactor;        constraints = this._mainWidget ? this._mainWidget.constraints() : new Constraints();        var minMainSize = this.isVertical() ? constraints.minimum.width : constraints.minimum.height;        if (!minMainSize)            minMainSize = WebInspector.SplitWidget.MinPadding;        minMainSize *= zoomFactor;        var preferredMainSize = this.isVertical() ? constraints.preferred.width : constraints.preferred.height;        if (!preferredMainSize)            preferredMainSize = WebInspector.SplitWidget.MinPadding;        preferredMainSize *= zoomFactor;        var savedMainSize = this.isVertical() ? this._savedVerticalMainSize : this._savedHorizontalMainSize;        if (typeof savedMainSize !== "undefined")            preferredMainSize = Math.min(preferredMainSize, savedMainSize * zoomFactor);        if (userAction)            preferredMainSize = minMainSize;        var totalPreferred = preferredMainSize + preferredSidebarSize;        if (totalPreferred <= totalSize)            return Number.constrain(sidebarSize, preferredSidebarSize, totalSize - preferredMainSize);        if (minMainSize + minSidebarSize <= totalSize) {            var delta = totalPreferred - totalSize;            var sidebarDelta = delta * preferredSidebarSize / totalPreferred;            sidebarSize = preferredSidebarSize - sidebarDelta;            return Number.constrain(sidebarSize, minSidebarSize, totalSize - minMainSize);        }        return Math.max(0, totalSize - minMainSize);    },    wasShown: function()     {        this._forceUpdateLayout();        WebInspector.zoomManager.addEventListener(WebInspector.ZoomManager.Events.ZoomChanged, this._onZoomChanged, this);    },    willHide: function()     {        WebInspector.zoomManager.removeEventListener(WebInspector.ZoomManager.Events.ZoomChanged, this._onZoomChanged, this);    },    onResize: function()     {        this._updateLayout();    },    onLayout: function()     {        this._updateLayout();    },    calculateConstraints: function()     {        if (this._showMode === WebInspector.SplitWidget.ShowMode.OnlyMain)            return this._mainWidget ? this._mainWidget.constraints() : new Constraints();        if (this._showMode === WebInspector.SplitWidget.ShowMode.OnlySidebar)            return this._sidebarWidget ? this._sidebarWidget.constraints() : new Constraints();        var mainConstraints = this._mainWidget ? this._mainWidget.constraints() : new Constraints();        var sidebarConstraints = this._sidebarWidget ? this._sidebarWidget.constraints() : new Constraints();        var min = WebInspector.SplitWidget.MinPadding;        if (this._isVertical) {            mainConstraints = mainConstraints.widthToMax(min).addWidth(1);            sidebarConstraints = sidebarConstraints.widthToMax(min);            return mainConstraints.addWidth(sidebarConstraints).heightToMax(sidebarConstraints);        } else {            mainConstraints = mainConstraints.heightToMax(min).addHeight(1);            sidebarConstraints = sidebarConstraints.heightToMax(min);            return mainConstraints.widthToMax(sidebarConstraints).addHeight(sidebarConstraints);        }    },    _onResizeStart: function(event)     {        this._resizeStartSizeDIP = this._sidebarSizeDIP;    },    _onResizeUpdate: function(event)     {        var offset = event.data.currentPosition - event.data.startPosition;        var offsetDIP = WebInspector.zoomManager.cssToDIP(offset);        var newSizeDIP = this._secondIsSidebar ? this._resizeStartSizeDIP - offsetDIP : this._resizeStartSizeDIP + offsetDIP;        var constrainedSizeDIP = this._applyConstraints(newSizeDIP, true);        this._savedSidebarSizeDIP = constrainedSizeDIP;        this._saveSetting();        this._innerSetSidebarSizeDIP(constrainedSizeDIP, false, true);        if (this.isVertical())            this._savedVerticalMainSize = this._totalSizeDIP() - this._sidebarSizeDIP;        else            this._savedHorizontalMainSize = this._totalSizeDIP() - this._sidebarSizeDIP;    },    _onResizeEnd: function(event)     {        delete this._resizeStartSizeDIP;    },    hideDefaultResizer: function()     {        this.uninstallResizer(this._resizerElement);    },    installResizer: function(resizerElement)     {        this._resizerWidget.addElement(resizerElement);    },    uninstallResizer: function(resizerElement)     {        this._resizerWidget.removeElement(resizerElement);    },    hasCustomResizer: function()     {        var elements = this._resizerWidget.elements();        return elements.length > 1 || (elements.length == 1 && elements[0] !== this._resizerElement);    },    toggleResizer: function(resizer, on)     {        if (on)            this.installResizer(resizer);        else            this.uninstallResizer(resizer);    },    _settingForOrientation: function()     {        var state = this._setting ? this._setting.get() : {};        return this._isVertical ? state.vertical : state.horizontal;    },    _preferredSidebarSizeDIP: function()     {        var size = this._savedSidebarSizeDIP;        if (!size) {            size = this._isVertical ? this._defaultSidebarWidth : this._defaultSidebarHeight;            if (0 < size && size < 1)                size *= this._totalSizeDIP();        }        return size;    },    _restoreSidebarSizeFromSettings: function()     {        var settingForOrientation = this._settingForOrientation();        this._savedSidebarSizeDIP = settingForOrientation ? settingForOrientation.size : 0;    },    _restoreAndApplyShowModeFromSettings: function()     {        var orientationState = this._settingForOrientation();        this._savedShowMode = orientationState && orientationState.showMode ? orientationState.showMode : this._showMode;        this._showMode = this._savedShowMode;        switch (this._savedShowMode) {        case WebInspector.SplitWidget.ShowMode.Both:            this.showBoth();            break;        case WebInspector.SplitWidget.ShowMode.OnlyMain:            this.hideSidebar();            break;        case WebInspector.SplitWidget.ShowMode.OnlySidebar:            this.hideMain();            break;        }    },    _saveShowModeToSettings: function()     {        this._savedShowMode = this._showMode;        this._saveSetting();    },    _saveSetting: function()     {        if (!this._setting)            return;        var state = this._setting.get();        var orientationState = (this._isVertical ? state.vertical : state.horizontal) || {};        orientationState.size = this._savedSidebarSizeDIP;        if (this._shouldSaveShowMode)            orientationState.showMode = this._savedShowMode;        if (this._isVertical)            state.vertical = orientationState;        else            state.horizontal = orientationState;        this._setting.set(state);    },    _forceUpdateLayout: function()     {        this._sidebarSizeDIP = -1;        this._updateLayout();    },    _onZoomChanged: function(event)     {        this._forceUpdateLayout();    },    displayShowHideSidebarButton: function(title, className)     {        console.assert(this.isVertical(), "Buttons for split widget with horizontal split are not supported yet.");        this._showHideSidebarButtonTitle = WebInspector.UIString(title);        this._showHideSidebarButton = this._mainElement.createChild("button", "sidebar-show-hide-button " + (className || ""));        this._showHideSidebarButton.addEventListener("click", buttonClicked.bind(this), false);        this._updateShowHideSidebarButton();        function buttonClicked(event)         {            if (this._showMode !== WebInspector.SplitWidget.ShowMode.Both)                this.showBoth(true);            else                this.hideSidebar(true);        }        return this._showHideSidebarButton;    },    _updateShowHideSidebarButton: function()     {        if (!this._showHideSidebarButton)            return;        var sidebarHidden = this._showMode === WebInspector.SplitWidget.ShowMode.OnlyMain;        this._showHideSidebarButton.classList.toggle("toggled-show", sidebarHidden);        this._showHideSidebarButton.classList.toggle("toggled-hide", !sidebarHidden);        this._showHideSidebarButton.classList.toggle("top-sidebar-show-hide-button", !this.isVertical() && !this.isSidebarSecond());        this._showHideSidebarButton.classList.toggle("right-sidebar-show-hide-button", this.isVertical() && this.isSidebarSecond());        this._showHideSidebarButton.classList.toggle("bottom-sidebar-show-hide-button", !this.isVertical() && this.isSidebarSecond());        this._showHideSidebarButton.classList.toggle("left-sidebar-show-hide-button", this.isVertical() && !this.isSidebarSecond());        this._showHideSidebarButton.title = sidebarHidden ? WebInspector.UIString("Show %s", this._showHideSidebarButtonTitle) : WebInspector.UIString("Hide %s", this._showHideSidebarButtonTitle);    },    __proto__: WebInspector.Widget.prototype};WebInspector.StackView = function(isVertical) {    WebInspector.VBox.call(this);    this._isVertical = isVertical;    this._currentSplitWidget = null ;}WebInspector.StackView.prototype = {    appendView: function(view, sidebarSizeSettingName, defaultSidebarWidth, defaultSidebarHeight)     {        var splitWidget = new WebInspector.SplitWidget(this._isVertical,true,sidebarSizeSettingName,defaultSidebarWidth,defaultSidebarHeight);        splitWidget.setMainWidget(view);        splitWidget.hideSidebar();        if (!this._currentSplitWidget) {            splitWidget.show(this.element);        } else {            this._currentSplitWidget.setSidebarWidget(splitWidget);            this._currentSplitWidget.showBoth();        }        this._currentSplitWidget = splitWidget;        return splitWidget;    },    detachChildWidgets: function()     {        WebInspector.Widget.prototype.detachChildWidgets.call(this);        this._currentSplitWidget = null ;    },    __proto__: WebInspector.VBox.prototype};WebInspector.Toolbar = function(parentElement) {    this._items = [];    this.element = parentElement ? parentElement.createChild("div", "toolbar") : createElementWithClass("div", "toolbar");    this._shadowRoot = WebInspector.createShadowRootWithCoreStyles(this.element);    this._shadowRoot.appendChild(WebInspector.Widget.createStyleElement("ui/toolbar.css"));    this._contentElement = this._shadowRoot.createChild("div", "toolbar-shadow");    this._contentElement.createChild("content");}WebInspector.Toolbar.prototype = {    makeVertical: function()     {        this._contentElement.classList.add("vertical");    },    setEnabled: function(enabled)     {        for (var item of this._items)            item.setEnabled(enabled);    },    appendToolbarItem: function(item)     {        this._items.push(item);        item._toolbar = this;        this._contentElement.insertBefore(item.element, this._contentElement.lastChild);        this._hideSeparatorDupes();    },    appendSeparator: function()     {        this.appendToolbarItem(new WebInspector.ToolbarSeparator());    },    removeToolbarItems: function()     {        for (var item of this._items)            delete item._toolbar;        this._items = [];        this._contentElement.removeChildren();        this._contentElement.createChild("content");    },    setColor: function(color)     {        var style = createElement("style");        style.textContent = "button.toolbar-item .glyph { background-color: " + color + " !important }";        this._shadowRoot.appendChild(style);    },    setToggledColor: function(color)     {        var style = createElement("style");        style.textContent = "button.toolbar-item.toggled-on .glyph { background-color: " + color + " !important }";        this._shadowRoot.appendChild(style);    },    _hideSeparatorDupes: function()     {        var previousIsSeparator = true;        var lastSeparator;        for (var i = 1; i < this._items.length; ++i) {            if (this._items[i] instanceof WebInspector.ToolbarSeparator) {                this._items[i].setVisible(!previousIsSeparator);                previousIsSeparator = true;                lastSeparator = this._items[i];                continue;            }            if (this._items[i].visible()) {                previousIsSeparator = false;                lastSeparator = null ;            }        }        if (lastSeparator && lastSeparator !== this._items.peekLast())            lastSeparator.setVisible(false);    }}WebInspector.ToolbarItem = function(element) {    this.element = element;    this.element.classList.add("toolbar-item");    this._enabled = true;    this._visible = true;}WebInspector.ToolbarItem.prototype = {    setEnabled: function(value)     {        if (this._enabled === value)            return;        this._enabled = value;        this._applyEnabledState();    },    _applyEnabledState: function()     {        this.element.disabled = !this._enabled;    },    visible: function()     {        return this._visible;    },    setVisible: function(x)     {        if (this._visible === x)            return;        this.element.classList.toggle("hidden", !x);        this._visible = x;        if (this._toolbar && !(this instanceof WebInspector.ToolbarSeparator))            this._toolbar._hideSeparatorDupes();    },    __proto__: WebInspector.Object.prototype}WebInspector.ToolbarCounter = function(counters) {    WebInspector.ToolbarItem.call(this, createElementWithClass("div", "toolbar-counter hidden"));    this.element.addEventListener("click", this._clicked.bind(this), false);    this._counters = [];    for (var i = 0; i < counters.length; ++i) {        var element = this.element.createChild("span", "toolbar-counter-item");        var icon = element.createChild("label", "", "dt-icon-label");        icon.type = counters[i];        var span = icon.createChild("span");        this._counters.push({            counter: counters[i],            element: element,            value: 0,            title: "",            span: span        });    }    this._update();}WebInspector.ToolbarCounter.prototype = {    setCounter: function(counter, value, title)     {        for (var i = 0; i < this._counters.length; ++i) {            if (this._counters[i].counter === counter) {                this._counters[i].value = value;                this._counters[i].title = title;                this._update();                return;            }        }    },    _update: function()     {        var total = 0;        var title = "";        for (var i = 0; i < this._counters.length; ++i) {            var counter = this._counters[i];            var value = counter.value;            if (!counter.value) {                counter.element.classList.add("hidden");                continue;            }            counter.element.classList.remove("hidden");            counter.element.classList.toggle("toolbar-counter-item-first", !total);            counter.span.textContent = value;            total += value;            if (counter.title) {                if (title)                    title += ", ";                title += counter.title;            }        }        this.element.classList.toggle("hidden", !total);        this.element.title = title;    },    _clicked: function(event)     {        this.dispatchEventToListeners("click");    },    __proto__: WebInspector.ToolbarItem.prototype}WebInspector.ToolbarText = function(text, className) {    WebInspector.ToolbarItem.call(this, createElementWithClass("span", "toolbar-text"));    if (className)        this.element.classList.add(className);    this.element.textContent = text;}WebInspector.ToolbarText.prototype = {    setText: function(text)     {        this.element.textContent = text;    },    __proto__: WebInspector.ToolbarItem.prototype}WebInspector.ToolbarInput = function(placeholder, growFactor) {    WebInspector.ToolbarItem.call(this, createElementWithClass("input", "toolbar-item"));    this.element.addEventListener("input", this._onChangeCallback.bind(this), false);    if (growFactor)        this.element.style.flexGrow = growFactor;    if (placeholder)        this.element.setAttribute("placeholder", placeholder);    this._value = "";}WebInspector.ToolbarInput.Event = {    TextChanged: "TextChanged"};WebInspector.ToolbarInput.prototype = {    setValue: function(value)     {        this._value = value;        this.element.value = value;    },    value: function()     {        return this.element.value;    },    _onChangeCallback: function()     {        this.dispatchEventToListeners(WebInspector.ToolbarInput.Event.TextChanged, this.element.value);    },    __proto__: WebInspector.ToolbarItem.prototype}WebInspector.ToolbarButtonBase = function(title, className, states) {    WebInspector.ToolbarItem.call(this, createElementWithClass("button", className + " toolbar-item"));    this.element.addEventListener("click", this._clicked.bind(this), false);    this._longClickController = new WebInspector.LongClickController(this.element);    this._longClickController.addEventListener(WebInspector.LongClickController.Events.LongClick, this._onLongClick.bind(this));    this._longClickController.addEventListener(WebInspector.LongClickController.Events.LongPress, this._onLongPress.bind(this));    this._states = states;    if (!states)        this._states = 2;    if (states == 2)        this._state = "off";    else        this._state = "0";    this.setTitle(title);    this.className = className;}WebInspector.ToolbarButtonBase.prototype = {    _onLongClick: function(event)     {        var nativeEvent = event.data;        this.dispatchEventToListeners("longClickDown", nativeEvent);    },    _onLongPress: function(event)     {        var nativeEvent = event.data;        this.dispatchEventToListeners("longPressDown", nativeEvent);    },    _clicked: function()     {        this.dispatchEventToListeners("click");        this._longClickController.reset();    },    _applyEnabledState: function()     {        this.element.disabled = !this._enabled;        this._longClickController.reset();    },    enabled: function()     {        return this._enabled;    },    title: function()     {        return this._title;    },    setTitle: function(x)     {        if (this._title === x)            return;        this._title = x;        this.element.title = x;    },    state: function()     {        return this._state;    },    setState: function(x)     {        if (this._state === x)            return;        this.element.classList.remove("toggled-" + this._state);        this.element.classList.add("toggled-" + x);        this._state = x;    },    toggled: function()     {        if (this._states !== 2)            throw ("Only used toggled when there are 2 states, otherwise, use state");        return this.state() === "on";    },    setToggled: function(x)     {        if (this._states !== 2)            throw ("Only used toggled when there are 2 states, otherwise, use state");        this.setState(x ? "on" : "off");    },    makeLongClickEnabled: function()     {        this._longClickController.enable();        this._longClickGlyph = this.element.createChild("div", "fill long-click-glyph toolbar-button-theme");    },    unmakeLongClickEnabled: function()     {        this._longClickController.disable();        if (this._longClickGlyph)            this.element.removeChild(this._longClickGlyph);    },    setLongClickOptionsEnabled: function(buttonsProvider)     {        if (buttonsProvider) {            if (!this._longClickOptionsData) {                this.makeLongClickEnabled();                var longClickDownListener = this._showOptions.bind(this);                this.addEventListener("longClickDown", longClickDownListener, this);                this._longClickOptionsData = {                    longClickDownListener: longClickDownListener                };            }            this._longClickOptionsData.buttonsProvider = buttonsProvider;        } else {            if (!this._longClickOptionsData)                return;            this.removeEventListener("longClickDown", this._longClickOptionsData.longClickDownListener, this);            delete this._longClickOptionsData;            this.unmakeLongClickEnabled();        }    },    _showOptions: function()     {        var buttons = this._longClickOptionsData.buttonsProvider();        var mainButtonClone = new WebInspector.ToolbarButton(this.title(),this.className,this._states);        mainButtonClone.addEventListener("click", this._clicked, this);        mainButtonClone.setState(this.state());        buttons.push(mainButtonClone);        var document = this.element.ownerDocument;        document.documentElement.addEventListener("mouseup", mouseUp, false);        var optionsGlassPane = new WebInspector.GlassPane(document);        var optionsBar = new WebInspector.Toolbar(optionsGlassPane.element);        optionsBar.element.classList.add("fill");        optionsBar._contentElement.classList.add("floating");        const buttonHeight = 26;        var hostButtonPosition = this.element.totalOffset();        var topNotBottom = hostButtonPosition.top + buttonHeight * buttons.length < document.documentElement.offsetHeight;        if (topNotBottom)            buttons = buttons.reverse();        optionsBar.element.style.height = (buttonHeight * buttons.length) + "px";        if (topNotBottom)            optionsBar.element.style.top = (hostButtonPosition.top + 1) + "px";        else            optionsBar.element.style.top = (hostButtonPosition.top - (buttonHeight * (buttons.length - 1))) + "px";        optionsBar.element.style.left = (hostButtonPosition.left + 1) + "px";        for (var i = 0; i < buttons.length; ++i) {            buttons[i].element.addEventListener("mousemove", mouseOver, false);            buttons[i].element.addEventListener("mouseout", mouseOut, false);            optionsBar.appendToolbarItem(buttons[i]);        }        var hostButtonIndex = topNotBottom ? 0 : buttons.length - 1;        buttons[hostButtonIndex].element.classList.add("emulate-active");        function mouseOver(e)         {            if (e.which !== 1)                return;            var buttonElement = e.target.enclosingNodeOrSelfWithClass("toolbar-item");            buttonElement.classList.add("emulate-active");        }        function mouseOut(e)         {            if (e.which !== 1)                return;            var buttonElement = e.target.enclosingNodeOrSelfWithClass("toolbar-item");            buttonElement.classList.remove("emulate-active");        }        function mouseUp(e)         {            if (e.which !== 1)                return;            optionsGlassPane.dispose();            document.documentElement.removeEventListener("mouseup", mouseUp, false);            for (var i = 0; i < buttons.length; ++i) {                if (buttons[i].element.classList.contains("emulate-active")) {                    buttons[i].element.classList.remove("emulate-active");                    buttons[i]._clicked(e);                    break;                }            }        }    },    __proto__: WebInspector.ToolbarItem.prototype}WebInspector.ToolbarButton = function(title, className, states) {    WebInspector.ToolbarButtonBase.call(this, title, className, states);    this._glyphElement = this.element.createChild("div", "glyph toolbar-button-theme");}WebInspector.ToolbarButton.prototype = {    setBackgroundImage: function(iconURL)     {        this.element.style.backgroundImage = "url(" + iconURL + ")";        this._glyphElement.classList.add("hidden");    },    __proto__: WebInspector.ToolbarButtonBase.prototype}WebInspector.ToolbarSettingToggle = function(setting, className, title, toggledTitle) {    WebInspector.ToolbarButton.call(this, "", className, 2);    this._defaultTitle = title;    this._toggledTitle = toggledTitle || title;    this._setting = setting;    this._settingChanged();    this._setting.addChangeListener(this._settingChanged, this);}WebInspector.ToolbarSettingToggle.prototype = {    _settingChanged: function()     {        var toggled = this._setting.get();        this.setToggled(toggled);        this.setTitle(toggled ? this._toggledTitle : this._defaultTitle);    },    _clicked: function()     {        this._setting.set(!this.toggled());        WebInspector.ToolbarButton.prototype._clicked.call(this);    },    __proto__: WebInspector.ToolbarButton.prototype}WebInspector.ToolbarSeparator = function() {    WebInspector.ToolbarItem.call(this, createElementWithClass("div", "toolbar-divider"));}WebInspector.ToolbarSeparator.prototype = {    __proto__: WebInspector.ToolbarItem.prototype}WebInspector.ToolbarTextButton = function(title, className, text, states) {    WebInspector.ToolbarButtonBase.call(this, title, className, states);    this._textElement = this.element.createChild("div", "toolbar-button-text");    this._textElement.textContent = text;}WebInspector.ToolbarTextButton.prototype = {    __proto__: WebInspector.ToolbarButtonBase.prototype}WebInspector.ToolbarItem.Provider = function() {}WebInspector.ToolbarItem.Provider.prototype = {    item: function() {}}WebInspector.ToolbarComboBox = function(changeHandler, className) {    WebInspector.ToolbarItem.call(this, createElementWithClass("span", "toolbar-select-container"));    this._selectElement = this.element.createChild("select", "toolbar-item");    this.element.createChild("div", "toolbar-select-arrow");    if (changeHandler)        this._selectElement.addEventListener("change", changeHandler, false);    if (className)        this._selectElement.classList.add(className);}WebInspector.ToolbarComboBox.prototype = {    selectElement: function()     {        return ( this._selectElement) ;    },    size: function()     {        return this._selectElement.childElementCount;    },    options: function()     {        return Array.prototype.slice.call(this._selectElement.children, 0);    },    addOption: function(option)     {        this._selectElement.appendChild(option);    },    createOption: function(label, title, value)     {        var option = this._selectElement.createChild("option");        option.text = label;        if (title)            option.title = title;        if (typeof value !== "undefined")            option.value = value;        return option;    },    _applyEnabledState: function()     {        this._selectElement.disabled = !this._enabled;    },    removeOption: function(option)     {        this._selectElement.removeChild(option);    },    removeOptions: function()     {        this._selectElement.removeChildren();    },    selectedOption: function()     {        if (this._selectElement.selectedIndex >= 0)            return this._selectElement[this._selectElement.selectedIndex];        return null ;    },    select: function(option)     {        this._selectElement.selectedIndex = Array.prototype.indexOf.call((this._selectElement), option);    },    setSelectedIndex: function(index)     {        this._selectElement.selectedIndex = index;    },    selectedIndex: function()     {        return this._selectElement.selectedIndex;    },    setMaxWidth: function(width)     {        this._selectElement.style.maxWidth = width + "px";    },    __proto__: WebInspector.ToolbarItem.prototype}WebInspector.ToolbarCheckbox = function(text, title, setting) {    WebInspector.ToolbarItem.call(this, createCheckboxLabel(text));    this.element.classList.add("checkbox");    this.inputElement = this.element.checkboxElement;    if (title)        this.element.title = title;    if (setting)        WebInspector.SettingsUI.bindCheckbox(this.inputElement, setting);}WebInspector.ToolbarCheckbox.prototype = {    checked: function()     {        return this.inputElement.checked;    },    __proto__: WebInspector.ToolbarItem.prototype}WebInspector.ToolbarStatesSettingButton = function(className, states, titles, initialState, currentStateSetting, lastStateSetting, stateChangedCallback) {    WebInspector.ToolbarButton.call(this, "", className, states.length);    var onClickBound = this._onClick.bind(this);    this.addEventListener("click", onClickBound, this);    this._states = states;    this._buttons = [];    for (var index = 0; index < states.length; index++) {        var button = new WebInspector.ToolbarButton(titles[index],className,states.length);        button.setState(this._states[index]);        button.addEventListener("click", onClickBound, this);        this._buttons.push(button);    }    this._currentStateSetting = currentStateSetting;    this._lastStateSetting = lastStateSetting;    this._stateChangedCallback = stateChangedCallback;    this.setLongClickOptionsEnabled(this._createOptions.bind(this));    this._currentState = null ;    this._toggleState(initialState);}WebInspector.ToolbarStatesSettingButton.prototype = {    _onClick: function(e)     {        this._toggleState(e.target.state());    },    _toggleState: function(state)     {        if (this._currentState === state)            return;        if (this._currentState)            this._lastStateSetting.set(this._currentState);        this._currentState = state;        this._currentStateSetting.set(this._currentState);        if (this._stateChangedCallback)            this._stateChangedCallback(state);        var defaultState = this._defaultState();        this.setState(defaultState);        this.setTitle(this._buttons[this._states.indexOf(defaultState)].title());    },    toggle: function()     {        this._toggleState(this.state());    },    _defaultState: function()     {        var lastState = this._lastStateSetting.get();        if (lastState && this._states.indexOf(lastState) >= 0 && lastState != this._currentState)            return lastState;        if (this._states.length > 1 && this._currentState === this._states[0])            return this._states[1];        return this._states[0];    },    _createOptions: function()     {        var options = [];        for (var index = 0; index < this._states.length; index++) {            if (this._states[index] !== this.state() && this._states[index] !== this._currentState)                options.push(this._buttons[index]);        }        return options;    },    __proto__: WebInspector.ToolbarButton.prototype}WebInspector.ExtensibleToolbar = function(location, parentElement) {    WebInspector.Toolbar.call(this, parentElement);    this._loadItems(location);}WebInspector.ExtensibleToolbar.prototype = {    _loadItems: function(location)     {        var extensions = self.runtime.extensions(WebInspector.ToolbarItem.Provider);        var promises = [];        for (var i = 0; i < extensions.length; ++i) {            if (extensions[i].descriptor()["location"] === location)                promises.push(resolveItem(extensions[i]));        }        Promise.all(promises).then(appendItemsInOrder.bind(this));        function resolveItem(extension)         {            var descriptor = extension.descriptor();            if (descriptor["separator"])                return Promise.resolve((new WebInspector.ToolbarSeparator()));            if (!descriptor["className"])                return Promise.resolve(new WebInspector.ToolbarButton(WebInspector.UIString(descriptor["title"]),descriptor["elementClass"])).then(attachHandler);            return extension.instancePromise().then(fetchItemFromProvider).then(attachHandler);            function fetchItemFromProvider(provider)             {                return (provider).item();            }            function attachHandler(item)             {                if (extension.descriptor()["actionId"] && item)                    item.addEventListener("click", handler);                return item;            }            function handler()             {                WebInspector.actionRegistry.execute(extension.descriptor()["actionId"]);            }        }        function appendItemsInOrder(items)         {            for (var i = 0; i < items.length; ++i) {                var item = items[i];                if (item)                    this.appendToolbarItem(item);            }        }    },    __proto__: WebInspector.Toolbar.prototype};WebInspector.SuggestBoxDelegate = function() {}WebInspector.SuggestBoxDelegate.prototype = {    applySuggestion: function(suggestion, isIntermediateSuggestion) {},    acceptSuggestion: function() {},}WebInspector.SuggestBox = function(suggestBoxDelegate, maxItemsHeight) {    this._suggestBoxDelegate = suggestBoxDelegate;    this._length = 0;    this._selectedIndex = -1;    this._selectedElement = null ;    this._maxItemsHeight = maxItemsHeight;    this._maybeHideBound = this._maybeHide.bind(this);    this._element = createElementWithClass("div", "suggest-box");    this._element.addEventListener("mousedown", this._onBoxMouseDown.bind(this), true);}WebInspector.SuggestBox.prototype = {    visible: function()     {        return !!this._element.parentElement;    },    setPosition: function(anchorBox)     {        this._updateBoxPosition(anchorBox);    },    _updateBoxPosition: function(anchorBox)     {        console.assert(this._overlay);        if (this._lastAnchorBox && this._lastAnchorBox.equals(anchorBox))            return;        this._lastAnchorBox = anchorBox;        var container = WebInspector.Dialog.modalHostView().element;        anchorBox = anchorBox.relativeToElement(container);        var totalHeight = container.offsetHeight;        var aboveHeight = anchorBox.y;        var underHeight = totalHeight - anchorBox.y - anchorBox.height;        this._overlay.setLeftOffset(anchorBox.x);        var under = underHeight >= aboveHeight;        if (under)            this._overlay.setVerticalOffset(anchorBox.y + anchorBox.height, true);        else            this._overlay.setVerticalOffset(totalHeight - anchorBox.y, false);        var rowHeight = 17;        var spacer = 6;        var maxHeight = this._maxItemsHeight ? this._maxItemsHeight * rowHeight : Math.max(underHeight, aboveHeight) - spacer;        this._element.style.maxHeight = maxHeight + "px";    },    _onBoxMouseDown: function(event)     {        if (this._hideTimeoutId) {            window.clearTimeout(this._hideTimeoutId);            delete this._hideTimeoutId;        }        event.preventDefault();    },    _maybeHide: function()     {        if (!this._hideTimeoutId)            this._hideTimeoutId = window.setTimeout(this.hide.bind(this), 0);    },    _show: function()     {        if (this.visible())            return;        this._bodyElement = document.body;        this._bodyElement.addEventListener("mousedown", this._maybeHideBound, true);        this._overlay = new WebInspector.SuggestBox.Overlay();        this._overlay.setContentElement(this._element);    },    hide: function()     {        if (!this.visible())            return;        this._bodyElement.removeEventListener("mousedown", this._maybeHideBound, true);        delete this._bodyElement;        this._element.remove();        this._overlay.dispose();        delete this._overlay;        delete this._selectedElement;        this._selectedIndex = -1;        delete this._lastAnchorBox;    },    removeFromElement: function()     {        this.hide();    },    _applySuggestion: function(isIntermediateSuggestion)     {        if (!this.visible() || !this._selectedElement)            return false;        var suggestion = this._selectedElement.textContent;        if (!suggestion)            return false;        this._suggestBoxDelegate.applySuggestion(suggestion, isIntermediateSuggestion);        return true;    },    acceptSuggestion: function()     {        var result = this._applySuggestion();        this.hide();        if (!result)            return false;        this._suggestBoxDelegate.acceptSuggestion();        return true;    },    _selectClosest: function(shift, isCircular)     {        if (!this._length)            return false;        if (this._selectedIndex === -1 && shift < 0)            shift += 1;        var index = this._selectedIndex + shift;        if (isCircular)            index = (this._length + index) % this._length;        else            index = Number.constrain(index, 0, this._length - 1);        this._selectItem(index, true);        this._applySuggestion(true);        return true;    },    _onItemMouseDown: function(event)     {        this._selectedElement = event.currentTarget;        this.acceptSuggestion();        event.consume(true);    },    _createItemElement: function(prefix, text)     {        var element = createElementWithClass("div", "suggest-box-content-item source-code");        element.tabIndex = -1;        if (prefix && prefix.length && !text.indexOf(prefix)) {            element.createChild("span", "prefix").textContent = prefix;            element.createChild("span", "suffix").textContent = text.substring(prefix.length);        } else {            element.createChild("span", "suffix").textContent = text;        }        element.createChild("span", "spacer");        element.addEventListener("mousedown", this._onItemMouseDown.bind(this), false);        return element;    },    _updateItems: function(items, userEnteredText)     {        this._length = items.length;        this._element.removeChildren();        delete this._selectedElement;        for (var i = 0; i < items.length; ++i) {            var item = items[i];            var currentItemElement = this._createItemElement(userEnteredText, item);            this._element.appendChild(currentItemElement);        }    },    _selectItem: function(index, scrollIntoView)     {        if (this._selectedElement)            this._selectedElement.classList.remove("selected");        this._selectedIndex = index;        if (index < 0)            return;        this._selectedElement = this._element.children[index];        this._selectedElement.classList.add("selected");        if (scrollIntoView)            this._selectedElement.scrollIntoViewIfNeeded(false);    },    _canShowBox: function(completions, canShowForSingleItem, userEnteredText)     {        if (!completions || !completions.length)            return false;        if (completions.length > 1)            return true;        return canShowForSingleItem && completions[0] !== userEnteredText;    },    _ensureRowCountPerViewport: function()     {        if (this._rowCountPerViewport)            return;        if (!this._element.firstChild)            return;        this._rowCountPerViewport = Math.floor(this._element.offsetHeight / this._element.firstChild.offsetHeight);    },    updateSuggestions: function(anchorBox, completions, selectedIndex, canShowForSingleItem, userEnteredText)     {        if (this._canShowBox(completions, canShowForSingleItem, userEnteredText)) {            this._updateItems(completions, userEnteredText);            this._show();            this._updateBoxPosition(anchorBox);            this._selectItem(selectedIndex, selectedIndex > 0);            delete this._rowCountPerViewport;        } else            this.hide();    },    keyPressed: function(event)     {        switch (event.keyIdentifier) {        case "Up":            return this.upKeyPressed();        case "Down":            return this.downKeyPressed();        case "PageUp":            return this.pageUpKeyPressed();        case "PageDown":            return this.pageDownKeyPressed();        case "Enter":            return this.enterKeyPressed();        }        return false;    },    upKeyPressed: function()     {        return this._selectClosest(-1, true);    },    downKeyPressed: function()     {        return this._selectClosest(1, true);    },    pageUpKeyPressed: function()     {        this._ensureRowCountPerViewport();        return this._selectClosest(-this._rowCountPerViewport, false);    },    pageDownKeyPressed: function()     {        this._ensureRowCountPerViewport();        return this._selectClosest(this._rowCountPerViewport, false);    },    enterKeyPressed: function()     {        var hasSelectedItem = !!this._selectedElement;        this.acceptSuggestion();        return hasSelectedItem;    }}WebInspector.SuggestBox.Overlay = function() {    this.element = createElementWithClass("div", "suggest-box-overlay");    var root = WebInspector.createShadowRootWithCoreStyles(this.element);    root.appendChild(WebInspector.Widget.createStyleElement("ui/suggestBox.css"));    this._leftSpacerElement = root.createChild("div", "suggest-box-left-spacer");    this._horizontalElement = root.createChild("div", "suggest-box-horizontal");    this._topSpacerElement = this._horizontalElement.createChild("div", "suggest-box-top-spacer");    this._bottomSpacerElement = this._horizontalElement.createChild("div", "suggest-box-bottom-spacer");    this._resize();    document.body.appendChild(this.element);}WebInspector.SuggestBox.Overlay.prototype = {    setLeftOffset: function(offset)     {        this._leftSpacerElement.style.flexBasis = offset + "px";    },    setVerticalOffset: function(offset, isTopOffset)     {        this.element.classList.toggle("under-anchor", isTopOffset);        if (isTopOffset) {            this._bottomSpacerElement.style.flexBasis = "auto";            this._topSpacerElement.style.flexBasis = offset + "px";        } else {            this._bottomSpacerElement.style.flexBasis = offset + "px";            this._topSpacerElement.style.flexBasis = "auto";        }    },    setContentElement: function(element)     {        this._horizontalElement.insertBefore(element, this._bottomSpacerElement);    },    _resize: function()     {        var container = WebInspector.Dialog.modalHostView().element;        var containerBox = container.boxInWindow(container.ownerDocument.defaultView);        this.element.style.left = containerBox.x + "px";        this.element.style.top = containerBox.y + "px";        this.element.style.height = containerBox.height + "px";        this.element.style.width = containerBox.width + "px";    },    dispose: function()     {        this.element.remove();    }};WebInspector.TabbedPane = function() {    WebInspector.VBox.call(this, true);    this.registerRequiredCSS("ui/tabbedPane.css");    this.element.classList.add("tabbed-pane");    this.contentElement.classList.add("tabbed-pane-shadow");    this.contentElement.tabIndex = -1;    this._headerElement = this.contentElement.createChild("div", "tabbed-pane-header toolbar-colors");    this._headerElement.createChild("content").select = ".tabbed-pane-header-before";    this._headerContentsElement = this._headerElement.createChild("div", "tabbed-pane-header-contents");    this._tabSlider = this._headerContentsElement.createChild("div", "tabbed-pane-tab-slider");    this._headerElement.createChild("content").select = ".tabbed-pane-header-after";    this._tabsElement = this._headerContentsElement.createChild("div", "tabbed-pane-header-tabs");    this._contentElement = this.contentElement.createChild("div", "tabbed-pane-content");    this._contentElement.createChild("content");    this._tabs = [];    this._tabsHistory = [];    this._tabsById = {};    this._currentTabLocked = false;    this._dropDownButton = this._createDropDownButton();    WebInspector.zoomManager.addEventListener(WebInspector.ZoomManager.Events.ZoomChanged, this._zoomChanged, this);}WebInspector.TabbedPane.EventTypes = {    TabSelected: "TabSelected",    TabClosed: "TabClosed"}WebInspector.TabbedPane.prototype = {    setCurrentTabLocked: function(locked)     {        this._currentTabLocked = locked;        this._headerElement.classList.toggle("locked", this._currentTabLocked);    },    get visibleView()     {        return this._currentTab ? this._currentTab.view : null ;    },    tabViews: function()     {        function tabToView(tab)         {            return tab.view;        }        return this._tabs.map(tabToView);    },    get selectedTabId()     {        return this._currentTab ? this._currentTab.id : null ;    },    setShrinkableTabs: function(shrinkableTabs)     {        this._shrinkableTabs = shrinkableTabs;    },    setVerticalTabLayout: function(verticalTabLayout)     {        this._verticalTabLayout = verticalTabLayout;        this.contentElement.classList.add("vertical-tab-layout");        this.invalidateConstraints();    },    setCloseableTabs: function(closeableTabs)     {        this._closeableTabs = closeableTabs;    },    setRetainTabOrder: function(retainTabOrder, tabOrderComparator)     {        this._retainTabOrder = retainTabOrder;        this._tabOrderComparator = tabOrderComparator;    },    defaultFocusedElement: function()     {        return this.visibleView ? this.visibleView.defaultFocusedElement() : this.contentElement;    },    focus: function()     {        if (this.visibleView)            this.visibleView.focus();        else            this.contentElement.focus();    },    headerElement: function()     {        return this._headerElement;    },    isTabCloseable: function(id)     {        var tab = this._tabsById[id];        return tab ? tab.isCloseable() : false;    },    setTabDelegate: function(delegate)     {        var tabs = this._tabs.slice();        for (var i = 0; i < tabs.length; ++i)            tabs[i].setDelegate(delegate);        this._delegate = delegate;    },    appendTab: function(id, tabTitle, view, tabTooltip, userGesture, isCloseable)     {        isCloseable = typeof isCloseable === "boolean" ? isCloseable : this._closeableTabs;        var tab = new WebInspector.TabbedPaneTab(this,id,tabTitle,isCloseable,view,tabTooltip);        tab.setDelegate(this._delegate);        this._tabsById[id] = tab;        function comparator(tab1, tab2)         {            return this._tabOrderComparator(tab1.id, tab2.id);        }        if (this._tabOrderComparator)            this._tabs.splice(insertionIndexForObjectInListSortedByFunction(tab, this._tabs, comparator.bind(this)), 0, tab);        else            this._tabs.push(tab);        this._tabsHistory.push(tab);        if (this._tabsHistory[0] === tab && this.isShowing())            this.selectTab(tab.id, userGesture);        this._updateTabElements();    },    closeTab: function(id, userGesture)     {        this.closeTabs([id], userGesture);    },    closeTabs: function(ids, userGesture)     {        var focused = this.hasFocus();        for (var i = 0; i < ids.length; ++i)            this._innerCloseTab(ids[i], userGesture);        this._updateTabElements();        if (this._tabsHistory.length)            this.selectTab(this._tabsHistory[0].id, false);        if (focused)            this.focus();    },    _innerCloseTab: function(id, userGesture)     {        if (!this._tabsById[id])            return;        if (userGesture && !this._tabsById[id]._closeable)            return;        if (this._currentTab && this._currentTab.id === id)            this._hideCurrentTab();        var tab = this._tabsById[id];        delete this._tabsById[id];        this._tabsHistory.splice(this._tabsHistory.indexOf(tab), 1);        this._tabs.splice(this._tabs.indexOf(tab), 1);        if (tab._shown)            this._hideTabElement(tab);        var eventData = {            tabId: id,            view: tab.view,            isUserGesture: userGesture        };        this.dispatchEventToListeners(WebInspector.TabbedPane.EventTypes.TabClosed, eventData);        return true;    },    hasTab: function(tabId)     {        return !!this._tabsById[tabId];    },    allTabs: function()     {        return this._tabs.map(function(tab) {            return tab.id;        }        );    },    otherTabs: function(id)     {        var result = [];        for (var i = 0; i < this._tabs.length; ++i) {            if (this._tabs[i].id !== id)                result.push(this._tabs[i].id);        }        return result;    },    _tabsToTheRight: function(id)     {        var index = -1;        for (var i = 0; i < this._tabs.length; ++i) {            if (this._tabs[i].id === id) {                index = i;                break;            }        }        if (index === -1)            return [];        return this._tabs.slice(index + 1).map(function(tab) {            return tab.id;        }        );    },    selectTab: function(id, userGesture)     {        if (this._currentTabLocked)            return false;        var focused = this.hasFocus();        var tab = this._tabsById[id];        if (!tab)            return false;        if (this._currentTab && this._currentTab.id === id)            return true;        this._hideCurrentTab();        this._showTab(tab);        this._currentTab = tab;        this._tabsHistory.splice(this._tabsHistory.indexOf(tab), 1);        this._tabsHistory.splice(0, 0, tab);        this._updateTabElements();        if (focused)            this.focus();        var eventData = {            tabId: id,            view: tab.view,            isUserGesture: userGesture        };        this.dispatchEventToListeners(WebInspector.TabbedPane.EventTypes.TabSelected, eventData);        return true;    },    lastOpenedTabIds: function(tabsCount)     {        function tabToTabId(tab) {            return tab.id;        }        return this._tabsHistory.slice(0, tabsCount).map(tabToTabId);    },    setTabIcon: function(id, iconType, iconTooltip)     {        var tab = this._tabsById[id];        if (tab._setIconType(iconType, iconTooltip))            this._updateTabElements();    },    toggleTabClass: function(id, className, force)     {        var tab = this._tabsById[id];        if (tab._toggleClass(className, force))            this._updateTabElements();    },    _zoomChanged: function(event)     {        for (var i = 0; i < this._tabs.length; ++i)            delete this._tabs[i]._measuredWidth;        if (this.isShowing())            this._updateTabElements();    },    changeTabTitle: function(id, tabTitle)     {        var tab = this._tabsById[id];        if (tab.title === tabTitle)            return;        tab.title = tabTitle;        this._updateTabElements();    },    changeTabView: function(id, view)     {        var tab = this._tabsById[id];        if (this._currentTab && this._currentTab.id === tab.id) {            if (tab.view !== view)                this._hideTab(tab);            tab.view = view;            this._showTab(tab);        } else            tab.view = view;    },    onResize: function()     {        this._updateTabElements();    },    headerResized: function()     {        this._updateTabElements();    },    wasShown: function()     {        var effectiveTab = this._currentTab || this._tabsHistory[0];        if (effectiveTab)            this.selectTab(effectiveTab.id);    },    setTabSlider: function(enable)     {        this._sliderEnabled = enable;        this._tabSlider.classList.toggle("enabled", enable);    },    calculateConstraints: function()     {        var constraints = WebInspector.VBox.prototype.calculateConstraints.call(this);        var minContentConstraints = new Constraints(new Size(0,0),new Size(50,50));        constraints = constraints.widthToMax(minContentConstraints).heightToMax(minContentConstraints);        if (this._verticalTabLayout)            constraints = constraints.addWidth(new Constraints(new Size(120,0)));        else            constraints = constraints.addHeight(new Constraints(new Size(0,30)));        return constraints;    },    _updateTabElements: function()     {        WebInspector.invokeOnceAfterBatchUpdate(this, this._innerUpdateTabElements);    },    setPlaceholderText: function(text)     {        this._noTabsMessage = text;    },    _innerUpdateTabElements: function()     {        if (!this.isShowing())            return;        if (!this._tabs.length) {            this._contentElement.classList.add("has-no-tabs");            if (this._noTabsMessage && !this._noTabsMessageElement) {                this._noTabsMessageElement = this._contentElement.createChild("div", "tabbed-pane-placeholder fill");                this._noTabsMessageElement.textContent = this._noTabsMessage;            }        } else {            this._contentElement.classList.remove("has-no-tabs");            if (this._noTabsMessageElement) {                this._noTabsMessageElement.remove();                delete this._noTabsMessageElement;            }        }        if (!this._measuredDropDownButtonWidth)            this._measureDropDownButton();        this._updateWidths();        this._updateTabsDropDown();        this._updateTabSlider();    },    _showTabElement: function(index, tab)     {        if (index >= this._tabsElement.children.length)            this._tabsElement.appendChild(tab.tabElement);        else            this._tabsElement.insertBefore(tab.tabElement, this._tabsElement.children[index]);        tab._shown = true;    },    _hideTabElement: function(tab)     {        this._tabsElement.removeChild(tab.tabElement);        tab._shown = false;    },    _createDropDownButton: function()     {        var dropDownContainer = createElementWithClass("div", "tabbed-pane-header-tabs-drop-down-container");        dropDownContainer.createTextChild("\u00bb");        this._dropDownMenu = new WebInspector.DropDownMenu(dropDownContainer);        this._dropDownMenu.addEventListener(WebInspector.DropDownMenu.Events.ItemSelected, this._dropDownMenuItemSelected, this);        return dropDownContainer;    },    _dropDownMenuItemSelected: function(event)     {        var tabId = (event.data);        this.selectTab(tabId, true);    },    _totalWidth: function()     {        return this._headerContentsElement.getBoundingClientRect().width;    },    _updateTabsDropDown: function()     {        var tabsToShowIndexes = this._tabsToShowIndexes(this._tabs, this._tabsHistory, this._totalWidth(), this._measuredDropDownButtonWidth);        for (var i = 0; i < this._tabs.length; ++i) {            if (this._tabs[i]._shown && tabsToShowIndexes.indexOf(i) === -1)                this._hideTabElement(this._tabs[i]);        }        for (var i = 0; i < tabsToShowIndexes.length; ++i) {            var tab = this._tabs[tabsToShowIndexes[i]];            if (!tab._shown)                this._showTabElement(i, tab);        }        this._populateDropDownFromIndex();    },    _populateDropDownFromIndex: function()     {        if (this._dropDownButton.parentElement)            this._headerContentsElement.removeChild(this._dropDownButton);        this._dropDownMenu.clear();        var tabsToShow = [];        for (var i = 0; i < this._tabs.length; ++i) {            if (!this._tabs[i]._shown)                tabsToShow.push(this._tabs[i]);            continue;        }        function compareFunction(tab1, tab2)         {            return tab1.title.localeCompare(tab2.title);        }        if (!this._retainTabOrder)            tabsToShow.sort(compareFunction);        var selectedId = null ;        for (var i = 0; i < tabsToShow.length; ++i) {            var tab = tabsToShow[i];            this._dropDownMenu.addItem(tab.id, tab.title);            if (this._tabsHistory[0] === tab)                selectedId = tab.id;        }        if (tabsToShow.length) {            this._headerContentsElement.appendChild(this._dropDownButton);            this._dropDownMenu.selectItem(selectedId);        }    },    _measureDropDownButton: function()     {        this._dropDownButton.classList.add("measuring");        this._headerContentsElement.appendChild(this._dropDownButton);        this._measuredDropDownButtonWidth = this._dropDownButton.getBoundingClientRect().width;        this._headerContentsElement.removeChild(this._dropDownButton);        this._dropDownButton.classList.remove("measuring");    },    _updateWidths: function()     {        var measuredWidths = this._measureWidths();        var maxWidth = this._shrinkableTabs ? this._calculateMaxWidth(measuredWidths.slice(), this._totalWidth()) : Number.MAX_VALUE;        var i = 0;        for (var tabId in this._tabs) {            var tab = this._tabs[tabId];            tab.setWidth(this._verticalTabLayout ? -1 : Math.min(maxWidth, measuredWidths[i++]));        }    },    _measureWidths: function()     {        this._tabsElement.style.setProperty("width", "2000px");        var measuringTabElements = [];        for (var tabId in this._tabs) {            var tab = this._tabs[tabId];            if (typeof tab._measuredWidth === "number")                continue;var measuringTabElement = tab._createTabElement(true);            measuringTabElement.__tab = tab;            measuringTabElements.push(measuringTabElement);            this._tabsElement.appendChild(measuringTabElement);        }        for (var i = 0; i < measuringTabElements.length; ++i) {            var width = measuringTabElements[i].getBoundingClientRect().width;            measuringTabElements[i].__tab._measuredWidth = Math.ceil(width);        }        for (var i = 0; i < measuringTabElements.length; ++i)            measuringTabElements[i].remove();        var measuredWidths = [];        for (var tabId in this._tabs)            measuredWidths.push(this._tabs[tabId]._measuredWidth);        this._tabsElement.style.removeProperty("width");        return measuredWidths;    },    _calculateMaxWidth: function(measuredWidths, totalWidth)     {        if (!measuredWidths.length)            return 0;        measuredWidths.sort(function(x, y) {            return x - y;        }        );        var totalMeasuredWidth = 0;        for (var i = 0; i < measuredWidths.length; ++i)            totalMeasuredWidth += measuredWidths[i];        if (totalWidth >= totalMeasuredWidth)            return measuredWidths[measuredWidths.length - 1];        var totalExtraWidth = 0;        for (var i = measuredWidths.length - 1; i > 0; --i) {            var extraWidth = measuredWidths[i] - measuredWidths[i - 1];            totalExtraWidth += (measuredWidths.length - i) * extraWidth;            if (totalWidth + totalExtraWidth >= totalMeasuredWidth)                return measuredWidths[i - 1] + (totalWidth + totalExtraWidth - totalMeasuredWidth) / (measuredWidths.length - i);        }        return totalWidth / measuredWidths.length;    },    _tabsToShowIndexes: function(tabsOrdered, tabsHistory, totalWidth, measuredDropDownButtonWidth)     {        var tabsToShowIndexes = [];        var totalTabsWidth = 0;        var tabCount = tabsOrdered.length;        var tabsToLookAt = tabsOrdered.slice(0);        if (this._currentTab !== undefined)            tabsToLookAt.unshift(tabsToLookAt.splice(tabsToLookAt.indexOf(this._currentTab), 1)[0]);        for (var i = 0; i < tabCount; ++i) {            var tab = this._retainTabOrder ? tabsToLookAt[i] : tabsHistory[i];            totalTabsWidth += tab.width();            var minimalRequiredWidth = totalTabsWidth;            if (i !== tabCount - 1)                minimalRequiredWidth += measuredDropDownButtonWidth;            if (!this._verticalTabLayout && minimalRequiredWidth > totalWidth)                break;            tabsToShowIndexes.push(tabsOrdered.indexOf(tab));        }        tabsToShowIndexes.sort(function(x, y) {            return x - y;        }        );        return tabsToShowIndexes;    },    _hideCurrentTab: function()     {        if (!this._currentTab)            return;        this._hideTab(this._currentTab);        delete this._currentTab;    },    _showTab: function(tab)     {        tab.tabElement.classList.add("selected");        tab.view.show(this.element);        this._updateTabSlider();    },    _updateTabSlider: function()     {        if (!this._currentTab)            return;        if (!this._sliderEnabled)            return;        var left = 0;        for (var i = 0; i < this._tabs.length && this._currentTab !== this._tabs[i] && this._tabs[i]._shown; i++)            left += this._tabs[i]._measuredWidth;        var sliderWidth = this._currentTab._shown ? this._currentTab._measuredWidth : this._dropDownButton.offsetWidth;        this._tabSlider.style.transform = "translateX(" + left + "px)";        this._tabSlider.style.width = sliderWidth + "px";    },    _hideTab: function(tab)     {        tab.tabElement.classList.remove("selected");        tab.view.detach();    },    elementsToRestoreScrollPositionsFor: function()     {        return [this._contentElement];    },    _insertBefore: function(tab, index)     {        this._tabsElement.insertBefore(tab._tabElement || null , this._tabsElement.childNodes[index]);        var oldIndex = this._tabs.indexOf(tab);        this._tabs.splice(oldIndex, 1);        if (oldIndex < index)            --index;        this._tabs.splice(index, 0, tab);    },    insertBeforeTabStrip: function(element)     {        element.classList.add("tabbed-pane-header-before");        this.element.appendChild(element);    },    appendAfterTabStrip: function(element)     {        element.classList.add("tabbed-pane-header-after");        this.element.appendChild(element);    },    renderWithNoHeaderBackground: function()     {        this._headerElement.classList.add("tabbed-pane-no-header-background");    },    __proto__: WebInspector.VBox.prototype}WebInspector.TabbedPaneTab = function(tabbedPane, id, title, closeable, view, tooltip) {    this._closeable = closeable;    this._tabbedPane = tabbedPane;    this._id = id;    this._title = title;    this._tooltip = tooltip;    this._view = view;    this._shown = false;    this._measuredWidth;    this._tabElement;}WebInspector.TabbedPaneTab.prototype = {    get id()     {        return this._id;    },    get title()     {        return this._title;    },    set title(title)     {        if (title === this._title)            return;        this._title = title;        if (this._titleElement)            this._titleElement.textContent = title;        delete this._measuredWidth;    },    isCloseable: function()     {        return this._closeable;    },    _setIconType: function(iconType, iconTooltip)     {        if (iconType === this._iconType && iconTooltip === this._iconTooltip)            return false;        this._iconType = iconType;        this._iconTooltip = iconTooltip;        if (this._tabElement)            this._createIconElement(this._tabElement, this._titleElement);        delete this._measuredWidth;        return true;    },    _toggleClass: function(className, force)     {        var element = this.tabElement;        var hasClass = element.classList.contains(className);        if (hasClass === force)            return false;        element.classList.toggle(className, force);        delete this._measuredWidth;        return true;    },    get view()     {        return this._view;    },    set view(view)     {        this._view = view;    },    get tooltip()     {        return this._tooltip;    },    set tooltip(tooltip)     {        this._tooltip = tooltip;        if (this._titleElement)            this._titleElement.title = tooltip || "";    },    get tabElement()     {        if (!this._tabElement)            this._tabElement = this._createTabElement(false);        return this._tabElement;    },    width: function()     {        return this._width;    },    setWidth: function(width)     {        this.tabElement.style.width = width === -1 ? "" : (width + "px");        this._width = width;    },    setDelegate: function(delegate)     {        this._delegate = delegate;    },    _createIconElement: function(tabElement, titleElement)     {        if (tabElement.__iconElement)            tabElement.__iconElement.remove();        if (!this._iconType)            return;        var iconElement = createElementWithClass("label", "tabbed-pane-header-tab-icon", "dt-icon-label");        iconElement.type = this._iconType;        if (this._iconTooltip)            iconElement.title = this._iconTooltip;        tabElement.insertBefore(iconElement, titleElement);        tabElement.__iconElement = iconElement;    },    _createTabElement: function(measuring)     {        var tabElement = createElementWithClass("div", "tabbed-pane-header-tab");        tabElement.id = "tab-" + this._id;        tabElement.tabIndex = -1;        tabElement.selectTabForTest = this._tabbedPane.selectTab.bind(this._tabbedPane, this.id, true);        var titleElement = tabElement.createChild("span", "tabbed-pane-header-tab-title");        titleElement.textContent = this.title;        titleElement.title = this.tooltip || "";        this._createIconElement(tabElement, titleElement);        if (!measuring)            this._titleElement = titleElement;        if (this._closeable)            tabElement.createChild("div", "tabbed-pane-close-button", "dt-close-button").gray = true;        if (measuring) {            tabElement.classList.add("measuring");        } else {            tabElement.addEventListener("click", this._tabClicked.bind(this), false);            tabElement.addEventListener("mousedown", this._tabMouseDown.bind(this), false);            tabElement.addEventListener("mouseup", this._tabMouseUp.bind(this), false);            tabElement.addEventListener("contextmenu", this._tabContextMenu.bind(this), false);            if (this._closeable)                WebInspector.installDragHandle(tabElement, this._startTabDragging.bind(this), this._tabDragging.bind(this), this._endTabDragging.bind(this), "pointer");        }        return tabElement;    },    _tabClicked: function(event)     {        var middleButton = event.button === 1;        var shouldClose = this._closeable && (middleButton || event.target.classList.contains("tabbed-pane-close-button"));        if (!shouldClose) {            this._tabbedPane.focus();            return;        }        this._closeTabs([this.id]);        event.consume(true);    },    _tabMouseDown: function(event)     {        if (event.target.classList.contains("tabbed-pane-close-button") || event.button === 1)            return;        this._tabbedPane.selectTab(this.id, true);    },    _tabMouseUp: function(event)     {        if (event.button === 1)            event.consume(true);    },    _closeTabs: function(ids)     {        if (this._delegate) {            this._delegate.closeTabs(this._tabbedPane, ids);            return;        }        this._tabbedPane.closeTabs(ids, true);    },    _tabContextMenu: function(event)     {        function close()         {            this._closeTabs([this.id]);        }        function closeOthers()         {            this._closeTabs(this._tabbedPane.otherTabs(this.id));        }        function closeAll()         {            this._closeTabs(this._tabbedPane.allTabs());        }        function closeToTheRight()         {            this._closeTabs(this._tabbedPane._tabsToTheRight(this.id));        }        var contextMenu = new WebInspector.ContextMenu(event);        if (this._closeable) {            contextMenu.appendItem(WebInspector.UIString.capitalize("Close"), close.bind(this));            contextMenu.appendItem(WebInspector.UIString.capitalize("Close ^others"), closeOthers.bind(this));            contextMenu.appendItem(WebInspector.UIString.capitalize("Close ^tabs to the ^right"), closeToTheRight.bind(this));            contextMenu.appendItem(WebInspector.UIString.capitalize("Close ^all"), closeAll.bind(this));        }        if (this._delegate)            this._delegate.onContextMenu(this.id, contextMenu);        contextMenu.show();    },    _startTabDragging: function(event)     {        if (event.target.classList.contains("tabbed-pane-close-button"))            return false;        this._dragStartX = event.pageX;        return true;    },    _tabDragging: function(event)     {        var tabElements = this._tabbedPane._tabsElement.childNodes;        for (var i = 0; i < tabElements.length; ++i) {            var tabElement = tabElements[i];            if (tabElement === this._tabElement)                continue;var intersects = tabElement.offsetLeft + tabElement.clientWidth > this._tabElement.offsetLeft && this._tabElement.offsetLeft + this._tabElement.clientWidth > tabElement.offsetLeft;            if (!intersects)                continue;if (Math.abs(event.pageX - this._dragStartX) < tabElement.clientWidth / 2 + 5)                break;            if (event.pageX - this._dragStartX > 0) {                tabElement = tabElement.nextSibling;                ++i;            }            var oldOffsetLeft = this._tabElement.offsetLeft;            this._tabbedPane._insertBefore(this, i);            this._dragStartX += this._tabElement.offsetLeft - oldOffsetLeft;            break;        }        if (!this._tabElement.previousSibling && event.pageX - this._dragStartX < 0) {            this._tabElement.style.setProperty("left", "0px");            return;        }        if (!this._tabElement.nextSibling && event.pageX - this._dragStartX > 0) {            this._tabElement.style.setProperty("left", "0px");            return;        }        this._tabElement.style.setProperty("position", "relative");        this._tabElement.style.setProperty("left", (event.pageX - this._dragStartX) + "px");    },    _endTabDragging: function(event)     {        this._tabElement.style.removeProperty("position");        this._tabElement.style.removeProperty("left");        delete this._dragStartX;    }}WebInspector.TabbedPaneTabDelegate = function() {}WebInspector.TabbedPaneTabDelegate.prototype = {    closeTabs: function(tabbedPane, ids) {},    onContextMenu: function(tabId, contextMenu) {}}WebInspector.ExtensibleTabbedPaneController = function(tabbedPane, extensionPoint, viewCallback) {    this._tabbedPane = tabbedPane;    this._extensionPoint = extensionPoint;    this._viewCallback = viewCallback;    this._tabOrders = {};    this._promiseForId = {};    this._tabbedPane.setRetainTabOrder(true, this._tabOrderComparator.bind(this));    this._tabbedPane.addEventListener(WebInspector.TabbedPane.EventTypes.TabSelected, this._tabSelected, this);    this._views = new Map();    this._initialize();}WebInspector.ExtensibleTabbedPaneController.prototype = {    _initialize: function()     {        this._extensions = new Map();        var extensions = self.runtime.extensions(this._extensionPoint);        for (var i = 0; i < extensions.length; ++i) {            var descriptor = extensions[i].descriptor();            var id = descriptor["name"];            this._tabOrders[id] = i;            var title = WebInspector.UIString(descriptor["title"]);            this._extensions.set(id, extensions[i]);            this._tabbedPane.appendTab(id, title, new WebInspector.Widget());        }    },    appendView: function(id, title, order, view)     {        this._tabOrders[id] = order;        this._views.set(id, view);        this._tabbedPane.appendTab(id, title, new WebInspector.Widget());    },    _tabSelected: function(event)     {        var tabId = (event.data.tabId);        this.viewForId(tabId).then(viewLoaded.bind(this));        function viewLoaded(view)         {            if (!view)                return;            this._tabbedPane.changeTabView(tabId, view);            var shouldFocus = this._tabbedPane.visibleView.element.isSelfOrAncestor(WebInspector.currentFocusElement());            if (shouldFocus)                view.focus();        }    },    viewIds: function()     {        return this._extensions.keysArray();    },    viewForId: function(id)     {        if (this._views.has(id))            return Promise.resolve((this._views.get(id)));        if (!this._extensions.has(id))            return Promise.resolve((null ));        if (this._promiseForId[id])            return this._promiseForId[id];        var promise = this._extensions.get(id).instancePromise();        this._promiseForId[id] = (promise);        return promise.then(cacheView.bind(this));        function cacheView(object)         {            var view = (object);            delete this._promiseForId[id];            this._views.set(id, view);            if (this._viewCallback && view)                this._viewCallback(id, view);            return view;        }    },    _tabOrderComparator: function(id1, id2)     {        return this._tabOrders[id2] = this._tabOrders[id1];    }};WebInspector.SidebarPane = function(title) {    WebInspector.Widget.call(this);    this.setMinimumSize(25, 0);    this.element.className = "sidebar-pane";    this._title = title;    this._expandCallback = null ;    this._paneVisible = true;}WebInspector.SidebarPane.prototype = {    toolbar: function()     {        if (!this._toolbar) {            this._toolbar = new WebInspector.Toolbar();            this._toolbar.element.addEventListener("click", consumeEvent);            this.element.insertBefore(this._toolbar.element, this.element.firstChild);        }        return this._toolbar;    },    title: function()     {        return this._title;    },    expand: function()     {        this.onContentReady();    },    onContentReady: function()     {        if (this._expandCallback)            this._expandCallback();        else            this._expandPending = true;    },    _attached: function(setVisibleCallback, expandCallback)     {        this._setVisibleCallback = setVisibleCallback;        this._setVisibleCallback(this._paneVisible);        this._expandCallback = expandCallback;        if (this._expandPending) {            delete this._expandPending;            this._expandCallback();        }    },    setVisible: function(visible)     {        this._paneVisible = visible;        if (this._setVisibleCallback)            this._setVisibleCallback(visible)    },    __proto__: WebInspector.Widget.prototype}WebInspector.SidebarPaneTitle = function(container, pane) {    this._pane = pane;    this.element = container.createChild("div", "sidebar-pane-title");    this.element.textContent = pane.title();    this.element.tabIndex = 0;    this.element.addEventListener("click", this._toggleExpanded.bind(this), false);    this.element.addEventListener("keydown", this._onTitleKeyDown.bind(this), false);}WebInspector.SidebarPaneTitle.prototype = {    _expand: function()     {        this.element.classList.add("expanded");        this._pane.show(this.element.parentElement, (this.element.nextSibling));    },    _collapse: function()     {        this.element.classList.remove("expanded");        if (this._pane.element.parentNode == this.element.parentNode)            this._pane.detach();    },    _toggleExpanded: function()     {        if (this.element.classList.contains("expanded"))            this._collapse();        else            this._pane.expand();    },    _onTitleKeyDown: function(event)     {        if (isEnterKey(event) || event.keyCode === WebInspector.KeyboardShortcut.Keys.Space.code)            this._toggleExpanded();    }}WebInspector.SidebarPaneStack = function() {    WebInspector.Widget.call(this);    this.setMinimumSize(25, 0);    this.element.className = "sidebar-pane-stack";    this._titleByPane = new Map();}WebInspector.SidebarPaneStack.prototype = {    addPane: function(pane)     {        var paneTitle = new WebInspector.SidebarPaneTitle(this.element,pane);        this._titleByPane.set(pane, paneTitle);        if (pane._toolbar)            paneTitle.element.appendChild(pane._toolbar.element);        pane._attached(this._setPaneVisible.bind(this, pane), paneTitle._expand.bind(paneTitle));    },    _setPaneVisible: function(pane, visible)     {        var title = this._titleByPane.get(pane);        if (!title)            return;        title.element.classList.toggle("hidden", !visible);        pane.element.classList.toggle("sidebar-pane-hidden", !visible);    },    __proto__: WebInspector.Widget.prototype}WebInspector.SidebarTabbedPane = function() {    WebInspector.TabbedPane.call(this);    this.setRetainTabOrder(true);    this.element.classList.add("sidebar-tabbed-pane");}WebInspector.SidebarTabbedPane.prototype = {    addPane: function(pane)     {        var title = pane.title();        this.appendTab(title, title, pane);        if (pane._toolbar)            pane.element.insertBefore(pane._toolbar.element, pane.element.firstChild);        pane._attached(this._setPaneVisible.bind(this, pane), this.selectTab.bind(this, title));    },    _setPaneVisible: function(pane, visible)     {        var title = pane._title;        if (visible) {            if (!this.hasTab(title))                this.appendTab(title, title, pane);        } else {            if (this.hasTab(title))                this.closeTab(title);        }    },    __proto__: WebInspector.TabbedPane.prototype};WebInspector.TextPrompt = function(completions, stopCharacters) {    this._proxyElement;    this._proxyElementDisplay = "inline-block";    this._loadCompletions = completions;    this._completionStopCharacters = stopCharacters || " =:[({;,!+-*/&|^<>.";    this._autocompletionTimeout = WebInspector.TextPrompt.DefaultAutocompletionTimeout;}WebInspector.TextPrompt.DefaultAutocompletionTimeout = 250;WebInspector.TextPrompt.Events = {    ItemApplied: "text-prompt-item-applied",    ItemAccepted: "text-prompt-item-accepted"};WebInspector.TextPrompt.prototype = {    setAutocompletionTimeout: function(timeout)     {        this._autocompletionTimeout = timeout;    },    setSuggestBoxEnabled: function(suggestBoxEnabled)     {        this._suggestBoxEnabled = suggestBoxEnabled;    },    renderAsBlock: function()     {        this._proxyElementDisplay = "block";    },    attach: function(element)     {        return this._attachInternal(element);    },    attachAndStartEditing: function(element, blurListener)     {        var proxyElement = this._attachInternal(element);        this._startEditing(blurListener);        return proxyElement;    },    _attachInternal: function(element)     {        if (this._proxyElement)            throw "Cannot attach an attached TextPrompt";        this._element = element;        this._boundOnKeyDown = this.onKeyDown.bind(this);        this._boundOnInput = this.onInput.bind(this);        this._boundOnMouseWheel = this.onMouseWheel.bind(this);        this._boundSelectStart = this._selectStart.bind(this);        this._boundRemoveSuggestionAids = this._removeSuggestionAids.bind(this);        this._proxyElement = element.ownerDocument.createElement("span");        var shadowRoot = WebInspector.createShadowRootWithCoreStyles(this._proxyElement);        shadowRoot.appendChild(WebInspector.Widget.createStyleElement("ui/textPrompt.css"));        this._contentElement = shadowRoot.createChild("div");        this._contentElement.createChild("content");        this._proxyElement.style.display = this._proxyElementDisplay;        element.parentElement.insertBefore(this._proxyElement, element);        this._proxyElement.appendChild(element);        this._element.classList.add("text-prompt");        this._element.addEventListener("keydown", this._boundOnKeyDown, false);        this._element.addEventListener("input", this._boundOnInput, false);        this._element.addEventListener("mousewheel", this._boundOnMouseWheel, false);        this._element.addEventListener("selectstart", this._boundSelectStart, false);        this._element.addEventListener("blur", this._boundRemoveSuggestionAids, false);        this._element.ownerDocument.defaultView.addEventListener("resize", this._boundRemoveSuggestionAids, false);        if (this._suggestBoxEnabled)            this._suggestBox = new WebInspector.SuggestBox(this);        return this._proxyElement;    },    detach: function()     {        this._removeFromElement();        this._proxyElement.parentElement.insertBefore(this._element, this._proxyElement);        this._proxyElement.remove();        delete this._proxyElement;        this._element.classList.remove("text-prompt");        WebInspector.restoreFocusFromElement(this._element);    },    text: function()     {        return this._element.textContent;    },    setText: function(x)     {        this._removeSuggestionAids();        if (!x) {            this._element.removeChildren();            this._element.createChild("br");        } else {            this._element.textContent = x;        }        this.moveCaretToEndOfPrompt();        this._element.scrollIntoView();    },    _removeFromElement: function()     {        this.clearAutoComplete(true);        this._element.removeEventListener("keydown", this._boundOnKeyDown, false);        this._element.removeEventListener("input", this._boundOnInput, false);        this._element.removeEventListener("selectstart", this._boundSelectStart, false);        this._element.removeEventListener("blur", this._boundRemoveSuggestionAids, false);        this._element.ownerDocument.defaultView.removeEventListener("resize", this._boundRemoveSuggestionAids, false);        if (this._isEditing)            this._stopEditing();        if (this._suggestBox)            this._suggestBox.removeFromElement();    },    _startEditing: function(blurListener)     {        this._isEditing = true;        this._contentElement.classList.add("text-prompt-editing");        if (blurListener) {            this._blurListener = blurListener;            this._element.addEventListener("blur", this._blurListener, false);        }        this._oldTabIndex = this._element.tabIndex;        if (this._element.tabIndex < 0)            this._element.tabIndex = 0;        WebInspector.setCurrentFocusElement(this._element);        if (!this.text())            this._updateAutoComplete();    },    _stopEditing: function()     {        this._element.tabIndex = this._oldTabIndex;        if (this._blurListener)            this._element.removeEventListener("blur", this._blurListener, false);        this._contentElement.classList.remove("text-prompt-editing");        delete this._isEditing;    },    _removeSuggestionAids: function()     {        this.clearAutoComplete();        this.hideSuggestBox();    },    _selectStart: function()     {        if (this._selectionTimeout)            clearTimeout(this._selectionTimeout);        this._removeSuggestionAids();        function moveBackIfOutside()         {            delete this._selectionTimeout;            if (!this.isCaretInsidePrompt() && this._element.isComponentSelectionCollapsed()) {                this.moveCaretToEndOfPrompt();                this.autoCompleteSoon();            }        }        this._selectionTimeout = setTimeout(moveBackIfOutside.bind(this), 100);    },    _updateAutoComplete: function(force)     {        this.clearAutoComplete();        this.autoCompleteSoon(force);    },    onMouseWheel: function(event)     {},    onKeyDown: function(event)     {        var handled = false;        delete this._needUpdateAutocomplete;        switch (event.keyIdentifier) {        case "U+0009":            handled = this.tabKeyPressed(event);            break;        case "Left":        case "Home":            this._removeSuggestionAids();            break;        case "Right":        case "End":            if (this.isCaretAtEndOfPrompt())                handled = this.acceptAutoComplete();            else                this._removeSuggestionAids();            break;        case "U+001B":            if (this.isSuggestBoxVisible()) {                this._removeSuggestionAids();                handled = true;            }            break;        case "U+0020":            if (event.ctrlKey && !event.metaKey && !event.altKey && !event.shiftKey) {                this._updateAutoComplete(true);                handled = true;            }            break;        case "Alt":        case "Meta":        case "Shift":        case "Control":            break;        }        if (!handled && this.isSuggestBoxVisible())            handled = this._suggestBox.keyPressed(event);        if (!handled)            this._needUpdateAutocomplete = true;        if (handled)            event.consume(true);    },    onInput: function(event)     {        if (this._needUpdateAutocomplete)            this._updateAutoComplete();    },    acceptAutoComplete: function()     {        var result = false;        if (this.isSuggestBoxVisible())            result = this._suggestBox.acceptSuggestion();        if (!result)            result = this._acceptSuggestionInternal();        return result;    },    clearAutoComplete: function(includeTimeout)     {        if (includeTimeout && this._completeTimeout) {            clearTimeout(this._completeTimeout);            delete this._completeTimeout;        }        delete this._waitingForCompletions;        if (!this.autoCompleteElement)            return;        this.autoCompleteElement.remove();        delete this.autoCompleteElement;        delete this._userEnteredRange;        delete this._userEnteredText;    },    autoCompleteSoon: function(force)     {        var immediately = this.isSuggestBoxVisible() || force;        if (!this._completeTimeout)            this._completeTimeout = setTimeout(this.complete.bind(this, force), immediately ? 0 : this._autocompletionTimeout);    },    complete: function(force, reverse)     {        this.clearAutoComplete(true);        var selection = this._element.getComponentSelection();        if (!selection.rangeCount)            return;        var selectionRange = selection.getRangeAt(0);        var shouldExit;        if (!force && !this.isCaretAtEndOfPrompt() && !this.isSuggestBoxVisible())            shouldExit = true;        else if (!selection.isCollapsed)            shouldExit = true;        else if (!force) {            var wordSuffixRange = selectionRange.startContainer.rangeOfWord(selectionRange.endOffset, this._completionStopCharacters, this._element, "forward");            if (wordSuffixRange.toString().length)                shouldExit = true;        }        if (shouldExit) {            this.hideSuggestBox();            return;        }        var wordPrefixRange = selectionRange.startContainer.rangeOfWord(selectionRange.startOffset, this._completionStopCharacters, this._element, "backward");        this._waitingForCompletions = true;        this._loadCompletions((this._proxyElement), wordPrefixRange, force || false, this._completionsReady.bind(this, selection, wordPrefixRange, !!reverse));    },    disableDefaultSuggestionForEmptyInput: function()     {        this._disableDefaultSuggestionForEmptyInput = true;    },    _boxForAnchorAtStart: function(selection, textRange)     {        var rangeCopy = selection.getRangeAt(0).cloneRange();        var anchorElement = createElement("span");        anchorElement.textContent = "\u200B";        textRange.insertNode(anchorElement);        var box = anchorElement.boxInWindow(window);        anchorElement.remove();        selection.removeAllRanges();        selection.addRange(rangeCopy);        return box;    },    _buildCommonPrefix: function(completions, wordPrefixLength)     {        var commonPrefix = completions[0];        for (var i = 0; i < completions.length; ++i) {            var completion = completions[i];            var lastIndex = Math.min(commonPrefix.length, completion.length);            for (var j = wordPrefixLength; j < lastIndex; ++j) {                if (commonPrefix[j] !== completion[j]) {                    commonPrefix = commonPrefix.substr(0, j);                    break;                }            }        }        return commonPrefix;    },    _createRange: function()     {        return document.createRange();    },    _completionsReady: function(selection, originalWordPrefixRange, reverse, completions, selectedIndex)     {        if (!this._waitingForCompletions || !completions.length) {            this.hideSuggestBox();            return;        }        delete this._waitingForCompletions;        var selectionRange = selection.getRangeAt(0);        var fullWordRange = this._createRange();        fullWordRange.setStart(originalWordPrefixRange.startContainer, originalWordPrefixRange.startOffset);        fullWordRange.setEnd(selectionRange.endContainer, selectionRange.endOffset);        if (originalWordPrefixRange.toString() + selectionRange.toString() !== fullWordRange.toString())            return;        selectedIndex = (this._disableDefaultSuggestionForEmptyInput && !this.text()) ? -1 : (selectedIndex || 0);        this._userEnteredRange = fullWordRange;        this._userEnteredText = fullWordRange.toString();        if (this._suggestBox)            this._suggestBox.updateSuggestions(this._boxForAnchorAtStart(selection, fullWordRange), completions, selectedIndex, !this.isCaretAtEndOfPrompt(), this._userEnteredText);        if (selectedIndex === -1)            return;        var wordPrefixLength = originalWordPrefixRange.toString().length;        this._commonPrefix = this._buildCommonPrefix(completions, wordPrefixLength);        if (this.isCaretAtEndOfPrompt()) {            var completionText = completions[selectedIndex];            var prefixText = this._userEnteredRange.toString();            var suffixText = completionText.substring(wordPrefixLength);            this._userEnteredRange.deleteContents();            this._element.normalize();            var finalSelectionRange = this._createRange();            var prefixTextNode = createTextNode(prefixText);            fullWordRange.insertNode(prefixTextNode);            this.autoCompleteElement = createElementWithClass("span", "auto-complete-text");            this.autoCompleteElement.textContent = suffixText;            prefixTextNode.parentNode.insertBefore(this.autoCompleteElement, prefixTextNode.nextSibling);            finalSelectionRange.setStart(prefixTextNode, wordPrefixLength);            finalSelectionRange.setEnd(prefixTextNode, wordPrefixLength);            selection.removeAllRanges();            selection.addRange(finalSelectionRange);            this.dispatchEventToListeners(WebInspector.TextPrompt.Events.ItemApplied);        }    },    _completeCommonPrefix: function()     {        if (!this.autoCompleteElement || !this._commonPrefix || !this._userEnteredText || !this._commonPrefix.startsWith(this._userEnteredText))            return;        if (!this.isSuggestBoxVisible()) {            this.acceptAutoComplete();            return;        }        this.autoCompleteElement.textContent = this._commonPrefix.substring(this._userEnteredText.length);        this._acceptSuggestionInternal(true);    },    applySuggestion: function(completionText, isIntermediateSuggestion)     {        this._applySuggestion(completionText, isIntermediateSuggestion);    },    _applySuggestion: function(completionText, isIntermediateSuggestion, originalPrefixRange)     {        var wordPrefixLength;        if (originalPrefixRange)            wordPrefixLength = originalPrefixRange.toString().length;        else            wordPrefixLength = this._userEnteredText ? this._userEnteredText.length : 0;        this._userEnteredRange.deleteContents();        this._element.normalize();        var finalSelectionRange = this._createRange();        var completionTextNode = createTextNode(completionText);        this._userEnteredRange.insertNode(completionTextNode);        if (this.autoCompleteElement) {            this.autoCompleteElement.remove();            delete this.autoCompleteElement;        }        if (isIntermediateSuggestion)            finalSelectionRange.setStart(completionTextNode, wordPrefixLength);        else            finalSelectionRange.setStart(completionTextNode, completionText.length);        finalSelectionRange.setEnd(completionTextNode, completionText.length);        var selection = this._element.getComponentSelection();        selection.removeAllRanges();        selection.addRange(finalSelectionRange);        if (isIntermediateSuggestion)            this.dispatchEventToListeners(WebInspector.TextPrompt.Events.ItemApplied, {                itemText: completionText            });    },    acceptSuggestion: function()     {        this._acceptSuggestionInternal();    },    _acceptSuggestionInternal: function(prefixAccepted)     {        if (!this.autoCompleteElement || !this.autoCompleteElement.parentNode)            return false;        var text = this.autoCompleteElement.textContent;        var textNode = createTextNode(text);        this.autoCompleteElement.parentNode.replaceChild(textNode, this.autoCompleteElement);        delete this.autoCompleteElement;        var finalSelectionRange = this._createRange();        finalSelectionRange.setStart(textNode, text.length);        finalSelectionRange.setEnd(textNode, text.length);        var selection = this._element.getComponentSelection();        selection.removeAllRanges();        selection.addRange(finalSelectionRange);        if (!prefixAccepted) {            this.hideSuggestBox();            this.dispatchEventToListeners(WebInspector.TextPrompt.Events.ItemAccepted);        } else            this.autoCompleteSoon(true);        return true;    },    hideSuggestBox: function()     {        if (this.isSuggestBoxVisible())            this._suggestBox.hide();    },    isSuggestBoxVisible: function()     {        return this._suggestBox && this._suggestBox.visible();    },    isCaretInsidePrompt: function()     {        return this._element.isInsertionCaretInside();    },    isCaretAtEndOfPrompt: function()     {        var selection = this._element.getComponentSelection();        if (!selection.rangeCount || !selection.isCollapsed)            return false;        var selectionRange = selection.getRangeAt(0);        var node = selectionRange.startContainer;        if (!node.isSelfOrDescendant(this._element))            return false;        if (node.nodeType === Node.TEXT_NODE && selectionRange.startOffset < node.nodeValue.length)            return false;        var foundNextText = false;        while (node) {            if (node.nodeType === Node.TEXT_NODE && node.nodeValue.length) {                if (foundNextText && (!this.autoCompleteElement || !this.autoCompleteElement.isAncestor(node)))                    return false;                foundNextText = true;            }            node = node.traverseNextNode(this._element);        }        return true;    },    isCaretOnFirstLine: function()     {        var selection = this._element.getComponentSelection();        var focusNode = selection.focusNode;        if (!focusNode || focusNode.nodeType !== Node.TEXT_NODE || focusNode.parentNode !== this._element)            return true;        if (focusNode.textContent.substring(0, selection.focusOffset).indexOf("\n") !== -1)            return false;        focusNode = focusNode.previousSibling;        while (focusNode) {            if (focusNode.nodeType !== Node.TEXT_NODE)                return true;            if (focusNode.textContent.indexOf("\n") !== -1)                return false;            focusNode = focusNode.previousSibling;        }        return true;    },    isCaretOnLastLine: function()     {        var selection = this._element.getComponentSelection();        var focusNode = selection.focusNode;        if (!focusNode || focusNode.nodeType !== Node.TEXT_NODE || focusNode.parentNode !== this._element)            return true;        if (focusNode.textContent.substring(selection.focusOffset).indexOf("\n") !== -1)            return false;        focusNode = focusNode.nextSibling;        while (focusNode) {            if (focusNode.nodeType !== Node.TEXT_NODE)                return true;            if (focusNode.textContent.indexOf("\n") !== -1)                return false;            focusNode = focusNode.nextSibling;        }        return true;    },    moveCaretToEndOfPrompt: function()     {        var selection = this._element.getComponentSelection();        var selectionRange = this._createRange();        var container = this._element;        while (container.childNodes.length)            container = container.lastChild;        var offset = container.nodeType === Node.TEXT_NODE ? container.textContent.length : 0;        selectionRange.setStart(container, offset);        selectionRange.setEnd(container, offset);        selection.removeAllRanges();        selection.addRange(selectionRange);    },    tabKeyPressed: function(event)     {        this._completeCommonPrefix();        return true;    },    proxyElementForTests: function()     {        return this._proxyElement || null ;    },    __proto__: WebInspector.Object.prototype}WebInspector.TextPromptWithHistory = function(completions, stopCharacters) {    WebInspector.TextPrompt.call(this, completions, stopCharacters);    this._data = [];    this._historyOffset = 1;}WebInspector.TextPromptWithHistory.prototype = {    historyData: function()     {        return this._data;    },    setHistoryData: function(data)     {        this._data = [].concat(data);        this._historyOffset = 1;    },    pushHistoryItem: function(text)     {        if (this._uncommittedIsTop) {            this._data.pop();            delete this._uncommittedIsTop;        }        this._historyOffset = 1;        if (text === this._currentHistoryItem())            return;        this._data.push(text);    },    _pushCurrentText: function()     {        if (this._uncommittedIsTop)            this._data.pop();        this._uncommittedIsTop = true;        this.clearAutoComplete(true);        this._data.push(this.text());    },    _previous: function()     {        if (this._historyOffset > this._data.length)            return undefined;        if (this._historyOffset === 1)            this._pushCurrentText();        ++this._historyOffset;        return this._currentHistoryItem();    },    _next: function()     {        if (this._historyOffset === 1)            return undefined;        --this._historyOffset;        return this._currentHistoryItem();    },    _currentHistoryItem: function()     {        return this._data[this._data.length - this._historyOffset];    },    onKeyDown: function(event)     {        var newText;        var isPrevious;        switch (event.keyIdentifier) {        case "Up":            if (!this.isCaretOnFirstLine() || this.isSuggestBoxVisible())                break;            newText = this._previous();            isPrevious = true;            break;        case "Down":            if (!this.isCaretOnLastLine() || this.isSuggestBoxVisible())                break;            newText = this._next();            break;        case "U+0050":            if (WebInspector.isMac() && event.ctrlKey && !event.metaKey && !event.altKey && !event.shiftKey) {                newText = this._previous();                isPrevious = true;            }            break;        case "U+004E":            if (WebInspector.isMac() && event.ctrlKey && !event.metaKey && !event.altKey && !event.shiftKey)                newText = this._next();            break;        }        if (newText !== undefined) {            event.consume(true);            this.setText(newText);            if (isPrevious) {                var firstNewlineIndex = this.text().indexOf("\n");                if (firstNewlineIndex === -1)                    this.moveCaretToEndOfPrompt();                else {                    var selection = this._element.getComponentSelection();                    var selectionRange = this._createRange();                    selectionRange.setStart(this._element.firstChild, firstNewlineIndex);                    selectionRange.setEnd(this._element.firstChild, firstNewlineIndex);                    selection.removeAllRanges();                    selection.addRange(selectionRange);                }            }            return;        }        WebInspector.TextPrompt.prototype.onKeyDown.apply(this, arguments);    },    __proto__: WebInspector.TextPrompt.prototype};WebInspector.highlightedSearchResultClassName = "highlighted-search-result";WebInspector.installDragHandle = function(element, elementDragStart, elementDrag, elementDragEnd, cursor, hoverCursor) {    element.addEventListener("mousedown", WebInspector.elementDragStart.bind(WebInspector, elementDragStart, elementDrag, elementDragEnd, cursor), false);    if (hoverCursor !== null )        element.style.cursor = hoverCursor || cursor;}WebInspector.elementDragStart = function(elementDragStart, elementDrag, elementDragEnd, cursor, event) {    if (event.button || (WebInspector.isMac() && event.ctrlKey))        return;    if (WebInspector._elementDraggingEventListener)        return;    if (elementDragStart && !elementDragStart((event)))        return;    if (WebInspector._elementDraggingGlassPane) {        WebInspector._elementDraggingGlassPane.dispose();        delete WebInspector._elementDraggingGlassPane;    }    var targetDocument = event.target.ownerDocument;    WebInspector._elementDraggingEventListener = elementDrag;    WebInspector._elementEndDraggingEventListener = elementDragEnd;    WebInspector._mouseOutWhileDraggingTargetDocument = targetDocument;    WebInspector._dragEventsTargetDocument = targetDocument;    WebInspector._dragEventsTargetDocumentTop = targetDocument.defaultView.top.document;    targetDocument.addEventListener("mousemove", WebInspector._elementDragMove, true);    targetDocument.addEventListener("mouseup", WebInspector._elementDragEnd, true);    targetDocument.addEventListener("mouseout", WebInspector._mouseOutWhileDragging, true);    if (targetDocument !== WebInspector._dragEventsTargetDocumentTop)        WebInspector._dragEventsTargetDocumentTop.addEventListener("mouseup", WebInspector._elementDragEnd, true);    var targetElement = (event.target);    if (typeof cursor === "string") {        WebInspector._restoreCursorAfterDrag = restoreCursor.bind(null , targetElement.style.cursor);        targetElement.style.cursor = cursor;        targetDocument.body.style.cursor = cursor;    }    function restoreCursor(oldCursor)     {        targetDocument.body.style.removeProperty("cursor");        targetElement.style.cursor = oldCursor;        WebInspector._restoreCursorAfterDrag = null ;    }    event.preventDefault();}WebInspector._mouseOutWhileDragging = function() {    var document = WebInspector._mouseOutWhileDraggingTargetDocument;    WebInspector._unregisterMouseOutWhileDragging();    WebInspector._elementDraggingGlassPane = new WebInspector.GlassPane(document);}WebInspector._unregisterMouseOutWhileDragging = function() {    if (!WebInspector._mouseOutWhileDraggingTargetDocument)        return;    WebInspector._mouseOutWhileDraggingTargetDocument.removeEventListener("mouseout", WebInspector._mouseOutWhileDragging, true);    delete WebInspector._mouseOutWhileDraggingTargetDocument;}WebInspector._unregisterDragEvents = function() {    if (!WebInspector._dragEventsTargetDocument)        return;    WebInspector._dragEventsTargetDocument.removeEventListener("mousemove", WebInspector._elementDragMove, true);    WebInspector._dragEventsTargetDocument.removeEventListener("mouseup", WebInspector._elementDragEnd, true);    if (WebInspector._dragEventsTargetDocument !== WebInspector._dragEventsTargetDocumentTop)        WebInspector._dragEventsTargetDocumentTop.removeEventListener("mouseup", WebInspector._elementDragEnd, true);    delete WebInspector._dragEventsTargetDocument;    delete WebInspector._dragEventsTargetDocumentTop;}WebInspector._elementDragMove = function(event) {    if (event.buttons !== 1) {        WebInspector._elementDragEnd(event);        return;    }    if (WebInspector._elementDraggingEventListener((event)))        WebInspector._cancelDragEvents(event);}WebInspector._cancelDragEvents = function(event) {    WebInspector._unregisterDragEvents();    WebInspector._unregisterMouseOutWhileDragging();    if (WebInspector._restoreCursorAfterDrag)        WebInspector._restoreCursorAfterDrag();    if (WebInspector._elementDraggingGlassPane)        WebInspector._elementDraggingGlassPane.dispose();    delete WebInspector._elementDraggingGlassPane;    delete WebInspector._elementDraggingEventListener;    delete WebInspector._elementEndDraggingEventListener;}WebInspector._elementDragEnd = function(event) {    var elementDragEnd = WebInspector._elementEndDraggingEventListener;    WebInspector._cancelDragEvents((event));    event.preventDefault();    if (elementDragEnd)        elementDragEnd((event));}WebInspector.GlassPane = function(document) {    this.element = createElement("div");    this.element.style.cssText = "position:absolute;top:0;bottom:0;left:0;right:0;background-color:transparent;z-index:1000;overflow:hidden;";    this.element.id = "glass-pane";    document.body.appendChild(this.element);    WebInspector._glassPane = this;}WebInspector.GlassPane.prototype = {    dispose: function()     {        delete WebInspector._glassPane;        if (WebInspector.GlassPane.DefaultFocusedViewStack.length)            WebInspector.GlassPane.DefaultFocusedViewStack.peekLast().focus();        this.element.remove();    }}WebInspector.GlassPane.DefaultFocusedViewStack = [];WebInspector.isBeingEdited = function(node) {    if (!node || node.nodeType !== Node.ELEMENT_NODE)        return false;    var element = (node);    if (element.classList.contains("text-prompt") || element.nodeName === "INPUT" || element.nodeName === "TEXTAREA")        return true;    if (!WebInspector.__editingCount)        return false;    while (element) {        if (element.__editing)            return true;        element = element.parentElementOrShadowHost();    }    return false;}WebInspector.isEditing = function() {    if (WebInspector.__editingCount)        return true;    var element = WebInspector.currentFocusElement();    if (!element)        return false;    return element.classList.contains("text-prompt") || element.nodeName === "INPUT" || element.nodeName === "TEXTAREA";}WebInspector.markBeingEdited = function(element, value) {    if (value) {        if (element.__editing)            return false;        element.classList.add("being-edited");        element.__editing = true;        WebInspector.__editingCount = (WebInspector.__editingCount || 0) + 1;    } else {        if (!element.__editing)            return false;        element.classList.remove("being-edited");        delete element.__editing;        --WebInspector.__editingCount;    }    return true;}WebInspector.CSSNumberRegex = /^(-?(?:\d+(?:\.\d+)?|\.\d+))$/;WebInspector.StyleValueDelimiters = " \xA0\t\n\"':;,/()";WebInspector._valueModificationDirection = function(event) {    var direction = null ;    if (event.type === "mousewheel") {        if (event.wheelDeltaY > 0)            direction = "Up";        else if (event.wheelDeltaY < 0)            direction = "Down";    } else {        if (event.keyIdentifier === "Up" || event.keyIdentifier === "PageUp")            direction = "Up";        else if (event.keyIdentifier === "Down" || event.keyIdentifier === "PageDown")            direction = "Down";    }    return direction;}WebInspector._modifiedHexValue = function(hexString, event) {    var direction = WebInspector._valueModificationDirection(event);    if (!direction)        return hexString;    var number = parseInt(hexString, 16);    if (isNaN(number) || !isFinite(number))        return hexString;    var maxValue = Math.pow(16, hexString.length) - 1;    var arrowKeyOrMouseWheelEvent = (event.keyIdentifier === "Up" || event.keyIdentifier === "Down" || event.type === "mousewheel");    var delta;    if (arrowKeyOrMouseWheelEvent)        delta = (direction === "Up") ? 1 : -1;    else        delta = (event.keyIdentifier === "PageUp") ? 16 : -16;    if (event.shiftKey)        delta *= 16;    var result = number + delta;    if (result < 0)        result = 0;    else if (result > maxValue)        return hexString;    var resultString = result.toString(16).toUpperCase();    for (var i = 0, lengthDelta = hexString.length - resultString.length; i < lengthDelta; ++i)        resultString = "0" + resultString;    return resultString;}WebInspector._modifiedFloatNumber = function(number, event) {    var direction = WebInspector._valueModificationDirection(event);    if (!direction)        return number;    var arrowKeyOrMouseWheelEvent = (event.keyIdentifier === "Up" || event.keyIdentifier === "Down" || event.type === "mousewheel");    var changeAmount = 1;    if (event.shiftKey && !arrowKeyOrMouseWheelEvent)        changeAmount = 100;    else if (event.shiftKey || !arrowKeyOrMouseWheelEvent)        changeAmount = 10;    else if (event.altKey)        changeAmount = 0.1;    if (direction === "Down")        changeAmount *= -1;    var result = Number((number + changeAmount).toFixed(6));    if (!String(result).match(WebInspector.CSSNumberRegex))        return null ;    return result;}WebInspector.createReplacementString = function(wordString, event, customNumberHandler) {    var replacementString;    var prefix, suffix, number;    var matches;    matches = /(.*#)([\da-fA-F]+)(.*)/.exec(wordString);    if (matches && matches.length) {        prefix = matches[1];        suffix = matches[3];        number = WebInspector._modifiedHexValue(matches[2], event);        replacementString = customNumberHandler ? customNumberHandler(prefix, number, suffix) : prefix + number + suffix;    } else {        matches = /(.*?)(-?(?:\d+(?:\.\d+)?|\.\d+))(.*)/.exec(wordString);        if (matches && matches.length) {            prefix = matches[1];            suffix = matches[3];            number = WebInspector._modifiedFloatNumber(parseFloat(matches[2]), event);            if (number === null )                return null ;            replacementString = customNumberHandler ? customNumberHandler(prefix, number, suffix) : prefix + number + suffix;        }    }    return replacementString || null ;}WebInspector.handleElementValueModifications = function(event, element, finishHandler, suggestionHandler, customNumberHandler) {    function createRange()     {        return document.createRange();    }    var arrowKeyOrMouseWheelEvent = (event.keyIdentifier === "Up" || event.keyIdentifier === "Down" || event.type === "mousewheel");    var pageKeyPressed = (event.keyIdentifier === "PageUp" || event.keyIdentifier === "PageDown");    if (!arrowKeyOrMouseWheelEvent && !pageKeyPressed)        return false;    var selection = element.getComponentSelection();    if (!selection.rangeCount)        return false;    var selectionRange = selection.getRangeAt(0);    if (!selectionRange.commonAncestorContainer.isSelfOrDescendant(element))        return false;    var originalValue = element.textContent;    var wordRange = selectionRange.startContainer.rangeOfWord(selectionRange.startOffset, WebInspector.StyleValueDelimiters, element);    var wordString = wordRange.toString();    if (suggestionHandler && suggestionHandler(wordString))        return false;    var replacementString = WebInspector.createReplacementString(wordString, event, customNumberHandler);    if (replacementString) {        var replacementTextNode = createTextNode(replacementString);        wordRange.deleteContents();        wordRange.insertNode(replacementTextNode);        var finalSelectionRange = createRange();        finalSelectionRange.setStart(replacementTextNode, 0);        finalSelectionRange.setEnd(replacementTextNode, replacementString.length);        selection.removeAllRanges();        selection.addRange(finalSelectionRange);        event.handled = true;        event.preventDefault();        if (finishHandler)            finishHandler(originalValue, replacementString);        return true;    }    return false;}Number.preciseMillisToString = function(ms, precision) {    precision = precision || 0;    var format = "%." + precision + "f\u2009ms";    return WebInspector.UIString(format, ms);}WebInspector._subMillisFormat = new WebInspector.UIStringFormat("%.3f\u2009ms");WebInspector._millisFormat = new WebInspector.UIStringFormat("%.0f\u2009ms");WebInspector._secondsFormat = new WebInspector.UIStringFormat("%.2f\u2009s");WebInspector._minutesFormat = new WebInspector.UIStringFormat("%.1f\u2009min");WebInspector._hoursFormat = new WebInspector.UIStringFormat("%.1f\u2009hrs");WebInspector._daysFormat = new WebInspector.UIStringFormat("%.1f\u2009days");Number.millisToString = function(ms, higherResolution) {    if (!isFinite(ms))        return "-";    if (ms === 0)        return "0";    if (higherResolution && ms < 1000)        return WebInspector._subMillisFormat.format(ms);    else if (ms < 1000)        return WebInspector._millisFormat.format(ms);    var seconds = ms / 1000;    if (seconds < 60)        return WebInspector._secondsFormat.format(seconds);    var minutes = seconds / 60;    if (minutes < 60)        return WebInspector._minutesFormat.format(minutes);    var hours = minutes / 60;    if (hours < 24)        return WebInspector._hoursFormat.format(hours);    var days = hours / 24;    return WebInspector._daysFormat.format(days);}Number.secondsToString = function(seconds, higherResolution) {    if (!isFinite(seconds))        return "-";    return Number.millisToString(seconds * 1000, higherResolution);}Number.bytesToString = function(bytes) {    if (bytes < 1024)        return WebInspector.UIString("%.0f\u2009B", bytes);    var kilobytes = bytes / 1024;    if (kilobytes < 100)        return WebInspector.UIString("%.1f\u2009KB", kilobytes);    if (kilobytes < 1024)        return WebInspector.UIString("%.0f\u2009KB", kilobytes);    var megabytes = kilobytes / 1024;    if (megabytes < 100)        return WebInspector.UIString("%.1f\u2009MB", megabytes);    else        return WebInspector.UIString("%.0f\u2009MB", megabytes);}Number.withThousandsSeparator = function(num) {    var str = num + "";    var re = /(\d+)(\d{3})/;    while (str.match(re))        str = str.replace(re, "$1\u2009$2");    return str;}WebInspector.formatLocalized = function(format, substitutions, initialValue) {    var element = createElement("span");    var formatters = {        s: function(substitution)         {            return substitution;        }    };    function append(a, b)     {        if (typeof b === "string")            b = createTextNode(b);        else if (b.shadowRoot)            b = createTextNode(b.shadowRoot.lastChild.textContent);        element.appendChild(b);    }    String.format(WebInspector.UIString(format), substitutions, formatters, initialValue, append);    return element;}WebInspector.openLinkExternallyLabel = function() {    return WebInspector.UIString.capitalize("Open ^link in ^new ^tab");}WebInspector.copyLinkAddressLabel = function() {    return WebInspector.UIString.capitalize("Copy ^link ^address");}WebInspector.anotherProfilerActiveLabel = function() {    return WebInspector.UIString("Another profiler is already active");}WebInspector.asyncStackTraceLabel = function(description) {    if (description)        return description + " " + WebInspector.UIString("(async)");    return WebInspector.UIString("Async Call");}WebInspector.manageBlackboxingButtonLabel = function() {    return WebInspector.UIString("Manage framework blackboxing...");}WebInspector.installComponentRootStyles = function(element) {    element.appendChild(WebInspector.Widget.createStyleElement("ui/inspectorCommon.css"));    element.appendChild(WebInspector.Widget.createStyleElement("ui/inspectorSyntaxHighlight.css"));    element.classList.add("platform-" + WebInspector.platform());    if (Runtime.experiments.isEnabled("materialDesign"))        element.classList.add("material");}WebInspector.createShadowRootWithCoreStyles = function(element) {    var shadowRoot = element.createShadowRoot();    shadowRoot.appendChild(WebInspector.Widget.createStyleElement("ui/inspectorCommon.css"));    shadowRoot.appendChild(WebInspector.Widget.createStyleElement("ui/inspectorSyntaxHighlight.css"));    shadowRoot.addEventListener("focus", WebInspector._focusChanged.bind(WebInspector), true);    return shadowRoot;}WebInspector._windowFocused = function(document, event) {    if (event.target.document.nodeType === Node.DOCUMENT_NODE)        document.body.classList.remove("inactive");}WebInspector._windowBlurred = function(document, event) {    if (event.target.document.nodeType === Node.DOCUMENT_NODE)        document.body.classList.add("inactive");}WebInspector.previousFocusElement = function() {    return WebInspector._previousFocusElement;}WebInspector.currentFocusElement = function() {    return WebInspector._currentFocusElement;}WebInspector._focusChanged = function(event) {    var node = event.deepActiveElement();    WebInspector.setCurrentFocusElement(node);}WebInspector._documentBlurred = function(document, event) {    if (!event.relatedTarget && document.activeElement === document.body)        WebInspector.setCurrentFocusElement(null );}WebInspector._textInputTypes = ["text", "search", "tel", "url", "email", "password"].keySet();WebInspector._isTextEditingElement = function(element) {    if (element instanceof HTMLInputElement)        return element.type in WebInspector._textInputTypes;    if (element instanceof HTMLTextAreaElement)        return true;    return false;}WebInspector.setCurrentFocusElement = function(x) {    if (WebInspector._glassPane && x && !WebInspector._glassPane.element.isAncestor(x))        return;    if (WebInspector._currentFocusElement !== x)        WebInspector._previousFocusElement = WebInspector._currentFocusElement;    WebInspector._currentFocusElement = x;    if (WebInspector._currentFocusElement) {        WebInspector._currentFocusElement.focus();        var selection = x.getComponentSelection();        if (!WebInspector._isTextEditingElement(WebInspector._currentFocusElement) && selection.isCollapsed && !WebInspector._currentFocusElement.isInsertionCaretInside()) {            var selectionRange = WebInspector._currentFocusElement.ownerDocument.createRange();            selectionRange.setStart(WebInspector._currentFocusElement, 0);            selectionRange.setEnd(WebInspector._currentFocusElement, 0);            selection.removeAllRanges();            selection.addRange(selectionRange);        }    } else if (WebInspector._previousFocusElement)        WebInspector._previousFocusElement.blur();}WebInspector.restoreFocusFromElement = function(element) {    if (element && element.isSelfOrAncestor(WebInspector.currentFocusElement()))        WebInspector.setCurrentFocusElement(WebInspector.previousFocusElement());}WebInspector.highlightSearchResult = function(element, offset, length, domChanges) {    var result = WebInspector.highlightSearchResults(element, [new WebInspector.SourceRange(offset,length)], domChanges);    return result.length ? result[0] : null ;}WebInspector.highlightSearchResults = function(element, resultRanges, changes) {    return WebInspector.highlightRangesWithStyleClass(element, resultRanges, WebInspector.highlightedSearchResultClassName, changes);}WebInspector.runCSSAnimationOnce = function(element, className) {    function animationEndCallback()     {        element.classList.remove(className);        element.removeEventListener("webkitAnimationEnd", animationEndCallback, false);    }    if (element.classList.contains(className))        element.classList.remove(className);    element.addEventListener("webkitAnimationEnd", animationEndCallback, false);    element.classList.add(className);}WebInspector.highlightRangesWithStyleClass = function(element, resultRanges, styleClass, changes) {    changes = changes || [];    var highlightNodes = [];    var lineText = element.deepTextContent();    var ownerDocument = element.ownerDocument;    var textNodes = element.childTextNodes();    if (textNodes.length === 0)        return highlightNodes;    var nodeRanges = [];    var rangeEndOffset = 0;    for (var i = 0; i < textNodes.length; ++i) {        var range = {};        range.offset = rangeEndOffset;        range.length = textNodes[i].textContent.length;        rangeEndOffset = range.offset + range.length;        nodeRanges.push(range);    }    var startIndex = 0;    for (var i = 0; i < resultRanges.length; ++i) {        var startOffset = resultRanges[i].offset;        var endOffset = startOffset + resultRanges[i].length;        while (startIndex < textNodes.length && nodeRanges[startIndex].offset + nodeRanges[startIndex].length <= startOffset)            startIndex++;        var endIndex = startIndex;        while (endIndex < textNodes.length && nodeRanges[endIndex].offset + nodeRanges[endIndex].length < endOffset)            endIndex++;        if (endIndex === textNodes.length)            break;        var highlightNode = ownerDocument.createElement("span");        highlightNode.className = styleClass;        highlightNode.textContent = lineText.substring(startOffset, endOffset);        var lastTextNode = textNodes[endIndex];        var lastText = lastTextNode.textContent;        lastTextNode.textContent = lastText.substring(endOffset - nodeRanges[endIndex].offset);        changes.push({            node: lastTextNode,            type: "changed",            oldText: lastText,            newText: lastTextNode.textContent        });        if (startIndex === endIndex) {            lastTextNode.parentElement.insertBefore(highlightNode, lastTextNode);            changes.push({                node: highlightNode,                type: "added",                nextSibling: lastTextNode,                parent: lastTextNode.parentElement            });            highlightNodes.push(highlightNode);            var prefixNode = ownerDocument.createTextNode(lastText.substring(0, startOffset - nodeRanges[startIndex].offset));            lastTextNode.parentElement.insertBefore(prefixNode, highlightNode);            changes.push({                node: prefixNode,                type: "added",                nextSibling: highlightNode,                parent: lastTextNode.parentElement            });        } else {            var firstTextNode = textNodes[startIndex];            var firstText = firstTextNode.textContent;            var anchorElement = firstTextNode.nextSibling;            firstTextNode.parentElement.insertBefore(highlightNode, anchorElement);            changes.push({                node: highlightNode,                type: "added",                nextSibling: anchorElement,                parent: firstTextNode.parentElement            });            highlightNodes.push(highlightNode);            firstTextNode.textContent = firstText.substring(0, startOffset - nodeRanges[startIndex].offset);            changes.push({                node: firstTextNode,                type: "changed",                oldText: firstText,                newText: firstTextNode.textContent            });            for (var j = startIndex + 1; j < endIndex; j++) {                var textNode = textNodes[j];                var text = textNode.textContent;                textNode.textContent = "";                changes.push({                    node: textNode,                    type: "changed",                    oldText: text,                    newText: textNode.textContent                });            }        }        startIndex = endIndex;        nodeRanges[startIndex].offset = endOffset;        nodeRanges[startIndex].length = lastTextNode.textContent.length;    }    return highlightNodes;}WebInspector.applyDomChanges = function(domChanges) {    for (var i = 0, size = domChanges.length; i < size; ++i) {        var entry = domChanges[i];        switch (entry.type) {        case "added":            entry.parent.insertBefore(entry.node, entry.nextSibling);            break;        case "changed":            entry.node.textContent = entry.newText;            break;        }    }}WebInspector.revertDomChanges = function(domChanges) {    for (var i = domChanges.length - 1; i >= 0; --i) {        var entry = domChanges[i];        switch (entry.type) {        case "added":            entry.node.remove();            break;        case "changed":            entry.node.textContent = entry.oldText;            break;        }    }}WebInspector.measurePreferredSize = function(element, containerElement) {    containerElement = containerElement || element.ownerDocument.body;    containerElement.appendChild(element);    element.positionAt(0, 0);    var result = new Size(element.offsetWidth,element.offsetHeight);    element.positionAt(undefined, undefined);    element.remove();    return result;}WebInspector.InvokeOnceHandlers = function(autoInvoke) {    this._handlers = null ;    this._autoInvoke = autoInvoke;}WebInspector.InvokeOnceHandlers.prototype = {    add: function(object, method)     {        if (!this._handlers) {            this._handlers = new Map();            if (this._autoInvoke)                this.scheduleInvoke();        }        var methods = this._handlers.get(object);        if (!methods) {            methods = new Set();            this._handlers.set(object, methods);        }        methods.add(method);    },    scheduleInvoke: function()     {        if (this._handlers)            requestAnimationFrame(this._invoke.bind(this));    },    _invoke: function()     {        var handlers = this._handlers;        this._handlers = null ;        var keys = handlers.keysArray();        for (var i = 0; i < keys.length; ++i) {            var object = keys[i];            var methods = handlers.get(object).valuesArray();            for (var j = 0; j < methods.length; ++j)                methods[j].call(object);        }    }}WebInspector._coalescingLevel = 0;WebInspector._postUpdateHandlers = null ;WebInspector.startBatchUpdate = function() {    if (!WebInspector._coalescingLevel++)        WebInspector._postUpdateHandlers = new WebInspector.InvokeOnceHandlers(false);}WebInspector.endBatchUpdate = function() {    if (--WebInspector._coalescingLevel)        return;    WebInspector._postUpdateHandlers.scheduleInvoke();    WebInspector._postUpdateHandlers = null ;}WebInspector.invokeOnceAfterBatchUpdate = function(object, method) {    if (!WebInspector._postUpdateHandlers)        WebInspector._postUpdateHandlers = new WebInspector.InvokeOnceHandlers(true);    WebInspector._postUpdateHandlers.add(object, method);}WebInspector.animateFunction = function(window, func, params, frames, animationComplete) {    var values = new Array(params.length);    var deltas = new Array(params.length);    for (var i = 0; i < params.length; ++i) {        values[i] = params[i].from;        deltas[i] = (params[i].to - params[i].from) / frames;    }    var raf = window.requestAnimationFrame(animationStep);    var framesLeft = frames;    function animationStep()     {        if (--framesLeft < 0) {            if (animationComplete)                animationComplete();            return;        }        for (var i = 0; i < params.length; ++i) {            if (params[i].to > params[i].from)                values[i] = Number.constrain(values[i] + deltas[i], params[i].from, params[i].to);            else                values[i] = Number.constrain(values[i] + deltas[i], params[i].to, params[i].from);        }        func.apply(null , values);        raf = window.requestAnimationFrame(animationStep);    }    function cancelAnimation()     {        window.cancelAnimationFrame(raf);    }    return cancelAnimation;}WebInspector.LongClickController = function(element) {    this._element = element;}WebInspector.LongClickController.Events = {    LongClick: "LongClick",    LongPress: "LongPress"};WebInspector.LongClickController.prototype = {    reset: function()     {        if (this._longClickInterval) {            clearInterval(this._longClickInterval);            delete this._longClickInterval;        }    },    enable: function()     {        if (this._longClickData)            return;        var boundMouseDown = mouseDown.bind(this);        var boundMouseUp = mouseUp.bind(this);        var boundReset = this.reset.bind(this);        this._element.addEventListener("mousedown", boundMouseDown, false);        this._element.addEventListener("mouseout", boundReset, false);        this._element.addEventListener("mouseup", boundMouseUp, false);        this._element.addEventListener("click", boundReset, true);        var longClicks = 0;        this._longClickData = {            mouseUp: boundMouseUp,            mouseDown: boundMouseDown,            reset: boundReset        };        function mouseDown(e)         {            if (e.which !== 1)                return;            longClicks = 0;            this._longClickInterval = setInterval(longClicked.bind(this, e), 200);        }        function mouseUp(e)         {            if (e.which !== 1)                return;            this.reset();        }        function longClicked(e)         {            ++longClicks;            this.dispatchEventToListeners(longClicks === 1 ? WebInspector.LongClickController.Events.LongClick : WebInspector.LongClickController.Events.LongPress, e);        }    },    disable: function()     {        if (!this._longClickData)            return;        this._element.removeEventListener("mousedown", this._longClickData.mouseDown, false);        this._element.removeEventListener("mouseout", this._longClickData.reset, false);        this._element.removeEventListener("mouseup", this._longClickData.mouseUp, false);        this._element.addEventListener("click", this._longClickData.reset, true);        delete this._longClickData;    },    __proto__: WebInspector.Object.prototype}WebInspector.initializeUIUtils = function(window) {    window.addEventListener("focus", WebInspector._windowFocused.bind(WebInspector, window.document), false);    window.addEventListener("blur", WebInspector._windowBlurred.bind(WebInspector, window.document), false);    window.document.addEventListener("focus", WebInspector._focusChanged.bind(WebInspector), true);    window.document.addEventListener("blur", WebInspector._documentBlurred.bind(WebInspector, window.document), true);}WebInspector.beautifyFunctionName = function(name) {    return name || WebInspector.UIString("(anonymous function)");}function registerCustomElement(localName, typeExtension, prototype) {    return document.registerElement(typeExtension, {        prototype: Object.create(prototype),        extends: localName    });}function createTextButton(text, clickHandler, className, title) {    var element = createElementWithClass("button", className || "", "text-button");    element.textContent = text;    if (clickHandler)        element.addEventListener("click", clickHandler, false);    if (title)        element.title = title;    return element;}function createRadioLabel(name, title, checked) {    var element = createElement("label", "dt-radio");    element.radioElement.name = name;    element.radioElement.checked = !!checked;    element.createTextChild(title);    return element;}function createCheckboxLabel(title, checked) {    var element = createElement("label", "dt-checkbox");    element.checkboxElement.checked = !!checked;    if (title !== undefined) {        element.textElement = element.createChild("div", "dt-checkbox-text");        element.textElement.textContent = title;    }    return element;};(function() {    registerCustomElement("button", "text-button", {        createdCallback: function()         {            this.type = "button";            var root = WebInspector.createShadowRootWithCoreStyles(this);            root.appendChild(WebInspector.Widget.createStyleElement("ui/textButton.css"));            root.createChild("content");        },        __proto__: HTMLButtonElement.prototype    });    registerCustomElement("label", "dt-radio", {        createdCallback: function()         {            this.radioElement = this.createChild("input", "dt-radio-button");            this.radioElement.type = "radio";            var root = WebInspector.createShadowRootWithCoreStyles(this);            root.appendChild(WebInspector.Widget.createStyleElement("ui/radioButton.css"));            root.createChild("content").select = ".dt-radio-button";            root.createChild("content");            this.addEventListener("click", radioClickHandler, false);        },        __proto__: HTMLLabelElement.prototype    });    function radioClickHandler(event)     {        if (this.radioElement.checked || this.radioElement.disabled)            return;        this.radioElement.checked = true;        this.radioElement.dispatchEvent(new Event("change"));    }    registerCustomElement("label", "dt-checkbox", {        createdCallback: function()         {            this._root = WebInspector.createShadowRootWithCoreStyles(this);            this._root.appendChild(WebInspector.Widget.createStyleElement("ui/checkboxTextLabel.css"));            var checkboxElement = createElementWithClass("input", "dt-checkbox-button");            checkboxElement.type = "checkbox";            this._root.appendChild(checkboxElement);            this.checkboxElement = checkboxElement;            this.addEventListener("click", toggleCheckbox.bind(this));            function toggleCheckbox(event)             {                if (event.target !== checkboxElement && event.target !== this)                    checkboxElement.click();            }            this._root.createChild("content");        },        set backgroundColor(color)         {            this.checkboxElement.classList.add("dt-checkbox-themed");            this.checkboxElement.style.backgroundColor = color;        },        set checkColor(color)         {            this.checkboxElement.classList.add("dt-checkbox-themed");            var stylesheet = createElement("style");            stylesheet.textContent = "input.dt-checkbox-themed:checked:after { background-color: " + color + "}";            this._root.appendChild(stylesheet);        },        set borderColor(color)         {            this.checkboxElement.classList.add("dt-checkbox-themed");            this.checkboxElement.style.borderColor = color;        },        __proto__: HTMLLabelElement.prototype    });    registerCustomElement("label", "dt-icon-label", {        createdCallback: function()         {            var root = WebInspector.createShadowRootWithCoreStyles(this);            root.appendChild(WebInspector.Widget.createStyleElement("ui/smallIcon.css"));            this._iconElement = root.createChild("div");            root.createChild("content");        },        set type(type)         {            this._iconElement.className = type;        },        __proto__: HTMLLabelElement.prototype    });    registerCustomElement("div", "dt-close-button", {        createdCallback: function()         {            var root = WebInspector.createShadowRootWithCoreStyles(this);            root.appendChild(WebInspector.Widget.createStyleElement("ui/closeButton.css"));            this._buttonElement = root.createChild("div", "close-button");        },        set gray(gray)         {            this._buttonElement.className = gray ? "close-button-gray" : "close-button";        },        __proto__: HTMLDivElement.prototype    });})();WebInspector.StringFormatter = function() {    this._processors = [];    this._regexes = [];}WebInspector.StringFormatter.prototype = {    addProcessor: function(regex, handler)     {        this._regexes.push(regex);        this._processors.push(handler);    },    formatText: function(text)     {        return this._runProcessor(0, text);    },    _runProcessor: function(processorIndex, text)     {        if (processorIndex >= this._processors.length)            return createTextNode(text);        var container = createDocumentFragment();        var regex = this._regexes[processorIndex];        var processor = this._processors[processorIndex];        var items = text.replace(regex, "\0$1\0").split("\0");        for (var i = 0; i < items.length; ++i) {            var processedNode = i % 2 ? processor(items[i]) : this._runProcessor(processorIndex + 1, items[i]);            container.appendChild(processedNode);        }        return container;    }};WebInspector.ViewportControl = function(provider) {    this.element = createElement("div");    this.element.style.overflow = "auto";    this._topGapElement = this.element.createChild("div", "viewport-control-gap-element");    this._topGapElement.textContent = ".";    this._topGapElement.style.height = "0px";    this._contentElement = this.element.createChild("div");    this._bottomGapElement = this.element.createChild("div", "viewport-control-gap-element");    this._bottomGapElement.textContent = ".";    this._bottomGapElement.style.height = "0px";    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._firstVisibleIndex = 0;    this._lastVisibleIndex = -1;    this._renderedItems = [];    this._anchorSelection = null ;    this._headSelection = null ;    this._stickToBottom = false;    this._scrolledToBottom = true;}WebInspector.ViewportControl.Provider = function() {}WebInspector.ViewportControl.Provider.prototype = {    fastHeight: function(index) {        return 0;    },    itemCount: function() {        return 0;    },    minimumRowHeight: function() {        return 0;    },    itemElement: function(index) {        return null ;    }}WebInspector.ViewportElement = function() {}WebInspector.ViewportElement.prototype = {    cacheFastHeight: function() {},    willHide: function() {},    wasShown: function() {},    element: function() {},}WebInspector.StaticViewportElement = function(element) {    this._element = element;}WebInspector.StaticViewportElement.prototype = {    cacheFastHeight: function() {},    willHide: function() {},    wasShown: function() {},    element: function()     {        return this._element;    },}WebInspector.ViewportControl.prototype = {    scrolledToBottom: function()     {        return this._scrolledToBottom;    },    setStickToBottom: function(value)     {        this._stickToBottom = value;    },    _onCopy: function(event)     {        var text = this._selectedText();        if (!text)            return;        event.preventDefault();        event.clipboardData.setData("text/plain", text);    },    _onDragStart: function(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: function()     {        return this._contentElement;    },    invalidate: function()     {        delete this._cumulativeHeights;        delete this._cachedProviderElements;        this.refresh();    },    _providerElement: function(index)     {        if (!this._cachedProviderElements)            this._cachedProviderElements = new Array(this._provider.itemCount());        var element = this._cachedProviderElements[index];        if (!element) {            element = this._provider.itemElement(index);            this._cachedProviderElements[index] = element;        }        return element;    },    _rebuildCumulativeHeightsIfNeeded: function()     {        if (this._cumulativeHeights)            return;        var itemCount = this._provider.itemCount();        if (!itemCount)            return;        this._cumulativeHeights = new Int32Array(itemCount);        this._cumulativeHeights[0] = this._provider.fastHeight(0);        for (var i = 1; i < itemCount; ++i)            this._cumulativeHeights[i] = this._cumulativeHeights[i - 1] + this._provider.fastHeight(i);    },    _cachedItemHeight: function(index)     {        return index === 0 ? this._cumulativeHeights[0] : this._cumulativeHeights[index] - this._cumulativeHeights[index - 1];    },    _isSelectionBackwards: function(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: function(itemIndex, node, offset)     {        return {            item: itemIndex,            node: node,            offset: offset        };    },    _updateSelectionModel: function(selection)     {        if (!selection || !selection.rangeCount) {            this._headSelection = null ;            this._anchorSelection = null ;            return false;        }        var firstSelected = Number.MAX_VALUE;        var lastSelected = -1;        var range = selection.getRangeAt(0);        var hasVisibleSelection = false;        for (var i = 0; i < this._renderedItems.length; ++i) {            if (range.intersectsNode(this._renderedItems[i].element())) {                var index = i + this._firstVisibleIndex;                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._provider.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: function(selection)     {        var anchorElement = null ;        var anchorOffset;        if (this._firstVisibleIndex <= this._anchorSelection.item && this._anchorSelection.item <= this._lastVisibleIndex) {            anchorElement = this._anchorSelection.node;            anchorOffset = this._anchorSelection.offset;        } else {            if (this._anchorSelection.item < this._firstVisibleIndex)                anchorElement = this._topGapElement;            else if (this._anchorSelection.item > this._lastVisibleIndex)                anchorElement = this._bottomGapElement;            anchorOffset = this._selectionIsBackward ? 1 : 0;        }        var headElement = null ;        var headOffset;        if (this._firstVisibleIndex <= this._headSelection.item && this._headSelection.item <= this._lastVisibleIndex) {            headElement = this._headSelection.node;            headOffset = this._headSelection.offset;        } else {            if (this._headSelection.item < this._firstVisibleIndex)                headElement = this._topGapElement;            else if (this._headSelection.item > this._lastVisibleIndex)                headElement = this._bottomGapElement;            headOffset = this._selectionIsBackward ? 0 : 1;        }        selection.setBaseAndExtent(anchorElement, anchorOffset, headElement, headOffset);    },    refresh: function()     {        if (!this._visibleHeight())            return;        var itemCount = this._provider.itemCount();        if (!itemCount) {            for (var i = 0; i < this._renderedItems.length; ++i)                this._renderedItems[i].cacheFastHeight();            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._firstVisibleIndex = -1;            this._lastVisibleIndex = -1;            return;        }        var selection = this.element.getComponentSelection();        var shouldRestoreSelection = this._updateSelectionModel(selection);        var visibleFrom = this.element.scrollTop;        var visibleHeight = this._visibleHeight();        this._scrolledToBottom = this.element.isScrolledToBottom();        var isInvalidating = !this._cumulativeHeights;        if (this._cumulativeHeights && itemCount !== this._cumulativeHeights.length)            delete this._cumulativeHeights;        for (var i = 0; i < this._renderedItems.length; ++i) {            this._renderedItems[i].cacheFastHeight();            if (this._cumulativeHeights && Math.abs(this._cachedItemHeight(this._firstVisibleIndex + i) - this._provider.fastHeight(i + this._firstVisibleIndex)) > 1)                delete this._cumulativeHeights;        }        this._rebuildCumulativeHeightsIfNeeded();        var oldFirstVisibleIndex = this._firstVisibleIndex;        var oldLastVisibleIndex = this._lastVisibleIndex;        var shouldStickToBottom = this._stickToBottom && this._scrolledToBottom;        if (shouldStickToBottom) {            this._lastVisibleIndex = itemCount - 1;            this._firstVisibleIndex = Math.max(itemCount - Math.ceil(visibleHeight / this._provider.minimumRowHeight()), 0);        } else {            this._firstVisibleIndex = Math.max(Array.prototype.lowerBound.call(this._cumulativeHeights, visibleFrom + 1), 0);            this._lastVisibleIndex = this._firstVisibleIndex + Math.ceil(visibleHeight / this._provider.minimumRowHeight()) - 1;            this._lastVisibleIndex = Math.min(this._lastVisibleIndex, itemCount - 1);        }        var topGapHeight = this._cumulativeHeights[this._firstVisibleIndex - 1] || 0;        var bottomGapHeight = this._cumulativeHeights[this._cumulativeHeights.length - 1] - this._cumulativeHeights[this._lastVisibleIndex];        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");        if (isInvalidating)            this._fullViewportUpdate();        else            this._partialViewportUpdate(oldFirstVisibleIndex, oldLastVisibleIndex);        this._contentElement.style.removeProperty("height");        if (shouldRestoreSelection)            this._restoreSelection(selection);        if (shouldStickToBottom)            this.element.scrollTop = this.element.scrollHeight;    },    _fullViewportUpdate: function()     {        for (var i = 0; i < this._renderedItems.length; ++i)            this._renderedItems[i].willHide();        this._renderedItems = [];        this._contentElement.removeChildren();        for (var i = this._firstVisibleIndex; i <= this._lastVisibleIndex; ++i) {            var viewportElement = this._providerElement(i);            this._contentElement.appendChild(viewportElement.element());            this._renderedItems.push(viewportElement);            viewportElement.wasShown();        }    },    _partialViewportUpdate: function(oldFirstVisibleIndex, oldLastVisibleIndex)     {        var willBeHidden = [];        for (var i = 0; i < this._renderedItems.length; ++i) {            var index = oldFirstVisibleIndex + i;            if (index < this._firstVisibleIndex || this._lastVisibleIndex < index)                willBeHidden.push(this._renderedItems[i]);        }        for (var i = 0; i < willBeHidden.length; ++i)            willBeHidden[i].willHide();        for (var i = 0; i < willBeHidden.length; ++i)            willBeHidden[i].element().remove();        this._renderedItems = [];        var anchor = this._contentElement.firstChild;        for (var i = this._firstVisibleIndex; i <= this._lastVisibleIndex; ++i) {            var viewportElement = this._providerElement(i);            var element = viewportElement.element();            if (element !== anchor) {                this._contentElement.insertBefore(element, anchor);                viewportElement.wasShown();            } else {                anchor = anchor.nextSibling;            }            this._renderedItems.push(viewportElement);        }    },    _selectedText: function()     {        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)            textLines.push(this._providerElement(i).element().deepTextContent());        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: function(itemElement, container, offset)     {        var chars = 0;        var node = itemElement;        while ((node = node.traverseNextTextNode()) && node !== container)            chars += node.textContent.length;        return chars + offset;    },    _onScroll: function(event)     {        this.refresh();    },    firstVisibleIndex: function()     {        return this._firstVisibleIndex;    },    lastVisibleIndex: function()     {        return this._lastVisibleIndex;    },    renderedElementAt: function(index)     {        if (index < this._firstVisibleIndex)            return null ;        if (index > this._lastVisibleIndex)            return null ;        return this._renderedItems[index - this._firstVisibleIndex].element();    },    scrollItemIntoView: function(index, makeLast)     {        if (index > this._firstVisibleIndex && index < this._lastVisibleIndex)            return;        if (makeLast)            this.forceScrollItemToBeLast(index);        else if (index <= this._firstVisibleIndex)            this.forceScrollItemToBeFirst(index);        else if (index >= this._lastVisibleIndex)            this.forceScrollItemToBeLast(index);    },    forceScrollItemToBeFirst: function(index)     {        this._rebuildCumulativeHeightsIfNeeded();        this.element.scrollTop = index > 0 ? this._cumulativeHeights[index - 1] : 0;        this.refresh();    },    forceScrollItemToBeLast: function(index)     {        this._rebuildCumulativeHeightsIfNeeded();        this.element.scrollTop = this._cumulativeHeights[index] - this._visibleHeight();        this.refresh();    },    _visibleHeight: function()     {        return this.element.offsetHeight;    }};WebInspector.ZoomManager = function(window, frontendHost) {    this._frontendHost = frontendHost;    this._zoomFactor = this._frontendHost.zoomFactor();    window.addEventListener("resize", this._onWindowResize.bind(this), true);};WebInspector.ZoomManager.Events = {    ZoomChanged: "ZoomChanged"};WebInspector.ZoomManager.prototype = {    zoomFactor: function()     {        return this._zoomFactor;    },    cssToDIP: function(value)     {        return value * this._zoomFactor;    },    dipToCSS: function(valueDIP)     {        return valueDIP / this._zoomFactor;    },    _onWindowResize: function()     {        var oldZoomFactor = this._zoomFactor;        this._zoomFactor = this._frontendHost.zoomFactor();        if (oldZoomFactor !== this._zoomFactor)            this.dispatchEventToListeners(WebInspector.ZoomManager.Events.ZoomChanged, {                from: oldZoomFactor,                to: this._zoomFactor            });    },    __proto__: WebInspector.Object.prototype};WebInspector.zoomManager;;WebInspector.ThrottledWidget = function() {    WebInspector.Widget.call(this);    this._updateThrottler = new WebInspector.Throttler(100);    this._updateWhenVisible = false;}WebInspector.ThrottledWidget.prototype = {    doUpdate: function(finishedCallback)     {        finishedCallback();    },    update: function()     {        this._updateWhenVisible = !this.isShowing();        if (this._updateWhenVisible)            return;        this._updateThrottler.schedule(innerUpdate.bind(this));        function innerUpdate(finishedCallback)         {            if (this.isShowing()) {                this.doUpdate(finishedCallback);            } else {                this._updateWhenVisible = true;                finishedCallback();            }        }    },    wasShown: function()     {        WebInspector.Widget.prototype.wasShown.call(this);        if (this._updateWhenVisible)            this.update();    },    __proto__: WebInspector.Widget.prototype};function InspectorBackendClass() {    this._connection = null ;    this._agentPrototypes = {};    this._dispatcherPrototypes = {};    this._initialized = false;    this._enums = {};    this._initProtocolAgentsConstructor();}InspectorBackendClass._DevToolsErrorCode = -32000;InspectorBackendClass.reportProtocolError = function(error, messageObject) {    console.error(error + ": " + JSON.stringify(messageObject));}InspectorBackendClass.prototype = {    _initProtocolAgentsConstructor: function()     {        window.Protocol = {};        window.Protocol.Agents = function(agentsMap) {            this._agentsMap = agentsMap;        }        ;    },    _addAgentGetterMethodToProtocolAgentsPrototype: function(domain)     {        var upperCaseLength = 0;        while (upperCaseLength < domain.length && domain[upperCaseLength].toLowerCase() !== domain[upperCaseLength])            ++upperCaseLength;        var methodName = domain.substr(0, upperCaseLength).toLowerCase() + domain.slice(upperCaseLength) + "Agent";        function agentGetter()         {            return this._agentsMap[domain];        }        window.Protocol.Agents.prototype[methodName] = agentGetter;        function registerDispatcher(dispatcher)         {            this.registerDispatcher(domain, dispatcher)        }        window.Protocol.Agents.prototype["register" + domain + "Dispatcher"] = registerDispatcher;    },    connection: function()     {        if (!this._connection)            throw "Main connection was not initialized";        return this._connection;    },    setConnection: function(connection)     {        this._connection = connection;        this._connection.registerAgentsOn(window);        for (var type in this._enums) {            var domainAndMethod = type.split(".");            window[domainAndMethod[0] + "Agent"][domainAndMethod[1]] = this._enums[type];        }    },    _agentPrototype: function(domain)     {        if (!this._agentPrototypes[domain]) {            this._agentPrototypes[domain] = new InspectorBackendClass.AgentPrototype(domain);            this._addAgentGetterMethodToProtocolAgentsPrototype(domain);        }        return this._agentPrototypes[domain];    },    _dispatcherPrototype: function(domain)     {        if (!this._dispatcherPrototypes[domain])            this._dispatcherPrototypes[domain] = new InspectorBackendClass.DispatcherPrototype();        return this._dispatcherPrototypes[domain];    },    registerCommand: function(method, signature, replyArgs, hasErrorData)     {        var domainAndMethod = method.split(".");        this._agentPrototype(domainAndMethod[0]).registerCommand(domainAndMethod[1], signature, replyArgs, hasErrorData);        this._initialized = true;    },    registerEnum: function(type, values)     {        this._enums[type] = values;        this._initialized = true;    },    registerEvent: function(eventName, params)     {        var domain = eventName.split(".")[0];        this._dispatcherPrototype(domain).registerEvent(eventName, params);        this._initialized = true;    },    loadFromJSONIfNeeded: function(jsonUrl)     {        if (this._initialized)            return;        var xhr = new XMLHttpRequest();        xhr.open("GET", jsonUrl, false);        xhr.send(null );        var schema = JSON.parse(xhr.responseText);        var code = InspectorBackendClass._generateCommands(schema);        eval(code);    },    wrapClientCallback: function(clientCallback, errorPrefix, constructor, defaultValue)     {        function callbackWrapper(error, value)         {            if (error) {                console.error(errorPrefix + error);                clientCallback(defaultValue);                return;            }            if (constructor)                clientCallback(new constructor(value));            else                clientCallback(value);        }        return callbackWrapper;    }}InspectorBackendClass._generateCommands = function(schema) {    var jsTypes = {        integer: "number",        array: "object"    };    var rawTypes = {};    var result = [];    var domains = schema["domains"] || [];    for (var i = 0; i < domains.length; ++i) {        var domain = domains[i];        for (var j = 0; domain.types && j < domain.types.length; ++j) {            var type = domain.types[j];            rawTypes[domain.domain + "." + type.id] = jsTypes[type.type] || type.type;        }    }    function toUpperCase(groupIndex, group0, group1)     {        return [group0, group1][groupIndex].toUpperCase();    }    function generateEnum(enumName, items)     {        var members = [];        for (var m = 0; m < items.length; ++m) {            var value = items[m];            var name = value.replace(/-(\w)/g, toUpperCase.bind(null , 1)).toTitleCase();            name = name.replace(/HTML|XML|WML|API/ig, toUpperCase.bind(null , 0));            members.push(name + ": \"" + value + "\"");        }        return "InspectorBackend.registerEnum(\"" + enumName + "\", {" + members.join(", ") + "});";    }    for (var i = 0; i < domains.length; ++i) {        var domain = domains[i];        var types = domain["types"] || [];        for (var j = 0; j < types.length; ++j) {            var type = types[j];            if ((type["type"] === "string") && type["enum"])                result.push(generateEnum(domain.domain + "." + type.id, type["enum"]));            else if (type["type"] === "object") {                var properties = type["properties"] || [];                for (var k = 0; k < properties.length; ++k) {                    var property = properties[k];                    if ((property["type"] === "string") && property["enum"])                        result.push(generateEnum(domain.domain + "." + type.id + property["name"].toTitleCase(), property["enum"]));                }            }        }        var commands = domain["commands"] || [];        for (var j = 0; j < commands.length; ++j) {            var command = commands[j];            var parameters = command["parameters"];            var paramsText = [];            for (var k = 0; parameters && k < parameters.length; ++k) {                var parameter = parameters[k];                var type;                if (parameter.type)                    type = jsTypes[parameter.type] || parameter.type;                else {                    var ref = parameter["$ref"];                    if (ref.indexOf(".") !== -1)                        type = rawTypes[ref];                    else                        type = rawTypes[domain.domain + "." + ref];                }                var text = "{\"name\": \"" + parameter.name + "\", \"type\": \"" + type + "\", \"optional\": " + (parameter.optional ? "true" : "false") + "}";                paramsText.push(text);            }            var returnsText = [];            var returns = command["returns"] || [];            for (var k = 0; k < returns.length; ++k) {                var parameter = returns[k];                returnsText.push("\"" + parameter.name + "\"");            }            var hasErrorData = String(Boolean(command.error));            result.push("InspectorBackend.registerCommand(\"" + domain.domain + "." + command.name + "\", [" + paramsText.join(", ") + "], [" + returnsText.join(", ") + "], " + hasErrorData + ");");        }        for (var j = 0; domain.events && j < domain.events.length; ++j) {            var event = domain.events[j];            var paramsText = [];            for (var k = 0; event.parameters && k < event.parameters.length; ++k) {                var parameter = event.parameters[k];                paramsText.push("\"" + parameter.name + "\"");            }            result.push("InspectorBackend.registerEvent(\"" + domain.domain + "." + event.name + "\", [" + paramsText.join(", ") + "]);");        }    }    return result.join("\n");}InspectorBackendClass.Connection = function() {    this._lastMessageId = 1;    this._pendingResponsesCount = 0;    this._agents = {};    this._dispatchers = {};    this._callbacks = {};    this._initialize(InspectorBackend._agentPrototypes, InspectorBackend._dispatcherPrototypes);    this._isConnected = true;}InspectorBackendClass.Connection.Events = {    Disconnected: "Disconnected",}InspectorBackendClass.Connection.prototype = {    _initialize: function(agentPrototypes, dispatcherPrototypes)     {        for (var domain in agentPrototypes) {            this._agents[domain] = Object.create(agentPrototypes[domain]);            this._agents[domain].setConnection(this);        }        for (var domain in dispatcherPrototypes)            this._dispatchers[domain] = Object.create(dispatcherPrototypes[domain]);    },    registerAgentsOn: function(object)     {        for (var domain in this._agents)            object[domain + "Agent"] = {};    },    nextMessageId: function()     {        return this._lastMessageId++;    },    agent: function(domain)     {        return this._agents[domain];    },    agentsMap: function()     {        return this._agents;    },    _wrapCallbackAndSendMessageObject: function(domain, method, params, callback)     {        if (!this._isConnected && callback) {            this._dispatchConnectionErrorResponse(domain, method, callback);            return;        }        var messageObject = {};        var messageId = this.nextMessageId();        messageObject.id = messageId;        messageObject.method = method;        if (params)            messageObject.params = params;        var wrappedCallback = this._wrap(callback, domain, method);        if (InspectorBackendClass.Options.dumpInspectorProtocolMessages)            this._dumpProtocolMessage("frontend: " + JSON.stringify(messageObject));        this.sendMessage(messageObject);        ++this._pendingResponsesCount;        this._callbacks[messageId] = wrappedCallback;    },    _wrap: function(callback, domain, method)     {        if (!callback)            callback = function() {}            ;        callback.methodName = method;        callback.domain = domain;        if (InspectorBackendClass.Options.dumpInspectorTimeStats)            callback.sendRequestTime = Date.now();        return callback;    },    sendMessage: function(messageObject)     {        throw "Not implemented";    },    dispatch: function(message)     {        if (InspectorBackendClass.Options.dumpInspectorProtocolMessages)            this._dumpProtocolMessage("backend: " + ((typeof message === "string") ? message : JSON.stringify(message)));        var messageObject = ((typeof message === "string") ? JSON.parse(message) : message);        if ("id" in messageObject) {            var callback = this._callbacks[messageObject.id];            if (!callback) {                InspectorBackendClass.reportProtocolError("Protocol Error: the message with wrong id", messageObject);                return;            }            var processingStartTime;            if (InspectorBackendClass.Options.dumpInspectorTimeStats)                processingStartTime = Date.now();            this.agent(callback.domain).dispatchResponse(messageObject, callback.methodName, callback);            --this._pendingResponsesCount;            delete this._callbacks[messageObject.id];            if (InspectorBackendClass.Options.dumpInspectorTimeStats)                console.log("time-stats: " + callback.methodName + " = " + (processingStartTime - callback.sendRequestTime) + " + " + (Date.now() - processingStartTime));            if (this._scripts && !this._pendingResponsesCount)                this.runAfterPendingDispatches();            return;        } else {            if (messageObject.error) {                InspectorBackendClass.reportProtocolError("Generic message format error", messageObject);                return;            }            var method = messageObject.method.split(".");            var domainName = method[0];            if (!(domainName in this._dispatchers)) {                InspectorBackendClass.reportProtocolError("Protocol Error: the message " + messageObject.method + " is for non-existing domain '" + domainName + "'", messageObject);                return;            }            this._dispatchers[domainName].dispatch(method[1], messageObject);        }    },    registerDispatcher: function(domain, dispatcher)     {        if (!this._dispatchers[domain])            return;        this._dispatchers[domain].setDomainDispatcher(dispatcher);    },    runAfterPendingDispatches: function(script)     {        if (!this._scripts)            this._scripts = [];        if (script)            this._scripts.push(script);        setTimeout(function() {            if (!this._pendingResponsesCount)                this._executeAfterPendingDispatches();            else                this.runAfterPendingDispatches();        }        .bind(this), 0);    },    _executeAfterPendingDispatches: function()     {        if (!this._pendingResponsesCount) {            var scripts = this._scripts;            this._scripts = [];            for (var id = 0; id < scripts.length; ++id)                scripts[id].call(this);        }    },    _dumpProtocolMessage: function(message)     {        console.log(message);    },    connectionClosed: function(reason)     {        this._isConnected = false;        this._runPendingCallbacks();        this.dispatchEventToListeners(InspectorBackendClass.Connection.Events.Disconnected, {            reason: reason        });    },    _runPendingCallbacks: function()     {        var keys = Object.keys(this._callbacks).map(function(num) {            return parseInt(num, 10);        }        );        for (var i = 0; i < keys.length; ++i) {            var callback = this._callbacks[keys[i]];            this._dispatchConnectionErrorResponse(callback.domain, callback.methodName, callback);        }        this._callbacks = {};    },    _dispatchConnectionErrorResponse: function(domain, methodName, callback)     {        var error = {            message: "Connection is closed, can't dispatch pending " + methodName,            code: InspectorBackendClass._DevToolsErrorCode,            data: null         };        var messageObject = {            error: error        };        setTimeout(InspectorBackendClass.AgentPrototype.prototype.dispatchResponse.bind(this.agent(domain), messageObject, methodName, callback), 0);    },    isClosed: function()     {        return !this._isConnected;    },    suppressErrorsForDomains: function(domains)     {        domains.forEach(function(domain) {            this._agents[domain].suppressErrorLogging();        }        , this);    },    __proto__: WebInspector.Object.prototype}InspectorBackendClass.MainConnection = function() {    InspectorBackendClass.Connection.call(this);    InspectorFrontendHost.events.addEventListener(InspectorFrontendHostAPI.Events.DispatchMessage, this._dispatchMessage, this);    InspectorFrontendHost.events.addEventListener(InspectorFrontendHostAPI.Events.DispatchMessageChunk, this._dispatchMessageChunk, this);}InspectorBackendClass.MainConnection.prototype = {    sendMessage: function(messageObject)     {        var message = JSON.stringify(messageObject);        InspectorFrontendHost.sendMessageToBackend(message);    },    _dispatchMessage: function(event)     {        this.dispatch((event.data));    },    _dispatchMessageChunk: function(event)     {        var messageChunk = (event.data["messageChunk"]);        var messageSize = (event.data["messageSize"]);        if (messageSize) {            this._messageBuffer = "";            this._messageSize = messageSize;        }        this._messageBuffer += messageChunk;        if (this._messageBuffer.length === this._messageSize) {            this.dispatch(this._messageBuffer);            this._messageBuffer = "";            this._messageSize = 0;        }    },    __proto__: InspectorBackendClass.Connection.prototype}InspectorBackendClass.WebSocketConnection = function(url, onConnectionReady) {    InspectorBackendClass.Connection.call(this);    this._socket = new WebSocket(url);    this._socket.onmessage = this._onMessage.bind(this);    this._socket.onerror = this._onError.bind(this);    this._socket.onopen = onConnectionReady.bind(null , this);    this._socket.onclose = this.connectionClosed.bind(this, "websocket_closed");}InspectorBackendClass.WebSocketConnection.Create = function(url, onConnectionReady) {    new InspectorBackendClass.WebSocketConnection(url,onConnectionReady);}InspectorBackendClass.WebSocketConnection.prototype = {    _onMessage: function(message)     {        var data = (message.data);        this.dispatch(data);    },    _onError: function(error)     {        console.error(error);    },    sendMessage: function(messageObject)     {        var message = JSON.stringify(messageObject);        this._socket.send(message);    },    __proto__: InspectorBackendClass.Connection.prototype}InspectorBackendClass.StubConnection = function() {    InspectorBackendClass.Connection.call(this);}InspectorBackendClass.StubConnection.prototype = {    sendMessage: function(messageObject)     {        setTimeout(this._echoResponse.bind(this, messageObject), 0);    },    _echoResponse: function(messageObject)     {        this.dispatch(messageObject);    },    __proto__: InspectorBackendClass.Connection.prototype}InspectorBackendClass.AgentPrototype = function(domain) {    this._replyArgs = {};    this._hasErrorData = {};    this._domain = domain;    this._suppressErrorLogging = false;    this._promisified = domain in InspectorBackendClass.AgentPrototype.PromisifiedDomains;}InspectorBackendClass.AgentPrototype.PromisifiedDomains = {    "CSS": true,    "Profiler": true}InspectorBackendClass.AgentPrototype.prototype = {    setConnection: function(connection)     {        this._connection = connection;    },    registerCommand: function(methodName, signature, replyArgs, hasErrorData)     {        var domainAndMethod = this._domain + "." + methodName;        function sendMessage(vararg)         {            var params = Array.prototype.slice.call(arguments);            InspectorBackendClass.AgentPrototype.prototype._sendMessageToBackend.call(this, domainAndMethod, signature, params);        }        function sendMessagePromise(vararg)         {            var params = Array.prototype.slice.call(arguments);            return InspectorBackendClass.AgentPrototype.prototype._sendMessageToBackendPromise.call(this, domainAndMethod, signature, replyArgs, params);        }        this[methodName] = this._promisified ? sendMessagePromise : sendMessage;        function invoke(vararg)         {            var params = [domainAndMethod].concat(Array.prototype.slice.call(arguments));            InspectorBackendClass.AgentPrototype.prototype._invoke.apply(this, params);        }        this["invoke_" + methodName] = invoke;        this._replyArgs[domainAndMethod] = replyArgs;        if (hasErrorData)            this._hasErrorData[domainAndMethod] = true;    },    _prepareParameters: function(method, signature, args, allowExtraUndefinedArg, errorCallback)     {        var params = {};        var hasParams = false;        for (var i = 0; i < signature.length; ++i) {            var param = signature[i];            var paramName = param["name"];            var typeName = param["type"];            var optionalFlag = param["optional"];            if (!args.length && !optionalFlag) {                errorCallback("Protocol Error: Invalid number of arguments for method '" + method + "' call. It must have the following arguments '" + JSON.stringify(signature) + "'.");                return null ;            }            var value = args.shift();            if (optionalFlag && typeof value === "undefined")                continue;if (typeof value !== typeName) {                errorCallback("Protocol Error: Invalid type of argument '" + paramName + "' for method '" + method + "' call. It must be '" + typeName + "' but it is '" + typeof value + "'.");                return null ;            }            params[paramName] = value;            hasParams = true;        }        if (args.length === 1 && (!allowExtraUndefinedArg || (typeof args[0] !== "undefined"))) {            errorCallback("Protocol Error: Optional callback argument for method '" + method + "' call must be a function but its type is '" + typeof args[0] + "'.");            return null ;        }        if (args.length > 1) {            errorCallback("Protocol Error: Extra " + args.length + " arguments in a call to method '" + method + "'.");            return null ;        }        return hasParams ? params : null     },    _sendMessageToBackend: function(method, signature, args)     {        var errorMessage;        function onError(message)         {            console.error(message)            errorMessage = message;        }        var callback = (args.length && typeof args.peekLast() === "function") ? args.pop() : null ;        var params = this._prepareParameters(method, signature, args, !callback, onError);        if (errorMessage)            return;        this._connection._wrapCallbackAndSendMessageObject(this._domain, method, params, callback);    },    _sendMessageToBackendPromise: function(method, signature, replyArgs, args)     {        var errorMessage;        function onError(message)         {            console.error(message)            errorMessage = message;        }        var userCallback = (args.length && typeof args.peekLast() === "function") ? args.pop() : null ;        var params = this._prepareParameters(method, signature, args, false, onError);        if (errorMessage)            return Promise.reject(new Error(errorMessage));        else            return new Promise(promiseAction.bind(this));        function promiseAction(resolve, reject)         {            function callback(vararg)             {                var result = userCallback ? userCallback.apply(null , arguments) : undefined;                resolve(result);            }            this._connection._wrapCallbackAndSendMessageObject(this._domain, method, params, callback);        }    },    _invoke: function(method, args, callback)     {        this._connection._wrapCallbackAndSendMessageObject(this._domain, method, args, callback);    },    dispatchResponse: function(messageObject, methodName, callback)     {        if (messageObject.error && messageObject.error.code !== InspectorBackendClass._DevToolsErrorCode && !InspectorBackendClass.Options.suppressRequestErrors && !this._suppressErrorLogging) {            var id = InspectorFrontendHost.isUnderTest() ? "##" : messageObject.id;            console.error("Request with id = " + id + " failed. " + JSON.stringify(messageObject.error));        }        var argumentsArray = [];        argumentsArray[0] = messageObject.error ? messageObject.error.message : null ;        if (this._hasErrorData[methodName])            argumentsArray[1] = messageObject.error ? messageObject.error.data : null ;        if (messageObject.result) {            var paramNames = this._replyArgs[methodName] || [];            for (var i = 0; i < paramNames.length; ++i)                argumentsArray.push(messageObject.result[paramNames[i]]);        }        callback.apply(null , argumentsArray);    },    suppressErrorLogging: function()     {        this._suppressErrorLogging = true;    }}InspectorBackendClass.DispatcherPrototype = function() {    this._eventArgs = {};    this._dispatcher = null ;}InspectorBackendClass.DispatcherPrototype.prototype = {    registerEvent: function(eventName, params)     {        this._eventArgs[eventName] = params;    },    setDomainDispatcher: function(dispatcher)     {        this._dispatcher = dispatcher;    },    dispatch: function(functionName, messageObject)     {        if (!this._dispatcher)            return;        if (!(functionName in this._dispatcher)) {            InspectorBackendClass.reportProtocolError("Protocol Error: Attempted to dispatch an unimplemented method '" + messageObject.method + "'", messageObject);            return;        }        if (!this._eventArgs[messageObject.method]) {            InspectorBackendClass.reportProtocolError("Protocol Error: Attempted to dispatch an unspecified method '" + messageObject.method + "'", messageObject);            return;        }        var params = [];        if (messageObject.params) {            var paramNames = this._eventArgs[messageObject.method];            for (var i = 0; i < paramNames.length; ++i)                params.push(messageObject.params[paramNames[i]]);        }        var processingStartTime;        if (InspectorBackendClass.Options.dumpInspectorTimeStats)            processingStartTime = Date.now();        this._dispatcher[functionName].apply(this._dispatcher, params);        if (InspectorBackendClass.Options.dumpInspectorTimeStats)            console.log("time-stats: " + messageObject.method + " = " + (Date.now() - processingStartTime));    }}InspectorBackendClass.Options = {    dumpInspectorTimeStats: false,    dumpInspectorProtocolMessages: false,    suppressRequestErrors: false}InspectorBackend = new InspectorBackendClass();;InspectorBackend.registerEvent("Inspector.evaluateForTestInFrontend", ["testCallId", "script"]);InspectorBackend.registerEvent("Inspector.inspect", ["object", "hints"]);InspectorBackend.registerEvent("Inspector.detached", ["reason"]);InspectorBackend.registerEvent("Inspector.targetCrashed", []);InspectorBackend.registerCommand("Inspector.enable", [], [], false);InspectorBackend.registerCommand("Inspector.disable", [], [], false);InspectorBackend.registerCommand("Memory.getDOMCounters", [], ["documents", "nodes", "jsEventListeners"], false);InspectorBackend.registerEnum("Page.ResourceType", {    Document: "Document",    Stylesheet: "Stylesheet",    Image: "Image",    Media: "Media",    Font: "Font",    Script: "Script",    TextTrack: "TextTrack",    XHR: "XHR",    WebSocket: "WebSocket",    Other: "Other"});InspectorBackend.registerEnum("Page.DialogType", {    Alert: "alert",    Confirm: "confirm",    Prompt: "prompt",    Beforeunload: "beforeunload"});InspectorBackend.registerEvent("Page.domContentEventFired", ["timestamp"]);InspectorBackend.registerEvent("Page.loadEventFired", ["timestamp"]);InspectorBackend.registerEvent("Page.frameAttached", ["frameId", "parentFrameId"]);InspectorBackend.registerEvent("Page.frameNavigated", ["frame"]);InspectorBackend.registerEvent("Page.frameDetached", ["frameId"]);InspectorBackend.registerEvent("Page.frameStartedLoading", ["frameId"]);InspectorBackend.registerEvent("Page.frameStoppedLoading", ["frameId"]);InspectorBackend.registerEvent("Page.frameScheduledNavigation", ["frameId", "delay"]);InspectorBackend.registerEvent("Page.frameClearedScheduledNavigation", ["frameId"]);InspectorBackend.registerEvent("Page.frameResized", []);InspectorBackend.registerEvent("Page.javascriptDialogOpening", ["message", "type"]);InspectorBackend.registerEvent("Page.javascriptDialogClosed", ["result"]);InspectorBackend.registerEvent("Page.screencastFrame", ["data", "metadata", "frameNumber"]);InspectorBackend.registerEvent("Page.screencastVisibilityChanged", ["visible"]);InspectorBackend.registerEvent("Page.colorPicked", ["color"]);InspectorBackend.registerEvent("Page.interstitialShown", []);InspectorBackend.registerEvent("Page.interstitialHidden", []);InspectorBackend.registerCommand("Page.enable", [], [], false);InspectorBackend.registerCommand("Page.disable", [], [], false);InspectorBackend.registerCommand("Page.addScriptToEvaluateOnLoad", [{    "name": "scriptSource",    "type": "string",    "optional": false}], ["identifier"], false);InspectorBackend.registerCommand("Page.removeScriptToEvaluateOnLoad", [{    "name": "identifier",    "type": "string",    "optional": false}], [], false);InspectorBackend.registerCommand("Page.reload", [{    "name": "ignoreCache",    "type": "boolean",    "optional": true}, {    "name": "scriptToEvaluateOnLoad",    "type": "string",    "optional": true}], [], false);InspectorBackend.registerCommand("Page.navigate", [{    "name": "url",    "type": "string",    "optional": false}], ["frameId"], false);InspectorBackend.registerCommand("Page.getNavigationHistory", [], ["currentIndex", "entries"], false);InspectorBackend.registerCommand("Page.navigateToHistoryEntry", [{    "name": "entryId",    "type": "number",    "optional": false}], [], false);InspectorBackend.registerCommand("Page.getCookies", [], ["cookies"], false);InspectorBackend.registerCommand("Page.deleteCookie", [{    "name": "cookieName",    "type": "string",    "optional": false}, {    "name": "url",    "type": "string",    "optional": false}], [], false);InspectorBackend.registerCommand("Page.getResourceTree", [], ["frameTree"], false);InspectorBackend.registerCommand("Page.getResourceContent", [{    "name": "frameId",    "type": "string",    "optional": false}, {    "name": "url",    "type": "string",    "optional": false}], ["content", "base64Encoded"], false);InspectorBackend.registerCommand("Page.searchInResource", [{    "name": "frameId",    "type": "string",    "optional": false}, {    "name": "url",    "type": "string",    "optional": false}, {    "name": "query",    "type": "string",    "optional": false}, {    "name": "caseSensitive",    "type": "boolean",    "optional": true}, {    "name": "isRegex",    "type": "boolean",    "optional": true}], ["result"], false);InspectorBackend.registerCommand("Page.setDocumentContent", [{    "name": "frameId",    "type": "string",    "optional": false}, {    "name": "html",    "type": "string",    "optional": false}], [], false);InspectorBackend.registerCommand("Page.setDeviceMetricsOverride", [{    "name": "width",    "type": "number",    "optional": false}, {    "name": "height",    "type": "number",    "optional": false}, {    "name": "deviceScaleFactor",    "type": "number",    "optional": false}, {    "name": "mobile",    "type": "boolean",    "optional": false}, {    "name": "fitWindow",    "type": "boolean",    "optional": false}, {    "name": "scale",    "type": "number",    "optional": true}, {    "name": "offsetX",    "type": "number",    "optional": true}, {    "name": "offsetY",    "type": "number",    "optional": true}, {    "name": "screenWidth",    "type": "number",    "optional": true}, {    "name": "screenHeight",    "type": "number",    "optional": true}, {    "name": "positionX",    "type": "number",    "optional": true}, {    "name": "positionY",    "type": "number",    "optional": true}], [], false);InspectorBackend.registerCommand("Page.clearDeviceMetricsOverride", [], [], false);InspectorBackend.registerCommand("Page.setGeolocationOverride", [{    "name": "latitude",    "type": "number",    "optional": true}, {    "name": "longitude",    "type": "number",    "optional": true}, {    "name": "accuracy",    "type": "number",    "optional": true}], [], false);InspectorBackend.registerCommand("Page.clearGeolocationOverride", [], [], false);InspectorBackend.registerCommand("Page.setDeviceOrientationOverride", [{    "name": "alpha",    "type": "number",    "optional": false}, {    "name": "beta",    "type": "number",    "optional": false}, {    "name": "gamma",    "type": "number",    "optional": false}], [], false);InspectorBackend.registerCommand("Page.clearDeviceOrientationOverride", [], [], false);InspectorBackend.registerCommand("Page.setTouchEmulationEnabled", [{    "name": "enabled",    "type": "boolean",    "optional": false}, {    "name": "configuration",    "type": "string",    "optional": true}], [], false);InspectorBackend.registerCommand("Page.captureScreenshot", [], ["data"], false);InspectorBackend.registerCommand("Page.canScreencast", [], ["result"], false);InspectorBackend.registerCommand("Page.startScreencast", [{    "name": "format",    "type": "string",    "optional": true}, {    "name": "quality",    "type": "number",    "optional": true}, {    "name": "maxWidth",    "type": "number",    "optional": true}, {    "name": "maxHeight",    "type": "number",    "optional": true}], [], false);InspectorBackend.registerCommand("Page.stopScreencast", [], [], false);InspectorBackend.registerCommand("Page.screencastFrameAck", [{    "name": "frameNumber",    "type": "number",    "optional": false}], [], false);InspectorBackend.registerCommand("Page.handleJavaScriptDialog", [{    "name": "accept",    "type": "boolean",    "optional": false}, {    "name": "promptText",    "type": "string",    "optional": true}], [], false);InspectorBackend.registerCommand("Page.setShowViewportSizeOnResize", [{    "name": "show",    "type": "boolean",    "optional": false}, {    "name": "showGrid",    "type": "boolean",    "optional": true}], [], false);InspectorBackend.registerCommand("Page.setColorPickerEnabled", [{    "name": "enabled",    "type": "boolean",    "optional": false}], [], false);InspectorBackend.registerCommand("Page.setOverlayMessage", [{    "name": "message",    "type": "string",    "optional": true}], [], false);InspectorBackend.registerCommand("Rendering.setShowPaintRects", [{    "name": "result",    "type": "boolean",    "optional": false}], [], false);InspectorBackend.registerCommand("Rendering.setShowDebugBorders", [{    "name": "show",    "type": "boolean",    "optional": false}], [], false);InspectorBackend.registerCommand("Rendering.setShowFPSCounter", [{    "name": "show",    "type": "boolean",    "optional": false}], [], false);InspectorBackend.registerCommand("Rendering.setContinuousPaintingEnabled", [{    "name": "enabled",    "type": "boolean",    "optional": false}], [], false);InspectorBackend.registerCommand("Rendering.setShowScrollBottleneckRects", [{    "name": "show",    "type": "boolean",    "optional": false}], [], false);InspectorBackend.registerEvent("Emulation.viewportChanged", ["viewport"]);InspectorBackend.registerCommand("Emulation.setDeviceMetricsOverride", [{    "name": "width",    "type": "number",    "optional": false}, {    "name": "height",    "type": "number",    "optional": false}, {    "name": "deviceScaleFactor",    "type": "number",    "optional": false}, {    "name": "mobile",    "type": "boolean",    "optional": false}, {    "name": "fitWindow",    "type": "boolean",    "optional": false}, {    "name": "scale",    "type": "number",    "optional": true}, {    "name": "offsetX",    "type": "number",    "optional": true}, {    "name": "offsetY",    "type": "number",    "optional": true}, {    "name": "screenWidth",    "type": "number",    "optional": true}, {    "name": "screenHeight",    "type": "number",    "optional": true}, {    "name": "positionX",    "type": "number",    "optional": true}, {    "name": "positionY",    "type": "number",    "optional": true}], [], false);InspectorBackend.registerCommand("Emulation.clearDeviceMetricsOverride", [], [], false);InspectorBackend.registerCommand("Emulation.resetScrollAndPageScaleFactor", [], [], false);InspectorBackend.registerCommand("Emulation.setPageScaleFactor", [{    "name": "pageScaleFactor",    "type": "number",    "optional": false}], [], false);InspectorBackend.registerCommand("Emulation.setScriptExecutionDisabled", [{    "name": "value",    "type": "boolean",    "optional": false}], [], false);InspectorBackend.registerCommand("Emulation.setGeolocationOverride", [{    "name": "latitude",    "type": "number",    "optional": true}, {    "name": "longitude",    "type": "number",    "optional": true}, {    "name": "accuracy",    "type": "number",    "optional": true}], [], false);InspectorBackend.registerCommand("Emulation.clearGeolocationOverride", [], [], false);InspectorBackend.registerCommand("Emulation.setTouchEmulationEnabled", [{    "name": "enabled",    "type": "boolean",    "optional": false}, {    "name": "configuration",    "type": "string",    "optional": true}], [], false);InspectorBackend.registerCommand("Emulation.setEmulatedMedia", [{    "name": "media",    "type": "string",    "optional": false}], [], false);InspectorBackend.registerCommand("Emulation.canEmulate", [], ["result"], false);InspectorBackend.registerEnum("Runtime.RemoteObjectType", {    Object: "object",    Function: "function",    Undefined: "undefined",    String: "string",    Number: "number",    Boolean: "boolean",    Symbol: "symbol"});InspectorBackend.registerEnum("Runtime.RemoteObjectSubtype", {    Array: "array",    Null: "null",    Node: "node",    Regexp: "regexp",    Date: "date",    Map: "map",    Set: "set",    Iterator: "iterator",    Generator: "generator",    Error: "error"});InspectorBackend.registerEnum("Runtime.ObjectPreviewType", {    Object: "object",    Function: "function",    Undefined: "undefined",    String: "string",    Number: "number",    Boolean: "boolean",    Symbol: "symbol"});InspectorBackend.registerEnum("Runtime.ObjectPreviewSubtype", {    Array: "array",    Null: "null",    Node: "node",    Regexp: "regexp",    Date: "date",    Map: "map",    Set: "set",    Iterator: "iterator",    Generator: "generator",    Error: "error"});InspectorBackend.registerEnum("Runtime.PropertyPreviewType", {    Object: "object",    Function: "function",    Undefined: "undefined",    String: "string",    Number: "number",    Boolean: "boolean",    Symbol: "symbol",    Accessor: "accessor"});InspectorBackend.registerEnum("Runtime.PropertyPreviewSubtype", {    Array: "array",    Null: "null",    Node: "node",    Regexp: "regexp",    Date: "date",    Map: "map",    Set: "set",    Iterator: "iterator",    Generator: "generator",    Error: "error"});InspectorBackend.registerEnum("Runtime.CallArgumentType", {    Object: "object",    Function: "function",    Undefined: "undefined",    String: "string",    Number: "number",    Boolean: "boolean",    Symbol: "symbol"});InspectorBackend.registerEvent("Runtime.executionContextCreated", ["context"]);InspectorBackend.registerEvent("Runtime.executionContextDestroyed", ["executionContextId"]);InspectorBackend.registerEvent("Runtime.executionContextsCleared", []);InspectorBackend.registerCommand("Runtime.evaluate", [{    "name": "expression",    "type": "string",    "optional": false}, {    "name": "objectGroup",    "type": "string",    "optional": true}, {    "name": "includeCommandLineAPI",    "type": "boolean",    "optional": true}, {    "name": "doNotPauseOnExceptionsAndMuteConsole",    "type": "boolean",    "optional": true}, {    "name": "contextId",    "type": "number",    "optional": true}, {    "name": "returnByValue",    "type": "boolean",    "optional": true}, {    "name": "generatePreview",    "type": "boolean",    "optional": true}], ["result", "wasThrown", "exceptionDetails"], false);InspectorBackend.registerCommand("Runtime.callFunctionOn", [{    "name": "objectId",    "type": "string",    "optional": false}, {    "name": "functionDeclaration",    "type": "string",    "optional": false}, {    "name": "arguments",    "type": "object",    "optional": true}, {    "name": "doNotPauseOnExceptionsAndMuteConsole",    "type": "boolean",    "optional": true}, {    "name": "returnByValue",    "type": "boolean",    "optional": true}, {    "name": "generatePreview",    "type": "boolean",    "optional": true}], ["result", "wasThrown"], false);InspectorBackend.registerCommand("Runtime.getProperties", [{    "name": "objectId",    "type": "string",    "optional": false}, {    "name": "ownProperties",    "type": "boolean",    "optional": true}, {    "name": "accessorPropertiesOnly",    "type": "boolean",    "optional": true}, {    "name": "generatePreview",    "type": "boolean",    "optional": true}], ["result", "internalProperties", "exceptionDetails"], false);InspectorBackend.registerCommand("Runtime.releaseObject", [{    "name": "objectId",    "type": "string",    "optional": false}], [], false);InspectorBackend.registerCommand("Runtime.releaseObjectGroup", [{    "name": "objectGroup",    "type": "string",    "optional": false}], [], false);InspectorBackend.registerCommand("Runtime.run", [], [], false);InspectorBackend.registerCommand("Runtime.enable", [], [], false);InspectorBackend.registerCommand("Runtime.disable", [], [], false);InspectorBackend.registerCommand("Runtime.isRunRequired", [], ["result"], false);InspectorBackend.registerCommand("Runtime.setCustomObjectFormatterEnabled", [{    "name": "enabled",    "type": "boolean",    "optional": false}], [], false);InspectorBackend.registerEnum("Console.ConsoleMessageSource", {    XML: "xml",    Javascript: "javascript",    Network: "network",    ConsoleAPI: "console-api",    Storage: "storage",    Appcache: "appcache",    Rendering: "rendering",    Security: "security",    Other: "other",    Deprecation: "deprecation"});InspectorBackend.registerEnum("Console.ConsoleMessageLevel", {    Log: "log",    Warning: "warning",    Error: "error",    Debug: "debug",    Info: "info",    RevokedError: "revokedError"});InspectorBackend.registerEnum("Console.ConsoleMessageType", {    Log: "log",    Dir: "dir",    DirXML: "dirxml",    Table: "table",    Trace: "trace",    Clear: "clear",    StartGroup: "startGroup",    StartGroupCollapsed: "startGroupCollapsed",    EndGroup: "endGroup",    Assert: "assert",    Profile: "profile",    ProfileEnd: "profileEnd"});InspectorBackend.registerEvent("Console.messageAdded", ["message"]);InspectorBackend.registerEvent("Console.messageRepeatCountUpdated", ["count", "timestamp"]);InspectorBackend.registerEvent("Console.messagesCleared", []);InspectorBackend.registerCommand("Console.enable", [], [], false);InspectorBackend.registerCommand("Console.disable", [], [], false);InspectorBackend.registerCommand("Console.clearMessages", [], [], false);InspectorBackend.registerEnum("Network.InitiatorType", {    Parser: "parser",    Script: "script",    Other: "other"});InspectorBackend.registerEvent("Network.requestWillBeSent", ["requestId", "frameId", "loaderId", "documentURL", "request", "timestamp", "wallTime", "initiator", "redirectResponse", "type"]);InspectorBackend.registerEvent("Network.requestServedFromCache", ["requestId"]);InspectorBackend.registerEvent("Network.responseReceived", ["requestId", "frameId", "loaderId", "timestamp", "type", "response"]);InspectorBackend.registerEvent("Network.dataReceived", ["requestId", "timestamp", "dataLength", "encodedDataLength"]);InspectorBackend.registerEvent("Network.loadingFinished", ["requestId", "timestamp", "encodedDataLength"]);InspectorBackend.registerEvent("Network.loadingFailed", ["requestId", "timestamp", "type", "errorText", "canceled"]);InspectorBackend.registerEvent("Network.webSocketWillSendHandshakeRequest", ["requestId", "timestamp", "wallTime", "request"]);InspectorBackend.registerEvent("Network.webSocketHandshakeResponseReceived", ["requestId", "timestamp", "response"]);InspectorBackend.registerEvent("Network.webSocketCreated", ["requestId", "url"]);InspectorBackend.registerEvent("Network.webSocketClosed", ["requestId", "timestamp"]);InspectorBackend.registerEvent("Network.webSocketFrameReceived", ["requestId", "timestamp", "response"]);InspectorBackend.registerEvent("Network.webSocketFrameError", ["requestId", "timestamp", "errorMessage"]);InspectorBackend.registerEvent("Network.webSocketFrameSent", ["requestId", "timestamp", "response"]);InspectorBackend.registerEvent("Network.eventSourceMessageReceived", ["requestId", "timestamp", "eventName", "eventId", "data"]);InspectorBackend.registerCommand("Network.enable", [], [], false);InspectorBackend.registerCommand("Network.disable", [], [], false);InspectorBackend.registerCommand("Network.setUserAgentOverride", [{    "name": "userAgent",    "type": "string",    "optional": false}], [], false);InspectorBackend.registerCommand("Network.setExtraHTTPHeaders", [{    "name": "headers",    "type": "object",    "optional": false}], [], false);InspectorBackend.registerCommand("Network.getResponseBody", [{    "name": "requestId",    "type": "string",    "optional": false}], ["body", "base64Encoded"], false);InspectorBackend.registerCommand("Network.replayXHR", [{    "name": "requestId",    "type": "string",    "optional": false}], [], false);InspectorBackend.registerCommand("Network.setMonitoringXHREnabled", [{    "name": "enabled",    "type": "boolean",    "optional": false}], [], false);InspectorBackend.registerCommand("Network.canClearBrowserCache", [], ["result"], false);InspectorBackend.registerCommand("Network.clearBrowserCache", [], [], false);InspectorBackend.registerCommand("Network.canClearBrowserCookies", [], ["result"], false);InspectorBackend.registerCommand("Network.clearBrowserCookies", [], [], false);InspectorBackend.registerCommand("Network.getCookies", [], ["cookies"], false);InspectorBackend.registerCommand("Network.deleteCookie", [{    "name": "cookieName",    "type": "string",    "optional": false}, {    "name": "url",    "type": "string",    "optional": false}], [], false);InspectorBackend.registerCommand("Network.canEmulateNetworkConditions", [], ["result"], false);InspectorBackend.registerCommand("Network.emulateNetworkConditions", [{    "name": "offline",    "type": "boolean",    "optional": false}, {    "name": "latency",    "type": "number",    "optional": false}, {    "name": "downloadThroughput",    "type": "number",    "optional": false}, {    "name": "uploadThroughput",    "type": "number",    "optional": false}], [], false);InspectorBackend.registerCommand("Network.setCacheDisabled", [{    "name": "cacheDisabled",    "type": "boolean",    "optional": false}], [], false);InspectorBackend.registerCommand("Network.setDataSizeLimitsForTest", [{    "name": "maxTotalSize",    "type": "number",    "optional": false}, {    "name": "maxResourceSize",    "type": "number",    "optional": false}], [], false);InspectorBackend.registerEvent("Database.addDatabase", ["database"]);InspectorBackend.registerCommand("Database.enable", [], [], false);InspectorBackend.registerCommand("Database.disable", [], [], false);InspectorBackend.registerCommand("Database.getDatabaseTableNames", [{    "name": "databaseId",    "type": "string",    "optional": false}], ["tableNames"], false);InspectorBackend.registerCommand("Database.executeSQL", [{    "name": "databaseId",    "type": "string",    "optional": false}, {    "name": "query",    "type": "string",    "optional": false}], ["columnNames", "values", "sqlError"], false);InspectorBackend.registerEnum("IndexedDB.KeyType", {    Number: "number",    String: "string",    Date: "date",    Array: "array"});InspectorBackend.registerEnum("IndexedDB.KeyPathType", {    Null: "null",    String: "string",    Array: "array"});InspectorBackend.registerCommand("IndexedDB.enable", [], [], false);InspectorBackend.registerCommand("IndexedDB.disable", [], [], false);InspectorBackend.registerCommand("IndexedDB.requestDatabaseNames", [{    "name": "securityOrigin",    "type": "string",    "optional": false}], ["databaseNames"], false);InspectorBackend.registerCommand("IndexedDB.requestDatabase", [{    "name": "securityOrigin",    "type": "string",    "optional": false}, {    "name": "databaseName",    "type": "string",    "optional": false}], ["databaseWithObjectStores"], false);InspectorBackend.registerCommand("IndexedDB.requestData", [{    "name": "securityOrigin",    "type": "string",    "optional": false}, {    "name": "databaseName",    "type": "string",    "optional": false}, {    "name": "objectStoreName",    "type": "string",    "optional": false}, {    "name": "indexName",    "type": "string",    "optional": false}, {    "name": "skipCount",    "type": "number",    "optional": false}, {    "name": "pageSize",    "type": "number",    "optional": false}, {    "name": "keyRange",    "type": "object",    "optional": true}], ["objectStoreDataEntries", "hasMore"], false);InspectorBackend.registerCommand("IndexedDB.clearObjectStore", [{    "name": "securityOrigin",    "type": "string",    "optional": false}, {    "name": "databaseName",    "type": "string",    "optional": false}, {    "name": "objectStoreName",    "type": "string",    "optional": false}], [], false);InspectorBackend.registerCommand("CacheStorage.requestCacheNames", [{    "name": "securityOrigin",    "type": "string",    "optional": false}], ["caches"], false);InspectorBackend.registerCommand("CacheStorage.requestEntries", [{    "name": "cacheId",    "type": "string",    "optional": false}, {    "name": "skipCount",    "type": "number",    "optional": false}, {    "name": "pageSize",    "type": "number",    "optional": false}], ["cacheDataEntries", "hasMore"], false);InspectorBackend.registerCommand("CacheStorage.deleteCache", [{    "name": "cacheId",    "type": "string",    "optional": false}], [], false);InspectorBackend.registerCommand("CacheStorage.deleteEntry", [{    "name": "cacheId",    "type": "string",    "optional": false}, {    "name": "request",    "type": "string",    "optional": false}], [], false);InspectorBackend.registerEvent("DOMStorage.domStorageItemsCleared", ["storageId"]);InspectorBackend.registerEvent("DOMStorage.domStorageItemRemoved", ["storageId", "key"]);InspectorBackend.registerEvent("DOMStorage.domStorageItemAdded", ["storageId", "key", "newValue"]);InspectorBackend.registerEvent("DOMStorage.domStorageItemUpdated", ["storageId", "key", "oldValue", "newValue"]);InspectorBackend.registerCommand("DOMStorage.enable", [], [], false);InspectorBackend.registerCommand("DOMStorage.disable", [], [], false);InspectorBackend.registerCommand("DOMStorage.getDOMStorageItems", [{    "name": "storageId",    "type": "object",    "optional": false}], ["entries"], false);InspectorBackend.registerCommand("DOMStorage.setDOMStorageItem", [{    "name": "storageId",    "type": "object",    "optional": false}, {    "name": "key",    "type": "string",    "optional": false}, {    "name": "value",    "type": "string",    "optional": false}], [], false);InspectorBackend.registerCommand("DOMStorage.removeDOMStorageItem", [{    "name": "storageId",    "type": "object",    "optional": false}, {    "name": "key",    "type": "string",    "optional": false}], [], false);InspectorBackend.registerEvent("ApplicationCache.applicationCacheStatusUpdated", ["frameId", "manifestURL", "status"]);InspectorBackend.registerEvent("ApplicationCache.networkStateUpdated", ["isNowOnline"]);InspectorBackend.registerCommand("ApplicationCache.getFramesWithManifests", [], ["frameIds"], false);InspectorBackend.registerCommand("ApplicationCache.enable", [], [], false);InspectorBackend.registerCommand("ApplicationCache.getManifestForFrame", [{    "name": "frameId",    "type": "string",    "optional": false}], ["manifestURL"], false);InspectorBackend.registerCommand("ApplicationCache.getApplicationCacheForFrame", [{    "name": "frameId",    "type": "string",    "optional": false}], ["applicationCache"], false);InspectorBackend.registerCommand("FileSystem.enable", [], [], false);InspectorBackend.registerCommand("FileSystem.disable", [], [], false);InspectorBackend.registerCommand("FileSystem.requestFileSystemRoot", [{    "name": "origin",    "type": "string",    "optional": false}, {    "name": "type",    "type": "string",    "optional": false}], ["errorCode", "root"], false);InspectorBackend.registerCommand("FileSystem.requestDirectoryContent", [{    "name": "url",    "type": "string",    "optional": false}], ["errorCode", "entries"], false);InspectorBackend.registerCommand("FileSystem.requestMetadata", [{    "name": "url",    "type": "string",    "optional": false}], ["errorCode", "metadata"], false);InspectorBackend.registerCommand("FileSystem.requestFileContent", [{    "name": "url",    "type": "string",    "optional": false}, {    "name": "readAsText",    "type": "boolean",    "optional": false}, {    "name": "start",    "type": "number",    "optional": true}, {    "name": "end",    "type": "number",    "optional": true}, {    "name": "charset",    "type": "string",    "optional": true}], ["errorCode", "content", "charset"], false);InspectorBackend.registerCommand("FileSystem.deleteEntry", [{    "name": "url",    "type": "string",    "optional": false}], ["errorCode"], false);InspectorBackend.registerEnum("DOM.PseudoType", {    FirstLine: "first-line",    FirstLetter: "first-letter",    Before: "before",    After: "after",    Backdrop: "backdrop",    Selection: "selection",    FirstLineInherited: "first-line-inherited",    Scrollbar: "scrollbar",    ScrollbarThumb: "scrollbar-thumb",    ScrollbarButton: "scrollbar-button",    ScrollbarTrack: "scrollbar-track",    ScrollbarTrackPiece: "scrollbar-track-piece",    ScrollbarCorner: "scrollbar-corner",    Resizer: "resizer",    InputListButton: "input-list-button"});InspectorBackend.registerEnum("DOM.ShadowRootType", {    UserAgent: "user-agent",    Author: "author"});InspectorBackend.registerEvent("DOM.documentUpdated", []);InspectorBackend.registerEvent("DOM.inspectNodeRequested", ["backendNodeId"]);InspectorBackend.registerEvent("DOM.setChildNodes", ["parentId", "nodes"]);InspectorBackend.registerEvent("DOM.attributeModified", ["nodeId", "name", "value"]);InspectorBackend.registerEvent("DOM.attributeRemoved", ["nodeId", "name"]);InspectorBackend.registerEvent("DOM.inlineStyleInvalidated", ["nodeIds"]);InspectorBackend.registerEvent("DOM.characterDataModified", ["nodeId", "characterData"]);InspectorBackend.registerEvent("DOM.childNodeCountUpdated", ["nodeId", "childNodeCount"]);InspectorBackend.registerEvent("DOM.childNodeInserted", ["parentNodeId", "previousNodeId", "node"]);InspectorBackend.registerEvent("DOM.childNodeRemoved", ["parentNodeId", "nodeId"]);InspectorBackend.registerEvent("DOM.shadowRootPushed", ["hostId", "root"]);InspectorBackend.registerEvent("DOM.shadowRootPopped", ["hostId", "rootId"]);InspectorBackend.registerEvent("DOM.pseudoElementAdded", ["parentId", "pseudoElement"]);InspectorBackend.registerEvent("DOM.pseudoElementRemoved", ["parentId", "pseudoElementId"]);InspectorBackend.registerEvent("DOM.distributedNodesUpdated", ["insertionPointId", "distributedNodes"]);InspectorBackend.registerCommand("DOM.enable", [], [], false);InspectorBackend.registerCommand("DOM.disable", [], [], false);InspectorBackend.registerCommand("DOM.getDocument", [], ["root"], false);InspectorBackend.registerCommand("DOM.requestChildNodes", [{    "name": "nodeId",    "type": "number",    "optional": false}, {    "name": "depth",    "type": "number",    "optional": true}], [], false);InspectorBackend.registerCommand("DOM.querySelector", [{    "name": "nodeId",    "type": "number",    "optional": false}, {    "name": "selector",    "type": "string",    "optional": false}], ["nodeId"], false);InspectorBackend.registerCommand("DOM.querySelectorAll", [{    "name": "nodeId",    "type": "number",    "optional": false}, {    "name": "selector",    "type": "string",    "optional": false}], ["nodeIds"], false);InspectorBackend.registerCommand("DOM.setNodeName", [{    "name": "nodeId",    "type": "number",    "optional": false}, {    "name": "name",    "type": "string",    "optional": false}], ["nodeId"], false);InspectorBackend.registerCommand("DOM.setNodeValue", [{    "name": "nodeId",    "type": "number",    "optional": false}, {    "name": "value",    "type": "string",    "optional": false}], [], false);InspectorBackend.registerCommand("DOM.removeNode", [{    "name": "nodeId",    "type": "number",    "optional": false}], [], false);InspectorBackend.registerCommand("DOM.setAttributeValue", [{    "name": "nodeId",    "type": "number",    "optional": false}, {    "name": "name",    "type": "string",    "optional": false}, {    "name": "value",    "type": "string",    "optional": false}], [], false);InspectorBackend.registerCommand("DOM.setAttributesAsText", [{    "name": "nodeId",    "type": "number",    "optional": false}, {    "name": "text",    "type": "string",    "optional": false}, {    "name": "name",    "type": "string",    "optional": true}], [], false);InspectorBackend.registerCommand("DOM.removeAttribute", [{    "name": "nodeId",    "type": "number",    "optional": false}, {    "name": "name",    "type": "string",    "optional": false}], [], false);InspectorBackend.registerCommand("DOM.getOuterHTML", [{    "name": "nodeId",    "type": "number",    "optional": false}], ["outerHTML"], false);InspectorBackend.registerCommand("DOM.setOuterHTML", [{    "name": "nodeId",    "type": "number",    "optional": false}, {    "name": "outerHTML",    "type": "string",    "optional": false}], [], false);InspectorBackend.registerCommand("DOM.performSearch", [{    "name": "query",    "type": "string",    "optional": false}, {    "name": "includeUserAgentShadowDOM",    "type": "boolean",    "optional": true}], ["searchId", "resultCount"], false);InspectorBackend.registerCommand("DOM.getSearchResults", [{    "name": "searchId",    "type": "string",    "optional": false}, {    "name": "fromIndex",    "type": "number",    "optional": false}, {    "name": "toIndex",    "type": "number",    "optional": false}], ["nodeIds"], false);InspectorBackend.registerCommand("DOM.discardSearchResults", [{    "name": "searchId",    "type": "string",    "optional": false}], [], false);InspectorBackend.registerCommand("DOM.requestNode", [{    "name": "objectId",    "type": "string",    "optional": false}], ["nodeId"], false);InspectorBackend.registerCommand("DOM.setInspectModeEnabled", [{    "name": "enabled",    "type": "boolean",    "optional": false}, {    "name": "inspectUAShadowDOM",    "type": "boolean",    "optional": true}, {    "name": "highlightConfig",    "type": "object",    "optional": true}], [], false);InspectorBackend.registerCommand("DOM.highlightRect", [{    "name": "x",    "type": "number",    "optional": false}, {    "name": "y",    "type": "number",    "optional": false}, {    "name": "width",    "type": "number",    "optional": false}, {    "name": "height",    "type": "number",    "optional": false}, {    "name": "color",    "type": "object",    "optional": true}, {    "name": "outlineColor",    "type": "object",    "optional": true}], [], false);InspectorBackend.registerCommand("DOM.highlightQuad", [{    "name": "quad",    "type": "object",    "optional": false}, {    "name": "color",    "type": "object",    "optional": true}, {    "name": "outlineColor",    "type": "object",    "optional": true}], [], false);InspectorBackend.registerCommand("DOM.highlightNode", [{    "name": "highlightConfig",    "type": "object",    "optional": false}, {    "name": "nodeId",    "type": "number",    "optional": true}, {    "name": "backendNodeId",    "type": "number",    "optional": true}, {    "name": "objectId",    "type": "string",    "optional": true}], [], false);InspectorBackend.registerCommand("DOM.hideHighlight", [], [], false);InspectorBackend.registerCommand("DOM.highlightFrame", [{    "name": "frameId",    "type": "string",    "optional": false}, {    "name": "contentColor",    "type": "object",    "optional": true}, {    "name": "contentOutlineColor",    "type": "object",    "optional": true}], [], false);InspectorBackend.registerCommand("DOM.pushNodeByPathToFrontend", [{    "name": "path",    "type": "string",    "optional": false}], ["nodeId"], false);InspectorBackend.registerCommand("DOM.pushNodesByBackendIdsToFrontend", [{    "name": "backendNodeIds",    "type": "object",    "optional": false}], ["nodeIds"], false);InspectorBackend.registerCommand("DOM.setInspectedNode", [{    "name": "nodeId",    "type": "number",    "optional": false}], [], false);InspectorBackend.registerCommand("DOM.resolveNode", [{    "name": "nodeId",    "type": "number",    "optional": false}, {    "name": "objectGroup",    "type": "string",    "optional": true}], ["object"], false);InspectorBackend.registerCommand("DOM.getAttributes", [{    "name": "nodeId",    "type": "number",    "optional": false}], ["attributes"], false);InspectorBackend.registerCommand("DOM.copyTo", [{    "name": "nodeId",    "type": "number",    "optional": false}, {    "name": "targetNodeId",    "type": "number",    "optional": false}, {    "name": "insertBeforeNodeId",    "type": "number",    "optional": true}], ["nodeId"], false);InspectorBackend.registerCommand("DOM.moveTo", [{    "name": "nodeId",    "type": "number",    "optional": false}, {    "name": "targetNodeId",    "type": "number",    "optional": false}, {    "name": "insertBeforeNodeId",    "type": "number",    "optional": true}], ["nodeId"], false);InspectorBackend.registerCommand("DOM.undo", [], [], false);InspectorBackend.registerCommand("DOM.redo", [], [], false);InspectorBackend.registerCommand("DOM.markUndoableState", [], [], false);InspectorBackend.registerCommand("DOM.focus", [{    "name": "nodeId",    "type": "number",    "optional": false}], [], false);InspectorBackend.registerCommand("DOM.setFileInputFiles", [{    "name": "nodeId",    "type": "number",    "optional": false}, {    "name": "files",    "type": "object",    "optional": false}], [], false);InspectorBackend.registerCommand("DOM.getBoxModel", [{    "name": "nodeId",    "type": "number",    "optional": false}], ["model"], false);InspectorBackend.registerCommand("DOM.getNodeForLocation", [{    "name": "x",    "type": "number",    "optional": false}, {    "name": "y",    "type": "number",    "optional": false}], ["nodeId"], false);InspectorBackend.registerCommand("DOM.getRelayoutBoundary", [{    "name": "nodeId",    "type": "number",    "optional": false}], ["nodeId"], false);InspectorBackend.registerCommand("DOM.getHighlightObjectForTest", [{    "name": "nodeId",    "type": "number",    "optional": false}], ["highlight"], false);InspectorBackend.registerEnum("CSS.StyleSheetOrigin", {    Injected: "injected",    UserAgent: "user-agent",    Inspector: "inspector",    Regular: "regular"});InspectorBackend.registerEnum("CSS.CSSMediaSource", {    MediaRule: "mediaRule",    ImportRule: "importRule",    LinkedSheet: "linkedSheet",    InlineSheet: "inlineSheet"});InspectorBackend.registerEvent("CSS.mediaQueryResultChanged", []);InspectorBackend.registerEvent("CSS.styleSheetChanged", ["styleSheetId"]);InspectorBackend.registerEvent("CSS.styleSheetAdded", ["header"]);InspectorBackend.registerEvent("CSS.styleSheetRemoved", ["styleSheetId"]);InspectorBackend.registerCommand("CSS.enable", [], [], false);InspectorBackend.registerCommand("CSS.disable", [], [], false);InspectorBackend.registerCommand("CSS.getMatchedStylesForNode", [{    "name": "nodeId",    "type": "number",    "optional": false}, {    "name": "excludePseudo",    "type": "boolean",    "optional": true}, {    "name": "excludeInherited",    "type": "boolean",    "optional": true}], ["matchedCSSRules", "pseudoElements", "inherited"], false);InspectorBackend.registerCommand("CSS.getInlineStylesForNode", [{    "name": "nodeId",    "type": "number",    "optional": false}], ["inlineStyle", "attributesStyle"], false);InspectorBackend.registerCommand("CSS.getComputedStyleForNode", [{    "name": "nodeId",    "type": "number",    "optional": false}], ["computedStyle"], false);InspectorBackend.registerCommand("CSS.getPlatformFontsForNode", [{    "name": "nodeId",    "type": "number",    "optional": false}], ["fonts"], false);InspectorBackend.registerCommand("CSS.getStyleSheetText", [{    "name": "styleSheetId",    "type": "string",    "optional": false}], ["text"], false);InspectorBackend.registerCommand("CSS.setStyleSheetText", [{    "name": "styleSheetId",    "type": "string",    "optional": false}, {    "name": "text",    "type": "string",    "optional": false}], [], false);InspectorBackend.registerCommand("CSS.setRuleSelector", [{    "name": "styleSheetId",    "type": "string",    "optional": false}, {    "name": "range",    "type": "object",    "optional": false}, {    "name": "selector",    "type": "string",    "optional": false}], ["rule"], false);InspectorBackend.registerCommand("CSS.setStyleText", [{    "name": "styleSheetId",    "type": "string",    "optional": false}, {    "name": "range",    "type": "object",    "optional": false}, {    "name": "text",    "type": "string",    "optional": false}], ["style"], false);InspectorBackend.registerCommand("CSS.setMediaText", [{    "name": "styleSheetId",    "type": "string",    "optional": false}, {    "name": "range",    "type": "object",    "optional": false}, {    "name": "text",    "type": "string",    "optional": false}], ["media"], false);InspectorBackend.registerCommand("CSS.createStyleSheet", [{    "name": "frameId",    "type": "string",    "optional": false}], ["styleSheetId"], false);InspectorBackend.registerCommand("CSS.addRule", [{    "name": "styleSheetId",    "type": "string",    "optional": false}, {    "name": "ruleText",    "type": "string",    "optional": false}, {    "name": "location",    "type": "object",    "optional": false}], ["rule"], false);InspectorBackend.registerCommand("CSS.forcePseudoState", [{    "name": "nodeId",    "type": "number",    "optional": false}, {    "name": "forcedPseudoClasses",    "type": "object",    "optional": false}], [], false);InspectorBackend.registerCommand("CSS.getMediaQueries", [], ["medias"], false);InspectorBackend.registerCommand("CSS.setEffectivePropertyValueForNode", [{    "name": "nodeId",    "type": "number",    "optional": false}, {    "name": "propertyName",    "type": "string",    "optional": false}, {    "name": "value",    "type": "string",    "optional": false}], [], false);InspectorBackend.registerEvent("Timeline.eventRecorded", ["record"]);InspectorBackend.registerCommand("Timeline.enable", [], [], false);InspectorBackend.registerCommand("Timeline.disable", [], [], false);InspectorBackend.registerCommand("Timeline.start", [{    "name": "maxCallStackDepth",    "type": "number",    "optional": true}, {    "name": "bufferEvents",    "type": "boolean",    "optional": true}, {    "name": "liveEvents",    "type": "string",    "optional": true}, {    "name": "includeCounters",    "type": "boolean",    "optional": true}, {    "name": "includeGPUEvents",    "type": "boolean",    "optional": true}], [], false);InspectorBackend.registerCommand("Timeline.stop", [], [], false);InspectorBackend.registerEnum("Debugger.GeneratorObjectDetailsStatus", {    Running: "running",    Suspended: "suspended",    Closed: "closed"});InspectorBackend.registerEnum("Debugger.ScopeType", {    Global: "global",    Local: "local",    With: "with",    Closure: "closure",    Catch: "catch",    Block: "block",    Script: "script"});InspectorBackend.registerEnum("Debugger.PromiseDetailsStatus", {    Pending: "pending",    Resolved: "resolved",    Rejected: "rejected"});InspectorBackend.registerEvent("Debugger.globalObjectCleared", []);InspectorBackend.registerEvent("Debugger.scriptParsed", ["scriptId", "url", "startLine", "startColumn", "endLine", "endColumn", "isContentScript", "isInternalScript", "sourceMapURL", "hasSourceURL"]);InspectorBackend.registerEvent("Debugger.scriptFailedToParse", ["scriptId", "url", "startLine", "startColumn", "endLine", "endColumn", "isContentScript", "isInternalScript", "sourceMapURL", "hasSourceURL"]);InspectorBackend.registerEvent("Debugger.breakpointResolved", ["breakpointId", "location"]);InspectorBackend.registerEvent("Debugger.paused", ["callFrames", "reason", "data", "hitBreakpoints", "asyncStackTrace"]);InspectorBackend.registerEvent("Debugger.resumed", []);InspectorBackend.registerEvent("Debugger.promiseUpdated", ["eventType", "promise"]);InspectorBackend.registerEvent("Debugger.asyncOperationStarted", ["operation"]);InspectorBackend.registerEvent("Debugger.asyncOperationCompleted", ["id"]);InspectorBackend.registerCommand("Debugger.enable", [], [], false);InspectorBackend.registerCommand("Debugger.disable", [], [], false);InspectorBackend.registerCommand("Debugger.setBreakpointsActive", [{    "name": "active",    "type": "boolean",    "optional": false}], [], false);InspectorBackend.registerCommand("Debugger.setSkipAllPauses", [{    "name": "skipped",    "type": "boolean",    "optional": false}], [], false);InspectorBackend.registerCommand("Debugger.setBreakpointByUrl", [{    "name": "lineNumber",    "type": "number",    "optional": false}, {    "name": "url",    "type": "string",    "optional": true}, {    "name": "urlRegex",    "type": "string",    "optional": true}, {    "name": "columnNumber",    "type": "number",    "optional": true}, {    "name": "condition",    "type": "string",    "optional": true}], ["breakpointId", "locations"], false);InspectorBackend.registerCommand("Debugger.setBreakpoint", [{    "name": "location",    "type": "object",    "optional": false}, {    "name": "condition",    "type": "string",    "optional": true}], ["breakpointId", "actualLocation"], false);InspectorBackend.registerCommand("Debugger.removeBreakpoint", [{    "name": "breakpointId",    "type": "string",    "optional": false}], [], false);InspectorBackend.registerCommand("Debugger.continueToLocation", [{    "name": "location",    "type": "object",    "optional": false}, {    "name": "interstatementLocation",    "type": "boolean",    "optional": true}], [], false);InspectorBackend.registerCommand("Debugger.stepOver", [], [], false);InspectorBackend.registerCommand("Debugger.stepInto", [], [], false);InspectorBackend.registerCommand("Debugger.stepOut", [], [], false);InspectorBackend.registerCommand("Debugger.pause", [], [], false);InspectorBackend.registerCommand("Debugger.resume", [], [], false);InspectorBackend.registerCommand("Debugger.stepIntoAsync", [], [], false);InspectorBackend.registerCommand("Debugger.searchInContent", [{    "name": "scriptId",    "type": "string",    "optional": false}, {    "name": "query",    "type": "string",    "optional": false}, {    "name": "caseSensitive",    "type": "boolean",    "optional": true}, {    "name": "isRegex",    "type": "boolean",    "optional": true}], ["result"], false);InspectorBackend.registerCommand("Debugger.canSetScriptSource", [], ["result"], false);InspectorBackend.registerCommand("Debugger.setScriptSource", [{    "name": "scriptId",    "type": "string",    "optional": false}, {    "name": "scriptSource",    "type": "string",    "optional": false}, {    "name": "preview",    "type": "boolean",    "optional": true}], ["callFrames", "result", "asyncStackTrace"], true);InspectorBackend.registerCommand("Debugger.restartFrame", [{    "name": "callFrameId",    "type": "string",    "optional": false}], ["callFrames", "result", "asyncStackTrace"], false);InspectorBackend.registerCommand("Debugger.getScriptSource", [{    "name": "scriptId",    "type": "string",    "optional": false}], ["scriptSource"], false);InspectorBackend.registerCommand("Debugger.getFunctionDetails", [{    "name": "functionId",    "type": "string",    "optional": false}], ["details"], false);InspectorBackend.registerCommand("Debugger.getGeneratorObjectDetails", [{    "name": "objectId",    "type": "string",    "optional": false}], ["details"], false);InspectorBackend.registerCommand("Debugger.getCollectionEntries", [{    "name": "objectId",    "type": "string",    "optional": false}], ["entries"], false);InspectorBackend.registerCommand("Debugger.setPauseOnExceptions", [{    "name": "state",    "type": "string",    "optional": false}], [], false);InspectorBackend.registerCommand("Debugger.evaluateOnCallFrame", [{    "name": "callFrameId",    "type": "string",    "optional": false}, {    "name": "expression",    "type": "string",    "optional": false}, {    "name": "objectGroup",    "type": "string",    "optional": true}, {    "name": "includeCommandLineAPI",    "type": "boolean",    "optional": true}, {    "name": "doNotPauseOnExceptionsAndMuteConsole",    "type": "boolean",    "optional": true}, {    "name": "returnByValue",    "type": "boolean",    "optional": true}, {    "name": "generatePreview",    "type": "boolean",    "optional": true}], ["result", "wasThrown", "exceptionDetails"], false);InspectorBackend.registerCommand("Debugger.compileScript", [{    "name": "expression",    "type": "string",    "optional": false}, {    "name": "sourceURL",    "type": "string",    "optional": false}, {    "name": "persistScript",    "type": "boolean",    "optional": false}, {    "name": "executionContextId",    "type": "number",    "optional": true}], ["scriptId", "exceptionDetails"], false);InspectorBackend.registerCommand("Debugger.runScript", [{    "name": "scriptId",    "type": "string",    "optional": false}, {    "name": "executionContextId",    "type": "number",    "optional": true}, {    "name": "objectGroup",    "type": "string",    "optional": true}, {    "name": "doNotPauseOnExceptionsAndMuteConsole",    "type": "boolean",    "optional": true}], ["result", "exceptionDetails"], false);InspectorBackend.registerCommand("Debugger.setVariableValue", [{    "name": "scopeNumber",    "type": "number",    "optional": false}, {    "name": "variableName",    "type": "string",    "optional": false}, {    "name": "newValue",    "type": "object",    "optional": false}, {    "name": "callFrameId",    "type": "string",    "optional": true}, {    "name": "functionObjectId",    "type": "string",    "optional": true}], [], false);InspectorBackend.registerCommand("Debugger.getStepInPositions", [{    "name": "callFrameId",    "type": "string",    "optional": false}], ["stepInPositions"], false);InspectorBackend.registerCommand("Debugger.getBacktrace", [], ["callFrames", "asyncStackTrace"], false);InspectorBackend.registerCommand("Debugger.skipStackFrames", [{    "name": "script",    "type": "string",    "optional": true}, {    "name": "skipContentScripts",    "type": "boolean",    "optional": true}], [], false);InspectorBackend.registerCommand("Debugger.setAsyncCallStackDepth", [{    "name": "maxDepth",    "type": "number",    "optional": false}], [], false);InspectorBackend.registerCommand("Debugger.enablePromiseTracker", [{    "name": "captureStacks",    "type": "boolean",    "optional": true}], [], false);InspectorBackend.registerCommand("Debugger.disablePromiseTracker", [], [], false);InspectorBackend.registerCommand("Debugger.getPromiseById", [{    "name": "promiseId",    "type": "number",    "optional": false}, {    "name": "objectGroup",    "type": "string",    "optional": true}], ["promise"], false);InspectorBackend.registerCommand("Debugger.flushAsyncOperationEvents", [], [], false);InspectorBackend.registerCommand("Debugger.setAsyncOperationBreakpoint", [{    "name": "operationId",    "type": "number",    "optional": false}], [], false);InspectorBackend.registerCommand("Debugger.removeAsyncOperationBreakpoint", [{    "name": "operationId",    "type": "number",    "optional": false}], [], false);InspectorBackend.registerEnum("DOMDebugger.DOMBreakpointType", {    SubtreeModified: "subtree-modified",    AttributeModified: "attribute-modified",    NodeRemoved: "node-removed"});InspectorBackend.registerCommand("DOMDebugger.setDOMBreakpoint", [{    "name": "nodeId",    "type": "number",    "optional": false}, {    "name": "type",    "type": "string",    "optional": false}], [], false);InspectorBackend.registerCommand("DOMDebugger.removeDOMBreakpoint", [{    "name": "nodeId",    "type": "number",    "optional": false}, {    "name": "type",    "type": "string",    "optional": false}], [], false);InspectorBackend.registerCommand("DOMDebugger.setEventListenerBreakpoint", [{    "name": "eventName",    "type": "string",    "optional": false}, {    "name": "targetName",    "type": "string",    "optional": true}], [], false);InspectorBackend.registerCommand("DOMDebugger.removeEventListenerBreakpoint", [{    "name": "eventName",    "type": "string",    "optional": false}, {    "name": "targetName",    "type": "string",    "optional": true}], [], false);InspectorBackend.registerCommand("DOMDebugger.setInstrumentationBreakpoint", [{    "name": "eventName",    "type": "string",    "optional": false}], [], false);InspectorBackend.registerCommand("DOMDebugger.removeInstrumentationBreakpoint", [{    "name": "eventName",    "type": "string",    "optional": false}], [], false);InspectorBackend.registerCommand("DOMDebugger.setXHRBreakpoint", [{    "name": "url",    "type": "string",    "optional": false}], [], false);InspectorBackend.registerCommand("DOMDebugger.removeXHRBreakpoint", [{    "name": "url",    "type": "string",    "optional": false}], [], false);InspectorBackend.registerCommand("DOMDebugger.getEventListeners", [{    "name": "objectId",    "type": "string",    "optional": false}], ["listeners"], false);InspectorBackend.registerEvent("Profiler.consoleProfileStarted", ["id", "location", "title"]);InspectorBackend.registerEvent("Profiler.consoleProfileFinished", ["id", "location", "profile", "title"]);InspectorBackend.registerCommand("Profiler.enable", [], [], false);InspectorBackend.registerCommand("Profiler.disable", [], [], false);InspectorBackend.registerCommand("Profiler.setSamplingInterval", [{    "name": "interval",    "type": "number",    "optional": false}], [], false);InspectorBackend.registerCommand("Profiler.start", [], [], false);InspectorBackend.registerCommand("Profiler.stop", [], ["profile"], false);InspectorBackend.registerEvent("HeapProfiler.addHeapSnapshotChunk", ["chunk"]);InspectorBackend.registerEvent("HeapProfiler.resetProfiles", []);InspectorBackend.registerEvent("HeapProfiler.reportHeapSnapshotProgress", ["done", "total", "finished"]);InspectorBackend.registerEvent("HeapProfiler.lastSeenObjectId", ["lastSeenObjectId", "timestamp"]);InspectorBackend.registerEvent("HeapProfiler.heapStatsUpdate", ["statsUpdate"]);InspectorBackend.registerCommand("HeapProfiler.enable", [], [], false);InspectorBackend.registerCommand("HeapProfiler.disable", [], [], false);InspectorBackend.registerCommand("HeapProfiler.startTrackingHeapObjects", [{    "name": "trackAllocations",    "type": "boolean",    "optional": true}], [], false);InspectorBackend.registerCommand("HeapProfiler.stopTrackingHeapObjects", [{    "name": "reportProgress",    "type": "boolean",    "optional": true}], [], false);InspectorBackend.registerCommand("HeapProfiler.takeHeapSnapshot", [{    "name": "reportProgress",    "type": "boolean",    "optional": true}], [], false);InspectorBackend.registerCommand("HeapProfiler.collectGarbage", [], [], false);InspectorBackend.registerCommand("HeapProfiler.getObjectByHeapObjectId", [{    "name": "objectId",    "type": "string",    "optional": false}, {    "name": "objectGroup",    "type": "string",    "optional": true}], ["result"], false);InspectorBackend.registerCommand("HeapProfiler.addInspectedHeapObject", [{    "name": "heapObjectId",    "type": "string",    "optional": false}], [], false);InspectorBackend.registerCommand("HeapProfiler.getHeapObjectId", [{    "name": "objectId",    "type": "string",    "optional": false}], ["heapSnapshotObjectId"], false);InspectorBackend.registerEvent("Worker.workerCreated", ["workerId", "url", "inspectorConnected"]);InspectorBackend.registerEvent("Worker.workerTerminated", ["workerId"]);InspectorBackend.registerEvent("Worker.dispatchMessageFromWorker", ["workerId", "message"]);InspectorBackend.registerCommand("Worker.enable", [], [], false);InspectorBackend.registerCommand("Worker.disable", [], [], false);InspectorBackend.registerCommand("Worker.sendMessageToWorker", [{    "name": "workerId",    "type": "string",    "optional": false}, {    "name": "message",    "type": "string",    "optional": false}], [], false);InspectorBackend.registerCommand("Worker.connectToWorker", [{    "name": "workerId",    "type": "string",    "optional": false}], [], false);InspectorBackend.registerCommand("Worker.disconnectFromWorker", [{    "name": "workerId",    "type": "string",    "optional": false}], [], false);InspectorBackend.registerCommand("Worker.setAutoconnectToWorkers", [{    "name": "value",    "type": "boolean",    "optional": false}], [], false);InspectorBackend.registerEnum("ServiceWorker.ServiceWorkerVersionRunningStatus", {    Stopped: "stopped",    Starting: "starting",    Running: "running",    Stopping: "stopping"});InspectorBackend.registerEnum("ServiceWorker.ServiceWorkerVersionStatus", {    New: "new",    Installing: "installing",    Installed: "installed",    Activating: "activating",    Activated: "activated",    Redundant: "redundant"});InspectorBackend.registerEvent("ServiceWorker.workerCreated", ["workerId", "url"]);InspectorBackend.registerEvent("ServiceWorker.workerTerminated", ["workerId"]);InspectorBackend.registerEvent("ServiceWorker.dispatchMessage", ["workerId", "message"]);InspectorBackend.registerEvent("ServiceWorker.workerRegistrationUpdated", ["registrations"]);InspectorBackend.registerEvent("ServiceWorker.workerVersionUpdated", ["versions"]);InspectorBackend.registerEvent("ServiceWorker.workerErrorReported", ["errorMessage"]);InspectorBackend.registerEvent("ServiceWorker.debugOnStartUpdated", ["debugOnStart"]);InspectorBackend.registerCommand("ServiceWorker.enable", [], [], false);InspectorBackend.registerCommand("ServiceWorker.disable", [], [], false);InspectorBackend.registerCommand("ServiceWorker.sendMessage", [{    "name": "workerId",    "type": "string",    "optional": false}, {    "name": "message",    "type": "string",    "optional": false}], [], false);InspectorBackend.registerCommand("ServiceWorker.stop", [{    "name": "workerId",    "type": "string",    "optional": false}], [], false);InspectorBackend.registerCommand("ServiceWorker.unregister", [{    "name": "scopeURL",    "type": "string",    "optional": false}], [], false);InspectorBackend.registerCommand("ServiceWorker.updateRegistration", [{    "name": "scopeURL",    "type": "string",    "optional": false}], [], false);InspectorBackend.registerCommand("ServiceWorker.startWorker", [{    "name": "scopeURL",    "type": "string",    "optional": false}], [], false);InspectorBackend.registerCommand("ServiceWorker.stopWorker", [{    "name": "versionId",    "type": "string",    "optional": false}], [], false);InspectorBackend.registerCommand("ServiceWorker.inspectWorker", [{    "name": "versionId",    "type": "string",    "optional": false}], [], false);InspectorBackend.registerCommand("ServiceWorker.skipWaiting", [{    "name": "versionId",    "type": "string",    "optional": false}], [], false);InspectorBackend.registerCommand("ServiceWorker.setDebugOnStart", [{    "name": "debugOnStart",    "type": "boolean",    "optional": false}], [], false);InspectorBackend.registerCommand("ServiceWorker.deliverPushMessage", [{    "name": "origin",    "type": "string",    "optional": false}, {    "name": "registrationId",    "type": "string",    "optional": false}, {    "name": "data",    "type": "string",    "optional": false}], [], false);InspectorBackend.registerCommand("ServiceWorker.getTargetInfo", [{    "name": "targetId",    "type": "string",    "optional": false}], ["targetInfo"], false);InspectorBackend.registerCommand("ServiceWorker.activateTarget", [{    "name": "targetId",    "type": "string",    "optional": false}], [], false);InspectorBackend.registerEnum("Input.TouchPointState", {    TouchPressed: "touchPressed",    TouchReleased: "touchReleased",    TouchMoved: "touchMoved",    TouchStationary: "touchStationary",    TouchCancelled: "touchCancelled"});InspectorBackend.registerEnum("Input.GestureSourceType", {    Default: "default",    Touch: "touch",    Mouse: "mouse"});InspectorBackend.registerCommand("Input.dispatchKeyEvent", [{    "name": "type",    "type": "string",    "optional": false}, {    "name": "modifiers",    "type": "number",    "optional": true}, {    "name": "timestamp",    "type": "number",    "optional": true}, {    "name": "text",    "type": "string",    "optional": true}, {    "name": "unmodifiedText",    "type": "string",    "optional": true}, {    "name": "keyIdentifier",    "type": "string",    "optional": true}, {    "name": "code",    "type": "string",    "optional": true}, {    "name": "key",    "type": "string",    "optional": true}, {    "name": "windowsVirtualKeyCode",    "type": "number",    "optional": true}, {    "name": "nativeVirtualKeyCode",    "type": "number",    "optional": true}, {    "name": "autoRepeat",    "type": "boolean",    "optional": true}, {    "name": "isKeypad",    "type": "boolean",    "optional": true}, {    "name": "isSystemKey",    "type": "boolean",    "optional": true}], [], false);InspectorBackend.registerCommand("Input.dispatchMouseEvent", [{    "name": "type",    "type": "string",    "optional": false}, {    "name": "x",    "type": "number",    "optional": false}, {    "name": "y",    "type": "number",    "optional": false}, {    "name": "modifiers",    "type": "number",    "optional": true}, {    "name": "timestamp",    "type": "number",    "optional": true}, {    "name": "button",    "type": "string",    "optional": true}, {    "name": "clickCount",    "type": "number",    "optional": true}], [], false);InspectorBackend.registerCommand("Input.dispatchTouchEvent", [{    "name": "type",    "type": "string",    "optional": false}, {    "name": "touchPoints",    "type": "object",    "optional": false}, {    "name": "modifiers",    "type": "number",    "optional": true}, {    "name": "timestamp",    "type": "number",    "optional": true}], [], false);InspectorBackend.registerCommand("Input.emulateTouchFromMouseEvent", [{    "name": "type",    "type": "string",    "optional": false}, {    "name": "x",    "type": "number",    "optional": false}, {    "name": "y",    "type": "number",    "optional": false}, {    "name": "timestamp",    "type": "number",    "optional": false}, {    "name": "button",    "type": "string",    "optional": false}, {    "name": "deltaX",    "type": "number",    "optional": true}, {    "name": "deltaY",    "type": "number",    "optional": true}, {    "name": "modifiers",    "type": "number",    "optional": true}, {    "name": "clickCount",    "type": "number",    "optional": true}], [], false);InspectorBackend.registerCommand("Input.synthesizePinchGesture", [{    "name": "x",    "type": "number",    "optional": false}, {    "name": "y",    "type": "number",    "optional": false}, {    "name": "scaleFactor",    "type": "number",    "optional": false}, {    "name": "relativeSpeed",    "type": "number",    "optional": true}, {    "name": "gestureSourceType",    "type": "string",    "optional": true}], [], false);InspectorBackend.registerCommand("Input.synthesizeScrollGesture", [{    "name": "x",    "type": "number",    "optional": false}, {    "name": "y",    "type": "number",    "optional": false}, {    "name": "xDistance",    "type": "number",    "optional": true}, {    "name": "yDistance",    "type": "number",    "optional": true}, {    "name": "xOverscroll",    "type": "number",    "optional": true}, {    "name": "yOverscroll",    "type": "number",    "optional": true}, {    "name": "preventFling",    "type": "boolean",    "optional": true}, {    "name": "speed",    "type": "number",    "optional": true}, {    "name": "gestureSourceType",    "type": "string",    "optional": true}], [], false);InspectorBackend.registerCommand("Input.synthesizeTapGesture", [{    "name": "x",    "type": "number",    "optional": false}, {    "name": "y",    "type": "number",    "optional": false}, {    "name": "duration",    "type": "number",    "optional": true}, {    "name": "tapCount",    "type": "number",    "optional": true}, {    "name": "gestureSourceType",    "type": "string",    "optional": true}], [], false);InspectorBackend.registerEnum("LayerTree.ScrollRectType", {    RepaintsOnScroll: "RepaintsOnScroll",    TouchEventHandler: "TouchEventHandler",    WheelEventHandler: "WheelEventHandler"});InspectorBackend.registerEvent("LayerTree.layerTreeDidChange", ["layers"]);InspectorBackend.registerEvent("LayerTree.layerPainted", ["layerId", "clip"]);InspectorBackend.registerCommand("LayerTree.enable", [], [], false);InspectorBackend.registerCommand("LayerTree.disable", [], [], false);InspectorBackend.registerCommand("LayerTree.compositingReasons", [{    "name": "layerId",    "type": "string",    "optional": false}], ["compositingReasons"], false);InspectorBackend.registerCommand("LayerTree.makeSnapshot", [{    "name": "layerId",    "type": "string",    "optional": false}], ["snapshotId"], false);InspectorBackend.registerCommand("LayerTree.loadSnapshot", [{    "name": "tiles",    "type": "object",    "optional": false}], ["snapshotId"], false);InspectorBackend.registerCommand("LayerTree.releaseSnapshot", [{    "name": "snapshotId",    "type": "string",    "optional": false}], [], false);InspectorBackend.registerCommand("LayerTree.profileSnapshot", [{    "name": "snapshotId",    "type": "string",    "optional": false}, {    "name": "minRepeatCount",    "type": "number",    "optional": true}, {    "name": "minDuration",    "type": "number",    "optional": true}, {    "name": "clipRect",    "type": "object",    "optional": true}], ["timings"], false);InspectorBackend.registerCommand("LayerTree.replaySnapshot", [{    "name": "snapshotId",    "type": "string",    "optional": false}, {    "name": "fromStep",    "type": "number",    "optional": true}, {    "name": "toStep",    "type": "number",    "optional": true}, {    "name": "scale",    "type": "number",    "optional": true}], ["dataURL"], false);InspectorBackend.registerCommand("LayerTree.snapshotCommandLog", [{    "name": "snapshotId",    "type": "string",    "optional": false}], ["commandLog"], false);InspectorBackend.registerCommand("DeviceOrientation.setDeviceOrientationOverride", [{    "name": "alpha",    "type": "number",    "optional": false}, {    "name": "beta",    "type": "number",    "optional": false}, {    "name": "gamma",    "type": "number",    "optional": false}], [], false);InspectorBackend.registerCommand("DeviceOrientation.clearDeviceOrientationOverride", [], [], false);InspectorBackend.registerEnum("ScreenOrientation.OrientationType", {    PortraitPrimary: "portraitPrimary",    PortraitSecondary: "portraitSecondary",    LandscapePrimary: "landscapePrimary",    LandscapeSecondary: "landscapeSecondary"});InspectorBackend.registerCommand("ScreenOrientation.setScreenOrientationOverride", [{    "name": "angle",    "type": "number",    "optional": false}, {    "name": "type",    "type": "string",    "optional": false}], [], false);InspectorBackend.registerCommand("ScreenOrientation.clearScreenOrientationOverride", [], [], false);InspectorBackend.registerEvent("Tracing.dataCollected", ["value"]);InspectorBackend.registerEvent("Tracing.tracingComplete", []);InspectorBackend.registerEvent("Tracing.bufferUsage", ["percentFull", "eventCount", "value"]);InspectorBackend.registerCommand("Tracing.start", [{    "name": "categories",    "type": "string",    "optional": true}, {    "name": "options",    "type": "string",    "optional": true}, {    "name": "bufferUsageReportingInterval",    "type": "number",    "optional": true}], [], false);InspectorBackend.registerCommand("Tracing.end", [], [], false);InspectorBackend.registerCommand("Tracing.getCategories", [], ["categories"], false);InspectorBackend.registerEvent("Power.dataAvailable", ["value"]);InspectorBackend.registerCommand("Power.start", [], [], false);InspectorBackend.registerCommand("Power.end", [], [], false);InspectorBackend.registerCommand("Power.canProfilePower", [], ["result"], false);InspectorBackend.registerCommand("Power.getAccuracyLevel", [], ["result"], false);InspectorBackend.registerEnum("Animation.AnimationType", {    CSSTransition: "CSSTransition",    CSSAnimation: "CSSAnimation",    WebAnimation: "WebAnimation"});InspectorBackend.registerEvent("Animation.animationCreated", ["player", "resetTimeline"]);InspectorBackend.registerEvent("Animation.animationCanceled", ["id"]);InspectorBackend.registerCommand("Animation.enable", [], [], false);InspectorBackend.registerCommand("Animation.disable", [], [], false);InspectorBackend.registerCommand("Animation.getPlaybackRate", [], ["playbackRate"], false);InspectorBackend.registerCommand("Animation.setPlaybackRate", [{    "name": "playbackRate",    "type": "number",    "optional": false}], [], false);InspectorBackend.registerCommand("Animation.setCurrentTime", [{    "name": "currentTime",    "type": "number",    "optional": false}], [], false);InspectorBackend.registerCommand("Animation.setTiming", [{    "name": "playerId",    "type": "string",    "optional": false}, {    "name": "duration",    "type": "number",    "optional": false}, {    "name": "delay",    "type": "number",    "optional": false}], [], false);InspectorBackend.registerEnum("Accessibility.AXValueType", {    Boolean: "boolean",    Tristate: "tristate",    BooleanOrUndefined: "booleanOrUndefined",    Idref: "idref",    IdrefList: "idrefList",    Integer: "integer",    Number: "number",    String: "string",    Token: "token",    TokenList: "tokenList",    DomRelation: "domRelation",    Role: "role",    InternalRole: "internalRole"});InspectorBackend.registerEnum("Accessibility.AXPropertySourceType", {    Attribute: "attribute",    Implicit: "implicit",    Style: "style"});InspectorBackend.registerEnum("Accessibility.AXGlobalStates", {    Disabled: "disabled",    Hidden: "hidden",    HiddenRoot: "hiddenRoot",    Invalid: "invalid"});InspectorBackend.registerEnum("Accessibility.AXLiveRegionAttributes", {    Live: "live",    Atomic: "atomic",    Relevant: "relevant",    Busy: "busy",    Root: "root"});InspectorBackend.registerEnum("Accessibility.AXWidgetAttributes", {    Autocomplete: "autocomplete",    Haspopup: "haspopup",    Level: "level",    Multiselectable: "multiselectable",    Orientation: "orientation",    Multiline: "multiline",    Readonly: "readonly",    Required: "required",    Valuemin: "valuemin",    Valuemax: "valuemax",    Valuetext: "valuetext"});InspectorBackend.registerEnum("Accessibility.AXWidgetStates", {    Checked: "checked",    Expanded: "expanded",    Pressed: "pressed",    Selected: "selected"});InspectorBackend.registerEnum("Accessibility.AXRelationshipAttributes", {    Activedescendant: "activedescendant",    Flowto: "flowto",    Controls: "controls",    Describedby: "describedby",    Labelledby: "labelledby",    Owns: "owns"});InspectorBackend.registerCommand("Accessibility.getAXNode", [{    "name": "nodeId",    "type": "number",    "optional": false}], ["accessibilityNode"], false);InspectorBackend.registerEnum("Security.SecurityState", {    Unknown: "unknown",    Http: "http",    Insecure: "insecure",    Warning: "warning",    Secure: "secure"});InspectorBackend.registerEvent("Security.securityStateChanged", ["securityState", "explanations"]);InspectorBackend.registerCommand("Security.enable", [], [], false);InspectorBackend.registerCommand("Security.disable", [], [], false);;WebInspector.Target = function(name, type, connection, parentTarget, callback) {    Protocol.Agents.call(this, connection.agentsMap());    this._name = name;    this._type = type;    this._connection = connection;    this._parentTarget = parentTarget;    connection.addEventListener(InspectorBackendClass.Connection.Events.Disconnected, this._onDisconnect, this);    this._id = WebInspector.Target._nextId++;    this._modelByConstructor = new Map();    this._capabilities = {};    this.pageAgent().canScreencast(this._initializeCapability.bind(this, WebInspector.Target.Capabilities.CanScreencast, this._loadedWithCapabilities.bind(this, callback)));}WebInspector.Target.Capabilities = {    CanScreencast: "CanScreencast"}WebInspector.Target.Type = {    Page: 1,    DedicatedWorker: 2,    ServiceWorker: 4}WebInspector.Target._nextId = 1;WebInspector.Target.prototype = {    id: function()     {        return this._id;    },    name: function()     {        return this._name;    },    decorateLabel: function(label)     {        return this.isWorker() ? "\u2699 " + label : label;    },    _initializeCapability: function(name, callback, error, result)     {        this._capabilities[name] = result;        if (callback)            callback();    },    hasCapability: function(capability)     {        return !!this._capabilities[capability];    },    _loadedWithCapabilities: function(callback)     {        if (this._connection.isClosed()) {            callback(null );            return;        }        this.consoleModel = new WebInspector.ConsoleModel(this);        this.networkManager = new WebInspector.NetworkManager(this);        this.resourceTreeModel = new WebInspector.ResourceTreeModel(this);        this.networkLog = new WebInspector.NetworkLog(this);        if (this.hasJSContext())            new WebInspector.DebuggerModel(this);        this.runtimeModel = new WebInspector.RuntimeModel(this);        if (this._type === WebInspector.Target.Type.Page) {            new WebInspector.DOMModel(this);            new WebInspector.CSSStyleModel(this);        }        this.workerManager = !this.isDedicatedWorker() ? new WebInspector.WorkerManager(this) : null ;        this.cpuProfilerModel = new WebInspector.CPUProfilerModel(this);        this.heapProfilerModel = new WebInspector.HeapProfilerModel(this);        this.layerTreeModel = new WebInspector.LayerTreeModel(this);        this.tracingManager = new WebInspector.TracingManager(this);        if (this.isPage() && (Runtime.experiments.isEnabled("serviceWorkersInPageFrontend") || Runtime.experiments.isEnabled("serviceWorkersInResources")))            this.serviceWorkerManager = new WebInspector.ServiceWorkerManager(this);        if (callback)            callback(this);    },    registerDispatcher: function(domain, dispatcher)     {        this._connection.registerDispatcher(domain, dispatcher);    },    isPage: function()     {        return this._type === WebInspector.Target.Type.Page;    },    isWorker: function()     {        return this.isDedicatedWorker() || this.isServiceWorker();    },    isDedicatedWorker: function()     {        return this._type === WebInspector.Target.Type.DedicatedWorker;    },    isServiceWorker: function()     {        return this._type === WebInspector.Target.Type.ServiceWorker;    },    hasJSContext: function()     {        return !this.isServiceWorker();    },    parentTarget: function()     {        return this._parentTarget;    },    _onDisconnect: function()     {        WebInspector.targetManager.removeTarget(this);        this._dispose();    },    _dispose: function()     {        WebInspector.targetManager.dispatchEventToListeners(WebInspector.TargetManager.Events.TargetDisposed, this);        this.networkManager.dispose();        this.cpuProfilerModel.dispose();        WebInspector.ServiceWorkerCacheModel.fromTarget(this).dispose();        if (this.workerManager)            this.workerManager.dispose();    },    isDetached: function()     {        return this._connection.isClosed();    },    model: function(modelClass)     {        return this._modelByConstructor.get(modelClass) || null ;    },    __proto__: Protocol.Agents.prototype}WebInspector.SDKObject = function(target) {    WebInspector.Object.call(this);    this._target = target;}WebInspector.SDKObject.prototype = {    target: function()     {        return this._target;    },    __proto__: WebInspector.Object.prototype}WebInspector.SDKModel = function(modelClass, target) {    WebInspector.SDKObject.call(this, target);    target._modelByConstructor.set(modelClass, this);}WebInspector.SDKModel.prototype = {    __proto__: WebInspector.SDKObject.prototype}WebInspector.TargetManager = function() {    WebInspector.Object.call(this);    this._targets = [];    this._observers = [];    this._observerTypeSymbol = Symbol("observerType");    this._modelListeners = {};    this._suspendCount = 0;}WebInspector.TargetManager.Events = {    InspectedURLChanged: "InspectedURLChanged",    MainFrameNavigated: "MainFrameNavigated",    Load: "Load",    WillReloadPage: "WillReloadPage",    SuspendStateChanged: "SuspendStateChanged",    TargetDisposed: "TargetDisposed"}WebInspector.TargetManager.prototype = {    suspendAllTargets: function()     {        if (this._suspendCount++)            return;        this.dispatchEventToListeners(WebInspector.TargetManager.Events.SuspendStateChanged);    },    resumeAllTargets: function()     {        console.assert(this._suspendCount > 0);        if (--this._suspendCount)            return;        this.dispatchEventToListeners(WebInspector.TargetManager.Events.SuspendStateChanged);    },    allTargetsSuspended: function()     {        return !!this._suspendCount;    },    inspectedPageURL: function()     {        if (!this._targets.length)            return "";        return this._targets[0].resourceTreeModel.inspectedPageURL();    },    inspectedPageDomain: function()     {        if (!this._targets.length)            return "";        return this._targets[0].resourceTreeModel.inspectedPageDomain();    },    _redispatchEvent: function(event)     {        this.dispatchEventToListeners(event.type, event.data);    },    reloadPage: function(ignoreCache)     {        if (this._targets.length)            this._targets[0].resourceTreeModel.reloadPage(ignoreCache);    },    addModelListener: function(modelClass, eventType, listener, thisObject)     {        for (var i = 0; i < this._targets.length; ++i) {            var model = this._targets[i]._modelByConstructor.get(modelClass);            if (model)                model.addEventListener(eventType, listener, thisObject);        }        if (!this._modelListeners[eventType])            this._modelListeners[eventType] = [];        this._modelListeners[eventType].push({            modelClass: modelClass,            thisObject: thisObject,            listener: listener        });    },    removeModelListener: function(modelClass, eventType, listener, thisObject)     {        if (!this._modelListeners[eventType])            return;        for (var i = 0; i < this._targets.length; ++i) {            var model = this._targets[i]._modelByConstructor.get(modelClass);            if (model)                model.removeEventListener(eventType, listener, thisObject);        }        var listeners = this._modelListeners[eventType];        for (var i = 0; i < listeners.length; ++i) {            if (listeners[i].modelClass === modelClass && listeners[i].listener === listener && listeners[i].thisObject === thisObject)                listeners.splice(i--, 1);        }        if (!listeners.length)            delete this._modelListeners[eventType];    },    observeTargets: function(targetObserver, type)     {        if (this._observerTypeSymbol in targetObserver)            throw new Error("Observer can only be registered once");        targetObserver[this._observerTypeSymbol] = type || 0x7fff;        this.targets(type).forEach(targetObserver.targetAdded.bind(targetObserver));        this._observers.push(targetObserver);    },    unobserveTargets: function(targetObserver)     {        delete targetObserver[this._observerTypeSymbol];        this._observers.remove(targetObserver);    },    createTarget: function(name, type, connection, parentTarget, callback)     {        new WebInspector.Target(name,type,connection,parentTarget,callbackWrapper.bind(this));        function callbackWrapper(newTarget)         {            if (newTarget)                this.addTarget(newTarget);            if (callback)                callback(newTarget);        }    },    _observersByType: function(type)     {        var result = [];        for (var observer of this._observers) {            if (observer[this._observerTypeSymbol] & type)                result.push(observer);        }        return result;    },    addTarget: function(target)     {        this._targets.push(target);        if (this._targets.length === 1) {            target.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.InspectedURLChanged, this._redispatchEvent, this);            target.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.MainFrameNavigated, this._redispatchEvent, this);            target.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.Load, this._redispatchEvent, this);            target.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.WillReloadPage, this._redispatchEvent, this);        }        var copy = this._observersByType(target._type);        for (var i = 0; i < copy.length; ++i)            copy[i].targetAdded(target);        for (var eventType in this._modelListeners) {            var listeners = this._modelListeners[eventType];            for (var i = 0; i < listeners.length; ++i) {                var model = target._modelByConstructor.get(listeners[i].modelClass);                if (model)                    model.addEventListener(eventType, listeners[i].listener, listeners[i].thisObject);            }        }    },    removeTarget: function(target)     {        this._targets.remove(target);        if (this._targets.length === 0) {            target.resourceTreeModel.removeEventListener(WebInspector.ResourceTreeModel.EventTypes.InspectedURLChanged, this._redispatchEvent, this);            target.resourceTreeModel.removeEventListener(WebInspector.ResourceTreeModel.EventTypes.MainFrameNavigated, this._redispatchEvent, this);            target.resourceTreeModel.removeEventListener(WebInspector.ResourceTreeModel.EventTypes.Load, this._redispatchEvent, this);            target.resourceTreeModel.removeEventListener(WebInspector.ResourceTreeModel.EventTypes.WillReloadPage, this._redispatchEvent, this);        }        var copy = this._observersByType(target._type);        for (var i = 0; i < copy.length; ++i)            copy[i].targetRemoved(target);        for (var eventType in this._modelListeners) {            var listeners = this._modelListeners[eventType];            for (var i = 0; i < listeners.length; ++i) {                var model = target._modelByConstructor.get(listeners[i].modelClass);                if (model)                    model.removeEventListener(eventType, listeners[i].listener, listeners[i].thisObject);            }        }    },    hasTargets: function(type)     {        return !!this.targets(type).length;    },    targets: function(type)     {        if (!type)            return this._targets.slice();        var result = [];        for (var target of this._targets) {            if (target._type & type)                result.push(target);        }        return result;    },    targetsWithJSContext: function()     {        var result = [];        for (var target of this._targets) {            if (target.hasJSContext())                result.push(target);        }        return result;    },    targetById: function(id)     {        for (var i = 0; i < this._targets.length; ++i) {            if (this._targets[i].id() === id)                return this._targets[i];        }        return null ;    },    mainTarget: function()     {        return this._targets[0] || null ;    },    __proto__: WebInspector.Object.prototype}WebInspector.TargetManager.Observer = function() {}WebInspector.TargetManager.Observer.prototype = {    targetAdded: function(target) {},    targetRemoved: function(target) {},}WebInspector.targetManager = new WebInspector.TargetManager();;WebInspector.ApplicationCacheModel = function(target) {    WebInspector.SDKObject.call(this, target);    target.registerApplicationCacheDispatcher(new WebInspector.ApplicationCacheDispatcher(this));    this._agent = target.applicationCacheAgent();    this._agent.enable();    target.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.FrameNavigated, this._frameNavigated, this);    target.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.FrameDetached, this._frameDetached, this);    this._statuses = {};    this._manifestURLsByFrame = {};    this._mainFrameNavigated();    this._onLine = true;}WebInspector.ApplicationCacheModel.EventTypes = {    FrameManifestStatusUpdated: "FrameManifestStatusUpdated",    FrameManifestAdded: "FrameManifestAdded",    FrameManifestRemoved: "FrameManifestRemoved",    NetworkStateChanged: "NetworkStateChanged"}WebInspector.ApplicationCacheModel.prototype = {    _frameNavigated: function(event)     {        var frame = (event.data);        if (frame.isMainFrame()) {            this._mainFrameNavigated();            return;        }        this._agent.getManifestForFrame(frame.id, this._manifestForFrameLoaded.bind(this, frame.id));    },    _frameDetached: function(event)     {        var frame = (event.data);        this._frameManifestRemoved(frame.id);    },    _mainFrameNavigated: function()     {        this._agent.getFramesWithManifests(this._framesWithManifestsLoaded.bind(this));    },    _manifestForFrameLoaded: function(frameId, error, manifestURL)     {        if (error) {            console.error(error);            return;        }        if (!manifestURL)            this._frameManifestRemoved(frameId);    },    _framesWithManifestsLoaded: function(error, framesWithManifests)     {        if (error) {            console.error(error);            return;        }        for (var i = 0; i < framesWithManifests.length; ++i)            this._frameManifestUpdated(framesWithManifests[i].frameId, framesWithManifests[i].manifestURL, framesWithManifests[i].status);    },    _frameManifestUpdated: function(frameId, manifestURL, status)     {        if (status === applicationCache.UNCACHED) {            this._frameManifestRemoved(frameId);            return;        }        if (!manifestURL)            return;        if (this._manifestURLsByFrame[frameId] && manifestURL !== this._manifestURLsByFrame[frameId])            this._frameManifestRemoved(frameId);        var statusChanged = this._statuses[frameId] !== status;        this._statuses[frameId] = status;        if (!this._manifestURLsByFrame[frameId]) {            this._manifestURLsByFrame[frameId] = manifestURL;            this.dispatchEventToListeners(WebInspector.ApplicationCacheModel.EventTypes.FrameManifestAdded, frameId);        }        if (statusChanged)            this.dispatchEventToListeners(WebInspector.ApplicationCacheModel.EventTypes.FrameManifestStatusUpdated, frameId);    },    _frameManifestRemoved: function(frameId)     {        if (!this._manifestURLsByFrame[frameId])            return;        delete this._manifestURLsByFrame[frameId];        delete this._statuses[frameId];        this.dispatchEventToListeners(WebInspector.ApplicationCacheModel.EventTypes.FrameManifestRemoved, frameId);    },    frameManifestURL: function(frameId)     {        return this._manifestURLsByFrame[frameId] || "";    },    frameManifestStatus: function(frameId)     {        return this._statuses[frameId] || applicationCache.UNCACHED;    },    get onLine()     {        return this._onLine;    },    _statusUpdated: function(frameId, manifestURL, status)     {        this._frameManifestUpdated(frameId, manifestURL, status);    },    requestApplicationCache: function(frameId, callback)     {        function callbackWrapper(error, applicationCache)         {            if (error) {                console.error(error);                callback(null );                return;            }            callback(applicationCache);        }        this._agent.getApplicationCacheForFrame(frameId, callbackWrapper);    },    _networkStateUpdated: function(isNowOnline)     {        this._onLine = isNowOnline;        this.dispatchEventToListeners(WebInspector.ApplicationCacheModel.EventTypes.NetworkStateChanged, isNowOnline);    },    __proto__: WebInspector.SDKObject.prototype}WebInspector.ApplicationCacheDispatcher = function(applicationCacheModel) {    this._applicationCacheModel = applicationCacheModel;}WebInspector.ApplicationCacheDispatcher.prototype = {    applicationCacheStatusUpdated: function(frameId, manifestURL, status)     {        this._applicationCacheModel._statusUpdated(frameId, manifestURL, status);    },    networkStateUpdated: function(isNowOnline)     {        this._applicationCacheModel._networkStateUpdated(isNowOnline);    }};WebInspector.ConsoleModel = function(target) {    WebInspector.SDKModel.call(this, WebInspector.ConsoleModel, target);    this._messages = [];    this._messageById = new Map();    this._warnings = 0;    this._errors = 0;    this._revokedErrors = 0;    this._consoleAgent = target.consoleAgent();    target.registerConsoleDispatcher(new WebInspector.ConsoleDispatcher(this));    this._enableAgent();}WebInspector.ConsoleModel.Events = {    ConsoleCleared: "ConsoleCleared",    MessageAdded: "MessageAdded",    MessageUpdated: "MessageUpdated",    CommandEvaluated: "CommandEvaluated",}WebInspector.ConsoleModel.prototype = {    _enableAgent: function()     {        this._enablingConsole = true;        function callback()         {            delete this._enablingConsole;        }        this._consoleAgent.enable(callback.bind(this));    },    addMessage: function(msg)     {        if (msg.level === WebInspector.ConsoleMessage.MessageLevel.RevokedError && msg._relatedMessageId) {            var relatedMessage = this._messageById.get(msg._relatedMessageId);            if (!relatedMessage)                return;            this._errors--;            this._revokedErrors++;            relatedMessage.level = WebInspector.ConsoleMessage.MessageLevel.RevokedError;            this.dispatchEventToListeners(WebInspector.ConsoleModel.Events.MessageUpdated, relatedMessage);            return;        }        this._messages.push(msg);        if (msg._messageId)            this._messageById.set(msg._messageId, msg);        this._incrementErrorWarningCount(msg);        this.dispatchEventToListeners(WebInspector.ConsoleModel.Events.MessageAdded, msg);    },    _incrementErrorWarningCount: function(msg)     {        switch (msg.level) {        case WebInspector.ConsoleMessage.MessageLevel.Warning:            this._warnings++;            break;        case WebInspector.ConsoleMessage.MessageLevel.Error:            this._errors++;            break;        case WebInspector.ConsoleMessage.MessageLevel.RevokedError:            this._revokedErrors++;            break;        }    },    messages: function()     {        return this._messages;    },    requestClearMessages: function()     {        this._consoleAgent.clearMessages();        this._messagesCleared();    },    _messagesCleared: function()     {        this._messages = [];        this._messageById.clear();        this._errors = 0;        this._revokedErrors = 0;        this._warnings = 0;        this.dispatchEventToListeners(WebInspector.ConsoleModel.Events.ConsoleCleared);    },    errors: function()     {        return this._errors;    },    revokedErrors: function()     {        return this._revokedErrors;    },    warnings: function()     {        return this._warnings;    },    __proto__: WebInspector.SDKModel.prototype}WebInspector.ConsoleModel.evaluateCommandInConsole = function(executionContext, text, useCommandLineAPI) {    useCommandLineAPI = !!useCommandLineAPI;    var target = executionContext.target();    var commandMessage = new WebInspector.ConsoleMessage(target,WebInspector.ConsoleMessage.MessageSource.JS,null ,text,WebInspector.ConsoleMessage.MessageType.Command);    commandMessage.setExecutionContextId(executionContext.id);    target.consoleModel.addMessage(commandMessage);    function printResult(result, wasThrown, valueResult, exceptionDetails)     {        if (!result)            return;        WebInspector.console.showPromise().then(reportUponEvaluation);        function reportUponEvaluation()         {            target.consoleModel.dispatchEventToListeners(WebInspector.ConsoleModel.Events.CommandEvaluated, {                result: result,                wasThrown: wasThrown,                text: text,                commandMessage: commandMessage,                exceptionDetails: exceptionDetails            });        }    }    executionContext.evaluate(text, "console", useCommandLineAPI, false, false, true, printResult);    WebInspector.userMetrics.ConsoleEvaluated.record();}WebInspector.ConsoleMessage = function(target, source, level, messageText, type, url, line, column, requestId, parameters, stackTrace, timestamp, executionContextId, asyncStackTrace, scriptId, messageId, relatedMessageId) {    this._target = target;    this.source = source;    this.level = level;    this.messageText = messageText;    this.type = type || WebInspector.ConsoleMessage.MessageType.Log;    this.url = url || undefined;    this.line = line || 0;    this.column = column || 0;    this.parameters = parameters;    this.stackTrace = stackTrace;    this.timestamp = timestamp || Date.now();    this.executionContextId = executionContextId || 0;    this.asyncStackTrace = asyncStackTrace;    this.scriptId = scriptId || null ;    this._messageId = messageId || 0;    this._relatedMessageId = relatedMessageId || 0;    this.request = requestId ? target.networkLog.requestForId(requestId) : null ;    if (this.request) {        var initiator = this.request.initiator();        if (initiator) {            this.stackTrace = initiator.stackTrace || undefined;            this.asyncStackTrace = initiator.asyncStackTrace;            if (initiator.url) {                this.url = initiator.url;                this.line = initiator.lineNumber || 0;            }        }    }}WebInspector.ConsoleMessage.prototype = {    target: function()     {        return this._target;    },    setOriginatingMessage: function(originatingMessage)     {        this._originatingConsoleMessage = originatingMessage;        this.executionContextId = originatingMessage.executionContextId;    },    setExecutionContextId: function(executionContextId)     {        this.executionContextId = executionContextId;    },    originatingMessage: function()     {        return this._originatingConsoleMessage;    },    isGroupMessage: function()     {        return this.type === WebInspector.ConsoleMessage.MessageType.StartGroup || this.type === WebInspector.ConsoleMessage.MessageType.StartGroupCollapsed || this.type === WebInspector.ConsoleMessage.MessageType.EndGroup;    },    isGroupStartMessage: function()     {        return this.type === WebInspector.ConsoleMessage.MessageType.StartGroup || this.type === WebInspector.ConsoleMessage.MessageType.StartGroupCollapsed;    },    isErrorOrWarning: function()     {        return ( this.level === WebInspector.ConsoleMessage.MessageLevel.Warning || this.level === WebInspector.ConsoleMessage.MessageLevel.Error) ;    },    isEqual: function(msg)     {        if (!msg)            return false;        if (this._messageId || msg._messageId)            return false;        if (this._relatedMessageId || msg._relatedMessageId)            return false;        if (!this._isEqualStackTraces(this.stackTrace, msg.stackTrace))            return false;        var asyncTrace1 = this.asyncStackTrace;        var asyncTrace2 = msg.asyncStackTrace;        while (asyncTrace1 || asyncTrace2) {            if (!asyncTrace1 || !asyncTrace2)                return false;            if (asyncTrace1.description !== asyncTrace2.description)                return false;            if (!this._isEqualStackTraces(asyncTrace1.callFrames, asyncTrace2.callFrames))                return false;            asyncTrace1 = asyncTrace1.asyncStackTrace;            asyncTrace2 = asyncTrace2.asyncStackTrace;        }        if (this.parameters) {            if (!msg.parameters || this.parameters.length !== msg.parameters.length)                return false;            for (var i = 0; i < msg.parameters.length; ++i) {                if (this.parameters[i].type !== msg.parameters[i].type || msg.parameters[i].type === "object" || this.parameters[i].value !== msg.parameters[i].value)                    return false;            }        }        return (this.target() === msg.target()) && (this.source === msg.source) && (this.type === msg.type) && (this.level === msg.level) && (this.line === msg.line) && (this.url === msg.url) && (this.messageText === msg.messageText) && (this.request === msg.request) && (this.executionContextId === msg.executionContextId) && (this.scriptId === msg.scriptId);    },    _isEqualStackTraces: function(stackTrace1, stackTrace2)     {        stackTrace1 = stackTrace1 || [];        stackTrace2 = stackTrace2 || [];        if (stackTrace1.length !== stackTrace2.length)            return false;        for (var i = 0, n = stackTrace1.length; i < n; ++i) {            if (stackTrace1[i].url !== stackTrace2[i].url || stackTrace1[i].functionName !== stackTrace2[i].functionName || stackTrace1[i].lineNumber !== stackTrace2[i].lineNumber || stackTrace1[i].columnNumber !== stackTrace2[i].columnNumber)                return false;        }        return true;    }}WebInspector.ConsoleMessage.MessageSource = {    XML: "xml",    JS: "javascript",    Network: "network",    ConsoleAPI: "console-api",    Storage: "storage",    AppCache: "appcache",    Rendering: "rendering",    CSS: "css",    Security: "security",    Other: "other",    Deprecation: "deprecation"}WebInspector.ConsoleMessage.MessageType = {    Log: "log",    Dir: "dir",    DirXML: "dirxml",    Table: "table",    Trace: "trace",    Clear: "clear",    StartGroup: "startGroup",    StartGroupCollapsed: "startGroupCollapsed",    EndGroup: "endGroup",    Assert: "assert",    Result: "result",    Profile: "profile",    ProfileEnd: "profileEnd",    Command: "command"}WebInspector.ConsoleMessage.MessageLevel = {    Log: "log",    Info: "info",    Warning: "warning",    Error: "error",    Debug: "debug",    RevokedError: "revokedError"};WebInspector.ConsoleMessage.timestampComparator = function(a, b) {    return a.timestamp - b.timestamp;}WebInspector.ConsoleDispatcher = function(console) {    this._console = console;}WebInspector.ConsoleDispatcher.prototype = {    messageAdded: function(payload)     {        var consoleMessage = new WebInspector.ConsoleMessage(this._console.target(),payload.source,payload.level,payload.text,payload.type,payload.url,payload.line,payload.column,payload.networkRequestId,payload.parameters,payload.stackTrace,payload.timestamp * 1000,payload.executionContextId,payload.asyncStackTrace,payload.scriptId,payload.messageId,payload.relatedMessageId);        this._console.addMessage(consoleMessage);    },    messageRepeatCountUpdated: function(count)     {},    messagesCleared: function()     {        if (!WebInspector.moduleSetting("preserveConsoleLog").get())            this._console._messagesCleared();    }}WebInspector.MultitargetConsoleModel = function() {    WebInspector.targetManager.observeTargets(this);    WebInspector.targetManager.addModelListener(WebInspector.ConsoleModel, WebInspector.ConsoleModel.Events.MessageAdded, this._consoleMessageAdded, this);    WebInspector.targetManager.addModelListener(WebInspector.ConsoleModel, WebInspector.ConsoleModel.Events.MessageUpdated, this._consoleMessageUpdated, this);    WebInspector.targetManager.addModelListener(WebInspector.ConsoleModel, WebInspector.ConsoleModel.Events.CommandEvaluated, this._commandEvaluated, this);}WebInspector.MultitargetConsoleModel.prototype = {    targetAdded: function(target)     {        if (!this._mainTarget) {            this._mainTarget = target;            target.consoleModel.addEventListener(WebInspector.ConsoleModel.Events.ConsoleCleared, this._consoleCleared, this);        }    },    targetRemoved: function(target)     {        if (this._mainTarget === target) {            delete this._mainTarget;            target.consoleModel.removeEventListener(WebInspector.ConsoleModel.Events.ConsoleCleared, this._consoleCleared, this);        }    },    messages: function()     {        var targets = WebInspector.targetManager.targets();        var result = [];        for (var i = 0; i < targets.length; ++i)            result = result.concat(targets[i].consoleModel.messages());        return result;    },    _consoleCleared: function()     {        this.dispatchEventToListeners(WebInspector.ConsoleModel.Events.ConsoleCleared);    },    _consoleMessageAdded: function(event)     {        this.dispatchEventToListeners(WebInspector.ConsoleModel.Events.MessageAdded, event.data);    },    _consoleMessageUpdated: function(event)     {        this.dispatchEventToListeners(WebInspector.ConsoleModel.Events.MessageUpdated, event.data);    },    _commandEvaluated: function(event)     {        this.dispatchEventToListeners(WebInspector.ConsoleModel.Events.CommandEvaluated, event.data);    },    __proto__: WebInspector.Object.prototype}WebInspector.multitargetConsoleModel;;WebInspector.ConcatenatedScriptsContentProvider = function(scripts) {    this._scripts = scripts;}WebInspector.ConcatenatedScriptsContentProvider.scriptOpenTag = "<script>";WebInspector.ConcatenatedScriptsContentProvider.scriptCloseTag = "</script>";WebInspector.ConcatenatedScriptsContentProvider.prototype = {    _sortedScripts: function()     {        if (this._sortedScriptsArray)            return this._sortedScriptsArray;        this._sortedScriptsArray = [];        var scripts = this._scripts.slice();        scripts.sort(function(x, y) {            return x.lineOffset - y.lineOffset || x.columnOffset - y.columnOffset;        }        );        var scriptOpenTagLength = WebInspector.ConcatenatedScriptsContentProvider.scriptOpenTag.length;        var scriptCloseTagLength = WebInspector.ConcatenatedScriptsContentProvider.scriptCloseTag.length;        this._sortedScriptsArray.push(scripts[0]);        for (var i = 1; i < scripts.length; ++i) {            var previousScript = this._sortedScriptsArray[this._sortedScriptsArray.length - 1];            var lineNumber = previousScript.endLine;            var columnNumber = previousScript.endColumn + scriptCloseTagLength + scriptOpenTagLength;            if (lineNumber < scripts[i].lineOffset || (lineNumber === scripts[i].lineOffset && columnNumber <= scripts[i].columnOffset))                this._sortedScriptsArray.push(scripts[i]);        }        return this._sortedScriptsArray;    },    contentURL: function()     {        return "";    },    contentType: function()     {        return WebInspector.resourceTypes.Document;    },    requestContent: function(callback)     {        var scripts = this._sortedScripts();        var sources = [];        function didRequestSource(content)         {            sources.push(content);            if (sources.length == scripts.length)                callback(this._concatenateScriptsContent(scripts, sources));        }        for (var i = 0; i < scripts.length; ++i)            scripts[i].requestContent(didRequestSource.bind(this));    },    searchInContent: function(query, caseSensitive, isRegex, callback)     {        var results = {};        var scripts = this._sortedScripts();        var scriptsLeft = scripts.length;        function maybeCallback()         {            if (scriptsLeft)                return;            var result = [];            for (var i = 0; i < scripts.length; ++i)                result = result.concat(results[scripts[i].scriptId]);            callback(result);        }        function searchCallback(script, searchMatches)         {            results[script.scriptId] = [];            for (var i = 0; i < searchMatches.length; ++i) {                var searchMatch = new WebInspector.ContentProvider.SearchMatch(searchMatches[i].lineNumber + script.lineOffset,searchMatches[i].lineContent);                results[script.scriptId].push(searchMatch);            }            scriptsLeft--;            maybeCallback();        }        maybeCallback();        for (var i = 0; i < scripts.length; ++i)            scripts[i].searchInContent(query, caseSensitive, isRegex, searchCallback.bind(null , scripts[i]));    },    _concatenateScriptsContent: function(scripts, sources)     {        var content = "";        var lineNumber = 0;        var columnNumber = 0;        var scriptOpenTag = WebInspector.ConcatenatedScriptsContentProvider.scriptOpenTag;        var scriptCloseTag = WebInspector.ConcatenatedScriptsContentProvider.scriptCloseTag;        for (var i = 0; i < scripts.length; ++i) {            for (var newLinesCount = scripts[i].lineOffset - lineNumber; newLinesCount > 0; --newLinesCount) {                columnNumber = 0;                content += "\n";            }            for (var spacesCount = scripts[i].columnOffset - columnNumber - scriptOpenTag.length; spacesCount > 0; --spacesCount)                content += " ";            content += scriptOpenTag;            content += sources[i];            content += scriptCloseTag;            lineNumber = scripts[i].endLine;            columnNumber = scripts[i].endColumn + scriptCloseTag.length;        }        return content;    }}WebInspector.CompilerSourceMappingContentProvider = function(sourceURL, contentType) {    this._sourceURL = sourceURL;    this._contentType = contentType;}WebInspector.CompilerSourceMappingContentProvider.prototype = {    contentURL: function()     {        return this._sourceURL;    },    contentType: function()     {        return this._contentType;    },    requestContent: function(callback)     {        WebInspector.ResourceLoader.loadUsingTargetUA(this._sourceURL, {}, contentLoaded.bind(this));        function contentLoaded(statusCode, headers, content)         {            if (statusCode >= 400) {                console.error("Could not load content for " + this._sourceURL + " : " + "HTTP status code: " + statusCode);                callback(null );                return;            }            callback(content);        }    },    searchInContent: function(query, caseSensitive, isRegex, callback)     {        this.requestContent(contentLoaded);        function contentLoaded(content)         {            if (typeof content !== "string") {                callback([]);                return;            }            callback(WebInspector.ContentProvider.performSearchInContent(content, query, caseSensitive, isRegex));        }    }};WebInspector.CookieParser = function(target) {    this._target = target;}WebInspector.CookieParser.KeyValue = function(key, value, position) {    this.key = key;    this.value = value;    this.position = position;}WebInspector.CookieParser.prototype = {    cookies: function()     {        return this._cookies;    },    parseCookie: function(cookieHeader)     {        if (!this._initialize(cookieHeader))            return null ;        for (var kv = this._extractKeyValue(); kv; kv = this._extractKeyValue()) {            if (kv.key.charAt(0) === "$" && this._lastCookie)                this._lastCookie.addAttribute(kv.key.slice(1), kv.value);            else if (kv.key.toLowerCase() !== "$version" && typeof kv.value === "string")                this._addCookie(kv, WebInspector.Cookie.Type.Request);            this._advanceAndCheckCookieDelimiter();        }        this._flushCookie();        return this._cookies;    },    parseSetCookie: function(setCookieHeader)     {        if (!this._initialize(setCookieHeader))            return null ;        for (var kv = this._extractKeyValue(); kv; kv = this._extractKeyValue()) {            if (this._lastCookie)                this._lastCookie.addAttribute(kv.key, kv.value);            else                this._addCookie(kv, WebInspector.Cookie.Type.Response);            if (this._advanceAndCheckCookieDelimiter())                this._flushCookie();        }        this._flushCookie();        return this._cookies;    },    _initialize: function(headerValue)     {        this._input = headerValue;        if (typeof headerValue !== "string")            return false;        this._cookies = [];        this._lastCookie = null ;        this._originalInputLength = this._input.length;        return true;    },    _flushCookie: function()     {        if (this._lastCookie)            this._lastCookie.setSize(this._originalInputLength - this._input.length - this._lastCookiePosition);        this._lastCookie = null ;    },    _extractKeyValue: function()     {        if (!this._input || !this._input.length)            return null ;        var keyValueMatch = /^[ \t]*([^\s=;]+)[ \t]*(?:=[ \t]*([^;\n]*))?/.exec(this._input);        if (!keyValueMatch) {            console.log("Failed parsing cookie header before: " + this._input);            return null ;        }        var result = new WebInspector.CookieParser.KeyValue(keyValueMatch[1],keyValueMatch[2] && keyValueMatch[2].trim(),this._originalInputLength - this._input.length);        this._input = this._input.slice(keyValueMatch[0].length);        return result;    },    _advanceAndCheckCookieDelimiter: function()     {        var match = /^\s*[\n;]\s*/.exec(this._input);        if (!match)            return false;        this._input = this._input.slice(match[0].length);        return match[0].match("\n") !== null ;    },    _addCookie: function(keyValue, type)     {        if (this._lastCookie)            this._lastCookie.setSize(keyValue.position - this._lastCookiePosition);        this._lastCookie = typeof keyValue.value === "string" ? new WebInspector.Cookie(this._target,keyValue.key,keyValue.value,type) : new WebInspector.Cookie(this._target,"",keyValue.key,type);        this._lastCookiePosition = keyValue.position;        this._cookies.push(this._lastCookie);    }};WebInspector.CookieParser.parseCookie = function(target, header) {    return (new WebInspector.CookieParser(target)).parseCookie(header);}WebInspector.CookieParser.parseSetCookie = function(target, header) {    return (new WebInspector.CookieParser(target)).parseSetCookie(header);}WebInspector.Cookie = function(target, name, value, type) {    this._target = target;    this._name = name;    this._value = value;    this._type = type;    this._attributes = {};}WebInspector.Cookie.prototype = {    name: function()     {        return this._name;    },    value: function()     {        return this._value;    },    type: function()     {        return this._type;    },    httpOnly: function()     {        return "httponly" in this._attributes;    },    secure: function()     {        return "secure" in this._attributes;    },    firstPartyOnly: function()     {        return "first-party-only" in this._attributes;    },    session: function()     {        return !("expires" in this._attributes || "max-age" in this._attributes);    },    path: function()     {        return this._attributes["path"];    },    port: function()     {        return this._attributes["port"];    },    domain: function()     {        return this._attributes["domain"];    },    expires: function()     {        return this._attributes["expires"];    },    maxAge: function()     {        return this._attributes["max-age"];    },    size: function()     {        return this._size;    },    setSize: function(size)     {        this._size = size;    },    expiresDate: function(requestDate)     {        if (this.maxAge()) {            var targetDate = requestDate === null  ? new Date() : requestDate;            return new Date(targetDate.getTime() + 1000 * this.maxAge());        }        if (this.expires())            return new Date(this.expires());        return null ;    },    attributes: function()     {        return this._attributes;    },    addAttribute: function(key, value)     {        this._attributes[key.toLowerCase()] = value;    },    remove: function(callback)     {        this._target.networkAgent().deleteCookie(this.name(), (this.secure() ? "https://" : "http://") + this.domain() + this.path(), callback);    }}WebInspector.Cookie.Type = {    Request: 0,    Response: 1};WebInspector.Cookies = {}WebInspector.Cookies.getCookiesAsync = function(callback) {    var allCookies = [];    function mycallback(target, error, cookies)     {        if (error) {            console.error(error);            return;        }        for (var i = 0; i < cookies.length; ++i)            allCookies.push(WebInspector.Cookies._parseProtocolCookie(target, cookies[i]));    }    var barrier = new CallbackBarrier();    for (var target of WebInspector.targetManager.targets(WebInspector.Target.Type.Page))        target.networkAgent().getCookies(barrier.createCallback(mycallback.bind(null , target)));    barrier.callWhenDone(callback.bind(null , allCookies));}WebInspector.Cookies._parseProtocolCookie = function(target, protocolCookie) {    var cookie = new WebInspector.Cookie(target,protocolCookie.name,protocolCookie.value,null );    cookie.addAttribute("domain", protocolCookie["domain"]);    cookie.addAttribute("path", protocolCookie["path"]);    cookie.addAttribute("port", protocolCookie["port"]);    if (protocolCookie["expires"])        cookie.addAttribute("expires", protocolCookie["expires"]);    if (protocolCookie["httpOnly"])        cookie.addAttribute("httpOnly");    if (protocolCookie["secure"])        cookie.addAttribute("secure");    if (protocolCookie["firstPartyOnly"])        cookie.addAttribute("first-party-only");    cookie.setSize(protocolCookie["size"]);    return cookie;}WebInspector.Cookies.cookieMatchesResourceURL = function(cookie, resourceURL) {    var url = resourceURL.asParsedURL();    if (!url || !WebInspector.Cookies.cookieDomainMatchesResourceDomain(cookie.domain(), url.host))        return false;    return ( url.path.startsWith(cookie.path()) && (!cookie.port() || url.port == cookie.port()) && (!cookie.secure() || url.scheme === "https")) ;}WebInspector.Cookies.cookieDomainMatchesResourceDomain = function(cookieDomain, resourceDomain) {    if (cookieDomain.charAt(0) !== '.')        return resourceDomain === cookieDomain;    return !!resourceDomain.match(new RegExp("^([^\\.]+\\.)*" + cookieDomain.substring(1).escapeForRegExp() + "$","i"));};WebInspector.CPUProfileDataModel = function(profile) {    this.profileHead = profile.head;    this.samples = profile.samples;    this.timestamps = profile.timestamps;    this.profileStartTime = profile.startTime * 1000;    this.profileEndTime = profile.endTime * 1000;    this._assignParentsInProfile();    if (this.samples) {        this._normalizeTimestamps();        this._buildIdToNodeMap();        this._fixMissingSamples();        this._fixLineAndColumnNumbers();    }    this._calculateTimes(profile);}WebInspector.CPUProfileDataModel.prototype = {    _calculateTimes: function(profile)     {        function totalHitCount(node) {            var result = node.hitCount;            for (var i = 0; i < node.children.length; i++)                result += totalHitCount(node.children[i]);            return result;        }        profile.totalHitCount = totalHitCount(profile.head);        var duration = this.profileEndTime - this.profileStartTime;        var samplingInterval = duration / profile.totalHitCount;        this.samplingInterval = samplingInterval;        function calculateTimesForNode(node) {            node.selfTime = node.hitCount * samplingInterval;            var totalHitCount = node.hitCount;            for (var i = 0; i < node.children.length; i++)                totalHitCount += calculateTimesForNode(node.children[i]);            node.totalTime = totalHitCount * samplingInterval;            return totalHitCount;        }        calculateTimesForNode(profile.head);    },    _fixLineAndColumnNumbers: function()     {        var nodeListsToTraverse = [this.profileHead.children];        while (nodeListsToTraverse.length) {            var nodeList = nodeListsToTraverse.pop();            for (var i = 0; i < nodeList.length; ++i) {                var node = nodeList[i];                --node.lineNumber;                --node.columnNumber;                if (node.children)                    nodeListsToTraverse.push(node.children);            }        }    },    _assignParentsInProfile: function()     {        var head = this.profileHead;        head.parent = null ;        head.depth = -1;        this.maxDepth = 0;        var nodesToTraverse = [head];        while (nodesToTraverse.length) {            var parent = nodesToTraverse.pop();            var depth = parent.depth + 1;            if (depth > this.maxDepth)                this.maxDepth = depth;            var children = parent.children;            var length = children.length;            for (var i = 0; i < length; ++i) {                var child = children[i];                child.parent = parent;                child.depth = depth;                if (child.children.length)                    nodesToTraverse.push(child);            }        }    },    _normalizeTimestamps: function()     {        var timestamps = this.timestamps;        if (!timestamps) {            var profileStartTime = this.profileStartTime;            var interval = (this.profileEndTime - profileStartTime) / this.samples.length;            timestamps = new Float64Array(this.samples.length + 1);            for (var i = 0; i < timestamps.length; ++i)                timestamps[i] = profileStartTime + i * interval;            this.timestamps = timestamps;            return;        }        for (var i = 0; i < timestamps.length; ++i)            timestamps[i] /= 1000;        var averageSample = (timestamps.peekLast() - timestamps[0]) / (timestamps.length - 1);        this.timestamps.push(timestamps.peekLast() + averageSample);        this.profileStartTime = timestamps[0];        this.profileEndTime = timestamps.peekLast();    },    _buildIdToNodeMap: function()     {        this._idToNode = {};        var idToNode = this._idToNode;        var stack = [this.profileHead];        while (stack.length) {            var node = stack.pop();            idToNode[node.id] = node;            for (var i = 0; i < node.children.length; i++)                stack.push(node.children[i]);        }        var topLevelNodes = this.profileHead.children;        for (var i = 0; i < topLevelNodes.length && !(this.gcNode && this.programNode && this.idleNode); i++) {            var node = topLevelNodes[i];            if (node.functionName === "(garbage collector)")                this.gcNode = node;            else if (node.functionName === "(program)")                this.programNode = node;            else if (node.functionName === "(idle)")                this.idleNode = node;        }    },    _fixMissingSamples: function()     {        var samples = this.samples;        var samplesCount = samples.length;        if (!this.programNode || samplesCount < 3)            return;        var idToNode = this._idToNode;        var programNodeId = this.programNode.id;        var gcNodeId = this.gcNode ? this.gcNode.id : -1;        var idleNodeId = this.idleNode ? this.idleNode.id : -1;        var prevNodeId = samples[0];        var nodeId = samples[1];        for (var sampleIndex = 1; sampleIndex < samplesCount - 1; sampleIndex++) {            var nextNodeId = samples[sampleIndex + 1];            if (nodeId === programNodeId && !isSystemNode(prevNodeId) && !isSystemNode(nextNodeId) && bottomNode(idToNode[prevNodeId]) === bottomNode(idToNode[nextNodeId])) {                samples[sampleIndex] = prevNodeId;            }            prevNodeId = nodeId;            nodeId = nextNodeId;        }        function bottomNode(node)         {            while (node.parent)                node = node.parent;            return node;        }        function isSystemNode(nodeId)         {            return nodeId === programNodeId || nodeId === gcNodeId || nodeId === idleNodeId;        }    },    forEachFrame: function(openFrameCallback, closeFrameCallback, startTime, stopTime)     {        if (!this.profileHead)            return;        startTime = startTime || 0;        stopTime = stopTime || Infinity;        var samples = this.samples;        var timestamps = this.timestamps;        var idToNode = this._idToNode;        var gcNode = this.gcNode;        var samplesCount = samples.length;        var startIndex = timestamps.lowerBound(startTime);        var stackTop = 0;        var stackNodes = [];        var prevId = this.profileHead.id;        var sampleTime = timestamps[samplesCount];        var gcParentNode = null ;        if (!this._stackStartTimes)            this._stackStartTimes = new Float64Array(this.maxDepth + 2);        var stackStartTimes = this._stackStartTimes;        if (!this._stackChildrenDuration)            this._stackChildrenDuration = new Float64Array(this.maxDepth + 2);        var stackChildrenDuration = this._stackChildrenDuration;        for (var sampleIndex = startIndex; sampleIndex < samplesCount; sampleIndex++) {            sampleTime = timestamps[sampleIndex];            if (sampleTime >= stopTime)                break;            var id = samples[sampleIndex];            if (id === prevId)                continue;var node = idToNode[id];            var prevNode = idToNode[prevId];            if (node === gcNode) {                gcParentNode = prevNode;                openFrameCallback(gcParentNode.depth + 1, gcNode, sampleTime);                stackStartTimes[++stackTop] = sampleTime;                stackChildrenDuration[stackTop] = 0;                prevId = id;                continue;            }            if (prevNode === gcNode) {                var start = stackStartTimes[stackTop];                var duration = sampleTime - start;                stackChildrenDuration[stackTop - 1] += duration;                closeFrameCallback(gcParentNode.depth + 1, gcNode, start, duration, duration - stackChildrenDuration[stackTop]);                --stackTop;                prevNode = gcParentNode;                prevId = prevNode.id;                gcParentNode = null ;            }            while (node.depth > prevNode.depth) {                stackNodes.push(node);                node = node.parent;            }            while (prevNode !== node) {                var start = stackStartTimes[stackTop];                var duration = sampleTime - start;                stackChildrenDuration[stackTop - 1] += duration;                closeFrameCallback(prevNode.depth, prevNode, start, duration, duration - stackChildrenDuration[stackTop]);                --stackTop;                if (node.depth === prevNode.depth) {                    stackNodes.push(node);                    node = node.parent;                }                prevNode = prevNode.parent;            }            while (stackNodes.length) {                node = stackNodes.pop();                openFrameCallback(node.depth, node, sampleTime);                stackStartTimes[++stackTop] = sampleTime;                stackChildrenDuration[stackTop] = 0;            }            prevId = id;        }        if (idToNode[prevId] === gcNode) {            var start = stackStartTimes[stackTop];            var duration = sampleTime - start;            stackChildrenDuration[stackTop - 1] += duration;            closeFrameCallback(gcParentNode.depth + 1, node, start, duration, duration - stackChildrenDuration[stackTop]);            --stackTop;        }        for (var node = idToNode[prevId]; node.parent; node = node.parent) {            var start = stackStartTimes[stackTop];            var duration = sampleTime - start;            stackChildrenDuration[stackTop - 1] += duration;            closeFrameCallback(node.depth, node, start, duration, duration - stackChildrenDuration[stackTop]);            --stackTop;        }    },    nodeByIndex: function(index)     {        return this._idToNode[this.samples[index]];    }};WebInspector.CPUProfilerModel = function(target) {    WebInspector.SDKModel.call(this, WebInspector.CPUProfilerModel, target);    this._isRecording = false;    target.registerProfilerDispatcher(this);    target.profilerAgent().enable();    this._configureCpuProfilerSamplingInterval();    WebInspector.moduleSetting("highResolutionCpuProfiling").addChangeListener(this._configureCpuProfilerSamplingInterval, this);}WebInspector.CPUProfilerModel.EventTypes = {    ProfileStarted: "ProfileStarted",    ProfileStopped: "ProfileStopped",    ConsoleProfileStarted: "ConsoleProfileStarted",    ConsoleProfileFinished: "ConsoleProfileFinished"};WebInspector.CPUProfilerModel.prototype = {    _configureCpuProfilerSamplingInterval: function()     {        var intervalUs = WebInspector.moduleSetting("highResolutionCpuProfiling").get() ? 100 : 1000;        this.target().profilerAgent().setSamplingInterval(intervalUs);    },    consoleProfileFinished: function(id, scriptLocation, cpuProfile, title)     {        self.runtime.loadModulePromise("profiler").then(dispatchEvent.bind(this));        function dispatchEvent()         {            var debuggerModel = (WebInspector.DebuggerModel.fromTarget(this.target()));            var debuggerLocation = WebInspector.DebuggerModel.Location.fromPayload(debuggerModel, scriptLocation);            this.dispatchEventToListeners(WebInspector.CPUProfilerModel.EventTypes.ConsoleProfileFinished, {                protocolId: id,                scriptLocation: debuggerLocation,                cpuProfile: cpuProfile,                title: title            });        }    },    consoleProfileStarted: function(id, scriptLocation, title)     {        self.runtime.loadModulePromise("profiler").then(dispatchEvent.bind(this));        function dispatchEvent()         {            var debuggerModel = (WebInspector.DebuggerModel.fromTarget(this.target()));            var debuggerLocation = WebInspector.DebuggerModel.Location.fromPayload(debuggerModel, scriptLocation);            this.dispatchEventToListeners(WebInspector.CPUProfilerModel.EventTypes.ConsoleProfileStarted, {                protocolId: id,                scriptLocation: debuggerLocation,                title: title            });        }    },    isRecordingProfile: function()     {        return this._isRecording;    },    startRecording: function()     {        this._isRecording = true;        this.target().profilerAgent().start();        this.dispatchEventToListeners(WebInspector.CPUProfilerModel.EventTypes.ProfileStarted);        WebInspector.userMetrics.ProfilesCPUProfileTaken.record();    },    stopRecording: function()     {        function extractProfile(error, profile)         {            return !error && profile ? profile : null ;        }        this._isRecording = false;        this.dispatchEventToListeners(WebInspector.CPUProfilerModel.EventTypes.ProfileStopped);        return this.target().profilerAgent().stop(extractProfile);    },    dispose: function()     {        WebInspector.moduleSetting("highResolutionCpuProfiling").removeChangeListener(this._configureCpuProfilerSamplingInterval, this);    },    __proto__: WebInspector.SDKModel.prototype};WebInspector.CSSMetadata = function(properties) {    this._values = ([]);    this._longhands = {};    this._shorthands = {};    for (var i = 0; i < properties.length; ++i) {        var property = properties[i];        if (typeof property === "string") {            this._values.push(property);            continue;        }        var propertyName = property.name;        if (!CSS.supports(propertyName, "initial"))            continue;this._values.push(propertyName);        var longhands = properties[i].longhands;        if (longhands) {            this._longhands[propertyName] = longhands;            for (var j = 0; j < longhands.length; ++j) {                var longhandName = longhands[j];                var shorthands = this._shorthands[longhandName];                if (!shorthands) {                    shorthands = [];                    this._shorthands[longhandName] = shorthands;                }                shorthands.push(propertyName);            }        }    }    this._values.sort();}WebInspector.CSSMetadata.cssPropertiesMetainfo = new WebInspector.CSSMetadata([]);WebInspector.CSSMetadata.isColorAwareProperty = function(propertyName) {    return !!WebInspector.CSSMetadata._colorAwareProperties[propertyName.toLowerCase()];}WebInspector.CSSMetadata.isLengthProperty = function(propertyName) {    if (propertyName === "line-height")        return false;    if (!WebInspector.CSSMetadata._distancePropertiesKeySet)        WebInspector.CSSMetadata._distancePropertiesKeySet = WebInspector.CSSMetadata._distanceProperties.keySet();    return WebInspector.CSSMetadata._distancePropertiesKeySet[propertyName] || propertyName.startsWith("margin") || propertyName.startsWith("padding") || propertyName.indexOf("width") !== -1 || propertyName.indexOf("height") !== -1;}WebInspector.CSSMetadata.isBezierAwareProperty = function(propertyName) {    return !!WebInspector.CSSMetadata._bezierAwareProperties[propertyName.toLowerCase()];}WebInspector.CSSMetadata.InheritedProperties = ["azimuth", "border-collapse", "border-spacing", "caption-side", "color", "cursor", "direction", "elevation", "empty-cells", "font-family", "font-size", "font-style", "font-variant", "font-weight", "font", "letter-spacing", "line-height", "list-style-image", "list-style-position", "list-style-type", "list-style", "orphans", "overflow-wrap", "pitch-range", "pitch", "quotes", "resize", "richness", "speak-header", "speak-numeral", "speak-punctuation", "speak", "speech-rate", "stress", "text-align", "text-indent", "text-transform", "text-shadow", "-webkit-user-select", "visibility", "voice-family", "volume", "white-space", "widows", "word-spacing", "word-wrap", "zoom"].keySet();WebInspector.CSSMetadata.NonStandardInheritedProperties = ["-webkit-font-smoothing"].keySet();WebInspector.CSSMetadata.canonicalPropertyName = function(name) {    if (!name || name.length < 9 || name.charAt(0) !== "-")        return name.toLowerCase();    var match = name.match(/(?:-webkit-)(.+)/);    var propertiesSet = WebInspector.CSSMetadata.cssPropertiesMetainfoKeySet();    var hasSupportedProperties = WebInspector.CSSMetadata.cssPropertiesMetainfo._values.length > 0;    if (!match || (hasSupportedProperties && !propertiesSet.hasOwnProperty(match[1].toLowerCase())))        return name.toLowerCase();    return match[1].toLowerCase();}WebInspector.CSSMetadata.isPropertyInherited = function(propertyName) {    return !!(WebInspector.CSSMetadata.InheritedProperties[WebInspector.CSSMetadata.canonicalPropertyName(propertyName)] || WebInspector.CSSMetadata.NonStandardInheritedProperties[propertyName.toLowerCase()]);}WebInspector.CSSMetadata._distanceProperties = ['background-position', 'border-spacing', 'bottom', 'font-size', 'height', 'left', 'letter-spacing', 'max-height', 'max-width', 'min-height', 'min-width', 'right', 'text-indent', 'top', 'width', 'word-spacing'];WebInspector.CSSMetadata._bezierAwareProperties = ["animation", "animation-timing-function", "transition", "transition-timing-function", "-webkit-animation", "-webkit-animation-timing-function", "-webkit-transition", "-webkit-transition-timing-function"].keySet();WebInspector.CSSMetadata._colorAwareProperties = ["background", "background-color", "background-image", "border", "border-color", "border-top", "border-right", "border-bottom", "border-left", "border-top-color", "border-right-color", "border-bottom-color", "border-left-color", "box-shadow", "color", "fill", "outline", "outline-color", "stroke", "text-shadow", "-webkit-box-shadow", "-webkit-column-rule-color", "-webkit-text-decoration-color", "-webkit-text-emphasis", "-webkit-text-emphasis-color"].keySet();WebInspector.CSSMetadata._propertyDataMap = {    "table-layout": {        values: ["auto", "fixed"]    },    "visibility": {        values: ["hidden", "visible", "collapse"]    },    "background-repeat": {        values: ["repeat", "repeat-x", "repeat-y", "no-repeat", "space", "round"]    },    "content": {        values: ["list-item", "close-quote", "no-close-quote", "no-open-quote", "open-quote"]    },    "list-style-image": {        values: ["none"]    },    "clear": {        values: ["none", "left", "right", "both"]    },    "overflow-x": {        values: ["hidden", "auto", "visible", "overlay", "scroll"]    },    "stroke-linejoin": {        values: ["round", "miter", "bevel"]    },    "baseline-shift": {        values: ["baseline", "sub", "super"]    },    "border-bottom-width": {        values: ["medium", "thick", "thin"]    },    "margin-top-collapse": {        values: ["collapse", "separate", "discard"]    },    "max-height": {        values: ["none"]    },    "box-orient": {        values: ["horizontal", "vertical", "inline-axis", "block-axis"],    },    "font-stretch": {        values: ["normal", "wider", "narrower", "ultra-condensed", "extra-condensed", "condensed", "semi-condensed", "semi-expanded", "expanded", "extra-expanded", "ultra-expanded"]    },    "-webkit-background-composite": {        values: ["highlight", "clear", "copy", "source-over", "source-in", "source-out", "source-atop", "destination-over", "destination-in", "destination-out", "destination-atop", "xor", "plus-darker", "plus-lighter"]    },    "border-left-width": {        values: ["medium", "thick", "thin"]    },    "box-shadow": {        values: ["inset", "none"]    },    "-webkit-writing-mode": {        values: ["lr", "rl", "tb", "lr-tb", "rl-tb", "tb-rl", "horizontal-tb", "vertical-rl", "vertical-lr", "horizontal-bt"]    },    "border-collapse": {        values: ["collapse", "separate"]    },    "page-break-inside": {        values: ["auto", "avoid"]    },    "border-top-width": {        values: ["medium", "thick", "thin"]    },    "outline-color": {        values: ["invert"]    },    "outline-style": {        values: ["none", "hidden", "inset", "groove", "ridge", "outset", "dotted", "dashed", "solid", "double"]    },    "cursor": {        values: ["none", "copy", "auto", "crosshair", "default", "pointer", "move", "vertical-text", "cell", "context-menu", "alias", "progress", "no-drop", "not-allowed", "-webkit-zoom-in", "-webkit-zoom-out", "e-resize", "ne-resize", "nw-resize", "n-resize", "se-resize", "sw-resize", "s-resize", "w-resize", "ew-resize", "ns-resize", "nesw-resize", "nwse-resize", "col-resize", "row-resize", "text", "wait", "help", "all-scroll", "-webkit-grab", "-webkit-grabbing"]    },    "border-width": {        values: ["medium", "thick", "thin"]    },    "border-style": {        values: ["none", "hidden", "inset", "groove", "ridge", "outset", "dotted", "dashed", "solid", "double"]    },    "size": {        values: ["a3", "a4", "a5", "b4", "b5", "landscape", "ledger", "legal", "letter", "portrait"]    },    "background-size": {        values: ["contain", "cover"]    },    "direction": {        values: ["ltr", "rtl"]    },    "enable-background": {        values: ["accumulate", "new"]    },    "float": {        values: ["none", "left", "right"]    },    "overflow-y": {        values: ["hidden", "auto", "visible", "overlay", "scroll"]    },    "margin-bottom-collapse": {        values: ["collapse", "separate", "discard"]    },    "box-reflect": {        values: ["left", "right", "above", "below"]    },    "overflow": {        values: ["hidden", "auto", "visible", "overlay", "scroll"]    },    "text-rendering": {        values: ["auto", "optimizeSpeed", "optimizeLegibility", "geometricPrecision"]    },    "text-align": {        values: ["-webkit-auto", "start", "end", "left", "right", "center", "justify", "-webkit-left", "-webkit-right", "-webkit-center"]    },    "list-style-position": {        values: ["outside", "inside", "hanging"]    },    "margin-bottom": {        values: ["auto"]    },    "color-interpolation": {        values: ["linearrgb"]    },    "background-origin": {        values: ["border-box", "content-box", "padding-box"]    },    "word-wrap": {        values: ["normal", "break-word"]    },    "font-weight": {        values: ["normal", "bold", "bolder", "lighter", "100", "200", "300", "400", "500", "600", "700", "800", "900"]    },    "margin-before-collapse": {        values: ["collapse", "separate", "discard"]    },    "text-transform": {        values: ["none", "capitalize", "uppercase", "lowercase"]    },    "border-right-style": {        values: ["none", "hidden", "inset", "groove", "ridge", "outset", "dotted", "dashed", "solid", "double"]    },    "border-left-style": {        values: ["none", "hidden", "inset", "groove", "ridge", "outset", "dotted", "dashed", "solid", "double"]    },    "-webkit-text-emphasis": {        values: ["circle", "filled", "open", "dot", "double-circle", "triangle", "sesame"]    },    "font-style": {        values: ["italic", "oblique", "normal"]    },    "speak": {        values: ["none", "normal", "spell-out", "digits", "literal-punctuation", "no-punctuation"]    },    "color-rendering": {        values: ["auto", "optimizeSpeed", "optimizeQuality"]    },    "list-style-type": {        values: ["none", "inline", "disc", "circle", "square", "decimal", "decimal-leading-zero", "arabic-indic", "binary", "bengali", "cambodian", "khmer", "devanagari", "gujarati", "gurmukhi", "kannada", "lower-hexadecimal", "lao", "malayalam", "mongolian", "myanmar", "octal", "oriya", "persian", "urdu", "telugu", "tibetan", "thai", "upper-hexadecimal", "lower-roman", "upper-roman", "lower-greek", "lower-alpha", "lower-latin", "upper-alpha", "upper-latin", "afar", "ethiopic-halehame-aa-et", "ethiopic-halehame-aa-er", "amharic", "ethiopic-halehame-am-et", "amharic-abegede", "ethiopic-abegede-am-et", "cjk-earthly-branch", "cjk-heavenly-stem", "ethiopic", "ethiopic-halehame-gez", "ethiopic-abegede", "ethiopic-abegede-gez", "hangul-consonant", "hangul", "lower-norwegian", "oromo", "ethiopic-halehame-om-et", "sidama", "ethiopic-halehame-sid-et", "somali", "ethiopic-halehame-so-et", "tigre", "ethiopic-halehame-tig", "tigrinya-er", "ethiopic-halehame-ti-er", "tigrinya-er-abegede", "ethiopic-abegede-ti-er", "tigrinya-et", "ethiopic-halehame-ti-et", "tigrinya-et-abegede", "ethiopic-abegede-ti-et", "upper-greek", "upper-norwegian", "asterisks", "footnotes", "hebrew", "armenian", "lower-armenian", "upper-armenian", "georgian", "cjk-ideographic", "hiragana", "katakana", "hiragana-iroha", "katakana-iroha"]    },    "-webkit-text-combine": {        values: ["none", "horizontal"]    },    "outline": {        values: ["none", "hidden", "inset", "groove", "ridge", "outset", "dotted", "dashed", "solid", "double"]    },    "font": {        values: ["caption", "icon", "menu", "message-box", "small-caption", "-webkit-mini-control", "-webkit-small-control", "-webkit-control", "status-bar", "italic", "oblique", "small-caps", "normal", "bold", "bolder", "lighter", "100", "200", "300", "400", "500", "600", "700", "800", "900", "xx-small", "x-small", "small", "medium", "large", "x-large", "xx-large", "-webkit-xxx-large", "smaller", "larger", "serif", "sans-serif", "cursive", "fantasy", "monospace", "-webkit-body", "-webkit-pictograph"]    },    "dominant-baseline": {        values: ["middle", "auto", "central", "text-before-edge", "text-after-edge", "ideographic", "alphabetic", "hanging", "mathematical", "use-script", "no-change", "reset-size"]    },    "display": {        values: ["none", "inline", "block", "list-item", "run-in", "inline-block", "table", "inline-table", "table-row-group", "table-header-group", "table-footer-group", "table-row", "table-column-group", "table-column", "table-cell", "table-caption", "-webkit-box", "-webkit-inline-box", "flex", "inline-flex", "grid", "inline-grid"]    },    "-webkit-text-emphasis-position": {        values: ["over", "under"]    },    "image-rendering": {        values: ["auto", "optimizeSpeed", "optimizeQuality", "pixelated"]    },    "alignment-baseline": {        values: ["baseline", "middle", "auto", "before-edge", "after-edge", "central", "text-before-edge", "text-after-edge", "ideographic", "alphabetic", "hanging", "mathematical"]    },    "outline-width": {        values: ["medium", "thick", "thin"]    },    "box-align": {        values: ["baseline", "center", "stretch", "start", "end"]    },    "border-right-width": {        values: ["medium", "thick", "thin"]    },    "border-top-style": {        values: ["none", "hidden", "inset", "groove", "ridge", "outset", "dotted", "dashed", "solid", "double"]    },    "line-height": {        values: ["normal"]    },    "text-overflow": {        values: ["clip", "ellipsis"]    },    "overflow-wrap": {        values: ["normal", "break-word"]    },    "box-direction": {        values: ["normal", "reverse"]    },    "margin-after-collapse": {        values: ["collapse", "separate", "discard"]    },    "page-break-before": {        values: ["left", "right", "auto", "always", "avoid"]    },    "border-image": {        values: ["repeat", "stretch"]    },    "text-decoration": {        values: ["blink", "line-through", "overline", "underline"]    },    "position": {        values: ["absolute", "fixed", "relative", "static"]    },    "font-family": {        values: ["serif", "sans-serif", "cursive", "fantasy", "monospace", "-webkit-body", "-webkit-pictograph"]    },    "text-overflow-mode": {        values: ["clip", "ellipsis"]    },    "border-bottom-style": {        values: ["none", "hidden", "inset", "groove", "ridge", "outset", "dotted", "dashed", "solid", "double"]    },    "unicode-bidi": {        values: ["normal", "bidi-override", "embed", "isolate", "isolate-override", "plaintext"]    },    "clip-rule": {        values: ["nonzero", "evenodd"]    },    "margin-left": {        values: ["auto"]    },    "margin-top": {        values: ["auto"]    },    "zoom": {        values: ["normal", "document", "reset"]    },    "max-width": {        values: ["none"]    },    "caption-side": {        values: ["top", "bottom"]    },    "empty-cells": {        values: ["hide", "show"]    },    "pointer-events": {        values: ["none", "all", "auto", "visible", "visiblepainted", "visiblefill", "visiblestroke", "painted", "fill", "stroke", "bounding-box"]    },    "letter-spacing": {        values: ["normal"]    },    "background-clip": {        values: ["border-box", "content-box", "padding-box"]    },    "-webkit-font-smoothing": {        values: ["none", "auto", "antialiased", "subpixel-antialiased"]    },    "border": {        values: ["none", "hidden", "inset", "groove", "ridge", "outset", "dotted", "dashed", "solid", "double"]    },    "font-size": {        values: ["xx-small", "x-small", "small", "medium", "large", "x-large", "xx-large", "-webkit-xxx-large", "smaller", "larger"]    },    "font-variant": {        values: ["small-caps", "normal"]    },    "vertical-align": {        values: ["baseline", "middle", "sub", "super", "text-top", "text-bottom", "top", "bottom", "-webkit-baseline-middle"]    },    "white-space": {        values: ["normal", "nowrap", "pre", "pre-line", "pre-wrap"]    },    "box-lines": {        values: ["single", "multiple"]    },    "page-break-after": {        values: ["left", "right", "auto", "always", "avoid"]    },    "clip-path": {        values: ["none"]    },    "margin": {        values: ["auto"]    },    "margin-right": {        values: ["auto"]    },    "word-break": {        values: ["normal", "break-all", "break-word"]    },    "word-spacing": {        values: ["normal"]    },    "-webkit-text-emphasis-style": {        values: ["circle", "filled", "open", "dot", "double-circle", "triangle", "sesame"]    },    "transform": {        values: ["scale", "scaleX", "scaleY", "scale3d", "rotate", "rotateX", "rotateY", "rotateZ", "rotate3d", "skew", "skewX", "skewY", "translate", "translateX", "translateY", "translateZ", "translate3d", "matrix", "matrix3d", "perspective"]    },    "image-resolution": {        values: ["from-image", "snap"]    },    "box-sizing": {        values: ["content-box", "border-box"]    },    "clip": {        values: ["auto"]    },    "resize": {        values: ["none", "both", "horizontal", "vertical"]    },    "align-content": {        values: ["flex-start", "flex-end", "center", "space-between", "space-around", "stretch"]    },    "align-items": {        values: ["flex-start", "flex-end", "center", "baseline", "stretch"]    },    "align-self": {        values: ["auto", "flex-start", "flex-end", "center", "baseline", "stretch"]    },    "flex-direction": {        values: ["row", "row-reverse", "column", "column-reverse"]    },    "justify-content": {        values: ["flex-start", "flex-end", "center", "space-between", "space-around"]    },    "flex-wrap": {        values: ["nowrap", "wrap", "wrap-reverse"]    },    "perspective": {        values: ["none"]    },    "perspective-origin": {        values: ["left", "center", "right", "top", "bottom"]    },    "transform-origin": {        values: ["left", "center", "right", "top", "bottom"]    },    "transform-style": {        values: ["flat", "preserve-3d"]    },    "transition-timing-function": {        values: ["ease", "linear", "ease-in", "ease-out", "ease-in-out", "step-start", "step-end", "steps", "cubic-bezier"]    },    "animation-timing-function": {        values: ["ease", "linear", "ease-in", "ease-out", "ease-in-out", "step-start", "step-end", "steps", "cubic-bezier"]    },    "animation-direction": {        values: ["normal", "reverse", "alternate", "alternate-reverse"]    },    "animation-play-state": {        values: ["running", "paused"]    },    "animation-fill-mode": {        values: ["none", "forwards", "backwards", "both"]    },    "-webkit-backface-visibility": {        values: ["visible", "hidden"]    },    "-webkit-box-decoration-break": {        values: ["slice", "clone"]    },    "-webkit-column-break-after": {        values: ["auto", "always", "avoid", "left", "right", "page", "column", "avoid-page", "avoid-column"]    },    "-webkit-column-break-before": {        values: ["auto", "always", "avoid", "left", "right", "page", "column", "avoid-page", "avoid-column"]    },    "-webkit-column-break-inside": {        values: ["auto", "avoid", "avoid-page", "avoid-column"]    },    "-webkit-column-span": {        values: ["none", "all"]    },    "-webkit-column-count": {        values: ["auto"]    },    "-webkit-column-gap": {        values: ["normal"]    },    "-webkit-filter": {        values: ["url", "blur", "brightness", "contrast", "drop-shadow", "grayscale", "hue-rotate", "invert", "opacity", "saturate", "sepia"]    },    "-webkit-line-break": {        values: ["auto", "loose", "normal", "strict"]    },    "text-align-last": {        values: ["auto", "start", "end", "left", "right", "center", "justify"]    },    "-webkit-text-decoration-line": {        values: ["none", "underline", "overline", "line-through", "blink"]    },    "-webkit-text-decoration-style": {        values: ["solid", "double", "dotted", "dashed", "wavy"]    },    "-webkit-text-decoration-skip": {        values: ["none", "objects", "spaces", "ink", "edges", "box-decoration"]    }}WebInspector.CSSMetadata.keywordsForProperty = function(propertyName) {    var acceptedKeywords = ["inherit", "initial"];    var descriptor = WebInspector.CSSMetadata.descriptor(propertyName);    if (descriptor && descriptor.values)        acceptedKeywords.push.apply(acceptedKeywords, descriptor.values);    if (WebInspector.CSSMetadata.isColorAwareProperty(propertyName)) {        acceptedKeywords.push("currentColor");        for (var color in WebInspector.Color.Nicknames)            acceptedKeywords.push(color);    }    return new WebInspector.CSSMetadata(acceptedKeywords);}WebInspector.CSSMetadata.descriptor = function(propertyName) {    if (!propertyName)        return null ;    var unprefixedName = propertyName.replace(/^-webkit-/, "");    propertyName = propertyName.toLowerCase();    var entry = WebInspector.CSSMetadata._propertyDataMap[propertyName];    if (!entry && unprefixedName !== propertyName)        entry = WebInspector.CSSMetadata._propertyDataMap[unprefixedName];    return entry || null ;}WebInspector.CSSMetadata.initializeWithSupportedProperties = function(properties) {    WebInspector.CSSMetadata.cssPropertiesMetainfo = new WebInspector.CSSMetadata(properties);}WebInspector.CSSMetadata.cssPropertiesMetainfoKeySet = function() {    if (!WebInspector.CSSMetadata._cssPropertiesMetainfoKeySet)        WebInspector.CSSMetadata._cssPropertiesMetainfoKeySet = WebInspector.CSSMetadata.cssPropertiesMetainfo.keySet();    return WebInspector.CSSMetadata._cssPropertiesMetainfoKeySet;}WebInspector.CSSMetadata.Weight = {    "align-content": 57,    "align-items": 129,    "align-self": 55,    "animation": 175,    "animation-delay": 114,    "animation-direction": 113,    "animation-duration": 137,    "animation-fill-mode": 132,    "animation-iteration-count": 124,    "animation-name": 139,    "animation-play-state": 104,    "animation-timing-function": 141,    "backface-visibility": 123,    "background": 249,    "background-attachment": 119,    "background-clip": 165,    "background-color": 259,    "background-image": 246,    "background-origin": 107,    "background-position": 237,    "background-position-x": 108,    "background-position-y": 93,    "background-repeat": 234,    "background-size": 203,    "border": 263,    "border-bottom": 233,    "border-bottom-color": 190,    "border-bottom-left-radius": 186,    "border-bottom-right-radius": 185,    "border-bottom-style": 150,    "border-bottom-width": 179,    "border-collapse": 209,    "border-color": 226,    "border-image": 89,    "border-image-outset": 50,    "border-image-repeat": 49,    "border-image-slice": 58,    "border-image-source": 32,    "border-image-width": 52,    "border-left": 221,    "border-left-color": 174,    "border-left-style": 142,    "border-left-width": 172,    "border-radius": 224,    "border-right": 223,    "border-right-color": 182,    "border-right-style": 130,    "border-right-width": 178,    "border-spacing": 198,    "border-style": 206,    "border-top": 231,    "border-top-color": 192,    "border-top-left-radius": 187,    "border-top-right-radius": 189,    "border-top-style": 152,    "border-top-width": 180,    "border-width": 214,    "bottom": 227,    "box-shadow": 213,    "box-sizing": 216,    "caption-side": 96,    "clear": 229,    "clip": 173,    "clip-rule": 5,    "color": 256,    "content": 219,    "counter-increment": 111,    "counter-reset": 110,    "cursor": 250,    "direction": 176,    "display": 262,    "empty-cells": 99,    "fill": 140,    "fill-opacity": 82,    "fill-rule": 22,    "filter": 160,    "flex": 133,    "flex-basis": 66,    "flex-direction": 85,    "flex-flow": 94,    "flex-grow": 112,    "flex-shrink": 61,    "flex-wrap": 68,    "float": 252,    "font": 211,    "font-family": 254,    "font-kerning": 18,    "font-size": 264,    "font-stretch": 77,    "font-style": 220,    "font-variant": 161,    "font-weight": 257,    "height": 266,    "image-rendering": 90,    "justify-content": 127,    "left": 248,    "letter-spacing": 188,    "line-height": 244,    "list-style": 215,    "list-style-image": 145,    "list-style-position": 149,    "list-style-type": 199,    "margin": 267,    "margin-bottom": 241,    "margin-left": 243,    "margin-right": 238,    "margin-top": 253,    "mask": 20,    "max-height": 205,    "max-width": 225,    "min-height": 217,    "min-width": 218,    "object-fit": 33,    "opacity": 251,    "order": 117,    "orphans": 146,    "outline": 222,    "outline-color": 153,    "outline-offset": 147,    "outline-style": 151,    "outline-width": 148,    "overflow": 255,    "overflow-wrap": 105,    "overflow-x": 184,    "overflow-y": 196,    "padding": 265,    "padding-bottom": 230,    "padding-left": 235,    "padding-right": 232,    "padding-top": 240,    "page": 8,    "page-break-after": 120,    "page-break-before": 69,    "page-break-inside": 121,    "perspective": 92,    "perspective-origin": 103,    "pointer-events": 183,    "position": 261,    "quotes": 158,    "resize": 168,    "right": 245,    "shape-rendering": 38,    "size": 64,    "speak": 118,    "src": 170,    "stop-color": 42,    "stop-opacity": 31,    "stroke": 98,    "stroke-dasharray": 36,    "stroke-dashoffset": 3,    "stroke-linecap": 30,    "stroke-linejoin": 21,    "stroke-miterlimit": 12,    "stroke-opacity": 34,    "stroke-width": 87,    "table-layout": 171,    "tab-size": 46,    "text-align": 260,    "text-anchor": 35,    "text-decoration": 247,    "text-indent": 207,    "text-overflow": 204,    "text-rendering": 155,    "text-shadow": 208,    "text-transform": 202,    "top": 258,    "touch-action": 80,    "transform": 181,    "transform-origin": 162,    "transform-style": 86,    "transition": 193,    "transition-delay": 134,    "transition-duration": 135,    "transition-property": 131,    "transition-timing-function": 122,    "unicode-bidi": 156,    "unicode-range": 136,    "vertical-align": 236,    "visibility": 242,    "-webkit-appearance": 191,    "-webkit-backface-visibility": 154,    "-webkit-background-clip": 164,    "-webkit-background-origin": 40,    "-webkit-background-size": 163,    "-webkit-border-end": 9,    "-webkit-border-horizontal-spacing": 81,    "-webkit-border-image": 75,    "-webkit-border-radius": 212,    "-webkit-border-start": 10,    "-webkit-border-start-color": 16,    "-webkit-border-start-width": 13,    "-webkit-border-vertical-spacing": 43,    "-webkit-box-align": 101,    "-webkit-box-direction": 51,    "-webkit-box-flex": 128,    "-webkit-box-lines": 2,    "-webkit-box-ordinal-group": 91,    "-webkit-box-orient": 144,    "-webkit-box-pack": 106,    "-webkit-box-reflect": 39,    "-webkit-box-shadow": 210,    "-webkit-column-break-inside": 60,    "-webkit-column-count": 84,    "-webkit-column-gap": 76,    "-webkit-column-rule": 25,    "-webkit-column-rule-color": 23,    "-webkit-columns": 44,    "-webkit-column-span": 29,    "-webkit-column-width": 47,    "-webkit-filter": 159,    "-webkit-font-feature-settings": 59,    "-webkit-font-smoothing": 177,    "-webkit-highlight": 1,    "-webkit-line-break": 45,    "-webkit-line-clamp": 126,    "-webkit-margin-after": 67,    "-webkit-margin-before": 70,    "-webkit-margin-collapse": 14,    "-webkit-margin-end": 65,    "-webkit-margin-start": 100,    "-webkit-margin-top-collapse": 78,    "-webkit-mask": 19,    "-webkit-mask-box-image": 72,    "-webkit-mask-image": 88,    "-webkit-mask-position": 54,    "-webkit-mask-repeat": 63,    "-webkit-mask-size": 79,    "-webkit-padding-after": 15,    "-webkit-padding-before": 28,    "-webkit-padding-end": 48,    "-webkit-padding-start": 73,    "-webkit-print-color-adjust": 83,    "-webkit-rtl-ordering": 7,    "-webkit-tap-highlight-color": 169,    "-webkit-text-emphasis-color": 11,    "-webkit-text-fill-color": 71,    "-webkit-text-security": 17,    "-webkit-text-stroke": 56,    "-webkit-text-stroke-color": 37,    "-webkit-text-stroke-width": 53,    "-webkit-user-drag": 95,    "-webkit-user-modify": 62,    "-webkit-user-select": 194,    "-webkit-writing-mode": 4,    "white-space": 228,    "widows": 115,    "width": 268,    "will-change": 74,    "word-break": 166,    "word-spacing": 157,    "word-wrap": 197,    "writing-mode": 41,    "z-index": 239,    "zoom": 200};WebInspector.CSSMetadata.prototype = {    startsWith: function(prefix)     {        var firstIndex = this._firstIndexOfPrefix(prefix);        if (firstIndex === -1)            return [];        var results = [];        while (firstIndex < this._values.length && this._values[firstIndex].startsWith(prefix))            results.push(this._values[firstIndex++]);        return results;    },    mostUsedOf: function(properties)     {        var maxWeight = 0;        var index = 0;        for (var i = 0; i < properties.length; i++) {            var weight = WebInspector.CSSMetadata.Weight[properties[i]];            if (!weight)                weight = WebInspector.CSSMetadata.Weight[WebInspector.CSSMetadata.canonicalPropertyName(properties[i])];            if (weight > maxWeight) {                maxWeight = weight;                index = i;            }        }        return index;    },    _firstIndexOfPrefix: function(prefix)     {        if (!this._values.length)            return -1;        if (!prefix)            return 0;        var maxIndex = this._values.length - 1;        var minIndex = 0;        var foundIndex;        do {            var middleIndex = (maxIndex + minIndex) >> 1;            if (this._values[middleIndex].startsWith(prefix)) {                foundIndex = middleIndex;                break;            }            if (this._values[middleIndex] < prefix)                minIndex = middleIndex + 1;            else                maxIndex = middleIndex - 1;        } while (minIndex <= maxIndex);if (foundIndex === undefined)            return -1;        while (foundIndex && this._values[foundIndex - 1].startsWith(prefix))            foundIndex--;        return foundIndex;    },    keySet: function()     {        if (!this._keySet)            this._keySet = this._values.keySet();        return this._keySet;    },    next: function(str, prefix)     {        return this._closest(str, prefix, 1);    },    previous: function(str, prefix)     {        return this._closest(str, prefix, -1);    },    _closest: function(str, prefix, shift)     {        if (!str)            return "";        var index = this._values.indexOf(str);        if (index === -1)            return "";        if (!prefix) {            index = (index + this._values.length + shift) % this._values.length;            return this._values[index];        }        var propertiesWithPrefix = this.startsWith(prefix);        var j = propertiesWithPrefix.indexOf(str);        j = (j + propertiesWithPrefix.length + shift) % propertiesWithPrefix.length;        return propertiesWithPrefix[j];    },    longhands: function(shorthand)     {        return this._longhands[shorthand];    },    shorthands: function(longhand)     {        return this._shorthands[longhand];    }}WebInspector.CSSMetadata.initializeWithSupportedProperties([]);;WebInspector.CSSParser = function() {    this._worker = new WorkerRuntime.Worker("script_formatter_worker");    this._worker.onmessage = this._onRuleChunk.bind(this);    this._rules = [];}WebInspector.CSSParser.Events = {    RulesParsed: "RulesParsed"}WebInspector.CSSParser.prototype = {    fetchAndParse: function(styleSheetHeader, callback)     {        this._lock();        this._finishedCallback = callback;        styleSheetHeader.requestContent(this._innerParse.bind(this));    },    parse: function(text, callback)     {        this._lock();        this._finishedCallback = callback;        this._innerParse(text);    },    dispose: function()     {        if (this._worker) {            this._worker.terminate();            delete this._worker;        }    },    rules: function()     {        return this._rules;    },    _lock: function()     {        console.assert(!this._parsingStyleSheet, "Received request to parse stylesheet before previous was completed.");        this._parsingStyleSheet = true;    },    _unlock: function()     {        delete this._parsingStyleSheet;    },    _innerParse: function(text)     {        this._rules = [];        this._worker.postMessage({            method: "parseCSS",            params: {                content: text            }        });    },    _onRuleChunk: function(event)     {        var data = (event.data);        var chunk = data.chunk;        for (var i = 0; i < chunk.length; ++i)            this._rules.push(chunk[i]);        if (data.isLastChunk)            this._onFinishedParsing();        this.dispatchEventToListeners(WebInspector.CSSParser.Events.RulesParsed);    },    _onFinishedParsing: function()     {        this._unlock();        if (this._finishedCallback)            this._finishedCallback(this._rules);    },    __proto__: WebInspector.Object.prototype,}WebInspector.CSSParser.DataChunk;WebInspector.CSSParser.StyleRule;WebInspector.CSSParser.AtRule;WebInspector.CSSParser.Rule;WebInspector.CSSParser.Property;;WebInspector.CSSStyleModel = function(target) {    WebInspector.SDKModel.call(this, WebInspector.CSSStyleModel, target);    this._domModel = WebInspector.DOMModel.fromTarget(target);    this._agent = target.cssAgent();    WebInspector.targetManager.addEventListener(WebInspector.TargetManager.Events.SuspendStateChanged, this._suspendStateChanged, this);    this._styleLoader = new WebInspector.CSSStyleModel.ComputedStyleLoader(this);    target.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.MainFrameNavigated, this._mainFrameNavigated, this);    target.registerCSSDispatcher(new WebInspector.CSSDispatcher(this));    this._agent.enable().then(this._wasEnabled.bind(this));    this._styleSheetIdToHeader = new Map();    this._styleSheetIdsForURL = new Map();}WebInspector.CSSStyleModel.PseudoStatePropertyName = "pseudoState";WebInspector.CSSStyleModel.parseRuleMatchArrayPayload = function(cssModel, matchArray) {    if (!matchArray)        return [];    var result = [];    for (var i = 0; i < matchArray.length; ++i)        result.push(WebInspector.CSSRule.parsePayload(cssModel, matchArray[i].rule, matchArray[i].matchingSelectors));    return result;}WebInspector.CSSStyleModel.Events = {    MediaQueryResultChanged: "MediaQueryResultChanged",    ModelWasEnabled: "ModelWasEnabled",    PseudoStateForced: "PseudoStateForced",    StyleSheetAdded: "StyleSheetAdded",    StyleSheetChanged: "StyleSheetChanged",    StyleSheetRemoved: "StyleSheetRemoved"}WebInspector.CSSStyleModel.MediaTypes = ["all", "braille", "embossed", "handheld", "print", "projection", "screen", "speech", "tty", "tv"];WebInspector.CSSStyleModel.prototype = {    mediaQueriesPromise: function()     {        function parsePayload(error, payload)         {            return !error && payload ? WebInspector.CSSMedia.parseMediaArrayPayload(this, payload) : [];        }        return this._agent.getMediaQueries(parsePayload.bind(this));    },    isEnabled: function()     {        return this._isEnabled;    },    _wasEnabled: function(error)     {        if (error) {            console.error("Failed to enabled CSS agent: " + error);            return;        }        this._isEnabled = true;        this.dispatchEventToListeners(WebInspector.CSSStyleModel.Events.ModelWasEnabled);    },    matchedStylesPromise: function(nodeId, excludePseudo, excludeInherited)     {        function callback(error, matchedPayload, pseudoPayload, inheritedPayload)         {            if (error)                return null ;            var matchedRules = WebInspector.CSSStyleModel.parseRuleMatchArrayPayload(this, matchedPayload);            var pseudoElements = [];            if (pseudoPayload) {                for (var i = 0; i < pseudoPayload.length; ++i) {                    var entryPayload = pseudoPayload[i];                    pseudoElements.push(new WebInspector.CSSStyleModel.PseudoElementMatches(entryPayload.pseudoId,WebInspector.CSSStyleModel.parseRuleMatchArrayPayload(this, entryPayload.matches)));                }            }            var inherited = [];            if (inheritedPayload) {                for (var i = 0; i < inheritedPayload.length; ++i) {                    var entryPayload = inheritedPayload[i];                    var inlineStyle = entryPayload.inlineStyle ? WebInspector.CSSStyleDeclaration.parsePayload(this, entryPayload.inlineStyle) : null ;                    var matchedCSSRules = entryPayload.matchedCSSRules ? WebInspector.CSSStyleModel.parseRuleMatchArrayPayload(this, entryPayload.matchedCSSRules) : null ;                    inherited.push(new WebInspector.CSSStyleModel.InheritedMatches(inlineStyle,matchedCSSRules));                }            }            return new WebInspector.CSSStyleModel.MatchedStyleResult(matchedRules,inherited,pseudoElements);        }        return this._agent.getMatchedStylesForNode(nodeId, excludePseudo, excludeInherited, callback.bind(this));    },    computedStylePromise: function(nodeId)     {        return this._styleLoader.computedStylePromise(nodeId);    },    platformFontsPromise: function(nodeId)     {        function platformFontsCallback(error, fonts)         {            return !error && fonts ? fonts : null ;        }        return this._agent.getPlatformFontsForNode(nodeId, platformFontsCallback);    },    allStyleSheets: function()     {        var values = this._styleSheetIdToHeader.valuesArray();        function styleSheetComparator(a, b)         {            if (a.sourceURL < b.sourceURL)                return -1;            else if (a.sourceURL > b.sourceURL)                return 1;            return a.startLine - b.startLine || a.startColumn - b.startColumn;        }        values.sort(styleSheetComparator);        return values;    },    inlineStylesPromise: function(nodeId)     {        function callback(error, inlinePayload, attributesStylePayload)         {            if (error || !inlinePayload)                return null ;            var inlineStyle = inlinePayload ? WebInspector.CSSStyleDeclaration.parsePayload(this, inlinePayload) : null ;            var attributesStyle = attributesStylePayload ? WebInspector.CSSStyleDeclaration.parsePayload(this, attributesStylePayload) : null ;            return new WebInspector.CSSStyleModel.InlineStyleResult(inlineStyle,attributesStyle);        }        return this._agent.getInlineStylesForNode(nodeId, callback.bind(this));    },    forcePseudoState: function(node, pseudoClass, enable)     {        var pseudoClasses = node.getUserProperty(WebInspector.CSSStyleModel.PseudoStatePropertyName) || [];        if (enable) {            if (pseudoClasses.indexOf(pseudoClass) >= 0)                return false;            pseudoClasses.push(pseudoClass);            node.setUserProperty(WebInspector.CSSStyleModel.PseudoStatePropertyName, pseudoClasses);        } else {            if (pseudoClasses.indexOf(pseudoClass) < 0)                return false;            pseudoClasses.remove(pseudoClass);            if (!pseudoClasses.length)                node.removeUserProperty(WebInspector.CSSStyleModel.PseudoStatePropertyName);        }        this._agent.forcePseudoState(node.id, pseudoClasses);        this.dispatchEventToListeners(WebInspector.CSSStyleModel.Events.PseudoStateForced, {            node: node,            pseudoClass: pseudoClass,            enable: enable        });        return true;    },    setRuleSelector: function(rule, nodeId, newSelector, userCallback)     {        function callback(error, rulePayload)         {            if (error || !rulePayload)                return null ;            this._domModel.markUndoableState();            return rulePayload;        }        if (!rule.styleSheetId)            throw "No rule stylesheet id";        WebInspector.userMetrics.StyleRuleEdited.record();        this._agent.setRuleSelector(rule.styleSheetId, rule.selectorRange, newSelector, callback.bind(this)).then(this._computeMatchingSelectors.bind(this, nodeId)).catchException(null ).then(userCallback);    },    setMediaText: function(media, newMediaText, userCallback)     {        function parsePayload(error, mediaPayload)         {            if (!mediaPayload)                return null ;            this._domModel.markUndoableState();            return WebInspector.CSSMedia.parsePayload(this, mediaPayload);        }        console.assert(!!media.parentStyleSheetId);        WebInspector.userMetrics.StyleRuleEdited.record();        this._agent.setMediaText(media.parentStyleSheetId, media.range, newMediaText, parsePayload.bind(this)).catchException(null ).then(userCallback);    },    _computeMatchingSelectors: function(nodeId, rulePayload)     {        var ownerDocumentId = this._ownerDocumentId(nodeId);        if (!ownerDocumentId || !rulePayload)            return Promise.resolve((null ));        var rule = WebInspector.CSSRule.parsePayload(this, rulePayload);        var matchingSelectors = [];        var allSelectorsBarrier = new CallbackBarrier();        for (var i = 0; i < rule.selectors.length; ++i) {            var selector = rule.selectors[i];            var boundCallback = allSelectorsBarrier.createCallback(selectorQueried.bind(null , i, nodeId, matchingSelectors));            this._domModel.querySelectorAll(ownerDocumentId, selector.value, boundCallback);        }        return new Promise(promiseConstructor);        function promiseConstructor(resolve)         {            allSelectorsBarrier.callWhenDone(function() {                rule.matchingSelectors = matchingSelectors;                resolve(rule);            }            );        }        function selectorQueried(index, nodeId, matchingSelectors, matchingNodeIds)         {            if (!matchingNodeIds)                return;            if (matchingNodeIds.indexOf(nodeId) !== -1)                matchingSelectors.push(index);        }    },    addRule: function(styleSheetId, node, ruleText, ruleLocation, userCallback)     {        this._agent.addRule(styleSheetId, ruleText, ruleLocation, parsePayload.bind(this)).then(this._computeMatchingSelectors.bind(this, node.id)).catchException(null ).then(userCallback);        function parsePayload(error, rulePayload)         {            if (error || !rulePayload)                return null ;            this._domModel.markUndoableState();            return rulePayload;        }    },    requestViaInspectorStylesheet: function(node, userCallback)     {        var frameId = node.frameId() || this.target().resourceTreeModel.mainFrame.id;        var headers = this._styleSheetIdToHeader.valuesArray();        for (var i = 0; i < headers.length; ++i) {            var styleSheetHeader = headers[i];            if (styleSheetHeader.frameId === frameId && styleSheetHeader.isViaInspector()) {                userCallback(styleSheetHeader);                return;            }        }        function innerCallback(error, styleSheetId)         {            return !error && styleSheetId ? this._styleSheetIdToHeader.get(styleSheetId) || null  : null ;        }        this._agent.createStyleSheet(frameId, innerCallback.bind(this)).catchException(null ).then(userCallback)    },    mediaQueryResultChanged: function()     {        this.dispatchEventToListeners(WebInspector.CSSStyleModel.Events.MediaQueryResultChanged);    },    styleSheetHeaderForId: function(id)     {        return this._styleSheetIdToHeader.get(id) || null ;    },    styleSheetHeaders: function()     {        return this._styleSheetIdToHeader.valuesArray();    },    _ownerDocumentId: function(nodeId)     {        var node = this._domModel.nodeForId(nodeId);        if (!node)            return null ;        return node.ownerDocument ? node.ownerDocument.id : null ;    },    _fireStyleSheetChanged: function(styleSheetId)     {        if (!styleSheetId || !this.hasEventListeners(WebInspector.CSSStyleModel.Events.StyleSheetChanged))            return;        this.dispatchEventToListeners(WebInspector.CSSStyleModel.Events.StyleSheetChanged, {            styleSheetId: styleSheetId        });    },    _styleSheetAdded: function(header)     {        console.assert(!this._styleSheetIdToHeader.get(header.styleSheetId));        var styleSheetHeader = new WebInspector.CSSStyleSheetHeader(this,header);        this._styleSheetIdToHeader.set(header.styleSheetId, styleSheetHeader);        var url = styleSheetHeader.resourceURL();        if (!this._styleSheetIdsForURL.get(url))            this._styleSheetIdsForURL.set(url, {});        var frameIdToStyleSheetIds = this._styleSheetIdsForURL.get(url);        var styleSheetIds = frameIdToStyleSheetIds[styleSheetHeader.frameId];        if (!styleSheetIds) {            styleSheetIds = [];            frameIdToStyleSheetIds[styleSheetHeader.frameId] = styleSheetIds;        }        styleSheetIds.push(styleSheetHeader.id);        this.dispatchEventToListeners(WebInspector.CSSStyleModel.Events.StyleSheetAdded, styleSheetHeader);    },    _styleSheetRemoved: function(id)     {        var header = this._styleSheetIdToHeader.get(id);        console.assert(header);        if (!header)            return;        this._styleSheetIdToHeader.remove(id);        var url = header.resourceURL();        var frameIdToStyleSheetIds = (this._styleSheetIdsForURL.get(url));        console.assert(frameIdToStyleSheetIds, "No frameId to styleSheetId map is available for given style sheet URL.");        frameIdToStyleSheetIds[header.frameId].remove(id);        if (!frameIdToStyleSheetIds[header.frameId].length) {            delete frameIdToStyleSheetIds[header.frameId];            if (!Object.keys(frameIdToStyleSheetIds).length)                this._styleSheetIdsForURL.remove(url);        }        this.dispatchEventToListeners(WebInspector.CSSStyleModel.Events.StyleSheetRemoved, header);    },    styleSheetIdsForURL: function(url)     {        var frameIdToStyleSheetIds = this._styleSheetIdsForURL.get(url);        if (!frameIdToStyleSheetIds)            return [];        var result = [];        for (var frameId in frameIdToStyleSheetIds)            result = result.concat(frameIdToStyleSheetIds[frameId]);        return result;    },    setStyleSheetText: function(styleSheetId, newText, majorChange)     {        var header = this._styleSheetIdToHeader.get(styleSheetId);        console.assert(header);        return header._setContentPromise(newText).then(callback.bind(this));        function callback(error)         {            if (!error && majorChange)                this._domModel.markUndoableState();            return error;        }    },    _mainFrameNavigated: function()     {        this._resetStyleSheets();    },    _resetStyleSheets: function()     {        var headers = this._styleSheetIdToHeader.valuesArray();        this._styleSheetIdsForURL.clear();        this._styleSheetIdToHeader.clear();        for (var i = 0; i < headers.length; ++i)            this.dispatchEventToListeners(WebInspector.CSSStyleModel.Events.StyleSheetRemoved, headers[i]);    },    _suspendStateChanged: function()     {        if (WebInspector.targetManager.allTargetsSuspended()) {            this._agent.disable();            this._isEnabled = false;        } else {            this._resetStyleSheets();            this._agent.enable().then(this._wasEnabled.bind(this));        }    },    __proto__: WebInspector.SDKModel.prototype}WebInspector.CSSLocation = function(cssModel, styleSheetId, url, lineNumber, columnNumber) {    WebInspector.SDKObject.call(this, cssModel.target());    this._cssModel = cssModel;    this.styleSheetId = styleSheetId;    this.url = url;    this.lineNumber = lineNumber;    this.columnNumber = columnNumber || 0;}WebInspector.CSSLocation.prototype = {    cssModel: function()     {        return this._cssModel;    },    __proto__: WebInspector.SDKObject.prototype}WebInspector.CSSStyleDeclaration = function(cssModel, payload) {    this._cssModel = cssModel;    this.styleSheetId = payload.styleSheetId;    this.range = payload.range ? WebInspector.TextRange.fromObject(payload.range) : null ;    var shorthandEntries = payload.shorthandEntries;    this._shorthandValues = new Map();    this._shorthandIsImportant = new Set();    for (var i = 0; i < shorthandEntries.length; ++i) {        this._shorthandValues.set(shorthandEntries[i].name, shorthandEntries[i].value);        if (shorthandEntries[i].important)            this._shorthandIsImportant.add(shorthandEntries[i].name);    }    this._livePropertyMap = {};    this._allProperties = [];    this.__disabledProperties = {};    var payloadPropertyCount = payload.cssProperties.length;    for (var i = 0; i < payloadPropertyCount; ++i) {        var property = WebInspector.CSSProperty.parsePayload(this, i, payload.cssProperties[i]);        this._allProperties.push(property);    }    this._computeActiveProperties();    var propertyIndex = 0;    for (var i = 0; i < this._allProperties.length; ++i) {        var property = this._allProperties[i];        if (property.disabled)            this.__disabledProperties[i] = property;        if (!property.active && !property.styleBased)            continue;var name = property.name;        this[propertyIndex] = name;        this._livePropertyMap[name] = property;        ++propertyIndex;    }    this.length = propertyIndex;    if ("cssText" in payload)        this.cssText = payload.cssText;}WebInspector.CSSStyleDeclaration.createDummyStyle = function(cssModel) {    var dummyPayload = {        shorthandEntries: [],        cssProperties: []    };    return new WebInspector.CSSStyleDeclaration(cssModel,dummyPayload);}WebInspector.CSSStyleDeclaration.parsePayload = function(cssModel, payload) {    return new WebInspector.CSSStyleDeclaration(cssModel,payload);}WebInspector.CSSStyleDeclaration.parseComputedStylePayload = function(cssModel, payload) {    var newPayload = ({        cssProperties: [],        shorthandEntries: [],        width: "",        height: ""    });    if (payload)        newPayload.cssProperties = (payload);    return new WebInspector.CSSStyleDeclaration(cssModel,newPayload);}WebInspector.CSSStyleDeclaration.prototype = {    target: function()     {        return this._cssModel.target();    },    cssModel: function()     {        return this._cssModel;    },    sourceStyleSheetEdited: function(styleSheetId, oldRange, newRange)     {        if (this.styleSheetId !== styleSheetId)            return;        if (this.range)            this.range = this.range.rebaseAfterTextEdit(oldRange, newRange);        for (var i = 0; i < this._allProperties.length; ++i)            this._allProperties[i].sourceStyleSheetEdited(styleSheetId, oldRange, newRange);    },    _computeActiveProperties: function()     {        var activeProperties = {};        for (var i = this._allProperties.length - 1; i >= 0; --i) {            var property = this._allProperties[i];            if (property.styleBased || property.disabled)                continue;property._setActive(false);            if (!property.parsedOk)                continue;var canonicalName = WebInspector.CSSMetadata.canonicalPropertyName(property.name);            var activeProperty = activeProperties[canonicalName];            if (!activeProperty || (!activeProperty.important && property.important))                activeProperties[canonicalName] = property;        }        for (var propertyName in activeProperties) {            var property = activeProperties[propertyName];            property._setActive(true);        }    },    get allProperties()     {        return this._allProperties;    },    getLiveProperty: function(name)     {        return this._livePropertyMap[name] || null ;    },    getPropertyValue: function(name)     {        var property = this._livePropertyMap[name];        return property ? property.value : "";    },    isPropertyImplicit: function(name)     {        var property = this._livePropertyMap[name];        return property ? property.implicit : "";    },    longhandProperties: function(name)     {        var longhands = WebInspector.CSSMetadata.cssPropertiesMetainfo.longhands(name);        var result = [];        for (var i = 0; longhands && i < longhands.length; ++i) {            var property = this._livePropertyMap[longhands[i]];            if (property)                result.push(property);        }        return result;    },    shorthandValue: function(shorthandProperty)     {        return this._shorthandValues.get(shorthandProperty) || "";    },    shorthandIsImportant: function(shorthandProperty)     {        return this._shorthandIsImportant.has(shorthandProperty);    },    propertyAt: function(index)     {        return (index < this.allProperties.length) ? this.allProperties[index] : null ;    },    pastLastSourcePropertyIndex: function()     {        for (var i = this.allProperties.length - 1; i >= 0; --i) {            if (this.allProperties[i].range)                return i + 1;        }        return 0;    },    _insertionRange: function(index)     {        var property = this.propertyAt(index);        return property && property.range ? property.range.collapseToStart() : this.range.collapseToEnd();    },    newBlankProperty: function(index)     {        index = (typeof index === "undefined") ? this.pastLastSourcePropertyIndex() : index;        var property = new WebInspector.CSSProperty(this,index,"","",false,false,true,false,"",this._insertionRange(index));        property._setActive(true);        return property;    },    setText: function(text, majorChange, userCallback)     {        if (!this.styleSheetId) {            userCallback(null );            return;        }        function parsePayload(error, stylePayload)         {            if (error || !stylePayload)                return null ;            if (majorChange)                this._cssModel._domModel.markUndoableState();            return WebInspector.CSSStyleDeclaration.parsePayload(this._cssModel, stylePayload);        }        this._cssModel._agent.setStyleText(this.styleSheetId, this.range.serializeToObject(), text, parsePayload.bind(this)).catchException(null ).then(userCallback)    },    insertPropertyAt: function(index, name, value, userCallback)     {        this.newBlankProperty(index).setText(name + ": " + value + ";", false, true, userCallback);    },    appendProperty: function(name, value, userCallback)     {        this.insertPropertyAt(this.allProperties.length, name, value, userCallback);    }}WebInspector.CSSRuleSelector = function(payload) {    this.value = payload.value;    if (payload.range)        this.range = WebInspector.TextRange.fromObject(payload.range);}WebInspector.CSSRuleSelector.parsePayload = function(payload) {    return new WebInspector.CSSRuleSelector(payload);}WebInspector.CSSRuleSelector.prototype = {    sourceStyleRuleEdited: function(oldRange, newRange)     {        if (!this.range)            return;        this.range = this.range.rebaseAfterTextEdit(oldRange, newRange);    }}WebInspector.CSSRule = function(cssModel, payload, matchingSelectors) {    this._cssModel = cssModel;    this.styleSheetId = payload.styleSheetId;    if (matchingSelectors)        this.matchingSelectors = matchingSelectors;    this.selectors = [];    for (var i = 0; i < payload.selectorList.selectors.length; ++i) {        var selectorPayload = payload.selectorList.selectors[i];        this.selectors.push(WebInspector.CSSRuleSelector.parsePayload(selectorPayload));    }    this.selectorText = this.selectors.select("value").join(", ");    var firstRange = this.selectors[0].range;    if (firstRange) {        var lastRange = this.selectors.peekLast().range;        this.selectorRange = new WebInspector.TextRange(firstRange.startLine,firstRange.startColumn,lastRange.endLine,lastRange.endColumn);    }    if (this.styleSheetId) {        var styleSheetHeader = cssModel.styleSheetHeaderForId(this.styleSheetId);        this.sourceURL = styleSheetHeader.sourceURL;    }    this.origin = payload.origin;    this.style = WebInspector.CSSStyleDeclaration.parsePayload(this._cssModel, payload.style);    this.style.parentRule = this;    if (payload.media)        this.media = WebInspector.CSSMedia.parseMediaArrayPayload(cssModel, payload.media);    this._setFrameId();}WebInspector.CSSRule.parsePayload = function(cssModel, payload, matchingIndices) {    return new WebInspector.CSSRule(cssModel,payload,matchingIndices);}WebInspector.CSSRule.prototype = {    sourceStyleSheetEdited: function(styleSheetId, oldRange, newRange)     {        this._sourceStyleSheetEditedWithMedia(styleSheetId, oldRange, newRange, null , null );    },    _sourceStyleSheetEditedWithMedia: function(styleSheetId, oldRange, newRange, oldMedia, newMedia)     {        if (this.styleSheetId === styleSheetId) {            if (this.selectorRange)                this.selectorRange = this.selectorRange.rebaseAfterTextEdit(oldRange, newRange);            for (var i = 0; i < this.selectors.length; ++i)                this.selectors[i].sourceStyleRuleEdited(oldRange, newRange);        }        if (this.media) {            for (var i = 0; i < this.media.length; ++i) {                if (oldMedia && newMedia && oldMedia.equal(this.media[i])) {                    this.media[i] = newMedia;                } else {                    this.media[i].sourceStyleSheetEdited(styleSheetId, oldRange, newRange);                }            }        }        this.style.sourceStyleSheetEdited(styleSheetId, oldRange, newRange);    },    mediaEdited: function(oldMedia, newMedia)     {        this._sourceStyleSheetEditedWithMedia((oldMedia.parentStyleSheetId), oldMedia.range, newMedia.range, oldMedia, newMedia);    },    _setFrameId: function()     {        if (!this.styleSheetId)            return;        var styleSheetHeader = this._cssModel.styleSheetHeaderForId(this.styleSheetId);        this.frameId = styleSheetHeader.frameId;    },    resourceURL: function()     {        if (!this.styleSheetId)            return "";        var styleSheetHeader = this._cssModel.styleSheetHeaderForId(this.styleSheetId);        return styleSheetHeader.resourceURL();    },    lineNumberInSource: function(selectorIndex)     {        var selector = this.selectors[selectorIndex];        if (!selector || !selector.range || !this.styleSheetId)            return 0;        var styleSheetHeader = this._cssModel.styleSheetHeaderForId(this.styleSheetId);        return styleSheetHeader.lineNumberInSource(selector.range.startLine);    },    columnNumberInSource: function(selectorIndex)     {        var selector = this.selectors[selectorIndex];        if (!selector || !selector.range || !this.styleSheetId)            return undefined;        var styleSheetHeader = this._cssModel.styleSheetHeaderForId(this.styleSheetId);        console.assert(styleSheetHeader);        return styleSheetHeader.columnNumberInSource(selector.range.startLine, selector.range.startColumn);    },    get isUserAgent()     {        return this.origin === "user-agent";    },    get isInjected()     {        return this.origin === "injected";    },    get isViaInspector()     {        return this.origin === "inspector";    },    get isRegular()     {        return this.origin === "regular";    }}WebInspector.CSSProperty = function(ownerStyle, index, name, value, important, disabled, parsedOk, implicit, text, range) {    this.ownerStyle = ownerStyle;    this.index = index;    this.name = name;    this.value = value;    this.important = important;    this.disabled = disabled;    this.parsedOk = parsedOk;    this.implicit = implicit;    this.text = text;    this.range = range ? WebInspector.TextRange.fromObject(range) : null ;}WebInspector.CSSProperty.parsePayload = function(ownerStyle, index, payload) {    var result = new WebInspector.CSSProperty(ownerStyle,index,payload.name,payload.value,payload.important || false,payload.disabled || false,("parsedOk" in payload) ? !!payload.parsedOk : true,!!payload.implicit,payload.text,payload.range);    return result;}WebInspector.CSSProperty.prototype = {    sourceStyleSheetEdited: function(styleSheetId, oldRange, newRange)     {        if (this.ownerStyle.styleSheetId !== styleSheetId)            return;        if (this.range)            this.range = this.range.rebaseAfterTextEdit(oldRange, newRange);    },    _setActive: function(active)     {        this._active = active;    },    get propertyText()     {        if (this.text !== undefined)            return this.text;        if (this.name === "")            return "";        return this.name + ": " + this.value + (this.important ? " !important" : "") + ";";    },    get isLive()     {        return this.active || this.styleBased;    },    get active()     {        return typeof this._active === "boolean" && this._active;    },    get styleBased()     {        return !this.range;    },    get inactive()     {        return typeof this._active === "boolean" && !this._active;    },    setText: function(propertyText, majorChange, overwrite, userCallback)     {        if (!this.ownerStyle)            throw "No ownerStyle for property";        if (!this.ownerStyle.styleSheetId)            throw "No owner style id";        if (!this.range || !this.ownerStyle.range)            throw "Style not editable";        if (majorChange)            WebInspector.userMetrics.StyleRuleEdited.record();        if (overwrite && propertyText === this.propertyText) {            if (majorChange)                this.ownerStyle._cssModel._domModel.markUndoableState();            if (userCallback)                userCallback(this.ownerStyle);            return;        }        var range = this.range.relativeTo(this.ownerStyle.range.startLine, this.ownerStyle.range.startColumn);        var indentation = this.ownerStyle.cssText ? this._detectIndentation(this.ownerStyle.cssText) : WebInspector.moduleSetting("textEditorIndent").get();        var endIntentation = this.ownerStyle.cssText ? indentation.substring(0, this.ownerStyle.range.endColumn) : "";        var newStyleText = range.replaceInText(this.ownerStyle.cssText || "", ";" + propertyText);        this._formatStyle(newStyleText, indentation, endIntentation, setStyleText.bind(this));        function setStyleText(styleText)         {            this.ownerStyle.setText(styleText, majorChange, callback);        }        function callback(style)         {            if (userCallback)                userCallback(style);        }        function enabledCallback(style)         {            if (userCallback)                userCallback(style);        }    },    _formatStyle: function(styleText, indentation, endIndentation, callback)     {        self.runtime.instancePromise(WebInspector.TokenizerFactory).then(processTokens);        var result = "";        function processTokens(tokenizerFactory)         {            var tokenize = tokenizerFactory.createTokenizer("text/css");            tokenize("*{" + styleText + "}", processToken);            result = result.slice(0, result.length - 1);            callback(result + (indentation ? "\n" + endIndentation : ""));        }        var lastWasSemicolon = true;        var lastWasMeta = false;        var insideProperty = false;        function processToken(token, tokenType, column, newColumn)         {            if (newColumn <= 2)                return;            var isSemicolon = token === ";";            if (isSemicolon && lastWasSemicolon)                return;            lastWasSemicolon = isSemicolon || (lastWasSemicolon && tokenType && tokenType.includes("css-comment")) || (lastWasSemicolon && !token.trim());            if (!indentation) {                result += token;                return;            }            if (!insideProperty && !token.trim())                return;            if (tokenType && tokenType.includes("css-comment") && token.includes(":") && token.includes(";")) {                result += "\n" + indentation + token;                insideProperty = false;                return;            }            if (isSemicolon)                insideProperty = false;            if (tokenType && (tokenType.includes("css-meta") || (tokenType.includes("css-property") && !lastWasMeta))) {                result += "\n" + indentation;                insideProperty = true;            }            result += token;            lastWasMeta = tokenType && tokenType.includes("css-meta");        }    },    _detectIndentation: function(text)     {        var lines = text.split("\n");        if (lines.length < 2)            return "";        return WebInspector.TextUtils.lineIndent(lines[1]);    },    setValue: function(newValue, majorChange, overwrite, userCallback)     {        var text = this.name + ": " + newValue + (this.important ? " !important" : "") + ";";        this.setText(text, majorChange, overwrite, userCallback);    },    setDisabled: function(disabled, userCallback)     {        if (!this.ownerStyle && userCallback)            userCallback(null );        if (disabled === this.disabled) {            if (userCallback)                userCallback(this.ownerStyle);            return;        }        if (disabled)            this.setText("/* " + this.text + " */", true, true, userCallback);        else            this.setText(this.text.substring(2, this.text.length - 2).trim(), true, true, userCallback);    }}WebInspector.CSSMediaQuery = function(payload) {    this._active = payload.active;    this._expressions = [];    for (var j = 0; j < payload.expressions.length; ++j)        this._expressions.push(WebInspector.CSSMediaQueryExpression.parsePayload(payload.expressions[j]));}WebInspector.CSSMediaQuery.parsePayload = function(payload) {    return new WebInspector.CSSMediaQuery(payload);}WebInspector.CSSMediaQuery.prototype = {    active: function()     {        return this._active;    },    expressions: function()     {        return this._expressions;    }}WebInspector.CSSMediaQueryExpression = function(payload) {    this._value = payload.value;    this._unit = payload.unit;    this._feature = payload.feature;    this._valueRange = payload.valueRange ? WebInspector.TextRange.fromObject(payload.valueRange) : null ;    this._computedLength = payload.computedLength || null ;}WebInspector.CSSMediaQueryExpression.parsePayload = function(payload) {    return new WebInspector.CSSMediaQueryExpression(payload);}WebInspector.CSSMediaQueryExpression.prototype = {    value: function()     {        return this._value;    },    unit: function()     {        return this._unit;    },    feature: function()     {        return this._feature;    },    valueRange: function()     {        return this._valueRange;    },    computedLength: function()     {        return this._computedLength;    }}WebInspector.CSSMedia = function(cssModel, payload) {    this._cssModel = cssModel;    this.text = payload.text;    this.source = payload.source;    this.sourceURL = payload.sourceURL || "";    this.range = payload.range ? WebInspector.TextRange.fromObject(payload.range) : null ;    this.parentStyleSheetId = payload.parentStyleSheetId;    this.mediaList = null ;    if (payload.mediaList) {        this.mediaList = [];        for (var i = 0; i < payload.mediaList.length; ++i)            this.mediaList.push(WebInspector.CSSMediaQuery.parsePayload(payload.mediaList[i]));    }}WebInspector.CSSMedia.Source = {    LINKED_SHEET: "linkedSheet",    INLINE_SHEET: "inlineSheet",    MEDIA_RULE: "mediaRule",    IMPORT_RULE: "importRule"};WebInspector.CSSMedia.parsePayload = function(cssModel, payload) {    return new WebInspector.CSSMedia(cssModel,payload);}WebInspector.CSSMedia.parseMediaArrayPayload = function(cssModel, payload) {    var result = [];    for (var i = 0; i < payload.length; ++i)        result.push(WebInspector.CSSMedia.parsePayload(cssModel, payload[i]));    return result;}WebInspector.CSSMedia.prototype = {    sourceStyleSheetEdited: function(styleSheetId, oldRange, newRange)     {        if (this.parentStyleSheetId !== styleSheetId)            return;        if (this.range)            this.range = this.range.rebaseAfterTextEdit(oldRange, newRange);    },    equal: function(other)     {        if (!this.parentStyleSheetId || !this.range || !other.range)            return false;        return this.parentStyleSheetId === other.parentStyleSheetId && this.range.equal(other.range);    },    active: function()     {        if (!this.mediaList)            return true;        for (var i = 0; i < this.mediaList.length; ++i) {            if (this.mediaList[i].active())                return true;        }        return false;    },    lineNumberInSource: function()     {        if (!this.range)            return undefined;        var header = this.header();        if (!header)            return undefined;        return header.lineNumberInSource(this.range.startLine);    },    columnNumberInSource: function()     {        if (!this.range)            return undefined;        var header = this.header();        if (!header)            return undefined;        return header.columnNumberInSource(this.range.startLine, this.range.startColumn);    },    header: function()     {        return this.parentStyleSheetId ? this._cssModel.styleSheetHeaderForId(this.parentStyleSheetId) : null ;    },    rawLocation: function()     {        if (!this.header() || this.lineNumberInSource() === undefined)            return null ;        var lineNumber = Number(this.lineNumberInSource());        return new WebInspector.CSSLocation(this._cssModel,this.header().id,this.sourceURL,lineNumber,this.columnNumberInSource());    }}WebInspector.CSSStyleSheetHeader = function(cssModel, payload) {    this._cssModel = cssModel;    this.id = payload.styleSheetId;    this.frameId = payload.frameId;    this.sourceURL = payload.sourceURL;    this.hasSourceURL = !!payload.hasSourceURL;    this.sourceMapURL = payload.sourceMapURL;    this.origin = payload.origin;    this.title = payload.title;    this.disabled = payload.disabled;    this.isInline = payload.isInline;    this.startLine = payload.startLine;    this.startColumn = payload.startColumn;    if (payload.ownerNode)        this.ownerNode = new WebInspector.DeferredDOMNode(cssModel.target(),payload.ownerNode);}WebInspector.CSSStyleSheetHeader.prototype = {    target: function()     {        return this._cssModel.target();    },    cssModel: function()     {        return this._cssModel;    },    resourceURL: function()     {        return this.isViaInspector() ? this._viaInspectorResourceURL() : this.sourceURL;    },    _viaInspectorResourceURL: function()     {        var frame = this._cssModel.target().resourceTreeModel.frameForId(this.frameId);        console.assert(frame);        var parsedURL = new WebInspector.ParsedURL(frame.url);        var fakeURL = "inspector://" + parsedURL.host + parsedURL.folderPathComponents;        if (!fakeURL.endsWith("/"))            fakeURL += "/";        fakeURL += "inspector-stylesheet";        return fakeURL;    },    lineNumberInSource: function(lineNumberInStyleSheet)     {        return this.startLine + lineNumberInStyleSheet;    },    columnNumberInSource: function(lineNumberInStyleSheet, columnNumberInStyleSheet)     {        return (lineNumberInStyleSheet ? 0 : this.startColumn) + columnNumberInStyleSheet;    },    contentURL: function()     {        return this.resourceURL();    },    contentType: function()     {        return WebInspector.resourceTypes.Stylesheet;    },    _trimSourceURL: function(text)     {        var sourceURLRegex = /\n[\040\t]*\/\*[#@][\040\t]sourceURL=[\040\t]*([^\s]*)[\040\t]*\*\/[\040\t]*$/mg;        return text.replace(sourceURLRegex, "");    },    requestContent: function(userCallback)     {        this._cssModel._agent.getStyleSheetText(this.id, textCallback.bind(this)).catchException("").then(userCallback)        function textCallback(error, text)         {            if (error || text === null ) {                WebInspector.console.error("Failed to get text for stylesheet " + this.id + ": " + error)                text = "";            }            return this._trimSourceURL(text);        }    },    searchInContent: function(query, caseSensitive, isRegex, callback)     {        function performSearch(content)         {            callback(WebInspector.ContentProvider.performSearchInContent(content, query, caseSensitive, isRegex));        }        this.requestContent(performSearch);    },    _setContentPromise: function(newText)     {        newText = this._trimSourceURL(newText);        if (this.hasSourceURL)            newText += "\n/*# sourceURL=" + this.sourceURL + " */";        return this._cssModel._agent.setStyleSheetText(this.id, newText, extractProtocolError);        function extractProtocolError(error)         {            return error || null ;        }    },    setContent: function(newText, callback)     {        this._setContentPromise(newText).catchException(null ).then(callback);    },    isViaInspector: function()     {        return this.origin === "inspector";    }}WebInspector.CSSDispatcher = function(cssModel) {    this._cssModel = cssModel;}WebInspector.CSSDispatcher.prototype = {    mediaQueryResultChanged: function()     {        this._cssModel.mediaQueryResultChanged();    },    styleSheetChanged: function(styleSheetId)     {        this._cssModel._fireStyleSheetChanged(styleSheetId);    },    styleSheetAdded: function(header)     {        this._cssModel._styleSheetAdded(header);    },    styleSheetRemoved: function(id)     {        this._cssModel._styleSheetRemoved(id);    },}WebInspector.CSSStyleModel.ComputedStyleLoader = function(cssModel) {    this._cssModel = cssModel;    this._nodeIdToPromise = new Map();}WebInspector.CSSStyleModel.ComputedStyleLoader.prototype = {    computedStylePromise: function(nodeId)     {        if (!this._nodeIdToPromise[nodeId])            this._nodeIdToPromise[nodeId] = this._cssModel._agent.getComputedStyleForNode(nodeId, parsePayload.bind(this)).then(cleanUp.bind(this));        return this._nodeIdToPromise[nodeId];        function parsePayload(error, computedPayload)         {            return !error && computedPayload ? WebInspector.CSSStyleDeclaration.parseComputedStylePayload(this._cssModel, computedPayload) : null ;        }        function cleanUp(computedStyle)         {            delete this._nodeIdToPromise[nodeId];            return computedStyle;        }    }}WebInspector.CSSStyleModel.fromTarget = function(target) {    if (!target.isPage())        return null ;    return ( target.model(WebInspector.CSSStyleModel)) ;}WebInspector.CSSStyleModel.fromNode = function(node) {    return ( WebInspector.CSSStyleModel.fromTarget(node.target())) ;}WebInspector.CSSStyleModel.MatchedStyleResult = function(matchedRules, inherited, pseudoElements) {    this.matchedCSSRules = matchedRules;    this.inherited = inherited;    this.pseudoElements = pseudoElements;}WebInspector.CSSStyleModel.PseudoElementMatches = function(pseudoId, rules) {    this.pseudoId = pseudoId;    this.rules = rules;}WebInspector.CSSStyleModel.InheritedMatches = function(inlineStyle, matchedRules) {    this.inlineStyle = inlineStyle;    this.matchedCSSRules = matchedRules;}WebInspector.CSSStyleModel.InlineStyleResult = function(inlineStyle, attributesStyle) {    this.inlineStyle = inlineStyle;    this.attributesStyle = attributesStyle;};WebInspector.DOMNode = function(domModel, doc, isInShadowTree, payload) {    WebInspector.SDKObject.call(this, domModel.target());    this._domModel = domModel;    this._agent = domModel._agent;    this.ownerDocument = doc;    this._isInShadowTree = isInShadowTree;    this.id = payload.nodeId;    domModel._idToDOMNode[this.id] = this;    this._nodeType = payload.nodeType;    this._nodeName = payload.nodeName;    this._localName = payload.localName;    this._nodeValue = payload.nodeValue;    this._pseudoType = payload.pseudoType;    this._shadowRootType = payload.shadowRootType;    this._frameId = payload.frameId || null ;    this._shadowRoots = [];    this._attributes = [];    this._attributesMap = {};    if (payload.attributes)        this._setAttributesPayload(payload.attributes);    this._userProperties = {};    this._descendantUserPropertyCounters = {};    this._childNodeCount = payload.childNodeCount || 0;    this._children = null ;    this.nextSibling = null ;    this.previousSibling = null ;    this.firstChild = null ;    this.lastChild = null ;    this.parentNode = null ;    if (payload.shadowRoots) {        for (var i = 0; i < payload.shadowRoots.length; ++i) {            var root = payload.shadowRoots[i];            var node = new WebInspector.DOMNode(this._domModel,this.ownerDocument,true,root);            this._shadowRoots.push(node);            node.parentNode = this;        }    }    if (payload.templateContent) {        this._templateContent = new WebInspector.DOMNode(this._domModel,this.ownerDocument,true,payload.templateContent);        this._templateContent.parentNode = this;    }    if (payload.importedDocument) {        this._importedDocument = new WebInspector.DOMNode(this._domModel,this.ownerDocument,true,payload.importedDocument);        this._importedDocument.parentNode = this;    }    if (payload.distributedNodes)        this._setDistributedNodePayloads(payload.distributedNodes);    if (payload.children)        this._setChildrenPayload(payload.children);    this._setPseudoElements(payload.pseudoElements);    if (payload.contentDocument) {        this._contentDocument = new WebInspector.DOMDocument(domModel,payload.contentDocument);        this._children = [this._contentDocument];        this._renumber();    }    if (this._nodeType === Node.ELEMENT_NODE) {        if (this.ownerDocument && !this.ownerDocument.documentElement && this._nodeName === "HTML")            this.ownerDocument.documentElement = this;        if (this.ownerDocument && !this.ownerDocument.body && this._nodeName === "BODY")            this.ownerDocument.body = this;    } else if (this._nodeType === Node.DOCUMENT_TYPE_NODE) {        this.publicId = payload.publicId;        this.systemId = payload.systemId;        this.internalSubset = payload.internalSubset;    } else if (this._nodeType === Node.ATTRIBUTE_NODE) {        this.name = payload.name;        this.value = payload.value;    }}WebInspector.DOMNode.PseudoElementNames = {    Before: "before",    After: "after"}WebInspector.DOMNode.ShadowRootTypes = {    UserAgent: "user-agent",    Author: "author"}WebInspector.DOMNode.prototype = {    domModel: function()     {        return this._domModel;    },    children: function()     {        return this._children ? this._children.slice() : null ;    },    hasAttributes: function()     {        return this._attributes.length > 0;    },    childNodeCount: function()     {        return this._childNodeCount;    },    hasShadowRoots: function()     {        return !!this._shadowRoots.length;    },    shadowRoots: function()     {        return this._shadowRoots.slice();    },    templateContent: function()     {        return this._templateContent || null ;    },    importedDocument: function()     {        return this._importedDocument || null ;    },    nodeType: function()     {        return this._nodeType;    },    nodeName: function()     {        return this._nodeName;    },    pseudoType: function()     {        return this._pseudoType;    },    hasPseudoElements: function()     {        return this._pseudoElements.size > 0;    },    pseudoElements: function()     {        return this._pseudoElements;    },    beforePseudoElement: function()     {        if (!this._pseudoElements)            return null ;        return this._pseudoElements.get(WebInspector.DOMNode.PseudoElementNames.Before);    },    afterPseudoElement: function()     {        if (!this._pseudoElements)            return null ;        return this._pseudoElements.get(WebInspector.DOMNode.PseudoElementNames.After);    },    isInsertionPoint: function()     {        return !this.isXMLNode() && (this._nodeName === "SHADOW" || this._nodeName === "CONTENT");    },    distributedNodes: function()     {        return this._distributedNodes || [];    },    isInShadowTree: function()     {        return this._isInShadowTree;    },    ancestorShadowHost: function()     {        var ancestorShadowRoot = this.ancestorShadowRoot();        return ancestorShadowRoot ? ancestorShadowRoot.parentNode : null ;    },    ancestorShadowRoot: function()     {        if (!this._isInShadowTree)            return null ;        var current = this;        while (current && !current.isShadowRoot())            current = current.parentNode;        return current;    },    ancestorUserAgentShadowRoot: function()     {        var ancestorShadowRoot = this.ancestorShadowRoot();        if (!ancestorShadowRoot)            return null ;        return ancestorShadowRoot.shadowRootType() === WebInspector.DOMNode.ShadowRootTypes.UserAgent ? ancestorShadowRoot : null ;    },    isShadowRoot: function()     {        return !!this._shadowRootType;    },    shadowRootType: function()     {        return this._shadowRootType || null ;    },    nodeNameInCorrectCase: function()     {        var shadowRootType = this.shadowRootType();        if (shadowRootType)            return "#shadow-root" + (shadowRootType === WebInspector.DOMNode.ShadowRootTypes.UserAgent ? " (user-agent)" : "");        return this.isXMLNode() ? this.nodeName() : this.nodeName().toLowerCase();    },    setNodeName: function(name, callback)     {        this._agent.setNodeName(this.id, name, this._domModel._markRevision(this, callback));    },    localName: function()     {        return this._localName;    },    nodeValue: function()     {        return this._nodeValue;    },    setNodeValue: function(value, callback)     {        this._agent.setNodeValue(this.id, value, this._domModel._markRevision(this, callback));    },    getAttribute: function(name)     {        var attr = this._attributesMap[name];        return attr ? attr.value : undefined;    },    setAttribute: function(name, text, callback)     {        this._agent.setAttributesAsText(this.id, text, name, this._domModel._markRevision(this, callback));    },    setAttributeValue: function(name, value, callback)     {        this._agent.setAttributeValue(this.id, name, value, this._domModel._markRevision(this, callback));    },    attributes: function()     {        return this._attributes;    },    removeAttribute: function(name, callback)     {        function mycallback(error)         {            if (!error) {                delete this._attributesMap[name];                for (var i = 0; i < this._attributes.length; ++i) {                    if (this._attributes[i].name === name) {                        this._attributes.splice(i, 1);                        break;                    }                }            }            this._domModel._markRevision(this, callback)(error);        }        this._agent.removeAttribute(this.id, name, mycallback.bind(this));    },    getChildNodes: function(callback)     {        if (this._children) {            if (callback)                callback(this.children());            return;        }        function mycallback(error)         {            if (callback)                callback(error ? null  : this.children());        }        this._agent.requestChildNodes(this.id, undefined, mycallback.bind(this));    },    getSubtree: function(depth, callback)     {        function mycallback(error)         {            if (callback)                callback(error ? null  : this._children);        }        this._agent.requestChildNodes(this.id, depth, mycallback.bind(this));    },    getOuterHTML: function(callback)     {        this._agent.getOuterHTML(this.id, callback);    },    setOuterHTML: function(html, callback)     {        this._agent.setOuterHTML(this.id, html, this._domModel._markRevision(this, callback));    },    removeNode: function(callback)     {        this._agent.removeNode(this.id, this._domModel._markRevision(this, callback));    },    copyNode: function(callback)     {        function copy(error, text)         {            if (!error)                InspectorFrontendHost.copyText(text);            if (callback)                callback(error ? null  : text);        }        this._agent.getOuterHTML(this.id, copy);    },    path: function()     {        function canPush(node)         {            return node && ("index" in node || (node.isShadowRoot() && node.parentNode)) && node._nodeName.length;        }        var path = [];        var node = this;        while (canPush(node)) {            var index = typeof node.index === "number" ? node.index : (node.shadowRootType() === WebInspector.DOMNode.ShadowRootTypes.UserAgent ? "u" : "a");            path.push([index, node._nodeName]);            node = node.parentNode;        }        path.reverse();        return path.join(",");    },    isAncestor: function(node)     {        if (!node)            return false;        var currentNode = node.parentNode;        while (currentNode) {            if (this === currentNode)                return true;            currentNode = currentNode.parentNode;        }        return false;    },    isDescendant: function(descendant)     {        return descendant !== null  && descendant.isAncestor(this);    },    frameId: function()     {        var node = this;        while (!node._frameId && node.parentNode)            node = node.parentNode;        return node._frameId;    },    _setAttributesPayload: function(attrs)     {        var attributesChanged = !this._attributes || attrs.length !== this._attributes.length * 2;        var oldAttributesMap = this._attributesMap || {};        this._attributes = [];        this._attributesMap = {};        for (var i = 0; i < attrs.length; i += 2) {            var name = attrs[i];            var value = attrs[i + 1];            this._addAttribute(name, value);            if (attributesChanged)                continue;if (!oldAttributesMap[name] || oldAttributesMap[name].value !== value)                attributesChanged = true;        }        return attributesChanged;    },    _insertChild: function(prev, payload)     {        var node = new WebInspector.DOMNode(this._domModel,this.ownerDocument,this._isInShadowTree,payload);        this._children.splice(this._children.indexOf(prev) + 1, 0, node);        this._renumber();        return node;    },    _removeChild: function(node)     {        if (node.pseudoType()) {            this._pseudoElements.delete(node.pseudoType());        } else {            var shadowRootIndex = this._shadowRoots.indexOf(node);            if (shadowRootIndex !== -1) {                this._shadowRoots.splice(shadowRootIndex, 1);            } else {                console.assert(this._children.indexOf(node) !== -1);                this._children.splice(this._children.indexOf(node), 1);            }        }        node.parentNode = null ;        node._updateChildUserPropertyCountsOnRemoval(this);        this._renumber();    },    _setChildrenPayload: function(payloads)     {        if (this._contentDocument)            return;        this._children = [];        for (var i = 0; i < payloads.length; ++i) {            var payload = payloads[i];            var node = new WebInspector.DOMNode(this._domModel,this.ownerDocument,this._isInShadowTree,payload);            this._children.push(node);        }        this._renumber();    },    _setPseudoElements: function(payloads)     {        this._pseudoElements = new Map();        if (!payloads)            return;        for (var i = 0; i < payloads.length; ++i) {            var node = new WebInspector.DOMNode(this._domModel,this.ownerDocument,this._isInShadowTree,payloads[i]);            node.parentNode = this;            this._pseudoElements.set(node.pseudoType(), node);        }    },    _setDistributedNodePayloads: function(payloads)     {        this._distributedNodes = [];        for (var payload of payloads)            this._distributedNodes.push(new WebInspector.DOMNodeShortcut(this._domModel.target(),payload.backendNodeId,payload.nodeType,payload.nodeName));    },    _renumber: function()     {        this._childNodeCount = this._children.length;        if (this._childNodeCount == 0) {            this.firstChild = null ;            this.lastChild = null ;            return;        }        this.firstChild = this._children[0];        this.lastChild = this._children[this._childNodeCount - 1];        for (var i = 0; i < this._childNodeCount; ++i) {            var child = this._children[i];            child.index = i;            child.nextSibling = i + 1 < this._childNodeCount ? this._children[i + 1] : null ;            child.previousSibling = i - 1 >= 0 ? this._children[i - 1] : null ;            child.parentNode = this;        }    },    _addAttribute: function(name, value)     {        var attr = {            name: name,            value: value,            _node: this        };        this._attributesMap[name] = attr;        this._attributes.push(attr);    },    _setAttribute: function(name, value)     {        var attr = this._attributesMap[name];        if (attr)            attr.value = value;        else            this._addAttribute(name, value);    },    _removeAttribute: function(name)     {        var attr = this._attributesMap[name];        if (attr) {            this._attributes.remove(attr);            delete this._attributesMap[name];        }    },    copyTo: function(targetNode, anchorNode, callback)     {        this._agent.copyTo(this.id, targetNode.id, anchorNode ? anchorNode.id : undefined, this._domModel._markRevision(this, callback));    },    moveTo: function(targetNode, anchorNode, callback)     {        this._agent.moveTo(this.id, targetNode.id, anchorNode ? anchorNode.id : undefined, this._domModel._markRevision(this, callback));    },    isXMLNode: function()     {        return !!this.ownerDocument && !!this.ownerDocument.xmlVersion;    },    _updateChildUserPropertyCountsOnRemoval: function(parentNode)     {        var result = {};        if (this._userProperties) {            for (var name in this._userProperties)                result[name] = (result[name] || 0) + 1;        }        if (this._descendantUserPropertyCounters) {            for (var name in this._descendantUserPropertyCounters) {                var counter = this._descendantUserPropertyCounters[name];                result[name] = (result[name] || 0) + counter;            }        }        for (var name in result)            parentNode._updateDescendantUserPropertyCount(name, -result[name]);    },    _updateDescendantUserPropertyCount: function(name, delta)     {        if (!this._descendantUserPropertyCounters.hasOwnProperty(name))            this._descendantUserPropertyCounters[name] = 0;        this._descendantUserPropertyCounters[name] += delta;        if (!this._descendantUserPropertyCounters[name])            delete this._descendantUserPropertyCounters[name];        if (this.parentNode)            this.parentNode._updateDescendantUserPropertyCount(name, delta);    },    setUserProperty: function(name, value)     {        if (value === null ) {            this.removeUserProperty(name);            return;        }        if (this.parentNode && !this._userProperties.hasOwnProperty(name))            this.parentNode._updateDescendantUserPropertyCount(name, 1);        this._userProperties[name] = value;    },    removeUserProperty: function(name)     {        if (!this._userProperties.hasOwnProperty(name))            return;        delete this._userProperties[name];        if (this.parentNode)            this.parentNode._updateDescendantUserPropertyCount(name, -1);    },    getUserProperty: function(name)     {        return (this._userProperties && this._userProperties[name]) || null ;    },    descendantUserPropertyCount: function(name)     {        return this._descendantUserPropertyCounters && this._descendantUserPropertyCounters[name] ? this._descendantUserPropertyCounters[name] : 0;    },    resolveURL: function(url)     {        if (!url)            return url;        for (var frameOwnerCandidate = this; frameOwnerCandidate; frameOwnerCandidate = frameOwnerCandidate.parentNode) {            if (frameOwnerCandidate.baseURL)                return WebInspector.ParsedURL.completeURL(frameOwnerCandidate.baseURL, url);        }        return null ;    },    highlight: function(mode, objectId)     {        this._domModel.highlightDOMNode(this.id, mode, undefined, objectId);    },    highlightForTwoSeconds: function()     {        this._domModel.highlightDOMNodeForTwoSeconds(this.id);    },    resolveToObject: function(objectGroup, callback)     {        this._agent.resolveNode(this.id, objectGroup, mycallback.bind(this));        function mycallback(error, object)         {            if (!callback)                return;            if (error || !object)                callback(null );            else                callback(this.target().runtimeModel.createRemoteObject(object));        }    },    resolveToObjectPromise: function(objectGroup)     {        return new Promise(resolveToObject.bind(this));        function resolveToObject(fulfill, reject)         {            this.resolveToObject(objectGroup, mycallback);            function mycallback(object)             {                if (object)                    fulfill(object)                else                    reject(null );            }        }    },    boxModel: function(callback)     {        this._agent.getBoxModel(this.id, this._domModel._wrapClientCallback(callback));    },    setAsInspectedNode: function()     {        var node = this;        while (true) {            var ancestor = node.ancestorUserAgentShadowRoot();            if (!ancestor)                break;            ancestor = node.ancestorShadowHost();            if (!ancestor)                break            node = ancestor;        }        this._agent.setInspectedNode(node.id);    },    __proto__: WebInspector.SDKObject.prototype}WebInspector.DeferredDOMNode = function(target, backendNodeId) {    this._domModel = WebInspector.DOMModel.fromTarget(target);    this._backendNodeId = backendNodeId;}WebInspector.DeferredDOMNode.prototype = {    resolve: function(callback)     {        if (!this._domModel) {            callback(null );            return;        }        this._domModel.pushNodesByBackendIdsToFrontend(new Set([this._backendNodeId]), onGotNode.bind(this));        function onGotNode(nodeIds)         {            callback(nodeIds && (nodeIds.get(this._backendNodeId) || null ));        }    },    backendNodeId: function()     {        return this._backendNodeId;    },    highlight: function()     {        if (this._domModel)            this._domModel.highlightDOMNode(undefined, undefined, this._backendNodeId);    }}WebInspector.DOMNodeShortcut = function(target, backendNodeId, nodeType, nodeName) {    this.nodeType = nodeType;    this.nodeName = nodeName;    this.deferredNode = new WebInspector.DeferredDOMNode(target,backendNodeId);}WebInspector.DOMDocument = function(domModel, payload) {    WebInspector.DOMNode.call(this, domModel, this, false, payload);    this.documentURL = payload.documentURL || "";    this.baseURL = payload.baseURL || "";    this.xmlVersion = payload.xmlVersion;    this._listeners = {};}WebInspector.DOMDocument.prototype = {    __proto__: WebInspector.DOMNode.prototype}WebInspector.DOMModel = function(target) {    WebInspector.SDKModel.call(this, WebInspector.DOMModel, target);    this._agent = target.domAgent();    WebInspector.targetManager.addEventListener(WebInspector.TargetManager.Events.SuspendStateChanged, this._suspendStateChanged, this);    this._idToDOMNode = {};    this._document = null ;    this._attributeLoadNodeIds = {};    target.registerDOMDispatcher(new WebInspector.DOMDispatcher(this));    this._showRulers = false;    this._showExtensionLines = false;    this._defaultHighlighter = new WebInspector.DefaultDOMNodeHighlighter(this._agent);    this._highlighter = this._defaultHighlighter;    this._agent.enable();}WebInspector.DOMModel.Events = {    AttrModified: "AttrModified",    AttrRemoved: "AttrRemoved",    CharacterDataModified: "CharacterDataModified",    DOMMutated: "DOMMutated",    NodeInserted: "NodeInserted",    NodeInspected: "NodeInspected",    NodeRemoved: "NodeRemoved",    DocumentUpdated: "DocumentUpdated",    ChildNodeCountUpdated: "ChildNodeCountUpdated",    UndoRedoRequested: "UndoRedoRequested",    UndoRedoCompleted: "UndoRedoCompleted",    DistributedNodesChanged: "DistributedNodesChanged",    ModelSuspended: "ModelSuspended",    InspectModeWillBeToggled: "InspectModeWillBeToggled"}WebInspector.DOMModel.highlightObjectAsDOMNode = function(object) {    var domModel = WebInspector.DOMModel.fromTarget(object.target());    if (domModel)        domModel.highlightDOMNode(undefined, undefined, undefined, object.objectId);}WebInspector.DOMModel.instances = function() {    var result = [];    for (var target of WebInspector.targetManager.targets()) {        var domModel = WebInspector.DOMModel.fromTarget(target);        if (domModel)            result.push(domModel);    }    return result;}WebInspector.DOMModel.hideDOMNodeHighlight = function() {    for (var domModel of WebInspector.DOMModel.instances())        domModel.highlightDOMNode(0);}WebInspector.DOMModel.cancelSearch = function() {    for (var domModel of WebInspector.DOMModel.instances())        domModel._cancelSearch();}WebInspector.DOMModel.prototype = {    _scheduleMutationEvent: function()     {        if (!this.hasEventListeners(WebInspector.DOMModel.Events.DOMMutated))            return;        this._lastMutationId = (this._lastMutationId || 0) + 1;        Promise.resolve().then(callObserve.bind(this, this._lastMutationId));        function callObserve(mutationId)         {            if (!this.hasEventListeners(WebInspector.DOMModel.Events.DOMMutated) || this._lastMutationId !== mutationId)                return;            this.dispatchEventToListeners(WebInspector.DOMModel.Events.DOMMutated);        }    },    requestDocument: function(callback)     {        if (this._document) {            if (callback)                callback(this._document);            return;        }        if (this._pendingDocumentRequestCallbacks) {            this._pendingDocumentRequestCallbacks.push(callback);            return;        }        this._pendingDocumentRequestCallbacks = [callback];        function onDocumentAvailable(error, root)         {            if (!error)                this._setDocument(root);            for (var i = 0; i < this._pendingDocumentRequestCallbacks.length; ++i) {                var callback = this._pendingDocumentRequestCallbacks[i];                if (callback)                    callback(this._document);            }            delete this._pendingDocumentRequestCallbacks;        }        this._agent.getDocument(onDocumentAvailable.bind(this));    },    existingDocument: function()     {        return this._document;    },    pushNodeToFrontend: function(objectId, callback)     {        function mycallback(nodeId)         {            callback(nodeId ? this.nodeForId(nodeId) : null );        }        this._dispatchWhenDocumentAvailable(this._agent.requestNode.bind(this._agent, objectId), mycallback.bind(this));    },    pushNodeByPathToFrontend: function(path, callback)     {        this._dispatchWhenDocumentAvailable(this._agent.pushNodeByPathToFrontend.bind(this._agent, path), callback);    },    pushNodesByBackendIdsToFrontend: function(backendNodeIds, callback)     {        var backendNodeIdsArray = Array.from(backendNodeIds.values());        function mycallback(nodeIds)         {            if (!nodeIds) {                callback(null );                return;            }            var map = new Map();            for (var i = 0; i < nodeIds.length; ++i) {                if (nodeIds[i])                    map.set(backendNodeIdsArray[i], this.nodeForId(nodeIds[i]));            }            callback(map);        }        this._dispatchWhenDocumentAvailable(this._agent.pushNodesByBackendIdsToFrontend.bind(this._agent, backendNodeIdsArray), mycallback.bind(this));    },    _wrapClientCallback: function(callback)     {        if (!callback)            return;        var wrapper = function(error, result)         {            callback(error ? null  : result);        }        ;        return wrapper;    },    _dispatchWhenDocumentAvailable: function(func, callback)     {        var callbackWrapper = this._wrapClientCallback(callback);        function onDocumentAvailable()         {            if (this._document)                func(callbackWrapper);            else {                if (callbackWrapper)                    callbackWrapper("No document");            }        }        this.requestDocument(onDocumentAvailable.bind(this));    },    _attributeModified: function(nodeId, name, value)     {        var node = this._idToDOMNode[nodeId];        if (!node)            return;        node._setAttribute(name, value);        this.dispatchEventToListeners(WebInspector.DOMModel.Events.AttrModified, {            node: node,            name: name        });        this._scheduleMutationEvent();    },    _attributeRemoved: function(nodeId, name)     {        var node = this._idToDOMNode[nodeId];        if (!node)            return;        node._removeAttribute(name);        this.dispatchEventToListeners(WebInspector.DOMModel.Events.AttrRemoved, {            node: node,            name: name        });        this._scheduleMutationEvent();    },    _inlineStyleInvalidated: function(nodeIds)     {        for (var i = 0; i < nodeIds.length; ++i)            this._attributeLoadNodeIds[nodeIds[i]] = true;        if ("_loadNodeAttributesTimeout" in this)            return;        this._loadNodeAttributesTimeout = setTimeout(this._loadNodeAttributes.bind(this), 20);    },    _loadNodeAttributes: function()     {        function callback(nodeId, error, attributes)         {            if (error) {                return;            }            var node = this._idToDOMNode[nodeId];            if (node) {                if (node._setAttributesPayload(attributes)) {                    this.dispatchEventToListeners(WebInspector.DOMModel.Events.AttrModified, {                        node: node,                        name: "style"                    });                    this._scheduleMutationEvent();                }            }        }        delete this._loadNodeAttributesTimeout;        for (var nodeId in this._attributeLoadNodeIds) {            var nodeIdAsNumber = parseInt(nodeId, 10);            this._agent.getAttributes(nodeIdAsNumber, callback.bind(this, nodeIdAsNumber));        }        this._attributeLoadNodeIds = {};    },    _characterDataModified: function(nodeId, newValue)     {        var node = this._idToDOMNode[nodeId];        node._nodeValue = newValue;        this.dispatchEventToListeners(WebInspector.DOMModel.Events.CharacterDataModified, node);        this._scheduleMutationEvent();    },    nodeForId: function(nodeId)     {        return this._idToDOMNode[nodeId] || null ;    },    _documentUpdated: function()     {        this._setDocument(null );    },    _setDocument: function(payload)     {        this._idToDOMNode = {};        if (payload && "nodeId" in payload)            this._document = new WebInspector.DOMDocument(this,payload);        else            this._document = null ;        this.dispatchEventToListeners(WebInspector.DOMModel.Events.DocumentUpdated, this._document);    },    _setDetachedRoot: function(payload)     {        if (payload.nodeName === "#document")            new WebInspector.DOMDocument(this,payload);        else            new WebInspector.DOMNode(this,null ,false,payload);    },    _setChildNodes: function(parentId, payloads)     {        if (!parentId && payloads.length) {            this._setDetachedRoot(payloads[0]);            return;        }        var parent = this._idToDOMNode[parentId];        parent._setChildrenPayload(payloads);    },    _childNodeCountUpdated: function(nodeId, newValue)     {        var node = this._idToDOMNode[nodeId];        node._childNodeCount = newValue;        this.dispatchEventToListeners(WebInspector.DOMModel.Events.ChildNodeCountUpdated, node);        this._scheduleMutationEvent();    },    _childNodeInserted: function(parentId, prevId, payload)     {        var parent = this._idToDOMNode[parentId];        var prev = this._idToDOMNode[prevId];        var node = parent._insertChild(prev, payload);        this._idToDOMNode[node.id] = node;        this.dispatchEventToListeners(WebInspector.DOMModel.Events.NodeInserted, node);        this._scheduleMutationEvent();    },    _childNodeRemoved: function(parentId, nodeId)     {        var parent = this._idToDOMNode[parentId];        var node = this._idToDOMNode[nodeId];        parent._removeChild(node);        this._unbind(node);        this.dispatchEventToListeners(WebInspector.DOMModel.Events.NodeRemoved, {            node: node,            parent: parent        });        this._scheduleMutationEvent();    },    _shadowRootPushed: function(hostId, root)     {        var host = this._idToDOMNode[hostId];        if (!host)            return;        var node = new WebInspector.DOMNode(this,host.ownerDocument,true,root);        node.parentNode = host;        this._idToDOMNode[node.id] = node;        host._shadowRoots.unshift(node);        this.dispatchEventToListeners(WebInspector.DOMModel.Events.NodeInserted, node);        this._scheduleMutationEvent();    },    _shadowRootPopped: function(hostId, rootId)     {        var host = this._idToDOMNode[hostId];        if (!host)            return;        var root = this._idToDOMNode[rootId];        if (!root)            return;        host._removeChild(root);        this._unbind(root);        this.dispatchEventToListeners(WebInspector.DOMModel.Events.NodeRemoved, {            node: root,            parent: host        });        this._scheduleMutationEvent();    },    _pseudoElementAdded: function(parentId, pseudoElement)     {        var parent = this._idToDOMNode[parentId];        if (!parent)            return;        var node = new WebInspector.DOMNode(this,parent.ownerDocument,false,pseudoElement);        node.parentNode = parent;        this._idToDOMNode[node.id] = node;        console.assert(!parent._pseudoElements.get(node.pseudoType()));        parent._pseudoElements.set(node.pseudoType(), node);        this.dispatchEventToListeners(WebInspector.DOMModel.Events.NodeInserted, node);        this._scheduleMutationEvent();    },    _pseudoElementRemoved: function(parentId, pseudoElementId)     {        var parent = this._idToDOMNode[parentId];        if (!parent)            return;        var pseudoElement = this._idToDOMNode[pseudoElementId];        if (!pseudoElement)            return;        parent._removeChild(pseudoElement);        this._unbind(pseudoElement);        this.dispatchEventToListeners(WebInspector.DOMModel.Events.NodeRemoved, {            node: pseudoElement,            parent: parent        });        this._scheduleMutationEvent();    },    _distributedNodesUpdated: function(insertionPointId, distributedNodes)     {        var insertionPoint = this._idToDOMNode[insertionPointId];        if (!insertionPoint)            return;        insertionPoint._setDistributedNodePayloads(distributedNodes);        this.dispatchEventToListeners(WebInspector.DOMModel.Events.DistributedNodesChanged, insertionPoint);        this._scheduleMutationEvent();    },    _unbind: function(node)     {        delete this._idToDOMNode[node.id];        for (var i = 0; node._children && i < node._children.length; ++i)            this._unbind(node._children[i]);        for (var i = 0; i < node._shadowRoots.length; ++i)            this._unbind(node._shadowRoots[i]);        var pseudoElements = node.pseudoElements();        for (var value of pseudoElements.values())            this._unbind(value);        if (node._templateContent)            this._unbind(node._templateContent);    },    _inspectNodeRequested: function(backendNodeId)     {        var deferredNode = new WebInspector.DeferredDOMNode(this.target(),backendNodeId);        this.dispatchEventToListeners(WebInspector.DOMModel.Events.NodeInspected, deferredNode);    },    performSearch: function(query, includeUserAgentShadowDOM, searchCallback)     {        WebInspector.DOMModel.cancelSearch();        function callback(error, searchId, resultsCount)         {            this._searchId = searchId;            searchCallback(resultsCount);        }        this._agent.performSearch(query, includeUserAgentShadowDOM, callback.bind(this));    },    performSearchPromise: function(query, includeUserAgentShadowDOM)     {        return new Promise(performSearch.bind(this));        function performSearch(resolve)         {            this._agent.performSearch(query, includeUserAgentShadowDOM, callback.bind(this));            function callback(error, searchId, resultsCount)             {                if (!error)                    this._searchId = searchId;                resolve(error ? 0 : resultsCount);            }        }    },    searchResult: function(index, callback)     {        if (this._searchId)            this._agent.getSearchResults(this._searchId, index, index + 1, searchResultsCallback.bind(this));        else            callback(null );        function searchResultsCallback(error, nodeIds)         {            if (error) {                console.error(error);                callback(null );                return;            }            if (nodeIds.length != 1)                return;            callback(this.nodeForId(nodeIds[0]));        }    },    _cancelSearch: function()     {        if (this._searchId) {            this._agent.discardSearchResults(this._searchId);            delete this._searchId;        }    },    querySelector: function(nodeId, selectors, callback)     {        this._agent.querySelector(nodeId, selectors, this._wrapClientCallback(callback));    },    querySelectorAll: function(nodeId, selectors, callback)     {        this._agent.querySelectorAll(nodeId, selectors, this._wrapClientCallback(callback));    },    highlightDOMNode: function(nodeId, mode, backendNodeId, objectId)     {        this.highlightDOMNodeWithConfig(nodeId, {            mode: mode        }, backendNodeId, objectId);    },    highlightDOMNodeWithConfig: function(nodeId, config, backendNodeId, objectId)     {        config = config || {            mode: "all",            showInfo: undefined        };        if (this._hideDOMNodeHighlightTimeout) {            clearTimeout(this._hideDOMNodeHighlightTimeout);            delete this._hideDOMNodeHighlightTimeout;        }        var highlightConfig = this._buildHighlightConfig(config.mode);        if (typeof config.showInfo !== "undefined")            highlightConfig.showInfo = config.showInfo;        this._highlighter.highlightDOMNode(this.nodeForId(nodeId || 0), highlightConfig, backendNodeId, objectId);    },    highlightDOMNodeForTwoSeconds: function(nodeId)     {        this.highlightDOMNode(nodeId);        if (!Runtime.experiments.isEnabled("layoutEditor"))            this._hideDOMNodeHighlightTimeout = setTimeout(WebInspector.DOMModel.hideDOMNodeHighlight.bind(WebInspector.DOMModel), 2000);    },    highlightFrame: function(frameId)     {        this._highlighter.highlightFrame(frameId);    },    setInspectModeEnabled: function(enabled, inspectUAShadowDOM, callback)     {        function onDocumentAvailable()         {            this.dispatchEventToListeners(WebInspector.DOMModel.Events.InspectModeWillBeToggled, enabled);            this._highlighter.setInspectModeEnabled(enabled, inspectUAShadowDOM, this._buildHighlightConfig(), callback);        }        this.requestDocument(onDocumentAvailable.bind(this));    },    setHighlightSettings: function(showRulers, showExtensionLines)     {        this._showRulers = showRulers;        this._showExtensionLines = showExtensionLines;    },    _buildHighlightConfig: function(mode)     {        mode = mode || "all";        var highlightConfig = {            showInfo: mode === "all",            showRulers: this._showRulers,            showExtensionLines: this._showExtensionLines        };        if (mode === "all" || mode === "content")            highlightConfig.contentColor = WebInspector.Color.PageHighlight.Content.toProtocolRGBA();        if (mode === "all" || mode === "padding")            highlightConfig.paddingColor = WebInspector.Color.PageHighlight.Padding.toProtocolRGBA();        if (mode === "all" || mode === "border")            highlightConfig.borderColor = WebInspector.Color.PageHighlight.Border.toProtocolRGBA();        if (mode === "all" || mode === "margin")            highlightConfig.marginColor = WebInspector.Color.PageHighlight.Margin.toProtocolRGBA();        if (mode === "all") {            highlightConfig.eventTargetColor = WebInspector.Color.PageHighlight.EventTarget.toProtocolRGBA();            highlightConfig.shapeColor = WebInspector.Color.PageHighlight.Shape.toProtocolRGBA();            highlightConfig.shapeMarginColor = WebInspector.Color.PageHighlight.ShapeMargin.toProtocolRGBA();            highlightConfig.showLayoutEditor = Runtime.experiments.isEnabled("layoutEditor");        }        return highlightConfig;    },    _markRevision: function(node, callback)     {        function wrapperFunction(error)         {            if (!error)                this.markUndoableState();            if (callback)                callback.apply(this, arguments);        }        return wrapperFunction.bind(this);    },    markUndoableState: function()     {        this._agent.markUndoableState();    },    undo: function(callback)     {        function mycallback(error)         {            this.dispatchEventToListeners(WebInspector.DOMModel.Events.UndoRedoCompleted);            callback(error);        }        this.dispatchEventToListeners(WebInspector.DOMModel.Events.UndoRedoRequested);        this._agent.undo(callback);    },    redo: function(callback)     {        function mycallback(error)         {            this.dispatchEventToListeners(WebInspector.DOMModel.Events.UndoRedoCompleted);            callback(error);        }        this.dispatchEventToListeners(WebInspector.DOMModel.Events.UndoRedoRequested);        this._agent.redo(callback);    },    setHighlighter: function(highlighter)     {        this._highlighter = highlighter || this._defaultHighlighter;    },    nodeForLocation: function(x, y, callback)     {        this._agent.getNodeForLocation(x, y, mycallback.bind(this));        function mycallback(error, nodeId)         {            if (error) {                callback(null );                return;            }            callback(this.nodeForId(nodeId));        }    },    pushObjectAsNodeToFrontend: function(object, callback)     {        if (object.isNode())            this.pushNodeToFrontend(object.objectId, callback);        else            callback(null );    },    _suspendStateChanged: function()     {        if (WebInspector.targetManager.allTargetsSuspended()) {            this._agent.disable();        } else {            this._agent.enable();            this._setDocument(null );        }    },    __proto__: WebInspector.SDKModel.prototype}WebInspector.DOMDispatcher = function(domModel) {    this._domModel = domModel;}WebInspector.DOMDispatcher.prototype = {    documentUpdated: function()     {        this._domModel._documentUpdated();    },    inspectNodeRequested: function(nodeId)     {        this._domModel._inspectNodeRequested(nodeId);    },    attributeModified: function(nodeId, name, value)     {        this._domModel._attributeModified(nodeId, name, value);    },    attributeRemoved: function(nodeId, name)     {        this._domModel._attributeRemoved(nodeId, name);    },    inlineStyleInvalidated: function(nodeIds)     {        this._domModel._inlineStyleInvalidated(nodeIds);    },    characterDataModified: function(nodeId, characterData)     {        this._domModel._characterDataModified(nodeId, characterData);    },    setChildNodes: function(parentId, payloads)     {        this._domModel._setChildNodes(parentId, payloads);    },    childNodeCountUpdated: function(nodeId, childNodeCount)     {        this._domModel._childNodeCountUpdated(nodeId, childNodeCount);    },    childNodeInserted: function(parentNodeId, previousNodeId, payload)     {        this._domModel._childNodeInserted(parentNodeId, previousNodeId, payload);    },    childNodeRemoved: function(parentNodeId, nodeId)     {        this._domModel._childNodeRemoved(parentNodeId, nodeId);    },    shadowRootPushed: function(hostId, root)     {        this._domModel._shadowRootPushed(hostId, root);    },    shadowRootPopped: function(hostId, rootId)     {        this._domModel._shadowRootPopped(hostId, rootId);    },    pseudoElementAdded: function(parentId, pseudoElement)     {        this._domModel._pseudoElementAdded(parentId, pseudoElement);    },    pseudoElementRemoved: function(parentId, pseudoElementId)     {        this._domModel._pseudoElementRemoved(parentId, pseudoElementId);    },    distributedNodesUpdated: function(insertionPointId, distributedNodes)     {        this._domModel._distributedNodesUpdated(insertionPointId, distributedNodes);    }}WebInspector.DOMNodeHighlighter = function() {}WebInspector.DOMNodeHighlighter.prototype = {    highlightDOMNode: function(node, config, backendNodeId, objectId) {},    setInspectModeEnabled: function(enabled, inspectUAShadowDOM, config, callback) {},    highlightFrame: function(frameId) {}}WebInspector.DefaultDOMNodeHighlighter = function(agent) {    this._agent = agent;}WebInspector.DefaultDOMNodeHighlighter.prototype = {    highlightDOMNode: function(node, config, backendNodeId, objectId)     {        if (objectId || node || backendNodeId)            this._agent.highlightNode(config, (objectId || backendNodeId) ? undefined : node.id, backendNodeId, objectId);        else            this._agent.hideHighlight();    },    setInspectModeEnabled: function(enabled, inspectUAShadowDOM, config, callback)     {        this._agent.setInspectModeEnabled(enabled, inspectUAShadowDOM, config, callback);    },    highlightFrame: function(frameId)     {        this._agent.highlightFrame(frameId, WebInspector.Color.PageHighlight.Content.toProtocolRGBA(), WebInspector.Color.PageHighlight.ContentOutline.toProtocolRGBA());    }}WebInspector.DOMModel.fromTarget = function(target) {    return ( target.model(WebInspector.DOMModel)) ;};WebInspector.DebuggerModel = function(target) {    WebInspector.SDKModel.call(this, WebInspector.DebuggerModel, target);    target.registerDebuggerDispatcher(new WebInspector.DebuggerDispatcher(this));    this._agent = target.debuggerAgent();    WebInspector.targetManager.addEventListener(WebInspector.TargetManager.Events.SuspendStateChanged, this._suspendStateChanged, this);    WebInspector.targetManager.addEventListener(WebInspector.TargetManager.Events.TargetDisposed, this._targetDisposed, this);    this._debuggerPausedDetails = null ;    this._scripts = {};    this._scriptsBySourceURL = new Map();    this._breakpointResolvedEventTarget = new WebInspector.Object();    this._isPausing = false;    WebInspector.moduleSetting("pauseOnExceptionEnabled").addChangeListener(this._pauseOnExceptionStateChanged, this);    WebInspector.moduleSetting("pauseOnCaughtException").addChangeListener(this._pauseOnExceptionStateChanged, this);    WebInspector.moduleSetting("enableAsyncStackTraces").addChangeListener(this.asyncStackTracesStateChanged, this);    WebInspector.moduleSetting("skipStackFramesPattern").addChangeListener(this._applySkipStackFrameSettings, this);    WebInspector.moduleSetting("skipContentScripts").addChangeListener(this._applySkipStackFrameSettings, this);    this.enableDebugger();    this._applySkipStackFrameSettings();}WebInspector.DebuggerModel.FunctionDetails;WebInspector.DebuggerModel.GeneratorObjectDetails;WebInspector.DebuggerModel.PauseOnExceptionsState = {    DontPauseOnExceptions: "none",    PauseOnAllExceptions: "all",    PauseOnUncaughtExceptions: "uncaught"};WebInspector.DebuggerModel.Events = {    AsyncOperationStarted: "AsyncOperationStarted",    AsyncOperationCompleted: "AsyncOperationCompleted",    DebuggerWasEnabled: "DebuggerWasEnabled",    DebuggerWasDisabled: "DebuggerWasDisabled",    BeforeDebuggerPaused: "BeforeDebuggerPaused",    DebuggerPaused: "DebuggerPaused",    DebuggerResumed: "DebuggerResumed",    ParsedScriptSource: "ParsedScriptSource",    FailedToParseScriptSource: "FailedToParseScriptSource",    GlobalObjectCleared: "GlobalObjectCleared",    CallFrameSelected: "CallFrameSelected",    ConsoleCommandEvaluatedInSelectedCallFrame: "ConsoleCommandEvaluatedInSelectedCallFrame",    PromiseUpdated: "PromiseUpdated",}WebInspector.DebuggerModel.BreakReason = {    AsyncOperation: "AsyncOperation",    DOM: "DOM",    EventListener: "EventListener",    XHR: "XHR",    Exception: "exception",    PromiseRejection: "promiseRejection",    Assert: "assert",    CSPViolation: "CSPViolation",    DebugCommand: "debugCommand",    Other: "other"}WebInspector.DebuggerModel.prototype = {    debuggerEnabled: function()     {        return !!this._debuggerEnabled;    },    enableDebugger: function()     {        if (this._debuggerEnabled)            return;        this._agent.enable();        this._debuggerEnabled = true;        if (this._hasStaleState) {            this._globalObjectCleared();            this._hasStaleState = false;        }        this._pauseOnExceptionStateChanged();        this.asyncStackTracesStateChanged();        this.dispatchEventToListeners(WebInspector.DebuggerModel.Events.DebuggerWasEnabled);    },    disableDebugger: function()     {        if (!this._debuggerEnabled)            return;        this._hasStaleState = true;        this._agent.disable();        this._debuggerEnabled = false;        this._isPausing = false;        this.asyncStackTracesStateChanged();        this.dispatchEventToListeners(WebInspector.DebuggerModel.Events.DebuggerWasDisabled);    },    _skipAllPauses: function(skip)     {        if (this._skipAllPausesTimeout) {            clearTimeout(this._skipAllPausesTimeout);            delete this._skipAllPausesTimeout;        }        this._agent.setSkipAllPauses(skip);    },    skipAllPausesUntilReloadOrTimeout: function(timeout)     {        if (this._skipAllPausesTimeout)            clearTimeout(this._skipAllPausesTimeout);        this._agent.setSkipAllPauses(true);        this._skipAllPausesTimeout = setTimeout(this._skipAllPauses.bind(this, false), timeout);    },    _pauseOnExceptionStateChanged: function()     {        var state;        if (!WebInspector.moduleSetting("pauseOnExceptionEnabled").get()) {            state = WebInspector.DebuggerModel.PauseOnExceptionsState.DontPauseOnExceptions;        } else if (WebInspector.moduleSetting("pauseOnCaughtException").get()) {            state = WebInspector.DebuggerModel.PauseOnExceptionsState.PauseOnAllExceptions;        } else {            state = WebInspector.DebuggerModel.PauseOnExceptionsState.PauseOnUncaughtExceptions;        }        this._agent.setPauseOnExceptions(state);    },    asyncStackTracesStateChanged: function()     {        const maxAsyncStackChainDepth = 4;        var enabled = WebInspector.moduleSetting("enableAsyncStackTraces").get() && !WebInspector.targetManager.allTargetsSuspended();        this._agent.setAsyncCallStackDepth(enabled ? maxAsyncStackChainDepth : 0);    },    stepInto: function()     {        this._agent.stepInto();    },    stepIntoAsync: function()     {        this._agent.stepIntoAsync();    },    stepOver: function()     {        this._agent.stepOver();    },    stepOut: function()     {        this._agent.stepOut();    },    resume: function()     {        this._agent.resume();        this._isPausing = false;    },    pause: function()     {        this._isPausing = true;        this._skipAllPauses(false);        this._agent.pause();    },    setBreakpointsActive: function(active)     {        this._agent.setBreakpointsActive(active);    },    setBreakpointByURL: function(url, lineNumber, columnNumber, condition, callback)     {        var minColumnNumber = 0;        var scripts = this._scriptsBySourceURL.get(url) || [];        for (var i = 0, l = scripts.length; i < l; ++i) {            var script = scripts[i];            if (lineNumber === script.lineOffset)                minColumnNumber = minColumnNumber ? Math.min(minColumnNumber, script.columnOffset) : script.columnOffset;        }        columnNumber = Math.max(columnNumber, minColumnNumber);        var target = this.target();        function didSetBreakpoint(error, breakpointId, locations)         {            if (callback) {                var rawLocations = locations ? locations.map(WebInspector.DebuggerModel.Location.fromPayload.bind(WebInspector.DebuggerModel.Location, this)) : [];                callback(error ? null  : breakpointId, rawLocations);            }        }        this._agent.setBreakpointByUrl(lineNumber, url, undefined, columnNumber, condition, didSetBreakpoint.bind(this));    },    setBreakpointBySourceId: function(rawLocation, condition, callback)     {        var target = this.target();        function didSetBreakpoint(error, breakpointId, actualLocation)         {            if (callback) {                var location = WebInspector.DebuggerModel.Location.fromPayload(this, actualLocation);                callback(error ? null  : breakpointId, [location]);            }        }        this._agent.setBreakpoint(rawLocation.payload(), condition, didSetBreakpoint.bind(this));    },    removeBreakpoint: function(breakpointId, callback)     {        this._agent.removeBreakpoint(breakpointId, innerCallback);        function innerCallback(error)         {            if (error)                console.error("Failed to remove breakpoint: " + error);            if (callback)                callback();        }    },    getCollectionEntries: function(objectId, callback)     {        this._agent.getCollectionEntries(objectId, innerCallback);        function innerCallback(error, response)         {            if (error) {                console.error(error);                callback(null );                return;            }            callback(response);        }    },    enablePromiseTracker: function(captureStacks)     {        this._agent.enablePromiseTracker(captureStacks);    },    disablePromiseTracker: function()     {        this._agent.disablePromiseTracker();    },    getPromiseById: function(promiseId, objectGroup, callback)     {        this._agent.getPromiseById(promiseId, objectGroup, innerCallback);        function innerCallback(error, promise)         {            if (error) {                console.error(error);                callback(null );                return;            }            callback(promise);        }    },    flushAsyncOperationEvents: function()     {        this._agent.flushAsyncOperationEvents();    },    setAsyncOperationBreakpoint: function(operationId)     {        this._agent.setAsyncOperationBreakpoint(operationId);    },    removeAsyncOperationBreakpoint: function(operationId)     {        this._agent.removeAsyncOperationBreakpoint(operationId);    },    _breakpointResolved: function(breakpointId, location)     {        this._breakpointResolvedEventTarget.dispatchEventToListeners(breakpointId, WebInspector.DebuggerModel.Location.fromPayload(this, location));    },    _globalObjectCleared: function()     {        this._setDebuggerPausedDetails(null );        this._reset();        this.dispatchEventToListeners(WebInspector.DebuggerModel.Events.GlobalObjectCleared);    },    _promiseUpdated: function(eventType, promise)     {        this.dispatchEventToListeners(WebInspector.DebuggerModel.Events.PromiseUpdated, {            eventType: eventType,            promise: promise        });    },    _asyncOperationStarted: function(operation)     {        this.dispatchEventToListeners(WebInspector.DebuggerModel.Events.AsyncOperationStarted, operation);    },    _asyncOperationCompleted: function(operationId)     {        this.dispatchEventToListeners(WebInspector.DebuggerModel.Events.AsyncOperationCompleted, operationId);    },    _reset: function()     {        this._scripts = {};        this._scriptsBySourceURL.clear();    },    get scripts()     {        return this._scripts;    },    scriptForId: function(scriptId)     {        return this._scripts[scriptId] || null ;    },    scriptsForSourceURL: function(sourceURL)     {        if (!sourceURL)            return [];        return this._scriptsBySourceURL.get(sourceURL) || [];    },    setScriptSource: function(scriptId, newSource, callback)     {        this._scripts[scriptId].editSource(newSource, this._didEditScriptSource.bind(this, scriptId, newSource, callback));    },    _didEditScriptSource: function(scriptId, newSource, callback, error, errorData, callFrames, asyncStackTrace, needsStepIn)     {        if (needsStepIn) {            this.stepInto();            this._pendingLiveEditCallback = callback.bind(this, error, errorData);            return;        }        if (!error && callFrames && callFrames.length)            this._pausedScript(callFrames, this._debuggerPausedDetails.reason, this._debuggerPausedDetails.auxData, this._debuggerPausedDetails.breakpointIds, asyncStackTrace);        callback(error, errorData);    },    get callFrames()     {        return this._debuggerPausedDetails ? this._debuggerPausedDetails.callFrames : null ;    },    debuggerPausedDetails: function()     {        return this._debuggerPausedDetails;    },    _setDebuggerPausedDetails: function(debuggerPausedDetails)     {        this._isPausing = false;        this._debuggerPausedDetails = debuggerPausedDetails;        if (this._debuggerPausedDetails) {            if (Runtime.experiments.isEnabled("emptySourceMapAutoStepping")) {                if (this.dispatchEventToListeners(WebInspector.DebuggerModel.Events.BeforeDebuggerPaused, this._debuggerPausedDetails)) {                    return false;                }            }            this.dispatchEventToListeners(WebInspector.DebuggerModel.Events.DebuggerPaused, this._debuggerPausedDetails);        }        if (debuggerPausedDetails)            this.setSelectedCallFrame(debuggerPausedDetails.callFrames[0]);        else            this.setSelectedCallFrame(null );        return true;    },    _pausedScript: function(callFrames, reason, auxData, breakpointIds, asyncStackTrace)     {        var pausedDetails = new WebInspector.DebuggerPausedDetails(this,callFrames,reason,auxData,breakpointIds,asyncStackTrace);        if (this._setDebuggerPausedDetails(pausedDetails)) {            if (this._pendingLiveEditCallback) {                var callback = this._pendingLiveEditCallback;                delete this._pendingLiveEditCallback;                callback();            }        } else {            this._agent.stepInto();        }    },    _resumedScript: function()     {        this._setDebuggerPausedDetails(null );        this.dispatchEventToListeners(WebInspector.DebuggerModel.Events.DebuggerResumed);    },    _parsedScriptSource: function(scriptId, sourceURL, startLine, startColumn, endLine, endColumn, isContentScript, isInternalScript, sourceMapURL, hasSourceURL, hasSyntaxError)     {        var script = new WebInspector.Script(this,scriptId,sourceURL,startLine,startColumn,endLine,endColumn,isContentScript,isInternalScript,sourceMapURL,hasSourceURL);        this._registerScript(script);        if (!hasSyntaxError)            this.dispatchEventToListeners(WebInspector.DebuggerModel.Events.ParsedScriptSource, script);        else            this.dispatchEventToListeners(WebInspector.DebuggerModel.Events.FailedToParseScriptSource, script);        return script;    },    _registerScript: function(script)     {        this._scripts[script.scriptId] = script;        if (script.isAnonymousScript())            return;        var scripts = this._scriptsBySourceURL.get(script.sourceURL);        if (!scripts) {            scripts = [];            this._scriptsBySourceURL.set(script.sourceURL, scripts);        }        scripts.push(script);    },    createRawLocation: function(script, lineNumber, columnNumber)     {        if (script.sourceURL)            return this.createRawLocationByURL(script.sourceURL, lineNumber, columnNumber);        return new WebInspector.DebuggerModel.Location(this,script.scriptId,lineNumber,columnNumber);    },    createRawLocationByURL: function(sourceURL, lineNumber, columnNumber)     {        var closestScript = null ;        var scripts = this._scriptsBySourceURL.get(sourceURL) || [];        for (var i = 0, l = scripts.length; i < l; ++i) {            var script = scripts[i];            if (!closestScript)                closestScript = script;            if (script.lineOffset > lineNumber || (script.lineOffset === lineNumber && script.columnOffset > columnNumber))                continue;if (script.endLine < lineNumber || (script.endLine === lineNumber && script.endColumn <= columnNumber))                continue;closestScript = script;            break;        }        return closestScript ? new WebInspector.DebuggerModel.Location(this,closestScript.scriptId,lineNumber,columnNumber) : null ;    },    createRawLocationByScriptId: function(scriptId, lineNumber, columnNumber)     {        var script = this.scriptForId(scriptId);        return script ? this.createRawLocation(script, lineNumber, columnNumber) : null ;    },    isPaused: function()     {        return !!this.debuggerPausedDetails();    },    isPausing: function()     {        return this._isPausing;    },    setSelectedCallFrame: function(callFrame)     {        this._selectedCallFrame = callFrame;        if (!this._selectedCallFrame)            return;        this.dispatchEventToListeners(WebInspector.DebuggerModel.Events.CallFrameSelected, callFrame);    },    selectedCallFrame: function()     {        return this._selectedCallFrame;    },    evaluateOnSelectedCallFrame: function(code, objectGroup, includeCommandLineAPI, doNotPauseOnExceptionsAndMuteConsole, returnByValue, generatePreview, callback)     {        function didEvaluate(result, wasThrown, exceptionDetails)         {            if (!result)                callback(null , false);            else if (returnByValue)                callback(null , !!wasThrown, wasThrown ? null  : result, exceptionDetails);            else                callback(this.target().runtimeModel.createRemoteObject(result), !!wasThrown, undefined, exceptionDetails);            if (objectGroup === "console")                this.dispatchEventToListeners(WebInspector.DebuggerModel.Events.ConsoleCommandEvaluatedInSelectedCallFrame);        }        this.selectedCallFrame().evaluate(code, objectGroup, includeCommandLineAPI, doNotPauseOnExceptionsAndMuteConsole, returnByValue, generatePreview, didEvaluate.bind(this));    },    callStackModified: function(newCallFrames, details, asyncStackTrace)     {        if (details && details["stack_update_needs_step_in"])            this.stepInto();        else if (newCallFrames && newCallFrames.length)            this._pausedScript(newCallFrames, this._debuggerPausedDetails.reason, this._debuggerPausedDetails.auxData, this._debuggerPausedDetails.breakpointIds, asyncStackTrace);    },    _applySkipStackFrameSettings: function()     {        this._agent.skipStackFrames(WebInspector.moduleSetting("skipStackFramesPattern").get(), WebInspector.moduleSetting("skipContentScripts").get());    },    functionDetails: function(remoteObject, callback)     {        this._agent.getFunctionDetails(remoteObject.objectId, didGetDetails.bind(this));        function didGetDetails(error, response)         {            if (error) {                callback(null );                return;            }            var location = response.location;            var script = this.scriptForId(location.scriptId);            var rawLocation = script ? this.createRawLocation(script, location.lineNumber, location.columnNumber || 0) : null ;            var sourceURL = script ? script.contentURL() : null ;            callback({                location: rawLocation,                sourceURL: sourceURL,                functionName: response.functionName,                scopeChain: response.scopeChain || null             });        }    },    compileScript: function(expression, sourceURL, persistScript, executionContextId, callback)     {        this._agent.compileScript(expression, sourceURL, persistScript, executionContextId, innerCallback);        function innerCallback(error, scriptId, exceptionDetails)         {            if (error) {                console.error(error);                return;            }            if (callback)                callback(scriptId, exceptionDetails);        }    },    runScript: function(scriptId, executionContextId, objectGroup, doNotPauseOnExceptionsAndMuteConsole, callback)     {        this._agent.runScript(scriptId, executionContextId, objectGroup, doNotPauseOnExceptionsAndMuteConsole, innerCallback);        function innerCallback(error, result, exceptionDetails)         {            if (error) {                console.error(error);                return;            }            if (callback)                callback(result, exceptionDetails);        }    },    setVariableValue: function(scopeNumber, variableName, newValue, callFrameId, functionObjectId, callback)     {        this._agent.setVariableValue(scopeNumber, variableName, newValue, callFrameId, functionObjectId, innerCallback);        function innerCallback(error)         {            if (error) {                console.error(error);                if (callback)                    callback(error);                return;            }            if (callback)                callback();        }    },    generatorObjectDetails: function(remoteObject, callback)     {        this._agent.getGeneratorObjectDetails(remoteObject.objectId, didGetDetails.bind(this));        function didGetDetails(error, response)         {            if (error) {                console.error(error);                callback(null );                return;            }            var location = response.location;            var script = location && this.scriptForId(location.scriptId);            var rawLocation = script ? this.createRawLocation(script, location.lineNumber, location.columnNumber || 0) : null ;            var sourceURL = script ? script.contentURL() : null ;            callback({                location: rawLocation,                sourceURL: sourceURL,                functionName: response.functionName,                status: response.status            });        }    },    addBreakpointListener: function(breakpointId, listener, thisObject)     {        this._breakpointResolvedEventTarget.addEventListener(breakpointId, listener, thisObject)    },    removeBreakpointListener: function(breakpointId, listener, thisObject)     {        this._breakpointResolvedEventTarget.removeEventListener(breakpointId, listener, thisObject);    },    _targetDisposed: function(event)     {        var target = (event.data);        if (target != this.target())            return;        WebInspector.moduleSetting("pauseOnExceptionEnabled").removeChangeListener(this._pauseOnExceptionStateChanged, this);        WebInspector.moduleSetting("pauseOnCaughtException").removeChangeListener(this._pauseOnExceptionStateChanged, this);        WebInspector.moduleSetting("skipStackFramesPattern").removeChangeListener(this._applySkipStackFrameSettings, this);        WebInspector.moduleSetting("skipContentScripts").removeChangeListener(this._applySkipStackFrameSettings, this);        WebInspector.moduleSetting("enableAsyncStackTraces").removeChangeListener(this.asyncStackTracesStateChanged, this);    },    _suspendStateChanged: function()     {        if (WebInspector.targetManager.allTargetsSuspended())            this.disableDebugger();        else            this.enableDebugger();    },    __proto__: WebInspector.SDKModel.prototype}WebInspector.DebuggerEventTypes = {    JavaScriptPause: 0,    JavaScriptBreakpoint: 1,    NativeBreakpoint: 2};WebInspector.DebuggerDispatcher = function(debuggerModel) {    this._debuggerModel = debuggerModel;}WebInspector.DebuggerDispatcher.prototype = {    paused: function(callFrames, reason, auxData, breakpointIds, asyncStackTrace)     {        this._debuggerModel._pausedScript(callFrames, reason, auxData, breakpointIds || [], asyncStackTrace);    },    resumed: function()     {        this._debuggerModel._resumedScript();    },    globalObjectCleared: function()     {        this._debuggerModel._globalObjectCleared();    },    scriptParsed: function(scriptId, sourceURL, startLine, startColumn, endLine, endColumn, isContentScript, isInternalScript, sourceMapURL, hasSourceURL)     {        this._debuggerModel._parsedScriptSource(scriptId, sourceURL, startLine, startColumn, endLine, endColumn, !!isContentScript, !!isInternalScript, sourceMapURL, hasSourceURL, false);    },    scriptFailedToParse: function(scriptId, sourceURL, startLine, startColumn, endLine, endColumn, isContentScript, isInternalScript, sourceMapURL, hasSourceURL)     {        this._debuggerModel._parsedScriptSource(scriptId, sourceURL, startLine, startColumn, endLine, endColumn, !!isContentScript, !!isInternalScript, sourceMapURL, hasSourceURL, true);    },    breakpointResolved: function(breakpointId, location)     {        this._debuggerModel._breakpointResolved(breakpointId, location);    },    promiseUpdated: function(eventType, promise)     {        this._debuggerModel._promiseUpdated(eventType, promise);    },    asyncOperationStarted: function(operation)     {        this._debuggerModel._asyncOperationStarted(operation);    },    asyncOperationCompleted: function(operationId)     {        this._debuggerModel._asyncOperationCompleted(operationId);    }}WebInspector.DebuggerModel.Location = function(debuggerModel, scriptId, lineNumber, columnNumber) {    WebInspector.SDKObject.call(this, debuggerModel.target());    this._debuggerModel = debuggerModel;    this.scriptId = scriptId;    this.lineNumber = lineNumber;    this.columnNumber = columnNumber || 0;}WebInspector.DebuggerModel.Location.fromPayload = function(debuggerModel, payload) {    return new WebInspector.DebuggerModel.Location(debuggerModel,payload.scriptId,payload.lineNumber,payload.columnNumber);}WebInspector.DebuggerModel.Location.prototype = {    payload: function()     {        return {            scriptId: this.scriptId,            lineNumber: this.lineNumber,            columnNumber: this.columnNumber        };    },    script: function()     {        return this._debuggerModel.scriptForId(this.scriptId);    },    continueToLocation: function()     {        this._debuggerModel._agent.continueToLocation(this.payload());    },    id: function()     {        return this.target().id() + ":" + this.scriptId + ":" + this.lineNumber + ":" + this.columnNumber;    },    __proto__: WebInspector.SDKObject.prototype}WebInspector.DebuggerModel.CallFrame = function(debuggerModel, script, payload, isAsync) {    var target = debuggerModel.target();    WebInspector.SDKObject.call(this, target);    this.debuggerModel = debuggerModel;    this._debuggerAgent = debuggerModel._agent;    this._script = script;    this._payload = payload;    this._isAsync = isAsync;    this._location = WebInspector.DebuggerModel.Location.fromPayload(debuggerModel, payload.location);    this._scopeChain = [];    this._localScope = null ;    for (var i = 0; i < payload.scopeChain.length; ++i) {        var scope = new WebInspector.DebuggerModel.Scope(this,i);        this._scopeChain.push(scope);        if (scope.type() === DebuggerAgent.ScopeType.Local)            this._localScope = scope;    }    if (payload.functionLocation)        this._functionLocation = WebInspector.DebuggerModel.Location.fromPayload(debuggerModel, payload.functionLocation);}WebInspector.DebuggerModel.CallFrame.fromPayloadArray = function(debuggerModel, callFrames, isAsync) {    var result = [];    for (var i = 0; i < callFrames.length; ++i) {        var callFrame = callFrames[i];        var script = debuggerModel.scriptForId(callFrame.location.scriptId);        if (script)            result.push(new WebInspector.DebuggerModel.CallFrame(debuggerModel,script,callFrame,isAsync));    }    return result;}WebInspector.DebuggerModel.CallFrame.prototype = {    get script()     {        return this._script;    },    get id()     {        return this._payload.callFrameId;    },    scopeChain: function()     {        return this._scopeChain;    },    localScope: function()     {        return this._localScope;    },    thisObject: function()     {        return this._payload.this ? this.target().runtimeModel.createRemoteObject(this._payload.this) : null ;    },    returnValue: function()     {        return this._payload.returnValue ? this.target().runtimeModel.createRemoteObject(this._payload.returnValue) : null ;    },    get functionName()     {        return this._payload.functionName;    },    location: function()     {        return this._location;    },    functionLocation: function()     {        return this._functionLocation || null ;    },    isAsync: function()     {        return !!this._isAsync;    },    evaluate: function(code, objectGroup, includeCommandLineAPI, doNotPauseOnExceptionsAndMuteConsole, returnByValue, generatePreview, callback)     {        function didEvaluateOnCallFrame(error, result, wasThrown, exceptionDetails)         {            if (error) {                console.error(error);                callback(null , false);                return;            }            callback(result, wasThrown, exceptionDetails);        }        this._debuggerAgent.evaluateOnCallFrame(this._payload.callFrameId, code, objectGroup, includeCommandLineAPI, doNotPauseOnExceptionsAndMuteConsole, returnByValue, generatePreview, didEvaluateOnCallFrame);    },    restart: function(callback)     {        function protocolCallback(error, callFrames, details, asyncStackTrace)         {            if (!error)                this.debuggerModel.callStackModified(callFrames, details, asyncStackTrace);            if (callback)                callback(error);        }        this._debuggerAgent.restartFrame(this._payload.callFrameId, protocolCallback.bind(this));    },    variableNames: function(callback)     {        var result = {            this: true        };        function propertiesCollected(properties)         {            for (var i = 0; properties && i < properties.length; ++i)                result[properties[i].name] = true;            if (--pendingRequests == 0)                callback(result);        }        var scopeChain = this.scopeChain();        var pendingRequests = scopeChain.length;        for (var i = 0; i < scopeChain.length; ++i) {            var scope = scopeChain[i];            var object = scope.object();            object.getAllProperties(false, propertiesCollected);        }    },    __proto__: WebInspector.SDKObject.prototype}WebInspector.DebuggerModel.Scope = function(callFrame, ordinal) {    this._callFrame = callFrame;    this._payload = callFrame._payload.scopeChain[ordinal];    this._type = this._payload.type;    this._ordinal = ordinal;}WebInspector.DebuggerModel.Scope.prototype = {    type: function()     {        return this._type;    },    object: function()     {        if (this._object)            return this._object;        var runtimeModel = this._callFrame.target().runtimeModel;        var declarativeScope = this._type !== DebuggerAgent.ScopeType.With && this._type !== DebuggerAgent.ScopeType.Global;        if (declarativeScope)            this._object = runtimeModel.createScopeRemoteObject(this._payload.object, new WebInspector.ScopeRef(this._ordinal,this._callFrame.id,undefined));        else            this._object = runtimeModel.createRemoteObject(this._payload.object);        return this._callFrame.target().runtimeModel.createRemoteObject(this._payload.object);    },    description: function()     {        var declarativeScope = this._type !== DebuggerAgent.ScopeType.With && this._type !== DebuggerAgent.ScopeType.Global;        return declarativeScope ? "" : (this._payload.object.description || "");    }}WebInspector.DebuggerModel.StackTrace = function(callFrames, asyncStackTrace, description) {    this.callFrames = callFrames;    this.asyncStackTrace = asyncStackTrace;    this.description = description;}WebInspector.DebuggerModel.StackTrace.fromPayload = function(debuggerModel, payload, isAsync) {    if (!payload)        return null ;    var callFrames = WebInspector.DebuggerModel.CallFrame.fromPayloadArray(debuggerModel, payload.callFrames, isAsync);    if (!callFrames.length)        return null ;    var asyncStackTrace = WebInspector.DebuggerModel.StackTrace.fromPayload(debuggerModel, payload.asyncStackTrace, true);    return new WebInspector.DebuggerModel.StackTrace(callFrames,asyncStackTrace,payload.description);}WebInspector.DebuggerPausedDetails = function(debuggerModel, callFrames, reason, auxData, breakpointIds, asyncStackTrace) {    WebInspector.SDKObject.call(this, debuggerModel.target());    this.debuggerModel = debuggerModel;    this.callFrames = WebInspector.DebuggerModel.CallFrame.fromPayloadArray(debuggerModel, callFrames);    this.reason = reason;    this.auxData = auxData;    this.breakpointIds = breakpointIds;    this.asyncStackTrace = WebInspector.DebuggerModel.StackTrace.fromPayload(debuggerModel, asyncStackTrace, true);}WebInspector.DebuggerPausedDetails.prototype = {    exception: function()     {        if (this.reason !== WebInspector.DebuggerModel.BreakReason.Exception && this.reason !== WebInspector.DebuggerModel.BreakReason.PromiseRejection)            return null ;        return this.target().runtimeModel.createRemoteObject((this.auxData));    },    __proto__: WebInspector.SDKObject.prototype}WebInspector.DebuggerModel.instances = function() {    var result = [];    for (var target of WebInspector.targetManager.targets()) {        var debuggerModel = WebInspector.DebuggerModel.fromTarget(target);        if (debuggerModel)            result.push(debuggerModel);    }    return result;}WebInspector.DebuggerModel.fromTarget = function(target) {    if (!target || !target.hasJSContext())        return null ;    return ( target.model(WebInspector.DebuggerModel)) ;};WebInspector.HAREntry = function(request) {    this._request = request;}WebInspector.HAREntry.prototype = {    build: function()     {        var entry = {            startedDateTime: WebInspector.HARLog.pseudoWallTime(this._request, this._request.startTime),            time: this._request.timing ? WebInspector.HAREntry._toMilliseconds(this._request.duration) : 0,            request: this._buildRequest(),            response: this._buildResponse(),            cache: {},            timings: this._buildTimings()        };        if (this._request.connectionId !== "0")            entry.connection = this._request.connectionId;        var page = this._request.target().networkLog.pageLoadForRequest(this._request);        if (page)            entry.pageref = "page_" + page.id;        return entry;    },    _buildRequest: function()     {        var headersText = this._request.requestHeadersText();        var res = {            method: this._request.requestMethod,            url: this._buildRequestURL(this._request.url),            httpVersion: this._request.requestHttpVersion(),            headers: this._request.requestHeaders(),            queryString: this._buildParameters(this._request.queryParameters || []),            cookies: this._buildCookies(this._request.requestCookies || []),            headersSize: headersText ? headersText.length : -1,            bodySize: this.requestBodySize        };        if (this._request.requestFormData)            res.postData = this._buildPostData();        return res;    },    _buildResponse: function()     {        var headersText = this._request.responseHeadersText;        return {            status: this._request.statusCode,            statusText: this._request.statusText,            httpVersion: this._request.responseHttpVersion(),            headers: this._request.responseHeaders,            cookies: this._buildCookies(this._request.responseCookies || []),            content: this._buildContent(),            redirectURL: this._request.responseHeaderValue("Location") || "",            headersSize: headersText ? headersText.length : -1,            bodySize: this.responseBodySize,            _transferSize: this._request.transferSize,            _error: this._request.localizedFailDescription        };    },    _buildContent: function()     {        var content = {            size: this._request.resourceSize,            mimeType: this._request.mimeType || "x-unknown",        };        var compression = this.responseCompression;        if (typeof compression === "number")            content.compression = compression;        return content;    },    _buildTimings: function()     {        var timing = this._request.timing;        if (!timing)            return {                blocked: -1,                dns: -1,                connect: -1,                send: 0,                wait: 0,                receive: 0,                ssl: -1            };        function firstNonNegative(values)         {            for (var i = 0; i < values.length; ++i) {                if (values[i] >= 0)                    return values[i];            }            console.assert(false, "Incomplete request timing information.");        }        var blocked = firstNonNegative([timing.dnsStart, timing.connectStart, timing.sendStart]);        var dns = -1;        if (timing.dnsStart >= 0)            dns = firstNonNegative([timing.connectStart, timing.sendStart]) - timing.dnsStart;        var connect = -1;        if (timing.connectStart >= 0)            connect = timing.sendStart - timing.connectStart;        var send = timing.sendEnd - timing.sendStart;        var wait = timing.receiveHeadersEnd - timing.sendEnd;        var receive = WebInspector.HAREntry._toMilliseconds(this._request.duration) - timing.receiveHeadersEnd;        var ssl = -1;        if (timing.sslStart >= 0 && timing.sslEnd >= 0)            ssl = timing.sslEnd - timing.sslStart;        return {            blocked: blocked,            dns: dns,            connect: connect,            send: send,            wait: wait,            receive: receive,            ssl: ssl        };    },    _buildPostData: function()     {        var res = {            mimeType: this._request.requestContentType(),            text: this._request.requestFormData        };        if (this._request.formParameters)            res.params = this._buildParameters(this._request.formParameters);        return res;    },    _buildParameters: function(parameters)     {        return parameters.slice();    },    _buildRequestURL: function(url)     {        return url.split("#", 2)[0];    },    _buildCookies: function(cookies)     {        return cookies.map(this._buildCookie.bind(this));    },    _buildCookie: function(cookie)     {        return {            name: cookie.name(),            value: cookie.value(),            path: cookie.path(),            domain: cookie.domain(),            expires: cookie.expiresDate(WebInspector.HARLog.pseudoWallTime(this._request, this._request.startTime)),            httpOnly: cookie.httpOnly(),            secure: cookie.secure()        };    },    get requestBodySize()     {        return !this._request.requestFormData ? 0 : this._request.requestFormData.length;    },    get responseBodySize()     {        if (this._request.cached() || this._request.statusCode === 304)            return 0;        if (!this._request.responseHeadersText)            return -1;        return this._request.transferSize - this._request.responseHeadersText.length;    },    get responseCompression()     {        if (this._request.cached() || this._request.statusCode === 304 || this._request.statusCode === 206)            return;        if (!this._request.responseHeadersText)            return;        return this._request.resourceSize - this.responseBodySize;    }}WebInspector.HAREntry._toMilliseconds = function(time) {    return time === -1 ? -1 : time * 1000;}WebInspector.HARLog = function(requests) {    this._requests = requests;}WebInspector.HARLog.pseudoWallTime = function(request, monotonicTime) {    return new Date(request.pseudoWallTime(monotonicTime) * 1000);}WebInspector.HARLog.prototype = {    build: function()     {        return {            version: "1.2",            creator: this._creator(),            pages: this._buildPages(),            entries: this._requests.map(this._convertResource.bind(this))        }    },    _creator: function()     {        var webKitVersion = /AppleWebKit\/([^ ]+)/.exec(window.navigator.userAgent);        return {            name: "WebInspector",            version: webKitVersion ? webKitVersion[1] : "n/a"        };    },    _buildPages: function()     {        var seenIdentifiers = {};        var pages = [];        for (var i = 0; i < this._requests.length; ++i) {            var request = this._requests[i];            var page = request.target().networkLog.pageLoadForRequest(request);            if (!page || seenIdentifiers[page.id])                continue;seenIdentifiers[page.id] = true;            pages.push(this._convertPage(page, request));        }        return pages;    },    _convertPage: function(page, request)     {        return {            startedDateTime: WebInspector.HARLog.pseudoWallTime(request, page.startTime),            id: "page_" + page.id,            title: page.url,            pageTimings: {                onContentLoad: this._pageEventTime(page, page.contentLoadTime),                onLoad: this._pageEventTime(page, page.loadTime)            }        }    },    _convertResource: function(request)     {        return (new WebInspector.HAREntry(request)).build();    },    _pageEventTime: function(page, time)     {        var startTime = page.startTime;        if (time === -1 || startTime === -1)            return -1;        return WebInspector.HAREntry._toMilliseconds(time - startTime);    }};WebInspector.TracingLayerPayload;WebInspector.TracingLayerTile;WebInspector.LayerTreeModel = function(target) {    WebInspector.SDKModel.call(this, WebInspector.LayerTreeModel, target);    target.registerLayerTreeDispatcher(new WebInspector.LayerTreeDispatcher(this));    WebInspector.targetManager.addEventListener(WebInspector.TargetManager.Events.MainFrameNavigated, this._onMainFrameNavigated, this);    this._layerTree = null ;}WebInspector.LayerTreeModel.Events = {    LayerTreeChanged: "LayerTreeChanged",    LayerPainted: "LayerPainted",}WebInspector.LayerTreeModel.ScrollRectType = {    NonFastScrollable: {        name: "NonFastScrollable",        description: "Non fast scrollable"    },    TouchEventHandler: {        name: "TouchEventHandler",        description: "Touch event handler"    },    WheelEventHandler: {        name: "WheelEventHandler",        description: "Wheel event handler"    },    RepaintsOnScroll: {        name: "RepaintsOnScroll",        description: "Repaints on scroll"    }}WebInspector.LayerTreeModel.prototype = {    disable: function()     {        if (!this._enabled)            return;        this._enabled = false;        this._layerTree = null ;        this.target().layerTreeAgent().disable();    },    enable: function()     {        if (this._enabled)            return;        this._enabled = true;        this._forceEnable();    },    _forceEnable: function()     {        this._layerTree = new WebInspector.AgentLayerTree(this.target());        this._lastPaintRectByLayerId = {};        this.target().layerTreeAgent().enable();    },    setLayerTree: function(layerTree)     {        this.disable();        this._layerTree = layerTree;        this.dispatchEventToListeners(WebInspector.LayerTreeModel.Events.LayerTreeChanged);    },    layerTree: function()     {        return this._layerTree;    },    _layerTreeChanged: function(layers)     {        if (!this._enabled)            return;        var layerTree = (this._layerTree);        layerTree.setLayers(layers, onLayersSet.bind(this));        function onLayersSet()         {            for (var layerId in this._lastPaintRectByLayerId) {                var lastPaintRect = this._lastPaintRectByLayerId[layerId];                var layer = layerTree.layerById(layerId);                if (layer)                    layer._lastPaintRect = lastPaintRect;            }            this._lastPaintRectByLayerId = {};            this.dispatchEventToListeners(WebInspector.LayerTreeModel.Events.LayerTreeChanged);        }    },    _layerPainted: function(layerId, clipRect)     {        if (!this._enabled)            return;        var layerTree = (this._layerTree);        var layer = layerTree.layerById(layerId);        if (!layer) {            this._lastPaintRectByLayerId[layerId] = clipRect;            return;        }        layer._didPaint(clipRect);        this.dispatchEventToListeners(WebInspector.LayerTreeModel.Events.LayerPainted, layer);    },    _onMainFrameNavigated: function()     {        if (this._enabled)            this._forceEnable();    },    __proto__: WebInspector.SDKModel.prototype}WebInspector.LayerTreeBase = function(target) {    this._target = target;    this._domModel = target ? WebInspector.DOMModel.fromTarget(target) : null ;    this._layersById = {};    this._backendNodeIdToNode = new Map();    this._reset();}WebInspector.LayerTreeBase.prototype = {    _reset: function()     {        this._root = null ;        this._contentRoot = null ;    },    target: function()     {        return this._target;    },    root: function()     {        return this._root;    },    contentRoot: function()     {        return this._contentRoot;    },    forEachLayer: function(callback, root)     {        if (!root) {            root = this.root();            if (!root)                return false;        }        return callback(root) || root.children().some(this.forEachLayer.bind(this, callback));    },    layerById: function(id)     {        return this._layersById[id] || null ;    },    _resolveBackendNodeIds: function(requestedNodeIds, callback)     {        if (!requestedNodeIds.size || !this._domModel) {            callback();            return;        }        if (this._domModel)            this._domModel.pushNodesByBackendIdsToFrontend(requestedNodeIds, populateBackendNodeMap.bind(this));        function populateBackendNodeMap(nodesMap)         {            if (nodesMap) {                for (var entry of nodesMap)                    this._backendNodeIdToNode.set(entry[0], entry[1]);            }            callback();        }    },    setViewportSize: function(viewportSize)     {        this._viewportSize = viewportSize;    },    viewportSize: function()     {        return this._viewportSize;    },    _nodeForId: function(id)     {        return this._domModel ? this._domModel.nodeForId(id) : null ;    }}WebInspector.TracingLayerTree = function(target) {    WebInspector.LayerTreeBase.call(this, target);    this._tileById = new Map();}WebInspector.TracingLayerTree.prototype = {    setLayers: function(root, callback)     {        var idsToResolve = new Set();        this._extractNodeIdsToResolve(idsToResolve, {}, root);        this._resolveBackendNodeIds(idsToResolve, onBackendNodeIdsResolved.bind(this));        function onBackendNodeIdsResolved()         {            var oldLayersById = this._layersById;            this._layersById = {};            this._contentRoot = null ;            this._root = this._innerSetLayers(oldLayersById, root);            callback();        }    },    setTiles: function(tiles)     {        this._tileById = new Map();        for (var tile of tiles)            this._tileById.set(tile.id, tile);    },    tileById: function(id)     {        return this._tileById.get(id) || null ;    },    _innerSetLayers: function(oldLayersById, payload)     {        var layer = (oldLayersById[payload.layer_id]);        if (layer)            layer._reset(payload);        else            layer = new WebInspector.TracingLayer(payload);        this._layersById[payload.layer_id] = layer;        if (payload.owner_node)            layer._setNode(this._backendNodeIdToNode.get(payload.owner_node) || null );        if (!this._contentRoot && layer.drawsContent())            this._contentRoot = layer;        for (var i = 0; payload.children && i < payload.children.length; ++i)            layer.addChild(this._innerSetLayers(oldLayersById, payload.children[i]));        return layer;    },    _extractNodeIdsToResolve: function(nodeIdsToResolve, seenNodeIds, payload)     {        var backendNodeId = payload.owner_node;        if (backendNodeId && !this._backendNodeIdToNode[backendNodeId])            nodeIdsToResolve.add(backendNodeId);        for (var i = 0; payload.children && i < payload.children.length; ++i)            this._extractNodeIdsToResolve(nodeIdsToResolve, seenNodeIds, payload.children[i]);    },    __proto__: WebInspector.LayerTreeBase.prototype}WebInspector.AgentLayerTree = function(target) {    WebInspector.LayerTreeBase.call(this, target);}WebInspector.AgentLayerTree.prototype = {    setLayers: function(payload, callback)     {        if (!payload) {            onBackendNodeIdsResolved.call(this);            return;        }        var idsToResolve = new Set();        for (var i = 0; i < payload.length; ++i) {            var backendNodeId = payload[i].backendNodeId;            if (!backendNodeId || this._backendNodeIdToNode.has(backendNodeId))                continue;idsToResolve.add(backendNodeId);        }        this._resolveBackendNodeIds(idsToResolve, onBackendNodeIdsResolved.bind(this));        function onBackendNodeIdsResolved()         {            this._innerSetLayers(payload);            callback();        }    },    _innerSetLayers: function(layers)     {        this._reset();        if (!layers)            return;        var oldLayersById = this._layersById;        this._layersById = {};        for (var i = 0; i < layers.length; ++i) {            var layerId = layers[i].layerId;            var layer = oldLayersById[layerId];            if (layer)                layer._reset(layers[i]);            else                layer = new WebInspector.AgentLayer(this._target,layers[i]);            this._layersById[layerId] = layer;            var backendNodeId = layers[i].backendNodeId;            if (backendNodeId)                layer._setNode(this._backendNodeIdToNode.get(backendNodeId));            if (!this._contentRoot && layer.drawsContent())                this._contentRoot = layer;            var parentId = layer.parentId();            if (parentId) {                var parent = this._layersById[parentId];                if (!parent)                    console.assert(parent, "missing parent " + parentId + " for layer " + layerId);                parent.addChild(layer);            } else {                if (this._root)                    console.assert(false, "Multiple root layers");                this._root = layer;            }        }        if (this._root)            this._root._calculateQuad(new WebKitCSSMatrix());    },    __proto__: WebInspector.LayerTreeBase.prototype}WebInspector.Layer = function() {}WebInspector.Layer.prototype = {    id: function() {},    parentId: function() {},    parent: function() {},    isRoot: function() {},    children: function() {},    addChild: function(child) {},    node: function() {},    nodeForSelfOrAncestor: function() {},    offsetX: function() {},    offsetY: function() {},    width: function() {},    height: function() {},    transform: function() {},    quad: function() {},    anchorPoint: function() {},    invisible: function() {},    paintCount: function() {},    lastPaintRect: function() {},    scrollRects: function() {},    gpuMemoryUsage: function() {},    requestCompositingReasons: function(callback) {},    drawsContent: function() {}}WebInspector.AgentLayer = function(target, layerPayload) {    this._target = target;    this._reset(layerPayload);}WebInspector.AgentLayer.prototype = {    id: function()     {        return this._layerPayload.layerId;    },    parentId: function()     {        return this._layerPayload.parentLayerId;    },    parent: function()     {        return this._parent;    },    isRoot: function()     {        return !this.parentId();    },    children: function()     {        return this._children;    },    addChild: function(child)     {        if (child._parent)            console.assert(false, "Child already has a parent");        this._children.push(child);        child._parent = this;    },    _setNode: function(node)     {        this._node = node;    },    node: function()     {        return this._node;    },    nodeForSelfOrAncestor: function()     {        for (var layer = this; layer; layer = layer._parent) {            if (layer._node)                return layer._node;        }        return null ;    },    offsetX: function()     {        return this._layerPayload.offsetX;    },    offsetY: function()     {        return this._layerPayload.offsetY;    },    width: function()     {        return this._layerPayload.width;    },    height: function()     {        return this._layerPayload.height;    },    transform: function()     {        return this._layerPayload.transform;    },    quad: function()     {        return this._quad;    },    anchorPoint: function()     {        return [this._layerPayload.anchorX || 0, this._layerPayload.anchorY || 0, this._layerPayload.anchorZ || 0, ];    },    invisible: function()     {        return this._layerPayload.invisible;    },    paintCount: function()     {        return this._paintCount || this._layerPayload.paintCount;    },    lastPaintRect: function()     {        return this._lastPaintRect;    },    scrollRects: function()     {        return this._scrollRects;    },    requestCompositingReasons: function(callback)     {        if (!this._target) {            callback([]);            return;        }        var wrappedCallback = InspectorBackend.wrapClientCallback(callback, "LayerTreeAgent.reasonsForCompositingLayer(): ", undefined, []);        this._target.layerTreeAgent().compositingReasons(this.id(), wrappedCallback);    },    drawsContent: function()     {        return this._layerPayload.drawsContent;    },    gpuMemoryUsage: function()     {        var bytesPerPixel = 4;        return this.drawsContent() ? this.width() * this.height() * bytesPerPixel : 0;    },    requestSnapshot: function(callback)     {        if (!this._target) {            callback();            return;        }        var wrappedCallback = InspectorBackend.wrapClientCallback(callback, "LayerTreeAgent.makeSnapshot(): ", WebInspector.PaintProfilerSnapshot.bind(null , this._target));        this._target.layerTreeAgent().makeSnapshot(this.id(), wrappedCallback);    },    _didPaint: function(rect)     {        this._lastPaintRect = rect;        this._paintCount = this.paintCount() + 1;        this._image = null ;    },    _reset: function(layerPayload)     {        this._node = null ;        this._children = [];        this._parent = null ;        this._paintCount = 0;        this._layerPayload = layerPayload;        this._image = null ;        this._scrollRects = this._layerPayload.scrollRects || [];    },    _matrixFromArray: function(a)     {        function toFixed9(x) {            return x.toFixed(9);        }        return new WebKitCSSMatrix("matrix3d(" + a.map(toFixed9).join(",") + ")");    },    _calculateTransformToViewport: function(parentTransform)     {        var offsetMatrix = new WebKitCSSMatrix().translate(this._layerPayload.offsetX, this._layerPayload.offsetY);        var matrix = offsetMatrix;        if (this._layerPayload.transform) {            var transformMatrix = this._matrixFromArray(this._layerPayload.transform);            var anchorVector = new WebInspector.Geometry.Vector(this._layerPayload.width * this.anchorPoint()[0],this._layerPayload.height * this.anchorPoint()[1],this.anchorPoint()[2]);            var anchorPoint = WebInspector.Geometry.multiplyVectorByMatrixAndNormalize(anchorVector, matrix);            var anchorMatrix = new WebKitCSSMatrix().translate(-anchorPoint.x, -anchorPoint.y, -anchorPoint.z);            matrix = anchorMatrix.inverse().multiply(transformMatrix.multiply(anchorMatrix.multiply(matrix)));        }        matrix = parentTransform.multiply(matrix);        return matrix;    },    _createVertexArrayForRect: function(width, height)     {        return [0, 0, 0, width, 0, 0, width, height, 0, 0, height, 0];    },    _calculateQuad: function(parentTransform)     {        var matrix = this._calculateTransformToViewport(parentTransform);        this._quad = [];        var vertices = this._createVertexArrayForRect(this._layerPayload.width, this._layerPayload.height);        for (var i = 0; i < 4; ++i) {            var point = WebInspector.Geometry.multiplyVectorByMatrixAndNormalize(new WebInspector.Geometry.Vector(vertices[i * 3],vertices[i * 3 + 1],vertices[i * 3 + 2]), matrix);            this._quad.push(point.x, point.y);        }        function calculateQuadForLayer(layer)         {            layer._calculateQuad(matrix);        }        this._children.forEach(calculateQuadForLayer);    }}WebInspector.TracingLayer = function(payload) {    this._reset(payload);}WebInspector.TracingLayer.prototype = {    _reset: function(payload)     {        this._node = null ;        this._layerId = String(payload.layer_id);        this._offsetX = payload.position[0];        this._offsetY = payload.position[1];        this._width = payload.bounds.width;        this._height = payload.bounds.height;        this._children = [];        this._parentLayerId = null ;        this._parent = null ;        this._quad = payload.layer_quad || [];        this._createScrollRects(payload);        this._compositingReasons = payload.compositing_reasons || [];        this._drawsContent = !!payload.draws_content;        this._gpuMemoryUsage = payload.gpu_memory_usage;    },    id: function()     {        return this._layerId;    },    parentId: function()     {        return this._parentLayerId;    },    parent: function()     {        return this._parent;    },    isRoot: function()     {        return !this.parentId();    },    children: function()     {        return this._children;    },    addChild: function(child)     {        if (child._parent)            console.assert(false, "Child already has a parent");        this._children.push(child);        child._parent = this;        child._parentLayerId = this._layerId;    },    _setNode: function(node)     {        this._node = node;    },    node: function()     {        return this._node;    },    nodeForSelfOrAncestor: function()     {        for (var layer = this; layer; layer = layer._parent) {            if (layer._node)                return layer._node;        }        return null ;    },    offsetX: function()     {        return this._offsetX;    },    offsetY: function()     {        return this._offsetY;    },    width: function()     {        return this._width;    },    height: function()     {        return this._height;    },    transform: function()     {        return null ;    },    quad: function()     {        return this._quad;    },    anchorPoint: function()     {        return [0.5, 0.5, 0];    },    invisible: function()     {        return false;    },    paintCount: function()     {        return 0;    },    lastPaintRect: function()     {        return null ;    },    scrollRects: function()     {        return this._scrollRects;    },    gpuMemoryUsage: function()     {        return this._gpuMemoryUsage;    },    _scrollRectsFromParams: function(params, type)     {        return {            rect: {                x: params[0],                y: params[1],                width: params[2],                height: params[3]            },            type: type        };    },    _createScrollRects: function(payload)     {        this._scrollRects = [];        if (payload.non_fast_scrollable_region)            this._scrollRects.push(this._scrollRectsFromParams(payload.non_fast_scrollable_region, WebInspector.LayerTreeModel.ScrollRectType.NonFastScrollable.name));        if (payload.touch_event_handler_region)            this._scrollRects.push(this._scrollRectsFromParams(payload.touch_event_handler_region, WebInspector.LayerTreeModel.ScrollRectType.TouchEventHandler.name));        if (payload.wheel_event_handler_region)            this._scrollRects.push(this._scrollRectsFromParams(payload.wheel_event_handler_region, WebInspector.LayerTreeModel.ScrollRectType.WheelEventHandler.name));        if (payload.scroll_event_handler_region)            this._scrollRects.push(this._scrollRectsFromParams(payload.scroll_event_handler_region, WebInspector.LayerTreeModel.ScrollRectType.RepaintsOnScroll.name));    },    requestCompositingReasons: function(callback)     {        callback(this._compositingReasons);    },    drawsContent: function()     {        return this._drawsContent;    }}WebInspector.DeferredLayerTree = function(target) {    this._target = target;}WebInspector.DeferredLayerTree.prototype = {    resolve: function(callback) {},    target: function()     {        return this._target;    }};WebInspector.LayerTreeDispatcher = function(layerTreeModel) {    this._layerTreeModel = layerTreeModel;}WebInspector.LayerTreeDispatcher.prototype = {    layerTreeDidChange: function(layers)     {        this._layerTreeModel._layerTreeChanged(layers || null );    },    layerPainted: function(layerId, clipRect)     {        this._layerTreeModel._layerPainted(layerId, clipRect);    }};WebInspector.NetworkLog = function(target) {    WebInspector.SDKObject.call(this, target);    this._requests = [];    this._requestForId = {};    target.networkManager.addEventListener(WebInspector.NetworkManager.EventTypes.RequestStarted, this._onRequestStarted, this);    target.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.MainFrameNavigated, this._onMainFrameNavigated, this);    target.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.Load, this._onLoad, this);    target.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.DOMContentLoaded, this._onDOMContentLoaded, this);}WebInspector.NetworkLog.requestForURL = function(url) {    for (var target of WebInspector.targetManager.targets()) {        var result = target.networkLog.requestForURL(url);        if (result)            return result;    }    return null ;}WebInspector.NetworkLog.requests = function() {    var result = [];    for (var target of WebInspector.targetManager.targets()) {        result = result.concat(target.networkLog.requests());    }    return result;}WebInspector.NetworkLog.prototype = {    requests: function()     {        return this._requests;    },    requestForURL: function(url)     {        for (var i = 0; i < this._requests.length; ++i) {            if (this._requests[i].url === url)                return this._requests[i];        }        return null ;    },    pageLoadForRequest: function(request)     {        return request.__page;    },    _onMainFrameNavigated: function(event)     {        var mainFrame = event.data;        this._currentPageLoad = null ;        var oldRequests = this._requests.splice(0, this._requests.length);        this._requestForId = {};        for (var i = 0; i < oldRequests.length; ++i) {            var request = oldRequests[i];            if (request.loaderId === mainFrame.loaderId) {                if (!this._currentPageLoad)                    this._currentPageLoad = new WebInspector.PageLoad(request);                this._requests.push(request);                this._requestForId[request.requestId] = request;                request.__page = this._currentPageLoad;            }        }    },    _onRequestStarted: function(event)     {        var request = (event.data);        this._requests.push(request);        this._requestForId[request.requestId] = request;        request.__page = this._currentPageLoad;    },    _onDOMContentLoaded: function(event)     {        if (this._currentPageLoad)            this._currentPageLoad.contentLoadTime = event.data;    },    _onLoad: function(event)     {        if (this._currentPageLoad)            this._currentPageLoad.loadTime = event.data;    },    requestForId: function(requestId)     {        return this._requestForId[requestId];    },    __proto__: WebInspector.SDKObject.prototype}WebInspector.PageLoad = function(mainRequest) {    this.id = ++WebInspector.PageLoad._lastIdentifier;    this.url = mainRequest.url;    this.startTime = mainRequest.startTime;}WebInspector.PageLoad._lastIdentifier = 0;;WebInspector.ServiceWorkerManager = function(target) {    WebInspector.SDKObject.call(this, target);    target.registerServiceWorkerDispatcher(new WebInspector.ServiceWorkerDispatcher(this));    this._lastAnonymousTargetId = 0;    this._agent = target.serviceWorkerAgent();    this._workers = new Map();    this._registrations = new Map();    this.enable();}WebInspector.ServiceWorkerManager.Events = {    WorkersUpdated: "WorkersUpdated",    RegistrationUpdated: "RegistrationUpdated",    RegistrationDeleted: "RegistrationDeleted",    DebugOnStartUpdated: "DebugOnStartUpdated"}WebInspector.ServiceWorkerManager.prototype = {    enable: function()     {        if (this._enabled)            return;        this._enabled = true;        this._agent.enable();        WebInspector.targetManager.addEventListener(WebInspector.TargetManager.Events.MainFrameNavigated, this._mainFrameNavigated, this);    },    disable: function()     {        if (!this._enabled)            return;        this._enabled = false;        for (var worker of this._workers.values())            worker._connection.close();        this._workers.clear();        this._registrations.clear();        this._agent.disable();        WebInspector.targetManager.removeEventListener(WebInspector.TargetManager.Events.MainFrameNavigated, this._mainFrameNavigated, this);    },    workers: function()     {        return this._workers.values();    },    hasWorkers: function()     {        return !!this._workers.size;    },    debugOnStart: function()     {        return !!this._debugOnStart;    },    setDebugOnStart: function(flag)     {        this._agent.setDebugOnStart(flag);    },    registrations: function()     {        return this._registrations;    },    deleteRegistration: function(registrationId)     {        var registration = this._registrations.get(registrationId);        if (!registration)            return;        if (registration._isRedundant()) {            this._registrations.delete(registrationId);            this.dispatchEventToListeners(WebInspector.ServiceWorkerManager.Events.RegistrationDeleted, registration);            return;        }        registration._deleting = true;        for (var version of registration.versions.values())            this.stopWorker(version.id);        this._unregister(registration.scopeURL);    },    updateRegistration: function(registrationId)     {        var registration = this._registrations.get(registrationId);        if (!registration)            return;        this._agent.updateRegistration(registration.scopeURL);    },    deliverPushMessage: function(registrationId, data)     {        var registration = this._registrations.get(registrationId);        if (!registration)            return;        var origin = WebInspector.ParsedURL.splitURLIntoPathComponents(registration.scopeURL)[0];        this._agent.deliverPushMessage(origin, registrationId, data);    },    activateTarget: function(targetId)     {        this._agent.activateTarget(targetId);    },    _unregister: function(scope)     {        this._agent.unregister(scope);    },    startWorker: function(scope)     {        this._agent.startWorker(scope);    },    stopWorker: function(versionId)     {        this._agent.stopWorker(versionId);    },    inspectWorker: function(versionId)     {        this._agent.inspectWorker(versionId);    },    skipWaiting: function(versionId)     {        this._agent.skipWaiting(versionId);    },    getTargetInfo: function(targetId, callback)     {        function innerCallback(error, targetInfo)         {            if (error) {                console.error(error);                callback(null );                return;            }            if (targetInfo)                callback(new WebInspector.TargetInfo(targetInfo));            else                callback(null )        }        this._agent.getTargetInfo(targetId, innerCallback);    },    _workerCreated: function(workerId, url)     {        new WebInspector.ServiceWorker(this,workerId,url);    },    _workerTerminated: function(workerId)     {        var worker = this._workers.get(workerId);        if (!worker)            return;        worker._closeConnection();        this._workers.delete(workerId);        this.dispatchEventToListeners(WebInspector.ServiceWorkerManager.Events.WorkersUpdated);    },    _dispatchMessage: function(workerId, message)     {        var worker = this._workers.get(workerId);        if (worker)            worker._connection.dispatch(message);    },    _workerRegistrationUpdated: function(registrations)     {        for (var payload of registrations) {            var registration = this._registrations.get(payload.registrationId);            if (!registration) {                registration = new WebInspector.ServiceWorkerRegistration(payload);                this._registrations.set(payload.registrationId, registration);                this.dispatchEventToListeners(WebInspector.ServiceWorkerManager.Events.RegistrationUpdated, registration);                continue;            }            registration._update(payload);            if (registration._shouldBeRemoved()) {                this._registrations.delete(registration.id);                this.dispatchEventToListeners(WebInspector.ServiceWorkerManager.Events.RegistrationDeleted, registration);            } else {                this.dispatchEventToListeners(WebInspector.ServiceWorkerManager.Events.RegistrationUpdated, registration);            }        }    },    _workerVersionUpdated: function(versions)     {        var registrations = new Set();        for (var payload of versions) {            var registration = this._registrations.get(payload.registrationId);            if (!registration)                continue;registration._updateVersion(payload);            registrations.add(registration);        }        for (var registration of registrations) {            if (registration._shouldBeRemoved()) {                this._registrations.delete(registration.id);                this.dispatchEventToListeners(WebInspector.ServiceWorkerManager.Events.RegistrationDeleted, registration);            } else {                this.dispatchEventToListeners(WebInspector.ServiceWorkerManager.Events.RegistrationUpdated, registration);            }        }    },    _workerErrorReported: function(payload)     {        var registration = this._registrations.get(payload.registrationId);        if (!registration)            return;        registration._addError(payload);        this.dispatchEventToListeners(WebInspector.ServiceWorkerManager.Events.RegistrationUpdated, registration);    },    _debugOnStartUpdated: function(flag)     {        this._debugOnStart = flag;        this.dispatchEventToListeners(WebInspector.ServiceWorkerManager.Events.DebugOnStartUpdated, flag);    },    _mainFrameNavigated: function(event)     {},    __proto__: WebInspector.SDKObject.prototype}WebInspector.ServiceWorker = function(manager, workerId, url) {    this._manager = manager;    this._agent = manager.target().serviceWorkerAgent();    this._workerId = workerId;    this._connection = new WebInspector.ServiceWorkerConnection(this._agent,workerId);    this._url = url;    var parsedURL = url.asParsedURL();    this._name = parsedURL ? parsedURL.lastPathComponentWithFragment() : "#" + (++WebInspector.ServiceWorker._lastAnonymousTargetId);    this._scope = parsedURL.host + parsedURL.folderPathComponents;    var title = WebInspector.UIString("\u2699 %s", this._name);    this._manager._workers.set(workerId, this);    WebInspector.targetManager.createTarget(title, WebInspector.Target.Type.ServiceWorker, this._connection, manager.target(), targetCreated.bind(this));    function targetCreated(target)     {        if (!target) {            this._manager._workers.delete(workerId);            return;        }        this._manager.dispatchEventToListeners(WebInspector.ServiceWorkerManager.Events.WorkersUpdated);        target.runtimeAgent().run();    }}WebInspector.ServiceWorker._lastAnonymousTargetId = 0;WebInspector.ServiceWorker.prototype = {    name: function()     {        return this._name;    },    url: function()     {        return this._url;    },    scope: function()     {        return this._scope;    },    stop: function()     {        this._agent.stop(this._workerId);    },    _closeConnection: function()     {        this._connection._close();    }}WebInspector.ServiceWorkerDispatcher = function(manager) {    this._manager = manager;}WebInspector.ServiceWorkerDispatcher.prototype = {    workerCreated: function(workerId, url)     {        this._manager._workerCreated(workerId, url);    },    workerTerminated: function(workerId)     {        this._manager._workerTerminated(workerId);    },    dispatchMessage: function(workerId, message)     {        this._manager._dispatchMessage(workerId, message);    },    workerRegistrationUpdated: function(registrations)     {        this._manager._workerRegistrationUpdated(registrations);    },    workerVersionUpdated: function(versions)     {        this._manager._workerVersionUpdated(versions);    },    workerErrorReported: function(errorMessage)     {        this._manager._workerErrorReported(errorMessage);    },    debugOnStartUpdated: function(flag)     {        this._manager._debugOnStartUpdated(flag);    }}WebInspector.ServiceWorkerConnection = function(agent, workerId) {    InspectorBackendClass.Connection.call(this);    this.suppressErrorsForDomains(["Worker", "Page", "CSS", "DOM", "DOMStorage", "Database", "Network", "IndexedDB"]);    this._agent = agent;    this._workerId = workerId;}WebInspector.ServiceWorkerConnection.prototype = {    sendMessage: function(messageObject)     {        this._agent.sendMessage(this._workerId, JSON.stringify(messageObject));    },    _close: function()     {        this.connectionClosed("worker_terminated");    },    __proto__: InspectorBackendClass.Connection.prototype}WebInspector.TargetInfo = function(payload) {    this.id = payload.id;    this.type = payload.type;    this.title = payload.title;    this.url = payload.url;}WebInspector.TargetInfo.prototype = {    isWebContents: function()     {        return this.type == "web_contents";    },    isFrame: function()     {        return this.type == "frame";    },}WebInspector.ServiceWorkerErrorMessage = function(payload) {    this.errorMessage = payload.errorMessage;    this.sourceURL = payload.sourceURL;    this.lineNumber = payload.lineNumber;    this.columnNumber = payload.columnNumber;}WebInspector.ServiceWorkerVersion = function(registration, payload) {    this._registration = registration;    this._update(payload);    this.errorMessages = [];}WebInspector.ServiceWorkerVersion.prototype = {    _update: function(payload)     {        this.id = payload.versionId;        this.scriptURL = payload.scriptURL;        this.runningStatus = payload.runningStatus;        this.status = payload.status;        this.scriptLastModified = payload.scriptLastModified;        this.scriptResponseTime = payload.scriptResponseTime;        this.controlledClients = []        for (var i = 0; i < payload.controlledClients.length; ++i) {            this.controlledClients.push(payload.controlledClients[i]);        }    },    isStartable: function()     {        return !this._registration.isDeleted && this.isActivated() && this.isStopped();    },    isStoppedAndRedundant: function()     {        return this.runningStatus == ServiceWorkerAgent.ServiceWorkerVersionRunningStatus.Stopped && this.status == ServiceWorkerAgent.ServiceWorkerVersionStatus.Redundant;    },    isStopped: function()     {        return this.runningStatus == ServiceWorkerAgent.ServiceWorkerVersionRunningStatus.Stopped;    },    isStarting: function()     {        return this.runningStatus == ServiceWorkerAgent.ServiceWorkerVersionRunningStatus.Starting;    },    isRunning: function()     {        return this.runningStatus == ServiceWorkerAgent.ServiceWorkerVersionRunningStatus.Running;    },    isStopping: function()     {        return this.runningStatus == ServiceWorkerAgent.ServiceWorkerVersionRunningStatus.Stopping;    },    isNew: function()     {        return this.status == ServiceWorkerAgent.ServiceWorkerVersionStatus.New;    },    isInstalling: function()     {        return this.status == ServiceWorkerAgent.ServiceWorkerVersionStatus.Installing;    },    isInstalled: function()     {        return this.status == ServiceWorkerAgent.ServiceWorkerVersionStatus.Installed;    },    isActivating: function()     {        return this.status == ServiceWorkerAgent.ServiceWorkerVersionStatus.Activating;    },    isActivated: function()     {        return this.status == ServiceWorkerAgent.ServiceWorkerVersionStatus.Activated;    },    isRedundant: function()     {        return this.status == ServiceWorkerAgent.ServiceWorkerVersionStatus.Redundant;    },    _addError: function(payload)     {        this.errorMessages.push(new WebInspector.ServiceWorkerErrorMessage(payload));    }}WebInspector.ServiceWorkerRegistration = function(payload) {    this._update(payload);    this.versions = new Map();    this._deleting = false;}WebInspector.ServiceWorkerRegistration.prototype = {    _update: function(payload)     {        this.id = payload.registrationId;        this.scopeURL = payload.scopeURL;        this.isDeleted = payload.isDeleted;    },    _updateVersion: function(payload)     {        var version = this.versions.get(payload.versionId);        if (!version) {            version = new WebInspector.ServiceWorkerVersion(this,payload);            this.versions.set(payload.versionId, version);            return version;        }        version._update(payload);        return version;    },    _addError: function(payload)     {        var version = this.versions.get(payload.versionId);        if (version)            version._addError(payload);    },    _isRedundant: function()     {        for (var version of this.versions.values()) {            if (!version.isStoppedAndRedundant())                return false;        }        return true;    },    _hasErrorLog: function()     {        for (var version of this.versions.values()) {            if (version.errorMessages.length)                return true;        }        return false;    },    _shouldBeRemoved: function()     {        return this._isRedundant() && (!this._hasErrorLog() || this._deleting);    }};WebInspector.TracingManagerClient = function() {}WebInspector.TracingManagerClient.prototype = {    tracingStarted: function() {},    traceEventsCollected: function(events) {},    tracingComplete: function() {},    tracingBufferUsage: function(usage) {},    eventsRetrievalProgress: function(progress) {}}WebInspector.TracingManager = function(target) {    this._target = target;    target.registerTracingDispatcher(new WebInspector.TracingDispatcher(this));    this._activeClient = null ;    this._eventBufferSize = 0;    this._eventsRetrieved = 0;}WebInspector.TracingManager.EventPayload;WebInspector.TracingManager.prototype = {    target: function()     {        return this._target;    },    _bufferUsage: function(usage, eventCount, percentFull)     {        this._eventBufferSize = eventCount;        this._activeClient.tracingBufferUsage(usage || percentFull || 0);    },    _eventsCollected: function(events)     {        this._activeClient.traceEventsCollected(events);        this._eventsRetrieved += events.length;        if (!this._eventBufferSize)            return;        if (this._eventsRetrieved > this._eventBufferSize)            this._eventsRetrieved = this._eventBufferSize;        this._activeClient.eventsRetrievalProgress(this._eventsRetrieved / this._eventBufferSize);    },    _tracingComplete: function()     {        this._eventBufferSize = 0;        this._eventsRetrieved = 0;        this._activeClient.tracingComplete();        this._activeClient = null ;    },    start: function(client, categoryFilter, options, callback)     {        if (this._activeClient)            throw new Error("Tracing is already started");        var bufferUsageReportingIntervalMs = 500;        this._activeClient = client;        this._target.tracingAgent().start(categoryFilter, options, bufferUsageReportingIntervalMs, callback);        this._activeClient.tracingStarted();    },    stop: function()     {        this._target.tracingAgent().end();    }}WebInspector.TracingDispatcher = function(tracingManager) {    this._tracingManager = tracingManager;}WebInspector.TracingDispatcher.prototype = {    bufferUsage: function(usage, eventCount, percentFull)     {        this._tracingManager._bufferUsage(usage, eventCount, percentFull);    },    dataCollected: function(data)     {        this._tracingManager._eventsCollected(data);    },    tracingComplete: function()     {        this._tracingManager._tracingComplete();    }};WebInspector.TracingModel = function(backingStorage) {    this._backingStorage = backingStorage;    this.reset();}WebInspector.TracingModel.Phase = {    Begin: "B",    End: "E",    Complete: "X",    Instant: "I",    AsyncBegin: "S",    AsyncStepInto: "T",    AsyncStepPast: "p",    AsyncEnd: "F",    NestableAsyncBegin: "b",    NestableAsyncEnd: "e",    NestableAsyncInstant: "n",    FlowBegin: "s",    FlowStep: "t",    FlowEnd: "f",    Metadata: "M",    Counter: "C",    Sample: "P",    CreateObject: "N",    SnapshotObject: "O",    DeleteObject: "D"};WebInspector.TracingModel.MetadataEvent = {    ProcessSortIndex: "process_sort_index",    ProcessName: "process_name",    ThreadSortIndex: "thread_sort_index",    ThreadName: "thread_name"}WebInspector.TracingModel.TopLevelEventCategory = "toplevel";WebInspector.TracingModel.DevToolsMetadataEventCategory = "disabled-by-default-devtools.timeline";WebInspector.TracingModel.DevToolsTimelineEventCategory = "disabled-by-default-devtools.timeline";WebInspector.TracingModel.ConsoleEventCategory = "blink.console";WebInspector.TracingModel.FrameLifecycleEventCategory = "cc,devtools";WebInspector.TracingModel.DevToolsMetadataEvent = {    TracingStartedInPage: "TracingStartedInPage",    TracingSessionIdForWorker: "TracingSessionIdForWorker",};WebInspector.TracingModel._nestableAsyncEventsString = WebInspector.TracingModel.Phase.NestableAsyncBegin + WebInspector.TracingModel.Phase.NestableAsyncEnd + WebInspector.TracingModel.Phase.NestableAsyncInstant;WebInspector.TracingModel._legacyAsyncEventsString = WebInspector.TracingModel.Phase.AsyncBegin + WebInspector.TracingModel.Phase.AsyncEnd + WebInspector.TracingModel.Phase.AsyncStepInto + WebInspector.TracingModel.Phase.AsyncStepPast;WebInspector.TracingModel._flowEventsString = WebInspector.TracingModel.Phase.FlowBegin + WebInspector.TracingModel.Phase.FlowStep + WebInspector.TracingModel.Phase.FlowEnd;WebInspector.TracingModel._rendererMainThreadName = "CrRendererMain";WebInspector.TracingModel._asyncEventsString = WebInspector.TracingModel._nestableAsyncEventsString + WebInspector.TracingModel._legacyAsyncEventsString;WebInspector.TracingModel.isNestableAsyncPhase = function(phase) {    return WebInspector.TracingModel._nestableAsyncEventsString.indexOf(phase) >= 0;}WebInspector.TracingModel.isAsyncBeginPhase = function(phase) {    return phase === WebInspector.TracingModel.Phase.AsyncBegin || phase === WebInspector.TracingModel.Phase.NestableAsyncBegin;}WebInspector.TracingModel.isAsyncPhase = function(phase) {    return WebInspector.TracingModel._asyncEventsString.indexOf(phase) >= 0;}WebInspector.TracingModel.isFlowPhase = function(phase) {    return WebInspector.TracingModel._flowEventsString.indexOf(phase) >= 0;}WebInspector.TracingModel.isTopLevelEvent = function(event) {    return event.hasCategory(WebInspector.TracingModel.TopLevelEventCategory) || event.hasCategory(WebInspector.TracingModel.DevToolsMetadataEventCategory) && event.name === "Program";}WebInspector.BackingStorage = function() {}WebInspector.BackingStorage.prototype = {    appendString: function(string) {},    appendAccessibleString: function(string) {},    finishWriting: function() {},    reset: function() {},}WebInspector.TracingModel.prototype = {    devtoolsPageMetadataEvents: function()     {        return this._devtoolsPageMetadataEvents;    },    devtoolsWorkerMetadataEvents: function()     {        return this._devtoolsWorkerMetadataEvents;    },    sessionId: function()     {        return this._sessionId;    },    setEventsForTest: function(events)     {        this.reset();        this.addEvents(events);        this.tracingComplete();    },    addEvents: function(events)     {        for (var i = 0; i < events.length; ++i)            this._addEvent(events[i]);    },    tracingComplete: function()     {        this._processMetadataEvents();        this._processPendingAsyncEvents();        this._backingStorage.finishWriting();        for (var process of Object.values(this._processById)) {            for (var thread of Object.values(process._threads))                thread.tracingComplete();        }    },    reset: function()     {        this._processById = {};        this._processByName = new Map();        this._minimumRecordTime = 0;        this._maximumRecordTime = 0;        this._sessionId = null ;        this._devtoolsPageMetadataEvents = [];        this._devtoolsWorkerMetadataEvents = [];        this._backingStorage.reset();        this._appendDelimiter = false;        this._loadedFromFile = false;        this._asyncEvents = [];        this._openAsyncEvents = new Map();        this._openNestableAsyncEvents = new Map();        this._parsedCategories = new Map();    },    _addEvent: function(payload)     {        var process = this._processById[payload.pid];        if (!process) {            process = new WebInspector.TracingModel.Process(this,payload.pid);            this._processById[payload.pid] = process;        }        var eventsDelimiter = ",\n";        if (this._appendDelimiter)            this._backingStorage.appendString(eventsDelimiter);        this._appendDelimiter = true;        var stringPayload = JSON.stringify(payload);        var isAccessible = payload.ph === WebInspector.TracingModel.Phase.SnapshotObject;        var backingStorage = null ;        var keepStringsLessThan = 10000;        if (isAccessible && stringPayload.length > keepStringsLessThan)            backingStorage = this._backingStorage.appendAccessibleString(stringPayload);        else            this._backingStorage.appendString(stringPayload);        if (payload.ph !== WebInspector.TracingModel.Phase.Metadata) {            var timestamp = payload.ts / 1000;            if (timestamp && (!this._minimumRecordTime || timestamp < this._minimumRecordTime))                this._minimumRecordTime = timestamp;            var endTimeStamp = (payload.ts + (payload.dur || 0)) / 1000;            this._maximumRecordTime = Math.max(this._maximumRecordTime, endTimeStamp);            var event = process._addEvent(payload);            if (!event)                return;            if (WebInspector.TracingModel.isAsyncPhase(payload.ph))                this._asyncEvents.push(event);            event._setBackingStorage(backingStorage);            if (event.name === WebInspector.TracingModel.DevToolsMetadataEvent.TracingStartedInPage && event.hasCategory(WebInspector.TracingModel.DevToolsMetadataEventCategory)) {                this._devtoolsPageMetadataEvents.push(event);            }            if (event.name === WebInspector.TracingModel.DevToolsMetadataEvent.TracingSessionIdForWorker && event.hasCategory(WebInspector.TracingModel.DevToolsMetadataEventCategory)) {                this._devtoolsWorkerMetadataEvents.push(event);            }            return;        }        switch (payload.name) {        case WebInspector.TracingModel.MetadataEvent.ProcessSortIndex:            process._setSortIndex(payload.args["sort_index"]);            break;        case WebInspector.TracingModel.MetadataEvent.ProcessName:            var processName = payload.args["name"];            process._setName(processName);            this._processByName.set(processName, process);            break;        case WebInspector.TracingModel.MetadataEvent.ThreadSortIndex:            process.threadById(payload.tid)._setSortIndex(payload.args["sort_index"]);            break;        case WebInspector.TracingModel.MetadataEvent.ThreadName:            process.threadById(payload.tid)._setName(payload.args["name"]);            break;        }    },    _processMetadataEvents: function()     {        this._devtoolsPageMetadataEvents.sort(WebInspector.TracingModel.Event.compareStartTime);        if (!this._devtoolsPageMetadataEvents.length) {            var pageMetaEvent = this._loadedFromFile ? this._makeMockPageMetadataEvent() : null ;            if (!pageMetaEvent) {                console.error(WebInspector.TracingModel.DevToolsMetadataEvent.TracingStartedInPage + " event not found.");                return;            }            this._devtoolsPageMetadataEvents.push(pageMetaEvent);        }        var sessionId = this._devtoolsPageMetadataEvents[0].args["sessionId"] || this._devtoolsPageMetadataEvents[0].args["data"]["sessionId"];        this._sessionId = sessionId;        var mismatchingIds = {};        function checkSessionId(event)         {            var args = event.args;            if (args["data"])                args = args["data"];            var id = args["sessionId"];            if (id === sessionId)                return true;            mismatchingIds[id] = true;            return false;        }        this._devtoolsPageMetadataEvents = this._devtoolsPageMetadataEvents.filter(checkSessionId);        this._devtoolsWorkerMetadataEvents = this._devtoolsWorkerMetadataEvents.filter(checkSessionId);        var idList = Object.keys(mismatchingIds);        if (idList.length)            WebInspector.console.error("Timeline recording was started in more than one page simultaneously. Session id mismatch: " + this._sessionId + " and " + idList + ".");    },    _makeMockPageMetadataEvent: function()     {        var rendererMainThreadName = WebInspector.TracingModel._rendererMainThreadName;        var process = Object.values(this._processById).filter(function(p) {            return p.threadByName(rendererMainThreadName);        }        )[0];        var thread = process && process.threadByName(rendererMainThreadName);        if (!thread)            return null ;        var pageMetaEvent = new WebInspector.TracingModel.Event(WebInspector.TracingModel.DevToolsMetadataEventCategory,WebInspector.TracingModel.DevToolsMetadataEvent.TracingStartedInPage,WebInspector.TracingModel.Phase.Metadata,this._minimumRecordTime,thread);        pageMetaEvent.addArgs({            "data": {                "sessionId": "mockSessionId"            }        });        return pageMetaEvent;    },    minimumRecordTime: function()     {        return this._minimumRecordTime;    },    maximumRecordTime: function()     {        return this._maximumRecordTime;    },    sortedProcesses: function()     {        return WebInspector.TracingModel.NamedObject._sort(Object.values(this._processById));    },    processByName: function(name)     {        return this._processByName.get(name);    },    _processPendingAsyncEvents: function()     {        this._asyncEvents.sort(WebInspector.TracingModel.Event.compareStartTime);        for (var i = 0; i < this._asyncEvents.length; ++i) {            var event = this._asyncEvents[i];            if (WebInspector.TracingModel.isNestableAsyncPhase(event.phase))                this._addNestableAsyncEvent(event);            else                this._addAsyncEvent(event);        }        this._asyncEvents = [];        this._closeOpenAsyncEvents();    },    _closeOpenAsyncEvents: function()     {        for (var event of this._openAsyncEvents.values()) {            event.setEndTime(this._maximumRecordTime);            event.steps[0].setEndTime(this._maximumRecordTime);        }        this._openAsyncEvents.clear();        for (var eventStack of this._openNestableAsyncEvents.values()) {            while (eventStack.length)                eventStack.pop().setEndTime(this._maximumRecordTime);        }        this._openNestableAsyncEvents.clear();    },    _addNestableAsyncEvent: function(event)     {        var phase = WebInspector.TracingModel.Phase;        var key = event.categoriesString + "." + event.id;        var openEventsStack = this._openNestableAsyncEvents.get(key);        switch (event.phase) {        case phase.NestableAsyncBegin:            if (!openEventsStack) {                openEventsStack = [];                this._openNestableAsyncEvents.set(key, openEventsStack);            }            var asyncEvent = new WebInspector.TracingModel.AsyncEvent(event);            openEventsStack.push(asyncEvent);            event.thread._addAsyncEvent(asyncEvent);            break;        case phase.NestableAsyncInstant:            if (openEventsStack && openEventsStack.length)                openEventsStack.peekLast()._addStep(event);            break;        case phase.NestableAsyncEnd:            if (!openEventsStack || !openEventsStack.length)                break;            var top = openEventsStack.pop();            if (top.name !== event.name) {                console.error("Begin/end event mismatch for nestable async event, " + top.name + " vs. " + event.name);                break;            }            top._addStep(event);        }    },    _addAsyncEvent: function(event)     {        var phase = WebInspector.TracingModel.Phase;        var key = event.categoriesString + "." + event.name + "." + event.id;        var asyncEvent = this._openAsyncEvents.get(key);        if (event.phase === phase.AsyncBegin) {            if (asyncEvent) {                console.error("Event " + event.name + " has already been started");                return;            }            asyncEvent = new WebInspector.TracingModel.AsyncEvent(event);            this._openAsyncEvents.set(key, asyncEvent);            event.thread._addAsyncEvent(asyncEvent);            return;        }        if (!asyncEvent) {            return;        }        if (event.phase === phase.AsyncEnd) {            asyncEvent._addStep(event);            this._openAsyncEvents.delete(key);            return;        }        if (event.phase === phase.AsyncStepInto || event.phase === phase.AsyncStepPast) {            var lastStep = asyncEvent.steps.peekLast();            if (lastStep.phase !== phase.AsyncBegin && lastStep.phase !== event.phase) {                console.assert(false, "Async event step phase mismatch: " + lastStep.phase + " at " + lastStep.startTime + " vs. " + event.phase + " at " + event.startTime);                return;            }            asyncEvent._addStep(event);            return;        }        console.assert(false, "Invalid async event phase");    },    _parsedCategoriesForString: function(str)     {        var parsedCategories = this._parsedCategories.get(str);        if (!parsedCategories) {            parsedCategories = new Set(str.split(","));            this._parsedCategories.set(str, parsedCategories);        }        return parsedCategories;    }}WebInspector.TracingModel.Loader = function(tracingModel) {    this._tracingModel = tracingModel;    this._firstChunkReceived = false;}WebInspector.TracingModel.Loader.prototype = {    loadNextChunk: function(events)     {        if (!this._firstChunkReceived) {            this._tracingModel.reset();            this._firstChunkReceived = true;        }        this._tracingModel.addEvents(events);    },    finish: function()     {        this._tracingModel._loadedFromFile = true;        this._tracingModel.tracingComplete();    }}WebInspector.TracingModel.Event = function(categories, name, phase, startTime, thread) {    this.categoriesString = categories;    this._parsedCategories = thread._model._parsedCategoriesForString(categories);    this.name = name;    this.phase = phase;    this.startTime = startTime;    this.thread = thread;    this.args = {};    this.warning = null ;    this.initiator = null ;    this.stackTrace = null ;    this.previewElement = null ;    this.url = null ;    this.backendNodeId = 0;    this.selfTime = 0;}WebInspector.TracingModel.Event.fromPayload = function(payload, thread) {    var event = new WebInspector.TracingModel.Event(payload.cat,payload.name,(payload.ph),payload.ts / 1000,thread);    if (payload.args)        event.addArgs(payload.args);    else        console.error("Missing mandatory event argument 'args' at " + payload.ts / 1000);    if (typeof payload.dur === "number")        event.setEndTime((payload.ts + payload.dur) / 1000);    if (payload.id)        event.id = payload.id;    return event;}WebInspector.TracingModel.Event.prototype = {    hasCategory: function(categoryName)     {        return this._parsedCategories.has(categoryName);    },    setEndTime: function(endTime)     {        if (endTime < this.startTime) {            console.assert(false, "Event out of order: " + this.name);            return;        }        this.endTime = endTime;        this.duration = endTime - this.startTime;    },    addArgs: function(args)     {        for (var name in args) {            if (name in this.args)                console.error("Same argument name (" + name + ") is used for begin and end phases of " + this.name);            this.args[name] = args[name];        }    },    _complete: function(endEvent)     {        if (endEvent.args)            this.addArgs(endEvent.args);        else            console.error("Missing mandatory event argument 'args' at " + endEvent.startTime);        this.setEndTime(endEvent.startTime);    },    _setBackingStorage: function(backingStorage)     {}}WebInspector.TracingModel.Event.compareStartTime = function(a, b) {    return a.startTime - b.startTime;}WebInspector.TracingModel.Event.orderedCompareStartTime = function(a, b) {    return a.startTime - b.startTime || a.ordinal - b.ordinal || -1;}WebInspector.TracingModel.ObjectSnapshot = function(category, name, startTime, thread) {    WebInspector.TracingModel.Event.call(this, category, name, WebInspector.TracingModel.Phase.SnapshotObject, startTime, thread);}WebInspector.TracingModel.ObjectSnapshot.fromPayload = function(payload, thread) {    var snapshot = new WebInspector.TracingModel.ObjectSnapshot(payload.cat,payload.name,payload.ts / 1000,thread);    if (payload.id)        snapshot.id = payload.id;    if (!payload.args || !payload.args["snapshot"]) {        console.error("Missing mandatory 'snapshot' argument at " + payload.ts / 1000);        return snapshot;    }    if (payload.args)        snapshot.addArgs(payload.args);    return snapshot;}WebInspector.TracingModel.ObjectSnapshot.prototype = {    requestObject: function(callback)     {        var snapshot = this.args["snapshot"];        if (snapshot) {            callback(snapshot);            return;        }        this._backingStorage().then(onRead, callback.bind(null , null ));        function onRead(result)         {            if (!result) {                callback(null );                return;            }            try {                var payload = JSON.parse(result);                callback(payload["args"]["snapshot"]);            } catch (e) {                WebInspector.console.error("Malformed event data in backing storage");                callback(null );            }        }    },    objectPromise: function()     {        if (!this._objectPromise)            this._objectPromise = new Promise(this.requestObject.bind(this));        return this._objectPromise;    },    _setBackingStorage: function(backingStorage)     {        if (!backingStorage)            return;        this._backingStorage = backingStorage;        this.args = {};    },    __proto__: WebInspector.TracingModel.Event.prototype}WebInspector.TracingModel.AsyncEvent = function(startEvent) {    WebInspector.TracingModel.Event.call(this, startEvent.categoriesString, startEvent.name, startEvent.phase, startEvent.startTime, startEvent.thread)    this.addArgs(startEvent.args);    this.steps = [startEvent];}WebInspector.TracingModel.AsyncEvent.prototype = {    _addStep: function(event)     {        this.steps.push(event)        if (event.phase === WebInspector.TracingModel.Phase.AsyncEnd || event.phase === WebInspector.TracingModel.Phase.NestableAsyncEnd) {            this.setEndTime(event.startTime);            this.steps[0].setEndTime(event.startTime);        }    },    __proto__: WebInspector.TracingModel.Event.prototype}WebInspector.TracingModel.NamedObject = function() {}WebInspector.TracingModel.NamedObject.prototype = {    _setName: function(name)     {        this._name = name;    },    name: function()     {        return this._name;    },    _setSortIndex: function(sortIndex)     {        this._sortIndex = sortIndex;    },}WebInspector.TracingModel.NamedObject._sort = function(array) {    function comparator(a, b)     {        return a._sortIndex !== b._sortIndex ? a._sortIndex - b._sortIndex : a.name().localeCompare(b.name());    }    return array.sort(comparator);}WebInspector.TracingModel.Process = function(model, id) {    WebInspector.TracingModel.NamedObject.call(this);    this._setName("Process " + id);    this._id = id;    this._threads = {};    this._threadByName = new Map();    this._model = model;}WebInspector.TracingModel.Process.prototype = {    id: function()     {        return this._id;    },    threadById: function(id)     {        var thread = this._threads[id];        if (!thread) {            thread = new WebInspector.TracingModel.Thread(this,id);            this._threads[id] = thread;        }        return thread;    },    threadByName: function(name)     {        return this._threadByName.get(name) || null ;    },    _setThreadByName: function(name, thread)     {        this._threadByName.set(name, thread);    },    _addEvent: function(payload)     {        return this.threadById(payload.tid)._addEvent(payload);    },    sortedThreads: function()     {        return WebInspector.TracingModel.NamedObject._sort(Object.values(this._threads));    },    __proto__: WebInspector.TracingModel.NamedObject.prototype}WebInspector.TracingModel.Thread = function(process, id) {    WebInspector.TracingModel.NamedObject.call(this);    this._process = process;    this._setName("Thread " + id);    this._events = [];    this._asyncEvents = [];    this._id = id;    this._model = process._model;}WebInspector.TracingModel.Thread.prototype = {    target: function()     {        if (this.name() === WebInspector.TracingModel._rendererMainThreadName)            return WebInspector.targetManager.targets()[0] || null ;        else            return null ;    },    tracingComplete: function()     {        this._asyncEvents.stableSort(WebInspector.TracingModel.Event.compareStartTime);        this._events.stableSort(WebInspector.TracingModel.Event.compareStartTime);        var phases = WebInspector.TracingModel.Phase;        var stack = [];        for (var i = 0; i < this._events.length; ++i) {            var e = this._events[i];            e.ordinal = i;            switch (e.phase) {            case phases.End:                this._events[i] = null ;                if (!stack.length)                    continue;var top = stack.pop();                if (top.name !== e.name || top.categoriesString !== e.categoriesString)                    console.error("B/E events mismatch at " + top.startTime + " (" + top.name + ") vs. " + e.startTime + " (" + e.name + ")");                else                    top._complete(e);                break;            case phases.Begin:                stack.push(e);                break;            }        }        this._events.remove(null , false);    },    _addEvent: function(payload)     {        var event = payload.ph === WebInspector.TracingModel.Phase.SnapshotObject ? WebInspector.TracingModel.ObjectSnapshot.fromPayload(payload, this) : WebInspector.TracingModel.Event.fromPayload(payload, this);        if (WebInspector.TracingModel.isTopLevelEvent(event)) {            if (this._lastTopLevelEvent && this._lastTopLevelEvent.endTime > event.startTime)                return null ;            this._lastTopLevelEvent = event;        }        this._events.push(event);        return event;    },    _addAsyncEvent: function(asyncEvent)     {        this._asyncEvents.push(asyncEvent);    },    _setName: function(name)     {        WebInspector.TracingModel.NamedObject.prototype._setName.call(this, name);        this._process._setThreadByName(name, this);    },    id: function()     {        return this._id;    },    process: function()     {        return this._process;    },    events: function()     {        return this._events;    },    asyncEvents: function()     {        return this._asyncEvents;    },    __proto__: WebInspector.TracingModel.NamedObject.prototype};WebInspector.WorkerManager = function(target) {    WebInspector.SDKObject.call(this, target);    target.registerWorkerDispatcher(new WebInspector.WorkerDispatcher(this));    this._lastAnonymousTargetId = 0;    this._connections = new Map();    this._targetsByWorkerId = new Map();    WebInspector.targetManager.addEventListener(WebInspector.TargetManager.Events.SuspendStateChanged, this._onSuspendStateChanged, this);    this._onSuspendStateChanged();    this.enable();}WebInspector.WorkerManager.prototype = {    enable: function()     {        if (this._enabled)            return;        this._enabled = true;        this.target().workerAgent().enable();        this.target().resourceTreeModel.addEventListener(WebInspector.TargetManager.Events.MainFrameNavigated, this._mainFrameNavigated, this);    },    disable: function()     {        if (!this._enabled)            return;        this._enabled = false;        this._reset();        this.target().workerAgent().disable();        this.target().resourceTreeModel.removeEventListener(WebInspector.TargetManager.Events.MainFrameNavigated, this._mainFrameNavigated, this);    },    dispose: function()     {        this._reset();    },    _reset: function()     {        for (var connection of this._connections.values())            connection._close();        this._connections.clear();        this._targetsByWorkerId.clear();    },    _onSuspendStateChanged: function()     {        var suspended = WebInspector.targetManager.allTargetsSuspended();        this.target().workerAgent().setAutoconnectToWorkers(!suspended);    },    _workerCreated: function(workerId, url, inspectorConnected)     {        var connection = new WebInspector.WorkerConnection(this,workerId,inspectorConnected,onConnectionReady.bind(this));        this._connections.set(workerId, connection);        function onConnectionReady(connection)         {            var parsedURL = url.asParsedURL();            var workerName = parsedURL ? parsedURL.lastPathComponentWithFragment() : "#" + (++this._lastAnonymousTargetId);            var title = WebInspector.UIString("\u2699 %s", workerName);            WebInspector.targetManager.createTarget(title, WebInspector.Target.Type.DedicatedWorker, connection, this.target(), targetCreated.bind(this));        }        function targetCreated(target)         {            if (!target)                return;            this._targetsByWorkerId.set(workerId, target);            if (inspectorConnected)                target.runtimeAgent().isRunRequired(pauseInDebuggerAndRunIfRequired.bind(null , target));        }        function pauseInDebuggerAndRunIfRequired(target, error, required)         {            var mainIsServiceWorker = WebInspector.targetManager.mainTarget().isServiceWorker();            if (mainIsServiceWorker && required)                target.debuggerAgent().pause();            target.runtimeAgent().run();        }    },    _workerTerminated: function(workerId)     {        var connection = this._connections.get(workerId);        if (connection)            connection._close();        this._connections.delete(workerId);        this._targetsByWorkerId.delete(workerId);    },    _dispatchMessageFromWorker: function(workerId, message)     {        var connection = this._connections.get(workerId);        if (connection)            connection.dispatch(message);    },    _mainFrameNavigated: function(event)     {        this._reset();    },    targetByWorkerId: function(workerId)     {        return this._targetsByWorkerId.get(workerId) || null ;    },    __proto__: WebInspector.SDKObject.prototype}WebInspector.WorkerDispatcher = function(workerManager) {    this._workerManager = workerManager;}WebInspector.WorkerDispatcher.prototype = {    workerCreated: function(workerId, url, inspectorConnected)     {        this._workerManager._workerCreated(workerId, url, inspectorConnected);    },    workerTerminated: function(workerId)     {        this._workerManager._workerTerminated(workerId);    },    dispatchMessageFromWorker: function(workerId, message)     {        this._workerManager._dispatchMessageFromWorker(workerId, message);    }}WebInspector.WorkerConnection = function(workerManager, workerId, inspectorConnected, onConnectionReady) {    InspectorBackendClass.Connection.call(this);    this.suppressErrorsForDomains(["Worker", "Page", "CSS", "DOM", "DOMStorage", "Database", "Network", "IndexedDB"]);    this._agent = workerManager.target().workerAgent();    this._workerId = workerId;    if (!inspectorConnected)        this._agent.connectToWorker(workerId, onConnectionReady.bind(null , this));    else        onConnectionReady.call(null , this);}WebInspector.WorkerConnection.prototype = {    sendMessage: function(messageObject)     {        this._agent.sendMessageToWorker(this._workerId, JSON.stringify(messageObject));    },    _close: function()     {        this.connectionClosed("worker_terminated");    },    __proto__: InspectorBackendClass.Connection.prototype};WebInspector.RuntimeModel = function(target) {    WebInspector.SDKModel.call(this, WebInspector.RuntimeModel, target);    this._agent = target.runtimeAgent();    this.target().registerRuntimeDispatcher(new WebInspector.RuntimeDispatcher(this));    if (target.hasJSContext())        this._agent.enable();    this._executionContextById = {};    if (!Runtime.experiments.isEnabled("customObjectFormatters"))        return;    if (WebInspector.moduleSetting("customFormatters").get())        this._agent.setCustomObjectFormatterEnabled(true);    WebInspector.moduleSetting("customFormatters").addChangeListener(this._customFormattersStateChanged.bind(this));}WebInspector.RuntimeModel.Events = {    ExecutionContextCreated: "ExecutionContextCreated",    ExecutionContextDestroyed: "ExecutionContextDestroyed",}WebInspector.RuntimeModel._privateScript = "private script";WebInspector.RuntimeModel.prototype = {    executionContexts: function()     {        return Object.values(this._executionContextById);    },    _executionContextCreated: function(context)     {        if (context.name == WebInspector.RuntimeModel._privateScript && !context.origin && !Runtime.experiments.isEnabled("privateScriptInspection")) {            return;        }        var executionContext = new WebInspector.ExecutionContext(this.target(),context.id,context.name,context.origin,!context.type,context.frameId);        this._executionContextById[executionContext.id] = executionContext;        this.dispatchEventToListeners(WebInspector.RuntimeModel.Events.ExecutionContextCreated, executionContext);    },    _executionContextDestroyed: function(executionContextId)     {        var executionContext = this._executionContextById[executionContextId];        if (!executionContext)            return;        delete this._executionContextById[executionContextId];        this.dispatchEventToListeners(WebInspector.RuntimeModel.Events.ExecutionContextDestroyed, executionContext);    },    _executionContextsCleared: function()     {        var contexts = this.executionContexts();        this._executionContextById = {};        for (var i = 0; i < contexts.length; ++i)            this.dispatchEventToListeners(WebInspector.RuntimeModel.Events.ExecutionContextDestroyed, contexts[i]);    },    createRemoteObject: function(payload)     {        console.assert(typeof payload === "object", "Remote object payload should only be an object");        return new WebInspector.RemoteObjectImpl(this.target(),payload.objectId,payload.type,payload.subtype,payload.value,payload.description,payload.preview,payload.customPreview);    },    createScopeRemoteObject: function(payload, scopeRef)     {        return new WebInspector.ScopeRemoteObject(this.target(),payload.objectId,scopeRef,payload.type,payload.subtype,payload.value,payload.description,payload.preview);    },    createRemoteObjectFromPrimitiveValue: function(value)     {        return new WebInspector.RemoteObjectImpl(this.target(),undefined,typeof value,undefined,value);    },    createRemotePropertyFromPrimitiveValue: function(name, value)     {        return new WebInspector.RemoteObjectProperty(name,this.createRemoteObjectFromPrimitiveValue(value));    },    _customFormattersStateChanged: function(event)     {        var enabled = (event.data);        this._agent.setCustomObjectFormatterEnabled(enabled);    },    __proto__: WebInspector.SDKModel.prototype}WebInspector.RuntimeDispatcher = function(runtimeModel) {    this._runtimeModel = runtimeModel;}WebInspector.RuntimeDispatcher.prototype = {    executionContextCreated: function(context)     {        this._runtimeModel._executionContextCreated(context);    },    executionContextDestroyed: function(executionContextId)     {        this._runtimeModel._executionContextDestroyed(executionContextId);    },    executionContextsCleared: function()     {        this._runtimeModel._executionContextsCleared();    }}WebInspector.ExecutionContext = function(target, id, name, origin, isPageContext, frameId) {    WebInspector.SDKObject.call(this, target);    this.id = id;    this.name = name;    this.origin = origin;    this.isMainWorldContext = isPageContext;    this.runtimeModel = target.runtimeModel;    this.debuggerModel = WebInspector.DebuggerModel.fromTarget(target);    this.frameId = frameId;}WebInspector.ExecutionContext.comparator = function(a, b) {    function targetWeight(target)     {        if (target.isPage())            return 3;        if (target.isDedicatedWorker())            return 2;        return 1;    }    var weightDiff = targetWeight(a.target()) - targetWeight(b.target());    if (weightDiff)        return -weightDiff;    var frameIdDiff = String.hashCode(a.frameId) - String.hashCode(b.frameId);    if (frameIdDiff)        return frameIdDiff;    if (a.isMainWorldContext)        return -1;    if (b.isMainWorldContext)        return +1;    return a.name.localeCompare(b.name);}WebInspector.ExecutionContext.prototype = {    evaluate: function(expression, objectGroup, includeCommandLineAPI, doNotPauseOnExceptionsAndMuteConsole, returnByValue, generatePreview, callback)     {        if (this.debuggerModel.selectedCallFrame()) {            this.debuggerModel.evaluateOnSelectedCallFrame(expression, objectGroup, includeCommandLineAPI, doNotPauseOnExceptionsAndMuteConsole, returnByValue, generatePreview, callback);            return;        }        this._evaluateGlobal.apply(this, arguments);    },    globalObject: function(objectGroup, returnByValue, generatePreview, callback)     {        this._evaluateGlobal("this", objectGroup, false, true, returnByValue, generatePreview, callback);    },    _evaluateGlobal: function(expression, objectGroup, includeCommandLineAPI, doNotPauseOnExceptionsAndMuteConsole, returnByValue, generatePreview, callback)     {        if (!expression) {            expression = "this";        }        function evalCallback(error, result, wasThrown, exceptionDetails)         {            if (error) {                callback(null , false);                return;            }            if (returnByValue)                callback(null , !!wasThrown, wasThrown ? null  : result, exceptionDetails);            else                callback(this.runtimeModel.createRemoteObject(result), !!wasThrown, undefined, exceptionDetails);        }        this.target().runtimeAgent().evaluate(expression, objectGroup, includeCommandLineAPI, doNotPauseOnExceptionsAndMuteConsole, this.id, returnByValue, generatePreview, evalCallback.bind(this));    },    completionsForExpression: function(expressionString, prefix, force, completionsReadyCallback)     {        var lastIndex = expressionString.length - 1;        var dotNotation = (expressionString[lastIndex] === ".");        var bracketNotation = (expressionString[lastIndex] === "[");        if (dotNotation || bracketNotation)            expressionString = expressionString.substr(0, lastIndex);        if (expressionString && parseInt(expressionString, 10) == expressionString) {            completionsReadyCallback([]);            return;        }        if (!prefix && !expressionString && !force) {            completionsReadyCallback([]);            return;        }        if (!expressionString && this.debuggerModel.selectedCallFrame())            this.debuggerModel.selectedCallFrame().variableNames(receivedPropertyNames.bind(this));        else            this.evaluate(expressionString, "completion", true, true, false, false, evaluated.bind(this));        function evaluated(result, wasThrown)         {            if (!result || wasThrown) {                completionsReadyCallback([]);                return;            }            function getCompletions(type)             {                var object;                if (type === "string")                    object = new String("");                else if (type === "number")                    object = new Number(0);                else if (type === "boolean")                    object = new Boolean(false);                else                    object = this;                var resultSet = {};                for (var o = object; o; o = o.__proto__) {                    try {                        if (type === "array" && o === object && ArrayBuffer.isView(o) && o.length > 9999)                            continue;var names = Object.getOwnPropertyNames(o);                        for (var i = 0; i < names.length; ++i)                            resultSet[names[i]] = true;                    } catch (e) {}                }                return resultSet;            }            if (result.type === "object" || result.type === "function")                result.callFunctionJSON(getCompletions, [WebInspector.RemoteObject.toCallArgument(result.subtype)], receivedPropertyNames.bind(this));            else if (result.type === "string" || result.type === "number" || result.type === "boolean")                this.evaluate("(" + getCompletions + ")(\"" + result.type + "\")", "completion", false, true, true, false, receivedPropertyNamesFromEval.bind(this));        }        function receivedPropertyNamesFromEval(notRelevant, wasThrown, result)         {            if (result && !wasThrown)                receivedPropertyNames.call(this, result.value);            else                completionsReadyCallback([]);        }        function receivedPropertyNames(propertyNames)         {            this.target().runtimeAgent().releaseObjectGroup("completion");            if (!propertyNames) {                completionsReadyCallback([]);                return;            }            var includeCommandLineAPI = (!dotNotation && !bracketNotation);            if (includeCommandLineAPI) {                const commandLineAPI = ["dir", "dirxml", "keys", "values", "profile", "profileEnd", "monitorEvents", "unmonitorEvents", "inspect", "copy", "clear", "getEventListeners", "debug", "undebug", "monitor", "unmonitor", "table", "$", "$$", "$x"];                for (var i = 0; i < commandLineAPI.length; ++i)                    propertyNames[commandLineAPI[i]] = true;            }            this._reportCompletions(completionsReadyCallback, dotNotation, bracketNotation, expressionString, prefix, Object.keys(propertyNames));        }    },    _reportCompletions: function(completionsReadyCallback, dotNotation, bracketNotation, expressionString, prefix, properties) {        if (bracketNotation) {            if (prefix.length && prefix[0] === "'")                var quoteUsed = "'";            else                var quoteUsed = "\"";        }        var results = [];        if (!expressionString) {            const keywords = ["break", "case", "catch", "continue", "default", "delete", "do", "else", "finally", "for", "function", "if", "in", "instanceof", "new", "return", "switch", "this", "throw", "try", "typeof", "var", "void", "while", "with"];            properties = properties.concat(keywords);        }        properties.sort();        for (var i = 0; i < properties.length; ++i) {            var property = properties[i];            if (dotNotation && !/^[a-zA-Z_$\u008F-\uFFFF][a-zA-Z0-9_$\u008F-\uFFFF]*$/.test(property))                continue;if (bracketNotation) {                if (!/^[0-9]+$/.test(property))                    property = quoteUsed + property.escapeCharacters(quoteUsed + "\\") + quoteUsed;                property += "]";            }            if (property.length < prefix.length)                continue;if (prefix.length && !property.startsWith(prefix))                continue;results.push(property.split("\n").join("\\n"));        }        completionsReadyCallback(results);    },    __proto__: WebInspector.SDKObject.prototype}WebInspector.EventListener = function(debuggerModel, payload, objectId) {    WebInspector.SDKObject.call(this, debuggerModel.target());    this._type = payload.type;    this._useCapture = payload.useCapture;    this._location = WebInspector.DebuggerModel.Location.fromPayload(debuggerModel, payload.location);    this._handler = payload.handler ? this.target().runtimeModel.createRemoteObject(payload.handler) : null ;    var script = debuggerModel.scriptForId(payload.location.scriptId);    this._sourceName = script ? script.contentURL() : "";    this._objectId = objectId;}WebInspector.EventListener.prototype = {    type: function()     {        return this._type;    },    useCapture: function()     {        return this._useCapture;    },    location: function()     {        return this._location;    },    handler: function()     {        return this._handler;    },    sourceName: function()     {        return this._sourceName;    },    objectId: function()     {        return this._objectId;    },    __proto__: WebInspector.SDKObject.prototype};WebInspector.Script = function(debuggerModel, scriptId, sourceURL, startLine, startColumn, endLine, endColumn, isContentScript, isInternalScript, sourceMapURL, hasSourceURL) {    WebInspector.SDKObject.call(this, debuggerModel.target());    this.debuggerModel = debuggerModel;    this.scriptId = scriptId;    this.sourceURL = sourceURL;    this.lineOffset = startLine;    this.columnOffset = startColumn;    this.endLine = endLine;    this.endColumn = endColumn;    this._isContentScript = isContentScript;    this._isInternalScript = isInternalScript;    this.sourceMapURL = sourceMapURL;    this.hasSourceURL = hasSourceURL;}WebInspector.Script.Events = {    ScriptEdited: "ScriptEdited",    SourceMapURLAdded: "SourceMapURLAdded",}WebInspector.Script.sourceURLRegex = /\n[\040\t]*\/\/[@#]\ssourceURL=\s*(\S*?)\s*$/mg;WebInspector.Script._trimSourceURLComment = function(source) {    return source.replace(WebInspector.Script.sourceURLRegex, "");}WebInspector.Script.prototype = {    isContentScript: function()     {        return this._isContentScript;    },    isInternalScript: function()     {        return this._isInternalScript;    },    contentURL: function()     {        return this.sourceURL;    },    contentType: function()     {        return WebInspector.resourceTypes.Script;    },    requestContent: function(callback)     {        if (this._source) {            callback(this._source);            return;        }        function didGetScriptSource(error, source)         {            this._source = WebInspector.Script._trimSourceURLComment(error ? "" : source);            callback(this._source);        }        if (this.scriptId) {            this.target().debuggerAgent().getScriptSource(this.scriptId, didGetScriptSource.bind(this));        } else            callback("");    },    searchInContent: function(query, caseSensitive, isRegex, callback)     {        function innerCallback(error, searchMatches)         {            if (error) {                console.error(error);                callback([]);                return;            }            var result = [];            for (var i = 0; i < searchMatches.length; ++i) {                var searchMatch = new WebInspector.ContentProvider.SearchMatch(searchMatches[i].lineNumber,searchMatches[i].lineContent);                result.push(searchMatch);            }            callback(result || []);        }        if (this.scriptId) {            this.target().debuggerAgent().searchInContent(this.scriptId, query, caseSensitive, isRegex, innerCallback);        } else {            callback([]);        }    },    _appendSourceURLCommentIfNeeded: function(source)     {        if (!this.hasSourceURL)            return source;        return source + "\n //# sourceURL=" + this.sourceURL;    },    editSource: function(newSource, callback)     {        function didEditScriptSource(error, errorData, callFrames, debugData, asyncStackTrace)         {            if (!error)                this._source = newSource;            var needsStepIn = !!debugData && debugData["stack_update_needs_step_in"] === true;            callback(error, errorData, callFrames, asyncStackTrace, needsStepIn);            if (!error)                this.dispatchEventToListeners(WebInspector.Script.Events.ScriptEdited, newSource);        }        newSource = WebInspector.Script._trimSourceURLComment(newSource);        newSource = this._appendSourceURLCommentIfNeeded(newSource);        if (this.scriptId)            this.target().debuggerAgent().setScriptSource(this.scriptId, newSource, undefined, didEditScriptSource.bind(this));        else            callback("Script failed to parse");    },    rawLocation: function(lineNumber, columnNumber)     {        return new WebInspector.DebuggerModel.Location(this.debuggerModel,this.scriptId,lineNumber,columnNumber || 0);    },    isInlineScript: function()     {        var startsAtZero = !this.lineOffset && !this.columnOffset;        return !!this.sourceURL && !startsAtZero;    },    addSourceMapURL: function(sourceMapURL)     {        if (this.sourceMapURL)            return;        this.sourceMapURL = sourceMapURL;        this.dispatchEventToListeners(WebInspector.Script.Events.SourceMapURLAdded, this.sourceMapURL);    },    isAnonymousScript: function()     {        return !this.sourceURL;    },    isInlineScriptWithSourceURL: function()     {        return !!this.hasSourceURL && this.isInlineScript();    },    __proto__: WebInspector.SDKObject.prototype};WebInspector.ServiceWorkerCacheModel = function(target) {    WebInspector.SDKModel.call(this, WebInspector.ServiceWorkerCacheModel, target);    this._caches = new Map();    this._agent = target.cacheStorageAgent();    this._enabled = false;}WebInspector.ServiceWorkerCacheModel.EventTypes = {    CacheAdded: "CacheAdded",    CacheRemoved: "CacheRemoved"}WebInspector.ServiceWorkerCacheModel.prototype = {    enable: function()     {        if (this._enabled)            return;        this.target().resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.SecurityOriginAdded, this._securityOriginAdded, this);        this.target().resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.SecurityOriginRemoved, this._securityOriginRemoved, this);        var securityOrigins = this.target().resourceTreeModel.securityOrigins();        for (var i = 0; i < securityOrigins.length; ++i)            this._addOrigin(securityOrigins[i]);        this._enabled = true;    },    refreshCacheNames: function()     {        var securityOrigins = this.target().resourceTreeModel.securityOrigins();        for (var securityOrigin of securityOrigins)            this._loadCacheNames(securityOrigin);    },    deleteCache: function(cache)     {        function callback(error)         {            if (error) {                console.error("ServiceWorkerCacheAgent error deleting cache ", cache.toString(), ": ", error);                return;            }            this._caches.delete(cache.cacheId);            this._cacheRemoved(cache);        }        this._agent.deleteCache(cache.cacheId, callback.bind(this));    },    deleteCacheEntry: function(cache, request, callback)     {        function myCallback(error)         {            if (error) {                WebInspector.console.error(WebInspector.UIString("ServiceWorkerCacheAgent error deleting cache entry %s in cache: %s", cache.toString(), error));                return;            }            callback();        }        this._agent.deleteEntry(cache.cacheId, request, myCallback);    },    loadCacheData: function(cache, skipCount, pageSize, callback)     {        this._requestEntries(cache, skipCount, pageSize, callback);    },    caches: function()     {        var caches = new Array();        for (var cache of this._caches.values())            caches.push(cache);        return caches;    },    dispose: function()     {        for (var cache of this._caches.values())            this._cacheRemoved(cache);        this._caches.clear();        if (this._enabled) {            this.target().resourceTreeModel.removeEventListener(WebInspector.ResourceTreeModel.EventTypes.SecurityOriginAdded, this._securityOriginAdded, this);            this.target().resourceTreeModel.removeEventListener(WebInspector.ResourceTreeModel.EventTypes.SecurityOriginRemoved, this._securityOriginRemoved, this);        }    },    _addOrigin: function(securityOrigin)     {        this._loadCacheNames(securityOrigin);    },    _removeOrigin: function(securityOrigin)     {        for (var opaqueId of this._caches.keys()) {            var cache = this._caches.get(opaqueId);            if (cache.securityOrigin == securityOrigin) {                this._caches.delete(opaqueId);                this._cacheRemoved(cache);            }        }    },    _loadCacheNames: function(securityOrigin)     {        function callback(error, caches)         {            if (error) {                console.error("ServiceWorkerCacheAgent error while loading caches: ", error);                return;            }            this._updateCacheNames(securityOrigin, caches);        }        this._agent.requestCacheNames(securityOrigin, callback.bind(this));    },    _updateCacheNames: function(securityOrigin, cachesJson)     {        function deleteAndSaveOldCaches(cache)         {            if (cache.securityOrigin == securityOrigin && !updatingCachesIds.has(cache.cacheId)) {                oldCaches.set(cache.cacheId, cache);                this._caches.delete(cache.cacheId);            }        }        var updatingCachesIds = new Set();        var newCaches = new Map();        var oldCaches = new Map();        for (var cacheJson of cachesJson) {            var cache = new WebInspector.ServiceWorkerCacheModel.Cache(cacheJson.securityOrigin,cacheJson.cacheName,cacheJson.cacheId);            updatingCachesIds.add(cache.cacheId);            if (this._caches.has(cache.cacheId))                continue;newCaches.set(cache.cacheId, cache);            this._caches.set(cache.cacheId, cache);        }        this._caches.forEach(deleteAndSaveOldCaches, this);        newCaches.forEach(this._cacheAdded, this);        oldCaches.forEach(this._cacheRemoved, this);    },    _securityOriginAdded: function(event)     {        var securityOrigin = (event.data);        this._addOrigin(securityOrigin);    },    _securityOriginRemoved: function(event)     {        var securityOrigin = (event.data);        this._removeOrigin(securityOrigin);    },    _cacheAdded: function(cache)     {        this.dispatchEventToListeners(WebInspector.ServiceWorkerCacheModel.EventTypes.CacheAdded, cache);    },    _cacheRemoved: function(cache)     {        this.dispatchEventToListeners(WebInspector.ServiceWorkerCacheModel.EventTypes.CacheRemoved, cache);    },    _requestEntries: function(cache, skipCount, pageSize, callback)     {        function innerCallback(error, dataEntries, hasMore)         {            if (error) {                console.error("ServiceWorkerCacheAgent error while requesting entries: ", error);                return;            }            var entries = [];            for (var i = 0; i < dataEntries.length; ++i) {                entries.push(new WebInspector.ServiceWorkerCacheModel.Entry(dataEntries[i].request,dataEntries[i].response));            }            callback(entries, hasMore);        }        this._agent.requestEntries(cache.cacheId, skipCount, pageSize, innerCallback);    },    __proto__: WebInspector.SDKModel.prototype}WebInspector.ServiceWorkerCacheModel.Entry = function(request, response) {    this.request = request;    this.response = response;}WebInspector.ServiceWorkerCacheModel.Cache = function(securityOrigin, cacheName, cacheId) {    this.securityOrigin = securityOrigin;    this.cacheName = cacheName;    this.cacheId = cacheId;}WebInspector.ServiceWorkerCacheModel.Cache.prototype = {    equals: function(cache)     {        return this.cacheId == cache.cacheId;    },    toString: function()     {        return this.securityOrigin + this.cacheName;    }}WebInspector.ServiceWorkerCacheModel._symbol = Symbol("CacheStorageModel");WebInspector.ServiceWorkerCacheModel.fromTarget = function(target) {    if (!target[WebInspector.ServiceWorkerCacheModel._symbol])        target[WebInspector.ServiceWorkerCacheModel._symbol] = new WebInspector.ServiceWorkerCacheModel(target);    return target[WebInspector.ServiceWorkerCacheModel._symbol];};WebInspector.RemoteObject = function() {}WebInspector.RemoteObject.prototype = {    customPreview: function()     {        return null ;    },    get type()     {        throw "Not implemented";    },    get subtype()     {        throw "Not implemented";    },    get description()     {        throw "Not implemented";    },    get hasChildren()     {        throw "Not implemented";    },    arrayLength: function()     {        throw "Not implemented";    },    getOwnProperties: function(callback)     {        throw "Not implemented";    },    getAllProperties: function(accessorPropertiesOnly, callback)     {        throw "Not implemented";    },    eventListeners: function()     {        throw "Not implemented";    },    deleteProperty: function(name, callback)     {        throw "Not implemented";    },    callFunction: function(functionDeclaration, args, callback)     {        throw "Not implemented";    },    callFunctionJSON: function(functionDeclaration, args, callback)     {        throw "Not implemented";    },    target: function()     {        throw new Error("Target-less object");    },    debuggerModel: function()     {        throw new Error("DebuggerModel-less object");    },    isNode: function()     {        return false;    },    functionDetails: function(callback)     {        callback(null );    },    generatorObjectDetails: function(callback)     {        callback(null );    },    collectionEntries: function(callback)     {        callback(null );    }}WebInspector.RemoteObject.fromLocalObject = function(value) {    return new WebInspector.LocalJSONObject(value);}WebInspector.RemoteObject.type = function(remoteObject) {    if (remoteObject === null )        return "null";    var type = typeof remoteObject;    if (type !== "object" && type !== "function")        return type;    return remoteObject.type;}WebInspector.RemoteObject.arrayLength = function(object) {    if (object.subtype !== "array")        return 0;    var matches = object.description.match(/\[([0-9]+)\]/);    if (!matches)        return 0;    return parseInt(matches[1], 10);}WebInspector.RemoteObject.toCallArgument = function(object) {    var type = typeof object;    var value = object;    var objectId = undefined;    var description = String(object);    if (type === "number" && value === 0 && 1 / value < 0)        description = "-0";    switch (type) {    case "number":    case "string":    case "boolean":    case "undefined":        break;    default:        if (object) {            type = object.type;            value = object.value;            objectId = object.objectId;            description = object.description;        }        break;    }    if (type === "number") {        switch (description) {        case "NaN":        case "Infinity":        case "-Infinity":        case "-0":            value = description;            break;        }    }    return {        value: value,        objectId: objectId,        type: (type)    };}WebInspector.RemoteObjectImpl = function(target, objectId, type, subtype, value, description, preview, customPreview) {    WebInspector.RemoteObject.call(this);    this._target = target;    this._runtimeAgent = target.runtimeAgent();    this._debuggerModel = WebInspector.DebuggerModel.fromTarget(target);    this._type = type;    this._subtype = subtype;    if (objectId) {        this._objectId = objectId;        this._description = description;        this._hasChildren = (type !== "symbol");        this._preview = preview;    } else {        this._description = description || (value + "");        this._hasChildren = false;        if (type === "number" && typeof value !== "number")            this.value = Number(value);        else            this.value = value;    }    this._customPreview = customPreview || null ;}WebInspector.RemoteObjectImpl.prototype = {    customPreview: function()     {        return this._customPreview;    },    get objectId()     {        return this._objectId;    },    get type()     {        return this._type;    },    get subtype()     {        return this._subtype;    },    get description()     {        return this._description;    },    get hasChildren()     {        return this._hasChildren;    },    get preview()     {        return this._preview;    },    getOwnProperties: function(callback)     {        this.doGetProperties(true, false, false, callback);    },    getAllProperties: function(accessorPropertiesOnly, callback)     {        this.doGetProperties(false, accessorPropertiesOnly, false, callback);    },    eventListeners: function()     {        return new Promise(eventListeners.bind(this));        function eventListeners(fulfill, reject)         {            if (!this._objectId) {                reject(null );                return;            }            this.target().domdebuggerAgent().getEventListeners(this._objectId, mycallback.bind(this));            function mycallback(error, payloads)             {                if (error) {                    reject(null );                    return;                }                fulfill(payloads.map(createEventListener.bind(this)));            }            function createEventListener(payload)             {                return new WebInspector.EventListener(this._debuggerModel,payload,this._objectId);            }        }    },    getProperty: function(propertyPath, callback)     {        function remoteFunction(arrayStr)         {            var result = this;            var properties = JSON.parse(arrayStr);            for (var i = 0, n = properties.length; i < n; ++i)                result = result[properties[i]];            return result;        }        var args = [{            value: JSON.stringify(propertyPath)        }];        this.callFunction(remoteFunction, args, callback);    },    doGetProperties: function(ownProperties, accessorPropertiesOnly, generatePreview, callback)     {        if (!this._objectId) {            callback(null , null );            return;        }        function remoteObjectBinder(error, properties, internalProperties, exceptionDetails)         {            if (error) {                callback(null , null );                return;            }            if (exceptionDetails) {                var msg = new WebInspector.ConsoleMessage(this._target,WebInspector.ConsoleMessage.MessageSource.JS,WebInspector.ConsoleMessage.MessageLevel.Error,exceptionDetails.text);                this._target.consoleModel.addMessage(msg);                callback(null , null );                return;            }            var result = [];            for (var i = 0; properties && i < properties.length; ++i) {                var property = properties[i];                var propertyValue = property.value ? this._target.runtimeModel.createRemoteObject(property.value) : null ;                var propertySymbol = property.symbol ? this._target.runtimeModel.createRemoteObject(property.symbol) : null ;                var remoteProperty = new WebInspector.RemoteObjectProperty(property.name,propertyValue,!!property.enumerable,!!property.writable,!!property.isOwn,!!property.wasThrown,propertySymbol);                if (typeof property.value === "undefined") {                    if (property.get && property.get.type !== "undefined")                        remoteProperty.getter = this._target.runtimeModel.createRemoteObject(property.get);                    if (property.set && property.set.type !== "undefined")                        remoteProperty.setter = this._target.runtimeModel.createRemoteObject(property.set);                }                result.push(remoteProperty);            }            var internalPropertiesResult = null ;            if (internalProperties) {                internalPropertiesResult = [];                for (var i = 0; i < internalProperties.length; i++) {                    var property = internalProperties[i];                    if (!property.value)                        continue;var propertyValue = this._target.runtimeModel.createRemoteObject(property.value);                    internalPropertiesResult.push(new WebInspector.RemoteObjectProperty(property.name,propertyValue,true,false));                }            }            callback(result, internalPropertiesResult);        }        this._runtimeAgent.getProperties(this._objectId, ownProperties, accessorPropertiesOnly, generatePreview, remoteObjectBinder.bind(this));    },    setPropertyValue: function(name, value, callback)     {        if (!this._objectId) {            callback("Can't set a property of non-object.");            return;        }        this._runtimeAgent.invoke_evaluate({            expression: value,            doNotPauseOnExceptionsAndMuteConsole: true        }, evaluatedCallback.bind(this));        function evaluatedCallback(error, result, wasThrown)         {            if (error || wasThrown) {                callback(error || result.description);                return;            }            if (typeof name === "string")                name = WebInspector.RemoteObject.toCallArgument(name);            this.doSetObjectPropertyValue(result, name, callback);            if (result.objectId)                this._runtimeAgent.releaseObject(result.objectId);        }    },    doSetObjectPropertyValue: function(result, name, callback)     {        var setPropertyValueFunction = "function(a, b) { this[a] = b; }";        var argv = [name, WebInspector.RemoteObject.toCallArgument(result)];        this._runtimeAgent.callFunctionOn(this._objectId, setPropertyValueFunction, argv, true, undefined, undefined, propertySetCallback);        function propertySetCallback(error, result, wasThrown)         {            if (error || wasThrown) {                callback(error || result.description);                return;            }            callback();        }    },    deleteProperty: function(name, callback)     {        if (!this._objectId) {            callback("Can't delete a property of non-object.");            return;        }        var deletePropertyFunction = "function(a) { delete this[a]; return !(a in this); }";        this._runtimeAgent.callFunctionOn(this._objectId, deletePropertyFunction, [name], true, undefined, undefined, deletePropertyCallback);        function deletePropertyCallback(error, result, wasThrown)         {            if (error || wasThrown) {                callback(error || result.description);                return;            }            if (!result.value)                callback("Failed to delete property.");            else                callback();        }    },    callFunction: function(functionDeclaration, args, callback)     {        function mycallback(error, result, wasThrown)         {            if (!callback)                return;            if (error)                callback(null , false);            else                callback(this.target().runtimeModel.createRemoteObject(result), wasThrown);        }        this._runtimeAgent.callFunctionOn(this._objectId, functionDeclaration.toString(), args, true, undefined, undefined, mycallback.bind(this));    },    callFunctionJSON: function(functionDeclaration, args, callback)     {        function mycallback(error, result, wasThrown)         {            callback((error || wasThrown) ? null  : result.value);        }        this._runtimeAgent.callFunctionOn(this._objectId, functionDeclaration.toString(), args, true, true, false, mycallback);    },    release: function()     {        if (!this._objectId)            return;        this._runtimeAgent.releaseObject(this._objectId);    },    arrayLength: function()     {        return WebInspector.RemoteObject.arrayLength(this);    },    target: function()     {        return this._target;    },    debuggerModel: function()     {        return this._debuggerModel;    },    isNode: function()     {        return !!this._objectId && this.type === "object" && this.subtype === "node";    },    functionDetails: function(callback)     {        this._debuggerModel.functionDetails(this, callback);    },    generatorObjectDetails: function(callback)     {        this._debuggerModel.generatorObjectDetails(this, callback);    },    collectionEntries: function(callback)     {        if (!this._objectId) {            callback(null );            return;        }        this._debuggerModel.getCollectionEntries(this._objectId, callback);    },    __proto__: WebInspector.RemoteObject.prototype};WebInspector.RemoteObject.loadFromObjectPerProto = function(object, callback) {    var savedOwnProperties;    var savedAccessorProperties;    var savedInternalProperties;    var resultCounter = 2;    function processCallback()     {        if (--resultCounter)            return;        if (savedOwnProperties && savedAccessorProperties) {            var combinedList = savedAccessorProperties.slice(0);            for (var i = 0; i < savedOwnProperties.length; i++) {                var property = savedOwnProperties[i];                if (!property.isAccessorProperty())                    combinedList.push(property);            }            return callback(combinedList, savedInternalProperties ? savedInternalProperties : null );        } else {            callback(null , null );        }    }    function allAccessorPropertiesCallback(properties, internalProperties)     {        savedAccessorProperties = properties;        processCallback();    }    function ownPropertiesCallback(properties, internalProperties)     {        savedOwnProperties = properties;        savedInternalProperties = internalProperties;        processCallback();    }    object.getAllProperties(true, allAccessorPropertiesCallback);    object.getOwnProperties(ownPropertiesCallback);};WebInspector.ScopeRemoteObject = function(target, objectId, scopeRef, type, subtype, value, description, preview) {    WebInspector.RemoteObjectImpl.call(this, target, objectId, type, subtype, value, description, preview);    this._scopeRef = scopeRef;    this._savedScopeProperties = undefined;};WebInspector.ScopeRemoteObject.prototype = {    doGetProperties: function(ownProperties, accessorPropertiesOnly, generatePreview, callback)     {        if (accessorPropertiesOnly) {            callback([], []);            return;        }        if (this._savedScopeProperties) {            callback(this._savedScopeProperties.slice(), []);            return;        }        function wrappedCallback(properties, internalProperties)         {            if (this._scopeRef && Array.isArray(properties))                this._savedScopeProperties = properties.slice();            callback(properties, internalProperties);        }        generatePreview = true;        WebInspector.RemoteObjectImpl.prototype.doGetProperties.call(this, ownProperties, accessorPropertiesOnly, generatePreview, wrappedCallback.bind(this));    },    doSetObjectPropertyValue: function(result, name, callback)     {        this._debuggerModel.setVariableValue(this._scopeRef.number, (name.value), WebInspector.RemoteObject.toCallArgument(result), this._scopeRef.callFrameId, this._scopeRef.functionId, setVariableValueCallback.bind(this));        function setVariableValueCallback(error)         {            if (error) {                callback(error);                return;            }            if (this._savedScopeProperties) {                for (var i = 0; i < this._savedScopeProperties.length; i++) {                    if (this._savedScopeProperties[i].name === name)                        this._savedScopeProperties[i].value = this._target.runtimeModel.createRemoteObject(result);                }            }            callback();        }    },    __proto__: WebInspector.RemoteObjectImpl.prototype};WebInspector.ScopeRef = function(number, callFrameId, functionId) {    this.number = number;    this.callFrameId = callFrameId;    this.functionId = functionId;}WebInspector.RemoteObjectProperty = function(name, value, enumerable, writable, isOwn, wasThrown, symbol) {    this.name = name;    if (value !== null )        this.value = value;    this.enumerable = typeof enumerable !== "undefined" ? enumerable : true;    this.writable = typeof writable !== "undefined" ? writable : true;    this.isOwn = !!isOwn;    this.wasThrown = !!wasThrown;    if (symbol)        this.symbol = symbol;}WebInspector.RemoteObjectProperty.prototype = {    isAccessorProperty: function()     {        return !!(this.getter || this.setter);    }};WebInspector.LocalJSONObject = function(value) {    WebInspector.RemoteObject.call(this);    this._value = value;}WebInspector.LocalJSONObject.prototype = {    get description()     {        if (this._cachedDescription)            return this._cachedDescription;        function formatArrayItem(property)         {            return this._formatValue(property.value);        }        function formatObjectItem(property)         {            var name = property.name;            if (/^\s|\s$|^$|\n/.test(name))                name = "\"" + name.replace(/\n/g, "\u21B5") + "\"";            return name + ": " + this._formatValue(property.value);        }        if (this.type === "object") {            switch (this.subtype) {            case "array":                this._cachedDescription = this._concatenate("[", "]", formatArrayItem.bind(this));                break;            case "date":                this._cachedDescription = "" + this._value;                break;            case "null":                this._cachedDescription = "null";                break;            default:                this._cachedDescription = this._concatenate("{", "}", formatObjectItem.bind(this));            }        } else {            this._cachedDescription = String(this._value);        }        return this._cachedDescription;    },    _formatValue: function(value)     {        if (!value)            return "undefined";        var description = value.description || "";        if (value.type === "string")            return "\"" + description.replace(/\n/g, "\u21B5") + "\"";        return description;    },    _concatenate: function(prefix, suffix, formatProperty)     {        var previewChars = 100;        var buffer = prefix;        var children = this._children();        for (var i = 0; i < children.length; ++i) {            var itemDescription = formatProperty(children[i]);            if (buffer.length + itemDescription.length > previewChars) {                buffer += ",\u2026";                break;            }            if (i)                buffer += ", ";            buffer += itemDescription;        }        buffer += suffix;        return buffer;    },    get type()     {        return typeof this._value;    },    get subtype()     {        if (this._value === null )            return "null";        if (Array.isArray(this._value))            return "array";        if (this._value instanceof Date)            return "date";        return undefined;    },    get hasChildren()     {        if ((typeof this._value !== "object") || (this._value === null ))            return false;        return !!Object.keys((this._value)).length;    },    getOwnProperties: function(callback)     {        callback(this._children(), null );    },    getAllProperties: function(accessorPropertiesOnly, callback)     {        if (accessorPropertiesOnly)            callback([], null );        else            callback(this._children(), null );    },    _children: function()     {        if (!this.hasChildren)            return [];        var value = (this._value);        function buildProperty(propName)         {            var propValue = value[propName];            if (!(propValue instanceof WebInspector.RemoteObject))                propValue = WebInspector.RemoteObject.fromLocalObject(propValue);            return new WebInspector.RemoteObjectProperty(propName,propValue);        }        if (!this._cachedChildren)            this._cachedChildren = Object.keys(value).map(buildProperty);        return this._cachedChildren;    },    isError: function()     {        return false;    },    arrayLength: function()     {        return Array.isArray(this._value) ? this._value.length : 0;    },    callFunction: function(functionDeclaration, args, callback)     {        var target = (this._value);        var rawArgs = args ? args.map(function(arg) {            return arg.value;        }        ) : [];        var result;        var wasThrown = false;        try {            result = functionDeclaration.apply(target, rawArgs);        } catch (e) {            wasThrown = true;        }        if (!callback)            return;        callback(WebInspector.RemoteObject.fromLocalObject(result), wasThrown);    },    callFunctionJSON: function(functionDeclaration, args, callback)     {        var target = (this._value);        var rawArgs = args ? args.map(function(arg) {            return arg.value;        }        ) : [];        var result;        try {            result = functionDeclaration.apply(target, rawArgs);        } catch (e) {            result = null ;        }        callback(result);    },    __proto__: WebInspector.RemoteObject.prototype}WebInspector.MapEntryLocalJSONObject = function(value) {    WebInspector.LocalJSONObject.call(this, value);}WebInspector.MapEntryLocalJSONObject.prototype = {    get description()     {        if (!this._cachedDescription) {            var children = this._children();            this._cachedDescription = "{" + this._formatValue(children[0].value) + " => " + this._formatValue(children[1].value) + "}";        }        return this._cachedDescription;    },    __proto__: WebInspector.LocalJSONObject.prototype};WebInspector.Resource = function(target, request, url, documentURL, frameId, loaderId, type, mimeType, isHidden) {    WebInspector.SDKObject.call(this, target);    this._request = request;    this.url = url;    this._documentURL = documentURL;    this._frameId = frameId;    this._loaderId = loaderId;    this._type = type || WebInspector.resourceTypes.Other;    this._mimeType = mimeType;    this._isHidden = isHidden;    this._content;    this._contentEncoded;    this._pendingContentCallbacks = [];    if (this._request && !this._request.finished)        this._request.addEventListener(WebInspector.NetworkRequest.Events.FinishedLoading, this._requestFinished, this);}WebInspector.Resource.Events = {    MessageAdded: "message-added",    MessagesCleared: "messages-cleared",}WebInspector.Resource.contentAsDataURL = function(content, mimeType, contentEncoded, charset) {    const maxDataUrlSize = 1024 * 1024;    if (content === null  || content.length > maxDataUrlSize)        return null ;    return "data:" + mimeType + (charset ? ";charset=" + charset : "") + (contentEncoded ? ";base64" : "") + "," + content;}WebInspector.Resource.populateImageSource = function(url, mimeType, contentProvider, image) {    function onResourceContent(content)     {        var imageSrc = WebInspector.Resource.contentAsDataURL(content, mimeType, true);        if (imageSrc === null )            imageSrc = url;        image.src = imageSrc;    }    contentProvider.requestContent(onResourceContent);}WebInspector.Resource.prototype = {    get request()     {        return this._request;    },    get url()     {        return this._url;    },    set url(x)     {        this._url = x;        this._parsedURL = new WebInspector.ParsedURL(x);    },    get parsedURL()     {        return this._parsedURL;    },    get documentURL()     {        return this._documentURL;    },    get frameId()     {        return this._frameId;    },    get loaderId()     {        return this._loaderId;    },    get displayName()     {        return this._parsedURL.displayName;    },    resourceType: function()     {        return this._request ? this._request.resourceType() : this._type;    },    get mimeType()     {        return this._request ? this._request.mimeType : this._mimeType;    },    get messages()     {        return this._messages || [];    },    addMessage: function(msg)     {        if (!msg.isErrorOrWarning() || !msg.messageText)            return;        if (!this._messages)            this._messages = [];        this._messages.push(msg);        this.dispatchEventToListeners(WebInspector.Resource.Events.MessageAdded, msg);    },    get errors()     {        return this._errors || 0;    },    set errors(x)     {        this._errors = x;    },    get warnings()     {        return this._warnings || 0;    },    set warnings(x)     {        this._warnings = x;    },    clearErrorsAndWarnings: function()     {        this._messages = [];        this._warnings = 0;        this._errors = 0;        this.dispatchEventToListeners(WebInspector.Resource.Events.MessagesCleared);    },    get content()     {        return this._content;    },    get contentEncoded()     {        return this._contentEncoded;    },    contentURL: function()     {        return this._url;    },    contentType: function()     {        return this.resourceType();    },    requestContent: function(callback)     {        if (typeof this._content !== "undefined") {            callback(this._content);            return;        }        this._pendingContentCallbacks.push(callback);        if (!this._request || this._request.finished)            this._innerRequestContent();    },    canonicalMimeType: function()     {        return this.resourceType().canonicalMimeType() || this.mimeType;    },    searchInContent: function(query, caseSensitive, isRegex, callback)     {        function callbackWrapper(error, searchMatches)         {            callback(searchMatches || []);        }        if (this.resourceType() === WebInspector.resourceTypes.Document) {            callback([]);            return;        }        if (this.frameId)            this.target().pageAgent().searchInResource(this.frameId, this.url, query, caseSensitive, isRegex, callbackWrapper);        else            callback([]);    },    populateImageSource: function(image)     {        WebInspector.Resource.populateImageSource(this._url, this._mimeType, this, image);    },    _requestFinished: function()     {        this._request.removeEventListener(WebInspector.NetworkRequest.Events.FinishedLoading, this._requestFinished, this);        if (this._pendingContentCallbacks.length)            this._innerRequestContent();    },    _innerRequestContent: function()     {        if (this._contentRequested)            return;        this._contentRequested = true;        function contentLoaded(error, content, contentEncoded)         {            if (error || content === null ) {                replyWithContent.call(this, null , false);                return;            }            replyWithContent.call(this, content, contentEncoded);        }        function replyWithContent(content, contentEncoded)         {            this._content = content;            this._contentEncoded = contentEncoded;            var callbacks = this._pendingContentCallbacks.slice();            for (var i = 0; i < callbacks.length; ++i)                callbacks[i](this._content);            this._pendingContentCallbacks.length = 0;            delete this._contentRequested;        }        function resourceContentLoaded(error, content, contentEncoded)         {            contentLoaded.call(this, error, content, contentEncoded);        }        if (this.request) {            this.request.requestContent(requestContentLoaded.bind(this));            return;        }        function requestContentLoaded(content)         {            contentLoaded.call(this, null , content, this.request.contentEncoded);        }        this.target().pageAgent().getResourceContent(this.frameId, this.url, resourceContentLoaded.bind(this));    },    isHidden: function()     {        return !!this._isHidden;    },    hasTextContent: function()     {        if (this._type.isTextType())            return true;        if (this._type === WebInspector.resourceTypes.Other)            return !!this._content && !this._contentEncoded;        return false;    },    __proto__: WebInspector.SDKObject.prototype};WebInspector.ResourceTreeModel = function(target) {    WebInspector.SDKModel.call(this, WebInspector.ResourceTreeModel, target);    target.networkManager.addEventListener(WebInspector.NetworkManager.EventTypes.RequestFinished, this._onRequestFinished, this);    target.networkManager.addEventListener(WebInspector.NetworkManager.EventTypes.RequestUpdateDropped, this._onRequestUpdateDropped, this);    target.consoleModel.addEventListener(WebInspector.ConsoleModel.Events.MessageAdded, this._consoleMessageAdded, this);    target.consoleModel.addEventListener(WebInspector.ConsoleModel.Events.ConsoleCleared, this._consoleCleared, this);    this._agent = target.pageAgent();    this._agent.enable();    this._fetchResourceTree();    target.registerPageDispatcher(new WebInspector.PageDispatcher(this));    this._pendingConsoleMessages = {};    this._securityOriginFrameCount = {};    this._inspectedPageURL = "";}WebInspector.ResourceTreeModel.EventTypes = {    FrameAdded: "FrameAdded",    FrameNavigated: "FrameNavigated",    FrameDetached: "FrameDetached",    FrameResized: "FrameResized",    MainFrameNavigated: "MainFrameNavigated",    ResourceAdded: "ResourceAdded",    WillLoadCachedResources: "WillLoadCachedResources",    CachedResourcesLoaded: "CachedResourcesLoaded",    DOMContentLoaded: "DOMContentLoaded",    Load: "Load",    WillReloadPage: "WillReloadPage",    InspectedURLChanged: "InspectedURLChanged",    SecurityOriginAdded: "SecurityOriginAdded",    SecurityOriginRemoved: "SecurityOriginRemoved",    ScreencastFrame: "ScreencastFrame",    ScreencastVisibilityChanged: "ScreencastVisibilityChanged",    ColorPicked: "ColorPicked"}WebInspector.ResourceTreeModel.frames = function() {    var result = [];    for (var target of WebInspector.targetManager.targets())        result = result.concat(Object.values(target.resourceTreeModel._frames));    return result;}WebInspector.ResourceTreeModel.resourceForURL = function(url) {    for (var target of WebInspector.targetManager.targets()) {        var mainFrame = target.resourceTreeModel.mainFrame;        var result = mainFrame ? mainFrame.resourceForURL(url) : null ;        if (result)            return result;    }    return null ;}WebInspector.ResourceTreeModel.prototype = {    _fetchResourceTree: function()     {        this._frames = {};        this._cachedResourcesProcessed = false;        this._agent.getResourceTree(this._processCachedResources.bind(this));    },    _processCachedResources: function(error, mainFramePayload)     {        if (error) {            if (this.target().isPage() || this.target().isServiceWorker())                console.error(JSON.stringify(error));            this._cachedResourcesProcessed = true;            return;        }        this.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.WillLoadCachedResources);        this._inspectedPageURL = mainFramePayload.frame.url;        if (this.target().isPage())            this._addFramesRecursively(null , mainFramePayload);        else            this._addSecurityOrigin(mainFramePayload.frame.securityOrigin);        this._dispatchInspectedURLChanged();        this._cachedResourcesProcessed = true;        this.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.CachedResourcesLoaded);    },    inspectedPageURL: function()     {        return this._inspectedPageURL;    },    inspectedPageDomain: function()     {        var parsedURL = this._inspectedPageURL ? this._inspectedPageURL.asParsedURL() : null ;        return parsedURL ? parsedURL.host : "";    },    cachedResourcesLoaded: function()     {        return this._cachedResourcesProcessed;    },    _dispatchInspectedURLChanged: function()     {        InspectorFrontendHost.inspectedURLChanged(this._inspectedPageURL);        this.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.InspectedURLChanged, this._inspectedPageURL);    },    _addFrame: function(frame, aboutToNavigate)     {        this._frames[frame.id] = frame;        if (frame.isMainFrame())            this.mainFrame = frame;        this.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.FrameAdded, frame);        if (!aboutToNavigate)            this._addSecurityOrigin(frame.securityOrigin);    },    _addSecurityOrigin: function(securityOrigin)     {        if (!this._securityOriginFrameCount[securityOrigin]) {            this._securityOriginFrameCount[securityOrigin] = 1;            this.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.SecurityOriginAdded, securityOrigin);            return;        }        this._securityOriginFrameCount[securityOrigin] += 1;    },    _removeSecurityOrigin: function(securityOrigin)     {        if (typeof securityOrigin === "undefined")            return;        if (this._securityOriginFrameCount[securityOrigin] === 1) {            delete this._securityOriginFrameCount[securityOrigin];            this.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.SecurityOriginRemoved, securityOrigin);            return;        }        this._securityOriginFrameCount[securityOrigin] -= 1;    },    securityOrigins: function()     {        return Object.keys(this._securityOriginFrameCount);    },    _handleMainFrameDetached: function(mainFrame)     {        function removeOriginForFrame(frame)         {            for (var i = 0; i < frame.childFrames.length; ++i)                removeOriginForFrame.call(this, frame.childFrames[i]);            if (!frame.isMainFrame())                this._removeSecurityOrigin(frame.securityOrigin);        }        removeOriginForFrame.call(this, mainFrame);    },    _frameAttached: function(frameId, parentFrameId)     {        if (!this._cachedResourcesProcessed && parentFrameId)            return null ;        if (this._frames[frameId])            return null ;        var parentFrame = parentFrameId ? this._frames[parentFrameId] : null ;        var frame = new WebInspector.ResourceTreeFrame(this,parentFrame,frameId);        if (frame.isMainFrame() && this.mainFrame) {            this._handleMainFrameDetached(this.mainFrame);            this._frameDetached(this.mainFrame.id);        }        this._addFrame(frame, true);        return frame;    },    _frameNavigated: function(framePayload)     {        if (!this._cachedResourcesProcessed && framePayload.parentId)            return;        var frame = this._frames[framePayload.id];        if (!frame) {            console.assert(!framePayload.parentId, "Main frame shouldn't have parent frame id.");            frame = this._frameAttached(framePayload.id, framePayload.parentId || "");            console.assert(frame);        }        this._removeSecurityOrigin(frame.securityOrigin);        frame._navigate(framePayload);        var addedOrigin = frame.securityOrigin;        if (frame.isMainFrame())            this._inspectedPageURL = frame.url;        this.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.FrameNavigated, frame);        if (frame.isMainFrame())            this.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.MainFrameNavigated, frame);        if (addedOrigin)            this._addSecurityOrigin(addedOrigin);        var resources = frame.resources();        for (var i = 0; i < resources.length; ++i)            this.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.ResourceAdded, resources[i]);        if (frame.isMainFrame())            this._dispatchInspectedURLChanged();    },    _frameDetached: function(frameId)     {        if (!this._cachedResourcesProcessed)            return;        var frame = this._frames[frameId];        if (!frame)            return;        this._removeSecurityOrigin(frame.securityOrigin);        if (frame.parentFrame)            frame.parentFrame._removeChildFrame(frame);        else            frame._remove();    },    _onRequestFinished: function(event)     {        if (!this._cachedResourcesProcessed)            return;        var request = (event.data);        if (request.failed || request.resourceType() === WebInspector.resourceTypes.XHR)            return;        var frame = this._frames[request.frameId];        if (frame) {            var resource = frame._addRequest(request);            this._addPendingConsoleMessagesToResource(resource);        }    },    _onRequestUpdateDropped: function(event)     {        if (!this._cachedResourcesProcessed)            return;        var frameId = event.data.frameId;        var frame = this._frames[frameId];        if (!frame)            return;        var url = event.data.url;        if (frame._resourcesMap[url])            return;        var resource = new WebInspector.Resource(this.target(),null ,url,frame.url,frameId,event.data.loaderId,WebInspector.resourceTypes[event.data.resourceType],event.data.mimeType);        frame.addResource(resource);    },    frameForId: function(frameId)     {        return this._frames[frameId];    },    forAllResources: function(callback)     {        if (this.mainFrame)            return this.mainFrame._callForFrameResources(callback);        return false;    },    frames: function()     {        return Object.values(this._frames);    },    _consoleMessageAdded: function(event)     {        var msg = (event.data);        var resource = msg.url ? this.resourceForURL(msg.url) : null ;        if (resource)            this._addConsoleMessageToResource(msg, resource);        else            this._addPendingConsoleMessage(msg);    },    _addPendingConsoleMessage: function(msg)     {        if (!msg.url)            return;        if (!this._pendingConsoleMessages[msg.url])            this._pendingConsoleMessages[msg.url] = [];        this._pendingConsoleMessages[msg.url].push(msg);    },    _addPendingConsoleMessagesToResource: function(resource)     {        var messages = this._pendingConsoleMessages[resource.url];        if (messages) {            for (var i = 0; i < messages.length; i++)                this._addConsoleMessageToResource(messages[i], resource);            delete this._pendingConsoleMessages[resource.url];        }    },    _addConsoleMessageToResource: function(msg, resource)     {        switch (msg.level) {        case WebInspector.ConsoleMessage.MessageLevel.Warning:            resource.warnings++;            break;        case WebInspector.ConsoleMessage.MessageLevel.Error:            resource.errors++;            break;        }        resource.addMessage(msg);    },    _consoleCleared: function()     {        function callback(resource)         {            resource.clearErrorsAndWarnings();        }        this._pendingConsoleMessages = {};        this.forAllResources(callback);    },    resourceForURL: function(url)     {        return this.mainFrame ? this.mainFrame.resourceForURL(url) : null ;    },    _addFramesRecursively: function(parentFrame, frameTreePayload)     {        var framePayload = frameTreePayload.frame;        var frame = new WebInspector.ResourceTreeFrame(this,parentFrame,framePayload.id,framePayload);        this._addFrame(frame);        var frameResource = this._createResourceFromFramePayload(framePayload, framePayload.url, WebInspector.resourceTypes.Document, framePayload.mimeType);        if (frame.isMainFrame())            this._inspectedPageURL = frameResource.url;        frame.addResource(frameResource);        for (var i = 0; frameTreePayload.childFrames && i < frameTreePayload.childFrames.length; ++i)            this._addFramesRecursively(frame, frameTreePayload.childFrames[i]);        for (var i = 0; i < frameTreePayload.resources.length; ++i) {            var subresource = frameTreePayload.resources[i];            var resource = this._createResourceFromFramePayload(framePayload, subresource.url, WebInspector.resourceTypes[subresource.type], subresource.mimeType);            frame.addResource(resource);        }    },    _createResourceFromFramePayload: function(frame, url, type, mimeType)     {        return new WebInspector.Resource(this.target(),null ,url,frame.url,frame.id,frame.loaderId,type,mimeType);    },    reloadPage: function(ignoreCache, scriptToEvaluateOnLoad)     {        this.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.WillReloadPage);        this._agent.reload(ignoreCache, scriptToEvaluateOnLoad);    },    __proto__: WebInspector.SDKModel.prototype}WebInspector.ResourceTreeFrame = function(model, parentFrame, frameId, payload) {    this._model = model;    this._parentFrame = parentFrame;    this._id = frameId;    this._url = "";    if (payload) {        this._loaderId = payload.loaderId;        this._name = payload.name;        this._url = payload.url;        this._securityOrigin = payload.securityOrigin;        this._mimeType = payload.mimeType;    }    this._childFrames = [];    this._resourcesMap = {};    if (this._parentFrame)        this._parentFrame._childFrames.push(this);}WebInspector.ResourceTreeFrame.prototype = {    target: function()     {        return this._model.target();    },    get id()     {        return this._id;    },    get name()     {        return this._name || "";    },    get url()     {        return this._url;    },    get securityOrigin()     {        return this._securityOrigin;    },    get loaderId()     {        return this._loaderId;    },    get parentFrame()     {        return this._parentFrame;    },    get childFrames()     {        return this._childFrames;    },    isMainFrame: function()     {        return !this._parentFrame;    },    _navigate: function(framePayload)     {        this._loaderId = framePayload.loaderId;        this._name = framePayload.name;        this._url = framePayload.url;        this._securityOrigin = framePayload.securityOrigin;        this._mimeType = framePayload.mimeType;        var mainResource = this._resourcesMap[this._url];        this._resourcesMap = {};        this._removeChildFrames();        if (mainResource && mainResource.loaderId === this._loaderId)            this.addResource(mainResource);    },    get mainResource()     {        return this._resourcesMap[this._url];    },    _removeChildFrame: function(frame)     {        this._childFrames.remove(frame);        frame._remove();    },    _removeChildFrames: function()     {        var frames = this._childFrames;        this._childFrames = [];        for (var i = 0; i < frames.length; ++i)            frames[i]._remove();    },    _remove: function()     {        this._removeChildFrames();        delete this._model._frames[this.id];        this._model.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.FrameDetached, this);    },    addResource: function(resource)     {        if (this._resourcesMap[resource.url] === resource) {            return;        }        this._resourcesMap[resource.url] = resource;        this._model.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.ResourceAdded, resource);    },    _addRequest: function(request)     {        var resource = this._resourcesMap[request.url];        if (resource && resource.request === request) {            return resource;        }        resource = new WebInspector.Resource(this.target(),request,request.url,request.documentURL,request.frameId,request.loaderId,request.resourceType(),request.mimeType);        this._resourcesMap[resource.url] = resource;        this._model.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.ResourceAdded, resource);        return resource;    },    resources: function()     {        var result = [];        for (var url in this._resourcesMap)            result.push(this._resourcesMap[url]);        return result;    },    resourceForURL: function(url)     {        var result;        function filter(resource)         {            if (resource.url === url) {                result = resource;                return true;            }        }        this._callForFrameResources(filter);        return result || null ;    },    _callForFrameResources: function(callback)     {        for (var url in this._resourcesMap) {            if (callback(this._resourcesMap[url]))                return true;        }        for (var i = 0; i < this._childFrames.length; ++i) {            if (this._childFrames[i]._callForFrameResources(callback))                return true;        }        return false;    },    displayName: function()     {        if (!this._parentFrame)            return WebInspector.UIString("<top frame>");        var subtitle = new WebInspector.ParsedURL(this._url).displayName;        if (subtitle) {            if (!this._name)                return subtitle;            return this._name + "( " + subtitle + " )";        }        return WebInspector.UIString("<iframe>");    }}WebInspector.PageDispatcher = function(resourceTreeModel) {    this._resourceTreeModel = resourceTreeModel;}WebInspector.PageDispatcher.prototype = {    domContentEventFired: function(time)     {        this._resourceTreeModel.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.DOMContentLoaded, time);    },    loadEventFired: function(time)     {        this._resourceTreeModel.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.Load, time);    },    frameAttached: function(frameId, parentFrameId)     {        this._resourceTreeModel._frameAttached(frameId, parentFrameId);    },    frameNavigated: function(frame)     {        this._resourceTreeModel._frameNavigated(frame);    },    frameDetached: function(frameId)     {        this._resourceTreeModel._frameDetached(frameId);    },    frameStartedLoading: function(frameId)     {},    frameStoppedLoading: function(frameId)     {},    frameScheduledNavigation: function(frameId, delay)     {},    frameClearedScheduledNavigation: function(frameId)     {},    frameResized: function()     {        this._resourceTreeModel.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.FrameResized, null );    },    javascriptDialogOpening: function(message, dialogType)     {},    javascriptDialogClosed: function(result)     {},    screencastFrame: function(data, metadata, frameNumber)     {        this._resourceTreeModel.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.ScreencastFrame, {            data: data,            metadata: metadata,            frameNumber: frameNumber        });    },    screencastVisibilityChanged: function(visible)     {        this._resourceTreeModel.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.ScreencastVisibilityChanged, {            visible: visible        });    },    colorPicked: function(color)     {        this._resourceTreeModel.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.ColorPicked, color);    },    interstitialShown: function()     {},    interstitialHidden: function()     {}};function SourceMapV3() {    this.version;    this.file;    this.sources;    this.sections;    this.mappings;    this.sourceRoot;}SourceMapV3.Section = function() {    this.map;    this.offset;}SourceMapV3.Offset = function() {    this.line;    this.column;}WebInspector.SourceMap = function(sourceMappingURL, payload) {    if (!WebInspector.SourceMap.prototype._base64Map) {        const base64Digits = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";        WebInspector.SourceMap.prototype._base64Map = {};        for (var i = 0; i < base64Digits.length; ++i)            WebInspector.SourceMap.prototype._base64Map[base64Digits.charAt(i)] = i;    }    this._sourceMappingURL = sourceMappingURL;    this._reverseMappingsBySourceURL = {};    this._mappings = [];    this._sources = {};    this._sourceContentByURL = {};    this._parseMappingPayload(payload);}WebInspector.SourceMap.load = function(sourceMapURL, compiledURL, callback) {    var parsedURL = new WebInspector.ParsedURL(sourceMapURL);    if (parsedURL.isDataURL()) {        var xhr = new XMLHttpRequest();        xhr.open("GET", sourceMapURL, false);        xhr.send(null );        contentLoaded(xhr.status, {}, xhr.responseText);        return;    }    WebInspector.ResourceLoader.loadUsingTargetUA(sourceMapURL, null , contentLoaded);    function contentLoaded(statusCode, headers, content)     {        if (!content || statusCode >= 400) {            callback(null );            return;        }        if (content.slice(0, 3) === ")]}")            content = content.substring(content.indexOf('\n'));        try {            var payload = (JSON.parse(content));            var baseURL = sourceMapURL.startsWith("data:") ? compiledURL : sourceMapURL;            callback(new WebInspector.SourceMap(baseURL,payload));        } catch (e) {            console.error(e.message);            callback(null );        }    }}WebInspector.SourceMap.prototype = {    url: function()     {        return this._sourceMappingURL;    },    sources: function()     {        return Object.keys(this._sources);    },    sourceContent: function(sourceURL)     {        return this._sourceContentByURL[sourceURL];    },    sourceContentProvider: function(sourceURL, contentType)     {        var sourceContent = this.sourceContent(sourceURL);        if (sourceContent)            return new WebInspector.StaticContentProvider(contentType,sourceContent);        return new WebInspector.CompilerSourceMappingContentProvider(sourceURL,contentType);    },    _parseMappingPayload: function(mappingPayload)     {        if (mappingPayload.sections)            this._parseSections(mappingPayload.sections);        else            this._parseMap(mappingPayload, 0, 0);    },    _parseSections: function(sections)     {        for (var i = 0; i < sections.length; ++i) {            var section = sections[i];            this._parseMap(section.map, section.offset.line, section.offset.column);        }    },    findEntry: function(lineNumber, columnNumber)     {        var first = 0;        var count = this._mappings.length;        while (count > 1) {            var step = count >> 1;            var middle = first + step;            var mapping = this._mappings[middle];            if (lineNumber < mapping[0] || (lineNumber === mapping[0] && columnNumber < mapping[1]))                count = step;            else {                first = middle;                count -= step;            }        }        var entry = this._mappings[first];        if (!first && entry && (lineNumber < entry[0] || (lineNumber === entry[0] && columnNumber < entry[1])))            return null ;        return entry;    },    findEntryReversed: function(sourceURL, lineNumber, span)     {        var mappings = this._reverseMappingsBySourceURL[sourceURL];        if (!mappings)            return null ;        var maxLineNumber = typeof span === "number" ? Math.min(lineNumber + span + 1, mappings.length) : mappings.length;        for (; lineNumber < maxLineNumber; ++lineNumber) {            var mapping = mappings[lineNumber];            if (mapping)                return mapping;        }        return null ;    },    _parseMap: function(map, lineNumber, columnNumber)     {        var sourceIndex = 0;        var sourceLineNumber = 0;        var sourceColumnNumber = 0;        var nameIndex = 0;        var sources = [];        var originalToCanonicalURLMap = {};        for (var i = 0; i < map.sources.length; ++i) {            var originalSourceURL = map.sources[i];            var sourceRoot = map.sourceRoot || "";            if (sourceRoot && !sourceRoot.endsWith("/"))                sourceRoot += "/";            var href = sourceRoot + originalSourceURL;            var url = WebInspector.ParsedURL.completeURL(this._sourceMappingURL, href) || href;            originalToCanonicalURLMap[originalSourceURL] = url;            sources.push(url);            this._sources[url] = true;            if (map.sourcesContent && map.sourcesContent[i])                this._sourceContentByURL[url] = map.sourcesContent[i];        }        var stringCharIterator = new WebInspector.SourceMap.StringCharIterator(map.mappings);        var sourceURL = sources[sourceIndex];        while (true) {            if (stringCharIterator.peek() === ",")                stringCharIterator.next();            else {                while (stringCharIterator.peek() === ";") {                    lineNumber += 1;                    columnNumber = 0;                    stringCharIterator.next();                }                if (!stringCharIterator.hasNext())                    break;            }            columnNumber += this._decodeVLQ(stringCharIterator);            if (!stringCharIterator.hasNext() || this._isSeparator(stringCharIterator.peek())) {                this._mappings.push([lineNumber, columnNumber]);                continue;            }            var sourceIndexDelta = this._decodeVLQ(stringCharIterator);            if (sourceIndexDelta) {                sourceIndex += sourceIndexDelta;                sourceURL = sources[sourceIndex];            }            sourceLineNumber += this._decodeVLQ(stringCharIterator);            sourceColumnNumber += this._decodeVLQ(stringCharIterator);            if (!this._isSeparator(stringCharIterator.peek()))                nameIndex += this._decodeVLQ(stringCharIterator);            this._mappings.push([lineNumber, columnNumber, sourceURL, sourceLineNumber, sourceColumnNumber]);        }        for (var i = 0; i < this._mappings.length; ++i) {            var mapping = this._mappings[i];            var url = mapping[2];            if (!url)                continue;if (!this._reverseMappingsBySourceURL[url])                this._reverseMappingsBySourceURL[url] = [];            var reverseMappings = this._reverseMappingsBySourceURL[url];            var sourceLine = mapping[3];            if (!reverseMappings[sourceLine])                reverseMappings[sourceLine] = [mapping[0], mapping[1]];        }    },    _isSeparator: function(char)     {        return char === "," || char === ";";    },    _decodeVLQ: function(stringCharIterator)     {        var result = 0;        var shift = 0;        do {            var digit = this._base64Map[stringCharIterator.next()];            result += (digit & this._VLQ_BASE_MASK) << shift;            shift += this._VLQ_BASE_SHIFT;        } while (digit & this._VLQ_CONTINUATION_MASK);var negative = result & 1;        result >>= 1;        return negative ? -result : result;    },    _VLQ_BASE_SHIFT: 5,    _VLQ_BASE_MASK: (1 << 5) - 1,    _VLQ_CONTINUATION_MASK: 1 << 5}WebInspector.SourceMap.StringCharIterator = function(string) {    this._string = string;    this._position = 0;}WebInspector.SourceMap.StringCharIterator.prototype = {    next: function()     {        return this._string.charAt(this._position++);    },    peek: function()     {        return this._string.charAt(this._position);    },    hasNext: function()     {        return this._position < this._string.length;    }};WebInspector.NetworkManager = function(target) {    WebInspector.SDKModel.call(this, WebInspector.NetworkManager, target);    this._dispatcher = new WebInspector.NetworkDispatcher(this);    this._target = target;    this._networkAgent = target.networkAgent();    target.registerNetworkDispatcher(this._dispatcher);    if (WebInspector.moduleSetting("cacheDisabled").get())        this._networkAgent.setCacheDisabled(true);    if (WebInspector.moduleSetting("monitoringXHREnabled").get())        this._networkAgent.setMonitoringXHREnabled(true);    this._initNetworkConditions();    this._networkAgent.enable();    WebInspector.moduleSetting("cacheDisabled").addChangeListener(this._cacheDisabledSettingChanged, this);}WebInspector.NetworkManager.EventTypes = {    RequestStarted: "RequestStarted",    RequestUpdated: "RequestUpdated",    RequestFinished: "RequestFinished",    RequestUpdateDropped: "RequestUpdateDropped"}WebInspector.NetworkManager._MIMETypes = {    "text/html": {        "document": true    },    "text/xml": {        "document": true    },    "text/plain": {        "document": true    },    "application/xhtml+xml": {        "document": true    },    "image/svg+xml": {        "document": true    },    "text/css": {        "stylesheet": true    },    "text/xsl": {        "stylesheet": true    },    "text/vtt": {        "texttrack": true    },}WebInspector.NetworkManager.Conditions;WebInspector.NetworkManager.IsThrottlingEnabled = function(conditions) {    return conditions.throughput >= 0;}WebInspector.NetworkManager.prototype = {    inflightRequestForURL: function(url)     {        return this._dispatcher._inflightRequestsByURL[url];    },    _cacheDisabledSettingChanged: function(event)     {        var enabled = (event.data);        this._networkAgent.setCacheDisabled(enabled);    },    dispose: function()     {        WebInspector.moduleSetting("cacheDisabled").removeChangeListener(this._cacheDisabledSettingChanged, this);    },    clearBrowserCache: function()     {        this._networkAgent.clearBrowserCache();    },    clearBrowserCookies: function()     {        this._networkAgent.clearBrowserCookies();    },    _initNetworkConditions: function()     {        this._networkAgent.canEmulateNetworkConditions(callback.bind(this));        function callback(error, canEmulate)         {            if (error || !canEmulate)                return;            WebInspector.moduleSetting("networkConditions").addChangeListener(this._networkConditionsSettingChanged, this);            var conditions = WebInspector.moduleSetting("networkConditions").get();            if (conditions.throughput < 0)                return;            this._updateNetworkConditions(conditions);        }    },    _updateNetworkConditions: function(conditions)     {        if (conditions.throughput < 0) {            this._networkAgent.emulateNetworkConditions(false, 0, 0, 0);        } else {            var offline = !conditions.throughput && !conditions.latency;            this._networkAgent.emulateNetworkConditions(!!offline, conditions.latency, conditions.throughput, conditions.throughput);        }    },    _networkConditionsSettingChanged: function(event)     {        this._updateNetworkConditions((event.data));    },    __proto__: WebInspector.SDKModel.prototype}WebInspector.NetworkDispatcher = function(manager) {    this._manager = manager;    this._inflightRequestsById = {};    this._inflightRequestsByURL = {};}WebInspector.NetworkDispatcher.prototype = {    _headersMapToHeadersArray: function(headersMap)     {        var result = [];        for (var name in headersMap) {            var values = headersMap[name].split("\n");            for (var i = 0; i < values.length; ++i)                result.push({                    name: name,                    value: values[i]                });        }        return result;    },    _updateNetworkRequestWithRequest: function(networkRequest, request)     {        networkRequest.requestMethod = request.method;        networkRequest.setRequestHeaders(this._headersMapToHeadersArray(request.headers));        networkRequest.requestFormData = request.postData;    },    _updateNetworkRequestWithResponse: function(networkRequest, response)     {        if (response.url && networkRequest.url !== response.url)            networkRequest.url = response.url;        networkRequest.mimeType = response.mimeType;        networkRequest.statusCode = response.status;        networkRequest.statusText = response.statusText;        networkRequest.responseHeaders = this._headersMapToHeadersArray(response.headers);        if (response.encodedDataLength >= 0)            networkRequest.setTransferSize(response.encodedDataLength);        if (response.headersText)            networkRequest.responseHeadersText = response.headersText;        if (response.requestHeaders) {            networkRequest.setRequestHeaders(this._headersMapToHeadersArray(response.requestHeaders));            networkRequest.setRequestHeadersText(response.requestHeadersText || "");        }        networkRequest.connectionReused = response.connectionReused;        networkRequest.connectionId = String(response.connectionId);        if (response.remoteIPAddress)            networkRequest.setRemoteAddress(response.remoteIPAddress, response.remotePort || -1);        if (response.fromServiceWorker)            networkRequest.fetchedViaServiceWorker = true;        if (response.fromDiskCache)            networkRequest.setFromDiskCache();        networkRequest.timing = response.timing;        networkRequest.protocol = response.protocol;        if (!this._mimeTypeIsConsistentWithType(networkRequest)) {            var consoleModel = this._manager._target.consoleModel;            consoleModel.addMessage(new WebInspector.ConsoleMessage(consoleModel.target(),WebInspector.ConsoleMessage.MessageSource.Network,WebInspector.ConsoleMessage.MessageLevel.Log,WebInspector.UIString("Resource interpreted as %s but transferred with MIME type %s: \"%s\".", networkRequest.resourceType().title(), networkRequest.mimeType, networkRequest.url),WebInspector.ConsoleMessage.MessageType.Log,"",0,0,networkRequest.requestId));        }    },    _mimeTypeIsConsistentWithType: function(networkRequest)     {        if (networkRequest.hasErrorStatusCode() || networkRequest.statusCode === 304 || networkRequest.statusCode === 204)            return true;        var resourceType = networkRequest.resourceType();        if (resourceType !== WebInspector.resourceTypes.Stylesheet && resourceType !== WebInspector.resourceTypes.Document && resourceType !== WebInspector.resourceTypes.TextTrack) {            return true;        }        if (!networkRequest.mimeType)            return true;        if (networkRequest.mimeType in WebInspector.NetworkManager._MIMETypes)            return resourceType.name() in WebInspector.NetworkManager._MIMETypes[networkRequest.mimeType];        return false;    },    requestWillBeSent: function(requestId, frameId, loaderId, documentURL, request, time, wallTime, initiator, redirectResponse, resourceType)     {        var networkRequest = this._inflightRequestsById[requestId];        if (networkRequest) {            if (!redirectResponse)                return;            this.responseReceived(requestId, frameId, loaderId, time, PageAgent.ResourceType.Other, redirectResponse);            networkRequest = this._appendRedirect(requestId, time, request.url);        } else            networkRequest = this._createNetworkRequest(requestId, frameId, loaderId, request.url, documentURL, initiator);        networkRequest.hasNetworkData = true;        this._updateNetworkRequestWithRequest(networkRequest, request);        networkRequest.setIssueTime(time, wallTime);        networkRequest.setResourceType(WebInspector.resourceTypes[resourceType]);        this._startNetworkRequest(networkRequest);    },    requestServedFromCache: function(requestId)     {        var networkRequest = this._inflightRequestsById[requestId];        if (!networkRequest)            return;        networkRequest.setFromMemoryCache();    },    responseReceived: function(requestId, frameId, loaderId, time, resourceType, response)     {        var networkRequest = this._inflightRequestsById[requestId];        if (!networkRequest) {            var eventData = {};            eventData.url = response.url;            eventData.frameId = frameId;            eventData.loaderId = loaderId;            eventData.resourceType = resourceType;            eventData.mimeType = response.mimeType;            this._manager.dispatchEventToListeners(WebInspector.NetworkManager.EventTypes.RequestUpdateDropped, eventData);            return;        }        networkRequest.responseReceivedTime = time;        networkRequest.setResourceType(WebInspector.resourceTypes[resourceType]);        this._updateNetworkRequestWithResponse(networkRequest, response);        this._updateNetworkRequest(networkRequest);    },    dataReceived: function(requestId, time, dataLength, encodedDataLength)     {        var networkRequest = this._inflightRequestsById[requestId];        if (!networkRequest)            return;        networkRequest.resourceSize += dataLength;        if (encodedDataLength != -1)            networkRequest.increaseTransferSize(encodedDataLength);        networkRequest.endTime = time;        this._updateNetworkRequest(networkRequest);    },    loadingFinished: function(requestId, finishTime, encodedDataLength)     {        var networkRequest = this._inflightRequestsById[requestId];        if (!networkRequest)            return;        this._finishNetworkRequest(networkRequest, finishTime, encodedDataLength);    },    loadingFailed: function(requestId, time, resourceType, localizedDescription, canceled)     {        var networkRequest = this._inflightRequestsById[requestId];        if (!networkRequest)            return;        networkRequest.failed = true;        networkRequest.setResourceType(WebInspector.resourceTypes[resourceType]);        networkRequest.canceled = canceled;        networkRequest.localizedFailDescription = localizedDescription;        this._finishNetworkRequest(networkRequest, time, -1);    },    webSocketCreated: function(requestId, requestURL)     {        var networkRequest = new WebInspector.NetworkRequest(this._manager._target,requestId,requestURL,"","","",null );        networkRequest.setResourceType(WebInspector.resourceTypes.WebSocket);        this._startNetworkRequest(networkRequest);    },    webSocketWillSendHandshakeRequest: function(requestId, time, wallTime, request)     {        var networkRequest = this._inflightRequestsById[requestId];        if (!networkRequest)            return;        networkRequest.requestMethod = "GET";        networkRequest.setRequestHeaders(this._headersMapToHeadersArray(request.headers));        networkRequest.setIssueTime(time, wallTime);        this._updateNetworkRequest(networkRequest);    },    webSocketHandshakeResponseReceived: function(requestId, time, response)     {        var networkRequest = this._inflightRequestsById[requestId];        if (!networkRequest)            return;        networkRequest.statusCode = response.status;        networkRequest.statusText = response.statusText;        networkRequest.responseHeaders = this._headersMapToHeadersArray(response.headers);        networkRequest.responseHeadersText = response.headersText;        if (response.requestHeaders)            networkRequest.setRequestHeaders(this._headersMapToHeadersArray(response.requestHeaders));        if (response.requestHeadersText)            networkRequest.setRequestHeadersText(response.requestHeadersText);        networkRequest.responseReceivedTime = time;        networkRequest.protocol = "websocket";        this._updateNetworkRequest(networkRequest);    },    webSocketFrameReceived: function(requestId, time, response)     {        var networkRequest = this._inflightRequestsById[requestId];        if (!networkRequest)            return;        networkRequest.addFrame(response, time);        networkRequest.responseReceivedTime = time;        this._updateNetworkRequest(networkRequest);    },    webSocketFrameSent: function(requestId, time, response)     {        var networkRequest = this._inflightRequestsById[requestId];        if (!networkRequest)            return;        networkRequest.addFrame(response, time, true);        networkRequest.responseReceivedTime = time;        this._updateNetworkRequest(networkRequest);    },    webSocketFrameError: function(requestId, time, errorMessage)     {        var networkRequest = this._inflightRequestsById[requestId];        if (!networkRequest)            return;        networkRequest.addFrameError(errorMessage, time);        networkRequest.responseReceivedTime = time;        this._updateNetworkRequest(networkRequest);    },    webSocketClosed: function(requestId, time)     {        var networkRequest = this._inflightRequestsById[requestId];        if (!networkRequest)            return;        this._finishNetworkRequest(networkRequest, time, -1);    },    eventSourceMessageReceived: function(requestId, time, eventName, eventId, data)     {        var networkRequest = this._inflightRequestsById[requestId];        if (!networkRequest)            return;        networkRequest.addEventSourceMessage(time, eventName, eventId, data);    },    _appendRedirect: function(requestId, time, redirectURL)     {        var originalNetworkRequest = this._inflightRequestsById[requestId];        var previousRedirects = originalNetworkRequest.redirects || [];        originalNetworkRequest.requestId = requestId + ":redirected." + previousRedirects.length;        delete originalNetworkRequest.redirects;        if (previousRedirects.length > 0)            originalNetworkRequest.redirectSource = previousRedirects[previousRedirects.length - 1];        this._finishNetworkRequest(originalNetworkRequest, time, -1);        var newNetworkRequest = this._createNetworkRequest(requestId, originalNetworkRequest.frameId, originalNetworkRequest.loaderId, redirectURL, originalNetworkRequest.documentURL, originalNetworkRequest.initiator());        newNetworkRequest.redirects = previousRedirects.concat(originalNetworkRequest);        return newNetworkRequest;    },    _startNetworkRequest: function(networkRequest)     {        this._inflightRequestsById[networkRequest.requestId] = networkRequest;        this._inflightRequestsByURL[networkRequest.url] = networkRequest;        this._dispatchEventToListeners(WebInspector.NetworkManager.EventTypes.RequestStarted, networkRequest);    },    _updateNetworkRequest: function(networkRequest)     {        this._dispatchEventToListeners(WebInspector.NetworkManager.EventTypes.RequestUpdated, networkRequest);    },    _finishNetworkRequest: function(networkRequest, finishTime, encodedDataLength)     {        networkRequest.endTime = finishTime;        networkRequest.finished = true;        if (encodedDataLength >= 0)            networkRequest.setTransferSize(encodedDataLength);        this._dispatchEventToListeners(WebInspector.NetworkManager.EventTypes.RequestFinished, networkRequest);        delete this._inflightRequestsById[networkRequest.requestId];        delete this._inflightRequestsByURL[networkRequest.url];    },    _dispatchEventToListeners: function(eventType, networkRequest)     {        this._manager.dispatchEventToListeners(eventType, networkRequest);    },    _createNetworkRequest: function(requestId, frameId, loaderId, url, documentURL, initiator)     {        return new WebInspector.NetworkRequest(this._manager._target,requestId,url,documentURL,frameId,loaderId,initiator);    }}WebInspector.MultitargetNetworkManager = function() {    WebInspector.targetManager.observeTargets(this);}WebInspector.MultitargetNetworkManager.prototype = {    targetAdded: function(target)     {        var networkAgent = target.networkAgent();        if (this._extraHeaders)            networkAgent.setExtraHTTPHeaders(this._extraHeaders);        if (typeof this._userAgent !== "undefined")            networkAgent.setUserAgentOverride(this._userAgent);    },    targetRemoved: function(target)     {},    setExtraHTTPHeaders: function(headers)     {        this._extraHeaders = headers;        for (var target of WebInspector.targetManager.targets())            target.networkAgent().setExtraHTTPHeaders(this._extraHeaders);    },    setUserAgentOverride: function(userAgent)     {        WebInspector.ResourceLoader.targetUserAgent = userAgent;        this._userAgent = userAgent;        for (var target of WebInspector.targetManager.targets())            target.networkAgent().setUserAgentOverride(this._userAgent);    }}WebInspector.multitargetNetworkManager;;WebInspector.NetworkRequest = function(target, requestId, url, documentURL, frameId, loaderId, initiator) {    WebInspector.SDKObject.call(this, target);    this._requestId = requestId;    this.url = url;    this._documentURL = documentURL;    this._frameId = frameId;    this._loaderId = loaderId;    this._initiator = initiator;    this._issueTime = -1;    this._startTime = -1;    this._endTime = -1;    this.statusCode = 0;    this.statusText = "";    this.requestMethod = "";    this.requestTime = 0;    this.protocol = "";    this._resourceType = WebInspector.resourceTypes.Other;    this._contentEncoded = false;    this._pendingContentCallbacks = [];    this._frames = [];    this._eventSourceMessages = [];    this._responseHeaderValues = {};    this._remoteAddress = "";    this.connectionId = "0";}WebInspector.NetworkRequest.Events = {    FinishedLoading: "FinishedLoading",    TimingChanged: "TimingChanged",    RemoteAddressChanged: "RemoteAddressChanged",    RequestHeadersChanged: "RequestHeadersChanged",    ResponseHeadersChanged: "ResponseHeadersChanged",    WebsocketFrameAdded: "WebsocketFrameAdded",    EventSourceMessageAdded: "EventSourceMessageAdded",}WebInspector.NetworkRequest.InitiatorType = {    Other: "other",    Parser: "parser",    Redirect: "redirect",    Script: "script"}WebInspector.NetworkRequest.NameValue;WebInspector.NetworkRequest.WebSocketFrameType = {    Send: "send",    Receive: "receive",    Error: "error"}WebInspector.NetworkRequest.WebSocketFrame;WebInspector.NetworkRequest.EventSourceMessage;WebInspector.NetworkRequest.prototype = {    indentityCompare: function(other) {        if (this._requestId > other._requestId)            return 1;        if (this._requestId < other._requestId)            return -1;        return 0;    },    get requestId()     {        return this._requestId;    },    set requestId(requestId)     {        this._requestId = requestId;    },    get url()     {        return this._url;    },    set url(x)     {        if (this._url === x)            return;        this._url = x;        this._parsedURL = new WebInspector.ParsedURL(x);        delete this._queryString;        delete this._parsedQueryParameters;        delete this._name;        delete this._path;    },    get documentURL()     {        return this._documentURL;    },    get parsedURL()     {        return this._parsedURL;    },    get frameId()     {        return this._frameId;    },    get loaderId()     {        return this._loaderId;    },    setRemoteAddress: function(ip, port)     {        if (ip.indexOf(":") !== -1)            ip = "[" + ip + "]";        this._remoteAddress = ip + ":" + port;        this.dispatchEventToListeners(WebInspector.NetworkRequest.Events.RemoteAddressChanged, this);    },    remoteAddress: function()     {        return this._remoteAddress;    },    get startTime()     {        return this._startTime || -1;    },    setIssueTime: function(monotonicTime, wallTime)     {        this._issueTime = monotonicTime;        this._wallIssueTime = wallTime;        this._startTime = monotonicTime;    },    issueTime: function()     {        return this._issueTime;    },    pseudoWallTime: function(monotonicTime)     {        return this._wallIssueTime ? this._wallIssueTime - this._issueTime + monotonicTime : monotonicTime;    },    get responseReceivedTime()     {        return this._responseReceivedTime || -1;    },    set responseReceivedTime(x)     {        this._responseReceivedTime = x;    },    get endTime()     {        return this._endTime || -1;    },    set endTime(x)     {        if (this.timing && this.timing.requestTime) {            this._endTime = Math.max(x, this.responseReceivedTime);        } else {            this._endTime = x;            if (this._responseReceivedTime > x)                this._responseReceivedTime = x;        }        this.dispatchEventToListeners(WebInspector.NetworkRequest.Events.TimingChanged, this);    },    get duration()     {        if (this._endTime === -1 || this._startTime === -1)            return -1;        return this._endTime - this._startTime;    },    get latency()     {        if (this._responseReceivedTime === -1 || this._startTime === -1)            return -1;        return this._responseReceivedTime - this._startTime;    },    get resourceSize()     {        return this._resourceSize || 0;    },    set resourceSize(x)     {        this._resourceSize = x;    },    get transferSize()     {        return this._transferSize || 0;    },    increaseTransferSize: function(x)     {        this._transferSize = (this._transferSize || 0) + x;    },    setTransferSize: function(x)     {        this._transferSize = x;    },    get finished()     {        return this._finished;    },    set finished(x)     {        if (this._finished === x)            return;        this._finished = x;        if (x) {            this.dispatchEventToListeners(WebInspector.NetworkRequest.Events.FinishedLoading, this);            if (this._pendingContentCallbacks.length)                this._innerRequestContent();        }    },    get failed()     {        return this._failed;    },    set failed(x)     {        this._failed = x;    },    get canceled()     {        return this._canceled;    },    set canceled(x)     {        this._canceled = x;    },    cached: function()     {        return (!!this._fromMemoryCache || !!this._fromDiskCache) && !this._transferSize;    },    setFromMemoryCache: function()     {        this._fromMemoryCache = true;        delete this._timing;    },    setFromDiskCache: function()     {        this._fromDiskCache = true;    },    get fetchedViaServiceWorker()     {        return this._fetchedViaServiceWorker;    },    set fetchedViaServiceWorker(x)     {        this._fetchedViaServiceWorker = x;    },    get timing()     {        return this._timing;    },    set timing(x)     {        if (x && !this._fromMemoryCache) {            this._startTime = x.requestTime;            this._responseReceivedTime = x.requestTime + x.receiveHeadersEnd / 1000.0;            this._timing = x;            this.dispatchEventToListeners(WebInspector.NetworkRequest.Events.TimingChanged, this);        }    },    get mimeType()     {        return this._mimeType;    },    set mimeType(x)     {        this._mimeType = x;    },    get displayName()     {        return this._parsedURL.displayName;    },    name: function()     {        if (this._name)            return this._name;        this._parseNameAndPathFromURL();        return this._name;    },    path: function()     {        if (this._path)            return this._path;        this._parseNameAndPathFromURL();        return this._path;    },    _parseNameAndPathFromURL: function()     {        if (this._parsedURL.isDataURL()) {            this._name = this._parsedURL.dataURLDisplayName();            this._path = "";        } else if (this._parsedURL.isAboutBlank()) {            this._name = this._parsedURL.url;            this._path = "";        } else {            this._path = this._parsedURL.host + this._parsedURL.folderPathComponents;            this._path = this._path.trimURL(this.target().resourceTreeModel.inspectedPageDomain());            if (this._parsedURL.lastPathComponent || this._parsedURL.queryParams)                this._name = this._parsedURL.lastPathComponent + (this._parsedURL.queryParams ? "?" + this._parsedURL.queryParams : "");            else if (this._parsedURL.folderPathComponents) {                this._name = this._parsedURL.folderPathComponents.substring(this._parsedURL.folderPathComponents.lastIndexOf("/") + 1) + "/";                this._path = this._path.substring(0, this._path.lastIndexOf("/"));            } else {                this._name = this._parsedURL.host;                this._path = "";            }        }    },    get folder()     {        var path = this._parsedURL.path;        var indexOfQuery = path.indexOf("?");        if (indexOfQuery !== -1)            path = path.substring(0, indexOfQuery);        var lastSlashIndex = path.lastIndexOf("/");        return lastSlashIndex !== -1 ? path.substring(0, lastSlashIndex) : "";    },    resourceType: function()     {        return this._resourceType;    },    setResourceType: function(resourceType)     {        this._resourceType = resourceType;    },    get domain()     {        return this._parsedURL.host;    },    get scheme()     {        return this._parsedURL.scheme;    },    get redirectSource()     {        if (this.redirects && this.redirects.length > 0)            return this.redirects[this.redirects.length - 1];        return this._redirectSource;    },    set redirectSource(x)     {        this._redirectSource = x;        delete this._initiatorInfo;    },    requestHeaders: function()     {        return this._requestHeaders || [];    },    setRequestHeaders: function(headers)     {        this._requestHeaders = headers;        delete this._requestCookies;        this.dispatchEventToListeners(WebInspector.NetworkRequest.Events.RequestHeadersChanged);    },    requestHeadersText: function()     {        return this._requestHeadersText;    },    setRequestHeadersText: function(text)     {        this._requestHeadersText = text;        this.dispatchEventToListeners(WebInspector.NetworkRequest.Events.RequestHeadersChanged);    },    requestHeaderValue: function(headerName)     {        return this._headerValue(this.requestHeaders(), headerName);    },    get requestCookies()     {        if (!this._requestCookies)            this._requestCookies = WebInspector.CookieParser.parseCookie(this.target(), this.requestHeaderValue("Cookie"));        return this._requestCookies;    },    get requestFormData()     {        return this._requestFormData;    },    set requestFormData(x)     {        this._requestFormData = x;        delete this._parsedFormParameters;    },    requestHttpVersion: function()     {        var headersText = this.requestHeadersText();        if (!headersText)            return this.requestHeaderValue("version") || this.requestHeaderValue(":version") || "unknown";        var firstLine = headersText.split(/\r\n/)[0];        var match = firstLine.match(/(HTTP\/\d+\.\d+)$/);        return match ? match[1] : "HTTP/0.9";    },    get responseHeaders()     {        return this._responseHeaders || [];    },    set responseHeaders(x)     {        this._responseHeaders = x;        delete this._sortedResponseHeaders;        delete this._responseCookies;        this._responseHeaderValues = {};        this.dispatchEventToListeners(WebInspector.NetworkRequest.Events.ResponseHeadersChanged);    },    get responseHeadersText()     {        return this._responseHeadersText;    },    set responseHeadersText(x)     {        this._responseHeadersText = x;        this.dispatchEventToListeners(WebInspector.NetworkRequest.Events.ResponseHeadersChanged);    },    get sortedResponseHeaders()     {        if (this._sortedResponseHeaders !== undefined)            return this._sortedResponseHeaders;        this._sortedResponseHeaders = this.responseHeaders.slice();        this._sortedResponseHeaders.sort(function(a, b) {            return a.name.toLowerCase().compareTo(b.name.toLowerCase());        }        );        return this._sortedResponseHeaders;    },    responseHeaderValue: function(headerName)     {        var value = this._responseHeaderValues[headerName];        if (value === undefined) {            value = this._headerValue(this.responseHeaders, headerName);            this._responseHeaderValues[headerName] = (value !== undefined) ? value : null ;        }        return (value !== null ) ? value : undefined;    },    get responseCookies()     {        if (!this._responseCookies)            this._responseCookies = WebInspector.CookieParser.parseSetCookie(this.target(), this.responseHeaderValue("Set-Cookie"));        return this._responseCookies;    },    queryString: function()     {        if (this._queryString !== undefined)            return this._queryString;        var queryString = null ;        var url = this.url;        var questionMarkPosition = url.indexOf("?");        if (questionMarkPosition !== -1) {            queryString = url.substring(questionMarkPosition + 1);            var hashSignPosition = queryString.indexOf("#");            if (hashSignPosition !== -1)                queryString = queryString.substring(0, hashSignPosition);        }        this._queryString = queryString;        return this._queryString;    },    get queryParameters()     {        if (this._parsedQueryParameters)            return this._parsedQueryParameters;        var queryString = this.queryString();        if (!queryString)            return null ;        this._parsedQueryParameters = this._parseParameters(queryString);        return this._parsedQueryParameters;    },    get formParameters()     {        if (this._parsedFormParameters)            return this._parsedFormParameters;        if (!this.requestFormData)            return null ;        var requestContentType = this.requestContentType();        if (!requestContentType || !requestContentType.match(/^application\/x-www-form-urlencoded\s*(;.*)?$/i))            return null ;        this._parsedFormParameters = this._parseParameters(this.requestFormData);        return this._parsedFormParameters;    },    responseHttpVersion: function()     {        var headersText = this._responseHeadersText;        if (!headersText)            return this.responseHeaderValue("version") || this.responseHeaderValue(":version") || "unknown";        var firstLine = headersText.split(/\r\n/)[0];        var match = firstLine.match(/^(HTTP\/\d+\.\d+)/);        return match ? match[1] : "HTTP/0.9";    },    _parseParameters: function(queryString)     {        function parseNameValue(pair)         {            var position = pair.indexOf("=");            if (position === -1)                return {                    name: pair,                    value: ""                };            else                return {                    name: pair.substring(0, position),                    value: pair.substring(position + 1)                };        }        return queryString.split("&").map(parseNameValue);    },    _headerValue: function(headers, headerName)     {        headerName = headerName.toLowerCase();        var values = [];        for (var i = 0; i < headers.length; ++i) {            if (headers[i].name.toLowerCase() === headerName)                values.push(headers[i].value);        }        if (!values.length)            return undefined;        if (headerName === "set-cookie")            return values.join("\n");        return values.join(", ");    },    get content()     {        return this._content;    },    contentError: function()     {        return this._contentError;    },    get contentEncoded()     {        return this._contentEncoded;    },    contentURL: function()     {        return this._url;    },    contentType: function()     {        return this._resourceType;    },    requestContent: function(callback)     {        if (this._resourceType === WebInspector.resourceTypes.WebSocket) {            callback(null );            return;        }        if (typeof this._content !== "undefined") {            callback(this.content || null );            return;        }        this._pendingContentCallbacks.push(callback);        if (this.finished)            this._innerRequestContent();    },    searchInContent: function(query, caseSensitive, isRegex, callback)     {        callback([]);    },    isHttpFamily: function()     {        return !!this.url.match(/^https?:/i);    },    requestContentType: function()     {        return this.requestHeaderValue("Content-Type");    },    hasErrorStatusCode: function()     {        return this.statusCode >= 400;    },    populateImageSource: function(image)     {        WebInspector.Resource.populateImageSource(this._url, this._mimeType, this, image);    },    asDataURL: function()     {        var content = this._content;        var charset = null ;        if (!this._contentEncoded) {            content = content.toBase64();            charset = "utf-8";        }        return WebInspector.Resource.contentAsDataURL(content, this.mimeType, true, charset);    },    _innerRequestContent: function()     {        if (this._contentRequested)            return;        this._contentRequested = true;        function onResourceContent(error, content, contentEncoded)         {            this._content = error ? null  : content;            this._contentError = error;            this._contentEncoded = contentEncoded;            var callbacks = this._pendingContentCallbacks.slice();            for (var i = 0; i < callbacks.length; ++i)                callbacks[i](this._content);            this._pendingContentCallbacks.length = 0;            delete this._contentRequested;        }        this.target().networkAgent().getResponseBody(this._requestId, onResourceContent.bind(this));    },    initiator: function()     {        return this._initiator;    },    initiatorInfo: function()     {        if (this._initiatorInfo)            return this._initiatorInfo;        var type = WebInspector.NetworkRequest.InitiatorType.Other;        var url = "";        var lineNumber = -Infinity;        var columnNumber = -Infinity;        var initiator = this._initiator;        if (this.redirectSource) {            type = WebInspector.NetworkRequest.InitiatorType.Redirect;            url = this.redirectSource.url;        } else if (initiator) {            if (initiator.type === NetworkAgent.InitiatorType.Parser) {                type = WebInspector.NetworkRequest.InitiatorType.Parser;                url = initiator.url ? initiator.url : url;                lineNumber = initiator.lineNumber ? initiator.lineNumber : lineNumber;            } else if (initiator.type === NetworkAgent.InitiatorType.Script) {                var topFrame = initiator.stackTrace[0];                if (topFrame.url) {                    type = WebInspector.NetworkRequest.InitiatorType.Script;                    url = topFrame.url;                    lineNumber = topFrame.lineNumber;                    columnNumber = topFrame.columnNumber;                }            }        }        this._initiatorInfo = {            type: type,            url: url,            lineNumber: lineNumber,            columnNumber: columnNumber        };        return this._initiatorInfo;    },    frames: function()     {        return this._frames;    },    addFrameError: function(errorMessage, time)     {        this._addFrame({            type: WebInspector.NetworkRequest.WebSocketFrameType.Error,            text: errorMessage,            time: this.pseudoWallTime(time),            opCode: -1,            mask: false        });    },    addFrame: function(response, time, sent)     {        var type = sent ? WebInspector.NetworkRequest.WebSocketFrameType.Send : WebInspector.NetworkRequest.WebSocketFrameType.Receive;        this._addFrame({            type: type,            text: response.payloadData,            time: this.pseudoWallTime(time),            opCode: response.opcode,            mask: response.mask        });    },    _addFrame: function(frame)     {        this._frames.push(frame);        this.dispatchEventToListeners(WebInspector.NetworkRequest.Events.WebsocketFrameAdded, frame);    },    eventSourceMessages: function()     {        return this._eventSourceMessages;    },    addEventSourceMessage: function(time, eventName, eventId, data)     {        var message = {            time: this.pseudoWallTime(time),            eventName: eventName,            eventId: eventId,            data: data        };        this._eventSourceMessages.push(message);        this.dispatchEventToListeners(WebInspector.NetworkRequest.Events.EventSourceMessageAdded, message);    },    replayXHR: function()     {        this.target().networkAgent().replayXHR(this.requestId);    },    __proto__: WebInspector.SDKObject.prototype};WebInspector.PictureFragment;WebInspector.PaintProfilerSnapshot = function(target, snapshotId) {    this._target = target;    this._id = snapshotId;}WebInspector.PaintProfilerSnapshot.loadFromFragments = function(target, fragments, callback) {    var wrappedCallback = InspectorBackend.wrapClientCallback(callback, "LayerTreeAgent.loadSnapshot(): ", WebInspector.PaintProfilerSnapshot.bind(null , target));    target.layerTreeAgent().loadSnapshot(fragments, wrappedCallback);}WebInspector.PaintProfilerSnapshot.load = function(target, encodedPicture, callback) {    var fragment = {        x: 0,        y: 0,        picture: encodedPicture    };    WebInspector.PaintProfilerSnapshot.loadFromFragments(target, [fragment], callback);}WebInspector.PaintProfilerSnapshot._processAnnotations = function(log) {    var result = [];    var commentGroupStack = [];    for (var i = 0; i < log.length; ++i) {        var method = log[i].method;        switch (method) {        case "beginCommentGroup":            commentGroupStack.push({});            break;        case "addComment":            var group = commentGroupStack.peekLast();            if (!group) {                console.assert(false, "Stray comment without a group");                break;            }            var key = String(log[i].params["key"]);            var value = String(log[i].params["value"]);            if (!key || typeof value === "undefined") {                console.assert(false, "Missing key or value in addComment() params");                break;            }            if (key in group) {                console.assert(false, "Duplicate key in comment group");                break;            }            group[key] = value;            break;        case "endCommentGroup":            if (!commentGroupStack.length)                console.assert(false, "Unbalanced commentGroupEnd call");            else                commentGroupStack.pop();            break;        default:            result.push(new WebInspector.PaintProfilerLogItem(log[i],i,commentGroupStack.peekLast()));        }    }    return result;}WebInspector.PaintProfilerSnapshot.prototype = {    dispose: function()     {        this._target.layerTreeAgent().releaseSnapshot(this._id);    },    target: function()     {        return this._target;    },    requestImage: function(firstStep, lastStep, scale, callback)     {        var wrappedCallback = InspectorBackend.wrapClientCallback(callback, "LayerTreeAgent.replaySnapshot(): ");        this._target.layerTreeAgent().replaySnapshot(this._id, firstStep || undefined, lastStep || undefined, scale || 1.0, wrappedCallback);    },    profile: function(clipRect, callback)     {        var wrappedCallback = InspectorBackend.wrapClientCallback(callback, "LayerTreeAgent.profileSnapshot(): ");        this._target.layerTreeAgent().profileSnapshot(this._id, 5, 1, clipRect || undefined, wrappedCallback);    },    commandLog: function(callback)     {        function callbackWrapper(error, log)         {            if (error) {                console.error("LayerTreeAgent.snapshotCommandLog(): " + error);                callback();                return;            }            callback(WebInspector.PaintProfilerSnapshot._processAnnotations(log));        }        this._target.layerTreeAgent().snapshotCommandLog(this._id, callbackWrapper);    }};WebInspector.RawPaintProfilerLogItem;WebInspector.PaintProfilerLogItem = function(rawEntry, commandIndex, annotations) {    this.method = rawEntry.method;    this.params = rawEntry.params;    this.annotations = annotations;    this.commandIndex = commandIndex;}WebInspector.PaintProfilerLogItem.prototype = {    nodeId: function()     {        if (!this.annotations)            return 0;        var inspectorId = this.annotations["INSPECTOR_ID"];        return Number(inspectorId);    }};WebInspector.HeapProfilerModel = function(target) {    WebInspector.SDKModel.call(this, WebInspector.HeapProfilerModel, target);    target.registerHeapProfilerDispatcher(new WebInspector.HeapProfilerDispatcher(this));    this._enabled = false;    this._heapProfilerAgent = target.heapProfilerAgent();}WebInspector.HeapProfilerModel.Events = {    HeapStatsUpdate: "HeapStatsUpdate",    LastSeenObjectId: "LastSeenObjectId",    AddHeapSnapshotChunk: "AddHeapSnapshotChunk",    ReportHeapSnapshotProgress: "ReportHeapSnapshotProgress",    ResetProfiles: "ResetProfiles"}WebInspector.HeapProfilerModel.prototype = {    enable: function()     {        if (this._enabled)            return;        this._enabled = true;        this._heapProfilerAgent.enable();    },    heapStatsUpdate: function(samples)     {        this.dispatchEventToListeners(WebInspector.HeapProfilerModel.Events.HeapStatsUpdate, samples);    },    lastSeenObjectId: function(lastSeenObjectId, timestamp)     {        this.dispatchEventToListeners(WebInspector.HeapProfilerModel.Events.LastSeenObjectId, {            lastSeenObjectId: lastSeenObjectId,            timestamp: timestamp        });    },    addHeapSnapshotChunk: function(chunk)     {        this.dispatchEventToListeners(WebInspector.HeapProfilerModel.Events.AddHeapSnapshotChunk, chunk);    },    reportHeapSnapshotProgress: function(done, total, finished)     {        this.dispatchEventToListeners(WebInspector.HeapProfilerModel.Events.ReportHeapSnapshotProgress, {            done: done,            total: total,            finished: finished        });    },    resetProfiles: function()     {        this.dispatchEventToListeners(WebInspector.HeapProfilerModel.Events.ResetProfiles);    },    __proto__: WebInspector.SDKModel.prototype}WebInspector.HeapProfilerDispatcher = function(model) {    this._heapProfilerModel = model;}WebInspector.HeapProfilerDispatcher.prototype = {    heapStatsUpdate: function(samples)     {        this._heapProfilerModel.heapStatsUpdate(samples);    },    lastSeenObjectId: function(lastSeenObjectId, timestamp)     {        this._heapProfilerModel.lastSeenObjectId(lastSeenObjectId, timestamp);    },    addHeapSnapshotChunk: function(chunk)     {        this._heapProfilerModel.addHeapSnapshotChunk(chunk);    },    reportHeapSnapshotProgress: function(done, total, finished)     {        this._heapProfilerModel.reportHeapSnapshotProgress(done, total, finished);    },    resetProfiles: function()     {        this._heapProfilerModel.resetProfiles();    }};WebInspector.CSSMetadata.initializeWithSupportedProperties([{    "name": "color"}, {    "name": "direction"}, {    "name": "font-family"}, {    "name": "font-kerning"}, {    "name": "font-size"}, {    "name": "font-size-adjust"}, {    "name": "font-stretch"}, {    "name": "font-style"}, {    "name": "font-variant"}, {    "name": "font-variant-ligatures"}, {    "name": "font-weight"}, {    "name": "-webkit-font-feature-settings"}, {    "name": "-webkit-font-smoothing"}, {    "name": "-webkit-locale"}, {    "name": "-webkit-text-orientation"}, {    "name": "-webkit-writing-mode"}, {    "name": "text-rendering"}, {    "name": "zoom"}, {    "name": "align-content"}, {    "name": "align-items"}, {    "name": "alignment-baseline"}, {    "name": "align-self"}, {    "name": "animation-delay"}, {    "name": "animation-direction"}, {    "name": "animation-duration"}, {    "name": "animation-fill-mode"}, {    "name": "animation-iteration-count"}, {    "name": "animation-name"}, {    "name": "animation-play-state"}, {    "name": "animation-timing-function"}, {    "name": "backface-visibility"}, {    "name": "background-attachment"}, {    "name": "background-blend-mode"}, {    "name": "background-clip"}, {    "name": "background-color"}, {    "name": "background-image"}, {    "name": "background-origin"}, {    "name": "background-position-x"}, {    "name": "background-position-y"}, {    "name": "background-repeat-x"}, {    "name": "background-repeat-y"}, {    "name": "background-size"}, {    "name": "baseline-shift"}, {    "name": "border-bottom-color"}, {    "name": "border-bottom-left-radius"}, {    "name": "border-bottom-right-radius"}, {    "name": "border-bottom-style"}, {    "name": "border-bottom-width"}, {    "name": "border-collapse"}, {    "name": "border-image-outset"}, {    "name": "border-image-repeat"}, {    "name": "border-image-slice"}, {    "name": "border-image-source"}, {    "name": "border-image-width"}, {    "name": "border-left-color"}, {    "name": "border-left-style"}, {    "name": "border-left-width"}, {    "name": "border-right-color"}, {    "name": "border-right-style"}, {    "name": "border-right-width"}, {    "name": "border-top-color"}, {    "name": "border-top-left-radius"}, {    "name": "border-top-right-radius"}, {    "name": "border-top-style"}, {    "name": "border-top-width"}, {    "name": "bottom"}, {    "name": "box-shadow"}, {    "name": "box-sizing"}, {    "name": "buffered-rendering"}, {    "name": "caption-side"}, {    "name": "clear"}, {    "name": "clip"}, {    "name": "clip-path"}, {    "name": "clip-rule"}, {    "name": "color-interpolation"}, {    "name": "color-interpolation-filters"}, {    "name": "color-rendering"}, {    "name": "column-fill"}, {    "name": "content"}, {    "name": "counter-increment"}, {    "name": "counter-reset"}, {    "name": "cursor"}, {    "name": "cx"}, {    "name": "cy"}, {    "name": "display"}, {    "name": "dominant-baseline"}, {    "name": "empty-cells"}, {    "name": "fill"}, {    "name": "fill-opacity"}, {    "name": "fill-rule"}, {    "name": "filter"}, {    "name": "flex-basis"}, {    "name": "flex-direction"}, {    "name": "flex-grow"}, {    "name": "flex-shrink"}, {    "name": "flex-wrap"}, {    "name": "float"}, {    "name": "flood-color"}, {    "name": "flood-opacity"}, {    "name": "glyph-orientation-horizontal"}, {    "name": "glyph-orientation-vertical"}, {    "name": "grid-auto-columns"}, {    "name": "grid-auto-flow"}, {    "name": "grid-auto-rows"}, {    "name": "grid-column-end"}, {    "name": "grid-column-start"}, {    "name": "grid-row-end"}, {    "name": "grid-row-start"}, {    "name": "grid-template-areas"}, {    "name": "grid-template-columns"}, {    "name": "grid-template-rows"}, {    "name": "height"}, {    "name": "image-rendering"}, {    "name": "isolation"}, {    "name": "justify-content"}, {    "name": "justify-items"}, {    "name": "justify-self"}, {    "name": "left"}, {    "name": "letter-spacing"}, {    "name": "lighting-color"}, {    "name": "line-height"}, {    "name": "list-style-image"}, {    "name": "list-style-position"}, {    "name": "list-style-type"}, {    "name": "margin-bottom"}, {    "name": "margin-left"}, {    "name": "margin-right"}, {    "name": "margin-top"}, {    "name": "marker-end"}, {    "name": "marker-mid"}, {    "name": "marker-start"}, {    "name": "mask"}, {    "name": "mask-source-type"}, {    "name": "mask-type"}, {    "name": "max-height"}, {    "name": "max-width"}, {    "name": "min-height"}, {    "name": "min-width"}, {    "name": "mix-blend-mode"}, {    "name": "motion-offset"}, {    "name": "motion-path"}, {    "name": "motion-rotation"}, {    "name": "object-fit"}, {    "name": "object-position"}, {    "name": "opacity"}, {    "name": "order"}, {    "name": "orphans"}, {    "name": "outline-color"}, {    "name": "outline-offset"}, {    "name": "outline-style"}, {    "name": "outline-width"}, {    "name": "overflow-wrap"}, {    "name": "overflow-x"}, {    "name": "overflow-y"}, {    "name": "padding-bottom"}, {    "name": "padding-left"}, {    "name": "padding-right"}, {    "name": "padding-top"}, {    "name": "page-break-after"}, {    "name": "page-break-before"}, {    "name": "page-break-inside"}, {    "name": "paint-order"}, {    "name": "perspective"}, {    "name": "perspective-origin"}, {    "name": "pointer-events"}, {    "name": "position"}, {    "name": "quotes"}, {    "name": "resize"}, {    "name": "right"}, {    "name": "r"}, {    "name": "rx"}, {    "name": "ry"}, {    "name": "scroll-behavior"}, {    "name": "scroll-blocks-on"}, {    "name": "scroll-snap-type"}, {    "name": "scroll-snap-points-x"}, {    "name": "scroll-snap-points-y"}, {    "name": "scroll-snap-destination"}, {    "name": "scroll-snap-coordinate"}, {    "name": "shape-image-threshold"}, {    "name": "shape-margin"}, {    "name": "shape-outside"}, {    "name": "shape-rendering"}, {    "name": "size"}, {    "name": "speak"}, {    "name": "stop-color"}, {    "name": "stop-opacity"}, {    "name": "stroke"}, {    "name": "stroke-dasharray"}, {    "name": "stroke-dashoffset"}, {    "name": "stroke-linecap"}, {    "name": "stroke-linejoin"}, {    "name": "stroke-miterlimit"}, {    "name": "stroke-opacity"}, {    "name": "stroke-width"}, {    "name": "table-layout"}, {    "name": "tab-size"}, {    "name": "text-align"}, {    "name": "text-align-last"}, {    "name": "text-anchor"}, {    "longhands": ["text-decoration-line", "text-decoration-style", "text-decoration-color"],    "name": "text-decoration"}, {    "name": "text-decoration-color"}, {    "name": "text-decoration-line"}, {    "name": "text-decoration-style"}, {    "name": "text-indent"}, {    "name": "text-justify"}, {    "name": "text-overflow"}, {    "name": "text-shadow"}, {    "name": "text-transform"}, {    "name": "text-underline-position"}, {    "name": "top"}, {    "name": "touch-action"}, {    "name": "transform"}, {    "name": "transform-origin"}, {    "name": "transform-style"}, {    "name": "translate"}, {    "name": "rotate"}, {    "name": "scale"}, {    "name": "transition-delay"}, {    "name": "transition-duration"}, {    "name": "transition-property"}, {    "name": "transition-timing-function"}, {    "name": "unicode-bidi"}, {    "name": "vector-effect"}, {    "name": "vertical-align"}, {    "name": "visibility"}, {    "name": "x"}, {    "name": "y"}, {    "name": "-webkit-appearance"}, {    "name": "-webkit-app-region"}, {    "name": "-webkit-background-clip"}, {    "name": "-webkit-background-composite"}, {    "name": "-webkit-background-origin"}, {    "name": "-webkit-border-horizontal-spacing"}, {    "name": "-webkit-border-image"}, {    "name": "-webkit-border-vertical-spacing"}, {    "name": "-webkit-box-align"}, {    "name": "-webkit-box-decoration-break"}, {    "name": "-webkit-box-direction"}, {    "name": "-webkit-box-flex"}, {    "name": "-webkit-box-flex-group"}, {    "name": "-webkit-box-lines"}, {    "name": "-webkit-box-ordinal-group"}, {    "name": "-webkit-box-orient"}, {    "name": "-webkit-box-pack"}, {    "name": "-webkit-box-reflect"}, {    "name": "-webkit-clip-path"}, {    "name": "-webkit-column-break-after"}, {    "name": "-webkit-column-break-before"}, {    "name": "-webkit-column-break-inside"}, {    "name": "-webkit-column-count"}, {    "name": "-webkit-column-gap"}, {    "name": "-webkit-column-rule-color"}, {    "name": "-webkit-column-rule-style"}, {    "name": "-webkit-column-rule-width"}, {    "name": "-webkit-column-span"}, {    "name": "-webkit-column-width"}, {    "name": "-webkit-filter"}, {    "name": "-webkit-highlight"}, {    "name": "-webkit-hyphenate-character"}, {    "name": "-webkit-line-box-contain"}, {    "name": "-webkit-line-break"}, {    "name": "-webkit-line-clamp"}, {    "name": "-webkit-margin-after-collapse"}, {    "name": "-webkit-margin-before-collapse"}, {    "name": "-webkit-margin-bottom-collapse"}, {    "name": "-webkit-margin-top-collapse"}, {    "name": "-webkit-mask-box-image-outset"}, {    "name": "-webkit-mask-box-image-repeat"}, {    "name": "-webkit-mask-box-image-slice"}, {    "name": "-webkit-mask-box-image-source"}, {    "name": "-webkit-mask-box-image-width"}, {    "name": "-webkit-mask-clip"}, {    "name": "-webkit-mask-composite"}, {    "name": "-webkit-mask-image"}, {    "name": "-webkit-mask-origin"}, {    "name": "-webkit-mask-position-x"}, {    "name": "-webkit-mask-position-y"}, {    "name": "-webkit-mask-repeat-x"}, {    "name": "-webkit-mask-repeat-y"}, {    "name": "-webkit-mask-size"}, {    "name": "-webkit-perspective-origin-x"}, {    "name": "-webkit-perspective-origin-y"}, {    "name": "-webkit-print-color-adjust"}, {    "name": "-webkit-rtl-ordering"}, {    "name": "-webkit-ruby-position"}, {    "name": "-webkit-tap-highlight-color"}, {    "name": "-webkit-text-combine"}, {    "name": "-webkit-text-emphasis-color"}, {    "name": "-webkit-text-emphasis-position"}, {    "name": "-webkit-text-emphasis-style"}, {    "name": "-webkit-text-fill-color"}, {    "name": "-webkit-text-security"}, {    "name": "-webkit-text-stroke-color"}, {    "name": "-webkit-text-stroke-width"}, {    "name": "-webkit-transform-origin-x"}, {    "name": "-webkit-transform-origin-y"}, {    "name": "-webkit-transform-origin-z"}, {    "name": "-webkit-user-drag"}, {    "name": "-webkit-user-modify"}, {    "name": "-webkit-user-select"}, {    "name": "white-space"}, {    "name": "widows"}, {    "name": "width"}, {    "name": "will-change"}, {    "name": "word-break"}, {    "name": "word-spacing"}, {    "name": "word-wrap"}, {    "name": "writing-mode"}, {    "name": "z-index"}, {    "name": "-webkit-border-end-color"}, {    "name": "-webkit-border-end-style"}, {    "name": "-webkit-border-end-width"}, {    "name": "-webkit-border-start-color"}, {    "name": "-webkit-border-start-style"}, {    "name": "-webkit-border-start-width"}, {    "name": "-webkit-border-before-color"}, {    "name": "-webkit-border-before-style"}, {    "name": "-webkit-border-before-width"}, {    "name": "-webkit-border-after-color"}, {    "name": "-webkit-border-after-style"}, {    "name": "-webkit-border-after-width"}, {    "name": "-webkit-margin-end"}, {    "name": "-webkit-margin-start"}, {    "name": "-webkit-margin-before"}, {    "name": "-webkit-margin-after"}, {    "name": "-webkit-padding-end"}, {    "name": "-webkit-padding-start"}, {    "name": "-webkit-padding-before"}, {    "name": "-webkit-padding-after"}, {    "name": "-webkit-logical-width"}, {    "name": "-webkit-logical-height"}, {    "name": "-webkit-min-logical-width"}, {    "name": "-webkit-min-logical-height"}, {    "name": "-webkit-max-logical-width"}, {    "name": "-webkit-max-logical-height"}, {    "name": "all"}, {    "name": "enable-background"}, {    "name": "max-zoom"}, {    "name": "min-zoom"}, {    "name": "orientation"}, {    "name": "page"}, {    "name": "src"}, {    "name": "unicode-range"}, {    "name": "user-zoom"}, {    "name": "-webkit-font-size-delta"}, {    "name": "-webkit-text-decorations-in-effect"}, {    "longhands": ["animation-name", "animation-duration", "animation-timing-function", "animation-delay", "animation-iteration-count", "animation-direction", "animation-fill-mode", "animation-play-state"],    "name": "animation"}, {    "longhands": ["background-image", "background-position-x", "background-position-y", "background-size", "background-repeat-x", "background-repeat-y", "background-attachment", "background-origin", "background-clip", "background-color"],    "name": "background"}, {    "longhands": ["background-position-x", "background-position-y"],    "name": "background-position"}, {    "longhands": ["background-repeat-x", "background-repeat-y"],    "name": "background-repeat"}, {    "longhands": ["border-top-color", "border-top-style", "border-top-width", "border-right-color", "border-right-style", "border-right-width", "border-bottom-color", "border-bottom-style", "border-bottom-width", "border-left-color", "border-left-style", "border-left-width"],    "name": "border"}, {    "longhands": ["border-bottom-width", "border-bottom-style", "border-bottom-color"],    "name": "border-bottom"}, {    "longhands": ["border-top-color", "border-right-color", "border-bottom-color", "border-left-color"],    "name": "border-color"}, {    "longhands": ["border-image-source", "border-image-slice", "border-image-width", "border-image-outset", "border-image-repeat"],    "name": "border-image"}, {    "longhands": ["border-left-width", "border-left-style", "border-left-color"],    "name": "border-left"}, {    "longhands": ["border-top-left-radius", "border-top-right-radius", "border-bottom-right-radius", "border-bottom-left-radius"],    "name": "border-radius"}, {    "longhands": ["border-right-width", "border-right-style", "border-right-color"],    "name": "border-right"}, {    "longhands": ["-webkit-border-horizontal-spacing", "-webkit-border-vertical-spacing"],    "name": "border-spacing"}, {    "longhands": ["border-top-style", "border-right-style", "border-bottom-style", "border-left-style"],    "name": "border-style"}, {    "longhands": ["border-top-width", "border-top-style", "border-top-color"],    "name": "border-top"}, {    "longhands": ["border-top-width", "border-right-width", "border-bottom-width", "border-left-width"],    "name": "border-width"}, {    "longhands": ["flex-grow", "flex-shrink", "flex-basis"],    "name": "flex"}, {    "longhands": ["flex-direction", "flex-wrap"],    "name": "flex-flow"}, {    "longhands": ["font-style", "font-variant", "font-weight", "font-stretch", "font-size", "line-height", "font-family"],    "name": "font"}, {    "longhands": ["grid-template-columns", "grid-template-rows", "grid-template-areas", "grid-auto-flow", "grid-auto-columns", "grid-auto-rows"],    "name": "grid"}, {    "longhands": ["grid-row-start", "grid-column-start", "grid-row-end", "grid-column-end"],    "name": "grid-area"}, {    "longhands": ["grid-column-start", "grid-column-end"],    "name": "grid-column"}, {    "longhands": ["grid-row-start", "grid-row-end"],    "name": "grid-row"}, {    "longhands": ["grid-template-columns", "grid-template-rows", "grid-template-areas"],    "name": "grid-template"}, {    "longhands": ["list-style-type", "list-style-position", "list-style-image"],    "name": "list-style"}, {    "longhands": ["margin-top", "margin-right", "margin-bottom", "margin-left"],    "name": "margin"}, {    "longhands": ["marker-start", "marker-mid", "marker-end"],    "name": "marker"}, {    "longhands": ["motion-path", "motion-offset", "motion-rotation"],    "name": "motion"}, {    "longhands": ["outline-color", "outline-style", "outline-width"],    "name": "outline"}, {    "longhands": ["overflow-x", "overflow-y"],    "name": "overflow"}, {    "longhands": ["padding-top", "padding-right", "padding-bottom", "padding-left"],    "name": "padding"}, {    "longhands": ["transition-property", "transition-duration", "transition-timing-function", "transition-delay"],    "name": "transition"}, {    "longhands": ["-webkit-border-after-width", "-webkit-border-after-style", "-webkit-border-after-color"],    "name": "-webkit-border-after"}, {    "longhands": ["-webkit-border-before-width", "-webkit-border-before-style", "-webkit-border-before-color"],    "name": "-webkit-border-before"}, {    "longhands": ["-webkit-border-end-width", "-webkit-border-end-style", "-webkit-border-end-color"],    "name": "-webkit-border-end"}, {    "longhands": ["-webkit-border-start-width", "-webkit-border-start-style", "-webkit-border-start-color"],    "name": "-webkit-border-start"}, {    "longhands": ["-webkit-column-rule-width", "-webkit-column-rule-style", "-webkit-column-rule-color"],    "name": "-webkit-column-rule"}, {    "longhands": ["-webkit-column-width", "-webkit-column-count"],    "name": "-webkit-columns"}, {    "longhands": ["-webkit-margin-before-collapse", "-webkit-margin-after-collapse"],    "name": "-webkit-margin-collapse"}, {    "longhands": ["-webkit-mask-image", "-webkit-mask-position-x", "-webkit-mask-position-y", "-webkit-mask-size", "-webkit-mask-repeat-x", "-webkit-mask-repeat-y", "-webkit-mask-origin", "-webkit-mask-clip"],    "name": "-webkit-mask"}, {    "longhands": ["-webkit-mask-box-image-source", "-webkit-mask-box-image-slice", "-webkit-mask-box-image-width", "-webkit-mask-box-image-outset", "-webkit-mask-box-image-repeat"],    "name": "-webkit-mask-box-image"}, {    "longhands": ["-webkit-mask-position-x", "-webkit-mask-position-y"],    "name": "-webkit-mask-position"}, {    "longhands": ["-webkit-mask-repeat-x", "-webkit-mask-repeat-y"],    "name": "-webkit-mask-repeat"}, {    "longhands": ["-webkit-text-emphasis-style", "-webkit-text-emphasis-color"],    "name": "-webkit-text-emphasis"}, {    "longhands": ["-webkit-text-stroke-width", "-webkit-text-stroke-color"],    "name": "-webkit-text-stroke"}]);;WebInspector.ExcludedFolderManager = function() {    WebInspector.Object.call(this);    this._excludedFoldersSetting = WebInspector.settings.createLocalSetting("workspaceExcludedFolders", {});    var defaultCommonExcludedFolders = ["/\\.git/", "/\\.sass-cache/", "/\\.hg/", "/\\.idea/", "/\\.svn/", "/\\.cache/", "/\\.project/"];    var defaultWinExcludedFolders = ["/Thumbs.db$", "/ehthumbs.db$", "/Desktop.ini$", "/\\$RECYCLE.BIN/"];    var defaultMacExcludedFolders = ["/\\.DS_Store$", "/\\.Trashes$", "/\\.Spotlight-V100$", "/\\.AppleDouble$", "/\\.LSOverride$", "/Icon$", "/\\._.*$"];    var defaultLinuxExcludedFolders = ["/.*~$"];    var defaultExcludedFolders = defaultCommonExcludedFolders;    if (WebInspector.isWin())        defaultExcludedFolders = defaultExcludedFolders.concat(defaultWinExcludedFolders);    else if (WebInspector.isMac())        defaultExcludedFolders = defaultExcludedFolders.concat(defaultMacExcludedFolders);    else        defaultExcludedFolders = defaultExcludedFolders.concat(defaultLinuxExcludedFolders);    var defaultExcludedFoldersPattern = defaultExcludedFolders.join("|");    this._workspaceFolderExcludePatternSetting = WebInspector.settings.createRegExpSetting("workspaceFolderExcludePattern", defaultExcludedFoldersPattern, WebInspector.isWin() ? "i" : "");    this._excludedFolders = {};    this._loadFromSettings();}WebInspector.ExcludedFolderManager.Events = {    ExcludedFolderAdded: "ExcludedFolderAdded",    ExcludedFolderRemoved: "ExcludedFolderRemoved"}WebInspector.ExcludedFolderManager.prototype = {    workspaceFolderExcludePatternSetting: function()     {        return this._workspaceFolderExcludePatternSetting;    },    _loadFromSettings: function()     {        var savedExcludedFolders = this._excludedFoldersSetting.get();        this._excludedFolders = {};        for (var fileSystemPath in savedExcludedFolders) {            var savedExcludedFoldersForPath = savedExcludedFolders[fileSystemPath];            this._excludedFolders[fileSystemPath] = [];            var excludedFolders = this._excludedFolders[fileSystemPath];            for (var i = 0; i < savedExcludedFoldersForPath.length; ++i) {                var savedEntry = savedExcludedFoldersForPath[i];                var entry = new WebInspector.ExcludedFolderManager.Entry(savedEntry.fileSystemPath,savedEntry.path);                excludedFolders.push(entry);            }        }    },    _saveToSettings: function()     {        var savedExcludedFolders = this._excludedFolders;        this._excludedFoldersSetting.set(savedExcludedFolders);    },    addExcludedFolder: function(fileSystemPath, excludedFolderPath)     {        if (!this._excludedFolders[fileSystemPath])            this._excludedFolders[fileSystemPath] = [];        var entry = new WebInspector.ExcludedFolderManager.Entry(fileSystemPath,excludedFolderPath);        this._excludedFolders[fileSystemPath].push(entry);        this._saveToSettings();        this.dispatchEventToListeners(WebInspector.ExcludedFolderManager.Events.ExcludedFolderAdded, entry);    },    removeExcludedFolder: function(fileSystemPath, path)     {        var entry = this._excludedFolderEntryForPath(fileSystemPath, path);        if (!entry)            return;        this._excludedFolders[fileSystemPath].remove(entry);        this._saveToSettings();        this.dispatchEventToListeners(WebInspector.ExcludedFolderManager.Events.ExcludedFolderRemoved, entry);    },    removeFileSystem: function(fileSystemPath)     {        delete this._excludedFolders[fileSystemPath];        this._saveToSettings();    },    _excludedFolderEntryForPath: function(fileSystemPath, path)     {        var entries = this._excludedFolders[fileSystemPath];        if (!entries)            return null ;        for (var i = 0; i < entries.length; ++i) {            if (entries[i].path === path)                return entries[i];        }        return null ;    },    isFileExcluded: function(fileSystemPath, folderPath)     {        var excludedFolders = this._excludedFolders[fileSystemPath] || [];        for (var i = 0; i < excludedFolders.length; ++i) {            var entry = excludedFolders[i];            if (entry.path === folderPath)                return true;        }        var regex = this._workspaceFolderExcludePatternSetting.asRegExp();        return !!(regex && regex.test(folderPath));    },    excludedFolders: function(fileSystemPath)     {        var excludedFolders = this._excludedFolders[fileSystemPath];        return excludedFolders ? excludedFolders.slice() : [];    },    __proto__: WebInspector.Object.prototype}WebInspector.ExcludedFolderManager.Entry = function(fileSystemPath, path) {    this.fileSystemPath = fileSystemPath;    this.path = path;};WebInspector.FileManager = function() {    this._savedURLsSetting = WebInspector.settings.createLocalSetting("savedURLs", {});    this._saveCallbacks = {};    InspectorFrontendHost.events.addEventListener(InspectorFrontendHostAPI.Events.SavedURL, this._savedURL, this);    InspectorFrontendHost.events.addEventListener(InspectorFrontendHostAPI.Events.CanceledSaveURL, this._canceledSaveURL, this);    InspectorFrontendHost.events.addEventListener(InspectorFrontendHostAPI.Events.AppendedToURL, this._appendedToURL, this);}WebInspector.FileManager.EventTypes = {    SavedURL: "SavedURL",    AppendedToURL: "AppendedToURL"}WebInspector.FileManager.prototype = {    save: function(url, content, forceSaveAs, callback)     {        var savedURLs = this._savedURLsSetting.get();        delete savedURLs[url];        this._savedURLsSetting.set(savedURLs);        this._saveCallbacks[url] = callback || null ;        InspectorFrontendHost.save(url, content, forceSaveAs);    },    _savedURL: function(event)     {        var url = (event.data);        var savedURLs = this._savedURLsSetting.get();        savedURLs[url] = true;        this._savedURLsSetting.set(savedURLs);        this.dispatchEventToListeners(WebInspector.FileManager.EventTypes.SavedURL, url);        this._invokeSaveCallback(url, true);    },    _invokeSaveCallback: function(url, accepted)     {        var callback = this._saveCallbacks[url];        delete this._saveCallbacks[url];        if (callback)            callback(accepted);    },    _canceledSaveURL: function(event)     {        var url = (event.data);        this._invokeSaveCallback(url, false);    },    isURLSaved: function(url)     {        var savedURLs = this._savedURLsSetting.get();        return savedURLs[url];    },    append: function(url, content)     {        InspectorFrontendHost.append(url, content);    },    close: function(url)     {},    _appendedToURL: function(event)     {        var url = (event.data);        this.dispatchEventToListeners(WebInspector.FileManager.EventTypes.AppendedToURL, url);    },    __proto__: WebInspector.Object.prototype}WebInspector.fileManager = null ;;WebInspector.FileSystemMapping = function() {    WebInspector.Object.call(this);    this._fileSystemMappingSetting = WebInspector.settings.createLocalSetting("fileSystemMapping", {});    this._fileSystemMappings = {};    this._loadFromSettings();}WebInspector.FileSystemMapping.Events = {    FileMappingAdded: "FileMappingAdded",    FileMappingRemoved: "FileMappingRemoved"}WebInspector.FileSystemMapping.prototype = {    _loadFromSettings: function()     {        var savedMapping = this._fileSystemMappingSetting.get();        this._fileSystemMappings = {};        for (var fileSystemPath in savedMapping) {            var savedFileSystemMappings = savedMapping[fileSystemPath];            this._fileSystemMappings[fileSystemPath] = [];            var fileSystemMappings = this._fileSystemMappings[fileSystemPath];            for (var i = 0; i < savedFileSystemMappings.length; ++i) {                var savedEntry = savedFileSystemMappings[i];                var entry = new WebInspector.FileSystemMapping.Entry(savedEntry.fileSystemPath,savedEntry.urlPrefix,savedEntry.pathPrefix);                fileSystemMappings.push(entry);            }        }        this._rebuildIndexes();    },    _saveToSettings: function()     {        var savedMapping = this._fileSystemMappings;        this._fileSystemMappingSetting.set(savedMapping);        this._rebuildIndexes();    },    _rebuildIndexes: function()     {        this._mappingForURLPrefix = {};        this._urlPrefixes = [];        for (var fileSystemPath in this._fileSystemMappings) {            var fileSystemMapping = this._fileSystemMappings[fileSystemPath];            for (var i = 0; i < fileSystemMapping.length; ++i) {                var entry = fileSystemMapping[i];                this._mappingForURLPrefix[entry.urlPrefix] = entry;                this._urlPrefixes.push(entry.urlPrefix);            }        }        this._urlPrefixes.sort();    },    addFileSystem: function(fileSystemPath)     {        if (this._fileSystemMappings[fileSystemPath])            return;        this._fileSystemMappings[fileSystemPath] = [];        this._saveToSettings();    },    removeFileSystem: function(fileSystemPath)     {        if (!this._fileSystemMappings[fileSystemPath])            return;        delete this._fileSystemMappings[fileSystemPath];        this._saveToSettings();    },    addFileMapping: function(fileSystemPath, urlPrefix, pathPrefix)     {        var entry = new WebInspector.FileSystemMapping.Entry(fileSystemPath,urlPrefix,pathPrefix);        this._fileSystemMappings[fileSystemPath].push(entry);        this._saveToSettings();        this.dispatchEventToListeners(WebInspector.FileSystemMapping.Events.FileMappingAdded, entry);    },    removeFileMapping: function(fileSystemPath, urlPrefix, pathPrefix)     {        var entry = this._mappingEntryForPathPrefix(fileSystemPath, pathPrefix);        if (!entry)            return;        this._fileSystemMappings[fileSystemPath].remove(entry);        this._saveToSettings();        this.dispatchEventToListeners(WebInspector.FileSystemMapping.Events.FileMappingRemoved, entry);    },    fileSystemPaths: function()     {        return Object.keys(this._fileSystemMappings);    },    _mappingEntryForURL: function(url)     {        for (var i = this._urlPrefixes.length - 1; i >= 0; --i) {            var urlPrefix = this._urlPrefixes[i];            if (url.startsWith(urlPrefix))                return this._mappingForURLPrefix[urlPrefix];        }        return null ;    },    _mappingEntryForPath: function(fileSystemPath, filePath)     {        var entries = this._fileSystemMappings[fileSystemPath];        if (!entries)            return null ;        var entry = null ;        for (var i = 0; i < entries.length; ++i) {            var pathPrefix = entries[i].pathPrefix;            if (entry && entry.pathPrefix.length > pathPrefix.length)                continue;if (filePath.startsWith(pathPrefix.substr(1)))                entry = entries[i];        }        return entry;    },    _mappingEntryForPathPrefix: function(fileSystemPath, pathPrefix)     {        var entries = this._fileSystemMappings[fileSystemPath];        for (var i = 0; i < entries.length; ++i) {            if (pathPrefix === entries[i].pathPrefix)                return entries[i];        }        return null ;    },    mappingEntries: function(fileSystemPath)     {        return this._fileSystemMappings[fileSystemPath].slice();    },    hasMappingForURL: function(url)     {        return !!this._mappingEntryForURL(url);    },    fileForURL: function(url)     {        var entry = this._mappingEntryForURL(url);        if (!entry)            return null ;        var file = {};        file.fileSystemPath = entry.fileSystemPath;        file.filePath = entry.pathPrefix.substr(1) + url.substr(entry.urlPrefix.length);        return file;    },    urlForPath: function(fileSystemPath, filePath)     {        var entry = this._mappingEntryForPath(fileSystemPath, filePath);        if (!entry)            return "";        return entry.urlPrefix + filePath.substring(entry.pathPrefix.length - 1);    },    removeMappingForURL: function(url)     {        var entry = this._mappingEntryForURL(url);        if (!entry)            return;        this._fileSystemMappings[entry.fileSystemPath].remove(entry);        this._saveToSettings();    },    addMappingForResource: function(url, fileSystemPath, filePath)     {        var commonPathSuffixLength = 0;        var normalizedFilePath = "/" + filePath;        for (var i = 0; i < normalizedFilePath.length; ++i) {            var filePathCharacter = normalizedFilePath[normalizedFilePath.length - 1 - i];            var urlCharacter = url[url.length - 1 - i];            if (filePathCharacter !== urlCharacter)                break;            if (filePathCharacter === "/")                commonPathSuffixLength = i;        }        var pathPrefix = normalizedFilePath.substr(0, normalizedFilePath.length - commonPathSuffixLength);        var urlPrefix = url.substr(0, url.length - commonPathSuffixLength);        this.addFileMapping(fileSystemPath, urlPrefix, pathPrefix);    },    __proto__: WebInspector.Object.prototype}WebInspector.FileSystemMapping.Entry = function(fileSystemPath, urlPrefix, pathPrefix) {    this.fileSystemPath = fileSystemPath;    this.urlPrefix = urlPrefix;    this.pathPrefix = pathPrefix;};WebInspector.IsolatedFileSystem = function(manager, path, name, rootURL) {    this._manager = manager;    this._path = path;    this._name = name;    this._rootURL = rootURL;}WebInspector.IsolatedFileSystem.errorMessage = function(error) {    return WebInspector.UIString("File system error: %s", error.message);}WebInspector.IsolatedFileSystem.normalizePath = function(fileSystemPath) {    if (WebInspector.isWin())        return fileSystemPath.replace(/\\/g, "/");    return fileSystemPath;}WebInspector.IsolatedFileSystem.prototype = {    path: function()     {        return this._path;    },    normalizedPath: function()     {        if (this._normalizedPath)            return this._normalizedPath;        this._normalizedPath = WebInspector.IsolatedFileSystem.normalizePath(this._path);        return this._normalizedPath;    },    name: function()     {        return this._name;    },    rootURL: function()     {        return this._rootURL;    },    _requestFileSystem: function(callback)     {        this._manager.requestDOMFileSystem(this._path, callback);    },    requestFilesRecursive: function(path, fileCallback, finishedCallback)     {        var domFileSystem;        var pendingRequests = 0;        this._requestFileSystem(fileSystemLoaded.bind(this));        function fileSystemLoaded(fs)         {            domFileSystem = (fs);            console.assert(domFileSystem);            ++pendingRequests;            this._requestEntries(domFileSystem, path, innerCallback.bind(this));        }        function innerCallback(entries)         {            for (var i = 0; i < entries.length; ++i) {                var entry = entries[i];                if (!entry.isDirectory) {                    if (this._manager.excludedFolderManager().isFileExcluded(this._path, entry.fullPath))                        continue;fileCallback(entry.fullPath.substr(1));                }                 else {                    if (this._manager.excludedFolderManager().isFileExcluded(this._path, entry.fullPath + "/"))                        continue;++pendingRequests;                    this._requestEntries(domFileSystem, entry.fullPath, innerCallback.bind(this));                }            }            if (finishedCallback && (--pendingRequests === 0))                finishedCallback();        }    },    createFile: function(path, name, callback)     {        this._requestFileSystem(fileSystemLoaded.bind(this));        var newFileIndex = 1;        if (!name)            name = "NewFile";        var nameCandidate;        function fileSystemLoaded(fs)         {            var domFileSystem = (fs);            console.assert(domFileSystem);            domFileSystem.root.getDirectory(path, null , dirEntryLoaded.bind(this), errorHandler.bind(this));        }        function dirEntryLoaded(dirEntry)         {            var nameCandidate = name;            if (newFileIndex > 1)                nameCandidate += newFileIndex;            ++newFileIndex;            dirEntry.getFile(nameCandidate, {                create: true,                exclusive: true            }, fileCreated, fileCreationError.bind(this));            function fileCreated(entry)             {                callback(entry.fullPath.substr(1));            }            function fileCreationError(error)             {                if (error.code === FileError.INVALID_MODIFICATION_ERR) {                    dirEntryLoaded.call(this, dirEntry);                    return;                }                var errorMessage = WebInspector.IsolatedFileSystem.errorMessage(error);                console.error(errorMessage + " when testing if file exists '" + (this._path + "/" + path + "/" + nameCandidate) + "'");                callback(null );            }        }        function errorHandler(error)         {            var errorMessage = WebInspector.IsolatedFileSystem.errorMessage(error);            var filePath = this._path + "/" + path;            if (nameCandidate)                filePath += "/" + nameCandidate;            console.error(errorMessage + " when getting content for file '" + (filePath) + "'");            callback(null );        }    },    deleteFile: function(path)     {        this._requestFileSystem(fileSystemLoaded.bind(this));        function fileSystemLoaded(fs)         {            var domFileSystem = (fs);            console.assert(domFileSystem);            domFileSystem.root.getFile(path, null , fileEntryLoaded.bind(this), errorHandler.bind(this));        }        function fileEntryLoaded(fileEntry)         {            fileEntry.remove(fileEntryRemoved, errorHandler.bind(this));        }        function fileEntryRemoved()         {}        function errorHandler(error)         {            var errorMessage = WebInspector.IsolatedFileSystem.errorMessage(error);            console.error(errorMessage + " when deleting file '" + (this._path + "/" + path) + "'");        }    },    requestMetadata: function(path, callback)     {        this._requestFileSystem(fileSystemLoaded);        function fileSystemLoaded(fs)         {            var domFileSystem = (fs);            console.assert(domFileSystem);            domFileSystem.root.getFile(path, null , fileEntryLoaded, errorHandler);        }        function fileEntryLoaded(entry)         {            entry.getMetadata(successHandler, errorHandler);        }        function successHandler(metadata)         {            callback(metadata.modificationTime, metadata.size);        }        function errorHandler(error)         {            callback(null , null );        }    },    requestFileContent: function(path, callback)     {        this._requestFileSystem(fileSystemLoaded.bind(this));        function fileSystemLoaded(fs)         {            var domFileSystem = (fs);            console.assert(domFileSystem);            domFileSystem.root.getFile(path, null , fileEntryLoaded.bind(this), errorHandler.bind(this));        }        function fileEntryLoaded(entry)         {            entry.file(fileLoaded, errorHandler.bind(this));        }        function fileLoaded(file)         {            var reader = new FileReader();            reader.onloadend = readerLoadEnd;            reader.readAsText(file);        }        function readerLoadEnd()         {            var string = null ;            try {                string = (this.result);            } catch (e) {                console.error("Can't read file: " + path + ": " + e);            }            callback(string);        }        function errorHandler(error)         {            if (error.code === FileError.NOT_FOUND_ERR) {                callback(null );                return;            }            var errorMessage = WebInspector.IsolatedFileSystem.errorMessage(error);            console.error(errorMessage + " when getting content for file '" + (this._path + "/" + path) + "'");            callback(null );        }    },    setFileContent: function(path, content, callback)     {        this._requestFileSystem(fileSystemLoaded.bind(this));        WebInspector.userMetrics.FileSavedInWorkspace.record();        function fileSystemLoaded(fs)         {            var domFileSystem = (fs);            console.assert(domFileSystem);            domFileSystem.root.getFile(path, {                create: true            }, fileEntryLoaded.bind(this), errorHandler.bind(this));        }        function fileEntryLoaded(entry)         {            entry.createWriter(fileWriterCreated.bind(this), errorHandler.bind(this));        }        function fileWriterCreated(fileWriter)         {            fileWriter.onerror = errorHandler.bind(this);            fileWriter.onwriteend = fileWritten;            var blob = new Blob([content],{                type: "text/plain"            });            fileWriter.write(blob);            function fileWritten()             {                fileWriter.onwriteend = writerEnd;                fileWriter.truncate(blob.size);            }        }        function writerEnd()         {            callback();        }        function errorHandler(error)         {            var errorMessage = WebInspector.IsolatedFileSystem.errorMessage(error);            console.error(errorMessage + " when setting content for file '" + (this._path + "/" + path) + "'");            callback();        }    },    renameFile: function(path, newName, callback)     {        newName = newName ? newName.trim() : newName;        if (!newName || newName.indexOf("/") !== -1) {            callback(false);            return;        }        var fileEntry;        var dirEntry;        this._requestFileSystem(fileSystemLoaded.bind(this));        function fileSystemLoaded(fs)         {            var domFileSystem = (fs);            console.assert(domFileSystem);            domFileSystem.root.getFile(path, null , fileEntryLoaded.bind(this), errorHandler.bind(this));        }        function fileEntryLoaded(entry)         {            if (entry.name === newName) {                callback(false);                return;            }            fileEntry = entry;            fileEntry.getParent(dirEntryLoaded.bind(this), errorHandler.bind(this));        }        function dirEntryLoaded(entry)         {            dirEntry = entry;            dirEntry.getFile(newName, null , newFileEntryLoaded, newFileEntryLoadErrorHandler.bind(this));        }        function newFileEntryLoaded(entry)         {            callback(false);        }        function newFileEntryLoadErrorHandler(error)         {            if (error.code !== FileError.NOT_FOUND_ERR) {                callback(false);                return;            }            fileEntry.moveTo(dirEntry, newName, fileRenamed, errorHandler.bind(this));        }        function fileRenamed(entry)         {            callback(true, entry.name);        }        function errorHandler(error)         {            var errorMessage = WebInspector.IsolatedFileSystem.errorMessage(error);            console.error(errorMessage + " when renaming file '" + (this._path + "/" + path) + "' to '" + newName + "'");            callback(false);        }    },    _readDirectory: function(dirEntry, callback)     {        var dirReader = dirEntry.createReader();        var entries = [];        function innerCallback(results)         {            if (!results.length)                callback(entries.sort());            else {                entries = entries.concat(toArray(results));                dirReader.readEntries(innerCallback, errorHandler);            }        }        function toArray(list)         {            return Array.prototype.slice.call(list || [], 0);        }        dirReader.readEntries(innerCallback, errorHandler);        function errorHandler(error)         {            var errorMessage = WebInspector.IsolatedFileSystem.errorMessage(error);            console.error(errorMessage + " when reading directory '" + dirEntry.fullPath + "'");            callback([]);        }    },    _requestEntries: function(domFileSystem, path, callback)     {        domFileSystem.root.getDirectory(path, null , innerCallback.bind(this), errorHandler);        function innerCallback(dirEntry)         {            this._readDirectory(dirEntry, callback);        }        function errorHandler(error)         {            var errorMessage = WebInspector.IsolatedFileSystem.errorMessage(error);            console.error(errorMessage + " when requesting entry '" + path + "'");            callback([]);        }    }};WebInspector.IsolatedFileSystemManager = function() {    this._fileSystems = {};    this._pendingFileSystemRequests = {};    this._fileSystemMapping = new WebInspector.FileSystemMapping();    this._excludedFolderManager = new WebInspector.ExcludedFolderManager();    this._requestFileSystems();    InspectorFrontendHost.events.addEventListener(InspectorFrontendHostAPI.Events.FileSystemsLoaded, this._onFileSystemsLoaded, this);    InspectorFrontendHost.events.addEventListener(InspectorFrontendHostAPI.Events.FileSystemRemoved, this._onFileSystemRemoved, this);    InspectorFrontendHost.events.addEventListener(InspectorFrontendHostAPI.Events.FileSystemAdded, this._onFileSystemAdded, this);}WebInspector.IsolatedFileSystemManager.FileSystem;WebInspector.IsolatedFileSystemManager.Events = {    FileSystemAdded: "FileSystemAdded",    FileSystemRemoved: "FileSystemRemoved"}WebInspector.IsolatedFileSystemManager.prototype = {    mapping: function()     {        return this._fileSystemMapping;    },    excludedFolderManager: function()     {        return this._excludedFolderManager;    },    _requestFileSystems: function()     {        console.assert(!this._loaded);        InspectorFrontendHost.requestFileSystems();    },    addFileSystem: function()     {        InspectorFrontendHost.addFileSystem();    },    removeFileSystem: function(fileSystemPath)     {        InspectorFrontendHost.removeFileSystem(fileSystemPath);    },    _onFileSystemsLoaded: function(event)     {        var fileSystems = (event.data);        var addedFileSystemPaths = {};        for (var i = 0; i < fileSystems.length; ++i) {            this._innerAddFileSystem(fileSystems[i]);            addedFileSystemPaths[fileSystems[i].fileSystemPath] = true;        }        var fileSystemPaths = this._fileSystemMapping.fileSystemPaths();        for (var i = 0; i < fileSystemPaths.length; ++i) {            var fileSystemPath = fileSystemPaths[i];            if (!addedFileSystemPaths[fileSystemPath])                this._fileSystemRemoved(fileSystemPath);        }        this._loaded = true;        this._processPendingFileSystemRequests();    },    _innerAddFileSystem: function(fileSystem)     {        var fileSystemPath = fileSystem.fileSystemPath;        this._fileSystemMapping.addFileSystem(fileSystemPath);        var isolatedFileSystem = new WebInspector.IsolatedFileSystem(this,fileSystemPath,fileSystem.fileSystemName,fileSystem.rootURL);        this._fileSystems[fileSystemPath] = isolatedFileSystem;        this.dispatchEventToListeners(WebInspector.IsolatedFileSystemManager.Events.FileSystemAdded, isolatedFileSystem);    },    _processPendingFileSystemRequests: function()     {        for (var fileSystemPath in this._pendingFileSystemRequests) {            var callbacks = this._pendingFileSystemRequests[fileSystemPath];            for (var i = 0; i < callbacks.length; ++i)                callbacks[i](this._isolatedFileSystem(fileSystemPath));        }        delete this._pendingFileSystemRequests;    },    _onFileSystemAdded: function(event)     {        var errorMessage = (event.data["errorMessage"]);        var fileSystem = (event.data["fileSystem"]);        if (errorMessage)            WebInspector.console.error(errorMessage, true);        else if (fileSystem)            this._innerAddFileSystem(fileSystem);    },    _onFileSystemRemoved: function(event)     {        this._fileSystemRemoved((event.data));    },    _fileSystemRemoved: function(fileSystemPath)     {        this._fileSystemMapping.removeFileSystem(fileSystemPath);        this._excludedFolderManager.removeFileSystem(fileSystemPath);        var isolatedFileSystem = this._fileSystems[fileSystemPath];        delete this._fileSystems[fileSystemPath];        if (isolatedFileSystem)            this.dispatchEventToListeners(WebInspector.IsolatedFileSystemManager.Events.FileSystemRemoved, isolatedFileSystem);    },    _isolatedFileSystem: function(fileSystemPath)     {        var fileSystem = this._fileSystems[fileSystemPath];        if (!fileSystem)            return null ;        if (!InspectorFrontendHost.isolatedFileSystem)            return null ;        return InspectorFrontendHost.isolatedFileSystem(fileSystem.name(), fileSystem.rootURL());    },    requestDOMFileSystem: function(fileSystemPath, callback)     {        if (!this._loaded) {            if (!this._pendingFileSystemRequests[fileSystemPath])                this._pendingFileSystemRequests[fileSystemPath] = this._pendingFileSystemRequests[fileSystemPath] || [];            this._pendingFileSystemRequests[fileSystemPath].push(callback);            return;        }        callback(this._isolatedFileSystem(fileSystemPath));    },    __proto__: WebInspector.Object.prototype}WebInspector.isolatedFileSystemManager;;WebInspector.SearchConfig = function(query, ignoreCase, isRegex) {    this._query = query;    this._ignoreCase = ignoreCase;    this._isRegex = isRegex;    this._parse();}WebInspector.SearchConfig.RegexQuery;WebInspector.SearchConfig.fromPlainObject = function(object) {    return new WebInspector.SearchConfig(object.query,object.ignoreCase,object.isRegex);}WebInspector.SearchConfig.prototype = {    query: function()     {        return this._query;    },    ignoreCase: function()     {        return this._ignoreCase;    },    isRegex: function()     {        return this._isRegex;    },    toPlainObject: function()     {        return {            query: this.query(),            ignoreCase: this.ignoreCase(),            isRegex: this.isRegex()        };    },    _parse: function()     {        var filePattern = "-?f(ile)?:(([^\\\\ ]|\\\\.)+)";        var quotedPattern = "\"(([^\\\\\"]|\\\\.)+)\"";        var unquotedWordPattern = "((?!-?f(ile)?:)[^\\\\ ]|\\\\.)+";        var unquotedPattern = unquotedWordPattern + "( +" + unquotedWordPattern + ")*";        var pattern = "(" + filePattern + ")|(" + quotedPattern + ")|(" + unquotedPattern + ")";        var regexp = new RegExp(pattern,"g");        var queryParts = this._query.match(regexp) || [];        this._fileQueries = [];        this._queries = [];        for (var i = 0; i < queryParts.length; ++i) {            var queryPart = queryParts[i];            if (!queryPart)                continue;var fileQuery = this._parseFileQuery(queryPart);            if (fileQuery) {                this._fileQueries.push(fileQuery);                this._fileRegexQueries = this._fileRegexQueries || [];                this._fileRegexQueries.push({                    regex: new RegExp(fileQuery.text,this.ignoreCase ? "i" : ""),                    isNegative: fileQuery.isNegative                });                continue;            }            if (queryPart.startsWith("\"")) {                if (!queryPart.endsWith("\""))                    continue;this._queries.push(this._parseQuotedQuery(queryPart));                continue;            }            this._queries.push(this._parseUnquotedQuery(queryPart));        }    },    filePathMatchesFileQuery: function(filePath)     {        if (!this._fileRegexQueries)            return true;        for (var i = 0; i < this._fileRegexQueries.length; ++i) {            if (!!filePath.match(this._fileRegexQueries[i].regex) === this._fileRegexQueries[i].isNegative)                return false;        }        return true;    },    queries: function()     {        return this._queries;    },    _parseUnquotedQuery: function(query)     {        return query.replace(/\\(.)/g, "$1");    },    _parseQuotedQuery: function(query)     {        return query.substring(1, query.length - 1).replace(/\\(.)/g, "$1");    },    _parseFileQuery: function(query)     {        var match = query.match(/^(-)?f(ile)?:/);        if (!match)            return null ;        var isNegative = !!match[1];        query = query.substr(match[0].length);        var result = "";        for (var i = 0; i < query.length; ++i) {            var char = query[i];            if (char === "*") {                result += ".*";            } else if (char === "\\") {                ++i;                var nextChar = query[i];                if (nextChar === " ")                    result += " ";            } else {                if (String.regexSpecialCharacters().indexOf(query.charAt(i)) !== -1)                    result += "\\";                result += query.charAt(i);            }        }        return new WebInspector.SearchConfig.QueryTerm(result,isNegative);    }}WebInspector.SearchConfig.QueryTerm = function(text, isNegative) {    this.text = text;    this.isNegative = isNegative;};WebInspector.UISourceCode = function(project, parentPath, name, originURL, url, contentType) {    this._project = project;    this._parentPath = parentPath;    this._name = name;    this._originURL = originURL;    this._url = url;    this._contentType = contentType;    this._requestContentCallbacks = [];    this.history = [];}WebInspector.UISourceCode.Events = {    WorkingCopyChanged: "WorkingCopyChanged",    WorkingCopyCommitted: "WorkingCopyCommitted",    TitleChanged: "TitleChanged",    SavedStateUpdated: "SavedStateUpdated",    SourceMappingChanged: "SourceMappingChanged",}WebInspector.UISourceCode.prototype = {    networkURL: function()     {        return this._url;    },    name: function()     {        return this._name;    },    parentPath: function()     {        return this._parentPath;    },    path: function()     {        return this._parentPath ? this._parentPath + "/" + this._name : this._name;    },    fullDisplayName: function()     {        return this._project.displayName() + "/" + (this._parentPath ? this._parentPath + "/" : "") + this.displayName(true);    },    displayName: function(skipTrim)     {        var displayName = this.name() || WebInspector.UIString("(index)");        return skipTrim ? displayName : displayName.trimEnd(100);    },    uri: function()     {        var path = this.path();        if (!this._project.url())            return path;        if (!path)            return this._project.url();        return this._project.url() + "/" + path;    },    originURL: function()     {        return this._originURL;    },    canRename: function()     {        return this._project.canRename();    },    rename: function(newName, callback)     {        this._project.rename(this, newName, innerCallback.bind(this));        function innerCallback(success, newName, newURL, newOriginURL, newContentType)         {            if (success)                this._updateName((newName), (newURL), (newOriginURL), (newContentType));            callback(success);        }    },    remove: function()     {        this._project.deleteFile(this.path());    },    _updateName: function(name, url, originURL, contentType)     {        var oldURI = this.uri();        this._name = name;        if (url)            this._url = url;        if (originURL)            this._originURL = originURL;        if (contentType)            this._contentType = contentType;        this.dispatchEventToListeners(WebInspector.UISourceCode.Events.TitleChanged, oldURI);    },    contentURL: function()     {        return this.originURL();    },    contentType: function()     {        return this._contentType;    },    project: function()     {        return this._project;    },    requestMetadata: function(callback)     {        this._project.requestMetadata(this, callback);    },    requestContent: function(callback)     {        if (this._content || this._contentLoaded) {            callback(this._content);            return;        }        this._requestContentCallbacks.push(callback);        if (this._requestContentCallbacks.length === 1)            this._project.requestFileContent(this, this._fireContentAvailable.bind(this));    },    _pushCheckContentUpdatedCallback: function(callback)     {        if (!this._checkContentUpdatedCallbacks)            this._checkContentUpdatedCallbacks = [];        this._checkContentUpdatedCallbacks.push(callback);    },    _terminateContentCheck: function()     {        delete this._checkingContent;        if (this._checkContentUpdatedCallbacks) {            this._checkContentUpdatedCallbacks.forEach(function(callback) {                callback();            }            );            delete this._checkContentUpdatedCallbacks;        }    },    checkContentUpdated: function(callback)     {        callback = callback || function() {}        ;        if (!this._project.canSetFileContent()) {            callback();            return;        }        this._pushCheckContentUpdatedCallback(callback);        if (this._checkingContent) {            return;        }        this._checkingContent = true;        this._project.requestFileContent(this, contentLoaded.bind(this));        function contentLoaded(updatedContent)         {            if (updatedContent === null ) {                var workingCopy = this.workingCopy();                this._commitContent("", false);                this.setWorkingCopy(workingCopy);                this._terminateContentCheck();                return;            }            if (typeof this._lastAcceptedContent === "string" && this._lastAcceptedContent === updatedContent) {                this._terminateContentCheck();                return;            }            if (this._content === updatedContent) {                delete this._lastAcceptedContent;                this._terminateContentCheck();                return;            }            if (!this.isDirty()) {                this._commitContent(updatedContent, false);                this._terminateContentCheck();                return;            }            var shouldUpdate = window.confirm(WebInspector.UIString("This file was changed externally. Would you like to reload it?"));            if (shouldUpdate)                this._commitContent(updatedContent, false);            else                this._lastAcceptedContent = updatedContent;            this._terminateContentCheck();        }    },    requestOriginalContent: function(callback)     {        this._project.requestFileContent(this, callback);    },    _commitContent: function(content, shouldSetContentInProject)     {        delete this._lastAcceptedContent;        this._content = content;        this._contentLoaded = true;        var lastRevision = this.history.length ? this.history[this.history.length - 1] : null ;        if (!lastRevision || lastRevision._content !== this._content) {            var revision = new WebInspector.Revision(this,this._content,new Date());            this.history.push(revision);        }        this._innerResetWorkingCopy();        this._hasCommittedChanges = true;        this.dispatchEventToListeners(WebInspector.UISourceCode.Events.WorkingCopyCommitted);        if (this._url && WebInspector.fileManager.isURLSaved(this._url))            this._saveURLWithFileManager(false, this._content);        if (shouldSetContentInProject)            this._project.setFileContent(this, this._content, function() {}            );    },    _saveURLWithFileManager: function(forceSaveAs, content)     {        WebInspector.fileManager.save(this._url, (content), forceSaveAs, callback.bind(this));        WebInspector.fileManager.close(this._url);        function callback(accepted)         {            this._savedWithFileManager = accepted;            if (accepted)                this._hasCommittedChanges = false;            this.dispatchEventToListeners(WebInspector.UISourceCode.Events.SavedStateUpdated);        }    },    save: function(forceSaveAs)     {        if (this.project().type() === WebInspector.projectTypes.FileSystem || this.project().type() === WebInspector.projectTypes.Snippets) {            this.commitWorkingCopy();            return;        }        if (this.isDirty()) {            this._saveURLWithFileManager(forceSaveAs, this.workingCopy());            this.commitWorkingCopy();            return;        }        this.requestContent(this._saveURLWithFileManager.bind(this, forceSaveAs));    },    hasUnsavedCommittedChanges: function()     {        if (this._savedWithFileManager || this.project().canSetFileContent() || this._project.isServiceProject())            return false;        if (this._project.workspace().hasResourceContentTrackingExtensions())            return false;        return !!this._hasCommittedChanges;    },    addRevision: function(content)     {        this._commitContent(content, true);    },    revertToOriginal: function()     {        function callback(content)         {            if (typeof content !== "string")                return;            this.addRevision(content);        }        WebInspector.userMetrics.RevisionApplied.record();        this.requestOriginalContent(callback.bind(this));    },    revertAndClearHistory: function(callback)     {        function revert(content)         {            if (typeof content !== "string")                return;            this.addRevision(content);            this.history = [];            callback(this);        }        WebInspector.userMetrics.RevisionApplied.record();        this.requestOriginalContent(revert.bind(this));    },    workingCopy: function()     {        if (this._workingCopyGetter) {            this._workingCopy = this._workingCopyGetter();            delete this._workingCopyGetter;        }        if (this.isDirty())            return this._workingCopy;        return this._content;    },    resetWorkingCopy: function()     {        this._innerResetWorkingCopy();        this.dispatchEventToListeners(WebInspector.UISourceCode.Events.WorkingCopyChanged);    },    _innerResetWorkingCopy: function()     {        delete this._workingCopy;        delete this._workingCopyGetter;    },    setWorkingCopy: function(newWorkingCopy)     {        this._workingCopy = newWorkingCopy;        delete this._workingCopyGetter;        this.dispatchEventToListeners(WebInspector.UISourceCode.Events.WorkingCopyChanged);    },    setWorkingCopyGetter: function(workingCopyGetter)     {        this._workingCopyGetter = workingCopyGetter;        this.dispatchEventToListeners(WebInspector.UISourceCode.Events.WorkingCopyChanged);    },    removeWorkingCopyGetter: function()     {        if (!this._workingCopyGetter)            return;        this._workingCopy = this._workingCopyGetter();        delete this._workingCopyGetter;    },    commitWorkingCopy: function()     {        if (this.isDirty())            this._commitContent(this.workingCopy(), true);    },    isDirty: function()     {        return typeof this._workingCopy !== "undefined" || typeof this._workingCopyGetter !== "undefined";    },    extension: function()     {        var lastIndexOfDot = this._name.lastIndexOf(".");        var extension = lastIndexOfDot !== -1 ? this._name.substr(lastIndexOfDot + 1) : "";        var indexOfQuestionMark = extension.indexOf("?");        if (indexOfQuestionMark !== -1)            extension = extension.substr(0, indexOfQuestionMark);        return extension;    },    content: function()     {        return this._content;    },    searchInContent: function(query, caseSensitive, isRegex, callback)     {        var content = this.content();        if (content) {            WebInspector.StaticContentProvider.searchInContent(content, query, caseSensitive, isRegex, callback);            return;        }        this._project.searchInFileContent(this, query, caseSensitive, isRegex, callback);    },    _fireContentAvailable: function(content)     {        this._contentLoaded = true;        this._content = content;        var callbacks = this._requestContentCallbacks.slice();        this._requestContentCallbacks = [];        for (var i = 0; i < callbacks.length; ++i)            callbacks[i](content);    },    contentLoaded: function()     {        return this._contentLoaded;    },    uiLocation: function(lineNumber, columnNumber)     {        if (typeof columnNumber === "undefined")            columnNumber = 0;        return new WebInspector.UILocation(this,lineNumber,columnNumber);    },    __proto__: WebInspector.Object.prototype}WebInspector.UILocation = function(uiSourceCode, lineNumber, columnNumber) {    this.uiSourceCode = uiSourceCode;    this.lineNumber = lineNumber;    this.columnNumber = columnNumber;}WebInspector.UILocation.prototype = {    linkText: function()     {        var linkText = this.uiSourceCode.displayName();        if (typeof this.lineNumber === "number")            linkText += ":" + (this.lineNumber + 1);        return linkText;    },    id: function()     {        return this.uiSourceCode.project().id() + ":" + this.uiSourceCode.uri() + ":" + this.lineNumber + ":" + this.columnNumber;    },    toUIString: function()     {        return this.uiSourceCode.uri() + ":" + (this.lineNumber + 1);    }}WebInspector.Revision = function(uiSourceCode, content, timestamp) {    this._uiSourceCode = uiSourceCode;    this._content = content;    this._timestamp = timestamp;}WebInspector.Revision.prototype = {    get uiSourceCode()     {        return this._uiSourceCode;    },    get timestamp()     {        return this._timestamp;    },    get content()     {        return this._content || null ;    },    revertToThis: function()     {        function revert(content)         {            if (this._uiSourceCode._content !== content)                this._uiSourceCode.addRevision(content);        }        WebInspector.userMetrics.RevisionApplied.record();        this.requestContent(revert.bind(this));    },    contentURL: function()     {        return this._uiSourceCode.originURL();    },    contentType: function()     {        return this._uiSourceCode.contentType();    },    requestContent: function(callback)     {        callback(this._content || "");    },    searchInContent: function(query, caseSensitive, isRegex, callback)     {        callback([]);    }};WebInspector.ProjectSearchConfig = function() {}WebInspector.ProjectSearchConfig.prototype = {    query: function() {},    ignoreCase: function() {},    isRegex: function() {},    queries: function() {},    filePathMatchesFileQuery: function(filePath) {}}WebInspector.FileDescriptor = function(parentPath, name, originURL, url, contentType) {    this.parentPath = parentPath;    this.name = name;    this.originURL = originURL;    this.url = url;    this.contentType = contentType;}WebInspector.ProjectDelegate = function() {}WebInspector.ProjectDelegate.Events = {    FileAdded: "FileAdded",    FileRemoved: "FileRemoved",}WebInspector.ProjectDelegate.prototype = {    type: function() {},    displayName: function() {},    url: function() {},    requestMetadata: function(path, callback) {},    requestFileContent: function(path, callback) {},    canSetFileContent: function() {},    setFileContent: function(path, newContent, callback) {},    canRename: function() {},    rename: function(path, newName, callback) {},    refresh: function(path, callback) {},    excludeFolder: function(path) {},    createFile: function(path, name, content, callback) {},    deleteFile: function(path) {},    remove: function() {},    searchInFileContent: function(path, query, caseSensitive, isRegex, callback) {},    findFilesMatchingSearchRequest: function(searchConfig, filesMathingFileQuery, progress, callback) {},    indexContent: function(progress) {}}WebInspector.Project = function(workspace, projectId, projectDelegate) {    this._uiSourceCodesMap = new Map();    this._uiSourceCodesList = [];    this._workspace = workspace;    this._projectId = projectId;    this._projectDelegate = projectDelegate;    this._url = this._projectDelegate.url();    this._displayName = this._projectDelegate.displayName();    projectDelegate.addEventListener(WebInspector.ProjectDelegate.Events.FileAdded, this._fileAdded, this);    projectDelegate.addEventListener(WebInspector.ProjectDelegate.Events.FileRemoved, this._fileRemoved, this);}WebInspector.Project.Events = {    DisplayNameUpdated: "DisplayNameUpdated"};WebInspector.Project.prototype = {    id: function()     {        return this._projectId;    },    type: function()     {        return this._projectDelegate.type();    },    displayName: function()     {        return this._displayName;    },    setDisplayName: function(displayName)     {        if (this._displayName === displayName)            return;        this._displayName = displayName;        this.dispatchEventToListeners(WebInspector.Project.Events.DisplayNameUpdated);    },    url: function()     {        return this._url;    },    isServiceProject: function()     {        return this._projectDelegate.type() === WebInspector.projectTypes.Debugger || this._projectDelegate.type() === WebInspector.projectTypes.Formatter || this._projectDelegate.type() === WebInspector.projectTypes.Service;    },    _fileAdded: function(event)     {        var fileDescriptor = (event.data);        var path = fileDescriptor.parentPath ? fileDescriptor.parentPath + "/" + fileDescriptor.name : fileDescriptor.name;        var uiSourceCode = this.uiSourceCode(path);        if (uiSourceCode)            return;        uiSourceCode = new WebInspector.UISourceCode(this,fileDescriptor.parentPath,fileDescriptor.name,fileDescriptor.originURL,fileDescriptor.url,fileDescriptor.contentType);        this._uiSourceCodesMap.set(path, {            uiSourceCode: uiSourceCode,            index: this._uiSourceCodesList.length        });        this._uiSourceCodesList.push(uiSourceCode);        this._workspace.dispatchEventToListeners(WebInspector.Workspace.Events.UISourceCodeAdded, uiSourceCode);    },    _fileRemoved: function(event)     {        var path = (event.data);        this._removeFile(path);    },    _removeFile: function(path)     {        var uiSourceCode = this.uiSourceCode(path);        if (!uiSourceCode)            return;        var entry = this._uiSourceCodesMap.get(path);        var movedUISourceCode = this._uiSourceCodesList[this._uiSourceCodesList.length - 1];        this._uiSourceCodesList[entry.index] = movedUISourceCode;        var movedEntry = this._uiSourceCodesMap.get(movedUISourceCode.path());        movedEntry.index = entry.index;        this._uiSourceCodesList.splice(this._uiSourceCodesList.length - 1, 1);        this._uiSourceCodesMap.delete(path);        this._workspace.dispatchEventToListeners(WebInspector.Workspace.Events.UISourceCodeRemoved, entry.uiSourceCode);    },    _remove: function()     {        this._projectDelegate.removeEventListener(WebInspector.ProjectDelegate.Events.FileAdded, this._fileAdded, this);        this._projectDelegate.removeEventListener(WebInspector.ProjectDelegate.Events.FileRemoved, this._fileRemoved, this);        this._workspace.dispatchEventToListeners(WebInspector.Workspace.Events.ProjectRemoved, this);        this._uiSourceCodesMap = new Map();        this._uiSourceCodesList = [];    },    workspace: function()     {        return this._workspace;    },    uiSourceCode: function(path)     {        var entry = this._uiSourceCodesMap.get(path);        return entry ? entry.uiSourceCode : null ;    },    uiSourceCodeForOriginURL: function(originURL)     {        for (var i = 0; i < this._uiSourceCodesList.length; ++i) {            var uiSourceCode = this._uiSourceCodesList[i];            if (uiSourceCode.originURL() === originURL)                return uiSourceCode;        }        return null ;    },    uiSourceCodes: function()     {        return this._uiSourceCodesList;    },    requestMetadata: function(uiSourceCode, callback)     {        this._projectDelegate.requestMetadata(uiSourceCode.path(), callback);    },    requestFileContent: function(uiSourceCode, callback)     {        this._projectDelegate.requestFileContent(uiSourceCode.path(), callback);    },    canSetFileContent: function()     {        return this._projectDelegate.canSetFileContent();    },    setFileContent: function(uiSourceCode, newContent, callback)     {        this._projectDelegate.setFileContent(uiSourceCode.path(), newContent, onSetContent.bind(this));        function onSetContent(content)         {            this._workspace.dispatchEventToListeners(WebInspector.Workspace.Events.UISourceCodeContentCommitted, {                uiSourceCode: uiSourceCode,                content: newContent            });            callback(content);        }    },    canRename: function()     {        return this._projectDelegate.canRename();    },    rename: function(uiSourceCode, newName, callback)     {        if (newName === uiSourceCode.name()) {            callback(true, uiSourceCode.name(), uiSourceCode.networkURL(), uiSourceCode.originURL(), uiSourceCode.contentType());            return;        }        this._projectDelegate.rename(uiSourceCode.path(), newName, innerCallback.bind(this));        function innerCallback(success, newName, newURL, newOriginURL, newContentType)         {            if (!success || !newName) {                callback(false);                return;            }            var oldPath = uiSourceCode.path();            var newPath = uiSourceCode.parentPath() ? uiSourceCode.parentPath() + "/" + newName : newName;            var value = (this._uiSourceCodesMap.get(oldPath));            this._uiSourceCodesMap.set(newPath, value);            this._uiSourceCodesMap.delete(oldPath);            callback(true, newName, newURL, newOriginURL, newContentType);        }    },    refresh: function(path, callback)     {        this._projectDelegate.refresh(path, callback);    },    excludeFolder: function(path)     {        this._projectDelegate.excludeFolder(path);        var uiSourceCodes = this._uiSourceCodesList.slice();        for (var i = 0; i < uiSourceCodes.length; ++i) {            var uiSourceCode = uiSourceCodes[i];            if (uiSourceCode.path().startsWith(path.substr(1)))                this._removeFile(uiSourceCode.path());        }    },    createFile: function(path, name, content, callback)     {        this._projectDelegate.createFile(path, name, content, innerCallback);        function innerCallback(filePath)         {            callback(filePath);        }    },    deleteFile: function(path)     {        this._projectDelegate.deleteFile(path);    },    remove: function()     {        this._projectDelegate.remove();    },    searchInFileContent: function(uiSourceCode, query, caseSensitive, isRegex, callback)     {        this._projectDelegate.searchInFileContent(uiSourceCode.path(), query, caseSensitive, isRegex, callback);    },    findFilesMatchingSearchRequest: function(searchConfig, filesMathingFileQuery, progress, callback)     {        this._projectDelegate.findFilesMatchingSearchRequest(searchConfig, filesMathingFileQuery, progress, callback);    },    indexContent: function(progress)     {        this._projectDelegate.indexContent(progress);    },    __proto__: WebInspector.Object.prototype}WebInspector.projectTypes = {    Debugger: "debugger",    Formatter: "formatter",    Network: "network",    Snippets: "snippets",    FileSystem: "filesystem",    ContentScripts: "contentscripts",    Service: "service"}WebInspector.Workspace = function(fileSystemMapping) {    this._fileSystemMapping = fileSystemMapping;    this._projects = {};    this._hasResourceContentTrackingExtensions = false;}WebInspector.Workspace.Events = {    UISourceCodeAdded: "UISourceCodeAdded",    UISourceCodeRemoved: "UISourceCodeRemoved",    UISourceCodeContentCommitted: "UISourceCodeContentCommitted",    ProjectAdded: "ProjectAdded",    ProjectRemoved: "ProjectRemoved"}WebInspector.Workspace.prototype = {    unsavedSourceCodes: function()     {        function filterUnsaved(sourceCode)         {            return sourceCode.isDirty();        }        var unsavedSourceCodes = [];        var projects = this.projectsForType(WebInspector.projectTypes.FileSystem);        for (var i = 0; i < projects.length; ++i)            unsavedSourceCodes = unsavedSourceCodes.concat(projects[i].uiSourceCodes().filter(filterUnsaved));        return unsavedSourceCodes;    },    uiSourceCode: function(projectId, path)     {        var project = this._projects[projectId];        return project ? project.uiSourceCode(path) : null ;    },    uiSourceCodeForOriginURL: function(originURL)     {        var projects = this.projectsForType(WebInspector.projectTypes.Network);        projects = projects.concat(this.projectsForType(WebInspector.projectTypes.ContentScripts));        for (var i = 0; i < projects.length; ++i) {            var project = projects[i];            var uiSourceCode = project.uiSourceCodeForOriginURL(originURL);            if (uiSourceCode)                return uiSourceCode;        }        return null ;    },    uiSourceCodesForProjectType: function(type)     {        var result = [];        for (var projectName in this._projects) {            var project = this._projects[projectName];            if (project.type() === type)                result = result.concat(project.uiSourceCodes());        }        return result;    },    addProject: function(projectId, projectDelegate)     {        var project = new WebInspector.Project(this,projectId,projectDelegate);        this._projects[projectId] = project;        this.dispatchEventToListeners(WebInspector.Workspace.Events.ProjectAdded, project);        return project;    },    removeProject: function(projectId)     {        var project = this._projects[projectId];        if (!project)            return;        delete this._projects[projectId];        project._remove();    },    project: function(projectId)     {        return this._projects[projectId];    },    projects: function()     {        return Object.values(this._projects);    },    projectsForType: function(type)     {        function filterByType(project)         {            return project.type() === type;        }        return this.projects().filter(filterByType);    },    uiSourceCodes: function()     {        var result = [];        for (var projectId in this._projects) {            var project = this._projects[projectId];            result = result.concat(project.uiSourceCodes());        }        return result;    },    setHasResourceContentTrackingExtensions: function(hasExtensions)     {        this._hasResourceContentTrackingExtensions = hasExtensions;    },    hasResourceContentTrackingExtensions: function()     {        return this._hasResourceContentTrackingExtensions;    },    __proto__: WebInspector.Object.prototype}WebInspector.workspace;;WebInspector.LiveLocation = function(updateDelegate) {    this._updateDelegate = updateDelegate;}WebInspector.LiveLocation.prototype = {    update: function()     {        var uiLocation = this.uiLocation();        if (!uiLocation)            return;        if (this._updateDelegate(uiLocation))            this.dispose();    },    uiLocation: function()     {        throw "Not implemented";    },    dispose: function()     {}};WebInspector.CompilerScriptMapping = function(debuggerModel, workspace, networkMapping, networkProject, debuggerWorkspaceBinding) {    this._target = debuggerModel.target();    this._debuggerModel = debuggerModel;    this._workspace = workspace;    this._workspace.addEventListener(WebInspector.Workspace.Events.UISourceCodeAdded, this._uiSourceCodeAddedToWorkspace, this);    this._networkMapping = networkMapping;    this._networkProject = networkProject;    this._debuggerWorkspaceBinding = debuggerWorkspaceBinding;    this._sourceMapForSourceMapURL = {};    this._pendingSourceMapLoadingCallbacks = {};    this._sourceMapForScriptId = {};    this._scriptForSourceMap = new Map();    this._sourceMapForURL = new Map();    this._stubUISourceCodes = new Map();    this._stubProjectID = "compiler-script-project";    this._stubProjectDelegate = new WebInspector.ContentProviderBasedProjectDelegate(this._workspace,this._stubProjectID,WebInspector.projectTypes.Service);    debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.GlobalObjectCleared, this._debuggerReset, this);}WebInspector.CompilerScriptMapping.prototype = {    mapsToSourceCode: function(rawLocation) {        var sourceMap = this._sourceMapForScriptId[rawLocation.scriptId];        if (!sourceMap) {            return true;        }        return !!sourceMap.findEntry(rawLocation.lineNumber, rawLocation.columnNumber);    },    rawLocationToUILocation: function(rawLocation)     {        var debuggerModelLocation = (rawLocation);        var stubUISourceCode = this._stubUISourceCodes.get(debuggerModelLocation.scriptId);        if (stubUISourceCode)            return new WebInspector.UILocation(stubUISourceCode,rawLocation.lineNumber,rawLocation.columnNumber);        var sourceMap = this._sourceMapForScriptId[debuggerModelLocation.scriptId];        if (!sourceMap)            return null ;        var lineNumber = debuggerModelLocation.lineNumber;        var columnNumber = debuggerModelLocation.columnNumber || 0;        var entry = sourceMap.findEntry(lineNumber, columnNumber);        if (!entry || entry.length === 2)            return null ;        var url = (entry[2]);        var uiSourceCode = this._networkMapping.uiSourceCodeForURL(url, this._target);        if (!uiSourceCode)            return null ;        return uiSourceCode.uiLocation((entry[3]), (entry[4]));    },    uiLocationToRawLocation: function(uiSourceCode, lineNumber, columnNumber)     {        if (uiSourceCode.project().type() === WebInspector.projectTypes.Service)            return null ;        var networkURL = this._networkMapping.networkURL(uiSourceCode);        if (!networkURL)            return null ;        var sourceMap = this._sourceMapForURL.get(networkURL);        if (!sourceMap)            return null ;        var script = (this._scriptForSourceMap.get(sourceMap));        console.assert(script);        var mappingSearchLinesCount = 5;        var entry = sourceMap.findEntryReversed(networkURL, lineNumber, mappingSearchLinesCount);        if (!entry)            return null ;        return this._debuggerModel.createRawLocation(script, (entry[0]), (entry[1]));    },    addScript: function(script)     {        if (!script.sourceMapURL) {            script.addEventListener(WebInspector.Script.Events.SourceMapURLAdded, this._sourceMapURLAdded.bind(this));            return;        }        this._processScript(script);    },    _sourceMapURLAdded: function(event)     {        var script = (event.target);        if (!script.sourceMapURL)            return;        this._processScript(script);    },    _processScript: function(script)     {        var url = script.sourceURL;        var splitURL = WebInspector.ParsedURL.splitURLIntoPathComponents(url);        var parentPath = splitURL.slice(1, -1).join("/");        var name = splitURL.peekLast() || "";        var uiSourceCodePath = this._stubProjectDelegate.addContentProvider(parentPath, name, url, url, new WebInspector.StaticContentProvider(WebInspector.resourceTypes.Script,"\n\n\n\n\n// Please wait a bit.\n// Compiled script is not shown while source map is being loaded!",url));        var stubUISourceCode = (this._workspace.uiSourceCode(this._stubProjectID, uiSourceCodePath));        this._stubUISourceCodes.set(script.scriptId, stubUISourceCode);        this._debuggerWorkspaceBinding.pushSourceMapping(script, this);        this._loadSourceMapForScript(script, this._sourceMapLoaded.bind(this, script, uiSourceCodePath));    },    _sourceMapLoaded: function(script, uiSourceCodePath, sourceMap)     {        this._stubUISourceCodes.delete(script.scriptId);        this._stubProjectDelegate.removeFile(uiSourceCodePath);        if (!sourceMap) {            this._debuggerWorkspaceBinding.updateLocations(script);            return;        }        if (this._scriptForSourceMap.get(sourceMap)) {            this._sourceMapForScriptId[script.scriptId] = sourceMap;            this._debuggerWorkspaceBinding.updateLocations(script);            return;        }        this._sourceMapForScriptId[script.scriptId] = sourceMap;        this._scriptForSourceMap.set(sourceMap, script);        var sourceURLs = sourceMap.sources();        var missingSources = [];        for (var i = 0; i < sourceURLs.length; ++i) {            var sourceURL = sourceURLs[i];            if (this._sourceMapForURL.get(sourceURL))                continue;this._sourceMapForURL.set(sourceURL, sourceMap);            if (!this._networkMapping.hasMappingForURL(sourceURL) && !this._networkMapping.uiSourceCodeForURL(sourceURL, script.target())) {                var contentProvider = sourceMap.sourceContentProvider(sourceURL, WebInspector.resourceTypes.Script);                this._networkProject.addFileForURL(sourceURL, contentProvider, script.isContentScript());            }            var uiSourceCode = this._networkMapping.uiSourceCodeForURL(sourceURL, this._target);            if (uiSourceCode) {                this._bindUISourceCode(uiSourceCode);            } else {                if (missingSources.length < 3)                    missingSources.push(sourceURL);                else if (missingSources.peekLast() !== "\u2026")                    missingSources.push("\u2026");            }        }        if (missingSources.length) {            WebInspector.console.warn(WebInspector.UIString("Source map %s points to the files missing from the workspace: [%s]", sourceMap.url(), missingSources.join(", ")));        }        this._debuggerWorkspaceBinding.updateLocations(script);    },    isIdentity: function()     {        return false;    },    uiLineHasMapping: function(uiSourceCode, lineNumber)     {        var networkURL = this._networkMapping.networkURL(uiSourceCode);        if (!networkURL)            return true;        var sourceMap = this._sourceMapForURL.get(networkURL);        if (!sourceMap)            return true;        return !!sourceMap.findEntryReversed(networkURL, lineNumber, 0);    },    _bindUISourceCode: function(uiSourceCode)     {        this._debuggerWorkspaceBinding.setSourceMapping(this._target, uiSourceCode, this);    },    _unbindUISourceCode: function(uiSourceCode)     {        this._debuggerWorkspaceBinding.setSourceMapping(this._target, uiSourceCode, null );    },    _uiSourceCodeAddedToWorkspace: function(event)     {        var uiSourceCode = (event.data);        var networkURL = this._networkMapping.networkURL(uiSourceCode);        if (!networkURL || !this._sourceMapForURL.get(networkURL))            return;        this._bindUISourceCode(uiSourceCode);    },    _loadSourceMapForScript: function(script, callback)     {        var scriptURL = WebInspector.ParsedURL.completeURL(this._target.resourceTreeModel.inspectedPageURL(), script.sourceURL);        if (!scriptURL) {            callback(null );            return;        }        console.assert(script.sourceMapURL);        var scriptSourceMapURL = (script.sourceMapURL);        var sourceMapURL = WebInspector.ParsedURL.completeURL(scriptURL, scriptSourceMapURL);        if (!sourceMapURL) {            callback(null );            return;        }        var sourceMap = this._sourceMapForSourceMapURL[sourceMapURL];        if (sourceMap) {            callback(sourceMap);            return;        }        var pendingCallbacks = this._pendingSourceMapLoadingCallbacks[sourceMapURL];        if (pendingCallbacks) {            pendingCallbacks.push(callback);            return;        }        pendingCallbacks = [callback];        this._pendingSourceMapLoadingCallbacks[sourceMapURL] = pendingCallbacks;        WebInspector.SourceMap.load(sourceMapURL, scriptURL, sourceMapLoaded.bind(this));        function sourceMapLoaded(sourceMap)         {            var url = (sourceMapURL);            var callbacks = this._pendingSourceMapLoadingCallbacks[url];            delete this._pendingSourceMapLoadingCallbacks[url];            if (!callbacks)                return;            if (sourceMap)                this._sourceMapForSourceMapURL[url] = sourceMap;            for (var i = 0; i < callbacks.length; ++i)                callbacks[i](sourceMap);        }    },    _debuggerReset: function()     {        function unbindUISourceCodeForURL(sourceURL)         {            var uiSourceCode = this._networkMapping.uiSourceCodeForURL(sourceURL, this._target);            if (!uiSourceCode)                return;            this._unbindUISourceCode(uiSourceCode);        }        this._sourceMapForURL.keysArray().forEach(unbindUISourceCodeForURL.bind(this));        this._sourceMapForSourceMapURL = {};        this._pendingSourceMapLoadingCallbacks = {};        this._sourceMapForScriptId = {};        this._scriptForSourceMap.clear();        this._sourceMapForURL.clear();    },    dispose: function()     {        this._workspace.removeEventListener(WebInspector.Workspace.Events.UISourceCodeAdded, this._uiSourceCodeAddedToWorkspace, this);    }};WebInspector.ResourceScriptMapping = function(debuggerModel, workspace, networkMapping, debuggerWorkspaceBinding) {    this._target = debuggerModel.target();    this._debuggerModel = debuggerModel;    this._workspace = workspace;    this._workspace.addEventListener(WebInspector.Workspace.Events.UISourceCodeAdded, this._uiSourceCodeAdded, this);    this._workspace.addEventListener(WebInspector.Workspace.Events.UISourceCodeRemoved, this._uiSourceCodeRemoved, this);    this._networkMapping = networkMapping;    this._debuggerWorkspaceBinding = debuggerWorkspaceBinding;    this._boundURLs = new Set();    this._uiSourceCodeToScriptFile = new Map();    debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.GlobalObjectCleared, this._debuggerReset, this);}WebInspector.ResourceScriptMapping.prototype = {    rawLocationToUILocation: function(rawLocation)     {        var debuggerModelLocation = (rawLocation);        var script = debuggerModelLocation.script();        var uiSourceCode = this._workspaceUISourceCodeForScript(script);        if (!uiSourceCode)            return null ;        var scriptFile = this.scriptFile(uiSourceCode);        if (scriptFile && ((scriptFile.hasDivergedFromVM() && !scriptFile.isMergingToVM()) || scriptFile.isDivergingFromVM()))            return null ;        var lineNumber = debuggerModelLocation.lineNumber - (script.isInlineScriptWithSourceURL() ? script.lineOffset : 0);        var columnNumber = debuggerModelLocation.columnNumber || 0;        if (script.isInlineScriptWithSourceURL() && !lineNumber && columnNumber)            columnNumber -= script.columnOffset;        return uiSourceCode.uiLocation(lineNumber, columnNumber);    },    uiLocationToRawLocation: function(uiSourceCode, lineNumber, columnNumber)     {        var scripts = this._scriptsForUISourceCode(uiSourceCode);        console.assert(scripts.length);        var script = scripts[0];        if (script.isInlineScriptWithSourceURL())            return this._debuggerModel.createRawLocation(script, lineNumber + script.lineOffset, lineNumber ? columnNumber : columnNumber + script.columnOffset);        return this._debuggerModel.createRawLocation(script, lineNumber, columnNumber);    },    addScript: function(script)     {        if (script.isAnonymousScript())            return;        this._debuggerWorkspaceBinding.pushSourceMapping(script, this);        var uiSourceCode = this._workspaceUISourceCodeForScript(script);        if (!uiSourceCode)            return;        this._bindUISourceCodeToScripts(uiSourceCode, [script]);    },    isIdentity: function()     {        return true;    },    uiLineHasMapping: function(uiSourceCode, lineNumber)     {        return true;    },    scriptFile: function(uiSourceCode)     {        return this._uiSourceCodeToScriptFile.get(uiSourceCode) || null ;    },    _setScriptFile: function(uiSourceCode, scriptFile)     {        if (scriptFile)            this._uiSourceCodeToScriptFile.set(uiSourceCode, scriptFile);        else            this._uiSourceCodeToScriptFile.remove(uiSourceCode);    },    _uiSourceCodeAdded: function(event)     {        var uiSourceCode = (event.data);        if (!this._networkMapping.networkURL(uiSourceCode))            return;        if (uiSourceCode.project().isServiceProject())            return;        var scripts = this._scriptsForUISourceCode(uiSourceCode);        if (!scripts.length)            return;        this._bindUISourceCodeToScripts(uiSourceCode, scripts);    },    _uiSourceCodeRemoved: function(event)     {        var uiSourceCode = (event.data);        if (!this._networkMapping.networkURL(uiSourceCode))            return;        if (uiSourceCode.project().isServiceProject())            return;        this._unbindUISourceCode(uiSourceCode);    },    _hasMergedToVM: function(uiSourceCode)     {        var scripts = this._scriptsForUISourceCode(uiSourceCode);        if (!scripts.length)            return;        for (var i = 0; i < scripts.length; ++i)            this._debuggerWorkspaceBinding.updateLocations(scripts[i]);    },    _hasDivergedFromVM: function(uiSourceCode)     {        var scripts = this._scriptsForUISourceCode(uiSourceCode);        if (!scripts.length)            return;        for (var i = 0; i < scripts.length; ++i)            this._debuggerWorkspaceBinding.updateLocations(scripts[i]);    },    _workspaceUISourceCodeForScript: function(script)     {        if (script.isAnonymousScript())            return null ;        return this._networkMapping.uiSourceCodeForURL(script.sourceURL, this._target);    },    _scriptsForUISourceCode: function(uiSourceCode)     {        var target = WebInspector.NetworkProject.targetForUISourceCode(uiSourceCode);        if (target && target !== this._debuggerModel.target())            return [];        if (!this._networkMapping.networkURL(uiSourceCode))            return [];        return this._debuggerModel.scriptsForSourceURL(this._networkMapping.networkURL(uiSourceCode));    },    _bindUISourceCodeToScripts: function(uiSourceCode, scripts)     {        console.assert(scripts.length);        var scriptFile = new WebInspector.ResourceScriptFile(this,uiSourceCode,scripts);        this._setScriptFile(uiSourceCode, scriptFile);        for (var i = 0; i < scripts.length; ++i)            this._debuggerWorkspaceBinding.updateLocations(scripts[i]);        this._debuggerWorkspaceBinding.setSourceMapping(this._target, uiSourceCode, this);        this._boundURLs.add(this._networkMapping.networkURL(uiSourceCode));    },    _unbindUISourceCode: function(uiSourceCode)     {        var scriptFile = this.scriptFile(uiSourceCode);        if (scriptFile) {            scriptFile.dispose();            this._setScriptFile(uiSourceCode, null );        }        this._debuggerWorkspaceBinding.setSourceMapping(this._target, uiSourceCode, null );    },    _debuggerReset: function()     {        var boundURLs = this._boundURLs.valuesArray();        for (var i = 0; i < boundURLs.length; ++i)         {            var uiSourceCode = this._networkMapping.uiSourceCodeForURL(boundURLs[i], this._target);            if (!uiSourceCode)                continue;this._unbindUISourceCode(uiSourceCode);        }        this._boundURLs.clear();    },    dispose: function()     {        this._debuggerReset();        this._workspace.removeEventListener(WebInspector.Workspace.Events.UISourceCodeAdded, this._uiSourceCodeAdded, this);        this._workspace.removeEventListener(WebInspector.Workspace.Events.UISourceCodeRemoved, this._uiSourceCodeRemoved, this);    }}WebInspector.ResourceScriptFile = function(resourceScriptMapping, uiSourceCode, scripts) {    console.assert(scripts.length);    this._resourceScriptMapping = resourceScriptMapping;    this._uiSourceCode = uiSourceCode;    if (this._uiSourceCode.contentType() === WebInspector.resourceTypes.Script)        this._script = scripts[0];    this._uiSourceCode.addEventListener(WebInspector.UISourceCode.Events.WorkingCopyChanged, this._workingCopyChanged, this);    this._update();}WebInspector.ResourceScriptFile.Events = {    DidMergeToVM: "DidMergeToVM",    DidDivergeFromVM: "DidDivergeFromVM",}WebInspector.ResourceScriptFile.prototype = {    commitLiveEdit: function(callback)     {        function innerCallback(error, errorData)         {            if (!error)                this._scriptSource = source;            this._update();            if (callback)                callback(error, errorData, this._script);        }        if (!this._script)            return;        var debuggerModel = this._resourceScriptMapping._debuggerModel;        var source = this._uiSourceCode.workingCopy();        debuggerModel.setScriptSource(this._script.scriptId, source, innerCallback.bind(this));    },    _isDiverged: function()     {        if (this._uiSourceCode.isDirty())            return true;        if (!this._script)            return false;        if (typeof this._scriptSource === "undefined")            return false;        if (!this._uiSourceCode.workingCopy().startsWith(this._scriptSource))            return true;        var suffix = this._uiSourceCode.workingCopy().substr(this._scriptSource.length);        return !!suffix.length && !suffix.match(WebInspector.Script.sourceURLRegex);    },    _workingCopyChanged: function(event)     {        this._update();    },    _update: function()     {        if (this._isDiverged() && !this._hasDivergedFromVM)            this._divergeFromVM();        else if (!this._isDiverged() && this._hasDivergedFromVM)            this._mergeToVM();    },    _divergeFromVM: function()     {        this._isDivergingFromVM = true;        this._resourceScriptMapping._hasDivergedFromVM(this._uiSourceCode);        delete this._isDivergingFromVM;        this._hasDivergedFromVM = true;        this.dispatchEventToListeners(WebInspector.ResourceScriptFile.Events.DidDivergeFromVM, this._uiSourceCode);    },    _mergeToVM: function()     {        delete this._hasDivergedFromVM;        this._isMergingToVM = true;        this._resourceScriptMapping._hasMergedToVM(this._uiSourceCode);        delete this._isMergingToVM;        this.dispatchEventToListeners(WebInspector.ResourceScriptFile.Events.DidMergeToVM, this._uiSourceCode);    },    hasDivergedFromVM: function()     {        return this._hasDivergedFromVM;    },    isDivergingFromVM: function()     {        return this._isDivergingFromVM;    },    isMergingToVM: function()     {        return this._isMergingToVM;    },    checkMapping: function()     {        if (!this._script)            return;        if (typeof this._scriptSource !== "undefined")            return;        this._script.requestContent(callback.bind(this));        function callback(source)         {            this._scriptSource = source;            this._update();        }    },    target: function()     {        if (!this._script)            return null ;        return this._script.target();    },    dispose: function()     {        this._uiSourceCode.removeEventListener(WebInspector.UISourceCode.Events.WorkingCopyChanged, this._workingCopyChanged, this);    },    addSourceMapURL: function(sourceMapURL)     {        if (!this._script)            return;        this._script.addSourceMapURL(sourceMapURL);    },    __proto__: WebInspector.Object.prototype};WebInspector.SASSSourceMapping = function(cssModel, workspace, networkMapping, networkProject) {    this.pollPeriodMs = 30 * 1000;    this.pollIntervalMs = 200;    this._cssModel = cssModel;    this._workspace = workspace;    this._networkProject = networkProject;    this._addingRevisionCounter = 0;    this._reset();    WebInspector.fileManager.addEventListener(WebInspector.FileManager.EventTypes.SavedURL, this._fileSaveFinished, this);    WebInspector.moduleSetting("cssSourceMapsEnabled").addChangeListener(this._toggleSourceMapSupport, this);    this._cssModel.addEventListener(WebInspector.CSSStyleModel.Events.StyleSheetChanged, this._styleSheetChanged, this);    this._workspace.addEventListener(WebInspector.Workspace.Events.UISourceCodeAdded, this._uiSourceCodeAdded, this);    this._workspace.addEventListener(WebInspector.Workspace.Events.UISourceCodeContentCommitted, this._uiSourceCodeContentCommitted, this);    this._workspace.addEventListener(WebInspector.Workspace.Events.ProjectRemoved, this._reset, this);    this._networkMapping = networkMapping;}WebInspector.SASSSourceMapping.prototype = {    _styleSheetChanged: function(event)     {        var id = (event.data.styleSheetId);        if (this._addingRevisionCounter) {            --this._addingRevisionCounter;            return;        }        var header = this._cssModel.styleSheetHeaderForId(id);        if (!header)            return;        this.removeHeader(header);    },    _toggleSourceMapSupport: function(event)     {        var enabled = (event.data);        var headers = this._cssModel.styleSheetHeaders();        for (var i = 0; i < headers.length; ++i) {            if (enabled)                this.addHeader(headers[i]);            else                this.removeHeader(headers[i]);        }    },    _fileSaveFinished: function(event)     {        var sassURL = (event.data);        this._sassFileSaved(sassURL, false);    },    _headerValue: function(headerName, headers)     {        headerName = headerName.toLowerCase();        var value = null ;        for (var name in headers) {            if (name.toLowerCase() === headerName) {                value = headers[name];                break;            }        }        return value;    },    _lastModified: function(headers)     {        var lastModifiedHeader = this._headerValue("last-modified", headers);        if (!lastModifiedHeader)            return null ;        var lastModified = new Date(lastModifiedHeader);        if (isNaN(lastModified.getTime()))            return null ;        return lastModified;    },    _checkLastModified: function(headers, url)     {        var lastModified = this._lastModified(headers);        if (lastModified)            return lastModified;        var etagMessage = this._headerValue("etag", headers) ? ", \"ETag\" response header found instead" : "";        var message = String.sprintf("The \"Last-Modified\" response header is missing or invalid for %s%s. The CSS auto-reload functionality will not work correctly.", url, etagMessage);        WebInspector.console.log(message);        return null ;    },    _sassFileSaved: function(sassURL, wasLoadedFromFileSystem)     {        var cssURLs = this._cssURLsForSASSURL[sassURL];        if (!cssURLs)            return;        if (!WebInspector.moduleSetting("cssReloadEnabled").get())            return;        var sassFile = this._networkMapping.uiSourceCodeForURL(sassURL, this._cssModel.target());        console.assert(sassFile);        if (wasLoadedFromFileSystem)            sassFile.requestMetadata(metadataReceived.bind(this));        else            WebInspector.ResourceLoader.loadUsingTargetUA(sassURL, null , sassLoadedViaNetwork.bind(this));        function sassLoadedViaNetwork(statusCode, headers, content)         {            if (statusCode >= 400) {                console.error("Could not load content for " + sassURL + " : " + "HTTP status code: " + statusCode);                return;            }            var lastModified = this._checkLastModified(headers, sassURL);            if (!lastModified)                return;            metadataReceived.call(this, lastModified);        }        function metadataReceived(timestamp)         {            if (!timestamp)                return;            var now = Date.now();            var deadlineMs = now + this.pollPeriodMs;            var pollData = this._pollDataForSASSURL[sassURL];            if (pollData) {                var dataByURL = pollData.dataByURL;                for (var url in dataByURL)                    clearTimeout(dataByURL[url].timer);            }            pollData = {                dataByURL: {},                deadlineMs: deadlineMs,                sassTimestamp: timestamp            };            this._pollDataForSASSURL[sassURL] = pollData;            for (var i = 0; i < cssURLs.length; ++i) {                pollData.dataByURL[cssURLs[i]] = {                    previousPoll: now                };                this._pollCallback(cssURLs[i], sassURL, false);            }        }    },    _pollCallback: function(cssURL, sassURL, stopPolling)     {        var now;        var pollData = this._pollDataForSASSURL[sassURL];        if (!pollData)            return;        if (stopPolling) {            this._stopPolling(cssURL, sassURL);            return;        }        if ((now = new Date().getTime()) > pollData.deadlineMs) {            WebInspector.console.warn(WebInspector.UIString("%s hasn't been updated in %d seconds.", cssURL, this.pollPeriodMs / 1000));            this._stopPolling(cssURL, sassURL);            return;        }        var nextPoll = this.pollIntervalMs + pollData.dataByURL[cssURL].previousPoll;        var remainingTimeoutMs = Math.max(0, nextPoll - now);        pollData.dataByURL[cssURL].previousPoll = now + remainingTimeoutMs;        pollData.dataByURL[cssURL].timer = setTimeout(this._reloadCSS.bind(this, cssURL, sassURL, this._pollCallback.bind(this)), remainingTimeoutMs);    },    _stopPolling: function(cssURL, sassURL)     {        var pollData = this._pollDataForSASSURL[sassURL];        delete pollData.dataByURL[cssURL];        if (!Object.keys(pollData.dataByURL).length)            delete this._pollDataForSASSURL[sassURL];    },    _reloadCSS: function(cssURL, sassURL, callback)     {        var cssUISourceCode = this._networkMapping.uiSourceCodeForURL(cssURL, this._cssModel.target());        if (!cssUISourceCode) {            WebInspector.console.warn(WebInspector.UIString("%s resource missing. Please reload the page.", cssURL));            callback(cssURL, sassURL, true);            return;        }        if (this._networkMapping.hasMappingForURL(sassURL))            this._reloadCSSFromFileSystem(cssUISourceCode, sassURL, callback);        else            this._reloadCSSFromNetwork(cssUISourceCode, sassURL, callback);    },    _reloadCSSFromNetwork: function(cssUISourceCode, sassURL, callback)     {        var cssURL = this._networkMapping.networkURL(cssUISourceCode);        var data = this._pollDataForSASSURL[sassURL];        if (!data) {            callback(cssURL, sassURL, true);            return;        }        var headers = {            "if-modified-since": new Date(data.sassTimestamp.getTime() - 1000).toUTCString()        };        WebInspector.ResourceLoader.loadUsingTargetUA(cssURL, headers, contentLoaded.bind(this));        function contentLoaded(statusCode, headers, content)         {            if (statusCode >= 400) {                console.error("Could not load content for " + cssURL + " : " + "HTTP status code: " + statusCode);                callback(cssURL, sassURL, true);                return;            }            if (!this._pollDataForSASSURL[sassURL]) {                callback(cssURL, sassURL, true);                return;            }            if (statusCode === 304) {                callback(cssURL, sassURL, false);                return;            }            var lastModified = this._checkLastModified(headers, cssURL);            if (!lastModified) {                callback(cssURL, sassURL, true);                return;            }            if (lastModified.getTime() < data.sassTimestamp.getTime()) {                callback(cssURL, sassURL, false);                return;            }            this._updateCSSRevision(cssUISourceCode, content, sassURL, callback);        }    },    _updateCSSRevision: function(cssUISourceCode, content, sassURL, callback)     {        ++this._addingRevisionCounter;        cssUISourceCode.addRevision(content);        var networkURL = this._networkMapping.networkURL(cssUISourceCode);        this._cssUISourceCodeUpdated(networkURL, sassURL, callback);    },    _reloadCSSFromFileSystem: function(cssUISourceCode, sassURL, callback)     {        cssUISourceCode.requestMetadata(metadataCallback.bind(this));        function metadataCallback(timestamp)         {            var cssURL = this._networkMapping.networkURL(cssUISourceCode);            if (!timestamp) {                callback(cssURL, sassURL, false);                return;            }            var cssTimestamp = timestamp.getTime();            var pollData = this._pollDataForSASSURL[sassURL];            if (!pollData) {                callback(cssURL, sassURL, true);                return;            }            if (cssTimestamp < pollData.sassTimestamp.getTime()) {                callback(cssURL, sassURL, false);                return;            }            cssUISourceCode.requestOriginalContent(contentCallback.bind(this));            function contentCallback(content)             {                if (content === null )                    return;                this._updateCSSRevision(cssUISourceCode, content, sassURL, callback);            }        }    },    _cssUISourceCodeUpdated: function(cssURL, sassURL, callback)     {        var completeSourceMapURL = this._completeSourceMapURLForCSSURL[cssURL];        if (!completeSourceMapURL)            return;        var ids = this._cssModel.styleSheetIdsForURL(cssURL);        if (!ids)            return;        var headers = [];        for (var i = 0; i < ids.length; ++i)            headers.push(this._cssModel.styleSheetHeaderForId(ids[i]));        for (var i = 0; i < ids.length; ++i)            this._loadSourceMapAndBindUISourceCode(headers, true, completeSourceMapURL);        callback(cssURL, sassURL, true);    },    addHeader: function(header)     {        if (!header.sourceMapURL || !header.sourceURL || !WebInspector.moduleSetting("cssSourceMapsEnabled").get())            return;        var completeSourceMapURL = WebInspector.ParsedURL.completeURL(header.sourceURL, header.sourceMapURL);        if (!completeSourceMapURL)            return;        this._completeSourceMapURLForCSSURL[header.sourceURL] = completeSourceMapURL;        this._loadSourceMapAndBindUISourceCode([header], false, completeSourceMapURL);    },    removeHeader: function(header)     {        var sourceURL = header.sourceURL;        if (!sourceURL || !header.sourceMapURL || !this._completeSourceMapURLForCSSURL[sourceURL])            return;        delete this._sourceMapByStyleSheetURL[sourceURL];        delete this._completeSourceMapURLForCSSURL[sourceURL];        for (var sassURL in this._cssURLsForSASSURL) {            var urls = this._cssURLsForSASSURL[sassURL];            urls.remove(sourceURL);            if (!urls.length)                delete this._cssURLsForSASSURL[sassURL];        }        var completeSourceMapURL = WebInspector.ParsedURL.completeURL(sourceURL, header.sourceMapURL);        if (completeSourceMapURL)            delete this._sourceMapByURL[completeSourceMapURL];        WebInspector.cssWorkspaceBinding.updateLocations(header);    },    _loadSourceMapAndBindUISourceCode: function(headersWithSameSourceURL, forceRebind, completeSourceMapURL)     {        console.assert(headersWithSameSourceURL.length);        var sourceURL = headersWithSameSourceURL[0].sourceURL;        this._loadSourceMapForStyleSheet(completeSourceMapURL, sourceURL, forceRebind, sourceMapLoaded.bind(this));        function sourceMapLoaded(sourceMap)         {            if (!sourceMap)                return;            this._sourceMapByStyleSheetURL[sourceURL] = sourceMap;            for (var i = 0; i < headersWithSameSourceURL.length; ++i) {                if (forceRebind)                    WebInspector.cssWorkspaceBinding.updateLocations(headersWithSameSourceURL[i]);                else                    this._bindUISourceCode(headersWithSameSourceURL[i], sourceMap);            }        }    },    _addCSSURLforSASSURL: function(cssURL, sassURL)     {        var cssURLs;        if (this._cssURLsForSASSURL.hasOwnProperty(sassURL))            cssURLs = this._cssURLsForSASSURL[sassURL];        else {            cssURLs = [];            this._cssURLsForSASSURL[sassURL] = cssURLs;        }        if (cssURLs.indexOf(cssURL) === -1)            cssURLs.push(cssURL);    },    _loadSourceMapForStyleSheet: function(completeSourceMapURL, completeStyleSheetURL, forceReload, callback)     {        var sourceMap = this._sourceMapByURL[completeSourceMapURL];        if (sourceMap && !forceReload) {            callback(sourceMap);            return;        }        var pendingCallbacks = this._pendingSourceMapLoadingCallbacks[completeSourceMapURL];        if (pendingCallbacks) {            pendingCallbacks.push(callback);            return;        }        pendingCallbacks = [callback];        this._pendingSourceMapLoadingCallbacks[completeSourceMapURL] = pendingCallbacks;        WebInspector.SourceMap.load(completeSourceMapURL, completeStyleSheetURL, sourceMapLoaded.bind(this));        function sourceMapLoaded(sourceMap)         {            var callbacks = this._pendingSourceMapLoadingCallbacks[completeSourceMapURL];            delete this._pendingSourceMapLoadingCallbacks[completeSourceMapURL];            if (!callbacks)                return;            if (sourceMap)                this._sourceMapByURL[completeSourceMapURL] = sourceMap;            else                delete this._sourceMapByURL[completeSourceMapURL];            for (var i = 0; i < callbacks.length; ++i)                callbacks[i](sourceMap);        }    },    _bindUISourceCode: function(header, sourceMap)     {        WebInspector.cssWorkspaceBinding.pushSourceMapping(header, this);        var rawURL = header.sourceURL;        var sources = sourceMap.sources();        for (var i = 0; i < sources.length; ++i) {            var url = sources[i];            this._addCSSURLforSASSURL(rawURL, url);            if (!this._networkMapping.hasMappingForURL(url) && !this._networkMapping.uiSourceCodeForURL(url, header.target())) {                var contentProvider = sourceMap.sourceContentProvider(url, WebInspector.resourceTypes.Stylesheet);                this._networkProject.addFileForURL(url, contentProvider);            }        }    },    rawLocationToUILocation: function(rawLocation)     {        var entry;        var sourceMap = this._sourceMapByStyleSheetURL[rawLocation.url];        if (!sourceMap)            return null ;        entry = sourceMap.findEntry(rawLocation.lineNumber, rawLocation.columnNumber);        if (!entry || entry.length === 2)            return null ;        var uiSourceCode = this._networkMapping.uiSourceCodeForURL(entry[2], rawLocation.target());        if (!uiSourceCode)            return null ;        return uiSourceCode.uiLocation(entry[3], entry[4]);    },    uiLocationToRawLocation: function(uiSourceCode, lineNumber, columnNumber)     {        return null ;    },    isIdentity: function()     {        return false;    },    uiLineHasMapping: function(uiSourceCode, lineNumber)     {        return true;    },    target: function()     {        return this._cssModel.target();    },    _uiSourceCodeAdded: function(event)     {        var uiSourceCode = (event.data);        var networkURL = this._networkMapping.networkURL(uiSourceCode);        var cssURLs = this._cssURLsForSASSURL[networkURL];        if (!cssURLs)            return;        for (var i = 0; i < cssURLs.length; ++i) {            var ids = this._cssModel.styleSheetIdsForURL(cssURLs[i]);            for (var j = 0; j < ids.length; ++j) {                var header = this._cssModel.styleSheetHeaderForId(ids[j]);                console.assert(header);                WebInspector.cssWorkspaceBinding.updateLocations((header));            }        }    },    _uiSourceCodeContentCommitted: function(event)     {        var uiSourceCode = (event.data.uiSourceCode);        if (uiSourceCode.project().type() === WebInspector.projectTypes.FileSystem) {            var networkURL = this._networkMapping.networkURL(uiSourceCode);            this._sassFileSaved(networkURL, true);        }    },    _reset: function()     {        this._addingRevisionCounter = 0;        this._completeSourceMapURLForCSSURL = {};        this._cssURLsForSASSURL = {};        this._pendingSourceMapLoadingCallbacks = {};        this._pollDataForSASSURL = {};        this._sourceMapByURL = {};        this._sourceMapByStyleSheetURL = {};    }};WebInspector.StylesSourceMapping = function(cssModel, workspace, networkMapping) {    this._cssModel = cssModel;    this._workspace = workspace;    this._workspace.addEventListener(WebInspector.Workspace.Events.ProjectRemoved, this._projectRemoved, this);    this._workspace.addEventListener(WebInspector.Workspace.Events.UISourceCodeAdded, this._uiSourceCodeAddedToWorkspace, this);    this._workspace.addEventListener(WebInspector.Workspace.Events.UISourceCodeRemoved, this._uiSourceCodeRemoved, this);    this._networkMapping = networkMapping;    cssModel.target().resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.MainFrameNavigated, this._mainFrameNavigated, this);    this._cssModel.addEventListener(WebInspector.CSSStyleModel.Events.StyleSheetChanged, this._styleSheetChanged, this);    this._initialize();}WebInspector.StylesSourceMapping.ChangeUpdateTimeoutMs = 200;WebInspector.StylesSourceMapping.prototype = {    rawLocationToUILocation: function(rawLocation)     {        var uiSourceCode = this._networkMapping.uiSourceCodeForURL(rawLocation.url, rawLocation.target());        if (!uiSourceCode)            return null ;        var lineNumber = rawLocation.lineNumber;        var columnNumber = rawLocation.columnNumber;        var header = this._cssModel.styleSheetHeaderForId(rawLocation.styleSheetId);        if (header && header.isInline && header.hasSourceURL) {            lineNumber -= header.lineNumberInSource(0);            columnNumber -= header.columnNumberInSource(lineNumber, 0);        }        return uiSourceCode.uiLocation(lineNumber, columnNumber);    },    uiLocationToRawLocation: function(uiSourceCode, lineNumber, columnNumber)     {        return null ;    },    isIdentity: function()     {        return true;    },    uiLineHasMapping: function(uiSourceCode, lineNumber)     {        return true;    },    target: function()     {        return this._cssModel.target();    },    addHeader: function(header)     {        var url = header.resourceURL();        if (!url)            return;        WebInspector.cssWorkspaceBinding.pushSourceMapping(header, this);        var map = this._urlToHeadersByFrameId[url];        if (!map) {            map = (new Map());            this._urlToHeadersByFrameId[url] = map;        }        var headersById = map.get(header.frameId);        if (!headersById) {            headersById = (new Map());            map.set(header.frameId, headersById);        }        headersById.set(header.id, header);        var uiSourceCode = this._networkMapping.uiSourceCodeForURL(url, header.target());        if (uiSourceCode)            this._bindUISourceCode(uiSourceCode, header);    },    removeHeader: function(header)     {        var url = header.resourceURL();        if (!url)            return;        var map = this._urlToHeadersByFrameId[url];        console.assert(map);        var headersById = map.get(header.frameId);        console.assert(headersById);        headersById.remove(header.id);        if (!headersById.size) {            map.remove(header.frameId);            if (!map.size) {                delete this._urlToHeadersByFrameId[url];                var uiSourceCode = this._networkMapping.uiSourceCodeForURL(url, header.target());                if (uiSourceCode)                    this._unbindUISourceCode(uiSourceCode);            }        }    },    _unbindUISourceCode: function(uiSourceCode)     {        var styleFile = this._styleFiles.get(uiSourceCode);        if (!styleFile)            return;        styleFile.dispose();        this._styleFiles.remove(uiSourceCode);    },    _uiSourceCodeAddedToWorkspace: function(event)     {        var uiSourceCode = (event.data);        var networkURL = this._networkMapping.networkURL(uiSourceCode);        if (!networkURL || !this._urlToHeadersByFrameId[networkURL])            return;        this._bindUISourceCode(uiSourceCode, this._urlToHeadersByFrameId[networkURL].valuesArray()[0].valuesArray()[0]);    },    _bindUISourceCode: function(uiSourceCode, header)     {        if (this._styleFiles.get(uiSourceCode) || (header.isInline && !header.hasSourceURL))            return;        this._styleFiles.set(uiSourceCode, new WebInspector.StyleFile(uiSourceCode,this));        WebInspector.cssWorkspaceBinding.updateLocations(header);    },    _projectRemoved: function(event)     {        var project = (event.data);        var uiSourceCodes = project.uiSourceCodes();        for (var i = 0; i < uiSourceCodes.length; ++i)            this._unbindUISourceCode(uiSourceCodes[i]);    },    _uiSourceCodeRemoved: function(event)     {        var uiSourceCode = (event.data);        this._unbindUISourceCode(uiSourceCode);    },    _initialize: function()     {        this._urlToHeadersByFrameId = {};        this._styleFiles = new Map();    },    _mainFrameNavigated: function(event)     {        for (var url in this._urlToHeadersByFrameId) {            var uiSourceCode = this._networkMapping.uiSourceCodeForURL(url, this._cssModel.target());            if (!uiSourceCode)                continue;this._unbindUISourceCode(uiSourceCode);        }        this._initialize();    },    _setStyleContent: function(uiSourceCode, content, majorChange)     {        var networkURL = this._networkMapping.networkURL(uiSourceCode);        var styleSheetIds = this._cssModel.styleSheetIdsForURL(networkURL);        if (!styleSheetIds.length)            return Promise.resolve(("No stylesheet found: " + networkURL));        this._isSettingContent = true;        function callback(error)         {            delete this._isSettingContent;            return error || null ;        }        var promises = [];        for (var i = 0; i < styleSheetIds.length; ++i)            promises.push(this._cssModel.setStyleSheetText(styleSheetIds[i], content, majorChange));        return Promise.all(promises).spread(callback.bind(this));    },    _styleSheetChanged: function(event)     {        if (this._isSettingContent)            return;        this._updateStyleSheetTextSoon(event.data.styleSheetId);    },    _updateStyleSheetTextSoon: function(styleSheetId)     {        if (this._updateStyleSheetTextTimer)            clearTimeout(this._updateStyleSheetTextTimer);        this._updateStyleSheetTextTimer = setTimeout(this._updateStyleSheetText.bind(this, styleSheetId), WebInspector.StylesSourceMapping.ChangeUpdateTimeoutMs);    },    _updateStyleSheetText: function(styleSheetId)     {        if (this._updateStyleSheetTextTimer) {            clearTimeout(this._updateStyleSheetTextTimer);            delete this._updateStyleSheetTextTimer;        }        var header = this._cssModel.styleSheetHeaderForId(styleSheetId);        if (!header)            return;        var styleSheetURL = header.resourceURL();        if (!styleSheetURL)            return;        var uiSourceCode = this._networkMapping.uiSourceCodeForURL(styleSheetURL, header.target());        if (!uiSourceCode)            return;        header.requestContent(callback.bind(this, uiSourceCode));        function callback(uiSourceCode, content)         {            var styleFile = this._styleFiles.get(uiSourceCode);            if (styleFile)                styleFile.addRevision(content || "");        }    }}WebInspector.StyleFile = function(uiSourceCode, mapping) {    this._uiSourceCode = uiSourceCode;    this._mapping = mapping;    this._uiSourceCode.addEventListener(WebInspector.UISourceCode.Events.WorkingCopyChanged, this._workingCopyChanged, this);    this._uiSourceCode.addEventListener(WebInspector.UISourceCode.Events.WorkingCopyCommitted, this._workingCopyCommitted, this);    this._commitThrottler = new WebInspector.Throttler(WebInspector.StyleFile.updateTimeout);}WebInspector.StyleFile.updateTimeout = 200;WebInspector.StyleFile.prototype = {    _workingCopyCommitted: function(event)     {        if (this._isAddingRevision)            return;        this._isMajorChangePending = true;        this._commitThrottler.schedule(this._commitIncrementalEdit.bind(this), true);    },    _workingCopyChanged: function(event)     {        if (this._isAddingRevision)            return;        this._commitThrottler.schedule(this._commitIncrementalEdit.bind(this), false);    },    _commitIncrementalEdit: function(finishCallback)     {        this._mapping._setStyleContent(this._uiSourceCode, this._uiSourceCode.workingCopy(), this._isMajorChangePending).then(this._styleContentSet.bind(this)).then(finishCallback).catch((finishCallback));        this._isMajorChangePending = false;    },    _styleContentSet: function(error)     {        if (error)            WebInspector.console.error(error);    },    addRevision: function(content)     {        this._isAddingRevision = true;        this._uiSourceCode.addRevision(content);        delete this._isAddingRevision;    },    dispose: function()     {        this._uiSourceCode.removeEventListener(WebInspector.UISourceCode.Events.WorkingCopyCommitted, this._workingCopyCommitted, this);        this._uiSourceCode.removeEventListener(WebInspector.UISourceCode.Events.WorkingCopyChanged, this._workingCopyChanged, this);    }};WebInspector.CSSWorkspaceBinding = function(targetManager, workspace, networkMapping) {    this._workspace = workspace;    this._networkMapping = networkMapping;    this._modelToTargetInfo = new Map();    targetManager.observeTargets(this);    targetManager.addModelListener(WebInspector.ResourceTreeModel, WebInspector.ResourceTreeModel.EventTypes.MainFrameNavigated, this._mainFrameCreatedOrNavigated, this);}WebInspector.CSSWorkspaceBinding.prototype = {    targetAdded: function(target)     {        var cssModel = WebInspector.CSSStyleModel.fromTarget(target);        if (cssModel)            this._modelToTargetInfo.set(cssModel, new WebInspector.CSSWorkspaceBinding.TargetInfo(cssModel,this._workspace,this._networkMapping));    },    targetRemoved: function(target)     {        var cssModel = WebInspector.CSSStyleModel.fromTarget(target);        if (cssModel)            this._modelToTargetInfo.remove(cssModel)._dispose();    },    pushSourceMapping: function(header, mapping)     {        this._ensureInfoForHeader(header)._pushSourceMapping(mapping);    },    _headerInfo: function(header)     {        var map = this._modelToTargetInfo.get(header.cssModel());        return map._headerInfo(header.id) || null ;    },    _ensureInfoForHeader: function(header)     {        var targetInfo = this._modelToTargetInfo.get(header.cssModel());        if (!targetInfo) {            targetInfo = new WebInspector.CSSWorkspaceBinding.TargetInfo(header.cssModel(),this._workspace,this._networkMapping);            this._modelToTargetInfo.set(header.cssModel(), targetInfo);        }        return targetInfo._ensureInfoForHeader(header);    },    _mainFrameCreatedOrNavigated: function(event)     {        var target = (event.target).target();        var cssModel = WebInspector.CSSStyleModel.fromTarget(target);        if (cssModel)            this._modelToTargetInfo.get(cssModel)._reset();    },    updateLocations: function(header)     {        var info = this._headerInfo(header);        if (info)            info._updateLocations();    },    createLiveLocation: function(rawLocation, updateDelegate)     {        var header = rawLocation.styleSheetId ? rawLocation.cssModel().styleSheetHeaderForId(rawLocation.styleSheetId) : null ;        return new WebInspector.CSSWorkspaceBinding.LiveLocation(rawLocation.cssModel(),header,rawLocation,this,updateDelegate);    },    _addLiveLocation: function(location)     {        this._ensureInfoForHeader(location._header)._addLocation(location);    },    _removeLiveLocation: function(location)     {        var info = this._headerInfo(location._header);        if (info)            info._removeLocation(location);    },    propertyUILocation: function(cssProperty, forName)     {        var style = cssProperty.ownerStyle;        if (!style || !style.parentRule || !style.styleSheetId)            return null ;        var range = cssProperty.range;        if (!range)            return null ;        var url = style.parentRule.resourceURL();        if (!url)            return null ;        var line = forName ? range.startLine : range.endLine;        var column = forName ? range.startColumn : range.endColumn - (cssProperty.text && cssProperty.text.endsWith(";") ? 2 : 1);        var header = style.cssModel().styleSheetHeaderForId(style.styleSheetId);        var rawLocation = new WebInspector.CSSLocation(style.cssModel(),style.styleSheetId,url,header.lineNumberInSource(line),header.columnNumberInSource(line, column));        return this.rawLocationToUILocation(rawLocation);    },    rawLocationToUILocation: function(rawLocation)     {        if (!rawLocation)            return null ;        var header = rawLocation.cssModel().styleSheetHeaderForId(rawLocation.styleSheetId);        if (!header)            return null ;        var info = this._headerInfo(header);        return info ? info._rawLocationToUILocation(rawLocation.lineNumber, rawLocation.columnNumber) : null ;    }}WebInspector.CSSWorkspaceBinding.TargetInfo = function(cssModel, workspace, networkMapping) {    this._cssModel = cssModel;    this._stylesSourceMapping = new WebInspector.StylesSourceMapping(cssModel,workspace,networkMapping);    this._sassSourceMapping = new WebInspector.SASSSourceMapping(cssModel,workspace,networkMapping,WebInspector.NetworkProject.forTarget(cssModel.target()));    this._headerInfoById = new Map();    cssModel.addEventListener(WebInspector.CSSStyleModel.Events.StyleSheetAdded, this._styleSheetAdded, this);    cssModel.addEventListener(WebInspector.CSSStyleModel.Events.StyleSheetRemoved, this._styleSheetRemoved, this);}WebInspector.CSSWorkspaceBinding.TargetInfo.prototype = {    _styleSheetAdded: function(event)     {        var header = (event.data);        this._stylesSourceMapping.addHeader(header);        this._sassSourceMapping.addHeader(header);    },    _styleSheetRemoved: function(event)     {        var header = (event.data);        this._stylesSourceMapping.removeHeader(header);        this._sassSourceMapping.removeHeader(header);        this._headerInfoById.remove(header.id);    },    _headerInfo: function(id)     {        return this._headerInfoById.get(id);    },    _ensureInfoForHeader: function(header)     {        var info = this._headerInfoById.get(header.id);        if (!info) {            info = new WebInspector.CSSWorkspaceBinding.HeaderInfo(header);            this._headerInfoById.set(header.id, info);        }        return info;    },    _dispose: function()     {        this._reset();        this._cssModel.removeEventListener(WebInspector.CSSStyleModel.Events.StyleSheetAdded, this._styleSheetAdded, this);        this._cssModel.removeEventListener(WebInspector.CSSStyleModel.Events.StyleSheetRemoved, this._styleSheetRemoved, this);    },    _reset: function()     {        this._headerInfoById.clear();    }}WebInspector.CSSWorkspaceBinding.HeaderInfo = function(header) {    this._header = header;    this._sourceMappings = [];    this._locations = new Set();}WebInspector.CSSWorkspaceBinding.HeaderInfo.prototype = {    _addLocation: function(location)     {        this._locations.add(location);        location.update();    },    _removeLocation: function(location)     {        this._locations.delete(location);    },    _updateLocations: function()     {        var items = this._locations.valuesArray();        for (var i = 0; i < items.length; ++i)            items[i].update();    },    _rawLocationToUILocation: function(lineNumber, columnNumber)     {        var uiLocation = null ;        var rawLocation = new WebInspector.CSSLocation(this._header.cssModel(),this._header.id,this._header.resourceURL(),lineNumber,columnNumber);        for (var i = this._sourceMappings.length - 1; !uiLocation && i >= 0; --i)            uiLocation = this._sourceMappings[i].rawLocationToUILocation(rawLocation);        return uiLocation;    },    _pushSourceMapping: function(sourceMapping)     {        this._sourceMappings.push(sourceMapping);        this._updateLocations();    }}WebInspector.CSSWorkspaceBinding.LiveLocation = function(cssModel, header, rawLocation, binding, updateDelegate) {    WebInspector.LiveLocation.call(this, updateDelegate);    this._cssModel = cssModel;    this._rawLocation = rawLocation;    this._binding = binding;    if (!header)        this._clearStyleSheet();    else        this._setStyleSheet(header);}WebInspector.CSSWorkspaceBinding.LiveLocation.prototype = {    _styleSheetAdded: function(event)     {        console.assert(!this._header);        var header = (event.data);        if (header.sourceURL && header.sourceURL === this._rawLocation.url)            this._setStyleSheet(header);    },    _styleSheetRemoved: function(event)     {        console.assert(this._header);        var header = (event.data);        if (this._header !== header)            return;        this._binding._removeLiveLocation(this);        this._clearStyleSheet();    },    _setStyleSheet: function(header)     {        this._header = header;        this._binding._addLiveLocation(this);        this._cssModel.removeEventListener(WebInspector.CSSStyleModel.Events.StyleSheetAdded, this._styleSheetAdded, this);        this._cssModel.addEventListener(WebInspector.CSSStyleModel.Events.StyleSheetRemoved, this._styleSheetRemoved, this);    },    _clearStyleSheet: function()     {        delete this._header;        this._cssModel.removeEventListener(WebInspector.CSSStyleModel.Events.StyleSheetRemoved, this._styleSheetRemoved, this);        this._cssModel.addEventListener(WebInspector.CSSStyleModel.Events.StyleSheetAdded, this._styleSheetAdded, this);    },    uiLocation: function()     {        var cssLocation = this._rawLocation;        if (this._header) {            var headerInfo = this._binding._headerInfo(this._header);            return headerInfo._rawLocationToUILocation(cssLocation.lineNumber, cssLocation.columnNumber);        }        var uiSourceCode = this._binding._networkMapping.uiSourceCodeForURL(cssLocation.url, cssLocation.target());        if (!uiSourceCode)            return null ;        return uiSourceCode.uiLocation(cssLocation.lineNumber, cssLocation.columnNumber);    },    dispose: function()     {        WebInspector.LiveLocation.prototype.dispose.call(this);        if (this._header)            this._binding._removeLiveLocation(this);        this._cssModel.removeEventListener(WebInspector.CSSStyleModel.Events.StyleSheetAdded, this._styleSheetAdded, this);        this._cssModel.removeEventListener(WebInspector.CSSStyleModel.Events.StyleSheetRemoved, this._styleSheetRemoved, this);    },    __proto__: WebInspector.LiveLocation.prototype}WebInspector.CSSSourceMapping = function() {}WebInspector.CSSSourceMapping.prototype = {    rawLocationToUILocation: function(rawLocation) {},    uiLocationToRawLocation: function(uiSourceCode, lineNumber, columnNumber) {},    isIdentity: function() {},    uiLineHasMapping: function(uiSourceCode, lineNumber) {}}WebInspector.cssWorkspaceBinding;;WebInspector.DebuggerWorkspaceBinding = function(targetManager, workspace, networkMapping) {    this._workspace = workspace;    this._networkMapping = networkMapping;    this._targetToData = new Map();    targetManager.observeTargets(this);    targetManager.addModelListener(WebInspector.DebuggerModel, WebInspector.DebuggerModel.Events.GlobalObjectCleared, this._globalObjectCleared, this);    targetManager.addModelListener(WebInspector.DebuggerModel, WebInspector.DebuggerModel.Events.BeforeDebuggerPaused, this._beforeDebuggerPaused, this);    targetManager.addModelListener(WebInspector.DebuggerModel, WebInspector.DebuggerModel.Events.DebuggerResumed, this._debuggerResumed, this);    workspace.addEventListener(WebInspector.Workspace.Events.UISourceCodeRemoved, this._uiSourceCodeRemoved, this);    workspace.addEventListener(WebInspector.Workspace.Events.ProjectRemoved, this._projectRemoved, this);}WebInspector.DebuggerWorkspaceBinding.prototype = {    targetAdded: function(target)     {        var debuggerModel = WebInspector.DebuggerModel.fromTarget(target);        if (debuggerModel)            this._targetToData.set(target, new WebInspector.DebuggerWorkspaceBinding.TargetData(debuggerModel,this));    },    targetRemoved: function(target)     {        if (!WebInspector.DebuggerModel.fromTarget(target))            return;        var targetData = this._targetToData.get(target);        targetData._dispose();        this._targetToData.remove(target);    },    _uiSourceCodeRemoved: function(event)     {        var uiSourceCode = (event.data);        var targetDatas = this._targetToData.valuesArray();        for (var i = 0; i < targetDatas.length; ++i)            targetDatas[i]._uiSourceCodeRemoved(uiSourceCode);    },    _projectRemoved: function(event)     {        var project = (event.data);        var targetDatas = this._targetToData.valuesArray();        var uiSourceCodes = project.uiSourceCodes();        for (var i = 0; i < targetDatas.length; ++i) {            for (var j = 0; j < uiSourceCodes.length; ++j)                targetDatas[i]._uiSourceCodeRemoved(uiSourceCodes[j]);        }    },    pushSourceMapping: function(script, sourceMapping)     {        var info = this._ensureInfoForScript(script);        info._pushSourceMapping(sourceMapping);    },    popSourceMapping: function(script)     {        var info = this._infoForScript(script.target(), script.scriptId);        console.assert(info);        return info._popSourceMapping();    },    setSourceMapping: function(target, uiSourceCode, sourceMapping)     {        var data = this._targetToData.get(target);        if (data)            data._setSourceMapping(uiSourceCode, sourceMapping);    },    updateLocations: function(script)     {        var info = this._infoForScript(script.target(), script.scriptId);        if (info)            info._updateLocations();    },    createLiveLocation: function(rawLocation, updateDelegate)     {        var info = this._infoForScript(rawLocation.target(), rawLocation.scriptId);        console.assert(info);        var location = new WebInspector.DebuggerWorkspaceBinding.Location(info._script,rawLocation,this,updateDelegate);        info._addLocation(location);        return location;    },    createCallFrameLiveLocation: function(callFrame, updateDelegate)     {        var target = callFrame.target();        this._ensureInfoForScript(callFrame.script);        var location = this.createLiveLocation(callFrame.location(), updateDelegate);        this._registerCallFrameLiveLocation(target, location);        return location;    },    rawLocationToUILocation: function(rawLocation)     {        var info = this._infoForScript(rawLocation.target(), rawLocation.scriptId);        console.assert(info);        return info._rawLocationToUILocation(rawLocation);    },    uiLocationToRawLocation: function(target, uiSourceCode, lineNumber, columnNumber)     {        var targetData = this._targetToData.get(target);        return targetData ? (targetData._uiLocationToRawLocation(uiSourceCode, lineNumber, columnNumber)) : null ;    },    uiLocationToRawLocations: function(uiSourceCode, lineNumber, columnNumber)     {        var result = [];        var targetDatas = this._targetToData.valuesArray();        for (var i = 0; i < targetDatas.length; ++i) {            var rawLocation = targetDatas[i]._uiLocationToRawLocation(uiSourceCode, lineNumber, columnNumber);            if (rawLocation)                result.push(rawLocation);        }        return result;    },    normalizeUILocation: function(uiLocation)     {        var target = WebInspector.NetworkProject.targetForUISourceCode(uiLocation.uiSourceCode);        if (target) {            var rawLocation = this.uiLocationToRawLocation(target, uiLocation.uiSourceCode, uiLocation.lineNumber, uiLocation.columnNumber);            if (rawLocation)                return this.rawLocationToUILocation(rawLocation);        }        return uiLocation;    },    uiLineHasMapping: function(uiSourceCode, lineNumber)     {        var targetDatas = this._targetToData.valuesArray();        for (var i = 0; i < targetDatas.length; ++i) {            if (!targetDatas[i]._uiLineHasMapping(uiSourceCode, lineNumber))                return false;        }        return true;    },    scriptFile: function(uiSourceCode, target)     {        var targetData = this._targetToData.get(target);        return targetData ? targetData._resourceMapping.scriptFile(uiSourceCode) : null ;    },    _globalObjectCleared: function(event)     {        var debuggerModel = (event.target);        this._reset(debuggerModel.target());    },    _reset: function(target)     {        var targetData = this._targetToData.get(target);        targetData.callFrameLocations.valuesArray().forEach(function(location) {            location.dispose();        }        );        targetData.callFrameLocations.clear();    },    _ensureInfoForScript: function(script)     {        var scriptDataMap = this._targetToData.get(script.target()).scriptDataMap;        var info = scriptDataMap.get(script.scriptId);        if (!info) {            info = new WebInspector.DebuggerWorkspaceBinding.ScriptInfo(script);            scriptDataMap.set(script.scriptId, info);        }        return info;    },    _infoForScript: function(target, scriptId)     {        var data = this._targetToData.get(target);        if (!data)            return null ;        return data.scriptDataMap.get(scriptId) || null ;    },    _registerCallFrameLiveLocation: function(target, location)     {        var locations = this._targetToData.get(target).callFrameLocations;        locations.add(location);    },    _removeLiveLocation: function(location)     {        var info = this._infoForScript(location._script.target(), location._script.scriptId);        if (info)            info._removeLocation(location);    },    _debuggerResumed: function(event)     {        var debuggerModel = (event.target);        this._reset(debuggerModel.target());    },    _beforeDebuggerPaused: function(event)     {        var rawLocation = event.data.callFrames[0].location();        var targetData = this._targetToData.get(rawLocation.target());        if (!targetData._compilerMapping.mapsToSourceCode(rawLocation)) {            event.stopPropagation();            event.preventDefault();        }    }}WebInspector.DebuggerWorkspaceBinding.TargetData = function(debuggerModel, debuggerWorkspaceBinding) {    this._target = debuggerModel.target();    this.scriptDataMap = new Map();    this.callFrameLocations = new Set();    var workspace = debuggerWorkspaceBinding._workspace;    var networkMapping = debuggerWorkspaceBinding._networkMapping;    this._defaultMapping = new WebInspector.DefaultScriptMapping(debuggerModel,workspace,debuggerWorkspaceBinding);    this._resourceMapping = new WebInspector.ResourceScriptMapping(debuggerModel,workspace,networkMapping,debuggerWorkspaceBinding);    this._compilerMapping = new WebInspector.CompilerScriptMapping(debuggerModel,workspace,networkMapping,WebInspector.NetworkProject.forTarget(this._target),debuggerWorkspaceBinding);    this._uiSourceCodeToSourceMapping = new Map();    debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.ParsedScriptSource, this._parsedScriptSource, this);    debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.FailedToParseScriptSource, this._parsedScriptSource, this);}WebInspector.DebuggerWorkspaceBinding.TargetData.prototype = {    _parsedScriptSource: function(event)     {        var script = (event.data);        this._defaultMapping.addScript(script);        this._resourceMapping.addScript(script);        if (WebInspector.moduleSetting("jsSourceMapsEnabled").get())            this._compilerMapping.addScript(script);    },    _setSourceMapping: function(uiSourceCode, sourceMapping)     {        if (this._uiSourceCodeToSourceMapping.get(uiSourceCode) === sourceMapping)            return;        if (sourceMapping)            this._uiSourceCodeToSourceMapping.set(uiSourceCode, sourceMapping);        else            this._uiSourceCodeToSourceMapping.remove(uiSourceCode);        uiSourceCode.dispatchEventToListeners(WebInspector.UISourceCode.Events.SourceMappingChanged, {            target: this._target,            isIdentity: sourceMapping ? sourceMapping.isIdentity() : false        });    },    _uiLocationToRawLocation: function(uiSourceCode, lineNumber, columnNumber)     {        var sourceMapping = this._uiSourceCodeToSourceMapping.get(uiSourceCode);        return sourceMapping ? sourceMapping.uiLocationToRawLocation(uiSourceCode, lineNumber, columnNumber) : null ;    },    _uiLineHasMapping: function(uiSourceCode, lineNumber)     {        var sourceMapping = this._uiSourceCodeToSourceMapping.get(uiSourceCode);        return sourceMapping ? sourceMapping.uiLineHasMapping(uiSourceCode, lineNumber) : true;    },    _uiSourceCodeRemoved: function(uiSourceCode)     {        this._uiSourceCodeToSourceMapping.remove(uiSourceCode);    },    _dispose: function()     {        this._compilerMapping.dispose();        this._resourceMapping.dispose();        this._defaultMapping.dispose();        this._uiSourceCodeToSourceMapping.clear();    }}WebInspector.DebuggerWorkspaceBinding.ScriptInfo = function(script) {    this._script = script;    this._sourceMappings = [];    this._locations = new Set();}WebInspector.DebuggerWorkspaceBinding.ScriptInfo.prototype = {    _pushSourceMapping: function(sourceMapping)     {        this._sourceMappings.push(sourceMapping);        this._updateLocations();    },    _popSourceMapping: function()     {        var sourceMapping = this._sourceMappings.pop();        this._updateLocations();        return sourceMapping;    },    _addLocation: function(location)     {        this._locations.add(location);        location.update();    },    _removeLocation: function(location)     {        this._locations.delete(location);    },    _updateLocations: function()     {        for (var location of this._locations)            location.update();    },    _rawLocationToUILocation: function(rawLocation)     {        var uiLocation;        for (var i = this._sourceMappings.length - 1; !uiLocation && i >= 0; --i)            uiLocation = this._sourceMappings[i].rawLocationToUILocation(rawLocation);        console.assert(uiLocation, "Script raw location cannot be mapped to any UI location.");        return ( uiLocation) ;    }}WebInspector.DebuggerWorkspaceBinding.Location = function(script, rawLocation, binding, updateDelegate) {    WebInspector.LiveLocation.call(this, updateDelegate);    this._script = script;    this._rawLocation = rawLocation;    this._binding = binding;}WebInspector.DebuggerWorkspaceBinding.Location.prototype = {    uiLocation: function()     {        var debuggerModelLocation = this._rawLocation;        return this._binding.rawLocationToUILocation(debuggerModelLocation);    },    dispose: function()     {        WebInspector.LiveLocation.prototype.dispose.call(this);        this._binding._removeLiveLocation(this);    },    __proto__: WebInspector.LiveLocation.prototype}WebInspector.DebuggerSourceMapping = function() {}WebInspector.DebuggerSourceMapping.prototype = {    rawLocationToUILocation: function(rawLocation) {},    uiLocationToRawLocation: function(uiSourceCode, lineNumber, columnNumber) {},    isIdentity: function() {},    uiLineHasMapping: function(uiSourceCode, lineNumber) {}}WebInspector.debuggerWorkspaceBinding;;WebInspector.BreakpointManager = function(breakpointsSetting, workspace, networkMapping, targetManager, debuggerWorkspaceBinding) {    this._storage = new WebInspector.BreakpointManager.Storage(this,breakpointsSetting);    this._workspace = workspace;    this._networkMapping = networkMapping;    this._targetManager = targetManager;    this._debuggerWorkspaceBinding = debuggerWorkspaceBinding;    this._breakpointsActive = true;    this._breakpointsForUISourceCode = new Map();    this._breakpointsForPrimaryUISourceCode = new Map();    this._provisionalBreakpoints = new Multimap();    this._workspace.addEventListener(WebInspector.Workspace.Events.ProjectRemoved, this._projectRemoved, this);    this._workspace.addEventListener(WebInspector.Workspace.Events.UISourceCodeAdded, this._uiSourceCodeAdded, this);    this._workspace.addEventListener(WebInspector.Workspace.Events.UISourceCodeRemoved, this._uiSourceCodeRemoved, this);}WebInspector.BreakpointManager.Events = {    BreakpointAdded: "breakpoint-added",    BreakpointRemoved: "breakpoint-removed",    BreakpointsActiveStateChanged: "BreakpointsActiveStateChanged"}WebInspector.BreakpointManager._breakpointStorageId = function(sourceFileId, lineNumber, columnNumber) {    if (!sourceFileId)        return "";    return sourceFileId + ":" + lineNumber + ":" + columnNumber;}WebInspector.BreakpointManager.prototype = {    _sourceFileId: function(uiSourceCode)     {        var networkURL = this._networkMapping.networkURL(uiSourceCode)        if (!networkURL)            return "";        return uiSourceCode.uri();    },    targetAdded: function(target)     {        var debuggerModel = WebInspector.DebuggerModel.fromTarget(target);        if (debuggerModel && !this._breakpointsActive)            debuggerModel.setBreakpointsActive(this._breakpointsActive);    },    targetRemoved: function(target) {},    _provisionalBreakpointsForSourceFileId: function(sourceFileId)     {        var result = new Map();        var breakpoints = this._provisionalBreakpoints.get(sourceFileId).valuesArray();        for (var i = 0; i < breakpoints.length; ++i)            result.set(breakpoints[i]._breakpointStorageId(), breakpoints[i]);        return result;    },    removeProvisionalBreakpointsForTest: function()     {        var breakpoints = this._provisionalBreakpoints.valuesArray();        for (var i = 0; i < breakpoints.length; ++i)            breakpoints[i].remove();        this._provisionalBreakpoints.clear();    },    _restoreBreakpoints: function(uiSourceCode)     {        var sourceFileId = this._sourceFileId(uiSourceCode);        if (!sourceFileId)            return;        this._storage.mute();        var breakpointItems = this._storage.breakpointItems(this._sourceFileId(uiSourceCode));        var provisionalBreakpoints = this._provisionalBreakpointsForSourceFileId(sourceFileId);        for (var i = 0; i < breakpointItems.length; ++i) {            var breakpointItem = breakpointItems[i];            var itemStorageId = WebInspector.BreakpointManager._breakpointStorageId(breakpointItem.sourceFileId, breakpointItem.lineNumber, breakpointItem.columnNumber);            var provisionalBreakpoint = provisionalBreakpoints.get(itemStorageId);            if (provisionalBreakpoint) {                if (!this._breakpointsForPrimaryUISourceCode.get(uiSourceCode))                    this._breakpointsForPrimaryUISourceCode.set(uiSourceCode, []);                this._breakpointsForPrimaryUISourceCode.get(uiSourceCode).push(provisionalBreakpoint);                provisionalBreakpoint._updateBreakpoint();            } else {                this._innerSetBreakpoint(uiSourceCode, breakpointItem.lineNumber, breakpointItem.columnNumber, breakpointItem.condition, breakpointItem.enabled);            }        }        this._provisionalBreakpoints.removeAll(sourceFileId);        this._storage.unmute();    },    _uiSourceCodeAdded: function(event)     {        var uiSourceCode = (event.data);        this._restoreBreakpoints(uiSourceCode);        if (uiSourceCode.contentType() === WebInspector.resourceTypes.Script || uiSourceCode.contentType() === WebInspector.resourceTypes.Document)            uiSourceCode.addEventListener(WebInspector.UISourceCode.Events.SourceMappingChanged, this._uiSourceCodeMappingChanged, this);    },    _uiSourceCodeRemoved: function(event)     {        var uiSourceCode = (event.data);        this._removeUISourceCode(uiSourceCode);    },    _uiSourceCodeMappingChanged: function(event)     {        var uiSourceCode = (event.target);        var isIdentity = (event.data.isIdentity);        var target = (event.data.target);        if (isIdentity)            return;        var breakpoints = this._breakpointsForPrimaryUISourceCode.get(uiSourceCode) || [];        for (var i = 0; i < breakpoints.length; ++i)            breakpoints[i]._updateInDebuggerForTarget(target);    },    _removeUISourceCode: function(uiSourceCode)     {        var breakpoints = this._breakpointsForPrimaryUISourceCode.get(uiSourceCode) || [];        var sourceFileId = this._sourceFileId(uiSourceCode);        for (var i = 0; i < breakpoints.length; ++i) {            breakpoints[i]._resetLocations();            if (breakpoints[i].enabled())                this._provisionalBreakpoints.set(sourceFileId, breakpoints[i]);        }        uiSourceCode.removeEventListener(WebInspector.UISourceCode.Events.SourceMappingChanged, this._uiSourceCodeMappingChanged, this);        this._breakpointsForPrimaryUISourceCode.remove(uiSourceCode);    },    setBreakpoint: function(uiSourceCode, lineNumber, columnNumber, condition, enabled)     {        var uiLocation = new WebInspector.UILocation(uiSourceCode,lineNumber,columnNumber);        var normalizedLocation = this._debuggerWorkspaceBinding.normalizeUILocation(uiLocation);        if (normalizedLocation.id() !== uiLocation.id()) {            WebInspector.Revealer.reveal(normalizedLocation);            uiLocation = normalizedLocation;        }        this.setBreakpointsActive(true);        return this._innerSetBreakpoint(uiLocation.uiSourceCode, uiLocation.lineNumber, uiLocation.columnNumber, condition, enabled);    },    _innerSetBreakpoint: function(uiSourceCode, lineNumber, columnNumber, condition, enabled)     {        var breakpoint = this.findBreakpoint(uiSourceCode, lineNumber, columnNumber);        if (breakpoint) {            breakpoint._updateState(condition, enabled);            return breakpoint;        }        var projectId = uiSourceCode.project().id();        var path = uiSourceCode.path();        var sourceFileId = this._sourceFileId(uiSourceCode);        breakpoint = new WebInspector.BreakpointManager.Breakpoint(this,projectId,path,sourceFileId,lineNumber,columnNumber,condition,enabled);        if (!this._breakpointsForPrimaryUISourceCode.get(uiSourceCode))            this._breakpointsForPrimaryUISourceCode.set(uiSourceCode, []);        this._breakpointsForPrimaryUISourceCode.get(uiSourceCode).push(breakpoint);        return breakpoint;    },    findBreakpoint: function(uiSourceCode, lineNumber, columnNumber)     {        var breakpoints = this._breakpointsForUISourceCode.get(uiSourceCode);        var lineBreakpoints = breakpoints ? breakpoints.get(String(lineNumber)) : null ;        var columnBreakpoints = lineBreakpoints ? lineBreakpoints.get(String(columnNumber)) : null ;        return columnBreakpoints ? columnBreakpoints[0] : null ;    },    findBreakpointOnLine: function(uiSourceCode, lineNumber)     {        var breakpoints = this._breakpointsForUISourceCode.get(uiSourceCode);        var lineBreakpoints = breakpoints ? breakpoints.get(String(lineNumber)) : null ;        return lineBreakpoints ? lineBreakpoints.valuesArray()[0][0] : null ;    },    breakpointsForUISourceCode: function(uiSourceCode)     {        var result = [];        var uiSourceCodeBreakpoints = this._breakpointsForUISourceCode.get(uiSourceCode);        var breakpoints = uiSourceCodeBreakpoints ? uiSourceCodeBreakpoints.valuesArray() : [];        for (var i = 0; i < breakpoints.length; ++i) {            var lineBreakpoints = breakpoints[i];            var columnBreakpointArrays = lineBreakpoints ? lineBreakpoints.valuesArray() : [];            result = result.concat.apply(result, columnBreakpointArrays);        }        return result;    },    allBreakpoints: function()     {        var result = [];        var uiSourceCodes = this._breakpointsForUISourceCode.keysArray();        for (var i = 0; i < uiSourceCodes.length; ++i)            result = result.concat(this.breakpointsForUISourceCode(uiSourceCodes[i]));        return result;    },    breakpointLocationsForUISourceCode: function(uiSourceCode)     {        var uiSourceCodeBreakpoints = this._breakpointsForUISourceCode.get(uiSourceCode);        var lineNumbers = uiSourceCodeBreakpoints ? uiSourceCodeBreakpoints.keysArray() : [];        var result = [];        for (var i = 0; i < lineNumbers.length; ++i) {            var lineBreakpoints = uiSourceCodeBreakpoints.get(lineNumbers[i]);            var columnNumbers = lineBreakpoints.keysArray();            for (var j = 0; j < columnNumbers.length; ++j) {                var columnBreakpoints = lineBreakpoints.get(columnNumbers[j]);                var lineNumber = parseInt(lineNumbers[i], 10);                var columnNumber = parseInt(columnNumbers[j], 10);                for (var k = 0; k < columnBreakpoints.length; ++k) {                    var breakpoint = columnBreakpoints[k];                    var uiLocation = uiSourceCode.uiLocation(lineNumber, columnNumber);                    result.push({                        breakpoint: breakpoint,                        uiLocation: uiLocation                    });                }            }        }        return result;    },    allBreakpointLocations: function()     {        var result = [];        var uiSourceCodes = this._breakpointsForUISourceCode.keysArray();        for (var i = 0; i < uiSourceCodes.length; ++i)            result = result.concat(this.breakpointLocationsForUISourceCode(uiSourceCodes[i]));        return result;    },    toggleAllBreakpoints: function(toggleState)     {        var breakpoints = this.allBreakpoints();        for (var i = 0; i < breakpoints.length; ++i)            breakpoints[i].setEnabled(toggleState);    },    removeAllBreakpoints: function()     {        var breakpoints = this.allBreakpoints();        for (var i = 0; i < breakpoints.length; ++i)            breakpoints[i].remove();    },    _projectRemoved: function(event)     {        var project = (event.data);        var uiSourceCodes = project.uiSourceCodes();        for (var i = 0; i < uiSourceCodes.length; ++i)            this._removeUISourceCode(uiSourceCodes[i]);    },    _removeBreakpoint: function(breakpoint, removeFromStorage)     {        var uiSourceCode = breakpoint.uiSourceCode();        var breakpoints = uiSourceCode ? this._breakpointsForPrimaryUISourceCode.get(uiSourceCode) || [] : [];        breakpoints.remove(breakpoint);        if (removeFromStorage)            this._storage._removeBreakpoint(breakpoint);        this._provisionalBreakpoints.remove(breakpoint._sourceFileId, breakpoint);    },    _uiLocationAdded: function(breakpoint, uiLocation)     {        var breakpoints = this._breakpointsForUISourceCode.get(uiLocation.uiSourceCode);        if (!breakpoints) {            breakpoints = new Map();            this._breakpointsForUISourceCode.set(uiLocation.uiSourceCode, breakpoints);        }        var lineBreakpoints = breakpoints.get(String(uiLocation.lineNumber));        if (!lineBreakpoints) {            lineBreakpoints = new Map();            breakpoints.set(String(uiLocation.lineNumber), lineBreakpoints);        }        var columnBreakpoints = lineBreakpoints.get(String(uiLocation.columnNumber));        if (!columnBreakpoints) {            columnBreakpoints = [];            lineBreakpoints.set(String(uiLocation.columnNumber), columnBreakpoints);        }        columnBreakpoints.push(breakpoint);        this.dispatchEventToListeners(WebInspector.BreakpointManager.Events.BreakpointAdded, {            breakpoint: breakpoint,            uiLocation: uiLocation        });    },    _uiLocationRemoved: function(breakpoint, uiLocation)     {        var breakpoints = this._breakpointsForUISourceCode.get(uiLocation.uiSourceCode);        if (!breakpoints)            return;        var lineBreakpoints = breakpoints.get(String(uiLocation.lineNumber));        if (!lineBreakpoints)            return;        var columnBreakpoints = lineBreakpoints.get(String(uiLocation.columnNumber));        if (!columnBreakpoints)            return;        columnBreakpoints.remove(breakpoint);        if (!columnBreakpoints.length)            lineBreakpoints.remove(String(uiLocation.columnNumber));        if (!lineBreakpoints.size)            breakpoints.remove(String(uiLocation.lineNumber));        if (!breakpoints.size)            this._breakpointsForUISourceCode.remove(uiLocation.uiSourceCode);        this.dispatchEventToListeners(WebInspector.BreakpointManager.Events.BreakpointRemoved, {            breakpoint: breakpoint,            uiLocation: uiLocation        });    },    setBreakpointsActive: function(active)     {        if (this._breakpointsActive === active)            return;        this._breakpointsActive = active;        var debuggerModels = WebInspector.DebuggerModel.instances();        for (var i = 0; i < debuggerModels.length; ++i)            debuggerModels[i].setBreakpointsActive(active);        this.dispatchEventToListeners(WebInspector.BreakpointManager.Events.BreakpointsActiveStateChanged, active);    },    breakpointsActive: function()     {        return this._breakpointsActive;    },    __proto__: WebInspector.Object.prototype}WebInspector.BreakpointManager.Breakpoint = function(breakpointManager, projectId, path, sourceFileId, lineNumber, columnNumber, condition, enabled) {    this._breakpointManager = breakpointManager;    this._projectId = projectId;    this._path = path;    this._lineNumber = lineNumber;    this._columnNumber = columnNumber;    this._sourceFileId = sourceFileId;    this._numberOfDebuggerLocationForUILocation = {};    this._condition;    this._enabled;    this._isRemoved;    this._fakePrimaryLocation;    this._currentState = null ;    this._targetBreakpoints = new Map();    this._updateState(condition, enabled);    this._breakpointManager._targetManager.observeTargets(this);}WebInspector.BreakpointManager.Breakpoint.prototype = {    targetAdded: function(target)     {        var debuggerModel = WebInspector.DebuggerModel.fromTarget(target);        if (!debuggerModel)            return;        var networkMapping = this._breakpointManager._networkMapping;        var debuggerWorkspaceBinding = this._breakpointManager._debuggerWorkspaceBinding;        this._targetBreakpoints.set(target, new WebInspector.BreakpointManager.TargetBreakpoint(debuggerModel,this,networkMapping,debuggerWorkspaceBinding));    },    targetRemoved: function(target)     {        var debuggerModel = WebInspector.DebuggerModel.fromTarget(target);        if (!debuggerModel)            return;        var targetBreakpoint = this._targetBreakpoints.remove(target);        targetBreakpoint._cleanUpAfterDebuggerIsGone();        targetBreakpoint._removeEventListeners();    },    projectId: function()     {        return this._projectId;    },    path: function()     {        return this._path;    },    lineNumber: function()     {        return this._lineNumber;    },    columnNumber: function()     {        return this._columnNumber;    },    uiSourceCode: function()     {        return this._breakpointManager._workspace.uiSourceCode(this._projectId, this._path);    },    _replaceUILocation: function(oldUILocation, newUILocation)     {        if (this._isRemoved)            return;        this._removeUILocation(oldUILocation, true);        this._removeFakeBreakpointAtPrimaryLocation();        if (!this._numberOfDebuggerLocationForUILocation[newUILocation.id()])            this._numberOfDebuggerLocationForUILocation[newUILocation.id()] = 0;        if (++this._numberOfDebuggerLocationForUILocation[newUILocation.id()] === 1)            this._breakpointManager._uiLocationAdded(this, newUILocation);    },    _removeUILocation: function(uiLocation, muteCreationFakeBreakpoint)     {        if (!uiLocation || --this._numberOfDebuggerLocationForUILocation[uiLocation.id()] !== 0)            return;        delete this._numberOfDebuggerLocationForUILocation[uiLocation.id()];        this._breakpointManager._uiLocationRemoved(this, uiLocation);        if (!muteCreationFakeBreakpoint)            this._fakeBreakpointAtPrimaryLocation();    },    enabled: function()     {        return this._enabled;    },    setEnabled: function(enabled)     {        this._updateState(this._condition, enabled);    },    condition: function()     {        return this._condition;    },    setCondition: function(condition)     {        this._updateState(condition, this._enabled);    },    _updateState: function(condition, enabled)     {        if (this._enabled === enabled && this._condition === condition)            return;        this._enabled = enabled;        this._condition = condition;        this._breakpointManager._storage._updateBreakpoint(this);        this._updateBreakpoint();    },    _updateBreakpoint: function()     {        this._removeFakeBreakpointAtPrimaryLocation();        this._fakeBreakpointAtPrimaryLocation();        var targetBreakpoints = this._targetBreakpoints.valuesArray();        for (var i = 0; i < targetBreakpoints.length; ++i)            targetBreakpoints[i]._scheduleUpdateInDebugger();    },    remove: function(keepInStorage)     {        this._isRemoved = true;        var removeFromStorage = !keepInStorage;        this._removeFakeBreakpointAtPrimaryLocation();        var targetBreakpoints = this._targetBreakpoints.valuesArray();        for (var i = 0; i < targetBreakpoints.length; ++i) {            targetBreakpoints[i]._scheduleUpdateInDebugger();            targetBreakpoints[i]._removeEventListeners();        }        this._breakpointManager._removeBreakpoint(this, removeFromStorage);        this._breakpointManager._targetManager.unobserveTargets(this);    },    _updateInDebuggerForTarget: function(target)     {        this._targetBreakpoints.get(target)._scheduleUpdateInDebugger();    },    _breakpointStorageId: function()     {        return WebInspector.BreakpointManager._breakpointStorageId(this._sourceFileId, this._lineNumber, this._columnNumber);    },    _fakeBreakpointAtPrimaryLocation: function()     {        if (this._isRemoved || !Object.isEmpty(this._numberOfDebuggerLocationForUILocation) || this._fakePrimaryLocation)            return;        var uiSourceCode = this._breakpointManager._workspace.uiSourceCode(this._projectId, this._path);        if (!uiSourceCode)            return;        this._fakePrimaryLocation = uiSourceCode.uiLocation(this._lineNumber, this._columnNumber);        if (this._fakePrimaryLocation)            this._breakpointManager._uiLocationAdded(this, this._fakePrimaryLocation);    },    _removeFakeBreakpointAtPrimaryLocation: function()     {        if (this._fakePrimaryLocation) {            this._breakpointManager._uiLocationRemoved(this, this._fakePrimaryLocation);            delete this._fakePrimaryLocation;        }    },    _resetLocations: function()     {        this._removeFakeBreakpointAtPrimaryLocation();        var targetBreakpoints = this._targetBreakpoints.valuesArray();        for (var i = 0; i < targetBreakpoints.length; ++i)            targetBreakpoints[i]._resetLocations();    }}WebInspector.BreakpointManager.TargetBreakpoint = function(debuggerModel, breakpoint, networkMapping, debuggerWorkspaceBinding) {    WebInspector.SDKObject.call(this, debuggerModel.target());    this._debuggerModel = debuggerModel;    this._breakpoint = breakpoint;    this._networkMapping = networkMapping;    this._debuggerWorkspaceBinding = debuggerWorkspaceBinding;    this._liveLocations = [];    this._uiLocations = {};    this._debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.DebuggerWasDisabled, this._cleanUpAfterDebuggerIsGone, this);    this._debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.DebuggerWasEnabled, this._scheduleUpdateInDebugger, this);    this._hasPendingUpdate = false;    this._isUpdating = false;    this._cancelCallback = false;    this._currentState = null ;    if (this._debuggerModel.debuggerEnabled())        this._scheduleUpdateInDebugger();}WebInspector.BreakpointManager.TargetBreakpoint.prototype = {    _resetLocations: function()     {        var uiLocations = Object.values(this._uiLocations);        for (var i = 0; i < uiLocations.length; ++i)            this._breakpoint._removeUILocation(uiLocations[i]);        this._uiLocations = {};        for (var i = 0; i < this._liveLocations.length; ++i)            this._liveLocations[i].dispose();        this._liveLocations = [];    },    _scheduleUpdateInDebugger: function()     {        if (this._isUpdating) {            this._hasPendingUpdate = true;            return;        }        this._isUpdating = true;        this._updateInDebugger(this._didUpdateInDebugger.bind(this));    },    _didUpdateInDebugger: function()     {        this._isUpdating = false;        if (this._hasPendingUpdate) {            this._hasPendingUpdate = false;            this._scheduleUpdateInDebugger();        }    },    _scriptDiverged: function()     {        var uiSourceCode = this._breakpoint.uiSourceCode();        if (!uiSourceCode)            return false;        var scriptFile = this._debuggerWorkspaceBinding.scriptFile(uiSourceCode, this.target());        return !!scriptFile && scriptFile.hasDivergedFromVM();    },    _updateInDebugger: function(callback)     {        if (this.target().isDetached()) {            this._cleanUpAfterDebuggerIsGone();            callback();            return;        }        var uiSourceCode = this._breakpoint.uiSourceCode();        var lineNumber = this._breakpoint._lineNumber;        var columnNumber = this._breakpoint._columnNumber;        var condition = this._breakpoint.condition();        var debuggerLocation = uiSourceCode ? this._debuggerWorkspaceBinding.uiLocationToRawLocation(this.target(), uiSourceCode, lineNumber, columnNumber) : null ;        var newState;        if (this._breakpoint._isRemoved || !this._breakpoint.enabled() || this._scriptDiverged())            newState = null ;        else if (debuggerLocation) {            var script = debuggerLocation.script();            if (script.sourceURL)                newState = new WebInspector.BreakpointManager.Breakpoint.State(script.sourceURL,null ,debuggerLocation.lineNumber,debuggerLocation.columnNumber,condition);            else                newState = new WebInspector.BreakpointManager.Breakpoint.State(null ,debuggerLocation.scriptId,debuggerLocation.lineNumber,debuggerLocation.columnNumber,condition);        } else if (this._breakpoint._currentState && this._breakpoint._currentState.url) {            var position = this._breakpoint._currentState;            newState = new WebInspector.BreakpointManager.Breakpoint.State(position.url,null ,position.lineNumber,position.columnNumber,condition);        } else if (uiSourceCode) {            var networkURL = this._networkMapping.networkURL(uiSourceCode);            if (networkURL)                newState = new WebInspector.BreakpointManager.Breakpoint.State(networkURL,null ,lineNumber,columnNumber,condition);        }        if (this._debuggerId && WebInspector.BreakpointManager.Breakpoint.State.equals(newState, this._currentState)) {            callback();            return;        }        this._breakpoint._currentState = newState;        if (this._debuggerId) {            this._resetLocations();            this._debuggerModel.removeBreakpoint(this._debuggerId, this._didRemoveFromDebugger.bind(this, callback));            this._scheduleUpdateInDebugger();            this._currentState = null ;            return;        }        if (!newState) {            callback();            return;        }        var updateCallback = this._didSetBreakpointInDebugger.bind(this, callback);        if (newState.url)            this._debuggerModel.setBreakpointByURL(newState.url, newState.lineNumber, newState.columnNumber, this._breakpoint.condition(), updateCallback);        else if (newState.scriptId)            this._debuggerModel.setBreakpointBySourceId((debuggerLocation), condition, updateCallback);        this._currentState = newState;    },    _didSetBreakpointInDebugger: function(callback, breakpointId, locations)     {        if (this._cancelCallback) {            this._cancelCallback = false;            callback();            return;        }        if (!breakpointId) {            this._breakpoint.remove(true);            callback();            return;        }        this._debuggerId = breakpointId;        this._debuggerModel.addBreakpointListener(this._debuggerId, this._breakpointResolved, this);        for (var i = 0; i < locations.length; ++i) {            if (!this._addResolvedLocation(locations[i]))                break;        }        callback();    },    _didRemoveFromDebugger: function(callback)     {        if (this._cancelCallback) {            this._cancelCallback = false;            callback();            return;        }        this._resetLocations();        this._debuggerModel.removeBreakpointListener(this._debuggerId, this._breakpointResolved, this);        delete this._debuggerId;        callback();    },    _breakpointResolved: function(event)     {        this._addResolvedLocation((event.data));    },    _locationUpdated: function(location, uiLocation)     {        var oldUILocation = this._uiLocations[location.id()] || null ;        this._uiLocations[location.id()] = uiLocation;        this._breakpoint._replaceUILocation(oldUILocation, uiLocation);    },    _addResolvedLocation: function(location)     {        var uiLocation = this._debuggerWorkspaceBinding.rawLocationToUILocation(location);        var breakpoint = this._breakpoint._breakpointManager.findBreakpoint(uiLocation.uiSourceCode, uiLocation.lineNumber, uiLocation.columnNumber);        if (breakpoint && breakpoint !== this._breakpoint) {            this._breakpoint.remove();            return false;        }        this._liveLocations.push(this._debuggerWorkspaceBinding.createLiveLocation(location, this._locationUpdated.bind(this, location)));        return true;    },    _cleanUpAfterDebuggerIsGone: function()     {        if (this._isUpdating)            this._cancelCallback = true;        this._resetLocations();        this._currentState = null ;        if (this._debuggerId)            this._didRemoveFromDebugger(function() {}            );    },    _removeEventListeners: function()     {        this._debuggerModel.removeEventListener(WebInspector.DebuggerModel.Events.DebuggerWasDisabled, this._cleanUpAfterDebuggerIsGone, this);        this._debuggerModel.removeEventListener(WebInspector.DebuggerModel.Events.DebuggerWasEnabled, this._scheduleUpdateInDebugger, this);    },    __proto__: WebInspector.SDKObject.prototype}WebInspector.BreakpointManager.Breakpoint.State = function(url, scriptId, lineNumber, columnNumber, condition) {    this.url = url;    this.scriptId = scriptId;    this.lineNumber = lineNumber;    this.columnNumber = columnNumber;    this.condition = condition;}WebInspector.BreakpointManager.Breakpoint.State.equals = function(stateA, stateB) {    if (!stateA || !stateB)        return false;    if (stateA.scriptId || stateB.scriptId)        return false;    return stateA.url === stateB.url && stateA.lineNumber === stateB.lineNumber && stateA.columnNumber === stateB.columnNumber && stateA.condition === stateB.condition;}WebInspector.BreakpointManager.Storage = function(breakpointManager, setting) {    this._breakpointManager = breakpointManager;    this._setting = setting || WebInspector.settings.createLocalSetting("breakpoints", []);    var breakpoints = this._setting.get();    this._breakpoints = {};    for (var i = 0; i < breakpoints.length; ++i) {        var breakpoint = (breakpoints[i]);        breakpoint.columnNumber = breakpoint.columnNumber || 0;        this._breakpoints[breakpoint.sourceFileId + ":" + breakpoint.lineNumber + ":" + breakpoint.columnNumber] = breakpoint;    }}WebInspector.BreakpointManager.Storage.prototype = {    mute: function()     {        this._muted = true;    },    unmute: function()     {        delete this._muted;    },    breakpointItems: function(sourceFileId)     {        var result = [];        for (var id in this._breakpoints) {            var breakpoint = this._breakpoints[id];            if (breakpoint.sourceFileId === sourceFileId)                result.push(breakpoint);        }        return result;    },    _updateBreakpoint: function(breakpoint)     {        if (this._muted || !breakpoint._breakpointStorageId())            return;        this._breakpoints[breakpoint._breakpointStorageId()] = new WebInspector.BreakpointManager.Storage.Item(breakpoint);        this._save();    },    _removeBreakpoint: function(breakpoint)     {        if (this._muted)            return;        delete this._breakpoints[breakpoint._breakpointStorageId()];        this._save();    },    _save: function()     {        var breakpointsArray = [];        for (var id in this._breakpoints)            breakpointsArray.push(this._breakpoints[id]);        this._setting.set(breakpointsArray);    }}WebInspector.BreakpointManager.Storage.Item = function(breakpoint) {    this.sourceFileId = breakpoint._sourceFileId;    this.lineNumber = breakpoint.lineNumber();    this.columnNumber = breakpoint.columnNumber();    this.condition = breakpoint.condition();    this.enabled = breakpoint.enabled();}WebInspector.breakpointManager;;WebInspector.ContentProviderBasedProjectDelegate = function(workspace, id, type) {    WebInspector.Object.call(this);    this._type = type;    this._contentProviders = {};    this._workspace = workspace;    this._id = id;    workspace.addProject(id, this);}WebInspector.ContentProviderBasedProjectDelegate.prototype = {    type: function()     {        return this._type;    },    displayName: function()     {        return "";    },    url: function()     {        return "";    },    requestMetadata: function(path, callback)     {        callback(null , null );    },    requestFileContent: function(path, callback)     {        var contentProvider = this._contentProviders[path];        contentProvider.requestContent(callback);        function innerCallback(content, encoded, mimeType)         {            callback(content);        }    },    canSetFileContent: function()     {        return false;    },    setFileContent: function(path, newContent, callback)     {        callback(null );    },    canRename: function()     {        return false;    },    rename: function(path, newName, callback)     {        this.performRename(path, newName, innerCallback.bind(this));        function innerCallback(success, newName)         {            if (success)                this._updateName(path, (newName));            callback(success, newName);        }    },    refresh: function(path, callback)     {        if (callback)            callback();    },    excludeFolder: function(path)     {},    createFile: function(path, name, content, callback)     {},    deleteFile: function(path)     {},    remove: function()     {},    performRename: function(path, newName, callback)     {        callback(false);    },    _updateName: function(path, newName)     {        var oldPath = path;        var copyOfPath = path.split("/");        copyOfPath[copyOfPath.length - 1] = newName;        var newPath = copyOfPath.join("/");        this._contentProviders[newPath] = this._contentProviders[oldPath];        delete this._contentProviders[oldPath];    },    searchInFileContent: function(path, query, caseSensitive, isRegex, callback)     {        var contentProvider = this._contentProviders[path];        contentProvider.searchInContent(query, caseSensitive, isRegex, callback);    },    findFilesMatchingSearchRequest: function(searchConfig, filesMathingFileQuery, progress, callback)     {        var result = [];        var paths = filesMathingFileQuery;        var totalCount = paths.length;        if (totalCount === 0) {            setTimeout(doneCallback, 0);            return;        }        var barrier = new CallbackBarrier();        progress.setTotalWork(paths.length);        for (var i = 0; i < paths.length; ++i)            searchInContent.call(this, paths[i], barrier.createCallback(searchInContentCallback.bind(null , paths[i])));        barrier.callWhenDone(doneCallback);        function searchInContent(path, callback)         {            var queriesToRun = searchConfig.queries().slice();            searchNextQuery.call(this);            function searchNextQuery()             {                if (!queriesToRun.length) {                    callback(true);                    return;                }                var query = queriesToRun.shift();                this._contentProviders[path].searchInContent(query, !searchConfig.ignoreCase(), searchConfig.isRegex(), contentCallback.bind(this));            }            function contentCallback(searchMatches)             {                if (!searchMatches.length) {                    callback(false);                    return;                }                searchNextQuery.call(this);            }        }        function searchInContentCallback(path, matches)         {            if (matches)                result.push(path);            progress.worked(1);        }        function doneCallback()         {            callback(result);            progress.done();        }    },    indexContent: function(progress)     {        setTimeout(progress.done.bind(progress), 0);    },    addContentProvider: function(parentPath, name, originURL, url, contentProvider)     {        var path = parentPath ? parentPath + "/" + name : name;        if (this._contentProviders[path])            return path;        var fileDescriptor = new WebInspector.FileDescriptor(parentPath,name,originURL,url,contentProvider.contentType());        this._contentProviders[path] = contentProvider;        this.dispatchEventToListeners(WebInspector.ProjectDelegate.Events.FileAdded, fileDescriptor);        return path;    },    removeFile: function(path)     {        delete this._contentProviders[path];        this.dispatchEventToListeners(WebInspector.ProjectDelegate.Events.FileRemoved, path);    },    contentProviders: function()     {        return this._contentProviders;    },    reset: function()     {        this._contentProviders = {};        this._workspace.removeProject(this._id);        this._workspace.addProject(this._id, this);    },    __proto__: WebInspector.Object.prototype};WebInspector.DefaultScriptMapping = function(debuggerModel, workspace, debuggerWorkspaceBinding) {    this._debuggerModel = debuggerModel;    this._debuggerWorkspaceBinding = debuggerWorkspaceBinding;    this._workspace = workspace;    this._projectId = WebInspector.DefaultScriptMapping.projectIdForTarget(debuggerModel.target());    this._projectDelegate = new WebInspector.DebuggerProjectDelegate(this._workspace,this._projectId,WebInspector.projectTypes.Debugger);    debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.GlobalObjectCleared, this._debuggerReset, this);    this._debuggerReset();}WebInspector.DefaultScriptMapping.prototype = {    rawLocationToUILocation: function(rawLocation)     {        var debuggerModelLocation = (rawLocation);        var script = debuggerModelLocation.script();        var uiSourceCode = this._uiSourceCodeForScriptId.get(script.scriptId);        var lineNumber = debuggerModelLocation.lineNumber - (script.isInlineScriptWithSourceURL() ? script.lineOffset : 0);        var columnNumber = debuggerModelLocation.columnNumber || 0;        if (script.isInlineScriptWithSourceURL() && !lineNumber && columnNumber)            columnNumber -= script.columnOffset;        return uiSourceCode.uiLocation(lineNumber, columnNumber);    },    uiLocationToRawLocation: function(uiSourceCode, lineNumber, columnNumber)     {        var scriptId = this._scriptIdForUISourceCode.get(uiSourceCode);        var script = this._debuggerModel.scriptForId(scriptId);        if (script.isInlineScriptWithSourceURL())            return this._debuggerModel.createRawLocation(script, lineNumber + script.lineOffset, lineNumber ? columnNumber : columnNumber + script.columnOffset);        return this._debuggerModel.createRawLocation(script, lineNumber, columnNumber);    },    addScript: function(script)     {        var path = this._projectDelegate.addScript(script);        var uiSourceCode = this._workspace.uiSourceCode(this._projectId, path);        console.assert(uiSourceCode);        uiSourceCode = (uiSourceCode);        this._uiSourceCodeForScriptId.set(script.scriptId, uiSourceCode);        this._scriptIdForUISourceCode.set(uiSourceCode, script.scriptId);        this._debuggerWorkspaceBinding.setSourceMapping(this._debuggerModel.target(), uiSourceCode, this);        this._debuggerWorkspaceBinding.pushSourceMapping(script, this);        script.addEventListener(WebInspector.Script.Events.ScriptEdited, this._scriptEdited, this);    },    isIdentity: function()     {        return true;    },    uiLineHasMapping: function(uiSourceCode, lineNumber)     {        return true;    },    _scriptEdited: function(event)     {        var script = (event.target);        var content = (event.data);        this._uiSourceCodeForScriptId.get(script.scriptId).addRevision(content);    },    _debuggerReset: function()     {        this._uiSourceCodeForScriptId = new Map();        this._scriptIdForUISourceCode = new Map();        this._projectDelegate.reset();    },    dispose: function()     {        this._workspace.removeProject(this._projectId);    }}WebInspector.DefaultScriptMapping.projectIdForTarget = function(target) {    return "debugger:" + target.id();}WebInspector.DebuggerProjectDelegate = function(workspace, id, type) {    WebInspector.ContentProviderBasedProjectDelegate.call(this, workspace, id, type);}WebInspector.DebuggerProjectDelegate.prototype = {    displayName: function()     {        return "";    },    url: function()     {        return "debugger:";    },    addScript: function(script)     {        var contentProvider = script.isInlineScript() && !script.hasSourceURL ? new WebInspector.ConcatenatedScriptsContentProvider([script]) : script;        var splitURL = WebInspector.ParsedURL.splitURLIntoPathComponents(script.sourceURL);        var name = splitURL[splitURL.length - 1];        name = "VM" + script.scriptId + (name ? " " + name : "");        return this.addContentProvider("", name, script.sourceURL, script.sourceURL, contentProvider);    },    __proto__: WebInspector.ContentProviderBasedProjectDelegate.prototype};WebInspector.FileSystemWorkspaceBinding = function(isolatedFileSystemManager, workspace, networkMapping) {    this._isolatedFileSystemManager = isolatedFileSystemManager;    this._workspace = workspace;    this._networkMapping = networkMapping;    this._isolatedFileSystemManager.addEventListener(WebInspector.IsolatedFileSystemManager.Events.FileSystemAdded, this._fileSystemAdded, this);    this._isolatedFileSystemManager.addEventListener(WebInspector.IsolatedFileSystemManager.Events.FileSystemRemoved, this._fileSystemRemoved, this);    this._boundFileSystems = new Map();    this._callbacks = {};    this._progresses = {};    InspectorFrontendHost.events.addEventListener(InspectorFrontendHostAPI.Events.IndexingTotalWorkCalculated, this._onIndexingTotalWorkCalculated, this);    InspectorFrontendHost.events.addEventListener(InspectorFrontendHostAPI.Events.IndexingWorked, this._onIndexingWorked, this);    InspectorFrontendHost.events.addEventListener(InspectorFrontendHostAPI.Events.IndexingDone, this._onIndexingDone, this);    InspectorFrontendHost.events.addEventListener(InspectorFrontendHostAPI.Events.SearchCompleted, this._onSearchCompleted, this);}WebInspector.FileSystemWorkspaceBinding._styleSheetExtensions = ["css", "scss", "sass", "less"].keySet();WebInspector.FileSystemWorkspaceBinding._documentExtensions = ["htm", "html", "asp", "aspx", "phtml", "jsp"].keySet();WebInspector.FileSystemWorkspaceBinding._lastRequestId = 0;WebInspector.FileSystemWorkspaceBinding.projectId = function(fileSystemPath) {    return "filesystem:" + fileSystemPath;}WebInspector.FileSystemWorkspaceBinding.prototype = {    _fileSystemAdded: function(event)     {        var fileSystem = (event.data);        var boundFileSystem = new WebInspector.FileSystemWorkspaceBinding.FileSystem(this,fileSystem,this._workspace,this._networkMapping);        this._boundFileSystems.set(fileSystem.normalizedPath(), boundFileSystem);    },    _fileSystemRemoved: function(event)     {        var fileSystem = (event.data);        var boundFileSystem = this._boundFileSystems.get(fileSystem.normalizedPath());        boundFileSystem.dispose();        this._boundFileSystems.remove(fileSystem.normalizedPath());    },    fileSystemPath: function(projectId)     {        var fileSystemPath = projectId.substr("filesystem:".length);        var normalizedPath = WebInspector.IsolatedFileSystem.normalizePath(fileSystemPath);        return projectId.substr("filesystem:".length);    },    _nextId: function()     {        return ++WebInspector.FileSystemWorkspaceBinding._lastRequestId;    },    registerCallback: function(callback)     {        var requestId = this._nextId();        this._callbacks[requestId] = callback;        return requestId;    },    registerProgress: function(progress)     {        var requestId = this._nextId();        this._progresses[requestId] = progress;        return requestId;    },    _onIndexingTotalWorkCalculated: function(event)     {        var requestId = (event.data["requestId"]);        var totalWork = (event.data["totalWork"]);        var progress = this._progresses[requestId];        if (!progress)            return;        progress.setTotalWork(totalWork);    },    _onIndexingWorked: function(event)     {        var requestId = (event.data["requestId"]);        var worked = (event.data["worked"]);        var progress = this._progresses[requestId];        if (!progress)            return;        progress.worked(worked);        if (progress.isCanceled()) {            InspectorFrontendHost.stopIndexing(requestId);            this._onIndexingDone(event);        }    },    _onIndexingDone: function(event)     {        var requestId = (event.data["requestId"]);        var progress = this._progresses[requestId];        if (!progress)            return;        progress.done();        delete this._progresses[requestId];    },    _onSearchCompleted: function(event)     {        var requestId = (event.data["requestId"]);        var files = (event.data["files"]);        var callback = this._callbacks[requestId];        if (!callback)            return;        callback.call(null , files);        delete this._callbacks[requestId];    },}WebInspector.FileSystemWorkspaceBinding.FileSystem = function(fileSystemWorkspaceBinding, isolatedFileSystem, workspace, networkMapping) {    WebInspector.Object.call(this);    this._fileSystemWorkspaceBinding = fileSystemWorkspaceBinding;    this._fileSystem = isolatedFileSystem;    this._fileSystemBaseURL = "file://" + this._fileSystem.normalizedPath() + "/";    this._fileSystemProjectURL = "filesystem:" + this._fileSystem.normalizedPath();    this._workspace = workspace;    this._networkMapping = networkMapping;    this._projectId = WebInspector.FileSystemWorkspaceBinding.projectId(this._fileSystem.path());    console.assert(!this._workspace.project(this._projectId));    this._workspace.addProject(this._projectId, this);    this.populate();}WebInspector.FileSystemWorkspaceBinding.FileSystem.prototype = {    type: function()     {        return WebInspector.projectTypes.FileSystem;    },    fileSystemPath: function()     {        return this._fileSystem.path();    },    displayName: function()     {        var normalizedPath = this._fileSystem.normalizedPath();        return normalizedPath.substr(normalizedPath.lastIndexOf("/") + 1);    },    url: function()     {        return this._fileSystemProjectURL;    },    _filePathForPath: function(path)     {        return "/" + path;    },    requestFileContent: function(path, callback)     {        var filePath = this._filePathForPath(path);        this._fileSystem.requestFileContent(filePath, callback);    },    requestMetadata: function(path, callback)     {        var filePath = this._filePathForPath(path);        this._fileSystem.requestMetadata(filePath, callback);    },    canSetFileContent: function()     {        return true;    },    setFileContent: function(path, newContent, callback)     {        var filePath = this._filePathForPath(path);        this._fileSystem.setFileContent(filePath, newContent, callback.bind(this, ""));    },    canRename: function()     {        return true;    },    rename: function(path, newName, callback)     {        var filePath = this._filePathForPath(path);        this._fileSystem.renameFile(filePath, newName, innerCallback.bind(this));        function innerCallback(success, newName)         {            if (!success) {                callback(false, newName);                return;            }            var validNewName = (newName);            console.assert(validNewName);            var slash = filePath.lastIndexOf("/");            var parentPath = filePath.substring(0, slash);            filePath = parentPath + "/" + validNewName;            filePath = filePath.substr(1);            var newURL = this._networkMapping.urlForPath(this._fileSystem.path(), filePath);            var extension = this._extensionForPath(validNewName);            var newOriginURL = this._fileSystemBaseURL + filePath;            var newContentType = this._contentTypeForExtension(extension);            callback(true, validNewName, newURL, newOriginURL, newContentType);        }    },    searchInFileContent: function(path, query, caseSensitive, isRegex, callback)     {        var filePath = this._filePathForPath(path);        this._fileSystem.requestFileContent(filePath, contentCallback);        function contentCallback(content)         {            var result = [];            if (content !== null )                result = WebInspector.ContentProvider.performSearchInContent(content, query, caseSensitive, isRegex);            callback(result);        }    },    findFilesMatchingSearchRequest: function(searchConfig, filesMathingFileQuery, progress, callback)     {        var result = filesMathingFileQuery;        var queriesToRun = searchConfig.queries().slice();        if (!queriesToRun.length)            queriesToRun.push("");        progress.setTotalWork(queriesToRun.length);        searchNextQuery.call(this);        function searchNextQuery()         {            if (!queriesToRun.length) {                progress.done();                callback(result);                return;            }            var query = queriesToRun.shift();            this._searchInPath(searchConfig.isRegex() ? "" : query, progress, innerCallback.bind(this));        }        function innerCallback(files)         {            files = files.sort();            progress.worked(1);            result = result.intersectOrdered(files, String.naturalOrderComparator);            searchNextQuery.call(this);        }    },    _searchInPath: function(query, progress, callback)     {        var requestId = this._fileSystemWorkspaceBinding.registerCallback(innerCallback.bind(this));        InspectorFrontendHost.searchInPath(requestId, this._fileSystem.path(), query);        function innerCallback(files)         {            function trimAndNormalizeFileSystemPath(fullPath)             {                var trimmedPath = fullPath.substr(this._fileSystem.path().length + 1);                if (WebInspector.isWin())                    trimmedPath = trimmedPath.replace(/\\/g, "/");                return trimmedPath;            }            files = files.map(trimAndNormalizeFileSystemPath.bind(this));            progress.worked(1);            callback(files);        }    },    indexContent: function(progress)     {        progress.setTotalWork(1);        var requestId = this._fileSystemWorkspaceBinding.registerProgress(progress);        InspectorFrontendHost.indexPath(requestId, this._fileSystem.path());    },    _extensionForPath: function(path)     {        var extensionIndex = path.lastIndexOf(".");        if (extensionIndex === -1)            return "";        return path.substring(extensionIndex + 1).toLowerCase();    },    _contentTypeForExtension: function(extension)     {        if (WebInspector.FileSystemWorkspaceBinding._styleSheetExtensions[extension])            return WebInspector.resourceTypes.Stylesheet;        if (WebInspector.FileSystemWorkspaceBinding._documentExtensions[extension])            return WebInspector.resourceTypes.Document;        return WebInspector.resourceTypes.Script;    },    populate: function()     {        this._fileSystem.requestFilesRecursive("", this._addFile.bind(this));    },    refresh: function(path, callback)     {        this._fileSystem.requestFilesRecursive(path, this._addFile.bind(this), callback);    },    excludeFolder: function(path)     {        this._fileSystemWorkspaceBinding._isolatedFileSystemManager.excludedFolderManager().addExcludedFolder(this._fileSystem.path(), path);    },    createFile: function(path, name, content, callback)     {        this._fileSystem.createFile(path, name, innerCallback.bind(this));        var createFilePath;        function innerCallback(filePath)         {            if (!filePath) {                callback(null );                return;            }            createFilePath = filePath;            if (!content) {                contentSet.call(this);                return;            }            this._fileSystem.setFileContent(filePath, content, contentSet.bind(this));        }        function contentSet()         {            this._addFile(createFilePath);            callback(createFilePath);        }    },    deleteFile: function(path)     {        this._fileSystem.deleteFile(path);        this._removeFile(path);    },    remove: function()     {        this._fileSystemWorkspaceBinding._isolatedFileSystemManager.removeFileSystem(this._fileSystem.path());    },    _addFile: function(filePath)     {        if (!filePath)            console.assert(false);        var slash = filePath.lastIndexOf("/");        var parentPath = filePath.substring(0, slash);        var name = filePath.substring(slash + 1);        var url = this._networkMapping.urlForPath(this._fileSystem.path(), filePath);        var extension = this._extensionForPath(name);        var contentType = this._contentTypeForExtension(extension);        var fileDescriptor = new WebInspector.FileDescriptor(parentPath,name,this._fileSystemBaseURL + filePath,url,contentType);        this.dispatchEventToListeners(WebInspector.ProjectDelegate.Events.FileAdded, fileDescriptor);    },    _removeFile: function(path)     {        this.dispatchEventToListeners(WebInspector.ProjectDelegate.Events.FileRemoved, path);    },    dispose: function()     {        this._workspace.removeProject(this._projectId);    },    __proto__: WebInspector.Object.prototype}WebInspector.fileSystemWorkspaceBinding;;WebInspector.OutputStreamDelegate = function() {}WebInspector.OutputStreamDelegate.prototype = {    onTransferStarted: function() {},    onTransferFinished: function() {},    onChunkTransferred: function(reader) {},    onError: function(reader, event) {},}WebInspector.ChunkedReader = function() {}WebInspector.ChunkedReader.prototype = {    fileSize: function() {},    loadedSize: function() {},    fileName: function() {},    cancel: function() {}}WebInspector.ChunkedFileReader = function(file, chunkSize, delegate) {    this._file = file;    this._fileSize = file.size;    this._loadedSize = 0;    this._chunkSize = chunkSize;    this._delegate = delegate;    this._decoder = new TextDecoder();    this._isCanceled = false;}WebInspector.ChunkedFileReader.prototype = {    start: function(output)     {        this._output = output;        this._reader = new FileReader();        this._reader.onload = this._onChunkLoaded.bind(this);        this._reader.onerror = this._delegate.onError.bind(this._delegate, this);        this._delegate.onTransferStarted();        this._loadChunk();    },    cancel: function()     {        this._isCanceled = true;    },    loadedSize: function()     {        return this._loadedSize;    },    fileSize: function()     {        return this._fileSize;    },    fileName: function()     {        return this._file.name;    },    _onChunkLoaded: function(event)     {        if (this._isCanceled)            return;        if (event.target.readyState !== FileReader.DONE)            return;        var buffer = event.target.result;        this._loadedSize += buffer.byteLength;        var endOfFile = this._loadedSize === this._fileSize;        var decodedString = this._decoder.decode(buffer, {            stream: !endOfFile        });        this._output.write(decodedString);        if (this._isCanceled)            return;        this._delegate.onChunkTransferred(this);        if (endOfFile) {            this._file = null ;            this._reader = null ;            this._output.close();            this._delegate.onTransferFinished();            return;        }        this._loadChunk();    },    _loadChunk: function()     {        var chunkStart = this._loadedSize;        var chunkEnd = Math.min(this._fileSize, chunkStart + this._chunkSize);        var nextPart = this._file.slice(chunkStart, chunkEnd);        this._reader.readAsArrayBuffer(nextPart);    }}WebInspector.createFileSelectorElement = function(callback) {    var fileSelectorElement = createElement("input");    fileSelectorElement.type = "file";    fileSelectorElement.style.display = "none";    fileSelectorElement.setAttribute("tabindex", -1);    fileSelectorElement.onchange = onChange;    function onChange(event)     {        callback(fileSelectorElement.files[0]);    }    ;return fileSelectorElement;}WebInspector.FileOutputStream = function() {}WebInspector.FileOutputStream.prototype = {    open: function(fileName, callback)     {        this._closed = false;        this._writeCallbacks = [];        this._fileName = fileName;        function callbackWrapper(accepted)         {            if (accepted)                WebInspector.fileManager.addEventListener(WebInspector.FileManager.EventTypes.AppendedToURL, this._onAppendDone, this);            callback(accepted);        }        WebInspector.fileManager.save(this._fileName, "", true, callbackWrapper.bind(this));    },    write: function(data, callback)     {        this._writeCallbacks.push(callback);        WebInspector.fileManager.append(this._fileName, data);    },    close: function()     {        this._closed = true;        if (this._writeCallbacks.length)            return;        WebInspector.fileManager.removeEventListener(WebInspector.FileManager.EventTypes.AppendedToURL, this._onAppendDone, this);        WebInspector.fileManager.close(this._fileName);    },    _onAppendDone: function(event)     {        if (event.data !== this._fileName)            return;        var callback = this._writeCallbacks.shift();        if (callback)            callback(this);        if (!this._writeCallbacks.length) {            if (this._closed) {                WebInspector.fileManager.removeEventListener(WebInspector.FileManager.EventTypes.AppendedToURL, this._onAppendDone, this);                WebInspector.fileManager.close(this._fileName);            }        }    }};WebInspector.BlackboxSupport = {}WebInspector.BlackboxSupport._urlToRegExpString = function(url) {    var parsedURL = new WebInspector.ParsedURL(url);    if (parsedURL.isAboutBlank() || parsedURL.isDataURL() || !url)        return "";    if (!parsedURL.isValid)        return "^" + url.escapeForRegExp() + "$";    var name = parsedURL.lastPathComponent;    if (name)        name = "/" + name;    else if (parsedURL.folderPathComponents)        name = parsedURL.folderPathComponents + "/";    if (!name)        name = parsedURL.host;    if (!name)        return "";    var scheme = parsedURL.scheme;    var prefix = "";    if (scheme && scheme !== "http" && scheme !== "https") {        prefix = "^" + scheme + "://";        if (scheme === "chrome-extension")            prefix += parsedURL.host + "\\b";        prefix += ".*";    }    return prefix + name.escapeForRegExp() + (url.endsWith(name) ? "$" : "\\b");}WebInspector.BlackboxSupport.canBlackboxURL = function(url) {    return !!WebInspector.BlackboxSupport._urlToRegExpString(url);}WebInspector.BlackboxSupport.blackboxURL = function(url) {    var regexPatterns = WebInspector.moduleSetting("skipStackFramesPattern").getAsArray();    var regexValue = WebInspector.BlackboxSupport._urlToRegExpString(url);    if (!regexValue)        return;    var found = false;    for (var i = 0; i < regexPatterns.length; ++i) {        var item = regexPatterns[i];        if (item.pattern === regexValue) {            item.disabled = false;            found = true;            break;        }    }    if (!found)        regexPatterns.push({            pattern: regexValue        });    WebInspector.moduleSetting("skipStackFramesPattern").setAsArray(regexPatterns);}WebInspector.BlackboxSupport.unblackbox = function(url, isContentScript) {    if (isContentScript)        WebInspector.moduleSetting("skipContentScripts").set(false);    var regexPatterns = WebInspector.moduleSetting("skipStackFramesPattern").getAsArray();    var regexValue = WebInspector.BlackboxSupport._urlToRegExpString(url);    if (!regexValue)        return;    regexPatterns = regexPatterns.filter(function(item) {        return item.pattern !== regexValue;    }    );    for (var i = 0; i < regexPatterns.length; ++i) {        var item = regexPatterns[i];        if (item.disabled)            continue;try {            var regex = new RegExp(item.pattern);            if (regex.test(url))                item.disabled = true;        } catch (e) {}    }    WebInspector.moduleSetting("skipStackFramesPattern").setAsArray(regexPatterns);}WebInspector.BlackboxSupport.isBlackboxedURL = function(url) {    var regex = WebInspector.moduleSetting("skipStackFramesPattern").asRegExp();    return (url && regex) ? regex.test(url) : false;}WebInspector.BlackboxSupport.isBlackboxed = function(url, isContentScript) {    if (isContentScript && WebInspector.moduleSetting("skipContentScripts").get())        return true;    return WebInspector.BlackboxSupport.isBlackboxedURL(url);}WebInspector.BlackboxSupport.addChangeListener = function(listener, thisObject) {    WebInspector.moduleSetting("skipStackFramesPattern").addChangeListener(listener, thisObject);}WebInspector.BlackboxSupport.removeChangeListener = function(listener, thisObject) {    WebInspector.moduleSetting("skipStackFramesPattern").removeChangeListener(listener, thisObject);};WebInspector.LinkifierFormatter = function() {}WebInspector.LinkifierFormatter.prototype = {    formatLiveAnchor: function(anchor, uiLocation) {}}WebInspector.Linkifier = function(formatter) {    this._formatter = formatter || new WebInspector.Linkifier.DefaultFormatter(WebInspector.Linkifier.MaxLengthForDisplayedURLs);    this._liveLocationsByTarget = new Map();    WebInspector.targetManager.observeTargets(this);}WebInspector.Linkifier.setLinkHandler = function(handler) {    WebInspector.Linkifier._linkHandler = handler;}WebInspector.Linkifier.handleLink = function(url, lineNumber) {    if (!WebInspector.Linkifier._linkHandler)        return false;    return WebInspector.Linkifier._linkHandler.handleLink(url, lineNumber);}WebInspector.Linkifier.linkifyUsingRevealer = function(revealable, text, fallbackHref, fallbackLineNumber, title, classes) {    var a = createElement("a");    a.className = (classes || "") + " webkit-html-resource-link";    a.textContent = text.trimMiddle(WebInspector.Linkifier.MaxLengthForDisplayedURLs);    a.title = title || text;    if (fallbackHref) {        a.href = fallbackHref;        a.lineNumber = fallbackLineNumber;    }    function clickHandler(event)     {        event.stopImmediatePropagation();        event.preventDefault();        if (fallbackHref && WebInspector.Linkifier.handleLink(fallbackHref, fallbackLineNumber))            return;        WebInspector.Revealer.reveal(this);    }    a.addEventListener("click", clickHandler.bind(revealable), false);    return a;}WebInspector.Linkifier._uiLocationSymbol = Symbol("uiLocation");WebInspector.Linkifier._fallbackAnchorSymbol = Symbol("fallbackAnchor");;WebInspector.Linkifier.prototype = {    targetAdded: function(target)     {        this._liveLocationsByTarget.set(target, new Map());    },    targetRemoved: function(target)     {        var liveLocations = this._liveLocationsByTarget.remove(target);        var anchors = liveLocations.keysArray();        for (var i = 0; i < anchors.length; ++i) {            var anchor = anchors[i];            var location = liveLocations.get(anchor);            delete anchor[WebInspector.Linkifier._uiLocationSymbol];            var fallbackAnchor = anchor[WebInspector.Linkifier._fallbackAnchorSymbol];            if (fallbackAnchor) {                anchor.href = fallbackAnchor.href;                anchor.lineNumber = fallbackAnchor.lineNumber;                anchor.title = fallbackAnchor.title;                anchor.className = fallbackAnchor.className;                anchor.textContent = fallbackAnchor.textContent;                delete anchor[WebInspector.Linkifier._fallbackAnchorSymbol];            }            location.dispose();        }    },    linkifyScriptLocation: function(target, scriptId, sourceURL, lineNumber, columnNumber, classes)     {        var fallbackAnchor = WebInspector.linkifyResourceAsNode(sourceURL, lineNumber, classes);        if (!target || target.isDetached())            return fallbackAnchor;        var debuggerModel = WebInspector.DebuggerModel.fromTarget(target);        if (!debuggerModel)            return fallbackAnchor;        var rawLocation = scriptId ? debuggerModel.createRawLocationByScriptId(scriptId, lineNumber, columnNumber || 0) : debuggerModel.createRawLocationByURL(sourceURL, lineNumber, columnNumber || 0);        if (!rawLocation)            return fallbackAnchor;        var anchor = this._createAnchor(classes);        var liveLocation = WebInspector.debuggerWorkspaceBinding.createLiveLocation(rawLocation, this._updateAnchor.bind(this, anchor));        this._liveLocationsByTarget.get(rawLocation.target()).set(anchor, liveLocation);        anchor[WebInspector.Linkifier._fallbackAnchorSymbol] = fallbackAnchor;        return anchor;    },    linkifyRawLocation: function(rawLocation, fallbackUrl, classes)     {        return this.linkifyScriptLocation(rawLocation.target(), rawLocation.scriptId, fallbackUrl, rawLocation.lineNumber, rawLocation.columnNumber, classes);    },    linkifyConsoleCallFrame: function(target, callFrame, classes)     {        var lineNumber = callFrame.lineNumber ? callFrame.lineNumber - 1 : 0;        var columnNumber = callFrame.columnNumber ? callFrame.columnNumber - 1 : 0;        var anchor = this.linkifyScriptLocation(target, callFrame.scriptId, callFrame.url, lineNumber, columnNumber, classes);        var debuggerModel = WebInspector.DebuggerModel.fromTarget(target);        var script = debuggerModel && debuggerModel.scriptForId(callFrame.scriptId);        var blackboxed = script ? WebInspector.BlackboxSupport.isBlackboxed(script.sourceURL, script.isContentScript()) : WebInspector.BlackboxSupport.isBlackboxedURL(callFrame.url);        if (blackboxed)            anchor.classList.add("webkit-html-blackbox-link");        return anchor;    },    linkifyCSSLocation: function(rawLocation, classes)     {        var anchor = this._createAnchor(classes);        var liveLocation = WebInspector.cssWorkspaceBinding.createLiveLocation(rawLocation, this._updateAnchor.bind(this, anchor));        this._liveLocationsByTarget.get(rawLocation.target()).set(anchor, liveLocation);        return anchor;    },    linkifyMedia: function(media)     {        var location = media.rawLocation();        if (location)            return this.linkifyCSSLocation(location);        return WebInspector.linkifyResourceAsNode(media.sourceURL, undefined, "subtitle", media.sourceURL);    },    disposeAnchor: function(target, anchor)     {        delete anchor[WebInspector.Linkifier._uiLocationSymbol];        delete anchor[WebInspector.Linkifier._fallbackAnchorSymbol];        var liveLocations = this._liveLocationsByTarget.get(target);        if (!liveLocations)            return;        var location = liveLocations.remove(anchor);        if (location)            location.dispose();    },    _createAnchor: function(classes)     {        var anchor = createElement("a");        anchor.className = (classes || "") + " webkit-html-resource-link";        function clickHandler(event)         {            var uiLocation = anchor[WebInspector.Linkifier._uiLocationSymbol];            if (!uiLocation)                return;            event.consume(true);            var networkURL = WebInspector.networkMapping.networkURL(uiLocation.uiSourceCode);            if (WebInspector.Linkifier.handleLink(networkURL, uiLocation.lineNumber))                return;            WebInspector.Revealer.reveal(uiLocation);        }        anchor.addEventListener("click", clickHandler, false);        return anchor;    },    reset: function()     {        var targets = this._liveLocationsByTarget.keysArray();        for (var i = 0; i < targets.length; ++i) {            var target = targets[i];            this.targetRemoved(target);            this.targetAdded(target);        }    },    dispose: function()     {        this.reset();        WebInspector.targetManager.unobserveTargets(this);        this._liveLocationsByTarget.clear();    },    _updateAnchor: function(anchor, uiLocation)     {        anchor[WebInspector.Linkifier._uiLocationSymbol] = uiLocation;        this._formatter.formatLiveAnchor(anchor, uiLocation);    }}WebInspector.Linkifier.uiLocationByAnchor = function(anchor) {    return anchor[WebInspector.Linkifier._uiLocationSymbol];}WebInspector.Linkifier.DefaultFormatter = function(maxLength) {    this._maxLength = maxLength;}WebInspector.Linkifier.DefaultFormatter.prototype = {    formatLiveAnchor: function(anchor, uiLocation)     {        var text = uiLocation.linkText();        if (this._maxLength)            text = text.trimMiddle(this._maxLength);        anchor.textContent = text;        var titleText = uiLocation.uiSourceCode.originURL();        if (typeof uiLocation.lineNumber === "number")            titleText += ":" + (uiLocation.lineNumber + 1);        anchor.title = titleText;    }}WebInspector.Linkifier.DefaultCSSFormatter = function() {    WebInspector.Linkifier.DefaultFormatter.call(this, WebInspector.Linkifier.DefaultCSSFormatter.MaxLengthForDisplayedURLs);}WebInspector.Linkifier.DefaultCSSFormatter.MaxLengthForDisplayedURLs = 30;WebInspector.Linkifier.DefaultCSSFormatter.prototype = {    formatLiveAnchor: function(anchor, uiLocation)     {        WebInspector.Linkifier.DefaultFormatter.prototype.formatLiveAnchor.call(this, anchor, uiLocation);        anchor.classList.add("webkit-html-resource-link");        anchor.setAttribute("data-uncopyable", anchor.textContent);        anchor.textContent = "";    },    __proto__: WebInspector.Linkifier.DefaultFormatter.prototype}WebInspector.Linkifier.MaxLengthForDisplayedURLs = 150;WebInspector.Linkifier.LinkHandler = function() {}WebInspector.Linkifier.LinkHandler.prototype = {    handleLink: function(url, lineNumber) {}}WebInspector.Linkifier.liveLocationText = function(target, scriptId, lineNumber, columnNumber) {    var debuggerModel = WebInspector.DebuggerModel.fromTarget(target);    if (!debuggerModel)        return "";    var script = debuggerModel.scriptForId(scriptId);    if (!script)        return "";    var location = (debuggerModel.createRawLocation(script, lineNumber, columnNumber || 0));    var uiLocation = (WebInspector.debuggerWorkspaceBinding.rawLocationToUILocation(location));    return uiLocation.linkText();};WebInspector.NetworkMapping = function(workspace, fileSystemMapping) {    this._workspace = workspace;    this._fileSystemMapping = fileSystemMapping;    InspectorFrontendHost.events.addEventListener(InspectorFrontendHostAPI.Events.RevealSourceLine, this._revealSourceLine, this);}WebInspector.NetworkMapping.prototype = {    networkURL: function(uiSourceCode)     {        return uiSourceCode.networkURL();    },    hasMappingForURL: function(url)     {        return this._fileSystemMapping.hasMappingForURL(url);    },    _networkUISourceCodeForURL: function(url, target)     {        var splitURL = WebInspector.ParsedURL.splitURLIntoPathComponents(url);        var projectId = WebInspector.NetworkProject.projectId(target, splitURL[0], false);        var project = this._workspace.project(projectId);        return project ? project.uiSourceCode(splitURL.slice(1).join("/")) : null ;    },    _contentScriptUISourceCodeForURL: function(url, target)     {        var splitURL = WebInspector.ParsedURL.splitURLIntoPathComponents(url);        var projectId = WebInspector.NetworkProject.projectId(target, splitURL[0], true);        var project = this._workspace.project(projectId);        return project ? project.uiSourceCode(splitURL.slice(1).join("/")) : null ;    },    uiSourceCodeForURL: function(url, target)     {        var file = this._fileSystemMapping.fileForURL(url);        if (file) {            var projectId = WebInspector.FileSystemWorkspaceBinding.projectId(file.fileSystemPath);            var project = this._workspace.project(projectId);            return project ? project.uiSourceCode(file.filePath) : null ;        }        return this._networkUISourceCodeForURL(url, target) || this._contentScriptUISourceCodeForURL(url, target);    },    uiSourceCodeForURLForAnyTarget: function(url)     {        for (var target of WebInspector.targetManager.targets()) {            var result = this.uiSourceCodeForURL(url, target);            if (result)                return result;        }        return null ;    },    urlForPath: function(fileSystemPath, filePath)     {        return this._fileSystemMapping.urlForPath(fileSystemPath, filePath);    },    addMapping: function(networkUISourceCode, uiSourceCode, fileSystemWorkspaceBinding)     {        var url = this.networkURL(networkUISourceCode);        var path = uiSourceCode.path();        var fileSystemPath = fileSystemWorkspaceBinding.fileSystemPath(uiSourceCode.project().id());        this._fileSystemMapping.addMappingForResource(url, fileSystemPath, path);    },    removeMapping: function(uiSourceCode)     {        var networkURL = this.networkURL(uiSourceCode);        this._fileSystemMapping.removeMappingForURL(networkURL);    },    _revealSourceLine: function(event)     {        var url = (event.data["url"]);        var lineNumber = (event.data["lineNumber"]);        var columnNumber = (event.data["columnNumber"]);        var uiSourceCode = this.uiSourceCodeForURLForAnyTarget(url);        if (uiSourceCode) {            WebInspector.Revealer.reveal(uiSourceCode.uiLocation(lineNumber, columnNumber));            return;        }        function listener(event)         {            var uiSourceCode = (event.data);            if (this.networkURL(uiSourceCode) === url) {                WebInspector.Revealer.reveal(uiSourceCode.uiLocation(lineNumber, columnNumber));                this._workspace.removeEventListener(WebInspector.Workspace.Events.UISourceCodeAdded, listener, this);            }        }        this._workspace.addEventListener(WebInspector.Workspace.Events.UISourceCodeAdded, listener, this);    },}WebInspector.networkMapping;;WebInspector.NetworkProjectDelegate = function(target, workspace, projectId, projectURL, projectType) {    this._url = projectURL;    this._target = target;    this._id = projectId;    WebInspector.ContentProviderBasedProjectDelegate.call(this, workspace, projectId, projectType);}WebInspector.NetworkProjectDelegate.prototype = {    target: function()     {        return this._target;    },    id: function()     {        return this._id;    },    displayName: function()     {        if (typeof this._displayName !== "undefined")            return this._displayName;        var targetSuffix = this._target.isPage() ? "" : " \u2014 " + this._target.name();        if (!this._url) {            this._displayName = WebInspector.UIString("(no domain)") + targetSuffix;            return this._displayName;        }        var parsedURL = new WebInspector.ParsedURL(this._url);        var prettyURL = parsedURL.isValid ? parsedURL.host + (parsedURL.port ? (":" + parsedURL.port) : "") : "";        this._displayName = (prettyURL || this._url) + targetSuffix;        return this._displayName;    },    url: function()     {        return this._url;    },    addFile: function(parentPath, name, url, contentProvider)     {        return this.addContentProvider(parentPath, name, url, url, contentProvider);    },    __proto__: WebInspector.ContentProviderBasedProjectDelegate.prototype}WebInspector.NetworkProjectManager = function(targetManager, workspace, networkMapping) {    this._workspace = workspace;    this._networkMapping = networkMapping;    targetManager.observeTargets(this);}WebInspector.NetworkProjectManager.prototype = {    targetAdded: function(target)     {        new WebInspector.NetworkProject(target,this._workspace,this._networkMapping);    },    targetRemoved: function(target)     {        WebInspector.NetworkProject.forTarget(target)._dispose();    }}WebInspector.NetworkProject = function(target, workspace, networkMapping) {    WebInspector.SDKObject.call(this, target);    this._workspace = workspace;    this._networkMapping = networkMapping;    this._projectDelegates = {};    this._processedURLs = {};    target[WebInspector.NetworkProject._networkProjectSymbol] = this;    target.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.ResourceAdded, this._resourceAdded, this);    target.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.MainFrameNavigated, this._mainFrameNavigated, this);    var debuggerModel = WebInspector.DebuggerModel.fromTarget(target);    if (debuggerModel) {        debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.ParsedScriptSource, this._parsedScriptSource, this);        debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.FailedToParseScriptSource, this._parsedScriptSource, this);    }    var cssModel = WebInspector.CSSStyleModel.fromTarget(target);    if (cssModel) {        cssModel.addEventListener(WebInspector.CSSStyleModel.Events.StyleSheetAdded, this._styleSheetAdded, this);        cssModel.addEventListener(WebInspector.CSSStyleModel.Events.StyleSheetRemoved, this._styleSheetRemoved, this);    }}WebInspector.NetworkProject._networkProjectSymbol = Symbol("networkProject");WebInspector.NetworkProject._contentTypeSymbol = Symbol("networkContentType");WebInspector.NetworkProject.projectId = function(target, projectURL, isContentScripts) {    return target.id() + ":" + (isContentScripts ? "contentscripts:" : "") + projectURL;}WebInspector.NetworkProject._targetForProject = function(project) {    var targetId = parseInt(project.id(), 10);    return WebInspector.targetManager.targetById(targetId);}WebInspector.NetworkProject.forTarget = function(target) {    return target[WebInspector.NetworkProject._networkProjectSymbol];}WebInspector.NetworkProject.targetForUISourceCode = function(uiSourceCode) {    if (uiSourceCode.project().type() !== WebInspector.projectTypes.ContentScripts && uiSourceCode.project().type() !== WebInspector.projectTypes.Network)        return null ;    return WebInspector.NetworkProject._targetForProject(uiSourceCode.project());}WebInspector.NetworkProject.uiSourceCodeContentType = function(uiSourceCode) {    return uiSourceCode[WebInspector.NetworkProject._contentTypeSymbol];}WebInspector.NetworkProject.prototype = {    _projectDelegate: function(projectURL, isContentScripts)     {        var projectId = WebInspector.NetworkProject.projectId(this.target(), projectURL, isContentScripts);        var projectType = isContentScripts ? WebInspector.projectTypes.ContentScripts : WebInspector.projectTypes.Network;        if (this._projectDelegates[projectId])            return this._projectDelegates[projectId];        var projectDelegate = new WebInspector.NetworkProjectDelegate(this.target(),this._workspace,projectId,projectURL,projectType);        this._projectDelegates[projectId] = projectDelegate;        return projectDelegate;    },    addFileForURL: function(url, contentProvider, isContentScript)     {        var splitURL = WebInspector.ParsedURL.splitURLIntoPathComponents(url);        var projectURL = splitURL[0];        var parentPath = splitURL.slice(1, -1).join("/");        var name = splitURL.peekLast() || "";        var projectDelegate = this._projectDelegate(projectURL, isContentScript || false);        var path = projectDelegate.addFile(parentPath, name, url, contentProvider);        var uiSourceCode = (this._workspace.uiSourceCode(projectDelegate.id(), path));        console.assert(uiSourceCode);        return uiSourceCode;    },    _removeFileForURL: function(url)     {        var splitURL = WebInspector.ParsedURL.splitURLIntoPathComponents(url);        var projectURL = splitURL[0];        var path = splitURL.slice(1).join("/");        var projectDelegate = this._projectDelegates[WebInspector.NetworkProject.projectId(this.target(), projectURL, false)];        projectDelegate.removeFile(path);    },    _populate: function()     {        function populateFrame(frame)         {            for (var i = 0; i < frame.childFrames.length; ++i)                populateFrame.call(this, frame.childFrames[i]);            var resources = frame.resources();            for (var i = 0; i < resources.length; ++i)                this._addFile(resources[i].url, new WebInspector.NetworkProject.FallbackResource(resources[i]));        }        var mainFrame = this.target().resourceTreeModel.mainFrame;        if (mainFrame)            populateFrame.call(this, mainFrame);    },    _parsedScriptSource: function(event)     {        var script = (event.data);        if (!script.sourceURL || (script.isInlineScript() && !script.hasSourceURL))            return;        if (script.isContentScript() && !script.hasSourceURL) {            var parsedURL = new WebInspector.ParsedURL(script.sourceURL);            if (!parsedURL.isValid)                return;        }        this._addFile(script.sourceURL, script, script.isContentScript());    },    _styleSheetAdded: function(event)     {        var header = (event.data);        if (header.isInline && !header.hasSourceURL && header.origin !== "inspector")            return;        this._addFile(header.resourceURL(), header, false);    },    _styleSheetRemoved: function(event)     {        var header = (event.data);        if (header.isInline && !header.hasSourceURL && header.origin !== "inspector")            return;        this._removeFile(header.resourceURL());    },    _resourceAdded: function(event)     {        var resource = (event.data);        this._addFile(resource.url, new WebInspector.NetworkProject.FallbackResource(resource));    },    _mainFrameNavigated: function(event)     {        this._reset();        this._populate();    },    _addFile: function(url, contentProvider, isContentScript)     {        if (this._networkMapping.hasMappingForURL(url))            return;        var type = contentProvider.contentType();        if (type !== WebInspector.resourceTypes.Stylesheet && type !== WebInspector.resourceTypes.Document && type !== WebInspector.resourceTypes.Script)            return;        if (this._processedURLs[url])            return;        this._processedURLs[url] = true;        var uiSourceCode = this.addFileForURL(url, contentProvider, isContentScript);        uiSourceCode[WebInspector.NetworkProject._contentTypeSymbol] = type;    },    _removeFile: function(url)     {        if (!this._processedURLs[url])            return;        delete this._processedURLs[url];        this._removeFileForURL(url);    },    _dispose: function()     {        this._reset();        var target = this.target();        target.resourceTreeModel.removeEventListener(WebInspector.ResourceTreeModel.EventTypes.ResourceAdded, this._resourceAdded, this);        target.resourceTreeModel.removeEventListener(WebInspector.ResourceTreeModel.EventTypes.MainFrameNavigated, this._mainFrameNavigated, this);        var debuggerModel = WebInspector.DebuggerModel.fromTarget(target);        if (debuggerModel) {            debuggerModel.removeEventListener(WebInspector.DebuggerModel.Events.ParsedScriptSource, this._parsedScriptSource, this);            debuggerModel.removeEventListener(WebInspector.DebuggerModel.Events.FailedToParseScriptSource, this._parsedScriptSource, this);        }        var cssModel = WebInspector.CSSStyleModel.fromTarget(target);        if (cssModel) {            cssModel.removeEventListener(WebInspector.CSSStyleModel.Events.StyleSheetAdded, this._styleSheetAdded, this);            cssModel.removeEventListener(WebInspector.CSSStyleModel.Events.StyleSheetRemoved, this._styleSheetRemoved, this);        }    },    _reset: function()     {        this._processedURLs = {};        for (var projectId in this._projectDelegates)            this._projectDelegates[projectId].reset();        this._projectDelegates = {};    },    __proto__: WebInspector.SDKObject.prototype}WebInspector.NetworkProject.FallbackResource = function(resource) {    this._resource = resource;}WebInspector.NetworkProject.FallbackResource.prototype = {    contentURL: function()     {        return this._resource.contentURL();    },    contentType: function()     {        return this._resource.resourceType();    },    requestContent: function(callback)     {        function loadFallbackContent()         {            var debuggerModel = WebInspector.DebuggerModel.fromTarget(this._resource.target());            if (!debuggerModel) {                callback(null );                return;            }            var scripts = debuggerModel.scriptsForSourceURL(this._resource.url);            if (!scripts.length) {                callback(null );                return;            }            var contentProvider;            var type = this._resource.resourceType();            if (type === WebInspector.resourceTypes.Document)                contentProvider = new WebInspector.ConcatenatedScriptsContentProvider(scripts);            else if (type === WebInspector.resourceTypes.Script)                contentProvider = scripts[0];            console.assert(contentProvider, "Resource content request failed. " + this._resource.url);            contentProvider.requestContent(callback);        }        function requestContentLoaded(content)         {            if (content)                callback(content)            else                loadFallbackContent.call(this);        }        this._resource.requestContent(requestContentLoaded.bind(this));    },    searchInContent: function(query, caseSensitive, isRegex, callback)     {        function documentContentLoaded(content)         {            if (content === null ) {                callback([]);                return;            }            var result = WebInspector.ContentProvider.performSearchInContent(content, query, caseSensitive, isRegex);            callback(result);        }        if (this.contentType() === WebInspector.resourceTypes.Document) {            this.requestContent(documentContentLoaded);            return;        }        this._resource.searchInContent(query, caseSensitive, isRegex, callback);    }};WebInspector.PresentationConsoleMessageHelper = function(workspace) {    this._workspace = workspace;    this._pendingConsoleMessages = {};    this._presentationConsoleMessages = [];    this._uiSourceCodeToMessages = new Map();    this._uiSourceCodeToEventTarget = new Map();    workspace.addEventListener(WebInspector.Workspace.Events.UISourceCodeRemoved, this._uiSourceCodeRemoved, this);    workspace.addEventListener(WebInspector.Workspace.Events.ProjectRemoved, this._projectRemoved, this);    WebInspector.multitargetConsoleModel.addEventListener(WebInspector.ConsoleModel.Events.ConsoleCleared, this._consoleCleared, this);    WebInspector.multitargetConsoleModel.addEventListener(WebInspector.ConsoleModel.Events.MessageAdded, this._onConsoleMessageAdded, this);    WebInspector.multitargetConsoleModel.messages().forEach(this._consoleMessageAdded, this);    WebInspector.targetManager.addModelListener(WebInspector.DebuggerModel, WebInspector.DebuggerModel.Events.ParsedScriptSource, this._parsedScriptSource, this);    WebInspector.targetManager.addModelListener(WebInspector.DebuggerModel, WebInspector.DebuggerModel.Events.FailedToParseScriptSource, this._parsedScriptSource, this);    WebInspector.targetManager.addModelListener(WebInspector.DebuggerModel, WebInspector.DebuggerModel.Events.GlobalObjectCleared, this._debuggerReset, this);}WebInspector.PresentationConsoleMessageHelper.Events = {    ConsoleMessageAdded: "ConsoleMessageAdded",    ConsoleMessageRemoved: "ConsoleMessageRemoved",    ConsoleMessagesCleared: "ConsoleMessagesCleared",}WebInspector.PresentationConsoleMessageHelper.prototype = {    addConsoleMessageEventListener: function(eventType, uiSourceCode, listener, thisObject)     {        var target = this._uiSourceCodeToEventTarget.get(uiSourceCode);        if (!target) {            target = new WebInspector.Object();            this._uiSourceCodeToEventTarget.set(uiSourceCode, target);        }        target.addEventListener(eventType, listener, thisObject);    },    removeConsoleMessageEventListener: function(eventType, uiSourceCode, listener, thisObject)     {        var target = this._uiSourceCodeToEventTarget.get(uiSourceCode);        if (!target)            return;        target.removeEventListener(eventType, listener, thisObject);    },    consoleMessages: function(uiSourceCode)     {        return this._uiSourceCodeToMessages.get(uiSourceCode) || [];    },    _dispatchConsoleEvent: function(eventType, uiSourceCode, message)     {        var target = this._uiSourceCodeToEventTarget.get(uiSourceCode);        if (!target)            return;        target.dispatchEventToListeners(eventType, message);    },    _uiSourceCodeRemoved: function(event)     {        var uiSourceCode = (event.data);        this._uiSourceCodeToEventTarget.remove(uiSourceCode);        this._uiSourceCodeToMessages.remove(uiSourceCode);    },    _projectRemoved: function(event)     {        var project = (event.data);        var uiSourceCodes = project.uiSourceCodes();        for (var i = 0; i < uiSourceCodes.length; ++i) {            this._uiSourceCodeToEventTarget.remove(uiSourceCodes[i]);            this._uiSourceCodeToMessages.remove(uiSourceCodes[i]);        }    },    _onConsoleMessageAdded: function(event)     {        var message = (event.data);        this._consoleMessageAdded(message);    },    _consoleMessageAdded: function(message)     {        if (!message.url || !message.isErrorOrWarning())            return;        var rawLocation = this._rawLocation(message);        if (rawLocation)            this._addConsoleMessageToScript(message, rawLocation);        else            this._addPendingConsoleMessage(message);    },    _rawLocation: function(message)     {        var debuggerModel = WebInspector.DebuggerModel.fromTarget(message.target());        if (!debuggerModel)            return null ;        var lineNumber = message.stackTrace ? message.stackTrace[0].lineNumber - 1 : message.line - 1;        var columnNumber = message.stackTrace && message.stackTrace[0].columnNumber ? message.stackTrace[0].columnNumber - 1 : 0;        if (message.scriptId)            return debuggerModel.createRawLocationByScriptId(message.scriptId, lineNumber, columnNumber);        return debuggerModel.createRawLocationByURL(message.url || "", lineNumber, columnNumber);    },    _addConsoleMessageToScript: function(message, rawLocation)     {        this._presentationConsoleMessages.push(new WebInspector.PresentationConsoleMessage(message,rawLocation));    },    _addPendingConsoleMessage: function(message)     {        if (!message.url)            return;        if (!this._pendingConsoleMessages[message.url])            this._pendingConsoleMessages[message.url] = [];        this._pendingConsoleMessages[message.url].push(message);    },    _parsedScriptSource: function(event)     {        var script = (event.data);        var messages = this._pendingConsoleMessages[script.sourceURL];        if (!messages)            return;        var pendingMessages = [];        for (var i = 0; i < messages.length; i++) {            var message = messages[i];            var rawLocation = this._rawLocation(message);            if (!rawLocation)                continue;if (script.target() === message.target() && script.scriptId === rawLocation.scriptId)                this._addConsoleMessageToScript(message, rawLocation);            else                pendingMessages.push(message);        }        if (pendingMessages.length)            this._pendingConsoleMessages[script.sourceURL] = pendingMessages;        else            delete this._pendingConsoleMessages[script.sourceURL];    },    _presentationConsoleMessageAdded: function(message)     {        var uiSourceCode = message._uiLocation.uiSourceCode;        var messages = this._uiSourceCodeToMessages.get(uiSourceCode);        if (!messages) {            messages = [];            this._uiSourceCodeToMessages.set(uiSourceCode, messages);        }        messages.push(message);        this._dispatchConsoleEvent(WebInspector.PresentationConsoleMessageHelper.Events.ConsoleMessageAdded, uiSourceCode, message);    },    _presentationConsoleMessageRemoved: function(message)     {        var uiSourceCode = message._uiLocation.uiSourceCode;        var messages = this._uiSourceCodeToMessages.get(uiSourceCode);        if (!messages)            return;        messages.remove(message);        this._dispatchConsoleEvent(WebInspector.PresentationConsoleMessageHelper.Events.ConsoleMessageRemoved, uiSourceCode, message);    },    _consoleCleared: function()     {        this._pendingConsoleMessages = {};        for (var i = 0; i < this._presentationConsoleMessages.length; ++i)            this._presentationConsoleMessages[i].dispose();        this._presentationConsoleMessages = [];        var targets = this._uiSourceCodeToEventTarget.valuesArray();        for (var i = 0; i < targets.length; ++i)            targets[i].dispatchEventToListeners(WebInspector.PresentationConsoleMessageHelper.Events.ConsoleMessagesCleared);        this._uiSourceCodeToMessages.clear();    },    _debuggerReset: function()     {        this._consoleCleared();    }}WebInspector.PresentationConsoleMessage = function(message, rawLocation) {    this.originalMessage = message;    this._liveLocation = WebInspector.debuggerWorkspaceBinding.createLiveLocation(rawLocation, this._updateLocation.bind(this));}WebInspector.PresentationConsoleMessage.prototype = {    _updateLocation: function(uiLocation)     {        if (this._uiLocation)            WebInspector.presentationConsoleMessageHelper._presentationConsoleMessageRemoved(this);        this._uiLocation = uiLocation;        WebInspector.presentationConsoleMessageHelper._presentationConsoleMessageAdded(this);    },    lineNumber: function()     {        return this._uiLocation.lineNumber;    },    columnNumber: function()     {        return this._uiLocation.columnNumber;    },    dispose: function()     {        this._liveLocation.dispose();    }}WebInspector.presentationConsoleMessageHelper;;WebInspector.resourceForURL = function(url) {    var targets = WebInspector.targetManager.targets();    for (var i = 0; i < targets.length; ++i) {        var resource = targets[i].resourceTreeModel.resourceForURL(url);        if (resource)            return resource;    }    return null ;}WebInspector.forAllResources = function(callback) {    var targets = WebInspector.targetManager.targets();    for (var i = 0; i < targets.length; ++i)        targets[i].resourceTreeModel.forAllResources(callback);}WebInspector.displayNameForURL = function(url) {    if (!url)        return "";    var resource = WebInspector.resourceForURL(url);    if (resource)        return resource.displayName;    var uiSourceCode = WebInspector.networkMapping.uiSourceCodeForURLForAnyTarget(url);    if (uiSourceCode)        return uiSourceCode.displayName();    if (!WebInspector.targetManager.inspectedPageURL())        return url.trimURL("");    var parsedURL = WebInspector.targetManager.inspectedPageURL().asParsedURL();    var lastPathComponent = parsedURL ? parsedURL.lastPathComponent : parsedURL;    var index = WebInspector.targetManager.inspectedPageURL().indexOf(lastPathComponent);    if (index !== -1 && index + lastPathComponent.length === WebInspector.targetManager.inspectedPageURL().length) {        var baseURL = WebInspector.targetManager.inspectedPageURL().substring(0, index);        if (url.startsWith(baseURL))            return url.substring(index);    }    if (!parsedURL)        return url;    var displayName = url.trimURL(parsedURL.host);    return displayName === "/" ? parsedURL.host + "/" : displayName;}WebInspector.linkifyStringAsFragmentWithCustomLinkifier = function(string, linkifier) {    var container = createDocumentFragment();    var linkStringRegEx = /(?:[a-zA-Z][a-zA-Z0-9+.-]{2,}:\/\/|data:|www\.)[\w$\-_+*'=\|\/\\(){}[\]^%@&#~,:;.!?]{2,}[\w$\-_+*=\|\/\\({^%@&#~]/;    while (string) {        var linkString = linkStringRegEx.exec(string);        if (!linkString)            break;        linkString = linkString[0];        var linkIndex = string.indexOf(linkString);        var nonLink = string.substring(0, linkIndex);        container.appendChild(createTextNode(nonLink));        var title = linkString;        var realURL = (linkString.startsWith("www.") ? "http://" + linkString : linkString);        var splitResult = WebInspector.ParsedURL.splitLineAndColumn(realURL);        var linkNode;        if (splitResult)            linkNode = linkifier(title, splitResult.url, splitResult.lineNumber, splitResult.columnNumber);        else            linkNode = linkifier(title, realURL);        container.appendChild(linkNode);        string = string.substring(linkIndex + linkString.length, string.length);    }    if (string)        container.appendChild(createTextNode(string));    return container;}WebInspector.linkifyStringAsFragment = function(string) {    function linkifier(title, url, lineNumber, columnNumber)     {        var isExternal = !WebInspector.resourceForURL(url) && !WebInspector.networkMapping.uiSourceCodeForURLForAnyTarget(url);        var urlNode = WebInspector.linkifyURLAsNode(url, title, undefined, isExternal);        if (typeof lineNumber !== "undefined") {            urlNode.lineNumber = lineNumber;            if (typeof columnNumber !== "undefined")                urlNode.columnNumber = columnNumber;        }        return urlNode;    }    return WebInspector.linkifyStringAsFragmentWithCustomLinkifier(string, linkifier);}WebInspector.linkifyURLAsNode = function(url, linkText, classes, isExternal, tooltipText) {    if (!linkText)        linkText = url;    classes = (classes ? classes + " " : "");    classes += isExternal ? "webkit-html-external-link" : "webkit-html-resource-link";    var a = createElement("a");    var href = sanitizeHref(url);    if (href !== null )        a.href = href;    a.className = classes;    if (typeof tooltipText === "undefined")        a.title = url;    else if (typeof tooltipText !== "string" || tooltipText.length)        a.title = tooltipText;    a.textContent = linkText.trimMiddle(WebInspector.Linkifier.MaxLengthForDisplayedURLs);    if (isExternal)        a.setAttribute("target", "_blank");    return a;}WebInspector.linkifyDocumentationURLAsNode = function(article, title) {    return WebInspector.linkifyURLAsNode("https://developer.chrome.com/devtools/docs/" + article, title, undefined, true);}WebInspector.linkifyResourceAsNode = function(url, lineNumber, classes, tooltipText, urlDisplayName) {    var linkText = urlDisplayName ? urlDisplayName : url ? WebInspector.displayNameForURL(url) : WebInspector.UIString("(program)");    if (typeof lineNumber === "number")        linkText += ":" + (lineNumber + 1);    var anchor = WebInspector.linkifyURLAsNode(url, linkText, classes, false, tooltipText);    anchor.lineNumber = lineNumber;    return anchor;}WebInspector.linkifyRequestAsNode = function(request) {    var anchor = WebInspector.linkifyURLAsNode(request.url);    anchor.requestId = request.requestId;    return anchor;};window.requestFileSystem = window.requestFileSystem || window.webkitRequestFileSystem;WebInspector.TempFile = function() {    this._fileEntry = null ;    this._writer = null ;}WebInspector.TempFile.create = function(dirPath, name) {    var file = new WebInspector.TempFile();    function requestTempFileSystem()     {        return new Promise(window.requestFileSystem.bind(window, window.TEMPORARY, 10));    }    function getDirectoryEntry(fs)     {        return new Promise(fs.root.getDirectory.bind(fs.root, dirPath, {            create: true        }));    }    function getFileEntry(dir)     {        return new Promise(dir.getFile.bind(dir, name, {            create: true        }));    }    function createFileWriter(fileEntry)     {        file._fileEntry = fileEntry;        return new Promise(fileEntry.createWriter.bind(fileEntry));    }    function truncateFile(writer)     {        if (!writer.length) {            file._writer = writer;            return Promise.resolve(file);        }        function truncate(fulfill, reject)         {            writer.onwriteend = fulfill;            writer.onerror = reject;            writer.truncate(0);        }        function didTruncate()         {            file._writer = writer;            writer.onwriteend = null ;            writer.onerror = null ;            return Promise.resolve(file);        }        function onTruncateError(e)         {            writer.onwriteend = null ;            writer.onerror = null ;            throw e;        }        return new Promise(truncate).then(didTruncate, onTruncateError);    }    return WebInspector.TempFile.ensureTempStorageCleared().then(requestTempFileSystem).then(getDirectoryEntry).then(getFileEntry).then(createFileWriter).then(truncateFile);}WebInspector.TempFile.prototype = {    write: function(strings, callback)     {        var blob = new Blob(strings,{            type: 'text/plain'        });        this._writer.onerror = function(e)         {            WebInspector.console.error("Failed to write into a temp file: " + e.target.error.message);            callback(-1);        }        this._writer.onwriteend = function(e)         {            callback(e.target.length);        }        this._writer.write(blob);    },    finishWriting: function()     {        this._writer = null ;    },    read: function(callback)     {        this.readRange(undefined, undefined, callback);    },    readRange: function(startOffset, endOffset, callback)     {        function didGetFile(file)         {            var reader = new FileReader();            if (typeof startOffset === "number" || typeof endOffset === "number")                file = file.slice((startOffset), (endOffset));            reader.onloadend = function(e)             {                callback((this.result));            }            ;            reader.onerror = function(error)             {                WebInspector.console.error("Failed to read from temp file: " + error.message);            }            ;            reader.readAsText(file);        }        function didFailToGetFile(error)         {            WebInspector.console.error("Failed to load temp file: " + error.message);            callback(null );        }        this._fileEntry.file(didGetFile, didFailToGetFile);    },    writeToOutputSteam: function(outputStream, delegate)     {        function didGetFile(file)         {            var reader = new WebInspector.ChunkedFileReader(file,10 * 1000 * 1000,delegate);            reader.start(outputStream);        }        function didFailToGetFile(error)         {            WebInspector.console.error("Failed to load temp file: " + error.message);            outputStream.close();        }        this._fileEntry.file(didGetFile, didFailToGetFile);    },    remove: function()     {        if (this._fileEntry)            this._fileEntry.remove(function() {}            );    }}WebInspector.DeferredTempFile = function(dirPath, name) {    this._chunks = [];    this._tempFile = null ;    this._isWriting = false;    this._finishCallback = null ;    this._finishedWriting = false;    this._callsPendingOpen = [];    this._pendingReads = [];    WebInspector.TempFile.create(dirPath, name).then(this._didCreateTempFile.bind(this), this._failedToCreateTempFile.bind(this));}WebInspector.DeferredTempFile.prototype = {    write: function(strings, callback)     {        if (!this._chunks)            return;        if (this._finishCallback)            throw new Error("No writes are allowed after close.");        this._chunks.push({            strings: strings,            callback: callback        });        if (this._tempFile && !this._isWriting)            this._writeNextChunk();    },    finishWriting: function(callback)     {        this._finishCallback = callback;        if (this._finishedWriting)            callback(this._tempFile);        else if (!this._isWriting && !this._chunks.length)            this._notifyFinished();    },    _failedToCreateTempFile: function(e)     {        WebInspector.console.error("Failed to create temp file " + e.code + " : " + e.message);        this._notifyFinished();    },    _didCreateTempFile: function(tempFile)     {        this._tempFile = tempFile;        var callsPendingOpen = this._callsPendingOpen;        this._callsPendingOpen = null ;        for (var i = 0; i < callsPendingOpen.length; ++i)            callsPendingOpen[i]();        if (this._chunks.length)            this._writeNextChunk();    },    _writeNextChunk: function()     {        var chunk = this._chunks.shift();        this._isWriting = true;        this._tempFile.write((chunk.strings), this._didWriteChunk.bind(this, chunk.callback));    },    _didWriteChunk: function(callback, size)     {        this._isWriting = false;        if (size === -1) {            this._tempFile = null ;            this._notifyFinished();            return;        }        if (callback)            callback(size);        if (this._chunks.length)            this._writeNextChunk();        else if (this._finishCallback)            this._notifyFinished();    },    _notifyFinished: function()     {        this._finishedWriting = true;        if (this._tempFile)            this._tempFile.finishWriting();        var chunks = this._chunks;        this._chunks = [];        for (var i = 0; i < chunks.length; ++i) {            if (chunks[i].callback)                chunks[i].callback(-1);        }        if (this._finishCallback)            this._finishCallback(this._tempFile);        var pendingReads = this._pendingReads;        this._pendingReads = [];        for (var i = 0; i < pendingReads.length; ++i)            pendingReads[i]();    },    readRange: function(startOffset, endOffset, callback)     {        if (!this._finishedWriting) {            this._pendingReads.push(this.readRange.bind(this, startOffset, endOffset, callback));            return;        }        if (!this._tempFile) {            callback(null );            return;        }        this._tempFile.readRange(startOffset, endOffset, callback);    },    writeToOutputStream: function(outputStream, delegate)     {        if (this._callsPendingOpen) {            this._callsPendingOpen.push(this.writeToOutputStream.bind(this, outputStream, delegate));            return;        }        if (this._tempFile)            this._tempFile.writeToOutputSteam(outputStream, delegate);    },    remove: function()     {        if (this._callsPendingOpen) {            this._callsPendingOpen.push(this.remove.bind(this));            return;        }        if (this._tempFile)            this._tempFile.remove();    }}WebInspector.TempFile._clearTempStorage = function(fulfill, reject) {    function handleError(event)     {        WebInspector.console.error(WebInspector.UIString("Failed to clear temp storage: %s", event.data));        reject(event.data);    }    function handleMessage(event)     {        if (event.data.type === "tempStorageCleared") {            if (event.data.error)                WebInspector.console.error(event.data.error);            else                fulfill(undefined);            return;        }        reject(event.data);    }    try {        var worker = new WorkerRuntime.Worker("temp_storage_shared_worker","TempStorageCleaner");        worker.onerror = handleError;        worker.port.onmessage = handleMessage;        worker.port.onerror = handleError;    } catch (e) {        if (e.name === "URLMismatchError")            console.log("Shared worker wasn't started due to url difference. " + e);        else            throw e;    }}WebInspector.TempFile.ensureTempStorageCleared = function() {    if (!WebInspector.TempFile._storageCleanerPromise)        WebInspector.TempFile._storageCleanerPromise = new Promise(WebInspector.TempFile._clearTempStorage);    return WebInspector.TempFile._storageCleanerPromise;}WebInspector.TempFileBackingStorage = function(dirName) {    this._dirName = dirName;    this.reset();}WebInspector.TempFileBackingStorage.Chunk;WebInspector.TempFileBackingStorage.prototype = {    appendString: function(string)     {        this._strings.push(string);        this._stringsLength += string.length;        var flushStringLength = 10 * 1024 * 1024;        if (this._stringsLength > flushStringLength)            this._flush(false);    },    appendAccessibleString: function(string)     {        this._flush(false);        this._strings.push(string);        var chunk = (this._flush(true));        function readString(chunk, file)         {            if (chunk.string)                return ( Promise.resolve(chunk.string)) ;            console.assert(chunk.endOffset);            if (!chunk.endOffset)                return Promise.reject("Nor string nor offset to the string in the file were found.");            function readRange(fulfill, reject)             {                file.readRange(chunk.startOffset, chunk.endOffset, fulfill);            }            return new Promise(readRange);        }        return readString.bind(null , chunk, this._file);    },    _flush: function(createChunk)     {        if (!this._strings.length)            return null ;        var chunk = null ;        if (createChunk) {            console.assert(this._strings.length === 1);            chunk = {                string: this._strings[0],                startOffset: 0,                endOffset: 0            };        }        function didWrite(chunk, fileSize)         {            if (fileSize === -1)                return;            if (chunk) {                chunk.startOffset = this._fileSize;                chunk.endOffset = fileSize;                chunk.string = null ;            }            this._fileSize = fileSize;        }        this._file.write(this._strings, didWrite.bind(this, chunk));        this._strings = [];        this._stringsLength = 0;        return chunk;    },    finishWriting: function()     {        this._flush(false);        this._file.finishWriting(function() {}        );    },    reset: function()     {        if (this._file)            this._file.remove();        this._file = new WebInspector.DeferredTempFile(this._dirName,String(Date.now()));        this._strings = [];        this._stringsLength = 0;        this._fileSize = 0;    },    writeToStream: function(outputStream, delegate)     {        this._file.writeToOutputStream(outputStream, delegate);    }};WebInspector.WorkspaceController = function(workspace) {    this._workspace = workspace;    window.addEventListener("focus", this._windowFocused.bind(this), false);    this._fileSystemRefreshThrottler = new WebInspector.Throttler(1000);}WebInspector.WorkspaceController.prototype = {    _windowFocused: function(event)     {        this._fileSystemRefreshThrottler.schedule(refreshFileSystems.bind(this));        function refreshFileSystems(callback)         {            var barrier = new CallbackBarrier();            var projects = this._workspace.projects();            for (var i = 0; i < projects.length; ++i)                projects[i].refresh("/", barrier.createCallback());            barrier.callWhenDone(callback);        }    }};WebInspector.ContentScriptProjectDecorator = function() {    WebInspector.targetManager.addModelListener(WebInspector.RuntimeModel, WebInspector.RuntimeModel.Events.ExecutionContextCreated, this._onContextCreated, this);    WebInspector.workspace.addEventListener(WebInspector.Workspace.Events.ProjectAdded, this._onProjectAdded, this);}WebInspector.ContentScriptProjectDecorator._updateProjectWithExtensionName = function(project, context) {    if (project.url().startsWith(context.origin))        project.setDisplayName(context.name);}WebInspector.ContentScriptProjectDecorator.prototype = {    _onContextCreated: function(event)     {        var context = (event.data);        if (!context.origin || !context.name)            return;        var projects = WebInspector.workspace.projects();        projects = projects.filter(contentProjectWithName);        for (var i = 0; i < projects.length; ++i)            WebInspector.ContentScriptProjectDecorator._updateProjectWithExtensionName(projects[i], context);        function contentProjectWithName(project)         {            return !!project.url() && project.type() === WebInspector.projectTypes.ContentScripts;        }    },    _onProjectAdded: function(event)     {        var project = (event.data);        if (project.type() !== WebInspector.projectTypes.ContentScripts)            return;        var targets = WebInspector.targetManager.targets();        var contexts = [];        for (var i = 0; i < targets.length; ++i)            contexts = contexts.concat(targets[i].runtimeModel.executionContexts());        contexts = contexts.filter(contextWithOriginAndName);        for (var i = 0; i < contexts.length; ++i)            WebInspector.ContentScriptProjectDecorator._updateProjectWithExtensionName(project, contexts[i]);        function contextWithOriginAndName(context)         {            return !!context.origin && !!context.name;        }    }};WebInspector.BreakpointsSidebarPaneBase = function(title) {    WebInspector.SidebarPane.call(this, title);    this.registerRequiredCSS("components/breakpointsList.css");    this.listElement = createElement("ol");    this.listElement.className = "breakpoint-list";    this.emptyElement = createElement("div");    this.emptyElement.className = "info";    this.emptyElement.textContent = WebInspector.UIString("No Breakpoints");    this.element.appendChild(this.emptyElement);}WebInspector.BreakpointsSidebarPaneBase.prototype = {    addListElement: function(element, beforeNode)     {        if (beforeNode) {            this.listElement.insertBefore(element, beforeNode);        } else {            if (!this.listElement.firstChild) {                this.element.removeChild(this.emptyElement);                this.element.appendChild(this.listElement);            }            this.listElement.appendChild(element);        }    },    removeListElement: function(element)     {        this.listElement.removeChild(element);        if (!this.listElement.firstChild) {            this.element.removeChild(this.listElement);            this.element.appendChild(this.emptyElement);        }    },    reset: function()     {        this.listElement.removeChildren();        if (this.listElement.parentElement) {            this.element.removeChild(this.listElement);            this.element.appendChild(this.emptyElement);        }    },    __proto__: WebInspector.SidebarPane.prototype};WebInspector.CustomPreviewSection = function(object) {    this._sectionElement = createElementWithClass("span", "custom-expandable-section");    this._object = object;    this._expanded = false;    this._cachedContent = null ;    var customPreview = object.customPreview();    try {        var headerJSON = JSON.parse(customPreview.header);    } catch (e) {        WebInspector.console.error("Broken formatter: header is invalid json " + e);        return;    }    this._header = this._renderJSONMLTag(headerJSON);    if (this._header.nodeType === Node.TEXT_NODE) {        WebInspector.console.error("Broken formatter: header should be an element node.");        return;    }    if (customPreview.hasBody) {        this._header.classList.add("custom-expandable-section-header");        this._header.addEventListener("click", this._onClick.bind(this), false);    }    this._sectionElement.appendChild(this._header);}WebInspector.CustomPreviewComponent = function(object) {    this._object = object;    this._customPreviewSection = new WebInspector.CustomPreviewSection(object);    this.element = createElementWithClass("span", "source-code");    var shadowRoot = WebInspector.createShadowRootWithCoreStyles(this.element);    this.element.addEventListener("contextmenu", this._contextMenuEventFired.bind(this), false);    shadowRoot.appendChild(WebInspector.Widget.createStyleElement("components/customPreviewSection.css"));    shadowRoot.appendChild(this._customPreviewSection.element());}WebInspector.CustomPreviewComponent.prototype = {    expandIfPossible: function()     {        if (this._object.customPreview().hasBody && this._customPreviewSection)            this._customPreviewSection._loadBody();    },    _contextMenuEventFired: function(event)     {        var contextMenu = new WebInspector.ContextMenu(event);        if (this._customPreviewSection)            contextMenu.appendItem(WebInspector.UIString.capitalize("Show as Javascript ^object"), this._disassemble.bind(this));        contextMenu.appendApplicableItems(this._object);        contextMenu.show();    },    _disassemble: function()     {        this.element.shadowRoot.textContent = "";        this._customPreviewSection = null ;        this.element.shadowRoot.appendChild(WebInspector.ObjectPropertiesSection.defaultObjectPresentation(this._object));    }}WebInspector.CustomPreviewSection._tagsWhiteList = new Set(["span", "div", "ol", "li", "table", "tr", "td"]);WebInspector.CustomPreviewSection.prototype = {    element: function()     {        return this._sectionElement;    },    _renderJSONMLTag: function(jsonML)     {        if (!Array.isArray(jsonML))            return createTextNode(jsonML + "");        var array = (jsonML);        if (array[0] === "object")            return this._layoutObjectTag(array);        else            return this._renderElement(array);    },    _renderElement: function(object)     {        var tagName = object.shift();        if (!WebInspector.CustomPreviewSection._tagsWhiteList.has(tagName)) {            WebInspector.console.error("Broken formatter: element " + tagName + " is not allowed!");            return createElement("span");        }        var element = createElement((tagName));        if ((typeof object[0] == "object") && !Array.isArray(object[0])) {            var attributes = object.shift();            for (var key in attributes) {                var value = attributes[key];                if ((key !== "style") || (typeof value !== "string"))                    continue;element.setAttribute(key, value);            }        }        this._appendJsonMLTags(element, object);        return element;    },    _layoutObjectTag: function(objectTag)     {        objectTag.shift();        var attributes = objectTag.shift();        var remoteObject = this._object.target().runtimeModel.createRemoteObject((attributes));        if (remoteObject.customPreview())            return (new WebInspector.CustomPreviewSection(remoteObject)).element();        var sectionElement = WebInspector.ObjectPropertiesSection.defaultObjectPresentation(remoteObject);        sectionElement.classList.toggle("custom-expandable-section-standard-section", remoteObject.hasChildren);        return sectionElement;    },    _appendJsonMLTags: function(parentElement, jsonMLTags)     {        for (var i = 0; i < jsonMLTags.length; ++i)            parentElement.appendChild(this._renderJSONMLTag(jsonMLTags[i]));    },    _onClick: function(event)     {        event.consume(true);        if (this._cachedContent)            this._toggleExpand();        else            this._loadBody();    },    _toggleExpand: function()     {        this._expanded = !this._expanded;        this._header.classList.toggle("expanded", this._expanded);        this._cachedContent.classList.toggle("hidden", !this._expanded);    },    _loadBody: function()     {        function load(formatter, config)         {            function substituteObjectTagsInCustomPreview(jsonMLObject)             {                if (!jsonMLObject || (typeof jsonMLObject !== "object") || (typeof jsonMLObject.splice !== "function"))                    return;                var obj = jsonMLObject.length;                if (!(typeof obj === "number" && obj >>> 0 === obj && (obj > 0 || 1 / obj > 0)))                    return;                var startIndex = 1;                if (jsonMLObject[0] === "object") {                    var attributes = jsonMLObject[1];                    var originObject = attributes["object"];                    var config = attributes["config"];                    if (typeof originObject === "undefined")                        throw "Illegal format: obligatory attribute \"object\" isn't specified";                    jsonMLObject[1] = bindRemoteObject(originObject, false, false, null , false, config);                    startIndex = 2;                }                for (var i = startIndex; i < jsonMLObject.length; ++i)                    substituteObjectTagsInCustomPreview(jsonMLObject[i]);            }            try {                var body = formatter.body(this, config);                substituteObjectTagsInCustomPreview(body);                return body;            } catch (e) {                console.error("Custom Formatter Failed: " + e);                return null ;            }        }        var customPreview = this._object.customPreview();        var args = [{            objectId: customPreview.formatterObjectId        }];        if (customPreview.configObjectId)            args.push({                objectId: customPreview.configObjectId            });        this._object.callFunctionJSON(load, args, onBodyLoaded.bind(this));        function onBodyLoaded(bodyJsonML)         {            if (!bodyJsonML)                return;            this._cachedContent = this._renderJSONMLTag(bodyJsonML);            this._sectionElement.appendChild(this._cachedContent);            this._toggleExpand();        }    }};WebInspector.DataSaverInfobar = function() {    WebInspector.Infobar.call(this, WebInspector.Infobar.Type.Warning, WebInspector.settings.moduleSetting("disableDataSaverInfobar"));    this.element.createTextChild(WebInspector.UIString("Consider disabling "));    this.element.appendChild(WebInspector.linkifyURLAsNode("https://support.google.com/chrome/answer/2392284?hl=en", "Chrome Data Saver", undefined, true));    this.element.createTextChild(WebInspector.UIString(" while debugging."));}WebInspector.DataSaverInfobar._infobars = [];WebInspector.DataSaverInfobar.maybeShowInPanel = function(panel) {    if (Runtime.queryParam("remoteFrontend")) {        var infobar = new WebInspector.DataSaverInfobar();        WebInspector.DataSaverInfobar._infobars.push(infobar);        panel.showInfobar(infobar);    }}WebInspector.DataSaverInfobar.prototype = {    close: function()     {        for (var infobar of WebInspector.DataSaverInfobar._infobars)            WebInspector.Infobar.prototype.close.call(infobar);    },    __proto__: WebInspector.Infobar.prototype};WebInspector.DebuggerPresentationUtils = {}WebInspector.DebuggerPresentationUtils.callFrameAnchorFromStackTrace = function(debuggerModel, stackTrace, asyncStackTrace, showBlackboxed) {    function innerCallFrameAnchorFromStackTrace(stackTrace)     {        if (!stackTrace || !stackTrace.length)            return null ;        if (showBlackboxed)            return stackTrace[0];        for (var i = 0; i < stackTrace.length; ++i) {            var script = debuggerModel && debuggerModel.scriptForId(stackTrace[i].scriptId);            var blackboxed = script ? WebInspector.BlackboxSupport.isBlackboxed(script.sourceURL, script.isContentScript()) : WebInspector.BlackboxSupport.isBlackboxedURL(stackTrace[i].url);            if (!blackboxed)                return stackTrace[i];        }        return null ;    }    var callFrame = innerCallFrameAnchorFromStackTrace(stackTrace);    if (callFrame)        return callFrame;    while (asyncStackTrace) {        callFrame = innerCallFrameAnchorFromStackTrace(asyncStackTrace.callFrames);        if (callFrame)            return callFrame;        asyncStackTrace = asyncStackTrace.asyncStackTrace;    }    return stackTrace ? stackTrace[0] : null ;};WebInspector.DOMBreakpointsSidebarPane = function() {    WebInspector.BreakpointsSidebarPaneBase.call(this, WebInspector.UIString("DOM Breakpoints"));    this._domBreakpointsSetting = WebInspector.settings.createLocalSetting("domBreakpoints", []);    this.listElement.classList.add("dom-breakpoints-list");    this._breakpointElements = {};    this._breakpointTypes = {        SubtreeModified: "subtree-modified",        AttributeModified: "attribute-modified",        NodeRemoved: "node-removed"    };    this._breakpointTypeLabels = {};    this._breakpointTypeLabels[this._breakpointTypes.SubtreeModified] = WebInspector.UIString("Subtree Modified");    this._breakpointTypeLabels[this._breakpointTypes.AttributeModified] = WebInspector.UIString("Attribute Modified");    this._breakpointTypeLabels[this._breakpointTypes.NodeRemoved] = WebInspector.UIString("Node Removed");    this._contextMenuLabels = {};    this._contextMenuLabels[this._breakpointTypes.SubtreeModified] = WebInspector.UIString.capitalize("Subtree ^modifications");    this._contextMenuLabels[this._breakpointTypes.AttributeModified] = WebInspector.UIString.capitalize("Attributes ^modifications");    this._contextMenuLabels[this._breakpointTypes.NodeRemoved] = WebInspector.UIString.capitalize("Node ^removal");    WebInspector.targetManager.addEventListener(WebInspector.TargetManager.Events.InspectedURLChanged, this._inspectedURLChanged, this);    WebInspector.targetManager.addModelListener(WebInspector.DOMModel, WebInspector.DOMModel.Events.NodeRemoved, this._nodeRemoved, this);}WebInspector.DOMBreakpointsSidebarPane.prototype = {    _inspectedURLChanged: function(event)     {        this._breakpointElements = {};        this.reset();        var url = (event.data);        this._inspectedURL = url.removeURLFragment();    },    populateNodeContextMenu: function(node, contextMenu)     {        if (node.pseudoType())            return;        var nodeBreakpoints = {};        for (var id in this._breakpointElements) {            var element = this._breakpointElements[id];            if (element._node === node && element._checkboxElement.checked)                nodeBreakpoints[element._type] = true;        }        function toggleBreakpoint(type)         {            if (!nodeBreakpoints[type])                this._setBreakpoint(node, type, true);            else                this._removeBreakpoint(node, type);            this._saveBreakpoints();        }        var breakPointSubMenu = contextMenu.appendSubMenuItem(WebInspector.UIString("Break on..."));        for (var key in this._breakpointTypes) {            var type = this._breakpointTypes[key];            var label = this._contextMenuLabels[type];            breakPointSubMenu.appendCheckboxItem(label, toggleBreakpoint.bind(this, type), nodeBreakpoints[type]);        }    },    createBreakpointHitStatusMessage: function(details, callback)     {        var auxData = (details.auxData);        var domModel = WebInspector.DOMModel.fromTarget(details.target());        if (!domModel)            return;        if (auxData.type === this._breakpointTypes.SubtreeModified) {            var targetNodeObject = details.target().runtimeModel.createRemoteObject(auxData["targetNode"]);            domModel.pushObjectAsNodeToFrontend(targetNodeObject, didPushNodeToFrontend.bind(this));        } else {            this._doCreateBreakpointHitStatusMessage(auxData, domModel.nodeForId(auxData.nodeId), null , callback);        }        function didPushNodeToFrontend(targetNode)         {            if (targetNode)                targetNodeObject.release();            this._doCreateBreakpointHitStatusMessage(auxData, domModel.nodeForId(auxData.nodeId), targetNode, callback);        }    },    _doCreateBreakpointHitStatusMessage: function(auxData, node, targetNode, callback)     {        var message;        var typeLabel = this._breakpointTypeLabels[auxData.type];        var linkifiedNode = WebInspector.DOMPresentationUtils.linkifyNodeReference(node);        var substitutions = [typeLabel, linkifiedNode];        var targetNodeLink = "";        if (targetNode)            targetNodeLink = WebInspector.DOMPresentationUtils.linkifyNodeReference(targetNode);        if (auxData.type === this._breakpointTypes.SubtreeModified) {            if (auxData.insertion) {                if (targetNode !== node) {                    message = "Paused on a \"%s\" breakpoint set on %s, because a new child was added to its descendant %s.";                    substitutions.push(targetNodeLink);                } else                    message = "Paused on a \"%s\" breakpoint set on %s, because a new child was added to that node.";            } else {                message = "Paused on a \"%s\" breakpoint set on %s, because its descendant %s was removed.";                substitutions.push(targetNodeLink);            }        } else            message = "Paused on a \"%s\" breakpoint set on %s.";        var element = WebInspector.formatLocalized(message, substitutions, "");        callback(element);    },    _nodeRemoved: function(event)     {        var node = event.data.node;        this._removeBreakpointsForNode(event.data.node);        var children = node.children();        if (!children)            return;        for (var i = 0; i < children.length; ++i)            this._removeBreakpointsForNode(children[i]);        this._saveBreakpoints();    },    _removeBreakpointsForNode: function(node)     {        for (var id in this._breakpointElements) {            var element = this._breakpointElements[id];            if (element._node === node)                this._removeBreakpoint(element._node, element._type);        }    },    _setBreakpoint: function(node, type, enabled)     {        var breakpointId = this._createBreakpointId(node.id, type);        var breakpointElement = this._breakpointElements[breakpointId];        if (!breakpointElement) {            breakpointElement = this._createBreakpointElement(node, type, enabled);            this._breakpointElements[breakpointId] = breakpointElement;        } else {            breakpointElement._checkboxElement.checked = enabled;        }        if (enabled)            node.target().domdebuggerAgent().setDOMBreakpoint(node.id, type);    },    _createBreakpointElement: function(node, type, enabled)     {        var element = createElement("li");        element._node = node;        element._type = type;        element.addEventListener("contextmenu", this._contextMenu.bind(this, node, type), true);        var checkboxLabel = createCheckboxLabel("", enabled);        checkboxLabel.addEventListener("click", this._checkboxClicked.bind(this, node, type), false);        element._checkboxElement = checkboxLabel.checkboxElement;        element.appendChild(checkboxLabel);        var labelElement = createElementWithClass("div", "dom-breakpoint");        element.appendChild(labelElement);        var linkifiedNode = WebInspector.DOMPresentationUtils.linkifyNodeReference(node);        linkifiedNode.classList.add("monospace");        linkifiedNode.style.display = "block";        labelElement.appendChild(linkifiedNode);        var description = createElement("div");        description.textContent = this._breakpointTypeLabels[type];        labelElement.appendChild(description);        var currentElement = this.listElement.firstChild;        while (currentElement) {            if (currentElement._type && currentElement._type < element._type)                break;            currentElement = currentElement.nextSibling;        }        this.addListElement(element, currentElement);        return element;    },    _removeAllBreakpoints: function()     {        for (var id in this._breakpointElements) {            var element = this._breakpointElements[id];            this._removeBreakpoint(element._node, element._type);        }        this._saveBreakpoints();    },    _removeBreakpoint: function(node, type)     {        var breakpointId = this._createBreakpointId(node.id, type);        var element = this._breakpointElements[breakpointId];        if (!element)            return;        this.removeListElement(element);        delete this._breakpointElements[breakpointId];        if (element._checkboxElement.checked)            node.target().domdebuggerAgent().removeDOMBreakpoint(node.id, type);    },    _contextMenu: function(node, type, event)     {        var contextMenu = new WebInspector.ContextMenu(event);        function removeBreakpoint()         {            this._removeBreakpoint(node, type);            this._saveBreakpoints();        }        contextMenu.appendItem(WebInspector.UIString.capitalize("Remove ^breakpoint"), removeBreakpoint.bind(this));        contextMenu.appendItem(WebInspector.UIString.capitalize("Remove ^all DOM breakpoints"), this._removeAllBreakpoints.bind(this));        contextMenu.show();    },    _checkboxClicked: function(node, type, event)     {        if (event.target.checked)            node.target().domdebuggerAgent().setDOMBreakpoint(node.id, type);        else            node.target().domdebuggerAgent().removeDOMBreakpoint(node.id, type);        this._saveBreakpoints();    },    highlightBreakpoint: function(auxData)     {        var breakpointId = this._createBreakpointId(auxData.nodeId, auxData.type);        var element = this._breakpointElements[breakpointId];        if (!element)            return;        this.expand();        element.classList.add("breakpoint-hit");        this._highlightedElement = element;    },    clearBreakpointHighlight: function()     {        if (this._highlightedElement) {            this._highlightedElement.classList.remove("breakpoint-hit");            delete this._highlightedElement;        }    },    _createBreakpointId: function(nodeId, type)     {        return nodeId + ":" + type;    },    _saveBreakpoints: function()     {        var breakpoints = [];        var storedBreakpoints = this._domBreakpointsSetting.get();        for (var i = 0; i < storedBreakpoints.length; ++i) {            var breakpoint = storedBreakpoints[i];            if (breakpoint.url !== this._inspectedURL)                breakpoints.push(breakpoint);        }        for (var id in this._breakpointElements) {            var element = this._breakpointElements[id];            breakpoints.push({                url: this._inspectedURL,                path: element._node.path(),                type: element._type,                enabled: element._checkboxElement.checked            });        }        this._domBreakpointsSetting.set(breakpoints);    },    restoreBreakpoints: function(domModel)     {        var pathToBreakpoints = {};        function didPushNodeByPathToFrontend(path, nodeId)         {            var node = nodeId ? domModel.nodeForId(nodeId) : null ;            if (!node)                return;            var breakpoints = pathToBreakpoints[path];            for (var i = 0; i < breakpoints.length; ++i)                this._setBreakpoint(node, breakpoints[i].type, breakpoints[i].enabled);        }        var breakpoints = this._domBreakpointsSetting.get();        for (var i = 0; i < breakpoints.length; ++i) {            var breakpoint = breakpoints[i];            if (breakpoint.url !== this._inspectedURL)                continue;var path = breakpoint.path;            if (!pathToBreakpoints[path]) {                pathToBreakpoints[path] = [];                domModel.pushNodeByPathToFrontend(path, didPushNodeByPathToFrontend.bind(this, path));            }            pathToBreakpoints[path].push(breakpoint);        }    },    createProxy: function(panel)     {        var proxy = new WebInspector.DOMBreakpointsSidebarPane.Proxy(this,panel);        if (!this._proxies)            this._proxies = [];        this._proxies.push(proxy);        return proxy;    },    onContentReady: function()     {        for (var i = 0; i != this._proxies.length; i++)            this._proxies[i].onContentReady();    },    __proto__: WebInspector.BreakpointsSidebarPaneBase.prototype}WebInspector.DOMBreakpointsSidebarPane.Proxy = function(pane, panel) {    WebInspector.SidebarPane.call(this, pane.title());    this.registerRequiredCSS("components/breakpointsList.css");    this._wrappedPane = pane;    this._panel = panel;}WebInspector.DOMBreakpointsSidebarPane.Proxy.prototype = {    expand: function()     {        this._wrappedPane.expand();    },    onContentReady: function()     {        if (this._panel.isShowing())            this._reattachBody();        WebInspector.SidebarPane.prototype.onContentReady.call(this);    },    wasShown: function()     {        WebInspector.SidebarPane.prototype.wasShown.call(this);        this._reattachBody();    },    _reattachBody: function()     {        if (this._wrappedPane.element.parentNode !== this.element)            this._wrappedPane.show(this.element);    },    __proto__: WebInspector.SidebarPane.prototype}WebInspector.domBreakpointsSidebarPane;;WebInspector.DOMPresentationUtils = {}WebInspector.DOMPresentationUtils.decorateNodeLabel = function(node, parentElement) {    var title = node.nodeNameInCorrectCase();    var nameElement = createElement("span");    nameElement.textContent = title;    parentElement.appendChild(nameElement);    var idAttribute = node.getAttribute("id");    if (idAttribute) {        var idElement = createElement("span");        parentElement.appendChild(idElement);        var part = "#" + idAttribute;        title += part;        idElement.createTextChild(part);        nameElement.className = "extra";    }    var classAttribute = node.getAttribute("class");    if (classAttribute) {        var classes = classAttribute.split(/\s+/);        var foundClasses = {};        if (classes.length) {            var classesElement = createElement("span");            classesElement.className = "extra";            parentElement.appendChild(classesElement);            for (var i = 0; i < classes.length; ++i) {                var className = classes[i];                if (className && !(className in foundClasses)) {                    var part = "." + className;                    title += part;                    classesElement.createTextChild(part);                    foundClasses[className] = true;                }            }        }    }    parentElement.title = title;}WebInspector.DOMPresentationUtils.createSpansForNodeTitle = function(container, nodeTitle) {    var match = nodeTitle.match(/([^#.]+)(#[^.]+)?(\..*)?/);    container.createChild("span", "webkit-html-tag-name").textContent = match[1];    if (match[2])        container.createChild("span", "webkit-html-attribute-value").textContent = match[2];    if (match[3])        container.createChild("span", "webkit-html-attribute-name").textContent = match[3];}WebInspector.DOMPresentationUtils.linkifyNodeReference = function(node) {    if (!node)        return createTextNode(WebInspector.UIString("<node>"));    var root = createElement("span");    var shadowRoot = WebInspector.createShadowRootWithCoreStyles(root);    shadowRoot.appendChild(WebInspector.Widget.createStyleElement("components/domUtils.css"));    var link = shadowRoot.createChild("div", "node-link");    WebInspector.DOMPresentationUtils.decorateNodeLabel(node, link);    link.addEventListener("click", WebInspector.Revealer.reveal.bind(WebInspector.Revealer, node, undefined), false);    link.addEventListener("mouseover", node.highlight.bind(node, undefined, undefined), false);    link.addEventListener("mouseleave", WebInspector.DOMModel.hideDOMNodeHighlight.bind(WebInspector.DOMModel), false);    return root;}WebInspector.DOMPresentationUtils.linkifyDeferredNodeReference = function(deferredNode) {    var root = createElement("div");    var shadowRoot = WebInspector.createShadowRootWithCoreStyles(root);    shadowRoot.appendChild(WebInspector.Widget.createStyleElement("components/domUtils.css"));    var link = shadowRoot.createChild("div", "node-link");    link.createChild("content");    link.addEventListener("click", deferredNode.resolve.bind(deferredNode, onDeferredNodeResolved), false);    link.addEventListener("mousedown", consumeEvent, false);    function onDeferredNodeResolved(node)     {        WebInspector.Revealer.reveal(node);    }    return root;}WebInspector.DOMPresentationUtils.buildImagePreviewContents = function(target, originalImageURL, showDimensions, userCallback, precomputedFeatures) {    var resource = target.resourceTreeModel.resourceForURL(originalImageURL);    var imageURL = originalImageURL;    if (!isImageResource(resource) && precomputedFeatures && precomputedFeatures.currentSrc) {        imageURL = precomputedFeatures.currentSrc;        resource = target.resourceTreeModel.resourceForURL(imageURL);    }    if (!isImageResource(resource)) {        userCallback();        return;    }    var imageElement = createElement("img");    imageElement.addEventListener("load", buildContent, false);    imageElement.addEventListener("error", errorCallback, false);    resource.populateImageSource(imageElement);    function errorCallback()     {        userCallback();    }    function isImageResource(resource)     {        return !!resource && resource.resourceType() === WebInspector.resourceTypes.Image;    }    function buildContent()     {        var container = createElement("table");        container.className = "image-preview-container";        var naturalWidth = precomputedFeatures ? precomputedFeatures.naturalWidth : imageElement.naturalWidth;        var naturalHeight = precomputedFeatures ? precomputedFeatures.naturalHeight : imageElement.naturalHeight;        var offsetWidth = precomputedFeatures ? precomputedFeatures.offsetWidth : naturalWidth;        var offsetHeight = precomputedFeatures ? precomputedFeatures.offsetHeight : naturalHeight;        var description;        if (showDimensions) {            if (offsetHeight === naturalHeight && offsetWidth === naturalWidth)                description = WebInspector.UIString("%d \xd7 %d pixels", offsetWidth, offsetHeight);            else                description = WebInspector.UIString("%d \xd7 %d pixels (Natural: %d \xd7 %d pixels)", offsetWidth, offsetHeight, naturalWidth, naturalHeight);        }        container.createChild("tr").createChild("td", "image-container").appendChild(imageElement);        if (description)            container.createChild("tr").createChild("td").createChild("span", "description").textContent = description;        if (imageURL !== originalImageURL)            container.createChild("tr").createChild("td").createChild("span", "description").textContent = String.sprintf("currentSrc: %s", imageURL.trimMiddle(100));        userCallback(container);    }}WebInspector.DOMPresentationUtils.buildStackTracePreviewContents = function(target, linkifier, stackTrace, asyncStackTrace) {    var element = createElement("span");    element.style.display = "inline-block";    var shadowRoot = WebInspector.createShadowRootWithCoreStyles(element);    shadowRoot.appendChild(WebInspector.Widget.createStyleElement("components/domUtils.css"));    var contentElement = shadowRoot.createChild("table", "stack-preview-container");    function appendStackTrace(stackTrace)     {        for (var stackFrame of stackTrace) {            var row = createElement("tr");            row.createChild("td").textContent = WebInspector.beautifyFunctionName(stackFrame.functionName);            row.createChild("td").textContent = " @ ";            row.createChild("td").appendChild(linkifier.linkifyConsoleCallFrame(target, stackFrame));            contentElement.appendChild(row);        }    }    if (stackTrace)        appendStackTrace(stackTrace);    while (asyncStackTrace) {        var callFrames = asyncStackTrace.callFrames;        if (!callFrames || !callFrames.length)            break;        var row = contentElement.createChild("tr");        row.createChild("td", "stack-preview-async-description").textContent = WebInspector.asyncStackTraceLabel(asyncStackTrace.description);        row.createChild("td");        row.createChild("td");        appendStackTrace(callFrames);        asyncStackTrace = asyncStackTrace.asyncStackTrace;    }    return element;}WebInspector.DOMPresentationUtils.fullQualifiedSelector = function(node, justSelector) {    if (node.nodeType() !== Node.ELEMENT_NODE)        return node.localName() || node.nodeName().toLowerCase();    return WebInspector.DOMPresentationUtils.cssPath(node, justSelector);}WebInspector.DOMPresentationUtils.simpleSelector = function(node) {    var lowerCaseName = node.localName() || node.nodeName().toLowerCase();    if (node.nodeType() !== Node.ELEMENT_NODE)        return lowerCaseName;    if (lowerCaseName === "input" && node.getAttribute("type") && !node.getAttribute("id") && !node.getAttribute("class"))        return lowerCaseName + "[type=\"" + node.getAttribute("type") + "\"]";    if (node.getAttribute("id"))        return lowerCaseName + "#" + node.getAttribute("id");    if (node.getAttribute("class"))        return (lowerCaseName === "div" ? "" : lowerCaseName) + "." + node.getAttribute("class").trim().replace(/\s+/g, ".");    return lowerCaseName;}WebInspector.DOMPresentationUtils.cssPath = function(node, optimized) {    if (node.nodeType() !== Node.ELEMENT_NODE)        return "";    var steps = [];    var contextNode = node;    while (contextNode) {        var step = WebInspector.DOMPresentationUtils._cssPathStep(contextNode, !!optimized, contextNode === node);        if (!step)            break;        steps.push(step);        if (step.optimized)            break;        contextNode = contextNode.parentNode;    }    steps.reverse();    return steps.join(" > ");}WebInspector.DOMPresentationUtils._cssPathStep = function(node, optimized, isTargetNode) {    if (node.nodeType() !== Node.ELEMENT_NODE)        return null ;    var id = node.getAttribute("id");    if (optimized) {        if (id)            return new WebInspector.DOMNodePathStep(idSelector(id),true);        var nodeNameLower = node.nodeName().toLowerCase();        if (nodeNameLower === "body" || nodeNameLower === "head" || nodeNameLower === "html")            return new WebInspector.DOMNodePathStep(node.nodeNameInCorrectCase(),true);    }    var nodeName = node.nodeNameInCorrectCase();    if (id)        return new WebInspector.DOMNodePathStep(nodeName + idSelector(id),true);    var parent = node.parentNode;    if (!parent || parent.nodeType() === Node.DOCUMENT_NODE)        return new WebInspector.DOMNodePathStep(nodeName,true);    function prefixedElementClassNames(node)     {        var classAttribute = node.getAttribute("class");        if (!classAttribute)            return [];        return classAttribute.split(/\s+/g).filter(Boolean).map(function(name) {            return "$" + name;        }        );    }    function idSelector(id)     {        return "#" + escapeIdentifierIfNeeded(id);    }    function escapeIdentifierIfNeeded(ident)     {        if (isCSSIdentifier(ident))            return ident;        var shouldEscapeFirst = /^(?:[0-9]|-[0-9-]?)/.test(ident);        var lastIndex = ident.length - 1;        return ident.replace(/./g, function(c, i) {            return ((shouldEscapeFirst && i === 0) || !isCSSIdentChar(c)) ? escapeAsciiChar(c, i === lastIndex) : c;        }        );    }    function escapeAsciiChar(c, isLast)     {        return "\\" + toHexByte(c) + (isLast ? "" : " ");    }    function toHexByte(c)     {        var hexByte = c.charCodeAt(0).toString(16);        if (hexByte.length === 1)            hexByte = "0" + hexByte;        return hexByte;    }    function isCSSIdentChar(c)     {        if (/[a-zA-Z0-9_-]/.test(c))            return true;        return c.charCodeAt(0) >= 0xA0;    }    function isCSSIdentifier(value)     {        return /^-?[a-zA-Z_][a-zA-Z0-9_-]*$/.test(value);    }    var prefixedOwnClassNamesArray = prefixedElementClassNames(node);    var needsClassNames = false;    var needsNthChild = false;    var ownIndex = -1;    var elementIndex = -1;    var siblings = parent.children();    for (var i = 0; (ownIndex === -1 || !needsNthChild) && i < siblings.length; ++i) {        var sibling = siblings[i];        if (sibling.nodeType() !== Node.ELEMENT_NODE)            continue;elementIndex += 1;        if (sibling === node) {            ownIndex = elementIndex;            continue;        }        if (needsNthChild)            continue;if (sibling.nodeNameInCorrectCase() !== nodeName)            continue;needsClassNames = true;        var ownClassNames = prefixedOwnClassNamesArray.keySet();        var ownClassNameCount = 0;        for (var name in ownClassNames)            ++ownClassNameCount;        if (ownClassNameCount === 0) {            needsNthChild = true;            continue;        }        var siblingClassNamesArray = prefixedElementClassNames(sibling);        for (var j = 0; j < siblingClassNamesArray.length; ++j) {            var siblingClass = siblingClassNamesArray[j];            if (!ownClassNames.hasOwnProperty(siblingClass))                continue;delete ownClassNames[siblingClass];            if (!--ownClassNameCount) {                needsNthChild = true;                break;            }        }    }    var result = nodeName;    if (isTargetNode && nodeName.toLowerCase() === "input" && node.getAttribute("type") && !node.getAttribute("id") && !node.getAttribute("class"))        result += "[type=\"" + node.getAttribute("type") + "\"]";    if (needsNthChild) {        result += ":nth-child(" + (ownIndex + 1) + ")";    } else if (needsClassNames) {        for (var prefixedName in prefixedOwnClassNamesArray.keySet())            result += "." + escapeIdentifierIfNeeded(prefixedName.substr(1));    }    return new WebInspector.DOMNodePathStep(result,false);}WebInspector.DOMPresentationUtils.xPath = function(node, optimized) {    if (node.nodeType() === Node.DOCUMENT_NODE)        return "/";    var steps = [];    var contextNode = node;    while (contextNode) {        var step = WebInspector.DOMPresentationUtils._xPathValue(contextNode, optimized);        if (!step)            break;        steps.push(step);        if (step.optimized)            break;        contextNode = contextNode.parentNode;    }    steps.reverse();    return (steps.length && steps[0].optimized ? "" : "/") + steps.join("/");}WebInspector.DOMPresentationUtils._xPathValue = function(node, optimized) {    var ownValue;    var ownIndex = WebInspector.DOMPresentationUtils._xPathIndex(node);    if (ownIndex === -1)        return null ;    switch (node.nodeType()) {    case Node.ELEMENT_NODE:        if (optimized && node.getAttribute("id"))            return new WebInspector.DOMNodePathStep("//*[@id=\"" + node.getAttribute("id") + "\"]",true);        ownValue = node.localName();        break;    case Node.ATTRIBUTE_NODE:        ownValue = "@" + node.nodeName();        break;    case Node.TEXT_NODE:    case Node.CDATA_SECTION_NODE:        ownValue = "text()";        break;    case Node.PROCESSING_INSTRUCTION_NODE:        ownValue = "processing-instruction()";        break;    case Node.COMMENT_NODE:        ownValue = "comment()";        break;    case Node.DOCUMENT_NODE:        ownValue = "";        break;    default:        ownValue = "";        break;    }    if (ownIndex > 0)        ownValue += "[" + ownIndex + "]";    return new WebInspector.DOMNodePathStep(ownValue,node.nodeType() === Node.DOCUMENT_NODE);}WebInspector.DOMPresentationUtils._xPathIndex = function(node) {    function areNodesSimilar(left, right)     {        if (left === right)            return true;        if (left.nodeType() === Node.ELEMENT_NODE && right.nodeType() === Node.ELEMENT_NODE)            return left.localName() === right.localName();        if (left.nodeType() === right.nodeType())            return true;        var leftType = left.nodeType() === Node.CDATA_SECTION_NODE ? Node.TEXT_NODE : left.nodeType();        var rightType = right.nodeType() === Node.CDATA_SECTION_NODE ? Node.TEXT_NODE : right.nodeType();        return leftType === rightType;    }    var siblings = node.parentNode ? node.parentNode.children() : null ;    if (!siblings)        return 0;    var hasSameNamedElements;    for (var i = 0; i < siblings.length; ++i) {        if (areNodesSimilar(node, siblings[i]) && siblings[i] !== node) {            hasSameNamedElements = true;            break;        }    }    if (!hasSameNamedElements)        return 0;    var ownIndex = 1;    for (var i = 0; i < siblings.length; ++i) {        if (areNodesSimilar(node, siblings[i])) {            if (siblings[i] === node)                return ownIndex;            ++ownIndex;        }    }    return -1;}WebInspector.DOMNodePathStep = function(value, optimized) {    this.value = value;    this.optimized = optimized || false;}WebInspector.DOMNodePathStep.prototype = {    toString: function()     {        return this.value;    }};WebInspector.DockController = function(canDock) {    this._canDock = canDock;    this._closeButton = new WebInspector.ToolbarButton(WebInspector.UIString("Close"),"delete-toolbar-item");    this._closeButton.addEventListener("click", InspectorFrontendHost.closeWindow.bind(InspectorFrontendHost));    if (!canDock) {        this._dockSide = WebInspector.DockController.State.Undocked;        this._updateUI();        return;    }    this._currentDockStateSetting = WebInspector.settings.createSetting("currentDockState", "");    this._lastDockStateSetting = WebInspector.settings.createSetting("lastDockState", "");    this._dockToggleButton;}WebInspector.DockController.State = {    DockedToBottom: "bottom",    DockedToRight: "right",    Undocked: "undocked"}WebInspector.DockController.Events = {    BeforeDockSideChanged: "BeforeDockSideChanged",    DockSideChanged: "DockSideChanged",    AfterDockSideChanged: "AfterDockSideChanged"}WebInspector.DockController.prototype = {    initialize: function()     {        if (!this._canDock)            return;        this._states = [WebInspector.DockController.State.DockedToRight, WebInspector.DockController.State.DockedToBottom, WebInspector.DockController.State.Undocked];        this._titles = [WebInspector.UIString("Dock to right"), WebInspector.UIString("Dock to bottom"), WebInspector.UIString("Undock into separate window")];        var initialState = this._currentDockStateSetting.get();        initialState = this._states.indexOf(initialState) >= 0 ? initialState : this._states[0];        this._dockSideChanged(initialState);    },    dockSide: function()     {        return this._dockSide;    },    canDock: function()     {        return this._canDock;    },    isVertical: function()     {        return this._dockSide === WebInspector.DockController.State.DockedToRight;    },    _dockSideChanged: function(dockSide)     {        if (this._dockSide === dockSide)            return;        if (this._dockToggleButton)            this._dockToggleButton.setEnabled(false);        var eventData = {            from: this._dockSide,            to: dockSide        };        this.dispatchEventToListeners(WebInspector.DockController.Events.BeforeDockSideChanged, eventData);        console.timeStamp("DockController.setIsDocked");        InspectorFrontendHost.setIsDocked(dockSide !== WebInspector.DockController.State.Undocked, this._setIsDockedResponse.bind(this, eventData));        this._dockSide = dockSide;        this._updateUI();        this.dispatchEventToListeners(WebInspector.DockController.Events.DockSideChanged, eventData);    },    _setIsDockedResponse: function(eventData)     {        this.dispatchEventToListeners(WebInspector.DockController.Events.AfterDockSideChanged, eventData);        if (this._dockToggleButton)            this._dockToggleButton.setEnabled(true);    },    _updateUI: function()     {        var body = document.body;        switch (this._dockSide) {        case WebInspector.DockController.State.DockedToBottom:            body.classList.remove("undocked");            body.classList.remove("dock-to-right");            body.classList.add("dock-to-bottom");            break;        case WebInspector.DockController.State.DockedToRight:            body.classList.remove("undocked");            body.classList.add("dock-to-right");            body.classList.remove("dock-to-bottom");            break;        case WebInspector.DockController.State.Undocked:            body.classList.add("undocked");            body.classList.remove("dock-to-right");            body.classList.remove("dock-to-bottom");            break;        }        this._closeButton.setVisible(this._dockSide !== WebInspector.DockController.State.Undocked);    },    __proto__: WebInspector.Object.prototype}WebInspector.DockController.ButtonProvider = function() {}WebInspector.DockController.ButtonProvider.prototype = {    item: function()     {        if (!WebInspector.dockController.canDock())            return null ;        if (!WebInspector.dockController._dockToggleButton) {            WebInspector.dockController._dockToggleButton = new WebInspector.ToolbarStatesSettingButton("dock-toolbar-item",WebInspector.dockController._states,WebInspector.dockController._titles,WebInspector.dockController.dockSide(),WebInspector.dockController._currentDockStateSetting,WebInspector.dockController._lastDockStateSetting,WebInspector.dockController._dockSideChanged.bind(WebInspector.dockController));        }        return WebInspector.dockController._dockToggleButton;    }}WebInspector.DockController.ToggleDockActionDelegate = function() {}WebInspector.DockController.ToggleDockActionDelegate.prototype = {    handleAction: function(context, actionId)     {        var toggleButton = new WebInspector.DockController.ButtonProvider().item();        if (!toggleButton || !toggleButton.enabled())            return;        (toggleButton).toggle();    }}WebInspector.DockController.CloseButtonProvider = function() {}WebInspector.DockController.CloseButtonProvider.prototype = {    item: function()     {        return WebInspector.dockController._closeButton;    }}WebInspector.dockController;;WebInspector.Drawer = function(splitWidget) {    WebInspector.VBox.call(this);    this.element.id = "drawer-contents";    this._splitWidget = splitWidget;    splitWidget.hideDefaultResizer();    splitWidget.setSidebarWidget(this);    this._toggleDrawerButton = new WebInspector.ToolbarButton(WebInspector.UIString("Show drawer"),"console-toolbar-item");    this._toggleDrawerButton.addEventListener("click", this.toggle, this);    this._tabbedPane = new WebInspector.TabbedPane();    this._tabbedPane.element.id = "drawer-tabbed-pane";    this._tabbedPane.setCloseableTabs(false);    this._tabbedPane.addEventListener(WebInspector.TabbedPane.EventTypes.TabSelected, this._tabSelected, this);    new WebInspector.ExtensibleTabbedPaneController(this._tabbedPane,"drawer-view");    splitWidget.installResizer(this._tabbedPane.headerElement());    this._lastSelectedViewSetting = WebInspector.settings.createSetting("WebInspector.Drawer.lastSelectedView", "console");    this._tabbedPane.show(this.element);}WebInspector.Drawer.prototype = {    toggleButton: function()     {        return this._toggleDrawerButton;    },    closeView: function(id)     {        this._tabbedPane.closeTab(id);    },    showView: function(id, immediate)     {        if (!this._tabbedPane.hasTab(id)) {            this._innerShow(immediate);            return;        }        this._innerShow(immediate);        this._tabbedPane.selectTab(id, true);        this._lastSelectedViewSetting.set(id);    },    showCloseableView: function(id, title, view)     {        if (!this._tabbedPane.hasTab(id)) {            this._tabbedPane.appendTab(id, title, view, undefined, false, true);        } else {            this._tabbedPane.changeTabView(id, view);            this._tabbedPane.changeTabTitle(id, title);        }        this._innerShow();        this._tabbedPane.selectTab(id, true);    },    showDrawer: function()     {        this.showView(this._lastSelectedViewSetting.get());    },    wasShown: function()     {        this.showView(this._lastSelectedViewSetting.get());        this._toggleDrawerButton.setToggled(true);        this._toggleDrawerButton.setTitle(WebInspector.UIString("Hide drawer"));    },    willHide: function()     {        this._toggleDrawerButton.setToggled(false);        this._toggleDrawerButton.setTitle(WebInspector.UIString("Show drawer"));    },    _innerShow: function(immediate)     {        if (this.isShowing())            return;        this._splitWidget.showBoth(!immediate);        if (this._visibleView())            this._visibleView().focus();    },    closeDrawer: function()     {        if (!this.isShowing())            return;        WebInspector.restoreFocusFromElement(this.element);        this._splitWidget.hideSidebar(true);    },    _visibleView: function()     {        return this._tabbedPane.visibleView;    },    _tabSelected: function(event)     {        var tabId = this._tabbedPane.selectedTabId;        if (tabId && event.data["isUserGesture"] && !this._tabbedPane.isTabCloseable(tabId))            this._lastSelectedViewSetting.set(tabId);    },    toggle: function()     {        if (this._toggleDrawerButton.toggled())            this.closeDrawer();        else            this.showDrawer();    },    visible: function()     {        return this._toggleDrawerButton.toggled();    },    selectedViewId: function()     {        return this._tabbedPane.selectedTabId;    },    initialPanelShown: function()     {        this._initialPanelWasShown = true;    },    __proto__: WebInspector.VBox.prototype}WebInspector.Drawer.ViewFactory = function() {}WebInspector.Drawer.ViewFactory.prototype = {    createView: function() {}}WebInspector.Drawer.SingletonViewFactory = function(constructor) {    this._constructor = constructor;}WebInspector.Drawer.SingletonViewFactory.prototype = {    createView: function()     {        if (!this._instance)            this._instance = (new this._constructor());        return this._instance;    }};WebInspector.ExecutionContextSelector = function(targetManager, context) {    targetManager.observeTargets(this);    context.addFlavorChangeListener(WebInspector.ExecutionContext, this._executionContextChanged, this);    context.addFlavorChangeListener(WebInspector.Target, this._targetChanged, this);    targetManager.addModelListener(WebInspector.RuntimeModel, WebInspector.RuntimeModel.Events.ExecutionContextCreated, this._onExecutionContextCreated, this);    targetManager.addModelListener(WebInspector.RuntimeModel, WebInspector.RuntimeModel.Events.ExecutionContextDestroyed, this._onExecutionContextDestroyed, this);    this._targetManager = targetManager;    this._context = context;}WebInspector.ExecutionContextSelector.prototype = {    targetAdded: function(target)     {        if (!target.hasJSContext())            return;        setImmediate(deferred.bind(this));        function deferred()         {            if (!this._context.flavor(WebInspector.Target))                this._context.setFlavor(WebInspector.Target, target);        }    },    targetRemoved: function(target)     {        if (!target.hasJSContext())            return;        var currentExecutionContext = this._context.flavor(WebInspector.ExecutionContext);        if (currentExecutionContext && currentExecutionContext.target() === target)            this._currentExecutionContextGone();        var targets = this._targetManager.targetsWithJSContext();        if (this._context.flavor(WebInspector.Target) === target && targets.length)            this._context.setFlavor(WebInspector.Target, targets[0]);    },    _executionContextChanged: function(event)     {        var newContext = (event.data);        if (newContext) {            this._context.setFlavor(WebInspector.Target, newContext.target());            if (!this._contextIsGoingAway)                this._lastSelectedContextId = this._contextPersistentId(newContext);        }    },    _contextPersistentId: function(executionContext)     {        return executionContext.isMainWorldContext ? executionContext.target().name() + ":" + executionContext.frameId : "";    },    _targetChanged: function(event)     {        var newTarget = (event.data);        var currentContext = this._context.flavor(WebInspector.ExecutionContext);        if (!newTarget || (currentContext && currentContext.target() === newTarget))            return;        var executionContexts = newTarget.runtimeModel.executionContexts();        if (!executionContexts.length)            return;        var newContext = executionContexts[0];        for (var i = 1; i < executionContexts.length; ++i) {            if (executionContexts[i].isMainWorldContext)                newContext = executionContexts[i];        }        this._context.setFlavor(WebInspector.ExecutionContext, newContext);    },    _onExecutionContextCreated: function(event)     {        var executionContext = (event.data);        if (!this._context.flavor(WebInspector.ExecutionContext) || (this._lastSelectedContextId && this._lastSelectedContextId === this._contextPersistentId(executionContext)))            this._context.setFlavor(WebInspector.ExecutionContext, executionContext);    },    _onExecutionContextDestroyed: function(event)     {        var executionContext = (event.data);        if (this._context.flavor(WebInspector.ExecutionContext) === executionContext)            this._currentExecutionContextGone();    },    _currentExecutionContextGone: function()     {        var targets = this._targetManager.targetsWithJSContext();        var newContext = null ;        for (var i = 0; i < targets.length; ++i) {            if (targets[i].isServiceWorker())                continue;var executionContexts = targets[i].runtimeModel.executionContexts();            if (executionContexts.length) {                newContext = executionContexts[0];                break;            }        }        this._contextIsGoingAway = true;        this._context.setFlavor(WebInspector.ExecutionContext, newContext);        this._contextIsGoingAway = false;    }}WebInspector.ExecutionContextSelector.completionsForTextPromptInCurrentContext = function(proxyElement, wordRange, force, completionsReadyCallback) {    var executionContext = WebInspector.context.flavor(WebInspector.ExecutionContext);    if (!executionContext) {        completionsReadyCallback([]);        return;    }    var expressionRange = wordRange.startContainer.rangeOfWord(wordRange.startOffset, " =:({;,!+-*/&|^<>", proxyElement, "backward");    var expressionString = expressionRange.toString();    var pos = expressionString.lastIndexOf("[", expressionString.length - 2);    if (pos !== -1)        expressionString = expressionString.substr(pos + 1);    var prefix = wordRange.toString();    executionContext.completionsForExpression(expressionString, prefix, force, completionsReadyCallback);};WebInspector.ExecutionContextModel = function(selectElement) {    this._selectElement = selectElement;    this._optionByExecutionContext = new Map();    WebInspector.targetManager.observeTargets(this);    WebInspector.targetManager.addModelListener(WebInspector.RuntimeModel, WebInspector.RuntimeModel.Events.ExecutionContextCreated, this._onExecutionContextCreated, this);    WebInspector.targetManager.addModelListener(WebInspector.RuntimeModel, WebInspector.RuntimeModel.Events.ExecutionContextDestroyed, this._onExecutionContextDestroyed, this);    WebInspector.targetManager.addModelListener(WebInspector.ResourceTreeModel, WebInspector.ResourceTreeModel.EventTypes.FrameNavigated, this._onFrameNavigated, this);    this._selectElement.addEventListener("change", this._executionContextChanged.bind(this), false);    WebInspector.context.addFlavorChangeListener(WebInspector.ExecutionContext, this._executionContextChangedExternally, this);}WebInspector.ExecutionContextModel.prototype = {    _titleFor: function(executionContext)     {        var result;        if (executionContext.isMainWorldContext) {            if (executionContext.frameId) {                var frame = executionContext.target().resourceTreeModel.frameForId(executionContext.frameId);                result = frame ? frame.displayName() : (executionContext.origin || executionContext.name);            } else {                var parsedUrl = executionContext.origin.asParsedURL();                var name = parsedUrl ? parsedUrl.lastPathComponentWithFragment() : executionContext.name;                result = executionContext.target().decorateLabel(name);            }        } else {            result = "\u00a0\u00a0\u00a0\u00a0" + (executionContext.name || executionContext.origin);        }        var maxLength = 50;        return result.trimMiddle(maxLength);    },    _executionContextCreated: function(executionContext)     {        if (executionContext.target().isServiceWorker())            return;        var newOption = createElement("option");        newOption.__executionContext = executionContext;        newOption.text = this._titleFor(executionContext);        this._optionByExecutionContext.set(executionContext, newOption);        var options = this._selectElement.options;        var contexts = Array.prototype.map.call(options, mapping);        var index = insertionIndexForObjectInListSortedByFunction(executionContext, contexts, WebInspector.ExecutionContext.comparator);        this._selectElement.insertBefore(newOption, options[index]);        if (executionContext === WebInspector.context.flavor(WebInspector.ExecutionContext))            this._select(newOption);        function mapping(option)         {            return option.__executionContext;        }    },    _onExecutionContextCreated: function(event)     {        var executionContext = (event.data);        this._executionContextCreated(executionContext);    },    _executionContextDestroyed: function(executionContext)     {        var option = this._optionByExecutionContext.remove(executionContext);        option.remove();    },    _onExecutionContextDestroyed: function(event)     {        var executionContext = (event.data);        this._executionContextDestroyed(executionContext);    },    _onFrameNavigated: function(event)     {        var frame = (event.data);        var executionContexts = this._optionByExecutionContext.keysArray();        for (var i = 0; i < executionContexts.length; ++i) {            var context = executionContexts[i];            if (context.frameId === frame.id)                this._optionByExecutionContext.get(context).text = this._titleFor(context);        }    },    _executionContextChangedExternally: function(event)     {        var executionContext = (event.data);        if (!executionContext)            return;        var options = this._selectElement.options;        for (var i = 0; i < options.length; ++i) {            if (options[i].__executionContext === executionContext)                this._select(options[i]);        }    },    _executionContextChanged: function()     {        var option = this._selectedOption();        var newContext = option ? option.__executionContext : null ;        WebInspector.context.setFlavor(WebInspector.ExecutionContext, newContext);    },    targetAdded: function(target)     {        target.runtimeModel.executionContexts().forEach(this._executionContextCreated, this);    },    targetRemoved: function(target)     {        var executionContexts = this._optionByExecutionContext.keysArray();        for (var i = 0; i < executionContexts.length; ++i) {            if (executionContexts[i].target() === target)                this._executionContextDestroyed(executionContexts[i]);        }    },    _select: function(option)     {        this._selectElement.selectedIndex = Array.prototype.indexOf.call((this._selectElement), option);    },    _selectedOption: function()     {        if (this._selectElement.selectedIndex >= 0)            return this._selectElement[this._selectElement.selectedIndex];        return null ;    }};WebInspector.HandlerRegistry = function(setting) {    WebInspector.Object.call(this);    this._handlers = {};    this._setting = setting;    this._activeHandler = this._setting.get();}WebInspector.HandlerRegistry.prototype = {    get handlerNames()     {        return Object.getOwnPropertyNames(this._handlers);    },    get activeHandler()     {        return this._activeHandler;    },    set activeHandler(value)     {        this._activeHandler = value;        this._setting.set(value);    },    dispatch: function(data)     {        return this.dispatchToHandler(this._activeHandler, data);    },    dispatchToHandler: function(name, data)     {        var handler = this._handlers[name];        var result = handler && handler(data);        return !!result;    },    registerHandler: function(name, handler)     {        this._handlers[name] = handler;        this.dispatchEventToListeners(WebInspector.HandlerRegistry.EventTypes.HandlersUpdated);    },    unregisterHandler: function(name)     {        delete this._handlers[name];        this.dispatchEventToListeners(WebInspector.HandlerRegistry.EventTypes.HandlersUpdated);    },    _openInNewTab: function(url)     {        InspectorFrontendHost.openInNewTab(url);    },    _appendContentProviderItems: function(contextMenu, target)     {        if (!(target instanceof WebInspector.UISourceCode || target instanceof WebInspector.Resource || target instanceof WebInspector.NetworkRequest))            return;        var contentProvider = (target);        if (!contentProvider.contentURL())            return;        contextMenu.appendItem(WebInspector.openLinkExternallyLabel(), this._openInNewTab.bind(this, contentProvider.contentURL()));        for (var i = 1; i < this.handlerNames.length; ++i) {            var handler = this.handlerNames[i];            contextMenu.appendItem(WebInspector.UIString.capitalize("Open ^using %s", handler), this.dispatchToHandler.bind(this, handler, {                url: contentProvider.contentURL()            }));        }        contextMenu.appendItem(WebInspector.copyLinkAddressLabel(), InspectorFrontendHost.copyText.bind(InspectorFrontendHost, contentProvider.contentURL()));        if (!contentProvider.contentURL())            return;        var contentType = contentProvider.contentType();        if (contentType !== WebInspector.resourceTypes.Document && contentType !== WebInspector.resourceTypes.Stylesheet && contentType !== WebInspector.resourceTypes.Script)            return;        function doSave(forceSaveAs, content)         {            var url = contentProvider.contentURL();            WebInspector.fileManager.save(url, (content), forceSaveAs);            WebInspector.fileManager.close(url);        }        function save(forceSaveAs)         {            if (contentProvider instanceof WebInspector.UISourceCode) {                var uiSourceCode = (contentProvider);                uiSourceCode.save(forceSaveAs);                return;            }            contentProvider.requestContent(doSave.bind(null , forceSaveAs));        }        contextMenu.appendSeparator();        contextMenu.appendItem(WebInspector.UIString("Save"), save.bind(null , false));        if (contentProvider instanceof WebInspector.UISourceCode) {            var uiSourceCode = (contentProvider);            if (uiSourceCode.project().type() !== WebInspector.projectTypes.FileSystem && uiSourceCode.project().type() !== WebInspector.projectTypes.Snippets)                contextMenu.appendItem(WebInspector.UIString.capitalize("Save ^as..."), save.bind(null , true));        }    },    _appendHrefItems: function(contextMenu, target)     {        if (!(target instanceof Node))            return;        var targetNode = (target);        var anchorElement = targetNode.enclosingNodeOrSelfWithClass("webkit-html-resource-link") || targetNode.enclosingNodeOrSelfWithClass("webkit-html-external-link");        if (!anchorElement)            return;        var uiLocation = WebInspector.Linkifier.uiLocationByAnchor(anchorElement);        var resourceURL = uiLocation ? uiLocation.uiSourceCode.contentURL() : anchorElement.href;        var uiSourceCode = uiLocation ? uiLocation.uiSourceCode : (resourceURL ? WebInspector.networkMapping.uiSourceCodeForURLForAnyTarget(resourceURL) : null );        function open()         {            WebInspector.Revealer.reveal(uiSourceCode);        }        if (uiSourceCode)            contextMenu.appendItem("Open", open);        if (!resourceURL)            return;        contextMenu.appendItem(WebInspector.openLinkExternallyLabel(), this._openInNewTab.bind(this, resourceURL));        function openInResourcesPanel(resourceURL)         {            var resource = WebInspector.resourceForURL(resourceURL);            if (resource)                WebInspector.Revealer.reveal(resource);            else                InspectorFrontendHost.openInNewTab(resourceURL);        }        if (!targetNode.enclosingNodeOrSelfWithClassList(["resources", "panel"]) && WebInspector.resourceForURL(resourceURL))            contextMenu.appendItem(WebInspector.UIString.capitalize("Open ^link in Resources ^panel"), openInResourcesPanel.bind(null , resourceURL));        contextMenu.appendItem(WebInspector.copyLinkAddressLabel(), InspectorFrontendHost.copyText.bind(InspectorFrontendHost, resourceURL));    },    __proto__: WebInspector.Object.prototype}WebInspector.HandlerRegistry.EventTypes = {    HandlersUpdated: "HandlersUpdated"}WebInspector.HandlerSelector = function(handlerRegistry) {    this._handlerRegistry = handlerRegistry;    this.element = createElementWithClass("select", "chrome-select");    this.element.addEventListener("change", this._onChange.bind(this), false);    this._update();    this._handlerRegistry.addEventListener(WebInspector.HandlerRegistry.EventTypes.HandlersUpdated, this._update.bind(this));}WebInspector.HandlerSelector.prototype = {    _update: function()     {        this.element.removeChildren();        var names = this._handlerRegistry.handlerNames;        var activeHandler = this._handlerRegistry.activeHandler;        for (var i = 0; i < names.length; ++i) {            var option = createElement("option");            option.textContent = names[i];            option.selected = activeHandler === names[i];            this.element.appendChild(option);        }        this.element.disabled = names.length <= 1;    },    _onChange: function(event)     {        var value = event.target.value;        this._handlerRegistry.activeHandler = value;    }}WebInspector.HandlerRegistry.ContextMenuProvider = function() {}WebInspector.HandlerRegistry.ContextMenuProvider.prototype = {    appendApplicableItems: function(event, contextMenu, target)     {        WebInspector.openAnchorLocationRegistry._appendContentProviderItems(contextMenu, target);        WebInspector.openAnchorLocationRegistry._appendHrefItems(contextMenu, target);    }}WebInspector.HandlerRegistry.LinkHandler = function() {}WebInspector.HandlerRegistry.LinkHandler.prototype = {    handleLink: function(url, lineNumber)     {        return WebInspector.openAnchorLocationRegistry.dispatch({            url: url,            lineNumber: lineNumber        });    }}WebInspector.HandlerRegistry.OpenAnchorLocationSettingUI = function() {}WebInspector.HandlerRegistry.OpenAnchorLocationSettingUI.prototype = {    settingElement: function()     {        if (!WebInspector.openAnchorLocationRegistry.handlerNames.length)            return null ;        var handlerSelector = new WebInspector.HandlerSelector(WebInspector.openAnchorLocationRegistry);        return WebInspector.SettingsUI.createCustomSetting(WebInspector.UIString("Open links in"), handlerSelector.element);    }}WebInspector.openAnchorLocationRegistry;;WebInspector.InspectElementModeController = function() {    this._toggleSearchButton = new WebInspector.ToolbarButton(WebInspector.UIString("Select an element in the page to inspect it"),"node-search-toolbar-item");    InspectorFrontendHost.events.addEventListener(InspectorFrontendHostAPI.Events.EnterInspectElementMode, this._toggleSearch, this);    WebInspector.targetManager.addEventListener(WebInspector.TargetManager.Events.SuspendStateChanged, this._suspendStateChanged, this);    WebInspector.targetManager.observeTargets(this, WebInspector.Target.Type.Page);}WebInspector.InspectElementModeController.createShortcut = function() {    return WebInspector.KeyboardShortcut.makeDescriptor("c", WebInspector.KeyboardShortcut.Modifiers.CtrlOrMeta | WebInspector.KeyboardShortcut.Modifiers.Shift);}WebInspector.InspectElementModeController.prototype = {    targetAdded: function(target)     {        if (!this.enabled())            return;        var domModel = WebInspector.DOMModel.fromTarget(target);        domModel.setInspectModeEnabled(true, WebInspector.moduleSetting("showUAShadowDOM").get());    },    targetRemoved: function(target)     {},    enabled: function()     {        return this._toggleSearchButton.toggled();    },    disable: function()     {        if (this.enabled())            this._toggleSearch();    },    _toggleSearch: function()     {        var enabled = !this.enabled();        this._toggleSearchButton.setToggled(enabled);        for (var domModel of WebInspector.DOMModel.instances())            domModel.setInspectModeEnabled(enabled, WebInspector.moduleSetting("showUAShadowDOM").get());    },    _suspendStateChanged: function()     {        if (WebInspector.targetManager.allTargetsSuspended())            this._toggleSearchButton.setToggled(false);    }}WebInspector.InspectElementModeController.ToggleSearchActionDelegate = function() {}WebInspector.InspectElementModeController.ToggleSearchActionDelegate.prototype = {    handleAction: function(context, actionId)     {        if (!WebInspector.inspectElementModeController)            return;        WebInspector.inspectElementModeController._toggleSearch();    }}WebInspector.InspectElementModeController.ToggleButtonProvider = function() {}WebInspector.InspectElementModeController.ToggleButtonProvider.prototype = {    item: function()     {        if (!WebInspector.inspectElementModeController)            return null ;        return WebInspector.inspectElementModeController._toggleSearchButton;    }}WebInspector.inspectElementModeController = null ;;WebInspector.InspectorView = function() {    WebInspector.VBox.call(this);    WebInspector.Dialog.setModalHostView(this);    WebInspector.GlassPane.DefaultFocusedViewStack.push(this);    this.setMinimumSize(240, 72);    this._drawerSplitWidget = new WebInspector.SplitWidget(false,true,"Inspector.drawerSplitViewState",200,200);    this._drawerSplitWidget.hideSidebar();    this._drawerSplitWidget.enableShowModeSaving();    this._drawerSplitWidget.show(this.element);    this._tabbedPane = new WebInspector.TabbedPane();    this._tabbedPane.registerRequiredCSS("components/inspectorViewTabbedPane.css");    this._tabbedPane.element.classList.add("inspector-view-tabbed-pane");    this._tabbedPane.setRetainTabOrder(true);    this._drawerSplitWidget.setMainWidget(this._tabbedPane);    this._drawer = new WebInspector.Drawer(this._drawerSplitWidget);    this._panels = {};    WebInspector["panels"] = this._panels;    this._history = [];    this._historyIterator = -1;    this._keyDownBound = this._keyDown.bind(this);    this._keyPressBound = this._keyPress.bind(this);    this._panelDescriptors = {};    this._panelPromises = {};    this._openBracketIdentifiers = ["U+005B", "U+00DB"].keySet();    this._closeBracketIdentifiers = ["U+005D", "U+00DD"].keySet();    this._lastActivePanelSetting = WebInspector.settings.createSetting("lastActivePanel", "elements");    InspectorFrontendHost.events.addEventListener(InspectorFrontendHostAPI.Events.ShowConsole, showConsole.bind(this));    this._loadPanelDesciptors();    function showConsole()     {        this.showPanel("console");    }    WebInspector.targetManager.addEventListener(WebInspector.TargetManager.Events.SuspendStateChanged, this._onSuspendStateChanged.bind(this));};WebInspector.InspectorView.prototype = {    wasShown: function()     {        this.element.ownerDocument.addEventListener("keydown", this._keyDownBound, false);        this.element.ownerDocument.addEventListener("keypress", this._keyPressBound, false);    },    willHide: function()     {        this.element.ownerDocument.removeEventListener("keydown", this._keyDownBound, false);        this.element.ownerDocument.removeEventListener("keypress", this._keyPressBound, false);    },    _loadPanelDesciptors: function()     {        WebInspector.startBatchUpdate();        self.runtime.extensions(WebInspector.PanelFactory).forEach(processPanelExtensions.bind(this));        function processPanelExtensions(extension)         {            this.addPanel(new WebInspector.RuntimeExtensionPanelDescriptor(extension));        }        WebInspector.endBatchUpdate();    },    createToolbars: function()     {        this._leftToolbar = new WebInspector.ExtensibleToolbar("main-toolbar-left");        this._leftToolbar.element.classList.add("inspector-view-toolbar", "inspector-view-toolbar-left");        this._tabbedPane.insertBeforeTabStrip(this._leftToolbar.element);        var rightToolbarContainer = createElementWithClass("div", "hbox flex-none flex-centered");        this._tabbedPane.appendAfterTabStrip(rightToolbarContainer);        this._rightToolbar = new WebInspector.ExtensibleToolbar("main-toolbar-right");        this._rightToolbar.element.classList.add("inspector-view-toolbar", "flex-none");        rightToolbarContainer.appendChild(this._rightToolbar.element);    },    addPanel: function(panelDescriptor)     {        var panelName = panelDescriptor.name();        this._panelDescriptors[panelName] = panelDescriptor;        this._tabbedPane.appendTab(panelName, panelDescriptor.title(), new WebInspector.Widget());        if (this._lastActivePanelSetting.get() === panelName)            this._tabbedPane.selectTab(panelName);    },    hasPanel: function(panelName)     {        return !!this._panelDescriptors[panelName];    },    panel: function(panelName)     {        var panelDescriptor = this._panelDescriptors[panelName];        if (!panelDescriptor)            return Promise.reject(new Error("Can't load panel without the descriptor: " + panelName));        var promise = this._panelPromises[panelName];        if (promise)            return promise;        promise = panelDescriptor.panel();        this._panelPromises[panelName] = promise;        promise.then(cachePanel.bind(this));        function cachePanel(panel)         {            delete this._panelPromises[panelName];            this._panels[panelName] = panel;            return panel;        }        return promise;    },    _onSuspendStateChanged: function(event)     {        this._currentPanelLocked = WebInspector.targetManager.allTargetsSuspended();        this._tabbedPane.setCurrentTabLocked(this._currentPanelLocked);        if (this._leftToolbar)            this._leftToolbar.setEnabled(!this._currentPanelLocked);        if (this._rightToolbar)            this._rightToolbar.setEnabled(!this._currentPanelLocked);    },    showPanel: function(panelName)     {        if (this._currentPanelLocked) {            if (this._currentPanel !== this._panels[panelName])                return Promise.reject(new Error("Current panel locked"));            return Promise.resolve(this._currentPanel);        }        this._panelForShowPromise = this.panel(panelName);        return this._panelForShowPromise.then(setCurrentPanelIfNecessary.bind(this, this._panelForShowPromise));        function setCurrentPanelIfNecessary(panelPromise, panel)         {            if (this._panelForShowPromise !== panelPromise)                return null ;            this.setCurrentPanel(panel);            return panel;        }    },    setPanelIcon: function(panelName, iconType, iconTooltip)     {        this._tabbedPane.setTabIcon(panelName, iconType, iconTooltip);    },    currentPanel: function()     {        return this._currentPanel;    },    showInitialPanel: function()     {        if (InspectorFrontendHost.isUnderTest())            return;        this._showInitialPanel();    },    _showInitialPanel: function()     {        this._tabbedPane.addEventListener(WebInspector.TabbedPane.EventTypes.TabSelected, this._tabSelected, this);        this._tabSelected();        this._drawer.initialPanelShown();    },    showInitialPanelForTest: function(panelName)     {        this._tabbedPane.addEventListener(WebInspector.TabbedPane.EventTypes.TabSelected, this._tabSelected, this);        this.setCurrentPanel(this._panels[panelName]);        this._drawer.initialPanelShown();    },    _tabSelected: function()     {        var panelName = this._tabbedPane.selectedTabId;        if (!panelName)            return;        this.showPanel(panelName);    },    setCurrentPanel: function(panel)     {        delete this._panelForShowPromise;        if (this._currentPanelLocked) {            console.error("Current panel is locked");            return this._currentPanel;        }        InspectorFrontendHost.bringToFront();        if (this._currentPanel === panel)            return panel;        this._currentPanel = panel;        if (!this._panels[panel.name])            this._panels[panel.name] = panel;        this._tabbedPane.changeTabView(panel.name, panel);        this._tabbedPane.removeEventListener(WebInspector.TabbedPane.EventTypes.TabSelected, this._tabSelected, this);        this._tabbedPane.selectTab(panel.name);        this._tabbedPane.addEventListener(WebInspector.TabbedPane.EventTypes.TabSelected, this._tabSelected, this);        this._lastActivePanelSetting.set(panel.name);        this._pushToHistory(panel.name);        WebInspector.userMetrics.panelShown(panel.name);        panel.focus();        return panel;    },    closeViewInDrawer: function(id)     {        this._drawer.closeView(id);    },    showCloseableViewInDrawer: function(id, title, view)     {        this._drawer.showCloseableView(id, title, view);    },    showDrawer: function()     {        this._drawer.showDrawer();    },    drawerVisible: function()     {        return this._drawer.isShowing();    },    showViewInDrawer: function(id, immediate)     {        this._drawer.showView(id, immediate);    },    selectedViewInDrawer: function()     {        return this._drawer.selectedViewId();    },    closeDrawer: function()     {        this._drawer.closeDrawer();    },    defaultFocusedElement: function()     {        return this._currentPanel ? this._currentPanel.defaultFocusedElement() : null ;    },    _keyPress: function(event)     {        if (event.charCode < 32 && WebInspector.isWin())            return;        clearTimeout(this._keyDownTimer);        delete this._keyDownTimer;    },    _keyDown: function(event)     {        if (!WebInspector.KeyboardShortcut.eventHasCtrlOrMeta(event))            return;        var keyboardEvent = (event);        var panelShortcutEnabled = WebInspector.moduleSetting("shortcutPanelSwitch").get();        if (panelShortcutEnabled && !event.shiftKey && !event.altKey) {            var panelIndex = -1;            if (event.keyCode > 0x30 && event.keyCode < 0x3A)                panelIndex = event.keyCode - 0x31;            else if (event.keyCode > 0x60 && event.keyCode < 0x6A && keyboardEvent.location === KeyboardEvent.DOM_KEY_LOCATION_NUMPAD)                panelIndex = event.keyCode - 0x61;            if (panelIndex !== -1) {                var panelName = this._tabbedPane.allTabs()[panelIndex];                if (panelName) {                    if (!WebInspector.Dialog.currentInstance() && !this._currentPanelLocked)                        this.showPanel(panelName);                    event.consume(true);                }                return;            }        }        if (!WebInspector.isWin() || (!this._openBracketIdentifiers[event.keyIdentifier] && !this._closeBracketIdentifiers[event.keyIdentifier])) {            this._keyDownInternal(event);            return;        }        this._keyDownTimer = setTimeout(this._keyDownInternal.bind(this, event), 0);    },    _keyDownInternal: function(event)     {        if (this._currentPanelLocked)            return;        var direction = 0;        if (this._openBracketIdentifiers[event.keyIdentifier])            direction = -1;        if (this._closeBracketIdentifiers[event.keyIdentifier])            direction = 1;        if (!direction)            return;        if (!event.shiftKey && !event.altKey) {            if (!WebInspector.Dialog.currentInstance())                this._changePanelInDirection(direction);            event.consume(true);            return;        }        if (event.altKey && this._moveInHistory(direction))            event.consume(true);    },    _changePanelInDirection: function(direction)     {        var panelOrder = this._tabbedPane.allTabs();        var index = panelOrder.indexOf(this.currentPanel().name);        index = (index + panelOrder.length + direction) % panelOrder.length;        this.showPanel(panelOrder[index]);    },    _moveInHistory: function(move)     {        var newIndex = this._historyIterator + move;        if (newIndex >= this._history.length || newIndex < 0)            return false;        this._inHistory = true;        this._historyIterator = newIndex;        if (!WebInspector.Dialog.currentInstance())            this.setCurrentPanel(this._panels[this._history[this._historyIterator]]);        delete this._inHistory;        return true;    },    _pushToHistory: function(panelName)     {        if (this._inHistory)            return;        this._history.splice(this._historyIterator + 1, this._history.length - this._historyIterator - 1);        if (!this._history.length || this._history[this._history.length - 1] !== panelName)            this._history.push(panelName);        this._historyIterator = this._history.length - 1;    },    onResize: function()     {        WebInspector.Dialog.modalHostRepositioned();    },    topResizerElement: function()     {        return this._tabbedPane.headerElement();    },    toolbarItemResized: function()     {        this._tabbedPane.headerResized();    },    __proto__: WebInspector.VBox.prototype};WebInspector.inspectorView;WebInspector.InspectorView.DrawerToggleActionDelegate = function() {}WebInspector.InspectorView.DrawerToggleActionDelegate.prototype = {    handleAction: function(context, actionId)     {        if (WebInspector.inspectorView.drawerVisible())            WebInspector.inspectorView.closeDrawer();        else            WebInspector.inspectorView.showDrawer();    }}WebInspector.InspectorView.ToggleDrawerButtonProvider = function() {}WebInspector.InspectorView.ToggleDrawerButtonProvider.prototype = {    item: function()     {        return WebInspector.inspectorView._drawer.toggleButton();    }};WebInspector.NetworkConditionsSelector = function(selectElement) {    this._selectElement = selectElement;    this._selectElement.addEventListener("change", this._optionSelected.bind(this), false);    this._setting = WebInspector.moduleSetting("networkConditions");    this._setting.addChangeListener(this._settingChanged, this);    this._populateOptions();    this._settingChanged();}WebInspector.NetworkConditionsSelector._networkConditionsPresets = [{    title: "Offline",    value: {        throughput: 0 * 1024 / 8,        latency: 0    }}, {    title: "GPRS",    value: {        throughput: 50 * 1024 / 8,        latency: 500    }}, {    title: "Regular 2G",    value: {        throughput: 250 * 1024 / 8,        latency: 300    }}, {    title: "Good 2G",    value: {        throughput: 450 * 1024 / 8,        latency: 150    }}, {    title: "Regular 3G",    value: {        throughput: 750 * 1024 / 8,        latency: 100    }}, {    title: "Good 3G",    value: {        throughput: 1.5 * 1024 * 1024 / 8,        latency: 40    }}, {    title: "Regular 4G",    value: {        throughput: 4 * 1024 * 1024 / 8,        latency: 20    }}, {    title: "DSL",    value: {        throughput: 2 * 1024 * 1024 / 8,        latency: 5    }}, {    title: "WiFi",    value: {        throughput: 30 * 1024 * 1024 / 8,        latency: 2    }}, {    title: "No throttling",    value: {        throughput: -1,        latency: 0    }}];WebInspector.NetworkConditionsSelector.prototype = {    _populateOptions: function()     {        var presets = WebInspector.NetworkConditionsSelector._networkConditionsPresets;        for (var i = 0; i < presets.length; ++i) {            var preset = presets[i];            var throughputInKbps = preset.value.throughput / (1024 / 8);            var isThrottling = (throughputInKbps > 0) || preset.value.latency;            var option;            if (!isThrottling) {                option = new Option(preset.title,preset.title);            } else {                var throughputText = (throughputInKbps < 1024) ? WebInspector.UIString("%d Kbps", throughputInKbps) : WebInspector.UIString("%d Mbps", (throughputInKbps / 1024) | 0);                var title = WebInspector.UIString("%s (%s %dms RTT)", preset.title, throughputText, preset.value.latency);                option = new Option(title,preset.title);                option.title = WebInspector.UIString("Maximum download throughput: %s.\r\nMinimum round-trip time: %dms.", throughputText, preset.value.latency);            }            option.settingValue = preset.value;            this._selectElement.appendChild(option);        }    },    _optionSelected: function()     {        this._setting.removeChangeListener(this._settingChanged, this);        this._setting.set(this._selectElement.options[this._selectElement.selectedIndex].settingValue);        this._setting.addChangeListener(this._settingChanged, this);    },    _settingChanged: function()     {        var value = this._setting.get();        var options = this._selectElement.options;        for (var index = 0; index < options.length; ++index) {            var option = options[index];            if (option.settingValue.throughput === value.throughput && option.settingValue.latency === value.latency)                this._selectElement.selectedIndex = index;        }    }};WebInspector.ObjectPopoverHelper = function(panelElement, getAnchor, queryObject, onHide, disableOnClick) {    WebInspector.PopoverHelper.call(this, panelElement, getAnchor, this._showObjectPopover.bind(this), this._onHideObjectPopover.bind(this), disableOnClick);    this._queryObject = queryObject;    this._onHideCallback = onHide;    this._popoverObjectGroup = "popover";    panelElement.addEventListener("scroll", this.hidePopover.bind(this), true);};WebInspector.ObjectPopoverHelper.MaxPopoverTextLength = 10000;WebInspector.ObjectPopoverHelper.prototype = {    _showObjectPopover: function(element, popover)     {        function didGetFunctionProperties(funcObject, popoverContentElement, anchorElement, properties, internalProperties)         {            if (internalProperties) {                for (var i = 0; i < internalProperties.length; i++) {                    if (internalProperties[i].name === "[[TargetFunction]]") {                        funcObject = internalProperties[i].value;                        break;                    }                }            }            funcObject.functionDetails(didGetFunctionDetails.bind(this, popoverContentElement, anchorElement));        }        function didGetFunctionDetails(popoverContentElement, anchorElement, response)         {            if (!response || popover.disposed)                return;            var container = createElementWithClass("div", "object-popover-container");            var title = container.createChild("div", "function-popover-title source-code");            var functionName = title.createChild("span", "function-name");            functionName.textContent = WebInspector.beautifyFunctionName(response.functionName);            var rawLocation = response.location;            var sourceURL = response.sourceURL;            if (rawLocation && sourceURL) {                var link = this._lazyLinkifier().linkifyRawLocation(rawLocation, sourceURL, "function-location-link");                title.appendChild(link);            }            container.appendChild(popoverContentElement);            popover.showForAnchor(container, anchorElement);        }        function didGetGeneratorObjectDetails(response)         {            if (!response || popover.disposed)                return;            var rawLocation = response.location;            var sourceURL = response.sourceURL;            if (rawLocation && sourceURL) {                var link = this._lazyLinkifier().linkifyRawLocation(rawLocation, sourceURL, "function-location-link");                this._titleElement.appendChild(link);            }        }        function didQueryObject(result, wasThrown, anchorOverride)         {            if (popover.disposed)                return;            if (wasThrown) {                this.hidePopover();                return;            }            this._objectTarget = result.target();            var anchorElement = anchorOverride || element;            var description = result.description.trimEnd(WebInspector.ObjectPopoverHelper.MaxPopoverTextLength);            var popoverContentElement = null ;            if (result.type !== "object") {                popoverContentElement = createElement("span");                popoverContentElement.appendChild(WebInspector.Widget.createStyleElement("components/objectValue.css"));                var valueElement = popoverContentElement.createChild("span", "monospace object-value-" + result.type);                valueElement.style.whiteSpace = "pre";                if (result.type === "string")                    valueElement.createTextChildren("\"", description, "\"");                else if (result.type === "function")                    WebInspector.ObjectPropertiesSection.formatObjectAsFunction(result, valueElement, true);                else                    valueElement.textContent = description;                if (result.type === "function") {                    result.getOwnProperties(didGetFunctionProperties.bind(this, result, popoverContentElement, anchorElement));                    return;                }                popover.showForAnchor(popoverContentElement, anchorElement);            } else {                if (result.subtype === "node") {                    WebInspector.DOMModel.highlightObjectAsDOMNode(result);                    this._resultHighlightedAsDOM = true;                }                if (result.customPreview()) {                    var customPreviewComponent = new WebInspector.CustomPreviewComponent(result);                    customPreviewComponent.expandIfPossible();                    popoverContentElement = customPreviewComponent.element;                } else {                    popoverContentElement = createElement("div");                    this._titleElement = popoverContentElement.createChild("div", "monospace");                    this._titleElement.createChild("span", "source-frame-popover-title").textContent = description;                    var section = new WebInspector.ObjectPropertiesSection(result,"");                    section.element.classList.add("source-frame-popover-tree");                    section.titleLessMode();                    popoverContentElement.appendChild(section.element);                    if (result.subtype === "generator")                        result.generatorObjectDetails(didGetGeneratorObjectDetails.bind(this));                }                var popoverWidth = 300;                var popoverHeight = 250;                popover.showForAnchor(popoverContentElement, anchorElement, popoverWidth, popoverHeight);            }        }        this._queryObject(element, didQueryObject.bind(this), this._popoverObjectGroup);    },    _onHideObjectPopover: function()     {        if (this._resultHighlightedAsDOM) {            WebInspector.DOMModel.hideDOMNodeHighlight();            delete this._resultHighlightedAsDOM;        }        if (this._linkifier) {            this._linkifier.dispose();            delete this._linkifier;        }        if (this._onHideCallback)            this._onHideCallback();        if (this._objectTarget) {            this._objectTarget.runtimeAgent().releaseObjectGroup(this._popoverObjectGroup);            delete this._objectTarget;        }    },    _lazyLinkifier: function()     {        if (!this._linkifier)            this._linkifier = new WebInspector.Linkifier();        return this._linkifier;    },    __proto__: WebInspector.PopoverHelper.prototype};WebInspector.ObjectPropertiesSection = function(object, title, emptyPlaceholder, ignoreHasOwnProperty, extraProperties) {    this._object = object;    this._editable = true;    TreeOutlineInShadow.call(this);    this.setFocusable(false);    this._objectTreeElement = new WebInspector.ObjectPropertiesSection.RootElement(object,emptyPlaceholder,ignoreHasOwnProperty,extraProperties);    this.appendChild(this._objectTreeElement);    if (typeof title === "string" || !title)        this.element.createChild("span").textContent = title || "";    else        this.element.appendChild(title);    this.element._section = this;    this.registerRequiredCSS("components/objectValue.css");    this.registerRequiredCSS("components/objectPropertiesSection.css");    this.rootElement().childrenListElement.classList.add("source-code", "object-properties-section")}WebInspector.ObjectPropertiesSection._arrayLoadThreshold = 100;WebInspector.ObjectPropertiesSection.defaultObjectPresentation = function(object, skipProto) {    var componentRoot = createElementWithClass("span", "source-code");    var shadowRoot = WebInspector.createShadowRootWithCoreStyles(componentRoot);    shadowRoot.appendChild(WebInspector.Widget.createStyleElement("components/objectValue.css"));    shadowRoot.appendChild(WebInspector.ObjectPropertiesSection.createValueElement(object, false));    if (!object.hasChildren)        return componentRoot;    var objectPropertiesSection = new WebInspector.ObjectPropertiesSection(object,componentRoot);    objectPropertiesSection.editable = false;    if (skipProto)        objectPropertiesSection.skipProto();    return objectPropertiesSection.element;}WebInspector.ObjectPropertiesSection.prototype = {    skipProto: function()     {        this._skipProto = true;    },    expand: function()     {        this._objectTreeElement.expand();    },    objectTreeElement: function()     {        return this._objectTreeElement;    },    enableContextMenu: function()     {        this.element.addEventListener("contextmenu", this._contextMenuEventFired.bind(this), false);    },    _contextMenuEventFired: function(event)     {        var contextMenu = new WebInspector.ContextMenu(event);        contextMenu.appendApplicableItems(this._object);        contextMenu.show();    },    titleLessMode: function()     {        this._objectTreeElement.listItemElement.classList.add("hidden");        this._objectTreeElement.childrenListElement.classList.add("title-less-mode");        this._objectTreeElement.expand();    },    __proto__: TreeOutlineInShadow.prototype}WebInspector.ObjectPropertiesSection.CompareProperties = function(propertyA, propertyB) {    var a = propertyA.name;    var b = propertyB.name;    if (a === "__proto__")        return 1;    if (b === "__proto__")        return -1;    if (propertyA.symbol && !propertyB.symbol)        return 1;    if (propertyB.symbol && !propertyA.symbol)        return -1;    return String.naturalOrderComparator(a, b);}WebInspector.ObjectPropertiesSection.RootElement = function(object, emptyPlaceholder, ignoreHasOwnProperty, extraProperties) {    this._object = object;    this._extraProperties = extraProperties || [];    this._ignoreHasOwnProperty = !!ignoreHasOwnProperty;    this._emptyPlaceholder = emptyPlaceholder;    var contentElement = createElement("content");    TreeElement.call(this, contentElement);    this.setExpandable(true);    this.selectable = false;    this.toggleOnClick = true;}WebInspector.ObjectPropertiesSection.RootElement.prototype = {    onexpand: function()     {        if (this.treeOutline)            this.treeOutline.element.classList.add("expanded");    },    oncollapse: function()     {        if (this.treeOutline)            this.treeOutline.element.classList.remove("expanded");    },    ondblclick: function(e)     {        return true;    },    onpopulate: function()     {        WebInspector.ObjectPropertyTreeElement._populate(this, this._object, !!this.treeOutline._skipProto, this._emptyPlaceholder, this._ignoreHasOwnProperty, this._extraProperties);    },    __proto__: TreeElement.prototype}WebInspector.ObjectPropertyTreeElement = function(property) {    this.property = property;    TreeElement.call(this);    this.toggleOnClick = true;    this.selectable = false;}WebInspector.ObjectPropertyTreeElement.prototype = {    onpopulate: function()     {        var propertyValue = (this.property.value);        console.assert(propertyValue);        var skipProto = this.treeOutline ? this.treeOutline._skipProto : true;        WebInspector.ObjectPropertyTreeElement._populate(this, propertyValue, skipProto);    },    ondblclick: function(event)     {        var editableElement = this.valueElement;        if (!this.property.value.customPreview() && (this.property.writable || this.property.setter) && event.target.isSelfOrDescendant(editableElement))            this._startEditing();        return false;    },    onattach: function()     {        this.update();        if (this.property.value)            this.setExpandable(!this.property.value.customPreview() && this.property.value.hasChildren && !this.property.wasThrown);    },    update: function()     {        this.nameElement = WebInspector.ObjectPropertiesSection.createNameElement(this.property.name);        if (!this.property.enumerable)            this.nameElement.classList.add("object-properties-section-dimmed");        if (this.property.isAccessorProperty())            this.nameElement.classList.add("properties-accessor-property-name");        if (this.property.symbol)            this.nameElement.addEventListener("contextmenu", this._contextMenuFired.bind(this, this.property.symbol), false);        var separatorElement = createElementWithClass("span", "object-properties-section-separator");        separatorElement.textContent = ": ";        if (this.property.value) {            this.valueElement = WebInspector.ObjectPropertiesSection.createValueElementWithCustomSupport(this.property.value, this.property.wasThrown, this.listItemElement);            this.valueElement.addEventListener("contextmenu", this._contextMenuFired.bind(this, this.property.value), false);        } else if (this.property.getter) {            this.valueElement = WebInspector.ObjectPropertyTreeElement.createRemoteObjectAccessorPropertySpan(this.property.parentObject, [this.property.name], this._onInvokeGetterClick.bind(this));        } else {            this.valueElement = createElementWithClass("span", "object-value-undefined");            this.valueElement.textContent = WebInspector.UIString("<unreadable>");            this.valueElement.title = WebInspector.UIString("No property getter");        }        this.listItemElement.removeChildren();        this.listItemElement.appendChildren(this.nameElement, separatorElement, this.valueElement);    },    _contextMenuFired: function(value, event)     {        var contextMenu = new WebInspector.ContextMenu(event);        contextMenu.appendApplicableItems(value);        contextMenu.show();    },    _startEditing: function()     {        if (this._prompt || !this.treeOutline._editable || this._readOnly)            return;        this._editableDiv = this.listItemElement.createChild("span");        var text = this.property.value.description;        if (this.property.value.type === "string" && typeof text === "string")            text = "\"" + text + "\"";        this._editableDiv.setTextContentTruncatedIfNeeded(text, WebInspector.UIString("<string is too large to edit>"));        var originalContent = this._editableDiv.textContent;        this.valueElement.classList.add("hidden");        this.setExpandable(false);        this.listItemElement.classList.add("editing-sub-part");        this._prompt = new WebInspector.ObjectPropertyPrompt();        var proxyElement = this._prompt.attachAndStartEditing(this._editableDiv, this._editingCommitted.bind(this, originalContent));        this.listItemElement.getComponentSelection().setBaseAndExtent(this._editableDiv, 0, this._editableDiv, 1);        proxyElement.addEventListener("keydown", this._promptKeyDown.bind(this, originalContent), false);    },    _editingEnded: function()     {        this._prompt.detach();        delete this._prompt;        this._editableDiv.remove();        this.setExpandable(this.property.value.hasChildren && !this.property.wasThrown);        this.listItemElement.scrollLeft = 0;        this.listItemElement.classList.remove("editing-sub-part");    },    _editingCancelled: function()     {        this.valueElement.classList.remove("hidden");        this._editingEnded();    },    _editingCommitted: function(originalContent)     {        var userInput = this._prompt.text();        if (userInput === originalContent) {            this._editingCancelled();            return;        }        this._editingEnded();        this._applyExpression(userInput);    },    _promptKeyDown: function(originalContent, event)     {        if (isEnterKey(event)) {            event.consume(true);            this._editingCommitted(originalContent);            return;        }        if (event.keyIdentifier === "U+001B") {            event.consume();            this._editingCancelled();            return;        }    },    _applyExpression: function(expression)     {        var property = WebInspector.RemoteObject.toCallArgument(this.property.symbol || this.property.name);        expression = expression.trim();        if (expression)            this.property.parentObject.setPropertyValue(property, expression, callback.bind(this));        else            this.property.parentObject.deleteProperty(property, callback.bind(this));        function callback(error)         {            if (error) {                this.update();                return;            }            if (!expression) {                this.parent.removeChild(this);            } else {                var parent = this.parent;                parent.invalidateChildren();                parent.expand();            }        }        ;    },    propertyPath: function()     {        if (this._cachedPropertyPath)            return this._cachedPropertyPath;        var current = this;        var result;        do {            if (current.property) {                if (result)                    result = current.property.name + "." + result;                else                    result = current.property.name;            }            current = current.parent;        } while (current && !current.root);this._cachedPropertyPath = result;        return result;    },    _onInvokeGetterClick: function(result, wasThrown)     {        if (!result)            return;        this.property.value = result;        this.property.wasThrown = wasThrown;        this.update();        this.invalidateChildren();    },    __proto__: TreeElement.prototype}WebInspector.ObjectPropertyTreeElement._populate = function(treeElement, value, skipProto, emptyPlaceholder, flattenProtoChain, extraProperties) {    if (value.arrayLength() > WebInspector.ObjectPropertiesSection._arrayLoadThreshold) {        treeElement.removeChildren();        WebInspector.ArrayGroupingTreeElement._populateArray(treeElement, value, 0, value.arrayLength() - 1);        return;    }    function callback(properties, internalProperties)     {        treeElement.removeChildren();        if (!properties)            return;        extraProperties = extraProperties || [];        for (var i = 0; i < extraProperties.length; ++i)            properties.push(extraProperties[i]);        WebInspector.ObjectPropertyTreeElement.populateWithProperties(treeElement, properties, internalProperties, skipProto, value, emptyPlaceholder);    }    if (flattenProtoChain)        value.getAllProperties(false, callback);    else        WebInspector.RemoteObject.loadFromObjectPerProto(value, callback);}WebInspector.ObjectPropertyTreeElement.populateWithProperties = function(treeNode, properties, internalProperties, skipProto, value, emptyPlaceholder) {    properties.sort(WebInspector.ObjectPropertiesSection.CompareProperties);    for (var i = 0; i < properties.length; ++i) {        var property = properties[i];        if (skipProto && property.name === "__proto__")            continue;if (property.isAccessorProperty()) {            if (property.name !== "__proto__" && property.getter) {                property.parentObject = value;                treeNode.appendChild(new WebInspector.ObjectPropertyTreeElement(property));            }            if (property.isOwn) {                if (property.getter) {                    var getterProperty = new WebInspector.RemoteObjectProperty("get " + property.name,property.getter);                    getterProperty.parentObject = value;                    treeNode.appendChild(new WebInspector.ObjectPropertyTreeElement(getterProperty));                }                if (property.setter) {                    var setterProperty = new WebInspector.RemoteObjectProperty("set " + property.name,property.setter);                    setterProperty.parentObject = value;                    treeNode.appendChild(new WebInspector.ObjectPropertyTreeElement(setterProperty));                }            }        } else {            property.parentObject = value;            treeNode.appendChild(new WebInspector.ObjectPropertyTreeElement(property));        }    }    if (internalProperties) {        for (var i = 0; i < internalProperties.length; i++) {            internalProperties[i].parentObject = value;            treeNode.appendChild(new WebInspector.ObjectPropertyTreeElement(internalProperties[i]));        }    }    if (value && value.type === "function") {        var hasTargetFunction = false;        if (internalProperties) {            for (var i = 0; i < internalProperties.length; i++) {                if (internalProperties[i].name == "[[TargetFunction]]") {                    hasTargetFunction = true;                    break;                }            }        }        if (!hasTargetFunction)            treeNode.appendChild(new WebInspector.FunctionScopeMainTreeElement(value));    }    if (value && value.type === "object" && (value.subtype === "map" || value.subtype === "set" || value.subtype === "iterator"))        treeNode.appendChild(new WebInspector.CollectionEntriesMainTreeElement(value));    WebInspector.ObjectPropertyTreeElement._appendEmptyPlaceholderIfNeeded(treeNode, emptyPlaceholder);}WebInspector.ObjectPropertyTreeElement._appendEmptyPlaceholderIfNeeded = function(treeNode, emptyPlaceholder) {    if (treeNode.childCount())        return;    var title = createElementWithClass("div", "info");    title.textContent = emptyPlaceholder || WebInspector.UIString("No Properties");    var infoElement = new TreeElement(title);    treeNode.appendChild(infoElement);}WebInspector.ObjectPropertyTreeElement.createRemoteObjectAccessorPropertySpan = function(object, propertyPath, callback) {    var rootElement = createElement("span");    var element = rootElement.createChild("span");    element.textContent = WebInspector.UIString("(...)");    if (!object)        return rootElement;    element.classList.add("object-value-calculate-value-button");    element.title = WebInspector.UIString("Invoke property getter");    element.addEventListener("click", onInvokeGetterClick, false);    function onInvokeGetterClick(event)     {        event.consume();        object.getProperty(propertyPath, callback);    }    return rootElement;}WebInspector.FunctionScopeMainTreeElement = function(remoteObject) {    TreeElement.call(this, "<function scope>", true);    this.toggleOnClick = true;    this.selectable = false;    this._remoteObject = remoteObject;}WebInspector.FunctionScopeMainTreeElement.prototype = {    onpopulate: function()     {        function didGetDetails(response)         {            if (!response)                return;            this.removeChildren();            var scopeChain = response.scopeChain || [];            for (var i = 0; i < scopeChain.length; ++i) {                var scope = scopeChain[i];                var title = null ;                var isTrueObject = false;                switch (scope.type) {                case DebuggerAgent.ScopeType.Local:                    title = WebInspector.UIString("Local");                    break;                case DebuggerAgent.ScopeType.Closure:                    title = WebInspector.UIString("Closure");                    break;                case DebuggerAgent.ScopeType.Catch:                    title = WebInspector.UIString("Catch");                    break;                case DebuggerAgent.ScopeType.Block:                    title = WebInspector.UIString("Block");                    break;                case DebuggerAgent.ScopeType.Script:                    title = WebInspector.UIString("Script");                    break;                case DebuggerAgent.ScopeType.With:                    title = WebInspector.UIString("With Block");                    isTrueObject = true;                    break;                case DebuggerAgent.ScopeType.Global:                    title = WebInspector.UIString("Global");                    isTrueObject = true;                    break;                default:                    console.error("Unknown scope type: " + scope.type);                    continue;                }                var runtimeModel = this._remoteObject.target().runtimeModel;                if (isTrueObject) {                    var remoteObject = runtimeModel.createRemoteObject(scope.object);                    var property = new WebInspector.RemoteObjectProperty(title,remoteObject);                    property.writable = false;                    property.parentObject = null ;                    this.appendChild(new WebInspector.ObjectPropertyTreeElement(property));                } else {                    var scopeRef = new WebInspector.ScopeRef(i,undefined,this._remoteObject.objectId);                    var remoteObject = runtimeModel.createScopeRemoteObject(scope.object, scopeRef);                    var scopeTreeElement = new WebInspector.ScopeTreeElement(title,remoteObject);                    this.appendChild(scopeTreeElement);                }            }            WebInspector.ObjectPropertyTreeElement._appendEmptyPlaceholderIfNeeded(this, WebInspector.UIString("No Scopes"));        }        this._remoteObject.functionDetails(didGetDetails.bind(this));    },    __proto__: TreeElement.prototype}WebInspector.CollectionEntriesMainTreeElement = function(remoteObject) {    TreeElement.call(this, "<entries>", true);    this.toggleOnClick = true;    this.selectable = false;    this._remoteObject = remoteObject;    this.expand();}WebInspector.CollectionEntriesMainTreeElement.prototype = {    onpopulate: function()     {        function didGetCollectionEntries(entries)         {            if (!entries)                return;            this.removeChildren();            var entriesLocalObject = [];            var runtimeModel = this._remoteObject.target().runtimeModel;            for (var i = 0; i < entries.length; ++i) {                var entry = entries[i];                if (entry.key) {                    entriesLocalObject.push(new WebInspector.MapEntryLocalJSONObject({                        key: runtimeModel.createRemoteObject(entry.key),                        value: runtimeModel.createRemoteObject(entry.value)                    }));                } else {                    entriesLocalObject.push(runtimeModel.createRemoteObject(entry.value));                }            }            WebInspector.ObjectPropertyTreeElement._populate(this, WebInspector.RemoteObject.fromLocalObject(entriesLocalObject), true, WebInspector.UIString("No Entries"));            this.title = "<entries>[" + entriesLocalObject.length + "]";        }        this._remoteObject.collectionEntries(didGetCollectionEntries.bind(this));    },    __proto__: TreeElement.prototype}WebInspector.ScopeTreeElement = function(title, remoteObject) {    TreeElement.call(this, title, true);    this.toggleOnClick = true;    this.selectable = false;    this._remoteObject = remoteObject;}WebInspector.ScopeTreeElement.prototype = {    onpopulate: function()     {        WebInspector.ObjectPropertyTreeElement._populate(this, this._remoteObject, false);    },    __proto__: TreeElement.prototype}WebInspector.ArrayGroupingTreeElement = function(object, fromIndex, toIndex, propertyCount) {    TreeElement.call(this, String.sprintf("[%d \u2026 %d]", fromIndex, toIndex), true);    this.toggleOnClick = true;    this.selectable = false;    this._fromIndex = fromIndex;    this._toIndex = toIndex;    this._object = object;    this._readOnly = true;    this._propertyCount = propertyCount;}WebInspector.ArrayGroupingTreeElement._bucketThreshold = 100;WebInspector.ArrayGroupingTreeElement._sparseIterationThreshold = 250000;WebInspector.ArrayGroupingTreeElement._getOwnPropertyNamesThreshold = 500000;WebInspector.ArrayGroupingTreeElement._populateArray = function(treeNode, object, fromIndex, toIndex) {    WebInspector.ArrayGroupingTreeElement._populateRanges(treeNode, object, fromIndex, toIndex, true);}WebInspector.ArrayGroupingTreeElement._populateRanges = function(treeNode, object, fromIndex, toIndex, topLevel) {    object.callFunctionJSON(packRanges, [{        value: fromIndex    }, {        value: toIndex    }, {        value: WebInspector.ArrayGroupingTreeElement._bucketThreshold    }, {        value: WebInspector.ArrayGroupingTreeElement._sparseIterationThreshold    }, {        value: WebInspector.ArrayGroupingTreeElement._getOwnPropertyNamesThreshold    }], callback);    function packRanges(fromIndex, toIndex, bucketThreshold, sparseIterationThreshold, getOwnPropertyNamesThreshold)     {        var ownPropertyNames = null ;        var consecutiveRange = (toIndex - fromIndex >= sparseIterationThreshold) && ArrayBuffer.isView(this);        var skipGetOwnPropertyNames = consecutiveRange && (toIndex - fromIndex >= getOwnPropertyNamesThreshold);        function *arrayIndexes(object)         {            if (toIndex - fromIndex < sparseIterationThreshold) {                for (var i = fromIndex; i <= toIndex; ++i) {                    if (i in object)                        yield i;                }            } else {                ownPropertyNames = ownPropertyNames || Object.getOwnPropertyNames(object);                for (var i = 0; i < ownPropertyNames.length; ++i) {                    var name = ownPropertyNames[i];                    var index = name >>> 0;                    if (("" + index) === name && fromIndex <= index && index <= toIndex)                        yield index;                }            }        }        var count = 0;        if (consecutiveRange) {            count = toIndex - fromIndex + 1;        } else {            for (var i of arrayIndexes(this))                ++count;        }        var bucketSize = count;        if (count <= bucketThreshold)            bucketSize = count;        else            bucketSize = Math.pow(bucketThreshold, Math.ceil(Math.log(count) / Math.log(bucketThreshold)) - 1);        var ranges = [];        if (consecutiveRange) {            for (var i = fromIndex; i <= toIndex; i += bucketSize) {                var groupStart = i;                var groupEnd = groupStart + bucketSize - 1;                if (groupEnd > toIndex)                    groupEnd = toIndex;                ranges.push([groupStart, groupEnd, groupEnd - groupStart + 1]);            }        } else {            count = 0;            var groupStart = -1;            var groupEnd = 0;            for (var i of arrayIndexes(this)) {                if (groupStart === -1)                    groupStart = i;                groupEnd = i;                if (++count === bucketSize) {                    ranges.push([groupStart, groupEnd, count]);                    count = 0;                    groupStart = -1;                }            }            if (count > 0)                ranges.push([groupStart, groupEnd, count]);        }        return {            ranges: ranges,            skipGetOwnPropertyNames: skipGetOwnPropertyNames        };    }    function callback(result)     {        if (!result)            return;        var ranges = (result.ranges);        if (ranges.length == 1) {            WebInspector.ArrayGroupingTreeElement._populateAsFragment(treeNode, object, ranges[0][0], ranges[0][1]);        } else {            for (var i = 0; i < ranges.length; ++i) {                var fromIndex = ranges[i][0];                var toIndex = ranges[i][1];                var count = ranges[i][2];                if (fromIndex == toIndex)                    WebInspector.ArrayGroupingTreeElement._populateAsFragment(treeNode, object, fromIndex, toIndex);                else                    treeNode.appendChild(new WebInspector.ArrayGroupingTreeElement(object,fromIndex,toIndex,count));            }        }        if (topLevel)            WebInspector.ArrayGroupingTreeElement._populateNonIndexProperties(treeNode, object, result.skipGetOwnPropertyNames);    }}WebInspector.ArrayGroupingTreeElement._populateAsFragment = function(treeNode, object, fromIndex, toIndex) {    object.callFunction(buildArrayFragment, [{        value: fromIndex    }, {        value: toIndex    }, {        value: WebInspector.ArrayGroupingTreeElement._sparseIterationThreshold    }], processArrayFragment.bind(this));    function buildArrayFragment(fromIndex, toIndex, sparseIterationThreshold)     {        var result = Object.create(null );        if (toIndex - fromIndex < sparseIterationThreshold) {            for (var i = fromIndex; i <= toIndex; ++i) {                if (i in this)                    result[i] = this[i];            }        } else {            var ownPropertyNames = Object.getOwnPropertyNames(this);            for (var i = 0; i < ownPropertyNames.length; ++i) {                var name = ownPropertyNames[i];                var index = name >>> 0;                if (String(index) === name && fromIndex <= index && index <= toIndex)                    result[index] = this[index];            }        }        return result;    }    function processArrayFragment(arrayFragment, wasThrown)     {        if (!arrayFragment || wasThrown)            return;        arrayFragment.getAllProperties(false, processProperties.bind(this));    }    function processProperties(properties, internalProperties)     {        if (!properties)            return;        properties.sort(WebInspector.ObjectPropertiesSection.CompareProperties);        for (var i = 0; i < properties.length; ++i) {            properties[i].parentObject = this._object;            var childTreeElement = new WebInspector.ObjectPropertyTreeElement(properties[i]);            childTreeElement._readOnly = true;            treeNode.appendChild(childTreeElement);        }    }}WebInspector.ArrayGroupingTreeElement._populateNonIndexProperties = function(treeNode, object, skipGetOwnPropertyNames) {    object.callFunction(buildObjectFragment, [{        value: skipGetOwnPropertyNames    }], processObjectFragment.bind(this));    function buildObjectFragment(skipGetOwnPropertyNames)     {        var result = {            __proto__: this.__proto__        };        if (skipGetOwnPropertyNames)            return result;        var names = Object.getOwnPropertyNames(this);        for (var i = 0; i < names.length; ++i) {            var name = names[i];            if (String(name >>> 0) === name && name >>> 0 !== 0xffffffff)                continue;var descriptor = Object.getOwnPropertyDescriptor(this, name);            if (descriptor)                Object.defineProperty(result, name, descriptor);        }        return result;    }    function processObjectFragment(arrayFragment, wasThrown)     {        if (!arrayFragment || wasThrown)            return;        arrayFragment.getOwnProperties(processProperties.bind(this));    }    function processProperties(properties, internalProperties)     {        if (!properties)            return;        properties.sort(WebInspector.ObjectPropertiesSection.CompareProperties);        for (var i = 0; i < properties.length; ++i) {            properties[i].parentObject = this._object;            var childTreeElement = new WebInspector.ObjectPropertyTreeElement(properties[i]);            childTreeElement._readOnly = true;            treeNode.appendChild(childTreeElement);        }    }}WebInspector.ArrayGroupingTreeElement.prototype = {    onpopulate: function()     {        if (this._propertyCount >= WebInspector.ArrayGroupingTreeElement._bucketThreshold) {            WebInspector.ArrayGroupingTreeElement._populateRanges(this, this._object, this._fromIndex, this._toIndex, false);            return;        }        WebInspector.ArrayGroupingTreeElement._populateAsFragment(this, this._object, this._fromIndex, this._toIndex);    },    onattach: function()     {        this.listItemElement.classList.add("object-properties-section-name");    },    __proto__: TreeElement.prototype}WebInspector.ObjectPropertyPrompt = function() {    WebInspector.TextPrompt.call(this, WebInspector.ExecutionContextSelector.completionsForTextPromptInCurrentContext);    this.setSuggestBoxEnabled(true);}WebInspector.ObjectPropertyPrompt.prototype = {    __proto__: WebInspector.TextPrompt.prototype}WebInspector.ObjectPropertiesSection.createNameElement = function(name) {    var nameElement = createElementWithClass("span", "name");    if (/^\s|\s$|^$|\n/.test(name))        nameElement.createTextChildren("\"", name.replace(/\n/g, "\u21B5"), "\"");    else        nameElement.textContent = name;    return nameElement;}WebInspector.ObjectPropertiesSection.valueTextForFunctionDescription = function(description) {    var matches = /function\s([^)]*)/.exec(description);    if (!matches) {        matches = /[^(]*(\([^)]*)/.exec(description);    }    var match = matches ? matches[1] : null ;    return match ? match.replace(/\n/g, " ") + ")" : (description || "");}WebInspector.ObjectPropertiesSection.createValueElementWithCustomSupport = function(value, wasThrown, parentElement) {    if (value.customPreview()) {        var result = (new WebInspector.CustomPreviewComponent(value)).element;        result.classList.add("object-properties-section-custom-section");        return result    }    return WebInspector.ObjectPropertiesSection.createValueElement(value, wasThrown, parentElement);}WebInspector.ObjectPropertiesSection.createValueElement = function(value, wasThrown, parentElement) {    var valueElement = createElementWithClass("span", "value");    var type = value.type;    var subtype = value.subtype;    var description = value.description;    var prefix;    var valueText;    var suffix;    if (wasThrown) {        prefix = "[Exception: ";        valueText = description;        suffix = "]";    } else if (type === "string" && typeof description === "string") {        prefix = "\"";        valueText = description.replace(/\n/g, "\u21B5");        suffix = "\"";    } else if (type === "function") {        valueText = WebInspector.ObjectPropertiesSection.valueTextForFunctionDescription(description);    } else if (type !== "object" || subtype !== "node") {        valueText = description;    }    if (type !== "number" || valueText.indexOf("e") === -1) {        valueElement.setTextContentTruncatedIfNeeded(valueText || "");        if (prefix)            valueElement.insertBefore(createTextNode(prefix), valueElement.firstChild);        if (suffix)            valueElement.createTextChild(suffix);    } else {        var numberParts = valueText.split("e");        var mantissa = valueElement.createChild("span", "object-value-scientific-notation-mantissa");        mantissa.textContent = numberParts[0];        var exponent = valueElement.createChild("span", "object-value-scientific-notation-exponent");        exponent.textContent = "e" + numberParts[1];        valueElement.classList.add("object-value-scientific-notation-number");        if (parentElement)            parentElement.classList.add("hbox");    }    if (wasThrown)        valueElement.classList.add("error");    if (subtype || type)        valueElement.classList.add("object-value-" + (subtype || type));    if (type === "object" && subtype === "node" && description) {        WebInspector.DOMPresentationUtils.createSpansForNodeTitle(valueElement, description);        valueElement.addEventListener("click", mouseClick, false);        valueElement.addEventListener("mousemove", mouseMove, false);        valueElement.addEventListener("mouseleave", mouseLeave, false);    } else {        valueElement.title = description || "";    }    function mouseMove()     {        WebInspector.DOMModel.highlightObjectAsDOMNode(value);    }    function mouseLeave()     {        WebInspector.DOMModel.hideDOMNodeHighlight();    }    function mouseClick(event)     {        WebInspector.Revealer.reveal(value);        event.consume(true);    }    return valueElement;}WebInspector.ObjectPropertiesSection.formatObjectAsFunction = function(func, element, linkify, includePreview) {    func.functionDetails(didGetDetails);    function didGetDetails(response)     {        if (!response) {            var valueText = WebInspector.ObjectPropertiesSection.valueTextForFunctionDescription(func.description);            element.createTextChild(valueText);            return;        }        if (linkify && response && response.location) {            var anchor = createElement("span");            element.classList.add("linkified");            element.appendChild(anchor);            element.addEventListener("click", WebInspector.Revealer.reveal.bind(WebInspector.Revealer, response.location, undefined));            element = anchor;        }        var text = func.description.substring(0, 200);        if (includePreview) {            element.textContent = text.replace(/^function /, "") + (func.description.length > 200 ? "\u2026" : "");            return;        }        self.runtime.instancePromise(WebInspector.TokenizerFactory).then(processTokens);        var params = null ;        var functionName = response ? response.functionName : "";        function processTokens(tokenizerFactory)         {            var tokenize = tokenizerFactory.createTokenizer("text/javascript");            tokenize(text, processToken);            element.textContent = (functionName || "anonymous") + "(" + (params || []).join(", ") + ")";        }        var doneProcessing = false;        function processToken(token, tokenType, column, newColumn)         {            if (!params && tokenType === "js-variable" && !functionName)                functionName = token;            doneProcessing = doneProcessing || token === ")";            if (doneProcessing)                return;            if (token === "(") {                params = [];                return;            }            if (params && tokenType === "js-def")                params.push(token);        }    }};WebInspector.RemoteObjectPreviewFormatter = function() {}WebInspector.RemoteObjectPreviewFormatter.prototype = {    appendObjectPreview: function(parentElement, preview)     {        var description = preview.description;        if (preview.type !== "object" || preview.subtype === "null") {            parentElement.appendChild(this.renderPropertyPreview(preview.type, preview.subtype, description));            return true;        }        if (description && preview.subtype !== "array") {            var text = preview.subtype ? description : this._abbreviateFullQualifiedClassName(description);            parentElement.createTextChildren(text, " ");        }        if (preview.entries)            return this._appendEntriesPreview(parentElement, preview);        return this._appendPropertiesPreview(parentElement, preview);    },    _abbreviateFullQualifiedClassName: function(description)     {        var abbreviatedDescription = description.split(".");        for (var i = 0; i < abbreviatedDescription.length - 1; ++i)            abbreviatedDescription[i] = abbreviatedDescription[i].trimMiddle(3);        return abbreviatedDescription.join(".");    },    _appendPropertiesPreview: function(parentElement, preview)     {        var isArray = preview.subtype === "array";        var arrayLength = WebInspector.RemoteObject.arrayLength(preview);        var properties = preview.properties;        if (isArray)            properties = properties.slice().stableSort(compareIndexesFirst);        function compareIndexesFirst(a, b)         {            var index1 = toArrayIndex(a.name);            var index2 = toArrayIndex(b.name);            if (index1 < 0)                return index2 < 0 ? 0 : 1;            return index2 < 0 ? -1 : index1 - index2;        }        function toArrayIndex(name)         {            var index = name >>> 0;            if (String(index) === name && index < arrayLength)                return index;            return -1;        }        parentElement.createTextChild(isArray ? "[" : "{");        for (var i = 0; i < properties.length; ++i) {            if (i > 0)                parentElement.createTextChild(", ");            var property = properties[i];            var name = property.name;            if (!isArray || name != i || i >= arrayLength) {                if (/^\s|\s$|^$|\n/.test(name))                    parentElement.createChild("span", "name").createTextChildren("\"", name.replace(/\n/g, "\u21B5"), "\"");                else                    parentElement.createChild("span", "name").textContent = name;                parentElement.createTextChild(": ");            }            parentElement.appendChild(this._renderPropertyPreviewOrAccessor([property]));        }        if (preview.overflow)            parentElement.createChild("span").textContent = "\u2026";        parentElement.createTextChild(isArray ? "]" : "}");        return preview.lossless;    },    _appendEntriesPreview: function(parentElement, preview)     {        var lossless = preview.lossless && !preview.properties.length;        parentElement.createTextChild("{");        for (var i = 0; i < preview.entries.length; ++i) {            if (i > 0)                parentElement.createTextChild(", ");            var entry = preview.entries[i];            if (entry.key) {                this.appendObjectPreview(parentElement, entry.key);                parentElement.createTextChild(" => ");            }            this.appendObjectPreview(parentElement, entry.value);        }        if (preview.overflow)            parentElement.createChild("span").textContent = "\u2026";        parentElement.createTextChild("}");        return lossless;    },    _renderPropertyPreviewOrAccessor: function(propertyPath)     {        var property = propertyPath.peekLast();        return this.renderPropertyPreview(property.type, (property.subtype), property.value);    },    renderPropertyPreview: function(type, subtype, description)     {        var span = createElementWithClass("span", "object-value-" + (subtype || type));        description = description || "";        if (type === "function") {            span.textContent = "function";            return span;        }        if (type === "object" && subtype === "node" && description) {            span.classList.add("object-value-preview-node");            WebInspector.DOMPresentationUtils.createSpansForNodeTitle(span, description);            return span;        }        if (type === "string") {            span.createTextChildren("\"", description.replace(/\n/g, "\u21B5"), "\"");            return span;        }        if (type === "object" && !subtype) {            span.textContent = this._abbreviateFullQualifiedClassName(description);            return span;        }        span.textContent = description;        return span;    }};WebInspector.ShortcutsScreen = function() {    this._sections = {};}WebInspector.ShortcutsScreen.prototype = {    section: function(name)     {        var section = this._sections[name];        if (!section)            this._sections[name] = section = new WebInspector.ShortcutsSection(name);        return section;    },    createShortcutsTabView: function()     {        var orderedSections = [];        for (var section in this._sections)            orderedSections.push(this._sections[section]);        function compareSections(a, b)         {            return a.order - b.order;        }        orderedSections.sort(compareSections);        var widget = new WebInspector.Widget();        widget.element.className = "settings-tab-container";        widget.element.createChild("header").createChild("h3").createTextChild(WebInspector.UIString("Shortcuts"));        var scrollPane = widget.element.createChild("div", "help-container-wrapper");        var container = scrollPane.createChild("div");        container.className = "help-content help-container";        for (var i = 0; i < orderedSections.length; ++i)            orderedSections[i].renderSection(container);        var note = scrollPane.createChild("p", "help-footnote");        note.appendChild(WebInspector.linkifyDocumentationURLAsNode("shortcuts", WebInspector.UIString("Full list of keyboard shortcuts and gestures")));        return widget;    }}WebInspector.shortcutsScreen;WebInspector.ShortcutsSection = function(name) {    this.name = name;    this._lines = ([]);    this.order = ++WebInspector.ShortcutsSection._sequenceNumber;};WebInspector.ShortcutsSection._sequenceNumber = 0;WebInspector.ShortcutsSection.prototype = {    addKey: function(key, description)     {        this._addLine(this._renderKey(key), description);    },    addRelatedKeys: function(keys, description)     {        this._addLine(this._renderSequence(keys, "/"), description);    },    addAlternateKeys: function(keys, description)     {        this._addLine(this._renderSequence(keys, WebInspector.UIString("or")), description);    },    _addLine: function(keyElement, description)     {        this._lines.push({            key: keyElement,            text: description        });    },    renderSection: function(container)     {        var parent = container.createChild("div", "help-block");        var headLine = parent.createChild("div", "help-line");        headLine.createChild("div", "help-key-cell");        headLine.createChild("div", "help-section-title help-cell").textContent = this.name;        for (var i = 0; i < this._lines.length; ++i) {            var line = parent.createChild("div", "help-line");            var keyCell = line.createChild("div", "help-key-cell");            keyCell.appendChild(this._lines[i].key);            keyCell.appendChild(this._createSpan("help-key-delimiter", ":"));            line.createChild("div", "help-cell").textContent = this._lines[i].text;        }    },    _renderSequence: function(sequence, delimiter)     {        var delimiterSpan = this._createSpan("help-key-delimiter", delimiter);        return this._joinNodes(sequence.map(this._renderKey.bind(this)), delimiterSpan);    },    _renderKey: function(key)     {        var keyName = key.name;        var plus = this._createSpan("help-combine-keys", "+");        return this._joinNodes(keyName.split(" + ").map(this._createSpan.bind(this, "help-key")), plus);    },    _createSpan: function(className, textContent)     {        var node = createElement("span");        node.className = className;        node.textContent = textContent;        return node;    },    _joinNodes: function(nodes, delimiter)     {        var result = createDocumentFragment();        for (var i = 0; i < nodes.length; ++i) {            if (i > 0)                result.appendChild(delimiter.cloneNode(true));            result.appendChild(nodes[i]);        }        return result;    }}WebInspector.ShortcutsScreen.registerShortcuts = function() {    var elementsSection = WebInspector.shortcutsScreen.section(WebInspector.UIString("Elements Panel"));    var navigate = WebInspector.ShortcutsScreen.ElementsPanelShortcuts.NavigateUp.concat(WebInspector.ShortcutsScreen.ElementsPanelShortcuts.NavigateDown);    elementsSection.addRelatedKeys(navigate, WebInspector.UIString("Navigate elements"));    var expandCollapse = WebInspector.ShortcutsScreen.ElementsPanelShortcuts.Expand.concat(WebInspector.ShortcutsScreen.ElementsPanelShortcuts.Collapse);    elementsSection.addRelatedKeys(expandCollapse, WebInspector.UIString("Expand/collapse"));    elementsSection.addAlternateKeys(WebInspector.ShortcutsScreen.ElementsPanelShortcuts.EditAttribute, WebInspector.UIString("Edit attribute"));    elementsSection.addAlternateKeys(WebInspector.ShortcutsScreen.ElementsPanelShortcuts.HideElement, WebInspector.UIString("Hide element"));    elementsSection.addAlternateKeys(WebInspector.ShortcutsScreen.ElementsPanelShortcuts.ToggleEditAsHTML, WebInspector.UIString("Toggle edit as HTML"));    var stylesPaneSection = WebInspector.shortcutsScreen.section(WebInspector.UIString("Styles Pane"));    var nextPreviousProperty = WebInspector.ShortcutsScreen.ElementsPanelShortcuts.NextProperty.concat(WebInspector.ShortcutsScreen.ElementsPanelShortcuts.PreviousProperty);    stylesPaneSection.addRelatedKeys(nextPreviousProperty, WebInspector.UIString("Next/previous property"));    stylesPaneSection.addRelatedKeys(WebInspector.ShortcutsScreen.ElementsPanelShortcuts.IncrementValue, WebInspector.UIString("Increment value"));    stylesPaneSection.addRelatedKeys(WebInspector.ShortcutsScreen.ElementsPanelShortcuts.DecrementValue, WebInspector.UIString("Decrement value"));    stylesPaneSection.addAlternateKeys(WebInspector.ShortcutsScreen.ElementsPanelShortcuts.IncrementBy10, WebInspector.UIString("Increment by %f", 10));    stylesPaneSection.addAlternateKeys(WebInspector.ShortcutsScreen.ElementsPanelShortcuts.DecrementBy10, WebInspector.UIString("Decrement by %f", 10));    stylesPaneSection.addAlternateKeys(WebInspector.ShortcutsScreen.ElementsPanelShortcuts.IncrementBy100, WebInspector.UIString("Increment by %f", 100));    stylesPaneSection.addAlternateKeys(WebInspector.ShortcutsScreen.ElementsPanelShortcuts.DecrementBy100, WebInspector.UIString("Decrement by %f", 100));    stylesPaneSection.addAlternateKeys(WebInspector.ShortcutsScreen.ElementsPanelShortcuts.IncrementBy01, WebInspector.UIString("Increment by %f", 0.1));    stylesPaneSection.addAlternateKeys(WebInspector.ShortcutsScreen.ElementsPanelShortcuts.DecrementBy01, WebInspector.UIString("Decrement by %f", 0.1));    var section = WebInspector.shortcutsScreen.section(WebInspector.UIString("Debugger"));    section.addAlternateKeys(WebInspector.shortcutRegistry.shortcutDescriptorsForAction("debugger.toggle-pause"), WebInspector.UIString("Pause/ Continue"));    section.addAlternateKeys(WebInspector.shortcutRegistry.shortcutDescriptorsForAction("debugger.step-over"), WebInspector.UIString("Step over"));    section.addAlternateKeys(WebInspector.shortcutRegistry.shortcutDescriptorsForAction("debugger.step-into"), WebInspector.UIString("Step into"));    section.addAlternateKeys(WebInspector.shortcutRegistry.shortcutDescriptorsForAction("debugger.step-out"), WebInspector.UIString("Step out"));    if (Runtime.experiments.isEnabled("stepIntoAsync"))        section.addAlternateKeys(WebInspector.shortcutRegistry.shortcutDescriptorsForAction("debugger.step-into"), WebInspector.UIString("Step into"));    var nextAndPrevFrameKeys = WebInspector.ShortcutsScreen.SourcesPanelShortcuts.NextCallFrame.concat(WebInspector.ShortcutsScreen.SourcesPanelShortcuts.PrevCallFrame);    section.addRelatedKeys(nextAndPrevFrameKeys, WebInspector.UIString("Next/previous call frame"));    section.addAlternateKeys(WebInspector.ShortcutsScreen.SourcesPanelShortcuts.EvaluateSelectionInConsole, WebInspector.UIString("Evaluate selection in console"));    section.addAlternateKeys(WebInspector.ShortcutsScreen.SourcesPanelShortcuts.AddSelectionToWatch, WebInspector.UIString("Add selection to watch"));    section.addAlternateKeys(WebInspector.ShortcutsScreen.SourcesPanelShortcuts.ToggleBreakpoint, WebInspector.UIString("Toggle breakpoint"));    section = WebInspector.shortcutsScreen.section(WebInspector.UIString("Text Editor"));    section.addAlternateKeys(WebInspector.ShortcutsScreen.SourcesPanelShortcuts.GoToMember, WebInspector.UIString("Go to member"));    section.addAlternateKeys(WebInspector.ShortcutsScreen.SourcesPanelShortcuts.ToggleAutocompletion, WebInspector.UIString("Autocompletion"));    section.addAlternateKeys(WebInspector.ShortcutsScreen.SourcesPanelShortcuts.GoToLine, WebInspector.UIString("Go to line"));    section.addAlternateKeys(WebInspector.ShortcutsScreen.SourcesPanelShortcuts.JumpToPreviousLocation, WebInspector.UIString("Jump to previous editing location"));    section.addAlternateKeys(WebInspector.ShortcutsScreen.SourcesPanelShortcuts.JumpToNextLocation, WebInspector.UIString("Jump to next editing location"));    section.addAlternateKeys(WebInspector.ShortcutsScreen.SourcesPanelShortcuts.ToggleComment, WebInspector.UIString("Toggle comment"));    section.addAlternateKeys(WebInspector.ShortcutsScreen.SourcesPanelShortcuts.IncreaseCSSUnitByOne, WebInspector.UIString("Increment CSS unit by 1"));    section.addAlternateKeys(WebInspector.ShortcutsScreen.SourcesPanelShortcuts.DecreaseCSSUnitByOne, WebInspector.UIString("Decrement CSS unit by 1"));    section.addAlternateKeys(WebInspector.ShortcutsScreen.SourcesPanelShortcuts.IncreaseCSSUnitByTen, WebInspector.UIString("Increment CSS unit by 10"));    section.addAlternateKeys(WebInspector.ShortcutsScreen.SourcesPanelShortcuts.DecreaseCSSUnitByTen, WebInspector.UIString("Decrement CSS unit by 10"));    section.addAlternateKeys(WebInspector.ShortcutsScreen.SourcesPanelShortcuts.SelectNextOccurrence, WebInspector.UIString("Select next occurrence"));    section.addAlternateKeys(WebInspector.ShortcutsScreen.SourcesPanelShortcuts.SoftUndo, WebInspector.UIString("Soft undo"));    section.addAlternateKeys(WebInspector.ShortcutsScreen.SourcesPanelShortcuts.GotoMatchingBracket, WebInspector.UIString("Go to matching bracket"));    section.addAlternateKeys(WebInspector.ShortcutsScreen.SourcesPanelShortcuts.CloseEditorTab, WebInspector.UIString("Close editor tab"));    section.addAlternateKeys(WebInspector.shortcutRegistry.shortcutDescriptorsForAction("sources.switch-file"), WebInspector.UIString("Switch between files with the same name and different extensions."));    section = WebInspector.shortcutsScreen.section(WebInspector.UIString("Timeline Panel"));    section.addAlternateKeys(WebInspector.ShortcutsScreen.TimelinePanelShortcuts.StartStopRecording, WebInspector.UIString("Start/stop recording"));    section.addAlternateKeys(WebInspector.ShortcutsScreen.TimelinePanelShortcuts.RecordPageReload, WebInspector.UIString("Record page reload"));    section.addAlternateKeys(WebInspector.ShortcutsScreen.TimelinePanelShortcuts.SaveToFile, WebInspector.UIString("Save timeline data"));    section.addAlternateKeys(WebInspector.ShortcutsScreen.TimelinePanelShortcuts.LoadFromFile, WebInspector.UIString("Load timeline data"));    section.addRelatedKeys(WebInspector.ShortcutsScreen.TimelinePanelShortcuts.JumpToPreviousFrame.concat(WebInspector.ShortcutsScreen.TimelinePanelShortcuts.JumpToNextFrame), WebInspector.UIString("Jump to previous/next frame"));    section = WebInspector.shortcutsScreen.section(WebInspector.UIString("Profiles Panel"));    section.addAlternateKeys(WebInspector.ShortcutsScreen.ProfilesPanelShortcuts.StartStopRecording, WebInspector.UIString("Start/stop recording"));    if (Runtime.experiments.isEnabled("layersPanel")) {        section = WebInspector.shortcutsScreen.section(WebInspector.UIString("Layers Panel"));        section.addAlternateKeys(WebInspector.ShortcutsScreen.LayersPanelShortcuts.ResetView, WebInspector.UIString("Reset view"));        section.addAlternateKeys(WebInspector.ShortcutsScreen.LayersPanelShortcuts.PanMode, WebInspector.UIString("Switch to pan mode"));        section.addAlternateKeys(WebInspector.ShortcutsScreen.LayersPanelShortcuts.RotateMode, WebInspector.UIString("Switch to rotate mode"));        section.addAlternateKeys(WebInspector.ShortcutsScreen.LayersPanelShortcuts.TogglePanRotate, WebInspector.UIString("Temporarily toggle pan/rotate mode while held"));        section.addAlternateKeys(WebInspector.ShortcutsScreen.LayersPanelShortcuts.ZoomIn, WebInspector.UIString("Zoom in"));        section.addAlternateKeys(WebInspector.ShortcutsScreen.LayersPanelShortcuts.ZoomOut, WebInspector.UIString("Zoom out"));        section.addRelatedKeys(WebInspector.ShortcutsScreen.LayersPanelShortcuts.Up.concat(WebInspector.ShortcutsScreen.LayersPanelShortcuts.Down), WebInspector.UIString("Pan or rotate up/down"));        section.addRelatedKeys(WebInspector.ShortcutsScreen.LayersPanelShortcuts.Left.concat(WebInspector.ShortcutsScreen.LayersPanelShortcuts.Right), WebInspector.UIString("Pan or rotate left/right"));    }}WebInspector.ShortcutsScreen.ElementsPanelShortcuts = {    NavigateUp: [WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Up)],    NavigateDown: [WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Down)],    Expand: [WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Right)],    Collapse: [WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Left)],    EditAttribute: [WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Enter)],    HideElement: [WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.H)],    ToggleEditAsHTML: [WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.F2)],    NextProperty: [WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Tab)],    PreviousProperty: [WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Tab, WebInspector.KeyboardShortcut.Modifiers.Shift)],    IncrementValue: [WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Up)],    DecrementValue: [WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Down)],    IncrementBy10: [WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.PageUp), WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Up, WebInspector.KeyboardShortcut.Modifiers.Shift)],    DecrementBy10: [WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.PageDown), WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Down, WebInspector.KeyboardShortcut.Modifiers.Shift)],    IncrementBy100: [WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.PageUp, WebInspector.KeyboardShortcut.Modifiers.Shift)],    DecrementBy100: [WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.PageDown, WebInspector.KeyboardShortcut.Modifiers.Shift)],    IncrementBy01: [WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Up, WebInspector.KeyboardShortcut.Modifiers.Alt)],    DecrementBy01: [WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Down, WebInspector.KeyboardShortcut.Modifiers.Alt)]};WebInspector.ShortcutsScreen.SourcesPanelShortcuts = {    SelectNextOccurrence: [WebInspector.KeyboardShortcut.makeDescriptor("d", WebInspector.KeyboardShortcut.Modifiers.CtrlOrMeta)],    SoftUndo: [WebInspector.KeyboardShortcut.makeDescriptor("u", WebInspector.KeyboardShortcut.Modifiers.CtrlOrMeta)],    GotoMatchingBracket: [WebInspector.KeyboardShortcut.makeDescriptor("m", WebInspector.KeyboardShortcut.Modifiers.Ctrl)],    ToggleAutocompletion: [WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Space, WebInspector.KeyboardShortcut.Modifiers.Ctrl)],    IncreaseCSSUnitByOne: [WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Up, WebInspector.KeyboardShortcut.Modifiers.Alt)],    DecreaseCSSUnitByOne: [WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Down, WebInspector.KeyboardShortcut.Modifiers.Alt)],    IncreaseCSSUnitByTen: [WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.PageUp, WebInspector.KeyboardShortcut.Modifiers.Alt)],    DecreaseCSSUnitByTen: [WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.PageDown, WebInspector.KeyboardShortcut.Modifiers.Alt)],    EvaluateSelectionInConsole: [WebInspector.KeyboardShortcut.makeDescriptor("e", WebInspector.KeyboardShortcut.Modifiers.Shift | WebInspector.KeyboardShortcut.Modifiers.Ctrl)],    AddSelectionToWatch: [WebInspector.KeyboardShortcut.makeDescriptor("a", WebInspector.KeyboardShortcut.Modifiers.Shift | WebInspector.KeyboardShortcut.Modifiers.Ctrl)],    GoToMember: [WebInspector.KeyboardShortcut.makeDescriptor("p", WebInspector.KeyboardShortcut.Modifiers.CtrlOrMeta | WebInspector.KeyboardShortcut.Modifiers.Shift)],    GoToLine: [WebInspector.KeyboardShortcut.makeDescriptor("g", WebInspector.KeyboardShortcut.Modifiers.Ctrl)],    ToggleBreakpoint: [WebInspector.KeyboardShortcut.makeDescriptor("b", WebInspector.KeyboardShortcut.Modifiers.CtrlOrMeta)],    NextCallFrame: [WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Period, WebInspector.KeyboardShortcut.Modifiers.Ctrl)],    PrevCallFrame: [WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Comma, WebInspector.KeyboardShortcut.Modifiers.Ctrl)],    ToggleComment: [WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Slash, WebInspector.KeyboardShortcut.Modifiers.CtrlOrMeta)],    JumpToPreviousLocation: [WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Minus, WebInspector.KeyboardShortcut.Modifiers.Alt)],    JumpToNextLocation: [WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Plus, WebInspector.KeyboardShortcut.Modifiers.Alt)],    CloseEditorTab: [WebInspector.KeyboardShortcut.makeDescriptor("w", WebInspector.KeyboardShortcut.Modifiers.Alt)],    Save: [WebInspector.KeyboardShortcut.makeDescriptor("s", WebInspector.KeyboardShortcut.Modifiers.CtrlOrMeta)],    SaveAll: [WebInspector.KeyboardShortcut.makeDescriptor("s", WebInspector.KeyboardShortcut.Modifiers.CtrlOrMeta | WebInspector.KeyboardShortcut.Modifiers.ShiftOrOption)],};WebInspector.ShortcutsScreen.TimelinePanelShortcuts = {    StartStopRecording: [WebInspector.KeyboardShortcut.makeDescriptor("e", WebInspector.KeyboardShortcut.Modifiers.CtrlOrMeta)],    RecordPageReload: [WebInspector.KeyboardShortcut.makeDescriptor("r", WebInspector.KeyboardShortcut.Modifiers.CtrlOrMeta)],    SaveToFile: [WebInspector.KeyboardShortcut.makeDescriptor("s", WebInspector.KeyboardShortcut.Modifiers.CtrlOrMeta)],    LoadFromFile: [WebInspector.KeyboardShortcut.makeDescriptor("o", WebInspector.KeyboardShortcut.Modifiers.CtrlOrMeta)],    JumpToPreviousFrame: [WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.LeftSquareBracket)],    JumpToNextFrame: [WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.RightSquareBracket)]};WebInspector.ShortcutsScreen.ProfilesPanelShortcuts = {    StartStopRecording: [WebInspector.KeyboardShortcut.makeDescriptor("e", WebInspector.KeyboardShortcut.Modifiers.CtrlOrMeta)]};WebInspector.ShortcutsScreen.LayersPanelShortcuts = {    ResetView: [WebInspector.KeyboardShortcut.makeDescriptor("0")],    PanMode: [WebInspector.KeyboardShortcut.makeDescriptor("x")],    RotateMode: [WebInspector.KeyboardShortcut.makeDescriptor("v")],    TogglePanRotate: [WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Shift)],    ZoomIn: [WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Plus, WebInspector.KeyboardShortcut.Modifiers.Shift), WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.NumpadPlus)],    ZoomOut: [WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Minus, WebInspector.KeyboardShortcut.Modifiers.Shift), WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.NumpadMinus)],    Up: [WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Up), WebInspector.KeyboardShortcut.makeDescriptor("w")],    Down: [WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Down), WebInspector.KeyboardShortcut.makeDescriptor("s")],    Left: [WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Left), WebInspector.KeyboardShortcut.makeDescriptor("a")],    Right: [WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Right), WebInspector.KeyboardShortcut.makeDescriptor("d")]};WebInspector.EventListenersView = function(element) {    this._element = element;    this._treeOutline = new TreeOutlineInShadow("event-listener-tree");    this._treeOutline.registerRequiredCSS("components/objectValue.css");    this._treeOutline.registerRequiredCSS("components/eventListenersView.css");    this._treeOutline.setComparator(WebInspector.EventListenersTreeElement.comparator);    this._treeOutline.element.classList.add("monospace");    this._element.appendChild(this._treeOutline.element)    this._emptyHolder = createElementWithClass("div", "info");    this._emptyHolder.textContent = WebInspector.UIString("No Event Listeners");    this._linkifier = new WebInspector.Linkifier();    this._treeItemMap = new Map();}WebInspector.EventListenersView.prototype = {    addObjects: function(objects)     {        var promises = [];        for (var i = 0; i < objects.length; ++i)            promises.push(objects[i].eventListeners());        return Promise.all(promises).then(listenersCallback.bind(this));        function listenersCallback(listeners)         {            this.reset();            for (var i = 0; i < listeners.length; ++i)                this._addObjectEventListeners(objects[i], listeners[i]);            this.addEmptyHolderIfNeeded();            this._eventListenersArrivedForTest();        }    },    _addObjectEventListeners: function(object, eventListeners)     {        if (!eventListeners)            return;        for (var eventListener of eventListeners) {            var treeItem = this._getOrCreateTreeElementForType(eventListener.type());            treeItem.addObjectEventListener(eventListener, object);        }    },    _getOrCreateTreeElementForType: function(type)     {        var treeItem = this._treeItemMap.get(type);        if (!treeItem) {            treeItem = new WebInspector.EventListenersTreeElement(type,this._linkifier);            this._treeItemMap.set(type, treeItem);            this._treeOutline.appendChild(treeItem);            this._emptyHolder.remove();        }        return treeItem;    },    addEmptyHolderIfNeeded: function()     {        if (!this._treeOutline.firstChild() && !this._emptyHolder.parentNode)            this._element.appendChild(this._emptyHolder);    },    reset: function()     {        this._treeItemMap = new Map();        this._treeOutline.removeChildren();        this._linkifier.reset();    },    _eventListenersArrivedForTest: function()     {}}WebInspector.EventListenersTreeElement = function(type, linkifier) {    TreeElement.call(this, type);    this.toggleOnClick = true;    this.selectable = false;    this._linkifier = linkifier;}WebInspector.EventListenersTreeElement.comparator = function(element1, element2) {    if (element1.title === element2.title)        return 0;    return element1.title > element2.title ? 1 : -1;}WebInspector.EventListenersTreeElement.prototype = {    addObjectEventListener: function(eventListener, object)     {        var treeElement = new WebInspector.ObjectEventListenerBar(eventListener,object,this._linkifier);        this.appendChild((treeElement));    },    __proto__: TreeElement.prototype}WebInspector.ObjectEventListenerBar = function(eventListener, object, linkifier) {    TreeElement.call(this, "", true);    this._eventListener = eventListener;    this.editable = false;    this.selectable = false;    this._setTitle(object, linkifier);}WebInspector.ObjectEventListenerBar.prototype = {    onpopulate: function()     {        var properties = [];        var eventListener = this._eventListener;        var runtimeModel = eventListener.target().runtimeModel;        properties.push(runtimeModel.createRemotePropertyFromPrimitiveValue("useCapture", eventListener.useCapture()));        if (typeof eventListener.handler() !== "undefined")            properties.push(new WebInspector.RemoteObjectProperty("handler",eventListener.handler()));        WebInspector.ObjectPropertyTreeElement.populateWithProperties(this, properties, [], true, null );    },    _setTitle: function(object, linkifier)     {        var title = this.listItemElement.createChild("span");        var subtitle = this.listItemElement.createChild("span", "event-listener-tree-subtitle");        subtitle.appendChild(linkifier.linkifyRawLocation(this._eventListener.location(), this._eventListener.sourceName()));        title.appendChild(WebInspector.ObjectPropertiesSection.createValueElement(object, false));    },    __proto__: TreeElement.prototype};function defineCommonExtensionSymbols(apiPrivate) {    if (!apiPrivate.audits)        apiPrivate.audits = {};    apiPrivate.audits.Severity = {        Info: "info",        Warning: "warning",        Severe: "severe"    };    if (!apiPrivate.panels)        apiPrivate.panels = {};    apiPrivate.panels.SearchAction = {        CancelSearch: "cancelSearch",        PerformSearch: "performSearch",        NextSearchResult: "nextSearchResult",        PreviousSearchResult: "previousSearchResult"    };    apiPrivate.Events = {        AuditStarted: "audit-started-",        ButtonClicked: "button-clicked-",        PanelObjectSelected: "panel-objectSelected-",        NetworkRequestFinished: "network-request-finished",        OpenResource: "open-resource",        PanelSearch: "panel-search-",        ResourceAdded: "resource-added",        ResourceContentCommitted: "resource-content-committed",        ViewShown: "view-shown-",        ViewHidden: "view-hidden-"    };    apiPrivate.Commands = {        AddAuditCategory: "addAuditCategory",        AddAuditResult: "addAuditResult",        AddRequestHeaders: "addRequestHeaders",        ApplyStyleSheet: "applyStyleSheet",        CreatePanel: "createPanel",        CreateSidebarPane: "createSidebarPane",        CreateToolbarButton: "createToolbarButton",        EvaluateOnInspectedPage: "evaluateOnInspectedPage",        ForwardKeyboardEvent: "_forwardKeyboardEvent",        GetHAR: "getHAR",        GetPageResources: "getPageResources",        GetRequestContent: "getRequestContent",        GetResourceContent: "getResourceContent",        InspectedURLChanged: "inspectedURLChanged",        OpenResource: "openResource",        Reload: "Reload",        Subscribe: "subscribe",        SetOpenResourceHandler: "setOpenResourceHandler",        SetResourceContent: "setResourceContent",        SetSidebarContent: "setSidebarContent",        SetSidebarHeight: "setSidebarHeight",        SetSidebarPage: "setSidebarPage",        ShowPanel: "showPanel",        StopAuditCategoryRun: "stopAuditCategoryRun",        Unsubscribe: "unsubscribe",        UpdateAuditProgress: "updateAuditProgress",        UpdateButton: "updateButton"    };}function injectedExtensionAPI(injectedScriptId) {    var apiPrivate = {};    defineCommonExtensionSymbols(apiPrivate);    var commands = apiPrivate.Commands;    var events = apiPrivate.Events;    var userAction = false;    function EventSinkImpl(type, customDispatch)     {        this._type = type;        this._listeners = [];        this._customDispatch = customDispatch;    }    EventSinkImpl.prototype = {        addListener: function(callback)         {            if (typeof callback !== "function")                throw "addListener: callback is not a function";            if (this._listeners.length === 0)                extensionServer.sendRequest({                    command: commands.Subscribe,                    type: this._type                });            this._listeners.push(callback);            extensionServer.registerHandler("notify-" + this._type, this._dispatch.bind(this));        },        removeListener: function(callback)         {            var listeners = this._listeners;            for (var i = 0; i < listeners.length; ++i) {                if (listeners[i] === callback) {                    listeners.splice(i, 1);                    break;                }            }            if (this._listeners.length === 0)                extensionServer.sendRequest({                    command: commands.Unsubscribe,                    type: this._type                });        },        _fire: function(vararg)         {            var listeners = this._listeners.slice();            for (var i = 0; i < listeners.length; ++i)                listeners[i].apply(null , arguments);        },        _dispatch: function(request)         {            if (this._customDispatch)                this._customDispatch.call(this, request);            else                this._fire.apply(this, request.arguments);        }    }    function InspectorExtensionAPI()     {        this.audits = new Audits();        this.inspectedWindow = new InspectedWindow();        this.panels = new Panels();        this.network = new Network();        defineDeprecatedProperty(this, "webInspector", "resources", "network");    }    function Network()     {        function dispatchRequestEvent(message)         {            var request = message.arguments[1];            request.__proto__ = new Request(message.arguments[0]);            this._fire(request);        }        this.onRequestFinished = new EventSink(events.NetworkRequestFinished,dispatchRequestEvent);        defineDeprecatedProperty(this, "network", "onFinished", "onRequestFinished");        this.onNavigated = new EventSink(events.InspectedURLChanged);    }    Network.prototype = {        getHAR: function(callback)         {            function callbackWrapper(result)             {                var entries = (result && result.entries) || [];                for (var i = 0; i < entries.length; ++i) {                    entries[i].__proto__ = new Request(entries[i]._requestId);                    delete entries[i]._requestId;                }                callback(result);            }            extensionServer.sendRequest({                command: commands.GetHAR            }, callback && callbackWrapper);        },        addRequestHeaders: function(headers)         {            extensionServer.sendRequest({                command: commands.AddRequestHeaders,                headers: headers,                extensionId: window.location.hostname            });        }    }    function RequestImpl(id)     {        this._id = id;    }    RequestImpl.prototype = {        getContent: function(callback)         {            function callbackWrapper(response)             {                callback(response.content, response.encoding);            }            extensionServer.sendRequest({                command: commands.GetRequestContent,                id: this._id            }, callback && callbackWrapper);        }    }    function Panels()     {        var panels = {            elements: new ElementsPanel(),            sources: new SourcesPanel(),        };        function panelGetter(name)         {            return panels[name];        }        for (var panel in panels)            this.__defineGetter__(panel, panelGetter.bind(null , panel));        this.applyStyleSheet = function(styleSheet) {            extensionServer.sendRequest({                command: commands.ApplyStyleSheet,                styleSheet: styleSheet            });        }        ;    }    Panels.prototype = {        create: function(title, icon, page, callback)         {            var id = "extension-panel-" + extensionServer.nextObjectId();            var request = {                command: commands.CreatePanel,                id: id,                title: title,                icon: icon,                page: page            };            extensionServer.sendRequest(request, callback && callback.bind(this, new ExtensionPanel(id)));        },        setOpenResourceHandler: function(callback)         {            var hadHandler = extensionServer.hasHandler(events.OpenResource);            function callbackWrapper(message)             {                userAction = true;                try {                    callback.call(null , new Resource(message.resource), message.lineNumber);                } finally {                    userAction = false;                }            }            if (!callback)                extensionServer.unregisterHandler(events.OpenResource);            else                extensionServer.registerHandler(events.OpenResource, callbackWrapper);            if (hadHandler === !callback)                extensionServer.sendRequest({                    command: commands.SetOpenResourceHandler,                    "handlerPresent": !!callback                });        },        openResource: function(url, lineNumber, callback)         {            extensionServer.sendRequest({                command: commands.OpenResource,                "url": url,                "lineNumber": lineNumber            }, callback);        },        get SearchAction()         {            return apiPrivate.panels.SearchAction;        }    }    function ExtensionViewImpl(id)     {        this._id = id;        function dispatchShowEvent(message)         {            var frameIndex = message.arguments[0];            if (typeof frameIndex === "number")                this._fire(window.parent.frames[frameIndex]);            else                this._fire();        }        if (id) {            this.onShown = new EventSink(events.ViewShown + id,dispatchShowEvent);            this.onHidden = new EventSink(events.ViewHidden + id);        }    }    function PanelWithSidebarImpl(hostPanelName)     {        ExtensionViewImpl.call(this, null );        this._hostPanelName = hostPanelName;        this.onSelectionChanged = new EventSink(events.PanelObjectSelected + hostPanelName);    }    PanelWithSidebarImpl.prototype = {        createSidebarPane: function(title, callback)         {            var id = "extension-sidebar-" + extensionServer.nextObjectId();            var request = {                command: commands.CreateSidebarPane,                panel: this._hostPanelName,                id: id,                title: title            };            function callbackWrapper()             {                callback(new ExtensionSidebarPane(id));            }            extensionServer.sendRequest(request, callback && callbackWrapper);        },        __proto__: ExtensionViewImpl.prototype    }    function declareInterfaceClass(implConstructor)     {        return function()         {            var impl = {                __proto__: implConstructor.prototype            };            implConstructor.apply(impl, arguments);            populateInterfaceClass(this, impl);        }        ;    }    function defineDeprecatedProperty(object, className, oldName, newName)     {        var warningGiven = false;        function getter()         {            if (!warningGiven) {                console.warn(className + "." + oldName + " is deprecated. Use " + className + "." + newName + " instead");                warningGiven = true;            }            return object[newName];        }        object.__defineGetter__(oldName, getter);    }    function extractCallbackArgument(args)     {        var lastArgument = args[args.length - 1];        return typeof lastArgument === "function" ? lastArgument : undefined;    }    var AuditCategory = declareInterfaceClass(AuditCategoryImpl);    var AuditResult = declareInterfaceClass(AuditResultImpl);    var Button = declareInterfaceClass(ButtonImpl);    var EventSink = declareInterfaceClass(EventSinkImpl);    var ExtensionPanel = declareInterfaceClass(ExtensionPanelImpl);    var ExtensionSidebarPane = declareInterfaceClass(ExtensionSidebarPaneImpl);    var PanelWithSidebar = declareInterfaceClass(PanelWithSidebarImpl);    var Request = declareInterfaceClass(RequestImpl);    var Resource = declareInterfaceClass(ResourceImpl);    function ElementsPanel()     {        PanelWithSidebar.call(this, "elements");    }    ElementsPanel.prototype = {        __proto__: PanelWithSidebar.prototype    }    function SourcesPanel()     {        PanelWithSidebar.call(this, "sources");    }    SourcesPanel.prototype = {        __proto__: PanelWithSidebar.prototype    }    function ExtensionPanelImpl(id)     {        ExtensionViewImpl.call(this, id);        this.onSearch = new EventSink(events.PanelSearch + id);    }    ExtensionPanelImpl.prototype = {        createStatusBarButton: function(iconPath, tooltipText, disabled)         {            var id = "button-" + extensionServer.nextObjectId();            var request = {                command: commands.CreateToolbarButton,                panel: this._id,                id: id,                icon: iconPath,                tooltip: tooltipText,                disabled: !!disabled            };            extensionServer.sendRequest(request);            return new Button(id);        },        show: function()         {            if (!userAction)                return;            var request = {                command: commands.ShowPanel,                id: this._id            };            extensionServer.sendRequest(request);        },        __proto__: ExtensionViewImpl.prototype    }    function ExtensionSidebarPaneImpl(id)     {        ExtensionViewImpl.call(this, id);    }    ExtensionSidebarPaneImpl.prototype = {        setHeight: function(height)         {            extensionServer.sendRequest({                command: commands.SetSidebarHeight,                id: this._id,                height: height            });        },        setExpression: function(expression, rootTitle, evaluateOptions)         {            var request = {                command: commands.SetSidebarContent,                id: this._id,                expression: expression,                rootTitle: rootTitle,                evaluateOnPage: true,            };            if (typeof evaluateOptions === "object")                request.evaluateOptions = evaluateOptions;            extensionServer.sendRequest(request, extractCallbackArgument(arguments));        },        setObject: function(jsonObject, rootTitle, callback)         {            extensionServer.sendRequest({                command: commands.SetSidebarContent,                id: this._id,                expression: jsonObject,                rootTitle: rootTitle            }, callback);        },        setPage: function(page)         {            extensionServer.sendRequest({                command: commands.SetSidebarPage,                id: this._id,                page: page            });        },        __proto__: ExtensionViewImpl.prototype    }    function ButtonImpl(id)     {        this._id = id;        this.onClicked = new EventSink(events.ButtonClicked + id);    }    ButtonImpl.prototype = {        update: function(iconPath, tooltipText, disabled)         {            var request = {                command: commands.UpdateButton,                id: this._id,                icon: iconPath,                tooltip: tooltipText,                disabled: !!disabled            };            extensionServer.sendRequest(request);        }    };    function Audits()     {}    Audits.prototype = {        addCategory: function(displayName, resultCount)         {            var id = "extension-audit-category-" + extensionServer.nextObjectId();            if (typeof resultCount !== "undefined")                console.warn("Passing resultCount to audits.addCategory() is deprecated. Use AuditResult.updateProgress() instead.");            extensionServer.sendRequest({                command: commands.AddAuditCategory,                id: id,                displayName: displayName,                resultCount: resultCount            });            return new AuditCategory(id);        }    }    function AuditCategoryImpl(id)     {        function dispatchAuditEvent(request)         {            var auditResult = new AuditResult(request.arguments[0]);            try {                this._fire(auditResult);            } catch (e) {                console.error("Uncaught exception in extension audit event handler: " + e);                auditResult.done();            }        }        this._id = id;        this.onAuditStarted = new EventSink(events.AuditStarted + id,dispatchAuditEvent);    }    function AuditResultImpl(id)     {        this._id = id;        this.createURL = this._nodeFactory.bind(this, "url");        this.createSnippet = this._nodeFactory.bind(this, "snippet");        this.createText = this._nodeFactory.bind(this, "text");        this.createObject = this._nodeFactory.bind(this, "object");        this.createNode = this._nodeFactory.bind(this, "node");    }    AuditResultImpl.prototype = {        addResult: function(displayName, description, severity, details)         {            if (details && !(details instanceof AuditResultNode))                details = new AuditResultNode(Array.isArray(details) ? details : [details]);            var request = {                command: commands.AddAuditResult,                resultId: this._id,                displayName: displayName,                description: description,                severity: severity,                details: details            };            extensionServer.sendRequest(request);        },        createResult: function()         {            return new AuditResultNode(Array.prototype.slice.call(arguments));        },        updateProgress: function(worked, totalWork)         {            extensionServer.sendRequest({                command: commands.UpdateAuditProgress,                resultId: this._id,                progress: worked / totalWork            });        },        done: function()         {            extensionServer.sendRequest({                command: commands.StopAuditCategoryRun,                resultId: this._id            });        },        get Severity()         {            return apiPrivate.audits.Severity;        },        createResourceLink: function(url, lineNumber)         {            return {                type: "resourceLink",                arguments: [url, lineNumber && lineNumber - 1]            };        },        _nodeFactory: function(type)         {            return {                type: type,                arguments: Array.prototype.slice.call(arguments, 1)            };        }    }    function AuditResultNode(contents)     {        this.contents = contents;        this.children = [];        this.expanded = false;    }    AuditResultNode.prototype = {        addChild: function()         {            var node = new AuditResultNode(Array.prototype.slice.call(arguments));            this.children.push(node);            return node;        }    };    function InspectedWindow()     {        function dispatchResourceEvent(message)         {            this._fire(new Resource(message.arguments[0]));        }        function dispatchResourceContentEvent(message)         {            this._fire(new Resource(message.arguments[0]), message.arguments[1]);        }        this.onResourceAdded = new EventSink(events.ResourceAdded,dispatchResourceEvent);        this.onResourceContentCommitted = new EventSink(events.ResourceContentCommitted,dispatchResourceContentEvent);    }    InspectedWindow.prototype = {        reload: function(optionsOrUserAgent)         {            var options = null ;            if (typeof optionsOrUserAgent === "object") {                options = optionsOrUserAgent;            } else if (typeof optionsOrUserAgent === "string") {                options = {                    userAgent: optionsOrUserAgent                };                console.warn("Passing userAgent as string parameter to inspectedWindow.reload() is deprecated. " + "Use inspectedWindow.reload({ userAgent: value}) instead.");            }            extensionServer.sendRequest({                command: commands.Reload,                options: options            });        },        eval: function(expression, evaluateOptions)         {            var callback = extractCallbackArgument(arguments);            function callbackWrapper(result)             {                if (result.isError || result.isException)                    callback(undefined, result);                else                    callback(result.value);            }            var request = {                command: commands.EvaluateOnInspectedPage,                expression: expression            };            if (typeof evaluateOptions === "object")                request.evaluateOptions = evaluateOptions;            extensionServer.sendRequest(request, callback && callbackWrapper);            return null ;        },        getResources: function(callback)         {            function wrapResource(resourceData)             {                return new Resource(resourceData);            }            function callbackWrapper(resources)             {                callback(resources.map(wrapResource));            }            extensionServer.sendRequest({                command: commands.GetPageResources            }, callback && callbackWrapper);        }    }    function ResourceImpl(resourceData)     {        this._url = resourceData.url;        this._type = resourceData.type;    }    ResourceImpl.prototype = {        get url()         {            return this._url;        },        get type()         {            return this._type;        },        getContent: function(callback)         {            function callbackWrapper(response)             {                callback(response.content, response.encoding);            }            extensionServer.sendRequest({                command: commands.GetResourceContent,                url: this._url            }, callback && callbackWrapper);        },        setContent: function(content, commit, callback)         {            extensionServer.sendRequest({                command: commands.SetResourceContent,                url: this._url,                content: content,                commit: commit            }, callback);        }    }    var keyboardEventRequestQueue = [];    var forwardTimer = null ;    function forwardKeyboardEvent(event)     {        const Esc = "U+001B";        if (!event.ctrlKey && !event.altKey && !event.metaKey && !/^F\d+$/.test(event.keyIdentifier) && event.keyIdentifier !== Esc)            return;        var requestPayload = {            eventType: event.type,            ctrlKey: event.ctrlKey,            altKey: event.altKey,            metaKey: event.metaKey,            keyIdentifier: event.keyIdentifier,            location: event.location,            keyCode: event.keyCode        };        keyboardEventRequestQueue.push(requestPayload);        if (!forwardTimer)            forwardTimer = setTimeout(forwardEventQueue, 0);    }    function forwardEventQueue()     {        forwardTimer = null ;        var request = {            command: commands.ForwardKeyboardEvent,            entries: keyboardEventRequestQueue        };        extensionServer.sendRequest(request);        keyboardEventRequestQueue = [];    }    document.addEventListener("keydown", forwardKeyboardEvent, false);    document.addEventListener("keypress", forwardKeyboardEvent, false);    function ExtensionServerClient()     {        this._callbacks = {};        this._handlers = {};        this._lastRequestId = 0;        this._lastObjectId = 0;        this.registerHandler("callback", this._onCallback.bind(this));        var channel = new MessageChannel();        this._port = channel.port1;        this._port.addEventListener("message", this._onMessage.bind(this), false);        this._port.start();        window.parent.postMessage("registerExtension", [channel.port2], "*");    }    ExtensionServerClient.prototype = {        sendRequest: function(message, callback)         {            if (typeof callback === "function")                message.requestId = this._registerCallback(callback);            this._port.postMessage(message);        },        hasHandler: function(command)         {            return !!this._handlers[command];        },        registerHandler: function(command, handler)         {            this._handlers[command] = handler;        },        unregisterHandler: function(command)         {            delete this._handlers[command];        },        nextObjectId: function()         {            return injectedScriptId.toString() + "_" + ++this._lastObjectId;        },        _registerCallback: function(callback)         {            var id = ++this._lastRequestId;            this._callbacks[id] = callback;            return id;        },        _onCallback: function(request)         {            if (request.requestId in this._callbacks) {                var callback = this._callbacks[request.requestId];                delete this._callbacks[request.requestId];                callback(request.result);            }        },        _onMessage: function(event)         {            var request = event.data;            var handler = this._handlers[request.command];            if (handler)                handler.call(this, request);        }    }    function populateInterfaceClass(interfaze, implementation)     {        for (var member in implementation) {            if (member.charAt(0) === "_")                continue;var descriptor = null ;            for (var owner = implementation; owner && !descriptor; owner = owner.__proto__)                descriptor = Object.getOwnPropertyDescriptor(owner, member);            if (!descriptor)                continue;if (typeof descriptor.value === "function")                interfaze[member] = descriptor.value.bind(implementation);            else if (typeof descriptor.get === "function")                interfaze.__defineGetter__(member, descriptor.get.bind(implementation));            else                Object.defineProperty(interfaze, member, descriptor);        }    }    if (!extensionServer)        extensionServer = new ExtensionServerClient();    return new InspectorExtensionAPI();}function platformExtensionAPI(coreAPI) {    function getTabId()     {        return tabId;    }    chrome = window.chrome || {};    var devtools_descriptor = Object.getOwnPropertyDescriptor(chrome, "devtools");    if (!devtools_descriptor || devtools_descriptor.get)        Object.defineProperty(chrome, "devtools", {            value: {},            enumerable: true        });    chrome.devtools.inspectedWindow = {};    chrome.devtools.inspectedWindow.__defineGetter__("tabId", getTabId);    chrome.devtools.inspectedWindow.__proto__ = coreAPI.inspectedWindow;    chrome.devtools.network = coreAPI.network;    chrome.devtools.panels = coreAPI.panels;    if (extensionInfo.exposeExperimentalAPIs !== false) {        chrome.experimental = chrome.experimental || {};        chrome.experimental.devtools = chrome.experimental.devtools || {};        var properties = Object.getOwnPropertyNames(coreAPI);        for (var i = 0; i < properties.length; ++i) {            var descriptor = Object.getOwnPropertyDescriptor(coreAPI, properties[i]);            Object.defineProperty(chrome.experimental.devtools, properties[i], descriptor);        }        chrome.experimental.devtools.inspectedWindow = chrome.devtools.inspectedWindow;    }    if (extensionInfo.exposeWebInspectorNamespace)        window.webInspector = coreAPI;}function buildPlatformExtensionAPI(extensionInfo, inspectedTabId) {    return "var extensionInfo = " + JSON.stringify(extensionInfo) + ";" + "var tabId = " + inspectedTabId + ";" +     platformExtensionAPI.toString();}function buildExtensionAPIInjectedScript(extensionInfo, inspectedTabId) {    return "(function(injectedScriptId){ " + "var extensionServer;" +     defineCommonExtensionSymbols.toString() + ";" +     injectedExtensionAPI.toString() + ";" +     buildPlatformExtensionAPI(extensionInfo, inspectedTabId) + ";" + "platformExtensionAPI(injectedExtensionAPI(injectedScriptId));" + "return {};" + "})";};WebInspector.ExtensionAuditCategory = function(extensionOrigin, id, displayName, ruleCount) {    this.extensionOrigin = extensionOrigin;    this.id = id;    this.displayName = displayName;    this.ruleCount = ruleCount;}WebInspector.ExtensionAuditCategoryResults = function() {}WebInspector.ExtensionAuditCategoryResults.prototype = {    id: function() {},    addResult: function(displayName, description, severity, details) {},    updateProgress: function(progress) {},    done: function() {}};if (!window.InspectorExtensionRegistry) {    WebInspector.InspectorExtensionRegistryStub = function()     {}    WebInspector.InspectorExtensionRegistryStub.prototype = {        getExtensionsAsync: function()         {}    }    var InspectorExtensionRegistry = new WebInspector.InspectorExtensionRegistryStub();};WebInspector.ExtensionServer = function() {    this._clientObjects = {};    this._handlers = {};    this._subscribers = {};    this._subscriptionStartHandlers = {};    this._subscriptionStopHandlers = {};    this._extraHeaders = {};    this._requests = {};    this._lastRequestId = 0;    this._registeredExtensions = {};    this._status = new WebInspector.ExtensionStatus();    this._sidebarPanes = [];    this._auditCategories = [];    var commands = WebInspector.extensionAPI.Commands;    this._registerHandler(commands.AddAuditCategory, this._onAddAuditCategory.bind(this));    this._registerHandler(commands.AddAuditResult, this._onAddAuditResult.bind(this));    this._registerHandler(commands.AddRequestHeaders, this._onAddRequestHeaders.bind(this));    this._registerHandler(commands.ApplyStyleSheet, this._onApplyStyleSheet.bind(this));    this._registerHandler(commands.CreatePanel, this._onCreatePanel.bind(this));    this._registerHandler(commands.CreateSidebarPane, this._onCreateSidebarPane.bind(this));    this._registerHandler(commands.CreateToolbarButton, this._onCreateToolbarButton.bind(this));    this._registerHandler(commands.EvaluateOnInspectedPage, this._onEvaluateOnInspectedPage.bind(this));    this._registerHandler(commands.ForwardKeyboardEvent, this._onForwardKeyboardEvent.bind(this));    this._registerHandler(commands.GetHAR, this._onGetHAR.bind(this));    this._registerHandler(commands.GetPageResources, this._onGetPageResources.bind(this));    this._registerHandler(commands.GetRequestContent, this._onGetRequestContent.bind(this));    this._registerHandler(commands.GetResourceContent, this._onGetResourceContent.bind(this));    this._registerHandler(commands.Reload, this._onReload.bind(this));    this._registerHandler(commands.SetOpenResourceHandler, this._onSetOpenResourceHandler.bind(this));    this._registerHandler(commands.SetResourceContent, this._onSetResourceContent.bind(this));    this._registerHandler(commands.SetSidebarHeight, this._onSetSidebarHeight.bind(this));    this._registerHandler(commands.SetSidebarContent, this._onSetSidebarContent.bind(this));    this._registerHandler(commands.SetSidebarPage, this._onSetSidebarPage.bind(this));    this._registerHandler(commands.ShowPanel, this._onShowPanel.bind(this));    this._registerHandler(commands.StopAuditCategoryRun, this._onStopAuditCategoryRun.bind(this));    this._registerHandler(commands.Subscribe, this._onSubscribe.bind(this));    this._registerHandler(commands.OpenResource, this._onOpenResource.bind(this));    this._registerHandler(commands.Unsubscribe, this._onUnsubscribe.bind(this));    this._registerHandler(commands.UpdateButton, this._onUpdateButton.bind(this));    this._registerHandler(commands.UpdateAuditProgress, this._onUpdateAuditProgress.bind(this));    window.addEventListener("message", this._onWindowMessage.bind(this), false);    InspectorFrontendHost.events.addEventListener(InspectorFrontendHostAPI.Events.AddExtensions, this._addExtensions, this);    InspectorFrontendHost.events.addEventListener(InspectorFrontendHostAPI.Events.SetInspectedTabId, this._setInspectedTabId, this);    this._initExtensions();}WebInspector.ExtensionServer.Events = {    SidebarPaneAdded: "SidebarPaneAdded",    AuditCategoryAdded: "AuditCategoryAdded"}WebInspector.ExtensionServer.prototype = {    initializeExtensions: function()     {        this._initializeCommandIssued = true;        if (this._pendingExtensionInfos) {            this._pendingExtensionInfos.forEach(this._addExtension, this);            delete this._pendingExtensionInfos;        }    },    hasExtensions: function()     {        return !!Object.keys(this._registeredExtensions).length;    },    notifySearchAction: function(panelId, action, searchString)     {        this._postNotification(WebInspector.extensionAPI.Events.PanelSearch + panelId, action, searchString);    },    notifyViewShown: function(identifier, frameIndex)     {        this._postNotification(WebInspector.extensionAPI.Events.ViewShown + identifier, frameIndex);    },    notifyViewHidden: function(identifier)     {        this._postNotification(WebInspector.extensionAPI.Events.ViewHidden + identifier);    },    notifyButtonClicked: function(identifier)     {        this._postNotification(WebInspector.extensionAPI.Events.ButtonClicked + identifier);    },    _inspectedURLChanged: function(event)     {        this._requests = {};        var url = event.data;        this._postNotification(WebInspector.extensionAPI.Events.InspectedURLChanged, url);    },    startAuditRun: function(categoryId, auditResults)     {        this._clientObjects[auditResults.id()] = auditResults;        this._postNotification("audit-started-" + categoryId, auditResults.id());    },    stopAuditRun: function(auditResults)     {        delete this._clientObjects[auditResults.id()];    },    hasSubscribers: function(type)     {        return !!this._subscribers[type];    },    _postNotification: function(type, vararg)     {        var subscribers = this._subscribers[type];        if (!subscribers)            return;        var message = {            command: "notify-" + type,            arguments: Array.prototype.slice.call(arguments, 1)        };        for (var i = 0; i < subscribers.length; ++i)            subscribers[i].postMessage(message);    },    _onSubscribe: function(message, port)     {        var subscribers = this._subscribers[message.type];        if (subscribers)            subscribers.push(port);        else {            this._subscribers[message.type] = [port];            if (this._subscriptionStartHandlers[message.type])                this._subscriptionStartHandlers[message.type]();        }    },    _onUnsubscribe: function(message, port)     {        var subscribers = this._subscribers[message.type];        if (!subscribers)            return;        subscribers.remove(port);        if (!subscribers.length) {            delete this._subscribers[message.type];            if (this._subscriptionStopHandlers[message.type])                this._subscriptionStopHandlers[message.type]();        }    },    _onAddRequestHeaders: function(message)     {        var id = message.extensionId;        if (typeof id !== "string")            return this._status.E_BADARGTYPE("extensionId", typeof id, "string");        var extensionHeaders = this._extraHeaders[id];        if (!extensionHeaders) {            extensionHeaders = {};            this._extraHeaders[id] = extensionHeaders;        }        for (var name in message.headers)            extensionHeaders[name] = message.headers[name];        var allHeaders = ({});        for (var extension in this._extraHeaders) {            var headers = this._extraHeaders[extension];            for (name in headers) {                if (typeof headers[name] === "string")                    allHeaders[name] = headers[name];            }        }        WebInspector.multitargetNetworkManager.setExtraHTTPHeaders(allHeaders);    },    _onApplyStyleSheet: function(message)     {        if (!Runtime.experiments.isEnabled("applyCustomStylesheet"))            return;        var styleSheet = createElement("style");        styleSheet.textContent = message.styleSheet;        document.head.appendChild(styleSheet);    },    _onCreatePanel: function(message, port)     {        var id = message.id;        if (id in this._clientObjects || WebInspector.inspectorView.hasPanel(id))            return this._status.E_EXISTS(id);        var page = this._expandResourcePath(port._extensionOrigin, message.page);        var panelDescriptor = new WebInspector.ExtensionServerPanelDescriptor(id,message.title,new WebInspector.ExtensionPanel(this,id,page));        this._clientObjects[id] = panelDescriptor;        WebInspector.inspectorView.addPanel(panelDescriptor);        return this._status.OK();    },    _onShowPanel: function(message)     {        WebInspector.inspectorView.showPanel(message.id);    },    _onCreateToolbarButton: function(message, port)     {        var panelDescriptor = this._clientObjects[message.panel];        if (!panelDescriptor || !(panelDescriptor instanceof WebInspector.ExtensionServerPanelDescriptor))            return this._status.E_NOTFOUND(message.panel);        var button = new WebInspector.ExtensionButton(this,message.id,this._expandResourcePath(port._extensionOrigin, message.icon),message.tooltip,message.disabled);        this._clientObjects[message.id] = button;        panelDescriptor.panel().then(appendButton);        function appendButton(panel)         {            (panel).addToolbarItem(button.toolbarButton());        }        return this._status.OK();    },    _onUpdateButton: function(message, port)     {        var button = this._clientObjects[message.id];        if (!button || !(button instanceof WebInspector.ExtensionButton))            return this._status.E_NOTFOUND(message.id);        button.update(this._expandResourcePath(port._extensionOrigin, message.icon), message.tooltip, message.disabled);        return this._status.OK();    },    _onCreateSidebarPane: function(message)     {        if (message.panel !== "elements" && message.panel !== "sources")            return this._status.E_NOTFOUND(message.panel);        var id = message.id;        var sidebar = new WebInspector.ExtensionSidebarPane(this,message.panel,message.title,id);        this._sidebarPanes.push(sidebar);        this._clientObjects[id] = sidebar;        this.dispatchEventToListeners(WebInspector.ExtensionServer.Events.SidebarPaneAdded, sidebar);        return this._status.OK();    },    sidebarPanes: function()     {        return this._sidebarPanes;    },    _onSetSidebarHeight: function(message)     {        var sidebar = this._clientObjects[message.id];        if (!sidebar)            return this._status.E_NOTFOUND(message.id);        sidebar.setHeight(message.height);        return this._status.OK();    },    _onSetSidebarContent: function(message, port)     {        var sidebar = this._clientObjects[message.id];        if (!sidebar)            return this._status.E_NOTFOUND(message.id);        function callback(error)         {            var result = error ? this._status.E_FAILED(error) : this._status.OK();            this._dispatchCallback(message.requestId, port, result);        }        if (message.evaluateOnPage)            return sidebar.setExpression(message.expression, message.rootTitle, message.evaluateOptions, port._extensionOrigin, callback.bind(this));        sidebar.setObject(message.expression, message.rootTitle, callback.bind(this));    },    _onSetSidebarPage: function(message, port)     {        var sidebar = this._clientObjects[message.id];        if (!sidebar)            return this._status.E_NOTFOUND(message.id);        sidebar.setPage(this._expandResourcePath(port._extensionOrigin, message.page));    },    _onOpenResource: function(message)     {        var uiSourceCode = WebInspector.networkMapping.uiSourceCodeForURLForAnyTarget(message.url);        if (uiSourceCode) {            WebInspector.Revealer.reveal(uiSourceCode.uiLocation(message.lineNumber, 0));            return this._status.OK();        }        var resource = WebInspector.resourceForURL(message.url);        if (resource) {            WebInspector.Revealer.reveal(resource, message.lineNumber);            return this._status.OK();        }        var request = WebInspector.NetworkLog.requestForURL(message.url);        if (request) {            WebInspector.Revealer.reveal(request);            return this._status.OK();        }        return this._status.E_NOTFOUND(message.url);    },    _onSetOpenResourceHandler: function(message, port)     {        var name = this._registeredExtensions[port._extensionOrigin].name || ("Extension " + port._extensionOrigin);        if (message.handlerPresent)            WebInspector.openAnchorLocationRegistry.registerHandler(name, this._handleOpenURL.bind(this, port));        else            WebInspector.openAnchorLocationRegistry.unregisterHandler(name);    },    _handleOpenURL: function(port, details)     {        var url = (details.url);        var contentProvider = WebInspector.workspace.uiSourceCodeForOriginURL(url) || WebInspector.resourceForURL(url);        if (!contentProvider)            return false;        var lineNumber = details.lineNumber;        if (typeof lineNumber === "number")            lineNumber += 1;        port.postMessage({            command: "open-resource",            resource: this._makeResource(contentProvider),            lineNumber: lineNumber        });        return true;    },    _onReload: function(message)     {        var options = (message.options || {});        WebInspector.multitargetNetworkManager.setUserAgentOverride(typeof options.userAgent === "string" ? options.userAgent : "");        var injectedScript;        if (options.injectedScript)            injectedScript = "(function(){" + options.injectedScript + "})()";        var target = WebInspector.targetManager.mainTarget();        target.resourceTreeModel.reloadPage(!!options.ignoreCache, injectedScript);        return this._status.OK();    },    _onEvaluateOnInspectedPage: function(message, port)     {        function callback(error, remoteObject, wasThrown)         {            var result;            if (error || !remoteObject)                result = this._status.E_PROTOCOLERROR(error.toString());            else if (wasThrown)                result = {                    isException: true,                    value: remoteObject.description                };            else                result = {                    value: remoteObject.value                };            this._dispatchCallback(message.requestId, port, result);        }        return this.evaluate(message.expression, true, true, message.evaluateOptions, port._extensionOrigin, callback.bind(this));    },    _onGetHAR: function()     {        var requests = WebInspector.NetworkLog.requests();        var harLog = (new WebInspector.HARLog(requests)).build();        for (var i = 0; i < harLog.entries.length; ++i)            harLog.entries[i]._requestId = this._requestId(requests[i]);        return harLog;    },    _makeResource: function(contentProvider)     {        return {            url: contentProvider.contentURL(),            type: contentProvider.contentType().name()        };    },    _onGetPageResources: function()     {        var resources = {};        function pushResourceData(contentProvider)         {            if (!resources[contentProvider.contentURL()])                resources[contentProvider.contentURL()] = this._makeResource(contentProvider);        }        var uiSourceCodes = WebInspector.workspace.uiSourceCodesForProjectType(WebInspector.projectTypes.Network);        uiSourceCodes = uiSourceCodes.concat(WebInspector.workspace.uiSourceCodesForProjectType(WebInspector.projectTypes.ContentScripts));        uiSourceCodes.forEach(pushResourceData.bind(this));        for (var target of WebInspector.targetManager.targets())            target.resourceTreeModel.forAllResources(pushResourceData.bind(this));        return Object.values(resources);    },    _getResourceContent: function(contentProvider, message, port)     {        function onContentAvailable(content)         {            var contentEncoded = false;            if (contentProvider instanceof WebInspector.Resource)                contentEncoded = contentProvider.contentEncoded;            if (contentProvider instanceof WebInspector.NetworkRequest)                contentEncoded = contentProvider.contentEncoded;            var response = {                encoding: contentEncoded && content ? "base64" : "",                content: content            };            this._dispatchCallback(message.requestId, port, response);        }        contentProvider.requestContent(onContentAvailable.bind(this));    },    _onGetRequestContent: function(message, port)     {        var request = this._requestById(message.id);        if (!request)            return this._status.E_NOTFOUND(message.id);        this._getResourceContent(request, message, port);    },    _onGetResourceContent: function(message, port)     {        var url = (message.url);        var contentProvider = WebInspector.workspace.uiSourceCodeForOriginURL(url) || WebInspector.resourceForURL(url);        if (!contentProvider)            return this._status.E_NOTFOUND(url);        this._getResourceContent(contentProvider, message, port);    },    _onSetResourceContent: function(message, port)     {        function callbackWrapper(error)         {            var response = error ? this._status.E_FAILED(error) : this._status.OK();            this._dispatchCallback(message.requestId, port, response);        }        var url = (message.url);        var uiSourceCode = WebInspector.workspace.uiSourceCodeForOriginURL(url);        if (!uiSourceCode) {            var resource = WebInspector.ResourceTreeModel.resourceForURL(url);            if (!resource)                return this._status.E_NOTFOUND(url);            return this._status.E_NOTSUPPORTED("Resource is not editable");        }        uiSourceCode.setWorkingCopy(message.content);        if (message.commit)            uiSourceCode.commitWorkingCopy();        callbackWrapper.call(this, null );    },    _requestId: function(request)     {        if (!request._extensionRequestId) {            request._extensionRequestId = ++this._lastRequestId;            this._requests[request._extensionRequestId] = request;        }        return request._extensionRequestId;    },    _requestById: function(id)     {        return this._requests[id];    },    _onAddAuditCategory: function(message, port)     {        var category = new WebInspector.ExtensionAuditCategory(port._extensionOrigin,message.id,message.displayName,message.resultCount);        this._clientObjects[message.id] = category;        this._auditCategories.push(category);        this.dispatchEventToListeners(WebInspector.ExtensionServer.Events.AuditCategoryAdded, category);    },    auditCategories: function()     {        return this._auditCategories;    },    _onAddAuditResult: function(message)     {        var auditResult = (this._clientObjects[message.resultId]);        if (!auditResult)            return this._status.E_NOTFOUND(message.resultId);        try {            auditResult.addResult(message.displayName, message.description, message.severity, message.details);        } catch (e) {            return e;        }        return this._status.OK();    },    _onUpdateAuditProgress: function(message)     {        var auditResult = (this._clientObjects[message.resultId]);        if (!auditResult)            return this._status.E_NOTFOUND(message.resultId);        auditResult.updateProgress(Math.min(Math.max(0, message.progress), 1));    },    _onStopAuditCategoryRun: function(message)     {        var auditRun = (this._clientObjects[message.resultId]);        if (!auditRun)            return this._status.E_NOTFOUND(message.resultId);        auditRun.done();    },    _onForwardKeyboardEvent: function(message)     {        const Esc = "U+001B";        message.entries.forEach(handleEventEntry);        function handleEventEntry(entry)         {            if (!entry.ctrlKey && !entry.altKey && !entry.metaKey && !/^F\d+$/.test(entry.keyIdentifier) && entry.keyIdentifier !== Esc)                return;            var event = new window.KeyboardEvent(entry.eventType,{                keyIdentifier: entry.keyIdentifier,                location: entry.location,                ctrlKey: entry.ctrlKey,                altKey: entry.altKey,                shiftKey: entry.shiftKey,                metaKey: entry.metaKey            });            event.__keyCode = keyCodeForEntry(entry);            document.dispatchEvent(event);        }        function keyCodeForEntry(entry)         {            var keyCode = entry.keyCode;            if (!keyCode) {                var match = entry.keyIdentifier.match(/^U\+([\dA-Fa-f]+)$/);                if (match)                    keyCode = parseInt(match[1], 16);            }            return keyCode || 0;        }    },    _dispatchCallback: function(requestId, port, result)     {        if (requestId)            port.postMessage({                command: "callback",                requestId: requestId,                result: result            });    },    _initExtensions: function()     {        this._registerAutosubscriptionHandler(WebInspector.extensionAPI.Events.ResourceAdded, WebInspector.workspace, WebInspector.Workspace.Events.UISourceCodeAdded, this._notifyResourceAdded);        this._registerAutosubscriptionTargetManagerHandler(WebInspector.extensionAPI.Events.NetworkRequestFinished, WebInspector.NetworkManager, WebInspector.NetworkManager.EventTypes.RequestFinished, this._notifyRequestFinished);        function onElementsSubscriptionStarted()         {            WebInspector.notifications.addEventListener(WebInspector.NotificationService.Events.SelectedNodeChanged, this._notifyElementsSelectionChanged, this);        }        function onElementsSubscriptionStopped()         {            WebInspector.notifications.removeEventListener(WebInspector.NotificationService.Events.SelectedNodeChanged, this._notifyElementsSelectionChanged, this);        }        this._registerSubscriptionHandler(WebInspector.extensionAPI.Events.PanelObjectSelected + "elements", onElementsSubscriptionStarted.bind(this), onElementsSubscriptionStopped.bind(this));        this._registerResourceContentCommittedHandler(this._notifyUISourceCodeContentCommitted);        WebInspector.targetManager.addEventListener(WebInspector.TargetManager.Events.InspectedURLChanged, this._inspectedURLChanged, this);        InspectorExtensionRegistry.getExtensionsAsync();    },    _notifyResourceAdded: function(event)     {        var uiSourceCode = (event.data);        this._postNotification(WebInspector.extensionAPI.Events.ResourceAdded, this._makeResource(uiSourceCode));    },    _notifyUISourceCodeContentCommitted: function(event)     {        var uiSourceCode = (event.data.uiSourceCode);        var content = (event.data.content);        this._postNotification(WebInspector.extensionAPI.Events.ResourceContentCommitted, this._makeResource(uiSourceCode), content);    },    _notifyRequestFinished: function(event)     {        var request = (event.data);        this._postNotification(WebInspector.extensionAPI.Events.NetworkRequestFinished, this._requestId(request), (new WebInspector.HAREntry(request)).build());    },    _notifyElementsSelectionChanged: function()     {        this._postNotification(WebInspector.extensionAPI.Events.PanelObjectSelected + "elements");    },    _addExtensions: function(event)     {        if (WebInspector.extensionServer._overridePlatformExtensionAPIForTest)            window.buildPlatformExtensionAPI = WebInspector.extensionServer._overridePlatformExtensionAPIForTest;        var extensionInfos = (event.data);        if (this._initializeCommandIssued)            extensionInfos.forEach(this._addExtension, this);        else            this._pendingExtensionInfos = extensionInfos;    },    _setInspectedTabId: function(event)     {        this._inspectedTabId = (event.data);    },    _addExtension: function(extensionInfo)     {        const urlOriginRegExp = new RegExp("([^:]+:\/\/[^/]*)\/");        var startPage = extensionInfo.startPage;        var name = extensionInfo.name;        try {            var originMatch = urlOriginRegExp.exec(startPage);            if (!originMatch) {                console.error("Skipping extension with invalid URL: " + startPage);                return false;            }            var extensionOrigin = originMatch[1];            if (!this._registeredExtensions[extensionOrigin]) {                InspectorFrontendHost.setInjectedScriptForOrigin(extensionOrigin, buildExtensionAPIInjectedScript(extensionInfo, this._inspectedTabId));                this._registeredExtensions[extensionOrigin] = {                    name: name                };            }            var iframe = createElement("iframe");            iframe.src = startPage;            iframe.style.display = "none";            document.body.appendChild(iframe);        } catch (e) {            console.error("Failed to initialize extension " + startPage + ":" + e);            return false;        }        return true;    },    _registerExtension: function(origin, port)     {        if (!this._registeredExtensions.hasOwnProperty(origin)) {            if (origin !== window.location.origin)                console.error("Ignoring unauthorized client request from " + origin);            return;        }        port._extensionOrigin = origin;        port.addEventListener("message", this._onmessage.bind(this), false);        port.start();    },    _onWindowMessage: function(event)     {        if (event.data === "registerExtension")            this._registerExtension(event.origin, event.ports[0]);    },    _onmessage: function(event)     {        var message = event.data;        var result;        if (message.command in this._handlers)            result = this._handlers[message.command](message, event.target);        else            result = this._status.E_NOTSUPPORTED(message.command);        if (result && message.requestId)            this._dispatchCallback(message.requestId, event.target, result);    },    _registerHandler: function(command, callback)     {        console.assert(command);        this._handlers[command] = callback;    },    _registerSubscriptionHandler: function(eventTopic, onSubscribeFirst, onUnsubscribeLast)     {        this._subscriptionStartHandlers[eventTopic] = onSubscribeFirst;        this._subscriptionStopHandlers[eventTopic] = onUnsubscribeLast;    },    _registerAutosubscriptionHandler: function(eventTopic, eventTarget, frontendEventType, handler)     {        this._registerSubscriptionHandler(eventTopic, eventTarget.addEventListener.bind(eventTarget, frontendEventType, handler, this), eventTarget.removeEventListener.bind(eventTarget, frontendEventType, handler, this));    },    _registerAutosubscriptionTargetManagerHandler: function(eventTopic, modelClass, frontendEventType, handler)     {        this._registerSubscriptionHandler(eventTopic, WebInspector.targetManager.addModelListener.bind(WebInspector.targetManager, modelClass, frontendEventType, handler, this), WebInspector.targetManager.removeModelListener.bind(WebInspector.targetManager, modelClass, frontendEventType, handler, this));    },    _registerResourceContentCommittedHandler: function(handler)     {        function addFirstEventListener()         {            WebInspector.workspace.addEventListener(WebInspector.Workspace.Events.UISourceCodeContentCommitted, handler, this);            WebInspector.workspace.setHasResourceContentTrackingExtensions(true);        }        function removeLastEventListener()         {            WebInspector.workspace.setHasResourceContentTrackingExtensions(false);            WebInspector.workspace.removeEventListener(WebInspector.Workspace.Events.UISourceCodeContentCommitted, handler, this);        }        this._registerSubscriptionHandler(WebInspector.extensionAPI.Events.ResourceContentCommitted, addFirstEventListener.bind(this), removeLastEventListener.bind(this));    },    _expandResourcePath: function(extensionPath, resourcePath)     {        if (!resourcePath)            return;        return extensionPath + this._normalizePath(resourcePath);    },    _normalizePath: function(path)     {        var source = path.split("/");        var result = [];        for (var i = 0; i < source.length; ++i) {            if (source[i] === ".")                continue;if (source[i] === "")                continue;if (source[i] === "..")                result.pop();            else                result.push(source[i]);        }        return "/" + result.join("/");    },    evaluate: function(expression, exposeCommandLineAPI, returnByValue, options, securityOrigin, callback)     {        var contextId;        function resolveURLToFrame(url)         {            var found;            function hasMatchingURL(frame)             {                found = (frame.url === url) ? frame : null ;                return found;            }            WebInspector.ResourceTreeModel.frames().some(hasMatchingURL);            return found;        }        if (typeof options === "object") {            var frame = options.frameURL ? resolveURLToFrame(options.frameURL) : WebInspector.targetManager.mainTarget().resourceTreeModel.mainFrame;            if (!frame) {                if (options.frameURL)                    console.warn("evaluate: there is no frame with URL " + options.frameURL);                else                    console.warn("evaluate: the main frame is not yet available");                return this._status.E_NOTFOUND(options.frameURL || "<top>");            }            var contextSecurityOrigin;            if (options.useContentScriptContext)                contextSecurityOrigin = securityOrigin;            else if (options.scriptExecutionContext)                contextSecurityOrigin = options.scriptExecutionContext;            var context;            var executionContexts = frame.target().runtimeModel.executionContexts();            if (contextSecurityOrigin) {                for (var i = 0; i < executionContexts.length; ++i) {                    var executionContext = executionContexts[i];                    if (executionContext.frameId === frame.id && executionContext.origin === contextSecurityOrigin && !executionContext.isMainWorldContext)                        context = executionContext;                }                if (!context) {                    console.warn("The JavaScript context " + contextSecurityOrigin + " was not found in the frame " + frame.url)                    return this._status.E_NOTFOUND(contextSecurityOrigin)                }            } else {                for (var i = 0; i < executionContexts.length; ++i) {                    var executionContext = executionContexts[i];                    if (executionContext.frameId === frame.id && executionContext.isMainWorldContext)                        context = executionContext;                }                if (!context)                    return this._status.E_FAILED(frame.url + " has no execution context");            }            contextId = context.id;        }        var target = target ? target : WebInspector.targetManager.mainTarget();        if (!target)            return;        target.runtimeAgent().evaluate(expression, "extension", exposeCommandLineAPI, true, contextId, returnByValue, false, onEvalute);        function onEvalute(error, result, wasThrown)         {            if (error) {                callback(error, null , wasThrown);                return;            }            callback(error, target.runtimeModel.createRemoteObject(result), wasThrown);        }    },    __proto__: WebInspector.Object.prototype}WebInspector.ExtensionServerPanelDescriptor = function(name, title, panel) {    this._name = name;    this._title = title;    this._panel = panel;}WebInspector.ExtensionServerPanelDescriptor.prototype = {    name: function()     {        return this._name;    },    title: function()     {        return this._title;    },    panel: function()     {        return Promise.resolve(this._panel);    }}WebInspector.ExtensionStatus = function() {    function makeStatus(code, description)     {        var details = Array.prototype.slice.call(arguments, 2);        var status = {            code: code,            description: description,            details: details        };        if (code !== "OK") {            status.isError = true;            console.log("Extension server error: " + String.vsprintf(description, details));        }        return status;    }    this.OK = makeStatus.bind(null , "OK", "OK");    this.E_EXISTS = makeStatus.bind(null , "E_EXISTS", "Object already exists: %s");    this.E_BADARG = makeStatus.bind(null , "E_BADARG", "Invalid argument %s: %s");    this.E_BADARGTYPE = makeStatus.bind(null , "E_BADARGTYPE", "Invalid type for argument %s: got %s, expected %s");    this.E_NOTFOUND = makeStatus.bind(null , "E_NOTFOUND", "Object not found: %s");    this.E_NOTSUPPORTED = makeStatus.bind(null , "E_NOTSUPPORTED", "Object does not support requested operation: %s");    this.E_PROTOCOLERROR = makeStatus.bind(null , "E_PROTOCOLERROR", "Inspector protocol error: %s");    this.E_FAILED = makeStatus.bind(null , "E_FAILED", "Operation failed: %s");}WebInspector.ExtensionStatus.Record;WebInspector.extensionAPI = {};defineCommonExtensionSymbols(WebInspector.extensionAPI);;WebInspector.ExtensionPanel = function(server, id, pageURL) {    WebInspector.Panel.call(this, id);    this._server = server;    this.setHideOnDetach();    this._panelToolbar = new WebInspector.Toolbar(this.element);    this._panelToolbar.element.classList.add("hidden");    this._searchableView = new WebInspector.SearchableView(this);    this._searchableView.show(this.element);    var extensionView = new WebInspector.ExtensionView(server,id,pageURL,"extension");    extensionView.show(this._searchableView.element);    this.setDefaultFocusedElement(extensionView.defaultFocusedElement());}WebInspector.ExtensionPanel.prototype = {    defaultFocusedElement: function()     {        return WebInspector.Widget.prototype.defaultFocusedElement.call(this);    },    addToolbarItem: function(item)     {        this._panelToolbar.element.classList.remove("hidden");        this._panelToolbar.appendToolbarItem(item);    },    searchCanceled: function()     {        this._server.notifySearchAction(this.name, WebInspector.extensionAPI.panels.SearchAction.CancelSearch);        this._searchableView.updateSearchMatchesCount(0);    },    searchableView: function()     {        return this._searchableView;    },    performSearch: function(searchConfig, shouldJump, jumpBackwards)     {        var query = searchConfig.query;        this._server.notifySearchAction(this.name, WebInspector.extensionAPI.panels.SearchAction.PerformSearch, query);    },    jumpToNextSearchResult: function()     {        this._server.notifySearchAction(this.name, WebInspector.extensionAPI.panels.SearchAction.NextSearchResult);    },    jumpToPreviousSearchResult: function()     {        this._server.notifySearchAction(this.name, WebInspector.extensionAPI.panels.SearchAction.PreviousSearchResult);    },    supportsCaseSensitiveSearch: function()     {        return false;    },    supportsRegexSearch: function()     {        return false;    },    __proto__: WebInspector.Panel.prototype}WebInspector.ExtensionButton = function(server, id, iconURL, tooltip, disabled) {    this._id = id;    this._toolbarButton = new WebInspector.ToolbarButton("","extension");    this._toolbarButton.addEventListener("click", server.notifyButtonClicked.bind(server, this._id));    this.update(iconURL, tooltip, disabled);}WebInspector.ExtensionButton.prototype = {    update: function(iconURL, tooltip, disabled)     {        if (typeof iconURL === "string")            this._toolbarButton.setBackgroundImage(iconURL);        if (typeof tooltip === "string")            this._toolbarButton.setTitle(tooltip);        if (typeof disabled === "boolean")            this._toolbarButton.setEnabled(!disabled);    },    toolbarButton: function()     {        return this._toolbarButton;    }}WebInspector.ExtensionSidebarPane = function(server, panelName, title, id) {    WebInspector.SidebarPane.call(this, title);    this.setHideOnDetach();    this._panelName = panelName;    this._server = server;    this._id = id;}WebInspector.ExtensionSidebarPane.prototype = {    id: function()     {        return this._id;    },    panelName: function()     {        return this._panelName;    },    setObject: function(object, title, callback)     {        this._createObjectPropertiesView();        this._setObject(WebInspector.RemoteObject.fromLocalObject(object), title, callback);    },    setExpression: function(expression, title, evaluateOptions, securityOrigin, callback)     {        this._createObjectPropertiesView();        this._server.evaluate(expression, true, false, evaluateOptions, securityOrigin, this._onEvaluate.bind(this, title, callback));    },    setPage: function(url)     {        if (this._objectPropertiesView) {            this._objectPropertiesView.detach();            delete this._objectPropertiesView;        }        if (this._extensionView)            this._extensionView.detach(true);        this._extensionView = new WebInspector.ExtensionView(this._server,this._id,url,"extension fill");        this._extensionView.show(this.element);        if (!this.element.style.height)            this.setHeight("150px");    },    setHeight: function(height)     {        this.element.style.height = height;    },    _onEvaluate: function(title, callback, error, result, wasThrown)     {        if (error)            callback(error.toString());        else            this._setObject((result), title, callback);    },    _createObjectPropertiesView: function()     {        if (this._objectPropertiesView)            return;        if (this._extensionView) {            this._extensionView.detach(true);            delete this._extensionView;        }        this._objectPropertiesView = new WebInspector.ExtensionNotifierView(this._server,this._id);        this._objectPropertiesView.show(this.element);    },    _setObject: function(object, title, callback)     {        if (!this._objectPropertiesView) {            callback("operation cancelled");            return;        }        this._objectPropertiesView.element.removeChildren();        var section = new WebInspector.ObjectPropertiesSection(object,title);        if (!title)            section.titleLessMode();        section.expand();        section.editable = false;        this._objectPropertiesView.element.appendChild(section.element);        callback();    },    __proto__: WebInspector.SidebarPane.prototype};WebInspector.ExtensionView = function(server, id, src, className) {    WebInspector.Widget.call(this);    this.element.className = "vbox flex-auto";    this._server = server;    this._id = id;    this._iframe = createElement("iframe");    this._iframe.addEventListener("load", this._onLoad.bind(this), false);    this._iframe.src = src;    this._iframe.className = className;    this.setDefaultFocusedElement(this._iframe);    this.element.appendChild(this._iframe);}WebInspector.ExtensionView.prototype = {    wasShown: function()     {        if (typeof this._frameIndex === "number")            this._server.notifyViewShown(this._id, this._frameIndex);    },    willHide: function()     {        if (typeof this._frameIndex === "number")            this._server.notifyViewHidden(this._id);    },    _onLoad: function()     {        var frames = (window.frames);        this._frameIndex = Array.prototype.indexOf.call(frames, this._iframe.contentWindow);        if (this.isShowing())            this._server.notifyViewShown(this._id, this._frameIndex);    },    __proto__: WebInspector.Widget.prototype}WebInspector.ExtensionNotifierView = function(server, id) {    WebInspector.VBox.call(this);    this._server = server;    this._id = id;}WebInspector.ExtensionNotifierView.prototype = {    wasShown: function()     {        this._server.notifyViewShown(this._id);    },    willHide: function()     {        this._server.notifyViewHidden(this._id);    },    __proto__: WebInspector.VBox.prototype};WebInspector.OverridesSupport = function() {    this._touchEmulationSuspended = false;    this._emulateMobileEnabled = false;    this._userAgent = "";    this._pageResizer = null ;    this._deviceScale = 1;    this._fixedDeviceScale = false;    this._initialized = false;    this._deviceMetricsThrottler = new WebInspector.Throttler(0);    this.settings = {};    this.settings._emulationEnabled = WebInspector.settings.createSetting("emulationEnabled", false);    this.settings.userAgent = WebInspector.settings.createSetting("userAgent", "");    this.settings.emulateResolution = WebInspector.settings.createSetting("emulateResolution", true);    this.settings.deviceWidth = WebInspector.settings.createSetting("deviceWidth", 360);    this.settings.deviceHeight = WebInspector.settings.createSetting("deviceHeight", 640);    this.settings.deviceScaleFactor = WebInspector.settings.createSetting("deviceScaleFactor", 0);    this.settings.deviceFitWindow = WebInspector.settings.createSetting("deviceFitWindow", true);    this.settings.emulateMobile = WebInspector.settings.createSetting("emulateMobile", false);    this.settings.emulateTouch = WebInspector.settings.createSetting("emulateTouch", false);    this.settings.overrideGeolocation = WebInspector.settings.createSetting("overrideGeolocation", false);    this.settings.geolocationOverride = WebInspector.settings.createSetting("geolocationOverride", "");    this.settings.overrideDeviceOrientation = WebInspector.settings.createSetting("overrideDeviceOrientation", false);    this.settings.deviceOrientationOverride = WebInspector.settings.createSetting("deviceOrientationOverride", "");    this.settings.screenOrientationOverride = WebInspector.settings.createSetting("screenOrientationOverride", "");    this.settings.overrideCSSMedia = WebInspector.settings.createSetting("overrideCSSMedia", false);    this.settings.emulatedCSSMedia = WebInspector.settings.createSetting("emulatedCSSMedia", "print");    this.settings.javaScriptDisabled = WebInspector.moduleSetting("javaScriptDisabled");}WebInspector.OverridesSupport.Events = {    OverridesWarningUpdated: "OverridesWarningUpdated",    EmulationStateChanged: "EmulationStateChanged"}WebInspector.OverridesSupport.MaxDeviceSize = 9999;WebInspector.OverridesSupport.PageResizer = function() {};WebInspector.OverridesSupport.PageResizer.Events = {    AvailableSizeChanged: "AvailableSizeChanged",    ResizeRequested: "ResizeRequested",    FixedScaleRequested: "FixedScaleRequested",    InsetsChanged: "InsetsChanged"};WebInspector.OverridesSupport.PageResizer.prototype = {    update: function(dipWidth, dipHeight, scale) {}};WebInspector.OverridesSupport.Device = {};WebInspector.OverridesSupport.GeolocationPosition = function(latitude, longitude, error) {    this.latitude = latitude;    this.longitude = longitude;    this.error = error;}WebInspector.OverridesSupport.GeolocationPosition.prototype = {    toSetting: function()     {        return (typeof this.latitude === "number" && typeof this.longitude === "number" && typeof this.error === "string") ? this.latitude + "@" + this.longitude + ":" + this.error : "";    }}WebInspector.OverridesSupport.GeolocationPosition.parseSetting = function(value) {    if (value) {        var splitError = value.split(":");        if (splitError.length === 2) {            var splitPosition = splitError[0].split("@");            if (splitPosition.length === 2)                return new WebInspector.OverridesSupport.GeolocationPosition(parseFloat(splitPosition[0]),parseFloat(splitPosition[1]),splitError[1]);        }    }    return new WebInspector.OverridesSupport.GeolocationPosition(0,0,"");}WebInspector.OverridesSupport.GeolocationPosition.parseUserInput = function(latitudeString, longitudeString, errorStatus) {    function isUserInputValid(value)     {        if (!value)            return true;        return /^[-]?[0-9]*[.]?[0-9]*$/.test(value);    }    if (!latitudeString && !longitudeString)        return null ;    var isLatitudeValid = isUserInputValid(latitudeString);    var isLongitudeValid = isUserInputValid(longitudeString);    if (!isLatitudeValid && !isLongitudeValid)        return null ;    var latitude = isLatitudeValid ? parseFloat(latitudeString) : -1;    var longitude = isLongitudeValid ? parseFloat(longitudeString) : -1;    return new WebInspector.OverridesSupport.GeolocationPosition(latitude,longitude,errorStatus ? "PositionUnavailable" : "");}WebInspector.OverridesSupport.DeviceOrientation = function(alpha, beta, gamma) {    this.alpha = alpha;    this.beta = beta;    this.gamma = gamma;}WebInspector.OverridesSupport.DeviceOrientation.prototype = {    toSetting: function()     {        return JSON.stringify(this);    }}WebInspector.OverridesSupport.DeviceOrientation.parseSetting = function(value) {    if (value) {        var jsonObject = JSON.parse(value);        return new WebInspector.OverridesSupport.DeviceOrientation(jsonObject.alpha,jsonObject.beta,jsonObject.gamma);    }    return new WebInspector.OverridesSupport.DeviceOrientation(0,0,0);}WebInspector.OverridesSupport.DeviceOrientation.parseUserInput = function(alphaString, betaString, gammaString) {    function isUserInputValid(value)     {        if (!value)            return true;        return /^[-]?[0-9]*[.]?[0-9]*$/.test(value);    }    if (!alphaString && !betaString && !gammaString)        return null ;    var isAlphaValid = isUserInputValid(alphaString);    var isBetaValid = isUserInputValid(betaString);    var isGammaValid = isUserInputValid(gammaString);    if (!isAlphaValid && !isBetaValid && !isGammaValid)        return null ;    var alpha = isAlphaValid ? parseFloat(alphaString) : -1;    var beta = isBetaValid ? parseFloat(betaString) : -1;    var gamma = isGammaValid ? parseFloat(gammaString) : -1;    return new WebInspector.OverridesSupport.DeviceOrientation(alpha,beta,gamma);}WebInspector.OverridesSupport.deviceSizeValidator = function(value) {    if (!value || (/^[\d]+$/.test(value) && value >= 0 && value <= WebInspector.OverridesSupport.MaxDeviceSize))        return "";    return WebInspector.UIString("Value must be non-negative integer");}WebInspector.OverridesSupport.deviceScaleFactorValidator = function(value) {    if (!value || (/^[\d]+(\.\d+)?|\.\d+$/.test(value) && value >= 0 && value <= 10))        return "";    return WebInspector.UIString("Value must be non-negative float");}WebInspector.OverridesSupport._touchEventsScriptIdSymbol = Symbol("OverridesSupport.touchEventsScriptIdSymbol");WebInspector.OverridesSupport.prototype = {    canEmulate: function()     {        return !!this._target && this._targetCanEmulate;    },    emulationEnabled: function()     {        return this.canEmulate() && this.settings._emulationEnabled.get();    },    setEmulationEnabled: function(enabled)     {        if (this.canEmulate()) {            this.settings._emulationEnabled.set(enabled);            this.dispatchEventToListeners(WebInspector.OverridesSupport.Events.EmulationStateChanged);            if (enabled && this.settings.emulateResolution.get())                this._target.emulationAgent().resetScrollAndPageScaleFactor();        }    },    init: function(target, callback)     {        if (target.isPage())            target.emulationAgent().canEmulate(canEmulateCallback.bind(this));        else            canEmulateCallback.call(this, null , false);        function canEmulateCallback(error, canEmulate)         {            this._target = target;            this._targetCanEmulate = !error && canEmulate;            this._initialized = true;            if (this.canEmulate()) {                target.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.MainFrameNavigated, this._onMainFrameNavigated, this);                var domModel = WebInspector.DOMModel.fromTarget(this._target);                if (domModel)                    domModel.addEventListener(WebInspector.DOMModel.Events.InspectModeWillBeToggled, this._inspectModeWillBeToggled, this);                this._applyInitialOverrides();            }            this.dispatchEventToListeners(WebInspector.OverridesSupport.Events.EmulationStateChanged);            callback();        }    },    setPageResizer: function(pageResizer, availableSize, insets)     {        if (pageResizer === this._pageResizer)            return;        if (this._pageResizer) {            this._pageResizer.removeEventListener(WebInspector.OverridesSupport.PageResizer.Events.AvailableSizeChanged, this._onPageResizerAvailableSizeChanged, this);            this._pageResizer.removeEventListener(WebInspector.OverridesSupport.PageResizer.Events.ResizeRequested, this._onPageResizerResizeRequested, this);            this._pageResizer.removeEventListener(WebInspector.OverridesSupport.PageResizer.Events.FixedScaleRequested, this._onPageResizerFixedScaleRequested, this);            this._pageResizer.removeEventListener(WebInspector.OverridesSupport.PageResizer.Events.InsetsChanged, this._onPageResizerInsetsChanged, this);        }        this._pageResizer = pageResizer;        this._pageResizerAvailableSize = availableSize;        this._pageResizerInsets = insets;        if (this._pageResizer) {            this._pageResizer.addEventListener(WebInspector.OverridesSupport.PageResizer.Events.AvailableSizeChanged, this._onPageResizerAvailableSizeChanged, this);            this._pageResizer.addEventListener(WebInspector.OverridesSupport.PageResizer.Events.ResizeRequested, this._onPageResizerResizeRequested, this);            this._pageResizer.addEventListener(WebInspector.OverridesSupport.PageResizer.Events.FixedScaleRequested, this._onPageResizerFixedScaleRequested, this);            this._pageResizer.addEventListener(WebInspector.OverridesSupport.PageResizer.Events.InsetsChanged, this._onPageResizerInsetsChanged, this);        }        this._deviceMetricsChanged();    },    emulateDevice: function(device)     {        this._deviceMetricsChangedListenerMuted = true;        this._userAgentChangedListenerMuted = true;        this.settings.userAgent.set(device.userAgent);        this.settings.emulateResolution.set(true);        this.settings.deviceWidth.set(device.width);        this.settings.deviceHeight.set(device.height);        this.settings.deviceScaleFactor.set(device.deviceScaleFactor);        this.settings.emulateTouch.set(device.touch);        this.settings.emulateMobile.set(device.mobile);        delete this._deviceMetricsChangedListenerMuted;        delete this._userAgentChangedListenerMuted;        if (this._initialized) {            this._deviceMetricsChanged();            this._userAgentChanged();            this._target.emulationAgent().resetScrollAndPageScaleFactor();        }    },    reset: function()     {        this._deviceMetricsChangedListenerMuted = true;        this._userAgentChangedListenerMuted = true;        this.settings.userAgent.set("");        this.settings.emulateResolution.set(false);        this.settings.deviceScaleFactor.set(0);        this.settings.emulateTouch.set(false);        this.settings.emulateMobile.set(false);        this.settings.overrideDeviceOrientation.set(false);        this.settings.screenOrientationOverride.set("");        this.settings.overrideGeolocation.set(false);        this.settings.overrideCSSMedia.set(false);        delete this._deviceMetricsChangedListenerMuted;        delete this._userAgentChangedListenerMuted;        if (this._initialized) {            this._deviceMetricsChanged();            this._userAgentChanged();        }    },    isEmulatingDevice: function(device)     {        var sameResolution = this.settings.emulateResolution.get() ? (this.settings.deviceWidth.get() === device.width && this.settings.deviceHeight.get() === device.height && this.settings.deviceScaleFactor.get() === device.deviceScaleFactor) : (!device.width && !device.height && !device.deviceScaleFactor);        return this.settings.userAgent.get() === device.userAgent && this.settings.emulateTouch.get() === device.touch && this.settings.emulateMobile.get() === device.mobile && sameResolution;    },    _inspectModeWillBeToggled: function(event)     {        var inspectModeEnabled = (event.data);        this._touchEmulationSuspended = inspectModeEnabled;        this._emulateTouchEventsChanged();    },    _applyInitialOverrides: function()     {        this.settings._emulationEnabled.addChangeListener(this._userAgentChanged, this);        this.settings.userAgent.addChangeListener(this._userAgentChanged, this);        this.settings._emulationEnabled.addChangeListener(this._deviceMetricsChanged, this);        this.settings.emulateResolution.addChangeListener(this._deviceMetricsChanged, this);        this.settings.deviceWidth.addChangeListener(this._deviceMetricsChanged, this);        this.settings.deviceHeight.addChangeListener(this._deviceMetricsChanged, this);        this.settings.deviceScaleFactor.addChangeListener(this._deviceMetricsChanged, this);        this.settings.emulateMobile.addChangeListener(this._deviceMetricsChanged, this);        this.settings.deviceFitWindow.addChangeListener(this._deviceMetricsChanged, this);        this.settings._emulationEnabled.addChangeListener(this._geolocationPositionChanged, this);        this.settings.overrideGeolocation.addChangeListener(this._geolocationPositionChanged, this);        this.settings.geolocationOverride.addChangeListener(this._geolocationPositionChanged, this);        this.settings._emulationEnabled.addChangeListener(this._deviceOrientationChanged, this);        this.settings.overrideDeviceOrientation.addChangeListener(this._deviceOrientationChanged, this);        this.settings.deviceOrientationOverride.addChangeListener(this._deviceOrientationChanged, this);        this.settings._emulationEnabled.addChangeListener(this._screenOrientationChanged, this);        this.settings.screenOrientationOverride.addChangeListener(this._screenOrientationChanged, this);        this.settings._emulationEnabled.addChangeListener(this._emulateTouchEventsChanged, this);        this.settings.emulateTouch.addChangeListener(this._emulateTouchEventsChanged, this);        this.settings._emulationEnabled.addChangeListener(this._cssMediaChanged, this);        this.settings.overrideCSSMedia.addChangeListener(this._cssMediaChanged, this);        this.settings.emulatedCSSMedia.addChangeListener(this._cssMediaChanged, this);        this.settings.javaScriptDisabled.addChangeListener(this._javaScriptDisabledChanged, this);        this._javaScriptDisabledChanged();        this.settings._emulationEnabled.addChangeListener(this._showRulersChanged, this);        WebInspector.moduleSetting("showMetricsRulers").addChangeListener(this._showRulersChanged, this);        this._showRulersChanged();        if (this.emulationEnabled()) {            if (this.settings.overrideDeviceOrientation.get())                this._deviceOrientationChanged();            if (this.settings.screenOrientationOverride.get())                this._screenOrientationChanged();            if (this.settings.overrideGeolocation.get())                this._geolocationPositionChanged();            if (this.settings.emulateTouch.get())                this._emulateTouchEventsChanged();            if (this.settings.overrideCSSMedia.get())                this._cssMediaChanged();            this._deviceMetricsChanged();            if (this.settings.emulateResolution.get())                this._target.emulationAgent().resetScrollAndPageScaleFactor();            this._userAgentChanged();        }    },    _userAgentChanged: function()     {        if (this._userAgentChangedListenerMuted)            return;        var userAgent = this.emulationEnabled() ? this.settings.userAgent.get() : "";        WebInspector.multitargetNetworkManager.setUserAgentOverride(userAgent);        if (this._userAgent !== userAgent)            this._updateUserAgentWarningMessage(WebInspector.UIString("You might need to reload the page for proper user agent spoofing and viewport rendering."));        this._userAgent = userAgent;    },    _onPageResizerAvailableSizeChanged: function(event)     {        this._pageResizerAvailableSize = (event.data.size);        this._pageResizerInsets = (event.data.insets);        this._deviceMetricsChanged();    },    _onPageResizerInsetsChanged: function(event)     {        this._pageResizerInsets = (event.data);    },    _onPageResizerResizeRequested: function(event)     {        if (typeof event.data.width !== "undefined") {            var width = (event.data.width);            if (width !== this.settings.deviceWidth.get())                this.settings.deviceWidth.set(width);        }        if (typeof event.data.height !== "undefined") {            var height = (event.data.height);            if (height !== this.settings.deviceHeight.get())                this.settings.deviceHeight.set(height);        }    },    _onPageResizerFixedScaleRequested: function(event)     {        this._fixedDeviceScale = (event.data);        this._deviceMetricsChanged();    },    _deviceMetricsChanged: function()     {        if (!this._initialized)            return;        this._showRulersChanged();        if (this._deviceMetricsChangedListenerMuted)            return;        if (!this.emulationEnabled()) {            this._deviceMetricsThrottler.schedule(clearDeviceMetricsOverride.bind(this));            if (this._pageResizer)                this._pageResizer.update(0, 0, 1);            return;        }        var dipWidth = this.settings.emulateResolution.get() ? this.settings.deviceWidth.get() : 0;        var dipHeight = this.settings.emulateResolution.get() ? this.settings.deviceHeight.get() : 0;        var overrideWidth = dipWidth;        var overrideHeight = dipHeight;        var screenWidth = dipWidth;        var screenHeight = dipHeight;        var positionX = 0;        var positionY = 0;        var scale = 1;        if (this._pageResizer) {            var available = this._pageResizerAvailableSize;            var insets = this._pageResizerInsets;            if (this.settings.deviceFitWindow.get()) {                if (this._fixedDeviceScale) {                    scale = this._deviceScale;                } else {                    scale = 1;                    while (available.width < (dipWidth + insets.left + insets.right) * scale || available.height < (dipHeight + insets.top + insets.bottom) * scale)                        scale *= 0.8;                }            }            this._pageResizer.update(Math.min(dipWidth * scale, available.width - insets.left * scale), Math.min(dipHeight * scale, available.height - insets.top * scale), scale);            if (scale === 1 && available.width >= dipWidth && available.height >= dipHeight) {                overrideWidth = 0;                overrideHeight = 0;            }            if (dipWidth === 0 && dipHeight !== 0)                overrideWidth = Math.round(available.width / scale);            if (dipHeight === 0 && dipWidth !== 0)                overrideHeight = Math.round(available.height / scale);            screenWidth = dipWidth + insets.left + insets.right;            screenHeight = dipHeight + insets.top + insets.bottom;            positionX = insets.left;            positionY = insets.top;        }        this._deviceScale = scale;        this._deviceMetricsThrottler.schedule(setDeviceMetricsOverride.bind(this));        function setDeviceMetricsOverride(finishCallback)         {            this._target.emulationAgent().setDeviceMetricsOverride(overrideWidth, overrideHeight, this.settings.emulateResolution.get() ? this.settings.deviceScaleFactor.get() : 0, this.settings.emulateMobile.get(), this._pageResizer ? false : this.settings.deviceFitWindow.get(), scale, 0, 0, screenWidth, screenHeight, positionX, positionY, apiCallback.bind(this, finishCallback));        }        function clearDeviceMetricsOverride(finishCallback)         {            this._target.emulationAgent().clearDeviceMetricsOverride(apiCallback.bind(this, finishCallback));        }        function apiCallback(finishCallback, error)         {            if (error) {                this._updateDeviceMetricsWarningMessage(WebInspector.UIString("Screen emulation is not available on this page."));                this._deviceMetricsOverrideAppliedForTest();                finishCallback();                return;            }            var mobileEnabled = this.emulationEnabled() && this.settings.emulateMobile.get();            if (this._emulateMobileEnabled !== mobileEnabled)                this._updateDeviceMetricsWarningMessage(WebInspector.UIString("You might need to reload the page for proper user agent spoofing and viewport rendering."));            this._emulateMobileEnabled = mobileEnabled;            this._deviceMetricsOverrideAppliedForTest();            finishCallback();        }    },    _deviceMetricsOverrideAppliedForTest: function()     {},    _geolocationPositionChanged: function()     {        if (!this.emulationEnabled() || !this.settings.overrideGeolocation.get()) {            this._target.emulationAgent().clearGeolocationOverride();            return;        }        var geolocation = WebInspector.OverridesSupport.GeolocationPosition.parseSetting(this.settings.geolocationOverride.get());        if (geolocation.error)            this._target.emulationAgent().setGeolocationOverride();        else            this._target.emulationAgent().setGeolocationOverride(geolocation.latitude, geolocation.longitude, 150);    },    _deviceOrientationChanged: function()     {        if (!this.emulationEnabled() || !this.settings.overrideDeviceOrientation.get()) {            this._target.deviceOrientationAgent().clearDeviceOrientationOverride();            return;        }        var deviceOrientation = WebInspector.OverridesSupport.DeviceOrientation.parseSetting(this.settings.deviceOrientationOverride.get());        this._target.deviceOrientationAgent().setDeviceOrientationOverride(deviceOrientation.alpha, deviceOrientation.beta, deviceOrientation.gamma);    },    _screenOrientationChanged: function()     {        if (!this.emulationEnabled() || !this.settings.screenOrientationOverride.get()) {            this._target.screenOrientationAgent().clearScreenOrientationOverride();            return;        }        var screenOrientation = this.settings.screenOrientationOverride.get();        this._target.screenOrientationAgent().setScreenOrientationOverride(screenOrientation === "landscapePrimary" ? 90 : 0, screenOrientation);    },    _emulateTouchEventsChanged: function()     {        var emulationEnabled = this.emulationEnabled() && this.settings.emulateTouch.get() && !this._touchEmulationSuspended;        var configuration = this.settings.emulateMobile.get() ? "mobile" : "desktop";        var target = this._target;        const injectedFunction = function() {            const touchEvents = ["ontouchstart", "ontouchend", "ontouchmove", "ontouchcancel"];            var recepients = [window.__proto__, document.__proto__];            for (var i = 0; i < touchEvents.length; ++i) {                for (var j = 0; j < recepients.length; ++j) {                    if (!(touchEvents[i] in recepients[j]))                        Object.defineProperty(recepients[j], touchEvents[i], {                            value: null ,                            writable: true,                            configurable: true,                            enumerable: true                        });                }            }        }        var symbol = WebInspector.OverridesSupport._touchEventsScriptIdSymbol;        if (emulationEnabled && target[symbol] !== -1) {            target[symbol] = -1;            target.pageAgent().addScriptToEvaluateOnLoad("(" + injectedFunction.toString() + ")()", scriptAddedCallback);        } else {            if (typeof target[symbol] !== "undefined") {                target.pageAgent().removeScriptToEvaluateOnLoad(target[symbol]);                delete target[symbol];            }        }        function scriptAddedCallback(error, scriptId)         {            if (error)                delete target[symbol];            else                target[symbol] = scriptId;        }        target.emulationAgent().setTouchEmulationEnabled(emulationEnabled, configuration);    },    _cssMediaChanged: function()     {        var enabled = this.emulationEnabled() && this.settings.overrideCSSMedia.get();        this._target.emulationAgent().setEmulatedMedia(enabled ? this.settings.emulatedCSSMedia.get() : "");        var cssModel = WebInspector.CSSStyleModel.fromTarget(this._target);        if (cssModel)            cssModel.mediaQueryResultChanged();    },    _javaScriptDisabledChanged: function()     {        this._target.emulationAgent().setScriptExecutionDisabled(this.settings.javaScriptDisabled.get());    },    _pageResizerActive: function()     {        return this._pageResizer && this.emulationEnabled();    },    _showRulersChanged: function()     {        var showRulersValue = WebInspector.moduleSetting("showMetricsRulers").get();        for (var target of WebInspector.targetManager.targets(WebInspector.Target.Type.Page)) {            target.pageAgent().setShowViewportSizeOnResize(!this._pageResizerActive(), showRulersValue);            var domModel = WebInspector.DOMModel.fromTarget(target);            if (domModel)                domModel.setHighlightSettings(showRulersValue && !this._pageResizerActive(), showRulersValue);        }    },    _onMainFrameNavigated: function()     {        this._deviceMetricsChanged();        this._updateUserAgentWarningMessage("");        this._updateDeviceMetricsWarningMessage("");    },    _dispatchWarningChanged: function()     {        this.dispatchEventToListeners(WebInspector.OverridesSupport.Events.OverridesWarningUpdated);    },    _updateDeviceMetricsWarningMessage: function(warningMessage)     {        this._deviceMetricsWarningMessage = warningMessage;        this._dispatchWarningChanged();    },    _updateUserAgentWarningMessage: function(warningMessage)     {        this._userAgentWarningMessage = warningMessage;        this._dispatchWarningChanged();    },    warningMessage: function()     {        return this._deviceMetricsWarningMessage || this._userAgentWarningMessage || "";    },    clearWarningMessage: function()     {        this._deviceMetricsWarningMessage = "";        this._userAgentWarningMessage = "";        this._dispatchWarningChanged();    },    swapDimensions: function()     {        var width = WebInspector.overridesSupport.settings.deviceWidth.get();        var height = WebInspector.overridesSupport.settings.deviceHeight.get();        WebInspector.overridesSupport.settings.deviceWidth.set(height);        WebInspector.overridesSupport.settings.deviceHeight.set(width);    },    __proto__: WebInspector.Object.prototype}WebInspector.overridesSupport;;WebInspector.EmulatedDevice = function() {    this.title = "";    this.type = WebInspector.EmulatedDevice.Type.Unknown;    this.vertical = {        width: 0,        height: 0,        outlineInsets: null ,        outlineImages: null     };    this.horizontal = {        width: 0,        height: 0,        outlineInsets: null ,        outlineImages: null     };    this.deviceScaleFactor = 1;    this.capabilities = [WebInspector.EmulatedDevice.Capability.Touch, WebInspector.EmulatedDevice.Capability.Mobile];    this.userAgent = "";    this.modes = [];    this._show = WebInspector.EmulatedDevice._Show.Default;    this._showByDefault = true;    this._extension = null ;}WebInspector.EmulatedDevice.Mode;WebInspector.EmulatedDevice.Orientation;WebInspector.EmulatedDevice.Horizontal = "horizontal";WebInspector.EmulatedDevice.Vertical = "vertical";WebInspector.EmulatedDevice.Type = {    Phone: "phone",    Tablet: "tablet",    Notebook: "notebook",    Desktop: "desktop",    Unknown: "unknown"}WebInspector.EmulatedDevice.Capability = {    Touch: "touch",    Mobile: "mobile"}WebInspector.EmulatedDevice._Show = {    Always: "Always",    Default: "Default",    Never: "Never"}WebInspector.EmulatedDevice.fromJSONV1 = function(json) {    try {        function parseValue(object, key, type, defaultValue)         {            if (typeof object !== "object" || object === null  || !object.hasOwnProperty(key)) {                if (typeof defaultValue !== "undefined")                    return defaultValue;                throw new Error("Emulated device is missing required property '" + key + "'");            }            var value = object[key];            if (typeof value !== type || value === null )                throw new Error("Emulated device property '" + key + "' has wrong type '" + typeof value + "'");            return value;        }        function parseIntValue(object, key)         {            var value = (parseValue(object, key, "number"));            if (value !== Math.abs(value))                throw new Error("Emulated device value '" + key + "' must be integer");            return value;        }        function parseInsets(json)         {            return new Insets(parseIntValue(json, "left"),parseIntValue(json, "top"),parseIntValue(json, "right"),parseIntValue(json, "bottom"));        }        function parseImages(json)         {            if (!Array.isArray(json))                throw new Error("Emulated device images is not an array");            var result = new WebInspector.EmulatedDevice.Images();            for (var i = 0; i < json.length; ++i) {                var src = (parseValue(json[i], "src", "string"));                var scale = (parseValue(json[i], "scale", "number"));                if (scale <= 0)                    throw new Error("Emulated device property image scale must be positive");                result.addSource(src, scale);            }            return result;        }        function parseOrientation(json)         {            var result = {};            result.width = parseIntValue(json, "width");            if (result.width < 0 || result.width > WebInspector.OverridesSupport.MaxDeviceSize)                throw new Error("Emulated device has wrong width: " + result.width);            result.height = parseIntValue(json, "height");            if (result.height < 0 || result.height > WebInspector.OverridesSupport.MaxDeviceSize)                throw new Error("Emulated device has wrong height: " + result.height);            var outlineInsets = parseValue(json["outline"], "insets", "object", null );            if (outlineInsets) {                result.outlineInsets = parseInsets(outlineInsets);                if (result.outlineInsets.left < 0 || result.outlineInsets.top < 0)                    throw new Error("Emulated device has wrong outline insets");                result.outlineImages = parseImages(parseValue(json["outline"], "images", "object"));            }            return ( result) ;        }        var result = new WebInspector.EmulatedDevice();        result.title = (parseValue(json, "title", "string"));        result.type = (parseValue(json, "type", "string"));        result.userAgent = (parseValue(json, "user-agent", "string"));        var capabilities = parseValue(json, "capabilities", "object", []);        if (!Array.isArray(capabilities))            throw new Error("Emulated device capabilities must be an array");        result.capabilities = [];        for (var i = 0; i < capabilities.length; ++i) {            if (typeof capabilities[i] !== "string")                throw new Error("Emulated device capability must be a string");            result.capabilities.push(capabilities[i]);        }        result.deviceScaleFactor = (parseValue(json["screen"], "device-pixel-ratio", "number"));        if (result.deviceScaleFactor < 0 || result.deviceScaleFactor > 100)            throw new Error("Emulated device has wrong deviceScaleFactor: " + result.deviceScaleFactor);        result.vertical = parseOrientation(parseValue(json["screen"], "vertical", "object"));        result.horizontal = parseOrientation(parseValue(json["screen"], "horizontal", "object"));        var modes = parseValue(json, "modes", "object", []);        if (!Array.isArray(modes))            throw new Error("Emulated device modes must be an array");        result.modes = [];        for (var i = 0; i < modes.length; ++i) {            var mode = {};            mode.title = (parseValue(modes[i], "title", "string"));            mode.orientation = (parseValue(modes[i], "orientation", "string"));            if (mode.orientation !== WebInspector.EmulatedDevice.Vertical && mode.orientation !== WebInspector.EmulatedDevice.Horizontal)                throw new Error("Emulated device mode has wrong orientation '" + mode.orientation + "'");            var orientation = result.orientationByName(mode.orientation);            mode.insets = parseInsets(parseValue(modes[i], "insets", "object"));            if (mode.insets.top < 0 || mode.insets.left < 0 || mode.insets.right < 0 || mode.insets.bottom < 0 || mode.insets.top + mode.insets.bottom > orientation.height || mode.insets.left + mode.insets.right > orientation.width) {                throw new Error("Emulated device mode '" + mode.title + "'has wrong mode insets");            }            if (modes[i].hasOwnProperty("images"))                mode.images = parseImages(parseValue(modes[i], "images", "object"));            result.modes.push(mode);        }        result._showByDefault = (parseValue(json, "show-by-default", "boolean", true));        result._show = (parseValue(json, "show", "string", WebInspector.EmulatedDevice._Show.Default));        return result;    } catch (e) {        WebInspector.console.error("Failed to update emulated device list. " + String(e));        return null ;    }}WebInspector.EmulatedDevice.fromOverridesDevice = function(device, title, type) {    var result = new WebInspector.EmulatedDevice();    result.title = title;    result.type = type || WebInspector.EmulatedDevice.Type.Unknown;    result.vertical.width = device.width;    result.vertical.height = device.height;    result.horizontal.width = device.height;    result.horizontal.height = device.width;    result.deviceScaleFactor = device.deviceScaleFactor;    result.userAgent = device.userAgent;    result.capabilities = [];    if (device.touch)        result.capabilities.push(WebInspector.EmulatedDevice.Capability.Touch);    if (device.mobile)        result.capabilities.push(WebInspector.EmulatedDevice.Capability.Mobile);    return result;}WebInspector.EmulatedDevice.compareByTitle = function(device1, device2) {    return device1.title < device2.title ? -1 : (device1.title > device2.title ? 1 : 0);}WebInspector.EmulatedDevice.prototype = {    extension: function()     {        return this._extension;    },    setExtension: function(extension)     {        this._extension = extension;    },    modesForOrientation: function(orientation)     {        var result = [];        for (var index = 0; index < this.modes.length; index++) {            if (this.modes[index].orientation === orientation)                result.push(this.modes[index]);        }        return result;    },    _toJSON: function()     {        var json = {};        json["title"] = this.title;        json["type"] = this.type;        json["user-agent"] = this.userAgent;        json["capabilities"] = this.capabilities;        json["screen"] = {};        json["screen"]["device-pixel-ratio"] = this.deviceScaleFactor;        json["screen"]["vertical"] = this._orientationToJSON(this.vertical);        json["screen"]["horizontal"] = this._orientationToJSON(this.horizontal);        json["modes"] = [];        for (var i = 0; i < this.modes.length; ++i) {            var mode = {};            mode["title"] = this.modes[i].title;            mode["orientation"] = this.modes[i].orientation;            mode["insets"] = {};            mode["insets"]["left"] = this.modes[i].insets.left;            mode["insets"]["top"] = this.modes[i].insets.top;            mode["insets"]["right"] = this.modes[i].insets.right;            mode["insets"]["bottom"] = this.modes[i].insets.bottom;            if (this.modes[i].images)                mode["images"] = this.modes[i].images._toJSON();            json["modes"].push(mode);        }        json["show-by-default"] = this._showByDefault;        json["show"] = this._show;        return json;    },    _orientationToJSON: function(orientation)     {        var json = {};        json["width"] = orientation.width;        json["height"] = orientation.height;        if (orientation.outlineInsets) {            json["outline"] = {};            json["outline"]["insets"] = {};            json["outline"]["insets"]["left"] = orientation.outlineInsets.left;            json["outline"]["insets"]["top"] = orientation.outlineInsets.top;            json["outline"]["insets"]["right"] = orientation.outlineInsets.right;            json["outline"]["insets"]["bottom"] = orientation.outlineInsets.bottom;            json["outline"]["images"] = orientation.outlineImages._toJSON();        }        return json;    },    modeToOverridesDevice: function(mode)     {        var result = {};        var orientation = this.orientationByName(mode.orientation);        result.width = orientation.width - mode.insets.left - mode.insets.right;        result.height = orientation.height - mode.insets.top - mode.insets.bottom;        result.deviceScaleFactor = this.deviceScaleFactor;        result.userAgent = this.userAgent;        result.touch = this.touch();        result.mobile = this.mobile();        return result;    },    orientationByName: function(name)     {        return name === WebInspector.EmulatedDevice.Vertical ? this.vertical : this.horizontal;    },    show: function()     {        if (this._show === WebInspector.EmulatedDevice._Show.Default)            return this._showByDefault;        return this._show === WebInspector.EmulatedDevice._Show.Always;    },    setShow: function(show)     {        this._show = show ? WebInspector.EmulatedDevice._Show.Always : WebInspector.EmulatedDevice._Show.Never;    },    copyShowFrom: function(other)     {        this._show = other._show;    },    touch: function()     {        return this.capabilities.indexOf(WebInspector.EmulatedDevice.Capability.Touch) !== -1;    },    mobile: function()     {        return this.capabilities.indexOf(WebInspector.EmulatedDevice.Capability.Mobile) !== -1;    }}WebInspector.EmulatedDevice.Images = function() {    WebInspector.Object.call(this);    this._sources = [];    this._scales = [];}WebInspector.EmulatedDevice.Images.prototype = {    _toJSON: function()     {        var result = [];        for (var i = 0; i < this._sources.length; ++i)            result.push({                src: this._sources[i],                scale: this._scales[i]            });        return result;    },    addSource: function(src, scale)     {        this._sources.push(src);        this._scales.push(scale);    },    __proto__: WebInspector.Object.prototype}WebInspector.EmulatedDevicesList = function() {    WebInspector.Object.call(this);    WebInspector.settings.createSetting("standardEmulatedDeviceList", []).remove();    this._standardSetting = WebInspector.settings.createSetting("standardEmulatedDeviceList", []);    this._standard = this._listFromJSONV1(this._standardSetting.get());    this._updateStandardDevices();    this._customSetting = WebInspector.settings.createSetting("customEmulatedDeviceList", []);    this._custom = this._listFromJSONV1(this._customSetting.get());}WebInspector.EmulatedDevicesList.Events = {    CustomDevicesUpdated: "CustomDevicesUpdated",    StandardDevicesUpdated: "StandardDevicesUpdated"}WebInspector.EmulatedDevicesList.prototype = {    _updateStandardDevices: function()     {        var devices = [];        var extensions = self.runtime.extensions("emulated-device");        for (var i = 0; i < extensions.length; ++i) {            var device = WebInspector.EmulatedDevice.fromJSONV1(extensions[i].descriptor()["device"]);            device.setExtension(extensions[i]);            devices.push(device);        }        this._copyShowValues(this._standard, devices);        this._standard = devices;        this.saveStandardDevices();    },    _listFromJSONV1: function(jsonArray)     {        var result = [];        if (!Array.isArray(jsonArray))            return result;        for (var i = 0; i < jsonArray.length; ++i) {            var device = WebInspector.EmulatedDevice.fromJSONV1(jsonArray[i]);            if (device) {                result.push(device);                if (!device.modes.length) {                    device.modes.push({                        title: "",                        orientation: WebInspector.EmulatedDevice.Horizontal,                        insets: new Insets(0,0,0,0),                        images: null                     });                    device.modes.push({                        title: "",                        orientation: WebInspector.EmulatedDevice.Vertical,                        insets: new Insets(0,0,0,0),                        images: null                     });                }            }        }        return result;    },    standard: function()     {        return this._standard;    },    custom: function()     {        return this._custom;    },    addCustomDevice: function(device)     {        this._custom.push(device);        this.saveCustomDevices();    },    removeCustomDevice: function(device)     {        this._custom.remove(device);        this.saveCustomDevices();    },    saveCustomDevices: function()     {        var json = this._custom.map(function(device) {            return device._toJSON();        }        );        this._customSetting.set(json);        this.dispatchEventToListeners(WebInspector.EmulatedDevicesList.Events.CustomDevicesUpdated);    },    saveStandardDevices: function()     {        var json = this._standard.map(function(device) {            return device._toJSON();        }        );        this._standardSetting.set(json);        this.dispatchEventToListeners(WebInspector.EmulatedDevicesList.Events.StandardDevicesUpdated);    },    _copyShowValues: function(from, to)     {        var deviceById = new Map();        for (var i = 0; i < from.length; ++i)            deviceById.set(from[i].title, from[i]);        for (var i = 0; i < to.length; ++i) {            var title = to[i].title;            if (deviceById.has(title))                to[i].copyShowFrom((deviceById.get(title)));        }    },    __proto__: WebInspector.Object.prototype}WebInspector.emulatedDevicesList;;WebInspector.DevicesSettingsTab = function() {    WebInspector.VBox.call(this);    this.element.classList.add("settings-tab-container");    this.element.classList.add("devices-settings-tab");    this.registerRequiredCSS("emulation/devicesSettingsTab.css");    var header = this.element.createChild("header");    header.createChild("h3").createTextChild(WebInspector.UIString("Devices"));    this.containerElement = this.element.createChild("div", "help-container-wrapper").createChild("div", "settings-tab help-content help-container");    this.containerElement.createChild("div", "devices-title").textContent = WebInspector.UIString("Emulated devices");    this._devicesList = this.containerElement.createChild("div", "devices-list");    this._customListSearator = createElementWithClass("div", "devices-custom-separator");    var buttonsRow = this.containerElement.createChild("div", "devices-button-row");    this._addCustomButton = createTextButton(WebInspector.UIString("Add custom device..."), this._addCustomDevice.bind(this));    buttonsRow.appendChild(this._addCustomButton);    this._editDevice = null ;    this._editDeviceListItem = null ;    this._createEditDeviceElement();    this._muteUpdate = false;    WebInspector.emulatedDevicesList.addEventListener(WebInspector.EmulatedDevicesList.Events.CustomDevicesUpdated, this._devicesUpdated, this);    WebInspector.emulatedDevicesList.addEventListener(WebInspector.EmulatedDevicesList.Events.StandardDevicesUpdated, this._devicesUpdated, this);}WebInspector.DevicesSettingsTab.prototype = {    wasShown: function()     {        WebInspector.VBox.prototype.wasShown.call(this);        this._devicesUpdated();        this._stopEditing();    },    _devicesUpdated: function()     {        if (this._muteUpdate)            return;        this._devicesList.removeChildren();        var devices = WebInspector.emulatedDevicesList.custom().slice();        devices.sort(WebInspector.EmulatedDevice.compareByTitle);        for (var i = 0; i < devices.length; ++i)            this._devicesList.appendChild(this._createDeviceListItem(devices[i], true));        this._devicesList.appendChild(this._customListSearator);        this._updateSeparatorVisibility();        devices = WebInspector.emulatedDevicesList.standard().slice();        devices.sort(WebInspector.EmulatedDevice.compareByTitle);        for (var i = 0; i < devices.length; ++i)            this._devicesList.appendChild(this._createDeviceListItem(devices[i], false));    },    _updateSeparatorVisibility: function()     {        this._customListSearator.classList.toggle("hidden", this._devicesList.firstChild === this._customListSearator);    },    _muteAndSaveDeviceList: function(custom)     {        this._muteUpdate = true;        if (custom)            WebInspector.emulatedDevicesList.saveCustomDevices();        else            WebInspector.emulatedDevicesList.saveStandardDevices();        this._muteUpdate = false;    },    _createDeviceListItem: function(device, custom)     {        var item = createElementWithClass("div", "devices-list-item");        var checkbox = item.createChild("input", "devices-list-checkbox");        checkbox.type = "checkbox";        checkbox.checked = device.show();        item.createChild("div", "devices-list-title").textContent = device.title;        item.addEventListener("click", onItemClicked.bind(this), false);        item.classList.toggle("device-list-item-show", device.show());        if (custom) {            var editButton = item.createChild("div", "devices-list-edit");            editButton.title = WebInspector.UIString("Edit");            editButton.addEventListener("click", onEditClicked.bind(this), false);            var removeButton = item.createChild("div", "devices-list-remove");            removeButton.title = WebInspector.UIString("Remove");            removeButton.addEventListener("click", onRemoveClicked, false);        }        function onItemClicked(event)         {            var show = !checkbox.checked;            device.setShow(show);            this._muteAndSaveDeviceList(custom);            checkbox.checked = show;            item.classList.toggle("device-list-item-show", show);            event.consume();        }        function onEditClicked(event)         {            event.consume();            this._startEditing(device, item);        }        function onRemoveClicked(event)         {            WebInspector.emulatedDevicesList.removeCustomDevice(device);            event.consume();        }        return item;    },    _addCustomDevice: function()     {        this._startEditing(new WebInspector.EmulatedDevice(), null );    },    _createEditDeviceElement: function()     {        this._editDeviceElement = createElementWithClass("div", "devices-edit-container");        this._editDeviceElement.addEventListener("keydown", onKeyDown.bind(null , isEscKey, this._stopEditing.bind(this)), false);        this._editDeviceElement.addEventListener("keydown", onKeyDown.bind(null , isEnterKey, this._editDeviceCommitClicked.bind(this)), false);        this._editDeviceCheckbox = this._editDeviceElement.createChild("input", "devices-edit-checkbox");        this._editDeviceCheckbox.type = "checkbox";        var fields = this._editDeviceElement.createChild("div", "devices-edit-fields");        this._editDeviceTitle = this._createInput(WebInspector.UIString("Device name"));        fields.appendChild(this._editDeviceTitle);        var screen = fields.createChild("div", "hbox");        this._editDeviceWidth = this._createInput(WebInspector.UIString("Width"), "120px");        screen.appendChild(this._editDeviceWidth);        this._editDeviceHeight = this._createInput(WebInspector.UIString("Height"), "120px");        screen.appendChild(this._editDeviceHeight);        this._editDeviceScale = this._createInput(WebInspector.UIString("Device pixel ratio"));        screen.appendChild(this._editDeviceScale);        this._editDeviceUserAgent = this._createInput(WebInspector.UIString("User agent string"));        fields.appendChild(this._editDeviceUserAgent);        var buttonsRow = fields.createChild("div", "devices-edit-buttons");        this._editDeviceCommitButton = createTextButton("", this._editDeviceCommitClicked.bind(this));        buttonsRow.appendChild(this._editDeviceCommitButton);        this._editDeviceCancelButton = createTextButton(WebInspector.UIString("Cancel"), this._stopEditing.bind(this));        this._editDeviceCancelButton.addEventListener("keydown", onKeyDown.bind(null , isEnterKey, this._stopEditing.bind(this)), false);        buttonsRow.appendChild(this._editDeviceCancelButton);        function onKeyDown(predicate, callback, event)         {            if (predicate(event)) {                event.consume(true);                callback();            }        }    },    _createInput: function(title, width)     {        var input = createElement("input");        input.type = "text";        if (width)            input.style.width = width;        input.placeholder = title;        input.addEventListener("input", this._validateInputs.bind(this), false);        return input;    },    _validateInputs: function()     {        var trimmedTitle = this._editDeviceTitle.value.trim();        var titleValid = trimmedTitle.length > 0 && trimmedTitle.length < 50;        this._editDeviceTitle.classList.toggle("error-input", !titleValid);        var widthValid = !WebInspector.OverridesSupport.deviceSizeValidator(this._editDeviceWidth.value);        this._editDeviceWidth.classList.toggle("error-input", !widthValid);        var heightValid = !WebInspector.OverridesSupport.deviceSizeValidator(this._editDeviceHeight.value);        this._editDeviceHeight.classList.toggle("error-input", !heightValid);        var scaleValid = !WebInspector.OverridesSupport.deviceScaleFactorValidator(this._editDeviceScale.value);        this._editDeviceScale.classList.toggle("error-input", !scaleValid);        var allValid = titleValid && widthValid && heightValid && scaleValid;        this._editDeviceCommitButton.disabled = !allValid;    },    _toNumericInputValue: function(value)     {        return value ? String(value) : "";    },    _startEditing: function(device, listItem)     {        this._stopEditing();        this._addCustomButton.disabled = true;        this._devicesList.classList.add("devices-list-editing");        this._editDevice = device;        this._editDeviceListItem = listItem;        if (listItem)            listItem.classList.add("hidden");        this._editDeviceCommitButton.textContent = listItem ? WebInspector.UIString("Save") : WebInspector.UIString("Add device");        this._editDeviceCheckbox.checked = device.show();        this._editDeviceTitle.value = device.title;        this._editDeviceWidth.value = listItem ? this._toNumericInputValue(device.vertical.width) : "";        this._editDeviceHeight.value = listItem ? this._toNumericInputValue(device.vertical.height) : "";        this._editDeviceScale.value = listItem ? this._toNumericInputValue(device.deviceScaleFactor) : "";        this._editDeviceUserAgent.value = device.userAgent;        this._validateInputs();        if (listItem && listItem.nextElementSibling)            this._devicesList.insertBefore(this._editDeviceElement, listItem.nextElementSibling);        else            this._devicesList.insertBefore(this._editDeviceElement, this._customListSearator);        this._editDeviceCommitButton.scrollIntoView();        this._editDeviceTitle.focus();    },    _editDeviceCommitClicked: function()     {        if (this._editDeviceCommitButton.disabled)            return;        this._editDevice.setShow(this._editDeviceCheckbox.checked);        this._editDevice.title = this._editDeviceTitle.value;        this._editDevice.vertical.width = this._editDeviceWidth.value ? parseInt(this._editDeviceWidth.value, 10) : 0;        this._editDevice.vertical.height = this._editDeviceHeight.value ? parseInt(this._editDeviceHeight.value, 10) : 0;        this._editDevice.horizontal.width = this._editDevice.vertical.height;        this._editDevice.horizontal.height = this._editDevice.vertical.width;        this._editDevice.deviceScaleFactor = this._editDeviceScale.value ? parseFloat(this._editDeviceScale.value) : 0;        this._editDevice.userAgent = this._editDeviceUserAgent.value;        this._editDevice.modes.push({            title: "",            orientation: WebInspector.EmulatedDevice.Horizontal,            insets: new Insets(0,0,0,0),            images: null         });        this._editDevice.modes.push({            title: "",            orientation: WebInspector.EmulatedDevice.Vertical,            insets: new Insets(0,0,0,0),            images: null         });        this._stopEditing();        if (this._editDeviceListItem)            WebInspector.emulatedDevicesList.saveCustomDevices();        else            WebInspector.emulatedDevicesList.addCustomDevice(this._editDevice);        this._editDevice = null ;        this._editDeviceListItem = null ;    },    _stopEditing: function()     {        this._devicesList.classList.remove("devices-list-editing");        if (this._editDeviceListItem)            this._editDeviceListItem.classList.remove("hidden");        if (this._editDeviceElement.parentElement)            this._devicesList.removeChild(this._editDeviceElement);        this._addCustomButton.disabled = false;        this._addCustomButton.focus();    },    __proto__: WebInspector.VBox.prototype};WebInspector.DeviceModeButtonProvider = function() {    var button = new WebInspector.ToolbarButton(WebInspector.UIString("Toggle device mode"),"emulation-toolbar-item");    button.addEventListener("click", toggleEmulationEnabled);    WebInspector.overridesSupport.addEventListener(WebInspector.OverridesSupport.Events.EmulationStateChanged, emulationEnabledChanged);    WebInspector.overridesSupport.addEventListener(WebInspector.OverridesSupport.Events.OverridesWarningUpdated, updateWarning);    emulationEnabledChanged();    updateWarning();    function toggleEmulationEnabled()     {        WebInspector.overridesSupport.setEmulationEnabled(!button.toggled());    }    function emulationEnabledChanged()     {        button.setToggled(WebInspector.overridesSupport.emulationEnabled());    }    function updateWarning()     {        var message = WebInspector.overridesSupport.warningMessage();        button.setTitle(message || WebInspector.UIString("Toggle device mode"));        button.element.classList.toggle("warning", !!message);    }    this._button = button;}WebInspector.DeviceModeButtonProvider.prototype = {    item: function()     {        return this._button;    }}WebInspector.ToggleDeviceModeActionDelegate = function() {}WebInspector.ToggleDeviceModeActionDelegate.prototype = {    handleAction: function(context, actionId)     {        WebInspector.overridesSupport.setEmulationEnabled(!WebInspector.overridesSupport.emulationEnabled());    }};WebInspector.OverridesUI = {}WebInspector.DeviceSelect = function(rotateButton, callback) {    this._callback = callback;    this._rotateButton = rotateButton;    this.element = createElement("p");    this._deviceSelectElement = this.element.createChild("select", "device-select");    this._deviceSelectElement.addEventListener("change", this._deviceSelected.bind(this), false);    var container = this.element.createChild("div", "mode-container");    container.appendChild(this._rotateButton);    this._rotateButton.addEventListener("click", this._rotateButtonClicked.bind(this), false);    this._rotateButton.title = WebInspector.UIString("Change orientation");    var modeSelectContainer = container.createChild("span", "mode-select");    this._modeSelectElement = modeSelectContainer.createChild("select");    this._modeSelectElement.addEventListener("change", this._modeSelected.bind(this), false);    this._modeLabelElement = modeSelectContainer.createChild("label");    this._modeLabelElement.addEventListener("click", this._rotateButtonClicked.bind(this), false);    this._modeLabelElement.title = WebInspector.UIString("Change orientation");    this._emulatedSettingChangedMuted = false;    this._lastOrientation = null ;    WebInspector.overridesSupport.settings.emulateResolution.addChangeListener(this._emulatedSettingChanged, this);    WebInspector.overridesSupport.settings.deviceWidth.addChangeListener(this._emulatedSettingChanged, this);    WebInspector.overridesSupport.settings.deviceHeight.addChangeListener(this._emulatedSettingChanged, this);    WebInspector.overridesSupport.settings.deviceScaleFactor.addChangeListener(this._emulatedSettingChanged, this);    WebInspector.overridesSupport.settings.emulateMobile.addChangeListener(this._emulatedSettingChanged, this);    WebInspector.overridesSupport.settings.emulateTouch.addChangeListener(this._emulatedSettingChanged, this);    WebInspector.overridesSupport.settings.userAgent.addChangeListener(this._emulatedSettingChanged, this);    WebInspector.emulatedDevicesList.addEventListener(WebInspector.EmulatedDevicesList.Events.CustomDevicesUpdated, this._deviceListChanged, this);    WebInspector.emulatedDevicesList.addEventListener(WebInspector.EmulatedDevicesList.Events.StandardDevicesUpdated, this._deviceListChanged, this);    this._deviceListChanged();}WebInspector.DeviceSelect.prototype = {    _deviceListChanged: function()     {        this._deviceSelectElement.removeChildren();        var selectDeviceOption = new Option(WebInspector.UIString("<Select model>"),WebInspector.UIString("<Select model>"));        selectDeviceOption.device = null ;        selectDeviceOption.lastSelectedIndex = 0;        selectDeviceOption.disabled = true;        this._deviceSelectElement.appendChild(selectDeviceOption);        this._addDeviceGroup(WebInspector.UIString("Custom"), WebInspector.emulatedDevicesList.custom());        this._addDeviceGroup(WebInspector.UIString("Devices"), WebInspector.emulatedDevicesList.standard());        this._emulatedSettingChanged();    },    _addDeviceGroup: function(name, devices)     {        devices = devices.filter(function(d) {            return d.show();        }        );        if (!devices.length)            return;        devices.sort(WebInspector.EmulatedDevice.compareByTitle);        var groupElement = this._deviceSelectElement.createChild("optgroup");        groupElement.label = name;        for (var i = 0; i < devices.length; ++i) {            var option = new Option(devices[i].title,devices[i].title);            option.device = devices[i];            option.lastSelectedIndex = 0;            groupElement.appendChild(option);        }    },    _emulatedSettingChanged: function()     {        if (this._emulatedSettingChangedMuted)            return;        for (var i = 1; i < this._deviceSelectElement.options.length; ++i) {            var option = this._deviceSelectElement.options[i];            var device = (option.device);            for (var j = 0; j < device.modes.length; j++) {                if (WebInspector.overridesSupport.isEmulatingDevice(device.modeToOverridesDevice(device.modes[j]))) {                    this._select(device, device.modes[j]);                    return;                }            }        }        this._select(null , null );    },    _select: function(device, mode)     {        for (var i = 0; i < this._deviceSelectElement.options.length; i++) {            if (this._deviceSelectElement.options[i].device === device)                this._deviceSelectElement.selectedIndex = i;        }        this._updateModeSelect();        for (var i = 0; i < this._modeSelectElement.options.length; i++) {            if (this._modeSelectElement.options[i].mode === mode)                this._modeSelectElement.selectedIndex = i;        }        this._updateModeControls();        this._saveLastSelectedIndex();        if (this._callback) {            var option = this._modeSelectElement.options[this._modeSelectElement.selectedIndex];            this._callback(option.device, option.mode);        }    },    _deviceSelected: function()     {        this._updateModeSelect();        this._modeSelected();    },    _updateModeSelect: function()     {        this._modeSelectElement.removeChildren();        var option = this._deviceSelectElement.options[this._deviceSelectElement.selectedIndex];        var device = (option.device);        if (this._deviceSelectElement.selectedIndex === 0) {            this._addMode(device, null , "");        } else if (device.modes.length === 1) {            this._addMode(device, device.modes[0], WebInspector.UIString("Default"));        } else {            this._addOrientation(device, WebInspector.EmulatedDevice.Vertical, WebInspector.UIString("Portrait"));            this._addOrientation(device, WebInspector.EmulatedDevice.Horizontal, WebInspector.UIString("Landscape"));        }        this._updateRotateModes();        var index = option.lastSelectedIndex;        var modeOption = this._modeSelectElement.options[index];        if (modeOption.rotateIndex != -1) {            var rotateOption = this._modeSelectElement.options[modeOption.rotateIndex];            if (rotateOption.mode && rotateOption.mode.orientation === this._lastOrientation)                index = modeOption.rotateIndex;        }        this._modeSelectElement.selectedIndex = index;        this._updateModeControls();    },    _addOrientation: function(device, orientation, title)     {        var modes = device.modesForOrientation(orientation);        if (!modes.length)            return;        if (modes.length === 1) {            this._addMode(device, modes[0], title);        } else {            for (var index = 0; index < modes.length; index++)                this._addMode(device, modes[index], title + " \u2013 " + modes[index].title);        }    },    _addMode: function(device, mode, title)     {        var option = new Option(title,title);        option.mode = mode;        option.device = device;        this._modeSelectElement.appendChild(option);    },    _updateRotateModes: function()     {        for (var i = 0; i < this._modeSelectElement.options.length; i++) {            var modeI = this._modeSelectElement.options[i].mode;            this._modeSelectElement.options[i].rotateIndex = -1;            for (var j = 0; j < this._modeSelectElement.options.length; j++) {                var modeJ = this._modeSelectElement.options[j].mode;                if (modeI && modeJ && modeI.orientation !== modeJ.orientation && modeI.title === modeJ.title)                    this._modeSelectElement.options[i].rotateIndex = j;            }        }    },    _updateModeControls: function()     {        this._modeLabelElement.textContent = this._modeSelectElement.options[this._modeSelectElement.selectedIndex].label;        if (this._modeSelectElement.options.length <= 1) {            this._modeSelectElement.classList.toggle("hidden", true);            this._modeLabelElement.classList.toggle("hidden", true);        } else {            var showLabel = this._modeSelectElement.options.length === 2 && this._modeSelectElement.options[0].rotateIndex === 1;            this._modeSelectElement.classList.toggle("hidden", showLabel);            this._modeLabelElement.classList.toggle("hidden", !showLabel);        }        this._rotateButton.classList.toggle("hidden", this._modeSelectElement.options[this._modeSelectElement.selectedIndex].rotateIndex === -1);    },    _modeSelected: function()     {        this._saveLastSelectedIndex();        this._updateModeControls();        var option = this._modeSelectElement.options[this._modeSelectElement.selectedIndex];        if (this._callback)            this._callback(option.device, option.mode);        this._emulatedSettingChangedMuted = true;        WebInspector.overridesSupport.emulateDevice(option.device.modeToOverridesDevice(option.mode));        this._emulatedSettingChangedMuted = false;    },    _saveLastSelectedIndex: function()     {        this._deviceSelectElement.options[this._deviceSelectElement.selectedIndex].lastSelectedIndex = this._modeSelectElement.selectedIndex;        var option = this._modeSelectElement.options[this._modeSelectElement.selectedIndex];        if (option.mode && option.rotateIndex != -1)            this._lastOrientation = option.mode.orientation;    },    _rotateButtonClicked: function()     {        this._modeSelectElement.selectedIndex = this._modeSelectElement.options[this._modeSelectElement.selectedIndex].rotateIndex;        this._modeSelected();    }}WebInspector.OverridesUI.createUserAgentSelectAndInput = function() {    var userAgentSetting = WebInspector.overridesSupport.settings.userAgent;    const noOverride = {        title: WebInspector.UIString("No override"),        value: ""    };    const customOverride = {        title: WebInspector.UIString("Other"),        value: "Other"    };    var userAgents = [noOverride].concat(WebInspector.OverridesUI._userAgents).concat([customOverride]);    var userAgentSelectElement = createElement("select");    for (var i = 0; i < userAgents.length; ++i)        userAgentSelectElement.add(new Option(userAgents[i].title,userAgents[i].value));    userAgentSelectElement.selectedIndex = 0;    var otherUserAgentElement = createElement("input");    otherUserAgentElement.type = "text";    otherUserAgentElement.value = userAgentSetting.get();    otherUserAgentElement.title = userAgentSetting.get();    settingChanged();    userAgentSetting.addChangeListener(settingChanged);    userAgentSelectElement.addEventListener("change", userAgentSelected, false);    otherUserAgentElement.addEventListener("dblclick", textDoubleClicked, true);    otherUserAgentElement.addEventListener("blur", textChanged, false);    otherUserAgentElement.addEventListener("keydown", textKeyDown, false);    function userAgentSelected()     {        var value = userAgentSelectElement.options[userAgentSelectElement.selectedIndex].value;        if (value !== customOverride.value) {            userAgentSetting.removeChangeListener(settingChanged);            userAgentSetting.set(value);            userAgentSetting.addChangeListener(settingChanged);            otherUserAgentElement.value = value;            otherUserAgentElement.title = value;            otherUserAgentElement.readOnly = true;        } else {            otherUserAgentElement.readOnly = false;            otherUserAgentElement.focus();        }    }    function settingChanged()     {        var value = userAgentSetting.get();        var options = userAgentSelectElement.options;        var selectionRestored = false;        for (var i = 0; i < options.length; ++i) {            if (options[i].value === value) {                userAgentSelectElement.selectedIndex = i;                selectionRestored = true;                break;            }        }        otherUserAgentElement.readOnly = selectionRestored;        if (!selectionRestored)            userAgentSelectElement.selectedIndex = options.length - 1;        if (otherUserAgentElement.value !== value) {            otherUserAgentElement.value = value;            otherUserAgentElement.title = value;        }    }    function textKeyDown(event)     {        if (isEnterKey(event))            textChanged();    }    function textDoubleClicked()     {        userAgentSelectElement.selectedIndex = userAgents.length - 1;        userAgentSelected();    }    function textChanged()     {        if (userAgentSetting.get() !== otherUserAgentElement.value)            userAgentSetting.set(otherUserAgentElement.value);    }    return {        select: userAgentSelectElement,        input: otherUserAgentElement    };}WebInspector.OverridesUI._userAgents = [{    title: "Android 4.0.2 \u2014 Galaxy Nexus",    value: "Mozilla/5.0 (Linux; U; Android 4.0.2; en-us; Galaxy Nexus Build/ICL53F) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30"}, {    title: "Android 2.3 \u2014 Nexus S",    value: "Mozilla/5.0 (Linux; U; Android 2.3.6; en-us; Nexus S Build/GRK39F) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1"}, {    title: "BlackBerry \u2014 BB10",    value: "Mozilla/5.0 (BB10; Touch) AppleWebKit/537.1+ (KHTML, like Gecko) Version/10.0.0.1337 Mobile Safari/537.1+"}, {    title: "BlackBerry \u2014 PlayBook 2.1",    value: "Mozilla/5.0 (PlayBook; U; RIM Tablet OS 2.1.0; en-US) AppleWebKit/536.2+ (KHTML, like Gecko) Version/7.2.1.0 Safari/536.2+"}, {    title: "BlackBerry \u2014 9900",    value: "Mozilla/5.0 (BlackBerry; U; BlackBerry 9900; en-US) AppleWebKit/534.11+ (KHTML, like Gecko) Version/7.0.0.187 Mobile Safari/534.11+"}, {    title: "Chrome 31 \u2014 Mac",    value: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36"}, {    title: "Chrome 31 \u2014 Windows",    value: "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.16 Safari/537.36"}, {    title: "Chrome \u2014 Android Tablet",    value: "Mozilla/5.0 (Linux; Android 4.1.2; Nexus 7 Build/JZ054K) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19"}, {    title: "Chrome \u2014 Android Mobile",    value: "Mozilla/5.0 (Linux; Android 4.0.4; Galaxy Nexus Build/IMM76B) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.133 Mobile Safari/535.19"}, {    title: "Chrome \u2014 iPad",    value: "Mozilla/5.0 (iPad; CPU OS 7_0 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) CriOS/30.0.1599.12 Mobile/11A465 Safari/8536.25"}, {    title: "Chrome \u2014 iPhone",    value: "Mozilla/5.0 (iPhone; CPU iPhone OS 7_0_2 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) CriOS/30.0.1599.12 Mobile/11A501 Safari/8536.25"}, {    title: "Firefox 14 \u2014 Android Mobile",    value: "Mozilla/5.0 (Android; Mobile; rv:14.0) Gecko/14.0 Firefox/14.0"}, {    title: "Firefox 14 \u2014 Android Tablet",    value: "Mozilla/5.0 (Android; Tablet; rv:14.0) Gecko/14.0 Firefox/14.0"}, {    title: "Firefox 4 \u2014 Mac",    value: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1"}, {    title: "Firefox 4 \u2014 Windows",    value: "Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1"}, {    title: "Firefox 7 \u2014 Mac",    value: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:7.0.1) Gecko/20100101 Firefox/7.0.1"}, {    title: "Firefox 7 \u2014 Windows",    value: "Mozilla/5.0 (Windows NT 6.1; Intel Mac OS X 10.6; rv:7.0.1) Gecko/20100101 Firefox/7.0.1"}, {    title: "Googlebot",    value: "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"}, {    title: "Googlebot Smartphone",    value: "Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e Safari/8536.25 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"}, {    title: "Internet Explorer 10",    value: "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)"}, {    title: "Internet Explorer 7",    value: "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)"}, {    title: "Internet Explorer 8",    value: "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)"}, {    title: "Internet Explorer 9",    value: "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"}, {    title: "iPad \u2014 iOS 8",    value: "Mozilla/5.0 (iPad; CPU OS 8_0 like Mac OS X) AppleWebKit/600.1.3 (KHTML, like Gecko) Version/8.0 Mobile/12A4345d Safari/600.1.4"}, {    title: "iPad \u2014 iOS 7",    value: "Mozilla/5.0 (iPad; CPU OS 7_0_2 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11A501 Safari/9537.53"}, {    title: "iPad \u2014 iOS 6",    value: "Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e Safari/8536.25"}, {    title: "iPhone \u2014 iOS 8",    value: "Mozilla/5.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/600.1.3 (KHTML, like Gecko) Version/8.0 Mobile/12A4345d Safari/600.1.4"}, {    title: "iPhone \u2014 iOS 7",    value: "Mozilla/5.0 (iPhone; CPU iPhone OS 7_0_2 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11A4449d Safari/9537.53"}, {    title: "iPhone \u2014 iOS 6",    value: "Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e Safari/8536.25"}, {    title: "MeeGo \u2014 Nokia N9",    value: "Mozilla/5.0 (MeeGo; NokiaN9) AppleWebKit/534.13 (KHTML, like Gecko) NokiaBrowser/8.5.0 Mobile Safari/534.13"}, {    title: "Opera 18 \u2014 Mac",    value: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36 OPR/18.0.1284.68"}, {    title: "Opera 18 \u2014 Windows",    value: "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36 OPR/18.0.1284.68"}, {    title: "Opera 12 \u2014 Mac",    value: "Opera/9.80 (Macintosh; Intel Mac OS X 10.9.1) Presto/2.12.388 Version/12.16"}, {    title: "Opera 12 \u2014 Windows",    value: "Opera/9.80 (Windows NT 6.1) Presto/2.12.388 Version/12.16"}, {    title: "Silk \u2014 Kindle Fire (Desktop view)",    value: "Mozilla/5.0 (Linux; U; en-us; KFTHWI Build/JDQ39) AppleWebKit/535.19 (KHTML, like Gecko) Silk/3.13 Safari/535.19 Silk-Accelerated=true"}, {    title: "Silk \u2014 Kindle Fire (Mobile view)",    value: "Mozilla/5.0 (Linux; U; Android 4.2.2; en-us; KFTHWI Build/JDQ39) AppleWebKit/535.19 (KHTML, like Gecko) Silk/3.13 Mobile Safari/535.19 Silk-Accelerated=true"}];;WebInspector.InspectedPagePlaceholder = function() {    WebInspector.Widget.call(this);    this.element.classList.add("inspected-page-placeholder");    WebInspector.zoomManager.addEventListener(WebInspector.ZoomManager.Events.ZoomChanged, this._scheduleUpdate, this);    this._margins = {        top: 0,        right: 0,        bottom: 0,        left: 0    };    this.restoreMinimumSizeAndMargins();};WebInspector.InspectedPagePlaceholder.Events = {    Update: "Update"};WebInspector.InspectedPagePlaceholder.MarginValue = 3;WebInspector.InspectedPagePlaceholder.prototype = {    _findMargins: function()     {        var margins = {            top: 0,            right: 0,            bottom: 0,            left: 0        };        if (this._useMargins) {            var adjacent = {                top: true,                right: true,                bottom: true,                left: true            };            var widget = this;            while (widget.parentWidget()) {                var parent = widget.parentWidget();                if (parent instanceof WebInspector.SplitWidget) {                    var side = parent.sidebarSide();                    if (adjacent[side] && !parent.hasCustomResizer() && parent.isResizable())                        margins[side] = WebInspector.InspectedPagePlaceholder.MarginValue;                    adjacent[side] = false;                }                widget = parent;            }        }        if (this._margins.top !== margins.top || this._margins.left !== margins.left || this._margins.right !== margins.right || this._margins.bottom !== margins.bottom) {            this._margins = margins;            this._scheduleUpdate();        }    },    onResize: function()     {        this._findMargins();        this._scheduleUpdate();    },    _scheduleUpdate: function()     {        if (this._updateId)            this.element.window().cancelAnimationFrame(this._updateId);        this._updateId = this.element.window().requestAnimationFrame(this.update.bind(this));    },    restoreMinimumSizeAndMargins: function()     {        this._useMargins = true;        this.setMinimumSize(50, 50);        this._findMargins();    },    clearMinimumSizeAndMargins: function()     {        this._useMargins = false;        this.setMinimumSize(1, 1);        this._findMargins();    },    _dipPageRect: function()     {        var zoomFactor = WebInspector.zoomManager.zoomFactor();        var rect = this.element.getBoundingClientRect();        var bodyRect = this.element.ownerDocument.body.getBoundingClientRect();        var left = Math.max(rect.left * zoomFactor + this._margins.left, bodyRect.left * zoomFactor);        var top = Math.max(rect.top * zoomFactor + this._margins.top, bodyRect.top * zoomFactor);        var bottom = Math.min(rect.bottom * zoomFactor - this._margins.bottom, bodyRect.bottom * zoomFactor);        var right = Math.min(rect.right * zoomFactor - this._margins.right, bodyRect.right * zoomFactor);        return {            x: left,            y: top,            width: right - left,            height: bottom - top        };    },    update: function()     {        delete this._updateId;        var rect = this._dipPageRect();        var bounds = {            x: Math.round(rect.x),            y: Math.round(rect.y),            height: Math.max(1, Math.round(rect.height)),            width: Math.max(1, Math.round(rect.width))        };        this.dispatchEventToListeners(WebInspector.InspectedPagePlaceholder.Events.Update, bounds);    },    __proto__: WebInspector.Widget.prototype};;WebInspector.MediaQueryInspector = function() {    WebInspector.Widget.call(this);    this.element.classList.add("media-inspector-view", "media-inspector-view-empty");    this.element.addEventListener("click", this._onMediaQueryClicked.bind(this), false);    this.element.addEventListener("contextmenu", this._onContextMenu.bind(this), false);    this._mediaThrottler = new WebInspector.Throttler(0);    this._offset = 0;    this._scale = 1;    this._lastReportedCount = 0;    WebInspector.targetManager.observeTargets(this);    WebInspector.zoomManager.addEventListener(WebInspector.ZoomManager.Events.ZoomChanged, this._renderMediaQueries.bind(this), this);}WebInspector.MediaQueryInspector.Section = {    Max: 0,    MinMax: 1,    Min: 2}WebInspector.MediaQueryInspector.Events = {    HeightUpdated: "HeightUpdated",    CountUpdated: "CountUpdated"}WebInspector.MediaQueryInspector.prototype = {    targetAdded: function(target)     {        if (this._cssModel)            return;        this._cssModel = WebInspector.CSSStyleModel.fromTarget(target);        if (!this._cssModel)            return;        this._cssModel.addEventListener(WebInspector.CSSStyleModel.Events.StyleSheetAdded, this._scheduleMediaQueriesUpdate, this);        this._cssModel.addEventListener(WebInspector.CSSStyleModel.Events.StyleSheetRemoved, this._scheduleMediaQueriesUpdate, this);        this._cssModel.addEventListener(WebInspector.CSSStyleModel.Events.StyleSheetChanged, this._scheduleMediaQueriesUpdate, this);        this._cssModel.addEventListener(WebInspector.CSSStyleModel.Events.MediaQueryResultChanged, this._scheduleMediaQueriesUpdate, this);    },    targetRemoved: function(target)     {        if (WebInspector.CSSStyleModel.fromTarget(target) !== this._cssModel)            return;        this._cssModel.removeEventListener(WebInspector.CSSStyleModel.Events.StyleSheetAdded, this._scheduleMediaQueriesUpdate, this);        this._cssModel.removeEventListener(WebInspector.CSSStyleModel.Events.StyleSheetRemoved, this._scheduleMediaQueriesUpdate, this);        this._cssModel.removeEventListener(WebInspector.CSSStyleModel.Events.StyleSheetChanged, this._scheduleMediaQueriesUpdate, this);        this._cssModel.removeEventListener(WebInspector.CSSStyleModel.Events.MediaQueryResultChanged, this._scheduleMediaQueriesUpdate, this);        delete this._cssModel;    },    setAxisTransform: function(offset, scale)     {        if (this._offset === offset && Math.abs(this._scale - scale) < 1e-8)            return;        this._offset = offset;        this._scale = scale;        this._renderMediaQueries();    },    setEnabled: function(enabled)     {        this._enabled = enabled;        this._scheduleMediaQueriesUpdate();    },    _onMediaQueryClicked: function(event)     {        var mediaQueryMarker = event.target.enclosingNodeOrSelfWithClass("media-inspector-marker");        if (!mediaQueryMarker)            return;        function setWidth(width)         {            WebInspector.overridesSupport.settings.deviceWidth.set(width);            WebInspector.overridesSupport.settings.emulateResolution.set(true);        }        var model = mediaQueryMarker._model;        if (model.section() === WebInspector.MediaQueryInspector.Section.Max) {            setWidth(model.maxWidthExpression().computedLength());            return;        }        if (model.section() === WebInspector.MediaQueryInspector.Section.Min) {            setWidth(model.minWidthExpression().computedLength());            return;        }        var currentWidth = WebInspector.overridesSupport.settings.deviceWidth.get();        if (currentWidth !== model.minWidthExpression().computedLength())            setWidth(model.minWidthExpression().computedLength());        else            setWidth(model.maxWidthExpression().computedLength());    },    _onContextMenu: function(event)     {        if (!this._cssModel || !this._cssModel.isEnabled())            return;        var mediaQueryMarker = event.target.enclosingNodeOrSelfWithClass("media-inspector-marker");        if (!mediaQueryMarker)            return;        var locations = mediaQueryMarker._locations;        var uiLocations = new Map();        for (var i = 0; i < locations.length; ++i) {            var uiLocation = WebInspector.cssWorkspaceBinding.rawLocationToUILocation(locations[i]);            if (!uiLocation)                continue;var descriptor = String.sprintf("%s:%d:%d", uiLocation.uiSourceCode.uri(), uiLocation.lineNumber + 1, uiLocation.columnNumber + 1);            uiLocations.set(descriptor, uiLocation);        }        var contextMenuItems = uiLocations.keysArray().sort();        var contextMenu = new WebInspector.ContextMenu(event);        var subMenuItem = contextMenu.appendSubMenuItem(WebInspector.UIString.capitalize("Reveal in ^source ^code"));        for (var i = 0; i < contextMenuItems.length; ++i) {            var title = contextMenuItems[i];            subMenuItem.appendItem(title, this._revealSourceLocation.bind(this, (uiLocations.get(title))));        }        contextMenu.show();    },    _revealSourceLocation: function(location)     {        WebInspector.Revealer.reveal(location);    },    _scheduleMediaQueriesUpdate: function()     {        if (!this._enabled)            return;        this._mediaThrottler.schedule(this._refetchMediaQueries.bind(this));    },    _refetchMediaQueries: function(finishCallback)     {        if (!this._enabled || !this._cssModel) {            finishCallback();            return;        }        this._cssModel.mediaQueriesPromise().then(this._rebuildMediaQueries.bind(this)).then(finishCallback).catch(finishCallback);    },    _squashAdjacentEqual: function(models)     {        var filtered = [];        for (var i = 0; i < models.length; ++i) {            var last = filtered.peekLast();            if (!last || !last.equals(models[i]))                filtered.push(models[i]);        }        return filtered;    },    _rebuildMediaQueries: function(cssMedias)     {        var queryModels = [];        for (var i = 0; i < cssMedias.length; ++i) {            var cssMedia = cssMedias[i];            if (!cssMedia.mediaList)                continue;for (var j = 0; j < cssMedia.mediaList.length; ++j) {                var mediaQuery = cssMedia.mediaList[j];                var queryModel = WebInspector.MediaQueryInspector.MediaQueryUIModel.createFromMediaQuery(cssMedia, mediaQuery);                if (queryModel && queryModel.rawLocation())                    queryModels.push(queryModel);            }        }        queryModels.sort(compareModels);        queryModels = this._squashAdjacentEqual(queryModels);        var allEqual = this._cachedQueryModels && this._cachedQueryModels.length == queryModels.length;        for (var i = 0; allEqual && i < queryModels.length; ++i)            allEqual = allEqual && this._cachedQueryModels[i].equals(queryModels[i]);        if (allEqual)            return;        this._cachedQueryModels = queryModels;        this._renderMediaQueries();        function compareModels(model1, model2)         {            return model1.compareTo(model2);        }    },    _renderMediaQueries: function()     {        if (!this._cachedQueryModels)            return;        var markers = [];        var lastMarker = null ;        for (var i = 0; i < this._cachedQueryModels.length; ++i) {            var model = this._cachedQueryModels[i];            if (lastMarker && lastMarker.model.dimensionsEqual(model)) {                lastMarker.locations.push(model.rawLocation());                lastMarker.active = lastMarker.active || model.active();            } else {                lastMarker = {                    active: model.active(),                    model: model,                    locations: [model.rawLocation()]                };                markers.push(lastMarker);            }        }        if (markers.length !== this._lastReportedCount) {            this._lastReportedCount = markers.length;            this.dispatchEventToListeners(WebInspector.MediaQueryInspector.Events.CountUpdated, markers.length);        }        if (!this.isShowing())            return;        var oldChildrenCount = this.element.children.length;        var scrollTop = this.element.scrollTop;        this.element.removeChildren();        var container = null ;        for (var i = 0; i < markers.length; ++i) {            if (!i || markers[i].model.section() !== markers[i - 1].model.section())                container = this.element.createChild("div", "media-inspector-marker-container");            var marker = markers[i];            var bar = this._createElementFromMediaQueryModel(marker.model);            bar._model = marker.model;            bar._locations = marker.locations;            bar.classList.toggle("media-inspector-marker-inactive", !marker.active);            container.appendChild(bar);        }        this.element.scrollTop = scrollTop;        this.element.classList.toggle("media-inspector-view-empty", !this.element.children.length);        if (this.element.children.length !== oldChildrenCount)            this.dispatchEventToListeners(WebInspector.MediaQueryInspector.Events.HeightUpdated);    },    _zoomFactor: function()     {        return WebInspector.zoomManager.zoomFactor() / this._scale;    },    wasShown: function()     {        this._renderMediaQueries();    },    _createElementFromMediaQueryModel: function(model)     {        var zoomFactor = this._zoomFactor();        var minWidthValue = model.minWidthExpression() ? model.minWidthExpression().computedLength() : 0;        const styleClassPerSection = ["media-inspector-marker-max-width", "media-inspector-marker-min-max-width", "media-inspector-marker-min-width"];        var markerElement = createElementWithClass("div", "media-inspector-marker");        var leftPixelValue = minWidthValue ? (minWidthValue - this._offset) / zoomFactor : 0;        markerElement.style.left = leftPixelValue + "px";        markerElement.classList.add(styleClassPerSection[model.section()]);        var widthPixelValue = null ;        if (model.maxWidthExpression() && model.minWidthExpression())            widthPixelValue = (model.maxWidthExpression().computedLength() - minWidthValue) / zoomFactor;        else if (model.maxWidthExpression())            widthPixelValue = (model.maxWidthExpression().computedLength() - this._offset) / zoomFactor;        else            markerElement.style.right = "0";        if (typeof widthPixelValue === "number")            markerElement.style.width = widthPixelValue + "px";        if (model.minWidthExpression()) {            var labelClass = model.section() === WebInspector.MediaQueryInspector.Section.MinMax ? "media-inspector-label-right" : "media-inspector-label-left";            var labelContainer = markerElement.createChild("div", "media-inspector-marker-label-container media-inspector-marker-label-container-left");            labelContainer.createChild("span", "media-inspector-marker-label " + labelClass).textContent = model.minWidthExpression().value() + model.minWidthExpression().unit();        }        if (model.maxWidthExpression()) {            var labelClass = model.section() === WebInspector.MediaQueryInspector.Section.MinMax ? "media-inspector-label-left" : "media-inspector-label-right";            var labelContainer = markerElement.createChild("div", "media-inspector-marker-label-container media-inspector-marker-label-container-right");            labelContainer.createChild("span", "media-inspector-marker-label " + labelClass).textContent = model.maxWidthExpression().value() + model.maxWidthExpression().unit();        }        markerElement.title = model.mediaText();        return markerElement;    },    __proto__: WebInspector.Widget.prototype};WebInspector.MediaQueryInspector.MediaQueryUIModel = function(cssMedia, minWidthExpression, maxWidthExpression, active) {    this._cssMedia = cssMedia;    this._minWidthExpression = minWidthExpression;    this._maxWidthExpression = maxWidthExpression;    this._active = active;    if (maxWidthExpression && !minWidthExpression)        this._section = WebInspector.MediaQueryInspector.Section.Max;    else if (minWidthExpression && maxWidthExpression)        this._section = WebInspector.MediaQueryInspector.Section.MinMax;    else        this._section = WebInspector.MediaQueryInspector.Section.Min;}WebInspector.MediaQueryInspector.MediaQueryUIModel.createFromMediaQuery = function(cssMedia, mediaQuery) {    var maxWidthExpression = null ;    var maxWidthPixels = Number.MAX_VALUE;    var minWidthExpression = null ;    var minWidthPixels = Number.MIN_VALUE;    var expressions = mediaQuery.expressions();    for (var i = 0; i < expressions.length; ++i) {        var expression = expressions[i];        var feature = expression.feature();        if (feature.indexOf("width") === -1)            continue;var pixels = expression.computedLength();        if (feature.startsWith("max-") && pixels < maxWidthPixels) {            maxWidthExpression = expression;            maxWidthPixels = pixels;        } else if (feature.startsWith("min-") && pixels > minWidthPixels) {            minWidthExpression = expression;            minWidthPixels = pixels;        }    }    if (minWidthPixels > maxWidthPixels || (!maxWidthExpression && !minWidthExpression))        return null ;    return new WebInspector.MediaQueryInspector.MediaQueryUIModel(cssMedia,minWidthExpression,maxWidthExpression,mediaQuery.active());}WebInspector.MediaQueryInspector.MediaQueryUIModel.prototype = {    equals: function(other)     {        return this.compareTo(other) === 0;    },    dimensionsEqual: function(other)     {        return this.section() === other.section() && (!this.minWidthExpression() || (this.minWidthExpression().computedLength() === other.minWidthExpression().computedLength())) && (!this.maxWidthExpression() || (this.maxWidthExpression().computedLength() === other.maxWidthExpression().computedLength()));    },    compareTo: function(other)     {        if (this.section() !== other.section())            return this.section() - other.section();        if (this.dimensionsEqual(other)) {            var myLocation = this.rawLocation();            var otherLocation = other.rawLocation();            if (!myLocation && !otherLocation)                return this.mediaText().compareTo(other.mediaText());            if (myLocation && !otherLocation)                return 1;            if (!myLocation && otherLocation)                return -1;            if (this.active() !== other.active())                return this.active() ? -1 : 1;            return myLocation.url.compareTo(otherLocation.url) || myLocation.lineNumber - otherLocation.lineNumber || myLocation.columnNumber - otherLocation.columnNumber;        }        if (this.section() === WebInspector.MediaQueryInspector.Section.Max)            return other.maxWidthExpression().computedLength() - this.maxWidthExpression().computedLength();        if (this.section() === WebInspector.MediaQueryInspector.Section.Min)            return this.minWidthExpression().computedLength() - other.minWidthExpression().computedLength();        return this.minWidthExpression().computedLength() - other.minWidthExpression().computedLength() || other.maxWidthExpression().computedLength() - this.maxWidthExpression().computedLength();    },    section: function()     {        return this._section;    },    mediaText: function()     {        return this._cssMedia.text;    },    rawLocation: function()     {        if (!this._rawLocation)            this._rawLocation = this._cssMedia.rawLocation();        return this._rawLocation;    },    minWidthExpression: function()     {        return this._minWidthExpression;    },    maxWidthExpression: function()     {        return this._maxWidthExpression;    },    active: function()     {        return this._active;    }};WebInspector.ResponsiveDesignView = function(inspectedPagePlaceholder) {    WebInspector.VBox.call(this);    this.setMinimumSize(150, 150);    this.element.classList.add("responsive-design-view");    this.registerRequiredCSS("emulation/responsiveDesignView.css");    this._showMediaQueryInspectorSetting = WebInspector.settings.createSetting("showMediaQueryInspector", false);    this._responsiveDesignContainer = new WebInspector.VBox();    this._uiInitialized = false;    this._inspectedPagePlaceholder = inspectedPagePlaceholder;    inspectedPagePlaceholder.show(this.element);    this._enabled = false;    this._viewport = {        scrollX: 0,        scrollY: 0,        contentsWidth: 0,        contentsHeight: 0,        pageScaleFactor: 1,        minimumPageScaleFactor: 1,        maximumPageScaleFactor: 1    };    this._drawContentsSize = true;    this._deviceInsets = new Insets(0,0,0,0);    this._viewportChangedThrottler = new WebInspector.Throttler(0);    this._pageScaleFactorThrottler = new WebInspector.Throttler(50);    WebInspector.zoomManager.addEventListener(WebInspector.ZoomManager.Events.ZoomChanged, this._onZoomChanged, this);    WebInspector.overridesSupport.addEventListener(WebInspector.OverridesSupport.Events.EmulationStateChanged, this._emulationEnabledChanged, this);    WebInspector.targetManager.observeTargets(this, WebInspector.Target.Type.Page);    this._emulationEnabledChanged();};WebInspector.ResponsiveDesignView.RulerWidth = 26;WebInspector.ResponsiveDesignView.RulerHeight = 22;WebInspector.ResponsiveDesignView.RulerTopHeight = 11;WebInspector.ResponsiveDesignView.RulerBottomHeight = 9;WebInspector.ResponsiveDesignView.prototype = {    _ensureUIInitialized: function()     {        if (this._uiInitialized)            return;        this._uiInitialized = true;        this._createToolbar();        this._canvasContainer = new WebInspector.Widget();        this._canvasContainer.element.classList.add("responsive-design");        this._canvasContainer.show(this._responsiveDesignContainer.element);        this._canvas = this._canvasContainer.element.createChild("canvas", "fill responsive-design-canvas");        this._mediaInspectorContainer = this._canvasContainer.element.createChild("div", "responsive-design-media-container");        this._mediaInspector = new WebInspector.MediaQueryInspector();        this._updateMediaQueryInspector();        this._warningInfobar = new WebInspector.Infobar(WebInspector.Infobar.Type.Warning,WebInspector.moduleSetting("disableOverridesWarning"));        this._warningInfobar.element.classList.add("responsive-design-warning");        this._warningInfobar.setCloseCallback(WebInspector.overridesSupport.clearWarningMessage.bind(WebInspector.overridesSupport));        this._canvasContainer.element.appendChild(this._warningInfobar.element);        this._warningMessage = this._warningInfobar.element.createChild("span");        WebInspector.overridesSupport.addEventListener(WebInspector.OverridesSupport.Events.OverridesWarningUpdated, this._overridesWarningUpdated, this);        this._slidersContainer = this._canvasContainer.element.createChild("div", "vbox responsive-design-sliders-container");        var genericDeviceOutline = this._slidersContainer.createChild("div", "responsive-design-generic-outline-container");        genericDeviceOutline.createChild("div", "responsive-design-generic-outline");        var widthSlider = this._slidersContainer.createChild("div", "responsive-design-slider-width");        widthSlider.createChild("div", "responsive-design-thumb-handle");        this._createResizer(widthSlider, true, false);        var heightSlider = this._slidersContainer.createChild("div", "responsive-design-slider-height");        heightSlider.createChild("div", "responsive-design-thumb-handle");        this._createResizer(heightSlider, false, true);        var cornerSlider = this._slidersContainer.createChild("div", "responsive-design-slider-corner");        this._createResizer(cornerSlider, true, true);        this._pageContainer = this._slidersContainer.createChild("div", "vbox flex-auto responsive-design-page-container");        this._pageScaleContainer = this._canvasContainer.element.createChild("div", "hbox responsive-design-page-scale-container");        this._decreasePageScaleButton = this._pageScaleContainer.createChild("button", "responsive-design-page-scale-button responsive-design-page-scale-decrease");        this._decreasePageScaleButton.createChild("div", "glyph");        this._decreasePageScaleButton.tabIndex = -1;        this._decreasePageScaleButton.addEventListener("click", this._pageScaleButtonClicked.bind(this, false), false);        this._pageScaleLabel = this._pageScaleContainer.createChild("label", "responsive-design-page-scale-label");        this._pageScaleLabel.title = WebInspector.UIString("For a simpler way to change the current page scale, hold down Shift and drag with your mouse.");        this._pageScaleLabel.addEventListener("dblclick", this._resetPageScale.bind(this), false);        this._increasePageScaleButton = this._pageScaleContainer.createChild("button", "responsive-design-page-scale-button responsive-design-page-scale-increase");        this._increasePageScaleButton.tabIndex = -1;        this._increasePageScaleButton.createChild("div", "glyph");        this._increasePageScaleButton.addEventListener("click", this._pageScaleButtonClicked.bind(this, true), false);        this._mediaInspector.addEventListener(WebInspector.MediaQueryInspector.Events.CountUpdated, this._updateMediaQueryInspectorButton, this);        this._mediaInspector.addEventListener(WebInspector.MediaQueryInspector.Events.HeightUpdated, this.onResize, this);        this._overridesWarningUpdated();    },    targetAdded: function(target)     {        if (this._target)            return;        this._target = target;        target.registerEmulationDispatcher(new WebInspector.EmulationDispatcher(this));    },    targetRemoved: function(target)     {},    _invalidateCache: function()     {        delete this._cachedScale;        delete this._cachedCssCanvasWidth;        delete this._cachedCssCanvasHeight;        delete this._cachedCssHeight;        delete this._cachedCssWidth;        delete this._cachedDeviceInsets;        delete this._cachedZoomFactor;        delete this._cachedViewport;        delete this._cachedDrawContentsSize;        delete this._cachedMediaInspectorHeight;        delete this._availableSize;    },    _emulationEnabledChanged: function()     {        var enabled = WebInspector.overridesSupport.emulationEnabled();        if (enabled && !this._enabled) {            WebInspector.userMetrics.DeviceModeEnabled.record();            this._invalidateCache();            this._ignoreResize = true;            this._ensureUIInitialized();            this._enabled = true;            this._mediaInspector.setEnabled(true);            this._inspectedPagePlaceholder.clearMinimumSizeAndMargins();            this._inspectedPagePlaceholder.show(this._pageContainer);            this._responsiveDesignContainer.show(this.element);            delete this._ignoreResize;            this.onResize();        } else if (!enabled && this._enabled) {            this._mediaInspector.setEnabled(false);            this._invalidateCache();            this._ignoreResize = true;            this._enabled = false;            this._scale = 1;            this._inspectedPagePlaceholder.restoreMinimumSizeAndMargins();            this._responsiveDesignContainer.detach();            this._inspectedPagePlaceholder.show(this.element);            delete this._ignoreResize;            this.onResize();        }    },    update: function(dipWidth, dipHeight, scale)     {        this._scale = scale;        this._dipWidth = dipWidth ? Math.max(dipWidth, 1) : 0;        this._dipHeight = dipHeight ? Math.max(dipHeight, 1) : 0;        this._updateUI();    },    updatePageResizer: function()     {        var available = this._availableDipSize();        WebInspector.overridesSupport.setPageResizer(this, available.size, available.insets);    },    _availableDipSize: function()     {        if (typeof this._availableSize === "undefined") {            if (!this._enabled)                return {                    size: new Size(1,1),                    insets: new Insets(0,0,0,0)                };            var zoomFactor = WebInspector.zoomManager.zoomFactor();            var rect = this._canvasContainer.element.getBoundingClientRect();            var rulerTotalHeight = this._rulerTotalHeightDIP();            this._availableSize = {                size: new Size(Math.max(rect.width * zoomFactor - WebInspector.ResponsiveDesignView.RulerWidth, 1),Math.max(rect.height * zoomFactor - rulerTotalHeight, 1)),                insets: this._deviceInsets            };        }        return this._availableSize;    },    _createResizer: function(element, x, y)     {        var resizer = new WebInspector.ResizerWidget();        resizer.addElement(element);        resizer.setCursor(x && y ? "nwse-resize" : (x ? "ew-resize" : "ns-resize"));        resizer.addEventListener(WebInspector.ResizerWidget.Events.ResizeStart, this._onResizeStart, this);        resizer.addEventListener(WebInspector.ResizerWidget.Events.ResizeUpdate, this._onResizeUpdate.bind(this, x, y));        resizer.addEventListener(WebInspector.ResizerWidget.Events.ResizeEnd, this._onResizeEnd, this);        return resizer;    },    _onResizeStart: function(event)     {        this._drawContentsSize = false;        var available = this._availableDipSize().size;        this._slowPositionStart = null ;        this._resizeStart = {            x: this._dipWidth || available.width,            y: this._dipHeight || available.height        };        this.dispatchEventToListeners(WebInspector.OverridesSupport.PageResizer.Events.FixedScaleRequested, true);        this._updateUI();    },    _onResizeUpdate: function(x, y, event)     {        if (event.data.shiftKey !== !!this._slowPositionStart)            this._slowPositionStart = event.data.shiftKey ? {                x: event.data.currentX,                y: event.data.currentY            } : null ;        var cssOffsetX = event.data.currentX - event.data.startX;        var cssOffsetY = event.data.currentY - event.data.startY;        if (this._slowPositionStart) {            cssOffsetX = (event.data.currentX - this._slowPositionStart.x) / 10 + this._slowPositionStart.x - event.data.startX;            cssOffsetY = (event.data.currentY - this._slowPositionStart.y) / 10 + this._slowPositionStart.y - event.data.startY;        }        var dipOffsetX = Math.round(cssOffsetX * WebInspector.zoomManager.zoomFactor());        var dipOffsetY = Math.round(cssOffsetY * WebInspector.zoomManager.zoomFactor());        var newSizeX = this._resizeStart.x + dipOffsetX;        newSizeX = Math.round(newSizeX / (this._scale || 1));        newSizeX = Math.max(Math.min(newSizeX, WebInspector.OverridesSupport.MaxDeviceSize), 1);        var newSizeY = this._resizeStart.y + dipOffsetY;        newSizeY = Math.round(newSizeY / (this._scale || 1));        newSizeY = Math.max(Math.min(newSizeY, WebInspector.OverridesSupport.MaxDeviceSize), 1);        var requested = {};        if (x)            requested.width = newSizeX;        if (y)            requested.height = newSizeY;        this.dispatchEventToListeners(WebInspector.OverridesSupport.PageResizer.Events.ResizeRequested, requested);    },    _onResizeEnd: function(event)     {        this._drawContentsSize = true;        this.dispatchEventToListeners(WebInspector.OverridesSupport.PageResizer.Events.FixedScaleRequested, false);        delete this._resizeStart;        this._updateUI();    },    _drawCanvas: function(cssCanvasWidth, cssCanvasHeight, rulerHeight)     {        if (!this._enabled)            return;        var canvas = this._canvas;        var context = canvas.getContext("2d");        canvas.style.width = cssCanvasWidth + "px";        canvas.style.height = cssCanvasHeight + "px";        var zoomFactor = WebInspector.zoomManager.zoomFactor();        var dipCanvasWidth = cssCanvasWidth * zoomFactor;        var dipCanvasHeight = cssCanvasHeight * zoomFactor;        var deviceScaleFactor = window.devicePixelRatio;        canvas.width = deviceScaleFactor * cssCanvasWidth;        canvas.height = deviceScaleFactor * cssCanvasHeight;        context.scale(canvas.width / dipCanvasWidth, canvas.height / dipCanvasHeight);        context.font = "11px " + WebInspector.fontFamily();        const backgroundColor = "rgb(102, 102, 102)";        const lightLineColor = "rgb(132, 132, 132)";        const darkLineColor = "rgb(114, 114, 114)";        const rulerColor = "rgb(125, 125, 125)";        const textColor = "rgb(186, 186, 186)";        const contentsSizeColor = "rgba(0, 0, 0, 0.3)";        var scale = (this._scale || 1) * this._viewport.pageScaleFactor;        var rulerScale = 0.5;        while (Math.abs(rulerScale * scale - 1) > Math.abs((rulerScale + 0.5) * scale - 1))            rulerScale += 0.5;        var gridStep = 50 * scale * rulerScale;        var gridSubStep = 10 * scale * rulerScale;        var rulerSubStep = 5 * scale * rulerScale;        var rulerStepCount = 20;        var rulerWidth = WebInspector.ResponsiveDesignView.RulerWidth;        var dipGridWidth = dipCanvasWidth - rulerWidth;        var dipGridHeight = dipCanvasHeight - rulerHeight;        var dipScrollX = this._viewport.scrollX * scale;        var dipScrollY = this._viewport.scrollY * scale;        context.translate(rulerWidth, rulerHeight);        context.fillStyle = backgroundColor;        context.fillRect(0, 0, dipGridWidth, dipGridHeight);        context.translate(0.5, 0.5);        context.strokeStyle = rulerColor;        context.fillStyle = textColor;        context.lineWidth = 1;        context.save();        var minXIndex = Math.ceil(dipScrollX / rulerSubStep);        var maxXIndex = Math.floor((dipScrollX + dipGridWidth) / rulerSubStep);        if (minXIndex) {            context.beginPath();            context.moveTo(0, -rulerHeight);            context.lineTo(0, 0);            context.stroke();        }        context.translate(-dipScrollX, 0);        for (var index = minXIndex; index <= maxXIndex; index++) {            var x = index * rulerSubStep;            var height = WebInspector.ResponsiveDesignView.RulerHeight * 0.25;            if (!(index % (rulerStepCount / 4)))                height = WebInspector.ResponsiveDesignView.RulerHeight * 0.5;            if (!(index % (rulerStepCount / 2)))                height = rulerHeight;            if (!(index % rulerStepCount)) {                context.save();                context.translate(x, 0);                context.fillText(Math.round(x / scale), 2, -rulerHeight + 10);                context.restore();                height = rulerHeight;            }            context.beginPath();            context.moveTo(x, -height);            context.lineTo(x, 0);            context.stroke();        }        context.restore();        context.save();        var minYIndex = Math.ceil(dipScrollY / rulerSubStep);        var maxYIndex = Math.floor((dipScrollY + dipGridHeight) / rulerSubStep);        context.translate(0, -dipScrollY);        for (var index = minYIndex; index <= maxYIndex; index++) {            var y = index * rulerSubStep;            var x = -rulerWidth * 0.25;            if (!(index % (rulerStepCount / 4)))                x = -rulerWidth * 0.5;            if (!(index % (rulerStepCount / 2)))                x = -rulerWidth * 0.75;            if (!(index % rulerStepCount)) {                context.save();                context.translate(0, y);                context.rotate(-Math.PI / 2);                context.fillText(Math.round(y / scale), 2, -rulerWidth + 10);                context.restore();                x = -rulerWidth;            }            context.beginPath();            context.moveTo(x, y);            context.lineTo(0, y);            context.stroke();        }        context.restore();        drawGrid(dipScrollX, dipScrollY, darkLineColor, gridSubStep);        drawGrid(dipScrollX, dipScrollY, lightLineColor, gridStep);        function drawGrid(scrollX, scrollY, color, step)         {            context.strokeStyle = color;            var minX = Math.ceil(scrollX / step) * step;            var maxX = Math.floor((scrollX + dipGridWidth) / step) * step - minX;            var minY = Math.ceil(scrollY / step) * step;            var maxY = Math.floor((scrollY + dipGridHeight) / step) * step - minY;            context.save();            context.translate(minX - scrollX, 0);            for (var x = 0; x <= maxX; x += step) {                context.beginPath();                context.moveTo(x, 0);                context.lineTo(x, dipGridHeight);                context.stroke();            }            context.restore();            context.save();            context.translate(0, minY - scrollY);            for (var y = 0; y <= maxY; y += step) {                context.beginPath();                context.moveTo(0, y);                context.lineTo(dipGridWidth, y);                context.stroke();            }            context.restore();        }        context.translate(-0.5, -0.5);        var pageScaleAvailable = WebInspector.overridesSupport.settings.emulateMobile.get() || WebInspector.overridesSupport.settings.emulateTouch.get();        if (this._drawContentsSize && pageScaleAvailable) {            context.fillStyle = contentsSizeColor;            var visibleContentsWidth = Math.max(0, Math.min(dipGridWidth, this._viewport.contentsWidth * scale - dipScrollX));            var visibleContentsHeight = Math.max(0, Math.min(dipGridHeight, this._viewport.contentsHeight * scale - dipScrollY));            context.fillRect(0, 0, visibleContentsWidth, visibleContentsHeight);        }    },    _rulerTotalHeightDIP: function()     {        var mediaInspectorHeight = this._mediaInspector.isShowing() ? this._mediaInspector.element.offsetHeight : 0;        if (!mediaInspectorHeight)            return WebInspector.ResponsiveDesignView.RulerHeight;        return WebInspector.ResponsiveDesignView.RulerTopHeight + WebInspector.ResponsiveDesignView.RulerBottomHeight + mediaInspectorHeight * WebInspector.zoomManager.zoomFactor();    },    _updateUI: function()     {        if (!this._enabled || !this.isShowing())            return;        var zoomFactor = WebInspector.zoomManager.zoomFactor();        var rect = this._canvas.parentElement.getBoundingClientRect();        var availableDip = this._availableDipSize().size;        var cssCanvasWidth = rect.width;        var cssCanvasHeight = rect.height;        var mediaInspectorHeight = this._mediaInspector.isShowing() ? this._mediaInspector.element.offsetHeight : 0;        var rulerTotalHeight = this._rulerTotalHeightDIP();        this._mediaInspector.setAxisTransform(this._viewport.scrollX, this._scale * this._viewport.pageScaleFactor);        if (this._cachedZoomFactor !== zoomFactor || this._cachedMediaInspectorHeight !== mediaInspectorHeight) {            var cssRulerWidth = WebInspector.ResponsiveDesignView.RulerWidth / zoomFactor + "px";            var cssRulerHeight = (mediaInspectorHeight ? WebInspector.ResponsiveDesignView.RulerTopHeight : WebInspector.ResponsiveDesignView.RulerHeight) / zoomFactor + "px";            var cssCanvasOffset = rulerTotalHeight / zoomFactor + "px";            this._slidersContainer.style.left = cssRulerWidth;            this._slidersContainer.style.top = cssCanvasOffset;            this._warningInfobar.element.style.height = cssCanvasOffset;            this._pageScaleContainer.style.top = cssCanvasOffset;            this._mediaInspectorContainer.style.left = cssRulerWidth;            this._mediaInspectorContainer.style.marginTop = cssRulerHeight;        }        var cssWidth = (this._dipWidth ? this._dipWidth : availableDip.width) / zoomFactor;        var cssHeight = (this._dipHeight ? this._dipHeight : availableDip.height) / zoomFactor;        var deviceInsets = new Insets(this._deviceInsets.left * this._scale / zoomFactor,this._deviceInsets.top * this._scale / zoomFactor,this._deviceInsets.right * this._scale / zoomFactor,this._deviceInsets.bottom * this._scale / zoomFactor);        cssWidth += deviceInsets.left + deviceInsets.right;        cssHeight += deviceInsets.top + deviceInsets.bottom;        if (this._cachedCssWidth !== cssWidth || this._cachedCssHeight !== cssHeight || !deviceInsets.isEqual(this._cachedDeviceInsets)) {            this._slidersContainer.style.width = cssWidth + "px";            this._slidersContainer.style.height = cssHeight + "px";            this._pageContainer.style.paddingLeft = deviceInsets.left + "px";            this._pageContainer.style.paddingTop = deviceInsets.top + "px";            this._pageContainer.style.paddingRight = deviceInsets.right + "px";            this._pageContainer.style.paddingBottom = deviceInsets.bottom + "px";            this._inspectedPagePlaceholder.onResize();        }        var pageScaleVisible = cssWidth + this._pageScaleContainerWidth + WebInspector.ResponsiveDesignView.RulerWidth / zoomFactor <= rect.width;        this._pageScaleContainer.classList.toggle("hidden", !pageScaleVisible);        var viewportChanged = !this._cachedViewport || this._cachedViewport.scrollX !== this._viewport.scrollX || this._cachedViewport.scrollY !== this._viewport.scrollY || this._cachedViewport.contentsWidth !== this._viewport.contentsWidth || this._cachedViewport.contentsHeight !== this._viewport.contentsHeight || this._cachedViewport.pageScaleFactor !== this._viewport.pageScaleFactor || this._cachedViewport.minimumPageScaleFactor !== this._viewport.minimumPageScaleFactor || this._cachedViewport.maximumPageScaleFactor !== this._viewport.maximumPageScaleFactor;        var canvasInvalidated = viewportChanged || this._drawContentsSize !== this._cachedDrawContentsSize || this._cachedScale !== this._scale || this._cachedCssCanvasWidth !== cssCanvasWidth || this._cachedCssCanvasHeight !== cssCanvasHeight || this._cachedZoomFactor !== zoomFactor || this._cachedMediaInspectorHeight !== mediaInspectorHeight;        if (canvasInvalidated)            this._drawCanvas(cssCanvasWidth, cssCanvasHeight, rulerTotalHeight);        if (viewportChanged) {            this._pageScaleLabel.textContent = WebInspector.UIString("%.1f", this._viewport.pageScaleFactor);            this._decreasePageScaleButton.title = WebInspector.UIString("Scale down (minimum %.1f)", this._viewport.minimumPageScaleFactor);            this._decreasePageScaleButton.disabled = this._viewport.pageScaleFactor <= this._viewport.minimumPageScaleFactor;            this._increasePageScaleButton.title = WebInspector.UIString("Scale up (maximum %.1f)", this._viewport.maximumPageScaleFactor);            this._increasePageScaleButton.disabled = this._viewport.pageScaleFactor >= this._viewport.maximumPageScaleFactor;        }        this._cachedScale = this._scale;        this._cachedCssCanvasWidth = cssCanvasWidth;        this._cachedCssCanvasHeight = cssCanvasHeight;        this._cachedCssHeight = cssHeight;        this._cachedCssWidth = cssWidth;        this._cachedDeviceInsets = deviceInsets;        this._cachedZoomFactor = zoomFactor;        this._cachedViewport = this._viewport;        this._cachedDrawContentsSize = this._drawContentsSize;        this._cachedMediaInspectorHeight = mediaInspectorHeight;    },    onResize: function()     {        if (!this._enabled || this._ignoreResize)            return;        var oldSize = this._availableSize;        this._pageScaleContainer.classList.remove("hidden");        this._pageScaleContainerWidth = this._pageScaleContainer.offsetWidth;        delete this._availableSize;        var newSize = this._availableDipSize();        if (!oldSize || !newSize.size.isEqual(oldSize.size) || !newSize.insets.isEqual(oldSize.insets))            this.dispatchEventToListeners(WebInspector.OverridesSupport.PageResizer.Events.AvailableSizeChanged, newSize);        this._updateUI();        this._inspectedPagePlaceholder.onResize();    },    _onZoomChanged: function()     {        this._updateUI();    },    _createToolbar: function()     {        this._toolbarElement = this._responsiveDesignContainer.element.createChild("div", "responsive-design-toolbar");        this._createButtonsSection();        this._createDeviceSection();        this._toolbarElement.createChild("div", "responsive-design-separator");        this._createNetworkSection();        this._toolbarElement.createChild("div", "responsive-design-separator");        var moreButtonContainer = this._toolbarElement.createChild("div", "responsive-design-more-button-container");        var moreButton = moreButtonContainer.createChild("button", "responsive-design-more-button");        moreButton.title = WebInspector.UIString("More overrides");        moreButton.addEventListener("click", this._showEmulationInDrawer.bind(this), false);        moreButton.textContent = "\u2026";    },    _createButtonsSection: function()     {        var buttonsToolbar = new WebInspector.Toolbar(this._toolbarElement);        buttonsToolbar.makeVertical();        buttonsToolbar.setColor("white");        buttonsToolbar.setToggledColor("rgb(105, 194, 236)");        buttonsToolbar.element.classList.add("responsive-design-section", "responsive-design-section-buttons");        var resetButton = new WebInspector.ToolbarButton(WebInspector.UIString("Reset all overrides."),"clear-toolbar-item");        buttonsToolbar.appendToolbarItem(resetButton);        resetButton.addEventListener("click", WebInspector.overridesSupport.reset, WebInspector.overridesSupport);        this._toggleMediaInspectorButton = new WebInspector.ToolbarButton(WebInspector.UIString("Media queries not found"),"waterfall-toolbar-item");        this._toggleMediaInspectorButton.setToggled(this._showMediaQueryInspectorSetting.get());        this._toggleMediaInspectorButton.setEnabled(false);        this._toggleMediaInspectorButton.addEventListener("click", this._onToggleMediaInspectorButtonClick, this);        this._showMediaQueryInspectorSetting.addChangeListener(this._updateMediaQueryInspector, this);        buttonsToolbar.appendToolbarItem(this._toggleMediaInspectorButton);    },    _createDeviceSection: function()     {        var deviceSection = this._toolbarElement.createChild("div", "responsive-design-section responsive-design-section-device");        deviceSection.createChild("div", "responsive-design-section-decorator");        var deviceElement = deviceSection.createChild("div", "responsive-design-suite responsive-design-suite-top").createChild("div");        var fieldsetElement = deviceElement.createChild("fieldset");        fieldsetElement.createChild("label").textContent = WebInspector.UIString("Device");        var deviceSelect = new WebInspector.DeviceSelect(createElementWithClass("button", "responsive-design-icon responsive-design-icon-swap"),this._deviceModeSelected.bind(this));        fieldsetElement.appendChild(deviceSelect.element);        deviceSelect.element.classList.add("responsive-design-device-select");        var detailsElement = deviceSection.createChild("div", "responsive-design-suite");        var screenElement = detailsElement.createChild("div", "");        fieldsetElement = screenElement.createChild("fieldset");        var emulateResolutionCheckbox = WebInspector.SettingsUI.createSettingCheckbox("", WebInspector.overridesSupport.settings.emulateResolution, true, WebInspector.UIString("Emulate screen resolution"));        themeCheckbox(emulateResolutionCheckbox);        fieldsetElement.appendChild(emulateResolutionCheckbox);        fieldsetElement.createChild("label").textContent = WebInspector.UIString("Screen");        var resolutionFieldset = WebInspector.SettingsUI.createSettingFieldset(WebInspector.overridesSupport.settings.emulateResolution);        fieldsetElement.appendChild(resolutionFieldset);        resolutionFieldset.appendChild(WebInspector.SettingsUI.createSettingInputField("", WebInspector.overridesSupport.settings.deviceWidth, true, 4, "3em", WebInspector.OverridesSupport.deviceSizeValidator, true, true, WebInspector.UIString("\u2013")));        resolutionFieldset.createTextChild("\u00D7");        resolutionFieldset.appendChild(WebInspector.SettingsUI.createSettingInputField("", WebInspector.overridesSupport.settings.deviceHeight, true, 4, "3em", WebInspector.OverridesSupport.deviceSizeValidator, true, true, WebInspector.UIString("\u2013")));        detailsElement.createChild("div", "responsive-design-suite-separator");        var dprElement = detailsElement.createChild("div", "");        var resolutionFieldset2 = WebInspector.SettingsUI.createSettingFieldset(WebInspector.overridesSupport.settings.emulateResolution);        dprElement.appendChild(resolutionFieldset2);        var dprButton = resolutionFieldset2.createChild("div", "responsive-design-icon responsive-design-icon-dpr");        dprButton.title = WebInspector.UIString("Device pixel ratio");        resolutionFieldset2.appendChild(WebInspector.SettingsUI.createSettingInputField("", WebInspector.overridesSupport.settings.deviceScaleFactor, true, 4, "1.9em", WebInspector.OverridesSupport.deviceScaleFactorValidator, true, true, WebInspector.UIString("\u2013")));        detailsElement.createChild("div", "responsive-design-suite-separator");        var fitToWindowElement = detailsElement.createChild("div", "");        fieldsetElement = fitToWindowElement.createChild("fieldset");        var fitCheckbox = WebInspector.SettingsUI.createSettingCheckbox(WebInspector.UIString("Zoom to fit"), WebInspector.overridesSupport.settings.deviceFitWindow, true, WebInspector.UIString("Zoom to fit available space"))        fieldsetElement.appendChild(fitCheckbox);        themeCheckbox(fitCheckbox);        function themeCheckbox(checkbox)         {            checkbox.checkColor = "rgb(255, 156, 0)";            checkbox.backgroundColor = "rgb(102, 102, 102)";            checkbox.borderColor = "rgb(45, 45, 45)";        }    },    _createNetworkSection: function()     {        var networkSection = this._toolbarElement.createChild("div", "responsive-design-section responsive-design-section-network");        networkSection.createChild("div", "responsive-design-section-decorator");        var bandwidthElement = networkSection.createChild("div", "responsive-design-suite responsive-design-suite-top").createChild("div");        var fieldsetElement = bandwidthElement.createChild("fieldset");        var networkCheckbox = fieldsetElement.createChild("label");        networkCheckbox.textContent = WebInspector.UIString("Network");        new WebInspector.NetworkConditionsSelector(fieldsetElement.createChild("select"));        var userAgentElement = networkSection.createChild("div", "responsive-design-suite").createChild("div");        fieldsetElement = userAgentElement.createChild("fieldset");        fieldsetElement.appendChild(WebInspector.SettingsUI.createSettingInputField("UA", WebInspector.overridesSupport.settings.userAgent, false, 0, "", undefined, false, false, WebInspector.UIString("No override")));    },    _onToggleMediaInspectorButtonClick: function()     {        this._showMediaQueryInspectorSetting.set(!this._toggleMediaInspectorButton.toggled());    },    _updateMediaQueryInspector: function()     {        this._toggleMediaInspectorButton.setToggled(this._showMediaQueryInspectorSetting.get());        if (this._mediaInspector.isShowing() === this._showMediaQueryInspectorSetting.get())            return;        if (this._mediaInspector.isShowing())            this._mediaInspector.detach();        else            this._mediaInspector.show(this._mediaInspectorContainer);        this.onResize();    },    _updateMediaQueryInspectorButton: function(event)     {        var count = (event.data);        this._toggleMediaInspectorButton.setEnabled(!!count);        this._toggleMediaInspectorButton.setTitle(!count ? WebInspector.UIString("Media queries not found") : WebInspector.UIString((count === 1 ? "%d media query found" : "%d media queries found"), count));    },    _overridesWarningUpdated: function()     {        var message = WebInspector.overridesSupport.warningMessage();        this._warningMessage.textContent = message;        this._warningInfobar.setVisible(!!message);    },    _showEmulationInDrawer: function()     {        WebInspector.Revealer.reveal(WebInspector.overridesSupport);    },    _deviceModeSelected: function(device, mode)     {        if (device && mode) {            var orientation = device.orientationByName(mode.orientation);            this._deviceInsets = mode.insets;            WebInspector.overridesSupport.settings.screenOrientationOverride.set(mode.orientation == WebInspector.EmulatedDevice.Horizontal ? "landscapePrimary" : "portraitPrimary");        } else {            this._deviceInsets = new Insets(0,0,0,0);            WebInspector.overridesSupport.settings.screenOrientationOverride.set("");        }        this.dispatchEventToListeners(WebInspector.OverridesSupport.PageResizer.Events.InsetsChanged, this._deviceInsets);    },    _viewportChanged: function(viewport)     {        if (viewport) {            this._viewport = viewport;            this._viewport.minimumPageScaleFactor = Math.max(0.1, this._viewport.minimumPageScaleFactor);            this._viewport.minimumPageScaleFactor = Math.min(this._viewport.minimumPageScaleFactor, this._viewport.pageScaleFactor);            this._viewport.maximumPageScaleFactor = Math.min(10, this._viewport.maximumPageScaleFactor);            this._viewport.maximumPageScaleFactor = Math.max(this._viewport.maximumPageScaleFactor, this._viewport.pageScaleFactor);            this._viewportChangedThrottler.schedule(this._updateUIThrottled.bind(this));        }    },    _updateUIThrottled: function(finishCallback)     {        this._updateUI();        finishCallback();    },    _pageScaleButtonClicked: function(increase, event)     {        this._pageScaleFactorThrottler.schedule(updatePageScaleFactor.bind(this));        function updatePageScaleFactor(finishCallback)         {            if (this._target && this._viewport) {                var value = this._viewport.pageScaleFactor;                value = increase ? value * 1.1 : value / 1.1;                value = Math.min(this._viewport.maximumPageScaleFactor, value);                value = Math.max(this._viewport.minimumPageScaleFactor, value);                this._target.emulationAgent().setPageScaleFactor(value);            }            finishCallback();        }    },    _resetPageScale: function()     {        this._pageScaleFactorThrottler.schedule(updatePageScaleFactor.bind(this));        function updatePageScaleFactor(finishCallback)         {            if (this._target && this._viewport && this._viewport.minimumPageScaleFactor <= 1 && this._viewport.maximumPageScaleFactor >= 1)                this._target.emulationAgent().setPageScaleFactor(1);            finishCallback();        }    },    __proto__: WebInspector.VBox.prototype};WebInspector.EmulationDispatcher = function(responsiveDesignView) {    this._responsiveDesignView = responsiveDesignView;}WebInspector.EmulationDispatcher.prototype = {    viewportChanged: function(viewport)     {        this._responsiveDesignView._viewportChanged(viewport);    }};WebInspector.OverridesView = function() {    WebInspector.VBox.call(this);    this.setMinimumSize(0, 30);    this.registerRequiredCSS("emulation/overrides.css");    this.element.classList.add("overrides-view");    this._tabbedPane = new WebInspector.TabbedPane();    this._tabbedPane.setShrinkableTabs(false);    this._tabbedPane.setVerticalTabLayout(true);    new WebInspector.OverridesView.DeviceTab().appendAsTab(this._tabbedPane);    new WebInspector.OverridesView.MediaTab().appendAsTab(this._tabbedPane);    new WebInspector.OverridesView.NetworkTab().appendAsTab(this._tabbedPane);    new WebInspector.OverridesView.SensorsTab().appendAsTab(this._tabbedPane);    this._lastSelectedTabSetting = WebInspector.settings.createSetting("lastSelectedEmulateTab", "device");    this._tabbedPane.selectTab(this._lastSelectedTabSetting.get());    this._tabbedPane.addEventListener(WebInspector.TabbedPane.EventTypes.TabSelected, this._tabSelected, this);    this._tabbedPane.show(this.element);    var resetButtonElement = createTextButton(WebInspector.UIString("Reset"), WebInspector.overridesSupport.reset.bind(WebInspector.overridesSupport));    resetButtonElement.id = "overrides-reset-button";    this._tabbedPane.appendAfterTabStrip(resetButtonElement);    var disableButtonElement = createTextButton(WebInspector.UIString("Disable"), this._toggleEmulationEnabled.bind(this), "overrides-disable-button");    disableButtonElement.id = "overrides-disable-button";    this._tabbedPane.appendAfterTabStrip(disableButtonElement);    this._splashScreenElement = this.element.createChild("div", "overrides-splash-screen");    this._splashScreenElement.appendChild(createTextButton(WebInspector.UIString("Enable emulation"), this._toggleEmulationEnabled.bind(this), "overrides-enable-button"));    this._unavailableSplashScreenElement = this.element.createChild("div", "overrides-splash-screen");    this._unavailableSplashScreenElement.createTextChild(WebInspector.UIString("Emulation is not available."));    this._warningFooter = this.element.createChild("div", "overrides-footer");    this._overridesWarningUpdated();    WebInspector.overridesSupport.addEventListener(WebInspector.OverridesSupport.Events.OverridesWarningUpdated, this._overridesWarningUpdated, this);    WebInspector.overridesSupport.addEventListener(WebInspector.OverridesSupport.Events.EmulationStateChanged, this._emulationStateChanged, this);    this._emulationStateChanged();}WebInspector.OverridesView.prototype = {    _tabSelected: function(event)     {        this._lastSelectedTabSetting.set(this._tabbedPane.selectedTabId);    },    _overridesWarningUpdated: function()     {        var message = WebInspector.overridesSupport.warningMessage();        this._warningFooter.classList.toggle("hidden", !message);        this._warningFooter.textContent = message;    },    _toggleEmulationEnabled: function()     {        WebInspector.overridesSupport.setEmulationEnabled(!WebInspector.overridesSupport.emulationEnabled());    },    _emulationStateChanged: function()     {        this._unavailableSplashScreenElement.classList.toggle("hidden", WebInspector.overridesSupport.canEmulate());        this._tabbedPane.element.classList.toggle("hidden", !WebInspector.overridesSupport.emulationEnabled());        this._splashScreenElement.classList.toggle("hidden", WebInspector.overridesSupport.emulationEnabled() || !WebInspector.overridesSupport.canEmulate());    },    __proto__: WebInspector.VBox.prototype}WebInspector.OverridesView.Tab = function(id, name, settings, predicates) {    WebInspector.VBox.call(this);    this._id = id;    this._name = name;    this._settings = settings;    this._predicates = predicates || [];    for (var i = 0; i < settings.length; ++i)        settings[i].addChangeListener(this.updateActiveState, this);}WebInspector.OverridesView.Tab.prototype = {    appendAsTab: function(tabbedPane)     {        this._tabbedPane = tabbedPane;        tabbedPane.appendTab(this._id, this._name, this);        this.updateActiveState();    },    updateActiveState: function()     {        if (!this._tabbedPane)            return;        var active = false;        for (var i = 0; !active && i < this._settings.length; ++i)            active = this._settings[i].get();        for (var i = 0; !active && i < this._predicates.length; ++i)            active = this._predicates[i]();        this._tabbedPane.toggleTabClass(this._id, "overrides-activate", active);    },    _createSettingCheckbox: function(name, setting, callback)     {        var checkbox = WebInspector.SettingsUI.createSettingCheckbox(name, setting, true);        function changeListener(value)         {            callback(setting.get());        }        if (callback)            setting.addChangeListener(changeListener);        return checkbox;    },    __proto__: WebInspector.VBox.prototype}WebInspector.OverridesView.DeviceTab = function() {    WebInspector.OverridesView.Tab.call(this, "device", WebInspector.UIString("Device"), [WebInspector.overridesSupport.settings.emulateResolution, WebInspector.overridesSupport.settings.deviceScaleFactor, WebInspector.overridesSupport.settings.emulateMobile]);    this.element.classList.add("overrides-device");    this.element.appendChild(this._createDeviceElement());    var footnote = this.element.createChild("p", "help-footnote");    footnote.appendChild(WebInspector.linkifyDocumentationURLAsNode("device-mode", WebInspector.UIString("More information about screen emulation")));}WebInspector.OverridesView.DeviceTab.prototype = {    _createDeviceElement: function()     {        var fieldsetElement = createElement("fieldset");        fieldsetElement.id = "metrics-override-section";        var deviceModelElement = fieldsetElement.createChild("p", "overrides-device-model-section");        deviceModelElement.createChild("span").textContent = WebInspector.UIString("Model:");        var rotateButton = createElement("button");        rotateButton.textContent = " \u21C4 ";        var deviceSelect = new WebInspector.DeviceSelect(rotateButton,null );        deviceModelElement.appendChild(deviceSelect.element);        var emulateResolutionCheckbox = WebInspector.SettingsUI.createSettingCheckbox(WebInspector.UIString("Emulate screen resolution"), WebInspector.overridesSupport.settings.emulateResolution, true);        fieldsetElement.appendChild(emulateResolutionCheckbox);        var resolutionFieldset = WebInspector.SettingsUI.createSettingFieldset(WebInspector.overridesSupport.settings.emulateResolution);        fieldsetElement.appendChild(resolutionFieldset);        var tableElement = resolutionFieldset.createChild("table");        var rowElement = tableElement.createChild("tr");        var cellElement = rowElement.createChild("td");        cellElement.createTextChild(WebInspector.UIString("Resolution:"));        cellElement = rowElement.createChild("td");        var widthOverrideInput = WebInspector.SettingsUI.createSettingInputField("", WebInspector.overridesSupport.settings.deviceWidth, true, 4, "80px", WebInspector.OverridesSupport.deviceSizeValidator, true, true, WebInspector.UIString("\u2013"));        cellElement.appendChild(widthOverrideInput);        var heightOverrideInput = WebInspector.SettingsUI.createSettingInputField("", WebInspector.overridesSupport.settings.deviceHeight, true, 4, "80px", WebInspector.OverridesSupport.deviceSizeValidator, true, true, WebInspector.UIString("\u2013"));        cellElement.appendChild(heightOverrideInput);        rowElement = tableElement.createChild("tr");        cellElement = rowElement.createChild("td");        cellElement.colSpan = 4;        rowElement = tableElement.createChild("tr");        rowElement.title = WebInspector.UIString("Ratio between a device's physical pixels and device-independent pixels.");        rowElement.createChild("td").createTextChild(WebInspector.UIString("Device pixel ratio:"));        rowElement.createChild("td").appendChild(WebInspector.SettingsUI.createSettingInputField("", WebInspector.overridesSupport.settings.deviceScaleFactor, true, 4, "80px", WebInspector.OverridesSupport.deviceScaleFactorValidator, true, true, WebInspector.UIString("\u2013")));        var mobileCheckbox = this._createSettingCheckbox(WebInspector.UIString("Emulate mobile"), WebInspector.overridesSupport.settings.emulateMobile);        mobileCheckbox.title = WebInspector.UIString("Enable meta viewport, overlay scrollbars, text autosizing and default 980px body width");        fieldsetElement.appendChild(mobileCheckbox);        fieldsetElement.appendChild(this._createSettingCheckbox(WebInspector.UIString("Shrink to fit"), WebInspector.overridesSupport.settings.deviceFitWindow));        return fieldsetElement;    },    __proto__: WebInspector.OverridesView.Tab.prototype}WebInspector.OverridesView.MediaTab = function() {    var settings = [WebInspector.overridesSupport.settings.overrideCSSMedia];    WebInspector.OverridesView.Tab.call(this, "media", WebInspector.UIString("Media"), settings);    this.element.classList.add("overrides-media");    this._createMediaEmulationFragment();}WebInspector.OverridesView.MediaTab.prototype = {    _createMediaEmulationFragment: function()     {        var checkbox = WebInspector.SettingsUI.createSettingCheckbox(WebInspector.UIString("CSS media"), WebInspector.overridesSupport.settings.overrideCSSMedia, true);        var fieldsetElement = WebInspector.SettingsUI.createSettingFieldset(WebInspector.overridesSupport.settings.overrideCSSMedia);        var mediaSelectElement = fieldsetElement.createChild("select");        var mediaTypes = WebInspector.CSSStyleModel.MediaTypes;        var defaultMedia = WebInspector.overridesSupport.settings.emulatedCSSMedia.get();        for (var i = 0; i < mediaTypes.length; ++i) {            var mediaType = mediaTypes[i];            if (mediaType === "all") {                continue;            }            var option = createElement("option");            option.text = mediaType;            option.value = mediaType;            mediaSelectElement.add(option);            if (mediaType === defaultMedia)                mediaSelectElement.selectedIndex = mediaSelectElement.options.length - 1;        }        mediaSelectElement.addEventListener("change", this._emulateMediaChanged.bind(this, mediaSelectElement), false);        var fragment = createDocumentFragment();        fragment.appendChild(checkbox);        fragment.appendChild(fieldsetElement);        this.element.appendChild(fragment);    },    _emulateMediaChanged: function(select)     {        var media = select.options[select.selectedIndex].value;        WebInspector.overridesSupport.settings.emulatedCSSMedia.set(media);    },    __proto__: WebInspector.OverridesView.Tab.prototype}WebInspector.OverridesView.NetworkTab = function() {    WebInspector.OverridesView.Tab.call(this, "network", WebInspector.UIString("Network"), [], [this._userAgentOverrideEnabled.bind(this)]);    this.element.classList.add("overrides-network");    this._createUserAgentSection();}WebInspector.OverridesView.NetworkTab.prototype = {    _userAgentOverrideEnabled: function()     {        return !!WebInspector.overridesSupport.settings.userAgent.get();    },    _createUserAgentSection: function()     {        var fieldsetElement = this.element.createChild("fieldset");        fieldsetElement.createChild("label").textContent = WebInspector.UIString("Spoof user agent:");        var selectAndInput = WebInspector.OverridesUI.createUserAgentSelectAndInput();        fieldsetElement.appendChild(selectAndInput.select);        fieldsetElement.appendChild(selectAndInput.input);        WebInspector.overridesSupport.settings.userAgent.addChangeListener(this.updateActiveState, this);    },    __proto__: WebInspector.OverridesView.Tab.prototype}WebInspector.OverridesView.SensorsTab = function() {    WebInspector.OverridesView.Tab.call(this, "sensors", WebInspector.UIString("Sensors"), [WebInspector.overridesSupport.settings.overrideGeolocation, WebInspector.overridesSupport.settings.overrideDeviceOrientation, WebInspector.overridesSupport.settings.emulateTouch]);    this.element.classList.add("overrides-sensors");    this.registerRequiredCSS("emulation/accelerometer.css");    this.element.appendChild(this._createSettingCheckbox(WebInspector.UIString("Emulate touch screen"), WebInspector.overridesSupport.settings.emulateTouch, undefined));    this._appendGeolocationOverrideControl();    this._apendDeviceOrientationOverrideControl();}WebInspector.OverridesView.SensorsTab.prototype = {    _appendGeolocationOverrideControl: function()     {        const geolocationSetting = WebInspector.overridesSupport.settings.geolocationOverride.get();        var geolocation = WebInspector.OverridesSupport.GeolocationPosition.parseSetting(geolocationSetting);        this.element.appendChild(this._createSettingCheckbox(WebInspector.UIString("Emulate geolocation coordinates"), WebInspector.overridesSupport.settings.overrideGeolocation, this._geolocationOverrideCheckboxClicked.bind(this)));        this.element.appendChild(this._createGeolocationOverrideElement(geolocation));        this._geolocationOverrideCheckboxClicked(WebInspector.overridesSupport.settings.overrideGeolocation.get());    },    _geolocationOverrideCheckboxClicked: function(enabled)     {        if (enabled && !this._latitudeElement.value)            this._latitudeElement.focus();    },    _applyGeolocationUserInput: function()     {        this._setGeolocationPosition(WebInspector.OverridesSupport.GeolocationPosition.parseUserInput(this._latitudeElement.value.trim(), this._longitudeElement.value.trim(), this._geolocationErrorElement.checked), true);    },    _setGeolocationPosition: function(geolocation, userInputModified)     {        if (!geolocation)            return;        if (!userInputModified) {            this._latitudeElement.value = geolocation.latitude;            this._longitudeElement.value = geolocation.longitude;        }        var value = geolocation.toSetting();        WebInspector.overridesSupport.settings.geolocationOverride.set(value);    },    _createGeolocationOverrideElement: function(geolocation)     {        var fieldsetElement = WebInspector.SettingsUI.createSettingFieldset(WebInspector.overridesSupport.settings.overrideGeolocation);        fieldsetElement.id = "geolocation-override-section";        var tableElement = fieldsetElement.createChild("table");        var rowElement = tableElement.createChild("tr");        var cellElement = rowElement.createChild("td");        cellElement = rowElement.createChild("td");        cellElement.createTextChild(WebInspector.UIString("Lat = "));        this._latitudeElement = WebInspector.SettingsUI.createInput(cellElement, "geolocation-override-latitude", String(geolocation.latitude), this._applyGeolocationUserInput.bind(this), true);        cellElement.createTextChild(" , ");        cellElement.createTextChild(WebInspector.UIString("Lon = "));        this._longitudeElement = WebInspector.SettingsUI.createInput(cellElement, "geolocation-override-longitude", String(geolocation.longitude), this._applyGeolocationUserInput.bind(this), true);        rowElement = tableElement.createChild("tr");        cellElement = rowElement.createChild("td");        cellElement.colSpan = 2;        var geolocationErrorLabelElement = createCheckboxLabel(WebInspector.UIString("Emulate position unavailable"), !geolocation || !!geolocation.error);        var geolocationErrorCheckboxElement = geolocationErrorLabelElement.checkboxElement;        geolocationErrorCheckboxElement.id = "geolocation-error";        geolocationErrorCheckboxElement.addEventListener("click", this._applyGeolocationUserInput.bind(this), false);        this._geolocationErrorElement = geolocationErrorCheckboxElement;        cellElement.appendChild(geolocationErrorLabelElement);        return fieldsetElement;    },    _apendDeviceOrientationOverrideControl: function()     {        const deviceOrientationSetting = WebInspector.overridesSupport.settings.deviceOrientationOverride.get();        var deviceOrientation = WebInspector.OverridesSupport.DeviceOrientation.parseSetting(deviceOrientationSetting);        this.element.appendChild(this._createSettingCheckbox(WebInspector.UIString("Accelerometer"), WebInspector.overridesSupport.settings.overrideDeviceOrientation, this._deviceOrientationOverrideCheckboxClicked.bind(this)));        this.element.appendChild(this._createDeviceOrientationOverrideElement(deviceOrientation));        this._deviceOrientationOverrideCheckboxClicked(WebInspector.overridesSupport.settings.overrideDeviceOrientation.get());    },    _deviceOrientationOverrideCheckboxClicked: function(enabled)     {        if (enabled && !this._alphaElement.value)            this._alphaElement.focus();    },    _applyDeviceOrientationUserInput: function()     {        this._setDeviceOrientation(WebInspector.OverridesSupport.DeviceOrientation.parseUserInput(this._alphaElement.value.trim(), this._betaElement.value.trim(), this._gammaElement.value.trim()), WebInspector.OverridesView.SensorsTab.DeviceOrientationModificationSource.UserInput);    },    _resetDeviceOrientation: function()     {        this._setDeviceOrientation(new WebInspector.OverridesSupport.DeviceOrientation(0,0,0), WebInspector.OverridesView.SensorsTab.DeviceOrientationModificationSource.ResetButton);    },    _setDeviceOrientation: function(deviceOrientation, modificationSource)     {        if (!deviceOrientation)            return;        if (modificationSource != WebInspector.OverridesView.SensorsTab.DeviceOrientationModificationSource.UserInput) {            this._alphaElement.value = deviceOrientation.alpha;            this._betaElement.value = deviceOrientation.beta;            this._gammaElement.value = deviceOrientation.gamma;        }        if (modificationSource != WebInspector.OverridesView.SensorsTab.DeviceOrientationModificationSource.UserDrag)            this._setBoxOrientation(deviceOrientation);        var value = deviceOrientation.toSetting();        WebInspector.overridesSupport.settings.deviceOrientationOverride.set(value);    },    _createAxisInput: function(parentElement, id, label, defaultText)     {        var div = parentElement.createChild("div", "accelerometer-axis-input-container");        div.createTextChild(label);        return WebInspector.SettingsUI.createInput(div, id, defaultText, this._applyDeviceOrientationUserInput.bind(this), true);    },    _createDeviceOrientationOverrideElement: function(deviceOrientation)     {        var fieldsetElement = WebInspector.SettingsUI.createSettingFieldset(WebInspector.overridesSupport.settings.overrideDeviceOrientation);        fieldsetElement.id = "device-orientation-override-section";        var tableElement = fieldsetElement.createChild("table");        var rowElement = tableElement.createChild("tr");        var cellElement = rowElement.createChild("td", "accelerometer-inputs-cell");        this._alphaElement = this._createAxisInput(cellElement, "device-orientation-override-alpha", "\u03B1: ", String(deviceOrientation.alpha));        this._betaElement = this._createAxisInput(cellElement, "device-orientation-override-beta", "\u03B2: ", String(deviceOrientation.beta));        this._gammaElement = this._createAxisInput(cellElement, "device-orientation-override-gamma", "\u03B3: ", String(deviceOrientation.gamma));        cellElement.appendChild(createTextButton(WebInspector.UIString("Reset"), this._resetDeviceOrientation.bind(this), "accelerometer-reset-button"));        this._stageElement = rowElement.createChild("td", "accelerometer-stage");        this._boxElement = this._stageElement.createChild("section", "accelerometer-box");        this._boxElement.createChild("section", "front");        this._boxElement.createChild("section", "top");        this._boxElement.createChild("section", "back");        this._boxElement.createChild("section", "left");        this._boxElement.createChild("section", "right");        this._boxElement.createChild("section", "bottom");        WebInspector.installDragHandle(this._stageElement, this._onBoxDragStart.bind(this), this._onBoxDrag.bind(this), this._onBoxDragEnd.bind(this), "move");        this._setBoxOrientation(deviceOrientation);        return fieldsetElement;    },    _setBoxOrientation: function(deviceOrientation)     {        var matrix = new WebKitCSSMatrix();        this._boxMatrix = matrix.rotate(-deviceOrientation.beta, deviceOrientation.gamma, -deviceOrientation.alpha);        this._boxElement.style.webkitTransform = this._boxMatrix.toString();    },    _onBoxDrag: function(event)     {        var mouseMoveVector = this._calculateRadiusVector(event.x, event.y);        if (!mouseMoveVector)            return true;        event.consume(true);        var axis = WebInspector.Geometry.crossProduct(this._mouseDownVector, mouseMoveVector);        axis.normalize();        var angle = WebInspector.Geometry.calculateAngle(this._mouseDownVector, mouseMoveVector);        var matrix = new WebKitCSSMatrix();        var rotationMatrix = matrix.rotateAxisAngle(axis.x, axis.y, axis.z, angle);        this._currentMatrix = rotationMatrix.multiply(this._boxMatrix);        this._boxElement.style.webkitTransform = this._currentMatrix;        var eulerAngles = WebInspector.Geometry.EulerAngles.fromRotationMatrix(this._currentMatrix);        var newOrientation = new WebInspector.OverridesSupport.DeviceOrientation(-eulerAngles.alpha,-eulerAngles.beta,eulerAngles.gamma);        this._setDeviceOrientation(newOrientation, WebInspector.OverridesView.SensorsTab.DeviceOrientationModificationSource.UserDrag);        return false;    },    _onBoxDragStart: function(event)     {        if (!WebInspector.overridesSupport.settings.overrideDeviceOrientation.get())            return false;        this._mouseDownVector = this._calculateRadiusVector(event.x, event.y);        if (!this._mouseDownVector)            return false;        event.consume(true);        return true;    },    _onBoxDragEnd: function()     {        this._boxMatrix = this._currentMatrix;    },    _calculateRadiusVector: function(x, y)     {        var rect = this._stageElement.getBoundingClientRect();        var radius = Math.max(rect.width, rect.height) / 2;        var sphereX = (x - rect.left - rect.width / 2) / radius;        var sphereY = (y - rect.top - rect.height / 2) / radius;        var sqrSum = sphereX * sphereX + sphereY * sphereY;        if (sqrSum > 0.5)            return new WebInspector.Geometry.Vector(sphereX,sphereY,0.5 / Math.sqrt(sqrSum));        return new WebInspector.Geometry.Vector(sphereX,sphereY,Math.sqrt(1 - sqrSum));    },    __proto__: WebInspector.OverridesView.Tab.prototype}WebInspector.OverridesView.SensorsTab.DeviceOrientationModificationSource = {    UserInput: "userInput",    UserDrag: "userDrag",    ResetButton: "resetButton"}WebInspector.OverridesView.Revealer = function() {}WebInspector.OverridesView.Revealer.prototype = {    reveal: function(overridesSupport)     {        WebInspector.inspectorView.showViewInDrawer("emulation");        return Promise.resolve();    }};WebInspector.HelpScreenUntilReload = function(debuggerModel, title, message) {    WebInspector.HelpScreen.call(this, title);    this._debuggerModel = debuggerModel;    var p = this.helpContentElement.createChild("p");    p.classList.add("help-section");    p.textContent = message;    this._debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.GlobalObjectCleared, this.hide, this);}WebInspector.HelpScreenUntilReload.prototype = {    willHide: function()     {        this._debuggerModel.removeEventListener(WebInspector.DebuggerModel.Events.GlobalObjectCleared, this.hide, this);        WebInspector.HelpScreen.prototype.willHide.call(this);    },    __proto__: WebInspector.HelpScreen.prototype};WebInspector.AdvancedApp = function() {    WebInspector.dockController.addEventListener(WebInspector.DockController.Events.BeforeDockSideChanged, this._openToolboxWindow, this);};WebInspector.AdvancedApp.prototype = {    presentUI: function(document)     {        var rootView = new WebInspector.RootView();        this._rootSplitWidget = new WebInspector.SplitWidget(false,true,"InspectorView.splitViewState",555,300,true);        this._rootSplitWidget.show(rootView.element);        this._rootSplitWidget.setSidebarWidget(WebInspector.inspectorView);        this._inspectedPagePlaceholder = new WebInspector.InspectedPagePlaceholder();        this._inspectedPagePlaceholder.addEventListener(WebInspector.InspectedPagePlaceholder.Events.Update, this._onSetInspectedPageBounds.bind(this, false), this);        this._responsiveDesignView = new WebInspector.ResponsiveDesignView(this._inspectedPagePlaceholder);        this._rootSplitWidget.setMainWidget(this._responsiveDesignView);        WebInspector.dockController.addEventListener(WebInspector.DockController.Events.BeforeDockSideChanged, this._onBeforeDockSideChange, this);        WebInspector.dockController.addEventListener(WebInspector.DockController.Events.DockSideChanged, this._onDockSideChange, this);        WebInspector.dockController.addEventListener(WebInspector.DockController.Events.AfterDockSideChanged, this._onAfterDockSideChange, this);        this._onDockSideChange();        WebInspector.inspectorView.showInitialPanel();        console.timeStamp("AdvancedApp.attachToBody");        rootView.attachToDocument(document);        this._inspectedPagePlaceholder.update();    },    _openToolboxWindow: function(event)     {        if ((event.data.to) !== WebInspector.DockController.State.Undocked)            return;        if (this._toolboxWindow)            return;        var url = window.location.href.replace("inspector.html", "toolbox.html");        this._toolboxWindow = window.open(url, undefined);    },    toolboxLoaded: function(toolboxDocument)     {        WebInspector.initializeUIUtils(toolboxDocument.defaultView);        WebInspector.installComponentRootStyles((toolboxDocument.body));        WebInspector.ContextMenu.installHandler(toolboxDocument);        var rootView = new WebInspector.RootView();        var inspectedPagePlaceholder = new WebInspector.InspectedPagePlaceholder();        inspectedPagePlaceholder.addEventListener(WebInspector.InspectedPagePlaceholder.Events.Update, this._onSetInspectedPageBounds.bind(this, true));        this._toolboxResponsiveDesignView = new WebInspector.ResponsiveDesignView(inspectedPagePlaceholder);        this._toolboxResponsiveDesignView.show(rootView.element);        rootView.attachToDocument(toolboxDocument);        this._updatePageResizer();    },    inspectorFrontendHost: function()     {        return window.InspectorFrontendHost;    },    _updatePageResizer: function()     {        if (this._isDocked())            this._responsiveDesignView.updatePageResizer();        else if (this._toolboxResponsiveDesignView)            this._toolboxResponsiveDesignView.updatePageResizer();    },    _onBeforeDockSideChange: function(event)     {        if ((event.data.to) === WebInspector.DockController.State.Undocked && this._toolboxResponsiveDesignView) {            this._rootSplitWidget.hideSidebar();            this._inspectedPagePlaceholder.update();        }        this._changingDockSide = true;    },    _onDockSideChange: function(event)     {        this._updatePageResizer();        var toDockSide = event ? (event.data.to) : WebInspector.dockController.dockSide();        if (toDockSide === WebInspector.DockController.State.Undocked) {            this._updateForUndocked();        } else if (this._toolboxResponsiveDesignView && event && (event.data.from) === WebInspector.DockController.State.Undocked) {            this._rootSplitWidget.hideSidebar();        } else {            this._updateForDocked(toDockSide);        }    },    _onAfterDockSideChange: function(event)     {        if (!this._changingDockSide)            return;        this._changingDockSide = false;        if ((event.data.from) === WebInspector.DockController.State.Undocked) {            this._updateForDocked((event.data.to));        }        this._inspectedPagePlaceholder.update();    },    _updateForDocked: function(dockSide)     {        this._rootSplitWidget.setVertical(dockSide === WebInspector.DockController.State.DockedToRight);        this._rootSplitWidget.setSecondIsSidebar(dockSide === WebInspector.DockController.State.DockedToRight || dockSide === WebInspector.DockController.State.DockedToBottom);        this._rootSplitWidget.toggleResizer(this._rootSplitWidget.resizerElement(), true);        this._rootSplitWidget.toggleResizer(WebInspector.inspectorView.topResizerElement(), dockSide === WebInspector.DockController.State.DockedToBottom);        this._rootSplitWidget.showBoth();    },    _updateForUndocked: function()     {        this._rootSplitWidget.toggleResizer(this._rootSplitWidget.resizerElement(), false);        this._rootSplitWidget.toggleResizer(WebInspector.inspectorView.topResizerElement(), false);        this._rootSplitWidget.hideMain();    },    _isDocked: function()     {        return WebInspector.dockController.dockSide() !== WebInspector.DockController.State.Undocked;    },    _onSetInspectedPageBounds: function(toolbox, event)     {        if (this._changingDockSide || (this._isDocked() === toolbox))            return;        if (!window.innerWidth || !window.innerHeight)            return;        var bounds = (event.data);        console.timeStamp("AdvancedApp.setInspectedPageBounds");        InspectorFrontendHost.setInspectedPageBounds(bounds);    }};WebInspector.AdvancedApp._appInstance;WebInspector.AdvancedApp._instance = function() {    if (!WebInspector.AdvancedApp._appInstance)        WebInspector.AdvancedApp._appInstance = new WebInspector.AdvancedApp();    return WebInspector.AdvancedApp._appInstance;};WebInspector.AdvancedAppProvider = function() {};WebInspector.AdvancedAppProvider.prototype = {    createApp: function()     {        return WebInspector.AdvancedApp._instance();    }};;WebInspector.RenderingOptions = function() {    this._setterNames = new Map();    this._mapSettingToSetter(WebInspector.moduleSetting("showPaintRects"), "setShowPaintRects");    this._mapSettingToSetter(WebInspector.moduleSetting("showDebugBorders"), "setShowDebugBorders");    this._mapSettingToSetter(WebInspector.moduleSetting("showFPSCounter"), "setShowFPSCounter");    this._mapSettingToSetter(WebInspector.moduleSetting("continuousPainting"), "setContinuousPaintingEnabled");    this._mapSettingToSetter(WebInspector.moduleSetting("showScrollBottleneckRects"), "setShowScrollBottleneckRects");    WebInspector.targetManager.observeTargets(this, WebInspector.Target.Type.Page);}WebInspector.RenderingOptions.prototype = {    targetAdded: function(target)     {        var settings = this._setterNames.keysArray();        for (var i = 0; i < settings.length; ++i) {            var setting = settings[i];            if (setting.get()) {                var setterName = this._setterNames.get(setting);                target.renderingAgent()[setterName](true);            }        }    },    targetRemoved: function(target)     {},    _mapSettingToSetter: function(setting, setterName)     {        this._setterNames.set(setting, setterName);        setting.addChangeListener(changeListener);        function changeListener()         {            var targets = WebInspector.targetManager.targets(WebInspector.Target.Type.Page);            for (var i = 0; i < targets.length; ++i)                targets[i].renderingAgent()[setterName](setting.get());        }    }}WebInspector.RenderingOptions.View = function() {    WebInspector.VBox.call(this);    this.registerRequiredCSS("ui/helpScreen.css");    this.element.classList.add("help-indent-labels");    var div = this.element.createChild("div", "settings-tab help-content help-container help-no-columns");    div.appendChild(WebInspector.SettingsUI.createSettingCheckbox(WebInspector.UIString("Show paint rectangles"), WebInspector.moduleSetting("showPaintRects")));    div.appendChild(WebInspector.SettingsUI.createSettingCheckbox(WebInspector.UIString("Show composited layer borders"), WebInspector.moduleSetting("showDebugBorders")));    div.appendChild(WebInspector.SettingsUI.createSettingCheckbox(WebInspector.UIString("Show FPS meter"), WebInspector.moduleSetting("showFPSCounter")));    div.appendChild(WebInspector.SettingsUI.createSettingCheckbox(WebInspector.UIString("Enable continuous page repainting"), WebInspector.moduleSetting("continuousPainting")));    var child = WebInspector.SettingsUI.createSettingCheckbox(WebInspector.UIString("Show potential scroll bottlenecks"), WebInspector.moduleSetting("showScrollBottleneckRects"));    child.title = WebInspector.UIString("Shows areas of the page that slow down scrolling:\nTouch and mousewheel event listeners can delay scrolling.\nSome areas need to repaint their content when scrolled.");    div.appendChild(child);}WebInspector.RenderingOptions.View.prototype = {    __proto__: WebInspector.VBox.prototype};WebInspector.SimpleApp = function() {};WebInspector.SimpleApp.prototype = {    presentUI: function(document)     {        var rootView = new WebInspector.RootView();        WebInspector.inspectorView.show(rootView.element);        WebInspector.inspectorView.showInitialPanel();        rootView.attachToDocument(document);    }};WebInspector.SimpleAppProvider = function() {};WebInspector.SimpleAppProvider.prototype = {    createApp: function()     {        return new WebInspector.SimpleApp();    }};;WebInspector.evaluateForTestInFrontend = function(callId, script) {    if (!InspectorFrontendHost.isUnderTest())        return;    function invokeMethod()     {        try {            script = script + "//# sourceURL=evaluateInWebInspector" + callId + ".js";            window.eval(script);        } catch (e) {            console.error(e.stack);        }    }    InspectorBackend.connection().runAfterPendingDispatches(invokeMethod);};function createTestSuite(domAutomationController) {    function TestSuite()     {        WebInspector.TestBase.call(this, domAutomationController);    }    ;TestSuite.prototype = {        __proto__: WebInspector.TestBase.prototype    };    TestSuite.prototype.showPanel = function(panelName)     {        return WebInspector.inspectorView.showPanel(panelName);    }    ;    TestSuite.prototype.testShowScriptsTab = function()     {        var test = this;        this.showPanel("sources").then(function() {            this._waitUntilScriptsAreParsed(["debugger_test_page.html"], function() {                test.releaseControl();            }            );        }        .bind(this));        this.takeControl();    }    ;    TestSuite.prototype.testScriptsTabIsPopulatedOnInspectedPageRefresh = function()     {        var test = this;        var debuggerModel = WebInspector.DebuggerModel.fromTarget(WebInspector.targetManager.mainTarget());        debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.GlobalObjectCleared, waitUntilScriptIsParsed);        this.showPanel("elements").then(function() {            test.evaluateInConsole_("window.location.reload(true);", function(resultText) {}            );        }        );        function waitUntilScriptIsParsed()         {            debuggerModel.removeEventListener(WebInspector.DebuggerModel.Events.GlobalObjectCleared, waitUntilScriptIsParsed);            test.showPanel("sources").then(function() {                test._waitUntilScriptsAreParsed(["debugger_test_page.html"], function() {                    test.releaseControl();                }                );            }            );        }        this.takeControl();    }    ;    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();            }            );        }        );        this.takeControl();    }    ;    TestSuite.prototype.testNoScriptDuplicatesOnPanelSwitch = function()     {        var test = this;        var expectedScriptsCount = 2;        var parsedScripts = [];        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++) {                var scriptName = WebInspector.networkMapping.networkURL(uiSourceCodes[i]);                for (var j = i + 1; j < uiSourceCodes.length; j++)                    test.assertTrue(scriptName !== WebInspector.networkMapping.networkURL(uiSourceCodes[j]), "Found script duplicates: " + test.uiSourceCodesToString_(uiSourceCodes));            }        }        this.showPanel("sources").then(function() {            test._waitUntilScriptsAreParsed(["debugger_test_page.html"], function() {                checkNoDuplicates();                setTimeout(switchToElementsTab, 0);            }            );        }        );        this.takeControl();    }    ;    TestSuite.prototype.testPauseWhenLoadingDevTools = function()     {        var debuggerModel = WebInspector.DebuggerModel.fromTarget(WebInspector.targetManager.mainTarget());        if (debuggerModel.debuggerPausedDetails)            return;        this.showPanel("sources").then(function() {            this._waitForScriptPause(this.releaseControl.bind(this));        }        .bind(this));        this.takeControl();    }    ;    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);            setTimeout(testScriptPause.bind(this), 300);        }        function testScriptPause() {            WebInspector.panels.sources._pauseButton.element.click();            this._waitForScriptPause(this.releaseControl.bind(this));        }        this.takeControl();    }    ;    TestSuite.prototype.testNetworkSize = function()     {        var test = this;        function finishResource(resource, finishTime)         {            test.assertEquals(219, resource.transferSize, "Incorrect total encoded data length");            test.assertEquals(25, resource.resourceSize, "Incorrect total data length");            test.releaseControl();        }        this.addSniffer(WebInspector.NetworkDispatcher.prototype, "_finishNetworkRequest", finishResource);        test.evaluateInConsole_("window.location.reload(true);", function(resultText) {}        );        this.takeControl();    }    ;    TestSuite.prototype.testNetworkSyncSize = function()     {        var test = this;        function finishResource(resource, finishTime)         {            test.assertEquals(219, resource.transferSize, "Incorrect total encoded data length");            test.assertEquals(25, resource.resourceSize, "Incorrect total data length");            test.releaseControl();        }        this.addSniffer(WebInspector.NetworkDispatcher.prototype, "_finishNetworkRequest", finishResource);        test.evaluateInConsole_("var xhr = new XMLHttpRequest(); xhr.open(\"GET\", \"chunked\", false); xhr.send(null);", function() {}        );        this.takeControl();    }    ;    TestSuite.prototype.testNetworkRawHeadersText = function()     {        var test = this;        function finishResource(resource, finishTime)         {            if (!resource.responseHeadersText)                test.fail("Failure: resource does not have response headers text");            test.assertEquals(164, resource.responseHeadersText.length, "Incorrect response headers text length");            test.releaseControl();        }        this.addSniffer(WebInspector.NetworkDispatcher.prototype, "_finishNetworkRequest", finishResource);        test.evaluateInConsole_("window.location.reload(true);", function(resultText) {}        );        this.takeControl();    }    ;    TestSuite.prototype.testNetworkTiming = function()     {        var test = this;        function finishResource(resource, finishTime)         {            test.assertTrue(resource.timing.receiveHeadersEnd - resource.timing.connectStart >= 70, "Time between receiveHeadersEnd and connectStart should be >=70ms, but was " + "receiveHeadersEnd=" + resource.timing.receiveHeadersEnd + ", connectStart=" + resource.timing.connectStart + ".");            test.assertTrue(resource.responseReceivedTime - resource.startTime >= 0.07, "Time between responseReceivedTime and startTime should be >=0.07s, but was " + "responseReceivedTime=" + resource.responseReceivedTime + ", startTime=" + resource.startTime + ".");            test.assertTrue(resource.endTime - resource.startTime >= 0.14, "Time between endTime and startTime should be >=0.14s, but was " + "endtime=" + resource.endTime + ", startTime=" + resource.startTime + ".");            test.releaseControl();        }        this.addSniffer(WebInspector.NetworkDispatcher.prototype, "_finishNetworkRequest", finishResource);        test.evaluateInConsole_("window.location.reload(true);", function(resultText) {}        );        this.takeControl();    }    ;    TestSuite.prototype.testConsoleOnNavigateBack = function()     {        if (WebInspector.multitargetConsoleModel.messages().length === 1)            firstConsoleMessageReceived.call(this);        else            WebInspector.multitargetConsoleModel.addEventListener(WebInspector.ConsoleModel.Events.MessageAdded, firstConsoleMessageReceived, this);        function firstConsoleMessageReceived() {            WebInspector.multitargetConsoleModel.removeEventListener(WebInspector.ConsoleModel.Events.MessageAdded, firstConsoleMessageReceived, this);            this.evaluateInConsole_("clickLink();", didClickLink.bind(this));        }        function didClickLink() {            this.assertEquals(3, WebInspector.multitargetConsoleModel.messages().length);            this.evaluateInConsole_("history.back();", didNavigateBack.bind(this));        }        function didNavigateBack()         {            this.evaluateInConsole_("void 0;", didCompleteNavigation.bind(this));        }        function didCompleteNavigation() {            this.assertEquals(7, WebInspector.multitargetConsoleModel.messages().length);            this.releaseControl();        }        this.takeControl();    }    ;    TestSuite.prototype.testReattachAfterCrash = function()     {        var target = WebInspector.targetManager.mainTarget();        target.pageAgent().navigate("about:crash");        target.pageAgent().navigate("about:blank");        target.runtimeModel.addEventListener(WebInspector.RuntimeModel.Events.ExecutionContextCreated, this.releaseControl, this);    }    ;    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()     {        function isReady()         {            return WebInspector.targetManager.targets().length == 2;        }        if (isReady())            return;        this.takeControl();        this.addSniffer(WebInspector.TargetManager.prototype, "addTarget", targetAdded.bind(this));        function targetAdded()         {            if (isReady()) {                this.releaseControl();                return;            }            this.addSniffer(WebInspector.TargetManager.prototype, "addTarget", targetAdded.bind(this));        }    }    ;    TestSuite.prototype.testPauseInSharedWorkerInitialization2 = function()     {        var debuggerModel = WebInspector.DebuggerModel.fromTarget(WebInspector.targetManager.mainTarget());        if (debuggerModel.isPaused())            return;        this._waitForScriptPause(this.releaseControl.bind(this));        this.takeControl();    }    ;    TestSuite.prototype.enableTouchEmulation = function()     {        WebInspector.overridesSupport._emulateTouchEventsInTarget(WebInspector.targetManager.mainTarget(), true, "mobile");    }    ;    TestSuite.prototype.testDeviceMetricsOverrides = function()     {        const dumpPageMetrics = function()         {            return JSON.stringify({                width: window.innerWidth,                height: window.innerHeight,                deviceScaleFactor: window.devicePixelRatio            });        }        ;        var test = this;        function testOverrides(params, metrics, callback)         {            WebInspector.targetManager.mainTarget().emulationAgent().invoke_setDeviceMetricsOverride(params, getMetrics);            function getMetrics()             {                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();        }        WebInspector.overridesSupport._deviceMetricsChangedListenerMuted = true;        test.takeControl();        this.waitForThrottler(WebInspector.overridesSupport._deviceMetricsThrottler, step1);    }    ;    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 = WebInspector.settings.createSetting("timelineCaptureFilmStrip", false);        captureFilmStripSetting.set(true);        test.evaluateInConsole_(performActionsInPage.toString(), function() {}        );        test.invokeAsyncWithTimeline_("performActionsInPage", onTimelineDone);        function onTimelineDone()         {            captureFilmStripSetting.set(false);            var filmStripModel = new WebInspector.FilmStripModel(WebInspector.panels.timeline._tracingModel);            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 redString = [255, 0, 0, 255].join(",");            var greenString = [0, 255, 0, 255].join(",");            var blueString = [0, 0, 255, 255].join(",");            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 (color === redString)                    redCount++;                else if (color === greenString)                    greenCount++;                else if (color === blueString)                    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 = WebInspector.settings.createSetting("local", undefined, true);            localSetting.set({                s: "local",                n: 1            });            var globalSetting = WebInspector.settings.createSetting("global", undefined, false);            globalSetting.set({                s: "global",                n: 2            });        }        function reset()         {            Runtime.experiments.clearForTest();            InspectorFrontendHost.getPreferences(gotPreferences);        }        function gotPreferences(prefs)         {            WebInspector.Main._instanceForTest._createSettings(prefs);            var localSetting = WebInspector.settings.createSetting("local", undefined, true);            test.assertEquals("object", typeof localSetting.get());            test.assertEquals("local", localSetting.get().s);            test.assertEquals(1, localSetting.get().n);            var globalSetting = WebInspector.settings.createSetting("global", undefined, false);            test.assertEquals("object", typeof globalSetting.get());            test.assertEquals("global", globalSetting.get().s);            test.assertEquals(2, globalSetting.get().n);            test.releaseControl();        }    }    TestSuite.prototype.waitForTestResultsInConsole = function()     {        var messages = WebInspector.multitargetConsoleModel.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);        }        function onConsoleMessage(event)         {            var text = event.data.messageText;            if (text === "PASS")                this.releaseControl();            else if (/^FAIL/.test(text))                this.fail(text);        }        WebInspector.multitargetConsoleModel.addEventListener(WebInspector.ConsoleModel.Events.MessageAdded, onConsoleMessage, this);        this.takeControl();    }    ;    TestSuite.prototype.invokeAsyncWithTimeline_ = function(functionName, callback)     {        var test = this;        test.showPanel("timeline").then(function() {            WebInspector.panels.timeline._model.addEventListener(WebInspector.TimelineModel.Events.RecordingStarted, onRecordingStarted);            WebInspector.panels.timeline.toggleTimelineButton.element.click();        }        );        function onRecordingStarted()         {            WebInspector.panels.timeline._model.removeEventListener(WebInspector.TimelineModel.Events.RecordingStarted, onRecordingStarted);            test.evaluateInConsole_(functionName + "(function() { console.log('DONE'); });", function() {}            );            WebInspector.multitargetConsoleModel.addEventListener(WebInspector.ConsoleModel.Events.MessageAdded, onConsoleMessage);        }        function onConsoleMessage(event)         {            var text = event.data.messageText;            if (text === "DONE") {                WebInspector.multitargetConsoleModel.removeEventListener(WebInspector.ConsoleModel.Events.MessageAdded, onConsoleMessage);                pageActionsDone();            }        }        function pageActionsDone()         {            WebInspector.panels.timeline._model.addEventListener(WebInspector.TimelineModel.Events.RecordingStopped, onRecordingStopped);            WebInspector.panels.timeline.toggleTimelineButton.element.click();        }        function onRecordingStopped()         {            WebInspector.panels.timeline._model.removeEventListener(WebInspector.TimelineModel.Events.RecordingStopped, onRecordingStopped);            callback();        }    }    ;    TestSuite.prototype.uiSourceCodesToString_ = function(uiSourceCodes)     {        var names = [];        for (var i = 0; i < uiSourceCodes.length; i++)            names.push('"' + WebInspector.networkMapping.networkURL(uiSourceCodes[i]) + '"');        return names.join(",");    }    ;    TestSuite.prototype.nonAnonymousUISourceCodes_ = function()     {        function filterOutAnonymous(uiSourceCode)         {            return !!WebInspector.networkMapping.networkURL(uiSourceCode);        }        function filterOutService(uiSourceCode)         {            return !uiSourceCode.project().isServiceProject();        }        var uiSourceCodes = WebInspector.workspace.uiSourceCodes();        uiSourceCodes = uiSourceCodes.filter(filterOutService);        return uiSourceCodes.filter(filterOutAnonymous);    }    ;    TestSuite.prototype.evaluateInConsole_ = function(code, callback)     {        function innerEvaluate()         {            WebInspector.context.removeFlavorChangeListener(WebInspector.ExecutionContext, showConsoleAndEvaluate, this);            var consoleView = WebInspector.ConsolePanel._view();            consoleView._prompt.setText(code);            consoleView._promptElement.dispatchEvent(TestSuite.createKeyEvent("Enter"));            this.addSniffer(WebInspector.ConsoleView.prototype, "_consoleMessageAddedForTest", function(viewMessage) {                callback(viewMessage.toMessageElement().deepTextContent());            }            .bind(this));        }        function showConsoleAndEvaluate()         {            WebInspector.console.showPromise().then(innerEvaluate.bind(this));        }        if (!WebInspector.context.flavor(WebInspector.ExecutionContext)) {            WebInspector.context.addFlavorChangeListener(WebInspector.ExecutionContext, showConsoleAndEvaluate, this);            return;        }        showConsoleAndEvaluate.call(this);    }    ;    TestSuite.prototype._scriptsAreParsed = function(expected)     {        var uiSourceCodes = this.nonAnonymousUISourceCodes_();        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;    }    ;    TestSuite.prototype._waitForScriptPause = function(callback)     {        this.addSniffer(WebInspector.DebuggerModel.prototype, "_pausedScript", callback);    }    ;    TestSuite.prototype._waitUntilScriptsAreParsed = function(expectedScripts, callback)     {        var test = this;        function waitForAllScripts() {            if (test._scriptsAreParsed(expectedScripts))                callback();            else                test.addSniffer(WebInspector.panels.sources.sourcesView(), "_addUISourceCode", waitForAllScripts);        }        waitForAllScripts();    }    ;    TestSuite.createKeyEvent = function(keyIdentifier)     {        var evt = document.createEvent("KeyboardEvent");        evt.initKeyboardEvent("keydown", true, true, null , keyIdentifier, "");        return evt;    }    ;    TestSuite.prototype.runTest = function(name)     {        var test = WebInspector.TestBase.prototype.runTest.bind(this, name);        if (TestSuite._populatedInterface)            test();        else            TestSuite._pendingTest = test;    }    ;    function runTests()     {        TestSuite._populatedInterface = true;        var test = TestSuite._pendingTest;        delete TestSuite._pendingTest;        if (test)            test();    }    WebInspector.notifications.addEventListener(WebInspector.NotificationService.Events.InspectorAgentEnabledForTests, runTests);    return new TestSuite();}if (window.uiTests)    window.uiTests.testSuiteReady(createTestSuite, WebInspector.TestBase);;WebInspector.OverlayController = function() {    WebInspector.moduleSetting("disablePausedStateOverlay").addChangeListener(this._updateOverlayMessage, this);    WebInspector.targetManager.addModelListener(WebInspector.DebuggerModel, WebInspector.DebuggerModel.Events.DebuggerPaused, this._updateOverlayMessage, this);    WebInspector.targetManager.addModelListener(WebInspector.DebuggerModel, WebInspector.DebuggerModel.Events.DebuggerResumed, this._updateOverlayMessage, this);    WebInspector.targetManager.addModelListener(WebInspector.DebuggerModel, WebInspector.DebuggerModel.Events.GlobalObjectCleared, this._updateOverlayMessage, this);}WebInspector.OverlayController.prototype = {    _updateOverlayMessage: function(event)     {        var debuggerModel = (event.target);        var message = debuggerModel.isPaused() && !WebInspector.moduleSetting("disablePausedStateOverlay").get() ? WebInspector.UIString("Paused in debugger") : undefined;        debuggerModel.target().pageAgent().setOverlayMessage(message);    }};WebInspector.Main = function() {    WebInspector.console.setUIDelegate(this);    WebInspector.Main._instanceForTest = this;    runOnWindowLoad(this._loaded.bind(this));}WebInspector.Main.prototype = {    showConsole: function()     {        return WebInspector.Revealer.revealPromise(WebInspector.console);    },    _loaded: function()     {        console.timeStamp("Main._loaded");        if (InspectorFrontendHost.isUnderTest())            self.runtime.useTestBase();        InspectorFrontendHost.getPreferences(this._gotPreferences.bind(this));    },    _gotPreferences: function(prefs)     {        console.timeStamp("Main._gotPreferences");        this._createSettings(prefs);        this._createAppUI();    },    _createSettings: function(prefs)     {        var settingsParam = Runtime.queryParam("settings");        if (settingsParam) {            try {                var settings = JSON.parse(window.decodeURI(settingsParam));                for (var key in settings)                    prefs[key] = settings[key];            } catch (e) {}        }        this._initializeExperiments(prefs);        function trackPrefsObject(changes)         {            if (!Object.keys(prefs).length) {                InspectorFrontendHost.clearPreferences();                return;            }            for (var change of changes) {                var name = change.name;                if (name in prefs)                    InspectorFrontendHost.setPreference(name, prefs[name]);                else                    InspectorFrontendHost.removePreference(name);            }        }        Object.observe(prefs, trackPrefsObject);        WebInspector.settings = new WebInspector.Settings(prefs);        if (!InspectorFrontendHost.isUnderTest())            new WebInspector.VersionController().updateVersion();    },    _initializeExperiments: function(prefs)     {        Runtime.experiments.register("accessibilityInspection", "Accessibility Inspection");        Runtime.experiments.register("animationInspection", "Animation Inspection");        Runtime.experiments.register("applyCustomStylesheet", "Allow custom UI themes");        Runtime.experiments.register("blackboxJSFramesOnTimeline", "Blackbox JavaScript frames on Timeline", true);        Runtime.experiments.register("timelineDetailsChart", "Costly functions view in Timeline details", true);        Runtime.experiments.register("customObjectFormatters", "Custom object formatters", true);        Runtime.experiments.register("emptySourceMapAutoStepping", "Empty sourcemap auto-stepping");        Runtime.experiments.register("fileSystemInspection", "FileSystem inspection");        Runtime.experiments.register("gpuTimeline", "GPU data on timeline", true);        Runtime.experiments.register("inputEventsOnTimelineOverview", "Input events on Timeline overview", true);        Runtime.experiments.register("layersPanel", "Layers panel");        Runtime.experiments.register("layoutEditor", "Layout editor", true);        Runtime.experiments.register("materialDesign", "Material design");        Runtime.experiments.register("networkRequestHeadersFilterInDetailsView", "Network request headers filter in details view", true);        Runtime.experiments.register("networkRequestsOnTimeline", "Network requests on Timeline", true);        Runtime.experiments.register("privateScriptInspection", "Private script inspection");        Runtime.experiments.register("promiseTracker", "Promise inspector");        Runtime.experiments.register("securityPanel", "Security panel", true);        Runtime.experiments.register("serviceWorkersInPageFrontend", "Service workers in DevTools for page");        Runtime.experiments.register("serviceWorkersInResources", "Service workers in Resources panel", true);        Runtime.experiments.register("showPrimaryLoadWaterfallInNetworkTimeline", "Show primary load waterfall in Network timeline", true);        Runtime.experiments.register("stepIntoAsync", "Step into async");        Runtime.experiments.register("timelineInvalidationTracking", "Timeline invalidation tracking", true);        Runtime.experiments.register("timelineTracingJSProfile", "Timeline tracing based JS profiler", true);        Runtime.experiments.register("timelineFlowEvents", "Timeline flow events", true);        Runtime.experiments.register("inlineVariableValues", "Display variable values inline while debugging");        Runtime.experiments.cleanUpStaleExperiments();        if (InspectorFrontendHost.isUnderTest()) {            var testPath = JSON.parse(prefs["testPath"] || "\"\"");            if (testPath.indexOf("debugger/promise") !== -1)                Runtime.experiments.enableForTest("promiseTracker");            if (testPath.indexOf("elements/") !== -1)                Runtime.experiments.enableForTest("animationInspection");            if (testPath.indexOf("layers/") !== -1)                Runtime.experiments.enableForTest("layersPanel");            if (testPath.indexOf("service-workers/") !== -1)                Runtime.experiments.enableForTest("serviceWorkersInResources");            if (testPath.indexOf("timeline/") !== -1 || testPath.indexOf("layers/") !== -1)                Runtime.experiments.enableForTest("layersPanel");        }        Runtime.experiments.setDefaultExperiments(["inlineVariableValues", "serviceWorkersInPageFrontend"]);    },    _createAppUI: function()     {        console.timeStamp("Main._createApp");        WebInspector.initializeUIUtils(window);        WebInspector.installComponentRootStyles((document.body));        this._addMainEventListeners(document);        var canDock = !!Runtime.queryParam("can_dock");        WebInspector.zoomManager = new WebInspector.ZoomManager(window,InspectorFrontendHost);        WebInspector.inspectorView = new WebInspector.InspectorView();        WebInspector.ContextMenu.initialize();        WebInspector.ContextMenu.installHandler(document);        WebInspector.dockController = new WebInspector.DockController(canDock);        WebInspector.overridesSupport = new WebInspector.OverridesSupport();        WebInspector.emulatedDevicesList = new WebInspector.EmulatedDevicesList();        WebInspector.multitargetConsoleModel = new WebInspector.MultitargetConsoleModel();        WebInspector.multitargetNetworkManager = new WebInspector.MultitargetNetworkManager();        WebInspector.shortcutsScreen = new WebInspector.ShortcutsScreen();        WebInspector.shortcutsScreen.section(WebInspector.UIString("Console"));        WebInspector.shortcutsScreen.section(WebInspector.UIString("Elements Panel"));        WebInspector.fileManager = new WebInspector.FileManager();        WebInspector.isolatedFileSystemManager = new WebInspector.IsolatedFileSystemManager();        WebInspector.workspace = new WebInspector.Workspace(WebInspector.isolatedFileSystemManager.mapping());        WebInspector.networkMapping = new WebInspector.NetworkMapping(WebInspector.workspace,WebInspector.isolatedFileSystemManager.mapping());        WebInspector.networkProjectManager = new WebInspector.NetworkProjectManager(WebInspector.targetManager,WebInspector.workspace,WebInspector.networkMapping);        WebInspector.presentationConsoleMessageHelper = new WebInspector.PresentationConsoleMessageHelper(WebInspector.workspace);        WebInspector.cssWorkspaceBinding = new WebInspector.CSSWorkspaceBinding(WebInspector.targetManager,WebInspector.workspace,WebInspector.networkMapping);        WebInspector.debuggerWorkspaceBinding = new WebInspector.DebuggerWorkspaceBinding(WebInspector.targetManager,WebInspector.workspace,WebInspector.networkMapping);        WebInspector.fileSystemWorkspaceBinding = new WebInspector.FileSystemWorkspaceBinding(WebInspector.isolatedFileSystemManager,WebInspector.workspace,WebInspector.networkMapping);        WebInspector.breakpointManager = new WebInspector.BreakpointManager(null ,WebInspector.workspace,WebInspector.networkMapping,WebInspector.targetManager,WebInspector.debuggerWorkspaceBinding);        WebInspector.extensionServer = new WebInspector.ExtensionServer();        new WebInspector.OverlayController();        new WebInspector.ContentScriptProjectDecorator();        new WebInspector.ExecutionContextSelector(WebInspector.targetManager,WebInspector.context);        var autoselectPanel = WebInspector.UIString("a panel chosen automatically");        var openAnchorLocationSetting = WebInspector.settings.createSetting("openLinkHandler", autoselectPanel);        WebInspector.openAnchorLocationRegistry = new WebInspector.HandlerRegistry(openAnchorLocationSetting);        WebInspector.openAnchorLocationRegistry.registerHandler(autoselectPanel, function() {            return false;        }        );        WebInspector.Linkifier.setLinkHandler(new WebInspector.HandlerRegistry.LinkHandler());        new WebInspector.WorkspaceController(WebInspector.workspace);        new WebInspector.RenderingOptions();        new WebInspector.Main.PauseListener();        new WebInspector.Main.InspectedNodeRevealer();        new WebInspector.ThrottlingIndicator();        WebInspector.domBreakpointsSidebarPane = new WebInspector.DOMBreakpointsSidebarPane();        WebInspector.actionRegistry = new WebInspector.ActionRegistry();        WebInspector.shortcutRegistry = new WebInspector.ShortcutRegistry(WebInspector.actionRegistry,document);        WebInspector.ShortcutsScreen.registerShortcuts();        this._registerForwardedShortcuts();        this._registerMessageSinkListener();        var appExtension = self.runtime.extensions(WebInspector.AppProvider)[0];        appExtension.instancePromise().then(this._showAppUI.bind(this));    },    _showAppUI: function(appProvider)     {        var app = (appProvider).createApp();        WebInspector.dockController.initialize();        console.timeStamp("Main._presentUI");        app.presentUI(document);        if (!Runtime.queryParam("isSharedWorker"))            WebInspector.inspectElementModeController = new WebInspector.InspectElementModeController();        WebInspector.inspectorView.createToolbars();        InspectorFrontendHost.loadCompleted();        var extensions = self.runtime.extensions(WebInspector.QueryParamHandler);        for (var extension of extensions) {            var value = Runtime.queryParam(extension.descriptor()["name"]);            if (value !== null )                extension.instancePromise().then(handleQueryParam.bind(null , value));        }        setTimeout(this._createConnection.bind(this), 0);        function handleQueryParam(value, handler)         {            handler.handleQueryParam(value);        }    },    _createConnection: function()     {        console.timeStamp("Main._createConnection");        InspectorBackend.loadFromJSONIfNeeded("../protocol.json");        if (Runtime.queryParam("ws")) {            var ws = "ws://" + Runtime.queryParam("ws");            InspectorBackendClass.WebSocketConnection.Create(ws, this._connectionEstablished.bind(this));            return;        }        if (!InspectorFrontendHost.isHostedMode()) {            this._connectionEstablished(new InspectorBackendClass.MainConnection());            return;        }        this._connectionEstablished(new InspectorBackendClass.StubConnection());    },    _connectionEstablished: function(connection)     {        console.timeStamp("Main._connectionEstablished");        connection.addEventListener(InspectorBackendClass.Connection.Events.Disconnected, onDisconnected);        function onDisconnected(event)         {            if (WebInspector._disconnectedScreenWithReasonWasShown)                return;            new WebInspector.RemoteDebuggingTerminatedScreen(event.data.reason).showModal();        }        InspectorBackend.setConnection(connection);        var targetType = Runtime.queryParam("isSharedWorker") ? WebInspector.Target.Type.ServiceWorker : WebInspector.Target.Type.Page;        WebInspector.targetManager.createTarget(WebInspector.UIString("Main"), targetType, connection, null , this._mainTargetCreated.bind(this));    },    _mainTargetCreated: function(target)     {        console.timeStamp("Main._mainTargetCreated");        this._mainTarget = (target);        this._registerShortcuts();        this._mainTarget.registerInspectorDispatcher(this);        if (this._mainTarget.isServiceWorker())            this._mainTarget.runtimeAgent().run();        WebInspector.overridesSupport.init(this._mainTarget, overridesReady);        function overridesReady()         {            if (!WebInspector.dockController.canDock() && WebInspector.overridesSupport.emulationEnabled())                WebInspector.inspectorView.showViewInDrawer("emulation", true);            target.inspectorAgent().enable(inspectorAgentEnableCallback);        }        function inspectorAgentEnableCallback()         {            console.timeStamp("Main.inspectorAgentEnableCallback");            WebInspector.notifications.dispatchEventToListeners(WebInspector.NotificationService.Events.InspectorAgentEnabledForTests);            setTimeout(function() {                WebInspector.extensionServer.initializeExtensions();            }            , 0);        }    },    _registerForwardedShortcuts: function()     {        var forwardedActions = ["main.reload", "main.hard-reload", "main.toggle-dock"];        var actionKeys = WebInspector.shortcutRegistry.keysForActions(forwardedActions).map(WebInspector.KeyboardShortcut.keyCodeAndModifiersFromKey);        actionKeys.push({            keyCode: WebInspector.KeyboardShortcut.Keys.F8.code        });        InspectorFrontendHost.setWhitelistedShortcuts(JSON.stringify(actionKeys));    },    _registerMessageSinkListener: function()     {        WebInspector.console.addEventListener(WebInspector.Console.Events.MessageAdded, messageAdded);        function messageAdded(event)         {            var message = (event.data);            if (message.show)                WebInspector.console.show();        }    },    _documentClick: function(event)     {        var target = event.target;        if (target.shadowRoot)            target = event.deepElementFromPoint();        if (!target)            return;        var anchor = target.enclosingNodeOrSelfWithNodeName("a");        if (!anchor || !anchor.href)            return;        event.consume(true);        if (anchor.preventFollow)            return;        function followLink()         {            if (WebInspector.isBeingEdited(target))                return;            if (WebInspector.openAnchorLocationRegistry.dispatch({                url: anchor.href,                lineNumber: anchor.lineNumber            }))                return;            var uiSourceCode = WebInspector.networkMapping.uiSourceCodeForURLForAnyTarget(anchor.href);            if (uiSourceCode) {                WebInspector.Revealer.reveal(uiSourceCode.uiLocation(anchor.lineNumber || 0, anchor.columnNumber || 0));                return;            }            var resource = WebInspector.resourceForURL(anchor.href);            if (resource) {                WebInspector.Revealer.reveal(resource);                return;            }            var request = WebInspector.NetworkLog.requestForURL(anchor.href);            if (request) {                WebInspector.Revealer.reveal(request);                return;            }            InspectorFrontendHost.openInNewTab(anchor.href);        }        if (WebInspector.followLinkTimeout)            clearTimeout(WebInspector.followLinkTimeout);        if (anchor.preventFollowOnDoubleClick) {            if (event.detail === 1)                WebInspector.followLinkTimeout = setTimeout(followLink, 333);            return;        }        if (!anchor.classList.contains("webkit-html-external-link"))            followLink();        else            InspectorFrontendHost.openInNewTab(anchor.href);    },    _registerShortcuts: function()     {        var shortcut = WebInspector.KeyboardShortcut;        var section = WebInspector.shortcutsScreen.section(WebInspector.UIString("All Panels"));        var keys = [shortcut.makeDescriptor("[", shortcut.Modifiers.CtrlOrMeta), shortcut.makeDescriptor("]", shortcut.Modifiers.CtrlOrMeta)];        section.addRelatedKeys(keys, WebInspector.UIString("Go to the panel to the left/right"));        keys = [shortcut.makeDescriptor("[", shortcut.Modifiers.CtrlOrMeta | shortcut.Modifiers.Alt), shortcut.makeDescriptor("]", shortcut.Modifiers.CtrlOrMeta | shortcut.Modifiers.Alt)];        section.addRelatedKeys(keys, WebInspector.UIString("Go back/forward in panel history"));        var toggleConsoleLabel = WebInspector.UIString("Show console");        section.addKey(shortcut.makeDescriptor(shortcut.Keys.Tilde, shortcut.Modifiers.Ctrl), toggleConsoleLabel);        section.addKey(shortcut.makeDescriptor(shortcut.Keys.Esc), WebInspector.UIString("Toggle drawer"));        if (WebInspector.dockController.canDock()) {            section.addKey(shortcut.makeDescriptor("M", shortcut.Modifiers.CtrlOrMeta | shortcut.Modifiers.Shift), WebInspector.UIString("Toggle device mode"));            section.addKey(shortcut.makeDescriptor("D", shortcut.Modifiers.CtrlOrMeta | shortcut.Modifiers.Shift), WebInspector.UIString("Toggle dock side"));        }        section.addKey(shortcut.makeDescriptor("f", shortcut.Modifiers.CtrlOrMeta), WebInspector.UIString("Search"));        var advancedSearchShortcutModifier = WebInspector.isMac() ? WebInspector.KeyboardShortcut.Modifiers.Meta | WebInspector.KeyboardShortcut.Modifiers.Alt : WebInspector.KeyboardShortcut.Modifiers.Ctrl | WebInspector.KeyboardShortcut.Modifiers.Shift;        var advancedSearchShortcut = shortcut.makeDescriptor("f", advancedSearchShortcutModifier);        section.addKey(advancedSearchShortcut, WebInspector.UIString("Search across all sources"));        var inspectElementModeShortcut = WebInspector.InspectElementModeController.createShortcut();        section.addKey(inspectElementModeShortcut, WebInspector.UIString("Select node to inspect"));        var openResourceShortcut = WebInspector.KeyboardShortcut.makeDescriptor("p", WebInspector.KeyboardShortcut.Modifiers.CtrlOrMeta);        section.addKey(openResourceShortcut, WebInspector.UIString("Go to source"));        if (WebInspector.isMac()) {            keys = [shortcut.makeDescriptor("g", shortcut.Modifiers.Meta), shortcut.makeDescriptor("g", shortcut.Modifiers.Meta | shortcut.Modifiers.Shift)];            section.addRelatedKeys(keys, WebInspector.UIString("Find next/previous"));        }    },    _postDocumentKeyDown: function(event)     {        if (event.handled)            return;        var target = event.deepActiveElement();        if (target) {            var anchor = target.enclosingNodeOrSelfWithNodeName("a");            if (anchor && anchor.preventFollow)                event.preventDefault();        }        if (!WebInspector.Dialog.currentInstance() && WebInspector.inspectorView.currentPanel()) {            WebInspector.inspectorView.currentPanel().handleShortcut(event);            if (event.handled) {                event.consume(true);                return;            }        }        WebInspector.shortcutRegistry.handleShortcut(event);    },    _documentCanCopy: function(event)     {        var panel = WebInspector.inspectorView.currentPanel();        if (panel && panel["handleCopyEvent"])            event.preventDefault();    },    _documentCopy: function(event)     {        var panel = WebInspector.inspectorView.currentPanel();        if (panel && panel["handleCopyEvent"])            panel["handleCopyEvent"](event);    },    _documentCut: function(event)     {        var panel = WebInspector.inspectorView.currentPanel();        if (panel && panel["handleCutEvent"])            panel["handleCutEvent"](event);    },    _documentPaste: function(event)     {        var panel = WebInspector.inspectorView.currentPanel();        if (panel && panel["handlePasteEvent"])            panel["handlePasteEvent"](event);    },    _contextMenuEventFired: function(event)     {        if (event.handled || event.target.classList.contains("popup-glasspane"))            event.preventDefault();    },    _addMainEventListeners: function(document)     {        document.addEventListener("keydown", this._postDocumentKeyDown.bind(this), false);        document.addEventListener("beforecopy", this._documentCanCopy.bind(this), true);        document.addEventListener("copy", this._documentCopy.bind(this), false);        document.addEventListener("cut", this._documentCut.bind(this), false);        document.addEventListener("paste", this._documentPaste.bind(this), false);        document.addEventListener("contextmenu", this._contextMenuEventFired.bind(this), true);        document.addEventListener("click", this._documentClick.bind(this), false);    },    inspect: function(payload, hints)     {        var object = this._mainTarget.runtimeModel.createRemoteObject(payload);        if (object.isNode()) {            WebInspector.Revealer.revealPromise(object).then(object.release.bind(object));            return;        }        if (object.type === "function") {            object.functionDetails(didGetDetails);            return;        }        function didGetDetails(response)         {            object.release();            if (!response || !response.location)                return;            WebInspector.Revealer.reveal(WebInspector.debuggerWorkspaceBinding.rawLocationToUILocation(response.location));        }        if (hints.copyToClipboard)            InspectorFrontendHost.copyText(object.value);        object.release();    },    detached: function(reason)     {        WebInspector._disconnectedScreenWithReasonWasShown = true;        new WebInspector.RemoteDebuggingTerminatedScreen(reason).showModal();    },    targetCrashed: function()     {        var debuggerModel = WebInspector.DebuggerModel.fromTarget(this._mainTarget);        if (!debuggerModel)            return;        (new WebInspector.HelpScreenUntilReload(debuggerModel,WebInspector.UIString("Inspected target disconnected"),WebInspector.UIString("Inspected target disconnected. Once it reloads we will attach to it automatically."))).showModal();    },    evaluateForTestInFrontend: function(callId, script)     {        WebInspector.evaluateForTestInFrontend(callId, script);    }}WebInspector.reload = function() {    if (WebInspector.dockController.canDock() && WebInspector.dockController.dockSide() === WebInspector.DockController.State.Undocked)        InspectorFrontendHost.setIsDocked(true, function() {}        );    window.location.reload();}WebInspector.Main.ReloadActionDelegate = function() {}WebInspector.Main.ReloadActionDelegate.prototype = {    handleAction: function(context, actionId)     {        switch (actionId) {        case "main.reload":            WebInspector.Main._reloadPage(false);            break;        case "main.hard-reload":            WebInspector.Main._reloadPage(true);            break;        case "main.debug-reload":            WebInspector.reload();            break;        }    }}WebInspector.Main.ZoomActionDelegate = function() {}WebInspector.Main.ZoomActionDelegate.prototype = {    handleAction: function(context, actionId)     {        if (InspectorFrontendHost.isHostedMode())            return;        switch (actionId) {        case "main.zoom-in":            InspectorFrontendHost.zoomIn();            break;        case "main.zoom-out":            InspectorFrontendHost.zoomOut();            break;        case "main.zoom-reset":            InspectorFrontendHost.resetZoom();            break;        }    }}WebInspector.Main._reloadPage = function(hard) {    if (!WebInspector.targetManager.hasTargets())        return;    if (WebInspector.targetManager.mainTarget().isServiceWorker())        return;    WebInspector.targetManager.reloadPage(hard);}WebInspector.Main._addWebSocketTarget = function(ws) {    function callback(connection)     {        WebInspector.targetManager.createTarget(ws, WebInspector.Target.Type.Page, connection, null );    }    new InspectorBackendClass.WebSocketConnection(ws,callback);}WebInspector.Main.WarningErrorCounter = function() {    this._counter = new WebInspector.ToolbarCounter(["error-icon", "revokedError-icon", "warning-icon"]);    WebInspector.Main.WarningErrorCounter._instanceForTest = this._counter;    this._counter.addEventListener("click", showConsole);    function showConsole()     {        WebInspector.console.show();    }    WebInspector.multitargetConsoleModel.addEventListener(WebInspector.ConsoleModel.Events.ConsoleCleared, this._updateErrorAndWarningCounts, this);    WebInspector.multitargetConsoleModel.addEventListener(WebInspector.ConsoleModel.Events.MessageAdded, this._updateErrorAndWarningCounts, this);}WebInspector.Main.WarningErrorCounter.prototype = {    _updateErrorAndWarningCounts: function()     {        var errors = 0;        var revokedErrors = 0;        var warnings = 0;        var targets = WebInspector.targetManager.targets();        for (var i = 0; i < targets.length; ++i) {            errors += targets[i].consoleModel.errors();            revokedErrors += targets[i].consoleModel.revokedErrors();            warnings += targets[i].consoleModel.warnings();        }        this._counter.setCounter("error-icon", errors, WebInspector.UIString(errors === 1 ? "%d error" : "%d errors", errors));        this._counter.setCounter("revokedError-icon", revokedErrors, WebInspector.UIString(revokedErrors === 1 ? "%d handled promise rejection" : "%d handled promise rejections", revokedErrors));        this._counter.setCounter("warning-icon", warnings, WebInspector.UIString(warnings === 1 ? "%d warning" : "%d warnings", warnings));        WebInspector.inspectorView.toolbarItemResized();    },    item: function()     {        return this._counter;    }}WebInspector.ThrottlingIndicator = function() {    var networkConditionsSetting = WebInspector.moduleSetting("networkConditions");    networkConditionsSetting.addChangeListener(updateVisibility);    updateVisibility();    function updateVisibility()     {        var throttlingEnabled = WebInspector.NetworkManager.IsThrottlingEnabled(networkConditionsSetting.get());        WebInspector.inspectorView.setPanelIcon("network", throttlingEnabled ? "warning-icon" : "", WebInspector.UIString("Network throttling is enabled"));    }}WebInspector.Main.PauseListener = function() {    WebInspector.targetManager.addModelListener(WebInspector.DebuggerModel, WebInspector.DebuggerModel.Events.DebuggerPaused, this._debuggerPaused, this);}WebInspector.Main.PauseListener.prototype = {    _debuggerPaused: function(event)     {        WebInspector.targetManager.removeModelListener(WebInspector.DebuggerModel, WebInspector.DebuggerModel.Events.DebuggerPaused, this._debuggerPaused, this);        var debuggerPausedDetails = (event.data);        var debuggerModel = (event.target);        WebInspector.context.setFlavor(WebInspector.Target, debuggerModel.target());        WebInspector.Revealer.reveal(debuggerPausedDetails);    }}WebInspector.Main.InspectedNodeRevealer = function() {    WebInspector.targetManager.addModelListener(WebInspector.DOMModel, WebInspector.DOMModel.Events.NodeInspected, this._inspectNode, this);}WebInspector.Main.InspectedNodeRevealer.prototype = {    _inspectNode: function(event)     {        var deferredNode = (event.data);        WebInspector.Revealer.reveal(deferredNode);    }}WebInspector.RemoteDebuggingTerminatedScreen = function(reason) {    WebInspector.HelpScreen.call(this, WebInspector.UIString("Detached from the target"));    var p = this.helpContentElement.createChild("p");    p.classList.add("help-section");    p.createChild("span").textContent = WebInspector.UIString("Remote debugging has been terminated with reason: ");    p.createChild("span", "error-message").textContent = reason;    p.createChild("br");    p.createChild("span").textContent = WebInspector.UIString("Please re-attach to the new target.");}WebInspector.RemoteDebuggingTerminatedScreen.prototype = {    __proto__: WebInspector.HelpScreen.prototype}WebInspector.WorkerTerminatedScreen = function() {    WebInspector.HelpScreen.call(this, WebInspector.UIString("Inspected worker terminated"));    var p = this.helpContentElement.createChild("p");    p.classList.add("help-section");    p.textContent = WebInspector.UIString("Inspected worker has terminated. Once it restarts we will attach to it automatically.");}WebInspector.WorkerTerminatedScreen.prototype = {    __proto__: WebInspector.HelpScreen.prototype}new WebInspector.Main();;applicationDescriptor = [{    "name": "ui_lazy"}, {    "name": "promises"}, {    "name": "accessibility"}, {    "name": "sources"}, {    "type": "remote",    "name": "emulated_devices"}, {    "name": "audits"}, {    "type": "autostart",    "name": "bindings"}, {    "name": "snippets"}, {    "name": "layers"}, {    "name": "console"}, {    "name": "network"}, {    "name": "components_lazy"}, {    "type": "remote",    "name": "cm_modes"}, {    "type": "autostart",    "name": "platform"}, {    "name": "animation"}, {    "name": "source_frame"}, {    "type": "autostart",    "name": "main"}, {    "name": "resources"}, {    "type": "worker",    "name": "script_formatter_worker"}, {    "name": "elements"}, {    "type": "autostart",    "name": "workspace"}, {    "name": "timeline"}, {    "type": "autostart",    "name": "host"}, {    "type": "autostart",    "name": "emulation"}, {    "type": "autostart",    "name": "ui"}, {    "type": "autostart",    "name": "sdk"}, {    "type": "worker",    "name": "temp_storage_shared_worker"}, {    "name": "settings"}, {    "type": "worker",    "name": "heap_snapshot_worker"}, {    "name": "profiler"}, {    "type": "remote",    "name": "screencast",    "condition": "remoteFrontend"}, {    "type": "autostart",    "name": "extensions"}, {    "type": "autostart",    "name": "common"}, {    "type": "autostart",    "name": "components"}, {    "name": "security"}];Runtime.cachedResources["ui/checkboxTextLabel.css"] = "/*\n * Copyright (c) 2014 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    padding: 0;\n    margin: 0;\n    display: inline-flex;\n    flex-shrink: 0;\n    align-items: center !important;\n}\n\ninput {\n    height: 12px;\n    width: 12px;\n    flex-shrink: 0;\n}\n\ninput.dt-checkbox-themed {\n    -webkit-appearance: none;\n    margin: 0 5px auto 2px;\n    border: 1px solid rgb(45, 45, 45);\n    border-radius: 3px;\n    background-color: rgb(102, 102, 102);\n    position: relative;\n    top: 1px;\n}\n\ninput.dt-checkbox-themed:after {\n    content: '';\n    line-height: 10px;\n    position: absolute;\n    cursor: pointer;\n    width: 12px;\n    height: 12px;\n    background: none;\n}\n\ninput.dt-checkbox-themed:checked:after {\n    background-color: #333;\n}\n\ninput.dt-checkbox-themed:after {\n    -webkit-mask-image: url(Images/toolbarButtonGlyphs.png);\n    -webkit-mask-size: 352px 144px;\n    -webkit-mask-position: -128px -110px;\n}\n\n@media (-webkit-min-device-pixel-ratio: 1.5) {\ninput.dt-checkbox-themed:after {\n    -webkit-mask-image: url(Images/toolbarButtonGlyphs_2x.png);\n}\n\n} /* media */\n\n/*# sourceURL=ui/checkboxTextLabel.css */";Runtime.cachedResources["ui/closeButton.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\ndiv {\n    background-image: url(Images/toolbarButtonGlyphs.png);\n    background-size: 352px 144px;\n}\n\n@media (-webkit-min-device-pixel-ratio: 1.5) {\ndiv {\n    background-image: url(Images/toolbarButtonGlyphs_2x.png);\n}\n} /* media */\n\n.close-button {\n    width: 14px;\n    height: 14px;\n    background-position: -128px -96px;\n    cursor: default;\n}\n\n.close-button:hover {\n    background-position: -96px -96px;\n}\n\n.close-button:active {\n    background-position: -111px -96px;\n}\n\n.close-button-gray {\n    width: 13px;\n    height: 13px;\n    background-position: -175px -96px;\n}\n\n.close-button-gray:hover {\n    background-position: -143px -96px;\n}\n\n.close-button-gray:active {\n    background-position: -160px -96px;\n}\n\n/*# sourceURL=ui/closeButton.css */";Runtime.cachedResources["ui/colorSwatch.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  white-space: nowrap;\n}\n\n.color-swatch {\n    position: relative;\n    margin-left: 1px;\n    margin-right: 2px;\n    width: 10px;\n    height: 10px;\n    top: 1px;\n    display: inline-block;\n    -webkit-user-select: none;\n    background-image: url(Images/checker.png);\n    line-height: 10px;\n}\n\n.color-swatch-inner {\n    width: 100%;\n    height: 100%;\n    display: inline-block;\n    border: 1px solid rgba(128, 128, 128, 0.6);\n}\n\n.color-swatch-inner:hover {\n    border: 1px solid rgba(64, 64, 64, 0.8);\n}\n\n\n/*# sourceURL=ui/colorSwatch.css */";Runtime.cachedResources["ui/dropTarget.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    position: absolute;\n    top: 0;\n    bottom: 0;\n    left: 0;\n    right: 0;\n    display: flex;\n    background-color: rgba(255,255,255,0.8);\n    z-index: 1000;\n}\n\n.drop-target-message {\n    flex: auto;\n    font-size: 30px;\n    color: #999;\n    display: flex;\n    justify-content: center;\n    align-items: center;\n    margin: 20px;\n    border: 4px dashed #ddd;\n    pointer-events: none;\n}\n\n/*# sourceURL=ui/dropTarget.css */";Runtime.cachedResources["ui/emptyWidget.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.empty-view {\n    font-size: 24px;\n    color: rgb(75%, 75%, 75%);\n    font-weight: bold;\n    padding: 10px;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n}\n\n/*# sourceURL=ui/emptyWidget.css */";Runtime.cachedResources["ui/filter.css"] = "/*\n * Copyright (C) 2013 Google Inc. All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n *     * Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above\n * copyright notice, this list of conditions and the following disclaimer\n * in the documentation and/or other materials provided with the\n * distribution.\n *     * Neither the name of Google Inc. nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n.filter-bar {\n    background-color: #f3f3f3;\n    padding: 4px 0 2px 0;\n    flex: none;\n    border-bottom: 1px solid #dadada;\n}\n\n.filter-text-filter {\n    display: inline-flex;\n    margin-left: 1px;\n    margin-right: 2px;\n    min-width: 40px;\n    max-width: 200px;\n    height: 24px;\n    align-items: center;\n}\n\n.filter-text-filter label {\n    margin: auto 0;\n}\n\n.filter-bitset-filter {\n    padding: 2px;\n    display: inline-flex;\n    overflow: hidden;\n    height: 24px;\n    position: relative;\n    top: -1px;\n}\n\n.filter-bitset-filter li {\n    display: inline-block;\n    flex: none;\n    margin: auto 2px;\n    padding: 3px 6px 3px 3px;\n    background: transparent;\n    text-shadow: rgba(255, 255, 255, 0.5) 0 1px 0;\n    border-radius: 8px;\n    overflow: hidden;\n}\n\n.filter-bitset-filter-divider {\n    background-color: #ccc;\n    height: 16px;\n    width: 1px;\n    margin: auto 2px;\n    display: inline-block;\n}\n\n.filter-bitset-filter li.selected,\n.filter-bitset-filter li:hover,\n.filter-bitset-filter li:active {\n    color: white;\n    text-shadow: rgba(0, 0, 0, 0.4) 0 1px 0;\n}\n\n.filter-bitset-filter li:hover {\n    background: rgba(0, 0, 0, 0.2);\n}\n\n.filter-bitset-filter li.selected {\n    background: rgba(0, 0, 0, 0.3);\n}\n\n.filter-bitset-filter li:active {\n    background: rgba(0, 0, 0, 0.5);\n}\n\n.filter-combobox-filter {\n    margin-left: 5px;\n    margin-right: 2px;\n    flex: 0 0 auto;\n    display: inline-block;\n}\n\n.filter-checkbox-filter {\n    padding-left: 4px;\n    padding-right: 2px;\n    white-space: nowrap;\n    text-overflow: ellipsis;\n    overflow: hidden;\n    display: inline-flex;\n    vertical-align: middle;\n    height: 24px;\n    position: relative;\n    top: -2px;\n}\n\n.filter-checkbox-filter > label {\n    display: flex;\n    margin: auto 0;\n}\n\n.filter-text-invalid {\n    background-color: rgb(255, 200, 200);\n}\n\n.filter-checkbox-filter .checkbox-filter-checkbox {\n    width: 10px;\n    height: 10px;\n    margin: auto 3px;\n    padding: 0;\n    border-radius: 2px;\n    border: solid 1px;\n    display: inline-block;\n    overflow: visible;\n    opacity: 0.8;\n    flex-shrink: 0;\n}\n\n.filter-input-field {\n    -webkit-appearance: none;\n    border: 1px solid rgb(163, 163, 163);\n    border-radius: 2px;\n    padding: 1px 3px 0;\n    margin: 0 0 0 1px;\n    width: 253px;\n    height: 20px;\n    line-height: 17px;\n    flex: 1;\n}\n\n/*# sourceURL=ui/filter.css */";Runtime.cachedResources["ui/helpScreen.css"] = ".help-window-outer {\n    position: absolute !important;\n    top: 0;\n    left: 0;\n    right: 0;\n    bottom: 0;\n    z-index: 2000;\n}\n\n.help-window-main {\n    color: white;\n    background-color: rgba(17, 17, 17, 0.85);\n    display: -webkit-flex;\n    -webkit-flex-direction: column;\n    border-top-width: 0;\n    border-radius: 10px;\n}\n\n.help-window-caption {\n    border-bottom: solid 1px rgb(153, 153, 153);\n    margin: 0 8px;\n    padding: 0 2px;\n    line-height: 28px;\n}\n\n.help-window-title {\n    font-size: 16px;\n    margin: 0;\n    padding-top: 1px;\n    margin-bottom: -1px;\n}\n\n.help-content {\n    overflow-y: auto;\n    overflow-x: hidden;\n    margin: 8px;\n    padding: 0 4px;\n    flex: auto;\n}\n\n.help-footnote {\n    border-top: 1px solid #EEEEEE;\n    margin: 0;\n    padding: 12px;\n}\n\n.help-window-main .help-container-wrapper::-webkit-scrollbar {\n    width: 11px;\n}\n\n.help-window-main .help-container-wrapper::-webkit-scrollbar-corner,\n.help-window-main .help-container-wrapper::-webkit-resizer {\n    display: none;\n}\n\n.help-window-main .help-container-wrapper::-webkit-scrollbar-thumb:vertical {\n    background: linear-gradient(to right, rgb(128, 128, 128), rgb(96, 96, 96) 40%, rgb(128, 128, 128));\n    border-radius: 5px;\n    min-height: 20px;\n}\n\n.help-window-main .help-container-wrapper::-webkit-scrollbar-thumb:vertical:hover,\n.help-window-main .help-container-wrapper::-webkit-scrollbar-thumb:vertical:active {\n    background: linear-gradient(to right, rgb(176, 176, 176), rgb(144, 144, 144) 40%, rgb(176, 176, 176));\n}\n\n.help-window-main .help-container-wrapper::-webkit-scrollbar-track:vertical {\n    background: linear-gradient(to right, rgb(10, 10, 10), rgb(32, 32, 32) 25%, rgb(32, 32, 32));\n    border-radius: 5px;\n}\n\n.help-close-button {\n    position: absolute;\n    top: 8px;\n    right: 8px;\n    z-index: 10;\n}\n\nbody.dock-to-bottom .help-content {\n    margin-bottom: 8px;\n}\n\n.help-container {\n    width: 100%;\n    -webkit-user-select: auto;\n    -webkit-column-width: 470px;\n}\n\n.help-no-columns {\n    -webkit-column-width: initial !important;\n}\n\n.help-block {\n    display: block;\n    padding-bottom: 9px;\n    width: 470px;\n    -webkit-column-break-inside: avoid;\n}\n\n.settings-tab.help-container {\n    -webkit-column-width: 410px;\n}\n\n.settings-tab .help-block {\n    width: 410px;\n    margin-left: 20px;\n}\n\n.settings-tab .field-error-message {\n    color: DarkRed;\n    height: 0; /* Avoid changing element height when content is set. */\n}\n\n.help-line {\n    padding-bottom: 5px;\n    margin-bottom: 5px;\n}\n\n.help-key-cell {\n    display: inline-block;\n    width: 270px;\n    text-align: right;\n}\n\n.help-cell {\n    display: inline-block;\n    width: 200px;\n    vertical-align: middle;\n}\n\n.help-section-title {\n    font-size: 120%;\n}\n\n.help-key {\n    padding: 0.1em 0.6em;\n    border: 1px solid #ccc;\n    font-size: 11px;\n    background-color: #f7f7f7;\n    color: #333;\n    box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2), 0 0 0 2px #ffffff inset;\n    border-radius: 3px;\n    display: inline-block;\n    margin: 0 0.1em;\n    text-shadow: 0 1px 0 #fff;\n    line-height: 1.5;\n    white-space: nowrap;\n    font-family: Lucida Grande, sans-serif;\n}\n\n.help-combine-keys,\n.help-key-delimiter {\n    font-size: 9px;\n}\n\n.help-combine-keys {\n    margin: 0 0.3em;\n}\n\n.help-key-delimiter {\n    margin: 0 0.5em;\n}\n\n.help-window-outer fieldset {\n    margin: 0;\n    padding: 0;\n    border: none;\n}\n\n.settings-tab label {\n    padding-right: 4px;\n    display: inline-flex;\n}\n\n#general-tab-content .help-block fieldset legend {\n    font-size: 14px;\n}\n\n.help-block p p {\n    padding-left: 30px;\n}\n\n.help-content p.help-section {\n    margin: 0 0 15px 0;\n}\n\n.settings-experiments-warning-subsection-warning {\n    color: rgb(200, 0, 0);\n}\n\n.settings-experiments-warning-subsection-message {\n    color: inherit;\n}\n\n.help-content input[type=checkbox] {\n    margin: 1px 7px 1px 2px;\n}\n\n.help-content option {\n    background-color: #EEEEEE;\n    color: #222;\n}\n\n#settings-screen .help-window-main{\n    color: rgb(48, 57, 66);\n    background-color: white;\n    border-radius: 0;\n}\n\n#settings-screen .help-window-main {\n    position: absolute;\n    top: 10px;\n    right: 10px;\n    bottom: 10px;\n    left: 10px;\n    height: initial;\n    padding: 11px 0 0 0;\n    box-shadow: 1px 1px 5px 2px rgba(128, 128, 128, 0.7);\n}\n\n#settings-screen .help-window-label {\n    font-size: 18px;\n    color: inherit;\n    padding: 1px 0 15px 17px;\n}\n\n.help-container-wrapper {\n    position: absolute;\n    top: 40px;\n    left: 15px;\n    right: 0;\n    bottom: 0;\n    overflow: auto;\n}\n\n.settings-tab.help-content {\n    margin: 0;\n    padding: 0;\n}\n\n.settings-tab input:not([type]),\n.settings-tab input[type=\"text\"] {\n    border: 1px solid rgb(213, 213, 213);\n    border-radius: 2px;\n    color: #444444;\n    padding: 3px;\n}\n\n.settings-tab input.numeric {\n    text-align: right;\n}\n\n.settings-tab-container {\n    flex: auto;\n    overflow: hidden;\n}\n\n.settings-tab-container header {\n    padding: 0 0 6px;\n    border-bottom: 1px solid #EEEEEE;\n}\n\n#tab-shortcuts {\n    margin-top: 25px !important;\n}\n\n#experiments-tab-content .help-container {\n    -webkit-column-width: 470px;\n}\n\n#experiments-tab-content .help-block {\n    width: 470px;\n}\n\n.settings-tab-container header > h3 {\n    font-size: 18px;\n    font-weight: normal;\n    margin: 0;\n    padding-bottom: 3px;\n}\n\n.settings-tab .help-section-title {\n    margin-left: -20px;\n    color: #222;\n}\n\n.settings-tab .help-block fieldset:disabled label:hover {\n    color: inherit;\n}\n\n.settings-tab .help-block label:hover {\n    color: #222;\n}\n\n.settings-tab p {\n    margin: 12px 0;\n}\n\n.settings-tab select {\n    margin-left: 10px;\n}\n\n#workspace-tab-content .settings-tab.help-content.help-container {\n    -webkit-column-width: initial;\n}\n\n\n#workspace-tab-content .button:hover {\n    opacity: 1.0 !important;\n}\n\n.settings-tab .settings-list-container {\n    background-color: white;\n    margin-bottom: 10px;\n}\n\n.settings-tab .settings-list {\n    border: 1px solid hsl(0, 0%, 85%);\n    border-radius: 2px;\n}\n\n.settings-tab .settings-list .settings-list-item .settings-list-item-contents {\n    width: 100%;\n    height: 40px;\n    -webkit-box-align: center;\n    -webkit-transition: 150ms background-color;\n    display: -webkit-box;\n    padding-right: 3px;\n}\n\n.settings-tab .settings-list .settings-list-item .settings-list-item-contents > :first-child {\n    -webkit-box-align: center;\n    -webkit-box-flex: 1;\n    -webkit-padding-end: 5px;\n    display: -webkit-box;\n}\n\n.settings-tab .settings-list .settings-list-item.selected:not(.editable) {\n    background-color: hsl(0, 0%, 82%);\n}\n\n.settings-tab .settings-list .settings-list-item:hover {\n    background-color: hsl(215, 54%, 93%);\n}\n\n.settings-tab .settings-list .settings-list-item.selected:not(.editable):hover {\n    background-color: hsl(215, 51%, 82%);\n}\n\n.settings-tab .settings-list .settings-list-item .remove-item-button {\n    -webkit-transition: 150ms opacity;\n    background-color: hsla(0, 0%, 0%, 0);\n    background-image: -webkit-image-set(\n        url(Images/settingsListRemove.png) 1x,\n        url(Images/settingsListRemove_2x.png) 2x);\n    background-size: 48px 16px;\n    border: none;\n    display: block;\n    height: 16px;\n    width: 16px;\n    opacity: 0;\n    pointer-events: none;\n}\n\n.settings-tab .settings-list .settings-list-item.selected .remove-item-button,\n.settings-tab .settings-list .settings-list-item:hover .remove-item-button {\n    opacity: 1;\n    pointer-events: auto;\n}\n\n.settings-tab .settings-list .settings-list-item .remove-item-button:hover {\n    background-position-x: -32px;\n}\n\n.settings-tab .settings-list .settings-list-item .remove-item-button:active {\n    background-position-x: -16px;\n}\n\n.settings-list-item-columns {\n    height: 100%;\n}\n\n.settings-tab .settings-list .settings-list-item .list-column {\n    displaY: -webkit-box;\n    -webkit-box-align: center;\n    padding-left: 5px;\n    padding-right: 2px;\n    box-sizing: border-box;\n    overflow: hidden;\n    text-overflow: ellipsis;\n    height: 100%;\n}\n\n.settings-tab .settings-list .settings-list-item .list-column .list-column-editor {\n    width: 100%;\n}\n\n.settings-tab .settings-list .settings-list-item.add-list-item .remove-item-button {\n    visibility: hidden;\n}\n\n.settings-tab .settings-list .settings-list-item.editable .list-column .list-column-editor {\n    display: none;\n}\n\n.settings-tab .settings-list .settings-list-item.editable.item-editing .list-column .list-column-editor {\n    display: block;\n}\n\n.settings-tab .settings-list .settings-list-item.editable.item-editing .list-column .list-column-text {\n    display: none;\n}\n\n.settings-tab .settings-list .settings-list-item.editable.item-editing .list-column .list-column-editor.editable-item-error {\n    background-color: pink;\n}\n\ninput.list-column-editor {\n    border: 1px solid rgb(213, 213, 213);\n    border-radius: 2px;\n    color: #444444;\n    padding: 3px;\n}\nselect.list-column-editor {\n    padding: 2px;\n    margin-left: 0;\n}\n\n.settings-tab .settings-list .settings-list-item .file-system-path {\n    white-space: nowrap;\n    font-size: 12px;\n    padding-left: 6px;\n    padding-right: 5px;\n    -webkit-box-flex: 1;\n    color: hsl(210, 16%, 22%);\n}\n\n.settings-tab .settings-list .settings-list-item .file-system-path-name {\n    padding-right: 6px;\n    font-weight: bold;\n}\n\n.file-systems-list .settings-list-item .list-column.settings-list-column-path {\n    width: 100%;\n}\n\n.file-mappings-list .settings-list-item .list-column.settings-list-column-url {\n    width: 50%;\n}\n\n.file-mappings-list .settings-list-item .list-column.settings-list-column-path {\n    width: 50%;\n}\n\n.blackbox-patterns-list .settings-list-item .list-column.settings-list-column-pattern {\n    width: 50%;\n}\n\n.blackbox-patterns-list .settings-list-item .list-column.settings-list-column-value {\n    width: 50%;\n}\n\n.excluded-folders-list .settings-list-item .list-column.settings-list-column-path {\n    width: 100%;\n}\n\n.settings-tab .settings-list .settings-list-item.disabled .settings-list-column-pattern .list-column-text {\n    color: #666;\n    text-decoration: line-through;\n}\n\n.settings-dialog {\n    border-radius: 3px;\n    box-shadow: 0 4px 23px 5px rgba(0, 0, 0, 0.2), 0 2px 6px rgba(0,0,0,0.15);\n    display: -webkit-flex;\n    -webkit-flex-direction: column;\n    background: white;\n}\n\n.settings-dialog .dialog-contents {\n    display: flex;\n    flex-direction: column;\n}\n\n.settings-dialog .header {\n    flex: 0 0 auto;\n    color: #333;\n    font-size: 14px;\n    margin: 0;\n    padding: 14px 17px 14px;\n}\n\n.settings-dialog .contents {\n    flex: 1 1 auto;\n    padding: 0 17px;\n    overflow-x: hidden;\n    overflow-y: auto;\n}\n\n.settings-dialog .block-header {\n    color: black;\n    font-size: 1.2em;\n    margin-bottom: 0.8em;\n}\n\n.blackbox-dialog .columns-header {\n    color: black;\n    font-weight: bold;\n    margin-bottom: 0.4em;\n    display: -webkit-box;\n    padding: 0;\n}\n\n.blackbox-dialog .columns-header span {\n    width: 50%;\n    display: -webkit-box;\n}\n\n.blackbox-dialog .columns-header span + span {\n    margin-left: -7px\n}\n\n.blackbox-content-scripts {\n    padding: 0 0 14px 0;\n    margin-left: -4px;\n}\n\n.settings-dialog .done-button {\n    float: right;\n}\n\n.settings-glass-pane {\n    -webkit-box-align: center;\n    -webkit-box-orient: vertical;\n    -webkit-box-pack: center;\n    display: -webkit-box;\n    z-index: 2000 !important;\n    padding: 5px;\n    background-color: rgba(255, 255, 255, 0.4) !important;\n}\n\n.help-indent-labels label {\n    padding-left: 10px;\n}\n\n.dialog-contents .section {\n    min-width: 400px;\n}\n\n.settings-experiment-hidden {\n    display: none;\n}\n\n.settings-experiment-hidden label {\n    background-color: #ddd;\n}\n\n.settings-developer-mode .settings-experiment-hidden {\n    display: block;\n}\n\n/*# sourceURL=ui/helpScreen.css */";Runtime.cachedResources["ui/infobar.css"] = "/*\n * Copyright 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.infobar {\n    color: rgb(34, 34, 34);\n    padding: 4px 6px;\n    white-space: nowrap;\n    display: flex;\n    align-items: flex-start;\n    flex: auto;\n    border-bottom: 1px solid rgb(171, 171, 171);\n}\n\n.infobar-warning {\n    background-color: rgb(253, 242, 192);\n}\n\n.infobar-info {\n    background-color: rgb(255, 255, 255);\n}\n\n.infobar .icon {\n    flex: none;\n}\n\n.infobar .content {\n    flex: auto;\n    padding-left: 3px;\n    overflow: hidden;\n    text-overflow: ellipsis;\n}\n\n.infobar .close-button {\n    flex: none;\n}\n\n.infobar .disable-button {\n    flex: none;\n    margin-right: 5px;\n    text-decoration: underline;\n    cursor: pointer;\n}\n\n/*# sourceURL=ui/infobar.css */";Runtime.cachedResources["ui/inspectorCommon.css"] = "/*\n * Copyright 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* {\n    /* This is required for correct sizing of flex items because we rely\n     * on an old version of the flexbox spec.\n     * Longer-term we should remove this, see crbug.com/473625 */\n    min-width: 0;\n    min-height: 0;\n}\n\n:host-context(.platform-mac) .monospace,\n:host-context(.platform-mac) .source-code,\n.platform-mac .monospace,\n.platform-mac .source-code {\n    font-size: 11px !important;\n    font-family: Menlo, monospace;\n}\n\n:host-context(.platform-windows) .monospace,\n:host-context(.platform-windows) .source-code,\n.platform-windows .monospace,\n.platform-windows .source-code {\n    font-size: 12px !important;\n    font-family: Consolas, Lucida Console, monospace;\n}\n\n:host-context(.platform-linux) .monospace,\n:host-context(.platform-linux) .source-code,\n.platform-linux .monospace,\n.platform-linux .source-code {\n    font-size: 11px !important;\n    font-family: dejavu sans mono, monospace;\n}\n\n.source-code {\n    font-family: monospace;\n    font-size: 11px !important;\n    white-space: pre-wrap;\n}\n\n* {\n    box-sizing: border-box;\n}\n\n:focus {\n    outline: none;\n}\n\nimg {\n    -webkit-user-drag: none;\n}\n\niframe,\na img {\n    border: none;\n}\n\n.fill {\n    position: absolute;\n    top: 0;\n    left: 0;\n    right: 0;\n    bottom: 0;\n}\n\niframe.fill {\n    width: 100%;\n    height: 100%;\n}\n\n.widget {\n    position: relative;\n    flex: auto;\n}\n\n.hbox {\n    display: flex;\n    flex-direction: row !important;\n    position: relative;\n}\n\n.vbox {\n    display: flex;\n    flex-direction: column !important;\n    position: relative;\n}\n\n.flex-auto {\n    flex: auto;\n}\n\n.flex-none {\n    flex: none;\n}\n\n.flex-centered {\n    display: flex;\n    align-items: center;\n    justify-content: center;\n}\n\niframe.widget {\n    position: absolute;\n    width: 100%;\n    height: 100%;\n    left: 0;\n    right: 0;\n    top: 0;\n    bottom: 0;\n}\n\n.hidden {\n    display: none !important;\n}\n\n.monospace {\n    font-size: 10px !important;\n    font-family: monospace;\n}\n\n.highlighted-search-result {\n    border-radius: 1px;\n    padding: 1px;\n    margin: -1px;\n    background-color: rgba(255, 255, 0, 0.8);\n}\n\n.link {\n    cursor: pointer;\n    text-decoration: underline;\n    color: rgb(17, 85, 204);\n}\n\nbutton,\ninput,\nselect {\n    font-family: inherit;\n    font-size: inherit;\n}\n\ninput[type=\"search\"]:focus,\ninput[type=\"text\"]:focus {\n    outline: auto 5px -webkit-focus-ring-color;\n}\n\n\n.highlighted-search-result.current-search-result {\n    border-radius: 1px;\n    padding: 1px;\n    margin: -1px;\n    background-color: rgba(255, 127, 0, 0.8);\n}\n\n.dimmed {\n    opacity: 0.6;\n}\n\n/*# sourceURL=ui/inspectorCommon.css */";Runtime.cachedResources["ui/inspectorSyntaxHighlight.css"] = "/*\n * Copyright (C) 2009 Apple Inc.  All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n *\n * 1.  Redistributions of source code must retain the above copyright\n *     notice, this list of conditions and the following disclaimer.\n * 2.  Redistributions in binary form must reproduce the above copyright\n *     notice, this list of conditions and the following disclaimer in the\n *     documentation and/or other materials provided with the distribution.\n * 3.  Neither the name of Apple Computer, Inc. (\"Apple\") nor the names of\n *     its contributors may be used to endorse or promote products derived\n *     from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS \"AS IS\" AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n.cm-js-keyword {color: rgb(170, 13, 145);}\n.cm-js-number {color: rgb(28, 0, 207);}\n.cm-js-comment {color: rgb(0, 116, 0);}\n.cm-js-string {color: rgb(196, 26, 22);}\n.cm-js-string-2 {color: rgb(196, 26, 22);}\n\n.cm-css-keyword { color: rgb(7, 144, 154);}\n.cm-css-number {color: rgb(50, 0, 255);}\n.cm-css-comment {color: rgb(0, 116, 0);}\n.cm-css-def {color: rgb(200, 0, 0);}\n.cm-css-meta {color: rgb(200, 0, 0);}\n.cm-css-atom {color: rgb(7, 144, 154);}\n.cm-css-string {color: rgb(7, 144, 154);}\n.cm-css-string-2 {color: rgb(7, 144, 154);}\n.cm-css-link {color: rgb(7, 144, 154);}\n.cm-css-variable {color: rgb(200, 0, 0);}\n.cm-css-variable-2 {color: rgb(0, 0, 128);}\n.cm-css-property, .webkit-css-property {color: rgb(200, 0, 0);}\n\n.cm-xml-meta {color: rgb(192, 192, 192);}\n.cm-xml-comment {color: rgb(35, 110, 37);}\n.cm-xml-string {color: rgb(26, 26, 166);}\n.cm-xml-tag {color: rgb(136, 18, 128);}\n.cm-xml-attribute {color: rgb(153, 69, 0);}\n.cm-xml-link {color: #00e;}\n\n.webkit-html-comment {\n    /* Keep this in sync with view-source.css (.webkit-html-comment) */\n    color: rgb(35, 110, 37);\n}\n\n.webkit-html-tag {\n    /* Keep this in sync with view-source.css (.webkit-html-tag) */\n    color: rgb(136, 18, 128);\n}\n\n.webkit-html-pseudo-element {\n    /* This one is non-standard. */\n    color: brown;\n}\n\n.webkit-html-js-node,\n.webkit-html-css-node {\n    white-space: pre;\n}\n\n.webkit-html-text-node {\n    unicode-bidi: -webkit-isolate;\n}\n\n.webkit-html-entity-value {\n    /* This one is non-standard. */\n    background-color: rgba(0, 0, 0, 0.15);\n    unicode-bidi: -webkit-isolate;\n}\n\n.webkit-html-doctype {\n    /* Keep this in sync with view-source.css (.webkit-html-doctype) */\n    color: rgb(192, 192, 192);\n}\n\n.webkit-html-attribute-name {\n    /* Keep this in sync with view-source.css (.webkit-html-attribute-name) */\n    color: rgb(153, 69, 0);\n    unicode-bidi: -webkit-isolate;\n}\n\n.webkit-html-attribute-value {\n    /* Keep this in sync with view-source.css (.webkit-html-attribute-value) */\n    color: rgb(26, 26, 166);\n    unicode-bidi: -webkit-isolate;\n}\n\n.webkit-html-external-link,\n.webkit-html-resource-link {\n    /* Keep this in sync with view-source.css (.webkit-html-external-link, .webkit-html-resource-link) */\n    color: #00e;\n}\n\n.webkit-html-resource-link {\n    /* Required for consistency with view-source.css, since anchors may not have href attributes */\n    text-decoration: underline;\n    cursor: pointer;\n}\n\n.webkit-html-external-link {\n    /* Keep this in sync with view-source.css (.webkit-html-external-link) */\n    text-decoration: none;\n}\n\n.webkit-html-external-link:hover {\n    /* Keep this in sync with view-source.css (.webkit-html-external-link:hover) */\n    text-decoration: underline;\n}\n\n.webkit-html-end-of-file {\n    /* Keep this in sync with view-source.css (.webkit-html-end-of-file) */\n    color: rgb(255, 0, 0);\n    font-weight: bold;\n}\n\n/*# sourceURL=ui/inspectorSyntaxHighlight.css */";Runtime.cachedResources["ui/panelEnablerView.css"] = "/*\n * Copyright (C) 2006, 2007, 2008 Apple Inc.  All rights reserved.\n * Copyright (C) 2009 Anthony Ricaud <rik@webkit.org>\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n *\n * 1.  Redistributions of source code must retain the above copyright\n *     notice, this list of conditions and the following disclaimer.\n * 2.  Redistributions in binary form must reproduce the above copyright\n *     notice, this list of conditions and the following disclaimer in the\n *     documentation and/or other materials provided with the distribution.\n * 3.  Neither the name of Apple Computer, Inc. (\"Apple\") nor the names of\n *     its contributors may be used to endorse or promote products derived\n *     from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS \"AS IS\" AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n.panel-enabler-view {\n    background-color: white;\n    font-size: 13px;\n    text-align: center;\n    overflow-x: hidden;\n    overflow-y: overlay;\n    flex: auto;\n    display: flex;\n}\n\n.panel-enabler-view h1 {\n    color: rgb(110, 116, 128);\n    font-size: 16px;\n    line-height: 20px;\n    font-weight: normal;\n    margin-top: 0;\n}\n\n.panel-enabler-view img {\n    height: 100%;\n    min-height: 200px;\n    max-width: 100%;\n    top: 0;\n    bottom: 0;\n    padding: 20px 0 20px 20px;\n    margin: auto;\n    vertical-align: middle;\n}\n\n.panel-enabler-view img.hidden {\n    display: initial !important;\n    width: 0;\n}\n\n.panel-enabler-view .flexible-space {\n    -webkit-flex: 1;\n}\n\n.panel-enabler-view form {\n    display: inline-block;\n    vertical-align: middle;\n    width: 330px;\n    margin: 0;\n    padding: 15px;\n    white-space: normal;\n}\n\n.panel-enabler-view label {\n    position: relative;\n    display: block;\n    text-align: left;\n    word-break: break-word;\n    margin: 0 0 5px 20px;\n}\n\n/*# sourceURL=ui/panelEnablerView.css */";Runtime.cachedResources["ui/progressIndicator.css"] = "/*\n * Copyright (c) 2014 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.progress-indicator-shadow-stop-button {\n    background-color: rgb(216, 0, 0) !important;\n    border: 0;\n    width: 10px;\n    height: 12px;\n    border-radius: 2px;\n}\n\n.progress-indicator-shadow-container {\n    display: flex;\n    flex: 1 0 auto;\n    align-items: center;\n}\n\n.progress-indicator-shadow-container .title {\n    text-overflow: ellipsis;\n    overflow: hidden;\n    max-width: 150px;\n    margin-right: 2px;\n    color: #777;\n}\n\n.progress-indicator-shadow-container progress {\n    flex: auto;\n    margin: 0 2px;\n    width: 100px\n}\n\n/*# sourceURL=ui/progressIndicator.css */";Runtime.cachedResources["ui/propertiesSection.css"] = "/*\n * Copyright (c) 2014 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.properties-tree {\n    margin: 0;\n    padding: 0 6px 2px;\n    list-style: none;\n    min-height: 18px;\n}\n\n.properties-tree ol {\n    display: none;\n    margin: 0;\n    -webkit-padding-start: 12px;\n    list-style: none;\n}\n\n.properties-tree ol.expanded {\n    display: block;\n}\n\n.properties-tree li {\n    margin-left: 12px;\n    white-space: nowrap;\n    text-overflow: ellipsis;\n    overflow: hidden;\n    -webkit-user-select: text;\n    cursor: default;\n    padding-top: 2px;\n    line-height: 12px;\n}\n\n.properties-tree li.parent {\n    margin-left: 1px;\n}\n\n.properties-tree li.parent::before {\n    -webkit-user-select: none;\n    background-image: url(Images/toolbarButtonGlyphs.png);\n    background-size: 352px 144px;\n    opacity: 0.5;\n    content: \"a\";\n    width: 8px;\n    float: left;\n    margin-right: 4px;\n    color: transparent;\n    text-shadow: none;\n}\n\n@media (-webkit-min-device-pixel-ratio: 1.5) {\n.properties-tree li.parent::before {\n    background-image: url(Images/toolbarButtonGlyphs_2x.png);\n}\n} /* media */\n\n.properties-tree li.parent::before {\n    background-position: -4px -96px;\n}\n\n.properties-tree li.parent.expanded::before {\n    background-position: -20px -96px;\n}\n\n.properties-tree li .info {\n    padding-top: 4px;\n    padding-bottom: 3px;\n}\n\n.properties-tree li.editing {\n    margin-left: 10px;\n    text-overflow: clip;\n}\n\n.properties-tree li.editing-sub-part {\n    padding: 3px 6px 8px 18px;\n    margin: -1px -6px -8px -6px;\n    text-overflow: clip;\n}\n\n.properties-tree .name {\n    color: rgb(136, 19, 145);\n    flex-shrink: 0;\n}\n\n.properties-tree .separator {\n    flex-shrink: 0;\n}\n\n.properties-tree .dimmed {\n    opacity: 0.6;\n}\n\n.properties-tree .value.error {\n    color: red;\n}\n\n.properties-tree .number {\n    color: blue;\n}\n\n.properties-tree .keyword {\n    color: rgb(136, 19, 79);\n}\n\n.properties-tree .color {\n    color: rgb(118, 15, 21);\n}\n\n/*# sourceURL=ui/propertiesSection.css */";Runtime.cachedResources["ui/radioButton.css"] = "/*\n * Copyright (c) 2014 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::content .dt-radio-button {\n    height: 17px;\n    width: 17px;\n    min-width: 17px;\n    border: 1px solid rgb(165, 165, 165);\n    background-image: linear-gradient(to bottom, rgb(252, 252, 252), rgb(223, 223, 223));\n    border-radius: 8px;\n    -webkit-appearance: none;\n    vertical-align: middle;\n    margin: 0 5px 5px 0;\n}\n\n::content .dt-radio-button:active:not(:disabled) {\n    background-image: linear-gradient(to bottom, rgb(194, 194, 194), rgb(239, 239, 239));\n}\n\n::content .dt-radio-button:checked {\n    background: url(Images/radioDot.png) center no-repeat,\n                linear-gradient(to bottom, rgb(252, 252, 252), rgb(223, 223, 223));\n}\n\n::content .dt-radio-button:checked:active {\n    background: url(Images/radioDot.png) center no-repeat,\n                linear-gradient(to bottom, rgb(194, 194, 194), rgb(239, 239, 239));\n}\n\n/*# sourceURL=ui/radioButton.css */";Runtime.cachedResources["ui/searchableView.css"] = "/*\n * Copyright (c) 2014 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.search-bar {\n    flex: 0 0 23px;\n    background-color: #eee;\n    border-top: 1px solid #ccc;\n    display: flex;\n    overflow: hidden;\n}\n\n.search-bar.replaceable {\n    flex: 0 0 44px;\n}\n\n.search-replace {\n    -webkit-appearance: none;\n    border: 0;\n    padding: 0 3px;\n    margin: 0;\n    flex: 1;\n}\n\n.search-replace:focus {\n    outline: none;\n}\n\n.toolbar-search {\n    border-spacing: 1px;\n}\n\n.toolbar-search td {\n    padding: 0 5px 0 0;\n}\n\n.toolbar-search td > span {\n    display: flex;\n    align-items: baseline;\n    line-height: 17px;\n}\n\n.toolbar-search-navigation-controls {\n    align-self: stretch;\n    background-image: linear-gradient(rgb(228, 228, 228), rgb(206, 206, 206));\n}\n\n.toolbar-search-navigation {\n    display: inline-block;\n    width: 18px;\n    height: 18px;\n    background-repeat: no-repeat;\n    background-position: 4px 7px;\n    border-left: 1px solid rgb(170, 170, 170);\n    opacity: 0.3;\n}\n\n.toolbar-search-navigation.enabled {\n    opacity: 1.0;\n}\n\n.toolbar-search button.search-action-button {\n    border: 1px solid rgb(163, 163, 163);\n    border-radius: 8px;\n    margin: 0;\n    background-image: linear-gradient(rgb(241, 241, 241), rgb(220, 220, 220));\n    width: 100%;\n    height: 20px;\n}\n\n.toolbar-search button.search-action-button:active {\n    background-image: linear-gradient(rgb(185, 185, 185), rgb(156, 156, 156));\n}\n\n.toolbar-search-control {\n    display: -webkit-flex;\n    position: relative;\n    background-color: white;\n}\n\n.toolbar-replace-control,\n#search-input-field {\n    padding-top: 1px;\n    line-height: 17px;\n}\n\n.toolbar-search-control, .toolbar-replace-control {\n    border: 1px solid rgb(163, 163, 163);\n    height: 20px;\n    border-radius: 2px;\n    width: 253px;\n    margin-left: 1px;\n}\n\n.toolbar-search-navigation.enabled:active {\n    background-position: 4px 7px, 0 0;\n}\n\n.toolbar-search-navigation.toolbar-search-navigation-prev {\n    background-image: url(Images/searchPrev.png);\n    border-left: 1px solid rgb(163, 163, 163);\n}\n\n.toolbar-search-navigation.toolbar-search-navigation-prev.enabled:active {\n    background-image: url(Images/searchPrev.png), linear-gradient(rgb(168, 168, 168), rgb(116, 116, 116));\n}\n\n.toolbar-search-navigation.toolbar-search-navigation-next {\n    background-image: url(Images/searchNext.png);\n    border-left: 1px solid rgb(230, 230, 230);\n}\n\n.toolbar-search-navigation.toolbar-search-navigation-next.enabled:active {\n    background-image: url(Images/searchNext.png), linear-gradient(rgb(168, 168, 168), rgb(116, 116, 116));\n}\n\n.search-results-matches {\n    display: inline-block;\n    text-align: right;\n    font-size: 11px;\n    padding: 0 4px;\n    color: rgb(165, 165, 165);\n}\n\n/*# sourceURL=ui/searchableView.css */";Runtime.cachedResources["ui/section.css"] = "/*\n * Copyright (c) 2014 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.section {\n    position: relative;\n    margin-top: 1px;\n}\n\n.section > .header {\n    padding: 0 8px 0 5px;\n    min-height: 18px;\n    white-space: nowrap;\n    background-origin: padding-box;\n    background-clip: padding-box;\n}\n\n.section > .header::before {\n    -webkit-user-select: none;\n    background-image: url(Images/toolbarButtonGlyphs.png);\n    background-size: 352px 144px;\n    opacity: 0.5;\n    content: \"a\";\n    color: transparent;\n    text-shadow: none;\n    float: left;\n    width: 8px;\n    margin-right: 4px;\n    margin-top: 2px;\n}\n\n@media (-webkit-min-device-pixel-ratio: 1.5) {\n.section > .header::before {\n    background-image: url(Images/toolbarButtonGlyphs_2x.png);\n}\n} /* media */\n\n.section > .header::before {\n    background-position: -4px -96px;\n}\n\n.section.expanded > .header::before {\n    background-position: -20px -96px;\n}\n\n.section > .header .title {\n    font-weight: normal;\n    word-wrap: break-word;\n    white-space: normal;\n    line-height: 18px;\n}\n\n.section > .header label {\n    display: none;\n}\n\n.section.expanded .header label {\n    display: inline;\n}\n\n.section > .header .subtitle {\n    float: right;\n    margin-left: 5px;\n    max-width: 55%;\n    text-overflow: ellipsis;\n    overflow: hidden;\n}\n\n.section > .header .subtitle a {\n    color: inherit;\n}\n\n.section > .properties {\n    display: none;\n}\n\n.section.expanded > .properties {\n    display: block;\n}\n\n/*# sourceURL=ui/section.css */";Runtime.cachedResources["ui/smallIcon.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\ndiv {\n    width: 10px;\n    height: 10px;\n    margin-right: 2px;\n    display: inline-block;\n}\n\ndiv.error-icon,\ndiv.revokedError-icon,\ndiv.warning-icon,\ndiv.info-icon,\ndiv.device-icon,\ndiv.red-ball,\ndiv.green-ball,\ndiv.orange-ball {\n    background-image: url(Images/toolbarButtonGlyphs.png);\n    background-size: 352px 144px;\n}\n\n@media (-webkit-min-device-pixel-ratio: 1.5) {\ndiv.error-icon,\ndiv.revokedError-icon,\ndiv.warning-icon,\ndiv.info-icon,\ndiv.device-icon,\ndiv.red-ball,\ndiv.green-ball,\ndiv.orange-ball {\n    background-image: url(Images/toolbarButtonGlyphs_2x.png);\n}\n} /* media */\n\ndiv.error-icon {\n    background-position: -213px -96px;\n}\n\ndiv.revokedError-icon {\n    background-position: -245px -107px;\n}\n\ndiv.warning-icon {\n    background-position: -202px -107px;\n}\n\ndiv.info-icon {\n    background-position: -213px -107px;\n}\n\ndiv.device-icon {\n    background-position: -224px -107px;\n}\n\ndiv.red-ball {\n    background-position: -224px -96px;\n}\n\ndiv.green-ball {\n    background-position: -235px -96px;\n}\n\ndiv.orange-ball {\n    background-position: -246px -96px;\n}\n\n/*# sourceURL=ui/smallIcon.css */";Runtime.cachedResources["ui/softContextMenu.css"] = "/*\n * Copyright (c) 2014 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    position: absolute;\n    border: 1px solid rgba(196, 196, 196, 0.9);\n    border-top: 1px solid rgba(196, 196, 196, 0.5);\n    border-bottom: 1px solid rgba(150, 150, 150, 0.9);\n    padding: 4px 0 4px 0;\n    border-radius: 4px;\n    background-color: white;\n    box-shadow: 0 5px 10px rgba(0, 0, 0, 0.25);\n}\n\n.soft-context-menu-item {\n    width: 100%;\n    line-height: 13px;\n    font-size: 14px;\n    border-top: 1px solid transparent;\n    border-bottom: 1px solid transparent;\n    padding: 2px 7px 2px 6px;\n    margin: 0 13px 0 0;\n    white-space: nowrap;\n}\n\n.soft-context-menu-separator {\n    height: 10px;\n    margin: 0 1px;\n}\n\n.soft-context-menu-separator > .separator-line {\n    margin: 0;\n    height: 5px;\n    border-bottom: 1px solid rgb(227, 227, 227);\n    pointer-events: none;\n}\n\n.soft-context-menu-item-mouse-over {\n    border-top: 1px solid rgb(56, 121, 217);\n    border-bottom: 1px solid rgb(56, 121, 217);\n    background-color: rgb(56, 121, 217);\n    color: white;\n}\n\n:host-context(.platform-mac) .soft-context-menu-item-mouse-over {\n    border-top: 1px solid rgb(90, 131, 236);\n    border-bottom: 1px solid rgb(18, 88, 233);\n    background-image: linear-gradient(to bottom, rgb(100, 140, 243), rgb(36, 101, 243));\n}\n\n.soft-context-menu-item-checkmark {\n    color: rgb(108, 108, 108);\n    pointer-events: none;\n}\n\n.soft-context-menu-item-submenu-arrow {\n    color: #222;\n    float: right;\n    pointer-events: none;\n}\n\n.soft-context-menu-item-mouse-over .soft-context-menu-item-checkmark {\n    color: white;\n}\n\n/*# sourceURL=ui/softContextMenu.css */";Runtime.cachedResources["ui/splitWidget.css"] = "/*\n * Copyright (C) 2011 Google Inc. All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * 1. Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above\n * copyright notice, this list of conditions and the following disclaimer\n * in the documentation and/or other materials provided with the\n * distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY GOOGLE INC. AND ITS CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GOOGLE INC.\n * OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n:host {\n    overflow: hidden;\n}\n\n.shadow-split-widget {\n    display: flex;\n    overflow: hidden;\n}\n\n.shadow-split-widget-contents {\n    display: flex;\n    position: relative;\n    flex-direction: column;\n}\n\n.shadow-split-widget-sidebar {\n    flex: none;\n}\n\n.shadow-split-widget-main, .shadow-split-widget-sidebar.maximized {\n    flex: auto;\n}\n\n.shadow-split-widget.hbox > .shadow-split-widget-resizer {\n    position: absolute;\n    top: 0;\n    bottom: 0;\n    width: 6px;\n    z-index: 500;\n}\n\n.shadow-split-widget.vbox > .shadow-split-widget-resizer {\n    position: absolute;\n    left: 0;\n    right: 0;\n    height: 6px;\n    z-index: 500;\n}\n\n.shadow-split-widget.hbox.shadow-split-widget-first-is-sidebar {\n    flex-direction: row-reverse !important;\n}\n\n.shadow-split-widget.vbox.shadow-split-widget-first-is-sidebar {\n    flex-direction: column-reverse !important;\n}\n\n.shadow-split-widget-resizer-border {\n    pointer-events: none;\n}\n\n.shadow-split-widget.vbox > .shadow-split-widget-sidebar:not(.maximized) {\n    border: 0;\n    border-top: 1px solid rgb(64%, 64%, 64%);\n}\n\n.shadow-split-widget.vbox.shadow-split-widget-first-is-sidebar > .shadow-split-widget-sidebar:not(.maximized) {\n    border: 0;\n    border-bottom: 1px solid rgb(64%, 64%, 64%);\n}\n\n.shadow-split-widget.hbox > .shadow-split-widget-sidebar:not(.maximized) {\n    border: 0;\n    border-left: 1px solid rgb(64%, 64%, 64%);\n}\n\n.shadow-split-widget.hbox.shadow-split-widget-first-is-sidebar > .shadow-split-widget-sidebar:not(.maximized) {\n    border: 0;\n    border-right: 1px solid rgb(64%, 64%, 64%);\n}\n\n.shadow-split-widget button.sidebar-show-hide-button {\n    position: absolute;\n    -webkit-mask-image: url(Images/toolbarButtonGlyphs.png);\n    -webkit-mask-size: 352px 144px;\n    height: 16px;\n    width: 16px;\n    border: none;\n    z-index: 20;\n    background-color: #5a5a5a;\n}\n\n.shadow-split-widget button.sidebar-show-hide-button:hover {\n    background-color: #333;\n}\n\n.shadow-split-widget button.sidebar-show-hide-button:active {\n    background-color: #5a5a5a;\n}\n\n.shadow-split-widget button.sidebar-show-hide-button:disabled {\n    background-color: rgba(0, 0, 0, 0.35);\n}\n\n@media (-webkit-min-device-pixel-ratio: 1.5) {\n.shadow-split-widget button.sidebar-show-hide-button {\n    -webkit-mask-image: url(Images/toolbarButtonGlyphs_2x.png);\n}\n} /* media */\n\n.shadow-split-widget button.left-sidebar-show-hide-button,\n.shadow-split-widget button.top-sidebar-show-hide-button {\n    top: 5px;\n    left: 5px;\n}\n\n:host-context(.material) .shadow-split-widget button.left-sidebar-show-hide-button,\n:host-context(.material) .shadow-split-widget button.top-sidebar-show-hide-button {\n    top: 5px;\n}\n\n.shadow-split-widget button.right-sidebar-show-hide-button {\n    top: 5px;\n    right:4px;\n}\n\n:host-context(.material) .shadow-split-widget button.right-sidebar-show-hide-button {\n    top: 5px;\n    right: 5px;\n}\n\n.shadow-split-widget button.bottom-sidebar-show-hide-button {\n    bottom: 5px;\n    right: 3px;\n}\n\n.shadow-split-widget button.left-sidebar-show-hide-button.toggled-show {\n    -webkit-mask-position: -168px -76px; /* |> */\n}\n\n.shadow-split-widget button.left-sidebar-show-hide-button.toggled-hide {\n    -webkit-mask-position: -199px -76px; /* |< */\n}\n\n.shadow-split-widget button.right-sidebar-show-hide-button.toggled-show {\n    -webkit-mask-position: -296px -76px; /* <| */\n}\n\n.shadow-split-widget button.right-sidebar-show-hide-button.toggled-hide {\n    -webkit-mask-position: -264px -76px; /* >| */\n}\n\n.shadow-split-widget button.top-sidebar-show-hide-button.toggled-show {\n    -webkit-mask-position: -168px -76px; /* |> */\n    transform: rotate(90deg);\n}\n\n.shadow-split-widget button.top-sidebar-show-hide-button.toggled-hide {\n    -webkit-mask-position: -199px -76px; /* |< */\n    transform: rotate(90deg);\n}\n\n.shadow-split-widget button.bottom-sidebar-show-hide-button.toggled-show {\n    -webkit-mask-position: -296px -76px; /* <| */\n    transform: rotate(90deg);\n}\n\n.shadow-split-widget button.bottom-sidebar-show-hide-button.toggled-hide {\n    -webkit-mask-position: -264px -76px; /* >| */\n    transform: rotate(90deg);\n}\n\n/*# sourceURL=ui/splitWidget.css */";Runtime.cachedResources["ui/toolbar.css"] = "/*\n * Copyright (c) 2014 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    flex: none;\n    padding: 0 2px;\n}\n\n.toolbar-shadow {\n    position: relative;\n    white-space: nowrap;\n    height: 26px;\n    overflow: hidden;\n    z-index: 12;\n    display: flex;\n    flex: none;\n    align-items: center;\n}\n\n.toolbar-shadow.vertical {\n    flex-direction: column;\n    height: auto;\n    width: 26px;\n}\n\n.toolbar-shadow.floating {\n    flex-direction: column;\n    height: auto;\n    background-color: white;\n    border: 1px solid #ccc;\n    margin-top: -1px;\n    width: 26px;\n    left: -2px;\n}\n\n.toolbar-item {\n    position: relative;\n    display: flex;\n    background-color: transparent;\n    flex: none;\n    align-items: center;\n    justify-content: center;\n    padding: 0;\n    height: 26px;\n    border: none;\n    color: #5a5a5a;\n}\n\n.toolbar-text {\n    white-space: nowrap;\n    overflow: hidden;\n    margin-left: 6px;\n    -webkit-user-select: text;\n}\n\n.toolbar-item:active {\n    position: relative;\n    z-index: 200;\n}\n\n.toolbar-item:hover .toolbar-button-text {\n    color: #333;\n}\n\n.toolbar-item .toolbar-button-text {\n    font-weight: bold;\n    color: #5a5a5a;\n}\n\n.long-click-glyph {\n    background-color: #595959;\n    -webkit-mask-image: url(Images/toolbarButtonGlyphs.png);\n    -webkit-mask-position: -288px -48px;\n    -webkit-mask-size: 352px 144px;\n    z-index: 1;\n    width: 32px;\n    height: 26px;\n}\n\n@media (-webkit-min-device-pixel-ratio: 1.5) {\n.long-click-glyph {\n    -webkit-mask-image: url(Images/toolbarButtonGlyphs_2x.png);\n}\n} /* media */\n\nbutton.toolbar-item {\n    width: 26px;\n}\n\nbutton.toolbar-item.toggled-on .glyph {\n    background-color: rgb(66, 129, 235) !important;\n}\n\nbutton.toolbar-item:enabled:hover .glyph {\n    background-color: #333;\n}\n\n.toolbar-counter:hover,\n.toolbar-item.checkbox:hover {\n    color: #333;\n}\n\nbutton.toolbar-item:active .glyph {\n    background-color: #5a5a5a !important;\n}\n\nbutton.toolbar-item:disabled {\n    background-position: 0 0 !important;\n}\n\nbutton.toolbar-item:disabled .glyph {\n    opacity: 0.5 !important;\n}\n\nbutton.toolbar-item.extension {\n    background-image: none;\n}\n\n.toolbar-select-container {\n    display: inline-flex;\n    flex-shrink: 0;\n    margin-right: 6px;\n}\n\n.toolbar-select-arrow {\n    background-image: url(Images/toolbarButtonGlyphs.png);\n    background-size: 352px 144px;\n    opacity: 0.7;\n    width: 12px;\n    height: 12px;\n    background-position: -18px -96px;\n    display: inline-block;\n    pointer-events: none;\n    margin: auto 0;\n}\n\n@media (-webkit-min-device-pixel-ratio: 1.5) {\n.toolbar-select-arrow {\n    background-image: url(Images/toolbarButtonGlyphs_2x.png);\n}\n} /* media */\n\ninput.toolbar-item {\n    width: 200px;\n    height: 20px;\n    padding: 3px;\n    margin: 1px 3px;\n    background-color: white;\n    border: solid 1px rgb(216, 216, 216);\n}\n\ninput.toolbar-item:focus,\ninput.toolbar-item:hover {\n    border: solid 1px rgb(202, 202, 202);\n}\n\nselect.toolbar-item {\n    min-width: 48px;\n    color: rgb(48, 48, 48);\n    text-shadow: rgba(255, 255, 255, 0.75) 0 1px 0;\n    -webkit-appearance: none;\n    border: 0;\n    border-radius: 0;\n    padding: 0 15px 0 5px;\n    margin-right: -10px;\n    position: relative;\n    line-height: 22px;\n}\n\n.toolbar-item.checkbox {\n    padding: 0 5px 0 2px;\n}\n\n.toolbar-item > .glyph {\n    -webkit-mask-image: url(Images/toolbarButtonGlyphs.png);\n    -webkit-mask-size: 352px 144px;\n    background-color: #5a5a5a;\n    z-index: 1;\n    width: 32px;\n    height: 24px;\n}\n\n.toolbar-item > .glyph {\n    position: relative;\n    left: -3px;\n}\n\n.toolbar-item > .long-click-glyph {\n    left: -5px;\n}\n\n@media (-webkit-min-device-pixel-ratio: 1.5) {\n.toolbar-item > .glyph {\n    -webkit-mask-image: url(Images/toolbarButtonGlyphs_2x.png);\n}\n} /* media */\n\n.toolbar-item.emulate-active {\n    background-color: rgb(163,163,163);\n}\n\n.toolbar-counter {\n    cursor: pointer;\n    padding: 0 2px;\n    min-width: 26px;\n}\n\n.toolbar-counter-item {\n    margin-left: 6px;\n}\n\n.toolbar-counter-item label {\n    cursor: inherit;\n}\n\n.toolbar-counter-item.toolbar-counter-item-first {\n    margin-left: 0;\n}\n\n.toolbar-counter-item > div {\n    margin-right: 2px;\n}\n\n.toolbar-divider {\n    background-color: #ccc;\n    width: 1px;\n    margin: 2px 4px;\n    height: 17px;\n}\n\n.toolbar-group-label {\n    margin-left: 5px;\n    margin-right: 3px;\n    color: #888;\n}\n\n/* Predefined items */\n\n.dock-toolbar-item.toggled-undocked .glyph {\n    -webkit-mask-position: 0 -48px;\n}\n\n.dock-toolbar-item.toggled-bottom .glyph {\n    -webkit-mask-position: -32px -24px;\n}\n\n.dock-toolbar-item.toggled-right .glyph {\n    -webkit-mask-position: -256px -48px;\n}\n\n.dock-toolbar-item.toggled-left .glyph {\n    -webkit-mask-position: -32px -120px;\n}\n\n.settings-toolbar-item .glyph {\n    -webkit-mask-position: -160px -24px;\n}\n\n.node-search-toolbar-item .glyph {\n    -webkit-mask-position: -224px -24px;\n}\n\n.emulation-toolbar-item .glyph {\n    -webkit-mask-position: -160px 1px;\n}\n\n.emulation-toolbar-item.warning::after {\n    background-image: url(Images/toolbarButtonGlyphs.png);\n    background-size: 352px 144px;\n    width: 10px;\n    height: 12px;\n    content: \"\";\n    position: absolute;\n    right: 3px;\n    bottom: 2px;\n    background-position: -202px -107px;\n    z-index: 1;\n}\n\n@media (-webkit-min-device-pixel-ratio: 1.5) {\n.emulation-toolbar-item.warning::before {\n    background-image: url(Images/toolbarButtonGlyphs_2x.png);\n}\n} /* media */\n\n.delete-toolbar-item .glyph {\n    -webkit-mask-position: -128px 0;\n}\n\n.clear-toolbar-item .glyph {\n    -webkit-mask-position: -64px 0;\n}\n\n.refresh-toolbar-item .glyph {\n    -webkit-mask-position: 0 0;\n}\n\n.focus-toolbar-item .glyph {\n    -webkit-mask-position: -96px 0;\n}\n\n.console-toolbar-item .glyph {\n    -webkit-mask-position: -64px -24px;\n}\n\n.large-list-toolbar-item .glyph {\n    -webkit-mask-position: -224px 0;\n}\n\n.screencast-toolbar-item .glyph {\n    -webkit-mask-position: -160px 0;\n}\n\n.record-toolbar-item .glyph {\n    -webkit-mask-position: -288px 0;\n}\n\nbutton.record-toolbar-item.toggled-on .glyph {\n    -webkit-mask-position: -288px -24px;\n    background-color: rgb(216, 0, 0) !important;\n}\n\n.camera-toolbar-item .glyph {\n    -webkit-mask-position: -96px -24px;\n}\n\n.last-step-toolbar-item .glyph {\n    -webkit-mask-position: 0 -72px;\n}\n\n.first-step-toolbar-item .glyph {\n    -webkit-mask-position: 0 -72px;\n    transform: rotate(180deg);\n    top: 0;\n    bottom: 0;\n}\n\n.step-in-toolbar-item .glyph {\n    -webkit-mask-position: -64px -72px;\n}\n\n.step-out-toolbar-item .glyph {\n    -webkit-mask-position: -96px -72px;\n}\n\n.step-over-toolbar-item .glyph {\n    -webkit-mask-position: -128px -72px;\n}\n\n.step-backwards-toolbar-item .glyph {\n    -webkit-mask-position: -128px -72px;\n    transform: scaleX(-1);\n}\n\n.play-toolbar-item .glyph {\n    -webkit-mask-position: -64px -48px;\n}\n\n.play-backwards-toolbar-item .glyph {\n    -webkit-mask-position: -64px -48px;\n    transform: scaleX(-1);\n}\n\n.pause-on-exceptions-toolbar-item .glyph {\n    -webkit-mask-position: -256px 0;\n}\n\n.pause-on-exceptions-toolbar-item.toggled-on .glyph {\n    background-color: rgb(66, 129, 235);\n}\n\n.pause-toolbar-item .glyph {\n    -webkit-mask-position: -32px -72px;\n}\n\n.pause-toolbar-item.toggled-on .glyph {\n    -webkit-mask-position: 0 -72px;\n}\n\n.breakpoint-toolbar-item.toggled-on .glyph {\n    -webkit-mask-position: -32px 0;\n}\n\n.breakpoint-toolbar-item .glyph {\n    -webkit-mask-position: 0 -24px;\n}\n\n.format-toolbar-item .glyph {\n    -webkit-mask-position: -256px -24px;\n}\n\n.format-toolbar-item.toggled .glyph {\n    background-color: rgb(66, 129, 235);\n}\n\n.garbage-collect-toolbar-item .glyph {\n    -webkit-mask-position: -128px -24px;\n}\n\n.histogram-toolbar-item .glyph {\n    -webkit-mask-position: -160px -48px;\n}\n\n.flame-chart-toolbar-item .glyph {\n    -webkit-mask-position: -192px -48px;\n}\n\n.filter-toolbar-item > .glyph {\n    -webkit-mask-position: -32px -48px;\n}\n\n.filter-toolbar-item.toggled-shown .glyph {\n    background-color: rgb(66, 129, 235) !important;\n}\n\n.filter-toolbar-item.toggled-shown {\n    background-color: #f3f3f3;\n}\n\n.filter-toolbar-item.toggled-active .glyph {\n    background-color: rgb(216, 0, 0);\n}\n\n.waterfall-toolbar-item .glyph {\n    -webkit-mask-position: -128px -48px;\n}\n\n.pan-toolbar-item .glyph {\n    -webkit-mask-position: -98px -120px;\n}\n\n.center-toolbar-item .glyph {\n    -webkit-mask-position: -128px -120px;\n}\n\n.rotate-toolbar-item .glyph {\n    -webkit-mask-position: -160px -120px;\n}\n\n.pin-toolbar-item .glyph {\n    -webkit-mask-position: -256px -120px;\n}\n\n.pin-toolbar-item.toggled-on,\n.animation-toolbar-item.toggled-on {\n    background-color: #f3f3f3;\n}\n\n.animation-toolbar-item .glyph {\n    -webkit-mask-position: -192px -120px;\n}\n\n.eyedropper-toolbar-item .glyph {\n    -webkit-mask-position: -288px -120px;\n}\n\n.add-toolbar-item .glyph {\n    -webkit-mask-position: -224px -120px;\n}\n\n.pause-outline-toolbar-item .glyph {\n    -webkit-mask-position: -320px 0px;\n}\n\n.replay-outline-toolbar-item .glyph {\n    -webkit-mask-position: -320px -24px;\n}\n\n.play-outline-toolbar-item .glyph {\n    -webkit-mask-position: -320px -48px;\n}\n\n.case-sensitive-search-toolbar-item.toggled-on .toolbar-button-text {\n    color: rgb(94, 146, 233);\n}\n\n.regex-search-toolbar-item.toggled-on {\n    color: rgb(66, 129, 235);\n}\n\n.regex-search-toolbar-item.toggled-on .toolbar-button-text {\n    color: rgb(94, 146, 233);\n}\n\n.playback-rate-button.toggled-on > .toolbar-button-text {\n    color: rgb(66, 129, 235);\n}\n\nbutton.playback-rate-button {\n    width: auto;\n    margin-right: 10px;\n}\n\n/*# sourceURL=ui/toolbar.css */";Runtime.cachedResources["ui/suggestBox.css"] = "/*\n * Copyright (C) 2011 Google Inc. All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n *     * Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above\n * copyright notice, this list of conditions and the following disclaimer\n * in the documentation and/or other materials provided with the\n * distribution.\n *     * Neither the name of Google Inc. nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n:host {\n    position: absolute;\n    background-color: transparent;\n    z-index: 1000;\n    pointer-events: none;\n    overflow: hidden;\n    display: flex;\n    flex-direction: row;\n}\n\n.suggest-box-left-spacer {\n    flex: 0 1 auto;\n}\n\n.suggest-box-horizontal {\n    display: flex;\n    flex-direction: column;\n    flex: 0 0 auto;\n    max-width: 300px;\n}\n\n.suggest-box-top-spacer {\n    flex: auto;\n}\n\n:host(.under-anchor) .suggest-box-top-spacer,\n:host(:not(.under-anchor)) .suggest-box-bottom-spacer {\n    flex: 0 0 auto;\n}\n\n.suggest-box {\n    background-color: #FFFFFF;\n    border: 1px solid rgb(66%, 66%, 66%);\n    pointer-events: auto;\n    margin-left: -3px;\n    overflow-x: hidden;\n    overflow-y: auto;\n    display: flex;\n    flex-direction: column;\n    flex: 0 0 auto;\n    border-radius: 5px 5px 5px 0;\n}\n\n:host(.under-anchor) .suggest-box {\n    border-radius: 0 5px 5px 5px;\n}\n\n.suggest-box .suggest-box-content-item {\n    padding: 1px;\n    margin: 0;\n    overflow: hidden;\n    text-overflow: ellipsis;\n    border: 1px solid transparent;\n    flex: 0 0 auto;\n    padding-right: 0;\n    white-space: nowrap;\n}\n\n.suggest-box .suggest-box-content-item .prefix {\n    font-weight: bold;\n}\n\n.suggest-box .suggest-box-content-item .spacer {\n    display: inline-block;\n    width: 20px;\n}\n\n.suggest-box .suggest-box-content-item.selected {\n    background-color: rgba(56, 121, 217, 0.1);\n}\n\n.suggest-box .suggest-box-content-item:hover:not(.selected) {\n    border: 1px solid rgb(204, 204, 204);\n}\n\n/*# sourceURL=ui/suggestBox.css */";Runtime.cachedResources["ui/tabbedPane.css"] = "/*\n * Copyright (C) 2006, 2007, 2008 Apple Inc.  All rights reserved.\n * Copyright (C) 2009 Anthony Ricaud <rik@webkit.org>\n * Copyright (C) 2011 Google Inc. All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * 1. Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above\n * copyright notice, this list of conditions and the following disclaimer\n * in the documentation and/or other materials provided with the\n * distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY GOOGLE INC. AND ITS CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GOOGLE INC.\n * OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n.tabbed-pane {\n    flex: auto;\n    overflow: hidden;\n}\n\n.tabbed-pane-content {\n    position: relative;\n    overflow: auto;\n    flex: auto;\n    display: flex;\n    flex-direction: column;\n}\n\n.tabbed-pane-content.has-no-tabs {\n    background-color: lightgray;\n}\n\n.tabbed-pane-placeholder {\n    font-size: 14px;\n    text-align: center;\n    margin-top: 20px;\n    text-shadow: rgba(255, 255, 255, 0.75) 0 1px 0;\n}\n\n.tabbed-pane-header {\n    display: flex;\n    flex: 0 0 27px;\n    border-bottom: 1px solid #ccc;\n    overflow: hidden;\n    width: 100%;\n    background-color: #f3f3f3;\n}\n\n.tabbed-pane-header-contents {\n    flex: auto;\n    pointer-events: none;\n    margin-left: 5px;\n    position: relative;\n}\n\n.tabbed-pane-header-contents > * {\n    pointer-events: initial;\n}\n\n.tabbed-pane-header-tab-icon {\n    margin-right: 2px;\n}\n\n.tabbed-pane-header-tab {\n    float: left;\n    margin-top: 2px;\n    padding: 2px 4px 2px 4px;\n    height: 24px;\n    border: 1px solid transparent;\n    border-bottom: none;\n    line-height: 15px;\n    white-space: nowrap;\n    cursor: default;\n    display: flex;\n    align-items: center;\n    color: #5a5a5a;\n}\n\n.tabbed-pane-header-tab:hover {\n    color: #333;\n}\n\n.tabbed-pane-header-tab-title {\n    text-overflow: ellipsis;\n    overflow: hidden;\n}\n\n.tabbed-pane-header-tab.measuring {\n    visibility: hidden;\n}\n\n.tabbed-pane-header-tab.selected {\n    border: 1px solid #ccc;\n    border-bottom: none;\n    color: #333;\n}\n\n.tabbed-pane-header-tab.selected {\n    background: white;\n    border-top-color: #ccc;\n}\n\n.tabbed-pane-header-tab .tabbed-pane-close-button {\n    display: inline-block;\n    position: relative;\n    top: 2px;\n    left: 1px;\n    margin-left: 2px;\n    margin-top: -3px;\n    visibility: hidden;\n}\n\n.tabbed-pane-header-tab:hover .tabbed-pane-close-button,\n.tabbed-pane-header-tab.selected .tabbed-pane-close-button {\n    visibility: visible;\n}\n\n.tabbed-pane-header-tabs-drop-down-container {\n    float: left;\n    position: relative;\n    vertical-align: bottom;\n    line-height: 24px;\n    opacity: 0.8;\n    color: inherit;\n    font-size: 133%;\n    padding: 0 7px;\n    cursor: default;\n    height: 25px;\n}\n\n.tabbed-pane-header-tabs-drop-down-container:hover {\n    background-color: rgba(105, 105, 105, 0.1);\n}\n\n.tabbed-pane-header-tabs-drop-down-container.measuring {\n    visibility: hidden;\n}\n\n.tabbed-pane-header-tabs-drop-down-container:hover {\n    opacity: 1.0;\n}\n\n.tabbed-pane-header-tabs-drop-down-container:active {\n    opacity: 0.8;\n}\n\n/* Web page style */\n\n.tabbed-pane-shadow.vertical-tab-layout {\n    flex-direction: row !important;\n}\n\n.tabbed-pane-shadow.vertical-tab-layout .tabbed-pane-header {\n    background-color: transparent;\n    border: none transparent !important;\n    width: auto;\n    flex: 0 0 auto;\n    flex-direction: column;\n    padding-top: 10px;\n}\n\n.tabbed-pane-shadow.vertical-tab-layout .tabbed-pane-content {\n    padding: 10px 10px 10px 0;\n    overflow-x: hidden;\n}\n\n.tabbed-pane-shadow.vertical-tab-layout .tabbed-pane-header-contents {\n    margin: 0;\n    flex: none;\n}\n\n.tabbed-pane-shadow.vertical-tab-layout .tabbed-pane-header-tabs {\n    display: flex;\n    flex-direction: column;\n    width: 120px;\n}\n\n.tabbed-pane-shadow.vertical-tab-layout .tabbed-pane-header-tab {\n    background-color: transparent;\n    border: none transparent;\n    font-weight: normal;\n    text-shadow: none;\n    color: #777;\n    height: 26px;\n    padding-left: 10px;\n    border-left: 6px solid transparent;\n    margin: 0;\n    display: flex;\n    align-items: center;\n}\n\n.tabbed-pane-shadow.vertical-tab-layout .tabbed-pane-header-tab:not(.selected) {\n    cursor: pointer !important;\n}\n\n.tabbed-pane-shadow.vertical-tab-layout .tabbed-pane-header-tab.selected {\n    color: inherit;\n    border: none transparent;\n    border-left: 6px solid #666;\n}\n\n.tabbed-pane-tab-slider {\n    height: 2px;\n    position: absolute;\n    bottom: -1px;\n    background-color: #3E82F7;\n    left: 0;\n    z-index: 50;\n    transform-origin: 0 0;\n    transition: transform 150ms cubic-bezier(0, 0, 0.2, 1);\n    visibility: hidden;\n}\n\n.tabbed-pane-tab-slider.enabled {\n    visibility: visible;\n}\n\n.tabbed-pane-header.tabbed-pane-no-header-background {\n    background-color: transparent;\n}\n\n/*# sourceURL=ui/tabbedPane.css */";Runtime.cachedResources["ui/textButton.css"] = "/*\n * Copyright (c) 2014 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    background-image: linear-gradient(hsl(0, 0%, 93%), hsl(0, 0%, 93%) 38%, hsl(0, 0%, 87%));\n    border: 1px solid hsla(0, 0%, 0%, 0.25);\n    border-radius: 2px;\n    box-shadow: 0 1px 0 hsla(0, 0%, 0%, 0.08), inset 0 1px 2px hsla(0, 100%, 100%, 0.75);\n    color: hsl(0, 0%, 27%);\n    font-size: 12px;\n    margin: 0 1px 0 0;\n    text-shadow: 0 1px 0 hsl(0, 0%, 94%);\n    min-height: 2em !important;\n    padding-left: 10px;\n    padding-right: 10px;\n    -webkit-user-select: none;\n    flex: none;\n}\n\n:host-context(body.inactive),\n:host(:disabled) {\n    background-image: linear-gradient(#f1f1f1, #f1f1f1 38%, #e6e6e6);\n    border-color: rgba(80, 80, 80, 0.2);\n    box-shadow: 0 1px 0 rgba(80, 80, 80, 0.08), inset 0 1px 2px rgba(255, 255, 255, 0.75);\n    color: #aaa;\n}\n\n:host(:not(:disabled):hover) {\n    background-image: linear-gradient(hsl(0, 0%, 94%), hsl(0, 0%, 94%) 38%, hsl(0, 0%, 88%));\n    border-color: hsla(0, 0%, 0%, 0.3);\n    box-shadow: 0 1px 0 hsla(0, 0%, 0%, 0.12), inset 0 1px 2px hsla(0, 100%, 100%, 0.95);\n    color: hsl(0, 0%, 0%);\n}\n\n:host(:not(:disabled):active) {\n    background-image: linear-gradient(hsl(0, 0%, 91%), hsl(0, 0%, 91%) 38%, hsl(0, 0%, 84%));\n    box-shadow: none;\n    text-shadow: none;\n}\n\n:host(:not(:disabled):focus) {\n    -webkit-transition: border-color 200ms;\n    border-color: rgb(77, 144, 254);\n    outline: none;\n}\n\n/*# sourceURL=ui/textButton.css */";Runtime.cachedResources["ui/textPrompt.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.text-prompt-editing {\n    -webkit-user-select: text;\n    box-shadow: rgba(0, 0, 0, .5) 3px 3px 4px;\n    outline: 1px solid rgb(66%, 66%, 66%) !important;\n    background-color: white;\n    -webkit-user-modify: read-write-plaintext-only;\n    text-overflow: clip !important;\n    padding-left: 2px;\n    margin-left: -2px;\n    padding-right: 2px;\n    margin-right: -2px;\n    margin-bottom: -1px;\n    padding-bottom: 1px;\n    opacity: 1.0 !important;\n}\n\n.text-prompt-editing,\n.text-prompt-editing ::content * {\n    color: #222 !important;\n    text-decoration: none !important;\n    -webkit-user-modify: read-write-plaintext-only;\n}\n\n::content .auto-complete-text,\n.text-prompt-editing ::content .auto-complete-text {\n    color: rgb(128, 128, 128) !important;\n    -webkit-user-select: none;\n    -webkit-user-modify: read-only;\n}\n\n.text-prompt-editing ::content br {\n    display: none;\n}\n\n/*# sourceURL=ui/textPrompt.css */";Runtime.cachedResources["ui/treeoutline.css"] = "/*\n * Copyright 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.tree-outline {\n    padding: 0 0 4px 4px;\n    margin: 0;\n    z-index: 0;\n    position: relative;\n}\n\n.tree-outline li.hovered:not(.selected) .selection {\n    display: block;\n    left: 3px;\n    right: 3px;\n    background-color: rgba(56, 121, 217, 0.1);\n    border-radius: 5px;\n}\n\n.tree-outline li .selection {\n    display: none;\n    position: absolute;\n    left: 0;\n    right: 0;\n    height: 17px;\n    z-index: -1;\n    margin-top: -1px;\n}\n\n.tree-outline li.selected .selection {\n    display: block;\n    background-color: #ddd;\n}\n\n.tree-outline li.in-clipboard .highlight {\n    outline: 1px dotted darkgrey;\n}\n\n.tree-outline li.elements-drag-over .selection {\n    display: block;\n    margin-top: -2px;\n    border-top: 2px solid rgb(56, 121, 217);\n}\n\nol.tree-outline:focus li.selected .selection {\n    background-color: rgb(56, 121, 217);\n}\n\nol.tree-outline:focus li.parent.selected::before {\n    background-color: white;\n}\n\nol.tree-outline,\n.tree-outline ol {\n    list-style-type: none;\n}\n\n.tree-outline-no-padding {\n    padding: 0;\n}\n\n.tree-outline ol {\n    padding-left: 12px;\n}\n\n.tree-outline li {\n    text-overflow: ellipsis;\n    white-space: nowrap;\n    overflow: hidden;\n    min-height: 17px;\n    padding-top: 2px;\n}\n\nol.tree-outline:focus li.selected {\n    color: white;\n}\n\nol.tree-outline:focus li.selected * {\n    color: inherit;\n}\n\n.tree-outline li::before {\n    float: left;\n    -webkit-user-select: none;\n    -webkit-mask-image: url(Images/toolbarButtonGlyphs.png);\n    -webkit-mask-size: 352px 144px;\n    content: \"a\";\n    color: transparent;\n    text-shadow: none;\n    position: relative;\n    margin-right: 1px;\n    top: 1px;\n    width: 10px;\n    height: 10px;\n}\n\n.tree-outline li:not(.parent)::before {\n    background-color: transparent;\n}\n\n@media (-webkit-min-device-pixel-ratio: 1.5) {\n.tree-outline li::before {\n    -webkit-mask-image: url(Images/toolbarButtonGlyphs_2x.png);\n}\n} /* media */\n\n.tree-outline li::before {\n    -webkit-mask-position: -4px -96px;\n    background-color: rgb(110, 110, 110);\n}\n\n.tree-outline li.parent.expanded::before {\n    -webkit-mask-position: -20px -96px;\n}\n\n.tree-outline ol.children {\n    display: none;\n}\n\n.tree-outline ol.children.expanded {\n    display: block;\n}\n\n/*# sourceURL=ui/treeoutline.css */";Runtime.cachedResources["components/breakpointsList.css"] = "/*\n * Copyright (C) 2006, 2007, 2008 Apple Inc.  All rights reserved.\n * Copyright (C) 2009 Anthony Ricaud <rik@webkit.org>\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n *\n * 1.  Redistributions of source code must retain the above copyright\n *     notice, this list of conditions and the following disclaimer.\n * 2.  Redistributions in binary form must reproduce the above copyright\n *     notice, this list of conditions and the following disclaimer in the\n *     documentation and/or other materials provided with the distribution.\n * 3.  Neither the name of Apple Computer, Inc. (\"Apple\") nor the names of\n *     its contributors may be used to endorse or promote products derived\n *     from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS \"AS IS\" AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n.sidebar-pane .breakpoint-condition {\n    display: block;\n    margin-top: 4px;\n    margin-bottom: 4px;\n    margin-left: 23px;\n    margin-right: 8px;\n}\n\n.breakpoint-list .editing.being-edited {\n    overflow: hidden;\n    white-space: nowrap;\n}\n\n#breakpoint-condition-input {\n    display: block;\n    margin-left: 0;\n    margin-right: 0;\n    outline: none !important;\n    border: 1px solid rgb(66%, 66%, 66%);\n}\n\nol.breakpoint-list {\n    -webkit-padding-start: 0;\n    list-style: none;\n    margin: 0;\n    padding-bottom: 3px;\n}\n\n.breakpoints-list-deactivated {\n    background-color: #eee;\n    opacity: 0.3;\n}\n\n.breakpoint-list li {\n    white-space: nowrap;\n    text-overflow: ellipsis;\n    overflow: hidden;\n    padding: 2px 0;\n}\n\n.breakpoint-list li:hover {\n    background-color: #eee;\n}\n\n.breakpoint-list .source-text {\n    white-space: nowrap;\n    text-overflow: ellipsis;\n    overflow: hidden;\n    margin: 2px 0 0 20px;\n}\n\n.sidebar-pane .breakpoint-hit {\n    background-color: rgb(255, 255, 194);\n}\n\nli.breakpoint-hit .breakpoint-hit-marker {\n    background-color: rgb(255, 255, 194);\n    height: 18px;\n    left: 0;\n    margin-top: -16px;\n    position: absolute;\n    right: 0;\n    z-index: -1;\n}\n\n.event-listener-breakpoints {\n    margin-top: 0;\n    padding: 2px 6px;\n    list-style: none;\n    min-height: 18px;\n}\n\n.event-listener-breakpoints ol {\n    display: none;\n    margin: 0;\n    -webkit-padding-start: 12px;\n    list-style: none;\n}\n\n.event-listener-breakpoints ol.expanded {\n    display: block;\n}\n\n.event-listener-breakpoints li {\n    margin-left: 12px;\n    text-overflow: ellipsis;\n    -webkit-user-select: text;\n    cursor: default;\n}\n\n.event-listener-breakpoints li.parent {\n    margin-left: 1px;\n}\n\n.event-listener-breakpoints li.parent::before {\n    -webkit-user-select: none;\n    background-image: url(Images/toolbarButtonGlyphs.png);\n    background-size: 352px 144px;\n    opacity: 0.5;\n    content: \"a\";\n    width: 8px;\n    float: left;\n    margin: 2px 2px 0 -2px;\n    color: transparent;\n    text-shadow: none;\n}\n\n@media (-webkit-min-device-pixel-ratio: 1.5) {\n.event-listener-breakpoints li.parent::before {\n    background-image: url(Images/toolbarButtonGlyphs_2x.png);\n}\n} /* media */\n\n.event-listener-breakpoints li.parent::before {\n    background-position: -4px -96px;\n}\n\n.event-listener-breakpoints li.parent.expanded::before {\n    background-position: -20px -96px;\n}\n\n.event-listener-breakpoints .children li {\n    margin-left: 12px;\n}\n\n.async-operations li > label {\n    float: left;\n}\n\n.async-operations li > div {\n    float: right;\n    margin: 2px 3px 0 2px;\n}\n\n.dom-breakpoints-list > li {\n    display: flex;\n}\n\n.dom-breakpoints-list .dom-breakpoint > div {\n    overflow: hidden;\n    text-overflow: ellipsis;\n}\n\n/*# sourceURL=components/breakpointsList.css */";Runtime.cachedResources["components/customPreviewSection.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.custom-expandable-section {\n    display: inline-flex;\n    flex-direction: column;\n}\n\n.custom-expandable-section-header::before {\n    -webkit-user-select: none;\n    background-image: url(Images/toolbarButtonGlyphs.png);\n    background-size: 352px 144px;\n    opacity: 0.5;\n    content: \"a\";\n    width: 8px;\n    margin-right: 4px;\n    padding-right: 2px;\n    color: transparent;\n    text-shadow: none;\n}\n\n.custom-expandable-section-header::before {\n    background-position: -4px -96px;\n}\n\n.custom-expandable-section-header.expanded::before {\n    background-position: -20px -96px;\n}\n\n.custom-expandable-section-standard-section {\n    display: inline-flex;\n}\n/*# sourceURL=components/customPreviewSection.css */";Runtime.cachedResources["components/eventListenersView.css"] = "/*\n * Copyright 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.event-listener-tree li {\n    padding: 2px 0 0 5px;\n}\n\n.event-listener-tree > li {\n    border-top: 1px solid #f0f0f0;\n}\n\n.event-listener-tree > li:first-of-type {\n    border-top: none;\n}\n\n.event-listener-tree {\n    padding-left: 0 !important;\n    padding-right: 3px;\n}\n\n.event-listener-tree li.parent::before {\n    top: 0 !important;\n}\n\n.event-listener-tree .name {\n    color: rgb(136, 19, 145);\n}\n\n.event-listener-tree-subtitle {\n    float: right;\n}\n\n/*# sourceURL=components/eventListenersView.css */";Runtime.cachedResources["components/domUtils.css"] = "/*\n * Copyright 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  display: inline;\n}\n\n.node-link {\n    text-decoration: underline;\n    cursor: pointer;\n    display: inline;\n}\n\n.stack-preview-async-description {\n    padding: 3px 0 1px;\n    font-style: italic;\n}\n\n.stack-preview-container .webkit-html-blackbox-link {\n    opacity: 0.6;\n}\n\n.stack-preview-container > tr {\n    height: 17px;\n}\n\n/*# sourceURL=components/domUtils.css */";Runtime.cachedResources["components/inspectorViewTabbedPane.css"] = "/*\n * Copyright 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.tabbed-pane-header {\n    background-color: #f3f3f3;\n    flex: 0 0 27px;\n    overflow: visible;\n}\n\n.tabbed-pane-header-tab,\n.tabbed-pane-header-tab.selected {\n    height: 26px;\n    margin: 0;\n    background: none;\n    border: none;\n    border-left: 2px solid transparent;\n    border-right: 2px solid transparent;\n    padding: 0 6px;\n}\n\n.tabbed-pane-header-tab {\n    color: #5a5a5a;\n}\n\n.tabbed-pane-header-tab.selected {\n    color: #333;\n    border-width: 0 2px 0 2px;\n    -webkit-border-image: url(Images/toolbarItemSelected.png) 0 2 0 2;\n}\n\n/*# sourceURL=components/inspectorViewTabbedPane.css */";Runtime.cachedResources["components/objectPropertiesSection.css"] = "/*\n * Copyright 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.object-properties-section .name {\n    color: rgb(136, 19, 145);\n    flex-shrink: 0;\n}\n\n.object-properties-section-separator {\n    flex-shrink: 0;\n}\n\n.object-properties-section-dimmed {\n    opacity: 0.6;\n}\n\n.object-properties-section {\n    padding: 0 0 0px 0px;\n    color: rgb(33,33,33) !important;\n}\n\n.object-properties-section li {\n    min-height: inherit;\n    line-height: 12px;\n    -webkit-user-select: text;\n}\n\n.object-properties-section li::before {\n    top: -1px;\n}\n\n.object-properties-section li.editing-sub-part {\n    padding: 3px 6px 8px;\n    margin: -1px -6px -8px -6px;\n    text-overflow: clip;\n}\n\n.object-properties-section li.editing {\n    margin-left: 10px;\n    text-overflow: clip;\n}\n\n.tree-outline ol.title-less-mode {\n    padding-left: 0px;\n}\n\n\n/*# sourceURL=components/objectPropertiesSection.css */";Runtime.cachedResources["components/objectValue.css"] = "/*\n * Copyright 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.object-value-scientific-notation-exponent {\n    flex-shrink: 0;\n}\n\n.object-value-scientific-notation-mantissa {\n    overflow: hidden;\n    text-overflow: ellipsis;\n    flex-shrink: 1;\n    min-width: 1ex;\n}\n\n.object-value-scientific-notation-number {\n    display: flex !important;\n}\n\n.object-value-node:hover {\n    background-color: rgba(56, 121, 217, 0.1);\n}\n\n.object-value-function::before {\n    content: \"function\";\n    color: rgb(170, 13, 145);\n    padding-right: 5px;\n}\n\n.object-value-function {\n    font-style: italic;\n}\n\n.object-value-function.linkified:hover {\n    background-color: rgba(0, 0, 0, 0.1);\n    cursor: pointer;\n}\n\n.object-value-object,\n.object-value-map,\n.object-value-set,\n.object-value-iterator,\n.object-value-generator,\n.object-value-node,\n.object-value-array {\n    position: relative;\n    vertical-align: top;\n    color: inherit;\n    display: inline-block;\n}\n\n.object-value-number,\n.object-value-boolean {\n    color: rgb(28, 0, 207);\n}\n\n.object-value-string,\n.object-value-regexp,\n.object-value-symbol {\n    color: rgb(196, 26, 22);\n    white-space: nowrap;\n    unicode-bidi: -webkit-isolate;\n}\n\n.object-value-node {\n    color: rgb(136, 18, 128);\n}\n\n.object-value-null,\n.object-value-undefined {\n    color: rgb(128, 128, 128);\n}\n\n.object-value {\n    text-overflow: ellipsis;\n    overflow: hidden;\n    -webkit-user-select: text;\n}\n\n.object-value-calculate-value-button:hover {\n    text-decoration: underline;\n}\n\n.object-value-object .section,\n.object-formatted-map .section,\n.object-value-set .section,\n.object-value-iterator .section,\n.object-value-generator .section,\n.object-value-node .section,\n.object-value-array .section {\n    position: static;\n}\n.object-value-object .section > .header::before {\n    margin-top: 0;\n}\n\n\n.object-value-object .properties-tree,\n.object-value-map .properties-tree,\n.object-value-set .properties-tree,\n.object-value-iterator .properties-tree,\n.object-value-generator .properties-tree,\n.object-value-node .properties-tree {\n    padding-left: 0 !important;\n}\n\n.object-value-preview-node,\n.section .object-value-node {\n    color: rgb(136, 18, 128);\n}\n\n.object-properties-section-custom-section {\n    display: inline-flex;\n    flex-direction: column;\n}\n/*# sourceURL=components/objectValue.css */";Runtime.cachedResources["emulation/accelerometer.css"] = "/*\n * Copyright (C) 2013 Google Inc. All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n *     * Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above\n * copyright notice, this list of conditions and the following disclaimer\n * in the documentation and/or other materials provided with the\n * distribution.\n *     * Neither the name of Google Inc. nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n.accelerometer-stage {\n    -webkit-perspective: 700px;\n    -webkit-perspective-origin: 50% 50%;\n    width: 200px;\n    height: 130px;\n}\n\n.accelerometer-box {\n    pointer-events:none;\n    margin-top: -54px;\n    margin-left: -40px;\n    position: absolute;\n    top: 50%;\n    left: 50%;\n    width: 80px;\n    height: 108px;\n    -webkit-transform-style: preserve-3d;\n}\n\n.accelerometer-box section {\n    margin-top: -54px;\n    margin-left: -40px;\n    position: absolute;\n    display: block;\n    overflow: hidden;\n    top: 50%;\n    left: 50%;\n    -webkit-transform-style: flat;\n    -webkit-box-shadow: inset 0 0 15px rgba(0, 0, 0, 0.7);\n}\n\n.accelerometer-box .front {\n    border:15px solid black;\n    width: 80px;\n    height: 107px;\n    background-color: gray;\n    transform: translate3d(0, 0, 10px);\n}\n\n.accelerometer-box .back {\n    width: 80px;\n    height: 107px;\n    background-color: black;\n    transform: rotateY(-180deg) translate3d(0, 0, 10px);\n}\n\n.accelerometer-box .top {\n    overflow: hidden;\n    width: 80px;\n    height: 20px;\n    background-color: #75CE89;\n    transform: rotateX(-90deg) translate3d(0, 0, -10px);\n}\n\n.accelerometer-box .bottom {\n    overflow: hidden;\n    width: 80px;\n    height: 20px;\n    background-color: #865C6C;\n    transform: rotateX(90deg) translate3d(0, 0, -97px);\n}\n\n.accelerometer-box .left {\n    width: 20px;\n    height: 107px;\n    background-color: #7992CB;\n    transform: rotateY(90deg) translate3d(0, 0, 70px);\n}\n\n.accelerometer-box .right {\n    width: 20px;\n    height: 107px;\n    background-color: #7992CB;\n    transform: rotateY(-90deg) translate3d(0, 0, 10px);\n}\n\n.accelerometer-axis-input-container {\n    margin-bottom: 10px;\n}\n\n.accelerometer-inputs-cell {\n    vertical-align: top;\n}\n\n.accelerometer-reset-button {\n    width: 100%;\n}\n/*# sourceURL=emulation/accelerometer.css */";Runtime.cachedResources["emulation/devicesSettingsTab.css"] = "/*\n * Copyright 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.devices-settings-tab .settings-tab.help-content {\n    display: flex;\n    flex-direction: column;\n    align-items: flex-start;\n    height: 100%;\n    margin: 0;\n}\n\n.devices-settings-tab .devices-title {\n    font-size: 120%;\n    color: #222;\n    flex: none;\n}\n\n.devices-settings-tab .devices-button-row {\n    flex: none;\n    display: flex;\n}\n\n.devices-settings-tab .devices-button-row button {\n    margin-right: 10px;\n    min-width: 120px;\n    flex: none;\n}\n\n.devices-settings-tab .devices-list {\n    width: 350px;\n    overflow-y: auto;\n    margin: 10px 0;\n    border: 1px solid rgb(231, 231, 231);\n    flex: auto 0 1;\n}\n\n.devices-settings-tab .devices-custom-separator {\n    background: rgb(231, 231, 231);\n    height: 1px;\n}\n\n.devices-settings-tab .devices-list-item {\n    padding: 3px 0 3px 10px;\n    height: 30px;\n    display: flex;\n    align-items: center;\n    cursor: pointer;\n}\n\n.devices-settings-tab .devices-list-item:hover {\n    background: hsl(0, 0%, 85%);\n}\n\n.devices-settings-tab .devices-list-checkbox {\n    height: 12px;\n    width: 12px;\n    margin: 3px 5px 2px 2px;\n    flex: none;\n    pointer-events: none;\n}\n\n.devices-settings-tab .devices-list-title {\n    overflow: hidden;\n    white-space: nowrap;\n    text-overflow: ellipsis;\n    flex: auto;\n    -webkit-user-select: none;\n    color: #aaa;\n}\n\n.devices-settings-tab .device-list-item-show .devices-list-title {\n    color: #222;\n}\n\n.devices-settings-tab .devices-list-remove,\n.devices-settings-tab .devices-list-edit {\n    background-image: url(Images/toolbarButtonGlyphs.png);\n    background-size: 352px 144px;\n    width: 32px;\n    height: 24px;\n    opacity: 0.5;\n    cursor: pointer;\n    flex: none;\n    visibility: hidden;\n}\n\n.devices-settings-tab .devices-list:not(.devices-list-editing) .devices-list-item:hover .devices-list-remove,\n.devices-settings-tab .devices-list-item:hover .devices-list-edit {\n    visibility: visible;\n}\n\n.devices-settings-tab .devices-list-remove:hover,\n.devices-settings-tab .devices-list-edit:hover {\n    opacity: 0.7;\n}\n\n@media (-webkit-min-device-pixel-ratio: 1.5) {\n.devices-settings-tab .devices-list-remove,\n.devices-settings-tab .devices-list-edit {\n    background-image: url(Images/toolbarButtonGlyphs_2x.png);\n}\n} /* media */\n\n.devices-settings-tab .devices-list-remove {\n    background-position: -128px -24px;\n}\n\n.devices-settings-tab .devices-list-edit {\n    background-position: -224px -72px;\n}\n\n.devices-settings-tab .devices-edit-container {\n    display: flex;\n    flex-direction: row;\n    align-items: flex-start;\n    flex: none;\n    padding: 10px 20px 0 10px;\n    background: hsl(0, 0%, 95%);\n}\n\n.devices-settings-tab .devices-edit-checkbox {\n    height: 12px;\n    width: 12px;\n    margin: 3px 5px 2px 2px;\n    flex: none;\n    cursor: pointer;\n}\n\n.devices-settings-tab .devices-edit-fields {\n    flex: auto;\n    display: flex;\n    flex-direction: column;\n    align-items: stretch;\n}\n\n.devices-settings-tab .devices-edit-fields input {\n    margin-right: 10px;\n}\n\n.devices-settings-tab .devices-edit-fields input.error-input {\n    outline: auto 2px red;\n    background-color: white;\n}\n\n.devices-settings-tab .devices-edit-fields > * {\n    flex: none;\n    margin-bottom: 10px;\n}\n\n.devices-settings-tab .devices-edit-buttons > button {\n    margin-right: 10px;\n}\n\n\n/*# sourceURL=emulation/devicesSettingsTab.css */";Runtime.cachedResources["emulation/responsiveDesignView.css"] = "/*\n * Copyright 2014 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.responsive-design {\n    position: relative;\n    background-color: rgb(0, 0, 0);\n    overflow: hidden;\n}\n\n.responsive-design-view {\n    overflow: hidden;\n}\n\n.responsive-design-canvas {\n    pointer-events: none;\n}\n\n.responsive-design-sliders-container {\n    position: absolute;\n    overflow: visible;\n}\n\n.responsive-design-generic-outline-container {\n    position: absolute;\n    overflow: hidden;\n    top: 0;\n    left: 0;\n    right: -19px;\n    bottom: -19px;\n}\n\n.responsive-design-generic-outline {\n    position: absolute;\n    top: -10px;\n    left: -10px;\n    right: 5px;\n    bottom: 5px;\n    border-radius: 8px;\n    background-color: rgb(51, 51, 51);\n    box-shadow: rgb(20, 20, 20) 3px 3px 4px;\n}\n\n.responsive-design-slider-width {\n    position: absolute;\n    top: 0;\n    bottom: 0;\n    right: -14px;\n    width: 14px;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n}\n\n.responsive-design-slider-height {\n    position: absolute;\n    left: 0;\n    right: 0;\n    bottom: -14px;\n    height: 14px;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n}\n\n.responsive-design-slider-corner {\n    position: absolute;\n    right: -14px;\n    width: 14px;\n    bottom: -14px;\n    height: 14px;\n}\n\n.responsive-design-thumb-handle {\n    content: url(Images/toolbarResizerHorizontal.png);\n    pointer-events: none;\n}\n\n.responsive-design-slider-height .responsive-design-thumb-handle  {\n    transform: rotate(90deg);\n}\n\n.responsive-design-page-container {\n    background-color: #171717;\n}\n\n.responsive-design-page-scale-container {\n    position: absolute !important;\n    top: 0;\n    right: 0;\n    padding: 10px;\n    background-color: rgba(0, 0, 0, 0.3);\n    align-items: center;\n}\n\n.responsive-design-page-scale-label {\n    display: block;\n    height: 20px;\n    margin: 0 4px;\n    padding-top: 3px;\n    color: white;\n    cursor: default !important;\n}\n\n.responsive-design-page-scale-container .responsive-design-page-scale-button > .glyph {\n    display: block;\n    width: 18px;\n    height: 18px;\n    border: 1px solid transparent;\n    border-radius: 2px;\n}\n\n.responsive-design-page-scale-container .responsive-design-page-scale-button:not(:disabled):hover {\n    box-shadow: rgb(255, 255, 255) 0 0 3px;\n}\n\n.responsive-design-page-scale-container .responsive-design-page-scale-button {\n    border: none;\n    background-color: transparent;\n    padding: 2px 0 0 0;\n}\n\n.responsive-design-page-scale-container .responsive-design-page-scale-button > .glyph {\n    background-color: rgb(180, 180, 180);\n    -webkit-mask-image: url(Images/responsiveDesign.png);\n    -webkit-mask-size: 112px 16px;\n    opacity: 1;\n}\n\n@media (-webkit-min-device-pixel-ratio: 1.5) {\n.responsive-design-page-scale-container .responsive-design-page-scale-button > .glyph {\n    -webkit-mask-image: url(Images/responsiveDesign_2x.png);\n}\n} /* media */\n\n.responsive-design-page-scale-increase > .glyph {\n    -webkit-mask-position: -80px 0;\n}\n\n.responsive-design-page-scale-decrease > .glyph {\n    -webkit-mask-position: -96px 0;\n}\n\n/* Toolbar */\n\n.responsive-design-toolbar {\n    display: flex;\n    flex: none;\n    background: linear-gradient(to bottom, rgb(83, 81, 81), rgb(59, 59, 59));\n    color: rgb(255, 255, 255);\n    overflow: hidden;\n    border-bottom: 1px solid rgb(71, 71, 71);\n}\n\n.responsive-design-separator {\n    flex: none;\n    width: 3px;\n    background-color: rgb(46, 46, 46);\n    border-right: 1px solid rgb(75, 75, 75);\n}\n\n.responsive-design-section {\n    display: flex;\n    flex: none;\n    flex-direction: column;\n    white-space: nowrap;\n    align-items: stretch;\n    justify-content: flex-start;\n    padding-top: 1px;\n}\n\n.responsive-design-section-decorator {\n    height: 2px;\n    margin-left: -2px;\n    margin-right: -1px;\n    position: relative;\n}\n\n.responsive-design-suite {\n    display: flex;\n    flex-direction: row;\n    padding: 2px 11px;\n    color: rgb(180, 180, 180);\n}\n\n.responsive-design-suite.responsive-design-suite-top {\n    color: rgb(255, 255, 255);\n}\n\n.responsive-design-suite-separator {\n    flex: none;\n    width: 1px;\n    background-color: rgb(43, 43, 43);\n    margin: 0 6px;\n}\n\n.responsive-design-suite > div:not(.responsive-design-suite-separator) {\n    flex: none;\n    display: flex;\n    flex-direction: row;\n    align-items: center;\n    justify-content: space-between;\n    height: 23px;\n    overflow: hidden;\n}\n\n/* Toolbar controls */\n\n.responsive-design-toolbar fieldset,\n.responsive-design-toolbar p {\n    margin: 0;\n    border: 0;\n    padding: 0;\n    display: inline-block;\n}\n\n.responsive-design-toolbar .field-error-message {\n    display: none;\n}\n\n.responsive-design-toolbar label {\n    cursor: default !important;\n    margin: 0 2px;\n}\n\n.responsive-design-toolbar input[type='text'] {\n    text-align: left;\n    background-color: transparent;\n    border: none;\n    margin: 0 1px 1px 0;\n    padding: 3px 2px;\n}\n\n.responsive-design-toolbar input[type='text'].numeric {\n    text-align: center;\n}\n\n.responsive-design-toolbar input:focus::-webkit-input-placeholder {\n    color: transparent !important;\n}\n\n.responsive-design-toolbar fieldset:disabled input,\n.responsive-design-toolbar fieldset:disabled button {\n    opacity: 0.7;\n}\n\n.responsive-design-toolbar input.error-input {\n    color: red !important;\n    text-decoration: line-through;\n}\n\n.responsive-design-toolbar select {\n    height: 18px;\n    background-color: rgb(87, 87, 87);\n    border: 0;\n    margin-left: 10px;\n    line-height: 16px;\n}\n\n.responsive-design-toolbar input:focus {\n    background-color: rgb(81, 81, 81);\n}\n\n/* Toolbar icons */\n\n.responsive-design-icon {\n    background-color: rgb(180, 180, 180);\n    -webkit-mask-image: url(Images/responsiveDesign.png);\n    -webkit-mask-size: 112px 16px;\n}\n\n.responsive-design-icon {\n    display: inline-block;\n    width: 16px;\n    height: 16px;\n    position: relative;\n    top: 3px;\n}\n\ndiv.responsive-design-icon:disabled {\n    opacity: 1 !important;\n}\n\n@media (-webkit-min-device-pixel-ratio: 1.5) {\n.responsive-design-icon {\n    -webkit-mask-image: url(Images/responsiveDesign_2x.png);\n}\n} /* media */\n\n.responsive-design-icon-resolution {\n    -webkit-mask-position: 0 0;\n}\n\n.responsive-design-icon-dpr {\n    -webkit-mask-position: -16px 0;\n}\n\n.responsive-design-icon-swap {\n    background-color: rgb(255, 170, 0);\n    -webkit-mask-position: -32px 0;\n    -webkit-appearance: none;\n    padding: 0;\n    border: 0;\n}\n\n.responsive-design-icon-swap {\n    margin-left: 1px;\n    top: 4px;\n}\n\n.responsive-design-icon-swap:hover {\n    background-color: rgb(255, 180, 0);\n}\n\n.responsive-design-icon-swap:active {\n    opacity: 0.8;\n}\n\n/* Buttons section */\n\n.responsive-design-section-buttons {\n    padding: 4px 0 0 0;\n    background: rgb(17, 17, 17);\n}\n\n.responsive-design-more-button-container {\n    flex: auto;\n    display: flex;\n    justify-content: flex-end;\n    align-items: flex-end;\n    overflow: hidden;\n}\n\n.responsive-design-more-button {\n    -webkit-appearance: none;\n    border: 0;\n    background-color: transparent;\n    color: white;\n    opacity: 0.8;\n    font-size: 16px;\n    text-shadow: black 1px 1px;\n}\n\n.responsive-design-more-button:hover {\n    opacity: 1;\n}\n\n.responsive-design-more-button:active {\n    opacity: 0.8;\n}\n\n/* Device section */\n\n.responsive-design-section-device .responsive-design-section-decorator {\n    background: linear-gradient(to bottom, rgb(255, 186, 68), rgb(255, 119, 0));\n    margin-left: 0;\n}\n\n.responsive-design-section-device .device-select {\n    width: 140px;\n}\n\n.responsive-design-section-device .mode-container {\n    display: inline-block;\n    width: 116px;\n    padding: 0 10px;\n}\n\n.responsive-design-section-device .mode-select select {\n    width: 82px;\n}\n\n.responsive-design-section-device .mode-select label {\n    margin-left: 4px;\n    color: rgb(255, 156, 0);\n    position: relative;\n    top: 1px;\n}\n\n.responsive-design-section-device input[type='text'],\n.responsive-design-section-device input[type='text']::-webkit-input-placeholder,\n.responsive-design-section-device select {\n    color: rgb(255, 156, 0);\n}\n\n.responsive-design-section-device input[type='checkbox']:checked:after {\n    background: rgb(255, 156, 0);\n}\n\n/* Network section */\n\n.responsive-design-section-network select {\n    width: 145px;\n}\n\n.responsive-design-section-network input[type='text'] {\n    width: 182px;\n    margin-left: 5px;\n    text-overflow: ellipsis;\n}\n\n.responsive-design-section-network input[type='text'],\n.responsive-design-section-network input[type='text']::-webkit-input-placeholder,\n.responsive-design-section-network select {\n    color: rgb(65, 175, 255);\n}\n\n.responsive-design-section-network .responsive-design-section-decorator {\n    background: linear-gradient(to bottom, rgb(77, 170, 243), rgb(0, 130, 255));\n}\n\n/* Warning message */\n\n.responsive-design-warning {\n    position: absolute;\n    left: 0;\n    right: 0;\n    top: 0;\n    overflow: hidden;\n    border-bottom: 1px solid rgb(187, 187, 187);\n}\n\n/* Media query inspector */\n\n.responsive-design-media-container {\n    position: absolute;\n    right: 0;\n    top: 0;\n    padding-bottom: 5px;\n    overflow: hidden;\n}\n\n/* Media query bars */\n\n.media-inspector-marker-container {\n    position: relative;\n    height: 14px;\n    margin: 2px 0;\n}\n\n.media-inspector-marker {\n    position: absolute;\n    top: 1px;\n    bottom: 1px;\n    white-space: nowrap;\n    border-radius: 2px;\n}\n\n.media-inspector-marker-inactive {\n    -webkit-filter: brightness(80%);\n}\n\n.media-inspector-marker:hover {\n    top: -1px;\n    bottom: -1px;\n    -webkit-filter: brightness(115%) !important;\n}\n\n.media-inspector-marker-max-width {\n    background: linear-gradient(to left, rgba(255, 255, 255, 0.27), rgba(0,0,0,0) 30px), linear-gradient(to bottom, rgb(72, 139, 249), rgb(26, 113, 233));\n    border-radius: 0 2px 2px 0;\n    border-right: 2px solid rgb(171, 207, 255);\n}\n\n.media-inspector-marker-min-max-width {\n    background: linear-gradient(to right, rgba(255, 255, 255, 0.27), rgba(0,0,0,0) 30px), linear-gradient(to left, rgba(255, 255, 255, 0.27), rgba(0,0,0,0) 30px), linear-gradient(to bottom, rgb(112, 174, 7), rgb(3, 131, 0));\n    border-radius: 2px;\n    border-left: 2px solid rgb(80, 226, 40);\n    border-right: 2px solid rgb(80, 226, 40);\n}\n\n.media-inspector-marker-min-max-width:hover {\n    z-index: 1;\n}\n\n.media-inspector-marker-min-width {\n    background: linear-gradient(to right, rgba(255, 255, 255, 0.27), rgba(0,0,0,0) 30px), linear-gradient(to bottom, rgb(222, 129, 30), rgb(204, 104, 31));\n    border-radius: 2px 0 0 2px;\n    border-left: 2px solid rgb(255, 181, 142);\n}\n\n/* Media query labels */\n\n.media-inspector-marker:not(:hover) .media-inspector-marker-label-container {\n    display: none;\n}\n\n.media-inspector-marker-label-container {\n    position: absolute;\n}\n\n.media-inspector-marker-label-container-left {\n    left: -2px;\n}\n\n.media-inspector-marker-label-container-right {\n    right: -2px;\n}\n\n.media-inspector-marker-label {\n    color: #eee;\n    position: absolute;\n    top: 1px;\n    bottom: 0;\n    font-size: 10px;\n    text-shadow: rgba(0, 0, 0, 0.6) 1px 1px;\n    pointer-events: none;\n}\n\n.media-inspector-label-right {\n    right: 4px;\n}\n\n.media-inspector-label-left {\n    left: 4px;\n}\n\n/*# sourceURL=emulation/responsiveDesignView.css */";Runtime.cachedResources["emulation/overrides.css"] = "/*\n * Copyright (C) 2013 Google Inc. All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n *     * Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above\n * copyright notice, this list of conditions and the following disclaimer\n * in the documentation and/or other materials provided with the\n * distribution.\n *     * Neither the name of Google Inc. nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n.overrides-view fieldset {\n    border: none;\n    padding: 0 0 5px 15px;\n}\n\n.overrides-view fieldset p {\n    display: inline-block;\n    padding: 0;\n    margin: 0;\n    border: 0;\n}\n\n.overrides-view fieldset p label {\n    display: inline-block;\n}\n\n.overrides-view .field-error-message {\n    display: none;\n}\n\n.overrides-view input[type='text']:focus::-webkit-input-placeholder {\n    color: transparent !important;\n}\n\n.overrides-view > .tabbed-pane {\n    overflow: hidden;\n}\n\n/* Network tab */\n\n.overrides-network fieldset {\n    padding-top: 5px;\n}\n\n.overrides-network fieldset p {\n    width: 100%;\n    margin-left: 2px;\n}\n\n.overrides-network fieldset select {\n    margin: 5px 0;\n}\n\n.overrides-network fieldset p label {\n    cursor: default;\n    margin-right: 5px;\n}\n\n.overrides-network fieldset input[type='text'] {\n    display: block;\n    width: 100%;\n    max-width: 400px;\n    min-width: 176px;\n    margin: 5px 0;\n}\n\n/* Device tab */\n\n.overrides-device {\n    width: 100%;\n}\n\n.overrides-device input.numeric {\n    text-align: right;\n}\n\n.overrides-device input[type=range] {\n    width: 100%;\n}\n\n.overrides-device > label {\n    display: block;\n    margin-bottom: 7px;\n    white-space: nowrap;\n}\n\n.overrides-device button {\n    margin: 0 3px;\n}\n\n.overrides-device label {\n    margin-bottom: 10px;\n}\n\n.overrides-device table {\n    margin-bottom: 5px;\n    white-space: nowrap !important;\n}\n\n.overrides-device > label {\n    margin-bottom: 4px;\n}\n\n.overrides-device .help-footnote {\n    border-top: 1px solid #EEEEEE;\n    margin: 0;\n    padding: 12px;\n}\n\n.overrides-view label {\n    display: flex;\n    height: auto;\n}\n\n.overrides-view fieldset[disabled] * {\n    cursor: default !important;\n}\n\n.overrides-device .overrides-device-model-section {\n    margin-bottom: 15px;\n    white-space: nowrap;\n}\n\n.overrides-device .overrides-device-model-section > span {\n    padding: 0 10px 0 3px;\n}\n\n.overrides-device .overrides-device-model-section select {\n    height: 20px;\n}\n\n.overrides-device .overrides-device-model-section select.device-select {\n    width: 180px;\n    margin-right: 6px;\n}\n\n.overrides-device .overrides-device-model-section .mode-container {\n    display: inline-block;\n    width: 140px;\n}\n\n/* Media tab */\n\n.overrides-media > label {\n    margin-bottom: 4px;\n}\n\n/* Sensors tab */\n\n.overrides-sensors > label {\n    margin-bottom: 10px;\n}\n\n.overrides-device, .overrides-media, .overrides-network, .overrides-sensors {\n    flex: none !important;\n}\n\n.overrides-sensors input {\n    text-align: right;\n}\n\n.tabbed-pane-header-tab.overrides-activate {\n    opacity: 0.8;\n}\n\n.tabbed-pane-header-tab.overrides-activate .tabbed-pane-header-tab-title::after {\n    padding-left: 3px;\n    content: \"\\2713\";\n    color: rgb(25, 100, 228);\n}\n\n.tabbed-pane-header-tab.overrides-activate.selected {\n    opacity: 1;\n}\n\n.overrides-view input[type=text]:enabled:focus,\n.overrides-view select:enabled:focus {\n    -webkit-transition: border-color 200ms;\n    border-color: rgb(77, 144, 254);\n    outline: none;\n}\n\n.overrides-view input[type=text],\n.overrides-view select {\n    border: 1px solid #bfbfbf;\n    border-radius: 2px;\n    box-sizing: border-box;\n    color: #444;\n    font: inherit;\n    border-width: 1px;\n}\n\n.overrides-view input[type=text] {\n    margin-left: 3px;\n    min-height: 2em;\n    padding: 3px;\n}\n\n.overrides-view input[readonly] {\n    background-color: rgb(235, 235, 228);\n}\n\n.overrides-view .overrides-footer {\n    flex: none;\n    padding: 0 0 1px 3px;\n    border-top: 1px solid rgb(203,203,203);\n    background-color: #eee;\n}\n\n.overrides-view .overrides-footer::before {\n    background-image: url(Images/toolbarButtonGlyphs.png);\n    background-size: 352px 144px;\n    width: 10px;\n    height: 10px;\n    content: \"\";\n    position: relative;\n    top: 2px;\n    background-position: -202px -107px;\n    float: left;\n    margin-right: 4px;\n}\n\n@media (-webkit-min-device-pixel-ratio: 1.5) {\n.overrides-view .overrides-footer::before {\n    background-image: url(Images/toolbarButtonGlyphs_2x.png);\n}\n} /* media */\n\n.overrides-view .overrides-footer label[is=dt-icon-label] {\n    margin-right: 3px;\n}\n\n.overrides-splash-screen {\n    padding: 10px 10px;\n    flex: auto;\n}\n\n.overrides-splash-screen .toolbar {\n    display: inline-block;\n    margin-left: -4px;\n    position: relative;\n    top: 8px;\n}\n\n#overrides-reset-button,\n#overrides-disable-button {\n    margin: 9px 0 0 17px;\n    display: block;\n    width: 60px;\n}\n\n.overrides-enable-button {\n    margin: 4px !important;\n}\n\n/*# sourceURL=emulation/overrides.css */";Runtime.startApplication("inspector");

原创粉丝点击