summaryrefslogtreecommitdiff
path: root/chromium/third_party/blink/renderer/devtools
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2019-07-31 15:50:41 +0200
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2019-08-30 12:35:23 +0000
commit7b2ffa587235a47d4094787d72f38102089f402a (patch)
tree30e82af9cbab08a7fa028bb18f4f2987a3f74dfa /chromium/third_party/blink/renderer/devtools
parentd94af01c90575348c4e81a418257f254b6f8d225 (diff)
downloadqtwebengine-chromium-7b2ffa587235a47d4094787d72f38102089f402a.tar.gz
BASELINE: Update Chromium to 76.0.3809.94
Change-Id: I321c3f5f929c105aec0f98c5091ef6108822e647 Reviewed-by: Michael Brüning <michael.bruning@qt.io>
Diffstat (limited to 'chromium/third_party/blink/renderer/devtools')
-rw-r--r--chromium/third_party/blink/renderer/devtools/BUILD.gn16
-rw-r--r--chromium/third_party/blink/renderer/devtools/OWNERS1
-rw-r--r--chromium/third_party/blink/renderer/devtools/PRESUBMIT.py44
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/Images/mediumIcons.pngbin4442 -> 4912 bytes
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/Images/mediumIcons_2x.pngbin9703 -> 10703 bytes
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/Images/src/mediumIcons.svg308
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/Images/src/optimize_png.hashes2
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/Images/src/svg2png.hashes2
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/Images/whatsnew.pngbin12180 -> 12134 bytes
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/Runtime.js19
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/Tests.js110
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/accessibility/accessibilityNode.css13
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/accessibility/accessibility_strings.grdp90
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/animation/animationTimeline.css13
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/animation/animation_strings.grdp39
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/audits2/Audits2Controller.js34
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/audits2/Audits2Panel.js16
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/audits2/Audits2ReportRenderer.js8
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/audits2/Audits2StartView.js13
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/audits2/Audits2StatusView.js4
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/audits2/audits2Dialog.css5
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/audits2/audits2Panel.css55
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/audits2/audits2_strings.grdp148
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/audits2/lighthouse/report.css897
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/audits2/lighthouse/report.js1130
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/audits2/lighthouse/templates.html635
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/audits2_worker/lighthouse/lighthouse-dt-bundle.js4662
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/bindings/bindings_strings.grdp9
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/browser_debugger/browser_debugger_strings.grdp66
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/browser_sdk/browser_sdk_strings.grdp15
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/changes/changes_strings.grdp36
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/color_picker/color_picker_strings.grdp51
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/color_picker/spectrum.css41
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/common/UIString.js15
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/components/Linkifier.js1
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/components/components_strings.grdp54
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/console/ConsoleView.js52
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/console/consoleSidebar.css4
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/console/console_strings.grdp294
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/console/module.json18
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/console_counters/console_counters_strings.grdp21
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/cookie_table/CookiesTable.js35
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/cookie_table/cookie_table_strings.grdp33
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/coverage/coverage_strings.grdp61
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/data_grid/data_grid_strings.grdp21
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/devices/DevicesView.js5
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/devices/devicesView.css7
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/devices/devices_strings.grdp111
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/devtools_app.json3
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/devtools_compatibility.js8
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/elements/ElementsTreeElement.js3
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/elements/ElementsTreeOutline.js2
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/elements/EventListenersWidget.js1
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/elements/StylePropertyTreeElement.js117
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/elements/StylesSidebarPane.js54
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/elements/elementsTreeOutline.css5
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/elements/elements_strings.grdp327
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/elements_test_runner/ElementsTestRunner.js18
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/emulated_devices/emulated_devices_strings.grdp102
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/emulation/SensorsView.js3
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/emulation/devicesSettingsTab.css6
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/emulation/emulation_strings.grdp279
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/emulation/geolocationsSettingsTab.css6
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/emulation/sensors.css12
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/event_listeners/event_listeners_strings.grdp18
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/externs.js18
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/har_importer/HARFormat.js24
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/har_importer/HARImporter.js18
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/heap_snapshot_worker/heap_snapshot_worker_strings.grdp27
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/help/ReleaseNoteText.js23
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/help/help_strings.grdp21
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/host/InspectorFrontendHost.js7
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/host/InspectorFrontendHostAPI.js5
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/host/Platform.js2
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/host/host_strings.grdp6
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/inline_editor/bezierEditor.css4
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/inline_editor/inline_editor_strings.grdp24
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/inspector_main/inspector_main_strings.grdp96
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/js_profiler/js_profiler_strings.grdp6
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/langpacks/devtools_ui_strings.grd72
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/layer_viewer/PaintProfilerView.js3
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/layer_viewer/layer_viewer_strings.grdp213
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/layer_viewer/paintProfiler.css6
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/layers/layers_strings.grdp9
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/main/Main.js5
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/main/main_strings.grdp129
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/mobile_throttling/mobile_throttling_strings.grdp108
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/network/NetworkDataGridNode.js4
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/network/NetworkLogView.js31
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/network/NetworkPanel.js75
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/network/RequestHeadersView.js16
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/network/ResourceWebSocketFrameView.js11
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/network/networkConfigView.css4
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/network/networkLogView.css1
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/network/networkPanel.css37
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/network/network_strings.grdp768
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/network/requestHeadersView.css8
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/network/webSocketFrameView.css20
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/node_debugger/node_debugger_strings.grdp6
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/node_main/NodeConnectionsPanel.js2
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/node_main/nodeConnectionsPanel.css11
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/node_main/node_main_strings.grdp18
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/object_ui/objectPopover.css6
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/object_ui/objectValue.css6
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/object_ui/object_ui_strings.grdp51
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/perf_ui/PieChart.js67
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/perf_ui/filmStripView.css9
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/perf_ui/perf_ui_strings.grdp60
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/perf_ui/pieChart.css45
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/performance_monitor/PerformanceMonitor.js6
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/performance_monitor/performanceMonitor.css12
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/performance_monitor/performance_monitor_strings.grdp36
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/performance_test_runner/TimelineDataTestRunner.js2
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/persistence/persistence_strings.grdp57
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/product_registry/product_registry_strings.grdp12
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/profiler/HeapProfileView.js3
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/profiler/HeapSnapshotView.js25
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/profiler/IsolateSelector.js75
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/profiler/LiveHeapProfileView.js78
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/profiler/ProfileLauncherView.js39
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/profiler/heapProfiler.css32
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/profiler/profileLauncherView.css91
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/profiler/profiler_strings.grdp439
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/profiler/profilesPanel.css89
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/protocol_monitor/protocol_monitor_strings.grdp27
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/quick_open/quick_open_strings.grdp21
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/resources/AppManifestView.js7
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/resources/ApplicationPanelSidebar.js101
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/resources/BackgroundServiceView.js163
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/resources/ClearStorageView.js17
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/resources/ResourcesPanel.js15
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/resources/ResourcesSection.js2
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/resources/ServiceWorkersView.js73
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/resources/backgroundServiceView.css28
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/resources/clearStorageView.css24
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/resources/indexedDBViews.css9
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/resources/module.json32
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/resources/resourcesPanel.css35
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/resources/resources_strings.grdp398
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/resources/serviceWorkerCacheViews.css9
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/resources/serviceWorkersView.css45
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/screencast/screencast_strings.grdp12
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/sdk/CSSMetadata.js63
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/sdk/ChildTargetManager.js3
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/sdk/ConsoleModel.js2
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/sdk/CookieModel.js5
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/sdk/DOMModel.js9
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/sdk/HARLog.js10
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/sdk/IsolateManager.js18
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/sdk/NetworkManager.js37
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/sdk/NetworkRequest.js21
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/sdk/ResourceTreeModel.js8
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/sdk/ScreenCaptureModel.js8
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/sdk/sdk_strings.grdp303
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/search/search_strings.grdp36
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/security/SecurityModel.js7
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/security/SecurityPanel.js93
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/security/mainView.css12
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/security/security_strings.grdp144
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/security_test_runner/SecurityTestRunner.js12
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/settings/FrameworkBlackboxSettingsTab.js15
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/settings/frameworkBlackboxSettingsTab.css4
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/settings/settingsScreen.css17
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/settings/settings_strings.grdp54
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/snippets/snippets_strings.grdp9
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/source_frame/SourceFrame.js2
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/source_frame/source_frame_strings.grdp75
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/sources/breakpointEditDialog.css5
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/sources/module.json2
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/sources/revisionHistory.css68
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/sources/serviceWorkersSidebar.css9
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/sources/sourcesPanel.css8
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/sources/sourcesView.css5
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/sources/sources_strings.grdp483
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/terminal/terminal_strings.grdp9
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/test_runner/TestRunner.js42
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/text_editor/text_editor_strings.grdp6
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/timeline/TimelineUIUtils.js15
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/timeline/timelinePanel.css87
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/timeline/timeline_strings.grdp942
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/timeline_model/timeline_model_strings.grdp9
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/ui/ARIAUtils.js26
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/ui/EmptyWidget.js8
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/ui/Icon.js4
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/ui/ReportView.js17
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/ui/ShortcutsScreen.js139
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/ui/SoftContextMenu.js11
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/ui/SoftDropDown.js13
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/ui/SuggestBox.js3
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/ui/TextPrompt.js8
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/ui/Tooltip.js9
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/ui/filter.css20
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/ui/inspectorCommon.css15
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/ui/inspectorSyntaxHighlight.css6
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/ui/inspectorSyntaxHighlightDark.css9
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/ui/reportView.css4
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/ui/splitWidget.css4
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/ui/treeoutline.css4
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/ui/ui_strings.grdp291
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/ui/viewContainers.css11
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/web_audio/AudioContextContentBuilder.js89
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/web_audio/AudioContextSelector.js157
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/web_audio/WebAudioModel.js115
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/web_audio/WebAudioView.js185
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/web_audio/audioContextSelector.css20
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/web_audio/module.json29
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/web_audio/webAudio.css97
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/web_audio/web_audio_strings.grdp30
-rw-r--r--chromium/third_party/blink/renderer/devtools/front_end/workspace/workspace_strings.grdp6
-rw-r--r--chromium/third_party/blink/renderer/devtools/package.json1
-rwxr-xr-xchromium/third_party/blink/renderer/devtools/scripts/build/build_release_applications.py3
-rw-r--r--chromium/third_party/blink/renderer/devtools/scripts/check_gn.js4
-rw-r--r--chromium/third_party/blink/renderer/devtools/scripts/check_localizability.js174
-rw-r--r--chromium/third_party/blink/renderer/devtools/scripts/check_localizable_resources.js240
-rw-r--r--chromium/third_party/blink/renderer/devtools/scripts/localization_utils/check_localized_strings.js384
-rw-r--r--chromium/third_party/blink/renderer/devtools/scripts/localization_utils/localization_utils.js269
-rw-r--r--chromium/third_party/blink/renderer/devtools/scripts/localization_utils/md5.js157
-rw-r--r--chromium/third_party/blink/renderer/devtools/scripts/run_old_devtools/index.js5
-rw-r--r--chromium/third_party/blink/renderer/devtools/scripts/unused_css/index.js149
-rw-r--r--chromium/third_party/blink/renderer/devtools/scripts/unused_css/package.json11
220 files changed, 15582 insertions, 4076 deletions
diff --git a/chromium/third_party/blink/renderer/devtools/BUILD.gn b/chromium/third_party/blink/renderer/devtools/BUILD.gn
index 2db8281b9ab..a4c42c09620 100644
--- a/chromium/third_party/blink/renderer/devtools/BUILD.gn
+++ b/chromium/third_party/blink/renderer/devtools/BUILD.gn
@@ -255,6 +255,7 @@ all_devtools_files = [
"front_end/elements_test_runner/EditDOMTestRunner.js",
"front_end/elements_test_runner/ElementsPanelShadowSelectionOnRefreshTestRunner.js",
"front_end/elements_test_runner/ElementsTestRunner.js",
+ "front_end/elements_test_runner/module.json",
"front_end/elements_test_runner/SetOuterHTMLTestRunner.js",
"front_end/elements_test_runner/StylesUpdateLinksTestRunner.js",
"front_end/emulated_devices/module.json",
@@ -487,6 +488,7 @@ all_devtools_files = [
"front_end/persistence/FileSystemWorkspaceBinding.js",
"front_end/persistence/IsolatedFileSystem.js",
"front_end/persistence/IsolatedFileSystemManager.js",
+ "front_end/persistence/module.json",
"front_end/persistence/NetworkPersistenceManager.js",
"front_end/persistence/Persistence.js",
"front_end/persistence/PersistenceActions.js",
@@ -628,6 +630,7 @@ all_devtools_files = [
"front_end/sdk/TracingModel.js",
"front_end/sdk_test_runner/module.json",
"front_end/sdk_test_runner/PageMockTestRunner.js",
+ "front_end/search/module.json",
"front_end/search/SearchConfig.js",
"front_end/search/searchResultsPane.css",
"front_end/search/SearchResultsPane.js",
@@ -642,6 +645,7 @@ all_devtools_files = [
"front_end/security/sidebar.css",
"front_end/security_test_runner/module.json",
"front_end/security_test_runner/SecurityTestRunner.js",
+ "front_end/services/module.json",
"front_end/services/ServiceManager.js",
"front_end/settings/frameworkBlackboxSettingsTab.css",
"front_end/settings/FrameworkBlackboxSettingsTab.js",
@@ -694,13 +698,11 @@ all_devtools_files = [
"front_end/sources/NavigatorView.js",
"front_end/sources/OpenFileQuickOpen.js",
"front_end/sources/OutlineQuickOpen.js",
- "front_end/sources/revisionHistory.css",
"front_end/sources/scopeChainSidebarPane.css",
"front_end/sources/ScopeChainSidebarPane.js",
"front_end/sources/ScriptFormatterEditorAction.js",
"front_end/sources/ScriptOriginPlugin.js",
"front_end/sources/SearchSourcesView.js",
- "front_end/sources/serviceWorkersSidebar.css",
"front_end/sources/SimpleHistoryManager.js",
"front_end/sources/SnippetsPlugin.js",
"front_end/sources/SourceFormatter.js",
@@ -724,6 +726,7 @@ all_devtools_files = [
"front_end/sources_test_runner/SearchTestRunner.js",
"front_end/sources_test_runner/SourcesTestRunner.js",
"front_end/sources_test_runner/module.json",
+ "front_end/terminal/module.json",
"front_end/terminal/terminal.css",
"front_end/terminal/TerminalWidget.js",
"front_end/terminal/xterm.js/addons/fit/fit.js",
@@ -873,8 +876,16 @@ all_devtools_files = [
"front_end/ui/XLink.js",
"front_end/ui/XWidget.js",
"front_end/ui/ZoomManager.js",
+ "front_end/web_audio/AudioContextContentBuilder.js",
+ "front_end/web_audio/audioContextSelector.css",
+ "front_end/web_audio/AudioContextSelector.js",
+ "front_end/web_audio/module.json",
+ "front_end/web_audio/webAudio.css",
+ "front_end/web_audio/WebAudioModel.js",
+ "front_end/web_audio/WebAudioView.js",
"front_end/worker_main/WorkerMain.js",
"front_end/worker_main/module.json",
+ "front_end/worker_service/module.json",
"front_end/worker_service/ServiceDispatcher.js",
"front_end/workspace/FileManager.js",
"front_end/workspace/module.json",
@@ -1141,6 +1152,7 @@ generated_non_autostart_non_remote_modules = [
"$resources_out_dir/text_editor/text_editor_module.js",
"$resources_out_dir/timeline_model/timeline_model_module.js",
"$resources_out_dir/timeline/timeline_module.js",
+ "$resources_out_dir/web_audio/web_audio_module.js",
"$resources_out_dir/workspace_diff/workspace_diff_module.js",
]
diff --git a/chromium/third_party/blink/renderer/devtools/OWNERS b/chromium/third_party/blink/renderer/devtools/OWNERS
index f1601f59071..40f586c609e 100644
--- a/chromium/third_party/blink/renderer/devtools/OWNERS
+++ b/chromium/third_party/blink/renderer/devtools/OWNERS
@@ -1,4 +1,5 @@
dgozman@chromium.org
pfeldman@chromium.org
lushnikov@chromium.org
+einbinder@chromium.org
per-file BUILD.gn=*
diff --git a/chromium/third_party/blink/renderer/devtools/PRESUBMIT.py b/chromium/third_party/blink/renderer/devtools/PRESUBMIT.py
index 68de82a5442..f19b26668b1 100644
--- a/chromium/third_party/blink/renderer/devtools/PRESUBMIT.py
+++ b/chromium/third_party/blink/renderer/devtools/PRESUBMIT.py
@@ -94,16 +94,33 @@ def _CheckFormat(input_api, output_api):
]
-def _CheckDevtoolsLocalization(input_api, output_api): # pylint: disable=invalid-name
+def _CheckDevtoolsWithNodeScript(input_api, output_api, script_path, script_arguments=None): # pylint: disable=invalid-name
affected_front_end_files = _getAffectedFrontEndFiles(input_api)
if len(affected_front_end_files) == 0:
return []
else:
- affected_front_end_files = [
- input_api.os_path.join(input_api.PresubmitLocalPath(), file_path) for file_path in affected_front_end_files
- ]
- script_path = input_api.os_path.join(input_api.PresubmitLocalPath(), "scripts", "check_localizability.js")
- return _checkWithNodeScript(input_api, output_api, script_path, affected_front_end_files)
+ if script_arguments is None:
+ script_arguments = []
+ return _checkWithNodeScript(input_api, output_api, script_path, script_arguments)
+
+
+def _CheckDevtoolsLocalizableResources(input_api, output_api): # pylint: disable=invalid-name
+ affected_front_end_files = _getAffectedFrontEndFiles(input_api)
+ if len(affected_front_end_files) == 0:
+ return []
+ script_path = input_api.os_path.join(input_api.PresubmitLocalPath(), "scripts", "check_localizable_resources.js")
+ args = ['--autofix']
+ return _CheckDevtoolsWithNodeScript(input_api, output_api, script_path, args)
+
+
+def _CheckDevtoolsLocalization(input_api, output_api): # pylint: disable=invalid-name
+ affected_front_end_files = [
+ input_api.os_path.join(input_api.PresubmitLocalPath(), file_path) for file_path in _getAffectedFrontEndFiles(input_api)
+ ]
+ if len(affected_front_end_files) == 0:
+ return []
+ script_path = input_api.os_path.join(input_api.PresubmitLocalPath(), "scripts", "check_localizability.js")
+ return _checkWithNodeScript(input_api, output_api, script_path, affected_front_end_files)
def _CheckDevtoolsStyle(input_api, output_api):
@@ -123,9 +140,9 @@ def _CheckDevtoolsStyle(input_api, output_api):
def _CompileDevtoolsFrontend(input_api, output_api):
compile_path = input_api.os_path.join(input_api.PresubmitLocalPath(), "scripts", "compile_frontend.py")
- out, _ = input_api.subprocess.Popen(
- [input_api.python_executable, compile_path], stdout=input_api.subprocess.PIPE,
- stderr=input_api.subprocess.STDOUT).communicate()
+ out, _ = input_api.subprocess.Popen([input_api.python_executable, compile_path],
+ stdout=input_api.subprocess.PIPE,
+ stderr=input_api.subprocess.STDOUT).communicate()
if "ERROR" in out or "WARNING" in out:
return [output_api.PresubmitError(out)]
if "NOTE" in out:
@@ -202,6 +219,7 @@ def CheckChangeOnUpload(input_api, output_api):
results = []
results.extend(_CheckBuildGN(input_api, output_api))
results.extend(_CheckFormat(input_api, output_api))
+ results.extend(_CheckDevtoolsLocalizableResources(input_api, output_api))
results.extend(_CheckDevtoolsLocalization(input_api, output_api))
results.extend(_CheckDevtoolsStyle(input_api, output_api))
results.extend(_CompileDevtoolsFrontend(input_api, output_api))
@@ -237,7 +255,7 @@ def _getAffectedJSFiles(input_api):
return [input_api.os_path.relpath(file_name, devtools_root) for file_name in affected_js_files]
-def _checkWithNodeScript(input_api, output_api, script_path, files=None): # pylint: disable=invalid-name
+def _checkWithNodeScript(input_api, output_api, script_path, script_arguments=None): # pylint: disable=invalid-name
original_sys_path = sys.path
try:
sys.path = sys.path + [input_api.os_path.join(input_api.PresubmitLocalPath(), "scripts")]
@@ -247,11 +265,11 @@ def _checkWithNodeScript(input_api, output_api, script_path, files=None): # pyl
node_path = local_node.node_path()
- if files is None:
- files = []
+ if script_arguments is None:
+ script_arguments = []
process = input_api.subprocess.Popen(
- [node_path, script_path] + files, stdout=input_api.subprocess.PIPE, stderr=input_api.subprocess.STDOUT)
+ [node_path, script_path] + script_arguments, stdout=input_api.subprocess.PIPE, stderr=input_api.subprocess.STDOUT)
out, _ = process.communicate()
if process.returncode != 0:
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/Images/mediumIcons.png b/chromium/third_party/blink/renderer/devtools/front_end/Images/mediumIcons.png
index 187f2c37ffc..23523490a73 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/Images/mediumIcons.png
+++ b/chromium/third_party/blink/renderer/devtools/front_end/Images/mediumIcons.png
Binary files differ
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/Images/mediumIcons_2x.png b/chromium/third_party/blink/renderer/devtools/front_end/Images/mediumIcons_2x.png
index 310edf2b617..866dd0b1fc8 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/Images/mediumIcons_2x.png
+++ b/chromium/third_party/blink/renderer/devtools/front_end/Images/mediumIcons_2x.png
Binary files differ
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/Images/src/mediumIcons.svg b/chromium/third_party/blink/renderer/devtools/front_end/Images/src/mediumIcons.svg
index 3e21a093977..02c73565c65 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/Images/src/mediumIcons.svg
+++ b/chromium/third_party/blink/renderer/devtools/front_end/Images/src/mediumIcons.svg
@@ -8,11 +8,11 @@
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- width="80"
- height="80"
+ width="96"
+ height="96"
id="svg4775"
version="1.1"
- inkscape:version="0.92.2pre0 (973e216, 2017-07-25)"
+ inkscape:version="0.92.3 (2405546, 2018-03-11)"
sodipodi:docname="mediumIcons.svg"
inkscape:export-filename="/Users/pfeldman/code/chromium/src/third_party/WebKit/Source/devtools/front_end/Images/mediumIcons.png"
inkscape:export-xdpi="90"
@@ -95,13 +95,13 @@
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
- inkscape:window-width="2714"
- inkscape:window-height="1732"
+ inkscape:window-width="2558"
+ inkscape:window-height="1378"
id="namedview4913"
showgrid="true"
inkscape:zoom="5.2149126"
- inkscape:cx="-45.52086"
- inkscape:cy="72.509528"
+ inkscape:cx="-63.677407"
+ inkscape:cy="76.536441"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="0"
@@ -120,32 +120,32 @@
</sodipodi:namedview>
<g
id="g4777"
- transform="translate(0,16)">
+ transform="translate(0,32)">
<path
- d="m 3,4 h 10 v 9.008 C 13,14.1082 12.11257,15 11.0004,15 H 4.9996 C 3.8952,15 3,14.09982 3,13.008 V 4 z M 2,2 H 14 V 3 H 2 V 2 z M 5,1 h 6 V 2 H 5 V 1 z"
+ d="m 3,4 h 10 v 9.008 C 13,14.1082 12.11257,15 11.0004,15 H 4.9996 C 3.8952,15 3,14.09982 3,13.008 Z M 2,2 H 14 V 3 H 2 Z M 5,1 h 6 V 2 H 5 Z"
id="path4781"
inkscape:connector-curvature="0"
style="fill:#212121" />
</g>
<g
- transform="translate(16,16)"
+ transform="translate(16,32)"
id="g4783">
<path
- d="M 13.526,6.25 H 12.0523 V 5.5 c 0,-0.414 -0.33011,-0.75 -0.73684,-0.75 H 9.84176 V 4 c 0,-0.414 -0.33011,-0.75 -0.73684,-0.75 H 8.36808 V 1.75 C 8.36808,1.423 8.16029,1.153 7.87366,1.0495 7.81987,1.021 7.74913,1 7.63124,1 c -3.6628,0 -6.6316,3.0218 -6.6316,6.75 0,3.7275 2.9687,6.75 6.6316,6.75 3.6629,0 6.6316,-3.0225 6.6316,-6.75 V 7 c 0,-0.414 -0.3301,-0.75 -0.73684,-0.75 z M 3.5786,8.5 C 2.96784,8.5 2.4733,7.99667 2.4733,7.375 2.4733,6.75333 2.9678,6.25 3.5786,6.25 4.1894,6.25 4.6839,6.75333 4.6839,7.375 4.6839,7.99667 4.1894,8.5 3.5786,8.5 z M 4.6839,4.375 c 0,-0.62175 0.49516,-1.125 1.1053,-1.125 0.61084,0 1.1053,0.50325 1.1053,1.125 C 6.8945,4.996 6.40008,5.5 5.7892,5.5 5.17909,5.5 4.6839,4.996 4.6839,4.375 z M 6.8944,13 c -0.61059,0 -1.1053,-0.50334 -1.1053,-1.1246 0,-0.62129 0.49467,-1.1254 1.1053,-1.1254 0.61063,0 1.1053,0.50409 1.1053,1.1254 C 7.9997,12.49668 7.50503,13 6.8944,13 z M 7.26282,9.25 C 6.65271,9.25 6.15752,8.746 6.15752,8.125 6.15752,7.504 6.65268,7 7.26282,7 c 0.61014,0 1.1053,0.504 1.1053,1.125 0,0.621 -0.49516,1.125 -1.1053,1.125 z m 3.6842,1.5 c -0.6101,0 -1.1053,-0.504 -1.1053,-1.125 0,-0.621 0.49516,-1.125 1.1053,-1.125 0.61011,0 1.1053,0.504 1.1053,1.125 0,0.621 -0.49516,1.125 -1.1053,1.125 z"
+ d="M 13.526,6.25 H 12.0523 V 5.5 c 0,-0.414 -0.33011,-0.75 -0.73684,-0.75 H 9.84176 V 4 c 0,-0.414 -0.33011,-0.75 -0.73684,-0.75 H 8.36808 V 1.75 C 8.36808,1.423 8.16029,1.153 7.87366,1.0495 7.81987,1.021 7.74913,1 7.63124,1 c -3.6628,0 -6.6316,3.0218 -6.6316,6.75 0,3.7275 2.9687,6.75 6.6316,6.75 3.6629,0 6.6316,-3.0225 6.6316,-6.75 V 7 c 0,-0.414 -0.3301,-0.75 -0.73684,-0.75 z M 3.5786,8.5 C 2.96784,8.5 2.4733,7.99667 2.4733,7.375 2.4733,6.75333 2.9678,6.25 3.5786,6.25 4.1894,6.25 4.6839,6.75333 4.6839,7.375 4.6839,7.99667 4.1894,8.5 3.5786,8.5 Z M 4.6839,4.375 c 0,-0.62175 0.49516,-1.125 1.1053,-1.125 0.61084,0 1.1053,0.50325 1.1053,1.125 C 6.8945,4.996 6.40008,5.5 5.7892,5.5 5.17909,5.5 4.6839,4.996 4.6839,4.375 Z M 6.8944,13 c -0.61059,0 -1.1053,-0.50334 -1.1053,-1.1246 0,-0.62129 0.49467,-1.1254 1.1053,-1.1254 0.61063,0 1.1053,0.50409 1.1053,1.1254 C 7.9997,12.49668 7.50503,13 6.8944,13 Z M 7.26282,9.25 C 6.65271,9.25 6.15752,8.746 6.15752,8.125 6.15752,7.504 6.65268,7 7.26282,7 c 0.61014,0 1.1053,0.504 1.1053,1.125 0,0.621 -0.49516,1.125 -1.1053,1.125 z m 3.6842,1.5 c -0.6101,0 -1.1053,-0.504 -1.1053,-1.125 0,-0.621 0.49516,-1.125 1.1053,-1.125 0.61011,0 1.1053,0.504 1.1053,1.125 0,0.621 -0.49516,1.125 -1.1053,1.125 z"
id="path4787"
inkscape:connector-curvature="0"
style="fill:#212121" />
</g>
<g
- transform="translate(32,16)"
+ transform="translate(32,32)"
id="g4789">
<path
- d="M 8,6 C 11.3137,6 14,5.10457 14,4 14,2.89543 11.3137,2 8,2 4.6863,2 2,2.89543 2,4 2,5.10457 4.6863,6 8,6 z m -6,7 c 0,1.1046 2.6863,2 6,2 3.3137,0 6,-0.89543 6,-2 v -2 c 0,1.1046 -2.6863,2 -6,2 -3.3137,0 -6,-0.89543 -6,-2 v 2 z m 0,-3 c 0,1.1046 2.6863,2 6,2 3.3137,0 6,-0.89543 6,-2 V 8 C 14,9.1046 11.3137,10 8,10 4.6863,10 2,9.10457 2,8 v 2 z M 2,7 c 0,1.1046 2.6863,2 6,2 3.3137,0 6,-0.89543 6,-2 V 5 C 14,6.1046 11.3137,7 8,7 4.6863,7 2,6.10457 2,5 v 2 z"
+ d="M 8,6 C 11.3137,6 14,5.10457 14,4 14,2.89543 11.3137,2 8,2 4.6863,2 2,2.89543 2,4 2,5.10457 4.6863,6 8,6 Z m -6,7 c 0,1.1046 2.6863,2 6,2 3.3137,0 6,-0.89543 6,-2 v -2 c 0,1.1046 -2.6863,2 -6,2 -3.3137,0 -6,-0.89543 -6,-2 z m 0,-3 c 0,1.1046 2.6863,2 6,2 3.3137,0 6,-0.89543 6,-2 V 8 C 14,9.1046 11.3137,10 8,10 4.6863,10 2,9.10457 2,8 Z M 2,7 c 0,1.1046 2.6863,2 6,2 3.3137,0 6,-0.89543 6,-2 V 5 C 14,6.1046 11.3137,7 8,7 4.6863,7 2,6.10457 2,5 Z"
id="path4793"
inkscape:connector-curvature="0" />
</g>
<g
- transform="translate(48,16)"
+ transform="translate(48,32)"
id="g4795">
<g
id="g4799">
@@ -153,12 +153,12 @@
id="g4801"
style="fill:none">
<path
- d="M 0,0 H 16 V 16 H 0 z"
+ d="M 0,0 H 16 V 16 H 0 Z"
id="path4803"
inkscape:connector-curvature="0" />
<path
transform="translate(3,1)"
- d="M 6,0 H 0.9954 C 0.45567,0 0,0.45078 0,1.0068 v 11.986 c 0,0.5569 0.44565,1.0068 0.9954,1.0068 H 9.0046 C 9.54433,13.9996 10,13.54882 10,12.9928 V 3.9996 l -4,-4 z M 9.29,4 H 6 V 0.71 L 9.29,4 z"
+ d="M 6,0 H 0.9954 C 0.45567,0 0,0.45078 0,1.0068 v 11.986 c 0,0.5569 0.44565,1.0068 0.9954,1.0068 H 9.0046 C 9.54433,13.9996 10,13.54882 10,12.9928 V 3.9996 l -4,-4 z M 9.29,4 H 6 V 0.71 Z"
id="path4805"
inkscape:connector-curvature="0"
style="fill:#000000" />
@@ -166,34 +166,34 @@
</g>
</g>
<g
- transform="translate(0,32)"
+ transform="translate(0,48)"
id="g4807">
<path
- d="M 6.5,3.2289 V 1 h 3 v 2.2289 c 0.70763,0.22225 1.3475,0.59759 1.8807,1.0872 l 1.9315,-1.1151 1.5,2.5981 -1.9305,1.1146 c 0.07749,0.34976 0.11835,0.71329 0.11835,1.0864 0,0.37311 -0.04086,0.73661 -0.11835,1.0864 l 1.9305,1.1146 -1.5,2.5981 -1.9315,-1.1151 C 10.84746,12.17371 10.2076,12.54904 9.5,12.7713 v 2.2289 h -3 V 12.7713 C 5.79237,12.54905 5.1525,12.17371 4.6193,11.6841 l -1.9315,1.1151 -1.5,-2.5981 1.9305,-1.1146 C 3.04081,8.73674 2.99995,8.37321 2.99995,8.0001 2.99995,7.62699 3.04081,7.26349 3.1183,6.9137 L 1.1878,5.7991 2.6878,3.201 4.6193,4.3161 C 5.15253,3.82649 5.7924,3.45116 6.5,3.2289 z M 8,10.5 C 9.3807,10.5 10.5,9.3807 10.5,8 10.5,6.6193 9.3807,5.5 8,5.5 6.6193,5.5 5.5,6.6193 5.5,8 c 0,1.3807 1.1193,2.5 2.5,2.5 z"
+ d="M 6.5,3.2289 V 1 h 3 v 2.2289 c 0.70763,0.22225 1.3475,0.59759 1.8807,1.0872 l 1.9315,-1.1151 1.5,2.5981 -1.9305,1.1146 c 0.07749,0.34976 0.11835,0.71329 0.11835,1.0864 0,0.37311 -0.04086,0.73661 -0.11835,1.0864 l 1.9305,1.1146 -1.5,2.5981 -1.9315,-1.1151 C 10.84746,12.17371 10.2076,12.54904 9.5,12.7713 v 2.2289 h -3 V 12.7713 C 5.79237,12.54905 5.1525,12.17371 4.6193,11.6841 l -1.9315,1.1151 -1.5,-2.5981 1.9305,-1.1146 C 3.04081,8.73674 2.99995,8.37321 2.99995,8.0001 2.99995,7.62699 3.04081,7.26349 3.1183,6.9137 L 1.1878,5.7991 2.6878,3.201 4.6193,4.3161 C 5.15253,3.82649 5.7924,3.45116 6.5,3.2289 Z M 8,10.5 C 9.3807,10.5 10.5,9.3807 10.5,8 10.5,6.6193 9.3807,5.5 8,5.5 6.6193,5.5 5.5,6.6193 5.5,8 c 0,1.3807 1.1193,2.5 2.5,2.5 z"
id="path4811"
inkscape:connector-curvature="0"
style="fill:#212121" />
</g>
<g
- transform="translate(16,32)"
+ transform="translate(16,48)"
id="g4813">
<path
- d="M 2,3.999 C 2,3.44729 2.45098,3.00004 2.99078,3.00004 h 5.0092 v 3 h -6 v -2.001 z M 2,11 h 6 v 3 H 2.9908 C 2.44361,14 2.00002,13.55734 2.00002,13.00104 v -2.001 z M 2,7 h 6 v 3 H 2 V 7 z M 9,3 h 5.0092 c 0.54719,0 0.99078,0.44266 0.99078,0.99896 v 2.001 h -6 v -3 z m 0,8 h 6 v 2.001 c 0,0.55171 -0.45098,0.99896 -0.99078,0.99896 h -5.0092 v -3 z M 9,7 h 6 v 3 H 9 V 7 z"
+ d="M 2,3.999 C 2,3.44729 2.45098,3.00004 2.99078,3.00004 h 5.0092 v 3 h -6 v -2.001 z M 2,11 h 6 v 3 H 2.9908 C 2.44361,14 2.00002,13.55734 2.00002,13.00104 v -2.001 z M 2,7 h 6 v 3 H 2 Z M 9,3 h 5.0092 c 0.54719,0 0.99078,0.44266 0.99078,0.99896 v 2.001 h -6 v -3 z m 0,8 h 6 v 2.001 c 0,0.55171 -0.45098,0.99896 -0.99078,0.99896 h -5.0092 v -3 z M 9,7 h 6 v 3 H 9 Z"
id="path4817"
inkscape:connector-curvature="0"
style="fill:#212121" />
</g>
<g
- transform="translate(34,34)"
+ transform="translate(34,50)"
id="g4819">
<path
transform="matrix(1.1,0,0,1.1,-3.3,-3.3)"
- d="m 8,13 c 2.7614,0 5,-2.2386 5,-5 C 13,5.2386 10.7614,3 8,3 5.2386,3 3,5.2386 3,8 c 0,2.7614 2.2386,5 5,5 z M 8,11 V 9 H 5 V 7 H 8 V 5 l 3,3 -3,3 z"
+ d="m 8,13 c 2.7614,0 5,-2.2386 5,-5 C 13,5.2386 10.7614,3 8,3 5.2386,3 3,5.2386 3,8 c 0,2.7614 2.2386,5 5,5 z M 8,11 V 9 H 5 V 7 H 8 V 5 l 3,3 z"
id="path4823"
inkscape:connector-curvature="0" />
</g>
<g
- transform="translate(50,33)"
+ transform="translate(50,49)"
id="g4825">
<g
transform="translate(-76,-24)"
@@ -204,10 +204,6 @@
cy="11.5"
r="2.5"
id="circle4831"
- sodipodi:cx="10.5"
- sodipodi:cy="11.5"
- sodipodi:rx="2.5"
- sodipodi:ry="2.5"
style="fill:#009802" />
<path
d="m 78,25 c -0.54399,0 -1,0.45026 -1,1 v 8 c 0,0.53973 0.44936,1 1,1 h 3.0312 c -0.02335,-0.1633 -0.03125,-0.33024 -0.03125,-0.5 0,-0.16976 0.0079,-0.3367 0.03125,-0.5 H 78 v -8 h 3 v 3 h 3 v 1.5 c 0.1633,-0.02335 0.33024,0 0.5,0 0.16976,0 0.3367,-0.02335 0.5,0 V 28 l -3,-3 z m 4,1 2,2 h -2 z"
@@ -216,16 +212,16 @@
</g>
</g>
<g
- transform="translate(2,49)"
+ transform="translate(2,65)"
id="g4835">
<path
transform="translate(-65.625,-24.5)"
- d="m 71.625,25.5 h -4.003 c -0.54399,0 -0.99703,0.44566 -0.99703,0.9954 v 8.0092 c 0,0.53973 0.44639,0.9954 0.99703,0.9954 h 6.0059 c 0.54399,0 0.99703,-0.44566 0.99703,-0.9954 V 28.5 l -3,-3 z m 0,1 2,2 h -2 v -2 z m -4,0 h 3 v 3 h 3 v 5 h -6 v -8 z"
+ d="m 71.625,25.5 h -4.003 c -0.54399,0 -0.99703,0.44566 -0.99703,0.9954 v 8.0092 c 0,0.53973 0.44639,0.9954 0.99703,0.9954 h 6.0059 c 0.54399,0 0.99703,-0.44566 0.99703,-0.9954 V 28.5 l -3,-3 z m 0,1 2,2 h -2 z m -4,0 h 3 v 3 h 3 v 5 h -6 z"
id="path4839"
inkscape:connector-curvature="0" />
</g>
<g
- transform="translate(17,49)"
+ transform="translate(17,65)"
id="g4841">
<path
transform="translate(-160,-96)"
@@ -235,19 +231,19 @@
style="fill:#9f9f9f" />
<path
transform="translate(-160,-96)"
- d="m 170,100.43 -0.93,-0.93 -2.57,2.57 -2.57,-2.57 -0.93,0.93 2.57,2.57 -2.57,2.57 0.93,0.93 2.57,-2.57 2.57,2.57 0.93,-0.93 -2.57,-2.57 2.57,-2.57 z"
+ d="m 170,100.43 -0.93,-0.93 -2.57,2.57 -2.57,-2.57 -0.93,0.93 2.57,2.57 -2.57,2.57 0.93,0.93 2.57,-2.57 2.57,2.57 0.93,-0.93 -2.57,-2.57 z"
id="path4847"
inkscape:connector-curvature="0"
style="fill-opacity:0.36000001" />
<path
transform="translate(-160,-96)"
- d="M 170,99.93 169.07,99 166.5,101.57 163.93,99 163,99.93 l 2.57,2.57 -2.57,2.57 0.93,0.93 2.57,-2.57 2.57,2.57 0.93,-0.93 -2.57,-2.57 2.57,-2.57 z"
+ d="M 170,99.93 169.07,99 166.5,101.57 163.93,99 163,99.93 l 2.57,2.57 -2.57,2.57 0.93,0.93 2.57,-2.57 2.57,2.57 0.93,-0.93 -2.57,-2.57 z"
id="path4849"
inkscape:connector-curvature="0"
style="fill:#ffffff" />
</g>
<g
- transform="translate(33,49)"
+ transform="translate(33,65)"
id="g4851">
<path
transform="translate(-143,-96)"
@@ -257,19 +253,19 @@
style="fill:#bebebe" />
<path
transform="translate(-143,-96)"
- d="m 153,100.43 -0.93,-0.93 -2.57,2.57 -2.57,-2.57 -0.93,0.93 2.57,2.57 -2.57,2.57 0.93,0.93 2.57,-2.57 2.57,2.57 0.93,-0.93 -2.57,-2.57 2.57,-2.57 z"
+ d="m 153,100.43 -0.93,-0.93 -2.57,2.57 -2.57,-2.57 -0.93,0.93 2.57,2.57 -2.57,2.57 0.93,0.93 2.57,-2.57 2.57,2.57 0.93,-0.93 -2.57,-2.57 z"
id="path4857"
inkscape:connector-curvature="0"
style="fill-opacity:0.37000002" />
<path
transform="translate(-143,-96)"
- d="M 153,99.93 152.07,99 149.5,101.57 146.93,99 146,99.93 l 2.57,2.57 -2.57,2.57 0.93,0.93 2.57,-2.57 2.57,2.57 0.93,-0.93 -2.57,-2.57 2.57,-2.57 z"
+ d="M 153,99.93 152.07,99 149.5,101.57 146.93,99 146,99.93 l 2.57,2.57 -2.57,2.57 0.93,0.93 2.57,-2.57 2.57,2.57 0.93,-0.93 -2.57,-2.57 z"
id="path4859"
inkscape:connector-curvature="0"
style="fill:#ffffff" />
</g>
<g
- transform="translate(49,49)"
+ transform="translate(49,65)"
id="g4861">
<path
transform="translate(-111,-96)"
@@ -285,13 +281,13 @@
style="fill:#f27d82" />
<path
transform="translate(-111,-96)"
- d="m 121.5,100.93 -0.93,-0.93 -2.57,2.57 -2.57,-2.57 -0.93,0.93 2.57,2.57 -2.57,2.57 0.93,0.93 2.57,-2.57 2.57,2.57 0.93,-0.93 -2.57,-2.57 2.57,-2.57 z"
+ d="m 121.5,100.93 -0.93,-0.93 -2.57,2.57 -2.57,-2.57 -0.93,0.93 2.57,2.57 -2.57,2.57 0.93,0.93 2.57,-2.57 2.57,2.57 0.93,-0.93 -2.57,-2.57 z"
id="path4869"
inkscape:connector-curvature="0"
style="fill-opacity:0.36000001" />
<path
transform="translate(-111,-96)"
- d="m 121.5,100.43 -0.93,-0.93 -2.57,2.57 -2.57,-2.57 -0.93,0.93 2.57,2.57 -2.57,2.57 0.93,0.93 2.57,-2.57 2.57,2.57 0.93,-0.93 -2.57,-2.57 2.57,-2.57 z"
+ d="m 121.5,100.43 -0.93,-0.93 -2.57,2.57 -2.57,-2.57 -0.93,0.93 2.57,2.57 -2.57,2.57 0.93,0.93 2.57,-2.57 2.57,2.57 0.93,-0.93 -2.57,-2.57 z"
id="path4871"
inkscape:connector-curvature="0"
style="fill:#ffffff" />
@@ -317,7 +313,7 @@
</defs>
</g>
<g
- transform="translate(1,65)"
+ transform="translate(1,81)"
id="g4881">
<path
transform="translate(-96,-96)"
@@ -333,13 +329,13 @@
style="fill:url(#sprite13_b)" />
<path
transform="translate(-96,-96)"
- d="m 106.5,100.93 -0.93,-0.93 -2.57,2.57 -2.57,-2.57 -0.93,0.93 2.57,2.57 -2.57,2.57 0.93,0.93 2.57,-2.57 2.57,2.57 0.93,-0.93 -2.57,-2.57 2.57,-2.57 z"
+ d="m 106.5,100.93 -0.93,-0.93 -2.57,2.57 -2.57,-2.57 -0.93,0.93 2.57,2.57 -2.57,2.57 0.93,0.93 2.57,-2.57 2.57,2.57 0.93,-0.93 -2.57,-2.57 z"
id="path4889"
inkscape:connector-curvature="0"
style="fill:#993c35" />
<path
transform="translate(-96,-96)"
- d="m 106.5,100.43 -0.93,-0.93 -2.57,2.57 -2.57,-2.57 -0.93,0.93 2.57,2.57 -2.57,2.57 0.93,0.93 2.57,-2.57 2.57,2.57 0.93,-0.93 -2.57,-2.57 2.57,-2.57 z"
+ d="m 106.5,100.43 -0.93,-0.93 -2.57,2.57 -2.57,-2.57 -0.93,0.93 2.57,2.57 -2.57,2.57 0.93,0.93 2.57,-2.57 2.57,2.57 0.93,-0.93 -2.57,-2.57 z"
id="path4891"
inkscape:connector-curvature="0"
style="fill:#ffffff" />
@@ -351,7 +347,7 @@
x2="109.5"
y1="103"
y2="103"
- gradientTransform="matrix(0,1,-1,0,206,0)"
+ gradientTransform="rotate(90,103,103)"
gradientUnits="userSpaceOnUse"
xlink:href="#sprite13_q" />
<linearGradient
@@ -371,7 +367,7 @@
x2="127"
y1="104"
y2="104"
- gradientTransform="matrix(0,1,-1,0,207,-17)"
+ gradientTransform="rotate(90,112,95)"
gradientUnits="userSpaceOnUse"
xlink:href="#sprite13_r" />
<linearGradient
@@ -388,7 +384,7 @@
</defs>
</g>
<g
- transform="translate(18,66)"
+ transform="translate(18,82)"
id="g4907">
<path
transform="translate(-234,-30)"
@@ -401,121 +397,121 @@
xml:space="preserve"
style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none"
x="-11.403088"
- y="75.207672"
+ y="91.207672"
id="text4355"><tspan
sodipodi:role="line"
id="tspan4357"
x="-11.403088"
- y="75.207672"
+ y="91.207672"
style="font-size:10px;line-height:1.25;font-family:sans-serif">1</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none"
x="-11.144299"
- y="59.675297"
+ y="75.675293"
id="text4355-8"><tspan
sodipodi:role="line"
id="tspan4357-8"
x="-11.144299"
- y="59.675297"
+ y="75.675293"
style="font-size:10px;line-height:1.25;font-family:sans-serif">2</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none"
x="-11.066174"
- y="44.142918"
+ y="60.142918"
id="text4355-4"><tspan
sodipodi:role="line"
id="tspan4357-3"
x="-11.066174"
- y="44.142918"
+ y="60.142918"
style="font-size:10px;line-height:1.25;font-family:sans-serif">3</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none"
x="-11.266369"
- y="28.610538"
+ y="44.610538"
id="text4355-1"><tspan
sodipodi:role="line"
id="tspan4357-4"
x="-11.266369"
- y="28.610538"
+ y="44.610538"
style="font-size:10px;line-height:1.25;font-family:sans-serif">4</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none"
x="5.9353299"
- y="92.082359"
+ y="108.08236"
id="text4355-9"><tspan
sodipodi:role="line"
id="tspan4357-2"
x="5.9353299"
- y="92.082359"
+ y="108.08236"
style="font-size:10px;line-height:1.25;font-family:sans-serif">a</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none"
x="21.659466"
- y="92.082359"
+ y="108.08236"
id="text4355-0"><tspan
sodipodi:role="line"
id="tspan4357-6"
x="21.659466"
- y="92.082359"
+ y="108.08236"
style="font-size:10px;line-height:1.25;font-family:sans-serif">b</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none"
x="37.383606"
- y="92.082359"
+ y="108.08236"
id="text4355-89"><tspan
sodipodi:role="line"
id="tspan4357-26"
x="37.383606"
- y="92.082359"
+ y="108.08236"
style="font-size:10px;line-height:1.25;font-family:sans-serif">c</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none"
x="53.107742"
- y="92.082359"
+ y="108.08236"
id="text4355-6"><tspan
sodipodi:role="line"
id="tspan4357-49"
x="53.107742"
- y="92.082359"
+ y="108.08236"
style="font-size:10px;line-height:1.25;font-family:sans-serif">d</tspan></text>
<g
style="fill:none;stroke:none"
id="g6346"
- transform="translate(32,64)">
+ transform="translate(32,80)">
<polygon
- points="0,0 16,0 16,16 0,16 "
+ points="16,16 0,16 0,0 16,0 "
id="polygon6348" />
<path
style="fill:#000000"
inkscape:connector-curvature="0"
id="path6350"
- d="M 8,1 C 4.136,1 1,4.136 1,8 c 0,3.864 3.136,7 7,7 3.864,0 7,-3.136 7,-7 C 15,4.136 11.864,1 8,1 L 8,1 z M 2.5,8 C 2.5,4.968125 4.968125,2.5 8,2.5 c 3.031875,0 5.5,2.468125 5.5,5.5 0,3.031875 -2.468125,5.5 -5.5,5.5 C 4.968125,13.5 2.5,11.031875 2.5,8 z M 9,12 9,7 7,7 7,12 9,12 z M 7,6 9,6 9,4 7,4 7,6 7,6 z" />
+ d="M 8,1 C 4.136,1 1,4.136 1,8 c 0,3.864 3.136,7 7,7 3.864,0 7,-3.136 7,-7 C 15,4.136 11.864,1 8,1 Z M 2.5,8 C 2.5,4.968125 4.968125,2.5 8,2.5 c 3.031875,0 5.5,2.468125 5.5,5.5 0,3.031875 -2.468125,5.5 -5.5,5.5 C 4.968125,13.5 2.5,11.031875 2.5,8 Z M 9,12 V 7 H 7 v 5 z M 7,6 H 9 V 4 H 7 Z" />
</g>
<g
id="g4443-7"
- transform="matrix(1.3997356,0,0,1.3934295,65.053843,65.020556)"
+ transform="matrix(1.3997356,0,0,1.3934295,65.053843,81.020556)"
mask="url(#path4453-6-mask)">
<path
- transform="translate(-60,0)"
+ transform="translate(-60)"
d="m 61,9 4,-8 4,8 z"
id="path4447-5"
inkscape:connector-curvature="0"
style="stroke:#c19600;stroke-width:2;stroke-linejoin:round" />
<path
- transform="translate(-60,0)"
+ transform="translate(-60)"
d="m 61,9 4,-8 4,8 z"
id="path4449-3"
inkscape:connector-curvature="0"
style="fill:#f4bd00;stroke:#f5bd00;stroke-width:1.5;stroke-linejoin:round" />
<path
- transform="translate(-60,0)"
+ transform="translate(-60)"
d="m 63.75,2.75 h 2.5 v 2.5 L 65.75,7 h -1.5 l -0.5,-1.75 v -2.5 m 0,5.25 h 2.5 v 1.25 h -2.5"
id="path4451-5"
inkscape:connector-curvature="0"
@@ -523,7 +519,7 @@
<mask
id="path4453-6-mask">
<path
- transform="translate(-60,0)"
+ transform="translate(-60)"
d="m 64,3 h 2 V 5.25 L 65.5,7 h -1 L 64,5.25 V 3 m 0,5 h 2 v 1 h -2"
id="path4453-6"
inkscape:connector-curvature="0"
@@ -539,16 +535,16 @@
</g>
<g
id="g4279-7"
- transform="matrix(1.36,0,0,1.34,65.3,49.5)"
+ transform="matrix(1.36,0,0,1.34,65.3,65.5)"
mask="url(#path4287-3-mask)">
<path
- transform="translate(-80,0)"
+ transform="translate(-80)"
d="m 85,-4.7795e-7 c -2.76,0 -5,2.23999997795 -5,4.99999997795 0,2.76 2.24,5 5,5 2.76,0 5,-2.24 5,-5 C 90,2.2399995 87.76,-4.7795e-7 85,-4.7795e-7"
id="path4283-0"
inkscape:connector-curvature="0"
style="fill:url(#linearGradient5057)" />
<path
- transform="translate(-80,0)"
+ transform="translate(-80)"
d="m 80.36,5 c 0,2.56 2.08,4.64 4.64,4.64 2.56,0 4.64,-2.08 4.64,-4.64 0,-2.56 -2.08,-4.64 -4.64,-4.64 -2.56,0 -4.64,2.08 -4.64,4.64"
id="path4285-9"
inkscape:connector-curvature="0"
@@ -556,8 +552,8 @@
<mask
id="path4287-3-mask">
<path
- transform="translate(-80,0)"
- d="m 83.93,2.14 c -0.03,-0.53 0.55,-0.97 1.06,-0.83 0.5,0.12 0.79,0.73 0.56,1.18 -0.2,0.44 -0.79,0.61 -1.2,0.36 C 84.09,2.71 83.93,2.43 83.93,2.14 z m 1.7,5.46 H 86.3 V 8.13 H 83.41 V 7.6 h 0.66 V 3.99 H 83.41 V 3.46 h 2.22 V 7.6 z"
+ transform="translate(-80)"
+ d="m 83.93,2.14 c -0.03,-0.53 0.55,-0.97 1.06,-0.83 0.5,0.12 0.79,0.73 0.56,1.18 -0.2,0.44 -0.79,0.61 -1.2,0.36 C 84.09,2.71 83.93,2.43 83.93,2.14 Z m 1.7,5.46 H 86.3 V 8.13 H 83.41 V 7.6 h 0.66 V 3.99 H 83.41 V 3.46 h 2.22 z"
id="path4287-3"
inkscape:connector-curvature="0"
style="fill:#000000" />
@@ -595,16 +591,16 @@
</g>
<g
id="g4221-1"
- transform="matrix(1.37,0,0,1.36,65.2,33.3)"
+ transform="matrix(1.37,0,0,1.36,65.2,49.3)"
mask="url(#path4229-9-path4231-2-mask)">
<path
- transform="translate(-20,0)"
+ transform="translate(-20)"
d="m 25,-4.7795e-7 c -2.76,0 -5,2.23999997795 -5,4.99999997795 0,2.76 2.24,5 5,5 2.76,0 5,-2.24 5,-5 C 30,2.2399995 27.76,-4.7795e-7 25,-4.7795e-7"
id="path4225-8"
inkscape:connector-curvature="0"
style="fill:url(#linearGradient5055)" />
<path
- transform="translate(-20,0)"
+ transform="translate(-20)"
d="m 20.36,5 c 0,2.56 2.08,4.64 4.64,4.64 2.56,0 4.64,-2.08 4.64,-4.64 0,-2.56 -2.08,-4.64 -4.64,-4.64 -2.56,0 -4.64,2.08 -4.64,4.64"
id="path4227-7"
inkscape:connector-curvature="0"
@@ -612,13 +608,13 @@
<mask
id="path4229-9-path4231-2-mask">
<path
- transform="translate(-20,0)"
+ transform="translate(-20)"
d="m 23,3 4,4"
id="path4229-9"
inkscape:connector-curvature="0"
style="stroke:#000000" />
<path
- transform="translate(-20,0)"
+ transform="translate(-20)"
d="M 27,3 23,7"
id="path4231-2"
inkscape:connector-curvature="0"
@@ -655,14 +651,14 @@
<g
style="fill:#000000"
id="g9271"
- transform="matrix(0.66666667,0,0,0.66666667,64,16)">
+ transform="matrix(0.66666667,0,0,0.66666667,64,32)">
<path
id="path9261"
- d="M 12,2 C 6.48,2 2,6.48 2,12 2,17.52 6.48,22 12,22 17.52,22 22,17.52 22,12 22,6.48 17.52,2 12,2 z m 0,3 c 1.66,0 3,1.34 3,3 0,1.66 -1.34,3 -3,3 C 10.34,11 9,9.66 9,8 9,6.34 10.34,5 12,5 z m 0,14.2 c -2.5,0 -4.71,-1.28 -6,-3.22 0.03,-1.99 4,-3.08 6,-3.08 1.99,0 5.97,1.09 6,3.08 -1.29,1.94 -3.5,3.22 -6,3.22 z"
+ d="M 12,2 C 6.48,2 2,6.48 2,12 2,17.52 6.48,22 12,22 17.52,22 22,17.52 22,12 22,6.48 17.52,2 12,2 Z m 0,3 c 1.66,0 3,1.34 3,3 0,1.66 -1.34,3 -3,3 C 10.34,11 9,9.66 9,8 9,6.34 10.34,5 12,5 Z m 0,14.2 c -2.5,0 -4.71,-1.28 -6,-3.22 0.03,-1.99 4,-3.08 6,-3.08 1.99,0 5.97,1.09 6,3.08 -1.29,1.94 -3.5,3.22 -6,3.22 z"
inkscape:connector-curvature="0" />
<path
id="path9263"
- d="M 0,0 H 24 V 24 H 0 z"
+ d="M 0,0 H 24 V 24 H 0 Z"
inkscape:connector-curvature="0"
style="fill:none" />
</g>
@@ -670,56 +666,56 @@
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:0.37333332;stroke:none"
x="-10.738436"
- y="12.11775"
+ y="28.11775"
id="text5090"><tspan
sodipodi:role="line"
id="tspan5092"
x="-10.738436"
- y="12.11775"
+ y="28.11775"
style="font-size:10px;line-height:1.25;font-family:sans-serif">5</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:0.35111114;stroke:none"
x="68.649277"
- y="91.69722"
+ y="107.69722"
id="text5862"><tspan
sodipodi:role="line"
id="tspan5864"
x="68.649277"
- y="91.69722"
+ y="107.69722"
style="font-size:10px;line-height:1.25;font-family:sans-serif">e</tspan></text>
<g
style="fill:#000000"
id="g5994"
- transform="matrix(0.75,0,0,0.75,63,-1)">
+ transform="matrix(0.75,0,0,0.75,63,15)">
<path
id="path5984"
- d="M 3,13 H 5 V 11 H 3 v 2 z m 0,4 H 5 V 15 H 3 v 2 z M 3,9 H 5 V 7 H 3 v 2 z m 4,4 H 21 V 11 H 7 v 2 z m 0,4 H 21 V 15 H 7 v 2 z M 7,7 V 9 H 21 V 7 H 7 z"
+ d="M 3,13 H 5 V 11 H 3 Z m 0,4 H 5 V 15 H 3 Z M 3,9 H 5 V 7 H 3 Z m 4,4 H 21 V 11 H 7 Z m 0,4 H 21 V 15 H 7 Z M 7,7 V 9 H 21 V 7 Z"
inkscape:connector-curvature="0" />
<path
id="path5986"
- d="M 0,0 H 24 V 24 H 0 z"
+ d="M 0,0 H 24 V 24 H 0 Z"
inkscape:connector-curvature="0"
style="fill:none" />
</g>
<g
style="fill:#000000"
id="g6079"
- transform="matrix(0.75,0,0,0.75,47,63)">
+ transform="matrix(0.75,0,0,0.75,47,79)">
<path
id="path6069"
- d="M 0,0 H 24 V 24 H 0 z"
+ d="M 0,0 H 24 V 24 H 0 Z"
inkscape:connector-curvature="0"
style="fill:none" />
<path
id="path6071"
- d="M 20,8 H 17.19 C 16.74,7.22 16.12,6.55 15.37,6.04 L 17,4.41 15.59,3 13.42,5.17 C 12.96,5.06 12.49,5 12,5 11.51,5 11.04,5.06 10.59,5.17 L 8.41,3 7,4.41 8.62,6.04 C 7.88,6.55 7.26,7.22 6.81,8 H 4 v 2 H 6.09 C 6.04,10.33 6,10.66 6,11 v 1 H 4 v 2 h 2 v 1 c 0,0.34 0.04,0.67 0.09,1 H 4 v 2 h 2.81 c 1.04,1.79 2.97,3 5.19,3 2.22,0 4.15,-1.21 5.19,-3 H 20 V 16 H 17.91 C 17.96,15.67 18,15.34 18,15 v -1 h 2 v -2 h -2 v -1 c 0,-0.34 -0.04,-0.67 -0.09,-1 H 20 V 8 z m -6,8 h -4 v -2 h 4 v 2 z m 0,-4 h -4 v -2 h 4 v 2 z"
+ d="M 20,8 H 17.19 C 16.74,7.22 16.12,6.55 15.37,6.04 L 17,4.41 15.59,3 13.42,5.17 C 12.96,5.06 12.49,5 12,5 11.51,5 11.04,5.06 10.59,5.17 L 8.41,3 7,4.41 8.62,6.04 C 7.88,6.55 7.26,7.22 6.81,8 H 4 v 2 H 6.09 C 6.04,10.33 6,10.66 6,11 v 1 H 4 v 2 h 2 v 1 c 0,0.34 0.04,0.67 0.09,1 H 4 v 2 h 2.81 c 1.04,1.79 2.97,3 5.19,3 2.22,0 4.15,-1.21 5.19,-3 H 20 V 16 H 17.91 C 17.96,15.67 18,15.34 18,15 v -1 h 2 v -2 h -2 v -1 c 0,-0.34 -0.04,-0.67 -0.09,-1 H 20 Z m -6,8 h -4 v -2 h 4 z m 0,-4 h -4 v -2 h 4 z"
inkscape:connector-curvature="0" />
</g>
<g
style="fill:none;stroke:none"
id="g6340"
- transform="translate(48,0)">
+ transform="translate(48,16)">
<rect
style="opacity:0.2"
height="16"
@@ -731,33 +727,149 @@
style="fill:#000000"
inkscape:connector-curvature="0"
id="path6344"
- d="m 0.5,14 15,0 L 8,1 0.5,14 l 0,0 z m 8.5,-2 -2,0 0,-2 2,0 0,2 0,0 z M 9,9 7,9 7,6 9,6 9,9 9,9 z" />
+ d="m 0.5,14 h 15 L 8,1 Z M 9,12 H 7 V 10 H 9 Z M 9,9 H 7 V 6 h 2 z" />
</g>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
x="32.469646"
- y="7.902472"
+ y="23.902472"
id="text3111"><tspan
sodipodi:role="line"
id="tspan3113"
x="32.469646"
- y="7.902472"
+ y="23.902472"
style="font-weight:bold;font-size:10px;line-height:1.25;font-family:sans-serif">A</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
x="40.362782"
- y="15.525424"
+ y="31.525425"
id="text3115"><tspan
sodipodi:role="line"
id="tspan3117"
x="40.362782"
- y="15.525424"
+ y="31.525425"
style="font-weight:bold;font-size:10px;line-height:1.25;font-family:sans-serif">B</tspan></text>
<path
- d="m 37.955041,13.088794 c -1.914609,-0.291809 -2.119489,-0.899233 -2.237,-4.129445 l -1.219783,0 c 0.04662,3.855641 0.06137,5.297137 5.735435,5.257508 l 0.316769,-0.01434 -2.595652,-2.995518 c -0.01446,0.611794 -0.01486,1.270551 2.31e-4,1.881795 z"
+ d="m 37.955041,29.088794 c -1.914609,-0.291809 -2.119489,-0.899233 -2.237,-4.129445 h -1.219783 c 0.04662,3.855641 0.06137,5.297137 5.735435,5.257508 l 0.316769,-0.01434 -2.595652,-2.995518 c -0.01446,0.611794 -0.01486,1.270551 2.31e-4,1.881795 z"
id="path448"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccccc" />
+ <g
+ id="BackgroundSyncIcon"
+ style="fill:none;fill-rule:evenodd;stroke:none;stroke-width:1"
+ transform="matrix(0.32,0,0,0.32,0,16)">
+ <g
+ id="Sync-Icon">
+ <rect
+ height="50"
+ width="50"
+ y="0"
+ x="0"
+ id="Mask" />
+ <g
+ transform="translate(8,2)"
+ id="Group"
+ style="fill:#000000;fill-rule:nonzero">
+ <path
+ id="Combined-Shape"
+ d="m 21.939098,33.353403 4.42699,4.044699 C 23.680429,39.200531 20.460997,40.25 17,40.25 7.6111592,40.25 0,32.526912 0,23 c 0,-2.865443 0.68854129,-5.567703 1.9068985,-7.945722 3.722e-4,-7.26e-4 7.445e-4,-0.0015 0.00112,-0.0022 L 6.335865,19.097583 C 5.9027264,20.316125 5.6666667,21.63009 5.6666667,23 c 0,6.351275 5.0741063,11.5 11.3333333,11.5 1.770533,0 3.446239,-0.411971 4.939098,-1.146597 z m 5.704636,-6.394068 C 28.08984,25.724919 28.333333,24.391313 28.333333,23 28.333333,16.648725 23.259227,11.5 17,11.5 c -1.791763,0 -3.486411,0.42191 -4.992721,1.173162 L 7.5863091,8.6339629 C 10.281491,6.811921 13.518531,5.75 17,5.75 c 9.388841,0 17,7.723088 17,17.25 0,2.886982 -0.698932,5.60832 -1.934464,7.999293 z"
+ inkscape:connector-curvature="0" />
+ <polygon
+ points="26.444444,46 26.444444,28.75 17,37.375 "
+ transform="rotate(180,21.722222,37.375)"
+ id="Shape" />
+ <polygon
+ points="17,17.25 17,0 7.5555556,8.625 "
+ id="polygon4215" />
+ </g>
+ </g>
+ </g>
+ <g
+ id="Page-1"
+ style="fill:none;fill-rule:evenodd;stroke:none;stroke-width:1"
+ transform="matrix(0.66666667,0,0,0.66666667,17.333333,16.666667)">
+ <g
+ transform="translate(-2,-1)"
+ id="3px-Fetch">
+ <g
+ id="Fetch">
+ <rect
+ height="9"
+ width="3"
+ y="6"
+ x="6"
+ id="Rectangle"
+ style="fill:#000000" />
+ <rect
+ height="9"
+ width="3"
+ y="9"
+ x="15"
+ id="rect4301"
+ style="fill:#000000" />
+ <polygon
+ points="13,7 7.5,1 2,7 6.125,7 8.875,7 "
+ id="Path"
+ style="fill:#000000;fill-rule:nonzero" />
+ <polygon
+ points="22,23 16.5,17 11,23 15.125,23 17.875,23 "
+ transform="rotate(-180,16.5,20)"
+ id="polygon4304"
+ style="fill:#000000;fill-rule:nonzero" />
+ <rect
+ height="24"
+ width="24"
+ y="0"
+ x="0"
+ id="rect4306" />
+ </g>
+ </g>
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:0.37333332;stroke:none"
+ x="-10.546678"
+ y="11.352402"
+ id="text5090-3"><tspan
+ sodipodi:role="line"
+ id="tspan5092-6"
+ x="-10.546678"
+ y="11.352402"
+ style="font-size:10px;line-height:1.25;font-family:sans-serif">6</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:0.35111114;stroke:none"
+ x="85.724823"
+ y="108.23496"
+ id="text5862-7"><tspan
+ sodipodi:role="line"
+ id="tspan5864-5"
+ x="85.724823"
+ y="108.23496"
+ style="font-size:10px;line-height:1.25;font-family:sans-serif">f</tspan></text>
+ <g
+ style="fill:#000000"
+ id="g259"
+ transform="matrix(0.58333333,0,0,0.58333333,1,1.0000001)">
+ <path
+ id="path245"
+ d="M 0,0 H 24 V 24 H 0 Z"
+ inkscape:connector-curvature="0"
+ style="fill:none" />
+ <path
+ id="path247"
+ d="M 19.35,10.04 C 18.67,6.59 15.64,4 12,4 9.11,4 6.6,5.64 5.35,8.04 2.34,8.36 0,10.91 0,14 c 0,3.31 2.69,6 6,6 h 13 c 2.76,0 5,-2.24 5,-5 0,-2.64 -2.05,-4.78 -4.65,-4.96 z"
+ inkscape:connector-curvature="0" />
+ </g>
+ <g
+ style="fill:#000000"
+ id="g320"
+ transform="matrix(0.71794872,0,0,0.71794872,15.428205,-0.79487184)">
+ <path
+ id="path309"
+ d="m 12,22 c 1.1,0 2,-0.9 2,-2 h -4 c 0,1.1 0.89,2 2,2 z m 6,-6 V 11 C 18,7.93 16.36,5.36 13.5,4.68 V 4 C 13.5,3.17 12.83,2.5 12,2.5 11.17,2.5 10.5,3.17 10.5,4 V 4.68 C 7.63,5.36 6,7.92 6,11 v 5 l -2,2 v 1 h 16 v -1 z"
+ inkscape:connector-curvature="0" />
+ </g>
</svg>
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/Images/src/optimize_png.hashes b/chromium/third_party/blink/renderer/devtools/front_end/Images/src/optimize_png.hashes
index 86d2d9e6cd5..83ab14975c0 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/Images/src/optimize_png.hashes
+++ b/chromium/third_party/blink/renderer/devtools/front_end/Images/src/optimize_png.hashes
@@ -5,7 +5,7 @@
"checkboxCheckmark.svg": "f039bf85cee42ad5c30ca3bfdce7912a",
"errorWave.svg": "e183fa242a22ed4784a92f6becbc2c45",
"smallIcons.svg": "40aefe4606ebba939725954ff9f908ef",
- "mediumIcons.svg": "115d211e8c00873698de4c861d7f3e44",
+ "mediumIcons.svg": "e2878b1c2a8e27c52d146c8942a153cb",
"breakpoint.svg": "69cd92d807259c022791112809b97799",
"treeoutlineTriangles.svg": "2d26ab85d919f83d5021f2f385dffd0b",
"chevrons.svg": "79b4b527771e30b6388ce664077b3409"
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/Images/src/svg2png.hashes b/chromium/third_party/blink/renderer/devtools/front_end/Images/src/svg2png.hashes
index 86d2d9e6cd5..83ab14975c0 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/Images/src/svg2png.hashes
+++ b/chromium/third_party/blink/renderer/devtools/front_end/Images/src/svg2png.hashes
@@ -5,7 +5,7 @@
"checkboxCheckmark.svg": "f039bf85cee42ad5c30ca3bfdce7912a",
"errorWave.svg": "e183fa242a22ed4784a92f6becbc2c45",
"smallIcons.svg": "40aefe4606ebba939725954ff9f908ef",
- "mediumIcons.svg": "115d211e8c00873698de4c861d7f3e44",
+ "mediumIcons.svg": "e2878b1c2a8e27c52d146c8942a153cb",
"breakpoint.svg": "69cd92d807259c022791112809b97799",
"treeoutlineTriangles.svg": "2d26ab85d919f83d5021f2f385dffd0b",
"chevrons.svg": "79b4b527771e30b6388ce664077b3409"
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/Images/whatsnew.png b/chromium/third_party/blink/renderer/devtools/front_end/Images/whatsnew.png
index 24178c59789..1ecc4371744 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/Images/whatsnew.png
+++ b/chromium/third_party/blink/renderer/devtools/front_end/Images/whatsnew.png
Binary files differ
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/Runtime.js b/chromium/third_party/blink/renderer/devtools/front_end/Runtime.js
index 28cb0dcc11b..af2dd89a853 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/Runtime.js
+++ b/chromium/third_party/blink/renderer/devtools/front_end/Runtime.js
@@ -378,6 +378,13 @@ var Runtime = class { // eslint-disable-line
return '\n/*# sourceURL=' + sourceURL + ' */';
}
+ /**
+ * @param {function(string):string} localizationFunction
+ */
+ static setL10nCallback(localizationFunction) {
+ Runtime._l10nCallback = localizationFunction;
+ }
+
useTestBase() {
Runtime._remoteBase = 'http://localhost:8000/inspector-sources/';
if (Runtime.queryParam('debugFrontend'))
@@ -890,8 +897,10 @@ Runtime.Extension = class {
* @return {string}
*/
title() {
- // FIXME: should be Common.UIString() but runtime is not l10n aware yet.
- return this._descriptor['title-' + Runtime._platform] || this._descriptor['title'];
+ const title = this._descriptor['title-' + Runtime._platform] || this._descriptor['title'];
+ if (title && Runtime._l10nCallback)
+ return Runtime._l10nCallback(title);
+ return title;
}
/**
@@ -1071,12 +1080,16 @@ Runtime.experiments = new Runtime.ExperimentsSupport();
/** @type {Function} */
Runtime._appStartedPromiseCallback;
Runtime._appStartedPromise = new Promise(fulfil => Runtime._appStartedPromiseCallback = fulfil);
+
+/** @type {function(string):string} */
+Runtime._l10nCallback;
+
/**
* @type {?string}
*/
Runtime._remoteBase;
(function validateRemoteBase() {
- if (location.href.startsWith('chrome-devtools://devtools/bundled/') && Runtime.queryParam('remoteBase')) {
+ if (location.href.startsWith('devtools://devtools/bundled/') && Runtime.queryParam('remoteBase')) {
const versionMatch = /\/serve_file\/(@[0-9a-zA-Z]+)\/?$/.exec(Runtime.queryParam('remoteBase'));
if (versionMatch)
Runtime._remoteBase = `${location.origin}/remote/serve_file/${versionMatch[1]}/`;
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/Tests.js b/chromium/third_party/blink/renderer/devtools/front_end/Tests.js
index 9ffe80ab401..255e7de1b65 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/Tests.js
+++ b/chromium/third_party/blink/renderer/devtools/front_end/Tests.js
@@ -763,6 +763,89 @@
{type: 'keyUp', windowsVirtualKeyCode: 0x23, key: 'End'});
};
+ // Check that showing the certificate viewer does not crash, crbug.com/954874
+ TestSuite.prototype.testShowCertificate = function() {
+ InspectorFrontendHost.showCertificateViewer([
+ 'MIIFIDCCBAigAwIBAgIQE0TsEu6R8FUHQv+9fE7j8TANBgkqhkiG9w0BAQsF' +
+ 'ADBUMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVR29vZ2xlIFRydXN0IFNlcnZp' +
+ 'Y2VzMSUwIwYDVQQDExxHb29nbGUgSW50ZXJuZXQgQXV0aG9yaXR5IEczMB4X' +
+ 'DTE5MDMyNjEzNDEwMVoXDTE5MDYxODEzMjQwMFowZzELMAkGA1UEBhMCVVMx' +
+ 'EzARBgNVBAgMCkNhbGlmb3JuaWExFjAUBgNVBAcMDU1vdW50YWluIFZpZXcx' +
+ 'EzARBgNVBAoMCkdvb2dsZSBMTEMxFjAUBgNVBAMMDSouYXBwc3BvdC5jb20w' +
+ 'ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCwca7hj0kyoJVxcvyA' +
+ 'a8zNKMIXcoPM3aU1KVe7mxZITtwC6/D/D/q4Oe8fBQLeZ3c6qR5Sr3M+611k' +
+ 'Ab15AcGUgh1Xi0jZqERvd/5+P0aVCFJYeoLrPBzwSMZBStkoiO2CwtV8x06e' +
+ 'X7qUz7Hvr3oeG+Ma9OUMmIebl//zHtC82mE0mCRBQAW0MWEgT5nOWey74tJR' +
+ 'GRqUEI8ftV9grAshD5gY8kxxUoMfqrreaXVqcRF58ZPiwUJ0+SbtC5q9cJ+K' +
+ 'MuYM4TCetEuk/WQsa+1EnSa40dhGRtZjxbwEwQAJ1vLOcIA7AVR/Ck22Uj8X' +
+ 'UOECercjUrKdDyaAPcLp2TThAgMBAAGjggHZMIIB1TATBgNVHSUEDDAKBggr' +
+ 'BgEFBQcDATCBrwYDVR0RBIGnMIGkgg0qLmFwcHNwb3QuY29tggsqLmEucnVu' +
+ 'LmFwcIIVKi50aGlua3dpdGhnb29nbGUuY29tghAqLndpdGhnb29nbGUuY29t' +
+ 'ghEqLndpdGh5b3V0dWJlLmNvbYILYXBwc3BvdC5jb22CB3J1bi5hcHCCE3Ro' +
+ 'aW5rd2l0aGdvb2dsZS5jb22CDndpdGhnb29nbGUuY29tgg93aXRoeW91dHVi' +
+ 'ZS5jb20waAYIKwYBBQUHAQEEXDBaMC0GCCsGAQUFBzAChiFodHRwOi8vcGtp' +
+ 'Lmdvb2cvZ3NyMi9HVFNHSUFHMy5jcnQwKQYIKwYBBQUHMAGGHWh0dHA6Ly9v' +
+ 'Y3NwLnBraS5nb29nL0dUU0dJQUczMB0GA1UdDgQWBBTGkpE5o0H9+Wjc05rF' +
+ 'hNQiYDjBFjAMBgNVHRMBAf8EAjAAMB8GA1UdIwQYMBaAFHfCuFCaZ3Z2sS3C' +
+ 'htCDoH6mfrpLMCEGA1UdIAQaMBgwDAYKKwYBBAHWeQIFAzAIBgZngQwBAgIw' +
+ 'MQYDVR0fBCowKDAmoCSgIoYgaHR0cDovL2NybC5wa2kuZ29vZy9HVFNHSUFH' +
+ 'My5jcmwwDQYJKoZIhvcNAQELBQADggEBALqoYGqWtJW/6obEzY+ehsgfyXb+' +
+ 'qNIuV09wt95cRF93HlLbBlSZ/Iz8HXX44ZT1/tGAkwKnW0gDKSSab3I8U+e9' +
+ 'LHbC9VXrgAFENzu89MNKNmK5prwv+MPA2HUQPu4Pad3qXmd4+nKc/EUjtg1d' +
+ '/xKGK1Vn6JX3i5ly/rduowez3LxpSAJuIwseum331aQaKC2z2ri++96B8MPU' +
+ 'KFXzvV2gVGOe3ZYqmwPaG8y38Tba+OzEh59ygl8ydJJhoI6+R3itPSy0aXUU' +
+ 'lMvvAbfCobXD5kBRQ28ysgbDSDOPs3fraXpAKL92QUjsABs58XBz5vka4swu' +
+ 'gg/u+ZxaKOqfIm8=',
+ 'MIIEXDCCA0SgAwIBAgINAeOpMBz8cgY4P5pTHTANBgkqhkiG9w0BAQsFADBM' +
+ 'MSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMK' +
+ 'R2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjAeFw0xNzA2MTUwMDAw' +
+ 'NDJaFw0yMTEyMTUwMDAwNDJaMFQxCzAJBgNVBAYTAlVTMR4wHAYDVQQKExVH' +
+ 'b29nbGUgVHJ1c3QgU2VydmljZXMxJTAjBgNVBAMTHEdvb2dsZSBJbnRlcm5l' +
+ 'dCBBdXRob3JpdHkgRzMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB' +
+ 'AQDKUkvqHv/OJGuo2nIYaNVWXQ5IWi01CXZaz6TIHLGp/lOJ+600/4hbn7vn' +
+ '6AAB3DVzdQOts7G5pH0rJnnOFUAK71G4nzKMfHCGUksW/mona+Y2emJQ2N+a' +
+ 'icwJKetPKRSIgAuPOB6Aahh8Hb2XO3h9RUk2T0HNouB2VzxoMXlkyW7XUR5m' +
+ 'w6JkLHnA52XDVoRTWkNty5oCINLvGmnRsJ1zouAqYGVQMc/7sy+/EYhALrVJ' +
+ 'EA8KbtyX+r8snwU5C1hUrwaW6MWOARa8qBpNQcWTkaIeoYvy/sGIJEmjR0vF' +
+ 'EwHdp1cSaWIr6/4g72n7OqXwfinu7ZYW97EfoOSQJeAzAgMBAAGjggEzMIIB' +
+ 'LzAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUF' +
+ 'BwMCMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFHfCuFCaZ3Z2sS3C' +
+ 'htCDoH6mfrpLMB8GA1UdIwQYMBaAFJviB1dnHB7AagbeWbSaLd/cGYYuMDUG' +
+ 'CCsGAQUFBwEBBCkwJzAlBggrBgEFBQcwAYYZaHR0cDovL29jc3AucGtpLmdv' +
+ 'b2cvZ3NyMjAyBgNVHR8EKzApMCegJaAjhiFodHRwOi8vY3JsLnBraS5nb29n' +
+ 'L2dzcjIvZ3NyMi5jcmwwPwYDVR0gBDgwNjA0BgZngQwBAgIwKjAoBggrBgEF' +
+ 'BQcCARYcaHR0cHM6Ly9wa2kuZ29vZy9yZXBvc2l0b3J5LzANBgkqhkiG9w0B' +
+ 'AQsFAAOCAQEAHLeJluRT7bvs26gyAZ8so81trUISd7O45skDUmAge1cnxhG1' +
+ 'P2cNmSxbWsoiCt2eux9LSD+PAj2LIYRFHW31/6xoic1k4tbWXkDCjir37xTT' +
+ 'NqRAMPUyFRWSdvt+nlPqwnb8Oa2I/maSJukcxDjNSfpDh/Bd1lZNgdd/8cLd' +
+ 'sE3+wypufJ9uXO1iQpnh9zbuFIwsIONGl1p3A8CgxkqI/UAih3JaGOqcpcda' +
+ 'CIzkBaR9uYQ1X4k2Vg5APRLouzVy7a8IVk6wuy6pm+T7HT4LY8ibS5FEZlfA' +
+ 'FLSW8NwsVz9SBK2Vqn1N0PIMn5xA6NZVc7o835DLAFshEWfC7TIe3g==',
+ 'MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEg' +
+ 'MB4GA1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkds' +
+ 'b2JhbFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAw' +
+ 'WhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3Qg' +
+ 'Q0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFs' +
+ 'U2lnbjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8o' +
+ 'mUVCxKs+IVSbC9N/hHD6ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe' +
+ '+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1' +
+ 'AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjNS7SgfQx5' +
+ 'TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo' +
+ '4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99y' +
+ 'qWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8E' +
+ 'BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IHV2ccHsBqBt5Z' +
+ 'tJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9iYWxz' +
+ 'aWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0' +
+ 'mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs' +
+ 'J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4' +
+ 'h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRD' +
+ 'LenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7' +
+ '9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmg' +
+ 'QWpzU/qlULRuJQ/7TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq' +
+ '/H5COEBkEveegeGTLg=='
+ ]);
+ };
+
// Simple sanity check to make sure network throttling is wired up
// See crbug.com/747724
TestSuite.prototype.testOfflineNetworkConditions = async function() {
@@ -1329,6 +1412,33 @@
this.releaseControl();
};
+ TestSuite.prototype.testExtensionWebSocketUserAgentOverride = async function(websocketPort) {
+ this.takeControl();
+
+ const testUserAgent = 'test user agent';
+ SDK.multitargetNetworkManager.setUserAgentOverride(testUserAgent);
+
+ function onRequestUpdated(event) {
+ const request = event.data;
+ if (request.resourceType() !== Common.resourceTypes.WebSocket)
+ return;
+ if (!request.requestHeadersText())
+ return;
+
+ let actualUserAgent = 'no user-agent header';
+ for (const {name, value} of request.requestHeaders()) {
+ if (name.toLowerCase() === 'user-agent')
+ actualUserAgent = value;
+ }
+ this.assertEquals(testUserAgent, actualUserAgent);
+ this.releaseControl();
+ }
+ SDK.targetManager.addModelListener(
+ SDK.NetworkManager, SDK.NetworkManager.Events.RequestUpdated, onRequestUpdated.bind(this));
+
+ this.evaluateInConsole_(`new WebSocket('ws://127.0.0.1:${websocketPort}')`, () => {});
+ };
+
/**
* Serializes array of uiSourceCodes to string.
* @param {!Array.<!Workspace.UISourceCode>} uiSourceCodes
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/accessibility/accessibilityNode.css b/chromium/third_party/blink/renderer/devtools/front_end/accessibility/accessibilityNode.css
index 7b624a9e021..bcb8f758112 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/accessibility/accessibilityNode.css
+++ b/chromium/third_party/blink/renderer/devtools/front_end/accessibility/accessibilityNode.css
@@ -4,20 +4,11 @@
* found in the LICENSE file.
*/
-.sidebar-pane.accessibility-computed {
- background-color: rgba(0, 0, 0, 0.03);
-}
-
.widget.ax-subpane {
overflow-x: hidden;
-webkit-user-select: text;
}
-div.ax-text-alternatives {
- margin-bottom: 3px;
- border-bottom: 1px solid #BFBFBF;
-}
-
.ax-ignored-info {
padding: 6px;
}
@@ -43,10 +34,6 @@ span.ax-value-undefined {
text-decoration: line-through;
}
-.sidebar-pane-stack .sidebar-pane {
- padding-left: 4px;
-}
-
.tree-outline span[is=dt-icon-label] {
position: relative;
left: -11px;
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/accessibility/accessibility_strings.grdp b/chromium/third_party/blink/renderer/devtools/front_end/accessibility/accessibility_strings.grdp
new file mode 100644
index 00000000000..4023c8cb4ff
--- /dev/null
+++ b/chromium/third_party/blink/renderer/devtools/front_end/accessibility/accessibility_strings.grdp
@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="utf-8"?>
+<grit-part>
+ <message name="IDS_DEVTOOLS_185551542d4a950d6ed4a90e0875dfde" desc="">
+ Computed Properties
+ </message>
+ <message name="IDS_DEVTOOLS_191abc41f8f74fb8c9671ca8f21b7433" desc="">
+ Element not interesting for accessibility.
+ </message>
+ <message name="IDS_DEVTOOLS_1c2be4cda7b85620e6dca5fb505feedc" desc="">
+ Element has empty alt text.
+ </message>
+ <message name="IDS_DEVTOOLS_3b1afa99cd297c96939424e1438e12f2" desc="">
+ Element inherits presentational role from 
+ </message>
+ <message name="IDS_DEVTOOLS_4ada42850cc2d4e41f3da5254ec2feee" desc="">
+ Element is inert.
+ </message>
+ <message name="IDS_DEVTOOLS_52886045a6932b0bbb56620fe5c584bf" desc="">
+ Ancestor&apos;s children are all presentational: 
+ </message>
+ <message name="IDS_DEVTOOLS_5a51e4de1a235f3f67e816cb561d3d5a" desc="">
+ Element is <ph name="ARIAHIDDENSPAN">$1s</ph>.
+ </message>
+ <message name="IDS_DEVTOOLS_5cd2b4477fa05212ce32e073702b6938" desc="">
+ No ARIA attributes
+ </message>
+ <message name="IDS_DEVTOOLS_5d910721a6256ce42c8c6308dc60ff40" desc="">
+ Static text node is used as name for 
+ </message>
+ <message name="IDS_DEVTOOLS_5f05a00053834655de812d3447545a17" desc="">
+ No node with this ID.
+ </message>
+ <message name="IDS_DEVTOOLS_7d615068dd4fb142c11a29553b9b83bf" desc="">
+ Element is presentational.
+ </message>
+ <message name="IDS_DEVTOOLS_80c9f4e5b244cf617075b8ce23a3ed27" desc="">
+ ARIA Attributes
+ </message>
+ <message name="IDS_DEVTOOLS_939aaa05e0943b39eab3a34fd609384d" desc="">
+ Scroll into view
+ </message>
+ <message name="IDS_DEVTOOLS_970e14ef4e4d726d36b6ed0ea92bef83" desc="">
+ Accessibility node not exposed
+ </message>
+ <message name="IDS_DEVTOOLS_98b6f72f9b4c1883deddc61bc62d71eb" desc="">
+ Element is not visible.
+ </message>
+ <message name="IDS_DEVTOOLS_a4853b77c462337ed9fecc32e4d44d7b" desc="">
+ Accessibility Tree
+ </message>
+ <message name="IDS_DEVTOOLS_a858dfbc32e2169e89668adf8e997f6f" desc="">
+ No accessibility node
+ </message>
+ <message name="IDS_DEVTOOLS_aff2b966e54c2212e86343d2bb8d3f88" desc="">
+ Part of label element: 
+ </message>
+ <message name="IDS_DEVTOOLS_b05cf8cea038a89494e9e232e65af3f3" desc="">
+ Element is not rendered.
+ </message>
+ <message name="IDS_DEVTOOLS_cd9da90ce06215f24f648786501e4073" desc="">
+ Element is hidden by active modal dialog: 
+ </message>
+ <message name="IDS_DEVTOOLS_cfa5234b2737df4bc3dc737484605c39" desc="">
+ <ph name="ARIAHIDDENSPAN">$1s</ph> is <ph name="TRUESPAN">$2s</ph> on ancestor: 
+ </message>
+ <message name="IDS_DEVTOOLS_d7dff47e75bfd5f107407eded09ee6f0" desc="">
+ Element has <ph name="ROLEPRESENTATIONSPAN">$1s</ph>.
+ </message>
+ <message name="IDS_DEVTOOLS_d96143ba1b15645919cea00ec9d1be62" desc="">
+ Ignored
+ </message>
+ <message name="IDS_DEVTOOLS_dd3195ced9c1810388e28ca2b4eb921f" desc="">
+ Not specified
+ </message>
+ <message name="IDS_DEVTOOLS_e0dcc9aef6db5e61e4102efdf5d54378" desc="">
+ Invalid source.
+ </message>
+ <message name="IDS_DEVTOOLS_e0e4fc6213e8b3593495a7260c3a4c2e" desc="">
+ Accessibility
+ </message>
+ <message name="IDS_DEVTOOLS_e71c63b8e5a312662941ee8606e8c43a" desc="">
+ Label for 
+ </message>
+ <message name="IDS_DEVTOOLS_e7be8f80bd8db0b8ca6bb2dee175b623" desc="">
+ Element is in an inert subtree from 
+ </message>
+ <message name="IDS_DEVTOOLS_fc6dc044799975f19c864e9b31e3bb76" desc="">
+ No text content.
+ </message>
+</grit-part> \ No newline at end of file
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/animation/animationTimeline.css b/chromium/third_party/blink/renderer/devtools/front_end/animation/animationTimeline.css
index 37f109c646e..8155fb49917 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/animation/animationTimeline.css
+++ b/chromium/third_party/blink/renderer/devtools/front_end/animation/animationTimeline.css
@@ -289,19 +289,6 @@ text.animation-timeline-grid-label {
background-color: #EFF4FD;
}
-.animation-timeline-empty-message {
- padding-left: 230px;
- padding-right: 30px;
- text-align: center;
- position: absolute;
- font-size: 20px;
- line-height: 32px;
- align-items: center; justify-content: center;
- width: 100%;
- height: calc(100% - 44px);
- display: flex;
-}
-
.animation-buffer-preview {
height: 40px;
margin: 4px 2px;
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/animation/animation_strings.grdp b/chromium/third_party/blink/renderer/devtools/front_end/animation/animation_strings.grdp
new file mode 100644
index 00000000000..656e1fb140b
--- /dev/null
+++ b/chromium/third_party/blink/renderer/devtools/front_end/animation/animation_strings.grdp
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<grit-part>
+ <message name="IDS_DEVTOOLS_043d2f0a7edca94cae1cfbf3f90b3b68" desc="">
+ Animations
+ </message>
+ <message name="IDS_DEVTOOLS_105b296a83f9c105355403f3332af50f" desc="">
+ Pause
+ </message>
+ <message name="IDS_DEVTOOLS_31fb6ba50d7a98f1650f282ecc45af77" desc="">
+ Set speed to <ph name="BUTTON_TEXTCONTENT">$1s</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_4008ed4e30be53588254064e9bca502e" desc="">
+ Pause timeline
+ </message>
+ <message name="IDS_DEVTOOLS_5fe41afb268c87f4f56027023d3e6406" desc="">
+ <ph name="PLAYBACKRATE______">$1s</ph>%
+ </message>
+ <message name="IDS_DEVTOOLS_81aa2078d1eceede831b2976dbf32e62" desc="">
+ Clear all
+ </message>
+ <message name="IDS_DEVTOOLS_96952fa958a61d47ed4dee3f2c3dee64" desc="">
+ Pause all
+ </message>
+ <message name="IDS_DEVTOOLS_96b5ffa6e4c4b57e832f8e26229ed786" desc="">
+ Play timeline
+ </message>
+ <message name="IDS_DEVTOOLS_9ea575b416c0fb4d80772ab08ce039f8" desc="">
+ Select an effect above to inspect and modify.
+ </message>
+ <message name="IDS_DEVTOOLS_ba5ef3fb1e406e7707dc5f449adaa176" desc="">
+ Listening for animations...
+ </message>
+ <message name="IDS_DEVTOOLS_bdf578b505f481a1dbb4555c16dd9a51" desc="">
+ Replay timeline
+ </message>
+ <message name="IDS_DEVTOOLS_bffa3e523792264bd31830c746b6d388" desc="">
+ Resume all
+ </message>
+</grit-part> \ No newline at end of file
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/audits2/Audits2Controller.js b/chromium/third_party/blink/renderer/devtools/front_end/audits2/Audits2Controller.js
index 6869d7c22f0..6b5b9e4eb46 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/audits2/Audits2Controller.js
+++ b/chromium/third_party/blink/renderer/devtools/front_end/audits2/Audits2Controller.js
@@ -199,32 +199,32 @@ Audits2.Presets = [
{
setting: Common.settings.createSetting('audits2.cat_perf', true),
configID: 'performance',
- title: 'Performance',
- description: 'How long does this app take to show content and become usable'
+ title: ls`Performance`,
+ description: ls`How long does this app take to show content and become usable`
},
{
setting: Common.settings.createSetting('audits2.cat_pwa', true),
configID: 'pwa',
- title: 'Progressive Web App',
- description: 'Does this page meet the standard of a Progressive Web App'
+ title: ls`Progressive Web App`,
+ description: ls`Does this page meet the standard of a Progressive Web App`
},
{
setting: Common.settings.createSetting('audits2.cat_best_practices', true),
configID: 'best-practices',
- title: 'Best practices',
- description: 'Does this page follow best practices for modern web development'
+ title: ls`Best practices`,
+ description: ls`Does this page follow best practices for modern web development`
},
{
setting: Common.settings.createSetting('audits2.cat_a11y', true),
configID: 'accessibility',
- title: 'Accessibility',
- description: 'Is this page usable by people with disabilities or impairments'
+ title: ls`Accessibility`,
+ description: ls`Is this page usable by people with disabilities or impairments`
},
{
setting: Common.settings.createSetting('audits2.cat_seo', true),
configID: 'seo',
- title: 'SEO',
- description: 'Is this page optimized for search engine results ranking'
+ title: ls`SEO`,
+ description: ls`Is this page optimized for search engine results ranking`
},
];
@@ -237,7 +237,9 @@ Audits2.RuntimeSettings = [
setting: Common.settings.createSetting('audits2.device_type', 'mobile'),
description: ls`Apply mobile emulation during auditing`,
setFlags: (flags, value) => {
- flags.disableDeviceEmulation = value === 'desktop';
+ flags._devtoolsEmulationType = value;
+ // See Audits.AuditsPanel._setupEmulationAndProtocolConnection()
+ flags.emulatedFormFactor = 'none';
},
options: [
{label: ls`Mobile`, value: 'mobile'},
@@ -260,19 +262,19 @@ Audits2.RuntimeSettings = [
},
options: [
{
- label: ls`Simulated Fast 3G, 4x CPU Slowdown`,
+ label: ls`Simulated Slow 4G, 4x CPU Slowdown`,
value: 'default',
- title: 'Throttling is simulated, resulting in faster audit runs with similar measurement accuracy'
+ title: ls`Throttling is simulated, resulting in faster audit runs with similar measurement accuracy`
},
{
- label: ls`Applied Fast 3G, 4x CPU Slowdown`,
+ label: ls`Applied Slow 4G, 4x CPU Slowdown`,
value: 'devtools',
- title: 'Typical DevTools throttling, with actual traffic shaping and CPU slowdown applied'
+ title: ls`Typical DevTools throttling, with actual traffic shaping and CPU slowdown applied`
},
{
label: ls`No throttling`,
value: 'off',
- title: 'No network or CPU throttling used. (Useful when not evaluating performance)'
+ title: ls`No network or CPU throttling used. (Useful when not evaluating performance)`
},
],
},
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/audits2/Audits2Panel.js b/chromium/third_party/blink/renderer/devtools/front_end/audits2/Audits2Panel.js
index 8d2053410da..3a0d2cc1baf 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/audits2/Audits2Panel.js
+++ b/chromium/third_party/blink/renderer/devtools/front_end/audits2/Audits2Panel.js
@@ -148,6 +148,11 @@ Audits2.Audits2Panel = class extends UI.Panel {
const el = renderer.renderReport(lighthouseResult, reportContainer);
Audits2.ReportRenderer.addViewTraceButton(el, artifacts);
Audits2.ReportRenderer.linkifyNodeDetails(el);
+ Audits2.ReportRenderer.handleDarkMode(el);
+
+ const features = new ReportUIFeatures(dom);
+ features.setTemplateContext(templatesDOM);
+ features.initFeatures(lighthouseResult);
this._cachedRenderedReports.set(lighthouseResult, reportContainer);
}
@@ -237,6 +242,12 @@ Audits2.Audits2Panel = class extends UI.Panel {
this._renderStartView();
}
+ /**
+ * We set the device emulation on the DevTools-side for two reasons:
+ * 1. To workaround some odd device metrics emulation bugs like occuluding viewports
+ * 2. To get the attractive device outline
+ * flags.emulatedFormFactor is always set to none, so Lighthouse doesn't apply its own emulation.
+ */
async _setupEmulationAndProtocolConnection() {
const flags = this._controller.getFlags();
@@ -245,11 +256,10 @@ Audits2.Audits2Panel = class extends UI.Panel {
this._emulationOutlineEnabledBefore = emulationModel.deviceOutlineSetting().get();
emulationModel.toolbarControlsEnabledSetting().set(false);
- if (flags.disableDeviceEmulation) {
+ if (flags._devtoolsEmulationType === 'desktop') {
emulationModel.enabledSetting().set(false);
- emulationModel.deviceOutlineSetting().set(false);
emulationModel.emulate(Emulation.DeviceModeModel.Type.None, null, null);
- } else {
+ } else if (flags._devtoolsEmulationType === 'mobile') {
emulationModel.enabledSetting().set(true);
emulationModel.deviceOutlineSetting().set(true);
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/audits2/Audits2ReportRenderer.js b/chromium/third_party/blink/renderer/devtools/front_end/audits2/Audits2ReportRenderer.js
index 62487a82756..e004e7f55cf 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/audits2/Audits2ReportRenderer.js
+++ b/chromium/third_party/blink/renderer/devtools/front_end/audits2/Audits2ReportRenderer.js
@@ -57,4 +57,12 @@ Audits2.ReportRenderer = class extends ReportRenderer {
origElement.appendChild(element);
}
}
+
+ /**
+ * @param {!Element} el
+ */
+ static handleDarkMode(el) {
+ if (UI.themeSupport.themeName() === 'dark')
+ el.classList.add('dark');
+ }
};
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/audits2/Audits2StartView.js b/chromium/third_party/blink/renderer/devtools/front_end/audits2/Audits2StartView.js
index cd3eae4a09b..c7eb7ccc99b 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/audits2/Audits2StartView.js
+++ b/chromium/third_party/blink/renderer/devtools/front_end/audits2/Audits2StartView.js
@@ -87,10 +87,11 @@ Audits2.StartView = class extends UI.Widget {
<header>
<div class="audits2-logo"></div>
<div class="audits2-start-view-text">
- <h2>Audits</h2>
+ <h2>${ls`Audits`}</h2>
<p>
- Identify and fix common problems that affect your site's performance, accessibility, and user experience.
- <span class="link" $="learn-more">Learn more</a>
+ ${ls`Identify and fix common problems that affect your site's performance,
+ accessibility, and user experience.`}
+ <span class="link" $="learn-more">${ls`Learn more`}</a>
</p>
</div>
</header>
@@ -98,21 +99,21 @@ Audits2.StartView = class extends UI.Widget {
<div class="audits2-form-section">
<div class="audits2-form-section-label">
<i>${deviceIcon}</i>
- <div class="audits2-icon-label">Device</div>
+ <div class="audits2-icon-label">${ls`Device`}</div>
</div>
<div class="audits2-form-elements" $="device-type-form-elements"></div>
</div>
<div class="audits2-form-section">
<div class="audits2-form-section-label">
<i>${categoriesIcon}</i>
- <div class="audits2-icon-label">Audits</div>
+ <div class="audits2-icon-label">${ls`Audits`}</div>
</div>
<div class="audits2-form-elements" $="categories-form-elements"></div>
</div>
<div class="audits2-form-section">
<div class="audits2-form-section-label">
<i>${throttlingIcon}</i>
- <div class="audits2-icon-label">Throttling</div>
+ <div class="audits2-icon-label">${ls`Throttling`}</div>
</div>
<div class="audits2-form-elements" $="throttling-form-elements"></div>
</div>
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/audits2/Audits2StatusView.js b/chromium/third_party/blink/renderer/devtools/front_end/audits2/Audits2StatusView.js
index 149eb45e8ac..01335774ead 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/audits2/Audits2StatusView.js
+++ b/chromium/third_party/blink/renderer/devtools/front_end/audits2/Audits2StatusView.js
@@ -273,14 +273,14 @@ Audits2.StatusView.StatusPhases = [
id: 'gathering',
progressBarClass: 'gathering',
message: 'Lighthouse is gathering information about the page to compute your score.',
- statusMessagePrefix: 'Retrieving',
+ statusMessagePrefix: 'Gathering',
order: 20,
},
{
id: 'auditing',
progressBarClass: 'auditing',
message: 'Almost there! Lighthouse is now generating your report.',
- statusMessagePrefix: 'Evaluating',
+ statusMessagePrefix: 'Auditing',
order: 30,
}
];
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/audits2/audits2Dialog.css b/chromium/third_party/blink/renderer/devtools/front_end/audits2/audits2Dialog.css
index 60a4b747a78..0ab61279296 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/audits2/audits2Dialog.css
+++ b/chromium/third_party/blink/renderer/devtools/front_end/audits2/audits2Dialog.css
@@ -108,8 +108,3 @@
0% { width: var(--progress-bar-auditing-percent); }
100% { width: 99%; }
}
-
-.audits2-report-error {
- display: block;
- margin-top: 5px;
-}
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/audits2/audits2Panel.css b/chromium/third_party/blink/renderer/devtools/front_end/audits2/audits2Panel.css
index 92ee823f463..5db7549a03e 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/audits2/audits2Panel.css
+++ b/chromium/third_party/blink/renderer/devtools/front_end/audits2/audits2Panel.css
@@ -12,33 +12,6 @@
.lh-root {
--report-menu-width: 0;
user-select: text;
- --lh-bg-color: #fff;
- background-color: var(--lh-bg-color);
-}
-
-.-theme-with-dark-background .lh-root {
- --header-bg-color: hsl(0, 0%, 20%);
- --lh-table-header-bg: hsl(0, 0%, 20%);
- --display-value-gray: hsl(0, 0%, 66%);
- --medium-75-gray: hsl(0, 0%, 66%);
-
- --subheader-color: hsl(210, 15%, 80%);
- --lh-bg-color: hsl(0, 0%, 14%);
- --secondary-text-color: hsl(0, 0%, 66%);
- --report-secondary-border-color: hsl(0, 0%, 8%);
-}
-
-.-theme-with-dark-background .lh-root .lh-gauge {
- --circle-background: hsl(0, 0%, 27%);
- --inset-color: var(--lh-bg-color);
-}
-
-.lh-root .lh-container {
- word-wrap: normal;
-}
-
-.lh-root pre {
- word-wrap: break-word;
}
/* for View Trace button */
@@ -50,33 +23,5 @@ button.view-trace {
}
.audits2-results-container {
- overflow-y: scroll;
position: relative;
}
-
-/* TODO(phulce): remove the below on next LH roll */
-
-.-theme-with-dark-background .lh-scores-wrapper__background, .-theme-with-dark-background .lh-scores-wrapper__shadow {
- background: var(--lh-bg-color) !important;
-}
-
-.-theme-with-dark-background .lh-gauge__label {
- color: hsl(210, 15%, 80%);
-}
-
-.-theme-with-dark-background .lh-root .lh-audit a, .-theme-with-dark-background .lh-footer a {
- color: hsl(210, 90%, 60%);
-}
-
-.-theme-with-dark-background .lh-load-opportunity__header .lh-load-opportunity__col {
- background: hsl(0, 0%, 20%);
-}
-
-.-theme-with-dark-background .lh-crc .crc-node__tree-hostname {
- color: hsl(0, 0%, 66%);
-}
-
-.-theme-with-dark-background .lh-audit-group__header::before {
- background-color: hsl(0, 0%, 80%);
- filter: invert(1);
-} \ No newline at end of file
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/audits2/audits2_strings.grdp b/chromium/third_party/blink/renderer/devtools/front_end/audits2/audits2_strings.grdp
new file mode 100644
index 00000000000..8202dda3ed0
--- /dev/null
+++ b/chromium/third_party/blink/renderer/devtools/front_end/audits2/audits2_strings.grdp
@@ -0,0 +1,148 @@
+<?xml version="1.0" encoding="utf-8"?>
+<grit-part>
+ <message name="IDS_DEVTOOLS_026d213afe4c17e37ac8306b77e9f870" desc="">
+ Auditing your web page
+ </message>
+ <message name="IDS_DEVTOOLS_0503ffa75a95f35877fe7420d061b6a9" desc="">
+ Progressive Web App
+ </message>
+ <message name="IDS_DEVTOOLS_070716fc9cd3859f51f3860a349bad2f" desc="">
+ Simulated Slow 4G, 4x CPU Slowdown
+ </message>
+ <message name="IDS_DEVTOOLS_0f39dfdd740bf99080ca83e56e2cfb4c" desc="">
+ 💡 <ph name="THIS__FASTFACTSQUEUED_FASTFACTINDEX_">$1s</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_1421c82f3616812789ac346b1638e39d" desc="">
+ Run audits
+ </message>
+ <message name="IDS_DEVTOOLS_1583d36995134f9120fac115c08e0174" desc="">
+ Loading…
+ </message>
+ <message name="IDS_DEVTOOLS_15a895a381c23eff5397d8b1f318a726" desc="">
+ No network or CPU throttling used. (Useful when not evaluating performance)
+ </message>
+ <message name="IDS_DEVTOOLS_161bf73e31de6b8e3d856815473cbe1c" desc="">
+ View Trace
+ </message>
+ <message name="IDS_DEVTOOLS_17de62900ceac9101c8814b4c4874328" desc="">
+ Apply mobile emulation during auditing
+ </message>
+ <message name="IDS_DEVTOOLS_193c4edb3ab576449959f6710e017a49" desc="">
+ Typical DevTools throttling, with actual traffic shaping and CPU slowdown applied
+ </message>
+ <message name="IDS_DEVTOOLS_1c481aa99d081c32182011a758f73d33" desc="">
+ <ph name="MATCH_MESSAGE">$1s</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_2310408a63388fe57e3a4177168a8798" desc="">
+ Desktop
+ </message>
+ <message name="IDS_DEVTOOLS_2a96c07a6c11ca7add2b1ffde86efe25" desc="">
+ Can only audit HTTP/HTTPS pages and Chrome extensions. Navigate to a different page to start an audit.
+ </message>
+ <message name="IDS_DEVTOOLS_39680b3025b1f8d881f9d983623bf071" desc="">
+ Lighthouse is loading your page
+ </message>
+ <message name="IDS_DEVTOOLS_3b7e043f46813f1d8ffbd462eb77fb6c" desc="">
+ How long does this app take to show content and become usable
+ </message>
+ <message name="IDS_DEVTOOLS_3e3f8a3abd60f2389b744ca8ed0aa4d9" desc="">
+ No throttling
+ </message>
+ <message name="IDS_DEVTOOLS_3ee3aab0791156ff1d5e0481ed4589b2" desc="">
+ Applied Slow 4G, 4x CPU Slowdown
+ </message>
+ <message name="IDS_DEVTOOLS_41fdb410354e76ef7674f98e1cc84c8f" desc="">
+ Throttling
+ </message>
+ <message name="IDS_DEVTOOLS_48d24d11c7c71282366fe2007d4cee3b" desc="">
+ Throttling is simulated, resulting in faster audit runs with similar measurement accuracy
+ </message>
+ <message name="IDS_DEVTOOLS_4ab5093468559edd5940ac59f1c6ac02" desc="">
+ Try to navigate to the URL in a fresh Chrome profile without any other tabs or extensions open and try again.
+ </message>
+ <message name="IDS_DEVTOOLS_55f562701dc2cc775f9adc0478644b2a" desc="">
+ Perform an audit…
+ </message>
+ <message name="IDS_DEVTOOLS_56395991012586c2067aa7bcb5905b50" desc="">
+ Cancelling
+ </message>
+ <message name="IDS_DEVTOOLS_64a64ca70e7a909a5a96c07082070bfc" desc="">
+ Ah, sorry! We ran into an error.
+ </message>
+ <message name="IDS_DEVTOOLS_64d266bad80369458003a71a9e04dd50" desc="">
+ Cancelling…
+ </message>
+ <message name="IDS_DEVTOOLS_6556b7f666de143f5a9826e048d5dcd8" desc="">
+ Is this page usable by people with disabilities or impairments
+ </message>
+ <message name="IDS_DEVTOOLS_6565973a762b83f476e9a76a0015b539" desc="">
+ At least one category must be selected.
+ </message>
+ <message name="IDS_DEVTOOLS_671b3beee69d9180412202b6528ec8f7" desc="">
+ Download report
+ </message>
+ <message name="IDS_DEVTOOLS_67aa731132e0e7bbabb1b3d3c363e7d6" desc="">
+ Multiple tabs are being controlled by the same service worker. Close your other tabs on the same origin to audit this page.
+ </message>
+ <message name="IDS_DEVTOOLS_72c4a2e545d220fd8c9ead876a59a89d" desc="">
+ Is this page optimized for search engine results ranking
+ </message>
+ <message name="IDS_DEVTOOLS_7bd1e4f7363173e2c8329551ca4d38cc" desc="">
+ (new audit)
+ </message>
+ <message name="IDS_DEVTOOLS_87d17f4624a514e81dc7c8e016a7405c" desc="">
+ Mobile
+ </message>
+ <message name="IDS_DEVTOOLS_88450f419690173d62fb0a30fb29a951" desc="">
+ Auditing <ph name="PAGEHOST">$1s</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_8eb7115e5b4ba55f56931ec24c789f9e" desc="">
+ Lighthouse is warming up…
+ </message>
+ <message name="IDS_DEVTOOLS_8fe967af0fb77d0261a6ead91bcd607f" desc="">
+ Reset storage (localStorage, IndexedDB, etc) before auditing. (Good for performance &amp; PWA testing)
+ </message>
+ <message name="IDS_DEVTOOLS_9446a98ad14416153cc4d45ab8b531bf" desc="">
+ Performance
+ </message>
+ <message name="IDS_DEVTOOLS_b06c94565d768dd75535120f2f8482a7" desc="">
+ Audits
+ </message>
+ <message name="IDS_DEVTOOLS_b1b01acb63f79615b05f6d816705d7d3" desc="">
+ Does this page meet the standard of a Progressive Web App
+ </message>
+ <message name="IDS_DEVTOOLS_bc28aa52ba5b534ad9d198157c375d67" desc="">
+ Clear storage
+ </message>
+ <message name="IDS_DEVTOOLS_bcf2457dd80557dd7ebdc1504b6149e6" desc="">
+ Does this page follow best practices for modern web development
+ </message>
+ <message name="IDS_DEVTOOLS_c2ffe02d76c4f089648f1647b43e4ee5" desc="">
+ Best practices
+ </message>
+ <message name="IDS_DEVTOOLS_c3669fa42d4becdd2831b9685cf607bb" desc="">
+ Identify and fix common problems that affect your site&apos;s performance,
+ accessibility, and user experience.
+ </message>
+ <message name="IDS_DEVTOOLS_c91c7b93c28cd18741b71f727ee81ee3" desc="">
+ Reports
+ </message>
+ <message name="IDS_DEVTOOLS_d59048f21fd887ad520398ce677be586" desc="">
+ Learn more
+ </message>
+ <message name="IDS_DEVTOOLS_d88946b678e4c2f251d4e292e8142291" desc="">
+ SEO
+ </message>
+ <message name="IDS_DEVTOOLS_e0ac20adce6ffee48c7151b070aa5737" desc="">
+ Device
+ </message>
+ <message name="IDS_DEVTOOLS_e499f5109f685235e6280179fe22beec" desc="">
+ Drop audit file here
+ </message>
+ <message name="IDS_DEVTOOLS_ea4788705e6873b424c65e91c2846b19" desc="">
+ Cancel
+ </message>
+ <message name="IDS_DEVTOOLS_ea60ba1496b05c6a5816fb75d0665c8d" desc="">
+ If this issue is reproducible, please report it at the Lighthouse GitHub repo.
+ </message>
+</grit-part> \ No newline at end of file
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/audits2/lighthouse/report.css b/chromium/third_party/blink/renderer/devtools/front_end/audits2/lighthouse/report.css
index 0c579479e69..8a0d5e4c167 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/audits2/lighthouse/report.css
+++ b/chromium/third_party/blink/renderer/devtools/front_end/audits2/lighthouse/report.css
@@ -17,10 +17,11 @@
.lh-vars {
--text-font-family: Roboto, Helvetica, Arial, sans-serif;
- --monospace-font-family: 'Menlo', 'dejavu sans mono', 'Consolas', 'Lucida Console', monospace;
+ --monospace-font-family: 'Roboto Mono', 'Menlo', 'dejavu sans mono', 'Consolas', 'Lucida Console', monospace;
--body-background-color: #fff;
- --body-font-size: 14px;
- --body-line-height: 18px;
+ --body-text-color: var(--color-black-900);
+ --body-font-size: 16px;
+ --body-line-height: 24px;
--subheader-font-size: 14px;
--subheader-line-height: 20px;
--subheader-color: hsl(206, 6%, 25%);
@@ -39,17 +40,13 @@
--audit-indent: 16px;
--text-indent: 8px;
--expandable-indent: 20px;
- --secondary-text-color: #565656;
+ --secondary-text-color: var(--color-black-800);
/*--accent-color: #3879d9;*/
- --fail-color: hsl(1, 73%, 45%);
- --average-color: hsl(31, 100%, 45%); /* md orange 800 */
- --pass-color: hsl(139, 70%, 30%);
- --informative-color: #0c50c7;
+ --informative-color: var(--color-blue-900);
--medium-75-gray: #757575;
--medium-50-gray: hsl(210, 17%, 98%);
--medium-100-gray: hsl(200, 12%, 95%);
--warning-color: #ffab00; /* md amber a700 */
- --report-border-color: #ccc;
--report-secondary-border-color: #ebebeb;
--metric-timeline-rule-color: #b3b3b3;
--display-value-gray: hsl(216, 5%, 39%);
@@ -66,13 +63,14 @@
--lh-score-highlight-bg: hsla(0, 0%, 90%, 0.2);
--lh-score-icon-background-size: 24px;
--lh-group-icon-background-size: var(--lh-score-icon-background-size);
+ --lh-export-icon-size: var(--lh-score-icon-background-size);
+ --lh-export-icon-color: var(--medium-75-gray);
--lh-score-margin: 12px;
--lh-table-header-bg: #f8f9fa;
--lh-table-higlight-bg: hsla(0, 0%, 75%, 0.1);
--lh-sparkline-height: 5px;
--lh-sparkline-thin-height: 3px;
--lh-filmstrip-thumbnail-width: 60px;
- --lh-score-icon-width: calc(var(--body-font-size) / 14 * 16);
--lh-category-score-width: calc(5 * var(--body-font-size));
--lh-audit-vpadding: 8px;
--lh-audit-index-width: 18px;
@@ -80,37 +78,174 @@
--lh-audit-group-vpadding: 8px;
--lh-section-vpadding: 12px;
--chevron-size: 12px;
- --circle-size: calc(3 * var(--header-font-size));
+ --inner-audit-left-padding: calc(var(--score-shape-size) + var(--score-shape-margin-left) + var(--score-shape-margin-right));
+
+ /* Palette using Material Design Colors
+ * https://www.materialui.co/colors */
+ --color-black-100: #F5F5F5;
+ --color-black-200: #E0E0E0;
+ --color-black-400: #BDBDBD;
+ --color-black-500: #9E9E9E;
+ --color-black-600: #757575;
+ --color-black-800: #424242;
+ --color-black-900: #212121;
+ --off-black: #111111;
+ --color-black: #000000;
+ --color-blue: #2962FF;
+ --color-green-700: #018642;
+ --color-green: #0CCE6B;
+ --color-orange-700: #D04900;
+ --color-orange: #FFA400;
+ --color-red-700: #EB0F00;
+ --color-red: #FF4E42;
+ --color-white: #FFFFFF;
+ --color-blue-200: #90CAF9;
+ --color-blue-900: #0D47A1;
+ --color-cyan-500: #00BCD4;
+ --color-teal-600: #00897B;
+
+
+ /* TODO(cjamcl) clean up unused variables. */
+ --audits-margin-bottom: 40px;
+ --env-item-bg: var(--color-black-100);
+ --env-name-min-width: 220px;
+ --env-tem-padding: 10px 0px;
+ --expandable-padding: 0 0 2px calc(var(--score-shape-margin-left) + var(--score-shape-size) + var(--score-shape-margin-right));
+ --gauge-circle-size-big: 112px;
+ --gauge-circle-size: 80px;
+ --header-padding: 20px 0 20px 0;
+ --highlighter-bg: var(--color-black-400);
+ --icon-square-size: calc(var(--score-shape-size) * 0.88);
+ --plugin-badge-bg: var(--color-white);
+ --plugin-badge-size-big: calc(var(--gauge-circle-size-big) / 2.7);
+ --plugin-badge-size: calc(var(--gauge-circle-size) / 2.7);
+ --plugin-icon-size: 65%;
+ --pwa-icon-margin: 0 6px 0 -2px;
+ --pwa-icon-size: var(--topbar-icon-size);
+ --score-container-padding: 8px;
+ --score-container-width: 148px;
+ --score-number-font-size-big: 38px;
+ --score-number-font-size: 28px;
+ --score-shape-margin-left: 4px;
+ --score-shape-margin-right: 12px;
+ --score-shape-margin: 0 var(--score-shape-margin-right) 0 var(--score-shape-margin-left);
+ --score-shape-size: 12px;
+ --score-title-font-size-big: 28px;
+ --score-title-font-size: 20px;
+ --score-title-line-height-big: 36px;
+ --score-title-line-height: 26px;
+ --scorescale-height: 6px;
+ --scorescale-width: 18px;
+ --section-padding: 40px;
+ --topbar-bg: var(--color-black-100);
+ --topbar-height: 32px;
+ --topbar-icon-size: 24px;
+ --topbar-padding: 0 8px;
+ --metrics-toggle-color: var(--color-black-200);
+
+ --color-average-secondary: var(--color-orange-700);
+ --color-average: var(--color-orange);
+ --color-fail-secondary: var(--color-red-700);
+ --color-fail: var(--color-red);
+ --color-pass-secondary: var(--color-green-700);
+ --color-pass: var(--color-green);
+ --color-sticky-header-bg: var(--body-background-color);
+ --color-highlighter-bg: var(--body-text-color);
+
+ --color-hover: #FAFAFA;
+ --color-metric-toggle-lines: #7F7F7F;
+
+ --plugin-icon-url: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="%23757575"><path d="M0 0h24v24H0z" fill="none"/><path d="M20.5 11H19V7c0-1.1-.9-2-2-2h-4V3.5C13 2.12 11.88 1 10.5 1S8 2.12 8 3.5V5H4c-1.1 0-1.99.9-1.99 2v3.8H3.5c1.49 0 2.7 1.21 2.7 2.7s-1.21 2.7-2.7 2.7H2V20c0 1.1.9 2 2 2h3.8v-1.5c0-1.49 1.21-2.7 2.7-2.7 1.49 0 2.7 1.21 2.7 2.7V22H17c1.1 0 2-.9 2-2v-4h1.5c1.38 0 2.5-1.12 2.5-2.5S21.88 11 20.5 11z"/></svg>');
+ --plugin-icon-url-dark: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="%23FFFFFF"><path d="M0 0h24v24H0z" fill="none"/><path d="M20.5 11H19V7c0-1.1-.9-2-2-2h-4V3.5C13 2.12 11.88 1 10.5 1S8 2.12 8 3.5V5H4c-1.1 0-1.99.9-1.99 2v3.8H3.5c1.49 0 2.7 1.21 2.7 2.7s-1.21 2.7-2.7 2.7H2V20c0 1.1.9 2 2 2h3.8v-1.5c0-1.49 1.21-2.7 2.7-2.7 1.49 0 2.7 1.21 2.7 2.7V22H17c1.1 0 2-.9 2-2v-4h1.5c1.38 0 2.5-1.12 2.5-2.5S21.88 11 20.5 11z"/></svg>');
--pass-icon-url: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48"><title>check</title><path fill="%23178239" d="M24 4C12.95 4 4 12.95 4 24c0 11.04 8.95 20 20 20 11.04 0 20-8.96 20-20 0-11.05-8.96-20-20-20zm-4 30L10 24l2.83-2.83L20 28.34l15.17-15.17L38 16 20 34z"/></svg>');
--average-icon-url: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48"><title>info</title><path fill="%23E67700" d="M24 4C12.95 4 4 12.95 4 24s8.95 20 20 20 20-8.95 20-20S35.05 4 24 4zm2 30h-4V22h4v12zm0-16h-4v-4h4v4z"/></svg>');
--fail-icon-url: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48"><title>warn</title><path fill="%23C7221F" d="M2 42h44L24 4 2 42zm24-6h-4v-4h4v4zm0-8h-4v-8h4v8z"/></svg>');
- --content-paste-icon-url: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24"><path fill="%235E6268" d="M19 2h-4.18C14.4.84 13.3 0 12 0c-1.3 0-2.4.84-2.82 2H5c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-7 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm7 18H5V4h2v3h10V4h2v16z"/><path d="M0 0h24v24H0z" fill="none"/></svg>');
- --av-timer-icon-url: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="%235E6268"><path d="M0 0h24v24H0z" fill="none"/><path d="M15 1H9v2h6V1zm-4 13h2V8h-2v6zm8.03-6.61l1.42-1.42c-.43-.51-.9-.99-1.41-1.41l-1.42 1.42A8.962 8.962 0 0 0 12 4c-4.97 0-9 4.03-9 9s4.02 9 9 9a8.994 8.994 0 0 0 7.03-14.61zM12 20c-3.87 0-7-3.13-7-7s3.13-7 7-7 7 3.13 7 7-3.13 7-7 7z"/></svg>');
- --photo-filter-icon-url: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="48" height="48"><path fill="none" d="M0 0h48v48H0V0z"/><path d="M38.04 20v18H10V10h18V6H10.04c-2.2 0-4 1.8-4 4v28c0 2.2 1.8 4 4 4h28c2.2 0 4-1.8 4-4V20h-4zM34 20l1.88-4.12L40 14l-4.12-1.88L34 8l-1.88 4.12L28 14l4.12 1.88zm-7.5 1.5L24 16l-2.5 5.5L16 24l5.5 2.5L24 32l2.5-5.5L32 24z" fill="%235E6268"/></svg>');
- --visibility-icon-url: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="48" height="48"><path d="M0 0h48v48H0z" fill="none"/><path d="M24 9C14 9 5.46 15.22 2 24c3.46 8.78 12 15 22 15 10.01 0 18.54-6.22 22-15-3.46-8.78-11.99-15-22-15zm0 25c-5.52 0-10-4.48-10-10s4.48-10 10-10 10 4.48 10 10-4.48 10-10 10zm0-16c-3.31 0-6 2.69-6 6s2.69 6 6 6 6-2.69 6-6-2.69-6-6-6z" fill="%235E6268"/></svg>');
- --check-circle-icon-url: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="48" height="48"><path d="M0 0h48v48H0z" fill="none"/><path d="M24 4C12.95 4 4 12.95 4 24c0 11.04 8.95 20 20 20 11.04 0 20-8.96 20-20 0-11.05-8.96-20-20-20zm-4 30L10 24l2.83-2.83L20 28.34l15.17-15.17L38 16 20 34z" fill="%235E6268"/></svg>');
- --check-icon-url: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="48" height="48"><path d="M0 0h48v48H0z" fill="none"/><path d="M18 32.34L9.66 24l-2.83 2.83L18 38l24-24-2.83-2.83z"/></svg>');
-
- --warning-icon-url: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48"><title>warn</title><path fill="%235E6268" d="M2 42h44L24 4 2 42zm24-6h-4v-4h4v4zm0-8h-4v-8h4v8z"/></svg>');
- --search-icon-url: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="48" height="48"><path d="M31 28h-1.59l-.55-.55C30.82 25.18 32 22.23 32 19c0-7.18-5.82-13-13-13S6 11.82 6 19s5.82 13 13 13c3.23 0 6.18-1.18 8.45-3.13l.55.55V31l10 9.98L40.98 38 31 28zm-12 0a9 9 0 1 1 .001-18.001A9 9 0 0 1 19 28z" fill="%235E6268"/><path d="M0 0h48v48H0z" fill="none" /></svg>');
- --remove-circle-icon-url: url('data:image/svg+xml;utf8,<svg height="24" width="24" xmlns="http://www.w3.org/2000/svg"><path d="M0 0h24v24H0z" fill="none"/><path d="M7 11v2h10v-2H7zm5-9C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z" fill="%235E6268"/></svg>');
-
--pwa-fast-reliable-gray-url: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg"><g fill="none" fill-rule="nonzero"><circle fill="%23DAE0E3" cx="12" cy="12" r="12"/><path d="M12.3 4l6.3 2.8V11c0 3.88-2.69 7.52-6.3 8.4C8.69 18.52 6 14.89 6 11V6.8L12.3 4zm-.56 12.88l3.3-5.79.04-.08c.05-.1.01-.29-.26-.29h-1.96l.56-3.92h-.56L9.6 12.52c0 .03.07-.12-.03.07-.11.2-.12.37.2.37h1.97l-.56 3.92h.56z" fill="%23FFF"/></g></svg>');
--pwa-installable-gray-url: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg"><g fill="none" fill-rule="nonzero"><circle fill="%23DAE0E3" cx="12" cy="12" r="12"/><path d="M12 5a7 7 0 1 0 0 14 7 7 0 0 0 0-14zm3.5 7.7h-2.8v2.8h-1.4v-2.8H8.5v-1.4h2.8V8.5h1.4v2.8h2.8v1.4z" fill="%23FFF"/></g></svg>');
--pwa-optimized-gray-url: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg"><g fill="none" fill-rule="evenodd"><rect fill="%23DAE0E3" width="24" height="24" rx="12"/><path fill="%23FFF" d="M12 15.07l3.6 2.18-.95-4.1 3.18-2.76-4.2-.36L12 6.17l-1.64 3.86-4.2.36 3.2 2.76-.96 4.1z"/><path d="M5 5h14v14H5z"/></g></svg>');
- --pwa-fast-reliable-color-url: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg"><g fill-rule="nonzero" fill="none"><circle fill="%23CCE3F6" cx="12" cy="12" r="12"/><path d="M12 4.3l6.3 2.8v4.2c0 3.88-2.69 7.52-6.3 8.4-3.61-.88-6.3-4.51-6.3-8.4V7.1L12 4.3zm-.56 12.88l3.3-5.79.04-.08c.05-.1.01-.29-.26-.29h-1.96l.56-3.92h-.56L9.3 12.82c0 .03.07-.12-.03.07-.11.2-.12.37.2.37h1.97l-.56 3.92h.56z" fill="%23304FFE"/></g></svg>');
- --pwa-installable-color-url: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg"><g fill-rule="nonzero" fill="none"><circle fill="%23D4ECD5" cx="12" cy="12" r="12"/><path d="M12 5a7 7 0 1 0 0 14 7 7 0 0 0 0-14zm3.5 7.7h-2.8v2.8h-1.4v-2.8H8.5v-1.4h2.8V8.5h1.4v2.8h2.8v1.4z" fill="%23009688"/></g></svg>');
- --pwa-optimized-color-url: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg"><g fill="none" fill-rule="evenodd"><rect fill="%23FCE4EC" width="24" height="24" rx="12"/><path d="M5 5h14v14H5z"/><path fill="%23EC3F7A" d="M12 15.07l3.6 2.18-.95-4.1 3.18-2.76-4.2-.36L12 6.17l-1.64 3.86-4.2.36 3.2 2.76-.96 4.1z"/></g></svg>');
+ --pwa-fast-reliable-gray-url-dark: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg"><g fill="none" fill-rule="nonzero"><circle fill="%23424242" cx="12" cy="12" r="12"/><path d="M12.3 4l6.3 2.8V11c0 3.88-2.69 7.52-6.3 8.4C8.69 18.52 6 14.89 6 11V6.8L12.3 4zm-.56 12.88l3.3-5.79.04-.08c.05-.1.01-.29-.26-.29h-1.96l.56-3.92h-.56L9.6 12.52c0 .03.07-.12-.03.07-.11.2-.12.37.2.37h1.97l-.56 3.92h.56z" fill="%23FFF"/></g></svg>');
+ --pwa-installable-gray-url-dark: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg"><g fill="none" fill-rule="nonzero"><circle fill="%23424242" cx="12" cy="12" r="12"/><path d="M12 5a7 7 0 1 0 0 14 7 7 0 0 0 0-14zm3.5 7.7h-2.8v2.8h-1.4v-2.8H8.5v-1.4h2.8V8.5h1.4v2.8h2.8v1.4z" fill="%23FFF"/></g></svg>');
+ --pwa-optimized-gray-url-dark: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg"><g fill="none" fill-rule="evenodd"><rect fill="%23424242" width="24" height="24" rx="12"/><path fill="%23FFF" d="M12 15.07l3.6 2.18-.95-4.1 3.18-2.76-4.2-.36L12 6.17l-1.64 3.86-4.2.36 3.2 2.76-.96 4.1z"/><path d="M5 5h14v14H5z"/></g></svg>');
+
+ --pwa-fast-reliable-color-url: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg"><g fill-rule="nonzero" fill="none"><circle fill="%230CCE6B" cx="12" cy="12" r="12"/><path d="M12 4.3l6.3 2.8v4.2c0 3.88-2.69 7.52-6.3 8.4-3.61-.88-6.3-4.51-6.3-8.4V7.1L12 4.3zm-.56 12.88l3.3-5.79.04-.08c.05-.1.01-.29-.26-.29h-1.96l.56-3.92h-.56L9.3 12.82c0 .03.07-.12-.03.07-.11.2-.12.37.2.37h1.97l-.56 3.92h.56z" fill="%23FFF"/></g></svg>');
+ --pwa-installable-color-url: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg"><g fill-rule="nonzero" fill="none"><circle fill="%230CCE6B" cx="12" cy="12" r="12"/><path d="M12 5a7 7 0 1 0 0 14 7 7 0 0 0 0-14zm3.5 7.7h-2.8v2.8h-1.4v-2.8H8.5v-1.4h2.8V8.5h1.4v2.8h2.8v1.4z" fill="%23FFF"/></g></svg>');
+ --pwa-optimized-color-url: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg"><g fill="none" fill-rule="evenodd"><rect fill="%230CCE6B" width="24" height="24" rx="12"/><path d="M5 5h14v14H5z"/><path fill="%23FFF" d="M12 15.07l3.6 2.18-.95-4.1 3.18-2.76-4.2-.36L12 6.17l-1.64 3.86-4.2.36 3.2 2.76-.96 4.1z"/></g></svg>');
+}
+
+.lh-vars.dark {
+ --color-red-700: var(--color-red);
+ --color-green-700: var(--color-green);
+ --color-teal-600: var(--color-cyan-500);
+ --color-orange-700: var(--color-orange);
+
+ --color-black-200: var(--color-black-800);
+ --color-black-400: var(--color-black-600);
+ --color-black-600: var(--color-black-500);
+
+ --topbar-bg: var(--color-black);
+ --plugin-badge-bg: var(--color-black-800);
+ --header-bg-color: var(--color-black-900);
+ --env-item-bg: var(--color-black);
+ --report-secondary-border-color: var(--color-black-200);
+
+ --body-background-color: var(--color-black-900);
+ --body-text-color: var(--color-black-100);
+ --secondary-text-color: var(--color-black-400);
+
+ --highlighter-bg: var(--color-black-200);
+ --plugin-icon-url: var(--plugin-icon-url-dark);
+
+ --informative-color: var(--color-blue-200);
+
+ --medium-50-gray: #757575;
+ --medium-75-gray: var(--color-white);
+
+ --color-hover: rgba(0, 0, 0, 0.2);
+
+ --pwa-fast-reliable-gray-url: var(--pwa-fast-reliable-gray-url-dark);
+ --pwa-installable-gray-url: var(--pwa-installable-gray-url-dark);
+ --pwa-optimized-gray-url: var(--pwa-optimized-gray-url-dark);
+}
+
+@media only screen and (max-width: 480px) {
+ .lh-vars {
+ --audits-margin-bottom: 20px;
+ --body-font-size: 14px;
+ --body-line-height: 20px;
+ --env-name-min-width: 120px;
+ --gauge-circle-size-big: 96px;
+ --gauge-circle-size: 72px;
+ --header-padding: 16px 0 16px 0;
+ --plugin-icon-size: 75%;
+ --pwa-icon-margin: 0 7px 0 -3px;
+ --score-container-width: 112px;
+ --score-number-font-size-big: 34px;
+ --score-number-font-size: 26px;
+ --score-shape-margin-left: 2px;
+ --score-shape-size: 10px;
+ --score-title-font-size-big: 22px;
+ --score-title-font-size: 14px;
+ --score-title-line-height-big: 26px;
+ --score-title-line-height: 20px;
+ --section-padding: 24px;
+ --topbar-height: 28px;
+ --topbar-icon-size: 20px;
+ }
+
+ /* Not enough space to adequately show the relative savings bars. */
+ .lh-sparkline {
+ display: none;
+ }
}
.lh-vars.lh-devtools {
--text-font-family: '.SFNSDisplay-Regular', 'Helvetica Neue', 'Lucida Grande', sans-serif;
--monospace-font-family: 'Menlo', 'dejavu sans mono', 'Consolas', 'Lucida Console', monospace;
--body-font-size: 12px;
- --body-line-height: 16px;
+ --body-line-height: 20px;
--subheader-font-size: 14px;
--subheader-line-height: 18px;
--header-font-size: 16px;
@@ -126,19 +261,50 @@
--audit-indent: 16px;
--expandable-indent: 16px;
+ --gauge-circle-size-big: 72px;
+ --gauge-circle-size: 64px;
+
+ --audits-margin-bottom: 20px;
+ --env-name-min-width: 120px;
+ --header-padding: 16px 0 16px 0;
+ --plugin-icon-size: 75%;
+ --pwa-icon-margin: 0 7px 0 -3px;
+ --score-container-width: 97px;
+ --score-number-font-size-big: 34px;
+ --score-number-font-size: 26px;
+ --score-shape-margin-left: 2px;
+ --score-shape-size: 10px;
+ --score-title-font-size-big: 22px;
+ --score-title-font-size: 14px;
+ --score-title-line-height-big: 26px;
+ --score-title-line-height: 20px;
+
--lh-audit-vpadding: 4px;
--lh-audit-hgap: 12px;
--lh-audit-group-vpadding: 12px;
--lh-section-vpadding: 8px;
}
+.lh-devtools.lh-root {
+ height: 100%;
+}
+.lh-devtools .lh-container {
+ overflow-y: scroll;
+ height: calc(100% - var(--topbar-height));
+}
+.lh-devtools .lh-sticky-header {
+ /* Is normally the height of the topbar. */
+ top: 0;
+}
+
@keyframes fadeIn {
0% { opacity: 0;}
100% { opacity: 0.6;}
}
-.lh-root * {
+.lh-root *, .lh-root *::before, .lh-root *::after {
box-sizing: border-box;
+ -webkit-font-smoothing: antialiased;
}
.lh-root {
@@ -148,6 +314,7 @@
line-height: var(--body-line-height);
background: var(--body-background-color);
scroll-behavior: smooth;
+ color: var(--body-text-color);
}
.lh-root :focus {
@@ -166,13 +333,35 @@
cursor: pointer;
}
+.lh-container {
+ /*
+ Text wrapping in the report is so much FUN!
+ We have a `word-break: break-word;` globally here to prevent a few common scenarios, namely
+ long non-breakable text (usually URLs) found in:
+ 1. The footer
+ 2. .lh-node (outerHTML)
+ 3. .lh-code
+
+ With that sorted, the next challenge is appropriate column sizing and text wrapping inside our
+ .lh-details tables. Even more fun.
+ * We don't want table headers ("Potential Savings (ms)") to wrap or their column values, but
+ we'd be happy for the URL column to wrap if the URLs are particularly long.
+ * We want the narrow columns to remain narrow, providing the most column width for URL
+ * We don't want the table to extend past 100% width.
+ * Long URLs in the URL column can wrap. Util.getURLDisplayName maxes them out at 64 characters,
+ but they do not get any overflow:ellipsis treatment.
+ */
+ word-break: break-word;
+}
+
.lh-audit-group a,
-.lh-category-header__description a {
- color: #0c50c7;
+.lh-category-header__description a,
+.lh-audit__description a,
+.lh-footer a {
+ color: var(--informative-color);
}
-.lh-audit__description {
- --inner-audit-left-padding: calc(var(--text-indent) + var(--lh-audit-index-width) + 2 * var(--audit-item-gap));
+.lh-audit__description, .lh-audit__stackpack {
--inner-audit-right-padding: calc(var(--text-indent) + 2px);
padding-left: var(--inner-audit-left-padding);
padding-right: var(--inner-audit-right-padding);
@@ -184,6 +373,7 @@
font-size: var(--body-font-size);
margin-top: var(--default-padding);
margin-bottom: var(--default-padding);
+ margin-left: var(--inner-audit-left-padding);
/* whatever the .lh-details side margins are */
width: 100%;
}
@@ -192,6 +382,16 @@
max-width: 70%;
}
+.lh-audit__stackpack {
+ display: flex;
+ align-items: center;
+}
+
+.lh-audit__stackpack__img {
+ max-width: 50px;
+ margin-right: var(--default-padding)
+}
+
/* Report header */
.report-icon {
@@ -205,9 +405,6 @@
pointer-events: none;
}
-.report-icon--share {
- background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7s-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81 1.66 0 3-1.34 3-3s-1.34-3-3-3-3 1.34-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9c-1.66 0-3 1.34-3 3s1.34 3 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.16c-.05.21-.08.43-.08.65 0 1.61 1.31 2.92 2.92 2.92 1.61 0 2.92-1.31 2.92-2.92s-1.31-2.92-2.92-2.92z"/></svg>');
-}
.report-icon--print {
background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M19 8H5c-1.66 0-3 1.34-3 3v6h4v4h12v-4h4v-6c0-1.66-1.34-3-3-3zm-3 11H8v-5h8v5zm3-7c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1zm-1-9H6v4h12V3z"/><path fill="none" d="M0 0h24v24H0z"/></svg>');
}
@@ -220,100 +417,116 @@
.report-icon--download {
background-image: url('data:image/svg+xml;utf8,<svg height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"><path d="M19 9h-4V3H9v6H5l7 7 7-7zM5 18v2h14v-2H5z"/><path d="M0 0h24v24H0z" fill="none"/></svg>');
}
+.report-icon--dark {
+ background-image:url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 100 125"><path d="M50 23.587c-16.27 0-22.799 12.574-22.799 21.417 0 12.917 10.117 22.451 12.436 32.471h20.726c2.32-10.02 12.436-19.554 12.436-32.471 0-8.843-6.528-21.417-22.799-21.417zM39.637 87.161c0 3.001 1.18 4.181 4.181 4.181h.426l.41 1.231C45.278 94.449 46.042 95 48.019 95h3.963c1.978 0 2.74-.551 3.365-2.427l.409-1.231h.427c3.002 0 4.18-1.18 4.18-4.181V80.91H39.637v6.251zM50 18.265c1.26 0 2.072-.814 2.072-2.073v-9.12C52.072 5.813 51.26 5 50 5c-1.259 0-2.072.813-2.072 2.073v9.12c0 1.259.813 2.072 2.072 2.072zM68.313 23.727c.994.774 2.135.634 2.91-.357l5.614-7.187c.776-.992.636-2.135-.356-2.909-.992-.776-2.135-.636-2.91.357l-5.613 7.186c-.778.993-.636 2.135.355 2.91zM91.157 36.373c-.306-1.222-1.291-1.815-2.513-1.51l-8.85 2.207c-1.222.305-1.814 1.29-1.51 2.512.305 1.223 1.291 1.814 2.513 1.51l8.849-2.206c1.223-.305 1.816-1.291 1.511-2.513zM86.757 60.48l-8.331-3.709c-1.15-.512-2.225-.099-2.736 1.052-.512 1.151-.1 2.224 1.051 2.737l8.33 3.707c1.15.514 2.225.101 2.736-1.05.513-1.149.1-2.223-1.05-2.737zM28.779 23.37c.775.992 1.917 1.131 2.909.357.992-.776 1.132-1.917.357-2.91l-5.615-7.186c-.775-.992-1.917-1.132-2.909-.357s-1.131 1.917-.356 2.909l5.614 7.187zM21.715 39.583c.305-1.223-.288-2.208-1.51-2.513l-8.849-2.207c-1.222-.303-2.208.289-2.513 1.511-.303 1.222.288 2.207 1.511 2.512l8.848 2.206c1.222.304 2.208-.287 2.513-1.509zM21.575 56.771l-8.331 3.711c-1.151.511-1.563 1.586-1.05 2.735.511 1.151 1.586 1.563 2.736 1.052l8.331-3.711c1.151-.511 1.563-1.586 1.05-2.735-.512-1.15-1.585-1.562-2.736-1.052z"/></svg>');
+}
/* Node */
-.lh-node {
- display: block;
+.lh-node__snippet {
font-family: var(--monospace-font-family);
- word-break: break-word;
- color: hsl(174, 100%, 27%);
-}
-.lh-node:hover {
- background: hsl(0, 0%, 98%);
- border-radius: 2px;
+ color: var(--color-teal-600);
+ font-size: 12px;
+ line-height: 1.5em;
}
/* Score */
.lh-audit__score-icon {
- margin-left: var(--lh-score-margin);
- width: var(--lh-score-icon-width);
- height: var(--lh-score-icon-width);
- background: none no-repeat center center / contain;
+ width: var(--score-shape-size);
+ height: var(--score-shape-size);
+ margin: var(--score-shape-margin);
}
.lh-audit--pass .lh-audit__display-text {
- color: var(--pass-color);
+ color: var(--color-pass-secondary);
}
.lh-audit--pass .lh-audit__score-icon {
- background-image: var(--pass-icon-url);
+ border-radius: 100%;
+ background: var(--color-pass);
}
.lh-audit--average .lh-audit__display-text {
- color: var(--average-color);
+ color: var(--color-average-secondary);
}
.lh-audit--average .lh-audit__score-icon {
- background-image: var(--average-icon-url);
+ background: var(--color-average);
+ width: var(--icon-square-size);
+ height: var(--icon-square-size);
}
.lh-audit--fail .lh-audit__display-text {
- color: var(--fail-color);
+ color: var(--color-fail-secondary);
}
.lh-audit--fail .lh-audit__score-icon {
- background-image: var(--fail-icon-url);
+ border-left: calc(var(--score-shape-size) / 2) solid transparent;
+ border-right: calc(var(--score-shape-size) / 2) solid transparent;
+ border-bottom: var(--score-shape-size) solid var(--color-fail);
}
-.lh-audit--informative .lh-audit__display-text {
- color: var(--display-value-gray);
+.lh-audit--manual .lh-audit__display-text,
+.lh-audit--notapplicable .lh-audit__display-text {
+ color: var(--color-black-600);
}
-
-.lh-audit--informative .lh-audit__score-icon,
-.lh-audit--manual .lh-audit__score-icon {
- visibility: hidden;
+.lh-audit--manual .lh-audit__score-icon,
+.lh-audit--notapplicable .lh-audit__score-icon {
+ border-radius: 100%;
+ background: var(--color-black-400);
}
+
.lh-audit--error .lh-audit__score-icon {
display: none;
}
-.lh-category-header__description,
-.lh-audit__description {
- color: var(--secondary-text-color);
+.lh-audit--informative .lh-audit__display-text {
+ color: var(--color-black-600);
}
+.lh-audit--informative .lh-audit__score-icon {
+ border: none;
+ border-radius: 100%;
+ background: var(--color-black-400);
+}
+
+.lh-audit__description,
+.lh-audit__stackpack {
+ color: var(--secondary-text-color);
+}
.lh-category-header__description {
font-size: var(--body-font-size);
- margin: calc(var(--default-padding) / 2) 0 var(--default-padding);
+ text-align: center;
+ margin: 0px auto;
+ max-width: 400px;
}
-.lh-audit__index,
-.lh-audit__title,
.lh-audit__display-text,
-.lh-audit__score-icon,
.lh-load-opportunity__sparkline,
.lh-chevron-container {
margin: 0 var(--audit-item-gap);
}
-.lh-audit__index {
- margin-left: 0;
-}
.lh-chevron-container {
margin-right: 0;
}
-
-.lh-audit__header .lh-audit__index {
- width: var(--lh-audit-index-width);
+.lh-audit__title-and-text {
+ flex: 1;
}
-.lh-audit__title {
- flex: 1;
+/* Prepend display text with em dash separator. But not in Opportunities. */
+.lh-audit__display-text:not(:empty):before {
+ content: '—';
+ margin-right: var(--audit-item-gap);
+}
+.lh-audit-group.lh-audit-group--load-opportunities .lh-audit__display-text:not(:empty):before {
+ display: none;
}
/* Expandable Details (Audit Groups, Audits) */
.lh-audit__header {
display: flex;
- padding: var(--lh-audit-vpadding) var(--text-indent);
+ align-items: center;
+ font-weight: 500;
+ padding: var(--lh-audit-vpadding) 0;
}
.lh-audit--load-opportunity .lh-audit__header {
@@ -321,7 +534,7 @@
}
.lh-audit__header:hover {
- background-color: #F8F9FA;
+ background-color: var(--color-hover);
}
/* Hide the expandable arrow icon, three ways: via the CSS Counter Styles spec, for webkit/blink browsers, hiding the polyfilled icon */
@@ -372,17 +585,25 @@
.lh-column:first-of-type {
margin-right: 0px;
}
+ .lh-column:first-of-type .lh-metric:last-of-type {
+ border-bottom: 0;
+ }
}
.lh-metric {
border-bottom: 1px solid var(--report-secondary-border-color);
}
+.lh-metric:first-of-type {
+ border-top: 1px solid var(--report-secondary-border-color);
+}
.lh-metric__innerwrap {
display: flex;
+ align-items: center;
+ flex-wrap: wrap;
justify-content: space-between;
- padding: 8px var(--text-indent);
+ padding: 10px 0;
}
.lh-metric__details {
@@ -390,73 +611,131 @@
}
.lh-metric__title {
- font-size: var(--body-font-size);
- line-height: var(--body-line-height);
- display: flex;
- white-space: nowrap;
-}
-
-.lh-metric__name {
flex: 1;
+ font-weight: 500;
}
.lh-metrics__disclaimer {
color: var(--medium-75-gray);
- text-align: right;
margin: var(--lh-section-vpadding) 0;
- padding: 0 var(--text-indent);
}
.lh-metric__description {
+ display: none;
color: var(--secondary-text-color);
+ padding: var(--expandable-padding);
}
.lh-metric__value {
white-space: nowrap; /* No wrapping between metric value and the icon */
+ font-weight: 500;
}
+/* No-JS toggle switch */
+/* Keep this selector sync'd w/ `magicSelector` in report-ui-features-test.js */
+ .lh-metrics-toggle__input:checked ~ .lh-columns .lh-metric__description {
+ display: block;
+}
-.lh-metric .lh-metric__value::after {
+.lh-metrics-toggle__input {
+ cursor: pointer;
+ opacity: 0;
+ position: absolute;
+ right: 0;
+ width: 74px;
+ height: 28px;
+ top: -3px;
+}
+.lh-metrics-toggle__label {
+ display: flex;
+ background-color: #eee;
+ border-radius: 20px;
+ overflow: hidden;
+ position: absolute;
+ right: 0;
+ top: -3px;
+ pointer-events: none;
+}
+.lh-metrics-toggle__input:focus + label {
+ outline: -webkit-focus-ring-color auto 3px;
+}
+.lh-metrics-toggle__icon {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ padding: 2px 5px;
+ width: 50%;
+ height: 28px;
+}
+.lh-metrics-toggle__input:not(:checked) + label .lh-metrics-toggle__icon--less,
+.lh-metrics-toggle__input:checked + label .lh-metrics-toggle__icon--more {
+ background-color: var(--color-blue);
+ --color-metric-toggle-lines: var(--color-white);
+}
+.lh-metrics-toggle__lines {
+ fill: var(--color-metric-toggle-lines);
+}
+
+.lh-metrics-toggle__label {
+ background-color: var(--metrics-toggle-color);
+}
+
+.lh-metrics-toggle__label .lh-metrics-toggle__icon--less {
+ padding-left: 8px;
+}
+.lh-metrics-toggle__label .lh-metrics-toggle__icon--more {
+ padding-right: 8px;
+}
+
+/* Pushes the metric description toggle button to the right. */
+.lh-audit-group--metrics .lh-audit-group__header {
+ display: flex;
+}
+.lh-audit-group--metrics .lh-audit-group__header span.lh-audit-group__title {
+ flex: 1;
+}
+
+.lh-metric .lh-metric__innerwrap::before {
content: '';
- width: var(--lh-score-icon-width);
- height: var(--lh-score-icon-width);
- background-size: contain;
+ width: var(--score-shape-size);
+ height: var(--score-shape-size);
display: inline-block;
- vertical-align: text-bottom;
- margin-left: calc(var(--body-font-size) / 2);
+ margin: var(--score-shape-margin);
}
.lh-metric--pass .lh-metric__value {
- color: var(--pass-color);
+ color: var(--color-pass-secondary);
}
-.lh-metric--pass .lh-metric__value::after {
- background: var(--pass-icon-url) no-repeat 50% 50%;
+.lh-metric--pass .lh-metric__innerwrap::before {
+ border-radius: 100%;
+ background: var(--color-pass);
}
-
.lh-metric--average .lh-metric__value {
- color: var(--average-color);
- padding-left: 16px;
+ color: var(--color-average-secondary);
}
-.lh-metric--average .lh-metric__value::after {
- background: var(--average-icon-url) no-repeat 50% 50%;
+.lh-metric--average .lh-metric__innerwrap::before {
+ background: var(--color-average);
+ width: var(--icon-square-size);
+ height: var(--icon-square-size);
}
-
.lh-metric--fail .lh-metric__value {
- color: var(--fail-color);
+ color: var(--color-fail-secondary);
}
-.lh-metric--fail .lh-metric__value::after {
- background: var(--fail-icon-url) no-repeat 50% 50%;
+.lh-metric--fail .lh-metric__innerwrap::before {
+ border-left: calc(var(--score-shape-size) / 2) solid transparent;
+ border-right: calc(var(--score-shape-size) / 2) solid transparent;
+ border-bottom: var(--score-shape-size) solid var(--color-fail);
}
.lh-metric--error .lh-metric__value,
.lh-metric--error .lh-metric__description {
- color: var(--fail-color);
+ color: var(--color-fail-secondary);
}
/* Hide icon if there was an error */
-.lh-metric--error .lh-metric__value::after {
+.lh-metric--error .lh-metric__innerwrap::before {
display: none;
}
@@ -468,24 +747,23 @@
}
.lh-load-opportunity__header .lh-load-opportunity__col {
- background-color: var(--medium-50-gray);
color: var(--medium-75-gray);
- text-align: center;
display: unset;
line-height: calc(2.3 * var(--body-font-size));
}
.lh-load-opportunity__col {
display: flex;
- justify-content: space-between;
}
.lh-load-opportunity__col--one {
flex: 5;
+ align-items: center;
margin-right: 2px;
}
.lh-load-opportunity__col--two {
flex: 4;
+ text-align: right;
}
.lh-audit--load-opportunity .lh-audit__display-text {
@@ -512,15 +790,15 @@
}
.lh-audit--pass .lh-sparkline__bar {
- background: var(--pass-color);
+ background: var(--color-pass);
}
.lh-audit--average .lh-sparkline__bar {
- background: var(--average-color);
+ background: var(--color-average);
}
.lh-audit--fail .lh-sparkline__bar {
- background: var(--fail-color);
+ background: var(--color-fail);
}
@@ -528,7 +806,6 @@
/* Filmstrip */
.lh-filmstrip-container {
- padding: 0 var(--expandable-indent);
/* smaller gap between metrics and filmstrip */
margin: -8px auto 0 auto;
}
@@ -554,10 +831,14 @@
@media screen and (max-width: 750px) {
.lh-filmstrip {
flex-wrap: wrap;
- justify-content: left;
}
.lh-filmstrip__frame {
- margin: calc(var(--default-padding) / 3);
+ width: 20%;
+ margin-bottom: 5px;
+ }
+ .lh-filmstrip__thumbnail {
+ display: block;
+ margin: auto;
}
}
@@ -567,80 +848,62 @@
border-bottom: 1px solid var(--report-secondary-border-color);
}
+/* Apply border-top to just the first audit. */
+.lh-audit {
+ border-top: 1px solid var(--report-secondary-border-color);
+}
+.lh-audit ~ .lh-audit {
+ border-top: none;
+}
+
+
.lh-audit--error .lh-audit__display-text {
- color: var(--fail-color);
+ color: var(--color-fail);
}
/* Audit Group */
.lh-audit-group {
- margin: var(--lh-audit-group-vpadding) 0;
-}
-
-.lh-audit-group__header {
- font-size: var(--subheader-font-size);
- line-height: var(--subheader-line-height);
- color: var(--subheader-color);
- flex: 1;
- font-weight: bold;
+ margin-bottom: var(--audits-margin-bottom);
+ position: relative;
}
.lh-audit-group__header::before {
/* By default, groups don't get an icon */
content: none;
- width: calc(var(--subheader-font-size) / 14 * 24);
- height: calc(var(--subheader-font-size) / 14 * 24);
- margin-right: calc(var(--subheader-font-size) / 2);
- background: var(--medium-100-gray) none no-repeat center / 16px;
+ width: var(--pwa-icon-size);
+ height: var(--pwa-icon-size);
+ margin: var(--pwa-icon-margin);
display: inline-block;
- border-radius: 50%;
vertical-align: middle;
}
-.lh-clump--warning > summary .lh-audit-group__header::before {
- content: '';
- background-image: var(--warning-icon-url);
-}
-.lh-clump--manual > summary .lh-audit-group__header::before {
- content: '';
- background-image: var(--search-icon-url);
-}
-.lh-clump--passed > summary .lh-audit-group__header::before {
- content: '';
- background-image: var(--check-icon-url);
-}
-.lh-clump--notapplicable > summary .lh-audit-group__header::before {
- content: '';
- background-image: var(--remove-circle-icon-url);
+/* Style the "over budget" columns red. */
+.lh-audit-group--budgets .lh-table tbody tr td:nth-child(4),
+.lh-audit-group--budgets .lh-table tbody tr td:nth-child(5){
+ color: var(--color-red-700);
}
-.lh-audit-group--diagnostics .lh-audit-group__header::before {
- content: '';
- background-image: var(--content-paste-icon-url);
-}
-.lh-audit-group--load-opportunities .lh-audit-group__header::before {
- content: '';
- background-image: var(--photo-filter-icon-url);
+/* Align the "over budget request count" text to be close to the "over budget bytes" column. */
+.lh-audit-group--budgets .lh-table tbody tr td:nth-child(4){
+ text-align: right;
}
-.lh-audit-group--metrics .lh-audit-group__header::before {
- content: '';
- background-image: var(--av-timer-icon-url);
+
+.lh-audit-group--budgets .lh-table {
+ width: 100%;
}
.lh-audit-group--pwa-fast-reliable .lh-audit-group__header::before {
content: '';
background-image: var(--pwa-fast-reliable-gray-url);
- background-size: var(--lh-group-icon-background-size);
}
.lh-audit-group--pwa-installable .lh-audit-group__header::before {
content: '';
background-image: var(--pwa-installable-gray-url);
- background-size: var(--lh-group-icon-background-size);
}
.lh-audit-group--pwa-optimized .lh-audit-group__header::before {
content: '';
background-image: var(--pwa-optimized-gray-url);
- background-size: var(--lh-group-icon-background-size);
}
.lh-audit-group--pwa-fast-reliable.lh-badged .lh-audit-group__header::before {
background-image: var(--pwa-fast-reliable-color-url);
@@ -652,11 +915,6 @@
background-image: var(--pwa-optimized-color-url);
}
-/* Removing too much whitespace */
-.lh-audit-group--metrics {
- margin-top: calc(var(--circle-size)/2 * -1);
- border-bottom: none;
-}
.lh-audit-group--metrics .lh-audit-group__summary {
margin-top: 0;
margin-bottom: 0;
@@ -671,26 +929,49 @@
}
.lh-audit-group__itemcount {
- color: var(--display-value-gray);
- margin: 3px 10px 0;
+ color: var(--color-black-600);
+ font-weight: bold;
}
-.lh-audit-group__summary .lh-chevron {
+.lh-audit-group__header .lh-chevron {
margin-top: calc((var(--body-line-height) - 5px) / 2);
}
-.lh-audit-group__description {
+.lh-audit-group__header {
font-size: var(--body-font-size);
- color: var(--medium-75-gray);
margin: 0 0 var(--lh-audit-group-vpadding);
+ /* When the header takes 100% width, the chevron becomes small. */
+ max-width: calc(100% - var(--chevron-size));
+}
+/* max-width makes the metric toggle not flush. metrics doesn't have a chevron so unset. */
+.lh-audit-group--metrics .lh-audit-group__header {
+ max-width: unset;
+}
+
+.lh-audit-group__header span.lh-audit-group__title {
+ font-weight: bold;
+}
+
+.lh-audit-group__header span.lh-audit-group__itemcount {
+ font-weight: bold;
+ color: var(--color-black-600);
+}
+
+.lh-audit-group__header span.lh-audit-group__description {
+ font-weight: 500;
+ color: var(--color-black-600);
+}
+.lh-audit-group__header span.lh-audit-group__description::before {
+ content: '—';
+ margin: 0px var(--audit-item-gap);
}
-.lh-clump > .lh-audit-group__description,
-.lh-audit-group--diagnostics .lh-audit-group__description,
-.lh-audit-group--load-opportunities .lh-audit-group__description,
-.lh-audit-group--metrics .lh-audit-group__description,
-.lh-audit-group--pwa-fast-reliable .lh-audit-group__description,
-.lh-audit-group--pwa-installable .lh-audit-group__description,
-.lh-audit-group--pwa-optimized .lh-audit-group__description {
+.lh-clump > .lh-audit-group__header,
+.lh-audit-group--diagnostics .lh-audit-group__header,
+.lh-audit-group--load-opportunities .lh-audit-group__header,
+.lh-audit-group--metrics .lh-audit-group__header,
+.lh-audit-group--pwa-fast-reliable .lh-audit-group__header,
+.lh-audit-group--pwa-installable .lh-audit-group__header,
+.lh-audit-group--pwa-optimized .lh-audit-group__header {
margin-top: var(--lh-audit-group-vpadding);
}
@@ -700,31 +981,10 @@
}
.lh-audit--fail .lh-audit-explanation {
- color: var(--fail-color);
+ color: var(--color-fail);
}
/* Report */
-
-.lh-container {
- display: flex;
- max-width: var(--report-width);
- word-wrap: break-word;
- margin: 0 auto;
-}
-
-.lh-header-sticky {
- position: -webkit-sticky;
- position: sticky;
- top: 0;
- width: 100%;
- min-width: var(--report-min-width);
- z-index: 2;
- will-change: transform;
-}
-.lh-header-plain {
- margin-top: var(--section-padding);
-}
-
.lh-list > div:not(:last-child) {
padding-bottom: 20px;
}
@@ -732,20 +992,13 @@
.lh-header-container {
display: block;
margin: 0 auto;
- max-width: var(--report-width);
position: relative;
word-wrap: break-word;
}
.lh-report {
- background-color: #fff;
min-width: var(--report-min-width);
}
-@media screen {
- .lh-report {
- width: var(--report-width);
- }
-}
.lh-exception {
font-size: large;
@@ -755,16 +1008,17 @@
white-space: normal;
margin-top: 0;
font-size: 85%;
- word-break: break-word;
}
.lh-warnings {
--item-margin: calc(var(--body-line-height) / 6);
- border: 1px solid var(--average-color);
- border-radius: 4px;
+ color: var(--color-average);
margin: var(--lh-audit-vpadding) 0;
padding: calc(var(--lh-audit-vpadding) / 2) var(--lh-audit-vpadding);
}
+.lh-warnings span {
+ font-weight: bold;
+}
.lh-warnings--toplevel {
--item-margin: calc(var(--header-line-height) / 4);
@@ -785,59 +1039,188 @@
.lh-scores-header {
display: flex;
- justify-content: left;
- overflow-x: hidden;
- position: relative;
- padding: var(--section-indent) calc(var(--section-indent) / 2) calc(var(--section-indent) * 2);
+ flex-wrap: wrap;
+ justify-content: center;
}
.lh-scores-header__solo {
padding: 0;
border: 0;
}
+/* Gauge */
+
+.lh-gauge__wrapper--pass {
+ color: var(--color-pass);
+ fill: var(--color-pass);
+ stroke: var(--color-pass);
+}
+
+.lh-gauge__wrapper--average {
+ color: var(--color-average);
+ fill: var(--color-average);
+ stroke: var(--color-average);
+}
+
+.lh-gauge__wrapper--fail {
+ color: var(--color-fail);
+ fill: var(--color-fail);
+ stroke: var(--color-fail);
+}
+
+.lh-gauge {
+ stroke-linecap: round;
+ width: var(--gauge-circle-size);
+ height: var(--gauge-circle-size);
+}
+
+.lh-category .lh-gauge {
+ --gauge-circle-size: var(--gauge-circle-size-big);
+}
+
+.lh-gauge-base {
+ opacity: 0.1;
+ stroke: var(--circle-background);
+ stroke-width: var(--circle-border-width);
+}
+
+.lh-gauge-arc {
+ fill: none;
+ stroke: var(--circle-color);
+ stroke-width: var(--circle-border-width);
+ animation: load-gauge var(--transition-length) ease forwards;
+ animation-delay: 250ms;
+}
+
+.lh-gauge__svg-wrapper {
+ position: relative;
+ height: var(--gauge-circle-size);
+}
+.lh-category .lh-gauge__svg-wrapper {
+ --gauge-circle-size: var(--gauge-circle-size-big);
+}
+
+/* The plugin badge overlay */
+.lh-gauge__wrapper--plugin .lh-gauge__svg-wrapper::before {
+ width: var(--plugin-badge-size);
+ height: var(--plugin-badge-size);
+ background-color: var(--plugin-badge-bg);
+ background-image: var(--plugin-icon-url);
+ background-repeat: no-repeat;
+ background-size: var(--plugin-icon-size);
+ background-position: 58% 50%;
+ content: "";
+ position: absolute;
+ right: -6px;
+ bottom: 0px;
+ display: block;
+ z-index: 100;
+ box-shadow: 0 0 4px rgba(0,0,0,.2);
+ border-radius: 25%;
+}
+.lh-category .lh-gauge__wrapper--plugin .lh-gauge__svg-wrapper::before {
+ width: var(--plugin-badge-size-big);
+ height: var(--plugin-badge-size-big);
+}
+
+@keyframes load-gauge {
+ from { stroke-dasharray: 0 352; }
+}
+
+.lh-gauge__percentage {
+ width: 100%;
+ height: var(--gauge-circle-size);
+ position: absolute;
+ font-family: var(--monospace-font-family);
+ font-size: calc(var(--gauge-circle-size) * 0.34 + 1.3px);
+ line-height: 0;
+ text-align: center;
+ top: calc(var(--score-container-padding) + var(--gauge-circle-size) / 2);
+}
+
+.lh-category .lh-gauge__percentage {
+ --gauge-circle-size: var(--gauge-circle-size-big);
+ --score-number-font-size: var(--score-number-font-size-big);
+}
+
+.lh-gauge__wrapper {
+ position: relative;
+ display: flex;
+ align-items: center;
+ flex-direction: column;
+ text-decoration: none;
+ padding: var(--score-container-padding);
+
+ --circle-border-width: 8;
+ --transition-length: 1s;
+
+ /* Contain the layout style paint & layers during animation*/
+ contain: content;
+ will-change: opacity; /* Only using for layer promotion */
+}
+
+.lh-gauge__label {
+ font-size: var(--score-title-font-size);
+ line-height: var(--score-title-line-height);
+ margin-top: 10px;
+ text-align: center;
+ color: var(--body-text-color);
+}
+
+/* TODO(#8185) use more BEM (.lh-gauge__label--big) instead of relying on descendant selector */
+.lh-category .lh-gauge__label {
+ --score-title-font-size: var(--score-title-font-size-big);
+ --score-title-line-height: var(--score-title-line-height-big);
+ margin-top: 14px;
+}
+
+
.lh-scores-header .lh-gauge__wrapper,
-.lh-scores-header .lh-gauge--pwa__wrapper {
- padding: 0 4px;
+.lh-scores-header .lh-gauge--pwa__wrapper,
+.lh-sticky-header .lh-gauge__wrapper,
+.lh-sticky-header .lh-gauge--pwa__wrapper {
+ width: var(--score-container-width);
}
.lh-scores-header .lh-gauge--pwa__wrapper {
- border-left: 1px solid var(--report-secondary-border-color);
/* Can remove when this bug is resolved: https://bugs.chromium.org/p/chromium/issues/detail?id=942097 */
will-change: transform;
}
.lh-scorescale {
- color: var(--medium-75-gray);
- padding: 0 calc(var(--section-indent) * 1.5) 0;
- text-align: right;
- transform-origin: bottom right;
- will-change: opacity; /* opacity is changed on scroll */
+ display: inline-flex;
+ margin: 12px auto 0 auto;
+ border: 1px solid var(--color-black-200);
+ border-radius: 20px;
+ padding: 8px 8px;
}
.lh-scorescale-range {
- margin-left: 10px;
+ display: flex;
+ align-items: center;
+ margin: 0 12px;
+ font-family: var(--monospace-font-family);
white-space: nowrap;
}
.lh-scorescale-range::before {
content: '';
- width: var(--body-font-size);
- height: calc(var(--body-font-size) * .60);
- border-radius: 4px;
- display: inline-block;
- margin: 0 5px;
+ width: var(--scorescale-width);
+ height: var(--scorescale-height);
+ border-radius: 10px;
+ display: block;
+ margin-right: 10px;
}
.lh-scorescale-range--pass::before {
- background-color: var(--pass-color);
+ background-color: var(--color-pass);
}
.lh-scorescale-range--average::before {
- background-color: var(--average-color);
+ background-color: var(--color-average);
}
.lh-scorescale-range--fail::before {
- background-color: var(--fail-color);
+ background-color: var(--color-fail);
}
/* Hide category score gauages if it's a single category report */
@@ -853,11 +1236,16 @@
.lh-category {
padding: var(--section-padding);
+ max-width: var(--report-width);
+ margin: 0 auto;
}
-.lh-category:first-of-type {
- padding-top: calc(2 * var(--section-padding));
- border: none;
+.lh-category-wrapper {
+ border-bottom: 1px solid var(--color-black-200);
+}
+
+.lh-category-wrapper:first-of-type {
+ border-top: 1px solid var(--color-black-200);
}
/* section hash link jump should preserve fixed header
@@ -872,25 +1260,14 @@
.lh-category-header {
font-size: var(--header-font-size);
- min-height: var(--circle-size);
+ min-height: var(--gauge-circle-size);
margin-bottom: var(--lh-section-vpadding);
}
-.lh-category-header__title {
- line-height: 24px;
-}
-
-.lh-category-header .lh-score__gauge .lh-gauge__label {
- display: none;
-}
-
-
.lh-category-header .lh-score__gauge {
- float: right;
-}
-
-.lh-category-header .lh-score__gauge {
- margin-left: var(--section-indent);
+ max-width: 400px;
+ width: auto;
+ margin: 0px auto;
}
.lh-category-header .lh-audit__title {
@@ -913,7 +1290,6 @@
transition: transform 0.3s, opacity 0.3s;
transform: translateY(100px);
opacity: 0;
- -webkit-font-smoothing: antialiased;
bottom: 0;
left: 0;
z-index: 3;
@@ -951,18 +1327,18 @@
.lh-table {
--image-preview-size: 24px;
border-collapse: collapse;
+ /* Can't assign padding to table, so shorten the width instead. */
+ width: calc(100% - var(--inner-audit-left-padding));
}
-.lh-table thead {
- background: var(--lh-table-header-bg);
-}
.lh-table thead th {
- color: var(--medium-75-gray);
font-weight: normal;
- word-wrap: normal;
+ color: var(--color-black-600);
+ /* See text-wrapping comment on .lh-container. */
+ word-break: normal;
}
-.lh-table tbody tr:nth-child(even) {
+.lh-table tbody tr:nth-child(odd) {
background-color: var(--lh-table-higlight-bg);
}
@@ -970,6 +1346,12 @@
.lh-table td {
padding: 8px 6px;
}
+.lh-table th:first-child {
+ padding-left: 0;
+}
+.lh-table th:last-child {
+ padding-right: 0;
+}
/* Looks unnecessary, but mostly for keeping the <th>s left-aligned */
.lh-table-column--text,
@@ -986,6 +1368,7 @@
.lh-table-column--ms,
.lh-table-column--numeric {
text-align: right;
+ word-break: normal;
}
@@ -995,7 +1378,6 @@
.lh-table-column--url {
min-width: 250px;
- white-space: nowrap;
}
/* Keep columns narrow if they follow the URL column */
@@ -1008,18 +1390,13 @@
width: 12%;
}
-.lh-text__url {
- overflow: hidden;
- text-overflow: ellipsis;
-}
-
.lh-text__url:hover {
text-decoration: underline dotted #999;
text-decoration-skip-ink: auto;
}
.lh-text__url > .lh-text, .lh-text__url-host {
- display: inline-block;
+ display: inline;
}
.lh-text__url-host {
@@ -1105,7 +1482,7 @@
}
.tooltip-boundary:hover {
- background-color: #F8F9FA;
+ background-color: var(--color-hover);
}
.tooltip-boundary:hover .tooltip {
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/audits2/lighthouse/report.js b/chromium/third_party/blink/renderer/devtools/front_end/audits2/lighthouse/report.js
index c9371afee5f..e4c246548e8 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/audits2/lighthouse/report.js
+++ b/chromium/third_party/blink/renderer/devtools/front_end/audits2/lighthouse/report.js
@@ -16,11 +16,12 @@
*/
'use strict';
-/* globals self URL */
+/* globals self, URL */
const ELLIPSIS = '\u2026';
const NBSP = '\xa0';
const PASS_THRESHOLD = 0.9;
+const SCREENSHOT_PREFIX = 'data:image/jpeg;base64,';
const RATINGS = {
PASS: {label: 'pass', minScore: PASS_THRESHOLD},
@@ -29,6 +30,14 @@ const RATINGS = {
ERROR: {label: 'error'},
};
+// 25 most used tld plus one domains (aka public suffixes) from http archive.
+// @see https://github.com/GoogleChrome/lighthouse/pull/5065#discussion_r191926212
+// The canonical list is https://publicsuffix.org/learn/ but we're only using subset to conserve bytes
+const listOfTlds = [
+ 'com', 'co', 'gov', 'edu', 'ac', 'org', 'go', 'gob', 'or', 'net', 'in', 'ne', 'nic', 'gouv',
+ 'web', 'spb', 'blog', 'jus', 'kiev', 'mil', 'wi', 'qc', 'ca', 'bel', 'on',
+];
+
class Util {
static get PASS_THRESHOLD() {
return PASS_THRESHOLD;
@@ -40,7 +49,8 @@ class Util {
/**
* Returns a new LHR that's reshaped for slightly better ergonomics within the report rendereer.
- * Also, sets up the localized UI strings used within renderer and number/date formatting
+ * Also, sets up the localized UI strings used within renderer and makes changes to old LHRs to be
+ * compatible with current renderer.
* The LHR passed in is not mutated.
* TODO(team): we all agree the LHR shape change is technical debt we should fix
* @param {LH.Result} result
@@ -50,33 +60,65 @@ class Util {
// If any mutations happen to the report within the renderers, we want the original object untouched
const clone = /** @type {LH.ReportResult} */ (JSON.parse(JSON.stringify(result)));
- // If LHR is older (\\u22643.0.3), it has no locale setting. Set default.
+ // If LHR is older (≤3.0.3), it has no locale setting. Set default.
if (!clone.configSettings.locale) {
clone.configSettings.locale = 'en';
}
- Util.setNumberDateLocale(clone.configSettings.locale);
- if (clone.i18n && clone.i18n.rendererFormattedStrings) {
- Util.updateAllUIStrings(clone.i18n.rendererFormattedStrings);
- }
-
- if (typeof clone.categories !== 'object') throw new Error('No categories provided.');
- clone.reportCategories = Object.values(clone.categories);
- // Turn 'not-applicable' and 'not_applicable' into 'notApplicable' to support old reports.
- // TODO: remove when underscore/hyphen proto issue is resolved. See #6371, #6201, #6783.
for (const audit of Object.values(clone.audits)) {
- // @ts-ignore tsc rightly flags that this value shouldn't occur.
+ // Turn 'not-applicable' (LHR <4.0) and 'not_applicable' (older proto versions)
+ // into 'notApplicable' (LHR ≥4.0).
+ // @ts-ignore tsc rightly flags that these values shouldn't occur.
// eslint-disable-next-line max-len
if (audit.scoreDisplayMode === 'not_applicable' || audit.scoreDisplayMode === 'not-applicable') {
audit.scoreDisplayMode = 'notApplicable';
}
+
+ if (audit.details) {
+ // Turn `auditDetails.type` of undefined (LHR <4.2) and 'diagnostic' (LHR <5.0)
+ // into 'debugdata' (LHR ≥5.0).
+ // @ts-ignore tsc rightly flags that these values shouldn't occur.
+ if (audit.details.type === undefined || audit.details.type === 'diagnostic') {
+ audit.details.type = 'debugdata';
+ }
+
+ // Add the jpg data URL prefix to filmstrip screenshots without them (LHR <5.0).
+ if (audit.details.type === 'filmstrip') {
+ for (const screenshot of audit.details.items) {
+ if (!screenshot.data.startsWith(SCREENSHOT_PREFIX)) {
+ screenshot.data = SCREENSHOT_PREFIX + screenshot.data;
+ }
+ }
+ }
+ }
+ }
+
+ // Set locale for number/date formatting and grab localized renderer strings from the LHR.
+ Util.setNumberDateLocale(clone.configSettings.locale);
+ if (clone.i18n && clone.i18n.rendererFormattedStrings) {
+ Util.updateAllUIStrings(clone.i18n.rendererFormattedStrings);
}
- // For convenience, smoosh all AuditResults into their auditDfn (which has just weight & group)
- for (const category of clone.reportCategories) {
- category.auditRefs.forEach(auditMeta => {
- const result = clone.audits[auditMeta.id];
- auditMeta.result = result;
+ // For convenience, smoosh all AuditResults into their auditRef (which has just weight & group)
+ if (typeof clone.categories !== 'object') throw new Error('No categories provided.');
+ for (const category of Object.values(clone.categories)) {
+ category.auditRefs.forEach(auditRef => {
+ const result = clone.audits[auditRef.id];
+ auditRef.result = result;
+
+ // attach the stackpacks to the auditRef object
+ if (clone.stackPacks) {
+ clone.stackPacks.forEach(pack => {
+ if (pack.descriptions[auditRef.id]) {
+ auditRef.stackPacks = auditRef.stackPacks || [];
+ auditRef.stackPacks.push({
+ title: pack.title,
+ iconDataURL: pack.iconDataURL,
+ description: pack.descriptions[auditRef.id],
+ });
+ }
+ });
+ }
});
}
@@ -323,6 +365,51 @@ class Util {
}
/**
+ * @param {string|URL} value
+ * @return {URL}
+ */
+ static createOrReturnURL(value) {
+ if (value instanceof URL) {
+ return value;
+ }
+
+ return new URL(value);
+ }
+
+ /**
+ * Gets the tld of a domain
+ *
+ * @param {string} hostname
+ * @return {string} tld
+ */
+ static getTld(hostname) {
+ const tlds = hostname.split('.').slice(-2);
+
+ if (!listOfTlds.includes(tlds[0])) {
+ return `.${tlds[tlds.length - 1]}`;
+ }
+
+ return `.${tlds.join('.')}`;
+ }
+
+ /**
+ * Returns a primary domain for provided hostname (e.g. www.example.com -> example.com).
+ * @param {string|URL} url hostname or URL object
+ * @returns {string}
+ */
+ static getRootDomain(url) {
+ const hostname = Util.createOrReturnURL(url).hostname;
+ const tld = Util.getTld(hostname);
+
+ // tld is .com or .co.uk which means we means that length is 1 to big
+ // .com => 2 & .co.uk => 3
+ const splitTld = tld.split('.');
+
+ // get TLD + root domain
+ return hostname.split('.').slice(-splitTld.length).join('.');
+ }
+
+ /**
* @param {LH.Config.Settings} settings
* @return {Array<{name: string, description: string}>}
*/
@@ -386,10 +473,8 @@ class Util {
}
let deviceEmulation = 'No emulation';
- if (!settings.disableDeviceEmulation) {
- if (settings.emulatedFormFactor === 'mobile') deviceEmulation = 'Emulated Nexus 5X';
- if (settings.emulatedFormFactor === 'desktop') deviceEmulation = 'Emulated Desktop';
- }
+ if (settings.emulatedFormFactor === 'mobile') deviceEmulation = 'Emulated Nexus 5X';
+ if (settings.emulatedFormFactor === 'desktop') deviceEmulation = 'Emulated Desktop';
return {
deviceEmulation,
@@ -451,6 +536,13 @@ class Util {
return lines.filter(line => lineNumbersToKeep.has(line.lineNumber));
}
+
+ /**
+ * @param {string} categoryId
+ */
+ static isPluginCategory(categoryId) {
+ return categoryId.startsWith('lighthouse-plugin-');
+ }
}
/**
@@ -490,8 +582,6 @@ Util.UIStrings = {
/** Label shown preceding any important warnings that may have invalidated the entire report. For example, if the user has Chrome extensions installed, they may add enough performance overhead that Lighthouse's performance metrics are unreliable. If shown, this will be displayed at the top of the report UI. */
toplevelWarningsMessage: 'There were issues affecting this run of Lighthouse:',
- /** Label preceding a pictorial explanation of the scoring scale: 0-50 is red (bad), 50-90 is orange (ok), 90-100 is green (good). These colors are used throughout the report to provide context for how good/bad a particular result is. */
- scorescaleLabel: 'Score scale:',
/** String of text shown in a graphical representation of the flow of network requests for the web page. This label represents the initial network request that fetches an HTML page. This navigation may be redirected (eg. Initial navigation to http://example.com redirects to https://www.example.com). */
crcInitialNavigation: 'Initial Navigation',
@@ -507,6 +597,9 @@ Util.UIStrings = {
lsPerformanceCategoryDescription: '[Lighthouse](https://developers.google.com/web/tools/lighthouse/) analysis of the current page on an emulated mobile network. Values are estimated and may vary.',
/** Title of the lab data section of the Performance category. Within this section are various speed metrics which quantify the pageload performance into values presented in seconds and milliseconds. "Lab" is an abbreviated form of "laboratory", and refers to the fact that the data is from a controlled test of a website, not measurements from real users visiting that site. */
labDataTitle: 'Lab Data',
+
+ /** This label is for a checkbox above a table of items loaded by a web page. The checkbox is used to show or hide third-party (or "3rd-party") resources in the table, where "third-party resources" refers to items loaded by a web page from URLs that aren't controlled by the owner of the web page. */
+ thirdPartyResourcesLabel: 'Show 3rd-party resources',
};
if (typeof module !== 'undefined' && module.exports) {
@@ -744,7 +837,7 @@ if (typeof module !== 'undefined' && module.exports) {
;
/*
Details Element Polyfill 2.2.0
-Copyright \\ua9 2018 Javan Makhmali
+Copyright © 2018 Javan Makhmali
*/
(function() {
"use strict";
@@ -763,7 +856,7 @@ Copyright \\ua9 2018 Javan Makhmali
element.parentNode.removeChild(element);
return closedHeight != openedHeight;
}
- var styles = '\ndetails, summary {\n display: block;\n}\ndetails:not([open]) > *:not(summary) {\n display: none;\n}\ndetails > summary::before {\n content: "\\u25ba";\n padding-right: 0.3rem;\n font-size: 0.6rem;\n cursor: default;\n}\ndetails[open] > summary::before {\n content: "\\u25bc";\n}\n';
+ var styles = '\ndetails, summary {\n display: block;\n}\ndetails:not([open]) > *:not(summary) {\n display: none;\n}\ndetails > summary::before {\n content: "►";\n padding-right: 0.3rem;\n font-size: 0.6rem;\n cursor: default;\n}\ndetails[open] > summary::before {\n content: "▼";\n}\n';
var _ref = [], forEach = _ref.forEach, slice = _ref.slice;
if (!support.open) {
polyfillStyles();
@@ -1007,10 +1100,7 @@ class DetailsRenderer {
// Internal-only details, not for rendering.
case 'screenshot':
- case 'diagnostic':
- return null;
- // Fallback for old LHRs, where no type meant don't render.
- case undefined:
+ case 'debugdata':
return null;
default: {
@@ -1072,7 +1162,11 @@ class DetailsRenderer {
element.appendChild(hostElem);
}
- if (title) element.title = url;
+ if (title) {
+ element.title = url;
+ // set the url on the element's dataset which we use to check 3rd party origins
+ element.dataset.url = url;
+ }
return element;
}
@@ -1279,7 +1373,7 @@ class DetailsRenderer {
/**
* @param {LH.Audit.Details.List} details
- * @returns {Element}
+ * @return {Element}
*/
_renderList(details) {
const listContainer = this._dom.createElement('div', 'lh-list');
@@ -1299,8 +1393,16 @@ class DetailsRenderer {
*/
renderNode(item) {
const element = this._dom.createElement('span', 'lh-node');
+ if (item.nodeLabel) {
+ const nodeLabelEl = this._dom.createElement('div');
+ nodeLabelEl.textContent = item.nodeLabel;
+ element.appendChild(nodeLabelEl);
+ }
if (item.snippet) {
- element.textContent = item.snippet;
+ const snippetEl = this._dom.createElement('div');
+ snippetEl.classList.add('lh-node__snippet');
+ snippetEl.textContent = item.snippet;
+ element.appendChild(snippetEl);
}
if (item.selector) {
element.title = item.selector;
@@ -1308,6 +1410,7 @@ class DetailsRenderer {
if (item.path) element.setAttribute('data-path', item.path);
if (item.selector) element.setAttribute('data-selector', item.selector);
if (item.snippet) element.setAttribute('data-snippet', item.snippet);
+
return element;
}
@@ -1321,7 +1424,7 @@ class DetailsRenderer {
for (const thumbnail of details.items) {
const frameEl = this._dom.createChildOf(filmstripEl, 'div', 'lh-filmstrip__frame');
this._dom.createChildOf(frameEl, 'img', 'lh-filmstrip__thumbnail', {
- src: `data:image/jpeg;base64,${thumbnail.data}`,
+ src: thumbnail.data,
alt: `Screenshot`,
});
}
@@ -1622,7 +1725,7 @@ function getMessagesForLineNumber(messages, lineNumber) {
/**
* @param {LH.Audit.Details.SnippetValue} details
- * @returns {LH.Audit.Details.SnippetValue['lines']}
+ * @return {LH.Audit.Details.SnippetValue['lines']}
*/
function getLinesWhenCollapsed(details) {
const SURROUNDING_LINES_TO_SHOW_WHEN_COLLAPSED = 2;
@@ -1714,7 +1817,7 @@ class SnippetRenderer {
classList.add('lh-snippet__show-if-expanded');
}
- const lineContent = content + (truncated ? '\\u2026' : '');
+ const lineContent = content + (truncated ? '…' : '');
const lineContentEl = dom.find('.lh-snippet__line code', contentLine);
if (contentType === LineContentType.MESSAGE) {
lineContentEl.appendChild(dom.convertMarkdownLinkSnippets(lineContent));
@@ -1752,7 +1855,7 @@ class SnippetRenderer {
*/
static renderOmittedLinesPlaceholder(dom, tmpl, visibility) {
return SnippetRenderer.renderSnippetLine(dom, tmpl, {
- lineNumber: '\\u2026',
+ lineNumber: '…',
content: '',
visibility,
contentType: LineContentType.PLACEHOLDER,
@@ -1783,7 +1886,7 @@ class SnippetRenderer {
* @param {DOM} dom
* @param {DocumentFragment} tmpl
* @param {LH.Audit.Details.SnippetValue} details
- * @returns {DocumentFragment}
+ * @return {DocumentFragment}
*/
static renderSnippetLines(dom, tmpl, details) {
const {lineMessages, generalMessages, lineCount, lines} = details;
@@ -1938,7 +2041,7 @@ if (typeof module !== 'undefined' && module.exports) {
* @return {string}
*/
function getFilenamePrefix(lhr) {
- const hostname = new (getUrlConstructor())(lhr.finalUrl).hostname;
+ const hostname = new URL(lhr.finalUrl).hostname;
const date = (lhr.fetchTime && new Date(lhr.fetchTime)) || new Date();
const timeStr = date.toLocaleTimeString('en-US', {hour12: false});
@@ -1954,14 +2057,6 @@ function getFilenamePrefix(lhr) {
return filenamePrefix.replace(/[/?<>\\:*|":]/g, '-');
}
-function getUrlConstructor() {
- if (typeof module !== 'undefined' && module.exports) {
- return require('./url-shim');
- } else {
- return URL;
- }
-}
-
// don't attempt to export in the browser.
if (typeof module !== 'undefined' && module.exports) {
module.exports = {getFilenamePrefix};
@@ -2067,6 +2162,656 @@ if (typeof module !== 'undefined' && module.exports) {
*/
'use strict';
+/* eslint-env browser */
+
+/**
+ * @fileoverview Adds export button, print, and other dynamic functionality to
+ * the report.
+ */
+
+/* globals getFilenamePrefix Util */
+
+/**
+ * @param {HTMLTableElement} tableEl
+ * @return {Array<HTMLTableRowElement>}
+ */
+function getTableRows(tableEl) {
+ return Array.from(tableEl.tBodies[0].rows);
+}
+
+class ReportUIFeatures {
+ /**
+ * @param {DOM} dom
+ */
+ constructor(dom) {
+ /** @type {LH.Result} */
+ this.json; // eslint-disable-line no-unused-expressions
+ /** @type {DOM} */
+ this._dom = dom;
+ /** @type {Document} */
+ this._document = this._dom.document();
+ /** @type {ParentNode} */
+ this._templateContext = this._dom.document();
+ /** @type {boolean} */
+ this._copyAttempt = false;
+ /** @type {HTMLElement} */
+ this.exportButton; // eslint-disable-line no-unused-expressions
+ /** @type {HTMLElement} */
+ this.topbarEl; // eslint-disable-line no-unused-expressions
+ /** @type {HTMLElement} */
+ this.scoreScaleEl; // eslint-disable-line no-unused-expressions
+ /** @type {HTMLElement} */
+ this.stickyHeaderEl; // eslint-disable-line no-unused-expressions
+ /** @type {HTMLElement} */
+ this.highlightEl; // eslint-disable-line no-unused-expressions
+
+ this.onMediaQueryChange = this.onMediaQueryChange.bind(this);
+ this.onCopy = this.onCopy.bind(this);
+ this.onExportButtonClick = this.onExportButtonClick.bind(this);
+ this.onExport = this.onExport.bind(this);
+ this.onKeyDown = this.onKeyDown.bind(this);
+ this.onKeyUp = this.onKeyUp.bind(this);
+ this.onChevronClick = this.onChevronClick.bind(this);
+ this.collapseAllDetails = this.collapseAllDetails.bind(this);
+ this.expandAllDetails = this.expandAllDetails.bind(this);
+ this._toggleDarkTheme = this._toggleDarkTheme.bind(this);
+ this._updateStickyHeaderOnScroll = this._updateStickyHeaderOnScroll.bind(this);
+ }
+
+ /**
+ * Adds export button, print, and other functionality to the report. The method
+ * should be called whenever the report needs to be re-rendered.
+ * @param {LH.Result} report
+ */
+ initFeatures(report) {
+ this.json = report;
+
+ this._setupMediaQueryListeners();
+ this._setupExportButton();
+ this._setupThirdPartyFilter();
+ this._setUpCollapseDetailsAfterPrinting();
+ this._resetUIState();
+ this._document.addEventListener('keyup', this.onKeyUp);
+ this._document.addEventListener('copy', this.onCopy);
+
+ const topbarLogo = this._dom.find('.lh-topbar__logo', this._document);
+ topbarLogo.addEventListener('click', () => this._toggleDarkTheme());
+
+ let turnOffTheLights = false;
+ if (window.matchMedia('(prefers-color-scheme: dark)').matches) {
+ turnOffTheLights = true;
+ }
+
+ // Fireworks.
+ const scoresAll100 = Object.values(report.categories).every(cat => cat.score === 1);
+ const hasAllCoreCategories =
+ Object.keys(report.categories).filter(id => !Util.isPluginCategory(id)).length >= 5;
+ if (scoresAll100 && hasAllCoreCategories) {
+ turnOffTheLights = true;
+ this._enableFireworks();
+ }
+
+ if (turnOffTheLights) {
+ this._toggleDarkTheme(true);
+ }
+
+ // There is only a sticky header when at least 2 categories are present.
+ if (Object.keys(this.json.categories).length >= 2) {
+ this._setupStickyHeaderElements();
+ const containerEl = this._dom.find('.lh-container', this._document);
+ const elToAddScrollListener = this._getScrollParent(containerEl);
+ elToAddScrollListener.addEventListener('scroll', this._updateStickyHeaderOnScroll);
+
+ // Use ResizeObserver where available.
+ // TODO: there is an issue with incorrect position numbers and, as a result, performance
+ // issues due to layout thrashing.
+ // See https://github.com/GoogleChrome/lighthouse/pull/9023/files#r288822287 for details.
+ // For now, limit to DevTools.
+ if (this._dom.isDevTools()) {
+ const resizeObserver = new window.ResizeObserver(this._updateStickyHeaderOnScroll);
+ resizeObserver.observe(containerEl);
+ } else {
+ window.addEventListener('resize', this._updateStickyHeaderOnScroll);
+ }
+ }
+
+ // Show the metric descriptions by default when there is an error.
+ const hasMetricError = report.categories.performance && report.categories.performance.auditRefs
+ .some(audit => Boolean(audit.group === 'metrics' && report.audits[audit.id].errorMessage));
+ if (hasMetricError) {
+ const toggleInputEl = /** @type {HTMLInputElement} */ (
+ this._dom.find('.lh-metrics-toggle__input', this._document));
+ toggleInputEl.checked = true;
+ }
+ }
+
+ /**
+ * Define a custom element for <templates> to be extracted from. For example:
+ * this.setTemplateContext(new DOMParser().parseFromString(htmlStr, 'text/html'))
+ * @param {ParentNode} context
+ */
+ setTemplateContext(context) {
+ this._templateContext = context;
+ }
+
+ /**
+ * Finds the first scrollable ancestor of `element`. Falls back to the document.
+ * @param {HTMLElement} element
+ * @return {Node}
+ */
+ _getScrollParent(element) {
+ const {overflowY} = window.getComputedStyle(element);
+ const isScrollable = overflowY !== 'visible' && overflowY !== 'hidden';
+
+ if (isScrollable) {
+ return element;
+ }
+
+ if (element.parentElement) {
+ return this._getScrollParent(element.parentElement);
+ }
+
+ return document;
+ }
+
+ _enableFireworks() {
+ const scoresContainer = this._dom.find('.lh-scores-container', this._document);
+ scoresContainer.classList.add('score100');
+ scoresContainer.addEventListener('click', _ => {
+ scoresContainer.classList.toggle('fireworks-paused');
+ });
+ }
+
+ /**
+ * Fires a custom DOM event on target.
+ * @param {string} name Name of the event.
+ * @param {Node=} target DOM node to fire the event on.
+ * @param {*=} detail Custom data to include.
+ */
+ _fireEventOn(name, target = this._document, detail) {
+ const event = new CustomEvent(name, detail ? {detail} : undefined);
+ target.dispatchEvent(event);
+ }
+
+ _setupMediaQueryListeners() {
+ const mediaQuery = self.matchMedia('(max-width: 500px)');
+ mediaQuery.addListener(this.onMediaQueryChange);
+ // Ensure the handler is called on init
+ this.onMediaQueryChange(mediaQuery);
+ }
+
+ /**
+ * Handle media query change events.
+ * @param {MediaQueryList|MediaQueryListEvent} mql
+ */
+ onMediaQueryChange(mql) {
+ const root = this._dom.find('.lh-root', this._document);
+ root.classList.toggle('lh-narrow', mql.matches);
+ }
+
+ _setupExportButton() {
+ this.exportButton = this._dom.find('.lh-export__button', this._document);
+ this.exportButton.addEventListener('click', this.onExportButtonClick);
+
+ const dropdown = this._dom.find('.lh-export__dropdown', this._document);
+ dropdown.addEventListener('click', this.onExport);
+ }
+
+ _setupThirdPartyFilter() {
+ // Some audits should not display the third party filter option.
+ const thirdPartyFilterAuditExclusions = [
+ // This audit deals explicitly with third party resources.
+ 'uses-rel-preconnect',
+ ];
+
+ // Get all tables with a text url column.
+ /** @type {Array<HTMLTableElement>} */
+ const tables = Array.from(this._document.querySelectorAll('.lh-table'));
+ const tablesWithUrls = tables
+ .filter(el => el.querySelector('td.lh-table-column--url'))
+ .filter(el => {
+ const containingAudit = el.closest('.lh-audit');
+ if (!containingAudit) throw new Error('.lh-table not within audit');
+ return !thirdPartyFilterAuditExclusions.includes(containingAudit.id);
+ });
+
+ tablesWithUrls.forEach((tableEl, index) => {
+ const urlItems = this._getUrlItems(tableEl);
+ const thirdPartyRows = this._getThirdPartyRows(tableEl, urlItems, this.json.finalUrl);
+ // If all or none of the rows are 3rd party, no checkbox!
+ if (thirdPartyRows.size === urlItems.length || !thirdPartyRows.size) return;
+
+ // create input box
+ const filterTemplate = this._dom.cloneTemplate('#tmpl-lh-3p-filter', this._templateContext);
+ const filterInput = this._dom.find('input', filterTemplate);
+ const id = `lh-3p-filter-label--${index}`;
+
+ filterInput.id = id;
+ filterInput.addEventListener('change', e => {
+ // Remove rows from the dom and keep track of them to re-add on uncheck.
+ // Why removing instead of hiding? To keep nth-child(even) background-colors working.
+ if (e.target instanceof HTMLInputElement && !e.target.checked) {
+ for (const row of thirdPartyRows.values()) {
+ row.remove();
+ }
+ } else {
+ // Add row elements back to original positions.
+ for (const [position, row] of thirdPartyRows.entries()) {
+ const childrenArr = getTableRows(tableEl);
+ tableEl.tBodies[0].insertBefore(row, childrenArr[position]);
+ }
+ }
+ });
+
+ this._dom.find('label', filterTemplate).setAttribute('for', id);
+ this._dom.find('.lh-3p-filter-count', filterTemplate).textContent =
+ `${thirdPartyRows.size}`;
+ this._dom.find('.lh-3p-ui-string', filterTemplate).textContent =
+ Util.UIStrings.thirdPartyResourcesLabel;
+
+ // Finally, add checkbox to the DOM.
+ if (!tableEl.parentNode) return; // Keep tsc happy.
+ tableEl.parentNode.insertBefore(filterTemplate, tableEl);
+ });
+ }
+
+ /**
+ * From a table with URL entries, finds the rows containing third-party URLs
+ * and returns a Map of those rows, mapping from row index to row Element.
+ * @param {HTMLTableElement} el
+ * @param {string} finalUrl
+ * @param {Array<HTMLElement>} urlItems
+ * @return {Map<number, HTMLTableRowElement>}
+ */
+ _getThirdPartyRows(el, urlItems, finalUrl) {
+ const finalUrlRootDomain = Util.getRootDomain(finalUrl);
+
+ /** @type {Map<number, HTMLTableRowElement>} */
+ const thirdPartyRows = new Map();
+ for (const urlItem of urlItems) {
+ const datasetUrl = urlItem.dataset.url;
+ if (!datasetUrl) continue;
+ const isThirdParty = Util.getRootDomain(datasetUrl) !== finalUrlRootDomain;
+ if (!isThirdParty) continue;
+
+ const urlRowEl = urlItem.closest('tr');
+ if (urlRowEl) {
+ const rowPosition = getTableRows(el).indexOf(urlRowEl);
+ thirdPartyRows.set(rowPosition, urlRowEl);
+ }
+ }
+
+ return thirdPartyRows;
+ }
+
+ /**
+ * From a table, finds and returns URL items.
+ * @param {HTMLTableElement} tableEl
+ * @return {Array<HTMLElement>}
+ */
+ _getUrlItems(tableEl) {
+ return this._dom.findAll('.lh-text__url', tableEl);
+ }
+
+ _setupStickyHeaderElements() {
+ this.topbarEl = this._dom.find('.lh-topbar', this._document);
+ this.scoreScaleEl = this._dom.find('.lh-scorescale', this._document);
+ this.stickyHeaderEl = this._dom.find('.lh-sticky-header', this._document);
+
+ // Position highlighter at first gauge; will be transformed on scroll.
+ const firstGauge = this._dom.find('.lh-gauge__wrapper', this.stickyHeaderEl);
+ this.highlightEl = this._dom.createChildOf(firstGauge, 'div', 'lh-highlighter');
+ }
+
+ /**
+ * Handle copy events.
+ * @param {ClipboardEvent} e
+ */
+ onCopy(e) {
+ // Only handle copy button presses (e.g. ignore the user copying page text).
+ if (this._copyAttempt) {
+ // We want to write our own data to the clipboard, not the user's text selection.
+ e.preventDefault();
+ e.clipboardData.setData('text/plain', JSON.stringify(this.json, null, 2));
+
+ this._fireEventOn('lh-log', this._document, {
+ cmd: 'log', msg: 'Report JSON copied to clipboard',
+ });
+ }
+
+ this._copyAttempt = false;
+ }
+
+ /**
+ * Copies the report JSON to the clipboard (if supported by the browser).
+ */
+ onCopyButtonClick() {
+ this._fireEventOn('lh-analytics', this._document, {
+ cmd: 'send',
+ fields: {hitType: 'event', eventCategory: 'report', eventAction: 'copy'},
+ });
+
+ try {
+ if (this._document.queryCommandSupported('copy')) {
+ this._copyAttempt = true;
+
+ // Note: In Safari 10.0.1, execCommand('copy') returns true if there's
+ // a valid text selection on the page. See http://caniuse.com/#feat=clipboard.
+ if (!this._document.execCommand('copy')) {
+ this._copyAttempt = false; // Prevent event handler from seeing this as a copy attempt.
+
+ this._fireEventOn('lh-log', this._document, {
+ cmd: 'warn', msg: 'Your browser does not support copy to clipboard.',
+ });
+ }
+ }
+ } catch (/** @type {Error} */ e) {
+ this._copyAttempt = false;
+ this._fireEventOn('lh-log', this._document, {cmd: 'log', msg: e.message});
+ }
+ }
+
+ onChevronClick() {
+ const toggle = this._dom.find('.lh-config__settings-toggle', this._document);
+
+ if (toggle.hasAttribute('open')) {
+ toggle.removeAttribute('open');
+ } else {
+ toggle.setAttribute('open', 'true');
+ }
+ }
+
+ closeExportDropdown() {
+ this.exportButton.classList.remove('active');
+ }
+
+ /**
+ * Click handler for export button.
+ * @param {Event} e
+ */
+ onExportButtonClick(e) {
+ e.preventDefault();
+ this.exportButton.classList.toggle('active');
+ this._document.addEventListener('keydown', this.onKeyDown);
+ }
+
+ /**
+ * Resets the state of page before capturing the page for export.
+ * When the user opens the exported HTML page, certain UI elements should
+ * be in their closed state (not opened) and the templates should be unstamped.
+ */
+ _resetUIState() {
+ this.closeExportDropdown();
+ this._dom.resetTemplates();
+ }
+
+ /**
+ * Handler for "export as" button.
+ * @param {Event} e
+ */
+ onExport(e) {
+ e.preventDefault();
+
+ const el = /** @type {?Element} */ (e.target);
+
+ if (!el || !el.hasAttribute('data-action')) {
+ return;
+ }
+
+ switch (el.getAttribute('data-action')) {
+ case 'copy':
+ this.onCopyButtonClick();
+ break;
+ case 'print-summary':
+ this.collapseAllDetails();
+ this.closeExportDropdown();
+ self.print();
+ break;
+ case 'print-expanded':
+ this.expandAllDetails();
+ this.closeExportDropdown();
+ self.print();
+ break;
+ case 'save-json': {
+ const jsonStr = JSON.stringify(this.json, null, 2);
+ this._saveFile(new Blob([jsonStr], {type: 'application/json'}));
+ break;
+ }
+ case 'save-html': {
+ const htmlStr = this.getReportHtml();
+ try {
+ this._saveFile(new Blob([htmlStr], {type: 'text/html'}));
+ } catch (/** @type {Error} */ e) {
+ this._fireEventOn('lh-log', this._document, {
+ cmd: 'error', msg: 'Could not export as HTML. ' + e.message,
+ });
+ }
+ break;
+ }
+ case 'open-viewer': {
+ const viewerPath = '/lighthouse/viewer/';
+ ReportUIFeatures.openTabAndSendJsonReport(this.json, viewerPath);
+ break;
+ }
+ case 'save-gist': {
+ this.saveAsGist();
+ break;
+ }
+ case 'toggle-dark': {
+ this._toggleDarkTheme();
+ break;
+ }
+ }
+
+ this.closeExportDropdown();
+ this._document.removeEventListener('keydown', this.onKeyDown);
+ }
+
+ /**
+ * Keydown handler for the document.
+ * @param {KeyboardEvent} e
+ */
+ onKeyDown(e) {
+ if (e.keyCode === 27) { // ESC
+ this.closeExportDropdown();
+ }
+ }
+
+ /**
+ * Keyup handler for the document.
+ * @param {KeyboardEvent} e
+ */
+ onKeyUp(e) {
+ // Ctrl+P - Expands audit details when user prints via keyboard shortcut.
+ if ((e.ctrlKey || e.metaKey) && e.keyCode === 80) {
+ this.closeExportDropdown();
+ }
+ }
+
+ /**
+ * Opens a new tab to the online viewer and sends the local page's JSON results
+ * to the online viewer using postMessage.
+ * @param {LH.Result} reportJson
+ * @param {string} viewerPath
+ * @protected
+ */
+ static openTabAndSendJsonReport(reportJson, viewerPath) {
+ const VIEWER_ORIGIN = 'https://googlechrome.github.io';
+ // Chrome doesn't allow us to immediately postMessage to a popup right
+ // after it's created. Normally, we could also listen for the popup window's
+ // load event, however it is cross-domain and won't fire. Instead, listen
+ // for a message from the target app saying "I'm open".
+ const json = reportJson;
+ window.addEventListener('message', function msgHandler(messageEvent) {
+ if (messageEvent.origin !== VIEWER_ORIGIN) {
+ return;
+ }
+ if (popup && messageEvent.data.opened) {
+ popup.postMessage({lhresults: json}, VIEWER_ORIGIN);
+ window.removeEventListener('message', msgHandler);
+ }
+ });
+
+ // The popup's window.name is keyed by version+url+fetchTime, so we reuse/select tabs correctly
+ // @ts-ignore - If this is a v2 LHR, use old `generatedTime`.
+ const fallbackFetchTime = /** @type {string} */ (json.generatedTime);
+ const fetchTime = json.fetchTime || fallbackFetchTime;
+ const windowName = `${json.lighthouseVersion}-${json.requestedUrl}-${fetchTime}`;
+ const popup = window.open(`${VIEWER_ORIGIN}${viewerPath}`, windowName);
+ }
+
+ /**
+ * Expands all audit `<details>`.
+ * Ideally, a print stylesheet could take care of this, but CSS has no way to
+ * open a `<details>` element.
+ */
+ expandAllDetails() {
+ const details = /** @type {Array<HTMLDetailsElement>} */ (this._dom.findAll(
+ '.lh-categories details', this._document));
+ details.map(detail => detail.open = true);
+ }
+
+ /**
+ * Collapses all audit `<details>`.
+ * open a `<details>` element.
+ */
+ collapseAllDetails() {
+ const details = /** @type {Array<HTMLDetailsElement>} */ (this._dom.findAll(
+ '.lh-categories details', this._document));
+ details.map(detail => detail.open = false);
+ }
+
+ /**
+ * Sets up listeners to collapse audit `<details>` when the user closes the
+ * print dialog, all `<details>` are collapsed.
+ */
+ _setUpCollapseDetailsAfterPrinting() {
+ // FF and IE implement these old events.
+ if ('onbeforeprint' in self) {
+ self.addEventListener('afterprint', this.collapseAllDetails);
+ } else {
+ const win = /** @type {Window} */ (self);
+ // Note: FF implements both window.onbeforeprint and media listeners. However,
+ // it doesn't matchMedia doesn't fire when matching 'print'.
+ win.matchMedia('print').addListener(mql => {
+ if (mql.matches) {
+ this.expandAllDetails();
+ } else {
+ this.collapseAllDetails();
+ }
+ });
+ }
+ }
+
+ /**
+ * Returns the html that recreates this report.
+ * @return {string}
+ * @protected
+ */
+ getReportHtml() {
+ this._resetUIState();
+ return this._document.documentElement.outerHTML;
+ }
+
+ /**
+ * Save json as a gist. Unimplemented in base UI features.
+ * @protected
+ */
+ saveAsGist() {
+ throw new Error('Cannot save as gist from base report');
+ }
+
+ /**
+ * Downloads a file (blob) using a[download].
+ * @param {Blob|File} blob The file to save.
+ * @private
+ */
+ _saveFile(blob) {
+ const filename = getFilenamePrefix({
+ finalUrl: this.json.finalUrl,
+ fetchTime: this.json.fetchTime,
+ });
+
+ const ext = blob.type.match('json') ? '.json' : '.html';
+ const href = URL.createObjectURL(blob);
+
+ const a = this._dom.createElement('a');
+ a.download = `${filename}${ext}`;
+ a.href = href;
+ this._document.body.appendChild(a); // Firefox requires anchor to be in the DOM.
+ a.click();
+
+ // cleanup.
+ this._document.body.removeChild(a);
+ setTimeout(_ => URL.revokeObjectURL(href), 500);
+ }
+
+ /**
+ * @private
+ * @param {boolean} [force]
+ */
+ _toggleDarkTheme(force) {
+ const el = this._dom.find('.lh-vars', this._document);
+ // This seems unnecessary, but in DevTools, passing "undefined" as the second
+ // parameter acts like passing "false".
+ // https://github.com/ChromeDevTools/devtools-frontend/blob/dd6a6d4153647c2a4203c327c595692c5e0a4256/front_end/dom_extension/DOMExtension.js#L809-L819
+ if (typeof force === 'undefined') {
+ el.classList.toggle('dark');
+ } else {
+ el.classList.toggle('dark', force);
+ }
+ }
+
+ _updateStickyHeaderOnScroll() {
+ // Show sticky header when the score scale begins to go underneath the topbar.
+ const topbarBottom = this.topbarEl.getBoundingClientRect().bottom;
+ const scoreScaleTop = this.scoreScaleEl.getBoundingClientRect().top;
+ const showStickyHeader = topbarBottom >= scoreScaleTop;
+
+ // Highlight mini gauge when section is in view.
+ // In view = the last category that starts above the middle of the window.
+ const categoryEls = Array.from(this._document.querySelectorAll('.lh-category'));
+ const categoriesAboveTheMiddle =
+ categoryEls.filter(el => el.getBoundingClientRect().top - window.innerHeight / 2 < 0);
+ const highlightIndex =
+ categoriesAboveTheMiddle.length > 0 ? categoriesAboveTheMiddle.length - 1 : 0;
+
+ // Category order matches gauge order in sticky header.
+ const gaugeWrapperEls = this.stickyHeaderEl.querySelectorAll('.lh-gauge__wrapper');
+ const gaugeToHighlight = gaugeWrapperEls[highlightIndex];
+ const origin = gaugeWrapperEls[0].getBoundingClientRect().left;
+ const offset = gaugeToHighlight.getBoundingClientRect().left - origin;
+
+ // Mutate at end to avoid layout thrashing.
+ this.highlightEl.style.transform = `translate(${offset}px)`;
+ this.stickyHeaderEl.classList.toggle('lh-sticky-header--visible', showStickyHeader);
+ }
+}
+
+if (typeof module !== 'undefined' && module.exports) {
+ module.exports = ReportUIFeatures;
+} else {
+ self.ReportUIFeatures = ReportUIFeatures;
+}
+;
+/**
+ * @license
+ * Copyright 2017 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS-IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+'use strict';
+
/* globals self, Util */
/** @typedef {import('./dom.js')} DOM */
@@ -2105,22 +2850,20 @@ class CategoryRenderer {
/**
* @param {LH.ReportResult.AuditRef} audit
- * @param {number} index
* @return {Element}
*/
- renderAudit(audit, index) {
+ renderAudit(audit) {
const tmpl = this.dom.cloneTemplate('#tmpl-lh-audit', this.templateContext);
- return this.populateAuditValues(audit, index, tmpl);
+ return this.populateAuditValues(audit, tmpl);
}
/**
* Populate an DOM tree with audit details. Used by renderAudit and renderOpportunity
* @param {LH.ReportResult.AuditRef} audit
- * @param {number} index
* @param {DocumentFragment} tmpl
* @return {Element}
*/
- populateAuditValues(audit, index, tmpl) {
+ populateAuditValues(audit, tmpl) {
const auditEl = this.dom.find('.lh-audit', tmpl);
auditEl.id = audit.result.id;
const scoreDisplayMode = audit.result.scoreDisplayMode;
@@ -2134,6 +2877,24 @@ class CategoryRenderer {
this.dom.find('.lh-audit__description', auditEl)
.appendChild(this.dom.convertMarkdownLinkSnippets(audit.result.description));
+ if (audit.stackPacks) {
+ audit.stackPacks.forEach(pack => {
+ const packElm = this.dom.createElement('div');
+ packElm.classList.add('lh-audit__stackpack');
+
+ const packElmImg = this.dom.createElement('img');
+ packElmImg.classList.add('lh-audit__stackpack__img');
+ packElmImg.src = pack.iconDataURL;
+ packElmImg.alt = pack.title;
+ packElm.appendChild(packElmImg);
+
+ packElm.appendChild(this.dom.convertMarkdownLinkSnippets(pack.description));
+
+ this.dom.find('.lh-audit__stackpacks', auditEl)
+ .appendChild(packElm);
+ });
+ }
+
const header = /** @type {HTMLDetailsElement} */ (this.dom.find('details', auditEl));
if (audit.result.details) {
const elem = this.detailsRenderer.render(audit.result.details);
@@ -2142,7 +2903,6 @@ class CategoryRenderer {
header.appendChild(elem);
}
}
- this.dom.find('.lh-audit__index', auditEl).textContent = `${index + 1}`;
// Add chevron SVG to the end of the summary
this.dom.find('.lh-chevron-container', auditEl).appendChild(this._createChevron());
@@ -2164,10 +2924,10 @@ class CategoryRenderer {
// Add list of warnings or singular warning
const warningsEl = this.dom.createChildOf(titleEl, 'div', 'lh-warnings');
+ this.dom.createChildOf(warningsEl, 'span').textContent = Util.UIStrings.warningHeader;
if (warnings.length === 1) {
- warningsEl.textContent = `${Util.UIStrings.warningHeader} ${warnings.join('')}`;
+ warningsEl.appendChild(this.dom.document().createTextNode(warnings.join('')));
} else {
- warningsEl.textContent = Util.UIStrings.warningHeader;
const warningsUl = this.dom.createChildOf(warningsEl, 'ul');
for (const warning of warnings) {
const item = this.dom.createChildOf(warningsUl, 'li');
@@ -2194,7 +2954,10 @@ class CategoryRenderer {
*/
_setRatingClass(element, score, scoreDisplayMode) {
const rating = Util.calculateRating(score, scoreDisplayMode);
- element.classList.add(`lh-audit--${rating}`, `lh-audit--${scoreDisplayMode.toLowerCase()}`);
+ element.classList.add(`lh-audit--${scoreDisplayMode.toLowerCase()}`);
+ if (scoreDisplayMode !== 'informative') {
+ element.classList.add(`lh-audit--${rating}`);
+ }
return element;
}
@@ -2210,8 +2973,6 @@ class CategoryRenderer {
const gaugeEl = this.renderScoreGauge(category, groupDefinitions);
gaugeContainerEl.appendChild(gaugeEl);
- this.dom.find('.lh-category-header__title', tmpl).appendChild(
- this.dom.convertMarkdownCodeSnippets(category.title));
if (category.description) {
const descEl = this.dom.convertMarkdownLinkSnippets(category.description);
this.dom.find('.lh-category-header__description', tmpl).appendChild(descEl);
@@ -2228,16 +2989,17 @@ class CategoryRenderer {
*/
renderAuditGroup(group) {
const groupEl = this.dom.createElement('div', 'lh-audit-group');
- const summaryEl = this.dom.createChildOf(groupEl, 'div');
- const summaryInnerEl = this.dom.createChildOf(summaryEl, 'div', 'lh-audit-group__summary');
- const headerEl = this.dom.createChildOf(summaryInnerEl, 'div', 'lh-audit-group__header');
+ const auditGroupHeader = this.dom.createElement('div', 'lh-audit-group__header');
+
+ this.dom.createChildOf(auditGroupHeader, 'span', 'lh-audit-group__title')
+ .textContent = group.title;
if (group.description) {
- const auditGroupDescription = this.dom.createElement('div', 'lh-audit-group__description');
- auditGroupDescription.appendChild(this.dom.convertMarkdownLinkSnippets(group.description));
- groupEl.appendChild(auditGroupDescription);
+ const descriptionEl = this.dom.convertMarkdownLinkSnippets(group.description);
+ descriptionEl.classList.add('lh-audit-group__description');
+ auditGroupHeader.appendChild(descriptionEl);
}
- headerEl.textContent = group.title;
+ groupEl.appendChild(auditGroupHeader);
return groupEl;
}
@@ -2267,14 +3029,12 @@ class CategoryRenderer {
/** @type {Array<Element>} */
const auditElements = [];
- // Continuous numbering across all groups.
- let index = 0;
for (const [groupId, groupAuditRefs] of grouped) {
if (groupId === notAGroup) {
// Push not-grouped audits individually.
for (const auditRef of groupAuditRefs) {
- auditElements.push(this.renderAudit(auditRef, index++));
+ auditElements.push(this.renderAudit(auditRef));
}
continue;
}
@@ -2283,7 +3043,7 @@ class CategoryRenderer {
const groupDef = groupDefinitions[groupId];
const auditGroupElem = this.renderAuditGroup(groupDef);
for (const auditRef of groupAuditRefs) {
- auditGroupElem.appendChild(this.renderAudit(auditRef, index++));
+ auditGroupElem.appendChild(this.renderAudit(auditRef));
}
auditGroupElem.classList.add(`lh-audit-group--${groupId}`);
auditElements.push(auditGroupElem);
@@ -2327,17 +3087,15 @@ class CategoryRenderer {
const headerEl = this.dom.find('.lh-audit-group__header', clumpElement);
const title = this._clumpTitles[clumpId];
- headerEl.textContent = title;
+ this.dom.find('.lh-audit-group__title', headerEl).textContent = title;
if (description) {
- const markdownDescriptionEl = this.dom.convertMarkdownLinkSnippets(description);
- const auditGroupDescription = this.dom.createElement('div', 'lh-audit-group__description');
- auditGroupDescription.appendChild(markdownDescriptionEl);
- clumpElement.appendChild(auditGroupDescription);
+ const descriptionEl = this.dom.convertMarkdownLinkSnippets(description);
+ descriptionEl.classList.add('lh-audit-group__description');
+ headerEl.appendChild(descriptionEl);
}
const itemCountEl = this.dom.find('.lh-audit-group__itemcount', clumpElement);
- // TODO(i18n): support multiple locales here
- itemCountEl.textContent = `${auditRefs.length} audits`;
+ itemCountEl.textContent = `(${auditRefs.length})`;
// Add all audit results to the clump.
const auditElements = auditRefs.map(this.renderAudit.bind(this));
@@ -2366,16 +3124,20 @@ class CategoryRenderer {
wrapper.href = `#${category.id}`;
wrapper.classList.add(`lh-gauge__wrapper--${Util.calculateRating(category.score)}`);
+ if (Util.isPluginCategory(category.id)) {
+ wrapper.classList.add('lh-gauge__wrapper--plugin');
+ }
+
// Cast `null` to 0
const numericScore = Number(category.score);
const gauge = this.dom.find('.lh-gauge', tmpl);
- // 329 is ~= 2 * Math.PI * gauge radius (53)
+ // 352 is ~= 2 * Math.PI * gauge radius (56)
// https://codepen.io/xgad/post/svg-radial-progress-meters
- // score of 50: `stroke-dasharray: 164.5 329`;
+ // score of 50: `stroke-dasharray: 176 352`;
/** @type {?SVGCircleElement} */
const gaugeArc = gauge.querySelector('.lh-gauge-arc');
if (gaugeArc) {
- gaugeArc.style.strokeDasharray = `${numericScore * 329} 329`;
+ gaugeArc.style.strokeDasharray = `${numericScore * 352} 352`;
}
const scoreOutOf100 = Math.round(numericScore * 100);
@@ -2425,19 +3187,19 @@ class CategoryRenderer {
* manual, passed, or notApplicable. The result ends up something like:
*
* failed clump
- * \\u251c\\u2500\\u2500 audit 1 (w/o group)
- * \\u251c\\u2500\\u2500 audit 2 (w/o group)
- * \\u251c\\u2500\\u2500 audit group
- * | \\u251c\\u2500\\u2500 audit 3
- * | \\u2514\\u2500\\u2500 audit 4
- * \\u2514\\u2500\\u2500 audit group
- * \\u251c\\u2500\\u2500 audit 5
- * \\u2514\\u2500\\u2500 audit 6
+ * ├── audit 1 (w/o group)
+ * ├── audit 2 (w/o group)
+ * ├── audit group
+ * | ├── audit 3
+ * | └── audit 4
+ * └── audit group
+ * ├── audit 5
+ * └── audit 6
* other clump (e.g. 'manual')
- * \\u251c\\u2500\\u2500 audit 1
- * \\u251c\\u2500\\u2500 audit 2
- * \\u251c\\u2500\\u2500 \\u2026
- * \\u22ee
+ * ├── audit 1
+ * ├── audit 2
+ * ├── …
+ * ⋮
* @param {LH.ReportResult.Category} category
* @param {Object<string, LH.Result.ReportGroup>} [groupDefinitions]
* @return {Element}
@@ -2555,13 +3317,12 @@ class PerformanceCategoryRenderer extends CategoryRenderer {
/**
* @param {LH.ReportResult.AuditRef} audit
- * @param {number} index
* @param {number} scale
* @return {Element}
*/
- _renderOpportunity(audit, index, scale) {
+ _renderOpportunity(audit, scale) {
const oppTmpl = this.dom.cloneTemplate('#tmpl-lh-opportunity', this.templateContext);
- const element = this.populateAuditValues(audit, index, oppTmpl);
+ const element = this.populateAuditValues(audit, oppTmpl);
element.id = audit.result.id;
if (!audit.result.details || audit.result.scoreDisplayMode === 'error') {
@@ -2625,10 +3386,15 @@ class PerformanceCategoryRenderer extends CategoryRenderer {
element.appendChild(this.renderCategoryHeader(category, groups));
}
- // Metrics
+ // Metrics.
const metricAudits = category.auditRefs.filter(audit => audit.group === 'metrics');
const metricAuditsEl = this.renderAuditGroup(groups.metrics);
+ // Metric descriptions toggle.
+ const toggleTmpl = this.dom.cloneTemplate('#tmpl-lh-metrics-toggle', this.templateContext);
+ const toggleEl = this.dom.find('.lh-metrics-toggle', toggleTmpl);
+ metricAuditsEl.prepend(...toggleEl.childNodes);
+
const keyMetrics = metricAudits.filter(a => a.weight >= 3);
const otherMetrics = metricAudits.filter(a => a.weight < 3);
@@ -2645,8 +3411,7 @@ class PerformanceCategoryRenderer extends CategoryRenderer {
// 'Values are estimated and may vary' is used as the category description for PSI
if (environment !== 'PSI') {
- const estValuesEl = this.dom.createChildOf(metricsColumn2El, 'div',
- 'lh-metrics__disclaimer lh-metrics__disclaimer');
+ const estValuesEl = this.dom.createChildOf(metricAuditsEl, 'div', 'lh-metrics__disclaimer');
estValuesEl.textContent = Util.UIStrings.varianceDisclaimer;
}
@@ -2663,6 +3428,20 @@ class PerformanceCategoryRenderer extends CategoryRenderer {
filmstripEl && timelineEl.appendChild(filmstripEl);
}
+ // Budgets
+ const budgetAudit = category.auditRefs.find(audit => audit.id === 'performance-budget');
+ if (budgetAudit && budgetAudit.result.details) {
+ const table = this.detailsRenderer.render(budgetAudit.result.details);
+ if (table) {
+ table.id = budgetAudit.id;
+ table.classList.add('lh-audit');
+ const budgetsGroupEl = this.renderAuditGroup(groups.budgets);
+ budgetsGroupEl.appendChild(table);
+ budgetsGroupEl.classList.add('lh-audit-group--budgets');
+ element.appendChild(budgetsGroupEl);
+ }
+ }
+
// Opportunities
const opportunityAudits = category.auditRefs
.filter(audit => audit.group === 'load-opportunities' && !Util.showAsPassed(audit.result))
@@ -2684,8 +3463,7 @@ class PerformanceCategoryRenderer extends CategoryRenderer {
const headerEl = this.dom.find('.lh-load-opportunity__header', tmpl);
groupEl.appendChild(headerEl);
- opportunityAudits.forEach((item, i) =>
- groupEl.appendChild(this._renderOpportunity(item, i, scale)));
+ opportunityAudits.forEach(item => groupEl.appendChild(this._renderOpportunity(item, scale)));
groupEl.classList.add('lh-audit-group--load-opportunities');
element.appendChild(groupEl);
}
@@ -2701,7 +3479,7 @@ class PerformanceCategoryRenderer extends CategoryRenderer {
if (diagnosticAudits.length) {
const groupEl = this.renderAuditGroup(groups['diagnostics']);
- diagnosticAudits.forEach((item, i) => groupEl.appendChild(this.renderAudit(item, i)));
+ diagnosticAudits.forEach(item => groupEl.appendChild(this.renderAudit(item)));
groupEl.classList.add('lh-audit-group--diagnostics');
element.appendChild(groupEl);
}
@@ -2961,36 +3739,24 @@ class ReportRenderer {
* @param {LH.ReportResult} report
* @return {DocumentFragment}
*/
- _renderReportHeader(report) {
- const el = this._dom.cloneTemplate('#tmpl-lh-heading', this._templateContext);
- const domFragment = this._dom.cloneTemplate('#tmpl-lh-scores-wrapper', this._templateContext);
- const placeholder = this._dom.find('.lh-scores-wrapper-placeholder', el);
- /** @type {HTMLDivElement} */ (placeholder.parentNode).replaceChild(domFragment, placeholder);
-
- this._dom.find('.lh-config__timestamp', el).textContent =
- Util.formatDateTime(report.fetchTime);
- this._dom.find('.lh-product-info__version', el).textContent = report.lighthouseVersion;
- const metadataUrl = /** @type {HTMLAnchorElement} */ (this._dom.find('.lh-metadata__url', el));
- const toolbarUrl = /** @type {HTMLAnchorElement}*/ (this._dom.find('.lh-toolbar__url', el));
+ _renderReportTopbar(report) {
+ const el = this._dom.cloneTemplate('#tmpl-lh-topbar', this._templateContext);
+ const metadataUrl = /** @type {HTMLAnchorElement} */ (this._dom.find('.lh-topbar__url', el));
metadataUrl.href = metadataUrl.textContent = report.finalUrl;
- toolbarUrl.href = toolbarUrl.textContent = report.finalUrl;
-
- const emulationDescriptions = Util.getEmulationDescriptions(report.configSettings || {});
- this._dom.find('.lh-config__emulation', el).textContent = emulationDescriptions.summary;
return el;
}
/**
- * @return {Element}
+ * @return {DocumentFragment}
*/
- _renderReportShortHeader() {
- const shortHeaderContainer = this._dom.createElement('div', 'lh-header-container');
- const wrapper = this._dom.cloneTemplate('#tmpl-lh-scores-wrapper', this._templateContext);
- shortHeaderContainer.appendChild(wrapper);
- return shortHeaderContainer;
+ _renderReportHeader() {
+ const el = this._dom.cloneTemplate('#tmpl-lh-heading', this._templateContext);
+ const domFragment = this._dom.cloneTemplate('#tmpl-lh-scores-wrapper', this._templateContext);
+ const placeholder = this._dom.find('.lh-scores-wrapper-placeholder', el);
+ /** @type {HTMLDivElement} */ (placeholder.parentNode).replaceChild(domFragment, placeholder);
+ return el;
}
-
/**
* @param {LH.ReportResult} report
* @return {DocumentFragment}
@@ -3014,7 +3780,7 @@ class ReportRenderer {
if (!runtime.description) return;
const item = this._dom.cloneTemplate('#tmpl-lh-env__items', env);
- this._dom.find('.lh-env__name', item).textContent = `${runtime.name}:`;
+ this._dom.find('.lh-env__name', item).textContent = runtime.name;
this._dom.find('.lh-env__description', item).textContent = runtime.description;
env.appendChild(item);
});
@@ -3048,33 +3814,42 @@ class ReportRenderer {
/**
* @param {LH.ReportResult} report
- * @return {DocumentFragment}
+ * @param {CategoryRenderer} categoryRenderer
+ * @param {Record<string, CategoryRenderer>} specificCategoryRenderers
+ * @return {DocumentFragment[]}
*/
- _renderReport(report) {
- let header;
- const headerContainer = this._dom.createElement('div');
- if (this._dom.isDevTools()) {
- headerContainer.classList.add('lh-header-plain');
- header = this._renderReportShortHeader();
- } else {
- headerContainer.classList.add('lh-header-sticky');
- header = this._renderReportHeader(report);
- }
- headerContainer.appendChild(header);
-
- const container = this._dom.createElement('div', 'lh-container');
- const reportSection = container.appendChild(this._dom.createElement('div', 'lh-report'));
+ _renderScoreGauges(report, categoryRenderer, specificCategoryRenderers) {
+ // Group gauges in this order: default, pwa, plugins.
+ const defaultGauges = [];
+ const customGauges = []; // PWA.
+ const pluginGauges = [];
- reportSection.appendChild(this._renderReportWarnings(report));
-
- let scoreHeader;
- const isSoloCategory = report.reportCategories.length === 1;
- if (!isSoloCategory) {
- scoreHeader = this._dom.createElement('div', 'lh-scores-header');
- } else {
- headerContainer.classList.add('lh-header--solo-category');
+ for (const category of Object.values(report.categories)) {
+ const renderer = specificCategoryRenderers[category.id] || categoryRenderer;
+ const categoryGauge = renderer.renderScoreGauge(category, report.categoryGroups || {});
+
+ if (Util.isPluginCategory(category.id)) {
+ pluginGauges.push(categoryGauge);
+ } else if (renderer.renderScoreGauge === categoryRenderer.renderScoreGauge) {
+ // The renderer for default categories is just the default CategoryRenderer.
+ // If the functions are equal, then renderer is an instance of CategoryRenderer.
+ // For example, the PWA category uses PwaCategoryRenderer, which overrides
+ // CategoryRenderer.renderScoreGauge, so it would fail this check and be placed
+ // in the customGauges bucket.
+ defaultGauges.push(categoryGauge);
+ } else {
+ customGauges.push(categoryGauge);
+ }
}
+ return [...defaultGauges, ...customGauges, ...pluginGauges];
+ }
+
+ /**
+ * @param {LH.ReportResult} report
+ * @return {DocumentFragment}
+ */
+ _renderReport(report) {
const detailsRenderer = new DetailsRenderer(this._dom);
const categoryRenderer = new CategoryRenderer(this._dom, detailsRenderer);
categoryRenderer.setTemplateContext(this._templateContext);
@@ -3088,51 +3863,52 @@ class ReportRenderer {
renderer.setTemplateContext(this._templateContext);
});
- const categories = reportSection.appendChild(this._dom.createElement('div', 'lh-categories'));
+ const headerContainer = this._dom.createElement('div');
+ headerContainer.appendChild(this._renderReportHeader());
- for (const category of report.reportCategories) {
- const renderer = specificCategoryRenderers[category.id] || categoryRenderer;
- categories.appendChild(renderer.render(category, report.categoryGroups));
- }
+ const container = this._dom.createElement('div', 'lh-container');
+ const reportSection = this._dom.createElement('div', 'lh-report');
+ reportSection.appendChild(this._renderReportWarnings(report));
- // Fireworks
- const scoresAll100 = report.reportCategories.every(cat => cat.score === 1);
- if (!this._dom.isDevTools() && scoresAll100) {
- headerContainer.classList.add('score100');
- this._dom.find('.lh-header', headerContainer).addEventListener('click', _ => {
- headerContainer.classList.toggle('fireworks-paused');
- });
+ let scoreHeader;
+ const isSoloCategory = Object.keys(report.categories).length === 1;
+ if (!isSoloCategory) {
+ scoreHeader = this._dom.createElement('div', 'lh-scores-header');
+ } else {
+ headerContainer.classList.add('lh-header--solo-category');
}
if (scoreHeader) {
- const defaultGauges = [];
- const customGauges = [];
- for (const category of report.reportCategories) {
- const renderer = specificCategoryRenderers[category.id] || categoryRenderer;
- const categoryGauge = renderer.renderScoreGauge(category, report.categoryGroups || {});
-
- // Group gauges that aren't default at the end of the header
- if (renderer.renderScoreGauge === categoryRenderer.renderScoreGauge) {
- defaultGauges.push(categoryGauge);
- } else {
- customGauges.push(categoryGauge);
- }
- }
- scoreHeader.append(...defaultGauges, ...customGauges);
-
const scoreScale = this._dom.cloneTemplate('#tmpl-lh-scorescale', this._templateContext);
- this._dom.find('.lh-scorescale-label', scoreScale).textContent =
- Util.UIStrings.scorescaleLabel;
const scoresContainer = this._dom.find('.lh-scores-container', headerContainer);
+ scoreHeader.append(
+ ...this._renderScoreGauges(report, categoryRenderer, specificCategoryRenderers));
scoresContainer.appendChild(scoreHeader);
scoresContainer.appendChild(scoreScale);
+
+ const stickyHeader = this._dom.createElement('div', 'lh-sticky-header');
+ stickyHeader.append(
+ ...this._renderScoreGauges(report, categoryRenderer, specificCategoryRenderers));
+ container.appendChild(stickyHeader);
}
- reportSection.appendChild(this._renderReportFooter(report));
+ const categories = reportSection.appendChild(this._dom.createElement('div', 'lh-categories'));
+ for (const category of Object.values(report.categories)) {
+ const renderer = specificCategoryRenderers[category.id] || categoryRenderer;
+ // .lh-category-wrapper is full-width and provides horizontal rules between categories.
+ // .lh-category within has the max-width: var(--report-width);
+ const wrapper = renderer.dom.createChildOf(categories, 'div', 'lh-category-wrapper');
+ wrapper.appendChild(renderer.render(category, report.categoryGroups));
+ }
const reportFragment = this._dom.createFragment();
- reportFragment.appendChild(headerContainer);
+ const topbarDocumentFragment = this._renderReportTopbar(report);
+
+ reportFragment.appendChild(topbarDocumentFragment);
reportFragment.appendChild(container);
+ container.appendChild(headerContainer);
+ container.appendChild(reportSection);
+ reportSection.appendChild(this._renderReportFooter(report));
return reportFragment;
}
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/audits2/lighthouse/templates.html b/chromium/third_party/blink/renderer/devtools/front_end/audits2/lighthouse/templates.html
index c63bc666fd3..ee4b388c69a 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/audits2/lighthouse/templates.html
+++ b/chromium/third_party/blink/renderer/devtools/front_end/audits2/lighthouse/templates.html
@@ -26,10 +26,9 @@ limitations under the License.
<!-- Lighthouse score scale -->
<template id="tmpl-lh-scorescale">
<div class="lh-scorescale">
- <span class="lh-scorescale-label"></span>
- <span class="lh-scorescale-range lh-scorescale-range--pass">90-100</span>
- <span class="lh-scorescale-range lh-scorescale-range--average">50-89</span>
- <span class="lh-scorescale-range lh-scorescale-range--fail">0-49</span>
+ <span class="lh-scorescale-range lh-scorescale-range--fail">0&ndash;49</span>
+ <span class="lh-scorescale-range lh-scorescale-range--average">50&ndash;89</span>
+ <span class="lh-scorescale-range lh-scorescale-range--pass">90&ndash;100</span>
</div>
</template>
@@ -47,7 +46,6 @@ limitations under the License.
<template id="tmpl-lh-category-header">
<div class="lh-category-header">
<div class="lh-score__gauge"></div>
- <span class="lh-category-header__title"></span>
<div class="lh-category-header__description"></div>
</div>
</template>
@@ -58,28 +56,53 @@ limitations under the License.
<details class="lh-clump lh-audit-group">
<summary>
<div class="lh-audit-group__summary">
- <div class="lh-audit-group__header"></div>
- <div class="lh-audit-group__itemcount"></div>
+ <div class="lh-audit-group__header">
+ <span class="lh-audit-group__title"></span>
+ <span class="lh-audit-group__itemcount"></span>
+ <!-- .lh-audit-group__description will be added here -->
+ <!-- .lh-metrics-toggle will be added here -->
+ </div>
<div class=""></div>
</div>
</summary>
</details>
</template>
+<!-- Lighthouse metrics toggle -->
+<template id="tmpl-lh-metrics-toggle">
+ <div class="lh-metrics-toggle">
+ <input class="lh-metrics-toggle__input" type="checkbox" name="toggle-metric-descriptions">
+ <label class="lh-metrics-toggle__label" for="toggle-metric-descriptions">
+ <div class="lh-metrics-toggle__icon lh-metrics-toggle__icon--less" aria-hidden="true">
+ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24">
+ <path class="lh-metrics-toggle__lines" d="M4 9h16v2H4zm0 4h10v2H4z" />
+ </svg>
+ </div>
+ <div class="lh-metrics-toggle__icon lh-metrics-toggle__icon--more" aria-hidden="true">
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+ <path class="lh-metrics-toggle__lines" d="M3 18h12v-2H3v2zM3 6v2h18V6H3zm0 7h18v-2H3v2z" />
+ </svg>
+ </div>
+ </label>
+ </div>
+</template>
+
<!-- Lighthouse audit -->
<template id="tmpl-lh-audit">
<div class="lh-audit">
<details class="lh-expandable-details">
<summary>
<div class="lh-audit__header lh-expandable-details__summary">
- <span class="lh-audit__index"></span>
- <span class="lh-audit__title"></span>
- <span class="lh-audit__display-text"></span>
- <div class="lh-audit__score-icon"></div>
+ <span class="lh-audit__score-icon"></span>
+ <span class="lh-audit__title-and-text">
+ <span class="lh-audit__title"></span>
+ <span class="lh-audit__display-text"></span>
+ </span>
<div class="lh-chevron-container"></div>
</div>
</summary>
<div class="lh-audit__description"></div>
+ <div class="lh-audit__stackpacks"></div>
</details>
</div>
</template>
@@ -87,10 +110,10 @@ limitations under the License.
<!-- Lighthouse perf metric -->
<template id="tmpl-lh-metric">
<div class="lh-metric">
- <div class="lh-metric__innerwrap tooltip-boundary">
+ <div class="lh-metric__innerwrap">
<span class="lh-metric__title"></span>
<div class="lh-metric__value"></div>
- <div class="lh-metric__description tooltip"></div>
+ <div class="lh-metric__description"></div>
</div>
</div>
</template>
@@ -103,7 +126,7 @@ limitations under the License.
<div class="lh-audit__header lh-expandable-details__summary">
<div class="lh-load-opportunity__cols">
<div class="lh-load-opportunity__col lh-load-opportunity__col--one">
- <span class="lh-audit__index"></span>
+ <span class="lh-audit__score-icon"></span>
<div class="lh-audit__title"></div>
</div>
<div class="lh-load-opportunity__col lh-load-opportunity__col--two">
@@ -117,11 +140,11 @@ limitations under the License.
</div>
</summary>
<div class="lh-audit__description"></div>
+ <div class="lh-audit__stackpacks"></div>
</details>
</div>
</template>
-
<!-- Lighthouse perf opportunity header -->
<template id="tmpl-lh-opportunity-header">
<div class="lh-load-opportunity__header lh-load-opportunity__cols">
@@ -130,167 +153,142 @@ limitations under the License.
</div>
</template>
-
<!-- Lighthouse score container -->
<template id="tmpl-lh-scores-wrapper">
<style>
- .lh-scores-wrapper__background,
- .lh-scores-wrapper__shadow {
- position: absolute;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- background: white;
- border-radius: 8px;
- }
- .lh-scores-wrapper__shadow {
- border-radius: 0;
- box-shadow: rgba(0, 0, 0, 0.2) 0px 3px 0px -2px
- }
.lh-scores-container {
- padding-bottom: calc(var(--section-indent) / 2);
+ display: flex;
+ flex-direction: column;
+ padding: var(--header-padding);
position: relative;
width: 100%;
}
- </style>
- <div class="lh-scores-wrapper">
- <div class="lh-scores-container">
- <div class="lh-scores-wrapper__background"></div>
- <div class="lh-scores-wrapper__shadow"></div>
- </div>
- </div>
-</template>
-
-<!-- Lighthouse header -->
-<template id="tmpl-lh-heading">
- <style>
- :root {
- --report-header-overlap-top: 30px;
- }
- .lh-header-bg {
- background-color: var(--header-bg-color);
- height: var(--report-header-height);
+ .lh-sticky-header {
+ --gauge-circle-size: 36px;
+ --plugin-badge-size: 18px;
+ --plugin-icon-size: 75%;
+ --score-container-width: 60px;
+ --score-number-font-size: 13px;
+ position: sticky;
left: 0;
- position: absolute;
- top: 0;
- width: 100%;
- will-change: transform;
- contain: strict;
- }
- .lh-lighthouse {
- position: absolute;
- bottom: -4px;
right: 0;
- opacity: 1;
- transform-origin: bottom right;
- will-change: transform, opacity;
- }
- .lh-header {
- width: 100%;
- height: var(--report-header-height);
- max-width: 100%; /* support text-overflow on url */
- position: relative;
- }
- .lh-metadata {
- flex: 1 1 0;
- padding: calc(var(--section-padding) / 2);
- padding-left: var(--section-indent);
- line-height: 20px;
- color: var(--report-header-color);
+ top: var(--topbar-height);
+ font-weight: 700;
+ display: none;
+ justify-content: center;
+ background-color: var(--color-sticky-header-bg);
+ border-bottom: 1px solid var(--color-black-200);
+ padding-top: var(--score-container-padding);
+ padding-bottom: 4px;
z-index: 1;
- position: relative;
- max-width: 60%;
+ pointer-events: none;
}
- .lh-metadata__results {
- text-overflow: ellipsis;
- white-space: nowrap;
- overflow: hidden;
+
+ .lh-sticky-header--visible {
+ display: flex;
+ pointer-events: auto;
}
- .lh-metadata__url {
- color: currentColor;
+
+ /* Disable the gauge arc animation for the sticky header, so toggling display: none
+ does not play the animation. */
+ .lh-sticky-header .lh-gauge-arc {
+ animation: none;
}
- .lh-scores-wrapper {
- margin-top: -30px;
+
+ .lh-sticky-header .lh-gauge__label {
+ display: none;
}
- .lh-scores-wrapper__shadow {
- opacity: 0;
+
+ .lh-highlighter {
+ width: var(--score-container-width);
+ height: 1px;
+ background: var(--color-highlighter-bg);
+ position: absolute;
+ bottom: -5px;
}
- .lh-scores-wrapper__background,
- .lh-scores-wrapper__shadow {
- box-shadow: 0 1px 3px 1px rgba(0, 0, 0, 0.1);
- border-radius: 8px;
- will-change: opacity, transform;
- transform-origin: top;
+
+ .lh-gauge__wrapper:first-of-type {
+ contain: none;
}
+ </style>
+ <div class="lh-scores-wrapper">
+ <div class="lh-scores-container">
+ <div class="pyro">
+ <div class="before"></div>
+ <div class="after"></div>
+ </div>
+ </div>
+ </div>
+</template>
- .lh-product-info, .lh-toolbar__metadata {
- align-items: center;
- white-space: nowrap;
- color: #5F6369;
+<!-- Lighthouse topbar -->
+<template id="tmpl-lh-topbar">
+ <style>
+ .lh-topbar {
+ position: sticky;
+ top: 0;
+ left: 0;
+ right: 0;
+ z-index: 1000;
display: flex;
- font-size: calc(var(--body-font-size) * 0.9);
- margin-left: var(--section-indent);
- opacity: 0;
- transform: translateY(-50%);
- will-change: opacity;
- }
- .lh-product-info__icon {
- height: 20px;
- margin-right: var(--default-padding);
+ align-items: center;
+ height: var(--topbar-height);
+ background-color: var(--topbar-bg);
+ padding: var(--topbar-padding);
}
- .lh-toolbar {
- height: 50px;
- position: absolute;
- top: 25px;
- will-change: transform;
- display: flex;
- width: calc(100% - 70px); /* give room for export */
+
+ .lh-topbar__logo {
+ width: var(--topbar-icon-size);
+ height: var(--topbar-icon-size);
+ user-select: none;
}
- .lh-toolbar__metadata {
- overflow: hidden;
- text-overflow: ellipsis;
- width: 100%;
+ .lh-topbar__logo .shape {
+ fill: var(--body-text-color);
}
- .lh-toolbar__url {
- color: currentColor;
- display: block;
- white-space: nowrap;
- margin-right: 2px;
+
+ .lh-topbar__url {
+ margin: var(--topbar-padding);
+ text-decoration: none;
+ color: var(--body-text-color);
}
+
.lh-export {
- position: absolute;
- right: var(--section-indent);
- transform: translateY(0);
- top: calc(var(--section-padding) / 2);
+ margin-left: auto;
will-change: transform;
- z-index: 2;
}
.lh-export__button {
- background-color: #fff;
- border: 1px solid #dadada;
- border-radius: 2px;
+ width: var(--lh-export-icon-size);
+ height: var(--lh-export-icon-size);
cursor: pointer;
- outline: none;
- height: 32px;
- width: 48px;
- background-repeat: no-repeat;
- background-size: 20px;
- background-position: 50% 50%;
- will-change: transform;
+ margin-right: 5px;
+ }
+ /*
+ Some features in the top right drop down menu don't work in the DevTools
+ client. They could with some tweaks, but currently they don't. For example:
+ Saving as HTML/JSON - does not bring up a file dialog, as one would expect in DevTools.
+ also, it saves the AuditsPanel HTML, which is funky.
+ */
+ .lh-devtools .lh-export__button {
+ display: none;
+ }
+ .lh-export__button svg {
+ fill: var(--lh-export-icon-color);
+ }
+ .dark .lh-export__button svg {
+ filter: invert(1);
}
.lh-export__button:focus,
.lh-export__button.active {
- box-shadow: 1px 1px 3px #ccc;
+ outline: none;
}
.lh-export__button.active + .lh-export__dropdown {
opacity: 1;
- clip: rect(0, 164px, 200px, 0);
+ clip: rect(-1px, 187px, 242px, -3px);
}
.lh-export__dropdown {
position: absolute;
- background-color: #fff;
+ background-color: var(--body-background-color);
border: 1px solid var(--report-border-color);
border-radius: 3px;
padding: calc(var(--default-padding) / 2) 0;
@@ -313,7 +311,7 @@ limitations under the License.
}
.lh-export__dropdown a:hover,
.lh-export__dropdown a:focus {
- background-color: #efefef;
+ background-color: var(--color-black-200);
outline: none;
}
.lh-export__dropdown .report-icon {
@@ -324,6 +322,14 @@ limitations under the License.
background-color: transparent;
text-indent: 18px;
}
+ .dark .report-icon {
+ color: var(--color-black-900);
+ filter: invert(1);
+ }
+ .dark .lh-export__dropdown a:hover,
+ .dark .lh-export__dropdown a:focus {
+ background-color: #BDBDBD;
+ }
/* copy icon needs slight adjustments to look great */
.lh-export__dropdown .report-icon--copy {
background-size: 16px;
@@ -333,17 +339,7 @@ limitations under the License.
.lh-export__dropdown .lh-export--gist {
display: none;
}
- .lh-config {
- color: var(--secondary-text-color);
- }
- .lh-config__timestamp {
- font-size: var(--caption-font-size);
- display: block;
- }
- a.lh-config__emulation {
- color: inherit;
- text-decoration: none;
- }
+
@media screen and (max-width: 964px) {
.lh-export__dropdown {
right: 0;
@@ -351,11 +347,49 @@ limitations under the License.
}
}
@media print {
- .lh-header {
+ .lh-topbar {
position: static;
margin-left: 0;
}
}
+ </style>
+
+ <div class="lh-topbar">
+ <!-- Flat Lighthouse logo. -->
+ <svg class="lh-topbar__logo" viewBox="0 0 192 192">
+ <g fill="none" fill-rule="evenodd">
+ <path d="M0 0h192v192H0z"/>
+ <path class="shape" d="M67.705 179.352l2.603-20.82 49.335-16.39 4.652 37.21A87.893 87.893 0 0 1 96 184a87.893 87.893 0 0 1-28.295-4.648zM52.44 172.48C25.894 157.328 8 128.754 8 96 8 47.399 47.399 8 96 8s88 39.399 88 88c0 32.754-17.894 61.328-44.44 76.48L130 96h6V80h-8V48L96 28 64 48v32h-8v16h6l-9.56 76.48zM113.875 96l2.882 23.05-43.318 14.433L78.125 96h35.75zM80 80V56.868l16-10 16 10V80H80z"/>
+ </g>
+ </svg>
+
+ <a href="" class="lh-topbar__url" target="_blank" rel="noopener"></a>
+
+ <div class="lh-export">
+ <div class="report-icon report-icon--share lh-export__button" title="Export report">
+ <svg width="100%" height="100%" viewBox="0 0 24 24">
+ <path d="M0 0h24v24H0z" fill="none"/>
+ <path d="M12 8c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z"/>
+ </svg>
+ </div>
+ <div class="lh-export__dropdown">
+ <!-- TODO(i18n): localize export dropdown -->
+ <a href="#" class="report-icon report-icon--print" data-action="print-summary">Print Summary</a>
+ <a href="#" class="report-icon report-icon--print" data-action="print-expanded">Print Expanded</a>
+ <a href="#" class="report-icon report-icon--copy" data-action="copy">Copy JSON</a>
+ <a href="#" class="report-icon report-icon--download" data-action="save-html">Save as HTML</a>
+ <a href="#" class="report-icon report-icon--download" data-action="save-json">Save as JSON</a>
+ <a href="#" class="report-icon report-icon--open lh-export--viewer" data-action="open-viewer">Open in Viewer</a>
+ <a href="#" class="report-icon report-icon--open lh-export--gist" data-action="save-gist">Save as Gist</a>
+ <a href="#" class="report-icon report-icon--dark" data-action="toggle-dark">Toggle Dark Theme</a>
+ </div>
+ </div>
+ </div>
+</template>
+
+<!-- Lighthouse header -->
+<template id="tmpl-lh-heading">
+ <style>
/*
TODO: Enable animating the clouds
.lh-lighthouse__clouds {
@@ -384,6 +418,8 @@ limitations under the License.
*/
.pyro {
display: none;
+ z-index: 1;
+ pointer-events: none;
}
.score100 .pyro {
display: block;
@@ -447,82 +483,10 @@ limitations under the License.
}
}
</style>
- <div class="lh-header-bg">
- <div class="pyro">
- <div class="before"></div>
- <div class="after"></div>
- </div>
- </div>
-
<div class="lh-header-container">
- <div class="lh-header">
- <div class="lh-lighthouse">
- <svg width="217" height="148" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
- <defs>
- <mask id="a" x="-56" y="-54" width="284" height="202" maskUnits="userSpaceOnUse">
- <path d="M-56-54h284v202H-56z" fill="#fff"></path>
- </mask>
- <linearGradient id="b" x1="-525.16" y1="560.08" x2="-524.23" y2="560.08" gradientTransform="matrix(91 0 0 -77 47797 43181)" gradientUnits="userSpaceOnUse">
- <stop offset="0" stop-color="#FFFFFF00"/>
- <stop offset="1" stop-color="#FFFFFF"/>
- </linearGradient>
- </defs>
- <g mask="url(#a)">
- <!-- lighthouse building elements -->
- <path d="M95 47h24v2H95z" fill="#ec5548"/>
- <path d="M95 59h24v7H95z" fill="#ec5548"/>
- <path d="M97.63 66h19.74l2.63 47H95z" fill="#fff"/>
- <path d="M107 38a10 10 0 0 1 10 10v1H97v-1a10 10 0 0 1 10-10zM96.77 82.23l21-10.7.63 11.87-22.31 11.87zM95 110.8L119.1 98l.9 14H95z" fill="#ec5548"/>
- <path d="M0 148a177.58 177.58 0 0 1 217 0z" fill="#e8eaed"/>
- <!-- lighthouse beam elements -->
- <path d="M98 49h18v11H98z" fill="#fbc21b"/>
- <path d="M103 49a5 5 0 0 1 5 5 5 5 0 0 1-5 5 5 5 0 0 1-5-5 5 5 0 0 1 5-5z" fill="#fef0c8"/>
- <path d="M7 16l91 33.18v10L7 93z" fill="url(#b)"/>
- </g>
- <g mask="url(#a)" class="lh-lighthouse__clouds">
- <path d="M60 .19A9.77 9.77 0 0 1 61.93 0a9.44 9.44 0 0 1 9.24 7.83A7.24 7.24 0 0 1 79 14.45v.73A7.37 7.37 0 0 1 76.2 21h-31a7.44 7.44 0 0 1-1.2-4.09 7.31 7.31 0 0 1 7.26-7.36 6.84 6.84 0 0 1 1.28.1v-.11A9.51 9.51 0 0 1 60 .19m79.78 22.31h-17.9a4.37 4.37 0 0 1-.63-2.25 4.2 4.2 0 0 1 4.16-4.25 4.37 4.37 0 0 1 .72.06V16a5.35 5.35 0 0 1 10.64-1h.33a4.2 4.2 0 0 1 4.15 4.25 4.29 4.29 0 0 1-1.47 3.25zM163 62h-24.15a5.1 5.1 0 0 1-.85-2.81 5.65 5.65 0 0 1 6.59-5.19v-.08a7.07 7.07 0 0 1 7.24-6.92 7.15 7.15 0 0 1 7.17 5.64h.44a5.46 5.46 0 0 1 5.6 5.32A5.19 5.19 0 0 1 163 62z" fill="#fff"/>
- </g>
- </svg>
- </div>
-
- <div class="lh-metadata">
- <div class="lh-metadata__results"><a href="" class="lh-metadata__url" target="_blank" rel="noopener"></a></div>
- <div class="lh-config">
- <span class="lh-config__timestamp"></span>
- <a href="#runtime-settings" class="lh-config__emulation"></a>
- </div>
- </div>
- </div>
-
<div class="lh-scores-wrapper-placeholder"></div>
-
- <div class="lh-toolbar">
- <div class="lh-product-info">
- <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAADjklEQVR4AWI08P/HQEvAQrxSQKvlECfLFYXx75xCY2qmh89GbNvOMjb3v9jOOlxnFWxj206ebQ3b7q6q+z1rNagu8/zvPSZACAABpeUAA0miMgU7SA7JjCraFGwZwECOwvL75dWjsKgWBKtx0jvWo+vkBAFbACCkByMP6nMn48+AVgXB2fzSCwsv22/lMGlUhmJ0AE7BH8dyUUDbUEgN6RzJRSeaPxhdRYR0Inel+7Hd5lBiFpkMAxACc0394//9C4voFHDiAAGLpuOXebdfdHfctgwJKaZRLRKy6ItrSis6RBnVBgGtbHyKTEmJHQoEXoBCE5BCrDeA2ogMUIGDAKEBDEhUqwgMqBYDjW4DQzmuffVdqff42/ZQYYqVcMXGZsMPyCsH3lyJSetxvEaxAQXdjR1HjfwCdIS7lo2DZke26Qe+MXO12OWkGT0O6oE7vMGkMnkYw4aN1KQgMKExhXqswfiov4+a7MQ11XPnbr/5qpKlgACAAQj94Lu271bN9DUecQasIZlNzG72llRAAKJiAi+/BSHrSFjRvQhg3DEKEqJh08tsmLTx597+f6enr4cc2Zpk57pihfX24dW7RHcOLLUbJYhJSl0ErQCI9BVXH/XrO97QasuvQQSiECa0BrQCIIJp6X9T/r8QG6L71WYSqCoIIGo2BZDUBnS/D9EA9Nun1iYvbM0MFExIDQRoKFatc1Z6zrm5uWeObJotq0BGV9FuQBWq5a4Fw3PPz848rZHstZSuA5FWAFSMP2nOppOOGpl6qh9PCSg0IFyHKjSQyDNQHTru2t75NOEe0fsf246oAmFkI6vCdnWvbQFQFCKx8vCswV8TrDLiDLgH4Nr7RAtNsrC9d8sfk7b8ls4igdNy8CQKAISlsB0FjZfd3Lfp155tf8fKI4BxZZIj/oTdVEAIAcJFOCmzauHG71I7/rdreUAgAqpDP05fDARCAQQARwEIBQSVxq0FyaLvZZtevpHa8WHw8cft6cpxlq8eAJtIhnSbWDf951yx3y13OqUuu5qyGgkxCgGFh9cDihDGbTa6BqvT1lWmrav3bmt2ZMJ4mU6TGgIC4DBzcv/JqAau1WhzSt3x9Ixk/4Jk/8J4ZrrViFMA4W6A7+WK8xcVjvyrOmVD0FbAXokcT48r+xVqLKvuJYbmpNadnlp3mpufJHOe/GXktM+r09bT8kEdq9BRYAbGSgzP7ll82U71Mc+ZFooXgwAAAABJRU5ErkJggg==" alt="" class="lh-product-info__icon" />
- <span class="lh-product-info__name">Lighthouse</span>&nbsp;
- <span class="lh-product-info__version"></span>
- </div>
-
- <div class="lh-toolbar__metadata">
- <a href="" class="lh-toolbar__url" target="_blank" rel="noopener"></a>
- <span class="lh-toggle-arrow" title="See report's runtime settings"></span>
- </div>
- </div>
-
- <div class="lh-export">
- <button class="report-icon report-icon--share lh-export__button" title="Export report"></button>
- <div class="lh-export__dropdown">
- <!-- TODO(i18n): localize export dropdown -->
- <a href="#" class="report-icon report-icon--print" data-action="print-summary">Print Summary</a>
- <a href="#" class="report-icon report-icon--print" data-action="print-expanded">Print Expanded</a>
- <a href="#" class="report-icon report-icon--copy" data-action="copy">Copy JSON</a>
- <a href="#" class="report-icon report-icon--download" data-action="save-html">Save as HTML</a>
- <a href="#" class="report-icon report-icon--download" data-action="save-json">Save as JSON</a>
- <a href="#" class="report-icon report-icon--open lh-export--viewer" data-action="open-viewer">Open in Viewer</a>
- <a href="#" class="report-icon report-icon--open lh-export--gist" data-action="save-gist">Save as Gist</a>
- </div>
- </div>
+ </div>
</template>
@@ -530,35 +494,50 @@ limitations under the License.
<template id="tmpl-lh-footer">
<style>
.lh-footer {
- background-color: var(--header-bg-color);
- border-top: 1px solid var(--report-secondary-border-color);
padding: var(--section-indent) calc(var(--default-padding) * 2);
+ max-width: var(--report-width);
+ margin: 0 auto;
}
.lh-footer .lh-generated {
text-align: center;
- border-top: 1px solid var(--report-border-color);
- padding-top: var(--default-padding);
+ }
+ .lh-env__title {
+ font-size: var(--score-title-font-size-big);
+ line-height: var(--score-title-line-height-big);
+ text-align: center;
+ padding: var(--score-container-padding);
}
.lh-env {
padding: var(--default-padding) 0;
}
.lh-env__items {
padding-left: 16px;
+ margin: 0 0 var(--audits-margin-bottom);
+ padding: 0;
+ }
+ .lh-env__items .lh-env__item:nth-child(2n) {
+ background: var(--env-item-bg);
+ }
+ .lh-env__item {
+ display: flex;
+ padding: var(--env-tem-padding);
+ position: relative;
}
span.lh-env__name {
font-weight: bold;
- color: var(--secondary-text-color);
+ min-width: var(--env-name-min-width);
+ flex: 0.5;
+ padding: 0 8px;
}
span.lh-env__description {
- font-family: var(--monospace-font-family);
- font-size: var(--caption-font-size);
- padding-left: 5px;
+ text-align: left;
+ flex: 1;
}
</style>
<footer class="lh-footer">
<!-- TODO(i18n): localize runtime settings -->
<div class="lh-env">
- <div class="lh-env__title">Runtime settings</div>
+ <div class="lh-env__title">Runtime Settings</div>
<ul class="lh-env__items">
<template id="tmpl-lh-env__items">
<li class="lh-env__item">
@@ -578,99 +557,16 @@ limitations under the License.
<!-- Lighthouse score gauge -->
<template id="tmpl-lh-gauge">
- <style>
- .lh-gauge__wrapper {
- --circle-size-half: calc(var(--circle-size) / 2);
- --circle-background: hsl(216, 12%, 92%);
- --circle-border-width: 9;
- --inset-size: calc(var(--circle-size) - 2 * var(--circle-border-width));
- --transition-length: 1s;
- }
-
- .lh-gauge__wrapper--pass,
- .lh-gauge__wrapper--pass .lh-gauge {
- --circle-color: var(--pass-color);
- color: var(--circle-color);
- }
-
- .lh-gauge__wrapper--average,
- .lh-gauge__wrapper--average .lh-gauge {
- --circle-color: var(--average-color);
- color: var(--circle-color);
- }
-
- .lh-gauge__wrapper--fail,
- .lh-gauge__wrapper--fail .lh-gauge {
- --circle-color: var(--fail-color);
- color: var(--circle-color);
- }
-
- .lh-gauge {
- max-width: 360px;
- max-height: 360px;
- stroke-linecap: round;
- width: var(--circle-size);
- height: var(--circle-size);
- }
-
- .lh-gauge-base {
- fill: none;
- stroke: var(--circle-background);
- stroke-width: var(--circle-border-width);
- }
- .lh-gauge-arc {
- fill: none;
- stroke: var(--circle-color);
- stroke-width: var(--circle-border-width);
- animation: load-gauge var(--transition-length) ease forwards;
- animation-delay: 250ms;
- }
-
- @keyframes load-gauge {
- from { stroke-dasharray: 0 329; }
- }
-
- .lh-gauge__percentage {
- --spacer: calc((var(--circle-size) - var(--inset-size)) / 2);
- width: 100%;
- height: var(--inset-size);
- position: absolute;
- border-radius: inherit;
- font-size: var(--header-font-size);
- line-height: var(--header-font-size);
- text-align: center;
- top: calc(var(--circle-size) / 3);
- }
-
- .lh-gauge__wrapper {
- display: inline-flex;
- align-items: center;
- flex-direction: column;
- text-decoration: none;
- flex: 1;
- min-width: auto;
- position: relative;
-
- /* Contain the layout style paint & layers during animation*/
- contain: content;
- will-change: opacity; /* Only using for layer promotion */
- }
-
- .lh-gauge__label {
- font-size: var(--body-font-size);
- line-height: var(--body-line-height);
- margin-top: calc(0.5 * var(--body-line-height));
- text-align: center;
- color: black;
- }
-
- </style>
<a href="#" class="lh-gauge__wrapper">
- <svg viewBox="0 0 120 120" class="lh-gauge" fill="none" stroke-width="2">
- <circle class="lh-gauge-base" r="53" cx="60" cy="60"></circle>
- <circle class="lh-gauge-arc" transform="rotate(-90 60 60)" stroke-dasharray="0 329" stroke-dashoffset="0" r="53" cx="60" cy="60"></circle>
- </svg>
+ <!-- Wrapper exists for the ::before plugin icon. Cannot create pseudo-elements on svgs. -->
+ <div class="lh-gauge__svg-wrapper">
+ <svg viewBox="0 0 120 120" class="lh-gauge">
+ <circle class="lh-gauge-base" r="56" cx="60" cy="60"></circle>
+ <circle class="lh-gauge-arc" transform="rotate(-90 60 60)" r="56" cx="60" cy="60"></circle>
+ </svg>
+ </div>
<div class="lh-gauge__percentage"></div>
+ <!-- TODO: should likely be an h2 -->
<div class="lh-gauge__label"></div>
</a>
</template>
@@ -679,19 +575,6 @@ limitations under the License.
<!-- Lighthouse PWA badge gauge -->
<template id="tmpl-lh-gauge--pwa">
<style>
- .lh-gauge--pwa__wrapper {
- display: inline-flex;
- align-items: center;
- flex-direction: column;
- text-decoration: none;
- flex: 1;
- min-width: auto;
- position: relative;
- }
- .lh-gauge--pwa {
- width: var(--circle-size);
- height: var(--circle-size);
- }
.lh-gauge--pwa .lh-gauge--pwa__component {
display: none;
}
@@ -700,12 +583,27 @@ limitations under the License.
fill: #B0B0B0;
}
+ .lh-gauge--pwa__disc {
+ fill: var(--color-black-200);
+ }
+
+ .lh-gauge--pwa__logo--primary-color {
+ fill: #304FFE;
+ }
+
+ .lh-gauge--pwa__logo--secondary-color {
+ fill: #3D3D3D;
+ }
+ .dark .lh-gauge--pwa__logo--secondary-color {
+ fill: #D8B6B6;
+ }
+
/* No passing groups. */
.lh-gauge--pwa__wrapper:not([class*='lh-badged--']) .lh-gauge--pwa__na-line {
display: inline;
}
/* Just optimized. Same n/a line as no passing groups. */
- .lh-gauge--pwa__wrapper.lh-badged--pwa-optimized .lh-gauge--pwa__na-line {
+ .lh-gauge--pwa__wrapper.lh-badged--pwa-optimized:not(.lh-badged--pwa-installable):not(.lh-badged--pwa-fast-reliable) .lh-gauge--pwa__na-line {
display: inline;
}
@@ -728,23 +626,11 @@ limitations under the License.
.lh-gauge--pwa__wrapper.lh-badged--all .lh-gauge--pwa__check-circle {
display: inline;
}
-
- .lh-gauge__label {
- font-size: var(--body-font-size);
- line-height: var(--body-line-height);
- margin-top: calc(0.5 * var(--body-line-height));
- text-align: center;
- color: black;
- }
</style>
- <a href="#" class="lh-gauge--pwa__wrapper">
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 60 60" class="lh-gauge--pwa">
+ <a href="#" class="lh-gauge__wrapper lh-gauge--pwa__wrapper">
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 60 60" class="lh-gauge lh-gauge--pwa">
<defs>
- <linearGradient id="lh-gauge--pwa__bg-disk__gradient" x1="50%" y1="2.15%" x2="50%" y2="97.645%">
- <stop stop-color="#F1F3F4" offset="0%"></stop>
- <stop stop-color="#DEE6EA" offset="100%"></stop>
- </linearGradient>
<linearGradient id="lh-gauge--pwa__check-circle__gradient" x1="50%" y1="0%" x2="50%" y2="100%">
<stop stop-color="#00C852" offset="0%"></stop>
<stop stop-color="#009688" offset="100%"></stop>
@@ -770,11 +656,11 @@ limitations under the License.
<g stroke="none" fill-rule="nonzero">
<!-- Background and PWA logo (color by default) -->
- <circle fill="url(#lh-gauge--pwa__bg-disk__gradient)" cx="30" cy="30" r="30"></circle>
+ <circle class="lh-gauge--pwa__disc" cx="30" cy="30" r="30"></circle>
<g class="lh-gauge--pwa__logo">
- <path fill="#3D3D3D" d="M35.66 19.39l.7-1.75h2L37.4 15 38.6 12l3.4 9h-2.51l-.58-1.61z"/>
- <path fill="#304FFE" d="M33.52 21l3.65-9h-2.42l-2.5 5.82L30.5 12h-1.86l-1.9 5.82-1.35-2.65-1.21 3.72L25.4 21h2.38l1.72-5.2 1.64 5.2z"/>
- <path fill="#3D3D3D" fill-rule="nonzero" d="M20.3 17.91h1.48c.45 0 .85-.05 1.2-.15l.39-1.18 1.07-3.3a2.64 2.64 0 0 0-.28-.37c-.55-.6-1.36-.91-2.42-.91H18v9h2.3V17.9zm1.96-3.84c.22.22.33.5.33.87 0 .36-.1.65-.29.87-.2.23-.59.35-1.15.35h-.86v-2.41h.87c.52 0 .89.1 1.1.32z"/>
+ <path class="lh-gauge--pwa__logo--secondary-color" d="M35.66 19.39l.7-1.75h2L37.4 15 38.6 12l3.4 9h-2.51l-.58-1.61z"/>
+ <path class="lh-gauge--pwa__logo--primary-color" d="M33.52 21l3.65-9h-2.42l-2.5 5.82L30.5 12h-1.86l-1.9 5.82-1.35-2.65-1.21 3.72L25.4 21h2.38l1.72-5.2 1.64 5.2z"/>
+ <path class="lh-gauge--pwa__logo--secondary-color" fill-rule="nonzero" d="M20.3 17.91h1.48c.45 0 .85-.05 1.2-.15l.39-1.18 1.07-3.3a2.64 2.64 0 0 0-.28-.37c-.55-.6-1.36-.91-2.42-.91H18v9h2.3V17.9zm1.96-3.84c.22.22.33.5.33.87 0 .36-.1.65-.29.87-.2.23-.59.35-1.15.35h-.86v-2.41h.87c.52 0 .89.1 1.1.32z"/>
</g>
<!-- No badges. -->
@@ -893,6 +779,27 @@ limitations under the License.
</div>
</template>
+<template id="tmpl-lh-3p-filter">
+ <style>
+ .lh-3p-filter {
+ background: var(--lh-table-higlight-bg);
+ color: var(--medium-75-gray);
+ float: right;
+ padding: 6px;
+ }
+ .lh-3p-filter-label, .lh-3p-filter-input {
+ cursor: pointer;
+ vertical-align: middle;
+ user-select: none;
+ }
+ </style>
+ <div class="lh-3p-filter">
+ <label class="lh-3p-filter-label">
+ <input type="checkbox" class="lh-3p-filter-input" checked />
+ <span class="lh-3p-ui-string">Show 3rd party resources</span> (<span class="lh-3p-filter-count"></span>)
+ </label>
+ </div>
+</template>
<!-- Lighthouse snippet component -->
<template id="tmpl-lh-snippet">
@@ -902,7 +809,7 @@ limitations under the License.
--snippet-highlight-light: #fbf1f2;
--snippet-highlight-dark: #ffd6d8;
}
-
+
.lh-snippet__header {
position: relative;
overflow: hidden;
@@ -953,7 +860,7 @@ limitations under the License.
background: white;
white-space: pre;
display: flex;
- }
+ }
.lh-snippet__line:not(.lh-snippet__line--message):first-child {
padding-top: 4px;
}
@@ -973,7 +880,7 @@ limitations under the License.
.lh-snippet__line--message code {
padding: 10px;
padding-left: 5px;
- color: var(--fail-color);
+ color: var(--color-fail);
font-family: var(--text-font-family);
}
.lh-snippet__line--message code {
@@ -991,8 +898,8 @@ limitations under the License.
display: inline-block;
vertical-align: middle;
margin-right: 4px;
- width: var(--lh-score-icon-width);
- height: var(--lh-score-icon-width);
+ width: var(--score-shape-size);
+ height: var(--score-shape-size);
background-image: var(--fail-icon-url);
}
.lh-snippet__line-number {
@@ -1027,7 +934,7 @@ limitations under the License.
<div class="lh-snippet__line-icon"></div>
<code></code>
</div>
- </template>
+ </template>
</div>
</template>
-
+
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/audits2_worker/lighthouse/lighthouse-dt-bundle.js b/chromium/third_party/blink/renderer/devtools/front_end/audits2_worker/lighthouse/lighthouse-dt-bundle.js
index 08e23b8d065..445954ab46d 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/audits2_worker/lighthouse/lighthouse-dt-bundle.js
+++ b/chromium/third_party/blink/renderer/devtools/front_end/audits2_worker/lighthouse/lighthouse-dt-bundle.js
@@ -1,4 +1,4 @@
-// lighthouse, browserified. 4.3.1 (5c48bb8eaff9a9a3709d6253d3cacdccf11a139a)
+// lighthouse, browserified. 5.1.0 (c10ea6e3bd0399174b3110a67c21be293e11baa7)
require=function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a;}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r);},p,p.exports,r,e,n,t);}return n[i].exports;}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o;}return r;}()({"../audits/accessibility/accesskeys":[function(require,module,exports){
(function(__filename){
@@ -48,7 +48,7 @@ module.exports=Accesskeys;
module.exports.UIStrings=UIStrings;
}).call(this,"/lighthouse-core/audits/accessibility/accesskeys.js");
-},{"../../lib/i18n/i18n.js":63,"./axe-audit.js":2}],"../audits/accessibility/aria-allowed-attr":[function(require,module,exports){
+},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/aria-allowed-attr":[function(require,module,exports){
(function(__filename){
@@ -62,7 +62,7 @@ module.exports.UIStrings=UIStrings;
-const AxeAudit=require('./axe-audit');
+const AxeAudit=require('./axe-audit.js');
const i18n=require('../../lib/i18n/i18n.js');
const UIStrings={
@@ -97,7 +97,7 @@ module.exports=ARIAAllowedAttr;
module.exports.UIStrings=UIStrings;
}).call(this,"/lighthouse-core/audits/accessibility/aria-allowed-attr.js");
-},{"../../lib/i18n/i18n.js":63,"./axe-audit":2}],"../audits/accessibility/aria-required-attr":[function(require,module,exports){
+},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/aria-required-attr":[function(require,module,exports){
(function(__filename){
@@ -111,7 +111,7 @@ module.exports.UIStrings=UIStrings;
-const AxeAudit=require('./axe-audit');
+const AxeAudit=require('./axe-audit.js');
const i18n=require('../../lib/i18n/i18n.js');
const UIStrings={
@@ -145,7 +145,7 @@ module.exports=ARIARequiredAttr;
module.exports.UIStrings=UIStrings;
}).call(this,"/lighthouse-core/audits/accessibility/aria-required-attr.js");
-},{"../../lib/i18n/i18n.js":63,"./axe-audit":2}],"../audits/accessibility/aria-required-children":[function(require,module,exports){
+},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/aria-required-children":[function(require,module,exports){
(function(__filename){
@@ -160,7 +160,7 @@ module.exports.UIStrings=UIStrings;
-const AxeAudit=require('./axe-audit');
+const AxeAudit=require('./axe-audit.js');
const i18n=require('../../lib/i18n/i18n.js');
const UIStrings={
@@ -196,7 +196,7 @@ module.exports=AriaRequiredChildren;
module.exports.UIStrings=UIStrings;
}).call(this,"/lighthouse-core/audits/accessibility/aria-required-children.js");
-},{"../../lib/i18n/i18n.js":63,"./axe-audit":2}],"../audits/accessibility/aria-required-parent":[function(require,module,exports){
+},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/aria-required-parent":[function(require,module,exports){
(function(__filename){
@@ -211,7 +211,7 @@ module.exports.UIStrings=UIStrings;
-const AxeAudit=require('./axe-audit');
+const AxeAudit=require('./axe-audit.js');
const i18n=require('../../lib/i18n/i18n.js');
const UIStrings={
@@ -246,7 +246,7 @@ module.exports=AriaRequiredParent;
module.exports.UIStrings=UIStrings;
}).call(this,"/lighthouse-core/audits/accessibility/aria-required-parent.js");
-},{"../../lib/i18n/i18n.js":63,"./axe-audit":2}],"../audits/accessibility/aria-roles":[function(require,module,exports){
+},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/aria-roles":[function(require,module,exports){
(function(__filename){
@@ -260,7 +260,7 @@ module.exports.UIStrings=UIStrings;
-const AxeAudit=require('./axe-audit');
+const AxeAudit=require('./axe-audit.js');
const i18n=require('../../lib/i18n/i18n.js');
const UIStrings={
@@ -295,7 +295,7 @@ module.exports=AriaRoles;
module.exports.UIStrings=UIStrings;
}).call(this,"/lighthouse-core/audits/accessibility/aria-roles.js");
-},{"../../lib/i18n/i18n.js":63,"./axe-audit":2}],"../audits/accessibility/aria-valid-attr-value":[function(require,module,exports){
+},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/aria-valid-attr-value":[function(require,module,exports){
(function(__filename){
@@ -309,7 +309,7 @@ module.exports.UIStrings=UIStrings;
-const AxeAudit=require('./axe-audit');
+const AxeAudit=require('./axe-audit.js');
const i18n=require('../../lib/i18n/i18n.js');
const UIStrings={
@@ -344,7 +344,7 @@ module.exports=ARIAValidAttr;
module.exports.UIStrings=UIStrings;
}).call(this,"/lighthouse-core/audits/accessibility/aria-valid-attr-value.js");
-},{"../../lib/i18n/i18n.js":63,"./axe-audit":2}],"../audits/accessibility/aria-valid-attr":[function(require,module,exports){
+},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/aria-valid-attr":[function(require,module,exports){
(function(__filename){
@@ -358,7 +358,7 @@ module.exports.UIStrings=UIStrings;
-const AxeAudit=require('./axe-audit');
+const AxeAudit=require('./axe-audit.js');
const i18n=require('../../lib/i18n/i18n.js');
const UIStrings={
@@ -393,7 +393,7 @@ module.exports=ARIAValidAttr;
module.exports.UIStrings=UIStrings;
}).call(this,"/lighthouse-core/audits/accessibility/aria-valid-attr.js");
-},{"../../lib/i18n/i18n.js":63,"./axe-audit":2}],"../audits/accessibility/audio-caption":[function(require,module,exports){
+},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/audio-caption":[function(require,module,exports){
(function(__filename){
@@ -407,7 +407,7 @@ module.exports.UIStrings=UIStrings;
-const AxeAudit=require('./axe-audit');
+const AxeAudit=require('./axe-audit.js');
const i18n=require('../../lib/i18n/i18n.js');
const UIStrings={
@@ -444,7 +444,7 @@ module.exports=AudioCaption;
module.exports.UIStrings=UIStrings;
}).call(this,"/lighthouse-core/audits/accessibility/audio-caption.js");
-},{"../../lib/i18n/i18n.js":63,"./axe-audit":2}],"../audits/accessibility/button-name":[function(require,module,exports){
+},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/button-name":[function(require,module,exports){
(function(__filename){
@@ -458,7 +458,7 @@ module.exports.UIStrings=UIStrings;
-const AxeAudit=require('./axe-audit');
+const AxeAudit=require('./axe-audit.js');
const i18n=require('../../lib/i18n/i18n.js');
const UIStrings={
@@ -493,7 +493,7 @@ module.exports=ButtonName;
module.exports.UIStrings=UIStrings;
}).call(this,"/lighthouse-core/audits/accessibility/button-name.js");
-},{"../../lib/i18n/i18n.js":63,"./axe-audit":2}],"../audits/accessibility/bypass":[function(require,module,exports){
+},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/bypass":[function(require,module,exports){
(function(__filename){
@@ -508,7 +508,7 @@ module.exports.UIStrings=UIStrings;
-const AxeAudit=require('./axe-audit');
+const AxeAudit=require('./axe-audit.js');
const i18n=require('../../lib/i18n/i18n.js');
const UIStrings={
@@ -543,7 +543,7 @@ module.exports=Bypass;
module.exports.UIStrings=UIStrings;
}).call(this,"/lighthouse-core/audits/accessibility/bypass.js");
-},{"../../lib/i18n/i18n.js":63,"./axe-audit":2}],"../audits/accessibility/color-contrast":[function(require,module,exports){
+},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/color-contrast":[function(require,module,exports){
(function(__filename){
@@ -558,7 +558,7 @@ module.exports.UIStrings=UIStrings;
-const AxeAudit=require('./axe-audit');
+const AxeAudit=require('./axe-audit.js');
const i18n=require('../../lib/i18n/i18n.js');
const UIStrings={
@@ -593,7 +593,7 @@ module.exports=ColorContrast;
module.exports.UIStrings=UIStrings;
}).call(this,"/lighthouse-core/audits/accessibility/color-contrast.js");
-},{"../../lib/i18n/i18n.js":63,"./axe-audit":2}],"../audits/accessibility/definition-list":[function(require,module,exports){
+},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/definition-list":[function(require,module,exports){
(function(__filename){
@@ -607,7 +607,7 @@ module.exports.UIStrings=UIStrings;
-const AxeAudit=require('./axe-audit');
+const AxeAudit=require('./axe-audit.js');
const i18n=require('../../lib/i18n/i18n.js');
const UIStrings={
@@ -644,7 +644,7 @@ module.exports=DefinitionList;
module.exports.UIStrings=UIStrings;
}).call(this,"/lighthouse-core/audits/accessibility/definition-list.js");
-},{"../../lib/i18n/i18n.js":63,"./axe-audit":2}],"../audits/accessibility/dlitem":[function(require,module,exports){
+},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/dlitem":[function(require,module,exports){
(function(__filename){
@@ -658,7 +658,7 @@ module.exports.UIStrings=UIStrings;
-const AxeAudit=require('./axe-audit');
+const AxeAudit=require('./axe-audit.js');
const i18n=require('../../lib/i18n/i18n.js');
const UIStrings={
@@ -693,7 +693,7 @@ module.exports=DLItem;
module.exports.UIStrings=UIStrings;
}).call(this,"/lighthouse-core/audits/accessibility/dlitem.js");
-},{"../../lib/i18n/i18n.js":63,"./axe-audit":2}],"../audits/accessibility/document-title":[function(require,module,exports){
+},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/document-title":[function(require,module,exports){
(function(__filename){
@@ -707,7 +707,7 @@ module.exports.UIStrings=UIStrings;
-const AxeAudit=require('./axe-audit');
+const AxeAudit=require('./axe-audit.js');
const i18n=require('../../lib/i18n/i18n.js');
const UIStrings={
@@ -742,7 +742,7 @@ module.exports=DocumentTitle;
module.exports.UIStrings=UIStrings;
}).call(this,"/lighthouse-core/audits/accessibility/document-title.js");
-},{"../../lib/i18n/i18n.js":63,"./axe-audit":2}],"../audits/accessibility/duplicate-id":[function(require,module,exports){
+},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/duplicate-id":[function(require,module,exports){
(function(__filename){
@@ -756,7 +756,7 @@ module.exports.UIStrings=UIStrings;
-const AxeAudit=require('./axe-audit');
+const AxeAudit=require('./axe-audit.js');
const i18n=require('../../lib/i18n/i18n.js');
const UIStrings={
@@ -791,7 +791,7 @@ module.exports=DuplicateId;
module.exports.UIStrings=UIStrings;
}).call(this,"/lighthouse-core/audits/accessibility/duplicate-id.js");
-},{"../../lib/i18n/i18n.js":63,"./axe-audit":2}],"../audits/accessibility/frame-title":[function(require,module,exports){
+},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/frame-title":[function(require,module,exports){
(function(__filename){
@@ -805,7 +805,7 @@ module.exports.UIStrings=UIStrings;
-const AxeAudit=require('./axe-audit');
+const AxeAudit=require('./axe-audit.js');
const i18n=require('../../lib/i18n/i18n.js');
const UIStrings={
@@ -839,7 +839,7 @@ module.exports=FrameTitle;
module.exports.UIStrings=UIStrings;
}).call(this,"/lighthouse-core/audits/accessibility/frame-title.js");
-},{"../../lib/i18n/i18n.js":63,"./axe-audit":2}],"../audits/accessibility/html-has-lang":[function(require,module,exports){
+},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/html-has-lang":[function(require,module,exports){
(function(__filename){
@@ -853,7 +853,7 @@ module.exports.UIStrings=UIStrings;
-const AxeAudit=require('./axe-audit');
+const AxeAudit=require('./axe-audit.js');
const i18n=require('../../lib/i18n/i18n.js');
const UIStrings={
@@ -890,7 +890,7 @@ module.exports=HTMLHasLang;
module.exports.UIStrings=UIStrings;
}).call(this,"/lighthouse-core/audits/accessibility/html-has-lang.js");
-},{"../../lib/i18n/i18n.js":63,"./axe-audit":2}],"../audits/accessibility/html-lang-valid":[function(require,module,exports){
+},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/html-lang-valid":[function(require,module,exports){
(function(__filename){
@@ -904,7 +904,7 @@ module.exports.UIStrings=UIStrings;
-const AxeAudit=require('./axe-audit');
+const AxeAudit=require('./axe-audit.js');
const i18n=require('../../lib/i18n/i18n.js');
const UIStrings={
@@ -940,7 +940,7 @@ module.exports=HTMLLangValid;
module.exports.UIStrings=UIStrings;
}).call(this,"/lighthouse-core/audits/accessibility/html-lang-valid.js");
-},{"../../lib/i18n/i18n.js":63,"./axe-audit":2}],"../audits/accessibility/image-alt":[function(require,module,exports){
+},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/image-alt":[function(require,module,exports){
(function(__filename){
@@ -954,7 +954,7 @@ module.exports.UIStrings=UIStrings;
-const AxeAudit=require('./axe-audit');
+const AxeAudit=require('./axe-audit.js');
const i18n=require('../../lib/i18n/i18n.js');
const UIStrings={
@@ -989,7 +989,7 @@ module.exports=ImageAlt;
module.exports.UIStrings=UIStrings;
}).call(this,"/lighthouse-core/audits/accessibility/image-alt.js");
-},{"../../lib/i18n/i18n.js":63,"./axe-audit":2}],"../audits/accessibility/input-image-alt":[function(require,module,exports){
+},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/input-image-alt":[function(require,module,exports){
(function(__filename){
@@ -1003,7 +1003,7 @@ module.exports.UIStrings=UIStrings;
-const AxeAudit=require('./axe-audit');
+const AxeAudit=require('./axe-audit.js');
const i18n=require('../../lib/i18n/i18n.js');
const UIStrings={
@@ -1038,7 +1038,7 @@ module.exports=InputImageAlt;
module.exports.UIStrings=UIStrings;
}).call(this,"/lighthouse-core/audits/accessibility/input-image-alt.js");
-},{"../../lib/i18n/i18n.js":63,"./axe-audit":2}],"../audits/accessibility/label":[function(require,module,exports){
+},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/label":[function(require,module,exports){
(function(__filename){
@@ -1052,7 +1052,7 @@ module.exports.UIStrings=UIStrings;
-const AxeAudit=require('./axe-audit');
+const AxeAudit=require('./axe-audit.js');
const i18n=require('../../lib/i18n/i18n.js');
const UIStrings={
@@ -1087,7 +1087,7 @@ module.exports=Label;
module.exports.UIStrings=UIStrings;
}).call(this,"/lighthouse-core/audits/accessibility/label.js");
-},{"../../lib/i18n/i18n.js":63,"./axe-audit":2}],"../audits/accessibility/layout-table":[function(require,module,exports){
+},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/layout-table":[function(require,module,exports){
(function(__filename){
@@ -1102,7 +1102,7 @@ module.exports.UIStrings=UIStrings;
-const AxeAudit=require('./axe-audit');
+const AxeAudit=require('./axe-audit.js');
const i18n=require('../../lib/i18n/i18n.js');
const UIStrings={
@@ -1140,7 +1140,7 @@ module.exports=LayoutTable;
module.exports.UIStrings=UIStrings;
}).call(this,"/lighthouse-core/audits/accessibility/layout-table.js");
-},{"../../lib/i18n/i18n.js":63,"./axe-audit":2}],"../audits/accessibility/link-name":[function(require,module,exports){
+},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/link-name":[function(require,module,exports){
(function(__filename){
@@ -1154,7 +1154,7 @@ module.exports.UIStrings=UIStrings;
-const AxeAudit=require('./axe-audit');
+const AxeAudit=require('./axe-audit.js');
const i18n=require('../../lib/i18n/i18n.js');
const UIStrings={
@@ -1190,7 +1190,7 @@ module.exports=LinkName;
module.exports.UIStrings=UIStrings;
}).call(this,"/lighthouse-core/audits/accessibility/link-name.js");
-},{"../../lib/i18n/i18n.js":63,"./axe-audit":2}],"../audits/accessibility/listitem":[function(require,module,exports){
+},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/listitem":[function(require,module,exports){
(function(__filename){
@@ -1204,7 +1204,7 @@ module.exports.UIStrings=UIStrings;
-const AxeAudit=require('./axe-audit');
+const AxeAudit=require('./axe-audit.js');
const i18n=require('../../lib/i18n/i18n.js');
const UIStrings={
@@ -1240,7 +1240,7 @@ module.exports=ListItem;
module.exports.UIStrings=UIStrings;
}).call(this,"/lighthouse-core/audits/accessibility/listitem.js");
-},{"../../lib/i18n/i18n.js":63,"./axe-audit":2}],"../audits/accessibility/list":[function(require,module,exports){
+},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/list":[function(require,module,exports){
(function(__filename){
@@ -1254,7 +1254,7 @@ module.exports.UIStrings=UIStrings;
-const AxeAudit=require('./axe-audit');
+const AxeAudit=require('./axe-audit.js');
const i18n=require('../../lib/i18n/i18n.js');
const UIStrings={
@@ -1291,7 +1291,7 @@ module.exports=List;
module.exports.UIStrings=UIStrings;
}).call(this,"/lighthouse-core/audits/accessibility/list.js");
-},{"../../lib/i18n/i18n.js":63,"./axe-audit":2}],"../audits/accessibility/manual/custom-controls-labels":[function(require,module,exports){
+},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/manual/custom-controls-labels":[function(require,module,exports){
@@ -1300,7 +1300,7 @@ module.exports.UIStrings=UIStrings;
'use strict';
-const ManualAudit=require('../../manual/manual-audit');
+const ManualAudit=require('../../manual/manual-audit.js');
@@ -1321,7 +1321,7 @@ super.partialMeta);
module.exports=CustomControlsLabels;
-},{"../../manual/manual-audit":5}],"../audits/accessibility/manual/custom-controls-roles":[function(require,module,exports){
+},{"../../manual/manual-audit.js":5}],"../audits/accessibility/manual/custom-controls-roles":[function(require,module,exports){
@@ -1330,7 +1330,7 @@ module.exports=CustomControlsLabels;
'use strict';
-const ManualAudit=require('../../manual/manual-audit');
+const ManualAudit=require('../../manual/manual-audit.js');
@@ -1351,7 +1351,7 @@ super.partialMeta);
module.exports=CustomControlsRoles;
-},{"../../manual/manual-audit":5}],"../audits/accessibility/manual/focus-traps":[function(require,module,exports){
+},{"../../manual/manual-audit.js":5}],"../audits/accessibility/manual/focus-traps":[function(require,module,exports){
@@ -1360,7 +1360,7 @@ module.exports=CustomControlsRoles;
'use strict';
-const ManualAudit=require('../../manual/manual-audit');
+const ManualAudit=require('../../manual/manual-audit.js');
@@ -1381,7 +1381,7 @@ super.partialMeta);
module.exports=FocusTraps;
-},{"../../manual/manual-audit":5}],"../audits/accessibility/manual/focusable-controls":[function(require,module,exports){
+},{"../../manual/manual-audit.js":5}],"../audits/accessibility/manual/focusable-controls":[function(require,module,exports){
@@ -1390,7 +1390,7 @@ module.exports=FocusTraps;
'use strict';
-const ManualAudit=require('../../manual/manual-audit');
+const ManualAudit=require('../../manual/manual-audit.js');
@@ -1411,7 +1411,7 @@ super.partialMeta);
module.exports=FocusableControls;
-},{"../../manual/manual-audit":5}],"../audits/accessibility/manual/heading-levels":[function(require,module,exports){
+},{"../../manual/manual-audit.js":5}],"../audits/accessibility/manual/heading-levels":[function(require,module,exports){
@@ -1420,7 +1420,7 @@ module.exports=FocusableControls;
'use strict';
-const ManualAudit=require('../../manual/manual-audit');
+const ManualAudit=require('../../manual/manual-audit.js');
@@ -1441,7 +1441,7 @@ super.partialMeta);
module.exports=HeadingLevels;
-},{"../../manual/manual-audit":5}],"../audits/accessibility/manual/interactive-element-affordance":[function(require,module,exports){
+},{"../../manual/manual-audit.js":5}],"../audits/accessibility/manual/interactive-element-affordance":[function(require,module,exports){
@@ -1450,7 +1450,7 @@ module.exports=HeadingLevels;
'use strict';
-const ManualAudit=require('../../manual/manual-audit');
+const ManualAudit=require('../../manual/manual-audit.js');
@@ -1471,7 +1471,7 @@ super.partialMeta);
module.exports=InteractiveElementAffordance;
-},{"../../manual/manual-audit":5}],"../audits/accessibility/manual/logical-tab-order":[function(require,module,exports){
+},{"../../manual/manual-audit.js":5}],"../audits/accessibility/manual/logical-tab-order":[function(require,module,exports){
@@ -1480,7 +1480,7 @@ module.exports=InteractiveElementAffordance;
'use strict';
-const ManualAudit=require('../../manual/manual-audit');
+const ManualAudit=require('../../manual/manual-audit.js');
@@ -1501,7 +1501,7 @@ super.partialMeta);
module.exports=LogicalTabOrder;
-},{"../../manual/manual-audit":5}],"../audits/accessibility/manual/managed-focus":[function(require,module,exports){
+},{"../../manual/manual-audit.js":5}],"../audits/accessibility/manual/managed-focus":[function(require,module,exports){
@@ -1510,7 +1510,7 @@ module.exports=LogicalTabOrder;
'use strict';
-const ManualAudit=require('../../manual/manual-audit');
+const ManualAudit=require('../../manual/manual-audit.js');
@@ -1531,7 +1531,7 @@ super.partialMeta);
module.exports=ManagedFocus;
-},{"../../manual/manual-audit":5}],"../audits/accessibility/manual/offscreen-content-hidden":[function(require,module,exports){
+},{"../../manual/manual-audit.js":5}],"../audits/accessibility/manual/offscreen-content-hidden":[function(require,module,exports){
@@ -1540,7 +1540,7 @@ module.exports=ManagedFocus;
'use strict';
-const ManualAudit=require('../../manual/manual-audit');
+const ManualAudit=require('../../manual/manual-audit.js');
@@ -1562,7 +1562,7 @@ super.partialMeta);
module.exports=OffscreenContentHidden;
-},{"../../manual/manual-audit":5}],"../audits/accessibility/manual/use-landmarks":[function(require,module,exports){
+},{"../../manual/manual-audit.js":5}],"../audits/accessibility/manual/use-landmarks":[function(require,module,exports){
@@ -1571,7 +1571,7 @@ module.exports=OffscreenContentHidden;
'use strict';
-const ManualAudit=require('../../manual/manual-audit');
+const ManualAudit=require('../../manual/manual-audit.js');
@@ -1592,7 +1592,7 @@ super.partialMeta);
module.exports=UseLandmarks;
-},{"../../manual/manual-audit":5}],"../audits/accessibility/manual/visual-order-follows-dom":[function(require,module,exports){
+},{"../../manual/manual-audit.js":5}],"../audits/accessibility/manual/visual-order-follows-dom":[function(require,module,exports){
@@ -1601,7 +1601,7 @@ module.exports=UseLandmarks;
'use strict';
-const ManualAudit=require('../../manual/manual-audit');
+const ManualAudit=require('../../manual/manual-audit.js');
@@ -1622,7 +1622,7 @@ super.partialMeta);
module.exports=VisualOrderFollowsDOM;
-},{"../../manual/manual-audit":5}],"../audits/accessibility/meta-refresh":[function(require,module,exports){
+},{"../../manual/manual-audit.js":5}],"../audits/accessibility/meta-refresh":[function(require,module,exports){
(function(__filename){
@@ -1636,7 +1636,7 @@ module.exports=VisualOrderFollowsDOM;
-const AxeAudit=require('./axe-audit');
+const AxeAudit=require('./axe-audit.js');
const i18n=require('../../lib/i18n/i18n.js');
const UIStrings={
@@ -1672,7 +1672,7 @@ module.exports=MetaRefresh;
module.exports.UIStrings=UIStrings;
}).call(this,"/lighthouse-core/audits/accessibility/meta-refresh.js");
-},{"../../lib/i18n/i18n.js":63,"./axe-audit":2}],"../audits/accessibility/meta-viewport":[function(require,module,exports){
+},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/meta-viewport":[function(require,module,exports){
(function(__filename){
@@ -1686,7 +1686,7 @@ module.exports.UIStrings=UIStrings;
-const AxeAudit=require('./axe-audit');
+const AxeAudit=require('./axe-audit.js');
const i18n=require('../../lib/i18n/i18n.js');
const UIStrings={
@@ -1723,7 +1723,7 @@ module.exports=MetaViewport;
module.exports.UIStrings=UIStrings;
}).call(this,"/lighthouse-core/audits/accessibility/meta-viewport.js");
-},{"../../lib/i18n/i18n.js":63,"./axe-audit":2}],"../audits/accessibility/object-alt":[function(require,module,exports){
+},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/object-alt":[function(require,module,exports){
(function(__filename){
@@ -1737,7 +1737,7 @@ module.exports.UIStrings=UIStrings;
-const AxeAudit=require('./axe-audit');
+const AxeAudit=require('./axe-audit.js');
const i18n=require('../../lib/i18n/i18n.js');
const UIStrings={
@@ -1772,7 +1772,7 @@ module.exports=ObjectAlt;
module.exports.UIStrings=UIStrings;
}).call(this,"/lighthouse-core/audits/accessibility/object-alt.js");
-},{"../../lib/i18n/i18n.js":63,"./axe-audit":2}],"../audits/accessibility/tabindex":[function(require,module,exports){
+},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/tabindex":[function(require,module,exports){
(function(__filename){
@@ -1786,7 +1786,7 @@ module.exports.UIStrings=UIStrings;
-const AxeAudit=require('./axe-audit');
+const AxeAudit=require('./axe-audit.js');
const i18n=require('../../lib/i18n/i18n.js');
const UIStrings={
@@ -1821,7 +1821,7 @@ module.exports=TabIndex;
module.exports.UIStrings=UIStrings;
}).call(this,"/lighthouse-core/audits/accessibility/tabindex.js");
-},{"../../lib/i18n/i18n.js":63,"./axe-audit":2}],"../audits/accessibility/td-headers-attr":[function(require,module,exports){
+},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/td-headers-attr":[function(require,module,exports){
(function(__filename){
@@ -1836,7 +1836,7 @@ module.exports.UIStrings=UIStrings;
-const AxeAudit=require('./axe-audit');
+const AxeAudit=require('./axe-audit.js');
const i18n=require('../../lib/i18n/i18n.js');
const UIStrings={
@@ -1874,7 +1874,7 @@ module.exports=TDHeadersAttr;
module.exports.UIStrings=UIStrings;
}).call(this,"/lighthouse-core/audits/accessibility/td-headers-attr.js");
-},{"../../lib/i18n/i18n.js":63,"./axe-audit":2}],"../audits/accessibility/th-has-data-cells":[function(require,module,exports){
+},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/th-has-data-cells":[function(require,module,exports){
(function(__filename){
@@ -1888,7 +1888,7 @@ module.exports.UIStrings=UIStrings;
-const AxeAudit=require('./axe-audit');
+const AxeAudit=require('./axe-audit.js');
const i18n=require('../../lib/i18n/i18n.js');
const UIStrings={
@@ -1926,7 +1926,7 @@ module.exports=THHasDataCells;
module.exports.UIStrings=UIStrings;
}).call(this,"/lighthouse-core/audits/accessibility/th-has-data-cells.js");
-},{"../../lib/i18n/i18n.js":63,"./axe-audit":2}],"../audits/accessibility/valid-lang":[function(require,module,exports){
+},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/valid-lang":[function(require,module,exports){
(function(__filename){
@@ -1940,7 +1940,7 @@ module.exports.UIStrings=UIStrings;
-const AxeAudit=require('./axe-audit');
+const AxeAudit=require('./axe-audit.js');
const i18n=require('../../lib/i18n/i18n.js');
const UIStrings={
@@ -1975,7 +1975,7 @@ module.exports=ValidLang;
module.exports.UIStrings=UIStrings;
}).call(this,"/lighthouse-core/audits/accessibility/valid-lang.js");
-},{"../../lib/i18n/i18n.js":63,"./axe-audit":2}],"../audits/accessibility/video-caption":[function(require,module,exports){
+},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/video-caption":[function(require,module,exports){
(function(__filename){
@@ -1989,7 +1989,7 @@ module.exports.UIStrings=UIStrings;
-const AxeAudit=require('./axe-audit');
+const AxeAudit=require('./axe-audit.js');
const i18n=require('../../lib/i18n/i18n.js');
const UIStrings={
@@ -2025,7 +2025,7 @@ module.exports=VideoCaption;
module.exports.UIStrings=UIStrings;
}).call(this,"/lighthouse-core/audits/accessibility/video-caption.js");
-},{"../../lib/i18n/i18n.js":63,"./axe-audit":2}],"../audits/accessibility/video-description":[function(require,module,exports){
+},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/video-description":[function(require,module,exports){
(function(__filename){
@@ -2039,7 +2039,7 @@ module.exports.UIStrings=UIStrings;
-const AxeAudit=require('./axe-audit');
+const AxeAudit=require('./axe-audit.js');
const i18n=require('../../lib/i18n/i18n.js');
const UIStrings={
@@ -2075,7 +2075,82 @@ module.exports=VideoDescription;
module.exports.UIStrings=UIStrings;
}).call(this,"/lighthouse-core/audits/accessibility/video-description.js");
-},{"../../lib/i18n/i18n.js":63,"./axe-audit":2}],"../audits/bootup-time":[function(require,module,exports){
+},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/apple-touch-icon":[function(require,module,exports){
+(function(__filename){
+
+
+
+
+
+'use strict';
+
+const Audit=require('./audit.js');
+const i18n=require('../lib/i18n/i18n.js');
+
+
+
+
+
+const UIStrings={
+
+title:'Provides a valid `apple-touch-icon`',
+
+failureTitle:'Does not provide a valid `apple-touch-icon`',
+
+description:'For ideal appearance on iOS when users add to the home screen, define an '+
+'apple-touch-icon. It must point to a non-transparent 192px (or 180px) square PNG. '+
+'[Learn More](https://developers.google.com/web/fundamentals/design-and-ux/browser-customization/).',
+
+precomposedWarning:'`apple-touch-icon-precomposed` is out of date; '+
+'`apple-touch-icon` is preferred.'};
+
+
+const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+
+class AppleTouchIcon extends Audit{
+
+
+
+static get meta(){
+return{
+id:'apple-touch-icon',
+title:str_(UIStrings.title),
+failureTitle:str_(UIStrings.failureTitle),
+description:str_(UIStrings.description),
+requiredArtifacts:['LinkElements']};
+
+}
+
+
+
+
+
+static audit(artifacts){
+const appleTouchIcons=artifacts.LinkElements.
+filter(el=>el.rel==='apple-touch-icon'||el.rel==='apple-touch-icon-precomposed').
+filter(el=>!!el.href);
+
+
+const passed=appleTouchIcons.length!==0;
+
+const warnings=[];
+if(appleTouchIcons.filter(el=>el.rel==='apple-touch-icon-precomposed').length!==0&&
+appleTouchIcons.filter(el=>el.rel==='apple-touch-icon').length===0){
+warnings.push(str_(UIStrings.precomposedWarning));
+}
+
+return{
+score:passed?1:0,
+warnings};
+
+}}
+
+
+module.exports=AppleTouchIcon;
+module.exports.UIStrings=UIStrings;
+
+}).call(this,"/lighthouse-core/audits/apple-touch-icon.js");
+},{"../lib/i18n/i18n.js":66,"./audit.js":3}],"../audits/bootup-time":[function(require,module,exports){
(function(__filename){
@@ -2084,9 +2159,9 @@ module.exports.UIStrings=UIStrings;
'use strict';
-const Audit=require('./audit');
-const NetworkRequest=require('../lib/network-request');
-const{taskGroups}=require('../lib/task-groups');
+const Audit=require('./audit.js');
+const NetworkRequest=require('../lib/network-request.js');
+const{taskGroups}=require('../lib/task-groups.js');
const i18n=require('../lib/i18n/i18n.js');
const NetworkRecords=require('../computed/network-records.js');
const MainThreadTasks=require('../computed/main-thread-tasks.js');
@@ -2124,7 +2199,7 @@ title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
scoreDisplayMode:Audit.SCORING_MODES.NUMERIC,
-requiredArtifacts:['traces']};
+requiredArtifacts:['traces','devtoolsLogs']};
}
@@ -2258,7 +2333,7 @@ context.options.scoreMedian);
return{
score,
-rawValue:totalBootupTime,
+numericValue:totalBootupTime,
displayValue:totalBootupTime>0?
str_(i18n.UIStrings.seconds,{timeInMs:totalBootupTime}):'',
details};
@@ -2270,7 +2345,7 @@ module.exports=BootupTime;
module.exports.UIStrings=UIStrings;
}).call(this,"/lighthouse-core/audits/bootup-time.js");
-},{"../computed/main-thread-tasks.js":12,"../computed/network-records.js":31,"../lib/i18n/i18n.js":63,"../lib/network-request":71,"../lib/task-groups":77,"./audit":3}],"../audits/byte-efficiency/efficient-animated-content":[function(require,module,exports){
+},{"../computed/main-thread-tasks.js":12,"../computed/network-records.js":31,"../lib/i18n/i18n.js":66,"../lib/network-request.js":74,"../lib/task-groups.js":82,"./audit.js":3}],"../audits/byte-efficiency/efficient-animated-content":[function(require,module,exports){
(function(__filename){
@@ -2282,8 +2357,8 @@ module.exports.UIStrings=UIStrings;
'use strict';
-const NetworkRequest=require('../../lib/network-request');
-const ByteEfficiencyAudit=require('./byte-efficiency-audit');
+const NetworkRequest=require('../../lib/network-request.js');
+const ByteEfficiencyAudit=require('./byte-efficiency-audit.js');
const i18n=require('../../lib/i18n/i18n.js');
const UIStrings={
@@ -2366,7 +2441,7 @@ module.exports=EfficientAnimatedContent;
module.exports.UIStrings=UIStrings;
}).call(this,"/lighthouse-core/audits/byte-efficiency/efficient-animated-content.js");
-},{"../../lib/i18n/i18n.js":63,"../../lib/network-request":71,"./byte-efficiency-audit":4}],"../audits/byte-efficiency/offscreen-images":[function(require,module,exports){
+},{"../../lib/i18n/i18n.js":66,"../../lib/network-request.js":74,"./byte-efficiency-audit.js":4}],"../audits/byte-efficiency/offscreen-images":[function(require,module,exports){
(function(__filename){
@@ -2379,9 +2454,9 @@ module.exports.UIStrings=UIStrings;
'use strict';
-const ByteEfficiencyAudit=require('./byte-efficiency-audit');
-const Sentry=require('../../lib/sentry');
-const URL=require('../../lib/url-shim');
+const ByteEfficiencyAudit=require('./byte-efficiency-audit.js');
+const Sentry=require('../../lib/sentry.js');
+const URL=require('../../lib/url-shim.js');
const i18n=require('../../lib/i18n/i18n.js');
const Interactive=require('../../computed/metrics/interactive.js');
const TraceOfTab=require('../../computed/trace-of-tab.js');
@@ -2613,7 +2688,7 @@ module.exports=OffscreenImages;
module.exports.UIStrings=UIStrings;
}).call(this,"/lighthouse-core/audits/byte-efficiency/offscreen-images.js");
-},{"../../computed/metrics/interactive.js":18,"../../computed/trace-of-tab.js":35,"../../lib/i18n/i18n.js":63,"../../lib/sentry":74,"../../lib/url-shim":"url","./byte-efficiency-audit":4}],"../audits/byte-efficiency/render-blocking-resources":[function(require,module,exports){
+},{"../../computed/metrics/interactive.js":18,"../../computed/trace-of-tab.js":36,"../../lib/i18n/i18n.js":66,"../../lib/sentry.js":77,"../../lib/url-shim.js":"url","./byte-efficiency-audit.js":4}],"../audits/byte-efficiency/render-blocking-resources":[function(require,module,exports){
(function(__filename){
@@ -2626,12 +2701,12 @@ module.exports.UIStrings=UIStrings;
'use strict';
-const Audit=require('../audit');
+const Audit=require('../audit.js');
const i18n=require('../../lib/i18n/i18n.js');
-const BaseNode=require('../../lib/dependency-graph/base-node');
-const ByteEfficiencyAudit=require('./byte-efficiency-audit');
-const UnusedCSS=require('./unused-css-rules');
-const NetworkRequest=require('../../lib/network-request');
+const BaseNode=require('../../lib/dependency-graph/base-node.js');
+const ByteEfficiencyAudit=require('./byte-efficiency-audit.js');
+const UnusedCSS=require('./unused-css-rules.js');
+const NetworkRequest=require('../../lib/network-request.js');
const TraceOfTab=require('../../computed/trace-of-tab.js');
const LoadSimulator=require('../../computed/load-simulator.js');
const FirstContentfulPaint=require('../../computed/metrics/first-contentful-paint.js');
@@ -2689,8 +2764,7 @@ scoreDisplayMode:Audit.SCORING_MODES.NUMERIC,
description:str_(UIStrings.description),
-
-requiredArtifacts:['URL','TagsBlockingFirstPaint','traces']};
+requiredArtifacts:['URL','TagsBlockingFirstPaint','traces','devtoolsLogs','CSSUsage']};
}
@@ -2841,7 +2915,7 @@ const details=Audit.makeOpportunityDetails(headings,results,wastedMs);
return{
displayValue,
score:ByteEfficiencyAudit.scoreForWastedMs(wastedMs),
-rawValue:wastedMs,
+numericValue:wastedMs,
details};
}}
@@ -2851,7 +2925,7 @@ module.exports=RenderBlockingResources;
module.exports.UIStrings=UIStrings;
}).call(this,"/lighthouse-core/audits/byte-efficiency/render-blocking-resources.js");
-},{"../../computed/load-simulator.js":10,"../../computed/metrics/first-contentful-paint.js":15,"../../computed/trace-of-tab.js":35,"../../lib/dependency-graph/base-node":52,"../../lib/i18n/i18n.js":63,"../../lib/network-request":71,"../audit":3,"./byte-efficiency-audit":4,"./unused-css-rules":"../audits/byte-efficiency/unused-css-rules"}],"../audits/byte-efficiency/total-byte-weight":[function(require,module,exports){
+},{"../../computed/load-simulator.js":10,"../../computed/metrics/first-contentful-paint.js":15,"../../computed/trace-of-tab.js":36,"../../lib/dependency-graph/base-node.js":55,"../../lib/i18n/i18n.js":66,"../../lib/network-request.js":74,"../audit.js":3,"./byte-efficiency-audit.js":4,"./unused-css-rules.js":"../audits/byte-efficiency/unused-css-rules"}],"../audits/byte-efficiency/total-byte-weight":[function(require,module,exports){
(function(__filename){
@@ -2860,7 +2934,7 @@ module.exports.UIStrings=UIStrings;
'use strict';
-const ByteEfficiencyAudit=require('./byte-efficiency-audit');
+const ByteEfficiencyAudit=require('./byte-efficiency-audit.js');
const i18n=require('../../lib/i18n/i18n.js');
const NetworkRecords=require('../../computed/network-records.js');
@@ -2954,7 +3028,7 @@ const tableDetails=ByteEfficiencyAudit.makeTableDetails(headings,results);
return{
score,
-rawValue:totalBytes,
+numericValue:totalBytes,
displayValue:str_(UIStrings.displayValue,{totalBytes}),
extendedInfo:{
value:{
@@ -2971,7 +3045,7 @@ module.exports=TotalByteWeight;
module.exports.UIStrings=UIStrings;
}).call(this,"/lighthouse-core/audits/byte-efficiency/total-byte-weight.js");
-},{"../../computed/network-records.js":31,"../../lib/i18n/i18n.js":63,"./byte-efficiency-audit":4}],"../audits/byte-efficiency/unminified-css":[function(require,module,exports){
+},{"../../computed/network-records.js":31,"../../lib/i18n/i18n.js":66,"./byte-efficiency-audit.js":4}],"../audits/byte-efficiency/unminified-css":[function(require,module,exports){
(function(__filename){
@@ -2980,10 +3054,10 @@ module.exports.UIStrings=UIStrings;
'use strict';
-const ByteEfficiencyAudit=require('./byte-efficiency-audit');
-const UnusedCSSRules=require('./unused-css-rules');
+const ByteEfficiencyAudit=require('./byte-efficiency-audit.js');
+const UnusedCSSRules=require('./unused-css-rules.js');
const i18n=require('../../lib/i18n/i18n.js');
-const computeTokenLength=require('../../lib/minification-estimator').computeCSSTokenLength;
+const computeTokenLength=require('../../lib/minification-estimator.js').computeCSSTokenLength;
const UIStrings={
@@ -3011,7 +3085,7 @@ id:'unminified-css',
title:str_(UIStrings.title),
description:str_(UIStrings.description),
scoreDisplayMode:ByteEfficiencyAudit.SCORING_MODES.NUMERIC,
-requiredArtifacts:['CSSUsage','devtoolsLogs','traces']};
+requiredArtifacts:['CSSUsage','devtoolsLogs','traces','URL']};
}
@@ -3092,7 +3166,7 @@ module.exports=UnminifiedCSS;
module.exports.UIStrings=UIStrings;
}).call(this,"/lighthouse-core/audits/byte-efficiency/unminified-css.js");
-},{"../../lib/i18n/i18n.js":63,"../../lib/minification-estimator":69,"./byte-efficiency-audit":4,"./unused-css-rules":"../audits/byte-efficiency/unused-css-rules"}],"../audits/byte-efficiency/unminified-javascript":[function(require,module,exports){
+},{"../../lib/i18n/i18n.js":66,"../../lib/minification-estimator.js":72,"./byte-efficiency-audit.js":4,"./unused-css-rules.js":"../audits/byte-efficiency/unused-css-rules"}],"../audits/byte-efficiency/unminified-javascript":[function(require,module,exports){
(function(__filename){
@@ -3101,9 +3175,9 @@ module.exports.UIStrings=UIStrings;
'use strict';
-const ByteEfficiencyAudit=require('./byte-efficiency-audit');
+const ByteEfficiencyAudit=require('./byte-efficiency-audit.js');
const i18n=require('../../lib/i18n/i18n.js');
-const computeTokenLength=require('../../lib/minification-estimator').computeJSTokenLength;
+const computeTokenLength=require('../../lib/minification-estimator.js').computeJSTokenLength;
const UIStrings={
@@ -3214,7 +3288,7 @@ module.exports=UnminifiedJavaScript;
module.exports.UIStrings=UIStrings;
}).call(this,"/lighthouse-core/audits/byte-efficiency/unminified-javascript.js");
-},{"../../lib/i18n/i18n.js":63,"../../lib/minification-estimator":69,"./byte-efficiency-audit":4}],"../audits/byte-efficiency/unused-css-rules":[function(require,module,exports){
+},{"../../lib/i18n/i18n.js":66,"../../lib/minification-estimator.js":72,"./byte-efficiency-audit.js":4}],"../audits/byte-efficiency/unused-css-rules":[function(require,module,exports){
(function(__filename){
@@ -3223,7 +3297,7 @@ module.exports.UIStrings=UIStrings;
'use strict';
-const ByteEfficiencyAudit=require('./byte-efficiency-audit');
+const ByteEfficiencyAudit=require('./byte-efficiency-audit.js');
const i18n=require('../../lib/i18n/i18n.js');
const UIStrings={
@@ -3409,7 +3483,7 @@ module.exports=UnusedCSSRules;
module.exports.UIStrings=UIStrings;
}).call(this,"/lighthouse-core/audits/byte-efficiency/unused-css-rules.js");
-},{"../../lib/i18n/i18n.js":63,"./byte-efficiency-audit":4}],"../audits/byte-efficiency/unused-javascript":[function(require,module,exports){
+},{"../../lib/i18n/i18n.js":66,"./byte-efficiency-audit.js":4}],"../audits/byte-efficiency/unused-javascript":[function(require,module,exports){
(function(__filename){
@@ -3418,7 +3492,7 @@ module.exports.UIStrings=UIStrings;
'use strict';
-const ByteEfficiencyAudit=require('./byte-efficiency-audit');
+const ByteEfficiencyAudit=require('./byte-efficiency-audit.js');
const i18n=require('../../lib/i18n/i18n.js');
const UIStrings={
@@ -3547,7 +3621,7 @@ module.exports=UnusedJavaScript;
module.exports.UIStrings=UIStrings;
}).call(this,"/lighthouse-core/audits/byte-efficiency/unused-javascript.js");
-},{"../../lib/i18n/i18n.js":63,"./byte-efficiency-audit":4}],"../audits/byte-efficiency/uses-long-cache-ttl":[function(require,module,exports){
+},{"../../lib/i18n/i18n.js":66,"./byte-efficiency-audit.js":4}],"../audits/byte-efficiency/uses-long-cache-ttl":[function(require,module,exports){
(function(__filename){
@@ -3558,10 +3632,10 @@ module.exports.UIStrings=UIStrings;
const assert=require('assert');
const parseCacheControl=require('parse-cache-control');
-const Audit=require('../audit');
-const NetworkRequest=require('../../lib/network-request');
-const URL=require('../../lib/url-shim');
-const linearInterpolation=require('../../lib/statistics').linearInterpolation;
+const Audit=require('../audit.js');
+const NetworkRequest=require('../../lib/network-request.js');
+const URL=require('../../lib/url-shim.js');
+const linearInterpolation=require('../../lib/statistics.js').linearInterpolation;
const i18n=require('../../lib/i18n/i18n.js');
const NetworkRecords=require('../../computed/network-records.js');
@@ -3703,11 +3777,12 @@ NetworkRequest.TYPES.Script,
NetworkRequest.TYPES.Stylesheet]);
-const resourceUrl=record.url;
+
+if(URL.NON_NETWORK_PROTOCOLS.includes(record.protocol))return false;
+
return(
CACHEABLE_STATUS_CODES.has(record.statusCode)&&
-STATIC_RESOURCE_TYPES.has(record.resourceType||'Other')&&
-!resourceUrl.includes('data:'));
+STATIC_RESOURCE_TYPES.has(record.resourceType||'Other'));
}
@@ -3790,17 +3865,17 @@ if(url.includes('?'))queryStringCount++;
-let diagnostic;
+let debugData;
if(cacheControl){
-diagnostic={
-type:'diagnostic',
+debugData={
+type:'debugdata',
...cacheControl};
}
results.push({
url,
-diagnostic,
+debugData,
cacheLifetimeMs:cacheLifetimeInSeconds*1000,
cacheHitProbability,
totalBytes,
@@ -3835,7 +3910,7 @@ const details=Audit.makeTableDetails(headings,results,summary);
return{
score,
-rawValue:totalWastedBytes,
+numericValue:totalWastedBytes,
displayValue:str_(UIStrings.displayValue,{itemCount:results.length}),
extendedInfo:{
value:{
@@ -3853,7 +3928,7 @@ module.exports=CacheHeaders;
module.exports.UIStrings=UIStrings;
}).call(this,"/lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js");
-},{"../../computed/network-records.js":31,"../../lib/i18n/i18n.js":63,"../../lib/network-request":71,"../../lib/statistics":75,"../../lib/url-shim":"url","../audit":3,"assert":84,"parse-cache-control":134}],"../audits/byte-efficiency/uses-optimized-images":[function(require,module,exports){
+},{"../../computed/network-records.js":31,"../../lib/i18n/i18n.js":66,"../../lib/network-request.js":74,"../../lib/statistics.js":80,"../../lib/url-shim.js":"url","../audit.js":3,"assert":89,"parse-cache-control":139}],"../audits/byte-efficiency/uses-optimized-images":[function(require,module,exports){
(function(__filename){
@@ -3866,8 +3941,8 @@ module.exports.UIStrings=UIStrings;
'use strict';
-const ByteEfficiencyAudit=require('./byte-efficiency-audit');
-const URL=require('../../lib/url-shim');
+const ByteEfficiencyAudit=require('./byte-efficiency-audit.js');
+const URL=require('../../lib/url-shim.js');
const i18n=require('../../lib/i18n/i18n.js');
const UIStrings={
@@ -3892,7 +3967,7 @@ id:'uses-optimized-images',
title:str_(UIStrings.title),
description:str_(UIStrings.description),
scoreDisplayMode:ByteEfficiencyAudit.SCORING_MODES.NUMERIC,
-requiredArtifacts:['OptimizedImages','ImageElements','devtoolsLogs','traces']};
+requiredArtifacts:['OptimizedImages','ImageElements','devtoolsLogs','traces','URL']};
}
@@ -3992,7 +4067,7 @@ module.exports=UsesOptimizedImages;
module.exports.UIStrings=UIStrings;
}).call(this,"/lighthouse-core/audits/byte-efficiency/uses-optimized-images.js");
-},{"../../lib/i18n/i18n.js":63,"../../lib/url-shim":"url","./byte-efficiency-audit":4}],"../audits/byte-efficiency/uses-responsive-images":[function(require,module,exports){
+},{"../../lib/i18n/i18n.js":66,"../../lib/url-shim.js":"url","./byte-efficiency-audit.js":4}],"../audits/byte-efficiency/uses-responsive-images":[function(require,module,exports){
(function(__filename){
@@ -4009,9 +4084,9 @@ module.exports.UIStrings=UIStrings;
'use strict';
-const ByteEfficiencyAudit=require('./byte-efficiency-audit');
-const Sentry=require('../../lib/sentry');
-const URL=require('../../lib/url-shim');
+const ByteEfficiencyAudit=require('./byte-efficiency-audit.js');
+const Sentry=require('../../lib/sentry.js');
+const URL=require('../../lib/url-shim.js');
const i18n=require('../../lib/i18n/i18n.js');
const UIStrings={
@@ -4090,19 +4165,22 @@ const DPR=artifacts.ViewportDimensions.devicePixelRatio;
const warnings=[];
const resultsMap=new Map();
-images.forEach(image=>{
+for(const image of images){
-if(!image.resourceSize||image.mimeType==='image/svg+xml'){
-return;
+
+
+
+if(!image.resourceSize||image.mimeType==='image/svg+xml'||image.isCss){
+continue;
}
const processed=UsesResponsiveImages.computeWaste(image,DPR);
-if(!processed)return;
+if(!processed)continue;
if(processed instanceof Error){
warnings.push(processed.message);
Sentry.captureException(processed,{tags:{audit:this.meta.id},level:'warning'});
-return;
+continue;
}
@@ -4110,7 +4188,7 @@ const existing=resultsMap.get(processed.url);
if(!existing||existing.wastedBytes>processed.wastedBytes){
resultsMap.set(processed.url,processed);
}
-});
+}
const items=Array.from(resultsMap.values()).
filter(item=>item.wastedBytes>IGNORE_THRESHOLD_IN_BYTES);
@@ -4135,7 +4213,7 @@ module.exports=UsesResponsiveImages;
module.exports.UIStrings=UIStrings;
}).call(this,"/lighthouse-core/audits/byte-efficiency/uses-responsive-images.js");
-},{"../../lib/i18n/i18n.js":63,"../../lib/sentry":74,"../../lib/url-shim":"url","./byte-efficiency-audit":4}],"../audits/byte-efficiency/uses-text-compression":[function(require,module,exports){
+},{"../../lib/i18n/i18n.js":66,"../../lib/sentry.js":77,"../../lib/url-shim.js":"url","./byte-efficiency-audit.js":4}],"../audits/byte-efficiency/uses-text-compression":[function(require,module,exports){
(function(__filename){
@@ -4148,8 +4226,8 @@ module.exports.UIStrings=UIStrings;
'use strict';
-const ByteEfficiencyAudit=require('./byte-efficiency-audit');
-const URL=require('../../lib/url-shim');
+const ByteEfficiencyAudit=require('./byte-efficiency-audit.js');
+const URL=require('../../lib/url-shim.js');
const i18n=require('../../lib/i18n/i18n.js');
const UIStrings={
@@ -4239,7 +4317,7 @@ module.exports=ResponsesAreCompressed;
module.exports.UIStrings=UIStrings;
}).call(this,"/lighthouse-core/audits/byte-efficiency/uses-text-compression.js");
-},{"../../lib/i18n/i18n.js":63,"../../lib/url-shim":"url","./byte-efficiency-audit":4}],"../audits/byte-efficiency/uses-webp-images":[function(require,module,exports){
+},{"../../lib/i18n/i18n.js":66,"../../lib/url-shim.js":"url","./byte-efficiency-audit.js":4}],"../audits/byte-efficiency/uses-webp-images":[function(require,module,exports){
(function(__filename){
@@ -4251,8 +4329,8 @@ module.exports.UIStrings=UIStrings;
'use strict';
-const ByteEfficiencyAudit=require('./byte-efficiency-audit');
-const URL=require('../../lib/url-shim');
+const ByteEfficiencyAudit=require('./byte-efficiency-audit.js');
+const URL=require('../../lib/url-shim.js');
const i18n=require('../../lib/i18n/i18n.js');
const UIStrings={
@@ -4278,7 +4356,7 @@ id:'uses-webp-images',
title:str_(UIStrings.title),
description:str_(UIStrings.description),
scoreDisplayMode:ByteEfficiencyAudit.SCORING_MODES.NUMERIC,
-requiredArtifacts:['OptimizedImages','devtoolsLogs','traces']};
+requiredArtifacts:['OptimizedImages','devtoolsLogs','traces','URL','ImageElements']};
}
@@ -4377,7 +4455,7 @@ module.exports=UsesWebPImages;
module.exports.UIStrings=UIStrings;
}).call(this,"/lighthouse-core/audits/byte-efficiency/uses-webp-images.js");
-},{"../../lib/i18n/i18n.js":63,"../../lib/url-shim":"url","./byte-efficiency-audit":4}],"../audits/content-width":[function(require,module,exports){
+},{"../../lib/i18n/i18n.js":66,"../../lib/url-shim.js":"url","./byte-efficiency-audit.js":4}],"../audits/content-width":[function(require,module,exports){
@@ -4385,7 +4463,7 @@ module.exports.UIStrings=UIStrings;
'use strict';
-const Audit=require('./audit');
+const Audit=require('./audit.js');
class ContentWidth extends Audit{
@@ -4415,12 +4493,12 @@ const widthsMatch=viewportWidth===windowWidth;
if(IsMobile){
return{
-rawValue:widthsMatch,
+score:Number(widthsMatch),
explanation:this.createExplanation(widthsMatch,artifacts.ViewportDimensions)};
}else{
return{
-rawValue:true,
+score:1,
notApplicable:true};
}
@@ -4443,7 +4521,7 @@ return'The viewport size is '+artifact.innerWidth+'px, '+
module.exports=ContentWidth;
-},{"./audit":3}],"../audits/critical-request-chains":[function(require,module,exports){
+},{"./audit.js":3}],"../audits/critical-request-chains":[function(require,module,exports){
(function(__filename){
@@ -4452,7 +4530,7 @@ module.exports=ContentWidth;
'use strict';
-const Audit=require('./audit');
+const Audit=require('./audit.js');
const i18n=require('../lib/i18n/i18n.js');
const ComputedChains=require('../computed/critical-request-chains.js');
@@ -4648,7 +4726,7 @@ walk(initialNavChildren,0);
const longestChain=CriticalRequestChains._getLongestChain(flattenedChains);
return{
-rawValue:chainCount===0,
+score:Number(chainCount===0),
notApplicable:chainCount===0,
displayValue:chainCount?str_(UIStrings.displayValue,{itemCount:chainCount}):'',
extendedInfo:{
@@ -4671,7 +4749,7 @@ module.exports=CriticalRequestChains;
module.exports.UIStrings=UIStrings;
}).call(this,"/lighthouse-core/audits/critical-request-chains.js");
-},{"../computed/critical-request-chains.js":9,"../lib/i18n/i18n.js":63,"./audit":3}],"../audits/deprecations":[function(require,module,exports){
+},{"../computed/critical-request-chains.js":9,"../lib/i18n/i18n.js":66,"./audit.js":3}],"../audits/deprecations":[function(require,module,exports){
@@ -4685,8 +4763,8 @@ module.exports.UIStrings=UIStrings;
-const Audit=require('./audit');
-const Util=require('../report/html/renderer/util');
+const Audit=require('./audit.js');
+const Util=require('../report/html/renderer/util.js');
class Deprecations extends Audit{
@@ -4699,7 +4777,7 @@ title:'Avoids deprecated APIs',
failureTitle:'Uses deprecated APIs',
description:'Deprecated APIs will eventually be removed from the browser. '+
'[Learn more](https://www.chromestatus.com/features#deprecated).',
-requiredArtifacts:['ChromeConsoleMessages']};
+requiredArtifacts:['ConsoleMessages']};
}
@@ -4708,7 +4786,7 @@ requiredArtifacts:['ChromeConsoleMessages']};
static audit(artifacts){
-const entries=artifacts.ChromeConsoleMessages;
+const entries=artifacts.ConsoleMessages;
const deprecations=entries.filter(log=>log.entry.source==='deprecation').map(log=>{
return{
@@ -4735,7 +4813,7 @@ displayValue=`${deprecations.length} warning found`;
}
return{
-rawValue:deprecations.length===0,
+score:Number(deprecations.length===0),
displayValue,
extendedInfo:{
value:deprecations},
@@ -4747,7 +4825,7 @@ details};
module.exports=Deprecations;
-},{"../report/html/renderer/util":80,"./audit":3}],"../audits/diagnostics":[function(require,module,exports){
+},{"../report/html/renderer/util.js":85,"./audit.js":3}],"../audits/diagnostics":[function(require,module,exports){
@@ -4816,9 +4894,8 @@ mainDocumentTransferSize};
return{
score:1,
-rawValue:1,
details:{
-type:'diagnostic',
+type:'debugdata',
items:[diagnostics]}};
@@ -4828,7 +4905,7 @@ items:[diagnostics]}};
module.exports=Diagnostics;
-},{"../computed/main-thread-tasks.js":12,"../computed/network-analysis.js":30,"../computed/network-records.js":31,"../lib/dependency-graph/simulator/network-analyzer.js":57,"./audit.js":3}],"../audits/dobetterweb/appcache-manifest":[function(require,module,exports){
+},{"../computed/main-thread-tasks.js":12,"../computed/network-analysis.js":30,"../computed/network-records.js":31,"../lib/dependency-graph/simulator/network-analyzer.js":60,"./audit.js":3}],"../audits/dobetterweb/appcache-manifest":[function(require,module,exports){
@@ -4841,7 +4918,7 @@ module.exports=Diagnostics;
'use strict';
-const Audit=require('../audit');
+const Audit=require('../audit.js');
class AppCacheManifestAttr extends Audit{
@@ -4867,7 +4944,7 @@ const usingAppcache=artifacts.AppCacheManifest!==null;
const displayValue=usingAppcache?`Found "${artifacts.AppCacheManifest}"`:'';
return{
-rawValue:!usingAppcache,
+score:usingAppcache?0:1,
displayValue};
}}
@@ -4875,7 +4952,7 @@ displayValue};
module.exports=AppCacheManifestAttr;
-},{"../audit":3}],"../audits/dobetterweb/doctype":[function(require,module,exports){
+},{"../audit.js":3}],"../audits/dobetterweb/doctype":[function(require,module,exports){
@@ -4883,7 +4960,7 @@ module.exports=AppCacheManifestAttr;
'use strict';
-const Audit=require('../audit');
+const Audit=require('../audit.js');
class Doctype extends Audit{
@@ -4908,7 +4985,7 @@ requiredArtifacts:['Doctype']};
static audit(artifacts){
if(!artifacts.Doctype){
return{
-rawValue:false,
+score:0,
explanation:'Document must contain a doctype'};
}
@@ -4920,14 +4997,14 @@ const doctypeSystemId=artifacts.Doctype.systemId;
if(doctypePublicId!==''){
return{
-rawValue:false,
+score:0,
explanation:'Expected publicId to be an empty string'};
}
if(doctypeSystemId!==''){
return{
-rawValue:false,
+score:0,
explanation:'Expected systemId to be an empty string'};
}
@@ -4937,11 +5014,11 @@ explanation:'Expected systemId to be an empty string'};
if(doctypeName==='html'){
return{
-rawValue:true};
+score:1};
}else{
return{
-rawValue:false,
+score:0,
explanation:'Doctype name must be the lowercase string `html`'};
}
@@ -4950,7 +5027,7 @@ explanation:'Doctype name must be the lowercase string `html`'};
module.exports=Doctype;
-},{"../audit":3}],"../audits/dobetterweb/dom-size":[function(require,module,exports){
+},{"../audit.js":3}],"../audits/dobetterweb/dom-size":[function(require,module,exports){
(function(__filename){
@@ -4966,11 +5043,11 @@ module.exports=Doctype;
'use strict';
-const Audit=require('../audit');
+const Audit=require('../audit.js');
const Util=require('../../report/html/renderer/util.js');
const i18n=require('../../lib/i18n/i18n.js');
-const MAX_DOM_NODES=1500;
+const MAX_DOM_ELEMENTS=1500;
const MAX_DOM_TREE_WIDTH=60;
const MAX_DOM_TREE_DEPTH=32;
@@ -4981,7 +5058,7 @@ title:'Avoids an excessive DOM size',
failureTitle:'Avoid an excessive DOM size',
description:'Browser engineers recommend pages contain fewer than '+
-`~${MAX_DOM_NODES.toLocaleString()} DOM nodes. The sweet spot is a tree `+
+`~${MAX_DOM_ELEMENTS.toLocaleString()} DOM elements. The sweet spot is a tree `+
`depth < ${MAX_DOM_TREE_DEPTH} elements and fewer than ${MAX_DOM_TREE_WIDTH} `+
'children/parent element. A large DOM can increase memory usage, cause longer '+
'[style calculations](https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations), '+
@@ -4994,11 +5071,11 @@ columnElement:'Element',
columnValue:'Value',
displayValue:`{itemCount, plural,
- =1 {1 node}
- other {# nodes}
+ =1 {1 element}
+ other {# elements}
}`,
-statisticDOMNodes:'Total DOM Nodes',
+statisticDOMElements:'Total DOM Elements',
statisticDOMDepth:'Maximum DOM Depth',
@@ -5009,8 +5086,8 @@ const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
class DOMSize extends Audit{
-static get MAX_DOM_NODES(){
-return MAX_DOM_NODES;
+static get MAX_DOM_ELEMENTS(){
+return MAX_DOM_ELEMENTS;
}
@@ -5050,7 +5127,7 @@ static audit(artifacts,context){
const stats=artifacts.DOMStats;
const score=Audit.computeLogNormalScore(
-stats.totalDOMNodes,
+stats.totalBodyElements,
context.options.scorePODR,
context.options.scoreMedian);
@@ -5065,9 +5142,9 @@ const headings=[
const items=[
{
-statistic:str_(UIStrings.statisticDOMNodes),
+statistic:str_(UIStrings.statisticDOMElements),
element:'',
-value:Util.formatNumber(stats.totalDOMNodes)},
+value:Util.formatNumber(stats.totalBodyElements)},
{
statistic:str_(UIStrings.statisticDOMDepth),
@@ -5089,8 +5166,8 @@ value:Util.formatNumber(stats.width.max)}];
return{
score,
-rawValue:stats.totalDOMNodes,
-displayValue:str_(UIStrings.displayValue,{itemCount:stats.totalDOMNodes}),
+numericValue:stats.totalBodyElements,
+displayValue:str_(UIStrings.displayValue,{itemCount:stats.totalBodyElements}),
extendedInfo:{
value:items},
@@ -5103,7 +5180,7 @@ module.exports=DOMSize;
module.exports.UIStrings=UIStrings;
}).call(this,"/lighthouse-core/audits/dobetterweb/dom-size.js");
-},{"../../lib/i18n/i18n.js":63,"../../report/html/renderer/util.js":80,"../audit":3}],"../audits/dobetterweb/external-anchors-use-rel-noopener":[function(require,module,exports){
+},{"../../lib/i18n/i18n.js":66,"../../report/html/renderer/util.js":85,"../audit.js":3}],"../audits/dobetterweb/external-anchors-use-rel-noopener":[function(require,module,exports){
@@ -5111,8 +5188,8 @@ module.exports.UIStrings=UIStrings;
'use strict';
-const URL=require('../../lib/url-shim');
-const Audit=require('../audit');
+const URL=require('../../lib/url-shim.js');
+const Audit=require('../audit.js');
class ExternalAnchorsUseRelNoopenerAudit extends Audit{
@@ -5173,7 +5250,7 @@ const headings=[
const details=Audit.makeTableDetails(headings,failingAnchors);
return{
-rawValue:failingAnchors.length===0,
+score:Number(failingAnchors.length===0),
extendedInfo:{
value:failingAnchors},
@@ -5185,7 +5262,7 @@ warnings};
module.exports=ExternalAnchorsUseRelNoopenerAudit;
-},{"../../lib/url-shim":"url","../audit":3}],"../audits/dobetterweb/geolocation-on-start":[function(require,module,exports){
+},{"../../lib/url-shim.js":"url","../audit.js":3}],"../audits/dobetterweb/geolocation-on-start":[function(require,module,exports){
@@ -5199,7 +5276,7 @@ module.exports=ExternalAnchorsUseRelNoopenerAudit;
'use strict';
-const ViolationAudit=require('../violation-audit');
+const ViolationAudit=require('../violation-audit.js');
class GeolocationOnStart extends ViolationAudit{
@@ -5213,7 +5290,7 @@ failureTitle:'Requests the geolocation permission on page load',
description:'Users are mistrustful of or confused by sites that request their '+
'location without context. Consider tying the request to user gestures instead. '+
'[Learn more](https://developers.google.com/web/tools/lighthouse/audits/geolocation-on-load).',
-requiredArtifacts:['ChromeConsoleMessages']};
+requiredArtifacts:['ConsoleMessages']};
}
@@ -5235,7 +5312,7 @@ const headings=[
const details=ViolationAudit.makeTableDetails(headings,results);
return{
-rawValue:results.length===0,
+score:Number(results.length===0),
extendedInfo:{
value:results},
@@ -5246,7 +5323,7 @@ details};
module.exports=GeolocationOnStart;
-},{"../violation-audit":7}],"../audits/dobetterweb/js-libraries":[function(require,module,exports){
+},{"../violation-audit.js":7}],"../audits/dobetterweb/js-libraries":[function(require,module,exports){
@@ -5259,7 +5336,7 @@ module.exports=GeolocationOnStart;
'use strict';
-const Audit=require('../audit');
+const Audit=require('../audit.js');
class JsLibrariesAudit extends Audit{
@@ -5270,7 +5347,7 @@ return{
id:'js-libraries',
title:'Detected JavaScript libraries',
description:'All front-end JavaScript libraries detected on the page.',
-requiredArtifacts:['JSLibraries']};
+requiredArtifacts:['Stacks']};
}
@@ -5279,10 +5356,12 @@ requiredArtifacts:['JSLibraries']};
static audit(artifacts){
-const libDetails=artifacts.JSLibraries.map(lib=>({
-name:lib.name,
-version:lib.version||undefined,
-npm:lib.npmPkgName||undefined}));
+const libDetails=artifacts.Stacks.
+filter(stack=>stack.detector==='js').
+map(stack=>({
+name:stack.name,
+version:stack.version,
+npm:stack.npm}));
@@ -5293,7 +5372,7 @@ const headings=[
const details=Audit.makeTableDetails(headings,libDetails,{});
return{
-rawValue:true,
+score:1,
details};
}}
@@ -5301,7 +5380,7 @@ details};
module.exports=JsLibrariesAudit;
-},{"../audit":3}],"../audits/dobetterweb/no-document-write":[function(require,module,exports){
+},{"../audit.js":3}],"../audits/dobetterweb/no-document-write":[function(require,module,exports){
@@ -5314,7 +5393,7 @@ module.exports=JsLibrariesAudit;
'use strict';
-const ViolationAudit=require('../violation-audit');
+const ViolationAudit=require('../violation-audit.js');
class NoDocWriteAudit extends ViolationAudit{
@@ -5328,7 +5407,7 @@ failureTitle:'Uses `document.write()`',
description:'For users on slow connections, external scripts dynamically injected via '+
'`document.write()` can delay page load by tens of seconds. '+
'[Learn more](https://developers.google.com/web/tools/lighthouse/audits/document-write).',
-requiredArtifacts:['ChromeConsoleMessages']};
+requiredArtifacts:['ConsoleMessages']};
}
@@ -5348,7 +5427,7 @@ const headings=[
const details=ViolationAudit.makeTableDetails(headings,results);
return{
-rawValue:results.length===0,
+score:Number(results.length===0),
extendedInfo:{
value:results},
@@ -5359,7 +5438,7 @@ details};
module.exports=NoDocWriteAudit;
-},{"../violation-audit":7}],"../audits/dobetterweb/no-vulnerable-libraries":[function(require,module,exports){
+},{"../violation-audit.js":7}],"../audits/dobetterweb/no-vulnerable-libraries":[function(require,module,exports){
@@ -5374,8 +5453,8 @@ module.exports=NoDocWriteAudit;
'use strict';
-const Audit=require('../audit');
-const Sentry=require('../../lib/sentry');
+const Audit=require('../audit.js');
+const Sentry=require('../../lib/sentry.js');
const semver=require('semver');
const snykDatabase=require('../../../third-party/snyk/snapshot.json');
@@ -5398,7 +5477,7 @@ failureTitle:'Includes front-end JavaScript libraries'+
description:'Some third-party scripts may contain known security vulnerabilities '+
'that are easily identified and exploited by attackers. '+
'[Learn more](https://developers.google.com/web/tools/lighthouse/audits/vulnerabilities).',
-requiredArtifacts:['JSLibraries']};
+requiredArtifacts:['Stacks']};
}
@@ -5445,7 +5524,7 @@ return version;
static getVulnerabilities(normalizedVersion,lib,snykDB){
-if(!lib.npmPkgName||!snykDB.npm[lib.npmPkgName]){
+if(!lib.npm||!snykDB.npm[lib.npm]){
return[];
}
@@ -5453,14 +5532,14 @@ return[];
try{
semver.satisfies(normalizedVersion,'*');
}catch(err){
-err.pkgName=lib.npmPkgName;
+err.pkgName=lib.npm;
Sentry.captureException(err,{level:'warning'});
return[];
}
-const vulnCandidatesForLib=snykDB.npm[lib.npmPkgName];
+const vulnCandidatesForLib=snykDB.npm[lib.npm];
const matchingVulns=vulnCandidatesForLib.filter(vulnCandidate=>{
@@ -5497,12 +5576,12 @@ return sortedVulns[0].severity;
static audit(artifacts){
-const foundLibraries=artifacts.JSLibraries;
+const foundLibraries=artifacts.Stacks.filter(stack=>stack.detector==='js');
const snykDB=NoVulnerableLibrariesAudit.snykDB;
if(!foundLibraries.length){
return{
-rawValue:true};
+score:1};
}
@@ -5525,7 +5604,7 @@ highestSeverity,
vulnCount,
detectedLib:{
text:lib.name+'@'+version,
-url:`https://snyk.io/vuln/npm:${lib.npmPkgName}?lh=${version}&utm_source=lighthouse&utm_medium=ref&utm_campaign=audit`,
+url:`https://snyk.io/vuln/npm:${lib.npm}?lh=${version}&utm_source=lighthouse&utm_medium=ref&utm_campaign=audit`,
type:'link'}});
@@ -5533,7 +5612,7 @@ type:'link'}});
return{
name:lib.name,
-npmPkgName:lib.npmPkgName,
+npmPkgName:lib.npm,
version,
vulns,
highestSeverity};
@@ -5556,7 +5635,7 @@ const headings=[
const details=Audit.makeTableDetails(headings,vulnerabilityResults,{});
return{
-rawValue:totalVulns===0,
+score:Number(totalVulns===0),
displayValue,
extendedInfo:{
jsLibs:libraryVulns,
@@ -5569,7 +5648,7 @@ details};
module.exports=NoVulnerableLibrariesAudit;
-},{"../../../third-party/snyk/snapshot.json":168,"../../lib/sentry":74,"../audit":3,"semver":158}],"../audits/dobetterweb/notification-on-start":[function(require,module,exports){
+},{"../../../third-party/snyk/snapshot.json":175,"../../lib/sentry.js":77,"../audit.js":3,"semver":163}],"../audits/dobetterweb/notification-on-start":[function(require,module,exports){
@@ -5583,7 +5662,7 @@ module.exports=NoVulnerableLibrariesAudit;
'use strict';
-const ViolationAudit=require('../violation-audit');
+const ViolationAudit=require('../violation-audit.js');
class NotificationOnStart extends ViolationAudit{
@@ -5597,7 +5676,7 @@ failureTitle:'Requests the notification permission on page load',
description:'Users are mistrustful of or confused by sites that request to send '+
'notifications without context. Consider tying the request to user gestures '+
'instead. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/notifications-on-load).',
-requiredArtifacts:['ChromeConsoleMessages']};
+requiredArtifacts:['ConsoleMessages']};
}
@@ -5617,7 +5696,7 @@ const headings=[
const details=ViolationAudit.makeTableDetails(headings,results);
return{
-rawValue:results.length===0,
+score:Number(results.length===0),
extendedInfo:{
value:results},
@@ -5628,7 +5707,7 @@ details};
module.exports=NotificationOnStart;
-},{"../violation-audit":7}],"../audits/dobetterweb/password-inputs-can-be-pasted-into":[function(require,module,exports){
+},{"../violation-audit.js":7}],"../audits/dobetterweb/password-inputs-can-be-pasted-into":[function(require,module,exports){
@@ -5636,7 +5715,7 @@ module.exports=NotificationOnStart;
'use strict';
-const Audit=require('../audit');
+const Audit=require('../audit.js');
class PasswordInputsCanBePastedIntoAudit extends Audit{
@@ -5674,7 +5753,7 @@ const headings=[
return{
-rawValue:passwordInputsWithPreventedPaste.length===0,
+score:Number(passwordInputsWithPreventedPaste.length===0),
extendedInfo:{
value:passwordInputsWithPreventedPaste},
@@ -5685,7 +5764,7 @@ details:Audit.makeTableDetails(headings,items)};
module.exports=PasswordInputsCanBePastedIntoAudit;
-},{"../audit":3}],"../audits/dobetterweb/uses-http2":[function(require,module,exports){
+},{"../audit.js":3}],"../audits/dobetterweb/uses-http2":[function(require,module,exports){
@@ -5699,8 +5778,8 @@ module.exports=PasswordInputsCanBePastedIntoAudit;
'use strict';
-const URL=require('../../lib/url-shim');
-const Audit=require('../audit');
+const URL=require('../../lib/url-shim.js');
+const Audit=require('../audit.js');
const Util=require('../../report/html/renderer/util.js');
const NetworkRecords=require('../../computed/network-records.js');
@@ -5767,7 +5846,7 @@ const headings=[
const details=Audit.makeTableDetails(headings,resources);
return{
-rawValue:resources.length===0,
+score:Number(resources.length===0),
displayValue:displayValue,
extendedInfo:{
value:{
@@ -5782,7 +5861,7 @@ details};
module.exports=UsesHTTP2Audit;
-},{"../../computed/network-records.js":31,"../../lib/url-shim":"url","../../report/html/renderer/util.js":80,"../audit":3}],"../audits/dobetterweb/uses-passive-event-listeners":[function(require,module,exports){
+},{"../../computed/network-records.js":31,"../../lib/url-shim.js":"url","../../report/html/renderer/util.js":85,"../audit.js":3}],"../audits/dobetterweb/uses-passive-event-listeners":[function(require,module,exports){
@@ -5796,7 +5875,7 @@ module.exports=UsesHTTP2Audit;
'use strict';
-const ViolationAudit=require('../violation-audit');
+const ViolationAudit=require('../violation-audit.js');
class PassiveEventsAudit extends ViolationAudit{
@@ -5810,7 +5889,7 @@ failureTitle:'Does not use passive listeners to improve scrolling performance',
description:'Consider marking your touch and wheel event listeners as `passive` '+
'to improve your page\'s scroll performance. '+
'[Learn more](https://developers.google.com/web/tools/lighthouse/audits/passive-event-listeners).',
-requiredArtifacts:['ChromeConsoleMessages']};
+requiredArtifacts:['ConsoleMessages']};
}
@@ -5830,7 +5909,7 @@ const headings=[
const details=ViolationAudit.makeTableDetails(headings,results);
return{
-rawValue:results.length===0,
+score:Number(results.length===0),
extendedInfo:{
value:results},
@@ -5841,7 +5920,7 @@ details};
module.exports=PassiveEventsAudit;
-},{"../violation-audit":7}],"../audits/errors-in-console":[function(require,module,exports){
+},{"../violation-audit.js":7}],"../audits/errors-in-console":[function(require,module,exports){
@@ -5854,7 +5933,7 @@ module.exports=PassiveEventsAudit;
-const Audit=require('./audit');
+const Audit=require('./audit.js');
class ErrorLogs extends Audit{
@@ -5867,7 +5946,7 @@ title:'No browser errors logged to the console',
description:'Errors logged to the console indicate unresolved problems. '+
'They can come from network request failures and other browser concerns.',
failureTitle:'Browser errors were logged to the console',
-requiredArtifacts:['ChromeConsoleMessages','RuntimeExceptions']};
+requiredArtifacts:['ConsoleMessages','RuntimeExceptions']};
}
@@ -5876,7 +5955,7 @@ requiredArtifacts:['ChromeConsoleMessages','RuntimeExceptions']};
static audit(artifacts){
-const consoleEntries=artifacts.ChromeConsoleMessages;
+const consoleEntries=artifacts.ConsoleMessages;
const runtimeExceptions=artifacts.RuntimeExceptions;
const consoleRows=
@@ -5915,7 +5994,7 @@ const numErrors=tableRows.length;
return{
score:Number(numErrors===0),
-rawValue:numErrors,
+numericValue:numErrors,
details};
}}
@@ -5923,7 +6002,7 @@ details};
module.exports=ErrorLogs;
-},{"./audit":3}],"../audits/final-screenshot":[function(require,module,exports){
+},{"./audit.js":3}],"../audits/final-screenshot":[function(require,module,exports){
@@ -5931,8 +6010,9 @@ module.exports=ErrorLogs;
'use strict';
-const Audit=require('./audit');
-const LHError=require('../lib/lh-error');
+const Audit=require('./audit.js');
+const LHError=require('../lib/lh-error.js');
+const TraceOfTab=require('../computed/trace-of-tab.js');
const Screenshots=require('../computed/screenshots.js');
class FinalScreenshot extends Audit{
@@ -5956,7 +6036,9 @@ requiredArtifacts:['traces']};
static async audit(artifacts,context){
const trace=artifacts.traces[Audit.DEFAULT_PASS];
+const traceOfTab=await TraceOfTab.request(trace,context);
const screenshots=await Screenshots.request(trace,context);
+const{navigationStart}=traceOfTab.timestamps;
const finalScreenshot=screenshots[screenshots.length-1];
if(!finalScreenshot){
@@ -5964,9 +6046,10 @@ throw new LHError(LHError.errors.NO_SCREENSHOTS);
}
return{
-rawValue:true,
+score:1,
details:{
type:'screenshot',
+timing:Math.round((finalScreenshot.timestamp-navigationStart)/1000),
timestamp:finalScreenshot.timestamp,
data:finalScreenshot.datauri}};
@@ -5976,7 +6059,7 @@ data:finalScreenshot.datauri}};
module.exports=FinalScreenshot;
-},{"../computed/screenshots.js":33,"../lib/lh-error":67,"./audit":3}],"../audits/font-display":[function(require,module,exports){
+},{"../computed/screenshots.js":34,"../computed/trace-of-tab.js":36,"../lib/lh-error.js":70,"./audit.js":3}],"../audits/font-display":[function(require,module,exports){
(function(__filename){
@@ -5985,8 +6068,8 @@ module.exports=FinalScreenshot;
'use strict';
-const Audit=require('./audit');
-const URL=require('../lib/url-shim').URL;
+const Audit=require('./audit.js');
+const URL=require('../lib/url-shim.js');
const PASSING_FONT_DISPLAY_REGEX=/^(block|fallback|optional|swap)$/;
const CSS_URL_REGEX=/url\((.*?)\)/;
const CSS_URL_GLOBAL_REGEX=new RegExp(CSS_URL_REGEX,'g');
@@ -6063,10 +6146,10 @@ return s.substr(1,s.length-2);
return s;
});
-
for(const relativeURL of relativeURLs){
try{
-const relativeRoot=stylesheet.header.sourceURL||artifacts.URL.finalUrl;
+const relativeRoot=URL.isValid(stylesheet.header.sourceURL)?
+stylesheet.header.sourceURL:artifacts.URL.finalUrl;
const absoluteURL=new URL(relativeURL,relativeRoot);
passingURLs.add(absoluteURL.href);
}catch(err){
@@ -6096,6 +6179,7 @@ filter(record=>record.resourceType==='Font').
filter(record=>!passingFontURLs.has(record.url)).
filter(record=>!/^data:/.test(record.url)).
+filter(record=>!/^blob:/.test(record.url)).
map(record=>{
@@ -6117,7 +6201,6 @@ const details=Audit.makeTableDetails(headings,results);
return{
score:Number(results.length===0),
-rawValue:results.length===0,
details};
}}
@@ -6127,7 +6210,7 @@ module.exports=FontDisplay;
module.exports.UIStrings=UIStrings;
}).call(this,"/lighthouse-core/audits/font-display.js");
-},{"../computed/network-records.js":31,"../lib/i18n/i18n.js":63,"../lib/sentry.js":74,"../lib/url-shim":"url","./audit":3}],"../audits/image-aspect-ratio":[function(require,module,exports){
+},{"../computed/network-records.js":31,"../lib/i18n/i18n.js":66,"../lib/sentry.js":77,"../lib/url-shim.js":"url","./audit.js":3}],"../audits/image-aspect-ratio":[function(require,module,exports){
@@ -6141,9 +6224,9 @@ module.exports.UIStrings=UIStrings;
'use strict';
-const Audit=require('./audit');
+const Audit=require('./audit.js');
-const URL=require('../lib/url-shim');
+const URL=require('../lib/url-shim.js');
const THRESHOLD_PX=2;
@@ -6235,7 +6318,7 @@ const headings=[
return{
-rawValue:results.length===0,
+score:Number(results.length===0),
warnings,
details:Audit.makeTableDetails(headings,results)};
@@ -6244,7 +6327,7 @@ details:Audit.makeTableDetails(headings,results)};
module.exports=ImageAspectRatio;
-},{"../lib/url-shim":"url","./audit":3}],"../audits/installable-manifest":[function(require,module,exports){
+},{"../lib/url-shim.js":"url","./audit.js":3}],"../audits/installable-manifest":[function(require,module,exports){
@@ -6348,9 +6431,9 @@ module.exports=InstallableManifest;
'use strict';
-const Audit=require('./audit');
-const URL=require('../lib/url-shim');
-const Util=require('../report/html/renderer/util');
+const Audit=require('./audit.js');
+const URL=require('../lib/url-shim.js');
+const Util=require('../report/html/renderer/util.js');
const NetworkRecords=require('../computed/network-records.js');
const SECURE_SCHEMES=['data','https','wss','blob','chrome','chrome-extension','about'];
@@ -6411,7 +6494,7 @@ const headings=[
return{
-rawValue:items.length===0,
+score:Number(items.length===0),
displayValue,
extendedInfo:{
value:items},
@@ -6424,7 +6507,7 @@ details:Audit.makeTableDetails(headings,items)};
module.exports=HTTPS;
-},{"../computed/network-records.js":31,"../lib/url-shim":"url","../report/html/renderer/util":80,"./audit":3}],"../audits/load-fast-enough-for-pwa":[function(require,module,exports){
+},{"../computed/network-records.js":31,"../lib/url-shim.js":"url","../report/html/renderer/util.js":85,"./audit.js":3}],"../audits/load-fast-enough-for-pwa":[function(require,module,exports){
(function(__filename){
@@ -6440,8 +6523,8 @@ module.exports=HTTPS;
const isDeepEqual=require('lodash.isequal');
-const Audit=require('./audit');
-const mobileThrottling=require('../config/constants').throttling.mobileSlow4G;
+const Audit=require('./audit.js');
+const mobileThrottling=require('../config/constants.js').throttling.mobileSlow4G;
const Interactive=require('../computed/metrics/interactive.js');
const i18n=require('../lib/i18n/i18n.js');
@@ -6523,7 +6606,7 @@ return{
score,
displayValue,
explanation,
-rawValue:tti.timing};
+numericValue:tti.timing};
}}
@@ -6532,7 +6615,7 @@ module.exports=LoadFastEnough4Pwa;
module.exports.UIStrings=UIStrings;
}).call(this,"/lighthouse-core/audits/load-fast-enough-for-pwa.js");
-},{"../computed/metrics/interactive.js":18,"../config/constants":40,"../lib/i18n/i18n.js":63,"./audit":3,"lodash.isequal":121}],"../audits/main-thread-tasks":[function(require,module,exports){
+},{"../computed/metrics/interactive.js":18,"../config/constants.js":43,"../lib/i18n/i18n.js":66,"./audit.js":3,"lodash.isequal":126}],"../audits/main-thread-tasks":[function(require,module,exports){
@@ -6586,7 +6669,7 @@ const tableDetails=Audit.makeTableDetails(headings,results);
return{
score:1,
-rawValue:results.length,
+numericValue:results.length,
details:tableDetails};
}}
@@ -6608,8 +6691,8 @@ module.exports=MainThreadTasks;
'use strict';
-const Audit=require('./audit');
-const{taskGroups}=require('../lib/task-groups');
+const Audit=require('./audit.js');
+const{taskGroups}=require('../lib/task-groups.js');
const i18n=require('../lib/i18n/i18n.js');
const MainThreadTasks=require('../computed/main-thread-tasks.js');
@@ -6720,7 +6803,7 @@ context.options.scoreMedian);
return{
score,
-rawValue:totalExecutionTime,
+numericValue:totalExecutionTime,
displayValue:str_(i18n.UIStrings.seconds,{timeInMs:totalExecutionTime}),
details:tableDetails};
@@ -6731,7 +6814,7 @@ module.exports=MainThreadWorkBreakdown;
module.exports.UIStrings=UIStrings;
}).call(this,"/lighthouse-core/audits/mainthread-work-breakdown.js");
-},{"../computed/main-thread-tasks.js":12,"../lib/i18n/i18n.js":63,"../lib/task-groups":77,"./audit":3}],"../audits/manual/pwa-cross-browser":[function(require,module,exports){
+},{"../computed/main-thread-tasks.js":12,"../lib/i18n/i18n.js":66,"../lib/task-groups.js":82,"./audit.js":3}],"../audits/manual/pwa-cross-browser":[function(require,module,exports){
@@ -6740,7 +6823,7 @@ module.exports.UIStrings=UIStrings;
'use strict';
-const ManualAudit=require('./manual-audit');
+const ManualAudit=require('./manual-audit.js');
@@ -6762,7 +6845,7 @@ super.partialMeta);
module.exports=PWACrossBrowser;
-},{"./manual-audit":5}],"../audits/manual/pwa-each-page-has-url":[function(require,module,exports){
+},{"./manual-audit.js":5}],"../audits/manual/pwa-each-page-has-url":[function(require,module,exports){
@@ -6770,7 +6853,7 @@ module.exports=PWACrossBrowser;
'use strict';
-const ManualAudit=require('./manual-audit');
+const ManualAudit=require('./manual-audit.js');
@@ -6792,7 +6875,7 @@ super.partialMeta);
module.exports=PWAEachPageHasURL;
-},{"./manual-audit":5}],"../audits/manual/pwa-page-transitions":[function(require,module,exports){
+},{"./manual-audit.js":5}],"../audits/manual/pwa-page-transitions":[function(require,module,exports){
@@ -6800,7 +6883,7 @@ module.exports=PWAEachPageHasURL;
'use strict';
-const ManualAudit=require('./manual-audit');
+const ManualAudit=require('./manual-audit.js');
@@ -6822,7 +6905,7 @@ super.partialMeta);
module.exports=PWAPageTransitions;
-},{"./manual-audit":5}],"../audits/metrics/estimated-input-latency":[function(require,module,exports){
+},{"./manual-audit.js":5}],"../audits/metrics/estimated-input-latency":[function(require,module,exports){
(function(__filename){
@@ -6831,7 +6914,7 @@ module.exports=PWAPageTransitions;
'use strict';
-const Audit=require('../audit');
+const Audit=require('../audit.js');
const i18n=require('../../lib/i18n/i18n.js');
const ComputedEil=require('../../computed/metrics/estimated-input-latency.js');
@@ -6857,7 +6940,7 @@ id:'estimated-input-latency',
title:str_(UIStrings.title),
description:str_(UIStrings.description),
scoreDisplayMode:Audit.SCORING_MODES.NUMERIC,
-requiredArtifacts:['traces']};
+requiredArtifacts:['traces','devtoolsLogs']};
}
@@ -6892,7 +6975,7 @@ metricResult.timing,
context.options.scorePODR,
context.options.scoreMedian),
-rawValue:metricResult.timing,
+numericValue:metricResult.timing,
displayValue:str_(i18n.UIStrings.ms,{timeInMs:metricResult.timing})};
}}
@@ -6902,7 +6985,7 @@ module.exports=EstimatedInputLatency;
module.exports.UIStrings=UIStrings;
}).call(this,"/lighthouse-core/audits/metrics/estimated-input-latency.js");
-},{"../../computed/metrics/estimated-input-latency.js":14,"../../lib/i18n/i18n.js":63,"../audit":3}],"../audits/metrics/first-contentful-paint-3g":[function(require,module,exports){
+},{"../../computed/metrics/estimated-input-latency.js":14,"../../lib/i18n/i18n.js":66,"../audit.js":3}],"../audits/metrics/first-contentful-paint-3g":[function(require,module,exports){
@@ -6960,7 +7043,7 @@ metricResult.timing,
context.options.scorePODR,
context.options.scoreMedian),
-rawValue:metricResult.timing,
+numericValue:metricResult.timing,
displayValue:`${metricResult.timing}\xa0ms`};
}}
@@ -6968,7 +7051,7 @@ displayValue:`${metricResult.timing}\xa0ms`};
module.exports=FirstContentfulPaint3G;
-},{"../../computed/metrics/first-contentful-paint.js":15,"../../config/constants.js":40,"../audit.js":3}],"../audits/metrics/first-contentful-paint":[function(require,module,exports){
+},{"../../computed/metrics/first-contentful-paint.js":15,"../../config/constants.js":43,"../audit.js":3}],"../audits/metrics/first-contentful-paint":[function(require,module,exports){
(function(__filename){
@@ -6977,7 +7060,7 @@ module.exports=FirstContentfulPaint3G;
'use strict';
-const Audit=require('../audit');
+const Audit=require('../audit.js');
const i18n=require('../../lib/i18n/i18n.js');
const ComputedFcp=require('../../computed/metrics/first-contentful-paint.js');
@@ -7035,7 +7118,7 @@ metricResult.timing,
context.options.scorePODR,
context.options.scoreMedian),
-rawValue:metricResult.timing,
+numericValue:metricResult.timing,
displayValue:str_(i18n.UIStrings.seconds,{timeInMs:metricResult.timing})};
}}
@@ -7045,7 +7128,7 @@ module.exports=FirstContentfulPaint;
module.exports.UIStrings=UIStrings;
}).call(this,"/lighthouse-core/audits/metrics/first-contentful-paint.js");
-},{"../../computed/metrics/first-contentful-paint.js":15,"../../lib/i18n/i18n.js":63,"../audit":3}],"../audits/metrics/first-cpu-idle":[function(require,module,exports){
+},{"../../computed/metrics/first-contentful-paint.js":15,"../../lib/i18n/i18n.js":66,"../audit.js":3}],"../audits/metrics/first-cpu-idle":[function(require,module,exports){
(function(__filename){
@@ -7054,7 +7137,7 @@ module.exports.UIStrings=UIStrings;
'use strict';
-const Audit=require('../audit');
+const Audit=require('../audit.js');
const i18n=require('../../lib/i18n/i18n.js');
const ComputedFci=require('../../computed/metrics/first-cpu-idle.js');
@@ -7079,7 +7162,7 @@ id:'first-cpu-idle',
title:str_(UIStrings.title),
description:str_(UIStrings.description),
scoreDisplayMode:Audit.SCORING_MODES.NUMERIC,
-requiredArtifacts:['traces']};
+requiredArtifacts:['traces','devtoolsLogs']};
}
@@ -7116,7 +7199,7 @@ metricResult.timing,
context.options.scorePODR,
context.options.scoreMedian),
-rawValue:metricResult.timing,
+numericValue:metricResult.timing,
displayValue:str_(i18n.UIStrings.seconds,{timeInMs:metricResult.timing})};
}}
@@ -7126,7 +7209,7 @@ module.exports=FirstCPUIdle;
module.exports.UIStrings=UIStrings;
}).call(this,"/lighthouse-core/audits/metrics/first-cpu-idle.js");
-},{"../../computed/metrics/first-cpu-idle.js":16,"../../lib/i18n/i18n.js":63,"../audit":3}],"../audits/metrics/first-meaningful-paint":[function(require,module,exports){
+},{"../../computed/metrics/first-cpu-idle.js":16,"../../lib/i18n/i18n.js":66,"../audit.js":3}],"../audits/metrics/first-meaningful-paint":[function(require,module,exports){
(function(__filename){
@@ -7135,7 +7218,7 @@ module.exports.UIStrings=UIStrings;
'use strict';
-const Audit=require('../audit');
+const Audit=require('../audit.js');
const i18n=require('../../lib/i18n/i18n.js');
const ComputedFmp=require('../../computed/metrics/first-meaningful-paint.js');
@@ -7159,7 +7242,7 @@ id:'first-meaningful-paint',
title:str_(UIStrings.title),
description:str_(UIStrings.description),
scoreDisplayMode:Audit.SCORING_MODES.NUMERIC,
-requiredArtifacts:['traces']};
+requiredArtifacts:['traces','devtoolsLogs']};
}
@@ -7196,7 +7279,7 @@ metricResult.timing,
context.options.scorePODR,
context.options.scoreMedian),
-rawValue:metricResult.timing,
+numericValue:metricResult.timing,
displayValue:str_(i18n.UIStrings.seconds,{timeInMs:metricResult.timing})};
}}
@@ -7206,7 +7289,7 @@ module.exports=FirstMeaningfulPaint;
module.exports.UIStrings=UIStrings;
}).call(this,"/lighthouse-core/audits/metrics/first-meaningful-paint.js");
-},{"../../computed/metrics/first-meaningful-paint.js":17,"../../lib/i18n/i18n.js":63,"../audit":3}],"../audits/metrics/interactive":[function(require,module,exports){
+},{"../../computed/metrics/first-meaningful-paint.js":17,"../../lib/i18n/i18n.js":66,"../audit.js":3}],"../audits/metrics/interactive":[function(require,module,exports){
(function(__filename){
@@ -7215,7 +7298,7 @@ module.exports.UIStrings=UIStrings;
'use strict';
-const Audit=require('../audit');
+const Audit=require('../audit.js');
const i18n=require('../../lib/i18n/i18n.js');
const Interactive=require('../../computed/metrics/interactive.js');
@@ -7288,7 +7371,7 @@ timeInMs,
context.options.scorePODR,
context.options.scoreMedian),
-rawValue:timeInMs,
+numericValue:timeInMs,
displayValue:str_(i18n.UIStrings.seconds,{timeInMs}),
extendedInfo:{
value:extendedInfo}};
@@ -7301,7 +7384,7 @@ module.exports=InteractiveMetric;
module.exports.UIStrings=UIStrings;
}).call(this,"/lighthouse-core/audits/metrics/interactive.js");
-},{"../../computed/metrics/interactive.js":18,"../../lib/i18n/i18n.js":63,"../audit":3}],"../audits/metrics/max-potential-fid":[function(require,module,exports){
+},{"../../computed/metrics/interactive.js":18,"../../lib/i18n/i18n.js":66,"../audit.js":3}],"../audits/metrics/max-potential-fid":[function(require,module,exports){
(function(__filename){
@@ -7310,16 +7393,16 @@ module.exports.UIStrings=UIStrings;
'use strict';
-const Audit=require('../audit');
+const Audit=require('../audit.js');
const ComputedFid=require('../../computed/metrics/max-potential-fid.js');
-const i18n=require('../../lib/i18n/i18n');
+const i18n=require('../../lib/i18n/i18n.js');
const UIStrings={
-title:'Max Potential FID',
+title:'Max Potential First Input Delay',
-description:'The potential First Input Delay that your users could experience is the '+
-'duration, in milliseconds, of the longest task.'};
+description:'The maximum potential First Input Delay that your users could experience is the '+
+'duration, in milliseconds, of the longest task. [Learn more](https://developers.google.com/web/updates/2018/05/first-input-delay).'};
const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
@@ -7339,7 +7422,7 @@ id:'max-potential-fid',
title:str_(UIStrings.title),
description:str_(UIStrings.description),
scoreDisplayMode:Audit.SCORING_MODES.NUMERIC,
-requiredArtifacts:['traces']};
+requiredArtifacts:['traces','devtoolsLogs']};
}
@@ -7371,7 +7454,7 @@ metricResult.timing,
context.options.scorePODR,
context.options.scoreMedian),
-rawValue:metricResult.timing,
+numericValue:metricResult.timing,
displayValue:str_(i18n.UIStrings.ms,{timeInMs:metricResult.timing})};
}}
@@ -7381,7 +7464,7 @@ module.exports=MaxPotentialFID;
module.exports.UIStrings=UIStrings;
}).call(this,"/lighthouse-core/audits/metrics/max-potential-fid.js");
-},{"../../computed/metrics/max-potential-fid.js":27,"../../lib/i18n/i18n":63,"../audit":3}],"../audits/metrics/speed-index":[function(require,module,exports){
+},{"../../computed/metrics/max-potential-fid.js":27,"../../lib/i18n/i18n.js":66,"../audit.js":3}],"../audits/metrics/speed-index":[function(require,module,exports){
(function(__filename){
@@ -7390,7 +7473,7 @@ module.exports.UIStrings=UIStrings;
'use strict';
-const Audit=require('../audit');
+const Audit=require('../audit.js');
const i18n=require('../../lib/i18n/i18n.js');
const ComputedSi=require('../../computed/metrics/speed-index.js');
@@ -7450,7 +7533,7 @@ metricResult.timing,
context.options.scorePODR,
context.options.scoreMedian),
-rawValue:metricResult.timing,
+numericValue:metricResult.timing,
displayValue:str_(i18n.UIStrings.seconds,{timeInMs:metricResult.timing})};
}}
@@ -7460,7 +7543,7 @@ module.exports=SpeedIndex;
module.exports.UIStrings=UIStrings;
}).call(this,"/lighthouse-core/audits/metrics/speed-index.js");
-},{"../../computed/metrics/speed-index.js":29,"../../lib/i18n/i18n.js":63,"../audit":3}],"../audits/metrics":[function(require,module,exports){
+},{"../../computed/metrics/speed-index.js":29,"../../lib/i18n/i18n.js":66,"../audit.js":3}],"../audits/metrics":[function(require,module,exports){
@@ -7468,7 +7551,7 @@ module.exports.UIStrings=UIStrings;
'use strict';
-const Audit=require('./audit');
+const Audit=require('./audit.js');
const TraceOfTab=require('../computed/trace-of-tab.js');
const Speedline=require('../computed/speedline.js');
const FirstContentfulPaint=require('../computed/metrics/first-contentful-paint.js');
@@ -7573,14 +7656,14 @@ metrics[key]=Math.round(value);
const details={
-type:'diagnostic',
+type:'debugdata',
items:[metrics]};
return{
score:1,
-rawValue:interactive&&interactive.timing||0,
+numericValue:interactive&&interactive.timing||0,
details};
}}
@@ -7624,7 +7707,7 @@ details};
module.exports=Metrics;
-},{"../computed/metrics/estimated-input-latency.js":14,"../computed/metrics/first-contentful-paint.js":15,"../computed/metrics/first-cpu-idle.js":16,"../computed/metrics/first-meaningful-paint.js":17,"../computed/metrics/interactive.js":18,"../computed/metrics/speed-index.js":29,"../computed/speedline.js":34,"../computed/trace-of-tab.js":35,"./audit":3}],"../audits/mixed-content":[function(require,module,exports){
+},{"../computed/metrics/estimated-input-latency.js":14,"../computed/metrics/first-contentful-paint.js":15,"../computed/metrics/first-cpu-idle.js":16,"../computed/metrics/first-meaningful-paint.js":17,"../computed/metrics/interactive.js":18,"../computed/metrics/speed-index.js":29,"../computed/speedline.js":35,"../computed/trace-of-tab.js":36,"./audit.js":3}],"../audits/mixed-content":[function(require,module,exports){
@@ -7632,9 +7715,9 @@ module.exports=Metrics;
'use strict';
-const Audit=require('./audit');
-const URL=require('../lib/url-shim');
-const Util=require('../report/html/renderer/util');
+const Audit=require('./audit.js');
+const URL=require('../lib/url-shim.js');
+const Util=require('../report/html/renderer/util.js');
const NetworkRecords=require('../computed/network-records.js');
@@ -7766,7 +7849,6 @@ const totalRecords=defaultRecords.length;
const score=(secureRecords.length+0.5*upgradeableResources.length)/totalRecords;
return{
-rawValue:upgradeableResources.length===0,
score,
displayValue:displayValue,
details};
@@ -7777,7 +7859,7 @@ details};
module.exports=MixedContent;
-},{"../computed/network-records.js":31,"../lib/url-shim":"url","../report/html/renderer/util":80,"./audit":3}],"../audits/network-requests":[function(require,module,exports){
+},{"../computed/network-records.js":31,"../lib/url-shim.js":"url","../report/html/renderer/util.js":85,"./audit.js":3}],"../audits/network-requests":[function(require,module,exports){
@@ -7785,8 +7867,8 @@ module.exports=MixedContent;
'use strict';
-const Audit=require('./audit');
-const URL=require('../lib/url-shim');
+const Audit=require('./audit.js');
+const URL=require('../lib/url-shim.js');
const NetworkRecords=require('../computed/network-records.js');
class NetworkRequests extends Audit{
@@ -7870,7 +7952,7 @@ const tableDetails=Audit.makeTableDetails(headings,results);
return{
score:1,
-rawValue:results.length,
+numericValue:results.length,
details:tableDetails};
});
@@ -7879,7 +7961,7 @@ details:tableDetails};
module.exports=NetworkRequests;
-},{"../computed/network-records.js":31,"../lib/url-shim":"url","./audit":3}],"../audits/network-rtt":[function(require,module,exports){
+},{"../computed/network-records.js":31,"../lib/url-shim.js":"url","./audit.js":3}],"../audits/network-rtt":[function(require,module,exports){
(function(__filename){
@@ -7952,7 +8034,7 @@ const tableDetails=Audit.makeTableDetails(headings,results);
return{
score:1,
-rawValue:maxRtt,
+numericValue:maxRtt,
displayValue:str_(i18n.UIStrings.ms,{timeInMs:maxRtt}),
details:tableDetails};
@@ -7963,7 +8045,7 @@ module.exports=NetworkRTT;
module.exports.UIStrings=UIStrings;
}).call(this,"/lighthouse-core/audits/network-rtt.js");
-},{"../computed/network-analysis.js":30,"../lib/i18n/i18n.js":63,"./audit.js":3}],"../audits/network-server-latency":[function(require,module,exports){
+},{"../computed/network-analysis.js":30,"../lib/i18n/i18n.js":66,"./audit.js":3}],"../audits/network-server-latency":[function(require,module,exports){
(function(__filename){
@@ -7972,7 +8054,7 @@ module.exports.UIStrings=UIStrings;
'use strict';
-const Audit=require('./audit');
+const Audit=require('./audit.js');
const i18n=require('../lib/i18n/i18n.js');
const NetworkAnalysisComputed=require('../computed/network-analysis.js');
@@ -8035,7 +8117,7 @@ const tableDetails=Audit.makeTableDetails(headings,results);
return{
score:Math.max(1-maxLatency/500,0),
-rawValue:maxLatency,
+numericValue:maxLatency,
displayValue:str_(i18n.UIStrings.ms,{timeInMs:maxLatency}),
details:tableDetails};
@@ -8046,7 +8128,7 @@ module.exports=NetworkServerLatency;
module.exports.UIStrings=UIStrings;
}).call(this,"/lighthouse-core/audits/network-server-latency.js");
-},{"../computed/network-analysis.js":30,"../lib/i18n/i18n.js":63,"./audit":3}],"../audits/offline-start-url":[function(require,module,exports){
+},{"../computed/network-analysis.js":30,"../lib/i18n/i18n.js":66,"./audit.js":3}],"../audits/offline-start-url":[function(require,module,exports){
@@ -8088,7 +8170,7 @@ warnings.push('We couldn\'t read the start_url from the manifest. As a result, t
const hasOfflineStartUrl=artifacts.StartUrl.statusCode===200;
return{
-rawValue:hasOfflineStartUrl,
+score:Number(hasOfflineStartUrl),
explanation:artifacts.StartUrl.explanation,
warnings};
@@ -8097,7 +8179,159 @@ warnings};
module.exports=OfflineStartUrl;
-},{"./audit.js":3}],"../audits/predictive-perf":[function(require,module,exports){
+},{"./audit.js":3}],"../audits/performance-budget":[function(require,module,exports){
+(function(__filename){
+
+
+
+
+
+'use strict';
+
+const Audit=require('./audit.js');
+const ResourceSummary=require('../computed/resource-summary.js');
+const i18n=require('../lib/i18n/i18n.js');
+
+const UIStrings={
+
+title:'Performance budget',
+
+description:'Keep the quantity and size of network requests under the targets '+
+'set by the provided performance budget. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/budgets).',
+
+requestCountOverBudget:`{count, plural,
+ =1 {1 request}
+ other {# requests}
+ }`};
+
+
+const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+
+
+
+
+class ResourceBudget extends Audit{
+
+
+
+static get meta(){
+return{
+id:'performance-budget',
+title:str_(UIStrings.title),
+description:str_(UIStrings.description),
+scoreDisplayMode:Audit.SCORING_MODES.INFORMATIVE,
+requiredArtifacts:['devtoolsLogs','URL']};
+
+}
+
+
+
+
+
+static getRowLabel(resourceType){
+
+const strMappings={
+'total':i18n.UIStrings.totalResourceType,
+'document':i18n.UIStrings.documentResourceType,
+'script':i18n.UIStrings.scriptResourceType,
+'stylesheet':i18n.UIStrings.stylesheetResourceType,
+'image':i18n.UIStrings.imageResourceType,
+'media':i18n.UIStrings.mediaResourceType,
+'font':i18n.UIStrings.fontResourceType,
+'other':i18n.UIStrings.otherResourceType,
+'third-party':i18n.UIStrings.thirdPartyResourceType};
+
+return strMappings[resourceType];
+}
+
+
+
+
+
+
+static tableItems(budget,summary){
+const resourceTypes=Object.keys(summary);
+return resourceTypes.map(resourceType=>{
+const label=str_(this.getRowLabel(resourceType));
+const requestCount=summary[resourceType].count;
+const size=summary[resourceType].size;
+
+let sizeOverBudget;
+let countOverBudget;
+
+if(budget.resourceSizes){
+const sizeBudget=budget.resourceSizes.find(b=>b.resourceType===resourceType);
+if(sizeBudget&&size>sizeBudget.budget*1024){
+sizeOverBudget=size-sizeBudget.budget*1024;
+}
+}
+if(budget.resourceCounts){
+const countBudget=budget.resourceCounts.find(b=>b.resourceType===resourceType);
+if(countBudget&&requestCount>countBudget.budget){
+const requestDifference=requestCount-countBudget.budget;
+countOverBudget=str_(UIStrings.requestCountOverBudget,{count:requestDifference});
+}
+}
+return{
+resourceType,
+label,
+requestCount,
+size,
+countOverBudget,
+sizeOverBudget};
+
+}).filter(row=>{
+
+if(budget.resourceSizes){
+if(budget.resourceSizes.some(b=>b.resourceType===row.resourceType))return true;
+}
+if(budget.resourceCounts){
+if(budget.resourceCounts.some(b=>b.resourceType===row.resourceType))return true;
+}
+return false;
+}).sort((a,b)=>{
+return(b.sizeOverBudget||0)-(a.sizeOverBudget||0);
+});
+}
+
+
+
+
+
+
+static async audit(artifacts,context){
+const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
+const summary=await ResourceSummary.request({devtoolsLog,URL:artifacts.URL},context);
+const budget=context.settings.budgets?context.settings.budgets[0]:undefined;
+
+if(!budget){
+return{
+score:0,
+notApplicable:true};
+
+}
+
+
+const headers=[
+{key:'label',itemType:'text',text:'Resource Type'},
+{key:'requestCount',itemType:'numeric',text:'Requests'},
+{key:'size',itemType:'bytes',text:'Transfer Size'},
+{key:'countOverBudget',itemType:'text',text:''},
+{key:'sizeOverBudget',itemType:'bytes',text:'Over Budget'}];
+
+
+return{
+details:Audit.makeTableDetails(headers,this.tableItems(budget,summary)),
+score:1};
+
+}}
+
+
+module.exports=ResourceBudget;
+module.exports.UIStrings=UIStrings;
+
+}).call(this,"/lighthouse-core/audits/performance-budget.js");
+},{"../computed/resource-summary.js":33,"../lib/i18n/i18n.js":66,"./audit.js":3}],"../audits/predictive-perf":[function(require,module,exports){
@@ -8105,8 +8339,8 @@ module.exports=OfflineStartUrl;
'use strict';
-const Audit=require('./audit');
-const Util=require('../report/html/renderer/util');
+const Audit=require('./audit.js');
+const Util=require('../report/html/renderer/util.js');
const LanternFcp=require('../computed/metrics/lantern-first-contentful-paint.js');
const LanternFmp=require('../computed/metrics/lantern-first-meaningful-paint.js');
@@ -8188,10 +8422,10 @@ SCORING_MEDIAN);
return{
score,
-rawValue:values.roughEstimateOfTTI,
+numericValue:values.roughEstimateOfTTI,
displayValue:Util.formatMilliseconds(values.roughEstimateOfTTI),
details:{
-type:'diagnostic',
+type:'debugdata',
items:[values]}};
@@ -8201,7 +8435,7 @@ items:[values]}};
module.exports=PredictivePerf;
-},{"../computed/metrics/lantern-estimated-input-latency.js":19,"../computed/metrics/lantern-first-contentful-paint.js":20,"../computed/metrics/lantern-first-cpu-idle.js":21,"../computed/metrics/lantern-first-meaningful-paint.js":22,"../computed/metrics/lantern-interactive.js":23,"../computed/metrics/lantern-speed-index.js":26,"../report/html/renderer/util":80,"./audit":3}],"../audits/redirects-http":[function(require,module,exports){
+},{"../computed/metrics/lantern-estimated-input-latency.js":19,"../computed/metrics/lantern-first-contentful-paint.js":20,"../computed/metrics/lantern-first-cpu-idle.js":21,"../computed/metrics/lantern-first-meaningful-paint.js":22,"../computed/metrics/lantern-interactive.js":23,"../computed/metrics/lantern-speed-index.js":26,"../report/html/renderer/util.js":85,"./audit.js":3}],"../audits/redirects-http":[function(require,module,exports){
@@ -8209,7 +8443,7 @@ module.exports=PredictivePerf;
'use strict';
-const Audit=require('./audit');
+const Audit=require('./audit.js');
class RedirectsHTTP extends Audit{
@@ -8232,14 +8466,14 @@ requiredArtifacts:['HTTPRedirect']};
static audit(artifacts){
return{
-rawValue:artifacts.HTTPRedirect.value};
+score:Number(artifacts.HTTPRedirect.value)};
}}
module.exports=RedirectsHTTP;
-},{"./audit":3}],"../audits/redirects":[function(require,module,exports){
+},{"./audit.js":3}],"../audits/redirects":[function(require,module,exports){
(function(__filename){
@@ -8248,8 +8482,8 @@ module.exports=RedirectsHTTP;
'use strict';
-const Audit=require('./audit');
-const UnusedBytes=require('./byte-efficiency/byte-efficiency-audit');
+const Audit=require('./audit.js');
+const UnusedBytes=require('./byte-efficiency/byte-efficiency-audit.js');
const i18n=require('../lib/i18n/i18n.js');
const TraceOfTab=require('../computed/trace-of-tab.js');
const NetworkRecords=require('../computed/network-records.js');
@@ -8351,7 +8585,7 @@ const details=Audit.makeOpportunityDetails(headings,pageRedirects,totalWastedMs)
return{
score:redirectRequests.length<=2?1:UnusedBytes.scoreForWastedMs(totalWastedMs),
-rawValue:totalWastedMs,
+numericValue:totalWastedMs,
displayValue:totalWastedMs?
str_(i18n.UIStrings.displayValueMsSavings,{wastedMs:totalWastedMs}):
'',
@@ -8369,7 +8603,114 @@ module.exports=Redirects;
module.exports.UIStrings=UIStrings;
}).call(this,"/lighthouse-core/audits/redirects.js");
-},{"../computed/main-resource.js":11,"../computed/metrics/lantern-interactive.js":23,"../computed/network-records.js":31,"../computed/trace-of-tab.js":35,"../lib/i18n/i18n.js":63,"./audit":3,"./byte-efficiency/byte-efficiency-audit":4}],"../audits/screenshot-thumbnails":[function(require,module,exports){
+},{"../computed/main-resource.js":11,"../computed/metrics/lantern-interactive.js":23,"../computed/network-records.js":31,"../computed/trace-of-tab.js":36,"../lib/i18n/i18n.js":66,"./audit.js":3,"./byte-efficiency/byte-efficiency-audit.js":4}],"../audits/resource-summary":[function(require,module,exports){
+(function(__filename){
+
+
+
+
+
+'use strict';
+
+const Audit=require('./audit.js');
+const ComputedResourceSummary=require('../computed/resource-summary.js');
+const i18n=require('../lib/i18n/i18n.js');
+
+const UIStrings={
+
+title:'Keep request counts low and transfer sizes small',
+
+description:'To set budgets for the quantity and size of page resources,'+
+' add a budget.json file. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/budgets).',
+
+displayValue:`{requestCount, plural, =1 {1 request} other {# requests}}`+
+` • { byteCount, number, bytes } KB`};
+
+
+const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+
+class ResourceSummary extends Audit{
+
+
+
+static get meta(){
+return{
+id:'resource-summary',
+title:str_(UIStrings.title),
+description:str_(UIStrings.description),
+scoreDisplayMode:Audit.SCORING_MODES.INFORMATIVE,
+requiredArtifacts:['devtoolsLogs','URL']};
+
+}
+
+
+
+
+
+
+static async audit(artifacts,context){
+const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
+const summary=await ComputedResourceSummary.
+request({devtoolsLog,URL:artifacts.URL},context);
+
+
+const headings=[
+{key:'label',itemType:'text',text:'Resource Type'},
+{key:'requestCount',itemType:'numeric',text:'Requests'},
+{key:'size',itemType:'bytes',text:'Transfer Size'}];
+
+
+
+
+const strMappings={
+'total':str_(i18n.UIStrings.totalResourceType),
+'document':str_(i18n.UIStrings.documentResourceType),
+'script':str_(i18n.UIStrings.scriptResourceType),
+'stylesheet':str_(i18n.UIStrings.stylesheetResourceType),
+'image':str_(i18n.UIStrings.imageResourceType),
+'media':str_(i18n.UIStrings.mediaResourceType),
+'font':str_(i18n.UIStrings.fontResourceType),
+'other':str_(i18n.UIStrings.otherResourceType),
+'third-party':str_(i18n.UIStrings.thirdPartyResourceType)};
+
+
+const types=Object.keys(summary);
+const rows=types.map(type=>{
+return{
+
+
+resourceType:type,
+label:strMappings[type],
+requestCount:summary[type].count,
+size:summary[type].size};
+
+});
+
+const thirdPartyRow=rows.find(r=>r.resourceType==='third-party')||[];
+const otherRows=rows.filter(r=>r.resourceType!=='third-party').
+sort((a,b)=>{
+return b.size-a.size;
+});
+const tableItems=otherRows.concat(thirdPartyRow);
+
+const tableDetails=Audit.makeTableDetails(headings,tableItems);
+
+return{
+details:tableDetails,
+score:1,
+displayValue:str_(UIStrings.displayValue,{
+requestCount:summary.total.count,
+byteCount:summary.total.size})};
+
+
+}}
+
+
+module.exports=ResourceSummary;
+module.exports.UIStrings=UIStrings;
+
+}).call(this,"/lighthouse-core/audits/resource-summary.js");
+},{"../computed/resource-summary.js":33,"../lib/i18n/i18n.js":66,"./audit.js":3}],"../audits/screenshot-thumbnails":[function(require,module,exports){
@@ -8377,8 +8718,8 @@ module.exports.UIStrings=UIStrings;
'use strict';
-const Audit=require('./audit');
-const LHError=require('../lib/lh-error');
+const Audit=require('./audit.js');
+const LHError=require('../lib/lh-error.js');
const jpeg=require('jpeg-js');
const Speedline=require('../computed/speedline.js');
const Interactive=require('../computed/metrics/interactive.js');
@@ -8488,6 +8829,7 @@ frameForTimestamp=frame;
}
});
}
+
let base64Data;
const cachedThumbnail=cachedThumbnails.get(frameForTimestamp);
if(cachedThumbnail){
@@ -8501,13 +8843,12 @@ cachedThumbnails.set(frameForTimestamp,base64Data);
thumbnails.push({
timing:Math.round(targetTimestamp-speedline.beginning),
timestamp:targetTimestamp*1000,
-data:base64Data});
+data:`data:image/jpeg;base64,${base64Data}`});
}
return{
score:1,
-rawValue:thumbnails.length>0,
details:{
type:'filmstrip',
scale:timelineEnd,
@@ -8519,7 +8860,7 @@ items:thumbnails}};
module.exports=ScreenshotThumbnails;
-},{"../computed/metrics/interactive.js":18,"../computed/speedline.js":34,"../lib/lh-error":67,"./audit":3,"jpeg-js":117}],"../audits/seo/canonical":[function(require,module,exports){
+},{"../computed/metrics/interactive.js":18,"../computed/speedline.js":35,"../lib/lh-error.js":70,"./audit.js":3,"jpeg-js":122}],"../audits/seo/canonical":[function(require,module,exports){
(function(__filename){
@@ -8528,8 +8869,8 @@ module.exports=ScreenshotThumbnails;
'use strict';
-const Audit=require('../audit');
-const URL=require('../../lib/url-shim');
+const Audit=require('../audit.js');
+const URL=require('../../lib/url-shim.js');
const MainResource=require('../../computed/main-resource.js');
const i18n=require('../../lib/i18n/i18n.js');
@@ -8564,19 +8905,6 @@ const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-function getPrimaryDomain(url){
-return url.hostname.
-split('.').
-slice(-2).
-join('.');
-}
-
-
-
-
-
-
-
class Canonical extends Audit{
@@ -8589,7 +8917,7 @@ id:'canonical',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
-requiredArtifacts:['LinkElements','URL']};
+requiredArtifacts:['LinkElements','URL','devtoolsLogs']};
}
@@ -8640,7 +8968,7 @@ const{uniqueCanonicalURLs,invalidCanonicalLink,relativeCanonicallink}=canonicalU
if(invalidCanonicalLink){
return{
-rawValue:false,
+score:0,
explanation:str_(UIStrings.explanationInvalid,{url:invalidCanonicalLink.hrefRaw})};
}
@@ -8648,7 +8976,7 @@ explanation:str_(UIStrings.explanationInvalid,{url:invalidCanonicalLink.hrefRaw}
if(relativeCanonicallink){
return{
-rawValue:false,
+score:0,
explanation:str_(UIStrings.explanationRelative,{url:relativeCanonicallink.hrefRaw})};
}
@@ -8659,7 +8987,7 @@ const canonicalURLs=Array.from(uniqueCanonicalURLs);
if(canonicalURLs.length===0){
return{
-rawValue:true,
+score:1,
notApplicable:true};
}
@@ -8667,7 +8995,7 @@ notApplicable:true};
if(canonicalURLs.length>1){
return{
-rawValue:false,
+score:0,
explanation:str_(UIStrings.explanationConflict,{urlList:canonicalURLs.join(', ')})};
}
@@ -8689,16 +9017,16 @@ hreflangURLs.has(canonicalURL.href)&&
baseURL.href!==canonicalURL.href)
{
return{
-rawValue:false,
+score:0,
explanation:str_(UIStrings.explanationPointsElsewhere,{url:baseURL.href})};
}
-if(getPrimaryDomain(canonicalURL)!==getPrimaryDomain(baseURL)){
+if(!URL.rootDomainsMatch(canonicalURL,baseURL)){
return{
-rawValue:false,
+score:0,
explanation:str_(UIStrings.explanationDifferentDomain,{url:canonicalURL})};
}
@@ -8710,7 +9038,7 @@ canonicalURL.pathname==='/'&&
baseURL.pathname!=='/')
{
return{
-rawValue:false,
+score:0,
explanation:str_(UIStrings.explanationRoot)};
}
@@ -8743,7 +9071,7 @@ baseURL);
if(mistakeAuditProduct)return mistakeAuditProduct;
return{
-rawValue:true};
+score:1};
}}
@@ -8752,7 +9080,7 @@ module.exports=Canonical;
module.exports.UIStrings=UIStrings;
}).call(this,"/lighthouse-core/audits/seo/canonical.js");
-},{"../../computed/main-resource.js":11,"../../lib/i18n/i18n.js":63,"../../lib/url-shim":"url","../audit":3}],"../audits/seo/font-size":[function(require,module,exports){
+},{"../../computed/main-resource.js":11,"../../lib/i18n/i18n.js":66,"../../lib/url-shim.js":"url","../audit.js":3}],"../audits/seo/font-size":[function(require,module,exports){
(function(__filename){
@@ -8763,9 +9091,9 @@ module.exports.UIStrings=UIStrings;
-const URL=require('../../lib/url-shim');
+const URL=require('../../lib/url-shim.js');
const i18n=require('../../lib/i18n/i18n.js');
-const Audit=require('../audit');
+const Audit=require('../audit.js');
const ComputedViewportMeta=require('../../computed/viewport-meta.js');
const MINIMAL_PERCENTAGE_OF_LEGIBLE_TEXT=60;
@@ -8976,15 +9304,15 @@ static async audit(artifacts,context){
if(!artifacts.TestedAsMobileDevice){
return{
-rawValue:true,
+score:1,
notApplicable:true};
}
-const viewportMeta=await ComputedViewportMeta.request(artifacts,context);
+const viewportMeta=await ComputedViewportMeta.request(artifacts.MetaElements,context);
if(!viewportMeta.isMobileOptimized){
return{
-rawValue:false,
+score:0,
explanation:str_(UIStrings.explanationViewport)};
}
@@ -8999,7 +9327,7 @@ artifacts.FontSize;
if(totalTextLength===0){
return{
-rawValue:true};
+score:1};
}
@@ -9075,7 +9403,7 @@ explanation=str_(UIStrings.explanation,
}
return{
-rawValue:passed,
+score:Number(passed),
details,
displayValue,
explanation};
@@ -9087,7 +9415,7 @@ module.exports=FontSize;
module.exports.UIStrings=UIStrings;
}).call(this,"/lighthouse-core/audits/seo/font-size.js");
-},{"../../computed/viewport-meta.js":37,"../../lib/i18n/i18n.js":63,"../../lib/url-shim":"url","../audit":3}],"../audits/seo/hreflang":[function(require,module,exports){
+},{"../../computed/viewport-meta.js":38,"../../lib/i18n/i18n.js":66,"../../lib/url-shim.js":"url","../audit.js":3}],"../audits/seo/hreflang":[function(require,module,exports){
(function(global,__filename){
@@ -9096,7 +9424,7 @@ module.exports.UIStrings=UIStrings;
'use strict';
-const Audit=require('../audit');
+const Audit=require('../audit.js');
const VALID_LANGS=importValidLangs();
const NO_LANGUAGE='x-default';
const i18n=require('../../lib/i18n/i18n.js');
@@ -9126,7 +9454,7 @@ const axeCache=global.axe;
global.axe={utils:{}};
-require('axe-core/lib/commons/utils/valid-langs.js');
+require('axe-core/lib/core/utils/valid-langs.js');
const validLangs=global.axe.utils.validLangs();
@@ -9197,7 +9525,7 @@ const headings=[
const details=Audit.makeTableDetails(headings,invalidHreflangs);
return{
-rawValue:invalidHreflangs.length===0,
+score:Number(invalidHreflangs.length===0),
details};
}}
@@ -9207,7 +9535,7 @@ module.exports=Hreflang;
module.exports.UIStrings=UIStrings;
}).call(this,typeof global!=="undefined"?global:typeof self!=="undefined"?self:typeof window!=="undefined"?window:{},"/lighthouse-core/audits/seo/hreflang.js");
-},{"../../lib/i18n/i18n.js":63,"../audit":3,"axe-core/lib/commons/utils/valid-langs.js":88}],"../audits/seo/http-status-code":[function(require,module,exports){
+},{"../../lib/i18n/i18n.js":66,"../audit.js":3,"axe-core/lib/core/utils/valid-langs.js":93}],"../audits/seo/http-status-code":[function(require,module,exports){
(function(__filename){
@@ -9216,7 +9544,7 @@ module.exports.UIStrings=UIStrings;
'use strict';
-const Audit=require('../audit');
+const Audit=require('../audit.js');
const MainResource=require('../../computed/main-resource.js');
const HTTP_UNSUCCESSFUL_CODE_LOW=400;
const HTTP_UNSUCCESSFUL_CODE_HIGH=599;
@@ -9265,13 +9593,13 @@ const statusCode=mainResource.statusCode;
if(statusCode>=HTTP_UNSUCCESSFUL_CODE_LOW&&
statusCode<=HTTP_UNSUCCESSFUL_CODE_HIGH){
return{
-rawValue:false,
+score:0,
displayValue:`${statusCode}`};
}
return{
-rawValue:true};
+score:1};
});
}}
@@ -9281,7 +9609,7 @@ module.exports=HTTPStatusCode;
module.exports.UIStrings=UIStrings;
}).call(this,"/lighthouse-core/audits/seo/http-status-code.js");
-},{"../../computed/main-resource.js":11,"../../lib/i18n/i18n.js":63,"../audit":3}],"../audits/seo/is-crawlable":[function(require,module,exports){
+},{"../../computed/main-resource.js":11,"../../lib/i18n/i18n.js":66,"../audit.js":3}],"../audits/seo/is-crawlable":[function(require,module,exports){
(function(__filename){
@@ -9290,9 +9618,9 @@ module.exports.UIStrings=UIStrings;
'use strict';
-const Audit=require('../audit');
+const Audit=require('../audit.js');
const robotsParser=require('robots-parser');
-const URL=require('../../lib/url-shim');
+const URL=require('../../lib/url-shim.js');
const MainResource=require('../../computed/main-resource.js');
const BLOCKLIST=new Set([
'noindex',
@@ -9366,7 +9694,7 @@ id:'is-crawlable',
title:str_(UIStrings.title),
failureTitle:str_(UIStrings.failureTitle),
description:str_(UIStrings.description),
-requiredArtifacts:['MetaElements','RobotsTxt','URL']};
+requiredArtifacts:['MetaElements','RobotsTxt','URL','devtoolsLogs']};
}
@@ -9424,7 +9752,7 @@ const headings=[
const details=Audit.makeTableDetails(headings,blockingDirectives);
return{
-rawValue:blockingDirectives.length===0,
+score:Number(blockingDirectives.length===0),
details};
});
@@ -9435,7 +9763,7 @@ module.exports=IsCrawlable;
module.exports.UIStrings=UIStrings;
}).call(this,"/lighthouse-core/audits/seo/is-crawlable.js");
-},{"../../computed/main-resource.js":11,"../../lib/i18n/i18n.js":63,"../../lib/url-shim":"url","../audit":3,"robots-parser":156}],"../audits/seo/link-text":[function(require,module,exports){
+},{"../../computed/main-resource.js":11,"../../lib/i18n/i18n.js":66,"../../lib/url-shim.js":"url","../audit.js":3,"robots-parser":161}],"../audits/seo/link-text":[function(require,module,exports){
(function(__filename){
@@ -9444,8 +9772,8 @@ module.exports.UIStrings=UIStrings;
'use strict';
-const Audit=require('../audit');
-const URL=require('../../lib/url-shim');
+const Audit=require('../audit.js');
+const URL=require('../../lib/url-shim.js');
const BLOCKLIST=new Set([
'click here',
@@ -9463,7 +9791,26 @@ const BLOCKLIST=new Set([
'リンク',
'続きを読む',
'続く',
-'全文表示']);
+'全文表示',
+
+'click aquí',
+'click aqui',
+'clicka aquí',
+'clicka aqui',
+'pincha aquí',
+'pincha aqui',
+'aquí',
+'aqui',
+'más',
+'mas',
+'más información',
+'más informacion',
+'mas información',
+'mas informacion',
+'este',
+'enlace',
+'este enlace',
+'empezar']);
const i18n=require('../../lib/i18n/i18n.js');
@@ -9538,7 +9885,7 @@ displayValue=str_(UIStrings.displayValue,{itemCount:failingLinks.length});
}
return{
-rawValue:failingLinks.length===0,
+score:Number(failingLinks.length===0),
details,
displayValue};
@@ -9549,7 +9896,7 @@ module.exports=LinkText;
module.exports.UIStrings=UIStrings;
}).call(this,"/lighthouse-core/audits/seo/link-text.js");
-},{"../../lib/i18n/i18n.js":63,"../../lib/url-shim":"url","../audit":3}],"../audits/seo/manual/structured-data":[function(require,module,exports){
+},{"../../lib/i18n/i18n.js":66,"../../lib/url-shim.js":"url","../audit.js":3}],"../audits/seo/manual/structured-data":[function(require,module,exports){
(function(__filename){
@@ -9558,7 +9905,7 @@ module.exports.UIStrings=UIStrings;
'use strict';
-const ManualAudit=require('../../manual/manual-audit');
+const ManualAudit=require('../../manual/manual-audit.js');
const i18n=require('../../../lib/i18n/i18n.js');
const UIStrings={
@@ -9591,7 +9938,7 @@ module.exports=StructuredData;
module.exports.UIStrings=UIStrings;
}).call(this,"/lighthouse-core/audits/seo/manual/structured-data.js");
-},{"../../../lib/i18n/i18n.js":63,"../../manual/manual-audit":5}],"../audits/seo/meta-description":[function(require,module,exports){
+},{"../../../lib/i18n/i18n.js":66,"../../manual/manual-audit.js":5}],"../audits/seo/meta-description":[function(require,module,exports){
(function(__filename){
@@ -9600,7 +9947,7 @@ module.exports.UIStrings=UIStrings;
'use strict';
-const Audit=require('../audit');
+const Audit=require('../audit.js');
const i18n=require('../../lib/i18n/i18n.js');
const UIStrings={
@@ -9640,20 +9987,20 @@ static audit(artifacts){
const metaDescription=artifacts.MetaElements.find(meta=>meta.name==='description');
if(!metaDescription){
return{
-rawValue:false};
+score:0};
}
const description=metaDescription.content||'';
if(description.trim().length===0){
return{
-rawValue:false,
+score:0,
explanation:str_(UIStrings.explanation)};
}
return{
-rawValue:true};
+score:1};
}}
@@ -9662,7 +10009,7 @@ module.exports=Description;
module.exports.UIStrings=UIStrings;
}).call(this,"/lighthouse-core/audits/seo/meta-description.js");
-},{"../../lib/i18n/i18n.js":63,"../audit":3}],"../audits/seo/plugins":[function(require,module,exports){
+},{"../../lib/i18n/i18n.js":66,"../audit.js":3}],"../audits/seo/plugins":[function(require,module,exports){
(function(__filename){
@@ -9671,8 +10018,8 @@ module.exports.UIStrings=UIStrings;
'use strict';
-const Audit=require('../audit');
-const URL=require('../../lib/url-shim');
+const Audit=require('../audit.js');
+const URL=require('../../lib/url-shim.js');
const JAVA_APPLET_TYPE='application/x-java-applet';
const JAVA_BEAN_TYPE='application/x-java-bean';
@@ -9826,7 +10173,7 @@ const headings=[
const details=Audit.makeTableDetails(headings,plugins);
return{
-rawValue:plugins.length===0,
+score:Number(plugins.length===0),
details};
}}
@@ -9836,7 +10183,7 @@ module.exports=Plugins;
module.exports.UIStrings=UIStrings;
}).call(this,"/lighthouse-core/audits/seo/plugins.js");
-},{"../../lib/i18n/i18n.js":63,"../../lib/url-shim":"url","../audit":3}],"../audits/seo/robots-txt":[function(require,module,exports){
+},{"../../lib/i18n/i18n.js":66,"../../lib/url-shim.js":"url","../audit.js":3}],"../audits/seo/robots-txt":[function(require,module,exports){
(function(__filename){
@@ -9852,8 +10199,8 @@ module.exports.UIStrings=UIStrings;
-const Audit=require('../audit');
-const URL=require('../../lib/url-shim');
+const Audit=require('../audit.js');
+const URL=require('../../lib/url-shim.js');
const HTTP_CLIENT_ERROR_CODE_LOW=400;
const HTTP_SERVER_ERROR_CODE_LOW=500;
@@ -10042,19 +10389,19 @@ artifacts.RobotsTxt;
if(!status){
return{
-rawValue:false,
+score:0,
explanation:str_(UIStrings.explanation)};
}
if(status>=HTTP_SERVER_ERROR_CODE_LOW){
return{
-rawValue:false,
+score:0,
displayValue:str_(UIStrings.displayValueHttpBadCode,{statusCode:status})};
}else if(status>=HTTP_CLIENT_ERROR_CODE_LOW||content===''){
return{
-rawValue:true,
+score:1,
notApplicable:true};
}
@@ -10082,7 +10429,7 @@ str_(UIStrings.displayValueValidationError,{itemCount:validationErrors.length});
}
return{
-rawValue:validationErrors.length===0,
+score:Number(validationErrors.length===0),
details,
displayValue};
@@ -10093,7 +10440,7 @@ module.exports=RobotsTxt;
module.exports.UIStrings=UIStrings;
}).call(this,"/lighthouse-core/audits/seo/robots-txt.js");
-},{"../../lib/i18n/i18n.js":63,"../../lib/url-shim":"url","../audit":3}],"../audits/seo/tap-targets":[function(require,module,exports){
+},{"../../lib/i18n/i18n.js":66,"../../lib/url-shim.js":"url","../audit.js":3}],"../audits/seo/tap-targets":[function(require,module,exports){
(function(__filename){
@@ -10106,7 +10453,7 @@ module.exports.UIStrings=UIStrings;
-const Audit=require('../audit');
+const Audit=require('../audit.js');
const ComputedViewportMeta=require('../../computed/viewport-meta.js');
const{
rectsTouchOrOverlap,
@@ -10115,8 +10462,8 @@ getRectAtCenter,
allRectsContainedWithinEachOther,
getLargestRect,
getBoundingRectWithPadding}=
-require('../../lib/rect-helpers');
-const{getTappableRectsFromClientRects}=require('../../lib/tappable-rects');
+require('../../lib/rect-helpers.js');
+const{getTappableRectsFromClientRects}=require('../../lib/tappable-rects.js');
const i18n=require('../../lib/i18n/i18n.js');
const UIStrings={
@@ -10347,7 +10694,8 @@ return{
type:'node',
snippet:target.snippet,
path:target.path,
-selector:target.selector};
+selector:target.selector,
+nodeLabel:target.nodeLabel};
}
@@ -10375,15 +10723,15 @@ if(!artifacts.TestedAsMobileDevice){
return{
-rawValue:true,
+score:1,
notApplicable:true};
}
-const viewportMeta=await ComputedViewportMeta.request(artifacts,context);
+const viewportMeta=await ComputedViewportMeta.request(artifacts.MetaElements,context);
if(!viewportMeta.isMobileOptimized){
return{
-rawValue:false,
+score:0,
explanation:str_(UIStrings.explanationViewportMetaNotOptimized)};
}
@@ -10420,7 +10768,6 @@ score=passingTapTargetRatio*0.89;
const displayValue=str_(UIStrings.displayValue,{decimalProportion:passingTapTargetRatio});
return{
-rawValue:tableItems.length===0,
score,
details,
displayValue};
@@ -10465,7 +10812,7 @@ module.exports.UIStrings=UIStrings;
}).call(this,"/lighthouse-core/audits/seo/tap-targets.js");
-},{"../../computed/viewport-meta.js":37,"../../lib/i18n/i18n.js":63,"../../lib/rect-helpers":73,"../../lib/tappable-rects":76,"../audit":3}],"../audits/service-worker":[function(require,module,exports){
+},{"../../computed/viewport-meta.js":38,"../../lib/i18n/i18n.js":66,"../../lib/rect-helpers.js":76,"../../lib/tappable-rects.js":81,"../audit.js":3}],"../audits/service-worker":[function(require,module,exports){
@@ -10562,7 +10909,7 @@ const{versions,registrations}=artifacts.ServiceWorker;
const versionsForOrigin=ServiceWorker.getVersionsForOrigin(versions,pageUrl);
if(versionsForOrigin.length===0){
return{
-rawValue:false};
+score:0};
}
@@ -10570,7 +10917,7 @@ const controllingScopeUrl=ServiceWorker.getControllingScopeUrl(versionsForOrigin
registrations,pageUrl);
if(!controllingScopeUrl){
return{
-rawValue:false,
+score:0,
explanation:`This origin has one or more service workers, however the page ("${pageUrl.href}") is not in scope.`};
}
@@ -10579,14 +10926,14 @@ const startUrlFailure=ServiceWorker.checkStartUrl(artifacts.WebAppManifest,
controllingScopeUrl);
if(startUrlFailure){
return{
-rawValue:false,
+score:0,
explanation:`This page is controlled by a service worker, however ${startUrlFailure}.`};
}
return{
-rawValue:true};
+score:1};
}}
@@ -10601,7 +10948,7 @@ module.exports=ServiceWorker;
'use strict';
-const MultiCheckAudit=require('./multi-check-audit');
+const MultiCheckAudit=require('./multi-check-audit.js');
const ManifestValues=require('../computed/manifest-values.js');
@@ -10680,7 +11027,7 @@ manifestValues};
module.exports=SplashScreen;
-},{"../computed/manifest-values.js":13,"./multi-check-audit":6}],"../audits/themed-omnibox":[function(require,module,exports){
+},{"../computed/manifest-values.js":13,"./multi-check-audit.js":6}],"../audits/themed-omnibox":[function(require,module,exports){
@@ -10688,7 +11035,7 @@ module.exports=SplashScreen;
'use strict';
-const MultiCheckAudit=require('./multi-check-audit');
+const MultiCheckAudit=require('./multi-check-audit.js');
const ManifestValues=require('../computed/manifest-values.js');
const cssParsers=require('cssstyle/lib/parsers');
@@ -10777,7 +11124,7 @@ themeColor:themeColorMeta&&themeColorMeta.content||null};
module.exports=ThemedOmnibox;
-},{"../computed/manifest-values.js":13,"./multi-check-audit":6,"cssstyle/lib/parsers":97}],"../audits/time-to-first-byte":[function(require,module,exports){
+},{"../computed/manifest-values.js":13,"./multi-check-audit.js":6,"cssstyle/lib/parsers":102}],"../audits/time-to-first-byte":[function(require,module,exports){
(function(__filename){
@@ -10786,7 +11133,7 @@ module.exports=ThemedOmnibox;
'use strict';
-const Audit=require('./audit');
+const Audit=require('./audit.js');
const i18n=require('../lib/i18n/i18n.js');
const MainResource=require('../computed/main-resource.js');
@@ -10850,7 +11197,7 @@ items:[]};
return{
-rawValue:ttfb,
+numericValue:ttfb,
score:Number(passed),
displayValue,
details,
@@ -10867,7 +11214,7 @@ module.exports=TTFBMetric;
module.exports.UIStrings=UIStrings;
}).call(this,"/lighthouse-core/audits/time-to-first-byte.js");
-},{"../computed/main-resource.js":11,"../lib/i18n/i18n.js":63,"./audit":3}],"../audits/user-timings":[function(require,module,exports){
+},{"../computed/main-resource.js":11,"../lib/i18n/i18n.js":66,"./audit.js":3}],"../audits/user-timings":[function(require,module,exports){
(function(__filename){
@@ -10876,7 +11223,7 @@ module.exports.UIStrings=UIStrings;
'use strict';
-const Audit=require('./audit');
+const Audit=require('./audit.js');
const i18n=require('../lib/i18n/i18n.js');
const ComputedUserTimings=require('../computed/user-timings.js');
@@ -10984,7 +11331,7 @@ displayValue=str_(UIStrings.displayValue,{itemCount:userTimings.length});
return{
-rawValue:userTimings.length===0,
+score:Number(userTimings.length===0),
notApplicable:userTimings.length===0,
displayValue,
extendedInfo:{
@@ -11000,7 +11347,7 @@ module.exports=UserTimings;
module.exports.UIStrings=UIStrings;
}).call(this,"/lighthouse-core/audits/user-timings.js");
-},{"../computed/user-timings.js":36,"../lib/i18n/i18n.js":63,"./audit":3}],"../audits/uses-rel-preconnect":[function(require,module,exports){
+},{"../computed/user-timings.js":37,"../lib/i18n/i18n.js":66,"./audit.js":3}],"../audits/uses-rel-preconnect":[function(require,module,exports){
(function(__filename){
@@ -11010,8 +11357,8 @@ module.exports.UIStrings=UIStrings;
'use strict';
-const Audit=require('./audit');
-const UnusedBytes=require('./byte-efficiency/byte-efficiency-audit');
+const Audit=require('./audit.js');
+const UnusedBytes=require('./byte-efficiency/byte-efficiency-audit.js');
const URL=require('../lib/url-shim.js');
const i18n=require('../lib/i18n/i18n.js');
const NetworkRecords=require('../computed/network-records.js');
@@ -11192,7 +11539,7 @@ const details=Audit.makeOpportunityDetails(headings,results,maxWasted);
return{
score:UnusedBytes.scoreForWastedMs(maxWasted),
-rawValue:maxWasted,
+numericValue:maxWasted,
displayValue:maxWasted?
str_(i18n.UIStrings.displayValueMsSavings,{wastedMs:maxWasted}):
'',
@@ -11209,7 +11556,7 @@ module.exports=UsesRelPreconnectAudit;
module.exports.UIStrings=UIStrings;
}).call(this,"/lighthouse-core/audits/uses-rel-preconnect.js");
-},{"../computed/load-simulator.js":10,"../computed/main-resource.js":11,"../computed/network-records.js":31,"../lib/i18n/i18n.js":63,"../lib/url-shim.js":"url","./audit":3,"./byte-efficiency/byte-efficiency-audit":4}],"../audits/uses-rel-preload":[function(require,module,exports){
+},{"../computed/load-simulator.js":10,"../computed/main-resource.js":11,"../computed/network-records.js":31,"../lib/i18n/i18n.js":66,"../lib/url-shim.js":"url","./audit.js":3,"./byte-efficiency/byte-efficiency-audit.js":4}],"../audits/uses-rel-preload":[function(require,module,exports){
(function(__filename){
@@ -11218,9 +11565,9 @@ module.exports.UIStrings=UIStrings;
'use strict';
-const URL=require('../lib/url-shim');
-const Audit=require('./audit');
-const UnusedBytes=require('./byte-efficiency/byte-efficiency-audit');
+const URL=require('../lib/url-shim.js');
+const Audit=require('./audit.js');
+const UnusedBytes=require('./byte-efficiency/byte-efficiency-audit.js');
const CriticalRequestChains=require('../computed/critical-request-chains.js');
const i18n=require('../lib/i18n/i18n.js');
const MainResource=require('../computed/main-resource.js');
@@ -11435,7 +11782,7 @@ const details=Audit.makeOpportunityDetails(headings,results,wastedMs);
return{
score:UnusedBytes.scoreForWastedMs(wastedMs),
-rawValue:wastedMs,
+numericValue:wastedMs,
displayValue:wastedMs?
str_(i18n.UIStrings.displayValueMsSavings,{wastedMs}):
'',
@@ -11452,7 +11799,7 @@ module.exports=UsesRelPreloadAudit;
module.exports.UIStrings=UIStrings;
}).call(this,"/lighthouse-core/audits/uses-rel-preload.js");
-},{"../computed/critical-request-chains.js":9,"../computed/load-simulator.js":10,"../computed/main-resource.js":11,"../computed/page-dependency-graph.js":32,"../lib/i18n/i18n.js":63,"../lib/url-shim":"url","./audit":3,"./byte-efficiency/byte-efficiency-audit":4}],"../audits/viewport":[function(require,module,exports){
+},{"../computed/critical-request-chains.js":9,"../computed/load-simulator.js":10,"../computed/main-resource.js":11,"../computed/page-dependency-graph.js":32,"../lib/i18n/i18n.js":66,"../lib/url-shim.js":"url","./audit.js":3,"./byte-efficiency/byte-efficiency-audit.js":4}],"../audits/viewport":[function(require,module,exports){
@@ -11460,7 +11807,7 @@ module.exports.UIStrings=UIStrings;
'use strict';
-const Audit=require('./audit');
+const Audit=require('./audit.js');
const ComputedViewportMeta=require('../computed/viewport-meta.js');
class Viewport extends Audit{
@@ -11485,17 +11832,17 @@ requiredArtifacts:['MetaElements']};
static async audit(artifacts,context){
-const viewportMeta=await ComputedViewportMeta.request(artifacts,context);
+const viewportMeta=await ComputedViewportMeta.request(artifacts.MetaElements,context);
if(!viewportMeta.hasViewportTag){
return{
-rawValue:false,
+score:0,
explanation:'No viewport meta tag found'};
}
return{
-rawValue:viewportMeta.isMobileOptimized,
+score:Number(viewportMeta.isMobileOptimized),
warnings:viewportMeta.parserWarnings};
}}
@@ -11503,7 +11850,7 @@ warnings:viewportMeta.parserWarnings};
module.exports=Viewport;
-},{"../computed/viewport-meta.js":37,"./audit":3}],"../audits/without-javascript":[function(require,module,exports){
+},{"../computed/viewport-meta.js":38,"./audit.js":3}],"../audits/without-javascript":[function(require,module,exports){
@@ -11511,7 +11858,7 @@ module.exports=Viewport;
'use strict';
-const Audit=require('./audit');
+const Audit=require('./audit.js');
class WithoutJavaScript extends Audit{
@@ -11539,20 +11886,20 @@ const artifact=artifacts.HTMLWithoutJavaScript;
if(artifact.bodyText.trim()===''&&!artifact.hasNoScript){
return{
-rawValue:false,
+score:0,
explanation:'The page body should render some content if its scripts are not available.'};
}
return{
-rawValue:true};
+score:1};
}}
module.exports=WithoutJavaScript;
-},{"./audit":3}],"../audits/works-offline":[function(require,module,exports){
+},{"./audit.js":3}],"../audits/works-offline":[function(require,module,exports){
@@ -11560,8 +11907,8 @@ module.exports=WithoutJavaScript;
'use strict';
-const URL=require('../lib/url-shim');
-const Audit=require('./audit');
+const URL=require('../lib/url-shim.js');
+const Audit=require('./audit.js');
class WorksOffline extends Audit{
@@ -11594,7 +11941,7 @@ warnings.push('You may be not loading offline because your test URL '+
}
return{
-rawValue:passed,
+score:Number(passed),
warnings};
}}
@@ -11602,7 +11949,7 @@ warnings};
module.exports=WorksOffline;
-},{"../lib/url-shim":"url","./audit":3}],"../gather/gatherers/accessibility":[function(require,module,exports){
+},{"../lib/url-shim.js":"url","./audit.js":3}],"../gather/gatherers/accessibility":[function(require,module,exports){
@@ -11612,10 +11959,10 @@ module.exports=WorksOffline;
-const Gatherer=require('./gatherer');
+const Gatherer=require('./gatherer.js');
-const axeLibSource="/*! aXe v3.1.2\n * Copyright (c) 2018 Deque Systems, Inc.\n *\n * Your use of this Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/.\n *\n * This entire copyright notice must appear in every copy of this file you\n * distribute or in any file that contains substantial portions of this source\n * code.\n */\n!function e(window){var document=window.document,T=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e};function c(e){this.name=\"SupportError\",this.cause=e.cause,this.message=\"`\"+e.cause+\"` - feature unsupported in your environment.\",e.ruleId&&(this.ruleId=e.ruleId,this.message+=\" Skipping \"+this.ruleId+\" rule.\"),this.stack=(new Error).stack}(axe=axe||{}).version=\"3.1.2\",\"function\"==typeof define&&define.amd&&define(\"axe-core\",[],function(){\"use strict\";return axe}),\"object\"===(\"undefined\"==typeof module?\"undefined\":T(module))&&module.exports&&\"function\"==typeof e.toString&&(axe.source=\"(\"+e.toString()+')(typeof window === \"object\" ? window : this);',module.exports=axe),\"function\"==typeof window.getComputedStyle&&(window.axe=axe),(c.prototype=Object.create(Error.prototype)).constructor=c,axe.imports={};var utils=axe.utils={},i={},p=(T=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var a in r)Object.prototype.hasOwnProperty.call(r,a)&&(e[a]=r[a])}return e});function t(e,t,r){\"use strict\";var a,n;for(a=0,n=e.length;a<n;a++)t[r](e[a])}function r(e){this.brand=\"axe\",this.application=\"axeAPI\",this.tagExclude=[\"experimental\"],this.defaultConfig=e,this._init(),this._defaultLocale=null}r.prototype._setDefaultLocale=function(){if(!this._defaultLocale){for(var e={checks:{},rules:{}},t=Object.keys(this.data.checks),r=0;r<t.length;r++){var a=t[r],n=this.data.checks[a].messages,o=n.pass,i=n.fail,s=n.incomplete;e.checks[a]={pass:o,fail:i,incomplete:s}}for(var l=Object.keys(this.data.rules),u=0;u<l.length;u++){var c=l[u],d=this.data.rules[c],m=d.description,p=d.help;e.rules[c]={description:m,help:p}}this._defaultLocale=e}},r.prototype._resetLocale=function(){var e=this._defaultLocale;e&&this.applyLocale(e)};function f(n,e,o){var t=void 0,i=void 0;return o.performanceTimer&&(t=\"mark_rule_start_\"+n.id,i=\"mark_rule_end_\"+n.id,axe.utils.performanceTimer.mark(t)),function(r,a){n.run(e,o,function(e){o.performanceTimer&&(axe.utils.performanceTimer.mark(i),axe.utils.performanceTimer.measure(\"rule_\"+n.id,t,i)),r(e)},function(e){if(o.debug)a(e);else{var t=Object.assign(new m(n),{result:axe.constants.CANTTELL,description:\"An error occured while running this rule\",message:e.message,stack:e.stack,error:e});r(t)}})}}function o(e,t,r){var a=e.brand,n=e.application;return axe.constants.helpUrlBase+a+\"/\"+(r||axe.version.substring(0,axe.version.lastIndexOf(\".\")))+\"/\"+t+\"?application=\"+n}function d(e){\"use strict\";this.id=e.id,this.data=null,this.relatedNodes=[],this.result=null}function a(e){\"use strict\";return\"string\"==typeof e?new Function(\"return \"+e+\";\")():e}function n(e){e&&(this.id=e.id,this.configure(e))}r.prototype._applyCheckLocale=function(e){for(var t,r,a,n,o=Object.keys(e),i=0;i<o.length;i++){var s=o[i];if(!this.data.checks[s])throw new Error('Locale provided for unknown check: \"'+s+'\"');this.data.checks[s]=(t=this.data.checks[s],r=e[s],n=a=void 0,a=r.pass,n=r.fail,\"string\"==typeof a&&(a=axe.imports.doT.compile(a)),\"string\"==typeof n&&(n=axe.imports.doT.compile(n)),p({},t,{messages:{pass:a||t.messages.pass,fail:n||t.messages.fail,incomplete:\"object\"===T(t.messages.incomplete)?p({},t.messages.incomplete,r.incomplete):r.incomplete}}))}},r.prototype._applyRuleLocale=function(e){for(var t,r,a,n,o=Object.keys(e),i=0;i<o.length;i++){var s=o[i];if(!this.data.rules[s])throw new Error('Locale provided for unknown rule: \"'+s+'\"');this.data.rules[s]=(t=this.data.rules[s],r=e[s],n=a=void 0,a=r.help,n=r.description,\"string\"==typeof a&&(a=axe.imports.doT.compile(a)),\"string\"==typeof n&&(n=axe.imports.doT.compile(n)),p({},t,{help:a||t.help,description:n||t.description}))}},r.prototype.applyLocale=function(e){this._setDefaultLocale(),e.checks&&this._applyCheckLocale(e.checks),e.rules&&this._applyRuleLocale(e.rules)},r.prototype._init=function(){var e=function(e){\"use strict\";var t;return e?(t=axe.utils.clone(e)).commons=e.commons:t={},t.reporter=t.reporter||null,t.rules=t.rules||[],t.checks=t.checks||[],t.data=p({checks:{},rules:{}},t.data),t}(this.defaultConfig);axe.commons=e.commons,this.reporter=e.reporter,this.commands={},this.rules=[],this.checks={},t(e.rules,this,\"addRule\"),t(e.checks,this,\"addCheck\"),this.data={},this.data.checks=e.data&&e.data.checks||{},this.data.rules=e.data&&e.data.rules||{},this.data.failureSummaries=e.data&&e.data.failureSummaries||{},this.data.incompleteFallbackMessage=e.data&&e.data.incompleteFallbackMessage||\"\",this._constructHelpUrls()},r.prototype.registerCommand=function(e){\"use strict\";this.commands[e.id]=e.callback},r.prototype.addRule=function(e){\"use strict\";e.metadata&&(this.data.rules[e.id]=e.metadata);var t=this.getRule(e.id);t?t.configure(e):this.rules.push(new h(e,this))},r.prototype.addCheck=function(e){\"use strict\";var t=e.metadata;\"object\"===(void 0===t?\"undefined\":T(t))&&(this.data.checks[e.id]=t,\"object\"===T(t.messages)&&Object.keys(t.messages).filter(function(e){return t.messages.hasOwnProperty(e)&&\"string\"==typeof t.messages[e]}).forEach(function(e){0===t.messages[e].indexOf(\"function\")&&(t.messages[e]=new Function(\"return \"+t.messages[e]+\";\")())})),this.checks[e.id]?this.checks[e.id].configure(e):this.checks[e.id]=new n(e)},r.prototype.run=function(o,i,s,l){\"use strict\";this.normalizeOptions(i),axe._selectCache=[];var e,r,a,t=(e=this.rules,r=o,a=i,e.reduce(function(e,t){return axe.utils.ruleShouldRun(t,r,a)&&(t.preload?e.later.push(t):e.now.push(t)),e},{now:[],later:[]})),n=t.now,u=t.later,c=axe.utils.queue();n.forEach(function(e){c.defer(f(e,o,i))});var d=axe.utils.queue();u.length&&d.defer(function(r,e){axe.utils.preload(i).then(function(e){var t=e[0];r(t)}).catch(function(e){console.warn(\"Couldn't load preload assets: \",e);r(void 0)})});var m=axe.utils.queue();m.defer(c),m.defer(d),m.then(function(e){var t=e.pop();if(t&&t.length){var r=t[0];r&&(o=p({},o,r))}var a=e[0];if(!u.length)return axe._selectCache=void 0,void s(a.filter(function(e){return!!e}));var n=axe.utils.queue();u.forEach(function(e){var t=f(e,o,i);n.defer(t)}),n.then(function(e){axe._selectCache=void 0,s(a.concat(e).filter(function(e){return!!e}))}).catch(l)}).catch(l)},r.prototype.after=function(e,r){\"use strict\";var a=this.rules;return e.map(function(e){var t=axe.utils.findBy(a,\"id\",e.id);if(!t)throw new Error(\"Result for unknown rule. You may be running mismatch aXe-core versions\");return t.after(e,r)})},r.prototype.getRule=function(t){return this.rules.find(function(e){return e.id===t})},r.prototype.normalizeOptions=function(e){\"use strict\";var t=this;if(\"object\"===T(e.runOnly)){Array.isArray(e.runOnly)&&(e.runOnly={type:\"tag\",values:e.runOnly});var r=e.runOnly;if(r.value&&!r.values&&(r.values=r.value,delete r.value),!Array.isArray(r.values)||0===r.values.length)throw new Error(\"runOnly.values must be a non-empty array\");if([\"rule\",\"rules\"].includes(r.type))r.type=\"rule\",r.values.forEach(function(e){if(!t.getRule(e))throw new Error(\"unknown rule `\"+e+\"` in options.runOnly\")});else{if(![\"tag\",\"tags\",void 0].includes(r.type))throw new Error(\"Unknown runOnly type '\"+r.type+\"'\");r.type=\"tag\";var a=t.rules.reduce(function(e,t){return e.length?e.filter(function(e){return!t.tags.includes(e)}):e},r.values);if(0!==a.length)throw new Error(\"Could not find tags `\"+a.join(\"`, `\")+\"`\")}}return\"object\"===T(e.rules)&&Object.keys(e.rules).forEach(function(e){if(!t.getRule(e))throw new Error(\"unknown rule `\"+e+\"` in options.rules\")}),e},r.prototype.setBranding=function(e){\"use strict\";var t={brand:this.brand,application:this.application};e&&e.hasOwnProperty(\"brand\")&&e.brand&&\"string\"==typeof e.brand&&(this.brand=e.brand),e&&e.hasOwnProperty(\"application\")&&e.application&&\"string\"==typeof e.application&&(this.application=e.application),this._constructHelpUrls(t)},r.prototype._constructHelpUrls=function(){var r=this,a=0<arguments.length&&void 0!==arguments[0]?arguments[0]:null,n=(axe.version.match(/^[1-9][0-9]*\\.[0-9]+/)||[\"x.y\"])[0];this.rules.forEach(function(e){r.data.rules[e.id]||(r.data.rules[e.id]={});var t=r.data.rules[e.id];(\"string\"!=typeof t.helpUrl||a&&t.helpUrl===o(a,e.id,n))&&(t.helpUrl=o(r,e.id,n))})},r.prototype.resetRulesAndChecks=function(){\"use strict\";this._init(),this._resetLocale()},n.prototype.enabled=!0,n.prototype.run=function(e,t,r,a,n){\"use strict\";var o=(t=t||{}).hasOwnProperty(\"enabled\")?t.enabled:this.enabled,i=t.options||this.options;if(o){var s,l=new d(this),u=axe.utils.checkHelper(l,t,a,n);try{s=this.evaluate.call(u,e.actualNode,i,e,r)}catch(e){return void n(e)}u.isAsync||(l.result=s,setTimeout(function(){a(l)},0))}else a(null)},n.prototype.configure=function(t){var r=this;[\"options\",\"enabled\"].filter(function(e){return t.hasOwnProperty(e)}).forEach(function(e){return r[e]=t[e]}),[\"evaluate\",\"after\"].filter(function(e){return t.hasOwnProperty(e)}).forEach(function(e){return r[e]=a(t[e])})};T=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e};function s(e,t,r){\"use strict\";var a,n;e.frames=e.frames||[];var o=document.querySelectorAll(r.shift());e:for(var i=0,s=o.length;i<s;i++){n=o[i];for(var l=0,u=e.frames.length;l<u;l++)if(e.frames[l].node===n){e.frames[l][t].push(r);break e}a={node:n,include:[],exclude:[]},r&&a[t].push(r),e.frames.push(a)}}function l(t,e){\"use strict\";for(var r,a,n=[],o=0,i=t[e].length;o<i;o++){if(\"string\"==typeof(r=t[e][o])){a=Array.from(document.querySelectorAll(r)),n=n.concat(a.map(function(e){return axe.utils.getNodeFromTree(t.flatTree[0],e)}));break}!r||!r.length||r instanceof Node?r instanceof Node&&(r.documentElement instanceof Node?n.push(t.flatTree[0]):n.push(axe.utils.getNodeFromTree(t.flatTree[0],r))):1<r.length?s(t,e,r):(a=Array.from(document.querySelectorAll(r[0])),n=n.concat(a.map(function(e){return axe.utils.getNodeFromTree(t.flatTree[0],e)})))}return n.filter(function(e){return e})}function u(e){\"use strict\";var t,r,a,n=this;this.frames=[],this.initiator=!e||\"boolean\"!=typeof e.initiator||e.initiator,this.page=!1,e=function(e){if(e&&\"object\"===(void 0===e?\"undefined\":T(e))||e instanceof NodeList){if(e instanceof Node)return{include:[e],exclude:[]};if(e.hasOwnProperty(\"include\")||e.hasOwnProperty(\"exclude\"))return{include:e.include&&+e.include.length?e.include:[document],exclude:e.exclude||[]};if(e.length===+e.length)return{include:e,exclude:[]}}return\"string\"==typeof e?{include:[e],exclude:[]}:{include:[document],exclude:[]}}(e),this.flatTree=axe.utils.getFlattenedTree((r=(t=e).include,a=t.exclude,(Array.from(r).concat(Array.from(a)).reduce(function(e,t){return e||(t instanceof Element?t.ownerDocument:t instanceof Document?t:void 0)},null)||document).documentElement)),this.exclude=e.exclude,this.include=e.include,this.include=l(this,\"include\"),this.exclude=l(this,\"exclude\"),axe.utils.select(\"frame, iframe\",this).forEach(function(e){var t,r;ve(e,n)&&(t=n.frames,r=e.actualNode,axe.utils.isHidden(r)||axe.utils.findBy(t,\"node\",r)||t.push({node:r,include:[],exclude:[]}))}),1===this.include.length&&this.include[0].actualNode===document.documentElement&&(this.page=!0);var o=function(e){if(0===e.include.length){if(0===e.frames.length){var t=axe.utils.respondable.isInFrame()?\"frame\":\"page\";return new Error(\"No elements found for include in \"+t+\" Context\")}e.frames.forEach(function(e,t){if(0===e.include.length)return new Error(\"No elements found for include in Context of frame \"+t)})}}(this);if(o instanceof Error)throw o;Array.isArray(this.include)||(this.include=Array.from(this.include)),this.include.sort(axe.utils.nodeSorter)}function m(e){\"use strict\";this.id=e.id,this.result=axe.constants.NA,this.pageLevel=e.pageLevel,this.impact=null,this.nodes=[]}function h(e,t){\"use strict\";this._audit=t,this.id=e.id,this.selector=e.selector||\"*\",this.excludeHidden=\"boolean\"!=typeof e.excludeHidden||e.excludeHidden,this.enabled=\"boolean\"!=typeof e.enabled||e.enabled,this.pageLevel=\"boolean\"==typeof e.pageLevel&&e.pageLevel,this.any=e.any||[],this.all=e.all||[],this.none=e.none||[],this.tags=e.tags||[],this.preload=!!e.preload,e.matches&&(this.matches=a(e.matches))}h.prototype.matches=function(){\"use strict\";return!0},h.prototype.gather=function(e){\"use strict\";var t=axe.utils.select(this.selector,e);return this.excludeHidden?t.filter(function(e){return!axe.utils.isHidden(e.actualNode)}):t},h.prototype.runChecks=function(t,n,o,i,r,e){\"use strict\";var s=this,l=axe.utils.queue();this[t].forEach(function(e){var r=s._audit.checks[e.id||e],a=axe.utils.getCheckOption(r,s.id,o);l.defer(function(e,t){r.run(n,a,i,e,t)})}),l.then(function(e){e=e.filter(function(e){return e}),r({type:t,results:e})}).catch(e)},h.prototype.run=function(a,o,e,t){var i=this,r=axe.utils.queue(),s=new m(this),n=\"mark_runchecks_start_\"+this.id,l=\"mark_runchecks_end_\"+this.id,u=void 0;try{u=this.gather(a).filter(function(e){return i.matches(e.actualNode,e)})}catch(e){return void t(new c({cause:e,ruleId:this.id}))}o.performanceTimer&&(axe.log(\"gather (\",u.length,\"):\",axe.utils.performanceTimer.timeElapsed()+\"ms\"),axe.utils.performanceTimer.mark(n)),u.forEach(function(n){r.defer(function(t,r){var e=axe.utils.queue();[\"any\",\"all\",\"none\"].forEach(function(r){e.defer(function(e,t){i.runChecks(r,n,o,a,e,t)})}),e.then(function(e){if(e.length){var r=!1,a={};e.forEach(function(e){var t=e.results.filter(function(e){return e});(a[e.type]=t).length&&(r=!0)}),r&&(a.node=new axe.utils.DqElement(n.actualNode,o),s.nodes.push(a))}t()}).catch(function(e){return r(e)})})}),o.performanceTimer&&(axe.utils.performanceTimer.mark(l),axe.utils.performanceTimer.measure(\"runchecks_\"+this.id,n,l)),r.then(function(){return e(s)}).catch(function(e){return t(e)})},h.prototype.after=function(s,l){\"use strict\";var r,e,a,t,n=(r=this,axe.utils.getAllChecks(r).map(function(e){var t=r._audit.checks[e.id||e];return t&&\"function\"==typeof t.after?t:null}).filter(Boolean)),u=this.id;return n.forEach(function(e){var t,r,a,n=(t=s.nodes,r=e.id,a=[],t.forEach(function(e){axe.utils.getAllChecks(e).forEach(function(e){e.id===r&&a.push(e)})}),a),o=axe.utils.getCheckOption(e,u,l),i=e.after(n,o);n.forEach(function(e){-1===i.indexOf(e)&&(e.filtered=!0)})}),s.nodes=(a=[\"any\",\"all\",\"none\"],t=(e=s).nodes.filter(function(t){var r=0;return a.forEach(function(e){t[e]=t[e].filter(function(e){return!0!==e.filtered}),r+=t[e].length}),0<r}),e.pageLevel&&t.length&&(t=[t.reduce(function(t,r){if(t)return a.forEach(function(e){t[e].push.apply(t[e],r[e])}),t})]),t),s},h.prototype.configure=function(e){\"use strict\";e.hasOwnProperty(\"selector\")&&(this.selector=e.selector),e.hasOwnProperty(\"excludeHidden\")&&(this.excludeHidden=\"boolean\"!=typeof e.excludeHidden||e.excludeHidden),e.hasOwnProperty(\"enabled\")&&(this.enabled=\"boolean\"!=typeof e.enabled||e.enabled),e.hasOwnProperty(\"pageLevel\")&&(this.pageLevel=\"boolean\"==typeof e.pageLevel&&e.pageLevel),e.hasOwnProperty(\"any\")&&(this.any=e.any),e.hasOwnProperty(\"all\")&&(this.all=e.all),e.hasOwnProperty(\"none\")&&(this.none=e.none),e.hasOwnProperty(\"tags\")&&(this.tags=e.tags),e.hasOwnProperty(\"matches\")&&(\"string\"==typeof e.matches?this.matches=new Function(\"return \"+e.matches+\";\")():this.matches=e.matches)},function(axe){var o={helpUrlBase:\"https://dequeuniversity.com/rules/\",results:[],resultGroups:[],resultGroupMap:{},impact:Object.freeze([\"minor\",\"moderate\",\"serious\",\"critical\"]),preloadAssets:Object.freeze([\"cssom\"]),preloadAssetsTimeout:1e4};[{name:\"NA\",value:\"inapplicable\",priority:0,group:\"inapplicable\"},{name:\"PASS\",value:\"passed\",priority:1,group:\"passes\"},{name:\"CANTTELL\",value:\"cantTell\",priority:2,group:\"incomplete\"},{name:\"FAIL\",value:\"failed\",priority:3,group:\"violations\"}].forEach(function(e){var t=e.name,r=e.value,a=e.priority,n=e.group;o[t]=r,o[t+\"_PRIO\"]=a,o[t+\"_GROUP\"]=n,o.results[a]=r,o.resultGroups[a]=n,o.resultGroupMap[r]=n}),Object.freeze(o.results),Object.freeze(o.resultGroups),Object.freeze(o.resultGroupMap),Object.freeze(o),Object.defineProperty(axe,\"constants\",{value:o,enumerable:!0,configurable:!1,writable:!1})}(axe);T=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e};axe.imports.axios=function(r){var a={};function n(e){if(a[e])return a[e].exports;var t=a[e]={exports:{},id:e,loaded:!1};return r[e].call(t.exports,t,t.exports,n),t.loaded=!0,t.exports}return n.m=r,n.c=a,n.p=\"\",n(0)}([function(e,t,r){e.exports=r(1)},function(e,t,r){\"use strict\";var utils=r(2),a=r(3),n=r(5),o=r(6);function i(e){var t=new n(e),r=a(n.prototype.request,t);return utils.extend(r,n.prototype,t),utils.extend(r,t),r}var s=i(o);s.Axios=n,s.create=function(e){return i(utils.merge(o,e))},s.Cancel=r(23),s.CancelToken=r(24),s.isCancel=r(20),s.all=function(e){return Promise.all(e)},s.spread=r(25),e.exports=s,e.exports.default=s},function(e,t,r){\"use strict\";var n=r(3),a=r(4),o=Object.prototype.toString;function i(e){return\"[object Array]\"===o.call(e)}function s(e){return null!==e&&\"object\"===(void 0===e?\"undefined\":T(e))}function l(e){return\"[object Function]\"===o.call(e)}function u(e,t){if(null!=e)if(\"object\"!==(void 0===e?\"undefined\":T(e))&&(e=[e]),i(e))for(var r=0,a=e.length;r<a;r++)t.call(null,e[r],r,e);else for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&t.call(null,e[n],n,e)}e.exports={isArray:i,isArrayBuffer:function(e){return\"[object ArrayBuffer]\"===o.call(e)},isBuffer:a,isFormData:function(e){return\"undefined\"!=typeof FormData&&e instanceof FormData},isArrayBufferView:function(e){return\"undefined\"!=typeof ArrayBuffer&&ArrayBuffer.isView?ArrayBuffer.isView(e):e&&e.buffer&&e.buffer instanceof ArrayBuffer},isString:function(e){return\"string\"==typeof e},isNumber:function(e){return\"number\"==typeof e},isObject:s,isUndefined:function(e){return void 0===e},isDate:function(e){return\"[object Date]\"===o.call(e)},isFile:function(e){return\"[object File]\"===o.call(e)},isBlob:function(e){return\"[object Blob]\"===o.call(e)},isFunction:l,isStream:function(e){return s(e)&&l(e.pipe)},isURLSearchParams:function(e){return\"undefined\"!=typeof URLSearchParams&&e instanceof URLSearchParams},isStandardBrowserEnv:function(){return(\"undefined\"==typeof navigator||\"ReactNative\"!==navigator.product)&&void 0!==window&&void 0!==document},forEach:u,merge:function r(){var a={};function e(e,t){\"object\"===T(a[t])&&\"object\"===(void 0===e?\"undefined\":T(e))?a[t]=r(a[t],e):a[t]=e}for(var t=0,n=arguments.length;t<n;t++)u(arguments[t],e);return a},extend:function(r,e,a){return u(e,function(e,t){r[t]=a&&\"function\"==typeof e?n(e,a):e}),r},trim:function(e){return e.replace(/^\\s*/,\"\").replace(/\\s*$/,\"\")}}},function(e,t){\"use strict\";e.exports=function(r,a){return function(){for(var e=new Array(arguments.length),t=0;t<e.length;t++)e[t]=arguments[t];return r.apply(a,e)}}},function(e,t){function r(e){return!!e.constructor&&\"function\"==typeof e.constructor.isBuffer&&e.constructor.isBuffer(e)}e.exports=function(e){return null!=e&&(r(e)||\"function\"==typeof(t=e).readFloatLE&&\"function\"==typeof t.slice&&r(t.slice(0,0))||!!e._isBuffer);var t}},function(e,t,r){\"use strict\";var a=r(6),utils=r(2),n=r(17),o=r(18);function i(e){this.defaults=e,this.interceptors={request:new n,response:new n}}i.prototype.request=function(e){\"string\"==typeof e&&(e=utils.merge({url:arguments[0]},arguments[1])),(e=utils.merge(a,{method:\"get\"},this.defaults,e)).method=e.method.toLowerCase();var t=[o,void 0],r=Promise.resolve(e);for(this.interceptors.request.forEach(function(e){t.unshift(e.fulfilled,e.rejected)}),this.interceptors.response.forEach(function(e){t.push(e.fulfilled,e.rejected)});t.length;)r=r.then(t.shift(),t.shift());return r},utils.forEach([\"delete\",\"get\",\"head\",\"options\"],function(r){i.prototype[r]=function(e,t){return this.request(utils.merge(t||{},{method:r,url:e}))}}),utils.forEach([\"post\",\"put\",\"patch\"],function(a){i.prototype[a]=function(e,t,r){return this.request(utils.merge(r||{},{method:a,url:e,data:t}))}}),e.exports=i},function(e,t,r){\"use strict\";var utils=r(2),a=r(7),n={\"Content-Type\":\"application/x-www-form-urlencoded\"};function o(e,t){!utils.isUndefined(e)&&utils.isUndefined(e[\"Content-Type\"])&&(e[\"Content-Type\"]=t)}var i,s={adapter:(\"undefined\"!=typeof XMLHttpRequest?i=r(8):\"undefined\"!=typeof process&&(i=r(8)),i),transformRequest:[function(e,t){return a(t,\"Content-Type\"),utils.isFormData(e)||utils.isArrayBuffer(e)||utils.isBuffer(e)||utils.isStream(e)||utils.isFile(e)||utils.isBlob(e)?e:utils.isArrayBufferView(e)?e.buffer:utils.isURLSearchParams(e)?(o(t,\"application/x-www-form-urlencoded;charset=utf-8\"),e.toString()):utils.isObject(e)?(o(t,\"application/json;charset=utf-8\"),JSON.stringify(e)):e}],transformResponse:[function(e){if(\"string\"==typeof e)try{e=JSON.parse(e)}catch(e){}return e}],timeout:0,xsrfCookieName:\"XSRF-TOKEN\",xsrfHeaderName:\"X-XSRF-TOKEN\",maxContentLength:-1,validateStatus:function(e){return 200<=e&&e<300},headers:{common:{Accept:\"application/json, text/plain, */*\"}}};utils.forEach([\"delete\",\"get\",\"head\"],function(e){s.headers[e]={}}),utils.forEach([\"post\",\"put\",\"patch\"],function(e){s.headers[e]=utils.merge(n)}),e.exports=s},function(e,t,r){\"use strict\";var utils=r(2);e.exports=function(r,a){utils.forEach(r,function(e,t){t!==a&&t.toUpperCase()===a.toUpperCase()&&(r[a]=e,delete r[t])})}},function(e,t,m){\"use strict\";var utils=m(2),p=m(9),f=m(12),h=m(13),g=m(14),b=m(10),y=void 0!==window&&window.btoa&&window.btoa.bind(window)||m(15);e.exports=function(d){return new Promise(function(r,a){var n=d.data,o=d.headers;utils.isFormData(n)&&delete o[\"Content-Type\"];var i=new XMLHttpRequest,e=\"onreadystatechange\",s=!1;if(void 0===window||!window.XDomainRequest||\"withCredentials\"in i||g(d.url)||(i=new window.XDomainRequest,e=\"onload\",s=!0,i.onprogress=function(){},i.ontimeout=function(){}),d.auth){var t=d.auth.username||\"\",l=d.auth.password||\"\";o.Authorization=\"Basic \"+y(t+\":\"+l)}if(i.open(d.method.toUpperCase(),f(d.url,d.params,d.paramsSerializer),!0),i.timeout=d.timeout,i[e]=function(){if(i&&(4===i.readyState||s)&&(0!==i.status||i.responseURL&&0===i.responseURL.indexOf(\"file:\"))){var e=\"getAllResponseHeaders\"in i?h(i.getAllResponseHeaders()):null,t={data:d.responseType&&\"text\"!==d.responseType?i.response:i.responseText,status:1223===i.status?204:i.status,statusText:1223===i.status?\"No Content\":i.statusText,headers:e,config:d,request:i};p(r,a,t),i=null}},i.onerror=function(){a(b(\"Network Error\",d,null,i)),i=null},i.ontimeout=function(){a(b(\"timeout of \"+d.timeout+\"ms exceeded\",d,\"ECONNABORTED\",i)),i=null},utils.isStandardBrowserEnv()){var u=m(16),c=(d.withCredentials||g(d.url))&&d.xsrfCookieName?u.read(d.xsrfCookieName):void 0;c&&(o[d.xsrfHeaderName]=c)}if(\"setRequestHeader\"in i&&utils.forEach(o,function(e,t){void 0===n&&\"content-type\"===t.toLowerCase()?delete o[t]:i.setRequestHeader(t,e)}),d.withCredentials&&(i.withCredentials=!0),d.responseType)try{i.responseType=d.responseType}catch(e){if(\"json\"!==d.responseType)throw e}\"function\"==typeof d.onDownloadProgress&&i.addEventListener(\"progress\",d.onDownloadProgress),\"function\"==typeof d.onUploadProgress&&i.upload&&i.upload.addEventListener(\"progress\",d.onUploadProgress),d.cancelToken&&d.cancelToken.promise.then(function(e){i&&(i.abort(),a(e),i=null)}),void 0===n&&(n=null),i.send(n)})}},function(e,t,r){\"use strict\";var n=r(10);e.exports=function(e,t,r){var a=r.config.validateStatus;r.status&&a&&!a(r.status)?t(n(\"Request failed with status code \"+r.status,r.config,null,r.request,r)):e(r)}},function(e,t,r){\"use strict\";var i=r(11);e.exports=function(e,t,r,a,n){var o=new Error(e);return i(o,t,r,a,n)}},function(e,t){\"use strict\";e.exports=function(e,t,r,a,n){return e.config=t,r&&(e.code=r),e.request=a,e.response=n,e}},function(e,t,r){\"use strict\";var utils=r(2);function o(e){return encodeURIComponent(e).replace(/%40/gi,\"@\").replace(/%3A/gi,\":\").replace(/%24/g,\"$\").replace(/%2C/gi,\",\").replace(/%20/g,\"+\").replace(/%5B/gi,\"[\").replace(/%5D/gi,\"]\")}e.exports=function(e,t,r){if(!t)return e;var a;if(r)a=r(t);else if(utils.isURLSearchParams(t))a=t.toString();else{var n=[];utils.forEach(t,function(e,t){null!=e&&(utils.isArray(e)?t+=\"[]\":e=[e],utils.forEach(e,function(e){utils.isDate(e)?e=e.toISOString():utils.isObject(e)&&(e=JSON.stringify(e)),n.push(o(t)+\"=\"+o(e))}))}),a=n.join(\"&\")}return a&&(e+=(-1===e.indexOf(\"?\")?\"?\":\"&\")+a),e}},function(e,t,r){\"use strict\";var utils=r(2),o=[\"age\",\"authorization\",\"content-length\",\"content-type\",\"etag\",\"expires\",\"from\",\"host\",\"if-modified-since\",\"if-unmodified-since\",\"last-modified\",\"location\",\"max-forwards\",\"proxy-authorization\",\"referer\",\"retry-after\",\"user-agent\"];e.exports=function(e){var t,r,a,n={};return e&&utils.forEach(e.split(\"\\n\"),function(e){if(a=e.indexOf(\":\"),t=utils.trim(e.substr(0,a)).toLowerCase(),r=utils.trim(e.substr(a+1)),t){if(n[t]&&0<=o.indexOf(t))return;n[t]=\"set-cookie\"===t?(n[t]?n[t]:[]).concat([r]):n[t]?n[t]+\", \"+r:r}}),n}},function(e,t,r){\"use strict\";var utils=r(2);e.exports=utils.isStandardBrowserEnv()?function(){var r,a=/(msie|trident)/i.test(navigator.userAgent),n=document.createElement(\"a\");function o(e){var t=e;return a&&(n.setAttribute(\"href\",t),t=n.href),n.setAttribute(\"href\",t),{href:n.href,protocol:n.protocol?n.protocol.replace(/:$/,\"\"):\"\",host:n.host,search:n.search?n.search.replace(/^\\?/,\"\"):\"\",hash:n.hash?n.hash.replace(/^#/,\"\"):\"\",hostname:n.hostname,port:n.port,pathname:\"/\"===n.pathname.charAt(0)?n.pathname:\"/\"+n.pathname}}return r=o(window.location.href),function(e){var t=utils.isString(e)?o(e):e;return t.protocol===r.protocol&&t.host===r.host}}():function(){return!0}},function(e,t){\"use strict\";function s(){this.message=\"String contains an invalid character\"}(s.prototype=new Error).code=5,s.prototype.name=\"InvalidCharacterError\",e.exports=function(e){for(var t,r,a=String(e),n=\"\",o=0,i=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";a.charAt(0|o)||(i=\"=\",o%1);n+=i.charAt(63&t>>8-o%1*8)){if(255<(r=a.charCodeAt(o+=.75)))throw new s;t=t<<8|r}return n}},function(e,t,r){\"use strict\";var utils=r(2);e.exports=utils.isStandardBrowserEnv()?{write:function(e,t,r,a,n,o){var i=[];i.push(e+\"=\"+encodeURIComponent(t)),utils.isNumber(r)&&i.push(\"expires=\"+new Date(r).toGMTString()),utils.isString(a)&&i.push(\"path=\"+a),utils.isString(n)&&i.push(\"domain=\"+n),!0===o&&i.push(\"secure\"),document.cookie=i.join(\"; \")},read:function(e){var t=document.cookie.match(new RegExp(\"(^|;\\\\s*)(\"+e+\")=([^;]*)\"));return t?decodeURIComponent(t[3]):null},remove:function(e){this.write(e,\"\",Date.now()-864e5)}}:{write:function(){},read:function(){return null},remove:function(){}}},function(e,t,r){\"use strict\";var utils=r(2);function a(){this.handlers=[]}a.prototype.use=function(e,t){return this.handlers.push({fulfilled:e,rejected:t}),this.handlers.length-1},a.prototype.eject=function(e){this.handlers[e]&&(this.handlers[e]=null)},a.prototype.forEach=function(t){utils.forEach(this.handlers,function(e){null!==e&&t(e)})},e.exports=a},function(e,t,r){\"use strict\";var utils=r(2),a=r(19),n=r(20),o=r(6),i=r(21),s=r(22);function l(e){e.cancelToken&&e.cancelToken.throwIfRequested()}e.exports=function(t){return l(t),t.baseURL&&!i(t.url)&&(t.url=s(t.baseURL,t.url)),t.headers=t.headers||{},t.data=a(t.data,t.headers,t.transformRequest),t.headers=utils.merge(t.headers.common||{},t.headers[t.method]||{},t.headers||{}),utils.forEach([\"delete\",\"get\",\"head\",\"post\",\"put\",\"patch\",\"common\"],function(e){delete t.headers[e]}),(t.adapter||o.adapter)(t).then(function(e){return l(t),e.data=a(e.data,e.headers,t.transformResponse),e},function(e){return n(e)||(l(t),e&&e.response&&(e.response.data=a(e.response.data,e.response.headers,t.transformResponse))),Promise.reject(e)})}},function(e,t,r){\"use strict\";var utils=r(2);e.exports=function(t,r,e){return utils.forEach(e,function(e){t=e(t,r)}),t}},function(e,t){\"use strict\";e.exports=function(e){return!(!e||!e.__CANCEL__)}},function(e,t){\"use strict\";e.exports=function(e){return/^([a-z][a-z\\d\\+\\-\\.]*:)?\\/\\//i.test(e)}},function(e,t){\"use strict\";e.exports=function(e,t){return t?e.replace(/\\/+$/,\"\")+\"/\"+t.replace(/^\\/+/,\"\"):e}},function(e,t){\"use strict\";function r(e){this.message=e}r.prototype.toString=function(){return\"Cancel\"+(this.message?\": \"+this.message:\"\")},r.prototype.__CANCEL__=!0,e.exports=r},function(e,t,r){\"use strict\";var a=r(23);function n(e){if(\"function\"!=typeof e)throw new TypeError(\"executor must be a function.\");var t;this.promise=new Promise(function(e){t=e});var r=this;e(function(e){r.reason||(r.reason=new a(e),t(r.reason))})}n.prototype.throwIfRequested=function(){if(this.reason)throw this.reason},n.source=function(){var t;return{token:new n(function(e){t=e}),cancel:t}},e.exports=n},function(e,t){\"use strict\";e.exports=function(t){return function(e){return t.apply(null,e)}}}]),axe.imports.doT=function(e,t,r,a,n){var o=Function(\"return this\")(),i=o.doT;!function(){\"use strict\";var l,u={name:\"doT\",version:\"1.1.1\",templateSettings:{evaluate:/\\{\\{([\\s\\S]+?(\\}?)+)\\}\\}/g,interpolate:/\\{\\{=([\\s\\S]+?)\\}\\}/g,encode:/\\{\\{!([\\s\\S]+?)\\}\\}/g,use:/\\{\\{#([\\s\\S]+?)\\}\\}/g,useParams:/(^|[^\\w$])def(?:\\.|\\[[\\'\\\"])([\\w$\\.]+)(?:[\\'\\\"]\\])?\\s*\\:\\s*([\\w$\\.]+|\\\"[^\\\"]+\\\"|\\'[^\\']+\\'|\\{[^\\}]+\\})/g,define:/\\{\\{##\\s*([\\w\\.$]+)\\s*(\\:|=)([\\s\\S]+?)#\\}\\}/g,defineParams:/^\\s*([\\w$]+):([\\s\\S]+)/,conditional:/\\{\\{\\?(\\?)?\\s*([\\s\\S]*?)\\s*\\}\\}/g,iterate:/\\{\\{~\\s*(?:\\}\\}|([\\s\\S]+?)\\s*\\:\\s*([\\w$]+)\\s*(?:\\:\\s*([\\w$]+))?\\s*\\}\\})/g,varname:\"it\",strip:!0,append:!0,selfcontained:!1,doNotSkipEncoded:!1},template:void 0,compile:void 0,log:!0};u.encodeHTMLSource=function(e){var t={\"&\":\"&#38;\",\"<\":\"&#60;\",\">\":\"&#62;\",'\"':\"&#34;\",\"'\":\"&#39;\",\"/\":\"&#47;\"},r=e?/[&<>\"'\\/]/g:/&(?!#?\\w+;)|<|>|\"|'|\\//g;return function(e){return e?e.toString().replace(r,function(e){return t[e]||e}):\"\"}},(l=function(){return this||(0,eval)(\"this\")}()).doT=u;var c={append:{start:\"'+(\",end:\")+'\",startencode:\"'+encodeHTML(\"},split:{start:\"';out+=(\",end:\");out+='\",startencode:\"';out+=encodeHTML(\"}},d=/$^/;function m(e){return e.replace(/\\\\('|\\\\)/g,\"$1\").replace(/[\\r\\t\\n]/g,\" \")}u.template=function(e,t,r){var a,n,o=(t=t||u.templateSettings).append?c.append:c.split,i=0,s=t.use||t.define?function a(n,e,o){return(\"string\"==typeof e?e:e.toString()).replace(n.define||d,function(e,a,t,r){return 0===a.indexOf(\"def.\")&&(a=a.substring(4)),a in o||(\":\"===t?(n.defineParams&&r.replace(n.defineParams,function(e,t,r){o[a]={arg:t,text:r}}),a in o||(o[a]=r)):new Function(\"def\",\"def['\"+a+\"']=\"+r)(o)),\"\"}).replace(n.use||d,function(e,t){n.useParams&&(t=t.replace(n.useParams,function(e,t,r,a){if(o[r]&&o[r].arg&&a){var n=(r+\":\"+a).replace(/'|\\\\/g,\"_\");return o.__exp=o.__exp||{},o.__exp[n]=o[r].text.replace(new RegExp(\"(^|[^\\\\w$])\"+o[r].arg+\"([^\\\\w$])\",\"g\"),\"$1\"+a+\"$2\"),t+\"def.__exp['\"+n+\"']\"}}));var r=new Function(\"def\",\"return \"+t)(o);return r?a(n,r,o):r})}(t,e,r||{}):e;s=(\"var out='\"+(t.strip?s.replace(/(^|\\r|\\n)\\t* +| +\\t*(\\r|\\n|$)/g,\" \").replace(/\\r|\\n|\\t|\\/\\*[\\s\\S]*?\\*\\//g,\"\"):s).replace(/'|\\\\/g,\"\\\\$&\").replace(t.interpolate||d,function(e,t){return o.start+m(t)+o.end}).replace(t.encode||d,function(e,t){return a=!0,o.startencode+m(t)+o.end}).replace(t.conditional||d,function(e,t,r){return t?r?\"';}else if(\"+m(r)+\"){out+='\":\"';}else{out+='\":r?\"';if(\"+m(r)+\"){out+='\":\"';}out+='\"}).replace(t.iterate||d,function(e,t,r,a){return t?(i+=1,n=a||\"i\"+i,t=m(t),\"';var arr\"+i+\"=\"+t+\";if(arr\"+i+\"){var \"+r+\",\"+n+\"=-1,l\"+i+\"=arr\"+i+\".length-1;while(\"+n+\"<l\"+i+\"){\"+r+\"=arr\"+i+\"[\"+n+\"+=1];out+='\"):\"';} } out+='\"}).replace(t.evaluate||d,function(e,t){return\"';\"+m(t)+\"out+='\"})+\"';return out;\").replace(/\\n/g,\"\\\\n\").replace(/\\t/g,\"\\\\t\").replace(/\\r/g,\"\\\\r\").replace(/(\\s|;|\\}|^|\\{)out\\+='';/g,\"$1\").replace(/\\+''/g,\"\"),a&&(t.selfcontained||!l||l._encodeHTML||(l._encodeHTML=u.encodeHTMLSource(t.doNotSkipEncoded)),s=\"var encodeHTML = typeof _encodeHTML !== 'undefined' ? _encodeHTML : (\"+u.encodeHTMLSource.toString()+\"(\"+(t.doNotSkipEncoded||\"\")+\"));\"+s);try{return new Function(t.varname,s)}catch(e){throw\"undefined\"!=typeof console&&console.log(\"Could not create a template function: \"+s),e}},u.compile=function(e,t){return u.template(e,null,t)}}();var s=o.doT;return delete o.doT,i&&(o.doT=i),s}();T=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e};function g(t,r){\"use strict\";if(t=t||function(){},r=r||axe.log,!axe._audit)throw new Error(\"No audit configured\");var a=axe.utils.queue(),n=[];Object.keys(axe.plugins).forEach(function(e){a.defer(function(t){var r=function(e){n.push(e),t()};try{axe.plugins[e].cleanup(t,r)}catch(e){r(e)}})});var e=axe.utils.getFlattenedTree(document.body);axe.utils.querySelectorAll(e,\"iframe, frame\").forEach(function(r){a.defer(function(e,t){return axe.utils.sendCommandToFrame(r.actualNode,{command:\"cleanup-plugin\"},e,t)})}),a.then(function(e){0===n.length?t(e):r(n)}).catch(r)}function b(e,t,r){\"use strict\";var a=r,n=function(e){e instanceof Error==!1&&(e=new Error(e)),r(e)},o=e&&e.context||{};o.hasOwnProperty(\"include\")&&!o.include.length&&(o.include=[document]);var i=e&&e.options||{};switch(e.command){case\"rules\":return x(o,i,function(e,t){a(e),t()},n);case\"cleanup-plugin\":return g(a,n);default:if(axe._audit&&axe._audit.commands&&axe._audit.commands[e.command])return axe._audit.commands[e.command](e,r)}}function y(e){\"use strict\";this._run=e.run,this._collect=e.collect,this._registry={},e.commands.forEach(function(e){axe._audit.registerCommand(e)})}axe.log=function(){\"use strict\";\"object\"===(\"undefined\"==typeof console?\"undefined\":T(console))&&console.log&&Function.prototype.apply.call(console.log,console,arguments)},axe.cleanup=g,axe.configure=function(e){\"use strict\";var t;if(!(t=axe._audit))throw new Error(\"No audit configured\");e.reporter&&(\"function\"==typeof e.reporter||w[e.reporter])&&(t.reporter=e.reporter),e.checks&&e.checks.forEach(function(e){t.addCheck(e)});var r=[];e.rules&&e.rules.forEach(function(e){r.push(e.id),t.addRule(e)}),e.disableOtherRules&&t.rules.forEach(function(e){!1===r.includes(e.id)&&(e.enabled=!1)}),void 0!==e.branding?t.setBranding(e.branding):t._constructHelpUrls(),e.tagExclude&&(t.tagExclude=e.tagExclude),e.locale&&t.applyLocale(e.locale)},axe.getRules=function(e){\"use strict\";var t=(e=e||[]).length?axe._audit.rules.filter(function(t){return!!e.filter(function(e){return-1!==t.tags.indexOf(e)}).length}):axe._audit.rules,r=axe._audit.data.rules||{};return t.map(function(e){var t=r[e.id]||{};return{ruleId:e.id,description:t.description,help:t.help,helpUrl:t.helpUrl,tags:e.tags}})},axe._load=function(e){\"use strict\";axe.utils.respondable.subscribe(\"axe.ping\",function(e,t,r){r({axe:!0})}),axe.utils.respondable.subscribe(\"axe.start\",b),axe._audit=new r(e)},(axe=axe||{}).plugins={},y.prototype.run=function(){\"use strict\";return this._run.apply(this,arguments)},y.prototype.collect=function(){\"use strict\";return this._collect.apply(this,arguments)},y.prototype.cleanup=function(e){\"use strict\";var r=axe.utils.queue(),a=this;Object.keys(this._registry).forEach(function(t){r.defer(function(e){a._registry[t].cleanup(e)})}),r.then(function(){e()})},y.prototype.add=function(e){\"use strict\";this._registry[e.id]=e},axe.registerPlugin=function(e){\"use strict\";axe.plugins[e.id]=new y(e)};var v,w={};function k(){axe._tree=void 0,axe._selectorData=void 0}function x(r,a,n,o){\"use strict\";try{r=new u(r),axe._tree=r.flatTree,axe._selectorData=axe.utils.getSelectorData(r.flatTree)}catch(e){return k(),o(e)}var e=axe.utils.queue(),i=axe._audit;a.performanceTimer&&axe.utils.performanceTimer.auditStart(),r.frames.length&&!1!==a.iframes&&e.defer(function(e,t){axe.utils.collectResultsFromFrames(r,a,\"rules\",null,e,t)});var s=void 0;e.defer(function(e,t){a.restoreScroll&&(s=axe.utils.getScrollState()),i.run(r,a,e,t)}),e.then(function(e){try{s&&axe.utils.setScrollState(s),a.performanceTimer&&axe.utils.performanceTimer.auditEnd();var t=axe.utils.mergeResults(e.map(function(e){return{results:e}}));r.initiator&&((t=i.after(t,a)).forEach(axe.utils.publishMetaData),t=t.map(axe.utils.finalizeRuleResult));try{n(t,k)}catch(e){k(),axe.log(e)}}catch(e){k(),o(e)}}).catch(function(e){k(),o(e)})}axe.getReporter=function(e){\"use strict\";return\"string\"==typeof e&&w[e]?w[e]:\"function\"==typeof e?e:v},axe.addReporter=function(e,t,r){\"use strict\";w[e]=t,r&&(v=t)},axe.reset=function(){\"use strict\";var e=axe._audit;if(!e)throw new Error(\"No audit configured\");e.resetRulesAndChecks()},axe._runRules=x;T=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e};var E=function(){};function A(e,t,r){\"use strict\";var a=new TypeError(\"axe.run arguments are invalid\");if(!function(e){switch(!0){case\"string\"==typeof e:case Array.isArray(e):case Node&&e instanceof Node:case NodeList&&e instanceof NodeList:return!0;case\"object\"!==(void 0===e?\"undefined\":T(e)):return!1;case void 0!==e.include:case void 0!==e.exclude:case\"number\"==typeof e.length:return!0;default:return!1}}(e)){if(void 0!==r)throw a;r=t,t=e,e=document}if(\"object\"!==(void 0===t?\"undefined\":T(t))){if(void 0!==r)throw a;r=t,t={}}if(\"function\"!=typeof r&&void 0!==r)throw a;return{context:e,options:t,callback:r||E}}axe.run=function(e,n,o){\"use strict\";if(!axe._audit)throw new Error(\"No audit configured\");var t=A(e,n,o);e=t.context,n=t.options,o=t.callback,n.reporter=n.reporter||axe._audit.reporter||\"v1\",n.performanceTimer&&axe.utils.performanceTimer.start();var r=void 0,i=E,s=E;return\"function\"==typeof Promise&&o===E&&(r=new Promise(function(e,t){i=t,s=e})),axe._runRules(e,n,function(e,t){var r=function(e){t();try{o(null,e)}catch(e){axe.log(e)}s(e)};n.performanceTimer&&axe.utils.performanceTimer.end();try{var a=axe.getReporter(n.reporter)(e,n,r);void 0!==a&&r(a)}catch(e){t(),o(e),i(e)}},function(e){o(e),i(e)}),r},i.failureSummary=function(e){\"use strict\";var r={};return r.none=e.none.concat(e.all),r.any=e.any,Object.keys(r).map(function(e){if(r[e].length){var t=axe._audit.data.failureSummaries[e];return t&&\"function\"==typeof t.failureMessage?t.failureMessage(r[e].map(function(e){return e.message||\"\"})):void 0}}).filter(function(e){return void 0!==e}).join(\"\\n\\n\")},i.incompleteFallbackMessage=function(){\"use strict\";return axe._audit.data.incompleteFallbackMessage()};T=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e};var N=axe.constants.resultGroups;i.processAggregate=function(e,r){var t=axe.utils.aggregateResult(e);return t.timestamp=(new Date).toISOString(),t.url=window.location.href,N.forEach(function(e){r.resultTypes&&!r.resultTypes.includes(e)&&(t[e]||[]).forEach(function(e){Array.isArray(e.nodes)&&0<e.nodes.length&&(e.nodes=[e.nodes[0]])}),t[e]=(t[e]||[]).map(function(t){return t=Object.assign({},t),Array.isArray(t.nodes)&&0<t.nodes.length&&(t.nodes=t.nodes.map(function(e){return\"object\"===T(e.node)&&(e.html=e.node.source,r.elementRef&&!e.node.fromFrame&&(e.element=e.node.element),(!1!==r.selectors||e.node.fromFrame)&&(e.target=e.node.selector),r.xpath&&(e.xpath=e.node.xpath)),delete e.result,delete e.node,function(t,r){\"use strict\";[\"any\",\"all\",\"none\"].forEach(function(e){Array.isArray(t[e])&&t[e].filter(function(e){return Array.isArray(e.relatedNodes)}).forEach(function(e){e.relatedNodes=e.relatedNodes.map(function(e){var t={html:e.source};return r.elementRef&&!e.fromFrame&&(t.element=e.element),(!1!==r.selectors||e.fromFrame)&&(t.target=e.selector),r.xpath&&(t.xpath=e.xpath),t})})})}(e,r),e})),N.forEach(function(e){return delete t[e]}),delete t.pageLevel,delete t.result,t})}),t},axe.addReporter(\"na\",function(e,t,r){\"use strict\";\"function\"==typeof t&&(r=t,t={});var a=i.processAggregate(e,t);r({violations:a.violations,passes:a.passes,incomplete:a.incomplete,inapplicable:a.inapplicable,timestamp:a.timestamp,url:a.url})}),axe.addReporter(\"no-passes\",function(e,t,r){\"use strict\";\"function\"==typeof t&&(r=t,t={}),t.resultTypes=[\"violations\"];var a=i.processAggregate(e,t);r({violations:a.violations,timestamp:a.timestamp,url:a.url})}),axe.addReporter(\"raw\",function(e,t,r){\"use strict\";\"function\"==typeof t&&(r=t,t={}),r(e)}),axe.addReporter(\"v1\",function(e,t,r){\"use strict\";\"function\"==typeof t&&(r=t,t={});var a=i.processAggregate(e,t);a.violations.forEach(function(e){return e.nodes.forEach(function(e){e.failureSummary=i.failureSummary(e)})}),r({violations:a.violations,passes:a.passes,incomplete:a.incomplete,inapplicable:a.inapplicable,timestamp:a.timestamp,url:a.url})}),axe.addReporter(\"v2\",function(e,t,r){\"use strict\";\"function\"==typeof t&&(r=t,t={});var a=i.processAggregate(e,t);r({violations:a.violations,passes:a.passes,incomplete:a.incomplete,inapplicable:a.inapplicable,timestamp:a.timestamp,url:a.url})},!0),axe.utils.aggregate=function(t,e,r){e=e.slice(),r&&e.push(r);var a=e.map(function(e){return t.indexOf(e)}).sort();return t[a.pop()]};var j=axe.constants,z=j.CANTTELL_PRIO,q=j.FAIL_PRIO,S=[];S[axe.constants.PASS_PRIO]=!0,S[axe.constants.CANTTELL_PRIO]=null,S[axe.constants.FAIL_PRIO]=!1;var C=[\"any\",\"all\",\"none\"];function R(r,a){return C.reduce(function(e,t){return e[t]=(r[t]||[]).map(function(e){return a(e,t)}),e},{})}function I(e,t,r){var a=Object.assign({},t);a.nodes=(a[r]||[]).concat(),axe.constants.resultGroups.forEach(function(e){delete a[e]}),e[r].push(a)}axe.utils.aggregateChecks=function(e){var r=Object.assign({},e);R(r,function(e,t){var r=void 0===e.result?-1:S.indexOf(e.result);e.priority=-1!==r?r:axe.constants.CANTTELL_PRIO,\"none\"===t&&(e.priority===axe.constants.PASS_PRIO?e.priority=axe.constants.FAIL_PRIO:e.priority===axe.constants.FAIL_PRIO&&(e.priority=axe.constants.PASS_PRIO))});var a={all:r.all.reduce(function(e,t){return Math.max(e,t.priority)},0),none:r.none.reduce(function(e,t){return Math.max(e,t.priority)},0),any:r.any.reduce(function(e,t){return Math.min(e,t.priority)},4)%4};r.priority=Math.max(a.all,a.none,a.any);var n=[];return C.forEach(function(t){r[t]=r[t].filter(function(e){return e.priority===r.priority&&e.priority===a[t]}),r[t].forEach(function(e){return n.push(e.impact)})}),[z,q].includes(r.priority)?r.impact=axe.utils.aggregate(axe.constants.impact,n):r.impact=null,R(r,function(e){delete e.result,delete e.priority}),r.result=axe.constants.results[r.priority],delete r.priority,r},axe.utils.aggregateNodeResults=function(e){var r={};if((e=e.map(function(e){if(e.any&&e.all&&e.none)return axe.utils.aggregateChecks(e);if(Array.isArray(e.node))return axe.utils.finalizeRuleResult(e);throw new TypeError(\"Invalid Result type\")}))&&e.length){var t=e.map(function(e){return e.result});r.result=axe.utils.aggregate(axe.constants.results,t,r.result)}else r.result=\"inapplicable\";axe.constants.resultGroups.forEach(function(e){return r[e]=[]}),e.forEach(function(e){var t=axe.constants.resultGroupMap[e.result];r[t].push(e)});var a=axe.constants.FAIL_GROUP;if(0===r[a].length&&(a=axe.constants.CANTTELL_GROUP),0<r[a].length){var n=r[a].map(function(e){return e.impact});r.impact=axe.utils.aggregate(axe.constants.impact,n)||null}else r.impact=null;return r},axe.utils.aggregateResult=function(e){var r={};return axe.constants.resultGroups.forEach(function(e){return r[e]=[]}),e.forEach(function(t){t.error?I(r,t,axe.constants.CANTTELL_GROUP):t.result===axe.constants.NA?I(r,t,axe.constants.NA_GROUP):axe.constants.resultGroups.forEach(function(e){Array.isArray(t[e])&&0<t[e].length&&I(r,t,e)})}),r},axe.utils.areStylesSet=function e(t,r,a){\"use strict\";var n=window.getComputedStyle(t,null),o=!1;return!!n&&(r.forEach(function(e){n.getPropertyValue(e.property)===e.value&&(o=!0)}),!!o||!(t.nodeName.toUpperCase()===a.toUpperCase()||!t.parentNode)&&e(t.parentNode,r,a))},axe.utils.checkHelper=function(t,r,a,n){\"use strict\";return{isAsync:!1,async:function(){return this.isAsync=!0,function(e){e instanceof Error==!1?(t.result=e,a(t)):n(e)}},data:function(e){t.data=e},relatedNodes:function(e){e=e instanceof Node?[e]:axe.utils.toArray(e),t.relatedNodes=e.map(function(e){return new axe.utils.DqElement(e,r)})}}};T=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e};function O(e,t){\"use strict\";var r;return axe._tree&&(r=axe.utils.getSelector(t)),new Error(e+\": \"+(r||t))}function L(e,t,r){var a,n;this._fromFrame=!!r,this.spec=r||{},t&&t.absolutePaths&&(this._options={toRoot:!0}),this.source=void 0!==this.spec.source?this.spec.source:((n=(a=e).outerHTML)||\"function\"!=typeof XMLSerializer||(n=(new XMLSerializer).serializeToString(a)),function(e,t){if(t=t||300,e.length>t){var r=e.indexOf(\">\");e=e.substring(0,r+1)}return e}(n||\"\")),this._element=e}axe.utils.clone=function(e){\"use strict\";var t,r,a=e;if(null!==e&&\"object\"===(void 0===e?\"undefined\":T(e)))if(Array.isArray(e))for(a=[],t=0,r=e.length;t<r;t++)a[t]=axe.utils.clone(e[t]);else for(t in a={},e)a[t]=axe.utils.clone(e[t]);return a},axe.utils.sendCommandToFrame=function(t,r,a,n){\"use strict\";var o=t.contentWindow;if(!o)return axe.log(\"Frame does not have a content window\",t),void a(null);var i=setTimeout(function(){i=setTimeout(function(){r.debug?n(O(\"No response from frame\",t)):a(null)},0)},500);axe.utils.respondable(o,\"axe.ping\",null,void 0,function(){clearTimeout(i);var e=r.options&&r.options.frameWaitTime||6e4;i=setTimeout(function(){n(O(\"Axe in frame timed out\",t))},e),axe.utils.respondable(o,\"axe.start\",r,void 0,function(e){clearTimeout(i),e instanceof Error==!1?a(e):n(e)})})},axe.utils.collectResultsFromFrames=function(e,t,r,o,a,n){\"use strict\";var i=axe.utils.queue();e.frames.forEach(function(a){var n={options:t,command:r,parameter:o,context:{initiator:!1,page:e.page,include:a.include||[],exclude:a.exclude||[]}};i.defer(function(t,e){var r=a.node;axe.utils.sendCommandToFrame(r,n,function(e){if(e)return t({results:e,frameElement:r,frame:axe.utils.getSelector(r)});t(null)},e)})}),i.then(function(e){a(axe.utils.mergeResults(e,t))}).catch(n)},axe.utils.contains=function(e,t){\"use strict\";return e.shadowId||t.shadowId?function t(e,r){return e.shadowId===r.shadowId||!!e.children.find(function(e){return t(e,r)})}(e,t):\"function\"==typeof e.actualNode.contains?e.actualNode.contains(t.actualNode):!!(16&e.actualNode.compareDocumentPosition(t.actualNode))},function(axe){function e(){this.pseudos={},this.attrEqualityMods={},this.ruleNestingOperators={},this.substitutesEnabled=!1}function o(e){return\"a\"<=e&&e<=\"f\"||\"A\"<=e&&e<=\"F\"||\"0\"<=e&&e<=\"9\"}e.prototype.registerSelectorPseudos=function(e){for(var t=0,r=arguments.length;t<r;t++)e=arguments[t],this.pseudos[e]=\"selector\";return this},e.prototype.unregisterSelectorPseudos=function(e){for(var t=0,r=arguments.length;t<r;t++)e=arguments[t],delete this.pseudos[e];return this},e.prototype.registerNumericPseudos=function(e){for(var t=0,r=arguments.length;t<r;t++)e=arguments[t],this.pseudos[e]=\"numeric\";return this},e.prototype.unregisterNumericPseudos=function(e){for(var t=0,r=arguments.length;t<r;t++)e=arguments[t],delete this.pseudos[e];return this},e.prototype.registerNestingOperators=function(e){for(var t=0,r=arguments.length;t<r;t++)e=arguments[t],this.ruleNestingOperators[e]=!0;return this},e.prototype.unregisterNestingOperators=function(e){for(var t=0,r=arguments.length;t<r;t++)e=arguments[t],delete this.ruleNestingOperators[e];return this},e.prototype.registerAttrEqualityMods=function(e){for(var t=0,r=arguments.length;t<r;t++)e=arguments[t],this.attrEqualityMods[e]=!0;return this},e.prototype.unregisterAttrEqualityMods=function(e){for(var t=0,r=arguments.length;t<r;t++)e=arguments[t],delete this.attrEqualityMods[e];return this},e.prototype.enableSubstitutes=function(){return this.substitutesEnabled=!0,this},e.prototype.disableSubstitutes=function(){return this.substitutesEnabled=!1,this};var s={\"!\":!0,'\"':!0,\"#\":!0,$:!0,\"%\":!0,\"&\":!0,\"'\":!0,\"(\":!0,\")\":!0,\"*\":!0,\"+\":!0,\",\":!0,\".\":!0,\"/\":!0,\";\":!0,\"<\":!0,\"=\":!0,\">\":!0,\"?\":!0,\"@\":!0,\"[\":!0,\"\\\\\":!0,\"]\":!0,\"^\":!0,\"`\":!0,\"{\":!0,\"|\":!0,\"}\":!0,\"~\":!0},i={\"\\n\":\"\\\\n\",\"\\r\":\"\\\\r\",\"\\t\":\"\\\\t\",\"\\f\":\"\\\\f\",\"\\v\":\"\\\\v\"},y={n:\"\\n\",r:\"\\r\",t:\"\\t\",f:\"\\f\",\"\\\\\":\"\\\\\",\"'\":\"'\"},v={n:\"\\n\",r:\"\\r\",t:\"\\t\",f:\"\\f\",\"\\\\\":\"\\\\\",'\"':'\"'};function t(l,u,c,d,n,m){var p,f,h,g,b;return g=l.length,p=null,h=function(e,t){var r,a,n;for(n=\"\",u++,p=l.charAt(u);u<g;){if(p===e)return u++,n;if(\"\\\\\"===p)if(u++,(p=l.charAt(u))===e)n+=e;else if(r=t[p])n+=r;else{if(o(p)){for(a=p,u++,p=l.charAt(u);o(p);)a+=p,u++,p=l.charAt(u);\" \"===p&&(u++,p=l.charAt(u)),n+=String.fromCharCode(parseInt(a,16));continue}n+=p}else n+=p;u++,p=l.charAt(u)}return n},f=function(){var e,t=\"\";for(p=l.charAt(u);u<g;){if(\"a\"<=(e=p)&&e<=\"z\"||\"A\"<=e&&e<=\"Z\"||\"0\"<=e&&e<=\"9\"||\"-\"===e||\"_\"===e)t+=p;else{if(\"\\\\\"!==p)return t;if(g<=++u)throw Error(\"Expected symbol but end of file reached.\");if(p=l.charAt(u),s[p])t+=p;else{if(o(p)){var r=p;for(u++,p=l.charAt(u);o(p);)r+=p,u++,p=l.charAt(u);\" \"===p&&(u++,p=l.charAt(u)),t+=String.fromCharCode(parseInt(r,16));continue}t+=p}}u++,p=l.charAt(u)}return t},b=function(){p=l.charAt(u);for(var e=!1;\" \"===p||\"\\t\"===p||\"\\n\"===p||\"\\r\"===p||\"\\f\"===p;)e=!0,u++,p=l.charAt(u);return e},this.parse=function(){var e=this.parseSelector();if(u<g)throw Error('Rule expected but \"'+l.charAt(u)+'\" found.');return e},this.parseSelector=function(){var e,t=e=this.parseSingleSelector();for(p=l.charAt(u);\",\"===p;){if(u++,b(),\"selectors\"!==e.type&&(e={type:\"selectors\",selectors:[t]}),!(t=this.parseSingleSelector()))throw Error('Rule expected after \",\".');e.selectors.push(t)}return e},this.parseSingleSelector=function(){b();var e={type:\"ruleSet\"},t=this.parseRule();if(!t)return null;for(var r=e;t&&(t.type=\"rule\",r.rule=t,r=t,b(),p=l.charAt(u),!(g<=u||\",\"===p||\")\"===p));)if(n[p]){var a=p;if(u++,b(),!(t=this.parseRule()))throw Error('Rule expected after \"'+a+'\".');t.nestingOperator=a}else(t=this.parseRule())&&(t.nestingOperator=null);return e},this.parseRule=function(){for(var e,t=null;u<g;)if(\"*\"===(p=l.charAt(u)))u++,(t=t||{}).tagName=\"*\";else if(\"a\"<=(e=p)&&e<=\"z\"||\"A\"<=e&&e<=\"Z\"||\"-\"===e||\"_\"===e||\"\\\\\"===p)(t=t||{}).tagName=f();else if(\".\"===p)u++,((t=t||{}).classNames=t.classNames||[]).push(f());else if(\"#\"===p)u++,(t=t||{}).id=f();else if(\"[\"===p){u++,b();var r={name:f()};if(b(),\"]\"===p)u++;else{var a=\"\";if(d[p]&&(a=p,u++,p=l.charAt(u)),g<=u)throw Error('Expected \"=\" but end of file reached.');if(\"=\"!==p)throw Error('Expected \"=\" but \"'+p+'\" found.');r.operator=a+\"=\",u++,b();var n=\"\";if(r.valueType=\"string\",'\"'===p)n=h('\"',v);else if(\"'\"===p)n=h(\"'\",y);else if(m&&\"$\"===p)u++,n=f(),r.valueType=\"substitute\";else{for(;u<g&&\"]\"!==p;)n+=p,u++,p=l.charAt(u);n=n.trim()}if(b(),g<=u)throw Error('Expected \"]\" but end of file reached.');if(\"]\"!==p)throw Error('Expected \"]\" but \"'+p+'\" found.');u++,r.value=n}((t=t||{}).attrs=t.attrs||[]).push(r)}else{if(\":\"!==p)break;u++;var o=f(),i={name:o};if(\"(\"===p){u++;var s=\"\";if(b(),\"selector\"===c[o])i.valueType=\"selector\",s=this.parseSelector();else{if(i.valueType=c[o]||\"string\",'\"'===p)s=h('\"',v);else if(\"'\"===p)s=h(\"'\",y);else if(m&&\"$\"===p)u++,s=f(),i.valueType=\"substitute\";else{for(;u<g&&\")\"!==p;)s+=p,u++,p=l.charAt(u);s=s.trim()}b()}if(g<=u)throw Error('Expected \")\" but end of file reached.');if(\")\"!==p)throw Error('Expected \")\" but \"'+p+'\" found.');u++,i.value=s}((t=t||{}).pseudos=t.pseudos||[]).push(i)}return t},this}e.prototype.parse=function(e){return new t(e,0,this.pseudos,this.attrEqualityMods,this.ruleNestingOperators,this.substitutesEnabled).parse()},e.prototype.escapeIdentifier=function(e){for(var t=\"\",r=0,a=e.length;r<a;){var n=e.charAt(r);if(s[n])t+=\"\\\\\"+n;else if(\"_\"===n||\"-\"===n||\"A\"<=n&&n<=\"Z\"||\"a\"<=n&&n<=\"z\"||0!==r&&\"0\"<=n&&n<=\"9\")t+=n;else{var o=n.charCodeAt(0);if(55296==(63488&o)){var i=e.charCodeAt(r++);if(55296!=(64512&o)||56320!=(64512&i))throw Error(\"UCS-2(decode): illegal sequence\");o=((1023&o)<<10)+(1023&i)+65536}t+=\"\\\\\"+o.toString(16)+\" \"}r++}return t},e.prototype.escapeStr=function(e){for(var t,r,a=\"\",n=0,o=e.length;n<o;)'\"'===(t=e.charAt(n))?t='\\\\\"':\"\\\\\"===t?t=\"\\\\\\\\\":(r=i[t])&&(t=r),a+=t,n++;return'\"'+a+'\"'},e.prototype.render=function(e){return this._renderEntity(e).trim()},e.prototype._renderEntity=function(e){var t,r,a;switch(a=\"\",e.type){case\"ruleSet\":for(t=e.rule,r=[];t;)t.nestingOperator&&r.push(t.nestingOperator),r.push(this._renderEntity(t)),t=t.rule;a=r.join(\" \");break;case\"selectors\":a=e.selectors.map(this._renderEntity,this).join(\", \");break;case\"rule\":e.tagName&&(a=\"*\"===e.tagName?\"*\":this.escapeIdentifier(e.tagName)),e.id&&(a+=\"#\"+this.escapeIdentifier(e.id)),e.classNames&&(a+=e.classNames.map(function(e){return\".\"+this.escapeIdentifier(e)},this).join(\"\")),e.attrs&&(a+=e.attrs.map(function(e){return e.operator?\"substitute\"===e.valueType?\"[\"+this.escapeIdentifier(e.name)+e.operator+\"$\"+e.value+\"]\":\"[\"+this.escapeIdentifier(e.name)+e.operator+this.escapeStr(e.value)+\"]\":\"[\"+this.escapeIdentifier(e.name)+\"]\"},this).join(\"\")),e.pseudos&&(a+=e.pseudos.map(function(e){return e.valueType?\"selector\"===e.valueType?\":\"+this.escapeIdentifier(e.name)+\"(\"+this._renderEntity(e.value)+\")\":\"substitute\"===e.valueType?\":\"+this.escapeIdentifier(e.name)+\"($\"+e.value+\")\":\"numeric\"===e.valueType?\":\"+this.escapeIdentifier(e.name)+\"(\"+e.value+\")\":\":\"+this.escapeIdentifier(e.name)+\"(\"+this.escapeIdentifier(e.value)+\")\":\":\"+this.escapeIdentifier(e.name)},this).join(\"\"));break;default:throw Error('Unknown entity type: \"'+e.type(NaN))}return a};var r=new e;r.registerNestingOperators(\">\"),axe.utils.cssParser=r}(axe),L.prototype={get selector(){return this.spec.selector||[axe.utils.getSelector(this.element,this._options)]},get xpath(){return this.spec.xpath||[axe.utils.getXpath(this.element)]},get element(){return this._element},get fromFrame(){return this._fromFrame},toJSON:function(){\"use strict\";return{selector:this.selector,source:this.source,xpath:this.xpath}}},L.fromFrame=function(e,t,r){return e.selector.unshift(r.selector),e.xpath.unshift(r.xpath),new axe.utils.DqElement(r.element,t,e)},axe.utils.DqElement=L,axe.utils.matchesSelector=function(){\"use strict\";var r;return function(e,t){return r&&e[r]||(r=function(e){var t,r,a=[\"matches\",\"matchesSelector\",\"mozMatchesSelector\",\"webkitMatchesSelector\",\"msMatchesSelector\"],n=a.length;for(t=0;t<n;t++)if(e[r=a[t]])return r}(e)),e[r](t)}}(),axe.utils.escapeSelector=function(e){\"use strict\";for(var t,r=String(e),a=r.length,n=-1,o=\"\",i=r.charCodeAt(0);++n<a;)0!=(t=r.charCodeAt(n))?o+=1<=t&&t<=31||127==t||0==n&&48<=t&&t<=57||1==n&&48<=t&&t<=57&&45==i?\"\\\\\"+t.toString(16)+\" \":(0!=n||1!=a||45!=t)&&(128<=t||45==t||95==t||48<=t&&t<=57||65<=t&&t<=90||97<=t&&t<=122)?r.charAt(n):\"\\\\\"+r.charAt(n):o+=\"�\";return o},axe.utils.extendMetaData=function(t,r){Object.assign(t,r),Object.keys(r).filter(function(e){return\"function\"==typeof r[e]}).forEach(function(e){t[e]=null;try{t[e]=r[e](t)}catch(e){}})},axe.utils.finalizeRuleResult=function(e){return Object.assign(e,axe.utils.aggregateNodeResults(e.nodes)),delete e.nodes,e};var axe;T=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e};function P(e,t){return{shadowId:t,children:[],actualNode:e}}axe.utils.findBy=function(e,t,r){if(Array.isArray(e))return e.find(function(e){return\"object\"===(void 0===e?\"undefined\":T(e))&&e[t]===r})},(axe=axe||{utils:{}}).utils.getFlattenedTree=function(e,a){var t,r,n;function o(e,t){var r=axe.utils.getFlattenedTree(t,a);return r&&(e=e.concat(r)),e}if(e.documentElement&&(e=e.documentElement),n=e.nodeName.toLowerCase(),axe.utils.isShadowRoot(e))return t=P(e,a),a=\"a\"+Math.random().toString().substring(2),r=Array.from(e.shadowRoot.childNodes),t.children=r.reduce(o,[]),[t];if(\"content\"===n)return(r=Array.from(e.getDistributedNodes())).reduce(o,[]);if(\"slot\"!==n||\"function\"!=typeof e.assignedNodes)return 1===e.nodeType?(t=P(e,a),r=Array.from(e.childNodes),t.children=r.reduce(o,[]),[t]):3===e.nodeType?[P(e)]:void 0;(r=Array.from(e.assignedNodes())).length||(r=function(e){var t=[];for(e=e.firstChild;e;)t.push(e),e=e.nextSibling;return t}(e));window.getComputedStyle(e);return r.reduce(o,[])},axe.utils.getNodeFromTree=function(e,r){var a;return e.actualNode===r?e:(e.children.forEach(function(e){var t;e.actualNode===r?a=e:(t=axe.utils.getNodeFromTree(e,r))&&(a=t)}),a)},axe.utils.getAllChecks=function(e){\"use strict\";return[].concat(e.any||[]).concat(e.all||[]).concat(e.none||[])},axe.utils.getCheckOption=function(e,t,r){var a=((r.rules&&r.rules[t]||{}).checks||{})[e.id],n=(r.checks||{})[e.id],o=e.enabled,i=e.options;return n&&(n.hasOwnProperty(\"enabled\")&&(o=n.enabled),n.hasOwnProperty(\"options\")&&(i=n.options)),a&&(a.hasOwnProperty(\"enabled\")&&(o=a.enabled),a.hasOwnProperty(\"options\")&&(i=a.options)),{enabled:o,options:i,absolutePaths:r.absolutePaths}};var U=function(e,t){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return function(e,t){var r=[],a=!0,n=!1,o=void 0;try{for(var i,s=e[Symbol.iterator]();!(a=(i=s.next()).done)&&(r.push(i.value),!t||r.length!==t);a=!0);}catch(e){n=!0,o=e}finally{try{!a&&s.return&&s.return()}finally{if(n)throw o}}return r}(e,t);throw new TypeError(\"Invalid attempt to destructure non-iterable instance\")};function F(e,t){return[e.substring(0,t),e.substring(t)]}function _(e){return e.replace(/\\s+$/,\"\")}axe.utils.getFriendlyUriEnd=function(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:\"\",t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{};if(!(e.length<=1||\"data:\"===e.substr(0,5)||\"javascript:\"===e.substr(0,11)||e.includes(\"?\"))){var r=t.currentDomain,a=t.maxLength,n=void 0===a?25:a,o=function(e){var t=e,r=\"\",a=\"\",n=\"\",o=\"\",i=\"\";if(e.includes(\"#\")){var s=F(e,e.indexOf(\"#\")),l=U(s,2);e=l[0],i=l[1]}if(e.includes(\"?\")){var u=F(e,e.indexOf(\"?\")),c=U(u,2);e=c[0],o=c[1]}if(e.includes(\"://\")){var d=e.split(\"://\"),m=U(d,2);r=m[0];var p=F(e=m[1],e.indexOf(\"/\")),f=U(p,2);a=f[0],e=f[1]}else if(\"//\"===e.substr(0,2)){var h=F(e=e.substr(2),e.indexOf(\"/\")),g=U(h,2);a=g[0],e=g[1]}if(\"www.\"===a.substr(0,4)&&(a=a.substr(4)),a&&a.includes(\":\")){var b=F(a,a.indexOf(\":\")),y=U(b,2);a=y[0],n=y[1]}return{original:t,protocol:r,domain:a,port:n,path:e,query:o,hash:i}}(e),i=o.path,s=o.domain,l=o.hash,u=i.substr(i.substr(0,i.length-2).lastIndexOf(\"/\")+1);if(l)return u&&(u+l).length<=n?_(u+l):u.length<2&&2<l.length&&l.length<=n?_(l):void 0;if(s&&s.length<n&&i.length<=1)return _(s+i);if(i===\"/\"+u&&s&&r&&s!==r&&(s+i).length<=n)return _(s+i);var c=u.lastIndexOf(\".\");return(-1===c||1<c)&&(-1!==c||2<u.length)&&u.length<=n&&!u.match(/index(\\.[a-zA-Z]{2-4})?/)&&!function(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:\"\";return 0!==e.length&&(e.match(/[0-9]/g)||\"\").length>=e.length/2}(u)?_(u):void 0}},axe.utils.getRootNode=function(e){var t=e.getRootNode&&e.getRootNode()||document;return t===e&&(t=document),t};var H,D=axe.utils.escapeSelector,M=void 0,V=[\"class\",\"style\",\"id\",\"selected\",\"checked\",\"disabled\",\"tabindex\",\"aria-checked\",\"aria-selected\",\"aria-invalid\",\"aria-activedescendant\",\"aria-busy\",\"aria-disabled\",\"aria-expanded\",\"aria-grabbed\",\"aria-pressed\",\"aria-valuenow\"],B=31;function G(e,t){var r=t.name,a=void 0;if(-1!==r.indexOf(\"href\")||-1!==r.indexOf(\"src\")){var n=axe.utils.getFriendlyUriEnd(e.getAttribute(r));if(n){var o=encodeURI(n);if(!o)return;a=D(t.name)+'$=\"'+o+'\"'}else a=D(t.name)+'=\"'+e.getAttribute(r)+'\"'}else a=D(r)+'=\"'+D(t.value)+'\"';return a}function Y(e,t){return e.count<t.count?-1:e.count===t.count?0:1}function W(e){return!V.includes(e.name)&&-1===e.name.indexOf(\":\")&&(!e.value||e.value.length<B)}function $(t,r){var e=t.parentNode&&Array.from(t.parentNode.children||\"\")||[];return e.find(function(e){return e!==t&&axe.utils.matchesSelector(e,r)})?\":nth-child(\"+(1+e.indexOf(t))+\")\":\"\"}function X(e){if(e.getAttribute(\"id\")){var t=e.getRootNode&&e.getRootNode()||document,r=\"#\"+D(e.getAttribute(\"id\")||\"\");return r.match(/player_uid_/)||1!==t.querySelectorAll(r).length?void 0:r}}function K(e){return void 0===M&&(M=axe.utils.isXHTML(document)),D(M?e.localName:e.nodeName.toLowerCase())}function J(e,t){var r,a,n,o,i,s,l,u,c,d,m=\"\",p=void 0,f=(r=e,n=[],o=(a=t).classes,i=a.tags,r.classList&&Array.from(r.classList).forEach(function(e){var t=D(e);o[t]<i[r.nodeName]&&n.push({name:t,count:o[t],species:\"class\"})}),n.sort(Y)),h=(s=e,u=[],c=(l=t).attributes,d=l.tags,s.attributes&&Array.from(s.attributes).filter(W).forEach(function(e){var t=G(s,e);t&&c[t]<d[s.nodeName]&&u.push({name:t,count:c[t],species:\"attribute\"})}),u.sort(Y));return f.length&&1===f[0].count?p=[f[0]]:h.length&&1===h[0].count?(p=[h[0]],m=K(e)):((p=f.concat(h)).sort(Y),(p=p.slice(0,3)).some(function(e){return\"class\"===e.species})?p.sort(function(e,t){return e.species!==t.species&&\"class\"===e.species?-1:e.species===t.species?0:1}):m=K(e)),m+p.reduce(function(e,t){switch(t.species){case\"class\":return e+\".\"+t.name;case\"attribute\":return e+\"[\"+t.name+\"]\"}return e},\"\")}function Z(e,t,r){if(!axe._selectorData)throw new Error(\"Expect axe._selectorData to be set up\");var a=t.toRoot,n=void 0!==a&&a,o=void 0,i=void 0;do{var s=X(e);s||(s=J(e,axe._selectorData),s+=$(e,s)),o=o?s+\" > \"+o:s,i=i?i.filter(function(e){return axe.utils.matchesSelector(e,o)}):Array.from(r.querySelectorAll(o)),e=e.parentElement}while((1<i.length||n)&&e&&11!==e.nodeType);return 1===i.length?o:-1!==o.indexOf(\" > \")?\":root\"+o.substring(o.indexOf(\" > \")):\":root\"}axe.utils.getSelectorData=function(e){for(var a={classes:{},tags:{},attributes:{}},n=(e=Array.isArray(e)?e:[e]).slice(),o=[],t=function(){var e=n.pop(),r=e.actualNode;if(r.querySelectorAll){var t=r.nodeName;a.tags[t]?a.tags[t]++:a.tags[t]=1,r.classList&&Array.from(r.classList).forEach(function(e){var t=D(e);a.classes[t]?a.classes[t]++:a.classes[t]=1}),r.attributes&&Array.from(r.attributes).filter(W).forEach(function(e){var t=G(r,e);t&&(a.attributes[t]?a.attributes[t]++:a.attributes[t]=1)})}for(e.children.length&&(o.push(n),n=e.children.slice());!n.length&&o.length;)n=o.pop()};n.length;)t();return a},axe.utils.getSelector=function(e){var t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{};if(!e)return\"\";var r=e.getRootNode&&e.getRootNode()||document;if(11!==r.nodeType)return Z(e,t,r);for(var a=[];11===r.nodeType;)a.push({elm:e,doc:r}),r=(e=r.host).getRootNode();return a.push({elm:e,doc:r}),a.reverse().map(function(e){return Z(e.elm,t,e.doc)})},axe.utils.getXpath=function(e){var t=function e(t,r){var a,n;if(!t)return[];if(!r&&9===t.nodeType)return r=[{str:\"html\"}];if(r=r||[],t.parentNode&&t.parentNode!==t&&(r=e(t.parentNode,r)),t.previousSibling){for(n=1,a=t.previousSibling;1===a.nodeType&&a.nodeName===t.nodeName&&n++,a=a.previousSibling;);1===n&&(n=null)}else if(t.nextSibling)for(a=t.nextSibling;a=1===a.nodeType&&a.nodeName===t.nodeName?(n=1,null):(n=null,a.previousSibling););if(1===t.nodeType){var o={};o.str=t.nodeName.toLowerCase();var i=t.getAttribute&&axe.utils.escapeSelector(t.getAttribute(\"id\"));i&&1===t.ownerDocument.querySelectorAll(\"#\"+i).length&&(o.id=t.getAttribute(\"id\")),1<n&&(o.count=n),r.push(o)}return r}(e);return t.reduce(function(e,t){return t.id?\"/\"+t.str+\"[@id='\"+t.id+\"']\":e+\"/\"+t.str+(0<t.count?\"[\"+t.count+\"]\":\"\")},\"\")},axe.utils.injectStyle=function(e){\"use strict\";if(H&&H.parentNode)return void 0===H.styleSheet?H.appendChild(document.createTextNode(e)):H.styleSheet.cssText+=e,H;if(e){var t=document.head||document.getElementsByTagName(\"head\")[0];return(H=document.createElement(\"style\")).type=\"text/css\",void 0===H.styleSheet?H.appendChild(document.createTextNode(e)):H.styleSheet.cssText=e,t.appendChild(H),H}},axe.utils.isHidden=function(e,t){\"use strict\";var r;if(9===e.nodeType)return!1;11===e.nodeType&&(e=e.host);var a=window.getComputedStyle(e,null);return!a||!e.parentNode||\"none\"===a.getPropertyValue(\"display\")||!t&&\"hidden\"===a.getPropertyValue(\"visibility\")||\"true\"===e.getAttribute(\"aria-hidden\")||(r=e.assignedSlot?e.assignedSlot:e.parentNode,axe.utils.isHidden(r,!0))};var Q,ee,te,re,ae=[\"article\",\"aside\",\"blockquote\",\"body\",\"div\",\"footer\",\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\",\"header\",\"main\",\"nav\",\"p\",\"section\",\"span\"];axe.utils.isShadowRoot=function(e){var t=e.nodeName.toLowerCase();return!(!e.shadowRoot||!/^[a-z][a-z0-9_.-]*-[a-z0-9_.-]*$/.test(t)&&!ae.includes(t))},axe.utils.isXHTML=function(e){\"use strict\";return!!e.createElement&&\"A\"===e.createElement(\"A\").localName},axe.utils.mergeResults=function(e,l){\"use strict\";var u=[];return e.forEach(function(s){var e,t=(e=s)&&e.results?Array.isArray(e.results)?e.results.length?e.results:null:[e.results]:null;t&&t.length&&t.forEach(function(e){var t,r,a,n,o;e.nodes&&s.frame&&(t=e.nodes,r=l,a=s.frameElement,n=s.frame,o={element:a,selector:n,xpath:axe.utils.getXpath(a)},t.forEach(function(e){e.node=axe.utils.DqElement.fromFrame(e.node,r,o);var t=axe.utils.getAllChecks(e);t.length&&t.forEach(function(e){e.relatedNodes=e.relatedNodes.map(function(e){return axe.utils.DqElement.fromFrame(e,r,o)})})}));var i=axe.utils.findBy(u,\"id\",e.id);i?e.nodes.length&&function(e,t){for(var r,a,n=t[0].node,o=0,i=e.length;o<i;o++)if(a=e[o].node,0<(r=axe.utils.nodeSorter({actualNode:a.element},{actualNode:n.element}))||0===r&&n.selector.length<a.selector.length)return e.splice.apply(e,[o,0].concat(t));e.push.apply(e,t)}(i.nodes,e.nodes):u.push(e)})}),u},axe.utils.nodeSorter=function(e,t){\"use strict\";return e.actualNode===t.actualNode?0:4&e.actualNode.compareDocumentPosition(t.actualNode)?-1:1},utils.performanceTimer=function(){\"use strict\";function e(){if(window.performance&&window.performance)return window.performance.now()}var t=null,r=e();return{start:function(){this.mark(\"mark_axe_start\")},end:function(){this.mark(\"mark_axe_end\"),this.measure(\"axe\",\"mark_axe_start\",\"mark_axe_end\"),this.logMeasures(\"axe\")},auditStart:function(){this.mark(\"mark_audit_start\")},auditEnd:function(){this.mark(\"mark_audit_end\"),this.measure(\"audit_start_to_end\",\"mark_audit_start\",\"mark_audit_end\"),this.logMeasures()},mark:function(e){window.performance&&void 0!==window.performance.mark&&window.performance.mark(e)},measure:function(e,t,r){window.performance&&void 0!==window.performance.measure&&window.performance.measure(e,t,r)},logMeasures:function(e){function t(e){axe.log(\"Measure \"+e.name+\" took \"+e.duration+\"ms\")}if(window.performance&&void 0!==window.performance.getEntriesByType)for(var r=window.performance.getEntriesByType(\"measure\"),a=0;a<r.length;++a){var n=r[a];if(n.name===e)return void t(n);t(n)}},timeElapsed:function(){return e()-r},reset:function(){t||(t=e()),r=e()}}}(),\"function\"!=typeof Object.assign&&(Object.assign=function(e){\"use strict\";if(null==e)throw new TypeError(\"Cannot convert undefined or null to object\");for(var t=Object(e),r=1;r<arguments.length;r++){var a=arguments[r];if(null!=a)for(var n in a)a.hasOwnProperty(n)&&(t[n]=a[n])}return t}),Array.prototype.find||Object.defineProperty(Array.prototype,\"find\",{value:function(e){if(null===this)throw new TypeError(\"Array.prototype.find called on null or undefined\");if(\"function\"!=typeof e)throw new TypeError(\"predicate must be a function\");for(var t,r=Object(this),a=r.length>>>0,n=arguments[1],o=0;o<a;o++)if(t=r[o],e.call(n,t,o,r))return t}}),axe.utils.pollyfillElementsFromPoint=function(){if(document.elementsFromPoint)return document.elementsFromPoint;if(document.msElementsFromPoint)return document.msElementsFromPoint;var e,t=((e=document.createElement(\"x\")).style.cssText=\"pointer-events:auto\",\"auto\"===e.style.pointerEvents),s=t?\"pointer-events\":\"visibility\",l=t?\"none\":\"hidden\",u=document.createElement(\"style\");return u.innerHTML=t?\"* { pointer-events: all }\":\"* { visibility: visible }\",function(e,t){var r,a,n,o=[],i=[];for(document.head.appendChild(u);(r=document.elementFromPoint(e,t))&&-1===o.indexOf(r);)o.push(r),i.push({value:r.style.getPropertyValue(s),priority:r.style.getPropertyPriority(s)}),r.style.setProperty(s,l,\"important\");for(o.indexOf(document.documentElement)<o.length-1&&(o.splice(o.indexOf(document.documentElement),1),o.push(document.documentElement)),a=i.length;n=i[--a];)o[a].style.setProperty(s,n.value?n.value:\"\",n.priority);return document.head.removeChild(u),o}},\"function\"==typeof window.addEventListener&&(document.elementsFromPoint=axe.utils.pollyfillElementsFromPoint()),Array.prototype.includes||Object.defineProperty(Array.prototype,\"includes\",{value:function(e){\"use strict\";var t=Object(this),r=parseInt(t.length,10)||0;if(0===r)return!1;var a,n,o=parseInt(arguments[1],10)||0;for(0<=o?a=o:(a=r+o)<0&&(a=0);a<r;){if(e===(n=t[a])||e!=e&&n!=n)return!0;a++}return!1}}),Array.prototype.some||Object.defineProperty(Array.prototype,\"some\",{value:function(e){\"use strict\";if(null==this)throw new TypeError(\"Array.prototype.some called on null or undefined\");if(\"function\"!=typeof e)throw new TypeError;for(var t=Object(this),r=t.length>>>0,a=2<=arguments.length?arguments[1]:void 0,n=0;n<r;n++)if(n in t&&e.call(a,t[n],n,t))return!0;return!1}}),Array.from||Object.defineProperty(Array,\"from\",{value:(Q=Object.prototype.toString,ee=function(e){return\"function\"==typeof e||\"[object Function]\"===Q.call(e)},te=Math.pow(2,53)-1,re=function(e){var t,r=(t=Number(e),isNaN(t)?0:0!==t&&isFinite(t)?(0<t?1:-1)*Math.floor(Math.abs(t)):t);return Math.min(Math.max(r,0),te)},function(e){var t=Object(e);if(null==e)throw new TypeError(\"Array.from requires an array-like object - not null or undefined\");var r,a=1<arguments.length?arguments[1]:void 0;if(void 0!==a){if(!ee(a))throw new TypeError(\"Array.from: when provided, the second argument must be a function\");2<arguments.length&&(r=arguments[2])}for(var n,o=re(t.length),i=ee(this)?Object(new this(o)):new Array(o),s=0;s<o;)n=t[s],i[s]=a?void 0===r?a(n,s):a.call(r,n,s):n,s+=1;return i.length=o,i})}),String.prototype.includes||(String.prototype.includes=function(e,t){return\"number\"!=typeof t&&(t=0),!(t+e.length>this.length)&&-1!==this.indexOf(e,t)}),axe.utils.preloadCssom=function(e){var t,r,a=e.timeout,n=e.treeRoot,o=void 0===n?axe._tree[0]:n,i=axe.utils.uniqueArray((t=o,r=[],axe.utils.querySelectorAllFilter(t,\"*\",function(e){return!r.includes(e.shadowId)&&(r.push(e.shadowId),!0)}).map(function(e){return{shadowId:e.shadowId,root:axe.utils.getRootNode(e.actualNode)}})),[]),s=axe.utils.queue();if(!i.length)return s;var l=document.implementation.createHTMLDocument();function u(e){var t=e.data,r=e.isExternal,a=e.shadowId,n=e.root,o=l.createElement(\"style\");return o.type=\"text/css\",o.appendChild(l.createTextNode(t)),l.head.appendChild(o),{sheet:o.sheet,isExternal:r,shadowId:a,root:n}}return s.defer(function(t,e){i.reduce(function(e,r){return e.defer(function(e,t){(function(e,n,o){var i=e.root,s=e.shadowId;function l(e){var a=e.resolve,t=e.reject,r=e.url;axe.imports.axios({method:\"get\",url:r,timeout:n}).then(function(e){var t=e.data,r=o({data:t,isExternal:!0,shadowId:s,root:i});a(r)}).catch(t)}var u=axe.utils.queue(),t=i.styleSheets?Array.from(i.styleSheets):null;if(!t)return u;var r=[];return t.filter(function(e){var t=!1;return e.href&&(r.includes(e.href)?t=!0:r.push(e.href)),!Array.from(e.media).includes(\"print\")&&!t}).forEach(function(r){try{var e=r.cssRules,t=Array.from(e),a=t.filter(function(e){return e.href});if(!a.length)return void u.defer(function(e){return e({sheet:r,isExternal:!1,shadowId:s,root:i})});a.forEach(function(r){u.defer(function(e,t){l({resolve:e,reject:t,url:r.href})})});var n=t.filter(function(e){return!e.href}).reduce(function(e,t){return e.push(t.cssText),e},[]).join();u.defer(function(e){return e(o({data:n,shadowId:s,root:i,isExternal:!1}))})}catch(e){u.defer(function(e,t){l({resolve:e,reject:t,url:r.href})})}},[]),u})(r,a,u).then(e).catch(t)}),e},axe.utils.queue()).then(function(e){t(e.reduce(function(e,t){return e.concat(t)},[]))}).catch(e)}),s};T=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e};axe.utils.shouldPreload=function(e){return!(!e||!e.preload)&&(\"boolean\"==typeof e.preload?e.preload:\"object\"===(void 0===(t=e.preload)?\"undefined\":T(t))&&Array.isArray(t.assets));var t},axe.utils.getPreloadConfig=function(e){var t={assets:axe.constants.preloadAssets,timeout:axe.constants.preloadAssetsTimeout};if(\"boolean\"==typeof e.preload)return t;if(!e.preload.assets.every(function(e){return axe.constants.preloadAssets.includes(e.toLowerCase())}))throw new Error(\"Requested assets, not supported. Supported assets are: \"+axe.constants.preloadAssets.join(\", \")+\".\");return t.assets=axe.utils.uniqueArray(e.preload.assets.map(function(e){return e.toLowerCase()}),[]),e.preload.timeout&&\"number\"==typeof e.preload.timeout&&!Number.isNaN(e.preload.timeout)&&(t.timeout=e.preload.timeout),t},axe.utils.preload=function(e){var t={cssom:axe.utils.preloadCssom},r=axe.utils.queue();if(!axe.utils.shouldPreload(e))return r;var a=axe.utils.getPreloadConfig(e);return a.assets.forEach(function(o){r.defer(function(n,e){t[o](a).then(function(e){var t,r,a;n((t={},r=o,a=e[0],r in t?Object.defineProperty(t,r,{value:a,enumerable:!0,configurable:!0,writable:!0}):t[r]=a,t))}).catch(e)})}),r};T=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e};function ne(n,o){\"use strict\";return function(e){var t=n[e.id]||{},r=t.messages||{},a=Object.assign({},t);delete a.messages,void 0===e.result?\"object\"===T(r.incomplete)?a.message=function(){return function(t,r){function a(e){return e.incomplete&&e.incomplete.default?e.incomplete.default:i.incompleteFallbackMessage()}if(!t||!t.missingData)return a(r);try{var e=r.incomplete[t.missingData[0].reason];if(!e)throw new Error;return e}catch(e){return\"string\"==typeof t.missingData?r.incomplete[t.missingData]:a(r)}}(e.data,r)}:a.message=r.incomplete:a.message=e.result===o?r.pass:r.fail,axe.utils.extendMetaData(e,a)}}axe.utils.publishMetaData=function(e){\"use strict\";var t=axe._audit.data.checks||{},r=axe._audit.data.rules||{},a=axe.utils.findBy(axe._audit.rules,\"id\",e.id)||{};e.tags=axe.utils.clone(a.tags||[]);var n=ne(t,!0),o=ne(t,!1);e.nodes.forEach(function(e){e.any.forEach(n),e.all.forEach(n),e.none.forEach(o)}),axe.utils.extendMetaData(e,axe.utils.clone(r[e.id]||{}))};var oe=function(){},ie=function(){};var se,le=(se=/(?=[\\-\\[\\]{}()*+?.\\\\\\^$|,#\\s])/g,function(e){return e.replace(se,\"\\\\\")}),ue=/\\\\/g;function ce(e){if(e)return e.map(function(e){var t,r,a=e.name.replace(ue,\"\"),n=(e.value||\"\").replace(ue,\"\");switch(e.operator){case\"^=\":r=new RegExp(\"^\"+le(n));break;case\"$=\":r=new RegExp(le(n)+\"$\");break;case\"~=\":r=new RegExp(\"(^|\\\\s)\"+le(n)+\"(\\\\s|$)\");break;case\"|=\":r=new RegExp(\"^\"+le(n)+\"(-|$)\");break;case\"=\":t=function(e){return n===e};break;case\"*=\":t=function(e){return e&&e.includes(n)};break;case\"!=\":t=function(e){return n!==e};break;default:t=function(e){return!!e}}return\"\"===n&&/^[*$^]=$/.test(e.operator)&&(t=function(){return!1}),t||(t=function(e){return e&&r.test(e)}),{key:a,value:n,test:t}})}function de(e){if(e)return e.map(function(e){return{value:e=e.replace(ue,\"\"),regexp:new RegExp(\"(^|\\\\s)\"+le(e)+\"(\\\\s|$)\")}})}function me(e){if(e)return e.map(function(e){var t;return\"not\"===e.name&&(t=(t=axe.utils.cssParser.parse(e.value)).selectors?t.selectors:[t],t=oe(t)),{name:e.name,expressions:t,value:e.value}})}function pe(e,t,r,a){var n={nodes:e.slice(),anyLevel:t,thisLevel:r,parentShadowId:a};return n.nodes.reverse(),n}function fe(e,t){return c=e.actualNode,d=t[0],1===c.nodeType&&(\"*\"===d.tag||c.nodeName.toLowerCase()===d.tag)&&(l=e.actualNode,!(u=t[0]).classes||u.classes.reduce(function(e,t){return e&&l.className&&l.className.match(t.regexp)},!0))&&(i=e.actualNode,!(s=t[0]).attributes||s.attributes.reduce(function(e,t){var r=i.getAttribute(t.key);return e&&null!==r&&(!t.value||t.test(r))},!0))&&(n=e.actualNode,!(o=t[0]).id||n.id===o.id)&&(r=e,!((a=t[0]).pseudos&&!a.pseudos.reduce(function(e,t){if(\"not\"===t.name)return e&&!ie([r],t.expressions,!1).length;throw new Error(\"the pseudo selector \"+t.name+\" has not yet been implemented\")},!0)));var r,a,n,o,i,s,l,u,c,d}oe=function(e){return e.map(function(e){for(var t=[],r=e.rule;r;)t.push({tag:r.tagName?r.tagName.toLowerCase():\"*\",combinator:r.nestingOperator?r.nestingOperator:\" \",id:r.id,attributes:ce(r.attrs),classes:de(r.classNames),pseudos:me(r.pseudos)}),r=r.rule;return t})},ie=function(e,t,r,a){for(var n=[],o=pe(Array.isArray(e)?e:[e],t,[],e[0].shadowId),i=[];o.nodes.length;){for(var s=o.nodes.pop(),l=[],u=[],c=o.anyLevel.slice().concat(o.thisLevel),d=!1,m=0;m<c.length;m++){var p=c[m];if(fe(s,p)&&(!p[0].id||s.shadowId===o.parentShadowId))if(1===p.length)d||a&&!a(s)||(i.push(s),d=!0);else{var f=p.slice(1);if(!1===[\" \",\">\"].includes(f[0].combinator))throw new Error(\"axe.utils.querySelectorAll does not support the combinator: \"+p[1].combinator);\">\"===f[0].combinator?l.push(f):u.push(f)}!o.anyLevel.includes(p)||p[0].id&&s.shadowId!==o.parentShadowId||u.push(p)}for(s.children&&s.children.length&&r&&(n.push(o),o=pe(s.children,u,l,s.shadowId));!o.nodes.length&&n.length;)o=n.pop()}return i},axe.utils.querySelectorAll=function(e,t){return axe.utils.querySelectorAllFilter(e,t)},axe.utils.querySelectorAllFilter=function(e,t,r){e=Array.isArray(e)?e:[e];var a=axe.utils.cssParser.parse(t);return a=a.selectors?a.selectors:[a],a=oe(a),ie(e,a,!0,r)};T=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e};!function(){\"use strict\";function m(){}function p(e){if(\"function\"!=typeof e)throw new TypeError(\"Queue methods require functions as arguments\")}axe.utils.queue=function(){var t,a=[],n=0,o=0,r=m,i=!1,s=function(e){t=e,setTimeout(function(){null!=t&&axe.log(\"Uncaught error (of queue)\",t)},1)},l=s;function u(t){return function(e){a[t]=e,(o-=1)||r===m||(i=!0,r(a))}}function c(e){return r=m,l(e),a}var d={defer:function(e){if(\"object\"===(void 0===e?\"undefined\":T(e))&&e.then&&e.catch){var r=e;e=function(e,t){r.then(e).catch(t)}}if(p(e),void 0===t){if(i)throw new Error(\"Queue already completed\");return a.push(e),++o,function(){for(var e=a.length;n<e;n++){var t=a[n];try{t.call(null,u(n),c)}catch(e){c(e)}}}(),d}},then:function(e){if(p(e),r!==m)throw new Error(\"queue `then` already set\");return t||(r=e,o||(i=!0,r(a))),d},catch:function(e){if(p(e),l!==s)throw new Error(\"queue `catch` already set\");return t?(e(t),t=null):l=e,d},abort:c};return d}}();var he;T=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e};function ge(t,e){\"use strict\";var r,a,n=axe._audit&&axe._audit.tagExclude?axe._audit.tagExclude:[];return a=e.hasOwnProperty(\"include\")||e.hasOwnProperty(\"exclude\")?(r=e.include||[],r=Array.isArray(r)?r:[r],a=e.exclude||[],(a=Array.isArray(a)?a:[a]).concat(n.filter(function(e){return-1===r.indexOf(e)}))):(r=Array.isArray(e)?e:[e],n.filter(function(e){return-1===r.indexOf(e)})),!!(r.some(function(e){return-1!==t.tags.indexOf(e)})||0===r.length&&!1!==t.enabled)&&a.every(function(e){return-1===t.tags.indexOf(e)})}function be(e){return Array.from(e.children).reduce(function(e,t){var r=function(e){var t=window.getComputedStyle(e),r=\"visible\"===t.getPropertyValue(\"overflow-y\"),a=\"visible\"===t.getPropertyValue(\"overflow-x\");if(!r&&e.scrollHeight>e.clientHeight||!a&&e.scrollWidth>e.clientWidth)return{elm:e,top:e.scrollTop,left:e.scrollLeft}}(t);return r&&e.push(r),e.concat(be(t))},[])}function ye(e){\"use strict\";return e.sort(function(e,t){return axe.utils.contains(e,t)?1:-1})[0]}function ve(t,e){\"use strict\";var r=e.include&&ye(e.include.filter(function(e){return axe.utils.contains(e,t)})),a=e.exclude&&ye(e.exclude.filter(function(e){return axe.utils.contains(e,t)}));return!!(!a&&r||a&&axe.utils.contains(a,r))}function we(e,t){\"use strict\";var r;if(0===e.length)return t;e.length<t.length&&(r=e,e=t,t=r);for(var a=0,n=t.length;a<n;a++)e.includes(t[a])||e.push(t[a]);return e}!function(e){\"use strict\";var l={},i={},s=Object.freeze([\"EvalError\",\"RangeError\",\"ReferenceError\",\"SyntaxError\",\"TypeError\",\"URIError\"]);function u(){var e=\"axeAPI\",t=\"\";return void 0!==axe&&axe._audit&&axe._audit.application&&(e=axe._audit.application),void 0!==axe&&(t=axe.version),e+\".\"+t}function c(e,t,r,a,n,o){var i;r instanceof Error&&(i={name:r.name,message:r.message,stack:r.stack},r=void 0);var s={uuid:a,topic:t,message:r,error:i,_respondable:!0,_source:u(),_keepalive:n};\"function\"==typeof o&&(l[a]=o),e.postMessage(JSON.stringify(s),\"*\")}function t(e,t,r,a,n){c(e,t,r,he.v1(),a,n)}function d(a,n,o){return function(e,t,r){c(a,n,e,o,t,r)}}function o(e){var t;if(\"string\"==typeof e){try{t=JSON.parse(e)}catch(e){}var r,a,n,o;if(function(e){if(\"object\"!==(void 0===e?\"undefined\":T(e))||\"string\"!=typeof e.uuid||!0!==e._respondable)return!1;var t=u();return e._source===t||\"axeAPI.x.y.z\"===e._source||\"axeAPI.x.y.z\"===t}(t))return\"object\"===T(t.error)?t.error=(r=t.error,a=r.message||\"Unknown error occurred\",n=s.includes(r.name)?r.name:\"Error\",o=window[n]||Error,r.stack&&(a+=\"\\n\"+r.stack.replace(r.message,\"\")),new o(a)):t.error=void 0,t}}t.subscribe=function(e,t){i[e]=t},t.isInFrame=function(e){return!!(e=e||window).frameElement},\"function\"==typeof window.addEventListener&&window.addEventListener(\"message\",function(t){var r=o(t.data);if(r){var a=r.uuid,e=r._keepalive,n=l[a];if(n)n(r.error||r.message,e,d(t.source,r.topic,a)),e||delete l[a];if(!r.error)try{!function(e,t,r){var a=t.topic,n=i[a];if(n){var o=d(e,null,t.uuid);n(t.message,r,o)}}(t.source,r,e)}catch(e){c(t.source,r.topic,e,a,!1)}}},!1),e.respondable=t}(utils),axe.utils.ruleShouldRun=function(e,t,r){\"use strict\";var a=r.runOnly||{},n=(r.rules||{})[e.id];return!(e.pageLevel&&!t.page)&&(\"rule\"===a.type?-1!==a.values.indexOf(e.id):n&&\"boolean\"==typeof n.enabled?n.enabled:\"tag\"===a.type&&a.values?ge(e,a.values):ge(e,[]))},axe.utils.getScrollState=function(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:window,t=e.document.documentElement;return[void 0!==e.pageXOffset?{elm:e,top:e.pageYOffset,left:e.pageXOffset}:{elm:t,top:t.scrollTop,left:t.scrollLeft}].concat(be(document.body))},axe.utils.setScrollState=function(e){e.forEach(function(e){return function(e,t,r){if(e===window)return e.scroll(t,r);e.scrollTop=t,e.scrollLeft=r}(e.elm,e.top,e.left)})},axe.utils.select=function(e,t){\"use strict\";var r,a=[];if(axe._selectCache)for(var n=0,o=axe._selectCache.length;n<o;n++){var i=axe._selectCache[n];if(i.selector===e)return i.result}for(var s,l=(s=t,function(e){return ve(e,s)}),u=t.include.reduce(function(e,t){return e.length&&e[e.length-1].actualNode.contains(t.actualNode)||e.push(t),e},[]),c=0;c<u.length;c++)(r=u[c]).actualNode.nodeType===r.actualNode.ELEMENT_NODE&&axe.utils.matchesSelector(r.actualNode,e)&&l(r)&&(a=we(a,[r])),a=we(a,axe.utils.querySelectorAllFilter(r,e,l));return axe._selectCache&&axe._selectCache.push({selector:e,result:a}),a},axe.utils.toArray=function(e){\"use strict\";return Array.prototype.slice.call(e)},axe.utils.uniqueArray=function(e,t){return e.concat(t).filter(function(e,t,r){return r.indexOf(e)===t})},function(e){var i,t=e.crypto||e.msCrypto;if(!i&&t&&t.getRandomValues){var r=new Uint8Array(16);i=function(){return t.getRandomValues(r),r}}if(!i){var a=new Array(16);i=function(){for(var e,t=0;t<16;t++)0==(3&t)&&(e=4294967296*Math.random()),a[t]=e>>>((3&t)<<3)&255;return a}}for(var s=\"function\"==typeof e.Buffer?e.Buffer:Array,n=[],o={},l=0;l<256;l++)n[l]=(l+256).toString(16).substr(1),o[n[l]]=l;function p(e,t){var r=t||0,a=n;return a[e[r++]]+a[e[r++]]+a[e[r++]]+a[e[r++]]+\"-\"+a[e[r++]]+a[e[r++]]+\"-\"+a[e[r++]]+a[e[r++]]+\"-\"+a[e[r++]]+a[e[r++]]+\"-\"+a[e[r++]]+a[e[r++]]+a[e[r++]]+a[e[r++]]+a[e[r++]]+a[e[r++]]}var u=i(),f=[1|u[0],u[1],u[2],u[3],u[4],u[5]],h=16383&(u[6]<<8|u[7]),g=0,b=0;function c(e,t,r){var a=t&&r||0;\"string\"==typeof e&&(t=\"binary\"==e?new s(16):null,e=null);var n=(e=e||{}).random||(e.rng||i)();if(n[6]=15&n[6]|64,n[8]=63&n[8]|128,t)for(var o=0;o<16;o++)t[a+o]=n[o];return t||p(n)}(he=c).v1=function(e,t,r){var a=t&&r||0,n=t||[],o=null!=(e=e||{}).clockseq?e.clockseq:h,i=null!=e.msecs?e.msecs:(new Date).getTime(),s=null!=e.nsecs?e.nsecs:b+1,l=i-g+(s-b)/1e4;if(l<0&&null==e.clockseq&&(o=o+1&16383),(l<0||g<i)&&null==e.nsecs&&(s=0),1e4<=s)throw new Error(\"uuid.v1(): Can't create more than 10M uuids/sec\");g=i,h=o;var u=(1e4*(268435455&(i+=122192928e5))+(b=s))%4294967296;n[a++]=u>>>24&255,n[a++]=u>>>16&255,n[a++]=u>>>8&255,n[a++]=255&u;var c=i/4294967296*1e4&268435455;n[a++]=c>>>8&255,n[a++]=255&c,n[a++]=c>>>24&15|16,n[a++]=c>>>16&255,n[a++]=o>>>8|128,n[a++]=255&o;for(var d=e.node||f,m=0;m<6;m++)n[a+m]=d[m];return t||p(n)},he.v4=c,he.parse=function(e,t,r){var a=t&&r||0,n=0;for(t=t||[],e.toLowerCase().replace(/[0-9a-f]{2}/g,function(e){n<16&&(t[a+n++]=o[e])});n<16;)t[a+n++]=0;return t},he.unparse=p,he.BufferClass=s}(window);T=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e};axe._load({data:{rules:{accesskeys:{description:\"Ensures every accesskey attribute value is unique\",help:\"accesskey attribute value must be unique\"},\"area-alt\":{description:\"Ensures <area> elements of image maps have alternate text\",help:\"Active <area> elements must have alternate text\"},\"aria-allowed-attr\":{description:\"Ensures ARIA attributes are allowed for an element's role\",help:\"Elements must only use allowed ARIA attributes\"},\"aria-allowed-role\":{description:\"Ensures role attribute has an appropriate value for the element\",help:\"ARIA role must be appropriate for the element\"},\"aria-dpub-role-fallback\":{description:\"Ensures unsupported DPUB roles are only used on elements with implicit fallback roles\",help:\"Unsupported DPUB ARIA roles should be used on elements with implicit fallback roles\"},\"aria-hidden-body\":{description:\"Ensures aria-hidden='true' is not present on the document body.\",help:\"aria-hidden='true' must not be present on the document body\"},\"aria-required-attr\":{description:\"Ensures elements with ARIA roles have all required ARIA attributes\",help:\"Required ARIA attributes must be provided\"},\"aria-required-children\":{description:\"Ensures elements with an ARIA role that require child roles contain them\",help:\"Certain ARIA roles must contain particular children\"},\"aria-required-parent\":{description:\"Ensures elements with an ARIA role that require parent roles are contained by them\",help:\"Certain ARIA roles must be contained by particular parents\"},\"aria-roles\":{description:\"Ensures all elements with a role attribute use a valid value\",help:\"ARIA roles used must conform to valid values\"},\"aria-valid-attr-value\":{description:\"Ensures all ARIA attributes have valid values\",help:\"ARIA attributes must conform to valid values\"},\"aria-valid-attr\":{description:\"Ensures attributes that begin with aria- are valid ARIA attributes\",help:\"ARIA attributes must conform to valid names\"},\"audio-caption\":{description:\"Ensures <audio> elements have captions\",help:\"<audio> elements must have a captions track\"},\"autocomplete-valid\":{description:\"Ensure the autocomplete attribute is correct and suitable for the form field\",help:\"autocomplete attribute must be used correctly\"},blink:{description:\"Ensures <blink> elements are not used\",help:\"<blink> elements are deprecated and must not be used\"},\"button-name\":{description:\"Ensures buttons have discernible text\",help:\"Buttons must have discernible text\"},bypass:{description:\"Ensures each page has at least one mechanism for a user to bypass navigation and jump straight to the content\",help:\"Page must have means to bypass repeated blocks\"},checkboxgroup:{description:'Ensures related <input type=\"checkbox\"> elements have a group and that the group designation is consistent',help:\"Checkbox inputs with the same name attribute value must be part of a group\"},\"color-contrast\":{description:\"Ensures the contrast between foreground and background colors meets WCAG 2 AA contrast ratio thresholds\",help:\"Elements must have sufficient color contrast\"},\"css-orientation-lock\":{description:\"Ensures content is not locked to any specific display orientation, and the content is operable in all display orientations\",help:\"CSS Media queries are not used to lock display orientation\"},\"definition-list\":{description:\"Ensures <dl> elements are structured correctly\",help:\"<dl> elements must only directly contain properly-ordered <dt> and <dd> groups, <script> or <template> elements\"},dlitem:{description:\"Ensures <dt> and <dd> elements are contained by a <dl>\",help:\"<dt> and <dd> elements must be contained by a <dl>\"},\"document-title\":{description:\"Ensures each HTML document contains a non-empty <title> element\",help:\"Documents must have <title> element to aid in navigation\"},\"duplicate-id-active\":{description:\"Ensures every id attribute value of active elements is unique\",help:\"IDs of active elements must be unique\"},\"duplicate-id-aria\":{description:\"Ensures every id attribute value used in ARIA and in labels is unique\",help:\"IDs used in ARIA and labels must be unique\"},\"duplicate-id\":{description:\"Ensures every id attribute value is unique\",help:\"id attribute value must be unique\"},\"empty-heading\":{description:\"Ensures headings have discernible text\",help:\"Headings must not be empty\"},\"focus-order-semantics\":{description:\"Ensures elements in the focus order have an appropriate role\",help:\"Elements in the focus order need a role appropriate for interactive content\"},\"frame-tested\":{description:\"Ensures <iframe> and <frame> elements contain the axe-core script\",help:\"Frames must be tested with axe-core\"},\"frame-title-unique\":{description:\"Ensures <iframe> and <frame> elements contain a unique title attribute\",help:\"Frames must have a unique title attribute\"},\"frame-title\":{description:\"Ensures <iframe> and <frame> elements contain a non-empty title attribute\",help:\"Frames must have title attribute\"},\"heading-order\":{description:\"Ensures the order of headings is semantically correct\",help:\"Heading levels should only increase by one\"},\"hidden-content\":{description:\"Informs users about hidden content.\",help:\"Hidden content on the page cannot be analyzed\"},\"html-has-lang\":{description:\"Ensures every HTML document has a lang attribute\",help:\"<html> element must have a lang attribute\"},\"html-lang-valid\":{description:\"Ensures the lang attribute of the <html> element has a valid value\",help:\"<html> element must have a valid value for the lang attribute\"},\"html-xml-lang-mismatch\":{description:\"Ensure that HTML elements with both valid lang and xml:lang attributes agree on the base language of the page\",help:\"HTML elements with lang and xml:lang must have the same base language\"},\"image-alt\":{description:\"Ensures <img> elements have alternate text or a role of none or presentation\",help:\"Images must have alternate text\"},\"image-redundant-alt\":{description:\"Ensure button and link text is not repeated as image alternative\",help:\"Text of buttons and links should not be repeated in the image alternative\"},\"input-image-alt\":{description:'Ensures <input type=\"image\"> elements have alternate text',help:\"Image buttons must have alternate text\"},\"label-title-only\":{description:\"Ensures that every form element is not solely labeled using the title or aria-describedby attributes\",help:\"Form elements should have a visible label\"},label:{description:\"Ensures every form element has a label\",help:\"Form elements must have labels\"},\"landmark-banner-is-top-level\":{description:\"Ensures the banner landmark is at top level\",help:\"Banner landmark must not be contained in another landmark\"},\"landmark-contentinfo-is-top-level\":{description:\"Ensures the contentinfo landmark is at top level\",help:\"Contentinfo landmark must not be contained in another landmark\"},\"landmark-main-is-top-level\":{description:\"Ensures the main landmark is at top level\",help:\"Main landmark must not be contained in another landmark\"},\"landmark-no-duplicate-banner\":{description:\"Ensures the page has at most one banner landmark\",help:\"Page must not have more than one banner landmark\"},\"landmark-no-duplicate-contentinfo\":{description:\"Ensures the page has at most one contentinfo landmark\",help:\"Page must not have more than one contentinfo landmark\"},\"landmark-one-main\":{description:\"Ensures the page has only one main landmark and each iframe in the page has at most one main landmark\",help:\"Page must have one main landmark\"},\"layout-table\":{description:\"Ensures presentational <table> elements do not use <th>, <caption> elements or the summary attribute\",help:\"Layout tables must not use data table elements\"},\"link-in-text-block\":{description:\"Links can be distinguished without relying on color\",help:\"Links must be distinguished from surrounding text in a way that does not rely on color\"},\"link-name\":{description:\"Ensures links have discernible text\",help:\"Links must have discernible text\"},list:{description:\"Ensures that lists are structured correctly\",help:\"<ul> and <ol> must only directly contain <li>, <script> or <template> elements\"},listitem:{description:\"Ensures <li> elements are used semantically\",help:\"<li> elements must be contained in a <ul> or <ol>\"},marquee:{description:\"Ensures <marquee> elements are not used\",help:\"<marquee> elements are deprecated and must not be used\"},\"meta-refresh\":{description:'Ensures <meta http-equiv=\"refresh\"> is not used',help:\"Timed refresh must not exist\"},\"meta-viewport-large\":{description:'Ensures <meta name=\"viewport\"> can scale a significant amount',help:\"Users should be able to zoom and scale the text up to 500%\"},\"meta-viewport\":{description:'Ensures <meta name=\"viewport\"> does not disable text scaling and zooming',help:\"Zooming and scaling must not be disabled\"},\"object-alt\":{description:\"Ensures <object> elements have alternate text\",help:\"<object> elements must have alternate text\"},\"p-as-heading\":{description:\"Ensure p elements are not used to style headings\",help:\"Bold, italic text and font-size are not used to style p elements as a heading\"},\"page-has-heading-one\":{description:\"Ensure that the page, or at least one of its frames contains a level-one heading\",help:\"Page must contain a level-one heading\"},radiogroup:{description:'Ensures related <input type=\"radio\"> elements have a group and that the group designation is consistent',help:\"Radio inputs with the same name attribute value must be part of a group\"},region:{description:\"Ensures all page content is contained by landmarks\",help:\"All page content must be contained by landmarks\"},\"scope-attr-valid\":{description:\"Ensures the scope attribute is used correctly on tables\",help:\"scope attribute should be used correctly\"},\"server-side-image-map\":{description:\"Ensures that server-side image maps are not used\",help:\"Server-side image maps must not be used\"},\"skip-link\":{description:\"Ensure all skip links have a focusable target\",help:\"The skip-link target should exist and be focusable\"},tabindex:{description:\"Ensures tabindex attribute values are not greater than 0\",help:\"Elements should not have tabindex greater than zero\"},\"table-duplicate-name\":{description:\"Ensure that tables do not have the same summary and caption\",help:\"The <caption> element should not contain the same text as the summary attribute\"},\"table-fake-caption\":{description:\"Ensure that tables with a caption use the <caption> element.\",help:\"Data or header cells should not be used to give caption to a data table.\"},\"td-has-header\":{description:\"Ensure that each non-empty data cell in a large table has one or more table headers\",help:\"All non-empty td element in table larger than 3 by 3 must have an associated table header\"},\"td-headers-attr\":{description:\"Ensure that each cell in a table using the headers refers to another cell in that table\",help:\"All cells in a table element that use the headers attribute must only refer to other cells of that same table\"},\"th-has-data-cells\":{description:\"Ensure that each table header in a data table refers to data cells\",help:\"All th elements and elements with role=columnheader/rowheader must have data cells they describe\"},\"valid-lang\":{description:\"Ensures lang attributes have valid values\",help:\"lang attribute must have a valid value\"},\"video-caption\":{description:\"Ensures <video> elements have captions\",help:\"<video> elements must have captions\"},\"video-description\":{description:\"Ensures <video> elements have audio descriptions\",help:\"<video> elements must have an audio description track\"}},checks:{accesskeys:{impact:\"serious\",messages:{pass:function(e){return\"Accesskey attribute value is unique\"},fail:function(e){return\"Document has multiple elements with the same accesskey\"}}},\"non-empty-alt\":{impact:\"critical\",messages:{pass:function(e){return\"Element has a non-empty alt attribute\"},fail:function(e){return\"Element has no alt attribute or the alt attribute is empty\"}}},\"non-empty-title\":{impact:\"serious\",messages:{pass:function(e){return\"Element has a title attribute\"},fail:function(e){return\"Element has no title attribute or the title attribute is empty\"}}},\"aria-label\":{impact:\"serious\",messages:{pass:function(e){return\"aria-label attribute exists and is not empty\"},fail:function(e){return\"aria-label attribute does not exist or is empty\"}}},\"aria-labelledby\":{impact:\"serious\",messages:{pass:function(e){return\"aria-labelledby attribute exists and references elements that are visible to screen readers\"},fail:function(e){return\"aria-labelledby attribute does not exist, references elements that do not exist or references elements that are empty\"}}},\"aria-allowed-attr\":{impact:\"critical\",messages:{pass:function(e){return\"ARIA attributes are used correctly for the defined role\"},fail:function(e){var t=\"ARIA attribute\"+(e.data&&1<e.data.length?\"s are\":\" is\")+\" not allowed:\",r=e.data;if(r)for(var a=-1,n=r.length-1;a<n;)t+=\" \"+r[a+=1];return t}}},\"aria-allowed-role\":{impact:\"minor\",messages:{pass:function(e){return\"ARIA role is allowed for given element\"},fail:function(e){return\"role\"+(e.data&&1<e.data.length?\"s\":\"\")+\" \"+e.data.join(\", \")+\" \"+(e.data&&1<e.data.length?\"are\":\" is\")+\" not allowed for given element\"}}},\"implicit-role-fallback\":{impact:\"moderate\",messages:{pass:function(e){return\"Element’s implicit ARIA role is an appropriate fallback\"},fail:function(e){return\"Element’s implicit ARIA role is not a good fallback for the (unsupported) role\"}}},\"aria-hidden-body\":{impact:\"critical\",messages:{pass:function(e){return\"No aria-hidden attribute is present on document body\"},fail:function(e){return\"aria-hidden=true should not be present on the document body\"}}},\"aria-required-attr\":{impact:\"critical\",messages:{pass:function(e){return\"All required ARIA attributes are present\"},fail:function(e){var t=\"Required ARIA attribute\"+(e.data&&1<e.data.length?\"s\":\"\")+\" not present:\",r=e.data;if(r)for(var a=-1,n=r.length-1;a<n;)t+=\" \"+r[a+=1];return t}}},\"aria-required-children\":{impact:\"critical\",messages:{pass:function(e){return\"Required ARIA children are present\"},fail:function(e){var t=\"Required ARIA \"+(e.data&&1<e.data.length?\"children\":\"child\")+\" role not present:\",r=e.data;if(r)for(var a=-1,n=r.length-1;a<n;)t+=\" \"+r[a+=1];return t},incomplete:function(e){var t=\"Expecting ARIA \"+(e.data&&1<e.data.length?\"children\":\"child\")+\" role to be added:\",r=e.data;if(r)for(var a=-1,n=r.length-1;a<n;)t+=\" \"+r[a+=1];return t}}},\"aria-required-parent\":{impact:\"critical\",messages:{pass:function(e){return\"Required ARIA parent role present\"},fail:function(e){var t=\"Required ARIA parent\"+(e.data&&1<e.data.length?\"s\":\"\")+\" role not present:\",r=e.data;if(r)for(var a=-1,n=r.length-1;a<n;)t+=\" \"+r[a+=1];return t}}},invalidrole:{impact:\"critical\",messages:{pass:function(e){return\"ARIA role is valid\"},fail:function(e){return\"Role must be one of the valid ARIA roles\"}}},abstractrole:{impact:\"serious\",messages:{pass:function(e){return\"Abstract roles are not used\"},fail:function(e){return\"Abstract roles cannot be directly used\"}}},unsupportedrole:{impact:\"critical\",messages:{pass:function(e){return\"ARIA role is supported\"},fail:function(e){return\"The role used is not widely supported in assistive technologies\"}}},\"aria-valid-attr-value\":{impact:\"critical\",messages:{pass:function(e){return\"ARIA attribute values are valid\"},fail:function(e){var t=\"Invalid ARIA attribute value\"+(e.data&&1<e.data.length?\"s\":\"\")+\":\",r=e.data;if(r)for(var a=-1,n=r.length-1;a<n;)t+=\" \"+r[a+=1];return t}}},\"aria-errormessage\":{impact:\"critical\",messages:{pass:function(e){return\"Uses a supported aria-errormessage technique\"},fail:function(e){var t=\"aria-errormessage value\"+(e.data&&1<e.data.length?\"s\":\"\")+\" \",r=e.data;if(r)for(var a=-1,n=r.length-1;a<n;)t+=\" `\"+r[a+=1];return t+=\"` must use a technique to announce the message (e.g., aria-live, aria-describedby, role=alert, etc.)\"}}},\"aria-valid-attr\":{impact:\"critical\",messages:{pass:function(e){return\"ARIA attribute name\"+(e.data&&1<e.data.length?\"s\":\"\")+\" are valid\"},fail:function(e){var t=\"Invalid ARIA attribute name\"+(e.data&&1<e.data.length?\"s\":\"\")+\":\",r=e.data;if(r)for(var a=-1,n=r.length-1;a<n;)t+=\" \"+r[a+=1];return t}}},caption:{impact:\"critical\",messages:{pass:function(e){return\"The multimedia element has a captions track\"},incomplete:function(e){return\"Check that captions is available for the element\"}}},\"autocomplete-valid\":{impact:\"serious\",messages:{pass:function(e){return\"the autocomplete attribute is correctly formatted\"},fail:function(e){return\"the autocomplete attribute is incorrectly formatted\"}}},\"autocomplete-appropriate\":{impact:\"serious\",messages:{pass:function(e){return\"the autocomplete value is on an appropriate element\"},fail:function(e){return\"the autocomplete value is inappropriate for this type of input\"}}},\"is-on-screen\":{impact:\"serious\",messages:{pass:function(e){return\"Element is not visible\"},fail:function(e){return\"Element is visible\"}}},\"non-empty-if-present\":{impact:\"critical\",messages:{pass:function(e){var t=\"Element \";return e.data?t+=\"has a non-empty value attribute\":t+=\"does not have a value attribute\",t},fail:function(e){return\"Element has a value attribute and the value attribute is empty\"}}},\"non-empty-value\":{impact:\"critical\",messages:{pass:function(e){return\"Element has a non-empty value attribute\"},fail:function(e){return\"Element has no value attribute or the value attribute is empty\"}}},\"button-has-visible-text\":{impact:\"critical\",messages:{pass:function(e){return\"Element has inner text that is visible to screen readers\"},fail:function(e){return\"Element does not have inner text that is visible to screen readers\"}}},\"role-presentation\":{impact:\"minor\",messages:{pass:function(e){return'Element\\'s default semantics were overriden with role=\"presentation\"'},fail:function(e){return'Element\\'s default semantics were not overridden with role=\"presentation\"'}}},\"role-none\":{impact:\"minor\",messages:{pass:function(e){return'Element\\'s default semantics were overriden with role=\"none\"'},fail:function(e){return'Element\\'s default semantics were not overridden with role=\"none\"'}}},\"focusable-no-name\":{impact:\"serious\",messages:{pass:function(e){return\"Element is not in tab order or has accessible text\"},fail:function(e){return\"Element is in tab order and does not have accessible text\"}}},\"internal-link-present\":{impact:\"serious\",messages:{pass:function(e){return\"Valid skip link found\"},fail:function(e){return\"No valid skip link found\"}}},\"header-present\":{impact:\"serious\",messages:{pass:function(e){return\"Page has a header\"},fail:function(e){return\"Page does not have a header\"}}},landmark:{impact:\"serious\",messages:{pass:function(e){return\"Page has a landmark region\"},fail:function(e){return\"Page does not have a landmark region\"}}},\"group-labelledby\":{impact:\"critical\",messages:{pass:function(e){return'All elements with the name \"'+e.data.name+'\" reference the same element with aria-labelledby'},fail:function(e){return'All elements with the name \"'+e.data.name+'\" do not reference the same element with aria-labelledby'}}},fieldset:{impact:\"critical\",messages:{pass:function(e){return\"Element is contained in a fieldset\"},fail:function(e){var t=\"\",r=e.data&&e.data.failureCode;return t+=\"no-legend\"===r?\"Fieldset does not have a legend as its first child\":\"empty-legend\"===r?\"Legend does not have text that is visible to screen readers\":\"mixed-inputs\"===r?\"Fieldset contains unrelated inputs\":\"no-group-label\"===r?\"ARIA group does not have aria-label or aria-labelledby\":\"group-mixed-inputs\"===r?\"ARIA group contains unrelated inputs\":\"Element does not have a containing fieldset or ARIA group\"}}},\"color-contrast\":{impact:\"serious\",messages:{pass:function(e){return\"Element has sufficient color contrast of \"+e.data.contrastRatio},fail:function(e){return\"Element has insufficient color contrast of \"+e.data.contrastRatio+\" (foreground color: \"+e.data.fgColor+\", background color: \"+e.data.bgColor+\", font size: \"+e.data.fontSize+\", font weight: \"+e.data.fontWeight+\"). Expected contrast ratio of \"+e.data.expectedContrastRatio},incomplete:{bgImage:\"Element's background color could not be determined due to a background image\",bgGradient:\"Element's background color could not be determined due to a background gradient\",imgNode:\"Element's background color could not be determined because element contains an image node\",bgOverlap:\"Element's background color could not be determined because it is overlapped by another element\",fgAlpha:\"Element's foreground color could not be determined because of alpha transparency\",elmPartiallyObscured:\"Element's background color could not be determined because it's partially obscured by another element\",elmPartiallyObscuring:\"Element's background color could not be determined because it partially overlaps other elements\",outsideViewport:\"Element's background color could not be determined because it's outside the viewport\",equalRatio:\"Element has a 1:1 contrast ratio with the background\",shortTextContent:\"Element content is too short to determine if it is actual text content\",default:\"Unable to determine contrast ratio\"}}},\"css-orientation-lock\":{impact:\"serious\",messages:{pass:function(e){return\"Display is operable, and orientation lock does not exist\"},fail:function(e){return\"CSS Orientation lock is applied, and makes display inoperable\"}}},\"structured-dlitems\":{impact:\"serious\",messages:{pass:function(e){return\"When not empty, element has both <dt> and <dd> elements\"},fail:function(e){return\"When not empty, element does not have at least one <dt> element followed by at least one <dd> element\"}}},\"only-dlitems\":{impact:\"serious\",messages:{pass:function(e){return\"List element only has direct children that are allowed inside <dt> or <dd> elements\"},fail:function(e){return\"List element has direct children that are not allowed inside <dt> or <dd> elements\"}}},dlitem:{impact:\"serious\",messages:{pass:function(e){return\"Description list item has a <dl> parent element\"},fail:function(e){return\"Description list item does not have a <dl> parent element\"}}},\"doc-has-title\":{impact:\"serious\",messages:{pass:function(e){return\"Document has a non-empty <title> element\"},fail:function(e){return\"Document does not have a non-empty <title> element\"}}},\"duplicate-id-active\":{impact:\"serious\",messages:{pass:function(e){return\"Document has no active elements that share the same id attribute\"},fail:function(e){return\"Document has active elements with the same id attribute: \"+e.data}}},\"duplicate-id-aria\":{impact:\"critical\",messages:{pass:function(e){return\"Document has no elements referenced with ARIA or labels that share the same id attribute\"},fail:function(e){return\"Document has multiple elements referenced with ARIA with the same id attribute: \"+e.data}}},\"duplicate-id\":{impact:\"minor\",messages:{pass:function(e){return\"Document has no static elements that share the same id attribute\"},fail:function(e){return\"Document has multiple static elements with the same id attribute\"}}},\"has-visible-text\":{impact:\"minor\",messages:{pass:function(e){return\"Element has text that is visible to screen readers\"},fail:function(e){return\"Element does not have text that is visible to screen readers\"}}},\"has-widget-role\":{impact:\"minor\",messages:{pass:function(e){return\"Element has a widget role.\"},fail:function(e){return\"Element does not have a widget role.\"}}},\"valid-scrollable-semantics\":{impact:\"minor\",messages:{pass:function(e){return\"Element has valid semantics for an element in the focus order.\"},fail:function(e){return\"Element has invalid semantics for an element in the focus order.\"}}},\"frame-tested\":{impact:\"critical\",messages:{pass:function(e){return\"The iframe was tested with axe-core\"},fail:function(e){return\"The iframe could not be tested with axe-core\"},incomplete:function(e){return\"The iframe still has to be tested with axe-core\"}}},\"unique-frame-title\":{impact:\"serious\",messages:{pass:function(e){return\"Element's title attribute is unique\"},fail:function(e){return\"Element's title attribute is not unique\"}}},\"heading-order\":{impact:\"moderate\",messages:{pass:function(e){return\"Heading order valid\"},fail:function(e){return\"Heading order invalid\"}}},\"hidden-content\":{impact:\"minor\",messages:{pass:function(e){return\"All content on the page has been analyzed.\"},fail:function(e){return\"There were problems analyzing the content on this page.\"},incomplete:function(e){return\"There is hidden content on the page that was not analyzed. You will need to trigger the display of this content in order to analyze it.\"}}},\"has-lang\":{impact:\"serious\",messages:{pass:function(e){return\"The <html> element has a lang attribute\"},fail:function(e){return\"The <html> element does not have a lang attribute\"}}},\"valid-lang\":{impact:\"serious\",messages:{pass:function(e){return\"Value of lang attribute is included in the list of valid languages\"},fail:function(e){return\"Value of lang attribute not included in the list of valid languages\"}}},\"xml-lang-mismatch\":{impact:\"moderate\",messages:{pass:function(e){return\"Lang and xml:lang attributes have the same base language\"},fail:function(e){return\"Lang and xml:lang attributes do not have the same base language\"}}},\"has-alt\":{impact:\"critical\",messages:{pass:function(e){return\"Element has an alt attribute\"},fail:function(e){return\"Element does not have an alt attribute\"}}},\"duplicate-img-label\":{impact:\"minor\",messages:{pass:function(e){return\"Element does not duplicate existing text in <img> alt text\"},fail:function(e){return\"Element contains <img> element with alt text that duplicates existing text\"}}},\"title-only\":{impact:\"serious\",messages:{pass:function(e){return\"Form element does not solely use title attribute for its label\"},fail:function(e){return\"Only title used to generate label for form element\"}}},\"implicit-label\":{impact:\"critical\",messages:{pass:function(e){return\"Form element has an implicit (wrapped) <label>\"},fail:function(e){return\"Form element does not have an implicit (wrapped) <label>\"}}},\"explicit-label\":{impact:\"critical\",messages:{pass:function(e){return\"Form element has an explicit <label>\"},fail:function(e){return\"Form element does not have an explicit <label>\"}}},\"help-same-as-label\":{impact:\"minor\",messages:{pass:function(e){return\"Help text (title or aria-describedby) does not duplicate label text\"},fail:function(e){return\"Help text (title or aria-describedby) text is the same as the label text\"}}},\"multiple-label\":{impact:\"serious\",messages:{pass:function(e){return\"Form element does not have multiple <label> elements\"},fail:function(e){return\"Form element has multiple <label> elements\"}}},\"hidden-explicit-label\":{impact:\"critical\",messages:{pass:function(e){return\"Form element has a visible explicit <label>\"},fail:function(e){return\"Form element has explicit <label> that is hidden\"}}},\"landmark-is-top-level\":{impact:\"moderate\",messages:{pass:function(e){return\"The \"+e.data.role+\" landmark is at the top level.\"},fail:function(e){return\"The \"+e.data.role+\" landmark is contained in another landmark.\"}}},\"page-no-duplicate-banner\":{impact:\"moderate\",messages:{pass:function(e){return\"Document has no more than one banner landmark\"},fail:function(e){return\"Document has more than one banner landmark\"}}},\"page-no-duplicate-contentinfo\":{impact:\"moderate\",messages:{pass:function(e){return\"Page does not have more than one contentinfo landmark\"},fail:function(e){return\"Page has more than one contentinfo landmark\"}}},\"page-has-main\":{impact:\"moderate\",messages:{pass:function(e){return\"Page has at least one main landmark\"},fail:function(e){return\"Page does not have a main landmark\"}}},\"page-no-duplicate-main\":{impact:\"moderate\",messages:{pass:function(e){return\"Page does not have more than one main landmark\"},fail:function(e){return\"Page has more than one main landmark\"}}},\"has-th\":{impact:\"serious\",messages:{pass:function(e){return\"Layout table does not use <th> elements\"},fail:function(e){return\"Layout table uses <th> elements\"}}},\"has-caption\":{impact:\"serious\",messages:{pass:function(e){return\"Layout table does not use <caption> element\"},fail:function(e){return\"Layout table uses <caption> element\"}}},\"has-summary\":{impact:\"serious\",messages:{pass:function(e){return\"Layout table does not use summary attribute\"},fail:function(e){return\"Layout table uses summary attribute\"}}},\"link-in-text-block\":{impact:\"serious\",messages:{pass:function(e){return\"Links can be distinguished from surrounding text in some way other than by color\"},fail:function(e){return\"Links need to be distinguished from surrounding text in some way other than by color\"},incomplete:{bgContrast:\"Element's contrast ratio could not be determined. Check for a distinct hover/focus style\",bgImage:\"Element's contrast ratio could not be determined due to a background image\",bgGradient:\"Element's contrast ratio could not be determined due to a background gradient\",imgNode:\"Element's contrast ratio could not be determined because element contains an image node\",bgOverlap:\"Element's contrast ratio could not be determined because of element overlap\",default:\"Unable to determine contrast ratio\"}}},\"only-listitems\":{impact:\"serious\",messages:{pass:function(e){return\"List element only has direct children that are allowed inside <li> elements\"},fail:function(e){return\"List element has direct children that are not allowed inside <li> elements\"}}},listitem:{impact:\"serious\",messages:{pass:function(e){return'List item has a <ul>, <ol> or role=\"list\" parent element'},fail:function(e){return'List item does not have a <ul>, <ol> or role=\"list\" parent element'}}},\"meta-refresh\":{impact:\"critical\",messages:{pass:function(e){return\"<meta> tag does not immediately refresh the page\"},fail:function(e){return\"<meta> tag forces timed refresh of page\"}}},\"meta-viewport-large\":{impact:\"minor\",messages:{pass:function(e){return\"<meta> tag does not prevent significant zooming on mobile devices\"},fail:function(e){return\"<meta> tag limits zooming on mobile devices\"}}},\"meta-viewport\":{impact:\"critical\",messages:{pass:function(e){return\"<meta> tag does not disable zooming on mobile devices\"},fail:function(e){return e.data+\" on <meta> tag disables zooming on mobile devices\"}}},\"p-as-heading\":{impact:\"serious\",messages:{pass:function(e){return\"<p> elements are not styled as headings\"},fail:function(e){return\"Heading elements should be used instead of styled p elements\"}}},\"page-has-heading-one\":{impact:\"moderate\",messages:{pass:function(e){return\"Page has at least one level-one heading\"},fail:function(e){return\"Page must have a level-one heading\"}}},region:{impact:\"moderate\",messages:{pass:function(e){return\"All page content is contained by landmarks\"},fail:function(e){return\"Some page content is not contained by landmarks\"}}},\"html5-scope\":{impact:\"moderate\",messages:{pass:function(e){return\"Scope attribute is only used on table header elements (<th>)\"},fail:function(e){return\"In HTML 5, scope attributes may only be used on table header elements (<th>)\"}}},\"scope-value\":{impact:\"critical\",messages:{pass:function(e){return\"Scope attribute is used correctly\"},fail:function(e){return\"The value of the scope attribute may only be 'row' or 'col'\"}}},exists:{impact:\"minor\",messages:{pass:function(e){return\"Element does not exist\"},fail:function(e){return\"Element exists\"}}},\"skip-link\":{impact:\"moderate\",messages:{pass:function(e){return\"Skip link target exists\"},incomplete:function(e){return\"Skip link target should become visible on activation\"},fail:function(e){return\"No skip link target\"}}},tabindex:{impact:\"serious\",messages:{pass:function(e){return\"Element does not have a tabindex greater than 0\"},fail:function(e){return\"Element has a tabindex greater than 0\"}}},\"same-caption-summary\":{impact:\"minor\",messages:{pass:function(e){return\"Content of summary attribute and <caption> are not duplicated\"},fail:function(e){return\"Content of summary attribute and <caption> element are identical\"}}},\"caption-faked\":{impact:\"serious\",messages:{pass:function(e){return\"The first row of a table is not used as a caption\"},fail:function(e){return\"The first row of the table should be a caption instead of a table cell\"}}},\"td-has-header\":{impact:\"critical\",messages:{pass:function(e){return\"All non-empty data cells have table headers\"},fail:function(e){return\"Some non-empty data cells do not have table headers\"}}},\"td-headers-attr\":{impact:\"serious\",messages:{pass:function(e){return\"The headers attribute is exclusively used to refer to other cells in the table\"},fail:function(e){return\"The headers attribute is not exclusively used to refer to other cells in the table\"}}},\"th-has-data-cells\":{impact:\"serious\",messages:{pass:function(e){return\"All table header cells refer to data cells\"},fail:function(e){return\"Not all table header cells refer to data cells\"},incomplete:function(e){return\"Table data cells are missing or empty\"}}},description:{impact:\"critical\",messages:{pass:function(e){return\"The multimedia element has an audio description track\"},incomplete:function(e){return\"Check that audio description is available for the element\"}}}},failureSummaries:{any:{failureMessage:function(e){var t=\"Fix any of the following:\",r=e;if(r)for(var a=-1,n=r.length-1;a<n;)t+=\"\\n \"+r[a+=1].split(\"\\n\").join(\"\\n \");return t}},none:{failureMessage:function(e){var t=\"Fix all of the following:\",r=e;if(r)for(var a=-1,n=r.length-1;a<n;)t+=\"\\n \"+r[a+=1].split(\"\\n\").join(\"\\n \");return t}}},incompleteFallbackMessage:function(e){return\"aXe couldn't tell the reason. Time to break out the element inspector!\"}},rules:[{id:\"accesskeys\",selector:\"[accesskey]\",excludeHidden:!1,tags:[\"best-practice\",\"cat.keyboard\"],all:[],any:[],none:[\"accesskeys\"]},{id:\"area-alt\",selector:\"map area[href]\",excludeHidden:!1,tags:[\"cat.text-alternatives\",\"wcag2a\",\"wcag111\",\"section508\",\"section508.22.a\"],all:[],any:[\"non-empty-alt\",\"non-empty-title\",\"aria-label\",\"aria-labelledby\"],none:[]},{id:\"aria-allowed-attr\",matches:function(e,t){var r=e.getAttribute(\"role\");r||(r=axe.commons.aria.implicitRole(e));var a=axe.commons.aria.allowedAttr(r);if(r&&a){var n=/^aria-/;if(e.hasAttributes())for(var o=e.attributes,i=0,s=o.length;i<s;i++)if(n.test(o[i].name))return!0}return!1},tags:[\"cat.aria\",\"wcag2a\",\"wcag412\"],all:[],any:[\"aria-allowed-attr\"],none:[]},{id:\"aria-allowed-role\",excludeHidden:!1,selector:\"[role]\",matches:function(e,t){return null!==axe.commons.aria.getRole(e,{noImplicit:!0,dpub:!0,fallback:!0})},tags:[\"cat.aria\",\"best-practice\"],all:[],any:[{options:{allowImplicit:!0,ignoredTags:[]},id:\"aria-allowed-role\"}],none:[]},{id:\"aria-dpub-role-fallback\",selector:\"[role]\",matches:function(e,t){var r=e.getAttribute(\"role\");return[\"doc-backlink\",\"doc-biblioentry\",\"doc-biblioref\",\"doc-cover\",\"doc-endnote\",\"doc-glossref\",\"doc-noteref\"].includes(r)},tags:[\"cat.aria\",\"wcag2a\",\"wcag131\"],all:[\"implicit-role-fallback\"],any:[],none:[]},{id:\"aria-hidden-body\",selector:\"body\",excludeHidden:!1,tags:[\"cat.aria\",\"wcag2a\",\"wcag412\"],all:[],any:[\"aria-hidden-body\"],none:[]},{id:\"aria-required-attr\",selector:\"[role]\",tags:[\"cat.aria\",\"wcag2a\",\"wcag412\"],all:[],any:[\"aria-required-attr\"],none:[]},{id:\"aria-required-children\",selector:\"[role]\",tags:[\"cat.aria\",\"wcag2a\",\"wcag131\"],all:[],any:[{options:{reviewEmpty:[\"listbox\"]},id:\"aria-required-children\"}],none:[]},{id:\"aria-required-parent\",selector:\"[role]\",tags:[\"cat.aria\",\"wcag2a\",\"wcag131\"],all:[],any:[\"aria-required-parent\"],none:[]},{id:\"aria-roles\",selector:\"[role]\",tags:[\"cat.aria\",\"wcag2a\",\"wcag412\"],all:[],any:[],none:[\"invalidrole\",\"abstractrole\",\"unsupportedrole\"]},{id:\"aria-valid-attr-value\",matches:function(e,t){var r=/^aria-/;if(e.hasAttributes())for(var a=e.attributes,n=0,o=a.length;n<o;n++)if(r.test(a[n].name))return!0;return!1},tags:[\"cat.aria\",\"wcag2a\",\"wcag412\"],all:[{options:[],id:\"aria-valid-attr-value\"},\"aria-errormessage\"],any:[],none:[]},{id:\"aria-valid-attr\",matches:function(e,t){var r=/^aria-/;if(e.hasAttributes())for(var a=e.attributes,n=0,o=a.length;n<o;n++)if(r.test(a[n].name))return!0;return!1},tags:[\"cat.aria\",\"wcag2a\",\"wcag412\"],all:[],any:[{options:[],id:\"aria-valid-attr\"}],none:[]},{id:\"audio-caption\",selector:\"audio\",enabled:!1,excludeHidden:!1,tags:[\"cat.time-and-media\",\"wcag2a\",\"wcag121\",\"section508\",\"section508.22.a\"],all:[],any:[],none:[\"caption\"]},{id:\"autocomplete-valid\",matches:function(e,t){var r=axe.commons,a=r.text,n=r.aria,o=r.dom,i=e.getAttribute(\"autocomplete\");if(!i||\"\"===a.sanitize(i))return!1;var s=e.nodeName.toUpperCase();if(!1===[\"TEXTAREA\",\"INPUT\",\"SELECT\"].includes(s))return!1;if(\"INPUT\"===s&&[\"submit\",\"reset\",\"button\",\"hidden\"].includes(e.type))return!1;var l=e.getAttribute(\"aria-disabled\")||\"false\";if(e.disabled||\"true\"===l.toLowerCase())return!1;var u=e.getAttribute(\"role\"),c=e.getAttribute(\"tabindex\");if(\"-1\"===c&&u){var d=n.lookupTable.role[u];if(void 0===d||\"widget\"!==d.type)return!1}return!(\"-1\"===c&&!o.isVisible(e,!1)&&!o.isVisible(e,!0))},tags:[\"cat.forms\",\"wcag21aa\",\"wcag135\"],all:[\"autocomplete-valid\",\"autocomplete-appropriate\"],any:[],none:[]},{id:\"blink\",selector:\"blink\",excludeHidden:!1,tags:[\"cat.time-and-media\",\"wcag2a\",\"wcag222\",\"section508\",\"section508.22.j\"],all:[],any:[],none:[\"is-on-screen\"]},{id:\"button-name\",selector:'button, [role=\"button\"], input[type=\"button\"], input[type=\"submit\"], input[type=\"reset\"]',tags:[\"cat.name-role-value\",\"wcag2a\",\"wcag412\",\"section508\",\"section508.22.a\"],all:[],any:[\"non-empty-if-present\",\"non-empty-value\",\"button-has-visible-text\",\"aria-label\",\"aria-labelledby\",\"role-presentation\",\"role-none\",\"non-empty-title\"],none:[\"focusable-no-name\"]},{id:\"bypass\",selector:\"html\",pageLevel:!0,matches:function(e,t){return!!e.querySelector(\"a[href]\")},tags:[\"cat.keyboard\",\"wcag2a\",\"wcag241\",\"section508\",\"section508.22.o\"],all:[],any:[\"internal-link-present\",\"header-present\",\"landmark\"],none:[]},{id:\"checkboxgroup\",selector:\"input[type=checkbox][name]\",tags:[\"cat.forms\",\"best-practice\"],all:[],any:[\"group-labelledby\",\"fieldset\"],none:[]},{id:\"color-contrast\",matches:function(e,t){var r=e.nodeName.toUpperCase(),a=e.type;if(\"true\"===e.getAttribute(\"aria-disabled\")||axe.commons.dom.findUpVirtual(t,'[aria-disabled=\"true\"]'))return!1;if(\"INPUT\"===r)return-1===[\"hidden\",\"range\",\"color\",\"checkbox\",\"radio\",\"image\"].indexOf(a)&&!e.disabled;if(\"SELECT\"===r)return!!e.options.length&&!e.disabled;if(\"TEXTAREA\"===r)return!e.disabled;if(\"OPTION\"===r)return!1;if(\"BUTTON\"===r&&e.disabled||axe.commons.dom.findUpVirtual(t,\"button[disabled]\"))return!1;if(\"FIELDSET\"===r&&e.disabled||axe.commons.dom.findUpVirtual(t,\"fieldset[disabled]\"))return!1;var n=axe.commons.dom.findUpVirtual(t,\"label\");if(\"LABEL\"===r||n){var o=e,i=t;n&&(o=n,i=axe.utils.getNodeFromTree(axe._tree[0],n));var s=axe.commons.dom.getRootNode(o);if((l=o.htmlFor&&s.getElementById(o.htmlFor))&&l.disabled)return!1;if((l=axe.utils.querySelectorAll(i,'input:not([type=\"hidden\"]):not([type=\"image\"]):not([type=\"button\"]):not([type=\"submit\"]):not([type=\"reset\"]), select, textarea')).length&&l[0].actualNode.disabled)return!1}if(e.getAttribute(\"id\")){var l,u=axe.commons.utils.escapeSelector(e.getAttribute(\"id\"));if((l=axe.commons.dom.getRootNode(e).querySelector(\"[aria-labelledby~=\"+u+\"]\"))&&l.disabled)return!1}if(\"\"===axe.commons.text.visibleVirtual(t,!1,!0))return!1;var c,d,m=document.createRange(),p=t.children,f=p.length;for(d=0;d<f;d++)3===(c=p[d]).actualNode.nodeType&&\"\"!==axe.commons.text.sanitize(c.actualNode.nodeValue)&&m.selectNodeContents(c.actualNode);var h=m.getClientRects();for(f=h.length,d=0;d<f;d++)if(axe.commons.dom.visuallyOverlaps(h[d],e))return!0;return!1},excludeHidden:!1,options:{noScroll:!1},tags:[\"cat.color\",\"wcag2aa\",\"wcag143\"],all:[],any:[\"color-contrast\"],none:[]},{id:\"css-orientation-lock\",selector:\"html\",tags:[\"cat.structure\",\"wcag262\",\"wcag21aa\",\"experimental\"],all:[\"css-orientation-lock\"],any:[],none:[],preload:!0},{id:\"definition-list\",selector:\"dl\",matches:function(e,t){return!e.getAttribute(\"role\")},tags:[\"cat.structure\",\"wcag2a\",\"wcag131\"],all:[],any:[],none:[\"structured-dlitems\",\"only-dlitems\"]},{id:\"dlitem\",selector:\"dd, dt\",matches:function(e,t){return!e.getAttribute(\"role\")},tags:[\"cat.structure\",\"wcag2a\",\"wcag131\"],all:[],any:[\"dlitem\"],none:[]},{id:\"document-title\",selector:\"html\",matches:function(e,t){return e.ownerDocument.defaultView.self===e.ownerDocument.defaultView.top},tags:[\"cat.text-alternatives\",\"wcag2a\",\"wcag242\"],all:[],any:[\"doc-has-title\"],none:[]},{id:\"duplicate-id-active\",selector:\"[id]\",matches:function(e,t){var r=axe.commons,a=r.dom,n=r.aria,o=e.getAttribute(\"id\").trim(),i='*[id=\"'+axe.utils.escapeSelector(o)+'\"]';return Array.from(a.getRootNode(e).querySelectorAll(i)).some(a.isFocusable)&&!n.isAccessibleRef(e)},excludeHidden:!1,tags:[\"cat.parsing\",\"wcag2a\",\"wcag411\"],all:[],any:[\"duplicate-id-active\"],none:[]},{id:\"duplicate-id-aria\",selector:\"[id]\",matches:function(e,t){return axe.commons.aria.isAccessibleRef(e)},excludeHidden:!1,tags:[\"cat.parsing\",\"wcag2a\",\"wcag411\"],all:[],any:[\"duplicate-id-aria\"],none:[]},{id:\"duplicate-id\",selector:\"[id]\",matches:function(e,t){var r=axe.commons,a=r.dom,n=r.aria,o=e.getAttribute(\"id\").trim(),i='*[id=\"'+axe.utils.escapeSelector(o)+'\"]';return Array.from(a.getRootNode(e).querySelectorAll(i)).every(function(e){return!a.isFocusable(e)})&&!n.isAccessibleRef(e)},excludeHidden:!1,tags:[\"cat.parsing\",\"wcag2a\",\"wcag411\"],all:[],any:[\"duplicate-id\"],none:[]},{id:\"empty-heading\",selector:'h1, h2, h3, h4, h5, h6, [role=\"heading\"]',matches:function(e,t){var r=void 0;return e.hasAttribute(\"role\")&&(r=e.getAttribute(\"role\").split(/\\s+/i).filter(axe.commons.aria.isValidRole)),r&&0<r.length?r.includes(\"heading\"):\"heading\"===axe.commons.aria.implicitRole(e)},tags:[\"cat.name-role-value\",\"best-practice\"],all:[],any:[\"has-visible-text\"],none:[]},{id:\"focus-order-semantics\",selector:\"div, h1, h2, h3, h4, h5, h6, [role=heading], p, span\",matches:function(e,t){return axe.commons.dom.insertedIntoFocusOrder(e)},tags:[\"cat.keyboard\",\"best-practice\",\"experimental\"],all:[],any:[{options:[],id:\"has-widget-role\"},{options:[],id:\"valid-scrollable-semantics\"}],none:[]},{id:\"frame-tested\",selector:\"frame, iframe\",tags:[\"cat.structure\",\"review-item\"],all:[{options:{isViolation:!1},id:\"frame-tested\"}],any:[],none:[]},{id:\"frame-title-unique\",selector:\"frame[title], iframe[title]\",matches:function(e,t){var r=e.getAttribute(\"title\");return!(!r||!axe.commons.text.sanitize(r).trim())},tags:[\"cat.text-alternatives\",\"best-practice\"],all:[],any:[],none:[\"unique-frame-title\"]},{id:\"frame-title\",selector:\"frame, iframe\",tags:[\"cat.text-alternatives\",\"wcag2a\",\"wcag241\",\"wcag412\",\"section508\",\"section508.22.i\"],all:[],any:[\"aria-label\",\"aria-labelledby\",\"non-empty-title\",\"role-presentation\",\"role-none\"],none:[]},{id:\"heading-order\",selector:\"h1, h2, h3, h4, h5, h6, [role=heading]\",matches:function(e,t){var r=void 0;return e.hasAttribute(\"role\")&&(r=e.getAttribute(\"role\").split(/\\s+/i).filter(axe.commons.aria.isValidRole)),r&&0<r.length?r.includes(\"heading\"):\"heading\"===axe.commons.aria.implicitRole(e)},tags:[\"cat.semantics\",\"best-practice\"],all:[],any:[\"heading-order\"],none:[]},{id:\"hidden-content\",selector:\"*\",excludeHidden:!1,tags:[\"cat.structure\",\"experimental\",\"review-item\"],all:[],any:[\"hidden-content\"],none:[]},{id:\"html-has-lang\",selector:\"html\",tags:[\"cat.language\",\"wcag2a\",\"wcag311\"],all:[],any:[\"has-lang\"],none:[]},{id:\"html-lang-valid\",selector:\"html[lang]\",tags:[\"cat.language\",\"wcag2a\",\"wcag311\"],all:[],any:[],none:[\"valid-lang\"]},{id:\"html-xml-lang-mismatch\",selector:\"html[lang][xml\\\\:lang]\",matches:function(e,t){var r=axe.commons.utils.getBaseLang,a=r(e.getAttribute(\"lang\")),n=r(e.getAttribute(\"xml:lang\"));return axe.utils.validLangs().includes(a)&&axe.utils.validLangs().includes(n)},tags:[\"cat.language\",\"wcag2a\",\"wcag311\"],all:[\"xml-lang-mismatch\"],any:[],none:[]},{id:\"image-alt\",selector:\"img, [role='img']:not(svg)\",tags:[\"cat.text-alternatives\",\"wcag2a\",\"wcag111\",\"section508\",\"section508.22.a\"],all:[],any:[\"has-alt\",\"aria-label\",\"aria-labelledby\",\"non-empty-title\",\"role-presentation\",\"role-none\"],none:[]},{id:\"image-redundant-alt\",selector:'button, [role=\"button\"], a[href], p, li, td, th',tags:[\"cat.text-alternatives\",\"best-practice\"],all:[],any:[],none:[\"duplicate-img-label\"]},{id:\"input-image-alt\",selector:'input[type=\"image\"]',tags:[\"cat.text-alternatives\",\"wcag2a\",\"wcag111\",\"section508\",\"section508.22.a\"],all:[],any:[\"non-empty-alt\",\"aria-label\",\"aria-labelledby\",\"non-empty-title\"],none:[]},{id:\"label-title-only\",selector:\"input, select, textarea\",matches:function(e,t){if(\"input\"!==e.nodeName.toLowerCase()||!1===e.hasAttribute(\"type\"))return!0;var r=e.getAttribute(\"type\").toLowerCase();return!1===[\"hidden\",\"image\",\"button\",\"submit\",\"reset\"].includes(r)},tags:[\"cat.forms\",\"best-practice\"],all:[],any:[],none:[\"title-only\"]},{id:\"label\",selector:\"input, select, textarea\",matches:function(e,t){if(\"input\"!==e.nodeName.toLowerCase()||!1===e.hasAttribute(\"type\"))return!0;var r=e.getAttribute(\"type\").toLowerCase();return!1===[\"hidden\",\"image\",\"button\",\"submit\",\"reset\"].includes(r)},tags:[\"cat.forms\",\"wcag2a\",\"wcag332\",\"wcag131\",\"section508\",\"section508.22.n\"],all:[],any:[\"aria-label\",\"aria-labelledby\",\"implicit-label\",\"explicit-label\",\"non-empty-title\"],none:[\"help-same-as-label\",\"multiple-label\",\"hidden-explicit-label\"]},{id:\"landmark-banner-is-top-level\",selector:\"header:not([role]), [role=banner]\",matches:function(e,t){return e.hasAttribute(\"role\")||!axe.commons.dom.findUpVirtual(t,\"article, aside, main, nav, section\")},tags:[\"cat.semantics\",\"best-practice\"],all:[],any:[\"landmark-is-top-level\"],none:[]},{id:\"landmark-contentinfo-is-top-level\",selector:\"footer:not([role]), [role=contentinfo]\",matches:function(e,t){return e.hasAttribute(\"role\")||!axe.commons.dom.findUpVirtual(t,\"article, aside, main, nav, section\")},tags:[\"cat.semantics\",\"best-practice\"],all:[],any:[\"landmark-is-top-level\"],none:[]},{id:\"landmark-main-is-top-level\",selector:\"main:not([role]), [role=main]\",tags:[\"cat.semantics\",\"best-practice\"],all:[],any:[\"landmark-is-top-level\"],none:[]},{id:\"landmark-no-duplicate-banner\",selector:\"html\",tags:[\"cat.semantics\",\"best-practice\"],all:[],any:[{options:{selector:\"header:not([role]), [role=banner]\",nativeScopeFilter:\"article, aside, main, nav, section\"},id:\"page-no-duplicate-banner\"}],none:[]},{id:\"landmark-no-duplicate-contentinfo\",selector:\"html\",tags:[\"cat.semantics\",\"best-practice\"],all:[],any:[{options:{selector:\"footer:not([role]), [role=contentinfo]\",nativeScopeFilter:\"article, aside, main, nav, section\"},id:\"page-no-duplicate-contentinfo\"}],none:[]},{id:\"landmark-one-main\",selector:\"html\",tags:[\"cat.semantics\",\"best-practice\"],all:[{options:{selector:\"main:not([role]), [role='main']\"},id:\"page-has-main\"},{options:{selector:\"main:not([role]), [role='main']\"},id:\"page-no-duplicate-main\"}],any:[],none:[]},{id:\"layout-table\",selector:\"table\",matches:function(e,t){var r=(e.getAttribute(\"role\")||\"\").toLowerCase();return!((\"presentation\"===r||\"none\"===r)&&!axe.commons.dom.isFocusable(e)||axe.commons.table.isDataTable(e))},tags:[\"cat.semantics\",\"wcag2a\",\"wcag131\"],all:[],any:[],none:[\"has-th\",\"has-caption\",\"has-summary\"]},{id:\"link-in-text-block\",selector:\"a[href], [role=link]\",matches:function(e,t){var r=axe.commons.text.sanitize(e.textContent),a=e.getAttribute(\"role\");return(!a||\"link\"===a)&&(!!r&&(!!axe.commons.dom.isVisible(e,!1)&&axe.commons.dom.isInTextBlock(e)))},excludeHidden:!1,tags:[\"cat.color\",\"experimental\",\"wcag2a\",\"wcag141\"],all:[\"link-in-text-block\"],any:[],none:[]},{id:\"link-name\",selector:\"a[href], [role=link][href]\",matches:function(e,t){return\"button\"!==e.getAttribute(\"role\")},tags:[\"cat.name-role-value\",\"wcag2a\",\"wcag412\",\"wcag244\",\"section508\",\"section508.22.a\"],all:[],any:[\"has-visible-text\",\"aria-label\",\"aria-labelledby\",\"role-presentation\",\"role-none\"],none:[\"focusable-no-name\"]},{id:\"list\",selector:\"ul, ol\",matches:function(e,t){return!e.getAttribute(\"role\")},tags:[\"cat.structure\",\"wcag2a\",\"wcag131\"],all:[],any:[],none:[\"only-listitems\"]},{id:\"listitem\",selector:\"li\",matches:function(e,t){return!e.getAttribute(\"role\")},tags:[\"cat.structure\",\"wcag2a\",\"wcag131\"],all:[],any:[\"listitem\"],none:[]},{id:\"marquee\",selector:\"marquee\",excludeHidden:!1,tags:[\"cat.parsing\",\"wcag2a\",\"wcag222\"],all:[],any:[],none:[\"is-on-screen\"]},{id:\"meta-refresh\",selector:'meta[http-equiv=\"refresh\"]',excludeHidden:!1,tags:[\"cat.time\",\"wcag2a\",\"wcag2aaa\",\"wcag221\",\"wcag224\",\"wcag325\"],all:[],any:[\"meta-refresh\"],none:[]},{id:\"meta-viewport-large\",selector:'meta[name=\"viewport\"]',excludeHidden:!1,tags:[\"cat.sensory-and-visual-cues\",\"best-practice\"],all:[],any:[{options:{scaleMinimum:5,lowerBound:2},id:\"meta-viewport-large\"}],none:[]},{id:\"meta-viewport\",selector:'meta[name=\"viewport\"]',excludeHidden:!1,tags:[\"cat.sensory-and-visual-cues\",\"wcag2aa\",\"wcag144\"],all:[],any:[{options:{scaleMinimum:2},id:\"meta-viewport\"}],none:[]},{id:\"object-alt\",selector:\"object\",tags:[\"cat.text-alternatives\",\"wcag2a\",\"wcag111\",\"section508\",\"section508.22.a\"],all:[],any:[\"has-visible-text\",\"aria-label\",\"aria-labelledby\",\"non-empty-title\"],none:[]},{id:\"p-as-heading\",selector:\"p\",matches:function(e,t){var r=Array.from(e.parentNode.childNodes),a=e.textContent.trim();return!(0===a.length||2<=(a.match(/[.!?:;](?![.!?:;])/g)||[]).length)&&0!==r.slice(r.indexOf(e)+1).filter(function(e){return\"P\"===e.nodeName.toUpperCase()&&\"\"!==e.textContent.trim()}).length},tags:[\"cat.semantics\",\"wcag2a\",\"wcag131\",\"experimental\"],all:[{options:{margins:[{weight:150,italic:!0},{weight:150,size:1.15},{italic:!0,size:1.15},{size:1.4}]},id:\"p-as-heading\"}],any:[],none:[]},{id:\"page-has-heading-one\",selector:\"html\",tags:[\"cat.semantics\",\"best-practice\"],all:[{options:{selector:'h1:not([role]), [role=\"heading\"][aria-level=\"1\"]'},id:\"page-has-heading-one\"}],any:[],none:[]},{id:\"radiogroup\",selector:\"input[type=radio][name]\",tags:[\"cat.forms\",\"best-practice\"],all:[],any:[\"group-labelledby\",\"fieldset\"],none:[]},{id:\"region\",selector:\"html\",pageLevel:!0,tags:[\"cat.keyboard\",\"best-practice\"],all:[],any:[\"region\"],none:[]},{id:\"scope-attr-valid\",selector:\"td[scope], th[scope]\",tags:[\"cat.tables\",\"best-practice\"],all:[\"html5-scope\",\"scope-value\"],any:[],none:[]},{id:\"server-side-image-map\",selector:\"img[ismap]\",tags:[\"cat.text-alternatives\",\"wcag2a\",\"wcag211\",\"section508\",\"section508.22.f\"],all:[],any:[],none:[\"exists\"]},{id:\"skip-link\",selector:\"a[href]\",matches:function(e,t){return/^#[^/!]/.test(e.getAttribute(\"href\"))},tags:[\"cat.keyboard\",\"best-practice\"],all:[],any:[\"skip-link\"],none:[]},{id:\"tabindex\",selector:\"[tabindex]\",tags:[\"cat.keyboard\",\"best-practice\"],all:[],any:[\"tabindex\"],none:[]},{id:\"table-duplicate-name\",selector:\"table\",tags:[\"cat.tables\",\"best-practice\"],all:[],any:[],none:[\"same-caption-summary\"]},{id:\"table-fake-caption\",selector:\"table\",matches:function(e,t){return axe.commons.table.isDataTable(e)},tags:[\"cat.tables\",\"experimental\",\"wcag2a\",\"wcag131\",\"section508\",\"section508.22.g\"],all:[\"caption-faked\"],any:[],none:[]},{id:\"td-has-header\",selector:\"table\",matches:function(e,t){if(axe.commons.table.isDataTable(e)){var r=axe.commons.table.toArray(e);return 3<=r.length&&3<=r[0].length&&3<=r[1].length&&3<=r[2].length}return!1},tags:[\"cat.tables\",\"experimental\",\"wcag2a\",\"wcag131\",\"section508\",\"section508.22.g\"],all:[\"td-has-header\"],any:[],none:[]},{id:\"td-headers-attr\",selector:\"table\",tags:[\"cat.tables\",\"wcag2a\",\"wcag131\",\"section508\",\"section508.22.g\"],all:[\"td-headers-attr\"],any:[],none:[]},{id:\"th-has-data-cells\",selector:\"table\",matches:function(e,t){return axe.commons.table.isDataTable(e)},tags:[\"cat.tables\",\"wcag2a\",\"wcag131\",\"section508\",\"section508.22.g\"],all:[\"th-has-data-cells\"],any:[],none:[]},{id:\"valid-lang\",selector:\"[lang], [xml\\\\:lang]\",matches:function(e,t){return\"html\"!==e.nodeName.toLowerCase()},tags:[\"cat.language\",\"wcag2aa\",\"wcag312\"],all:[],any:[],none:[\"valid-lang\"]},{id:\"video-caption\",selector:\"video\",excludeHidden:!1,tags:[\"cat.text-alternatives\",\"wcag2a\",\"wcag122\",\"section508\",\"section508.22.a\"],all:[],any:[],none:[\"caption\"]},{id:\"video-description\",selector:\"video\",excludeHidden:!1,tags:[\"cat.text-alternatives\",\"wcag2aa\",\"wcag125\",\"section508\",\"section508.22.b\"],all:[],any:[],none:[\"description\"]}],checks:[{id:\"abstractrole\",evaluate:function(e,t,r,a){return\"abstract\"===axe.commons.aria.getRoleType(e.getAttribute(\"role\"))}},{id:\"aria-allowed-attr\",evaluate:function(e,t,r,a){t=t||{};var n,o,i,s=[],l=e.getAttribute(\"role\"),u=e.attributes;if(l||(l=axe.commons.aria.implicitRole(e)),i=axe.commons.aria.allowedAttr(l),Array.isArray(t[l])&&(i=axe.utils.uniqueArray(t[l].concat(i))),l&&i)for(var c=0,d=u.length;c<d;c++)o=(n=u[c]).name,axe.commons.aria.validateAttr(o)&&!i.includes(o)&&s.push(o+'=\"'+n.nodeValue+'\"');return!s.length||(this.data(s),!1)}},{id:\"aria-allowed-role\",evaluate:function(e,t,r,a){var n=t||{},o=n.allowImplicit,i=void 0===o||o,s=n.ignoredTags,l=void 0===s?[]:s,u=e.nodeName.toUpperCase();if(l.map(function(e){return e.toUpperCase()}).includes(u))return!0;var c=axe.commons.aria.getElementUnallowedRoles(e,i);return!c.length||(this.data(c),!1)},options:{allowImplicit:!0,ignoredTags:[]}},{id:\"aria-hidden-body\",evaluate:function(e,t,r,a){return\"true\"!==e.getAttribute(\"aria-hidden\")}},{id:\"aria-errormessage\",evaluate:function(t,e,r,a){e=Array.isArray(e)?e:[];var n=t.getAttribute(\"aria-errormessage\"),o=t.hasAttribute(\"aria-errormessage\"),i=axe.commons.dom.getRootNode(t);return!(-1===e.indexOf(n)&&o&&!function(){var e=n&&i.getElementById(n);if(e)return\"alert\"===e.getAttribute(\"role\")||\"assertive\"===e.getAttribute(\"aria-live\")||-1<axe.utils.tokenList(t.getAttribute(\"aria-describedby\")||\"\").indexOf(n)}())||(this.data(axe.utils.tokenList(n)),!1)}},{id:\"has-widget-role\",evaluate:function(e,t,r,a){var n=e.getAttribute(\"role\");if(null===n)return!1;var o=axe.commons.aria.getRoleType(n);return\"widget\"===o||\"composite\"===o},options:[]},{id:\"implicit-role-fallback\",evaluate:function(e,t,r,a){var n=e.getAttribute(\"role\");if(null===n||!axe.commons.aria.isValidRole(n))return!0;var o=axe.commons.aria.getRoleType(n);return axe.commons.aria.implicitRole(e)===o}},{id:\"invalidrole\",evaluate:function(e,t,r,a){return!axe.commons.aria.isValidRole(e.getAttribute(\"role\"),{allowAbstract:!0})}},{id:\"aria-required-attr\",evaluate:function(e,t,r,a){t=t||{};var n=[];if(e.hasAttributes()){var o,i=e.getAttribute(\"role\"),s=axe.commons.aria.requiredAttr(i);if(Array.isArray(t[i])&&(s=axe.utils.uniqueArray(t[i],s)),i&&s)for(var l=0,u=s.length;l<u;l++)o=s[l],e.getAttribute(o)||n.push(o)}return!n.length||(this.data(n),!1)}},{id:\"aria-required-children\",evaluate:function(e,t,m,r){var a=axe.commons.aria.requiredOwned,i=axe.commons.aria.implicitNodes,s=axe.commons.utils.matchesSelector,p=axe.commons.dom.idrefs,n=t&&Array.isArray(t.reviewEmpty)?t.reviewEmpty:[];function f(e,t,r,a){if(null===e)return!1;var n=i(r),o=['[role=\"'+r+'\"]'];return n&&(o=o.concat(n)),o=o.join(\",\"),a&&s(e,o)||!!axe.utils.querySelectorAll(t,o)[0]}function h(e,t){var r,a;for(r=0,a=e.length;r<a;r++)if(null!==e[r]){var n=axe.utils.getNodeFromTree(axe._tree[0],e[r]);if(f(e[r],n,t,!0))return!0}return!1}var o=e.getAttribute(\"role\"),l=a(o);if(!l)return!0;var u=!1,c=l.one;if(!c){u=!0;c=l.all}var d=function(e,t,r,a){var n,o=t.length,i=[],s=p(e,\"aria-owns\");for(n=0;n<o;n++){var l=t[n];if(f(e,m,l)||h(s,l)){if(!r)return null}else r&&i.push(l)}if(\"combobox\"===a){var u=i.indexOf(\"textbox\");0<=u&&\"INPUT\"===e.tagName&&[\"text\",\"search\",\"email\",\"url\",\"tel\"].includes(e.type)&&i.splice(u,1);var c=i.indexOf(\"listbox\"),d=e.getAttribute(\"aria-expanded\");0<=c&&(!d||\"false\"===d)&&i.splice(c,1)}return i.length?i:!r&&t.length?t:null}(e,c,u,o);return!d||(this.data(d),!!n.includes(o)&&void 0)},options:{reviewEmpty:[\"listbox\"]}},{id:\"aria-required-parent\",evaluate:function(e,t,r,a){function s(e){return(axe.commons.aria.implicitNodes(e)||[]).concat('[role=\"'+e+'\"]').join(\",\")}function n(e,t,r){var a,n,o=e.actualNode.getAttribute(\"role\"),i=[];if(t||(t=axe.commons.aria.requiredContext(o)),!t)return null;for(a=0,n=t.length;a<n;a++){if(r&&axe.utils.matchesSelector(e.actualNode,s(t[a])))return null;if(axe.commons.dom.findUpVirtual(e,s(t[a])))return null;i.push(t[a])}return i}var o=n(r);if(!o)return!0;var i=function(e){for(var t=[],r=null;e;){if(e.getAttribute(\"id\")){var a=axe.commons.utils.escapeSelector(e.getAttribute(\"id\"));(r=axe.commons.dom.getRootNode(e).querySelector(\"[aria-owns~=\"+a+\"]\"))&&t.push(r)}e=e.parentElement}return t.length?t:null}(e);if(i)for(var l=0,u=i.length;l<u;l++)if(!(o=n(axe.utils.getNodeFromTree(axe._tree[0],i[l]),o,!0)))return!0;return this.data(o),!1}},{id:\"unsupportedrole\",evaluate:function(e,t,r,a){return!axe.commons.aria.isValidRole(e.getAttribute(\"role\"),{flagUnsupported:!0})}},{id:\"aria-valid-attr-value\",evaluate:function(e,t,r,a){t=Array.isArray(t)?t:[];for(var n,o,i=[],s=/^aria-/,l=e.attributes,u=[\"aria-errormessage\"],c=0,d=l.length;c<d;c++)o=(n=l[c]).name,u.includes(o)||-1===t.indexOf(o)&&s.test(o)&&!axe.commons.aria.validateAttrValue(e,o)&&i.push(o+'=\"'+n.nodeValue+'\"');return!i.length||(this.data(i),!1)},options:[]},{id:\"aria-valid-attr\",evaluate:function(e,t,r,a){t=Array.isArray(t)?t:[];for(var n,o=[],i=/^aria-/,s=e.attributes,l=0,u=s.length;l<u;l++)n=s[l].name,-1===t.indexOf(n)&&i.test(n)&&!axe.commons.aria.validateAttr(n)&&o.push(n);return!o.length||(this.data(o),!1)},options:[]},{id:\"valid-scrollable-semantics\",evaluate:function(e,t,r,a){var n,o,i,s={ARTICLE:!0,ASIDE:!0,NAV:!0,SECTION:!0},l={application:!0,banner:!1,complementary:!0,contentinfo:!0,form:!0,main:!0,navigation:!0,region:!0,search:!1};return(i=(n=e).getAttribute(\"role\"))&&l[i.toLowerCase()]||(o=n.tagName.toUpperCase(),s[o]||!1)},options:[]},{id:\"color-contrast\",evaluate:function(e,t,r,a){var n=axe.commons,o=n.dom,i=n.color,s=n.text;if(!o.isVisible(e,!1))return!0;var l=!!(t||{}).noScroll,u=[],c=i.getBackgroundColor(e,u,l),d=i.getForegroundColor(e,l),m=window.getComputedStyle(e),p=parseFloat(m.getPropertyValue(\"font-size\")),f=m.getPropertyValue(\"font-weight\"),h=-1!==[\"bold\",\"bolder\",\"600\",\"700\",\"800\",\"900\"].indexOf(f),g=i.hasValidContrastRatio(c,d,p,h),b=Math.floor(100*g.contrastRatio)/100,y=void 0;null===c&&(y=i.incompleteData.get(\"bgColor\"));var v=1===b,w=1===s.visibleVirtual(r,!1,!0).length;v?y=i.incompleteData.set(\"bgColor\",\"equalRatio\"):w&&(y=\"shortTextContent\");var k={fgColor:d?d.toHexString():void 0,bgColor:c?c.toHexString():void 0,contrastRatio:g?b:void 0,fontSize:(72*p/96).toFixed(1)+\"pt\",fontWeight:h?\"bold\":\"normal\",missingData:y,expectedContrastRatio:g.expectedContrastRatio+\":1\"};return this.data(k),null===d||null===c||v||w&&!g.isValid?(y=null,i.incompleteData.clear(),void this.relatedNodes(u)):(g.isValid||this.relatedNodes(u),g.isValid)}},{id:\"link-in-text-block\",evaluate:function(e,t,r,a){var n=axe.commons,o=n.color,i=n.dom;function s(e,t){var r=e.getRelativeLuminance(),a=t.getRelativeLuminance();return(Math.max(r,a)+.05)/(Math.min(r,a)+.05)}var l=[\"block\",\"list-item\",\"table\",\"flex\",\"grid\",\"inline-block\"];function u(e){var t=window.getComputedStyle(e).getPropertyValue(\"display\");return-1!==l.indexOf(t)||\"table-\"===t.substr(0,6)}if(u(e))return!1;for(var c,d,m=i.getComposedParent(e);1===m.nodeType&&!u(m);)m=i.getComposedParent(m);if(this.relatedNodes([m]),o.elementIsDistinct(e,m))return!0;if(c=o.getForegroundColor(e),d=o.getForegroundColor(m),c&&d){var p=s(c,d);if(1===p)return!0;if(3<=p)return axe.commons.color.incompleteData.set(\"fgColor\",\"bgContrast\"),this.data({missingData:axe.commons.color.incompleteData.get(\"fgColor\")}),void axe.commons.color.incompleteData.clear();if(c=o.getBackgroundColor(e),d=o.getBackgroundColor(m),!c||!d||3<=s(c,d)){var f=void 0;return f=c&&d?\"bgContrast\":axe.commons.color.incompleteData.get(\"bgColor\"),axe.commons.color.incompleteData.set(\"fgColor\",f),this.data({missingData:axe.commons.color.incompleteData.get(\"fgColor\")}),void axe.commons.color.incompleteData.clear()}return!1}}},{id:\"autocomplete-appropriate\",evaluate:function(e,t,r,a){if(\"INPUT\"!==e.nodeName.toUpperCase())return!0;var n=[\"text\",\"search\",\"number\"],o=[\"text\",\"search\",\"url\"],i={bday:[\"text\",\"search\",\"date\"],email:[\"text\",\"search\",\"email\"],\"cc-exp\":[\"text\",\"search\",\"month\"],\"street-address\":[],tel:[\"text\",\"search\",\"tel\"],\"cc-exp-month\":n,\"cc-exp-year\":n,\"transaction-amount\":n,\"bday-day\":n,\"bday-month\":n,\"bday-year\":n,\"new-password\":[\"text\",\"search\",\"password\"],\"current-password\":[\"text\",\"search\",\"password\"],url:o,photo:o,impp:o};\"object\"===(void 0===t?\"undefined\":T(t))&&Object.keys(t).forEach(function(e){i[e]||(i[e]=[]),i[e]=i[e].concat(t[e])});var s=e.getAttribute(\"autocomplete\").split(/\\s+/g).map(function(e){return e.toLowerCase()}),l=s[s.length-1];if(axe.commons.text.autocomplete.stateTerms.includes(l))return!0;var u=i[l];return void 0===u?\"text\"===e.type:u.includes(e.type)}},{id:\"autocomplete-valid\",evaluate:function(e,t,r,a){var n=e.getAttribute(\"autocomplete\")||\"\";return axe.commons.text.isValidAutocomplete(n,t)}},{id:\"fieldset\",evaluate:function(e,t,r,a){var s,l=this;function u(e,t){return axe.commons.utils.toArray(e.querySelectorAll('select,textarea,button,input:not([name=\"'+t+'\"]):not([type=\"hidden\"])'))}var n={name:e.getAttribute(\"name\"),type:e.getAttribute(\"type\")},o=function(e){var t=axe.commons.utils.escapeSelector(e.actualNode.name),r=axe.commons.dom.getRootNode(e.actualNode).querySelectorAll('input[type=\"'+axe.commons.utils.escapeSelector(e.actualNode.type)+'\"][name=\"'+t+'\"]');if(r.length<2)return!0;var a,n,o=axe.commons.dom.findUpVirtual(e,\"fieldset\"),i=axe.commons.dom.findUpVirtual(e,'[role=\"group\"]'+(\"radio\"===e.actualNode.type?',[role=\"radiogroup\"]':\"\"));return i||o?o?function(e,t){var r=e.firstElementChild;if(!r||\"LEGEND\"!==r.nodeName.toUpperCase())return l.relatedNodes([e]),!(s=\"no-legend\");if(!axe.commons.text.accessibleText(r))return l.relatedNodes([r]),!(s=\"empty-legend\");var a=u(e,t);return!(a.length&&(l.relatedNodes(a),s=\"mixed-inputs\"))}(o,t):function(e,t){var r=axe.commons.dom.idrefs(e,\"aria-labelledby\").some(function(e){return e&&axe.commons.text.accessibleText(e)}),a=e.getAttribute(\"aria-label\");if(!(r||a&&axe.commons.text.sanitize(a)))return l.relatedNodes(e),!(s=\"no-group-label\");var n=u(e,t);return!(n.length&&(l.relatedNodes(n),s=\"group-mixed-inputs\"))}(i,t):(s=\"no-group\",l.relatedNodes((a=r,n=e.actualNode,axe.commons.utils.toArray(a).filter(function(e){return e!==n}))),!1)}(r);return o||(n.failureCode=s),this.data(n),o},after:function(e,t){var a={};return e.filter(function(e){if(e.result)return!0;var t=e.data;if(t){if(a[t.type]=a[t.type]||{},!a[t.type][t.name])return a[t.type][t.name]=[t],!0;var r=a[t.type][t.name].some(function(e){return e.failureCode===t.failureCode});return r||a[t.type][t.name].push(t),!r}return!1})}},{id:\"group-labelledby\",evaluate:function(e,t,r,a){this.data({name:e.getAttribute(\"name\"),type:e.getAttribute(\"type\")});var n=axe.commons.dom.getRootNode(e),o=n.querySelectorAll('input[type=\"'+axe.commons.utils.escapeSelector(e.type)+'\"][name=\"'+axe.commons.utils.escapeSelector(e.name)+'\"]');return o.length<=1||0!==[].map.call(o,function(e){var t=e.getAttribute(\"aria-labelledby\");return t?t.split(/\\s+/):[]}).reduce(function(e,t){return e.filter(function(e){return t.includes(e)})}).filter(function(e){var t=n.getElementById(e);return t&&axe.commons.text.accessibleText(t,!0)}).length},after:function(e,t){var r={};return e.filter(function(e){var t=e.data;return!(!t||(r[t.type]=r[t.type]||{},r[t.type][t.name]))&&(r[t.type][t.name]=!0)})}},{id:\"accesskeys\",evaluate:function(e,t,r,a){return axe.commons.dom.isVisible(e,!1)&&(this.data(e.getAttribute(\"accesskey\")),this.relatedNodes([e])),!0},after:function(e,t){var r={};return e.filter(function(e){if(!e.data)return!1;var t=e.data.toUpperCase();return r[t]?(r[t].relatedNodes.push(e.relatedNodes[0]),!1):((r[t]=e).relatedNodes=[],!0)}).map(function(e){return e.result=!!e.relatedNodes.length,e})}},{id:\"focusable-no-name\",evaluate:function(e,t,r,a){var n=e.getAttribute(\"tabindex\");return!!(axe.commons.dom.isFocusable(e)&&-1<n)&&!axe.commons.text.accessibleTextVirtual(r)}},{id:\"landmark-is-top-level\",evaluate:function(e,t,r,a){var n=axe.commons.aria.getRolesByType(\"landmark\"),o=axe.commons.dom.getComposedParent(e);for(this.data({role:e.getAttribute(\"role\")||axe.commons.aria.implicitRole(e)});o;){var i=o.getAttribute(\"role\");if(i||\"form\"===o.tagName.toLowerCase()||(i=axe.commons.aria.implicitRole(o)),i&&n.includes(i))return!1;o=axe.commons.dom.getComposedParent(o)}return!0}},{id:\"page-has-heading-one\",evaluate:function(e,t,r,a){if(!t||!t.selector||\"string\"!=typeof t.selector)throw new TypeError(\"visible-in-page requires options.selector to be a string\");var n=axe.utils.querySelectorAll(r,t.selector);return this.relatedNodes(n.map(function(e){return e.actualNode})),0<n.length},after:function(e,t){return e.some(function(e){return!0===e.result})&&e.forEach(function(e){e.result=!0}),e},options:{selector:'h1:not([role]), [role=\"heading\"][aria-level=\"1\"]'}},{id:\"page-has-main\",evaluate:function(e,t,r,a){if(!t||!t.selector||\"string\"!=typeof t.selector)throw new TypeError(\"visible-in-page requires options.selector to be a string\");var n=axe.utils.querySelectorAll(r,t.selector);return this.relatedNodes(n.map(function(e){return e.actualNode})),0<n.length},after:function(e,t){return e.some(function(e){return!0===e.result})&&e.forEach(function(e){e.result=!0}),e},options:{selector:\"main:not([role]), [role='main']\"}},{id:\"page-no-duplicate-banner\",evaluate:function(e,t,r,a){if(!t||!t.selector||\"string\"!=typeof t.selector)throw new TypeError(\"visible-in-page requires options.selector to be a string\");var n=axe.utils.querySelectorAll(r,t.selector);return\"string\"==typeof t.nativeScopeFilter&&(n=n.filter(function(e){return e.actualNode.hasAttribute(\"role\")||!axe.commons.dom.findUpVirtual(e,t.nativeScopeFilter)})),this.relatedNodes(n.map(function(e){return e.actualNode})),n.length<=1},options:{selector:\"header:not([role]), [role=banner]\",nativeScopeFilter:\"article, aside, main, nav, section\"}},{id:\"page-no-duplicate-contentinfo\",evaluate:function(e,t,r,a){if(!t||!t.selector||\"string\"!=typeof t.selector)throw new TypeError(\"visible-in-page requires options.selector to be a string\");var n=axe.utils.querySelectorAll(r,t.selector);return\"string\"==typeof t.nativeScopeFilter&&(n=n.filter(function(e){return e.actualNode.hasAttribute(\"role\")||!axe.commons.dom.findUpVirtual(e,t.nativeScopeFilter)})),this.relatedNodes(n.map(function(e){return e.actualNode})),n.length<=1},options:{selector:\"footer:not([role]), [role=contentinfo]\",nativeScopeFilter:\"article, aside, main, nav, section\"}},{id:\"page-no-duplicate-main\",evaluate:function(e,t,r,a){if(!t||!t.selector||\"string\"!=typeof t.selector)throw new TypeError(\"visible-in-page requires options.selector to be a string\");var n=axe.utils.querySelectorAll(r,t.selector);return\"string\"==typeof t.nativeScopeFilter&&(n=n.filter(function(e){return e.actualNode.hasAttribute(\"role\")||!axe.commons.dom.findUpVirtual(e,t.nativeScopeFilter)})),this.relatedNodes(n.map(function(e){return e.actualNode})),n.length<=1},options:{selector:\"main:not([role]), [role='main']\"}},{id:\"tabindex\",evaluate:function(e,t,r,a){return e.tabIndex<=0}},{id:\"duplicate-img-label\",evaluate:function(e,t,r,a){var n=axe.commons.text.visibleVirtual(r,!0).toLowerCase();return\"\"!==n&&axe.utils.querySelectorAll(r,\"img\").filter(function(e){var t=e.actualNode;return axe.commons.dom.isVisible(t)&&![\"none\",\"presentation\"].includes(t.getAttribute(\"role\"))}).some(function(e){return n===axe.commons.text.accessibleTextVirtual(e).toLowerCase()})}},{id:\"explicit-label\",evaluate:function(e,t,r,a){if(e.getAttribute(\"id\")){var n=axe.commons.dom.getRootNode(e),o=axe.commons.utils.escapeSelector(e.getAttribute(\"id\")),i=n.querySelector('label[for=\"'+o+'\"]');if(i)return!axe.commons.dom.isVisible(i)||!!axe.commons.text.accessibleText(i)}return!1}},{id:\"help-same-as-label\",evaluate:function(e,t,r,a){var n=axe.commons.text.labelVirtual(r),o=e.getAttribute(\"title\");if(!n)return!1;o||(o=\"\",e.getAttribute(\"aria-describedby\")&&(o=axe.commons.dom.idrefs(e,\"aria-describedby\").map(function(e){return e?axe.commons.text.accessibleText(e):\"\"}).join(\"\")));return axe.commons.text.sanitize(o)===axe.commons.text.sanitize(n)},enabled:!1},{id:\"hidden-explicit-label\",evaluate:function(e,t,r,a){if(e.getAttribute(\"id\")){var n=axe.commons.dom.getRootNode(e),o=axe.commons.utils.escapeSelector(e.getAttribute(\"id\")),i=n.querySelector('label[for=\"'+o+'\"]');if(i&&!axe.commons.dom.isVisible(i))return!0}return!1}},{id:\"implicit-label\",evaluate:function(e,t,r,a){var n=axe.commons.dom.findUpVirtual(r,\"label\");return!!n&&!!axe.commons.text.accessibleTextVirtual(n)}},{id:\"multiple-label\",evaluate:function(e,t,r,a){var n=axe.commons.utils.escapeSelector(e.getAttribute(\"id\")),o=Array.from(document.querySelectorAll('label[for=\"'+n+'\"]')),i=e.parentNode;for(o.length&&(o=o.filter(function(e,t){if(0===t&&!axe.commons.dom.isVisible(e,!0)||axe.commons.dom.isVisible(e,!0))return e}));i;)\"LABEL\"===i.tagName&&-1===o.indexOf(i)&&o.push(i),i=i.parentNode;return this.relatedNodes(o),1<o.length}},{id:\"title-only\",evaluate:function(e,t,r,a){return!(axe.commons.text.labelVirtual(r)||!e.getAttribute(\"title\")&&!e.getAttribute(\"aria-describedby\"))}},{id:\"has-lang\",evaluate:function(e,t,r,a){return!!(e.getAttribute(\"lang\")||e.getAttribute(\"xml:lang\")||\"\").trim()}},{id:\"valid-lang\",evaluate:function(n,e,t,r){var o,a;return o=(e||axe.commons.utils.validLangs()).map(axe.commons.utils.getBaseLang),!!(a=[\"lang\",\"xml:lang\"].reduce(function(e,t){var r=n.getAttribute(t);if(\"string\"!=typeof r)return e;var a=axe.commons.utils.getBaseLang(r);return\"\"!==a&&-1===o.indexOf(a)&&e.push(t+'=\"'+n.getAttribute(t)+'\"'),e},[])).length&&(this.data(a),!0)}},{id:\"xml-lang-mismatch\",evaluate:function(e,t,r,a){var n=axe.commons.utils.getBaseLang;return n(e.getAttribute(\"lang\"))===n(e.getAttribute(\"xml:lang\"))}},{id:\"dlitem\",evaluate:function(e,t,r,a){var n=axe.commons.dom.getComposedParent(e);if(\"DL\"!==n.nodeName.toUpperCase())return!1;var o=(n.getAttribute(\"role\")||\"\").toLowerCase();return!o||!axe.commons.aria.isValidRole(o)||\"list\"===o}},{id:\"has-listitem\",evaluate:function(e,t,r,a){return r.children.every(function(e){return\"LI\"!==e.actualNode.nodeName.toUpperCase()})}},{id:\"listitem\",evaluate:function(e,t,r,a){var n=axe.commons.dom.getComposedParent(e);if(n){var o=n.nodeName.toUpperCase(),i=(n.getAttribute(\"role\")||\"\").toLowerCase();return\"list\"===i||(!i||!axe.commons.aria.isValidRole(i))&&[\"UL\",\"OL\"].includes(o)}}},{id:\"only-dlitems\",evaluate:function(e,t,r,a){var n=axe.commons,o=n.dom,i=n.aria,s=[\"definition\",\"term\",\"list\"],l=r.children.reduce(function(e,t){var r=t.actualNode;return\"DIV\"===r.nodeName.toUpperCase()&&null===i.getRole(r)?e.concat(t.children):e.concat(t)},[]).reduce(function(e,t){var r=t.actualNode,a=r.nodeName.toUpperCase();if(1===r.nodeType&&o.isVisible(r,!0,!1)){var n=i.getRole(r,{noImplicit:!0});(\"DT\"!==a&&\"DD\"!==a||n)&&(s.includes(n)||e.badNodes.push(r))}else 3===r.nodeType&&\"\"!==r.nodeValue.trim()&&(e.hasNonEmptyTextNode=!0);return e},{badNodes:[],hasNonEmptyTextNode:!1});return l.badNodes.length&&this.relatedNodes(l.badNodes),!!l.badNodes.length||l.hasNonEmptyTextNode}},{id:\"only-listitems\",evaluate:function(e,t,r,a){var d=axe.commons.dom,n=r.children.reduce(function(e,t){var r,a,n,o,i,s=t.actualNode,l=s.nodeName.toUpperCase();if(1===s.nodeType&&d.isVisible(s,!0,!1)){var u=(s.getAttribute(\"role\")||\"\").toLowerCase(),c=(i=l,\"listitem\"===(o=u)||\"LI\"===i&&!o);e.hasListItem=(r=e.hasListItem,a=l,n=c,r||\"LI\"===a&&n||n),c&&(e.isEmpty=!1),\"LI\"!==l||c||e.liItemsWithRole++,\"LI\"===l||c||e.badNodes.push(s)}return 3===s.nodeType&&\"\"!==s.nodeValue.trim()&&(e.hasNonEmptyTextNode=!0),e},{badNodes:[],isEmpty:!0,hasNonEmptyTextNode:!1,hasListItem:!1,liItemsWithRole:0}),o=r.children.filter(function(e){return\"LI\"===e.actualNode.nodeName.toUpperCase()}),i=0<n.liItemsWithRole&&o.length===n.liItemsWithRole;return n.badNodes.length&&this.relatedNodes(n.badNodes),!(n.hasListItem||n.isEmpty&&!i)||!!n.badNodes.length||n.hasNonEmptyTextNode}},{id:\"structured-dlitems\",evaluate:function(e,t,r,a){var n=r.children;if(!n||!n.length)return!1;for(var o,i=!1,s=!1,l=0;l<n.length;l++){if(\"DT\"===(o=n[l].actualNode.nodeName.toUpperCase())&&(i=!0),i&&\"DD\"===o)return!1;\"DD\"===o&&(s=!0)}return i||s}},{id:\"caption\",evaluate:function(e,t,r,a){return!axe.utils.querySelectorAll(r,\"track\").some(function(e){return\"captions\"===(e.actualNode.getAttribute(\"kind\")||\"\").toLowerCase()})&&void 0}},{id:\"description\",evaluate:function(e,t,r,a){return!axe.utils.querySelectorAll(r,\"track\").some(function(e){return\"descriptions\"===(e.actualNode.getAttribute(\"kind\")||\"\").toLowerCase()})&&void 0}},{id:\"frame-tested\",evaluate:function(e,t,r,a){var n=this.async(),o=Object.assign({isViolation:!1,timeout:500},t),i=o.isViolation,s=o.timeout,l=setTimeout(function(){l=setTimeout(function(){l=null,n(!i&&void 0)},0)},s);axe.utils.respondable(e.contentWindow,\"axe.ping\",null,void 0,function(){null!==l&&(clearTimeout(l),n(!0))})},options:{isViolation:!1}},{id:\"css-orientation-lock\",evaluate:function(e,t,r,a){var n=(a||{}).cssom,o=void 0===n?void 0:n;if(o&&o.length){var i=o.reduce(function(e,t){var r=t.sheet,a=t.root,n=t.shadowId,o=n||\"topDocument\";if(e[o]||(e[o]={root:a,rules:[]}),!r||!r.cssRules)return e;var i=Array.from(r.cssRules);return e[o].rules=e[o].rules.concat(i),e},{}),l=!1,u=[];return Object.keys(i).forEach(function(e){var t=i[e],s=t.root,r=t.rules.filter(function(e){return 4===e.type});if(r&&r.length){var a=r.filter(function(e){var t=e.cssText;return/orientation:\\s+landscape/i.test(t)||/orientation:\\s+portrait/i.test(t)});a&&a.length&&a.forEach(function(e){e.cssRules.length&&Array.from(e.cssRules).forEach(function(e){if(e.selectorText&&!(e.style.length<=0)){var t=e.style.transform||!1;if(t){var r=t.match(/rotate\\(([^)]+)deg\\)/),a=parseInt(r&&r[1]||0),n=a%90==0&&a%180!=0;if(n&&\"HTML\"!==e.selectorText.toUpperCase()){var o=e.selectorText,i=Array.from(s.querySelectorAll(o));i&&i.length&&(u=u.concat(i))}l=n}}})})}}),l?(u.length&&this.relatedNodes(u),!1):!0}}},{id:\"meta-viewport-large\",evaluate:function(e,t,r,a){t=t||{};for(var n,o=(e.getAttribute(\"content\")||\"\").split(/[;,]/),i={},s=t.scaleMinimum||2,l=t.lowerBound||!1,u=0,c=o.length;u<c;u++){var d=(n=o[u].split(\"=\")).shift().toLowerCase();d&&n.length&&(i[d.trim()]=n.shift().trim().toLowerCase())}return!!(l&&i[\"maximum-scale\"]&&parseFloat(i[\"maximum-scale\"])<l)||(l||\"no\"!==i[\"user-scalable\"]?!(i[\"maximum-scale\"]&&parseFloat(i[\"maximum-scale\"])<s)||(this.data(\"maximum-scale\"),!1):(this.data(\"user-scalable=no\"),!1))},options:{scaleMinimum:5,lowerBound:2}},{id:\"meta-viewport\",evaluate:function(e,t,r,a){t=t||{};for(var n,o=(e.getAttribute(\"content\")||\"\").split(/[;,]/),i={},s=t.scaleMinimum||2,l=t.lowerBound||!1,u=0,c=o.length;u<c;u++){var d=(n=o[u].split(\"=\")).shift().toLowerCase();d&&n.length&&(i[d.trim()]=n.shift().trim().toLowerCase())}return!!(l&&i[\"maximum-scale\"]&&parseFloat(i[\"maximum-scale\"])<l)||(l||\"no\"!==i[\"user-scalable\"]?!(i[\"maximum-scale\"]&&parseFloat(i[\"maximum-scale\"])<s)||(this.data(\"maximum-scale\"),!1):(this.data(\"user-scalable=no\"),!1))},options:{scaleMinimum:2}},{id:\"header-present\",evaluate:function(e,t,r,a){return!!axe.utils.querySelectorAll(r,'h1, h2, h3, h4, h5, h6, [role=\"heading\"]')[0]}},{id:\"heading-order\",evaluate:function(e,t,r,a){var n=e.getAttribute(\"aria-level\");if(null!==n)return this.data(parseInt(n,10)),!0;var o=e.tagName.match(/H(\\d)/);return o&&this.data(parseInt(o[1],10)),!0},after:function(e,t){if(e.length<2)return e;for(var r=e[0].data,a=1;a<e.length;a++)e[a].result&&e[a].data>r+1&&(e[a].result=!1),r=e[a].data;return e}},{id:\"internal-link-present\",evaluate:function(e,t,r,a){return axe.utils.querySelectorAll(r,\"a[href]\").some(function(e){return/^#[^/!]/.test(e.actualNode.getAttribute(\"href\"))})}},{id:\"landmark\",evaluate:function(e,t,r,a){return 0<axe.utils.querySelectorAll(r,'main, [role=\"main\"]').length}},{id:\"meta-refresh\",evaluate:function(e,t,r,a){var n=e.getAttribute(\"content\")||\"\",o=n.split(/[;,]/);return\"\"===n||\"0\"===o[0]}},{id:\"p-as-heading\",evaluate:function(e,t,r,a){var n=Array.from(e.parentNode.children),o=n.indexOf(e),i=(t=t||{}).margins||[],s=n.slice(o+1).find(function(e){return\"P\"===e.nodeName.toUpperCase()}),l=n.slice(0,o).reverse().find(function(e){return\"P\"===e.nodeName.toUpperCase()});function u(e){var t=window.getComputedStyle(function(e){for(var t=e,r=e.textContent.trim(),a=r;a===r&&void 0!==t;){var n=-1;if(0===(e=t).children.length)return e;for(;n++,\"\"===(a=e.children[n].textContent.trim())&&n+1<e.children.length;);t=e.children[n]}return e}(e));return{fontWeight:function(e){switch(e){case\"lighter\":return 100;case\"normal\":return 400;case\"bold\":return 700;case\"bolder\":return 900}return e=parseInt(e),isNaN(e)?400:e}(t.getPropertyValue(\"font-weight\")),fontSize:parseInt(t.getPropertyValue(\"font-size\")),isItalic:\"italic\"===t.getPropertyValue(\"font-style\")}}function c(r,a,e){return e.reduce(function(e,t){return e||(!t.size||r.fontSize/t.size>a.fontSize)&&(!t.weight||r.fontWeight-t.weight>a.fontWeight)&&(!t.italic||r.isItalic&&!a.isItalic)},!1)}var d=u(e),m=s?u(s):null,p=l?u(l):null;if(!m||!c(d,m,i))return!0;var f=axe.commons.dom.findUpVirtual(r,\"blockquote\");return!!(f&&\"BLOCKQUOTE\"===f.nodeName.toUpperCase()||p&&!c(d,p,i))&&void 0},options:{margins:[{weight:150,italic:!0},{weight:150,size:1.15},{italic:!0,size:1.15},{size:1.4}]}},{id:\"region\",evaluate:function(e,t,r,a){var n=axe.commons,l=n.dom,u=n.aria;var c=function(e){var t=axe.utils.querySelectorAll(e,\"a[href]\")[0];if(t&&axe.commons.dom.getElementByReference(t.actualNode,\"href\"))return t.actualNode}(r),d=u.getRolesByType(\"landmark\"),m=d.reduce(function(e,t){return e.concat(u.implicitNodes(t))},[]).filter(function(e){return null!==e});var o=function e(t){var r,n,o,a,i,s=t.actualNode;return o=(n=t).actualNode,a=axe.commons.aria.getRole(o,{noImplicit:!0}),i=(o.getAttribute(\"aria-live\")||\"\").toLowerCase().trim(),(a?\"dialog\"===a||d.includes(a):[\"assertive\",\"polite\"].includes(i)||m.some(function(e){var t=axe.utils.matchesSelector(o,e);if(\"form\"!==o.tagName.toLowerCase())return t;var r=o.getAttribute(\"title\"),a=r&&\"\"!==r.trim()?axe.commons.text.sanitize(r):null;return t&&(!!u.labelVirtual(n)||!!a)}))||(r=t,c&&c===r.actualNode)||!l.isVisible(s,!0)?[]:l.hasContent(s,!0)?[s]:t.children.filter(function(e){return 1===e.actualNode.nodeType}).map(e).reduce(function(e,t){return e.concat(t)},[])}(r);return this.relatedNodes(o),0===o.length},after:function(e,t){return[e[0]]}},{id:\"skip-link\",evaluate:function(e,t,r,a){var n=axe.commons.dom.getElementByReference(e,\"href\");return!!n&&(axe.commons.dom.isVisible(n,!0)||void 0)}},{id:\"unique-frame-title\",evaluate:function(e,t,r,a){var n=axe.commons.text.sanitize(e.title).trim().toLowerCase();return this.data(n),!0},after:function(e,t){var r={};return e.forEach(function(e){r[e.data]=void 0!==r[e.data]?++r[e.data]:0}),e.forEach(function(e){e.result=!!r[e.data]}),e}},{id:\"duplicate-id-active\",evaluate:function(t,e,r,a){var n=t.getAttribute(\"id\").trim();if(!n)return!0;var o=axe.commons.dom.getRootNode(t),i=Array.from(o.querySelectorAll('[id=\"'+axe.commons.utils.escapeSelector(n)+'\"]')).filter(function(e){return e!==t});return i.length&&this.relatedNodes(i),this.data(n),0===i.length},after:function(e,t){var r=[];return e.filter(function(e){return-1===r.indexOf(e.data)&&(r.push(e.data),!0)})}},{id:\"duplicate-id-aria\",evaluate:function(t,e,r,a){var n=t.getAttribute(\"id\").trim();if(!n)return!0;var o=axe.commons.dom.getRootNode(t),i=Array.from(o.querySelectorAll('[id=\"'+axe.commons.utils.escapeSelector(n)+'\"]')).filter(function(e){return e!==t});return i.length&&this.relatedNodes(i),this.data(n),0===i.length},after:function(e,t){var r=[];return e.filter(function(e){return-1===r.indexOf(e.data)&&(r.push(e.data),!0)})}},{id:\"duplicate-id\",evaluate:function(t,e,r,a){var n=t.getAttribute(\"id\").trim();if(!n)return!0;var o=axe.commons.dom.getRootNode(t),i=Array.from(o.querySelectorAll('[id=\"'+axe.commons.utils.escapeSelector(n)+'\"]')).filter(function(e){return e!==t});return i.length&&this.relatedNodes(i),this.data(n),0===i.length},after:function(e,t){var r=[];return e.filter(function(e){return-1===r.indexOf(e.data)&&(r.push(e.data),!0)})}},{id:\"aria-label\",evaluate:function(e,t,r,a){var n=e.getAttribute(\"aria-label\");return!(!n||!axe.commons.text.sanitize(n).trim())}},{id:\"aria-labelledby\",evaluate:function(e,t,r,a){return(0,axe.commons.dom.idrefs)(e,\"aria-labelledby\").some(function(e){return e&&axe.commons.text.accessibleText(e,!0)})}},{id:\"button-has-visible-text\",evaluate:function(e,t,r,a){var n=e.nodeName.toUpperCase(),o=e.getAttribute(\"role\"),i=void 0;return(\"BUTTON\"===n||\"button\"===o&&\"INPUT\"!==n)&&(i=axe.commons.text.accessibleTextVirtual(r),this.data(i),!!i)}},{id:\"doc-has-title\",evaluate:function(e,t,r,a){var n=document.title;return!(!n||!axe.commons.text.sanitize(n).trim())}},{id:\"exists\",evaluate:function(e,t,r,a){return!0}},{id:\"has-alt\",evaluate:function(e,t,r,a){var n=e.nodeName.toLowerCase();return e.hasAttribute(\"alt\")&&(\"img\"===n||\"input\"===n||\"area\"===n)}},{id:\"has-visible-text\",evaluate:function(e,t,r,a){return 0<axe.commons.text.accessibleTextVirtual(r).length}},{id:\"is-on-screen\",evaluate:function(e,t,r,a){return axe.commons.dom.isVisible(e,!1)&&!axe.commons.dom.isOffscreen(e)}},{id:\"non-empty-alt\",evaluate:function(e,t,r,a){var n=e.getAttribute(\"alt\");return!(!n||!axe.commons.text.sanitize(n).trim())}},{id:\"non-empty-if-present\",evaluate:function(e,t,r,a){var n=e.nodeName.toUpperCase(),o=(e.getAttribute(\"type\")||\"\").toLowerCase(),i=e.getAttribute(\"value\");return this.data(i),!(\"INPUT\"!==n||![\"submit\",\"reset\"].includes(o))&&null===i}},{id:\"non-empty-title\",evaluate:function(e,t,r,a){var n=e.getAttribute(\"title\");return!(!n||!axe.commons.text.sanitize(n).trim())}},{id:\"non-empty-value\",evaluate:function(e,t,r,a){var n=e.getAttribute(\"value\");return!(!n||!axe.commons.text.sanitize(n).trim())}},{id:\"role-none\",evaluate:function(e,t,r,a){return\"none\"===e.getAttribute(\"role\")}},{id:\"role-presentation\",evaluate:function(e,t,r,a){return\"presentation\"===e.getAttribute(\"role\")}},{id:\"caption-faked\",evaluate:function(e,t,r,a){var n=axe.commons.table.toGrid(e),o=n[0];return n.length<=1||o.length<=1||e.rows.length<=1||o.reduce(function(e,t,r){return e||t!==o[r+1]&&void 0!==o[r+1]},!1)}},{id:\"has-caption\",evaluate:function(e,t,r,a){return!!e.caption}},{id:\"has-summary\",evaluate:function(e,t,r,a){return!!e.summary}},{id:\"has-th\",evaluate:function(e,t,r,a){for(var n,o,i=[],s=0,l=e.rows.length;s<l;s++)for(var u=0,c=(n=e.rows[s]).cells.length;u<c;u++)\"TH\"!==(o=n.cells[u]).nodeName.toUpperCase()&&-1===[\"rowheader\",\"columnheader\"].indexOf(o.getAttribute(\"role\"))||i.push(o);return!!i.length&&(this.relatedNodes(i),!0)}},{id:\"html5-scope\",evaluate:function(e,t,r,a){return!axe.commons.dom.isHTML5(document)||\"TH\"===e.nodeName.toUpperCase()}},{id:\"same-caption-summary\",evaluate:function(e,t,r,a){return!(!e.summary||!e.caption)&&e.summary.toLowerCase()===axe.commons.text.accessibleText(e.caption).toLowerCase()}},{id:\"scope-value\",evaluate:function(e,t,r,a){t=t||{};var n=e.getAttribute(\"scope\").toLowerCase();return-1!==[\"row\",\"col\",\"rowgroup\",\"colgroup\"].indexOf(n)}},{id:\"td-has-header\",evaluate:function(e,t,r,a){var n=axe.commons.table,o=[];return n.getAllCells(e).forEach(function(e){axe.commons.dom.hasContent(e)&&n.isDataCell(e)&&!axe.commons.aria.label(e)&&(n.getHeaders(e).some(function(e){return null!==e&&!!axe.commons.dom.hasContent(e)})||o.push(e))}),!o.length||(this.relatedNodes(o),!1)}},{id:\"td-headers-attr\",evaluate:function(e,t,r,a){for(var n=[],o=0,i=e.rows.length;o<i;o++)for(var s=e.rows[o],l=0,u=s.cells.length;l<u;l++)n.push(s.cells[l]);var c=n.reduce(function(e,t){return t.getAttribute(\"id\")&&e.push(t.getAttribute(\"id\")),e},[]),d=n.reduce(function(e,t){var r,a,n=(t.getAttribute(\"headers\")||\"\").split(/\\s/).reduce(function(e,t){return(t=t.trim())&&e.push(t),e},[]);return 0!==n.length&&(t.getAttribute(\"id\")&&(r=-1!==n.indexOf(t.getAttribute(\"id\").trim())),a=n.reduce(function(e,t){return e||-1===c.indexOf(t)},!1),(r||a)&&e.push(t)),e},[]);return!(0<d.length)||(this.relatedNodes(d),!1)}},{id:\"th-has-data-cells\",evaluate:function(e,t,r,a){var n=axe.commons.table,o=n.getAllCells(e),i=this,s=[];o.forEach(function(e){var t=e.getAttribute(\"headers\");t&&(s=s.concat(t.split(/\\s+/)));var r=e.getAttribute(\"aria-labelledby\");r&&(s=s.concat(r.split(/\\s+/)))});var l=o.filter(function(e){return\"\"!==axe.commons.text.sanitize(e.textContent)&&(\"TH\"===e.nodeName.toUpperCase()||-1!==[\"rowheader\",\"columnheader\"].indexOf(e.getAttribute(\"role\")))}),u=n.toGrid(e);return!!l.reduce(function(e,t){if(t.getAttribute(\"id\")&&s.includes(t.getAttribute(\"id\")))return!!e||e;var r=!1,a=n.getCellPosition(t,u);return n.isColumnHeader(t)&&(r=n.traverse(\"down\",a,u).reduce(function(e,t){return e||axe.commons.dom.hasContent(t)&&!n.isColumnHeader(t)},!1)),!r&&n.isRowHeader(t)&&(r=n.traverse(\"right\",a,u).reduce(function(e,t){return e||axe.commons.dom.hasContent(t)&&!n.isRowHeader(t)},!1)),r||i.relatedNodes(t),e&&r},!0)||void 0}},{id:\"hidden-content\",evaluate:function(e,t,r,a){if(![\"SCRIPT\",\"HEAD\",\"TITLE\",\"NOSCRIPT\",\"STYLE\",\"TEMPLATE\"].includes(e.tagName.toUpperCase())&&axe.commons.dom.hasContentVirtual(r)){var n=window.getComputedStyle(e);if(\"none\"===n.getPropertyValue(\"display\"))return;if(\"hidden\"===n.getPropertyValue(\"visibility\")){var o=axe.commons.dom.getComposedParent(e),i=o&&window.getComputedStyle(o);if(!i||\"hidden\"!==i.getPropertyValue(\"visibility\"))return}}return!0}}],commons:function(){var commons={},u=commons.aria={},e=u.lookupTable={};e.attributes={\"aria-activedescendant\":{type:\"idref\"},\"aria-atomic\":{type:\"boolean\",values:[\"true\",\"false\"]},\"aria-autocomplete\":{type:\"nmtoken\",values:[\"inline\",\"list\",\"both\",\"none\"]},\"aria-busy\":{type:\"boolean\",values:[\"true\",\"false\"]},\"aria-checked\":{type:\"nmtoken\",values:[\"true\",\"false\",\"mixed\",\"undefined\"]},\"aria-colcount\":{type:\"int\"},\"aria-colindex\":{type:\"int\"},\"aria-colspan\":{type:\"int\"},\"aria-controls\":{type:\"idrefs\"},\"aria-current\":{type:\"nmtoken\",values:[\"page\",\"step\",\"location\",\"date\",\"time\",\"true\",\"false\"]},\"aria-describedby\":{type:\"idrefs\"},\"aria-disabled\":{type:\"boolean\",values:[\"true\",\"false\"]},\"aria-dropeffect\":{type:\"nmtokens\",values:[\"copy\",\"move\",\"reference\",\"execute\",\"popup\",\"none\"]},\"aria-errormessage\":{type:\"idref\"},\"aria-expanded\":{type:\"nmtoken\",values:[\"true\",\"false\",\"undefined\"]},\"aria-flowto\":{type:\"idrefs\"},\"aria-grabbed\":{type:\"nmtoken\",values:[\"true\",\"false\",\"undefined\"]},\"aria-haspopup\":{type:\"nmtoken\",values:[\"true\",\"false\",\"menu\",\"listbox\",\"tree\",\"grid\",\"dialog\"]},\"aria-hidden\":{type:\"boolean\",values:[\"true\",\"false\"]},\"aria-invalid\":{type:\"nmtoken\",values:[\"true\",\"false\",\"spelling\",\"grammar\"]},\"aria-keyshortcuts\":{type:\"string\"},\"aria-label\":{type:\"string\"},\"aria-labelledby\":{type:\"idrefs\"},\"aria-level\":{type:\"int\"},\"aria-live\":{type:\"nmtoken\",values:[\"off\",\"polite\",\"assertive\"]},\"aria-modal\":{type:\"boolean\",values:[\"true\",\"false\"]},\"aria-multiline\":{type:\"boolean\",values:[\"true\",\"false\"]},\"aria-multiselectable\":{type:\"boolean\",values:[\"true\",\"false\"]},\"aria-orientation\":{type:\"nmtoken\",values:[\"horizontal\",\"vertical\"]},\"aria-owns\":{type:\"idrefs\"},\"aria-placeholder\":{type:\"string\"},\"aria-posinset\":{type:\"int\"},\"aria-pressed\":{type:\"nmtoken\",values:[\"true\",\"false\",\"mixed\",\"undefined\"]},\"aria-readonly\":{type:\"boolean\",values:[\"true\",\"false\"]},\"aria-relevant\":{type:\"nmtokens\",values:[\"additions\",\"removals\",\"text\",\"all\"]},\"aria-required\":{type:\"boolean\",values:[\"true\",\"false\"]},\"aria-rowcount\":{type:\"int\"},\"aria-rowindex\":{type:\"int\"},\"aria-rowspan\":{type:\"int\"},\"aria-selected\":{type:\"nmtoken\",values:[\"true\",\"false\",\"undefined\"]},\"aria-setsize\":{type:\"int\"},\"aria-sort\":{type:\"nmtoken\",values:[\"ascending\",\"descending\",\"other\",\"none\"]},\"aria-valuemax\":{type:\"decimal\"},\"aria-valuemin\":{type:\"decimal\"},\"aria-valuenow\":{type:\"decimal\"},\"aria-valuetext\":{type:\"string\"}},e.globalAttributes=[\"aria-atomic\",\"aria-busy\",\"aria-controls\",\"aria-current\",\"aria-describedby\",\"aria-disabled\",\"aria-dropeffect\",\"aria-flowto\",\"aria-grabbed\",\"aria-haspopup\",\"aria-hidden\",\"aria-invalid\",\"aria-keyshortcuts\",\"aria-label\",\"aria-labelledby\",\"aria-live\",\"aria-owns\",\"aria-relevant\"];var t={CANNOT_HAVE_LIST_ATTRIBUTE:function(e){return!Array.from(e.attributes).map(function(e){return e.name.toUpperCase()}).includes(\"LIST\")},CANNOT_HAVE_HREF_ATTRIBUTE:function(e){return!Array.from(e.attributes).map(function(e){return e.name.toUpperCase()}).includes(\"HREF\")},MUST_HAVE_HREF_ATTRIBUTE:function(e){return!!e.href},MUST_HAVE_SIZE_ATTRIBUTE_WITH_VALUE_GREATER_THAN_1:function(e){return!!Array.from(e.attributes).map(function(e){return e.name.toUpperCase()}).includes(\"SIZE\")&&1<Number(e.getAttribute(\"SIZE\"))},MUST_HAVE_ALT_ATTRIBUTE:function(e){return!!Array.from(e.attributes).map(function(e){return e.name.toUpperCase()}).includes(\"ALT\")},MUST_HAVE_ALT_ATTRIBUTE_WITH_VALUE:function(e){if(!Array.from(e.attributes).map(function(e){return e.name.toUpperCase()}).includes(\"ALT\"))return!1;var t=e.getAttribute(\"ALT\");return t&&0<t.length}};e.role={alert:{type:\"widget\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"SECTION\"]},alertdialog:{type:\"widget\",attributes:{allowed:[\"aria-expanded\",\"aria-modal\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"DIALOG\",\"SECTION\"]},application:{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"ARTICLE\",\"AUDIO\",\"EMBED\",\"IFRAME\",\"OBJECT\",\"SECTION\",\"SVG\",\"VIDEO\"]},article:{type:\"structure\",attributes:{allowed:[\"aria-expanded\",\"aria-posinset\",\"aria-setsize\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"article\"],unsupported:!1},banner:{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"header\"],unsupported:!1,allowedElements:[\"SECTION\"]},button:{type:\"widget\",attributes:{allowed:[\"aria-expanded\",\"aria-pressed\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:null,implicit:[\"button\",'input[type=\"button\"]','input[type=\"image\"]','input[type=\"reset\"]','input[type=\"submit\"]',\"summary\"],unsupported:!1,allowedElements:[{tagName:\"A\",condition:t.MUST_HAVE_HREF_ATTRIBUTE}]},cell:{type:\"structure\",attributes:{allowed:[\"aria-colindex\",\"aria-colspan\",\"aria-rowindex\",\"aria-rowspan\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:[\"row\"],implicit:[\"td\",\"th\"],unsupported:!1},checkbox:{type:\"widget\",attributes:{allowed:[\"aria-checked\",\"aria-required\",\"aria-readonly\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:null,implicit:['input[type=\"checkbox\"]'],unsupported:!1,allowedElements:[\"BUTTON\"]},columnheader:{type:\"structure\",attributes:{allowed:[\"aria-colindex\",\"aria-colspan\",\"aria-expanded\",\"aria-rowindex\",\"aria-rowspan\",\"aria-required\",\"aria-readonly\",\"aria-selected\",\"aria-sort\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:[\"row\"],implicit:[\"th\"],unsupported:!1},combobox:{type:\"composite\",attributes:{allowed:[\"aria-autocomplete\",\"aria-required\",\"aria-activedescendant\",\"aria-orientation\",\"aria-errormessage\"],required:[\"aria-expanded\"]},owned:{all:[\"listbox\",\"textbox\"]},nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[{tagName:\"INPUT\",attributes:{TYPE:\"TEXT\"}}]},command:{nameFrom:[\"author\"],type:\"abstract\",unsupported:!1},complementary:{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"aside\"],unsupported:!1,allowedElements:[\"SECTION\"]},composite:{nameFrom:[\"author\"],type:\"abstract\",unsupported:!1},contentinfo:{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"footer\"],unsupported:!1,allowedElements:[\"SECTION\"]},definition:{type:\"structure\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"dd\",\"dfn\"],unsupported:!1},dialog:{type:\"widget\",attributes:{allowed:[\"aria-expanded\",\"aria-modal\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"dialog\"],unsupported:!1,allowedElements:[\"SECTION\"]},directory:{type:\"structure\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:null,unsupported:!1,allowedElements:[\"OL\",\"UL\"]},document:{type:\"structure\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"body\"],unsupported:!1,allowedElements:[\"ARTICLE\",\"EMBED\",\"IFRAME\",\"SECTION\",\"SVG\",\"OBJECT\"]},\"doc-abstract\":{type:\"section\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"SECTION\"]},\"doc-acknowledgments\":{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"SECTION\"]},\"doc-afterword\":{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"SECTION\"]},\"doc-appendix\":{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"SECTION\"]},\"doc-backlink\":{type:\"link\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:null,unsupported:!1,allowedElements:[{tagName:\"A\",condition:t.MUST_HAVE_HREF_ATTRIBUTE}]},\"doc-biblioentry\":{type:\"listitem\",attributes:{allowed:[\"aria-expanded\",\"aria-level\",\"aria-posinset\",\"aria-setsize\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:[\"doc-bibliography\"],unsupported:!1,allowedElements:[\"LI\"]},\"doc-bibliography\":{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"SECTION\"]},\"doc-biblioref\":{type:\"link\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:null,unsupported:!1,allowedElements:[{tagName:\"A\",condition:t.MUST_HAVE_HREF_ATTRIBUTE}]},\"doc-chapter\":{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"SECTION\"]},\"doc-colophon\":{type:\"section\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"SECTION\"]},\"doc-conclusion\":{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"SECTION\"]},\"doc-cover\":{type:\"img\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1},\"doc-credit\":{type:\"section\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"SECTION\"]},\"doc-credits\":{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"SECTION\"]},\"doc-dedication\":{type:\"section\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"SECTION\"]},\"doc-endnote\":{type:\"listitem\",attributes:{allowed:[\"aria-expanded\",\"aria-level\",\"aria-posinset\",\"aria-setsize\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:[\"doc-endnotes\"],unsupported:!1,allowedElements:[\"LI\"]},\"doc-endnotes\":{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:[\"doc-endnote\"],namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"SECTION\"]},\"doc-epigraph\":{type:\"section\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1},\"doc-epilogue\":{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"SECTION\"]},\"doc-errata\":{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"SECTION\"]},\"doc-example\":{type:\"section\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"ASIDE\",\"SECTION\"]},\"doc-footnote\":{type:\"section\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"ASIDE\",\"FOOTER\",\"HEADER\"]},\"doc-foreword\":{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"SECTION\"]},\"doc-glossary\":{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:[\"term\",\"definition\"],namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"DL\"]},\"doc-glossref\":{type:\"link\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\",\"contents\"],context:null,unsupported:!1,allowedElements:[{tagName:\"A\",condition:t.MUST_HAVE_HREF_ATTRIBUTE}]},\"doc-index\":{type:\"navigation\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"NAV\",\"SECTION\"]},\"doc-introduction\":{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"SECTION\"]},\"doc-noteref\":{type:\"link\",attributes:{allowed:[\"aria-expanded\"]},owned:null,namefrom:[\"author\",\"contents\"],context:null,unsupported:!1,allowedElements:[{tagName:\"A\",condition:t.MUST_HAVE_HREF_ATTRIBUTE}]},\"doc-notice\":{type:\"note\",attributes:{allowed:[\"aria-expanded\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"SECTION\"]},\"doc-pagebreak\":{type:\"separator\",attributes:{allowed:[\"aria-expanded\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"HR\"]},\"doc-pagelist\":{type:\"navigation\",attributes:{allowed:[\"aria-expanded\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"NAV\",\"SECTION\"]},\"doc-part\":{type:\"landmark\",attributes:{allowed:[\"aria-expanded\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"SECTION\"]},\"doc-preface\":{type:\"landmark\",attributes:{allowed:[\"aria-expanded\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"SECTION\"]},\"doc-prologue\":{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"SECTION\"]},\"doc-pullquote\":{type:\"none\",attributes:{allowed:[\"aria-expanded\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"ASIDE\",\"SECTION\"]},\"doc-qna\":{type:\"section\",attributes:{allowed:[\"aria-expanded\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"SECTION\"]},\"doc-subtitle\":{type:\"sectionhead\",attributes:{allowed:[\"aria-expanded\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"H1\",\"H2\",\"H3\",\"H4\",\"H5\",\"H6\"]},\"doc-tip\":{type:\"note\",attributes:{allowed:[\"aria-expanded\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"ASIDE\"]},\"doc-toc\":{type:\"navigation\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"NAV\",\"SECTION\"]},feed:{type:\"structure\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:{one:[\"article\"]},nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"ARTICLE\",\"ASIDE\",\"SECTION\"]},figure:{type:\"structure\",unsupported:!0},form:{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"form\"],unsupported:!1},grid:{type:\"composite\",attributes:{allowed:[\"aria-activedescendant\",\"aria-expanded\",\"aria-colcount\",\"aria-level\",\"aria-multiselectable\",\"aria-readonly\",\"aria-rowcount\",\"aria-errormessage\"]},owned:{one:[\"rowgroup\",\"row\"]},nameFrom:[\"author\"],context:null,implicit:[\"table\"],unsupported:!1},gridcell:{type:\"widget\",attributes:{allowed:[\"aria-colindex\",\"aria-colspan\",\"aria-expanded\",\"aria-rowindex\",\"aria-rowspan\",\"aria-selected\",\"aria-readonly\",\"aria-required\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:[\"row\"],implicit:[\"td\",\"th\"],unsupported:!1},group:{type:\"structure\",attributes:{allowed:[\"aria-activedescendant\",\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"details\",\"optgroup\"],unsupported:!1,allowedElements:[\"DL\",\"FIGCAPTION\",\"FIELDSET\",\"FIGURE\",\"FOOTER\",\"HEADER\",\"OL\",\"UL\"]},heading:{type:\"structure\",attributes:{required:[\"aria-level\"],allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:null,implicit:[\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\"],unsupported:!1},img:{type:\"structure\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"img\"],unsupported:!1,allowedElements:[\"EMBED\",\"IFRAME\",\"OBJECT\",\"SVG\"]},input:{nameFrom:[\"author\"],type:\"abstract\",unsupported:!1},landmark:{nameFrom:[\"author\"],type:\"abstract\",unsupported:!1},link:{type:\"widget\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:null,implicit:[\"a[href]\"],unsupported:!1,allowedElements:[\"BUTTON\",{tagName:\"INPUT\",attributes:{TYPE:\"IMAGE\"}},{tagName:\"INPUT\",attributes:{TYPE:\"IMAGE\"}}]},list:{type:\"structure\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:{all:[\"listitem\"]},nameFrom:[\"author\"],context:null,implicit:[\"ol\",\"ul\",\"dl\"],unsupported:!1},listbox:{type:\"composite\",attributes:{allowed:[\"aria-activedescendant\",\"aria-multiselectable\",\"aria-required\",\"aria-expanded\",\"aria-orientation\",\"aria-errormessage\"]},owned:{all:[\"option\"]},nameFrom:[\"author\"],context:null,implicit:[\"select\"],unsupported:!1,allowedElements:[\"OL\",\"UL\"]},listitem:{type:\"structure\",attributes:{allowed:[\"aria-level\",\"aria-posinset\",\"aria-setsize\",\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:[\"list\"],implicit:[\"li\",\"dt\"],unsupported:!1},log:{type:\"widget\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"SECTION\"]},main:{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"main\"],unsupported:!1,allowedElements:[\"ARTICLE\",\"SECTION\"]},marquee:{type:\"widget\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"SECTION\"]},math:{type:\"structure\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"math\"],unsupported:!1},menu:{type:\"composite\",attributes:{allowed:[\"aria-activedescendant\",\"aria-expanded\",\"aria-orientation\",\"aria-errormessage\"]},owned:{one:[\"menuitem\",\"menuitemradio\",\"menuitemcheckbox\"]},nameFrom:[\"author\"],context:null,implicit:['menu[type=\"context\"]'],unsupported:!1,allowedElements:[\"OL\",\"UL\"]},menubar:{type:\"composite\",attributes:{allowed:[\"aria-activedescendant\",\"aria-expanded\",\"aria-orientation\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"OL\",\"UL\"]},menuitem:{type:\"widget\",attributes:{allowed:[\"aria-posinset\",\"aria-setsize\",\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:[\"menu\",\"menubar\"],implicit:['menuitem[type=\"command\"]'],unsupported:!1,allowedElements:[\"BUTTON\",\"LI\",{tagName:\"INPUT\",attributes:{TYPE:\"IMAGE\"}},{tagName:\"INPUT\",attributes:{TYPE:\"BUTTON\"}},{tagName:\"A\",condition:t.MUST_HAVE_HREF_ATTRIBUTE}]},menuitemcheckbox:{type:\"widget\",attributes:{allowed:[\"aria-checked\",\"aria-posinset\",\"aria-setsize\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:[\"menu\",\"menubar\"],implicit:['menuitem[type=\"checkbox\"]'],unsupported:!1,allowedElements:[\"BUTTON\",\"LI\",{tagName:\"INPUT\",attributes:{TYPE:\"CHECKBOX\"}},{tagName:\"INPUT\",attributes:{TYPE:\"IMAGE\"}},{tagName:\"INPUT\",attributes:{TYPE:\"BUTTON\"}},{tagName:\"A\",condition:t.MUST_HAVE_HREF_ATTRIBUTE}]},menuitemradio:{type:\"widget\",attributes:{allowed:[\"aria-checked\",\"aria-selected\",\"aria-posinset\",\"aria-setsize\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:[\"menu\",\"menubar\"],implicit:['menuitem[type=\"radio\"]'],unsupported:!1,allowedElements:[\"BUTTON\",\"LI\",{tagName:\"INPUT\",attributes:{TYPE:\"IMAGE\"}},{tagName:\"INPUT\",attributes:{TYPE:\"BUTTON\"}},{tagName:\"A\",condition:t.MUST_HAVE_HREF_ATTRIBUTE}]},navigation:{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"nav\"],unsupported:!1,allowedElements:[\"SECTION\"]},none:{type:\"structure\",attributes:null,owned:null,nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"ARTICLE\",\"ASIDE\",\"DL\",\"EMBED\",\"FIGCAPTION\",\"FIELDSET\",\"FIGURE\",\"FOOTER\",\"FORM\",\"H1\",\"H2\",\"H3\",\"H4\",\"H5\",\"H6\",\"HEADER\",\"LI\",\"SECTION\",\"OL\",{tagName:\"IMG\",condition:t.MUST_HAVE_ALT_ATTRIBUTE}]},note:{type:\"structure\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"ASIDE\"]},option:{type:\"widget\",attributes:{allowed:[\"aria-selected\",\"aria-posinset\",\"aria-setsize\",\"aria-checked\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:[\"listbox\"],implicit:[\"option\"],unsupported:!1,allowedElements:[\"BUTTON\",\"LI\",{tagName:\"INPUT\",attributes:{TYPE:\"CHECKBOX\"}},{tagName:\"INPUT\",attributes:{TYPE:\"BUTTON\"}},{tagName:\"A\",condition:t.MUST_HAVE_HREF_ATTRIBUTE}]},presentation:{type:\"structure\",attributes:null,owned:null,nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"ARTICLE\",\"ASIDE\",\"DL\",\"EMBED\",\"FIGCAPTION\",\"FIELDSET\",\"FIGURE\",\"FOOTER\",\"FORM\",\"H1\",\"H2\",\"H3\",\"H4\",\"H5\",\"H6\",\"HEADER\",\"HR\",\"LI\",\"OL\",\"SECTION\",\"UL\",{tagName:\"IMG\",condition:t.MUST_HAVE_ALT_ATTRIBUTE}]},progressbar:{type:\"widget\",attributes:{allowed:[\"aria-valuetext\",\"aria-valuenow\",\"aria-valuemax\",\"aria-valuemin\",\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"progress\"],unsupported:!1},radio:{type:\"widget\",attributes:{allowed:[\"aria-selected\",\"aria-posinset\",\"aria-setsize\",\"aria-required\",\"aria-errormessage\"],required:[\"aria-checked\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:null,implicit:['input[type=\"radio\"]'],unsupported:!1,allowedElements:[\"BUTTON\",\"LI\",{tagName:\"INPUT\",attributes:{TYPE:\"IMAGE\"}},{tagName:\"INPUT\",attributes:{TYPE:\"BUTTON\"}}]},radiogroup:{type:\"composite\",attributes:{allowed:[\"aria-activedescendant\",\"aria-required\",\"aria-expanded\",\"aria-readonly\",\"aria-errormessage\"]},owned:{all:[\"radio\"]},nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"OL\",\"UL\"]},range:{nameFrom:[\"author\"],type:\"abstract\",unsupported:!1},region:{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"section[aria-label]\",\"section[aria-labelledby]\",\"section[title]\"],unsupported:!1,allowedElements:[\"ARTICLE\",\"ASIDE\"]},roletype:{type:\"abstract\",unsupported:!1},row:{type:\"structure\",attributes:{allowed:[\"aria-activedescendant\",\"aria-colindex\",\"aria-expanded\",\"aria-level\",\"aria-selected\",\"aria-rowindex\",\"aria-errormessage\"]},owned:{one:[\"cell\",\"columnheader\",\"rowheader\",\"gridcell\"]},nameFrom:[\"author\",\"contents\"],context:[\"rowgroup\",\"grid\",\"treegrid\",\"table\"],implicit:[\"tr\"],unsupported:!1},rowgroup:{type:\"structure\",attributes:{allowed:[\"aria-activedescendant\",\"aria-expanded\",\"aria-errormessage\"]},owned:{all:[\"row\"]},nameFrom:[\"author\",\"contents\"],context:[\"grid\",\"table\"],implicit:[\"tbody\",\"thead\",\"tfoot\"],unsupported:!1},rowheader:{type:\"structure\",attributes:{allowed:[\"aria-colindex\",\"aria-colspan\",\"aria-expanded\",\"aria-rowindex\",\"aria-rowspan\",\"aria-required\",\"aria-readonly\",\"aria-selected\",\"aria-sort\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:[\"row\"],implicit:[\"th\"],unsupported:!1},scrollbar:{type:\"widget\",attributes:{required:[\"aria-controls\",\"aria-valuenow\",\"aria-valuemax\",\"aria-valuemin\"],allowed:[\"aria-valuetext\",\"aria-orientation\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,unsupported:!1},search:{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"ASIDE\",\"FORM\",\"SECTION\"]},searchbox:{type:\"widget\",attributes:{allowed:[\"aria-activedescendant\",\"aria-autocomplete\",\"aria-multiline\",\"aria-readonly\",\"aria-required\",\"aria-placeholder\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:['input[type=\"search\"]'],unsupported:!1,allowedElements:[{tagName:\"INPUT\",attributes:{TYPE:\"TEXT\"}}]},section:{nameFrom:[\"author\",\"contents\"],type:\"abstract\",unsupported:!1},sectionhead:{nameFrom:[\"author\",\"contents\"],type:\"abstract\",unsupported:!1},select:{nameFrom:[\"author\"],type:\"abstract\",unsupported:!1},separator:{type:\"structure\",attributes:{allowed:[\"aria-expanded\",\"aria-orientation\",\"aria-valuenow\",\"aria-valuemax\",\"aria-valuemin\",\"aria-valuetext\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"hr\"],unsupported:!1,allowedElements:[\"LI\"]},slider:{type:\"widget\",attributes:{allowed:[\"aria-valuetext\",\"aria-orientation\",\"aria-readonly\",\"aria-errormessage\"],required:[\"aria-valuenow\",\"aria-valuemax\",\"aria-valuemin\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:['input[type=\"range\"]'],unsupported:!1},spinbutton:{type:\"widget\",attributes:{allowed:[\"aria-valuetext\",\"aria-required\",\"aria-readonly\",\"aria-errormessage\"],required:[\"aria-valuenow\",\"aria-valuemax\",\"aria-valuemin\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:['input[type=\"number\"]'],unsupported:!1,allowedElements:[{tagName:\"INPUT\",attributes:{TYPE:\"TEXT\"}}]},status:{type:\"widget\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"output\"],unsupported:!1,allowedElements:[\"SECTION\"]},structure:{type:\"abstract\",unsupported:!1},switch:{type:\"widget\",attributes:{allowed:[\"aria-errormessage\"],required:[\"aria-checked\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:null,unsupported:!1,allowedElements:[\"BUTTON\",{tagName:\"INPUT\",attributes:{TYPE:\"CHECKBOX\"}},{tagName:\"INPUT\",attributes:{TYPE:\"IMAGE\"}},{tagName:\"INPUT\",attributes:{TYPE:\"BUTTON\"}},{tagName:\"A\",condition:t.MUST_HAVE_HREF_ATTRIBUTE}]},tab:{type:\"widget\",attributes:{allowed:[\"aria-selected\",\"aria-expanded\",\"aria-setsize\",\"aria-posinset\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:[\"tablist\"],unsupported:!1,allowedElements:[\"BUTTON\",\"H1\",\"H2\",\"H3\",\"H4\",\"H5\",\"H6\",\"LI\",{tagName:\"INPUT\",attributes:{TYPE:\"BUTTON\"}},{tagName:\"A\",condition:t.MUST_HAVE_HREF_ATTRIBUTE}]},table:{type:\"structure\",attributes:{allowed:[\"aria-colcount\",\"aria-rowcount\",\"aria-errormessage\"]},owned:{one:[\"rowgroup\",\"row\"]},nameFrom:[\"author\"],context:null,implicit:[\"table\"],unsupported:!1},tablist:{type:\"composite\",attributes:{allowed:[\"aria-activedescendant\",\"aria-expanded\",\"aria-level\",\"aria-multiselectable\",\"aria-orientation\",\"aria-errormessage\"]},owned:{all:[\"tab\"]},nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"OL\",\"UL\"]},tabpanel:{type:\"widget\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"SECTION\"]},term:{type:\"structure\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:null,implicit:[\"dt\"],unsupported:!1},textbox:{type:\"widget\",attributes:{allowed:[\"aria-activedescendant\",\"aria-autocomplete\",\"aria-multiline\",\"aria-readonly\",\"aria-required\",\"aria-placeholder\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:['input[type=\"text\"]','input[type=\"email\"]','input[type=\"password\"]','input[type=\"tel\"]','input[type=\"url\"]',\"input:not([type])\",\"textarea\"],unsupported:!1},timer:{type:\"widget\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,unsupported:!1},toolbar:{type:\"structure\",attributes:{allowed:[\"aria-activedescendant\",\"aria-expanded\",\"aria-orientation\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:['menu[type=\"toolbar\"]'],unsupported:!1,allowedElements:[\"OL\",\"UL\"]},tooltip:{type:\"widget\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:null,unsupported:!1},tree:{type:\"composite\",attributes:{allowed:[\"aria-activedescendant\",\"aria-multiselectable\",\"aria-required\",\"aria-expanded\",\"aria-orientation\",\"aria-errormessage\"]},owned:{all:[\"treeitem\"]},nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"OL\",\"UL\"]},treegrid:{type:\"composite\",attributes:{allowed:[\"aria-activedescendant\",\"aria-colcount\",\"aria-expanded\",\"aria-level\",\"aria-multiselectable\",\"aria-readonly\",\"aria-required\",\"aria-rowcount\",\"aria-orientation\",\"aria-errormessage\"]},owned:{one:[\"rowgroup\",\"row\"]},nameFrom:[\"author\"],context:null,unsupported:!1},treeitem:{type:\"widget\",attributes:{allowed:[\"aria-checked\",\"aria-selected\",\"aria-expanded\",\"aria-level\",\"aria-posinset\",\"aria-setsize\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:[\"group\",\"tree\"],unsupported:!1,allowedElements:[\"LI\",{tagName:\"A\",condition:t.MUST_HAVE_HREF_ATTRIBUTE}]},widget:{type:\"abstract\",unsupported:!1},window:{nameFrom:[\"author\"],type:\"abstract\",unsupported:!1}},e.elementsAllowedNoRole=[{tagName:\"AREA\",condition:t.MUST_HAVE_HREF_ATTRIBUTE},\"BASE\",\"BODY\",\"CAPTION\",\"COL\",\"COLGROUP\",\"DATALIST\",\"DD\",\"DETAILS\",\"DT\",\"HEAD\",\"HTML\",{tagName:\"INPUT\",attributes:{TYPE:\"COLOR\"}},{tagName:\"INPUT\",attributes:{TYPE:\"DATE\"}},{tagName:\"INPUT\",attributes:{TYPE:\"DATETIME\"}},{tagName:\"INPUT\",condition:t.CANNOT_HAVE_LIST_ATTRIBUTE,attributes:{TYPE:\"EMAIL\"}},{tagName:\"INPUT\",attributes:{TYPE:\"FILE\"}},{tagName:\"INPUT\",attributes:{TYPE:\"HIDDEN\"}},{tagName:\"INPUT\",attributes:{TYPE:\"MONTH\"}},{tagName:\"INPUT\",attributes:{TYPE:\"NUMBER\"}},{tagName:\"INPUT\",attributes:{TYPE:\"PASSWORD\"}},{tagName:\"INPUT\",attributes:{TYPE:\"RANGE\"}},{tagName:\"INPUT\",attributes:{TYPE:\"RESET\"}},{tagName:\"INPUT\",condition:t.CANNOT_HAVE_LIST_ATTRIBUTE,attributes:{TYPE:\"SEARCH\"}},{tagName:\"INPUT\",attributes:{TYPE:\"SUBMIT\"}},{tagName:\"INPUT\",condition:t.CANNOT_HAVE_LIST_ATTRIBUTE,attributes:{TYPE:\"TEL\"}},{tagName:\"INPUT\",attributes:{TYPE:\"TIME\"}},{tagName:\"INPUT\",condition:t.CANNOT_HAVE_LIST_ATTRIBUTE,attributes:{TYPE:\"URL\"}},{tagName:\"INPUT\",attributes:{TYPE:\"WEEK\"}},\"KEYGEN\",\"LABEL\",\"LEGEND\",{tagName:\"LINK\",attributes:{TYPE:\"HREF\"}},\"MAIN\",\"MAP\",\"MATH\",{tagName:\"MENU\",attributes:{TYPE:\"CONTEXT\"}},{tagName:\"MENUITEM\",attributes:{TYPE:\"COMMAND\"}},{tagName:\"MENUITEM\",attributes:{TYPE:\"CHECKBOX\"}},{tagName:\"MENUITEM\",attributes:{TYPE:\"RADIO\"}},\"META\",\"METER\",\"NOSCRIPT\",\"OPTGROUP\",\"PARAM\",\"PICTURE\",\"PROGRESS\",\"SCRIPT\",{tagName:\"SELECT\",condition:t.MUST_HAVE_SIZE_ATTRIBUTE_WITH_VALUE_GREATER_THAN_1,attributes:{TYPE:\"MULTIPLE\"}},\"SOURCE\",\"STYLE\",\"TEMPLATE\",\"TEXTAREA\",\"TITLE\",\"TRACK\",\"CLIPPATH\",\"CURSOR\",\"DEFS\",\"DESC\",\"FEBLEND\",\"FECOLORMATRIX\",\"FECOMPONENTTRANSFER\",\"FECOMPOSITE\",\"FECONVOLVEMATRIX\",\"FEDIFFUSELIGHTING\",\"FEDISPLACEMENTMAP\",\"FEDISTANTLIGHT\",\"FEDROPSHADOW\",\"FEFLOOD\",\"FEFUNCA\",\"FEFUNCB\",\"FEFUNCG\",\"FEFUNCR\",\"FEGAUSSIANBLUR\",\"FEIMAGE\",\"FEMERGE\",\"FEMERGENODE\",\"FEMORPHOLOGY\",\"FEOFFSET\",\"FEPOINTLIGHT\",\"FESPECULARLIGHTING\",\"FESPOTLIGHT\",\"FETILE\",\"FETURBULENCE\",\"FILTER\",\"HATCH\",\"HATCHPATH\",\"LINEARGRADIENT\",\"MARKER\",\"MASK\",\"MESHGRADIENT\",\"MESHPATCH\",\"MESHROW\",\"METADATA\",\"MPATH\",\"PATTERN\",\"RADIALGRADIENT\",\"SOLIDCOLOR\",\"STOP\",\"SWITCH\",\"VIEW\"],e.elementsAllowedAnyRole=[{tagName:\"A\",condition:t.CANNOT_HAVE_HREF_ATTRIBUTE},\"ABBR\",\"ADDRESS\",\"CANVAS\",\"DIV\",\"P\",\"PRE\",\"BLOCKQUOTE\",\"INS\",\"DEL\",\"OUTPUT\",\"SPAN\",\"TABLE\",\"TBODY\",\"THEAD\",\"TFOOT\",\"TD\",\"EM\",\"STRONG\",\"SMALL\",\"S\",\"CITE\",\"Q\",\"DFN\",\"ABBR\",\"TIME\",\"CODE\",\"VAR\",\"SAMP\",\"KBD\",\"SUB\",\"SUP\",\"I\",\"B\",\"U\",\"MARK\",\"RUBY\",\"RT\",\"RP\",\"BDI\",\"BDO\",\"BR\",\"WBR\",\"TH\",\"TR\"],e.evaluateRoleForElement={A:function(e){var t=e.node,r=e.out;return\"http://www.w3.org/2000/svg\"===t.namespaceURI||(!t.href.length||r)},AREA:function(e){return!e.node.href},BUTTON:function(e){var t=e.node,r=e.role,a=e.out;return\"menu\"===t.getAttribute(\"type\")?\"menuitem\"===r:a},IMG:function(e){var t=e.node,r=e.out;return t.alt?!r:r},INPUT:function(e){var t=e.node,r=e.role,a=e.out;switch(t.type){case\"button\":case\"image\":return a;case\"checkbox\":return!(\"button\"!==r||!t.hasAttribute(\"aria-pressed\"))||a;case\"radio\":return\"menuitemradio\"===r;case\"text\":return\"combobox\"===r||\"searchbox\"===r||\"spinbutton\"===r;default:return!1}},LI:function(e){var t=e.node,r=e.out;return!axe.utils.matchesSelector(t,\"ol li, ul li\")||r},LINK:function(e){return!e.node.href},MENU:function(e){return\"context\"!==e.node.getAttribute(\"type\")},OPTION:function(e){var t=e.node;return!axe.utils.matchesSelector(t,\"select > option, datalist > option, optgroup > option\")},SELECT:function(e){var t=e.node,r=e.role;return!t.multiple&&t.size<=1&&\"menu\"===r},SVG:function(e){var t=e.node,r=e.out;return!(!t.parentNode||\"http://www.w3.org/2000/svg\"!==t.parentNode.namespaceURI)||r}};var c={};commons.color=c;var y=commons.dom={},o=commons.table={},v=commons.text={EdgeFormDefaults:{}};commons.utils=axe.utils;function i(e){return e.getPropertyValue(\"font-family\").split(/[,;]/g).map(function(e){return e.trim().toLowerCase()})}u.requiredAttr=function(e){\"use strict\";var t=u.lookupTable.role[e];return t&&t.attributes&&t.attributes.required||[]},u.allowedAttr=function(e){\"use strict\";var t=u.lookupTable.role[e],r=t&&t.attributes&&t.attributes.allowed||[],a=t&&t.attributes&&t.attributes.required||[];return r.concat(u.lookupTable.globalAttributes).concat(a)},u.validateAttr=function(e){\"use strict\";return!!u.lookupTable.attributes[e]},u.validateAttrValue=function(e,t){\"use strict\";var r,a,n=e.getAttribute(t),o=u.lookupTable.attributes[t],i=y.getRootNode(e);if(!o)return!0;switch(o.type){case\"boolean\":case\"nmtoken\":return\"string\"==typeof n&&o.values.includes(n.toLowerCase());case\"nmtokens\":return(a=axe.utils.tokenList(n)).reduce(function(e,t){return e&&o.values.includes(t)},0!==a.length);case\"idref\":return 0===n.trim().length||!(!n||!i.getElementById(n));case\"idrefs\":return 0===n.trim().length||(a=axe.utils.tokenList(n)).some(function(e){return i.getElementById(e)});case\"string\":return!0;case\"decimal\":return!(!(r=n.match(/^[-+]?([0-9]*)\\.?([0-9]*)$/))||!r[1]&&!r[2]);case\"int\":return/^[-+]?[0-9]+$/.test(n)}},u.getElementUnallowedRoles=function(t){var r=!(1<arguments.length&&void 0!==arguments[1])||arguments[1],a=t.nodeName.toUpperCase();if(!axe.utils.isHtmlElement(t))return[];var e=function(e){var t=[];if(!e)return t;if(e.hasAttribute(\"role\")){var r=axe.utils.tokenList(e.getAttribute(\"role\").toLowerCase());t=t.concat(r)}if(e.hasAttributeNS(\"http://www.idpf.org/2007/ops\",\"type\")){var a=axe.utils.tokenList(e.getAttributeNS(\"http://www.idpf.org/2007/ops\",\"type\").toLowerCase()).map(function(e){return\"doc-\"+e});t=t.concat(a)}return t=t.filter(function(e){return axe.commons.aria.isValidRole(e)})}(t),n=axe.commons.aria.implicitRole(t);return e.filter(function(e){return(!r||e!==n)&&(!(r||\"row\"===e&&\"TR\"===a&&axe.utils.matchesSelector(t,'table[role=\"grid\"] > tr'))||(!u.isAriaRoleAllowedOnElement(t,e)||void 0))})},u.getRole=function(e){var t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},r=t.noImplicit,a=t.fallback,n=t.abstracts,o=t.dpub,i=(e.getAttribute(\"role\")||\"\").trim().toLowerCase(),s=(a?axe.utils.tokenList(i):[i]).filter(function(e){return!(!o&&\"doc-\"===e.substr(0,4))&&u.isValidRole(e,{allowAbstract:n})})[0];return s||r?s||null:u.implicitRole(e)},u.isAccessibleRef=function(e){e=e.actualNode||e;var t=y.getRootNode(e);t=t.documentElement||t;var a=e.id,n=Object.keys(u.lookupTable.attributes).filter(function(e){var t=u.lookupTable.attributes[e].type;return/^idrefs?$/.test(t)});return void 0!==function e(t,r){if(r(t))return t;for(var a=0;a<t.children.length;a++){var n=e(t.children[a],r);if(n)return n}}(t,function(r){if(1===r.nodeType)return\"LABEL\"===r.nodeName.toUpperCase()&&r.getAttribute(\"for\")===a||n.filter(function(e){return r.hasAttribute(e)}).some(function(e){var t=r.getAttribute(e);return\"idref\"===u.lookupTable.attributes[e].type?t===a:axe.utils.tokenList(t).includes(a)})})},u.isAriaRoleAllowedOnElement=function(e,t){var r=e.nodeName.toUpperCase(),a=axe.commons.aria.lookupTable;if(u.validateNodeAndAttributes(e,a.elementsAllowedNoRole))return!1;if(u.validateNodeAndAttributes(e,a.elementsAllowedAnyRole))return!0;var n=a.role[t];if(!n)return!1;if(!(n.allowedElements&&Array.isArray(n.allowedElements)&&n.allowedElements.length))return!1;var o=!1;return o=u.validateNodeAndAttributes(e,n.allowedElements),Object.keys(a.evaluateRoleForElement).includes(r)&&(o=a.evaluateRoleForElement[r]({node:e,role:t,out:o})),o},u.labelVirtual=function(e){var t=e.actualNode,r=void 0;return t.getAttribute(\"aria-labelledby\")&&(r=y.idrefs(t,\"aria-labelledby\").map(function(e){var t=axe.utils.getNodeFromTree(axe._tree[0],e);return t?v.visibleVirtual(t,!0):\"\"}).join(\" \").trim())?r:(r=t.getAttribute(\"aria-label\"))&&(r=v.sanitize(r).trim())?r:null},u.label=function(e){return e=axe.utils.getNodeFromTree(axe._tree[0],e),u.labelVirtual(e)},u.isValidRole=function(e){var t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},r=t.allowAbstract,a=t.flagUnsupported,n=void 0!==a&&a,o=u.lookupTable.role[e],i=!!o&&o.unsupported;return!(!o||n&&i)&&(!!r||\"abstract\"!==o.type)},u.getRolesWithNameFromContents=function(){return Object.keys(u.lookupTable.role).filter(function(e){return u.lookupTable.role[e].nameFrom&&-1!==u.lookupTable.role[e].nameFrom.indexOf(\"contents\")})},u.getRolesByType=function(t){return Object.keys(u.lookupTable.role).filter(function(e){return u.lookupTable.role[e].type===t})},u.getRoleType=function(e){var t=u.lookupTable.role[e];return t&&t.type||null},u.requiredOwned=function(e){\"use strict\";var t=null,r=u.lookupTable.role[e];return r&&(t=axe.utils.clone(r.owned)),t},u.requiredContext=function(e){\"use strict\";var t=null,r=u.lookupTable.role[e];return r&&(t=axe.utils.clone(r.context)),t},u.implicitNodes=function(e){\"use strict\";var t=null,r=u.lookupTable.role[e];return r&&r.implicit&&(t=axe.utils.clone(r.implicit)),t},u.implicitRole=function(r){\"use strict\";var e=Object.keys(u.lookupTable.role).map(function(e){var t=u.lookupTable.role[e];return{name:e,implicit:t&&t.implicit}}).reduce(function(e,t){return t.implicit&&t.implicit.some(function(e){return axe.utils.matchesSelector(r,e)})&&e.push(t.name),e},[]);if(!e.length)return null;for(var t,a,n=r.attributes,o=[],i=0,s=n.length;i<s;i++){var l=n[i];l.name.match(/^aria-/)&&o.push(l.name)}return(t=e,a=o,t.map(function(e){return{score:(t=e,u.allowedAttr(t).reduce(function(e,t){return e+(-1<a.indexOf(t)?1:0)},0)),name:e};var t}).sort(function(e,t){return t.score-e.score}).map(function(e){return e.name})).shift()},u.validateNodeAndAttributes=function(a,e){var t=a.nodeName.toUpperCase();if(e.filter(function(e){return\"string\"==typeof e}).includes(t))return!0;var r=e.filter(function(e){return\"object\"===(void 0===e?\"undefined\":T(e))}).filter(function(e){return e.tagName===t}),n=Array.from(a.attributes).map(function(e){return e.name.toUpperCase()}),o=r.filter(function(t){if(!t.attributes)return!!t.condition;var e=Object.keys(t.attributes);if(!e.length)return!1;var r=!1;return e.forEach(function(e){n.includes(e)&&(a.getAttribute(e).trim().toUpperCase()===t.attributes[e]&&(r=!0))}),r});if(!o.length)return!1;var i=!0;return o.forEach(function(e){e.condition&&\"function\"==typeof e.condition&&(i=e.condition(a))}),i},c.Color=function(e,t,r,a){this.red=e,this.green=t,this.blue=r,this.alpha=a,this.toHexString=function(){var e=Math.round(this.red).toString(16),t=Math.round(this.green).toString(16),r=Math.round(this.blue).toString(16);return\"#\"+(15.5<this.red?e:\"0\"+e)+(15.5<this.green?t:\"0\"+t)+(15.5<this.blue?r:\"0\"+r)};var n=/^rgb\\((\\d+), (\\d+), (\\d+)\\)$/,o=/^rgba\\((\\d+), (\\d+), (\\d+), (\\d*(\\.\\d+)?)\\)/;this.parseRgbString=function(e){if(\"transparent\"===e)return this.red=0,this.green=0,this.blue=0,void(this.alpha=0);var t=e.match(n);return t?(this.red=parseInt(t[1],10),this.green=parseInt(t[2],10),this.blue=parseInt(t[3],10),void(this.alpha=1)):(t=e.match(o))?(this.red=parseInt(t[1],10),this.green=parseInt(t[2],10),this.blue=parseInt(t[3],10),void(this.alpha=parseFloat(t[4]))):void 0},this.getRelativeLuminance=function(){var e=this.red/255,t=this.green/255,r=this.blue/255;return.2126*(e<=.03928?e/12.92:Math.pow((e+.055)/1.055,2.4))+.7152*(t<=.03928?t/12.92:Math.pow((t+.055)/1.055,2.4))+.0722*(r<=.03928?r/12.92:Math.pow((r+.055)/1.055,2.4))}},c.flattenColors=function(e,t){var r=e.alpha,a=(1-r)*t.red+r*e.red,n=(1-r)*t.green+r*e.green,o=(1-r)*t.blue+r*e.blue,i=e.alpha+t.alpha*(1-e.alpha);return new c.Color(a,n,o,i)},c.getContrast=function(e,t){if(!t||!e)return null;t.alpha<1&&(t=c.flattenColors(t,e));var r=e.getRelativeLuminance(),a=t.getRelativeLuminance();return(Math.max(a,r)+.05)/(Math.min(a,r)+.05)},c.hasValidContrastRatio=function(e,t,r,a){var n=c.getContrast(e,t),o=a&&Math.ceil(72*r)/96<14||!a&&Math.ceil(72*r)/96<18?4.5:3;return{isValid:o<n,contrastRatio:n,expectedContrastRatio:o}},c.elementIsDistinct=function(e,t){var a=window.getComputedStyle(e);if(\"none\"!==a.getPropertyValue(\"background-image\"))return!0;if([\"border-bottom\",\"border-top\",\"outline\"].reduce(function(e,t){var r=new c.Color;return r.parseRgbString(a.getPropertyValue(t+\"-color\")),e||\"none\"!==a.getPropertyValue(t+\"-style\")&&0<parseFloat(a.getPropertyValue(t+\"-width\"))&&0!==r.alpha},!1))return!0;var r=window.getComputedStyle(t);if(i(a)[0]!==i(r)[0])return!0;var n=[\"text-decoration-line\",\"text-decoration-style\",\"font-weight\",\"font-style\",\"font-size\"].reduce(function(e,t){return e||a.getPropertyValue(t)!==r.getPropertyValue(t)},!1),o=a.getPropertyValue(\"text-decoration\");return o.split(\" \").length<3&&(n=n||o!==r.getPropertyValue(\"text-decoration\")),n};var r,s=[\"IMG\",\"CANVAS\",\"OBJECT\",\"IFRAME\",\"VIDEO\",\"SVG\"];function d(e,t){var r=e.nodeName.toUpperCase();if(s.includes(r))return axe.commons.color.incompleteData.set(\"bgColor\",\"imgNode\"),!0;var a=(t=t||window.getComputedStyle(e)).getPropertyValue(\"background-image\"),n=\"none\"!==a;if(n){var o=/gradient/.test(a);axe.commons.color.incompleteData.set(\"bgColor\",o?\"bgGradient\":\"bgImage\")}return n}function m(e,t){t=t||window.getComputedStyle(e);var r=new c.Color;if(r.parseRgbString(t.getPropertyValue(\"background-color\")),0!==r.alpha){var a=t.getPropertyValue(\"opacity\");r.alpha=r.alpha*a}return r}function l(e,t){var r=e.getClientRects()[0],a=y.shadowElementsFromPoint(r.left,r.top);if(a)for(var n=0;n<a.length;n++)if(a[n]!==e&&a[n]===t)return!0;return!1}c.getCoords=function(e){if(!(e.left>window.innerWidth||e.top>window.innerHeight))return{x:Math.min(Math.ceil(e.left+e.width/2),window.innerWidth-1),y:Math.min(Math.ceil(e.top+e.height/2),window.innerHeight-1)}},c.getRectStack=function(e){var t=c.getCoords(e.getBoundingClientRect());if(t){var r=y.shadowElementsFromPoint(t.x,t.y),a=Array.from(e.getClientRects());if(a&&1<a.length){var n=a.filter(function(e){return e.width&&0<e.width}).map(function(e){var t=c.getCoords(e);if(t)return y.shadowElementsFromPoint(t.x,t.y)});return n.splice(0,0,r),n}return[r]}return null},c.filteredRectStack=function(n){var o=c.getRectStack(n);if(o&&1===o.length)return o[0];if(o&&1<o.length){var i=o.shift(),s=void 0;return o.forEach(function(e,t){if(0!==t){var r=o[t-1],a=o[t];s=r.every(function(e,t){return e===a[t]})||i.includes(n)}}),s?o[0]:(axe.commons.color.incompleteData.set(\"bgColor\",\"elmPartiallyObscuring\"),null)}return axe.commons.color.incompleteData.set(\"bgColor\",\"outsideViewport\"),null},c.getBackgroundStack=function(e){var t,r,a,n=c.filteredRectStack(e);if(null===n)return null;n=function(e,t){var r={TD:[\"TR\",\"TBODY\"],TH:[\"TR\",\"THEAD\"],INPUT:[\"LABEL\"]},a=e.map(function(e){return e.tagName}),n=e;for(var o in r)if(a.includes(o))for(var i in r[o])if(o.hasOwnProperty(i)){var s=axe.commons.dom.findUp(t,r[o][i]);s&&-1===e.indexOf(s)&&axe.commons.dom.visuallyOverlaps(t.getBoundingClientRect(),s)&&n.splice(a.indexOf(o)+1,0,s),t.tagName===r[o][i]&&-1===a.indexOf(t.tagName)&&n.splice(a.indexOf(o)+1,0,t)}return n}(n,e),n=y.reduceToElementsBelowFloating(n,e),r=(t=n).indexOf(document.body),a=t,1<r&&!d(document.documentElement)&&0===m(document.documentElement).alpha&&(a.splice(r,1),a.splice(t.indexOf(document.documentElement),1),a.push(document.body));var o=(n=a).indexOf(e);return.99<=function(e,t,r){var a=0;if(0<e)for(var n=e-1;0<=n;n--){var o=t[n],i=m(o,window.getComputedStyle(o));i.alpha&&l(r,o)?a+=i.alpha:t.splice(n,1)}return a}(o,n,e)?(axe.commons.color.incompleteData.set(\"bgColor\",\"bgOverlap\"),null):-1!==o?n:null},c.getBackgroundColor=function(s){var l=1<arguments.length&&void 0!==arguments[1]?arguments[1]:[];if(!0!==(2<arguments.length&&void 0!==arguments[2]&&arguments[2])){var e=s.clientHeight-2>=2*window.innerHeight;s.scrollIntoView(e)}var u=[],t=c.getBackgroundStack(s);return(t||[]).some(function(e){var t,r,a,n,o=window.getComputedStyle(e),i=m(e,o);return a=i,(n=(t=s)!==(r=e)&&!y.visuallyContains(t,r)&&0!==a.alpha)&&axe.commons.color.incompleteData.set(\"bgColor\",\"elmPartiallyObscured\"),n||d(e,o)?(u=null,l.push(e),!0):0!==i.alpha&&(l.push(e),u.push(i),1===i.alpha)}),null===u||null===t?null:(u.push(new c.Color(255,255,255,1)),u.reduce(c.flattenColors))},y.isOpaque=function(e){var t=window.getComputedStyle(e);return d(e,t)||1===m(e,t).alpha},c.getForegroundColor=function(e,t){var r=window.getComputedStyle(e),a=new c.Color;a.parseRgbString(r.getPropertyValue(\"color\"));var n=r.getPropertyValue(\"opacity\");if(a.alpha=a.alpha*n,1===a.alpha)return a;var o=c.getBackgroundColor(e,[],t);if(null!==o)return c.flattenColors(a,o);var i=axe.commons.color.incompleteData.get(\"bgColor\");return axe.commons.color.incompleteData.set(\"fgColor\",i),null},c.incompleteData=(r={},{set:function(e,t){if(\"string\"!=typeof e)throw new Error(\"Incomplete data: key must be a string\");return t&&(r[e]=t),r[e]},get:function(e){return r[e]},clear:function(){r={}}}),y.reduceToElementsBelowFloating=function(e,t){var r,a,n,o=[\"fixed\",\"sticky\"],i=[],s=!1;for(r=0;r<e.length;++r)(a=e[r])===t&&(s=!0),n=window.getComputedStyle(a),s||-1===o.indexOf(n.position)?i.push(a):i=[];return i},y.findElmsInContext=function(e){var t=e.context,r=e.value,a=e.attr,n=e.elm,o=void 0===n?\"\":n,i=void 0,s=axe.utils.escapeSelector(r);return i=9===t.nodeType||11===t.nodeType?t:y.getRootNode(t),Array.from(i.querySelectorAll(o+\"[\"+a+\"=\"+s+\"]\"))},y.findUp=function(e,t){return y.findUpVirtual(axe.utils.getNodeFromTree(axe._tree[0],e),t)},y.findUpVirtual=function(e,t){var r=void 0;if(r=e.actualNode,!e.shadowId&&\"function\"==typeof e.actualNode.closest){var a=e.actualNode.closest(t);return a||null}for(;(r=r.assignedSlot?r.assignedSlot:r.parentNode)&&11===r.nodeType&&(r=r.host),r&&!axe.utils.matchesSelector(r,t)&&r!==document.documentElement;);return axe.utils.matchesSelector(r,t)?r:null},y.getComposedParent=function e(t){if(t.assignedSlot)return e(t.assignedSlot);if(t.parentNode){var r=t.parentNode;if(1===r.nodeType)return r;if(r.host)return r.host}return null},y.getElementByReference=function(e,t){var r=e.getAttribute(t);if(r&&\"#\"===r.charAt(0)){r=decodeURIComponent(r.substring(1));var a=document.getElementById(r);if(a)return a;if((a=document.getElementsByName(r)).length)return a[0]}return null},y.getElementCoordinates=function(e){\"use strict\";var t=y.getScrollOffset(document),r=t.left,a=t.top,n=e.getBoundingClientRect();return{top:n.top+a,right:n.right+r,bottom:n.bottom+a,left:n.left+r,width:n.right-n.left,height:n.bottom-n.top}},y.getRootNode=axe.utils.getRootNode,y.getScrollOffset=function(e){\"use strict\";if(!e.nodeType&&e.document&&(e=e.document),9!==e.nodeType)return{left:e.scrollLeft,top:e.scrollTop};var t=e.documentElement,r=e.body;return{left:t&&t.scrollLeft||r&&r.scrollLeft||0,top:t&&t.scrollTop||r&&r.scrollTop||0}},y.getViewportSize=function(e){\"use strict\";var t,r=e.document,a=r.documentElement;return e.innerWidth?{width:e.innerWidth,height:e.innerHeight}:a?{width:a.clientWidth,height:a.clientHeight}:{width:(t=r.body).clientWidth,height:t.clientHeight}};var a=[\"HEAD\",\"TITLE\",\"TEMPLATE\",\"SCRIPT\",\"STYLE\",\"IFRAME\",\"OBJECT\",\"VIDEO\",\"AUDIO\",\"NOSCRIPT\"];function n(e){return e.disabled||!y.isVisible(e,!0)&&\"AREA\"!==e.nodeName.toUpperCase()}y.hasContentVirtual=function(e,t){return function(e){if(!a.includes(e.actualNode.nodeName.toUpperCase()))return e.children.some(function(e){var t=e.actualNode;return 3===t.nodeType&&t.nodeValue.trim()})}(e)||y.isVisualContent(e.actualNode)||!!u.labelVirtual(e)||!t&&e.children.some(function(e){return 1===e.actualNode.nodeType&&y.hasContentVirtual(e)})},y.hasContent=function(e,t){return e=axe.utils.getNodeFromTree(axe._tree[0],e),y.hasContentVirtual(e,t)},y.idrefs=function(e,t){\"use strict\";var r,a,n=y.getRootNode(e),o=[],i=e.getAttribute(t);if(i)for(r=0,a=(i=axe.utils.tokenList(i)).length;r<a;r++)o.push(n.getElementById(i[r]));return o},y.isFocusable=function(e){\"use strict\";if(n(e))return!1;if(y.isNativelyFocusable(e))return!0;var t=e.getAttribute(\"tabindex\");return!(!t||isNaN(parseInt(t,10)))},y.isNativelyFocusable=function(e){\"use strict\";if(!e||n(e))return!1;switch(e.nodeName.toUpperCase()){case\"A\":case\"AREA\":if(e.href)return!0;break;case\"INPUT\":return\"hidden\"!==e.type;case\"TEXTAREA\":case\"SELECT\":case\"DETAILS\":case\"BUTTON\":return!0}return!1},y.insertedIntoFocusOrder=function(e){return-1<e.tabIndex&&y.isFocusable(e)&&!y.isNativelyFocusable(e)},y.isHTML5=function(e){var t=e.doctype;return null!==t&&(\"html\"===t.name&&!t.publicId&&!t.systemId)};var p=[\"block\",\"list-item\",\"table\",\"flex\",\"grid\",\"inline-block\"];function f(e){var t=window.getComputedStyle(e).getPropertyValue(\"display\");return p.includes(t)||\"table-\"===t.substr(0,6)}y.isInTextBlock=function(r){if(f(r))return!1;var e=function(e){for(var t=y.getComposedParent(e);t&&!f(t);)t=y.getComposedParent(t);return axe.utils.getNodeFromTree(axe._tree[0],t)}(r),a=\"\",n=\"\",o=0;return function t(e,r){!1!==r(e.actualNode)&&e.children.forEach(function(e){return t(e,r)})}(e,function(e){if(2===o)return!1;if(3===e.nodeType&&(a+=e.nodeValue),1===e.nodeType){var t=(e.nodeName||\"\").toUpperCase();if([\"BR\",\"HR\"].includes(t))0===o?n=a=\"\":o=2;else{if(\"none\"===e.style.display||\"hidden\"===e.style.overflow||![\"\",null,\"none\"].includes(e.style.float)||![\"\",null,\"relative\"].includes(e.style.position))return!1;if(\"A\"===t&&e.href||\"link\"===(e.getAttribute(\"role\")||\"\").toLowerCase())return e===r&&(o=1),n+=e.textContent,!1}}}),a=axe.commons.text.sanitize(a),n=axe.commons.text.sanitize(n),a.length>n.length},y.isNode=function(e){\"use strict\";return e instanceof Node},y.isOffscreen=function(e){var t=void 0,r=document.documentElement,a=window.getComputedStyle(e),n=window.getComputedStyle(document.body||r).getPropertyValue(\"direction\"),o=y.getElementCoordinates(e);if(o.bottom<0&&(function(e,t){for(e=y.getComposedParent(e);e&&\"html\"!==e.nodeName.toLowerCase();){if(e.scrollTop&&0<=(t+=e.scrollTop))return!1;e=y.getComposedParent(e)}return!0}(e,o.bottom)||\"absolute\"===a.position))return!0;if(0===o.left&&0===o.right)return!1;if(\"ltr\"===n){if(o.right<=0)return!0}else if(t=Math.max(r.scrollWidth,y.getViewportSize(window).width),o.left>=t)return!0;return!1},y.isVisible=function(e,t,r){\"use strict\";var a,n,o,i,s;return 9===e.nodeType||(11===e.nodeType&&(e=e.host),null!==(a=window.getComputedStyle(e,null))&&(n=e.nodeName.toUpperCase(),!(\"none\"===a.getPropertyValue(\"display\")||\"STYLE\"===n.toUpperCase()||\"SCRIPT\"===n.toUpperCase()||!t&&(i=a.getPropertyValue(\"clip\"),(s=i.match(/rect\\s*\\(([0-9]+)px,?\\s*([0-9]+)px,?\\s*([0-9]+)px,?\\s*([0-9]+)px\\s*\\)/))&&5===s.length&&s[3]-s[1]<=0&&s[2]-s[4]<=0)||!r&&(\"hidden\"===a.getPropertyValue(\"visibility\")||!t&&y.isOffscreen(e))||t&&\"true\"===e.getAttribute(\"aria-hidden\"))&&(!!(o=e.assignedSlot?e.assignedSlot:e.parentNode)&&y.isVisible(o,t,!0))))};var h=[\"checkbox\",\"img\",\"radio\",\"range\",\"slider\",\"spinbutton\",\"textbox\"];y.isVisualContent=function(e){var t=e.getAttribute(\"role\");if(t)return-1!==h.indexOf(t);switch(e.tagName.toUpperCase()){case\"IMG\":case\"IFRAME\":case\"OBJECT\":case\"VIDEO\":case\"AUDIO\":case\"CANVAS\":case\"SVG\":case\"MATH\":case\"BUTTON\":case\"SELECT\":case\"TEXTAREA\":case\"KEYGEN\":case\"PROGRESS\":case\"METER\":return!0;case\"INPUT\":return\"hidden\"!==e.type;default:return!1}},y.shadowElementsFromPoint=function(a,n){var t=2<arguments.length&&void 0!==arguments[2]?arguments[2]:document,o=3<arguments.length&&void 0!==arguments[3]?arguments[3]:0;if(999<o)throw new Error(\"Infinite loop detected\");return Array.from(t.elementsFromPoint(a,n)).filter(function(e){return y.getRootNode(e)===t}).reduce(function(e,t){if(axe.utils.isShadowRoot(t)){var r=y.shadowElementsFromPoint(a,n,t.shadowRoot,o+1);(e=e.concat(r)).length&&axe.commons.dom.visuallyContains(e[0],t)&&e.push(t)}else e.push(t);return e},[])},y.visuallyContains=function(e,t){var r=e.getBoundingClientRect(),a=r.top+.01,n=r.bottom-.01,o=r.left+.01,i=r.right-.01,s=t.getBoundingClientRect(),l=s.top,u=s.left,c=l-t.scrollTop,d=l-t.scrollTop+t.scrollHeight,m=u-t.scrollLeft,p=u-t.scrollLeft+t.scrollWidth,f=window.getComputedStyle(t);return\"inline\"===f.getPropertyValue(\"display\")||!(o<m&&o<s.left||a<c&&a<s.top||p<i&&i>s.right||d<n&&n>s.bottom)&&(!(i>s.right||n>s.bottom)||(\"scroll\"===f.overflow||\"auto\"===f.overflow||\"hidden\"===f.overflow||t instanceof HTMLBodyElement||t instanceof HTMLHtmlElement))},y.visuallyOverlaps=function(e,t){var r=t.getBoundingClientRect(),a=r.top,n=r.left,o=a-t.scrollTop,i=a-t.scrollTop+t.scrollHeight,s=n-t.scrollLeft,l=n-t.scrollLeft+t.scrollWidth;if(e.left>l&&e.left>r.right||e.top>i&&e.top>r.bottom||e.right<s&&e.right<r.left||e.bottom<o&&e.bottom<r.top)return!1;var u=window.getComputedStyle(t);return!(e.left>r.right||e.top>r.bottom)||(\"scroll\"===u.overflow||\"auto\"===u.overflow||t instanceof HTMLBodyElement||t instanceof HTMLHtmlElement)},o.getAllCells=function(e){var t,r,a,n,o=[];for(t=0,a=e.rows.length;t<a;t++)for(r=0,n=e.rows[t].cells.length;r<n;r++)o.push(e.rows[t].cells[r]);return o},o.getCellPosition=function(e,t){var r,a;for(t||(t=o.toGrid(y.findUp(e,\"table\"))),r=0;r<t.length;r++)if(t[r]&&-1!==(a=t[r].indexOf(e)))return{x:a,y:r}},o.getHeaders=function(e){if(e.hasAttribute(\"headers\"))return commons.dom.idrefs(e,\"headers\");var t=commons.table.toGrid(commons.dom.findUp(e,\"table\")),r=commons.table.getCellPosition(e,t),a=o.traverse(\"left\",r,t).filter(function(e){return o.isRowHeader(e)}),n=o.traverse(\"up\",r,t).filter(function(e){return o.isColumnHeader(e)});return[].concat(a,n).reverse()},o.getScope=function(e){var t=e.getAttribute(\"scope\"),r=e.getAttribute(\"role\");if(e instanceof Element==!1||-1===[\"TD\",\"TH\"].indexOf(e.nodeName.toUpperCase()))throw new TypeError(\"Expected TD or TH element\");if(\"columnheader\"===r)return\"col\";if(\"rowheader\"===r)return\"row\";if(\"col\"===t||\"row\"===t)return t;if(\"TH\"!==e.nodeName.toUpperCase())return!1;var a=o.toGrid(y.findUp(e,\"table\")),n=o.getCellPosition(e);return a[n.y].reduce(function(e,t){return e&&\"TH\"===t.nodeName.toUpperCase()},!0)?\"col\":a.map(function(e){return e[n.x]}).reduce(function(e,t){return e&&\"TH\"===t.nodeName.toUpperCase()},!0)?\"row\":\"auto\"},o.isColumnHeader=function(e){return-1!==[\"col\",\"auto\"].indexOf(o.getScope(e))},o.isDataCell=function(e){if(!e.children.length&&!e.textContent.trim())return!1;var t=e.getAttribute(\"role\");return axe.commons.aria.isValidRole(t)?[\"cell\",\"gridcell\"].includes(t):\"TD\"===e.nodeName.toUpperCase()},o.isDataTable=function(e){var t=(e.getAttribute(\"role\")||\"\").toLowerCase();if((\"presentation\"===t||\"none\"===t)&&!y.isFocusable(e))return!1;if(\"true\"===e.getAttribute(\"contenteditable\")||y.findUp(e,'[contenteditable=\"true\"]'))return!0;if(\"grid\"===t||\"treegrid\"===t||\"table\"===t)return!0;if(\"landmark\"===commons.aria.getRoleType(t))return!0;if(\"0\"===e.getAttribute(\"datatable\"))return!1;if(e.getAttribute(\"summary\"))return!0;if(e.tHead||e.tFoot||e.caption)return!0;for(var r=0,a=e.children.length;r<a;r++)if(\"COLGROUP\"===e.children[r].nodeName.toUpperCase())return!0;for(var n,o,i=0,s=e.rows.length,l=!1,u=0;u<s;u++)for(var c=0,d=(n=e.rows[u]).cells.length;c<d;c++){if(\"TH\"===(o=n.cells[c]).nodeName.toUpperCase())return!0;if(l||o.offsetWidth===o.clientWidth&&o.offsetHeight===o.clientHeight||(l=!0),o.getAttribute(\"scope\")||o.getAttribute(\"headers\")||o.getAttribute(\"abbr\"))return!0;if([\"columnheader\",\"rowheader\"].includes((o.getAttribute(\"role\")||\"\").toLowerCase()))return!0;if(1===o.children.length&&\"ABBR\"===o.children[0].nodeName.toUpperCase())return!0;i++}if(e.getElementsByTagName(\"table\").length)return!1;if(s<2)return!1;var m,p,f=e.rows[Math.ceil(s/2)];if(1===f.cells.length&&1===f.cells[0].colSpan)return!1;if(5<=f.cells.length)return!0;if(l)return!0;for(u=0;u<s;u++){if(n=e.rows[u],m&&m!==window.getComputedStyle(n).getPropertyValue(\"background-color\"))return!0;if(m=window.getComputedStyle(n).getPropertyValue(\"background-color\"),p&&p!==window.getComputedStyle(n).getPropertyValue(\"background-image\"))return!0;p=window.getComputedStyle(n).getPropertyValue(\"background-image\")}return 20<=s||!(y.getElementCoordinates(e).width>.95*y.getViewportSize(window).width)&&(!(i<10)&&!e.querySelector(\"object, embed, iframe, applet\"))},o.isHeader=function(e){if(o.isColumnHeader(e)||o.isRowHeader(e))return!0;if(e.getAttribute(\"id\")){var t=axe.utils.escapeSelector(e.getAttribute(\"id\"));return!!document.querySelector('[headers~=\"'+t+'\"]')}return!1},o.isRowHeader=function(e){return[\"row\",\"auto\"].includes(o.getScope(e))},o.toGrid=function(e){for(var t=[],r=e.rows,a=0,n=r.length;a<n;a++){var o=r[a].cells;t[a]=t[a]||[];for(var i=0,s=0,l=o.length;s<l;s++)for(var u=0;u<o[s].colSpan;u++){for(var c=0;c<o[s].rowSpan;c++){for(t[a+c]=t[a+c]||[];t[a+c][i];)i++;t[a+c][i]=o[s]}i++}}return t},o.toArray=o.toGrid,o.traverse=function(e,t,r,a){if(Array.isArray(t)&&(a=r,r=t,t={x:0,y:0}),\"string\"==typeof e)switch(e){case\"left\":e={x:-1,y:0};break;case\"up\":e={x:0,y:-1};break;case\"right\":e={x:1,y:0};break;case\"down\":e={x:0,y:1}}return function e(t,r,a,n){var o,i=a[r.y]?a[r.y][r.x]:void 0;return i?\"function\"==typeof n&&!0===(o=n(i,r,a))?[i]:((o=e(t,{x:r.x+t.x,y:r.y+t.y},a,n)).unshift(i),o):[]}(e,{x:t.x+e.x,y:t.y+e.y},r,a)};var w={submit:\"Submit\",reset:\"Reset\"},k=[\"text\",\"search\",\"tel\",\"url\",\"email\",\"date\",\"time\",\"number\",\"range\",\"color\"],x=[\"A\",\"EM\",\"STRONG\",\"SMALL\",\"MARK\",\"ABBR\",\"DFN\",\"I\",\"B\",\"S\",\"U\",\"CODE\",\"VAR\",\"SAMP\",\"KBD\",\"SUP\",\"SUB\",\"Q\",\"CITE\",\"SPAN\",\"BDO\",\"BDI\",\"BR\",\"WBR\",\"INS\",\"DEL\",\"IMG\",\"EMBED\",\"OBJECT\",\"IFRAME\",\"MAP\",\"AREA\",\"SCRIPT\",\"NOSCRIPT\",\"RUBY\",\"VIDEO\",\"AUDIO\",\"INPUT\",\"TEXTAREA\",\"SELECT\",\"BUTTON\",\"LABEL\",\"OUTPUT\",\"DATALIST\",\"KEYGEN\",\"PROGRESS\",\"COMMAND\",\"CANVAS\",\"TIME\",\"METER\"];function E(e,t){var r=e.actualNode.querySelector(t.toLowerCase());return r?v.accessibleText(r):\"\"}function A(e){return!!v.sanitize(e)}v.accessibleText=function(e,t){var r=axe.utils.getNodeFromTree(axe._tree[0],e);return axe.commons.text.accessibleTextVirtual(r,t)},v.accessibleTextVirtual=function(e,t){var g=void 0,i=[];function b(e,a,n){return e.children.reduce(function(e,t){var r=t.actualNode;return 3===r.nodeType?e+=r.nodeValue:1===r.nodeType&&(x.includes(r.nodeName.toUpperCase())||(e+=\" \"),e+=g(t,a,n)),e},\"\")}function s(e,t,r){var a,n,o,i,s,l,u,c,d,m=\"\",p=e.actualNode,f=p.nodeName.toUpperCase();if(a=e.actualNode,[\"BUTTON\",\"SUMMARY\",\"A\"].includes(a.nodeName.toUpperCase())&&A(m=b(e,!1,!1)||\"\"))return m;if(\"FIGURE\"===f&&A(m=E(e,\"figcaption\")))return m;if(\"TABLE\"===f){if(A(m=E(e,\"caption\")))return m;if(A(m=p.getAttribute(\"title\")||p.getAttribute(\"summary\")||(n=e,axe.commons.table.isDataTable(n.actualNode)||1!==axe.commons.table.getAllCells(n.actualNode).length?\"\":b(n,!1,!1).trim())||\"\"))return m}if(o=e.actualNode,i=o.nodeName.toUpperCase(),[\"IMG\",\"APPLET\",\"AREA\"].includes(i)||\"INPUT\"===i&&\"image\"===o.type.toLowerCase())return p.getAttribute(\"alt\")||\"\";if(c=e.actualNode,(\"TEXTAREA\"===(d=c.nodeName.toUpperCase())||\"SELECT\"===d||\"INPUT\"===d&&\"hidden\"!==c.type.toLowerCase())&&!r){if(u=e.actualNode,[\"button\",\"reset\",\"submit\"].includes(u.type.toLowerCase()))return p.value||p.title||w[p.type]||\"\";var h=(l=void 0,(s=e).actualNode.id&&(l=y.findElmsInContext({elm:\"label\",attr:\"for\",value:s.actualNode.id,context:s.actualNode})[0]),l||(l=y.findUpVirtual(s,\"label\")),axe.utils.getNodeFromTree(axe._tree[0],l));if(h)return g(h,t,!0)}return\"\"}function l(e,t,r){var a=\"\",n=e.actualNode;return!t&&n.hasAttribute(\"aria-labelledby\")&&(a=v.sanitize(y.idrefs(n,\"aria-labelledby\").map(function(e){if(null===e)return\"\";n===e&&i.pop();var t=axe.utils.getNodeFromTree(axe._tree[0],e);return g(t,!0,n!==e)}).join(\" \"))),a||r&&function(e){if(!e)return!1;var t=e.actualNode;switch(t.nodeName.toUpperCase()){case\"SELECT\":case\"TEXTAREA\":return!0;case\"INPUT\":return!t.hasAttribute(\"type\")||k.includes(t.getAttribute(\"type\").toLowerCase());default:return!1}}(e)||!n.hasAttribute(\"aria-label\")?a:v.sanitize(n.getAttribute(\"aria-label\"))}return e instanceof Node&&(e=axe.utils.getNodeFromTree(axe._tree[0],e)),g=function(e,t,r){var a=void 0;if(!e||i.includes(e))return\"\";if(null!==e&&e.actualNode instanceof Node!=!0)throw new Error(\"Invalid argument. Virtual Node must be provided\");if(!t&&!y.isVisible(e.actualNode,!0))return\"\";i.push(e);var n,o=e.actualNode.getAttribute(\"role\");return A(a=l(e,t,r))?a:A(a=s(e,t,r))?a:r&&A(a=function(e,t){var r=e.actualNode,a=r.nodeName.toUpperCase();if(\"INPUT\"===a)return!r.hasAttribute(\"type\")||k.includes(r.type.toLowerCase())?r.value:\"\";if(\"SELECT\"===a&&t){var n=r.options;if(n&&n.length){for(var o=\"\",i=0;i<n.length;i++)n[i].selected&&(o+=\" \"+n[i].text);return v.sanitize(o)}return\"\"}return\"TEXTAREA\"===a&&r.value?r.value:\"\"}(e,t))?a:!t&&(n=e.actualNode,[\"TABLE\",\"FIGURE\",\"SELECT\"].includes(n.nodeName.toUpperCase()))||o&&-1===u.getRolesWithNameFromContents().indexOf(o)||!A(a=b(e,t,r))?e.actualNode.hasAttribute(\"title\")?e.actualNode.getAttribute(\"title\"):\"\":a},v.sanitize(g(e,t))};v.autocomplete={stateTerms:[\"on\",\"off\"],standaloneTerms:[\"name\",\"honorific-prefix\",\"given-name\",\"additional-name\",\"family-name\",\"honorific-suffix\",\"nickname\",\"username\",\"new-password\",\"current-password\",\"organization-title\",\"organization\",\"street-address\",\"address-line1\",\"address-line2\",\"address-line3\",\"address-level4\",\"address-level3\",\"address-level2\",\"address-level1\",\"country\",\"country-name\",\"postal-code\",\"cc-name\",\"cc-given-name\",\"cc-additional-name\",\"cc-family-name\",\"cc-number\",\"cc-exp\",\"cc-exp-month\",\"cc-exp-year\",\"cc-csc\",\"cc-type\",\"transaction-currency\",\"transaction-amount\",\"language\",\"bday\",\"bday-day\",\"bday-month\",\"bday-year\",\"sex\",\"url\",\"photo\"],qualifiers:[\"home\",\"work\",\"mobile\",\"fax\",\"pager\"],qualifiedTerms:[\"tel\",\"tel-country-code\",\"tel-national\",\"tel-area-code\",\"tel-local\",\"tel-local-prefix\",\"tel-local-suffix\",\"tel-extension\",\"email\",\"impp\"],locations:[\"billing\",\"shipping\"]},v.isValidAutocomplete=function(e){var t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},r=t.looseTyped,a=void 0!==r&&r,n=t.stateTerms,o=void 0===n?[]:n,i=t.locations,s=void 0===i?[]:i,l=t.qualifiers,u=void 0===l?[]:l,c=t.standaloneTerms,d=void 0===c?[]:c,m=t.qualifiedTerms,p=void 0===m?[]:m;if(e=e.toLowerCase().trim(),(o=o.concat(v.autocomplete.stateTerms)).includes(e)||\"\"===e)return!0;u=u.concat(v.autocomplete.qualifiers),s=s.concat(v.autocomplete.locations),d=d.concat(v.autocomplete.standaloneTerms),p=p.concat(v.autocomplete.qualifiedTerms);var f=e.split(/\\s+/g);if(!a&&(8<f[0].length&&\"section-\"===f[0].substr(0,8)&&f.shift(),s.includes(f[0])&&f.shift(),u.includes(f[0])&&(f.shift(),d=[]),1!==f.length))return!1;var h=f[f.length-1];return d.includes(h)||p.includes(h)},v.labelVirtual=function(e){var t,r;if(r=u.labelVirtual(e))return r;if(e.actualNode.id){var a=axe.commons.utils.escapeSelector(e.actualNode.getAttribute(\"id\"));if(r=(t=axe.commons.dom.getRootNode(e.actualNode).querySelector('label[for=\"'+a+'\"]'))&&v.visible(t,!0))return r}return(r=(t=y.findUpVirtual(e,\"label\"))&&v.visible(t,!0))||null},v.label=function(e){return e=axe.utils.getNodeFromTree(axe._tree[0],e),v.labelVirtual(e)},v.sanitize=function(e){\"use strict\";return e.replace(/\\r\\n/g,\"\\n\").replace(/\\u00A0/g,\" \").replace(/[\\s]{2,}/g,\" \").trim()},v.visibleVirtual=function(r,a,n){var e=r.children.map(function(e){if(3===e.actualNode.nodeType){var t=e.actualNode.nodeValue;if(t&&y.isVisible(r.actualNode,a))return t}else if(!n)return v.visibleVirtual(e,a)}).join(\"\");return v.sanitize(e)},v.visible=function(e,t,r){return e=axe.utils.getNodeFromTree(axe._tree[0],e),v.visibleVirtual(e,t,r)},axe.utils.getBaseLang=function(e){return e?e.trim().split(\"-\")[0].toLowerCase():\"\"};var g=[\"a\",\"abbr\",\"address\",\"area\",\"article\",\"aside\",\"audio\",\"b\",\"base\",\"bdi\",\"bdo\",\"blockquote\",\"body\",\"br\",\"button\",\"canvas\",\"caption\",\"cite\",\"code\",\"col\",\"colgroup\",\"data\",\"datalist\",\"dd\",\"del\",\"details\",\"dfn\",\"dialog\",\"div\",\"dl\",\"dt\",\"em\",\"embed\",\"fieldset\",\"figcaption\",\"figure\",\"footer\",\"form\",\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\",\"head\",\"header\",\"hgroup\",\"hr\",\"html\",\"i\",\"iframe\",\"img\",\"input\",\"ins\",\"kbd\",\"keygen\",\"label\",\"legend\",\"li\",\"link\",\"main\",\"map\",\"mark\",\"math\",\"menu\",\"menuitem\",\"meta\",\"meter\",\"nav\",\"noscript\",\"object\",\"ol\",\"optgroup\",\"option\",\"output\",\"p\",\"param\",\"picture\",\"pre\",\"progress\",\"q\",\"rb\",\"rp\",\"rt\",\"rtc\",\"ruby\",\"s\",\"samp\",\"script\",\"section\",\"select\",\"slot\",\"small\",\"source\",\"span\",\"strong\",\"style\",\"sub\",\"summary\",\"sup\",\"svg\",\"table\",\"tbody\",\"td\",\"template\",\"textarea\",\"tfoot\",\"th\",\"thead\",\"time\",\"title\",\"tr\",\"track\",\"u\",\"ul\",\"var\",\"video\",\"wbr\"];axe.utils.isHtmlElement=function(e){var t=e.nodeName.toLowerCase();return g.includes(t)&&\"http://www.w3.org/2000/svg\"!==e.namespaceURI},axe.utils.tokenList=function(e){\"use strict\";return e.trim().replace(/\\s{2,}/g,\" \").split(\" \")};var b=[\"aa\",\"ab\",\"ae\",\"af\",\"ak\",\"am\",\"an\",\"ar\",\"as\",\"av\",\"ay\",\"az\",\"ba\",\"be\",\"bg\",\"bh\",\"bi\",\"bm\",\"bn\",\"bo\",\"br\",\"bs\",\"ca\",\"ce\",\"ch\",\"co\",\"cr\",\"cs\",\"cu\",\"cv\",\"cy\",\"da\",\"de\",\"dv\",\"dz\",\"ee\",\"el\",\"en\",\"eo\",\"es\",\"et\",\"eu\",\"fa\",\"ff\",\"fi\",\"fj\",\"fo\",\"fr\",\"fy\",\"ga\",\"gd\",\"gl\",\"gn\",\"gu\",\"gv\",\"ha\",\"he\",\"hi\",\"ho\",\"hr\",\"ht\",\"hu\",\"hy\",\"hz\",\"ia\",\"id\",\"ie\",\"ig\",\"ii\",\"ik\",\"in\",\"io\",\"is\",\"it\",\"iu\",\"iw\",\"ja\",\"ji\",\"jv\",\"jw\",\"ka\",\"kg\",\"ki\",\"kj\",\"kk\",\"kl\",\"km\",\"kn\",\"ko\",\"kr\",\"ks\",\"ku\",\"kv\",\"kw\",\"ky\",\"la\",\"lb\",\"lg\",\"li\",\"ln\",\"lo\",\"lt\",\"lu\",\"lv\",\"mg\",\"mh\",\"mi\",\"mk\",\"ml\",\"mn\",\"mo\",\"mr\",\"ms\",\"mt\",\"my\",\"na\",\"nb\",\"nd\",\"ne\",\"ng\",\"nl\",\"nn\",\"no\",\"nr\",\"nv\",\"ny\",\"oc\",\"oj\",\"om\",\"or\",\"os\",\"pa\",\"pi\",\"pl\",\"ps\",\"pt\",\"qu\",\"rm\",\"rn\",\"ro\",\"ru\",\"rw\",\"sa\",\"sc\",\"sd\",\"se\",\"sg\",\"sh\",\"si\",\"sk\",\"sl\",\"sm\",\"sn\",\"so\",\"sq\",\"sr\",\"ss\",\"st\",\"su\",\"sv\",\"sw\",\"ta\",\"te\",\"tg\",\"th\",\"ti\",\"tk\",\"tl\",\"tn\",\"to\",\"tr\",\"ts\",\"tt\",\"tw\",\"ty\",\"ug\",\"uk\",\"ur\",\"uz\",\"ve\",\"vi\",\"vo\",\"wa\",\"wo\",\"xh\",\"yi\",\"yo\",\"za\",\"zh\",\"zu\",\"aaa\",\"aab\",\"aac\",\"aad\",\"aae\",\"aaf\",\"aag\",\"aah\",\"aai\",\"aak\",\"aal\",\"aam\",\"aan\",\"aao\",\"aap\",\"aaq\",\"aas\",\"aat\",\"aau\",\"aav\",\"aaw\",\"aax\",\"aaz\",\"aba\",\"abb\",\"abc\",\"abd\",\"abe\",\"abf\",\"abg\",\"abh\",\"abi\",\"abj\",\"abl\",\"abm\",\"abn\",\"abo\",\"abp\",\"abq\",\"abr\",\"abs\",\"abt\",\"abu\",\"abv\",\"abw\",\"abx\",\"aby\",\"abz\",\"aca\",\"acb\",\"acd\",\"ace\",\"acf\",\"ach\",\"aci\",\"ack\",\"acl\",\"acm\",\"acn\",\"acp\",\"acq\",\"acr\",\"acs\",\"act\",\"acu\",\"acv\",\"acw\",\"acx\",\"acy\",\"acz\",\"ada\",\"adb\",\"add\",\"ade\",\"adf\",\"adg\",\"adh\",\"adi\",\"adj\",\"adl\",\"adn\",\"ado\",\"adp\",\"adq\",\"adr\",\"ads\",\"adt\",\"adu\",\"adw\",\"adx\",\"ady\",\"adz\",\"aea\",\"aeb\",\"aec\",\"aed\",\"aee\",\"aek\",\"ael\",\"aem\",\"aen\",\"aeq\",\"aer\",\"aes\",\"aeu\",\"aew\",\"aey\",\"aez\",\"afa\",\"afb\",\"afd\",\"afe\",\"afg\",\"afh\",\"afi\",\"afk\",\"afn\",\"afo\",\"afp\",\"afs\",\"aft\",\"afu\",\"afz\",\"aga\",\"agb\",\"agc\",\"agd\",\"age\",\"agf\",\"agg\",\"agh\",\"agi\",\"agj\",\"agk\",\"agl\",\"agm\",\"agn\",\"ago\",\"agp\",\"agq\",\"agr\",\"ags\",\"agt\",\"agu\",\"agv\",\"agw\",\"agx\",\"agy\",\"agz\",\"aha\",\"ahb\",\"ahg\",\"ahh\",\"ahi\",\"ahk\",\"ahl\",\"ahm\",\"ahn\",\"aho\",\"ahp\",\"ahr\",\"ahs\",\"aht\",\"aia\",\"aib\",\"aic\",\"aid\",\"aie\",\"aif\",\"aig\",\"aih\",\"aii\",\"aij\",\"aik\",\"ail\",\"aim\",\"ain\",\"aio\",\"aip\",\"aiq\",\"air\",\"ais\",\"ait\",\"aiw\",\"aix\",\"aiy\",\"aja\",\"ajg\",\"aji\",\"ajn\",\"ajp\",\"ajt\",\"aju\",\"ajw\",\"ajz\",\"akb\",\"akc\",\"akd\",\"ake\",\"akf\",\"akg\",\"akh\",\"aki\",\"akj\",\"akk\",\"akl\",\"akm\",\"ako\",\"akp\",\"akq\",\"akr\",\"aks\",\"akt\",\"aku\",\"akv\",\"akw\",\"akx\",\"aky\",\"akz\",\"ala\",\"alc\",\"ald\",\"ale\",\"alf\",\"alg\",\"alh\",\"ali\",\"alj\",\"alk\",\"all\",\"alm\",\"aln\",\"alo\",\"alp\",\"alq\",\"alr\",\"als\",\"alt\",\"alu\",\"alv\",\"alw\",\"alx\",\"aly\",\"alz\",\"ama\",\"amb\",\"amc\",\"ame\",\"amf\",\"amg\",\"ami\",\"amj\",\"amk\",\"aml\",\"amm\",\"amn\",\"amo\",\"amp\",\"amq\",\"amr\",\"ams\",\"amt\",\"amu\",\"amv\",\"amw\",\"amx\",\"amy\",\"amz\",\"ana\",\"anb\",\"anc\",\"and\",\"ane\",\"anf\",\"ang\",\"anh\",\"ani\",\"anj\",\"ank\",\"anl\",\"anm\",\"ann\",\"ano\",\"anp\",\"anq\",\"anr\",\"ans\",\"ant\",\"anu\",\"anv\",\"anw\",\"anx\",\"any\",\"anz\",\"aoa\",\"aob\",\"aoc\",\"aod\",\"aoe\",\"aof\",\"aog\",\"aoh\",\"aoi\",\"aoj\",\"aok\",\"aol\",\"aom\",\"aon\",\"aor\",\"aos\",\"aot\",\"aou\",\"aox\",\"aoz\",\"apa\",\"apb\",\"apc\",\"apd\",\"ape\",\"apf\",\"apg\",\"aph\",\"api\",\"apj\",\"apk\",\"apl\",\"apm\",\"apn\",\"apo\",\"app\",\"apq\",\"apr\",\"aps\",\"apt\",\"apu\",\"apv\",\"apw\",\"apx\",\"apy\",\"apz\",\"aqa\",\"aqc\",\"aqd\",\"aqg\",\"aql\",\"aqm\",\"aqn\",\"aqp\",\"aqr\",\"aqt\",\"aqz\",\"arb\",\"arc\",\"ard\",\"are\",\"arh\",\"ari\",\"arj\",\"ark\",\"arl\",\"arn\",\"aro\",\"arp\",\"arq\",\"arr\",\"ars\",\"art\",\"aru\",\"arv\",\"arw\",\"arx\",\"ary\",\"arz\",\"asa\",\"asb\",\"asc\",\"asd\",\"ase\",\"asf\",\"asg\",\"ash\",\"asi\",\"asj\",\"ask\",\"asl\",\"asn\",\"aso\",\"asp\",\"asq\",\"asr\",\"ass\",\"ast\",\"asu\",\"asv\",\"asw\",\"asx\",\"asy\",\"asz\",\"ata\",\"atb\",\"atc\",\"atd\",\"ate\",\"atg\",\"ath\",\"ati\",\"atj\",\"atk\",\"atl\",\"atm\",\"atn\",\"ato\",\"atp\",\"atq\",\"atr\",\"ats\",\"att\",\"atu\",\"atv\",\"atw\",\"atx\",\"aty\",\"atz\",\"aua\",\"aub\",\"auc\",\"aud\",\"aue\",\"auf\",\"aug\",\"auh\",\"aui\",\"auj\",\"auk\",\"aul\",\"aum\",\"aun\",\"auo\",\"aup\",\"auq\",\"aur\",\"aus\",\"aut\",\"auu\",\"auw\",\"aux\",\"auy\",\"auz\",\"avb\",\"avd\",\"avi\",\"avk\",\"avl\",\"avm\",\"avn\",\"avo\",\"avs\",\"avt\",\"avu\",\"avv\",\"awa\",\"awb\",\"awc\",\"awd\",\"awe\",\"awg\",\"awh\",\"awi\",\"awk\",\"awm\",\"awn\",\"awo\",\"awr\",\"aws\",\"awt\",\"awu\",\"awv\",\"aww\",\"awx\",\"awy\",\"axb\",\"axe\",\"axg\",\"axk\",\"axl\",\"axm\",\"axx\",\"aya\",\"ayb\",\"ayc\",\"ayd\",\"aye\",\"ayg\",\"ayh\",\"ayi\",\"ayk\",\"ayl\",\"ayn\",\"ayo\",\"ayp\",\"ayq\",\"ayr\",\"ays\",\"ayt\",\"ayu\",\"ayx\",\"ayy\",\"ayz\",\"aza\",\"azb\",\"azc\",\"azd\",\"azg\",\"azj\",\"azm\",\"azn\",\"azo\",\"azt\",\"azz\",\"baa\",\"bab\",\"bac\",\"bad\",\"bae\",\"baf\",\"bag\",\"bah\",\"bai\",\"baj\",\"bal\",\"ban\",\"bao\",\"bap\",\"bar\",\"bas\",\"bat\",\"bau\",\"bav\",\"baw\",\"bax\",\"bay\",\"baz\",\"bba\",\"bbb\",\"bbc\",\"bbd\",\"bbe\",\"bbf\",\"bbg\",\"bbh\",\"bbi\",\"bbj\",\"bbk\",\"bbl\",\"bbm\",\"bbn\",\"bbo\",\"bbp\",\"bbq\",\"bbr\",\"bbs\",\"bbt\",\"bbu\",\"bbv\",\"bbw\",\"bbx\",\"bby\",\"bbz\",\"bca\",\"bcb\",\"bcc\",\"bcd\",\"bce\",\"bcf\",\"bcg\",\"bch\",\"bci\",\"bcj\",\"bck\",\"bcl\",\"bcm\",\"bcn\",\"bco\",\"bcp\",\"bcq\",\"bcr\",\"bcs\",\"bct\",\"bcu\",\"bcv\",\"bcw\",\"bcy\",\"bcz\",\"bda\",\"bdb\",\"bdc\",\"bdd\",\"bde\",\"bdf\",\"bdg\",\"bdh\",\"bdi\",\"bdj\",\"bdk\",\"bdl\",\"bdm\",\"bdn\",\"bdo\",\"bdp\",\"bdq\",\"bdr\",\"bds\",\"bdt\",\"bdu\",\"bdv\",\"bdw\",\"bdx\",\"bdy\",\"bdz\",\"bea\",\"beb\",\"bec\",\"bed\",\"bee\",\"bef\",\"beg\",\"beh\",\"bei\",\"bej\",\"bek\",\"bem\",\"beo\",\"bep\",\"beq\",\"ber\",\"bes\",\"bet\",\"beu\",\"bev\",\"bew\",\"bex\",\"bey\",\"bez\",\"bfa\",\"bfb\",\"bfc\",\"bfd\",\"bfe\",\"bff\",\"bfg\",\"bfh\",\"bfi\",\"bfj\",\"bfk\",\"bfl\",\"bfm\",\"bfn\",\"bfo\",\"bfp\",\"bfq\",\"bfr\",\"bfs\",\"bft\",\"bfu\",\"bfw\",\"bfx\",\"bfy\",\"bfz\",\"bga\",\"bgb\",\"bgc\",\"bgd\",\"bge\",\"bgf\",\"bgg\",\"bgi\",\"bgj\",\"bgk\",\"bgl\",\"bgm\",\"bgn\",\"bgo\",\"bgp\",\"bgq\",\"bgr\",\"bgs\",\"bgt\",\"bgu\",\"bgv\",\"bgw\",\"bgx\",\"bgy\",\"bgz\",\"bha\",\"bhb\",\"bhc\",\"bhd\",\"bhe\",\"bhf\",\"bhg\",\"bhh\",\"bhi\",\"bhj\",\"bhk\",\"bhl\",\"bhm\",\"bhn\",\"bho\",\"bhp\",\"bhq\",\"bhr\",\"bhs\",\"bht\",\"bhu\",\"bhv\",\"bhw\",\"bhx\",\"bhy\",\"bhz\",\"bia\",\"bib\",\"bic\",\"bid\",\"bie\",\"bif\",\"big\",\"bij\",\"bik\",\"bil\",\"bim\",\"bin\",\"bio\",\"bip\",\"biq\",\"bir\",\"bit\",\"biu\",\"biv\",\"biw\",\"bix\",\"biy\",\"biz\",\"bja\",\"bjb\",\"bjc\",\"bjd\",\"bje\",\"bjf\",\"bjg\",\"bjh\",\"bji\",\"bjj\",\"bjk\",\"bjl\",\"bjm\",\"bjn\",\"bjo\",\"bjp\",\"bjq\",\"bjr\",\"bjs\",\"bjt\",\"bju\",\"bjv\",\"bjw\",\"bjx\",\"bjy\",\"bjz\",\"bka\",\"bkb\",\"bkc\",\"bkd\",\"bkf\",\"bkg\",\"bkh\",\"bki\",\"bkj\",\"bkk\",\"bkl\",\"bkm\",\"bkn\",\"bko\",\"bkp\",\"bkq\",\"bkr\",\"bks\",\"bkt\",\"bku\",\"bkv\",\"bkw\",\"bkx\",\"bky\",\"bkz\",\"bla\",\"blb\",\"blc\",\"bld\",\"ble\",\"blf\",\"blg\",\"blh\",\"bli\",\"blj\",\"blk\",\"bll\",\"blm\",\"bln\",\"blo\",\"blp\",\"blq\",\"blr\",\"bls\",\"blt\",\"blv\",\"blw\",\"blx\",\"bly\",\"blz\",\"bma\",\"bmb\",\"bmc\",\"bmd\",\"bme\",\"bmf\",\"bmg\",\"bmh\",\"bmi\",\"bmj\",\"bmk\",\"bml\",\"bmm\",\"bmn\",\"bmo\",\"bmp\",\"bmq\",\"bmr\",\"bms\",\"bmt\",\"bmu\",\"bmv\",\"bmw\",\"bmx\",\"bmy\",\"bmz\",\"bna\",\"bnb\",\"bnc\",\"bnd\",\"bne\",\"bnf\",\"bng\",\"bni\",\"bnj\",\"bnk\",\"bnl\",\"bnm\",\"bnn\",\"bno\",\"bnp\",\"bnq\",\"bnr\",\"bns\",\"bnt\",\"bnu\",\"bnv\",\"bnw\",\"bnx\",\"bny\",\"bnz\",\"boa\",\"bob\",\"boe\",\"bof\",\"bog\",\"boh\",\"boi\",\"boj\",\"bok\",\"bol\",\"bom\",\"bon\",\"boo\",\"bop\",\"boq\",\"bor\",\"bot\",\"bou\",\"bov\",\"bow\",\"box\",\"boy\",\"boz\",\"bpa\",\"bpb\",\"bpd\",\"bpg\",\"bph\",\"bpi\",\"bpj\",\"bpk\",\"bpl\",\"bpm\",\"bpn\",\"bpo\",\"bpp\",\"bpq\",\"bpr\",\"bps\",\"bpt\",\"bpu\",\"bpv\",\"bpw\",\"bpx\",\"bpy\",\"bpz\",\"bqa\",\"bqb\",\"bqc\",\"bqd\",\"bqf\",\"bqg\",\"bqh\",\"bqi\",\"bqj\",\"bqk\",\"bql\",\"bqm\",\"bqn\",\"bqo\",\"bqp\",\"bqq\",\"bqr\",\"bqs\",\"bqt\",\"bqu\",\"bqv\",\"bqw\",\"bqx\",\"bqy\",\"bqz\",\"bra\",\"brb\",\"brc\",\"brd\",\"brf\",\"brg\",\"brh\",\"bri\",\"brj\",\"brk\",\"brl\",\"brm\",\"brn\",\"bro\",\"brp\",\"brq\",\"brr\",\"brs\",\"brt\",\"bru\",\"brv\",\"brw\",\"brx\",\"bry\",\"brz\",\"bsa\",\"bsb\",\"bsc\",\"bse\",\"bsf\",\"bsg\",\"bsh\",\"bsi\",\"bsj\",\"bsk\",\"bsl\",\"bsm\",\"bsn\",\"bso\",\"bsp\",\"bsq\",\"bsr\",\"bss\",\"bst\",\"bsu\",\"bsv\",\"bsw\",\"bsx\",\"bsy\",\"bta\",\"btb\",\"btc\",\"btd\",\"bte\",\"btf\",\"btg\",\"bth\",\"bti\",\"btj\",\"btk\",\"btl\",\"btm\",\"btn\",\"bto\",\"btp\",\"btq\",\"btr\",\"bts\",\"btt\",\"btu\",\"btv\",\"btw\",\"btx\",\"bty\",\"btz\",\"bua\",\"bub\",\"buc\",\"bud\",\"bue\",\"buf\",\"bug\",\"buh\",\"bui\",\"buj\",\"buk\",\"bum\",\"bun\",\"buo\",\"bup\",\"buq\",\"bus\",\"but\",\"buu\",\"buv\",\"buw\",\"bux\",\"buy\",\"buz\",\"bva\",\"bvb\",\"bvc\",\"bvd\",\"bve\",\"bvf\",\"bvg\",\"bvh\",\"bvi\",\"bvj\",\"bvk\",\"bvl\",\"bvm\",\"bvn\",\"bvo\",\"bvp\",\"bvq\",\"bvr\",\"bvt\",\"bvu\",\"bvv\",\"bvw\",\"bvx\",\"bvy\",\"bvz\",\"bwa\",\"bwb\",\"bwc\",\"bwd\",\"bwe\",\"bwf\",\"bwg\",\"bwh\",\"bwi\",\"bwj\",\"bwk\",\"bwl\",\"bwm\",\"bwn\",\"bwo\",\"bwp\",\"bwq\",\"bwr\",\"bws\",\"bwt\",\"bwu\",\"bww\",\"bwx\",\"bwy\",\"bwz\",\"bxa\",\"bxb\",\"bxc\",\"bxd\",\"bxe\",\"bxf\",\"bxg\",\"bxh\",\"bxi\",\"bxj\",\"bxk\",\"bxl\",\"bxm\",\"bxn\",\"bxo\",\"bxp\",\"bxq\",\"bxr\",\"bxs\",\"bxu\",\"bxv\",\"bxw\",\"bxx\",\"bxz\",\"bya\",\"byb\",\"byc\",\"byd\",\"bye\",\"byf\",\"byg\",\"byh\",\"byi\",\"byj\",\"byk\",\"byl\",\"bym\",\"byn\",\"byo\",\"byp\",\"byq\",\"byr\",\"bys\",\"byt\",\"byv\",\"byw\",\"byx\",\"byy\",\"byz\",\"bza\",\"bzb\",\"bzc\",\"bzd\",\"bze\",\"bzf\",\"bzg\",\"bzh\",\"bzi\",\"bzj\",\"bzk\",\"bzl\",\"bzm\",\"bzn\",\"bzo\",\"bzp\",\"bzq\",\"bzr\",\"bzs\",\"bzt\",\"bzu\",\"bzv\",\"bzw\",\"bzx\",\"bzy\",\"bzz\",\"caa\",\"cab\",\"cac\",\"cad\",\"cae\",\"caf\",\"cag\",\"cah\",\"cai\",\"caj\",\"cak\",\"cal\",\"cam\",\"can\",\"cao\",\"cap\",\"caq\",\"car\",\"cas\",\"cau\",\"cav\",\"caw\",\"cax\",\"cay\",\"caz\",\"cba\",\"cbb\",\"cbc\",\"cbd\",\"cbe\",\"cbg\",\"cbh\",\"cbi\",\"cbj\",\"cbk\",\"cbl\",\"cbn\",\"cbo\",\"cbq\",\"cbr\",\"cbs\",\"cbt\",\"cbu\",\"cbv\",\"cbw\",\"cby\",\"cca\",\"ccc\",\"ccd\",\"cce\",\"ccg\",\"cch\",\"ccj\",\"ccl\",\"ccm\",\"ccn\",\"cco\",\"ccp\",\"ccq\",\"ccr\",\"ccs\",\"cda\",\"cdc\",\"cdd\",\"cde\",\"cdf\",\"cdg\",\"cdh\",\"cdi\",\"cdj\",\"cdm\",\"cdn\",\"cdo\",\"cdr\",\"cds\",\"cdy\",\"cdz\",\"cea\",\"ceb\",\"ceg\",\"cek\",\"cel\",\"cen\",\"cet\",\"cfa\",\"cfd\",\"cfg\",\"cfm\",\"cga\",\"cgc\",\"cgg\",\"cgk\",\"chb\",\"chc\",\"chd\",\"chf\",\"chg\",\"chh\",\"chj\",\"chk\",\"chl\",\"chm\",\"chn\",\"cho\",\"chp\",\"chq\",\"chr\",\"cht\",\"chw\",\"chx\",\"chy\",\"chz\",\"cia\",\"cib\",\"cic\",\"cid\",\"cie\",\"cih\",\"cik\",\"cim\",\"cin\",\"cip\",\"cir\",\"ciw\",\"ciy\",\"cja\",\"cje\",\"cjh\",\"cji\",\"cjk\",\"cjm\",\"cjn\",\"cjo\",\"cjp\",\"cjr\",\"cjs\",\"cjv\",\"cjy\",\"cka\",\"ckb\",\"ckh\",\"ckl\",\"ckn\",\"cko\",\"ckq\",\"ckr\",\"cks\",\"ckt\",\"cku\",\"ckv\",\"ckx\",\"cky\",\"ckz\",\"cla\",\"clc\",\"cld\",\"cle\",\"clh\",\"cli\",\"clj\",\"clk\",\"cll\",\"clm\",\"clo\",\"clt\",\"clu\",\"clw\",\"cly\",\"cma\",\"cmc\",\"cme\",\"cmg\",\"cmi\",\"cmk\",\"cml\",\"cmm\",\"cmn\",\"cmo\",\"cmr\",\"cms\",\"cmt\",\"cna\",\"cnb\",\"cnc\",\"cng\",\"cnh\",\"cni\",\"cnk\",\"cnl\",\"cno\",\"cnr\",\"cns\",\"cnt\",\"cnu\",\"cnw\",\"cnx\",\"coa\",\"cob\",\"coc\",\"cod\",\"coe\",\"cof\",\"cog\",\"coh\",\"coj\",\"cok\",\"col\",\"com\",\"con\",\"coo\",\"cop\",\"coq\",\"cot\",\"cou\",\"cov\",\"cow\",\"cox\",\"coy\",\"coz\",\"cpa\",\"cpb\",\"cpc\",\"cpe\",\"cpf\",\"cpg\",\"cpi\",\"cpn\",\"cpo\",\"cpp\",\"cps\",\"cpu\",\"cpx\",\"cpy\",\"cqd\",\"cqu\",\"cra\",\"crb\",\"crc\",\"crd\",\"crf\",\"crg\",\"crh\",\"cri\",\"crj\",\"crk\",\"crl\",\"crm\",\"crn\",\"cro\",\"crp\",\"crq\",\"crr\",\"crs\",\"crt\",\"crv\",\"crw\",\"crx\",\"cry\",\"crz\",\"csa\",\"csb\",\"csc\",\"csd\",\"cse\",\"csf\",\"csg\",\"csh\",\"csi\",\"csj\",\"csk\",\"csl\",\"csm\",\"csn\",\"cso\",\"csq\",\"csr\",\"css\",\"cst\",\"csu\",\"csv\",\"csw\",\"csy\",\"csz\",\"cta\",\"ctc\",\"ctd\",\"cte\",\"ctg\",\"cth\",\"ctl\",\"ctm\",\"ctn\",\"cto\",\"ctp\",\"cts\",\"ctt\",\"ctu\",\"ctz\",\"cua\",\"cub\",\"cuc\",\"cug\",\"cuh\",\"cui\",\"cuj\",\"cuk\",\"cul\",\"cum\",\"cuo\",\"cup\",\"cuq\",\"cur\",\"cus\",\"cut\",\"cuu\",\"cuv\",\"cuw\",\"cux\",\"cuy\",\"cvg\",\"cvn\",\"cwa\",\"cwb\",\"cwd\",\"cwe\",\"cwg\",\"cwt\",\"cya\",\"cyb\",\"cyo\",\"czh\",\"czk\",\"czn\",\"czo\",\"czt\",\"daa\",\"dac\",\"dad\",\"dae\",\"daf\",\"dag\",\"dah\",\"dai\",\"daj\",\"dak\",\"dal\",\"dam\",\"dao\",\"dap\",\"daq\",\"dar\",\"das\",\"dau\",\"dav\",\"daw\",\"dax\",\"day\",\"daz\",\"dba\",\"dbb\",\"dbd\",\"dbe\",\"dbf\",\"dbg\",\"dbi\",\"dbj\",\"dbl\",\"dbm\",\"dbn\",\"dbo\",\"dbp\",\"dbq\",\"dbr\",\"dbt\",\"dbu\",\"dbv\",\"dbw\",\"dby\",\"dcc\",\"dcr\",\"dda\",\"ddd\",\"dde\",\"ddg\",\"ddi\",\"ddj\",\"ddn\",\"ddo\",\"ddr\",\"dds\",\"ddw\",\"dec\",\"ded\",\"dee\",\"def\",\"deg\",\"deh\",\"dei\",\"dek\",\"del\",\"dem\",\"den\",\"dep\",\"deq\",\"der\",\"des\",\"dev\",\"dez\",\"dga\",\"dgb\",\"dgc\",\"dgd\",\"dge\",\"dgg\",\"dgh\",\"dgi\",\"dgk\",\"dgl\",\"dgn\",\"dgo\",\"dgr\",\"dgs\",\"dgt\",\"dgu\",\"dgw\",\"dgx\",\"dgz\",\"dha\",\"dhd\",\"dhg\",\"dhi\",\"dhl\",\"dhm\",\"dhn\",\"dho\",\"dhr\",\"dhs\",\"dhu\",\"dhv\",\"dhw\",\"dhx\",\"dia\",\"dib\",\"dic\",\"did\",\"dif\",\"dig\",\"dih\",\"dii\",\"dij\",\"dik\",\"dil\",\"dim\",\"din\",\"dio\",\"dip\",\"diq\",\"dir\",\"dis\",\"dit\",\"diu\",\"diw\",\"dix\",\"diy\",\"diz\",\"dja\",\"djb\",\"djc\",\"djd\",\"dje\",\"djf\",\"dji\",\"djj\",\"djk\",\"djl\",\"djm\",\"djn\",\"djo\",\"djr\",\"dju\",\"djw\",\"dka\",\"dkk\",\"dkl\",\"dkr\",\"dks\",\"dkx\",\"dlg\",\"dlk\",\"dlm\",\"dln\",\"dma\",\"dmb\",\"dmc\",\"dmd\",\"dme\",\"dmg\",\"dmk\",\"dml\",\"dmm\",\"dmn\",\"dmo\",\"dmr\",\"dms\",\"dmu\",\"dmv\",\"dmw\",\"dmx\",\"dmy\",\"dna\",\"dnd\",\"dne\",\"dng\",\"dni\",\"dnj\",\"dnk\",\"dnn\",\"dnr\",\"dnt\",\"dnu\",\"dnv\",\"dnw\",\"dny\",\"doa\",\"dob\",\"doc\",\"doe\",\"dof\",\"doh\",\"doi\",\"dok\",\"dol\",\"don\",\"doo\",\"dop\",\"doq\",\"dor\",\"dos\",\"dot\",\"dov\",\"dow\",\"dox\",\"doy\",\"doz\",\"dpp\",\"dra\",\"drb\",\"drc\",\"drd\",\"dre\",\"drg\",\"drh\",\"dri\",\"drl\",\"drn\",\"dro\",\"drq\",\"drr\",\"drs\",\"drt\",\"dru\",\"drw\",\"dry\",\"dsb\",\"dse\",\"dsh\",\"dsi\",\"dsl\",\"dsn\",\"dso\",\"dsq\",\"dta\",\"dtb\",\"dtd\",\"dth\",\"dti\",\"dtk\",\"dtm\",\"dtn\",\"dto\",\"dtp\",\"dtr\",\"dts\",\"dtt\",\"dtu\",\"dty\",\"dua\",\"dub\",\"duc\",\"dud\",\"due\",\"duf\",\"dug\",\"duh\",\"dui\",\"duj\",\"duk\",\"dul\",\"dum\",\"dun\",\"duo\",\"dup\",\"duq\",\"dur\",\"dus\",\"duu\",\"duv\",\"duw\",\"dux\",\"duy\",\"duz\",\"dva\",\"dwa\",\"dwl\",\"dwr\",\"dws\",\"dwu\",\"dww\",\"dwy\",\"dya\",\"dyb\",\"dyd\",\"dyg\",\"dyi\",\"dym\",\"dyn\",\"dyo\",\"dyu\",\"dyy\",\"dza\",\"dzd\",\"dze\",\"dzg\",\"dzl\",\"dzn\",\"eaa\",\"ebg\",\"ebk\",\"ebo\",\"ebr\",\"ebu\",\"ecr\",\"ecs\",\"ecy\",\"eee\",\"efa\",\"efe\",\"efi\",\"ega\",\"egl\",\"ego\",\"egx\",\"egy\",\"ehu\",\"eip\",\"eit\",\"eiv\",\"eja\",\"eka\",\"ekc\",\"eke\",\"ekg\",\"eki\",\"ekk\",\"ekl\",\"ekm\",\"eko\",\"ekp\",\"ekr\",\"eky\",\"ele\",\"elh\",\"eli\",\"elk\",\"elm\",\"elo\",\"elp\",\"elu\",\"elx\",\"ema\",\"emb\",\"eme\",\"emg\",\"emi\",\"emk\",\"emm\",\"emn\",\"emo\",\"emp\",\"ems\",\"emu\",\"emw\",\"emx\",\"emy\",\"ena\",\"enb\",\"enc\",\"end\",\"enf\",\"enh\",\"enl\",\"enm\",\"enn\",\"eno\",\"enq\",\"enr\",\"enu\",\"env\",\"enw\",\"enx\",\"eot\",\"epi\",\"era\",\"erg\",\"erh\",\"eri\",\"erk\",\"ero\",\"err\",\"ers\",\"ert\",\"erw\",\"ese\",\"esg\",\"esh\",\"esi\",\"esk\",\"esl\",\"esm\",\"esn\",\"eso\",\"esq\",\"ess\",\"esu\",\"esx\",\"esy\",\"etb\",\"etc\",\"eth\",\"etn\",\"eto\",\"etr\",\"ets\",\"ett\",\"etu\",\"etx\",\"etz\",\"euq\",\"eve\",\"evh\",\"evn\",\"ewo\",\"ext\",\"eya\",\"eyo\",\"eza\",\"eze\",\"faa\",\"fab\",\"fad\",\"faf\",\"fag\",\"fah\",\"fai\",\"faj\",\"fak\",\"fal\",\"fam\",\"fan\",\"fap\",\"far\",\"fat\",\"fau\",\"fax\",\"fay\",\"faz\",\"fbl\",\"fcs\",\"fer\",\"ffi\",\"ffm\",\"fgr\",\"fia\",\"fie\",\"fil\",\"fip\",\"fir\",\"fit\",\"fiu\",\"fiw\",\"fkk\",\"fkv\",\"fla\",\"flh\",\"fli\",\"fll\",\"fln\",\"flr\",\"fly\",\"fmp\",\"fmu\",\"fnb\",\"fng\",\"fni\",\"fod\",\"foi\",\"fom\",\"fon\",\"for\",\"fos\",\"fox\",\"fpe\",\"fqs\",\"frc\",\"frd\",\"frk\",\"frm\",\"fro\",\"frp\",\"frq\",\"frr\",\"frs\",\"frt\",\"fse\",\"fsl\",\"fss\",\"fub\",\"fuc\",\"fud\",\"fue\",\"fuf\",\"fuh\",\"fui\",\"fuj\",\"fum\",\"fun\",\"fuq\",\"fur\",\"fut\",\"fuu\",\"fuv\",\"fuy\",\"fvr\",\"fwa\",\"fwe\",\"gaa\",\"gab\",\"gac\",\"gad\",\"gae\",\"gaf\",\"gag\",\"gah\",\"gai\",\"gaj\",\"gak\",\"gal\",\"gam\",\"gan\",\"gao\",\"gap\",\"gaq\",\"gar\",\"gas\",\"gat\",\"gau\",\"gav\",\"gaw\",\"gax\",\"gay\",\"gaz\",\"gba\",\"gbb\",\"gbc\",\"gbd\",\"gbe\",\"gbf\",\"gbg\",\"gbh\",\"gbi\",\"gbj\",\"gbk\",\"gbl\",\"gbm\",\"gbn\",\"gbo\",\"gbp\",\"gbq\",\"gbr\",\"gbs\",\"gbu\",\"gbv\",\"gbw\",\"gbx\",\"gby\",\"gbz\",\"gcc\",\"gcd\",\"gce\",\"gcf\",\"gcl\",\"gcn\",\"gcr\",\"gct\",\"gda\",\"gdb\",\"gdc\",\"gdd\",\"gde\",\"gdf\",\"gdg\",\"gdh\",\"gdi\",\"gdj\",\"gdk\",\"gdl\",\"gdm\",\"gdn\",\"gdo\",\"gdq\",\"gdr\",\"gds\",\"gdt\",\"gdu\",\"gdx\",\"gea\",\"geb\",\"gec\",\"ged\",\"geg\",\"geh\",\"gei\",\"gej\",\"gek\",\"gel\",\"gem\",\"geq\",\"ges\",\"gev\",\"gew\",\"gex\",\"gey\",\"gez\",\"gfk\",\"gft\",\"gfx\",\"gga\",\"ggb\",\"ggd\",\"gge\",\"ggg\",\"ggk\",\"ggl\",\"ggn\",\"ggo\",\"ggr\",\"ggt\",\"ggu\",\"ggw\",\"gha\",\"ghc\",\"ghe\",\"ghh\",\"ghk\",\"ghl\",\"ghn\",\"gho\",\"ghr\",\"ghs\",\"ght\",\"gia\",\"gib\",\"gic\",\"gid\",\"gie\",\"gig\",\"gih\",\"gil\",\"gim\",\"gin\",\"gio\",\"gip\",\"giq\",\"gir\",\"gis\",\"git\",\"giu\",\"giw\",\"gix\",\"giy\",\"giz\",\"gji\",\"gjk\",\"gjm\",\"gjn\",\"gjr\",\"gju\",\"gka\",\"gkd\",\"gke\",\"gkn\",\"gko\",\"gkp\",\"gku\",\"glc\",\"gld\",\"glh\",\"gli\",\"glj\",\"glk\",\"gll\",\"glo\",\"glr\",\"glu\",\"glw\",\"gly\",\"gma\",\"gmb\",\"gmd\",\"gme\",\"gmg\",\"gmh\",\"gml\",\"gmm\",\"gmn\",\"gmq\",\"gmu\",\"gmv\",\"gmw\",\"gmx\",\"gmy\",\"gmz\",\"gna\",\"gnb\",\"gnc\",\"gnd\",\"gne\",\"gng\",\"gnh\",\"gni\",\"gnj\",\"gnk\",\"gnl\",\"gnm\",\"gnn\",\"gno\",\"gnq\",\"gnr\",\"gnt\",\"gnu\",\"gnw\",\"gnz\",\"goa\",\"gob\",\"goc\",\"god\",\"goe\",\"gof\",\"gog\",\"goh\",\"goi\",\"goj\",\"gok\",\"gol\",\"gom\",\"gon\",\"goo\",\"gop\",\"goq\",\"gor\",\"gos\",\"got\",\"gou\",\"gow\",\"gox\",\"goy\",\"goz\",\"gpa\",\"gpe\",\"gpn\",\"gqa\",\"gqi\",\"gqn\",\"gqr\",\"gqu\",\"gra\",\"grb\",\"grc\",\"grd\",\"grg\",\"grh\",\"gri\",\"grj\",\"grk\",\"grm\",\"gro\",\"grq\",\"grr\",\"grs\",\"grt\",\"gru\",\"grv\",\"grw\",\"grx\",\"gry\",\"grz\",\"gse\",\"gsg\",\"gsl\",\"gsm\",\"gsn\",\"gso\",\"gsp\",\"gss\",\"gsw\",\"gta\",\"gti\",\"gtu\",\"gua\",\"gub\",\"guc\",\"gud\",\"gue\",\"guf\",\"gug\",\"guh\",\"gui\",\"guk\",\"gul\",\"gum\",\"gun\",\"guo\",\"gup\",\"guq\",\"gur\",\"gus\",\"gut\",\"guu\",\"guv\",\"guw\",\"gux\",\"guz\",\"gva\",\"gvc\",\"gve\",\"gvf\",\"gvj\",\"gvl\",\"gvm\",\"gvn\",\"gvo\",\"gvp\",\"gvr\",\"gvs\",\"gvy\",\"gwa\",\"gwb\",\"gwc\",\"gwd\",\"gwe\",\"gwf\",\"gwg\",\"gwi\",\"gwj\",\"gwm\",\"gwn\",\"gwr\",\"gwt\",\"gwu\",\"gww\",\"gwx\",\"gxx\",\"gya\",\"gyb\",\"gyd\",\"gye\",\"gyf\",\"gyg\",\"gyi\",\"gyl\",\"gym\",\"gyn\",\"gyo\",\"gyr\",\"gyy\",\"gza\",\"gzi\",\"gzn\",\"haa\",\"hab\",\"hac\",\"had\",\"hae\",\"haf\",\"hag\",\"hah\",\"hai\",\"haj\",\"hak\",\"hal\",\"ham\",\"han\",\"hao\",\"hap\",\"haq\",\"har\",\"has\",\"hav\",\"haw\",\"hax\",\"hay\",\"haz\",\"hba\",\"hbb\",\"hbn\",\"hbo\",\"hbu\",\"hca\",\"hch\",\"hdn\",\"hds\",\"hdy\",\"hea\",\"hed\",\"heg\",\"heh\",\"hei\",\"hem\",\"hgm\",\"hgw\",\"hhi\",\"hhr\",\"hhy\",\"hia\",\"hib\",\"hid\",\"hif\",\"hig\",\"hih\",\"hii\",\"hij\",\"hik\",\"hil\",\"him\",\"hio\",\"hir\",\"hit\",\"hiw\",\"hix\",\"hji\",\"hka\",\"hke\",\"hkk\",\"hkn\",\"hks\",\"hla\",\"hlb\",\"hld\",\"hle\",\"hlt\",\"hlu\",\"hma\",\"hmb\",\"hmc\",\"hmd\",\"hme\",\"hmf\",\"hmg\",\"hmh\",\"hmi\",\"hmj\",\"hmk\",\"hml\",\"hmm\",\"hmn\",\"hmp\",\"hmq\",\"hmr\",\"hms\",\"hmt\",\"hmu\",\"hmv\",\"hmw\",\"hmx\",\"hmy\",\"hmz\",\"hna\",\"hnd\",\"hne\",\"hnh\",\"hni\",\"hnj\",\"hnn\",\"hno\",\"hns\",\"hnu\",\"hoa\",\"hob\",\"hoc\",\"hod\",\"hoe\",\"hoh\",\"hoi\",\"hoj\",\"hok\",\"hol\",\"hom\",\"hoo\",\"hop\",\"hor\",\"hos\",\"hot\",\"hov\",\"how\",\"hoy\",\"hoz\",\"hpo\",\"hps\",\"hra\",\"hrc\",\"hre\",\"hrk\",\"hrm\",\"hro\",\"hrp\",\"hrr\",\"hrt\",\"hru\",\"hrw\",\"hrx\",\"hrz\",\"hsb\",\"hsh\",\"hsl\",\"hsn\",\"hss\",\"hti\",\"hto\",\"hts\",\"htu\",\"htx\",\"hub\",\"huc\",\"hud\",\"hue\",\"huf\",\"hug\",\"huh\",\"hui\",\"huj\",\"huk\",\"hul\",\"hum\",\"huo\",\"hup\",\"huq\",\"hur\",\"hus\",\"hut\",\"huu\",\"huv\",\"huw\",\"hux\",\"huy\",\"huz\",\"hvc\",\"hve\",\"hvk\",\"hvn\",\"hvv\",\"hwa\",\"hwc\",\"hwo\",\"hya\",\"hyw\",\"hyx\",\"iai\",\"ian\",\"iap\",\"iar\",\"iba\",\"ibb\",\"ibd\",\"ibe\",\"ibg\",\"ibh\",\"ibi\",\"ibl\",\"ibm\",\"ibn\",\"ibr\",\"ibu\",\"iby\",\"ica\",\"ich\",\"icl\",\"icr\",\"ida\",\"idb\",\"idc\",\"idd\",\"ide\",\"idi\",\"idr\",\"ids\",\"idt\",\"idu\",\"ifa\",\"ifb\",\"ife\",\"iff\",\"ifk\",\"ifm\",\"ifu\",\"ify\",\"igb\",\"ige\",\"igg\",\"igl\",\"igm\",\"ign\",\"igo\",\"igs\",\"igw\",\"ihb\",\"ihi\",\"ihp\",\"ihw\",\"iin\",\"iir\",\"ijc\",\"ije\",\"ijj\",\"ijn\",\"ijo\",\"ijs\",\"ike\",\"iki\",\"ikk\",\"ikl\",\"iko\",\"ikp\",\"ikr\",\"iks\",\"ikt\",\"ikv\",\"ikw\",\"ikx\",\"ikz\",\"ila\",\"ilb\",\"ilg\",\"ili\",\"ilk\",\"ill\",\"ilm\",\"ilo\",\"ilp\",\"ils\",\"ilu\",\"ilv\",\"ilw\",\"ima\",\"ime\",\"imi\",\"iml\",\"imn\",\"imo\",\"imr\",\"ims\",\"imy\",\"inb\",\"inc\",\"ine\",\"ing\",\"inh\",\"inj\",\"inl\",\"inm\",\"inn\",\"ino\",\"inp\",\"ins\",\"int\",\"inz\",\"ior\",\"iou\",\"iow\",\"ipi\",\"ipo\",\"iqu\",\"iqw\",\"ira\",\"ire\",\"irh\",\"iri\",\"irk\",\"irn\",\"iro\",\"irr\",\"iru\",\"irx\",\"iry\",\"isa\",\"isc\",\"isd\",\"ise\",\"isg\",\"ish\",\"isi\",\"isk\",\"ism\",\"isn\",\"iso\",\"isr\",\"ist\",\"isu\",\"itb\",\"itc\",\"itd\",\"ite\",\"iti\",\"itk\",\"itl\",\"itm\",\"ito\",\"itr\",\"its\",\"itt\",\"itv\",\"itw\",\"itx\",\"ity\",\"itz\",\"ium\",\"ivb\",\"ivv\",\"iwk\",\"iwm\",\"iwo\",\"iws\",\"ixc\",\"ixl\",\"iya\",\"iyo\",\"iyx\",\"izh\",\"izi\",\"izr\",\"izz\",\"jaa\",\"jab\",\"jac\",\"jad\",\"jae\",\"jaf\",\"jah\",\"jaj\",\"jak\",\"jal\",\"jam\",\"jan\",\"jao\",\"jaq\",\"jar\",\"jas\",\"jat\",\"jau\",\"jax\",\"jay\",\"jaz\",\"jbe\",\"jbi\",\"jbj\",\"jbk\",\"jbn\",\"jbo\",\"jbr\",\"jbt\",\"jbu\",\"jbw\",\"jcs\",\"jct\",\"jda\",\"jdg\",\"jdt\",\"jeb\",\"jee\",\"jeg\",\"jeh\",\"jei\",\"jek\",\"jel\",\"jen\",\"jer\",\"jet\",\"jeu\",\"jgb\",\"jge\",\"jgk\",\"jgo\",\"jhi\",\"jhs\",\"jia\",\"jib\",\"jic\",\"jid\",\"jie\",\"jig\",\"jih\",\"jii\",\"jil\",\"jim\",\"jio\",\"jiq\",\"jit\",\"jiu\",\"jiv\",\"jiy\",\"jje\",\"jjr\",\"jka\",\"jkm\",\"jko\",\"jkp\",\"jkr\",\"jku\",\"jle\",\"jls\",\"jma\",\"jmb\",\"jmc\",\"jmd\",\"jmi\",\"jml\",\"jmn\",\"jmr\",\"jms\",\"jmw\",\"jmx\",\"jna\",\"jnd\",\"jng\",\"jni\",\"jnj\",\"jnl\",\"jns\",\"job\",\"jod\",\"jog\",\"jor\",\"jos\",\"jow\",\"jpa\",\"jpr\",\"jpx\",\"jqr\",\"jra\",\"jrb\",\"jrr\",\"jrt\",\"jru\",\"jsl\",\"jua\",\"jub\",\"juc\",\"jud\",\"juh\",\"jui\",\"juk\",\"jul\",\"jum\",\"jun\",\"juo\",\"jup\",\"jur\",\"jus\",\"jut\",\"juu\",\"juw\",\"juy\",\"jvd\",\"jvn\",\"jwi\",\"jya\",\"jye\",\"jyy\",\"kaa\",\"kab\",\"kac\",\"kad\",\"kae\",\"kaf\",\"kag\",\"kah\",\"kai\",\"kaj\",\"kak\",\"kam\",\"kao\",\"kap\",\"kaq\",\"kar\",\"kav\",\"kaw\",\"kax\",\"kay\",\"kba\",\"kbb\",\"kbc\",\"kbd\",\"kbe\",\"kbf\",\"kbg\",\"kbh\",\"kbi\",\"kbj\",\"kbk\",\"kbl\",\"kbm\",\"kbn\",\"kbo\",\"kbp\",\"kbq\",\"kbr\",\"kbs\",\"kbt\",\"kbu\",\"kbv\",\"kbw\",\"kbx\",\"kby\",\"kbz\",\"kca\",\"kcb\",\"kcc\",\"kcd\",\"kce\",\"kcf\",\"kcg\",\"kch\",\"kci\",\"kcj\",\"kck\",\"kcl\",\"kcm\",\"kcn\",\"kco\",\"kcp\",\"kcq\",\"kcr\",\"kcs\",\"kct\",\"kcu\",\"kcv\",\"kcw\",\"kcx\",\"kcy\",\"kcz\",\"kda\",\"kdc\",\"kdd\",\"kde\",\"kdf\",\"kdg\",\"kdh\",\"kdi\",\"kdj\",\"kdk\",\"kdl\",\"kdm\",\"kdn\",\"kdo\",\"kdp\",\"kdq\",\"kdr\",\"kdt\",\"kdu\",\"kdv\",\"kdw\",\"kdx\",\"kdy\",\"kdz\",\"kea\",\"keb\",\"kec\",\"ked\",\"kee\",\"kef\",\"keg\",\"keh\",\"kei\",\"kej\",\"kek\",\"kel\",\"kem\",\"ken\",\"keo\",\"kep\",\"keq\",\"ker\",\"kes\",\"ket\",\"keu\",\"kev\",\"kew\",\"kex\",\"key\",\"kez\",\"kfa\",\"kfb\",\"kfc\",\"kfd\",\"kfe\",\"kff\",\"kfg\",\"kfh\",\"kfi\",\"kfj\",\"kfk\",\"kfl\",\"kfm\",\"kfn\",\"kfo\",\"kfp\",\"kfq\",\"kfr\",\"kfs\",\"kft\",\"kfu\",\"kfv\",\"kfw\",\"kfx\",\"kfy\",\"kfz\",\"kga\",\"kgb\",\"kgc\",\"kgd\",\"kge\",\"kgf\",\"kgg\",\"kgh\",\"kgi\",\"kgj\",\"kgk\",\"kgl\",\"kgm\",\"kgn\",\"kgo\",\"kgp\",\"kgq\",\"kgr\",\"kgs\",\"kgt\",\"kgu\",\"kgv\",\"kgw\",\"kgx\",\"kgy\",\"kha\",\"khb\",\"khc\",\"khd\",\"khe\",\"khf\",\"khg\",\"khh\",\"khi\",\"khj\",\"khk\",\"khl\",\"khn\",\"kho\",\"khp\",\"khq\",\"khr\",\"khs\",\"kht\",\"khu\",\"khv\",\"khw\",\"khx\",\"khy\",\"khz\",\"kia\",\"kib\",\"kic\",\"kid\",\"kie\",\"kif\",\"kig\",\"kih\",\"kii\",\"kij\",\"kil\",\"kim\",\"kio\",\"kip\",\"kiq\",\"kis\",\"kit\",\"kiu\",\"kiv\",\"kiw\",\"kix\",\"kiy\",\"kiz\",\"kja\",\"kjb\",\"kjc\",\"kjd\",\"kje\",\"kjf\",\"kjg\",\"kjh\",\"kji\",\"kjj\",\"kjk\",\"kjl\",\"kjm\",\"kjn\",\"kjo\",\"kjp\",\"kjq\",\"kjr\",\"kjs\",\"kjt\",\"kju\",\"kjv\",\"kjx\",\"kjy\",\"kjz\",\"kka\",\"kkb\",\"kkc\",\"kkd\",\"kke\",\"kkf\",\"kkg\",\"kkh\",\"kki\",\"kkj\",\"kkk\",\"kkl\",\"kkm\",\"kkn\",\"kko\",\"kkp\",\"kkq\",\"kkr\",\"kks\",\"kkt\",\"kku\",\"kkv\",\"kkw\",\"kkx\",\"kky\",\"kkz\",\"kla\",\"klb\",\"klc\",\"kld\",\"kle\",\"klf\",\"klg\",\"klh\",\"kli\",\"klj\",\"klk\",\"kll\",\"klm\",\"kln\",\"klo\",\"klp\",\"klq\",\"klr\",\"kls\",\"klt\",\"klu\",\"klv\",\"klw\",\"klx\",\"kly\",\"klz\",\"kma\",\"kmb\",\"kmc\",\"kmd\",\"kme\",\"kmf\",\"kmg\",\"kmh\",\"kmi\",\"kmj\",\"kmk\",\"kml\",\"kmm\",\"kmn\",\"kmo\",\"kmp\",\"kmq\",\"kmr\",\"kms\",\"kmt\",\"kmu\",\"kmv\",\"kmw\",\"kmx\",\"kmy\",\"kmz\",\"kna\",\"knb\",\"knc\",\"knd\",\"kne\",\"knf\",\"kng\",\"kni\",\"knj\",\"knk\",\"knl\",\"knm\",\"knn\",\"kno\",\"knp\",\"knq\",\"knr\",\"kns\",\"knt\",\"knu\",\"knv\",\"knw\",\"knx\",\"kny\",\"knz\",\"koa\",\"koc\",\"kod\",\"koe\",\"kof\",\"kog\",\"koh\",\"koi\",\"koj\",\"kok\",\"kol\",\"koo\",\"kop\",\"koq\",\"kos\",\"kot\",\"kou\",\"kov\",\"kow\",\"kox\",\"koy\",\"koz\",\"kpa\",\"kpb\",\"kpc\",\"kpd\",\"kpe\",\"kpf\",\"kpg\",\"kph\",\"kpi\",\"kpj\",\"kpk\",\"kpl\",\"kpm\",\"kpn\",\"kpo\",\"kpp\",\"kpq\",\"kpr\",\"kps\",\"kpt\",\"kpu\",\"kpv\",\"kpw\",\"kpx\",\"kpy\",\"kpz\",\"kqa\",\"kqb\",\"kqc\",\"kqd\",\"kqe\",\"kqf\",\"kqg\",\"kqh\",\"kqi\",\"kqj\",\"kqk\",\"kql\",\"kqm\",\"kqn\",\"kqo\",\"kqp\",\"kqq\",\"kqr\",\"kqs\",\"kqt\",\"kqu\",\"kqv\",\"kqw\",\"kqx\",\"kqy\",\"kqz\",\"kra\",\"krb\",\"krc\",\"krd\",\"kre\",\"krf\",\"krh\",\"kri\",\"krj\",\"krk\",\"krl\",\"krm\",\"krn\",\"kro\",\"krp\",\"krr\",\"krs\",\"krt\",\"kru\",\"krv\",\"krw\",\"krx\",\"kry\",\"krz\",\"ksa\",\"ksb\",\"ksc\",\"ksd\",\"kse\",\"ksf\",\"ksg\",\"ksh\",\"ksi\",\"ksj\",\"ksk\",\"ksl\",\"ksm\",\"ksn\",\"kso\",\"ksp\",\"ksq\",\"ksr\",\"kss\",\"kst\",\"ksu\",\"ksv\",\"ksw\",\"ksx\",\"ksy\",\"ksz\",\"kta\",\"ktb\",\"ktc\",\"ktd\",\"kte\",\"ktf\",\"ktg\",\"kth\",\"kti\",\"ktj\",\"ktk\",\"ktl\",\"ktm\",\"ktn\",\"kto\",\"ktp\",\"ktq\",\"ktr\",\"kts\",\"ktt\",\"ktu\",\"ktv\",\"ktw\",\"ktx\",\"kty\",\"ktz\",\"kub\",\"kuc\",\"kud\",\"kue\",\"kuf\",\"kug\",\"kuh\",\"kui\",\"kuj\",\"kuk\",\"kul\",\"kum\",\"kun\",\"kuo\",\"kup\",\"kuq\",\"kus\",\"kut\",\"kuu\",\"kuv\",\"kuw\",\"kux\",\"kuy\",\"kuz\",\"kva\",\"kvb\",\"kvc\",\"kvd\",\"kve\",\"kvf\",\"kvg\",\"kvh\",\"kvi\",\"kvj\",\"kvk\",\"kvl\",\"kvm\",\"kvn\",\"kvo\",\"kvp\",\"kvq\",\"kvr\",\"kvs\",\"kvt\",\"kvu\",\"kvv\",\"kvw\",\"kvx\",\"kvy\",\"kvz\",\"kwa\",\"kwb\",\"kwc\",\"kwd\",\"kwe\",\"kwf\",\"kwg\",\"kwh\",\"kwi\",\"kwj\",\"kwk\",\"kwl\",\"kwm\",\"kwn\",\"kwo\",\"kwp\",\"kwq\",\"kwr\",\"kws\",\"kwt\",\"kwu\",\"kwv\",\"kww\",\"kwx\",\"kwy\",\"kwz\",\"kxa\",\"kxb\",\"kxc\",\"kxd\",\"kxe\",\"kxf\",\"kxh\",\"kxi\",\"kxj\",\"kxk\",\"kxl\",\"kxm\",\"kxn\",\"kxo\",\"kxp\",\"kxq\",\"kxr\",\"kxs\",\"kxt\",\"kxu\",\"kxv\",\"kxw\",\"kxx\",\"kxy\",\"kxz\",\"kya\",\"kyb\",\"kyc\",\"kyd\",\"kye\",\"kyf\",\"kyg\",\"kyh\",\"kyi\",\"kyj\",\"kyk\",\"kyl\",\"kym\",\"kyn\",\"kyo\",\"kyp\",\"kyq\",\"kyr\",\"kys\",\"kyt\",\"kyu\",\"kyv\",\"kyw\",\"kyx\",\"kyy\",\"kyz\",\"kza\",\"kzb\",\"kzc\",\"kzd\",\"kze\",\"kzf\",\"kzg\",\"kzh\",\"kzi\",\"kzj\",\"kzk\",\"kzl\",\"kzm\",\"kzn\",\"kzo\",\"kzp\",\"kzq\",\"kzr\",\"kzs\",\"kzt\",\"kzu\",\"kzv\",\"kzw\",\"kzx\",\"kzy\",\"kzz\",\"laa\",\"lab\",\"lac\",\"lad\",\"lae\",\"laf\",\"lag\",\"lah\",\"lai\",\"laj\",\"lak\",\"lal\",\"lam\",\"lan\",\"lap\",\"laq\",\"lar\",\"las\",\"lau\",\"law\",\"lax\",\"lay\",\"laz\",\"lba\",\"lbb\",\"lbc\",\"lbe\",\"lbf\",\"lbg\",\"lbi\",\"lbj\",\"lbk\",\"lbl\",\"lbm\",\"lbn\",\"lbo\",\"lbq\",\"lbr\",\"lbs\",\"lbt\",\"lbu\",\"lbv\",\"lbw\",\"lbx\",\"lby\",\"lbz\",\"lcc\",\"lcd\",\"lce\",\"lcf\",\"lch\",\"lcl\",\"lcm\",\"lcp\",\"lcq\",\"lcs\",\"lda\",\"ldb\",\"ldd\",\"ldg\",\"ldh\",\"ldi\",\"ldj\",\"ldk\",\"ldl\",\"ldm\",\"ldn\",\"ldo\",\"ldp\",\"ldq\",\"lea\",\"leb\",\"lec\",\"led\",\"lee\",\"lef\",\"leg\",\"leh\",\"lei\",\"lej\",\"lek\",\"lel\",\"lem\",\"len\",\"leo\",\"lep\",\"leq\",\"ler\",\"les\",\"let\",\"leu\",\"lev\",\"lew\",\"lex\",\"ley\",\"lez\",\"lfa\",\"lfn\",\"lga\",\"lgb\",\"lgg\",\"lgh\",\"lgi\",\"lgk\",\"lgl\",\"lgm\",\"lgn\",\"lgq\",\"lgr\",\"lgt\",\"lgu\",\"lgz\",\"lha\",\"lhh\",\"lhi\",\"lhl\",\"lhm\",\"lhn\",\"lhp\",\"lhs\",\"lht\",\"lhu\",\"lia\",\"lib\",\"lic\",\"lid\",\"lie\",\"lif\",\"lig\",\"lih\",\"lii\",\"lij\",\"lik\",\"lil\",\"lio\",\"lip\",\"liq\",\"lir\",\"lis\",\"liu\",\"liv\",\"liw\",\"lix\",\"liy\",\"liz\",\"lja\",\"lje\",\"lji\",\"ljl\",\"ljp\",\"ljw\",\"ljx\",\"lka\",\"lkb\",\"lkc\",\"lkd\",\"lke\",\"lkh\",\"lki\",\"lkj\",\"lkl\",\"lkm\",\"lkn\",\"lko\",\"lkr\",\"lks\",\"lkt\",\"lku\",\"lky\",\"lla\",\"llb\",\"llc\",\"lld\",\"lle\",\"llf\",\"llg\",\"llh\",\"lli\",\"llj\",\"llk\",\"lll\",\"llm\",\"lln\",\"llo\",\"llp\",\"llq\",\"lls\",\"llu\",\"llx\",\"lma\",\"lmb\",\"lmc\",\"lmd\",\"lme\",\"lmf\",\"lmg\",\"lmh\",\"lmi\",\"lmj\",\"lmk\",\"lml\",\"lmm\",\"lmn\",\"lmo\",\"lmp\",\"lmq\",\"lmr\",\"lmu\",\"lmv\",\"lmw\",\"lmx\",\"lmy\",\"lmz\",\"lna\",\"lnb\",\"lnd\",\"lng\",\"lnh\",\"lni\",\"lnj\",\"lnl\",\"lnm\",\"lnn\",\"lno\",\"lns\",\"lnu\",\"lnw\",\"lnz\",\"loa\",\"lob\",\"loc\",\"loe\",\"lof\",\"log\",\"loh\",\"loi\",\"loj\",\"lok\",\"lol\",\"lom\",\"lon\",\"loo\",\"lop\",\"loq\",\"lor\",\"los\",\"lot\",\"lou\",\"lov\",\"low\",\"lox\",\"loy\",\"loz\",\"lpa\",\"lpe\",\"lpn\",\"lpo\",\"lpx\",\"lra\",\"lrc\",\"lre\",\"lrg\",\"lri\",\"lrk\",\"lrl\",\"lrm\",\"lrn\",\"lro\",\"lrr\",\"lrt\",\"lrv\",\"lrz\",\"lsa\",\"lsd\",\"lse\",\"lsg\",\"lsh\",\"lsi\",\"lsl\",\"lsm\",\"lso\",\"lsp\",\"lsr\",\"lss\",\"lst\",\"lsy\",\"ltc\",\"ltg\",\"lth\",\"lti\",\"ltn\",\"lto\",\"lts\",\"ltu\",\"lua\",\"luc\",\"lud\",\"lue\",\"luf\",\"lui\",\"luj\",\"luk\",\"lul\",\"lum\",\"lun\",\"luo\",\"lup\",\"luq\",\"lur\",\"lus\",\"lut\",\"luu\",\"luv\",\"luw\",\"luy\",\"luz\",\"lva\",\"lvk\",\"lvs\",\"lvu\",\"lwa\",\"lwe\",\"lwg\",\"lwh\",\"lwl\",\"lwm\",\"lwo\",\"lws\",\"lwt\",\"lwu\",\"lww\",\"lya\",\"lyg\",\"lyn\",\"lzh\",\"lzl\",\"lzn\",\"lzz\",\"maa\",\"mab\",\"mad\",\"mae\",\"maf\",\"mag\",\"mai\",\"maj\",\"mak\",\"mam\",\"man\",\"map\",\"maq\",\"mas\",\"mat\",\"mau\",\"mav\",\"maw\",\"max\",\"maz\",\"mba\",\"mbb\",\"mbc\",\"mbd\",\"mbe\",\"mbf\",\"mbh\",\"mbi\",\"mbj\",\"mbk\",\"mbl\",\"mbm\",\"mbn\",\"mbo\",\"mbp\",\"mbq\",\"mbr\",\"mbs\",\"mbt\",\"mbu\",\"mbv\",\"mbw\",\"mbx\",\"mby\",\"mbz\",\"mca\",\"mcb\",\"mcc\",\"mcd\",\"mce\",\"mcf\",\"mcg\",\"mch\",\"mci\",\"mcj\",\"mck\",\"mcl\",\"mcm\",\"mcn\",\"mco\",\"mcp\",\"mcq\",\"mcr\",\"mcs\",\"mct\",\"mcu\",\"mcv\",\"mcw\",\"mcx\",\"mcy\",\"mcz\",\"mda\",\"mdb\",\"mdc\",\"mdd\",\"mde\",\"mdf\",\"mdg\",\"mdh\",\"mdi\",\"mdj\",\"mdk\",\"mdl\",\"mdm\",\"mdn\",\"mdp\",\"mdq\",\"mdr\",\"mds\",\"mdt\",\"mdu\",\"mdv\",\"mdw\",\"mdx\",\"mdy\",\"mdz\",\"mea\",\"meb\",\"mec\",\"med\",\"mee\",\"mef\",\"meg\",\"meh\",\"mei\",\"mej\",\"mek\",\"mel\",\"mem\",\"men\",\"meo\",\"mep\",\"meq\",\"mer\",\"mes\",\"met\",\"meu\",\"mev\",\"mew\",\"mey\",\"mez\",\"mfa\",\"mfb\",\"mfc\",\"mfd\",\"mfe\",\"mff\",\"mfg\",\"mfh\",\"mfi\",\"mfj\",\"mfk\",\"mfl\",\"mfm\",\"mfn\",\"mfo\",\"mfp\",\"mfq\",\"mfr\",\"mfs\",\"mft\",\"mfu\",\"mfv\",\"mfw\",\"mfx\",\"mfy\",\"mfz\",\"mga\",\"mgb\",\"mgc\",\"mgd\",\"mge\",\"mgf\",\"mgg\",\"mgh\",\"mgi\",\"mgj\",\"mgk\",\"mgl\",\"mgm\",\"mgn\",\"mgo\",\"mgp\",\"mgq\",\"mgr\",\"mgs\",\"mgt\",\"mgu\",\"mgv\",\"mgw\",\"mgx\",\"mgy\",\"mgz\",\"mha\",\"mhb\",\"mhc\",\"mhd\",\"mhe\",\"mhf\",\"mhg\",\"mhh\",\"mhi\",\"mhj\",\"mhk\",\"mhl\",\"mhm\",\"mhn\",\"mho\",\"mhp\",\"mhq\",\"mhr\",\"mhs\",\"mht\",\"mhu\",\"mhw\",\"mhx\",\"mhy\",\"mhz\",\"mia\",\"mib\",\"mic\",\"mid\",\"mie\",\"mif\",\"mig\",\"mih\",\"mii\",\"mij\",\"mik\",\"mil\",\"mim\",\"min\",\"mio\",\"mip\",\"miq\",\"mir\",\"mis\",\"mit\",\"miu\",\"miw\",\"mix\",\"miy\",\"miz\",\"mja\",\"mjb\",\"mjc\",\"mjd\",\"mje\",\"mjg\",\"mjh\",\"mji\",\"mjj\",\"mjk\",\"mjl\",\"mjm\",\"mjn\",\"mjo\",\"mjp\",\"mjq\",\"mjr\",\"mjs\",\"mjt\",\"mju\",\"mjv\",\"mjw\",\"mjx\",\"mjy\",\"mjz\",\"mka\",\"mkb\",\"mkc\",\"mke\",\"mkf\",\"mkg\",\"mkh\",\"mki\",\"mkj\",\"mkk\",\"mkl\",\"mkm\",\"mkn\",\"mko\",\"mkp\",\"mkq\",\"mkr\",\"mks\",\"mkt\",\"mku\",\"mkv\",\"mkw\",\"mkx\",\"mky\",\"mkz\",\"mla\",\"mlb\",\"mlc\",\"mld\",\"mle\",\"mlf\",\"mlh\",\"mli\",\"mlj\",\"mlk\",\"mll\",\"mlm\",\"mln\",\"mlo\",\"mlp\",\"mlq\",\"mlr\",\"mls\",\"mlu\",\"mlv\",\"mlw\",\"mlx\",\"mlz\",\"mma\",\"mmb\",\"mmc\",\"mmd\",\"mme\",\"mmf\",\"mmg\",\"mmh\",\"mmi\",\"mmj\",\"mmk\",\"mml\",\"mmm\",\"mmn\",\"mmo\",\"mmp\",\"mmq\",\"mmr\",\"mmt\",\"mmu\",\"mmv\",\"mmw\",\"mmx\",\"mmy\",\"mmz\",\"mna\",\"mnb\",\"mnc\",\"mnd\",\"mne\",\"mnf\",\"mng\",\"mnh\",\"mni\",\"mnj\",\"mnk\",\"mnl\",\"mnm\",\"mnn\",\"mno\",\"mnp\",\"mnq\",\"mnr\",\"mns\",\"mnt\",\"mnu\",\"mnv\",\"mnw\",\"mnx\",\"mny\",\"mnz\",\"moa\",\"moc\",\"mod\",\"moe\",\"mof\",\"mog\",\"moh\",\"moi\",\"moj\",\"mok\",\"mom\",\"moo\",\"mop\",\"moq\",\"mor\",\"mos\",\"mot\",\"mou\",\"mov\",\"mow\",\"mox\",\"moy\",\"moz\",\"mpa\",\"mpb\",\"mpc\",\"mpd\",\"mpe\",\"mpg\",\"mph\",\"mpi\",\"mpj\",\"mpk\",\"mpl\",\"mpm\",\"mpn\",\"mpo\",\"mpp\",\"mpq\",\"mpr\",\"mps\",\"mpt\",\"mpu\",\"mpv\",\"mpw\",\"mpx\",\"mpy\",\"mpz\",\"mqa\",\"mqb\",\"mqc\",\"mqe\",\"mqf\",\"mqg\",\"mqh\",\"mqi\",\"mqj\",\"mqk\",\"mql\",\"mqm\",\"mqn\",\"mqo\",\"mqp\",\"mqq\",\"mqr\",\"mqs\",\"mqt\",\"mqu\",\"mqv\",\"mqw\",\"mqx\",\"mqy\",\"mqz\",\"mra\",\"mrb\",\"mrc\",\"mrd\",\"mre\",\"mrf\",\"mrg\",\"mrh\",\"mrj\",\"mrk\",\"mrl\",\"mrm\",\"mrn\",\"mro\",\"mrp\",\"mrq\",\"mrr\",\"mrs\",\"mrt\",\"mru\",\"mrv\",\"mrw\",\"mrx\",\"mry\",\"mrz\",\"msb\",\"msc\",\"msd\",\"mse\",\"msf\",\"msg\",\"msh\",\"msi\",\"msj\",\"msk\",\"msl\",\"msm\",\"msn\",\"mso\",\"msp\",\"msq\",\"msr\",\"mss\",\"mst\",\"msu\",\"msv\",\"msw\",\"msx\",\"msy\",\"msz\",\"mta\",\"mtb\",\"mtc\",\"mtd\",\"mte\",\"mtf\",\"mtg\",\"mth\",\"mti\",\"mtj\",\"mtk\",\"mtl\",\"mtm\",\"mtn\",\"mto\",\"mtp\",\"mtq\",\"mtr\",\"mts\",\"mtt\",\"mtu\",\"mtv\",\"mtw\",\"mtx\",\"mty\",\"mua\",\"mub\",\"muc\",\"mud\",\"mue\",\"mug\",\"muh\",\"mui\",\"muj\",\"muk\",\"mul\",\"mum\",\"mun\",\"muo\",\"mup\",\"muq\",\"mur\",\"mus\",\"mut\",\"muu\",\"muv\",\"mux\",\"muy\",\"muz\",\"mva\",\"mvb\",\"mvd\",\"mve\",\"mvf\",\"mvg\",\"mvh\",\"mvi\",\"mvk\",\"mvl\",\"mvm\",\"mvn\",\"mvo\",\"mvp\",\"mvq\",\"mvr\",\"mvs\",\"mvt\",\"mvu\",\"mvv\",\"mvw\",\"mvx\",\"mvy\",\"mvz\",\"mwa\",\"mwb\",\"mwc\",\"mwd\",\"mwe\",\"mwf\",\"mwg\",\"mwh\",\"mwi\",\"mwj\",\"mwk\",\"mwl\",\"mwm\",\"mwn\",\"mwo\",\"mwp\",\"mwq\",\"mwr\",\"mws\",\"mwt\",\"mwu\",\"mwv\",\"mww\",\"mwx\",\"mwy\",\"mwz\",\"mxa\",\"mxb\",\"mxc\",\"mxd\",\"mxe\",\"mxf\",\"mxg\",\"mxh\",\"mxi\",\"mxj\",\"mxk\",\"mxl\",\"mxm\",\"mxn\",\"mxo\",\"mxp\",\"mxq\",\"mxr\",\"mxs\",\"mxt\",\"mxu\",\"mxv\",\"mxw\",\"mxx\",\"mxy\",\"mxz\",\"myb\",\"myc\",\"myd\",\"mye\",\"myf\",\"myg\",\"myh\",\"myi\",\"myj\",\"myk\",\"myl\",\"mym\",\"myn\",\"myo\",\"myp\",\"myq\",\"myr\",\"mys\",\"myt\",\"myu\",\"myv\",\"myw\",\"myx\",\"myy\",\"myz\",\"mza\",\"mzb\",\"mzc\",\"mzd\",\"mze\",\"mzg\",\"mzh\",\"mzi\",\"mzj\",\"mzk\",\"mzl\",\"mzm\",\"mzn\",\"mzo\",\"mzp\",\"mzq\",\"mzr\",\"mzs\",\"mzt\",\"mzu\",\"mzv\",\"mzw\",\"mzx\",\"mzy\",\"mzz\",\"naa\",\"nab\",\"nac\",\"nad\",\"nae\",\"naf\",\"nag\",\"nah\",\"nai\",\"naj\",\"nak\",\"nal\",\"nam\",\"nan\",\"nao\",\"nap\",\"naq\",\"nar\",\"nas\",\"nat\",\"naw\",\"nax\",\"nay\",\"naz\",\"nba\",\"nbb\",\"nbc\",\"nbd\",\"nbe\",\"nbf\",\"nbg\",\"nbh\",\"nbi\",\"nbj\",\"nbk\",\"nbm\",\"nbn\",\"nbo\",\"nbp\",\"nbq\",\"nbr\",\"nbs\",\"nbt\",\"nbu\",\"nbv\",\"nbw\",\"nbx\",\"nby\",\"nca\",\"ncb\",\"ncc\",\"ncd\",\"nce\",\"ncf\",\"ncg\",\"nch\",\"nci\",\"ncj\",\"nck\",\"ncl\",\"ncm\",\"ncn\",\"nco\",\"ncp\",\"ncq\",\"ncr\",\"ncs\",\"nct\",\"ncu\",\"ncx\",\"ncz\",\"nda\",\"ndb\",\"ndc\",\"ndd\",\"ndf\",\"ndg\",\"ndh\",\"ndi\",\"ndj\",\"ndk\",\"ndl\",\"ndm\",\"ndn\",\"ndp\",\"ndq\",\"ndr\",\"nds\",\"ndt\",\"ndu\",\"ndv\",\"ndw\",\"ndx\",\"ndy\",\"ndz\",\"nea\",\"neb\",\"nec\",\"ned\",\"nee\",\"nef\",\"neg\",\"neh\",\"nei\",\"nej\",\"nek\",\"nem\",\"nen\",\"neo\",\"neq\",\"ner\",\"nes\",\"net\",\"neu\",\"nev\",\"new\",\"nex\",\"ney\",\"nez\",\"nfa\",\"nfd\",\"nfl\",\"nfr\",\"nfu\",\"nga\",\"ngb\",\"ngc\",\"ngd\",\"nge\",\"ngf\",\"ngg\",\"ngh\",\"ngi\",\"ngj\",\"ngk\",\"ngl\",\"ngm\",\"ngn\",\"ngo\",\"ngp\",\"ngq\",\"ngr\",\"ngs\",\"ngt\",\"ngu\",\"ngv\",\"ngw\",\"ngx\",\"ngy\",\"ngz\",\"nha\",\"nhb\",\"nhc\",\"nhd\",\"nhe\",\"nhf\",\"nhg\",\"nhh\",\"nhi\",\"nhk\",\"nhm\",\"nhn\",\"nho\",\"nhp\",\"nhq\",\"nhr\",\"nht\",\"nhu\",\"nhv\",\"nhw\",\"nhx\",\"nhy\",\"nhz\",\"nia\",\"nib\",\"nic\",\"nid\",\"nie\",\"nif\",\"nig\",\"nih\",\"nii\",\"nij\",\"nik\",\"nil\",\"nim\",\"nin\",\"nio\",\"niq\",\"nir\",\"nis\",\"nit\",\"niu\",\"niv\",\"niw\",\"nix\",\"niy\",\"niz\",\"nja\",\"njb\",\"njd\",\"njh\",\"nji\",\"njj\",\"njl\",\"njm\",\"njn\",\"njo\",\"njr\",\"njs\",\"njt\",\"nju\",\"njx\",\"njy\",\"njz\",\"nka\",\"nkb\",\"nkc\",\"nkd\",\"nke\",\"nkf\",\"nkg\",\"nkh\",\"nki\",\"nkj\",\"nkk\",\"nkm\",\"nkn\",\"nko\",\"nkp\",\"nkq\",\"nkr\",\"nks\",\"nkt\",\"nku\",\"nkv\",\"nkw\",\"nkx\",\"nkz\",\"nla\",\"nlc\",\"nle\",\"nlg\",\"nli\",\"nlj\",\"nlk\",\"nll\",\"nlm\",\"nln\",\"nlo\",\"nlq\",\"nlr\",\"nlu\",\"nlv\",\"nlw\",\"nlx\",\"nly\",\"nlz\",\"nma\",\"nmb\",\"nmc\",\"nmd\",\"nme\",\"nmf\",\"nmg\",\"nmh\",\"nmi\",\"nmj\",\"nmk\",\"nml\",\"nmm\",\"nmn\",\"nmo\",\"nmp\",\"nmq\",\"nmr\",\"nms\",\"nmt\",\"nmu\",\"nmv\",\"nmw\",\"nmx\",\"nmy\",\"nmz\",\"nna\",\"nnb\",\"nnc\",\"nnd\",\"nne\",\"nnf\",\"nng\",\"nnh\",\"nni\",\"nnj\",\"nnk\",\"nnl\",\"nnm\",\"nnn\",\"nnp\",\"nnq\",\"nnr\",\"nns\",\"nnt\",\"nnu\",\"nnv\",\"nnw\",\"nnx\",\"nny\",\"nnz\",\"noa\",\"noc\",\"nod\",\"noe\",\"nof\",\"nog\",\"noh\",\"noi\",\"noj\",\"nok\",\"nol\",\"nom\",\"non\",\"noo\",\"nop\",\"noq\",\"nos\",\"not\",\"nou\",\"nov\",\"now\",\"noy\",\"noz\",\"npa\",\"npb\",\"npg\",\"nph\",\"npi\",\"npl\",\"npn\",\"npo\",\"nps\",\"npu\",\"npx\",\"npy\",\"nqg\",\"nqk\",\"nql\",\"nqm\",\"nqn\",\"nqo\",\"nqq\",\"nqy\",\"nra\",\"nrb\",\"nrc\",\"nre\",\"nrf\",\"nrg\",\"nri\",\"nrk\",\"nrl\",\"nrm\",\"nrn\",\"nrp\",\"nrr\",\"nrt\",\"nru\",\"nrx\",\"nrz\",\"nsa\",\"nsc\",\"nsd\",\"nse\",\"nsf\",\"nsg\",\"nsh\",\"nsi\",\"nsk\",\"nsl\",\"nsm\",\"nsn\",\"nso\",\"nsp\",\"nsq\",\"nsr\",\"nss\",\"nst\",\"nsu\",\"nsv\",\"nsw\",\"nsx\",\"nsy\",\"nsz\",\"ntd\",\"nte\",\"ntg\",\"nti\",\"ntj\",\"ntk\",\"ntm\",\"nto\",\"ntp\",\"ntr\",\"nts\",\"ntu\",\"ntw\",\"ntx\",\"nty\",\"ntz\",\"nua\",\"nub\",\"nuc\",\"nud\",\"nue\",\"nuf\",\"nug\",\"nuh\",\"nui\",\"nuj\",\"nuk\",\"nul\",\"num\",\"nun\",\"nuo\",\"nup\",\"nuq\",\"nur\",\"nus\",\"nut\",\"nuu\",\"nuv\",\"nuw\",\"nux\",\"nuy\",\"nuz\",\"nvh\",\"nvm\",\"nvo\",\"nwa\",\"nwb\",\"nwc\",\"nwe\",\"nwg\",\"nwi\",\"nwm\",\"nwo\",\"nwr\",\"nwx\",\"nwy\",\"nxa\",\"nxd\",\"nxe\",\"nxg\",\"nxi\",\"nxk\",\"nxl\",\"nxm\",\"nxn\",\"nxo\",\"nxq\",\"nxr\",\"nxu\",\"nxx\",\"nyb\",\"nyc\",\"nyd\",\"nye\",\"nyf\",\"nyg\",\"nyh\",\"nyi\",\"nyj\",\"nyk\",\"nyl\",\"nym\",\"nyn\",\"nyo\",\"nyp\",\"nyq\",\"nyr\",\"nys\",\"nyt\",\"nyu\",\"nyv\",\"nyw\",\"nyx\",\"nyy\",\"nza\",\"nzb\",\"nzd\",\"nzi\",\"nzk\",\"nzm\",\"nzs\",\"nzu\",\"nzy\",\"nzz\",\"oaa\",\"oac\",\"oar\",\"oav\",\"obi\",\"obk\",\"obl\",\"obm\",\"obo\",\"obr\",\"obt\",\"obu\",\"oca\",\"och\",\"oco\",\"ocu\",\"oda\",\"odk\",\"odt\",\"odu\",\"ofo\",\"ofs\",\"ofu\",\"ogb\",\"ogc\",\"oge\",\"ogg\",\"ogo\",\"ogu\",\"oht\",\"ohu\",\"oia\",\"oin\",\"ojb\",\"ojc\",\"ojg\",\"ojp\",\"ojs\",\"ojv\",\"ojw\",\"oka\",\"okb\",\"okd\",\"oke\",\"okg\",\"okh\",\"oki\",\"okj\",\"okk\",\"okl\",\"okm\",\"okn\",\"oko\",\"okr\",\"oks\",\"oku\",\"okv\",\"okx\",\"ola\",\"old\",\"ole\",\"olk\",\"olm\",\"olo\",\"olr\",\"olt\",\"olu\",\"oma\",\"omb\",\"omc\",\"ome\",\"omg\",\"omi\",\"omk\",\"oml\",\"omn\",\"omo\",\"omp\",\"omq\",\"omr\",\"omt\",\"omu\",\"omv\",\"omw\",\"omx\",\"ona\",\"onb\",\"one\",\"ong\",\"oni\",\"onj\",\"onk\",\"onn\",\"ono\",\"onp\",\"onr\",\"ons\",\"ont\",\"onu\",\"onw\",\"onx\",\"ood\",\"oog\",\"oon\",\"oor\",\"oos\",\"opa\",\"opk\",\"opm\",\"opo\",\"opt\",\"opy\",\"ora\",\"orc\",\"ore\",\"org\",\"orh\",\"orn\",\"oro\",\"orr\",\"ors\",\"ort\",\"oru\",\"orv\",\"orw\",\"orx\",\"ory\",\"orz\",\"osa\",\"osc\",\"osi\",\"oso\",\"osp\",\"ost\",\"osu\",\"osx\",\"ota\",\"otb\",\"otd\",\"ote\",\"oti\",\"otk\",\"otl\",\"otm\",\"otn\",\"oto\",\"otq\",\"otr\",\"ots\",\"ott\",\"otu\",\"otw\",\"otx\",\"oty\",\"otz\",\"oua\",\"oub\",\"oue\",\"oui\",\"oum\",\"oun\",\"ovd\",\"owi\",\"owl\",\"oyb\",\"oyd\",\"oym\",\"oyy\",\"ozm\",\"paa\",\"pab\",\"pac\",\"pad\",\"pae\",\"paf\",\"pag\",\"pah\",\"pai\",\"pak\",\"pal\",\"pam\",\"pao\",\"pap\",\"paq\",\"par\",\"pas\",\"pat\",\"pau\",\"pav\",\"paw\",\"pax\",\"pay\",\"paz\",\"pbb\",\"pbc\",\"pbe\",\"pbf\",\"pbg\",\"pbh\",\"pbi\",\"pbl\",\"pbm\",\"pbn\",\"pbo\",\"pbp\",\"pbr\",\"pbs\",\"pbt\",\"pbu\",\"pbv\",\"pby\",\"pbz\",\"pca\",\"pcb\",\"pcc\",\"pcd\",\"pce\",\"pcf\",\"pcg\",\"pch\",\"pci\",\"pcj\",\"pck\",\"pcl\",\"pcm\",\"pcn\",\"pcp\",\"pcr\",\"pcw\",\"pda\",\"pdc\",\"pdi\",\"pdn\",\"pdo\",\"pdt\",\"pdu\",\"pea\",\"peb\",\"ped\",\"pee\",\"pef\",\"peg\",\"peh\",\"pei\",\"pej\",\"pek\",\"pel\",\"pem\",\"peo\",\"pep\",\"peq\",\"pes\",\"pev\",\"pex\",\"pey\",\"pez\",\"pfa\",\"pfe\",\"pfl\",\"pga\",\"pgd\",\"pgg\",\"pgi\",\"pgk\",\"pgl\",\"pgn\",\"pgs\",\"pgu\",\"pgy\",\"pgz\",\"pha\",\"phd\",\"phg\",\"phh\",\"phi\",\"phk\",\"phl\",\"phm\",\"phn\",\"pho\",\"phq\",\"phr\",\"pht\",\"phu\",\"phv\",\"phw\",\"pia\",\"pib\",\"pic\",\"pid\",\"pie\",\"pif\",\"pig\",\"pih\",\"pii\",\"pij\",\"pil\",\"pim\",\"pin\",\"pio\",\"pip\",\"pir\",\"pis\",\"pit\",\"piu\",\"piv\",\"piw\",\"pix\",\"piy\",\"piz\",\"pjt\",\"pka\",\"pkb\",\"pkc\",\"pkg\",\"pkh\",\"pkn\",\"pko\",\"pkp\",\"pkr\",\"pks\",\"pkt\",\"pku\",\"pla\",\"plb\",\"plc\",\"pld\",\"ple\",\"plf\",\"plg\",\"plh\",\"plj\",\"plk\",\"pll\",\"pln\",\"plo\",\"plp\",\"plq\",\"plr\",\"pls\",\"plt\",\"plu\",\"plv\",\"plw\",\"ply\",\"plz\",\"pma\",\"pmb\",\"pmc\",\"pmd\",\"pme\",\"pmf\",\"pmh\",\"pmi\",\"pmj\",\"pmk\",\"pml\",\"pmm\",\"pmn\",\"pmo\",\"pmq\",\"pmr\",\"pms\",\"pmt\",\"pmu\",\"pmw\",\"pmx\",\"pmy\",\"pmz\",\"pna\",\"pnb\",\"pnc\",\"pne\",\"png\",\"pnh\",\"pni\",\"pnj\",\"pnk\",\"pnl\",\"pnm\",\"pnn\",\"pno\",\"pnp\",\"pnq\",\"pnr\",\"pns\",\"pnt\",\"pnu\",\"pnv\",\"pnw\",\"pnx\",\"pny\",\"pnz\",\"poc\",\"pod\",\"poe\",\"pof\",\"pog\",\"poh\",\"poi\",\"pok\",\"pom\",\"pon\",\"poo\",\"pop\",\"poq\",\"pos\",\"pot\",\"pov\",\"pow\",\"pox\",\"poy\",\"poz\",\"ppa\",\"ppe\",\"ppi\",\"ppk\",\"ppl\",\"ppm\",\"ppn\",\"ppo\",\"ppp\",\"ppq\",\"ppr\",\"pps\",\"ppt\",\"ppu\",\"pqa\",\"pqe\",\"pqm\",\"pqw\",\"pra\",\"prb\",\"prc\",\"prd\",\"pre\",\"prf\",\"prg\",\"prh\",\"pri\",\"prk\",\"prl\",\"prm\",\"prn\",\"pro\",\"prp\",\"prq\",\"prr\",\"prs\",\"prt\",\"pru\",\"prw\",\"prx\",\"pry\",\"prz\",\"psa\",\"psc\",\"psd\",\"pse\",\"psg\",\"psh\",\"psi\",\"psl\",\"psm\",\"psn\",\"pso\",\"psp\",\"psq\",\"psr\",\"pss\",\"pst\",\"psu\",\"psw\",\"psy\",\"pta\",\"pth\",\"pti\",\"ptn\",\"pto\",\"ptp\",\"ptq\",\"ptr\",\"ptt\",\"ptu\",\"ptv\",\"ptw\",\"pty\",\"pua\",\"pub\",\"puc\",\"pud\",\"pue\",\"puf\",\"pug\",\"pui\",\"puj\",\"puk\",\"pum\",\"puo\",\"pup\",\"puq\",\"pur\",\"put\",\"puu\",\"puw\",\"pux\",\"puy\",\"puz\",\"pwa\",\"pwb\",\"pwg\",\"pwi\",\"pwm\",\"pwn\",\"pwo\",\"pwr\",\"pww\",\"pxm\",\"pye\",\"pym\",\"pyn\",\"pys\",\"pyu\",\"pyx\",\"pyy\",\"pzn\",\"qaa..qtz\",\"qua\",\"qub\",\"quc\",\"qud\",\"quf\",\"qug\",\"quh\",\"qui\",\"quk\",\"qul\",\"qum\",\"qun\",\"qup\",\"quq\",\"qur\",\"qus\",\"quv\",\"quw\",\"qux\",\"quy\",\"quz\",\"qva\",\"qvc\",\"qve\",\"qvh\",\"qvi\",\"qvj\",\"qvl\",\"qvm\",\"qvn\",\"qvo\",\"qvp\",\"qvs\",\"qvw\",\"qvy\",\"qvz\",\"qwa\",\"qwc\",\"qwe\",\"qwh\",\"qwm\",\"qws\",\"qwt\",\"qxa\",\"qxc\",\"qxh\",\"qxl\",\"qxn\",\"qxo\",\"qxp\",\"qxq\",\"qxr\",\"qxs\",\"qxt\",\"qxu\",\"qxw\",\"qya\",\"qyp\",\"raa\",\"rab\",\"rac\",\"rad\",\"raf\",\"rag\",\"rah\",\"rai\",\"raj\",\"rak\",\"ral\",\"ram\",\"ran\",\"rao\",\"rap\",\"raq\",\"rar\",\"ras\",\"rat\",\"rau\",\"rav\",\"raw\",\"rax\",\"ray\",\"raz\",\"rbb\",\"rbk\",\"rbl\",\"rbp\",\"rcf\",\"rdb\",\"rea\",\"reb\",\"ree\",\"reg\",\"rei\",\"rej\",\"rel\",\"rem\",\"ren\",\"rer\",\"res\",\"ret\",\"rey\",\"rga\",\"rge\",\"rgk\",\"rgn\",\"rgr\",\"rgs\",\"rgu\",\"rhg\",\"rhp\",\"ria\",\"rie\",\"rif\",\"ril\",\"rim\",\"rin\",\"rir\",\"rit\",\"riu\",\"rjg\",\"rji\",\"rjs\",\"rka\",\"rkb\",\"rkh\",\"rki\",\"rkm\",\"rkt\",\"rkw\",\"rma\",\"rmb\",\"rmc\",\"rmd\",\"rme\",\"rmf\",\"rmg\",\"rmh\",\"rmi\",\"rmk\",\"rml\",\"rmm\",\"rmn\",\"rmo\",\"rmp\",\"rmq\",\"rmr\",\"rms\",\"rmt\",\"rmu\",\"rmv\",\"rmw\",\"rmx\",\"rmy\",\"rmz\",\"rna\",\"rnd\",\"rng\",\"rnl\",\"rnn\",\"rnp\",\"rnr\",\"rnw\",\"roa\",\"rob\",\"roc\",\"rod\",\"roe\",\"rof\",\"rog\",\"rol\",\"rom\",\"roo\",\"rop\",\"ror\",\"rou\",\"row\",\"rpn\",\"rpt\",\"rri\",\"rro\",\"rrt\",\"rsb\",\"rsi\",\"rsl\",\"rsm\",\"rtc\",\"rth\",\"rtm\",\"rts\",\"rtw\",\"rub\",\"ruc\",\"rue\",\"ruf\",\"rug\",\"ruh\",\"rui\",\"ruk\",\"ruo\",\"rup\",\"ruq\",\"rut\",\"ruu\",\"ruy\",\"ruz\",\"rwa\",\"rwk\",\"rwm\",\"rwo\",\"rwr\",\"rxd\",\"rxw\",\"ryn\",\"rys\",\"ryu\",\"rzh\",\"saa\",\"sab\",\"sac\",\"sad\",\"sae\",\"saf\",\"sah\",\"sai\",\"saj\",\"sak\",\"sal\",\"sam\",\"sao\",\"sap\",\"saq\",\"sar\",\"sas\",\"sat\",\"sau\",\"sav\",\"saw\",\"sax\",\"say\",\"saz\",\"sba\",\"sbb\",\"sbc\",\"sbd\",\"sbe\",\"sbf\",\"sbg\",\"sbh\",\"sbi\",\"sbj\",\"sbk\",\"sbl\",\"sbm\",\"sbn\",\"sbo\",\"sbp\",\"sbq\",\"sbr\",\"sbs\",\"sbt\",\"sbu\",\"sbv\",\"sbw\",\"sbx\",\"sby\",\"sbz\",\"sca\",\"scb\",\"sce\",\"scf\",\"scg\",\"sch\",\"sci\",\"sck\",\"scl\",\"scn\",\"sco\",\"scp\",\"scq\",\"scs\",\"sct\",\"scu\",\"scv\",\"scw\",\"scx\",\"sda\",\"sdb\",\"sdc\",\"sde\",\"sdf\",\"sdg\",\"sdh\",\"sdj\",\"sdk\",\"sdl\",\"sdm\",\"sdn\",\"sdo\",\"sdp\",\"sdr\",\"sds\",\"sdt\",\"sdu\",\"sdv\",\"sdx\",\"sdz\",\"sea\",\"seb\",\"sec\",\"sed\",\"see\",\"sef\",\"seg\",\"seh\",\"sei\",\"sej\",\"sek\",\"sel\",\"sem\",\"sen\",\"seo\",\"sep\",\"seq\",\"ser\",\"ses\",\"set\",\"seu\",\"sev\",\"sew\",\"sey\",\"sez\",\"sfb\",\"sfe\",\"sfm\",\"sfs\",\"sfw\",\"sga\",\"sgb\",\"sgc\",\"sgd\",\"sge\",\"sgg\",\"sgh\",\"sgi\",\"sgj\",\"sgk\",\"sgl\",\"sgm\",\"sgn\",\"sgo\",\"sgp\",\"sgr\",\"sgs\",\"sgt\",\"sgu\",\"sgw\",\"sgx\",\"sgy\",\"sgz\",\"sha\",\"shb\",\"shc\",\"shd\",\"she\",\"shg\",\"shh\",\"shi\",\"shj\",\"shk\",\"shl\",\"shm\",\"shn\",\"sho\",\"shp\",\"shq\",\"shr\",\"shs\",\"sht\",\"shu\",\"shv\",\"shw\",\"shx\",\"shy\",\"shz\",\"sia\",\"sib\",\"sid\",\"sie\",\"sif\",\"sig\",\"sih\",\"sii\",\"sij\",\"sik\",\"sil\",\"sim\",\"sio\",\"sip\",\"siq\",\"sir\",\"sis\",\"sit\",\"siu\",\"siv\",\"siw\",\"six\",\"siy\",\"siz\",\"sja\",\"sjb\",\"sjd\",\"sje\",\"sjg\",\"sjk\",\"sjl\",\"sjm\",\"sjn\",\"sjo\",\"sjp\",\"sjr\",\"sjs\",\"sjt\",\"sju\",\"sjw\",\"ska\",\"skb\",\"skc\",\"skd\",\"ske\",\"skf\",\"skg\",\"skh\",\"ski\",\"skj\",\"skk\",\"skm\",\"skn\",\"sko\",\"skp\",\"skq\",\"skr\",\"sks\",\"skt\",\"sku\",\"skv\",\"skw\",\"skx\",\"sky\",\"skz\",\"sla\",\"slc\",\"sld\",\"sle\",\"slf\",\"slg\",\"slh\",\"sli\",\"slj\",\"sll\",\"slm\",\"sln\",\"slp\",\"slq\",\"slr\",\"sls\",\"slt\",\"slu\",\"slw\",\"slx\",\"sly\",\"slz\",\"sma\",\"smb\",\"smc\",\"smd\",\"smf\",\"smg\",\"smh\",\"smi\",\"smj\",\"smk\",\"sml\",\"smm\",\"smn\",\"smp\",\"smq\",\"smr\",\"sms\",\"smt\",\"smu\",\"smv\",\"smw\",\"smx\",\"smy\",\"smz\",\"snb\",\"snc\",\"sne\",\"snf\",\"sng\",\"snh\",\"sni\",\"snj\",\"snk\",\"snl\",\"snm\",\"snn\",\"sno\",\"snp\",\"snq\",\"snr\",\"sns\",\"snu\",\"snv\",\"snw\",\"snx\",\"sny\",\"snz\",\"soa\",\"sob\",\"soc\",\"sod\",\"soe\",\"sog\",\"soh\",\"soi\",\"soj\",\"sok\",\"sol\",\"son\",\"soo\",\"sop\",\"soq\",\"sor\",\"sos\",\"sou\",\"sov\",\"sow\",\"sox\",\"soy\",\"soz\",\"spb\",\"spc\",\"spd\",\"spe\",\"spg\",\"spi\",\"spk\",\"spl\",\"spm\",\"spn\",\"spo\",\"spp\",\"spq\",\"spr\",\"sps\",\"spt\",\"spu\",\"spv\",\"spx\",\"spy\",\"sqa\",\"sqh\",\"sqj\",\"sqk\",\"sqm\",\"sqn\",\"sqo\",\"sqq\",\"sqr\",\"sqs\",\"sqt\",\"squ\",\"sra\",\"srb\",\"src\",\"sre\",\"srf\",\"srg\",\"srh\",\"sri\",\"srk\",\"srl\",\"srm\",\"srn\",\"sro\",\"srq\",\"srr\",\"srs\",\"srt\",\"sru\",\"srv\",\"srw\",\"srx\",\"sry\",\"srz\",\"ssa\",\"ssb\",\"ssc\",\"ssd\",\"sse\",\"ssf\",\"ssg\",\"ssh\",\"ssi\",\"ssj\",\"ssk\",\"ssl\",\"ssm\",\"ssn\",\"sso\",\"ssp\",\"ssq\",\"ssr\",\"sss\",\"sst\",\"ssu\",\"ssv\",\"ssx\",\"ssy\",\"ssz\",\"sta\",\"stb\",\"std\",\"ste\",\"stf\",\"stg\",\"sth\",\"sti\",\"stj\",\"stk\",\"stl\",\"stm\",\"stn\",\"sto\",\"stp\",\"stq\",\"str\",\"sts\",\"stt\",\"stu\",\"stv\",\"stw\",\"sty\",\"sua\",\"sub\",\"suc\",\"sue\",\"sug\",\"sui\",\"suj\",\"suk\",\"sul\",\"sum\",\"suq\",\"sur\",\"sus\",\"sut\",\"suv\",\"suw\",\"sux\",\"suy\",\"suz\",\"sva\",\"svb\",\"svc\",\"sve\",\"svk\",\"svm\",\"svr\",\"svs\",\"svx\",\"swb\",\"swc\",\"swf\",\"swg\",\"swh\",\"swi\",\"swj\",\"swk\",\"swl\",\"swm\",\"swn\",\"swo\",\"swp\",\"swq\",\"swr\",\"sws\",\"swt\",\"swu\",\"swv\",\"sww\",\"swx\",\"swy\",\"sxb\",\"sxc\",\"sxe\",\"sxg\",\"sxk\",\"sxl\",\"sxm\",\"sxn\",\"sxo\",\"sxr\",\"sxs\",\"sxu\",\"sxw\",\"sya\",\"syb\",\"syc\",\"syd\",\"syi\",\"syk\",\"syl\",\"sym\",\"syn\",\"syo\",\"syr\",\"sys\",\"syw\",\"syx\",\"syy\",\"sza\",\"szb\",\"szc\",\"szd\",\"sze\",\"szg\",\"szl\",\"szn\",\"szp\",\"szs\",\"szv\",\"szw\",\"taa\",\"tab\",\"tac\",\"tad\",\"tae\",\"taf\",\"tag\",\"tai\",\"taj\",\"tak\",\"tal\",\"tan\",\"tao\",\"tap\",\"taq\",\"tar\",\"tas\",\"tau\",\"tav\",\"taw\",\"tax\",\"tay\",\"taz\",\"tba\",\"tbb\",\"tbc\",\"tbd\",\"tbe\",\"tbf\",\"tbg\",\"tbh\",\"tbi\",\"tbj\",\"tbk\",\"tbl\",\"tbm\",\"tbn\",\"tbo\",\"tbp\",\"tbq\",\"tbr\",\"tbs\",\"tbt\",\"tbu\",\"tbv\",\"tbw\",\"tbx\",\"tby\",\"tbz\",\"tca\",\"tcb\",\"tcc\",\"tcd\",\"tce\",\"tcf\",\"tcg\",\"tch\",\"tci\",\"tck\",\"tcl\",\"tcm\",\"tcn\",\"tco\",\"tcp\",\"tcq\",\"tcs\",\"tct\",\"tcu\",\"tcw\",\"tcx\",\"tcy\",\"tcz\",\"tda\",\"tdb\",\"tdc\",\"tdd\",\"tde\",\"tdf\",\"tdg\",\"tdh\",\"tdi\",\"tdj\",\"tdk\",\"tdl\",\"tdm\",\"tdn\",\"tdo\",\"tdq\",\"tdr\",\"tds\",\"tdt\",\"tdu\",\"tdv\",\"tdx\",\"tdy\",\"tea\",\"teb\",\"tec\",\"ted\",\"tee\",\"tef\",\"teg\",\"teh\",\"tei\",\"tek\",\"tem\",\"ten\",\"teo\",\"tep\",\"teq\",\"ter\",\"tes\",\"tet\",\"teu\",\"tev\",\"tew\",\"tex\",\"tey\",\"tez\",\"tfi\",\"tfn\",\"tfo\",\"tfr\",\"tft\",\"tga\",\"tgb\",\"tgc\",\"tgd\",\"tge\",\"tgf\",\"tgg\",\"tgh\",\"tgi\",\"tgj\",\"tgn\",\"tgo\",\"tgp\",\"tgq\",\"tgr\",\"tgs\",\"tgt\",\"tgu\",\"tgv\",\"tgw\",\"tgx\",\"tgy\",\"tgz\",\"thc\",\"thd\",\"the\",\"thf\",\"thh\",\"thi\",\"thk\",\"thl\",\"thm\",\"thn\",\"thp\",\"thq\",\"thr\",\"ths\",\"tht\",\"thu\",\"thv\",\"thw\",\"thx\",\"thy\",\"thz\",\"tia\",\"tic\",\"tid\",\"tie\",\"tif\",\"tig\",\"tih\",\"tii\",\"tij\",\"tik\",\"til\",\"tim\",\"tin\",\"tio\",\"tip\",\"tiq\",\"tis\",\"tit\",\"tiu\",\"tiv\",\"tiw\",\"tix\",\"tiy\",\"tiz\",\"tja\",\"tjg\",\"tji\",\"tjl\",\"tjm\",\"tjn\",\"tjo\",\"tjs\",\"tju\",\"tjw\",\"tka\",\"tkb\",\"tkd\",\"tke\",\"tkf\",\"tkg\",\"tkk\",\"tkl\",\"tkm\",\"tkn\",\"tkp\",\"tkq\",\"tkr\",\"tks\",\"tkt\",\"tku\",\"tkv\",\"tkw\",\"tkx\",\"tkz\",\"tla\",\"tlb\",\"tlc\",\"tld\",\"tlf\",\"tlg\",\"tlh\",\"tli\",\"tlj\",\"tlk\",\"tll\",\"tlm\",\"tln\",\"tlo\",\"tlp\",\"tlq\",\"tlr\",\"tls\",\"tlt\",\"tlu\",\"tlv\",\"tlw\",\"tlx\",\"tly\",\"tma\",\"tmb\",\"tmc\",\"tmd\",\"tme\",\"tmf\",\"tmg\",\"tmh\",\"tmi\",\"tmj\",\"tmk\",\"tml\",\"tmm\",\"tmn\",\"tmo\",\"tmp\",\"tmq\",\"tmr\",\"tms\",\"tmt\",\"tmu\",\"tmv\",\"tmw\",\"tmy\",\"tmz\",\"tna\",\"tnb\",\"tnc\",\"tnd\",\"tne\",\"tnf\",\"tng\",\"tnh\",\"tni\",\"tnk\",\"tnl\",\"tnm\",\"tnn\",\"tno\",\"tnp\",\"tnq\",\"tnr\",\"tns\",\"tnt\",\"tnu\",\"tnv\",\"tnw\",\"tnx\",\"tny\",\"tnz\",\"tob\",\"toc\",\"tod\",\"toe\",\"tof\",\"tog\",\"toh\",\"toi\",\"toj\",\"tol\",\"tom\",\"too\",\"top\",\"toq\",\"tor\",\"tos\",\"tou\",\"tov\",\"tow\",\"tox\",\"toy\",\"toz\",\"tpa\",\"tpc\",\"tpe\",\"tpf\",\"tpg\",\"tpi\",\"tpj\",\"tpk\",\"tpl\",\"tpm\",\"tpn\",\"tpo\",\"tpp\",\"tpq\",\"tpr\",\"tpt\",\"tpu\",\"tpv\",\"tpw\",\"tpx\",\"tpy\",\"tpz\",\"tqb\",\"tql\",\"tqm\",\"tqn\",\"tqo\",\"tqp\",\"tqq\",\"tqr\",\"tqt\",\"tqu\",\"tqw\",\"tra\",\"trb\",\"trc\",\"trd\",\"tre\",\"trf\",\"trg\",\"trh\",\"tri\",\"trj\",\"trk\",\"trl\",\"trm\",\"trn\",\"tro\",\"trp\",\"trq\",\"trr\",\"trs\",\"trt\",\"tru\",\"trv\",\"trw\",\"trx\",\"try\",\"trz\",\"tsa\",\"tsb\",\"tsc\",\"tsd\",\"tse\",\"tsf\",\"tsg\",\"tsh\",\"tsi\",\"tsj\",\"tsk\",\"tsl\",\"tsm\",\"tsp\",\"tsq\",\"tsr\",\"tss\",\"tst\",\"tsu\",\"tsv\",\"tsw\",\"tsx\",\"tsy\",\"tsz\",\"tta\",\"ttb\",\"ttc\",\"ttd\",\"tte\",\"ttf\",\"ttg\",\"tth\",\"tti\",\"ttj\",\"ttk\",\"ttl\",\"ttm\",\"ttn\",\"tto\",\"ttp\",\"ttq\",\"ttr\",\"tts\",\"ttt\",\"ttu\",\"ttv\",\"ttw\",\"tty\",\"ttz\",\"tua\",\"tub\",\"tuc\",\"tud\",\"tue\",\"tuf\",\"tug\",\"tuh\",\"tui\",\"tuj\",\"tul\",\"tum\",\"tun\",\"tuo\",\"tup\",\"tuq\",\"tus\",\"tut\",\"tuu\",\"tuv\",\"tuw\",\"tux\",\"tuy\",\"tuz\",\"tva\",\"tvd\",\"tve\",\"tvk\",\"tvl\",\"tvm\",\"tvn\",\"tvo\",\"tvs\",\"tvt\",\"tvu\",\"tvw\",\"tvy\",\"twa\",\"twb\",\"twc\",\"twd\",\"twe\",\"twf\",\"twg\",\"twh\",\"twl\",\"twm\",\"twn\",\"two\",\"twp\",\"twq\",\"twr\",\"twt\",\"twu\",\"tww\",\"twx\",\"twy\",\"txa\",\"txb\",\"txc\",\"txe\",\"txg\",\"txh\",\"txi\",\"txj\",\"txm\",\"txn\",\"txo\",\"txq\",\"txr\",\"txs\",\"txt\",\"txu\",\"txx\",\"txy\",\"tya\",\"tye\",\"tyh\",\"tyi\",\"tyj\",\"tyl\",\"tyn\",\"typ\",\"tyr\",\"tys\",\"tyt\",\"tyu\",\"tyv\",\"tyx\",\"tyz\",\"tza\",\"tzh\",\"tzj\",\"tzl\",\"tzm\",\"tzn\",\"tzo\",\"tzx\",\"uam\",\"uan\",\"uar\",\"uba\",\"ubi\",\"ubl\",\"ubr\",\"ubu\",\"uby\",\"uda\",\"ude\",\"udg\",\"udi\",\"udj\",\"udl\",\"udm\",\"udu\",\"ues\",\"ufi\",\"uga\",\"ugb\",\"uge\",\"ugn\",\"ugo\",\"ugy\",\"uha\",\"uhn\",\"uis\",\"uiv\",\"uji\",\"uka\",\"ukg\",\"ukh\",\"ukk\",\"ukl\",\"ukp\",\"ukq\",\"uks\",\"uku\",\"ukw\",\"uky\",\"ula\",\"ulb\",\"ulc\",\"ule\",\"ulf\",\"uli\",\"ulk\",\"ull\",\"ulm\",\"uln\",\"ulu\",\"ulw\",\"uma\",\"umb\",\"umc\",\"umd\",\"umg\",\"umi\",\"umm\",\"umn\",\"umo\",\"ump\",\"umr\",\"ums\",\"umu\",\"una\",\"und\",\"une\",\"ung\",\"unk\",\"unm\",\"unn\",\"unp\",\"unr\",\"unu\",\"unx\",\"unz\",\"uok\",\"upi\",\"upv\",\"ura\",\"urb\",\"urc\",\"ure\",\"urf\",\"urg\",\"urh\",\"uri\",\"urj\",\"urk\",\"url\",\"urm\",\"urn\",\"uro\",\"urp\",\"urr\",\"urt\",\"uru\",\"urv\",\"urw\",\"urx\",\"ury\",\"urz\",\"usa\",\"ush\",\"usi\",\"usk\",\"usp\",\"usu\",\"uta\",\"ute\",\"utp\",\"utr\",\"utu\",\"uum\",\"uun\",\"uur\",\"uuu\",\"uve\",\"uvh\",\"uvl\",\"uwa\",\"uya\",\"uzn\",\"uzs\",\"vaa\",\"vae\",\"vaf\",\"vag\",\"vah\",\"vai\",\"vaj\",\"val\",\"vam\",\"van\",\"vao\",\"vap\",\"var\",\"vas\",\"vau\",\"vav\",\"vay\",\"vbb\",\"vbk\",\"vec\",\"ved\",\"vel\",\"vem\",\"veo\",\"vep\",\"ver\",\"vgr\",\"vgt\",\"vic\",\"vid\",\"vif\",\"vig\",\"vil\",\"vin\",\"vis\",\"vit\",\"viv\",\"vka\",\"vki\",\"vkj\",\"vkk\",\"vkl\",\"vkm\",\"vko\",\"vkp\",\"vkt\",\"vku\",\"vlp\",\"vls\",\"vma\",\"vmb\",\"vmc\",\"vmd\",\"vme\",\"vmf\",\"vmg\",\"vmh\",\"vmi\",\"vmj\",\"vmk\",\"vml\",\"vmm\",\"vmp\",\"vmq\",\"vmr\",\"vms\",\"vmu\",\"vmv\",\"vmw\",\"vmx\",\"vmy\",\"vmz\",\"vnk\",\"vnm\",\"vnp\",\"vor\",\"vot\",\"vra\",\"vro\",\"vrs\",\"vrt\",\"vsi\",\"vsl\",\"vsv\",\"vto\",\"vum\",\"vun\",\"vut\",\"vwa\",\"waa\",\"wab\",\"wac\",\"wad\",\"wae\",\"waf\",\"wag\",\"wah\",\"wai\",\"waj\",\"wak\",\"wal\",\"wam\",\"wan\",\"wao\",\"wap\",\"waq\",\"war\",\"was\",\"wat\",\"wau\",\"wav\",\"waw\",\"wax\",\"way\",\"waz\",\"wba\",\"wbb\",\"wbe\",\"wbf\",\"wbh\",\"wbi\",\"wbj\",\"wbk\",\"wbl\",\"wbm\",\"wbp\",\"wbq\",\"wbr\",\"wbs\",\"wbt\",\"wbv\",\"wbw\",\"wca\",\"wci\",\"wdd\",\"wdg\",\"wdj\",\"wdk\",\"wdu\",\"wdy\",\"wea\",\"wec\",\"wed\",\"weg\",\"weh\",\"wei\",\"wem\",\"wen\",\"weo\",\"wep\",\"wer\",\"wes\",\"wet\",\"weu\",\"wew\",\"wfg\",\"wga\",\"wgb\",\"wgg\",\"wgi\",\"wgo\",\"wgu\",\"wgw\",\"wgy\",\"wha\",\"whg\",\"whk\",\"whu\",\"wib\",\"wic\",\"wie\",\"wif\",\"wig\",\"wih\",\"wii\",\"wij\",\"wik\",\"wil\",\"wim\",\"win\",\"wir\",\"wit\",\"wiu\",\"wiv\",\"wiw\",\"wiy\",\"wja\",\"wji\",\"wka\",\"wkb\",\"wkd\",\"wkl\",\"wku\",\"wkw\",\"wky\",\"wla\",\"wlc\",\"wle\",\"wlg\",\"wli\",\"wlk\",\"wll\",\"wlm\",\"wlo\",\"wlr\",\"wls\",\"wlu\",\"wlv\",\"wlw\",\"wlx\",\"wly\",\"wma\",\"wmb\",\"wmc\",\"wmd\",\"wme\",\"wmh\",\"wmi\",\"wmm\",\"wmn\",\"wmo\",\"wms\",\"wmt\",\"wmw\",\"wmx\",\"wnb\",\"wnc\",\"wnd\",\"wne\",\"wng\",\"wni\",\"wnk\",\"wnm\",\"wnn\",\"wno\",\"wnp\",\"wnu\",\"wnw\",\"wny\",\"woa\",\"wob\",\"woc\",\"wod\",\"woe\",\"wof\",\"wog\",\"woi\",\"wok\",\"wom\",\"won\",\"woo\",\"wor\",\"wos\",\"wow\",\"woy\",\"wpc\",\"wra\",\"wrb\",\"wrd\",\"wrg\",\"wrh\",\"wri\",\"wrk\",\"wrl\",\"wrm\",\"wrn\",\"wro\",\"wrp\",\"wrr\",\"wrs\",\"wru\",\"wrv\",\"wrw\",\"wrx\",\"wry\",\"wrz\",\"wsa\",\"wsg\",\"wsi\",\"wsk\",\"wsr\",\"wss\",\"wsu\",\"wsv\",\"wtf\",\"wth\",\"wti\",\"wtk\",\"wtm\",\"wtw\",\"wua\",\"wub\",\"wud\",\"wuh\",\"wul\",\"wum\",\"wun\",\"wur\",\"wut\",\"wuu\",\"wuv\",\"wux\",\"wuy\",\"wwa\",\"wwb\",\"wwo\",\"wwr\",\"www\",\"wxa\",\"wxw\",\"wya\",\"wyb\",\"wyi\",\"wym\",\"wyr\",\"wyy\",\"xaa\",\"xab\",\"xac\",\"xad\",\"xae\",\"xag\",\"xai\",\"xaj\",\"xak\",\"xal\",\"xam\",\"xan\",\"xao\",\"xap\",\"xaq\",\"xar\",\"xas\",\"xat\",\"xau\",\"xav\",\"xaw\",\"xay\",\"xba\",\"xbb\",\"xbc\",\"xbd\",\"xbe\",\"xbg\",\"xbi\",\"xbj\",\"xbm\",\"xbn\",\"xbo\",\"xbp\",\"xbr\",\"xbw\",\"xbx\",\"xby\",\"xcb\",\"xcc\",\"xce\",\"xcg\",\"xch\",\"xcl\",\"xcm\",\"xcn\",\"xco\",\"xcr\",\"xct\",\"xcu\",\"xcv\",\"xcw\",\"xcy\",\"xda\",\"xdc\",\"xdk\",\"xdm\",\"xdo\",\"xdy\",\"xeb\",\"xed\",\"xeg\",\"xel\",\"xem\",\"xep\",\"xer\",\"xes\",\"xet\",\"xeu\",\"xfa\",\"xga\",\"xgb\",\"xgd\",\"xgf\",\"xgg\",\"xgi\",\"xgl\",\"xgm\",\"xgn\",\"xgr\",\"xgu\",\"xgw\",\"xha\",\"xhc\",\"xhd\",\"xhe\",\"xhr\",\"xht\",\"xhu\",\"xhv\",\"xia\",\"xib\",\"xii\",\"xil\",\"xin\",\"xip\",\"xir\",\"xis\",\"xiv\",\"xiy\",\"xjb\",\"xjt\",\"xka\",\"xkb\",\"xkc\",\"xkd\",\"xke\",\"xkf\",\"xkg\",\"xkh\",\"xki\",\"xkj\",\"xkk\",\"xkl\",\"xkn\",\"xko\",\"xkp\",\"xkq\",\"xkr\",\"xks\",\"xkt\",\"xku\",\"xkv\",\"xkw\",\"xkx\",\"xky\",\"xkz\",\"xla\",\"xlb\",\"xlc\",\"xld\",\"xle\",\"xlg\",\"xli\",\"xln\",\"xlo\",\"xlp\",\"xls\",\"xlu\",\"xly\",\"xma\",\"xmb\",\"xmc\",\"xmd\",\"xme\",\"xmf\",\"xmg\",\"xmh\",\"xmj\",\"xmk\",\"xml\",\"xmm\",\"xmn\",\"xmo\",\"xmp\",\"xmq\",\"xmr\",\"xms\",\"xmt\",\"xmu\",\"xmv\",\"xmw\",\"xmx\",\"xmy\",\"xmz\",\"xna\",\"xnb\",\"xnd\",\"xng\",\"xnh\",\"xni\",\"xnk\",\"xnn\",\"xno\",\"xnr\",\"xns\",\"xnt\",\"xnu\",\"xny\",\"xnz\",\"xoc\",\"xod\",\"xog\",\"xoi\",\"xok\",\"xom\",\"xon\",\"xoo\",\"xop\",\"xor\",\"xow\",\"xpa\",\"xpc\",\"xpe\",\"xpg\",\"xpi\",\"xpj\",\"xpk\",\"xpm\",\"xpn\",\"xpo\",\"xpp\",\"xpq\",\"xpr\",\"xps\",\"xpt\",\"xpu\",\"xpy\",\"xqa\",\"xqt\",\"xra\",\"xrb\",\"xrd\",\"xre\",\"xrg\",\"xri\",\"xrm\",\"xrn\",\"xrq\",\"xrr\",\"xrt\",\"xru\",\"xrw\",\"xsa\",\"xsb\",\"xsc\",\"xsd\",\"xse\",\"xsh\",\"xsi\",\"xsj\",\"xsl\",\"xsm\",\"xsn\",\"xso\",\"xsp\",\"xsq\",\"xsr\",\"xss\",\"xsu\",\"xsv\",\"xsy\",\"xta\",\"xtb\",\"xtc\",\"xtd\",\"xte\",\"xtg\",\"xth\",\"xti\",\"xtj\",\"xtl\",\"xtm\",\"xtn\",\"xto\",\"xtp\",\"xtq\",\"xtr\",\"xts\",\"xtt\",\"xtu\",\"xtv\",\"xtw\",\"xty\",\"xtz\",\"xua\",\"xub\",\"xud\",\"xug\",\"xuj\",\"xul\",\"xum\",\"xun\",\"xuo\",\"xup\",\"xur\",\"xut\",\"xuu\",\"xve\",\"xvi\",\"xvn\",\"xvo\",\"xvs\",\"xwa\",\"xwc\",\"xwd\",\"xwe\",\"xwg\",\"xwj\",\"xwk\",\"xwl\",\"xwo\",\"xwr\",\"xwt\",\"xww\",\"xxb\",\"xxk\",\"xxm\",\"xxr\",\"xxt\",\"xya\",\"xyb\",\"xyj\",\"xyk\",\"xyl\",\"xyt\",\"xyy\",\"xzh\",\"xzm\",\"xzp\",\"yaa\",\"yab\",\"yac\",\"yad\",\"yae\",\"yaf\",\"yag\",\"yah\",\"yai\",\"yaj\",\"yak\",\"yal\",\"yam\",\"yan\",\"yao\",\"yap\",\"yaq\",\"yar\",\"yas\",\"yat\",\"yau\",\"yav\",\"yaw\",\"yax\",\"yay\",\"yaz\",\"yba\",\"ybb\",\"ybd\",\"ybe\",\"ybh\",\"ybi\",\"ybj\",\"ybk\",\"ybl\",\"ybm\",\"ybn\",\"ybo\",\"ybx\",\"yby\",\"ych\",\"ycl\",\"ycn\",\"ycp\",\"yda\",\"ydd\",\"yde\",\"ydg\",\"ydk\",\"yds\",\"yea\",\"yec\",\"yee\",\"yei\",\"yej\",\"yel\",\"yen\",\"yer\",\"yes\",\"yet\",\"yeu\",\"yev\",\"yey\",\"yga\",\"ygi\",\"ygl\",\"ygm\",\"ygp\",\"ygr\",\"ygs\",\"ygu\",\"ygw\",\"yha\",\"yhd\",\"yhl\",\"yhs\",\"yia\",\"yif\",\"yig\",\"yih\",\"yii\",\"yij\",\"yik\",\"yil\",\"yim\",\"yin\",\"yip\",\"yiq\",\"yir\",\"yis\",\"yit\",\"yiu\",\"yiv\",\"yix\",\"yiy\",\"yiz\",\"yka\",\"ykg\",\"yki\",\"ykk\",\"ykl\",\"ykm\",\"ykn\",\"yko\",\"ykr\",\"ykt\",\"yku\",\"yky\",\"yla\",\"ylb\",\"yle\",\"ylg\",\"yli\",\"yll\",\"ylm\",\"yln\",\"ylo\",\"ylr\",\"ylu\",\"yly\",\"yma\",\"ymb\",\"ymc\",\"ymd\",\"yme\",\"ymg\",\"ymh\",\"ymi\",\"ymk\",\"yml\",\"ymm\",\"ymn\",\"ymo\",\"ymp\",\"ymq\",\"ymr\",\"yms\",\"ymt\",\"ymx\",\"ymz\",\"yna\",\"ynd\",\"yne\",\"yng\",\"ynh\",\"ynk\",\"ynl\",\"ynn\",\"yno\",\"ynq\",\"yns\",\"ynu\",\"yob\",\"yog\",\"yoi\",\"yok\",\"yol\",\"yom\",\"yon\",\"yos\",\"yot\",\"yox\",\"yoy\",\"ypa\",\"ypb\",\"ypg\",\"yph\",\"ypk\",\"ypm\",\"ypn\",\"ypo\",\"ypp\",\"ypz\",\"yra\",\"yrb\",\"yre\",\"yri\",\"yrk\",\"yrl\",\"yrm\",\"yrn\",\"yro\",\"yrs\",\"yrw\",\"yry\",\"ysc\",\"ysd\",\"ysg\",\"ysl\",\"ysn\",\"yso\",\"ysp\",\"ysr\",\"yss\",\"ysy\",\"yta\",\"ytl\",\"ytp\",\"ytw\",\"yty\",\"yua\",\"yub\",\"yuc\",\"yud\",\"yue\",\"yuf\",\"yug\",\"yui\",\"yuj\",\"yuk\",\"yul\",\"yum\",\"yun\",\"yup\",\"yuq\",\"yur\",\"yut\",\"yuu\",\"yuw\",\"yux\",\"yuy\",\"yuz\",\"yva\",\"yvt\",\"ywa\",\"ywg\",\"ywl\",\"ywn\",\"ywq\",\"ywr\",\"ywt\",\"ywu\",\"yww\",\"yxa\",\"yxg\",\"yxl\",\"yxm\",\"yxu\",\"yxy\",\"yyr\",\"yyu\",\"yyz\",\"yzg\",\"yzk\",\"zaa\",\"zab\",\"zac\",\"zad\",\"zae\",\"zaf\",\"zag\",\"zah\",\"zai\",\"zaj\",\"zak\",\"zal\",\"zam\",\"zao\",\"zap\",\"zaq\",\"zar\",\"zas\",\"zat\",\"zau\",\"zav\",\"zaw\",\"zax\",\"zay\",\"zaz\",\"zbc\",\"zbe\",\"zbl\",\"zbt\",\"zbw\",\"zca\",\"zch\",\"zdj\",\"zea\",\"zeg\",\"zeh\",\"zen\",\"zga\",\"zgb\",\"zgh\",\"zgm\",\"zgn\",\"zgr\",\"zhb\",\"zhd\",\"zhi\",\"zhn\",\"zhw\",\"zhx\",\"zia\",\"zib\",\"zik\",\"zil\",\"zim\",\"zin\",\"zir\",\"ziw\",\"ziz\",\"zka\",\"zkb\",\"zkd\",\"zkg\",\"zkh\",\"zkk\",\"zkn\",\"zko\",\"zkp\",\"zkr\",\"zkt\",\"zku\",\"zkv\",\"zkz\",\"zle\",\"zlj\",\"zlm\",\"zln\",\"zlq\",\"zls\",\"zlw\",\"zma\",\"zmb\",\"zmc\",\"zmd\",\"zme\",\"zmf\",\"zmg\",\"zmh\",\"zmi\",\"zmj\",\"zmk\",\"zml\",\"zmm\",\"zmn\",\"zmo\",\"zmp\",\"zmq\",\"zmr\",\"zms\",\"zmt\",\"zmu\",\"zmv\",\"zmw\",\"zmx\",\"zmy\",\"zmz\",\"zna\",\"znd\",\"zne\",\"zng\",\"znk\",\"zns\",\"zoc\",\"zoh\",\"zom\",\"zoo\",\"zoq\",\"zor\",\"zos\",\"zpa\",\"zpb\",\"zpc\",\"zpd\",\"zpe\",\"zpf\",\"zpg\",\"zph\",\"zpi\",\"zpj\",\"zpk\",\"zpl\",\"zpm\",\"zpn\",\"zpo\",\"zpp\",\"zpq\",\"zpr\",\"zps\",\"zpt\",\"zpu\",\"zpv\",\"zpw\",\"zpx\",\"zpy\",\"zpz\",\"zqe\",\"zra\",\"zrg\",\"zrn\",\"zro\",\"zrp\",\"zrs\",\"zsa\",\"zsk\",\"zsl\",\"zsm\",\"zsr\",\"zsu\",\"zte\",\"ztg\",\"ztl\",\"ztm\",\"ztn\",\"ztp\",\"ztq\",\"zts\",\"ztt\",\"ztu\",\"ztx\",\"zty\",\"zua\",\"zuh\",\"zum\",\"zun\",\"zuy\",\"zwa\",\"zxx\",\"zyb\",\"zyg\",\"zyj\",\"zyn\",\"zyp\",\"zza\",\"zzj\"];return axe.utils.validLangs=function(){\"use strict\";return b},commons}()})}(\"object\"==typeof window?window:this);";
-const pageFunctions=require('../../lib/page-functions');
+const axeLibSource="/*! aXe v3.2.2\n * Copyright (c) 2019 Deque Systems, Inc.\n *\n * Your use of this Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/.\n *\n * This entire copyright notice must appear in every copy of this file you\n * distribute or in any file that contains substantial portions of this source\n * code.\n */\n!function e(window){var t=window,document=window.document,N=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e};function m(e){this.name=\"SupportError\",this.cause=e.cause,this.message=\"`\"+e.cause+\"` - feature unsupported in your environment.\",e.ruleId&&(this.ruleId=e.ruleId,this.message+=\" Skipping \"+this.ruleId+\" rule.\"),this.stack=(new Error).stack}(axe=axe||{}).version=\"3.2.2\",\"function\"==typeof define&&define.amd&&define(\"axe-core\",[],function(){\"use strict\";return axe}),\"object\"===(\"undefined\"==typeof module?\"undefined\":N(module))&&module.exports&&\"function\"==typeof e.toString&&(axe.source=\"(\"+e.toString()+')(typeof window === \"object\" ? window : this);',module.exports=axe),\"function\"==typeof window.getComputedStyle&&(window.axe=axe),(m.prototype=Object.create(Error.prototype)).constructor=m,function o(i,u,s){function l(t,e){if(!u[t]){if(!i[t]){var r=\"function\"==typeof require&&require;if(!e&&r)return r(t,!0);if(c)return c(t,!0);var n=new Error(\"Cannot find module '\"+t+\"'\");throw n.code=\"MODULE_NOT_FOUND\",n}var a=u[t]={exports:{}};i[t][0].call(a.exports,function(e){return l(i[t][1][e]||e)},a,a.exports,o,i,u,s)}return u[t].exports}for(var c=\"function\"==typeof require&&require,e=0;e<s.length;e++)l(s[e]);return l}({1:[function(e,t,r){e(\"es6-promise\").polyfill(),axe.imports={axios:e(\"axios\"),CssSelectorParser:e(\"css-selector-parser\").CssSelectorParser,doT:e(\"dot\"),emojiRegexText:e(\"emoji-regex\")}},{axios:2,\"css-selector-parser\":27,dot:29,\"emoji-regex\":30,\"es6-promise\":31}],2:[function(e,t,r){t.exports=e(\"./lib/axios\")},{\"./lib/axios\":4}],3:[function(v,e,t){(function(m){\"use strict\";var utils=v(\"./../utils\"),p=v(\"./../core/settle\"),f=v(\"./../helpers/buildURL\"),h=v(\"./../helpers/parseHeaders\"),b=v(\"./../helpers/isURLSameOrigin\"),g=v(\"../core/createError\"),y=void 0!==window&&window.btoa&&window.btoa.bind(window)||v(\"./../helpers/btoa\");e.exports=function(d){return new Promise(function(r,n){var a=d.data,o=d.headers;utils.isFormData(a)&&delete o[\"Content-Type\"];var i=new XMLHttpRequest,e=\"onreadystatechange\",u=!1;if(\"test\"===m.env.NODE_ENV||void 0===window||!window.XDomainRequest||\"withCredentials\"in i||b(d.url)||(i=new window.XDomainRequest,e=\"onload\",u=!0,i.onprogress=function(){},i.ontimeout=function(){}),d.auth){var t=d.auth.username||\"\",s=d.auth.password||\"\";o.Authorization=\"Basic \"+y(t+\":\"+s)}if(i.open(d.method.toUpperCase(),f(d.url,d.params,d.paramsSerializer),!0),i.timeout=d.timeout,i[e]=function(){if(i&&(4===i.readyState||u)&&(0!==i.status||i.responseURL&&0===i.responseURL.indexOf(\"file:\"))){var e=\"getAllResponseHeaders\"in i?h(i.getAllResponseHeaders()):null,t={data:d.responseType&&\"text\"!==d.responseType?i.response:i.responseText,status:1223===i.status?204:i.status,statusText:1223===i.status?\"No Content\":i.statusText,headers:e,config:d,request:i};p(r,n,t),i=null}},i.onerror=function(){n(g(\"Network Error\",d,null,i)),i=null},i.ontimeout=function(){n(g(\"timeout of \"+d.timeout+\"ms exceeded\",d,\"ECONNABORTED\",i)),i=null},utils.isStandardBrowserEnv()){var l=v(\"./../helpers/cookies\"),c=(d.withCredentials||b(d.url))&&d.xsrfCookieName?l.read(d.xsrfCookieName):void 0;c&&(o[d.xsrfHeaderName]=c)}if(\"setRequestHeader\"in i&&utils.forEach(o,function(e,t){void 0===a&&\"content-type\"===t.toLowerCase()?delete o[t]:i.setRequestHeader(t,e)}),d.withCredentials&&(i.withCredentials=!0),d.responseType)try{i.responseType=d.responseType}catch(e){if(\"json\"!==d.responseType)throw e}\"function\"==typeof d.onDownloadProgress&&i.addEventListener(\"progress\",d.onDownloadProgress),\"function\"==typeof d.onUploadProgress&&i.upload&&i.upload.addEventListener(\"progress\",d.onUploadProgress),d.cancelToken&&d.cancelToken.promise.then(function(e){i&&(i.abort(),n(e),i=null)}),void 0===a&&(a=null),i.send(a)})}}).call(this,v(\"_process\"))},{\"../core/createError\":10,\"./../core/settle\":13,\"./../helpers/btoa\":17,\"./../helpers/buildURL\":18,\"./../helpers/cookies\":20,\"./../helpers/isURLSameOrigin\":22,\"./../helpers/parseHeaders\":24,\"./../utils\":26,_process:33}],4:[function(e,t,r){\"use strict\";var utils=e(\"./utils\"),n=e(\"./helpers/bind\"),a=e(\"./core/Axios\"),o=e(\"./defaults\");function i(e){var t=new a(e),r=n(a.prototype.request,t);return utils.extend(r,a.prototype,t),utils.extend(r,t),r}var u=i(o);u.Axios=a,u.create=function(e){return i(utils.merge(o,e))},u.Cancel=e(\"./cancel/Cancel\"),u.CancelToken=e(\"./cancel/CancelToken\"),u.isCancel=e(\"./cancel/isCancel\"),u.all=function(e){return Promise.all(e)},u.spread=e(\"./helpers/spread\"),t.exports=u,t.exports.default=u},{\"./cancel/Cancel\":5,\"./cancel/CancelToken\":6,\"./cancel/isCancel\":7,\"./core/Axios\":8,\"./defaults\":15,\"./helpers/bind\":16,\"./helpers/spread\":25,\"./utils\":26}],5:[function(e,t,r){\"use strict\";function n(e){this.message=e}n.prototype.toString=function(){return\"Cancel\"+(this.message?\": \"+this.message:\"\")},n.prototype.__CANCEL__=!0,t.exports=n},{}],6:[function(e,t,r){\"use strict\";var n=e(\"./Cancel\");function a(e){if(\"function\"!=typeof e)throw new TypeError(\"executor must be a function.\");var t;this.promise=new Promise(function(e){t=e});var r=this;e(function(e){r.reason||(r.reason=new n(e),t(r.reason))})}a.prototype.throwIfRequested=function(){if(this.reason)throw this.reason},a.source=function(){var t;return{token:new a(function(e){t=e}),cancel:t}},t.exports=a},{\"./Cancel\":5}],7:[function(e,t,r){\"use strict\";t.exports=function(e){return!(!e||!e.__CANCEL__)}},{}],8:[function(e,t,r){\"use strict\";var n=e(\"./../defaults\"),utils=e(\"./../utils\"),a=e(\"./InterceptorManager\"),o=e(\"./dispatchRequest\");function i(e){this.defaults=e,this.interceptors={request:new a,response:new a}}i.prototype.request=function(e){\"string\"==typeof e&&(e=utils.merge({url:arguments[0]},arguments[1])),(e=utils.merge(n,{method:\"get\"},this.defaults,e)).method=e.method.toLowerCase();var t=[o,void 0],r=Promise.resolve(e);for(this.interceptors.request.forEach(function(e){t.unshift(e.fulfilled,e.rejected)}),this.interceptors.response.forEach(function(e){t.push(e.fulfilled,e.rejected)});t.length;)r=r.then(t.shift(),t.shift());return r},utils.forEach([\"delete\",\"get\",\"head\",\"options\"],function(r){i.prototype[r]=function(e,t){return this.request(utils.merge(t||{},{method:r,url:e}))}}),utils.forEach([\"post\",\"put\",\"patch\"],function(n){i.prototype[n]=function(e,t,r){return this.request(utils.merge(r||{},{method:n,url:e,data:t}))}}),t.exports=i},{\"./../defaults\":15,\"./../utils\":26,\"./InterceptorManager\":9,\"./dispatchRequest\":11}],9:[function(e,t,r){\"use strict\";var utils=e(\"./../utils\");function n(){this.handlers=[]}n.prototype.use=function(e,t){return this.handlers.push({fulfilled:e,rejected:t}),this.handlers.length-1},n.prototype.eject=function(e){this.handlers[e]&&(this.handlers[e]=null)},n.prototype.forEach=function(t){utils.forEach(this.handlers,function(e){null!==e&&t(e)})},t.exports=n},{\"./../utils\":26}],10:[function(e,t,r){\"use strict\";var i=e(\"./enhanceError\");t.exports=function(e,t,r,n,a){var o=new Error(e);return i(o,t,r,n,a)}},{\"./enhanceError\":12}],11:[function(e,t,r){\"use strict\";var utils=e(\"./../utils\"),n=e(\"./transformData\"),a=e(\"../cancel/isCancel\"),o=e(\"../defaults\"),i=e(\"./../helpers/isAbsoluteURL\"),u=e(\"./../helpers/combineURLs\");function s(e){e.cancelToken&&e.cancelToken.throwIfRequested()}t.exports=function(t){return s(t),t.baseURL&&!i(t.url)&&(t.url=u(t.baseURL,t.url)),t.headers=t.headers||{},t.data=n(t.data,t.headers,t.transformRequest),t.headers=utils.merge(t.headers.common||{},t.headers[t.method]||{},t.headers||{}),utils.forEach([\"delete\",\"get\",\"head\",\"post\",\"put\",\"patch\",\"common\"],function(e){delete t.headers[e]}),(t.adapter||o.adapter)(t).then(function(e){return s(t),e.data=n(e.data,e.headers,t.transformResponse),e},function(e){return a(e)||(s(t),e&&e.response&&(e.response.data=n(e.response.data,e.response.headers,t.transformResponse))),Promise.reject(e)})}},{\"../cancel/isCancel\":7,\"../defaults\":15,\"./../helpers/combineURLs\":19,\"./../helpers/isAbsoluteURL\":21,\"./../utils\":26,\"./transformData\":14}],12:[function(e,t,r){\"use strict\";t.exports=function(e,t,r,n,a){return e.config=t,r&&(e.code=r),e.request=n,e.response=a,e}},{}],13:[function(e,t,r){\"use strict\";var a=e(\"./createError\");t.exports=function(e,t,r){var n=r.config.validateStatus;r.status&&n&&!n(r.status)?t(a(\"Request failed with status code \"+r.status,r.config,null,r.request,r)):e(r)}},{\"./createError\":10}],14:[function(e,t,r){\"use strict\";var utils=e(\"./../utils\");t.exports=function(t,r,e){return utils.forEach(e,function(e){t=e(t,r)}),t}},{\"./../utils\":26}],15:[function(i,u,e){(function(e){\"use strict\";var utils=i(\"./utils\"),r=i(\"./helpers/normalizeHeaderName\"),t={\"Content-Type\":\"application/x-www-form-urlencoded\"};function n(e,t){!utils.isUndefined(e)&&utils.isUndefined(e[\"Content-Type\"])&&(e[\"Content-Type\"]=t)}var a,o={adapter:(\"undefined\"!=typeof XMLHttpRequest?a=i(\"./adapters/xhr\"):void 0!==e&&(a=i(\"./adapters/http\")),a),transformRequest:[function(e,t){return r(t,\"Content-Type\"),utils.isFormData(e)||utils.isArrayBuffer(e)||utils.isBuffer(e)||utils.isStream(e)||utils.isFile(e)||utils.isBlob(e)?e:utils.isArrayBufferView(e)?e.buffer:utils.isURLSearchParams(e)?(n(t,\"application/x-www-form-urlencoded;charset=utf-8\"),e.toString()):utils.isObject(e)?(n(t,\"application/json;charset=utf-8\"),JSON.stringify(e)):e}],transformResponse:[function(e){if(\"string\"==typeof e)try{e=JSON.parse(e)}catch(e){}return e}],timeout:0,xsrfCookieName:\"XSRF-TOKEN\",xsrfHeaderName:\"X-XSRF-TOKEN\",maxContentLength:-1,validateStatus:function(e){return 200<=e&&e<300}};o.headers={common:{Accept:\"application/json, text/plain, */*\"}},utils.forEach([\"delete\",\"get\",\"head\"],function(e){o.headers[e]={}}),utils.forEach([\"post\",\"put\",\"patch\"],function(e){o.headers[e]=utils.merge(t)}),u.exports=o}).call(this,i(\"_process\"))},{\"./adapters/http\":3,\"./adapters/xhr\":3,\"./helpers/normalizeHeaderName\":23,\"./utils\":26,_process:33}],16:[function(e,t,r){\"use strict\";t.exports=function(r,n){return function(){for(var e=new Array(arguments.length),t=0;t<e.length;t++)e[t]=arguments[t];return r.apply(n,e)}}},{}],17:[function(e,t,r){\"use strict\";function u(){this.message=\"String contains an invalid character\"}(u.prototype=new Error).code=5,u.prototype.name=\"InvalidCharacterError\",t.exports=function(e){for(var t,r,n=String(e),a=\"\",o=0,i=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";n.charAt(0|o)||(i=\"=\",o%1);a+=i.charAt(63&t>>8-o%1*8)){if(255<(r=n.charCodeAt(o+=.75)))throw new u;t=t<<8|r}return a}},{}],18:[function(e,t,r){\"use strict\";var utils=e(\"./../utils\");function o(e){return encodeURIComponent(e).replace(/%40/gi,\"@\").replace(/%3A/gi,\":\").replace(/%24/g,\"$\").replace(/%2C/gi,\",\").replace(/%20/g,\"+\").replace(/%5B/gi,\"[\").replace(/%5D/gi,\"]\")}t.exports=function(e,t,r){if(!t)return e;var n;if(r)n=r(t);else if(utils.isURLSearchParams(t))n=t.toString();else{var a=[];utils.forEach(t,function(e,t){null!=e&&(utils.isArray(e)?t+=\"[]\":e=[e],utils.forEach(e,function(e){utils.isDate(e)?e=e.toISOString():utils.isObject(e)&&(e=JSON.stringify(e)),a.push(o(t)+\"=\"+o(e))}))}),n=a.join(\"&\")}return n&&(e+=(-1===e.indexOf(\"?\")?\"?\":\"&\")+n),e}},{\"./../utils\":26}],19:[function(e,t,r){\"use strict\";t.exports=function(e,t){return t?e.replace(/\\/+$/,\"\")+\"/\"+t.replace(/^\\/+/,\"\"):e}},{}],20:[function(e,t,r){\"use strict\";var utils=e(\"./../utils\");t.exports=utils.isStandardBrowserEnv()?{write:function(e,t,r,n,a,o){var i=[];i.push(e+\"=\"+encodeURIComponent(t)),utils.isNumber(r)&&i.push(\"expires=\"+new Date(r).toGMTString()),utils.isString(n)&&i.push(\"path=\"+n),utils.isString(a)&&i.push(\"domain=\"+a),!0===o&&i.push(\"secure\"),document.cookie=i.join(\"; \")},read:function(e){var t=document.cookie.match(new RegExp(\"(^|;\\\\s*)(\"+e+\")=([^;]*)\"));return t?decodeURIComponent(t[3]):null},remove:function(e){this.write(e,\"\",Date.now()-864e5)}}:{write:function(){},read:function(){return null},remove:function(){}}},{\"./../utils\":26}],21:[function(e,t,r){\"use strict\";t.exports=function(e){return/^([a-z][a-z\\d\\+\\-\\.]*:)?\\/\\//i.test(e)}},{}],22:[function(e,t,r){\"use strict\";var utils=e(\"./../utils\");t.exports=utils.isStandardBrowserEnv()?function(){var r,n=/(msie|trident)/i.test(navigator.userAgent),a=document.createElement(\"a\");function o(e){var t=e;return n&&(a.setAttribute(\"href\",t),t=a.href),a.setAttribute(\"href\",t),{href:a.href,protocol:a.protocol?a.protocol.replace(/:$/,\"\"):\"\",host:a.host,search:a.search?a.search.replace(/^\\?/,\"\"):\"\",hash:a.hash?a.hash.replace(/^#/,\"\"):\"\",hostname:a.hostname,port:a.port,pathname:\"/\"===a.pathname.charAt(0)?a.pathname:\"/\"+a.pathname}}return r=o(window.location.href),function(e){var t=utils.isString(e)?o(e):e;return t.protocol===r.protocol&&t.host===r.host}}():function(){return!0}},{\"./../utils\":26}],23:[function(e,t,r){\"use strict\";var utils=e(\"../utils\");t.exports=function(r,n){utils.forEach(r,function(e,t){t!==n&&t.toUpperCase()===n.toUpperCase()&&(r[n]=e,delete r[t])})}},{\"../utils\":26}],24:[function(e,t,r){\"use strict\";var utils=e(\"./../utils\"),o=[\"age\",\"authorization\",\"content-length\",\"content-type\",\"etag\",\"expires\",\"from\",\"host\",\"if-modified-since\",\"if-unmodified-since\",\"last-modified\",\"location\",\"max-forwards\",\"proxy-authorization\",\"referer\",\"retry-after\",\"user-agent\"];t.exports=function(e){var t,r,n,a={};return e&&utils.forEach(e.split(\"\\n\"),function(e){if(n=e.indexOf(\":\"),t=utils.trim(e.substr(0,n)).toLowerCase(),r=utils.trim(e.substr(n+1)),t){if(a[t]&&0<=o.indexOf(t))return;a[t]=\"set-cookie\"===t?(a[t]?a[t]:[]).concat([r]):a[t]?a[t]+\", \"+r:r}}),a}},{\"./../utils\":26}],25:[function(e,t,r){\"use strict\";t.exports=function(t){return function(e){return t.apply(null,e)}}},{}],26:[function(e,t,r){\"use strict\";var a=e(\"./helpers/bind\"),n=e(\"is-buffer\"),o=Object.prototype.toString;function i(e){return\"[object Array]\"===o.call(e)}function u(e){return null!==e&&\"object\"==typeof e}function s(e){return\"[object Function]\"===o.call(e)}function l(e,t){if(null!=e)if(\"object\"!=typeof e&&(e=[e]),i(e))for(var r=0,n=e.length;r<n;r++)t.call(null,e[r],r,e);else for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&t.call(null,e[a],a,e)}t.exports={isArray:i,isArrayBuffer:function(e){return\"[object ArrayBuffer]\"===o.call(e)},isBuffer:n,isFormData:function(e){return\"undefined\"!=typeof FormData&&e instanceof FormData},isArrayBufferView:function(e){return\"undefined\"!=typeof ArrayBuffer&&ArrayBuffer.isView?ArrayBuffer.isView(e):e&&e.buffer&&e.buffer instanceof ArrayBuffer},isString:function(e){return\"string\"==typeof e},isNumber:function(e){return\"number\"==typeof e},isObject:u,isUndefined:function(e){return void 0===e},isDate:function(e){return\"[object Date]\"===o.call(e)},isFile:function(e){return\"[object File]\"===o.call(e)},isBlob:function(e){return\"[object Blob]\"===o.call(e)},isFunction:s,isStream:function(e){return u(e)&&s(e.pipe)},isURLSearchParams:function(e){return\"undefined\"!=typeof URLSearchParams&&e instanceof URLSearchParams},isStandardBrowserEnv:function(){return(\"undefined\"==typeof navigator||\"ReactNative\"!==navigator.product)&&void 0!==window&&void 0!==document},forEach:l,merge:function r(){var n={};function e(e,t){\"object\"==typeof n[t]&&\"object\"==typeof e?n[t]=r(n[t],e):n[t]=e}for(var t=0,a=arguments.length;t<a;t++)l(arguments[t],e);return n},extend:function(r,e,n){return l(e,function(e,t){r[t]=n&&\"function\"==typeof e?a(e,n):e}),r},trim:function(e){return e.replace(/^\\s*/,\"\").replace(/\\s*$/,\"\")}}},{\"./helpers/bind\":16,\"is-buffer\":32}],27:[function(e,t,r){t.exports={CssSelectorParser:e(\"./lib/css-selector-parser.js\").CssSelectorParser}},{\"./lib/css-selector-parser.js\":28}],28:[function(e,t,r){function n(){this.pseudos={},this.attrEqualityMods={},this.ruleNestingOperators={},this.substitutesEnabled=!1}function o(e){return\"a\"<=e&&e<=\"f\"||\"A\"<=e&&e<=\"F\"||\"0\"<=e&&e<=\"9\"}n.prototype.registerSelectorPseudos=function(e){for(var t=0,r=arguments.length;t<r;t++)e=arguments[t],this.pseudos[e]=\"selector\";return this},n.prototype.unregisterSelectorPseudos=function(e){for(var t=0,r=arguments.length;t<r;t++)e=arguments[t],delete this.pseudos[e];return this},n.prototype.registerNumericPseudos=function(e){for(var t=0,r=arguments.length;t<r;t++)e=arguments[t],this.pseudos[e]=\"numeric\";return this},n.prototype.unregisterNumericPseudos=function(e){for(var t=0,r=arguments.length;t<r;t++)e=arguments[t],delete this.pseudos[e];return this},n.prototype.registerNestingOperators=function(e){for(var t=0,r=arguments.length;t<r;t++)e=arguments[t],this.ruleNestingOperators[e]=!0;return this},n.prototype.unregisterNestingOperators=function(e){for(var t=0,r=arguments.length;t<r;t++)e=arguments[t],delete this.ruleNestingOperators[e];return this},n.prototype.registerAttrEqualityMods=function(e){for(var t=0,r=arguments.length;t<r;t++)e=arguments[t],this.attrEqualityMods[e]=!0;return this},n.prototype.unregisterAttrEqualityMods=function(e){for(var t=0,r=arguments.length;t<r;t++)e=arguments[t],delete this.attrEqualityMods[e];return this},n.prototype.enableSubstitutes=function(){return this.substitutesEnabled=!0,this},n.prototype.disableSubstitutes=function(){return this.substitutesEnabled=!1,this};var u={\"!\":!0,'\"':!0,\"#\":!0,$:!0,\"%\":!0,\"&\":!0,\"'\":!0,\"(\":!0,\")\":!0,\"*\":!0,\"+\":!0,\",\":!0,\".\":!0,\"/\":!0,\";\":!0,\"<\":!0,\"=\":!0,\">\":!0,\"?\":!0,\"@\":!0,\"[\":!0,\"\\\\\":!0,\"]\":!0,\"^\":!0,\"`\":!0,\"{\":!0,\"|\":!0,\"}\":!0,\"~\":!0},i={\"\\n\":\"\\\\n\",\"\\r\":\"\\\\r\",\"\\t\":\"\\\\t\",\"\\f\":\"\\\\f\",\"\\v\":\"\\\\v\"},y={n:\"\\n\",r:\"\\r\",t:\"\\t\",f:\"\\f\",\"\\\\\":\"\\\\\",\"'\":\"'\"},v={n:\"\\n\",r:\"\\r\",t:\"\\t\",f:\"\\f\",\"\\\\\":\"\\\\\",'\"':'\"'};function a(s,l,c,d,a,m){var p,f,h,b,g;return b=s.length,p=null,h=function(e,t){var r,n,a;for(a=\"\",l++,p=s.charAt(l);l<b;){if(p===e)return l++,a;if(\"\\\\\"===p)if(l++,(p=s.charAt(l))===e)a+=e;else if(r=t[p])a+=r;else{if(o(p)){for(n=p,l++,p=s.charAt(l);o(p);)n+=p,l++,p=s.charAt(l);\" \"===p&&(l++,p=s.charAt(l)),a+=String.fromCharCode(parseInt(n,16));continue}a+=p}else a+=p;l++,p=s.charAt(l)}return a},f=function(){var e,t=\"\";for(p=s.charAt(l);l<b;){if(\"a\"<=(e=p)&&e<=\"z\"||\"A\"<=e&&e<=\"Z\"||\"0\"<=e&&e<=\"9\"||\"-\"===e||\"_\"===e)t+=p;else{if(\"\\\\\"!==p)return t;if(b<=++l)throw Error(\"Expected symbol but end of file reached.\");if(p=s.charAt(l),u[p])t+=p;else{if(o(p)){var r=p;for(l++,p=s.charAt(l);o(p);)r+=p,l++,p=s.charAt(l);\" \"===p&&(l++,p=s.charAt(l)),t+=String.fromCharCode(parseInt(r,16));continue}t+=p}}l++,p=s.charAt(l)}return t},g=function(){p=s.charAt(l);for(var e=!1;\" \"===p||\"\\t\"===p||\"\\n\"===p||\"\\r\"===p||\"\\f\"===p;)e=!0,l++,p=s.charAt(l);return e},this.parse=function(){var e=this.parseSelector();if(l<b)throw Error('Rule expected but \"'+s.charAt(l)+'\" found.');return e},this.parseSelector=function(){var e,t=e=this.parseSingleSelector();for(p=s.charAt(l);\",\"===p;){if(l++,g(),\"selectors\"!==e.type&&(e={type:\"selectors\",selectors:[t]}),!(t=this.parseSingleSelector()))throw Error('Rule expected after \",\".');e.selectors.push(t)}return e},this.parseSingleSelector=function(){g();var e={type:\"ruleSet\"},t=this.parseRule();if(!t)return null;for(var r=e;t&&(t.type=\"rule\",r.rule=t,r=t,g(),p=s.charAt(l),!(b<=l||\",\"===p||\")\"===p));)if(a[p]){var n=p;if(l++,g(),!(t=this.parseRule()))throw Error('Rule expected after \"'+n+'\".');t.nestingOperator=n}else(t=this.parseRule())&&(t.nestingOperator=null);return e},this.parseRule=function(){for(var e,t=null;l<b;)if(\"*\"===(p=s.charAt(l)))l++,(t=t||{}).tagName=\"*\";else if(\"a\"<=(e=p)&&e<=\"z\"||\"A\"<=e&&e<=\"Z\"||\"-\"===e||\"_\"===e||\"\\\\\"===p)(t=t||{}).tagName=f();else if(\".\"===p)l++,((t=t||{}).classNames=t.classNames||[]).push(f());else if(\"#\"===p)l++,(t=t||{}).id=f();else if(\"[\"===p){l++,g();var r={name:f()};if(g(),\"]\"===p)l++;else{var n=\"\";if(d[p]&&(n=p,l++,p=s.charAt(l)),b<=l)throw Error('Expected \"=\" but end of file reached.');if(\"=\"!==p)throw Error('Expected \"=\" but \"'+p+'\" found.');r.operator=n+\"=\",l++,g();var a=\"\";if(r.valueType=\"string\",'\"'===p)a=h('\"',v);else if(\"'\"===p)a=h(\"'\",y);else if(m&&\"$\"===p)l++,a=f(),r.valueType=\"substitute\";else{for(;l<b&&\"]\"!==p;)a+=p,l++,p=s.charAt(l);a=a.trim()}if(g(),b<=l)throw Error('Expected \"]\" but end of file reached.');if(\"]\"!==p)throw Error('Expected \"]\" but \"'+p+'\" found.');l++,r.value=a}((t=t||{}).attrs=t.attrs||[]).push(r)}else{if(\":\"!==p)break;l++;var o=f(),i={name:o};if(\"(\"===p){l++;var u=\"\";if(g(),\"selector\"===c[o])i.valueType=\"selector\",u=this.parseSelector();else{if(i.valueType=c[o]||\"string\",'\"'===p)u=h('\"',v);else if(\"'\"===p)u=h(\"'\",y);else if(m&&\"$\"===p)l++,u=f(),i.valueType=\"substitute\";else{for(;l<b&&\")\"!==p;)u+=p,l++,p=s.charAt(l);u=u.trim()}g()}if(b<=l)throw Error('Expected \")\" but end of file reached.');if(\")\"!==p)throw Error('Expected \")\" but \"'+p+'\" found.');l++,i.value=u}((t=t||{}).pseudos=t.pseudos||[]).push(i)}return t},this}n.prototype.parse=function(e){return new a(e,0,this.pseudos,this.attrEqualityMods,this.ruleNestingOperators,this.substitutesEnabled).parse()},n.prototype.escapeIdentifier=function(e){for(var t=\"\",r=0,n=e.length;r<n;){var a=e.charAt(r);if(u[a])t+=\"\\\\\"+a;else if(\"_\"===a||\"-\"===a||\"A\"<=a&&a<=\"Z\"||\"a\"<=a&&a<=\"z\"||0!==r&&\"0\"<=a&&a<=\"9\")t+=a;else{var o=a.charCodeAt(0);if(55296==(63488&o)){var i=e.charCodeAt(r++);if(55296!=(64512&o)||56320!=(64512&i))throw Error(\"UCS-2(decode): illegal sequence\");o=((1023&o)<<10)+(1023&i)+65536}t+=\"\\\\\"+o.toString(16)+\" \"}r++}return t},n.prototype.escapeStr=function(e){for(var t,r,n=\"\",a=0,o=e.length;a<o;)'\"'===(t=e.charAt(a))?t='\\\\\"':\"\\\\\"===t?t=\"\\\\\\\\\":(r=i[t])&&(t=r),n+=t,a++;return'\"'+n+'\"'},n.prototype.render=function(e){return this._renderEntity(e).trim()},n.prototype._renderEntity=function(e){var t,r,n;switch(n=\"\",e.type){case\"ruleSet\":for(t=e.rule,r=[];t;)t.nestingOperator&&r.push(t.nestingOperator),r.push(this._renderEntity(t)),t=t.rule;n=r.join(\" \");break;case\"selectors\":n=e.selectors.map(this._renderEntity,this).join(\", \");break;case\"rule\":e.tagName&&(n=\"*\"===e.tagName?\"*\":this.escapeIdentifier(e.tagName)),e.id&&(n+=\"#\"+this.escapeIdentifier(e.id)),e.classNames&&(n+=e.classNames.map(function(e){return\".\"+this.escapeIdentifier(e)},this).join(\"\")),e.attrs&&(n+=e.attrs.map(function(e){return e.operator?\"substitute\"===e.valueType?\"[\"+this.escapeIdentifier(e.name)+e.operator+\"$\"+e.value+\"]\":\"[\"+this.escapeIdentifier(e.name)+e.operator+this.escapeStr(e.value)+\"]\":\"[\"+this.escapeIdentifier(e.name)+\"]\"},this).join(\"\")),e.pseudos&&(n+=e.pseudos.map(function(e){return e.valueType?\"selector\"===e.valueType?\":\"+this.escapeIdentifier(e.name)+\"(\"+this._renderEntity(e.value)+\")\":\"substitute\"===e.valueType?\":\"+this.escapeIdentifier(e.name)+\"($\"+e.value+\")\":\"numeric\"===e.valueType?\":\"+this.escapeIdentifier(e.name)+\"(\"+e.value+\")\":\":\"+this.escapeIdentifier(e.name)+\"(\"+this.escapeIdentifier(e.value)+\")\":\":\"+this.escapeIdentifier(e.name)},this).join(\"\"));break;default:throw Error('Unknown entity type: \"'+e.type(NaN))}return n},r.CssSelectorParser=n},{}],29:[function(e,t,r){!function(){\"use strict\";var s,l={name:\"doT\",version:\"1.1.1\",templateSettings:{evaluate:/\\{\\{([\\s\\S]+?(\\}?)+)\\}\\}/g,interpolate:/\\{\\{=([\\s\\S]+?)\\}\\}/g,encode:/\\{\\{!([\\s\\S]+?)\\}\\}/g,use:/\\{\\{#([\\s\\S]+?)\\}\\}/g,useParams:/(^|[^\\w$])def(?:\\.|\\[[\\'\\\"])([\\w$\\.]+)(?:[\\'\\\"]\\])?\\s*\\:\\s*([\\w$\\.]+|\\\"[^\\\"]+\\\"|\\'[^\\']+\\'|\\{[^\\}]+\\})/g,define:/\\{\\{##\\s*([\\w\\.$]+)\\s*(\\:|=)([\\s\\S]+?)#\\}\\}/g,defineParams:/^\\s*([\\w$]+):([\\s\\S]+)/,conditional:/\\{\\{\\?(\\?)?\\s*([\\s\\S]*?)\\s*\\}\\}/g,iterate:/\\{\\{~\\s*(?:\\}\\}|([\\s\\S]+?)\\s*\\:\\s*([\\w$]+)\\s*(?:\\:\\s*([\\w$]+))?\\s*\\}\\})/g,varname:\"it\",strip:!0,append:!0,selfcontained:!1,doNotSkipEncoded:!1},template:void 0,compile:void 0,log:!0};l.encodeHTMLSource=function(e){var t={\"&\":\"&#38;\",\"<\":\"&#60;\",\">\":\"&#62;\",'\"':\"&#34;\",\"'\":\"&#39;\",\"/\":\"&#47;\"},r=e?/[&<>\"'\\/]/g:/&(?!#?\\w+;)|<|>|\"|'|\\//g;return function(e){return e?e.toString().replace(r,function(e){return t[e]||e}):\"\"}},s=function(){return this||(0,eval)(\"this\")}(),void 0!==t&&t.exports?t.exports=l:\"function\"==typeof define&&define.amd?define(function(){return l}):s.doT=l;var c={append:{start:\"'+(\",end:\")+'\",startencode:\"'+encodeHTML(\"},split:{start:\"';out+=(\",end:\");out+='\",startencode:\"';out+=encodeHTML(\"}},d=/$^/;function m(e){return e.replace(/\\\\('|\\\\)/g,\"$1\").replace(/[\\r\\t\\n]/g,\" \")}l.template=function(e,t,r){var n,a,o=(t=t||l.templateSettings).append?c.append:c.split,i=0,u=t.use||t.define?function n(a,e,o){return(\"string\"==typeof e?e:e.toString()).replace(a.define||d,function(e,n,t,r){return 0===n.indexOf(\"def.\")&&(n=n.substring(4)),n in o||(\":\"===t?(a.defineParams&&r.replace(a.defineParams,function(e,t,r){o[n]={arg:t,text:r}}),n in o||(o[n]=r)):new Function(\"def\",\"def['\"+n+\"']=\"+r)(o)),\"\"}).replace(a.use||d,function(e,t){a.useParams&&(t=t.replace(a.useParams,function(e,t,r,n){if(o[r]&&o[r].arg&&n){var a=(r+\":\"+n).replace(/'|\\\\/g,\"_\");return o.__exp=o.__exp||{},o.__exp[a]=o[r].text.replace(new RegExp(\"(^|[^\\\\w$])\"+o[r].arg+\"([^\\\\w$])\",\"g\"),\"$1\"+n+\"$2\"),t+\"def.__exp['\"+a+\"']\"}}));var r=new Function(\"def\",\"return \"+t)(o);return r?n(a,r,o):r})}(t,e,r||{}):e;u=(\"var out='\"+(t.strip?u.replace(/(^|\\r|\\n)\\t* +| +\\t*(\\r|\\n|$)/g,\" \").replace(/\\r|\\n|\\t|\\/\\*[\\s\\S]*?\\*\\//g,\"\"):u).replace(/'|\\\\/g,\"\\\\$&\").replace(t.interpolate||d,function(e,t){return o.start+m(t)+o.end}).replace(t.encode||d,function(e,t){return n=!0,o.startencode+m(t)+o.end}).replace(t.conditional||d,function(e,t,r){return t?r?\"';}else if(\"+m(r)+\"){out+='\":\"';}else{out+='\":r?\"';if(\"+m(r)+\"){out+='\":\"';}out+='\"}).replace(t.iterate||d,function(e,t,r,n){return t?(i+=1,a=n||\"i\"+i,t=m(t),\"';var arr\"+i+\"=\"+t+\";if(arr\"+i+\"){var \"+r+\",\"+a+\"=-1,l\"+i+\"=arr\"+i+\".length-1;while(\"+a+\"<l\"+i+\"){\"+r+\"=arr\"+i+\"[\"+a+\"+=1];out+='\"):\"';} } out+='\"}).replace(t.evaluate||d,function(e,t){return\"';\"+m(t)+\"out+='\"})+\"';return out;\").replace(/\\n/g,\"\\\\n\").replace(/\\t/g,\"\\\\t\").replace(/\\r/g,\"\\\\r\").replace(/(\\s|;|\\}|^|\\{)out\\+='';/g,\"$1\").replace(/\\+''/g,\"\"),n&&(t.selfcontained||!s||s._encodeHTML||(s._encodeHTML=l.encodeHTMLSource(t.doNotSkipEncoded)),u=\"var encodeHTML = typeof _encodeHTML !== 'undefined' ? _encodeHTML : (\"+l.encodeHTMLSource.toString()+\"(\"+(t.doNotSkipEncoded||\"\")+\"));\"+u);try{return new Function(t.varname,u)}catch(e){throw\"undefined\"!=typeof console&&console.log(\"Could not create a template function: \"+u),e}},l.compile=function(e,t){return l.template(e,null,t)}}()},{}],30:[function(e,t,r){\"use strict\";t.exports=function(){return/\\uD83C\\uDFF4\\uDB40\\uDC67\\uDB40\\uDC62(?:\\uDB40\\uDC65\\uDB40\\uDC6E\\uDB40\\uDC67|\\uDB40\\uDC73\\uDB40\\uDC63\\uDB40\\uDC74|\\uDB40\\uDC77\\uDB40\\uDC6C\\uDB40\\uDC73)\\uDB40\\uDC7F|\\uD83D\\uDC68(?:\\uD83C\\uDFFC\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68\\uD83C\\uDFFB|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFF\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB-\\uDFFE])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFE\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB-\\uDFFD])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFD\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB\\uDFFC])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\u200D(?:\\u2764\\uFE0F\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83D\\uDC68|(?:\\uD83D[\\uDC68\\uDC69])\\u200D(?:\\uD83D\\uDC66\\u200D\\uD83D\\uDC66|\\uD83D\\uDC67\\u200D(?:\\uD83D[\\uDC66\\uDC67]))|\\uD83D\\uDC66\\u200D\\uD83D\\uDC66|\\uD83D\\uDC67\\u200D(?:\\uD83D[\\uDC66\\uDC67])|(?:\\uD83D[\\uDC68\\uDC69])\\u200D(?:\\uD83D[\\uDC66\\uDC67])|[\\u2695\\u2696\\u2708]\\uFE0F|\\uD83D[\\uDC66\\uDC67]|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|(?:\\uD83C\\uDFFB\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFF\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFE\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFD\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFC\\u200D[\\u2695\\u2696\\u2708])\\uFE0F|\\uD83C\\uDFFB\\u200D(?:\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C[\\uDFFB-\\uDFFF])|(?:\\uD83E\\uDDD1\\uD83C\\uDFFB\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1|\\uD83D\\uDC69\\uD83C\\uDFFC\\u200D\\uD83E\\uDD1D\\u200D\\uD83D\\uDC69)\\uD83C\\uDFFB|\\uD83E\\uDDD1(?:\\uD83C\\uDFFF\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1(?:\\uD83C[\\uDFFB-\\uDFFF])|\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1)|(?:\\uD83E\\uDDD1\\uD83C\\uDFFE\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1|\\uD83D\\uDC69\\uD83C\\uDFFF\\u200D\\uD83E\\uDD1D\\u200D(?:\\uD83D[\\uDC68\\uDC69]))(?:\\uD83C[\\uDFFB-\\uDFFE])|(?:\\uD83E\\uDDD1\\uD83C\\uDFFC\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1|\\uD83D\\uDC69\\uD83C\\uDFFD\\u200D\\uD83E\\uDD1D\\u200D\\uD83D\\uDC69)(?:\\uD83C[\\uDFFB\\uDFFC])|\\uD83D\\uDC69(?:\\uD83C\\uDFFE\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB-\\uDFFD\\uDFFF])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFC\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB\\uDFFD-\\uDFFF])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFB\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFC-\\uDFFF])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFD\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\u200D(?:\\u2764\\uFE0F\\u200D(?:\\uD83D\\uDC8B\\u200D(?:\\uD83D[\\uDC68\\uDC69])|\\uD83D[\\uDC68\\uDC69])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFF\\u200D(?:\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD]))|\\uD83D\\uDC69\\u200D\\uD83D\\uDC69\\u200D(?:\\uD83D\\uDC66\\u200D\\uD83D\\uDC66|\\uD83D\\uDC67\\u200D(?:\\uD83D[\\uDC66\\uDC67]))|(?:\\uD83E\\uDDD1\\uD83C\\uDFFD\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1|\\uD83D\\uDC69\\uD83C\\uDFFE\\u200D\\uD83E\\uDD1D\\u200D\\uD83D\\uDC69)(?:\\uD83C[\\uDFFB-\\uDFFD])|\\uD83D\\uDC69\\u200D\\uD83D\\uDC66\\u200D\\uD83D\\uDC66|\\uD83D\\uDC69\\u200D\\uD83D\\uDC69\\u200D(?:\\uD83D[\\uDC66\\uDC67])|(?:\\uD83D\\uDC41\\uFE0F\\u200D\\uD83D\\uDDE8|\\uD83D\\uDC69(?:\\uD83C\\uDFFF\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFE\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFC\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFB\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFD\\u200D[\\u2695\\u2696\\u2708]|\\u200D[\\u2695\\u2696\\u2708])|(?:(?:\\u26F9|\\uD83C[\\uDFCB\\uDFCC]|\\uD83D\\uDD75)\\uFE0F|\\uD83D\\uDC6F|\\uD83E[\\uDD3C\\uDDDE\\uDDDF])\\u200D[\\u2640\\u2642]|(?:\\u26F9|\\uD83C[\\uDFCB\\uDFCC]|\\uD83D\\uDD75)(?:\\uD83C[\\uDFFB-\\uDFFF])\\u200D[\\u2640\\u2642]|(?:\\uD83C[\\uDFC3\\uDFC4\\uDFCA]|\\uD83D[\\uDC6E\\uDC71\\uDC73\\uDC77\\uDC81\\uDC82\\uDC86\\uDC87\\uDE45-\\uDE47\\uDE4B\\uDE4D\\uDE4E\\uDEA3\\uDEB4-\\uDEB6]|\\uD83E[\\uDD26\\uDD37-\\uDD39\\uDD3D\\uDD3E\\uDDB8\\uDDB9\\uDDCD-\\uDDCF\\uDDD6-\\uDDDD])(?:(?:\\uD83C[\\uDFFB-\\uDFFF])\\u200D[\\u2640\\u2642]|\\u200D[\\u2640\\u2642])|\\uD83C\\uDFF4\\u200D\\u2620)\\uFE0F|\\uD83D\\uDC69\\u200D\\uD83D\\uDC67\\u200D(?:\\uD83D[\\uDC66\\uDC67])|\\uD83C\\uDFF3\\uFE0F\\u200D\\uD83C\\uDF08|\\uD83D\\uDC15\\u200D\\uD83E\\uDDBA|\\uD83D\\uDC69\\u200D\\uD83D\\uDC66|\\uD83D\\uDC69\\u200D\\uD83D\\uDC67|\\uD83C\\uDDFD\\uD83C\\uDDF0|\\uD83C\\uDDF4\\uD83C\\uDDF2|\\uD83C\\uDDF6\\uD83C\\uDDE6|[#\\*0-9]\\uFE0F\\u20E3|\\uD83C\\uDDE7(?:\\uD83C[\\uDDE6\\uDDE7\\uDDE9-\\uDDEF\\uDDF1-\\uDDF4\\uDDF6-\\uDDF9\\uDDFB\\uDDFC\\uDDFE\\uDDFF])|\\uD83C\\uDDF9(?:\\uD83C[\\uDDE6\\uDDE8\\uDDE9\\uDDEB-\\uDDED\\uDDEF-\\uDDF4\\uDDF7\\uDDF9\\uDDFB\\uDDFC\\uDDFF])|\\uD83C\\uDDEA(?:\\uD83C[\\uDDE6\\uDDE8\\uDDEA\\uDDEC\\uDDED\\uDDF7-\\uDDFA])|\\uD83E\\uDDD1(?:\\uD83C[\\uDFFB-\\uDFFF])|\\uD83C\\uDDF7(?:\\uD83C[\\uDDEA\\uDDF4\\uDDF8\\uDDFA\\uDDFC])|\\uD83D\\uDC69(?:\\uD83C[\\uDFFB-\\uDFFF])|\\uD83C\\uDDF2(?:\\uD83C[\\uDDE6\\uDDE8-\\uDDED\\uDDF0-\\uDDFF])|\\uD83C\\uDDE6(?:\\uD83C[\\uDDE8-\\uDDEC\\uDDEE\\uDDF1\\uDDF2\\uDDF4\\uDDF6-\\uDDFA\\uDDFC\\uDDFD\\uDDFF])|\\uD83C\\uDDF0(?:\\uD83C[\\uDDEA\\uDDEC-\\uDDEE\\uDDF2\\uDDF3\\uDDF5\\uDDF7\\uDDFC\\uDDFE\\uDDFF])|\\uD83C\\uDDED(?:\\uD83C[\\uDDF0\\uDDF2\\uDDF3\\uDDF7\\uDDF9\\uDDFA])|\\uD83C\\uDDE9(?:\\uD83C[\\uDDEA\\uDDEC\\uDDEF\\uDDF0\\uDDF2\\uDDF4\\uDDFF])|\\uD83C\\uDDFE(?:\\uD83C[\\uDDEA\\uDDF9])|\\uD83C\\uDDEC(?:\\uD83C[\\uDDE6\\uDDE7\\uDDE9-\\uDDEE\\uDDF1-\\uDDF3\\uDDF5-\\uDDFA\\uDDFC\\uDDFE])|\\uD83C\\uDDF8(?:\\uD83C[\\uDDE6-\\uDDEA\\uDDEC-\\uDDF4\\uDDF7-\\uDDF9\\uDDFB\\uDDFD-\\uDDFF])|\\uD83C\\uDDEB(?:\\uD83C[\\uDDEE-\\uDDF0\\uDDF2\\uDDF4\\uDDF7])|\\uD83C\\uDDF5(?:\\uD83C[\\uDDE6\\uDDEA-\\uDDED\\uDDF0-\\uDDF3\\uDDF7-\\uDDF9\\uDDFC\\uDDFE])|\\uD83C\\uDDFB(?:\\uD83C[\\uDDE6\\uDDE8\\uDDEA\\uDDEC\\uDDEE\\uDDF3\\uDDFA])|\\uD83C\\uDDF3(?:\\uD83C[\\uDDE6\\uDDE8\\uDDEA-\\uDDEC\\uDDEE\\uDDF1\\uDDF4\\uDDF5\\uDDF7\\uDDFA\\uDDFF])|\\uD83C\\uDDE8(?:\\uD83C[\\uDDE6\\uDDE8\\uDDE9\\uDDEB-\\uDDEE\\uDDF0-\\uDDF5\\uDDF7\\uDDFA-\\uDDFF])|\\uD83C\\uDDF1(?:\\uD83C[\\uDDE6-\\uDDE8\\uDDEE\\uDDF0\\uDDF7-\\uDDFB\\uDDFE])|\\uD83C\\uDDFF(?:\\uD83C[\\uDDE6\\uDDF2\\uDDFC])|\\uD83C\\uDDFC(?:\\uD83C[\\uDDEB\\uDDF8])|\\uD83C\\uDDFA(?:\\uD83C[\\uDDE6\\uDDEC\\uDDF2\\uDDF3\\uDDF8\\uDDFE\\uDDFF])|\\uD83C\\uDDEE(?:\\uD83C[\\uDDE8-\\uDDEA\\uDDF1-\\uDDF4\\uDDF6-\\uDDF9])|\\uD83C\\uDDEF(?:\\uD83C[\\uDDEA\\uDDF2\\uDDF4\\uDDF5])|(?:\\uD83C[\\uDFC3\\uDFC4\\uDFCA]|\\uD83D[\\uDC6E\\uDC71\\uDC73\\uDC77\\uDC81\\uDC82\\uDC86\\uDC87\\uDE45-\\uDE47\\uDE4B\\uDE4D\\uDE4E\\uDEA3\\uDEB4-\\uDEB6]|\\uD83E[\\uDD26\\uDD37-\\uDD39\\uDD3D\\uDD3E\\uDDB8\\uDDB9\\uDDCD-\\uDDCF\\uDDD6-\\uDDDD])(?:\\uD83C[\\uDFFB-\\uDFFF])|(?:\\u26F9|\\uD83C[\\uDFCB\\uDFCC]|\\uD83D\\uDD75)(?:\\uD83C[\\uDFFB-\\uDFFF])|(?:[\\u261D\\u270A-\\u270D]|\\uD83C[\\uDF85\\uDFC2\\uDFC7]|\\uD83D[\\uDC42\\uDC43\\uDC46-\\uDC50\\uDC66\\uDC67\\uDC6B-\\uDC6D\\uDC70\\uDC72\\uDC74-\\uDC76\\uDC78\\uDC7C\\uDC83\\uDC85\\uDCAA\\uDD74\\uDD7A\\uDD90\\uDD95\\uDD96\\uDE4C\\uDE4F\\uDEC0\\uDECC]|\\uD83E[\\uDD0F\\uDD18-\\uDD1C\\uDD1E\\uDD1F\\uDD30-\\uDD36\\uDDB5\\uDDB6\\uDDBB\\uDDD2-\\uDDD5])(?:\\uD83C[\\uDFFB-\\uDFFF])|(?:[\\u231A\\u231B\\u23E9-\\u23EC\\u23F0\\u23F3\\u25FD\\u25FE\\u2614\\u2615\\u2648-\\u2653\\u267F\\u2693\\u26A1\\u26AA\\u26AB\\u26BD\\u26BE\\u26C4\\u26C5\\u26CE\\u26D4\\u26EA\\u26F2\\u26F3\\u26F5\\u26FA\\u26FD\\u2705\\u270A\\u270B\\u2728\\u274C\\u274E\\u2753-\\u2755\\u2757\\u2795-\\u2797\\u27B0\\u27BF\\u2B1B\\u2B1C\\u2B50\\u2B55]|\\uD83C[\\uDC04\\uDCCF\\uDD8E\\uDD91-\\uDD9A\\uDDE6-\\uDDFF\\uDE01\\uDE1A\\uDE2F\\uDE32-\\uDE36\\uDE38-\\uDE3A\\uDE50\\uDE51\\uDF00-\\uDF20\\uDF2D-\\uDF35\\uDF37-\\uDF7C\\uDF7E-\\uDF93\\uDFA0-\\uDFCA\\uDFCF-\\uDFD3\\uDFE0-\\uDFF0\\uDFF4\\uDFF8-\\uDFFF]|\\uD83D[\\uDC00-\\uDC3E\\uDC40\\uDC42-\\uDCFC\\uDCFF-\\uDD3D\\uDD4B-\\uDD4E\\uDD50-\\uDD67\\uDD7A\\uDD95\\uDD96\\uDDA4\\uDDFB-\\uDE4F\\uDE80-\\uDEC5\\uDECC\\uDED0-\\uDED2\\uDED5\\uDEEB\\uDEEC\\uDEF4-\\uDEFA\\uDFE0-\\uDFEB]|\\uD83E[\\uDD0D-\\uDD3A\\uDD3C-\\uDD45\\uDD47-\\uDD71\\uDD73-\\uDD76\\uDD7A-\\uDDA2\\uDDA5-\\uDDAA\\uDDAE-\\uDDCA\\uDDCD-\\uDDFF\\uDE70-\\uDE73\\uDE78-\\uDE7A\\uDE80-\\uDE82\\uDE90-\\uDE95])|(?:[#\\*0-9\\xA9\\xAE\\u203C\\u2049\\u2122\\u2139\\u2194-\\u2199\\u21A9\\u21AA\\u231A\\u231B\\u2328\\u23CF\\u23E9-\\u23F3\\u23F8-\\u23FA\\u24C2\\u25AA\\u25AB\\u25B6\\u25C0\\u25FB-\\u25FE\\u2600-\\u2604\\u260E\\u2611\\u2614\\u2615\\u2618\\u261D\\u2620\\u2622\\u2623\\u2626\\u262A\\u262E\\u262F\\u2638-\\u263A\\u2640\\u2642\\u2648-\\u2653\\u265F\\u2660\\u2663\\u2665\\u2666\\u2668\\u267B\\u267E\\u267F\\u2692-\\u2697\\u2699\\u269B\\u269C\\u26A0\\u26A1\\u26AA\\u26AB\\u26B0\\u26B1\\u26BD\\u26BE\\u26C4\\u26C5\\u26C8\\u26CE\\u26CF\\u26D1\\u26D3\\u26D4\\u26E9\\u26EA\\u26F0-\\u26F5\\u26F7-\\u26FA\\u26FD\\u2702\\u2705\\u2708-\\u270D\\u270F\\u2712\\u2714\\u2716\\u271D\\u2721\\u2728\\u2733\\u2734\\u2744\\u2747\\u274C\\u274E\\u2753-\\u2755\\u2757\\u2763\\u2764\\u2795-\\u2797\\u27A1\\u27B0\\u27BF\\u2934\\u2935\\u2B05-\\u2B07\\u2B1B\\u2B1C\\u2B50\\u2B55\\u3030\\u303D\\u3297\\u3299]|\\uD83C[\\uDC04\\uDCCF\\uDD70\\uDD71\\uDD7E\\uDD7F\\uDD8E\\uDD91-\\uDD9A\\uDDE6-\\uDDFF\\uDE01\\uDE02\\uDE1A\\uDE2F\\uDE32-\\uDE3A\\uDE50\\uDE51\\uDF00-\\uDF21\\uDF24-\\uDF93\\uDF96\\uDF97\\uDF99-\\uDF9B\\uDF9E-\\uDFF0\\uDFF3-\\uDFF5\\uDFF7-\\uDFFF]|\\uD83D[\\uDC00-\\uDCFD\\uDCFF-\\uDD3D\\uDD49-\\uDD4E\\uDD50-\\uDD67\\uDD6F\\uDD70\\uDD73-\\uDD7A\\uDD87\\uDD8A-\\uDD8D\\uDD90\\uDD95\\uDD96\\uDDA4\\uDDA5\\uDDA8\\uDDB1\\uDDB2\\uDDBC\\uDDC2-\\uDDC4\\uDDD1-\\uDDD3\\uDDDC-\\uDDDE\\uDDE1\\uDDE3\\uDDE8\\uDDEF\\uDDF3\\uDDFA-\\uDE4F\\uDE80-\\uDEC5\\uDECB-\\uDED2\\uDED5\\uDEE0-\\uDEE5\\uDEE9\\uDEEB\\uDEEC\\uDEF0\\uDEF3-\\uDEFA\\uDFE0-\\uDFEB]|\\uD83E[\\uDD0D-\\uDD3A\\uDD3C-\\uDD45\\uDD47-\\uDD71\\uDD73-\\uDD76\\uDD7A-\\uDDA2\\uDDA5-\\uDDAA\\uDDAE-\\uDDCA\\uDDCD-\\uDDFF\\uDE70-\\uDE73\\uDE78-\\uDE7A\\uDE80-\\uDE82\\uDE90-\\uDE95])\\uFE0F|(?:[\\u261D\\u26F9\\u270A-\\u270D]|\\uD83C[\\uDF85\\uDFC2-\\uDFC4\\uDFC7\\uDFCA-\\uDFCC]|\\uD83D[\\uDC42\\uDC43\\uDC46-\\uDC50\\uDC66-\\uDC78\\uDC7C\\uDC81-\\uDC83\\uDC85-\\uDC87\\uDC8F\\uDC91\\uDCAA\\uDD74\\uDD75\\uDD7A\\uDD90\\uDD95\\uDD96\\uDE45-\\uDE47\\uDE4B-\\uDE4F\\uDEA3\\uDEB4-\\uDEB6\\uDEC0\\uDECC]|\\uD83E[\\uDD0F\\uDD18-\\uDD1F\\uDD26\\uDD30-\\uDD39\\uDD3C-\\uDD3E\\uDDB5\\uDDB6\\uDDB8\\uDDB9\\uDDBB\\uDDCD-\\uDDCF\\uDDD1-\\uDDDD])/g}},{}],31:[function(V,r,n){(function(P,U){var e,t;e=this,t=function(){\"use strict\";function l(e){return\"function\"==typeof e}var r=Array.isArray?Array.isArray:function(e){return\"[object Array]\"===Object.prototype.toString.call(e)},n=0,t=void 0,a=void 0,u=function(e,t){m[n]=e,m[n+1]=t,2===(n+=2)&&(a?a(p):y())};var e=void 0!==window?window:void 0,o=e||{},i=o.MutationObserver||o.WebKitMutationObserver,s=\"undefined\"==typeof self&&void 0!==P&&\"[object process]\"==={}.toString.call(P),c=\"undefined\"!=typeof Uint8ClampedArray&&\"undefined\"!=typeof importScripts&&\"undefined\"!=typeof MessageChannel;function d(){var e=setTimeout;return function(){return e(p,1)}}var m=new Array(1e3);function p(){for(var e=0;e<n;e+=2){(0,m[e])(m[e+1]),m[e]=void 0,m[e+1]=void 0}n=0}var f,h,b,g,y=void 0;function v(e,t){var r=this,n=new this.constructor(k);void 0===n[w]&&L(n);var a=r._state;if(a){var o=arguments[a-1];u(function(){return B(a,n,o,r._result)})}else S(r,n,e,t);return n}function D(e){if(e&&\"object\"==typeof e&&e.constructor===this)return e;var t=new this(k);return z(t,e),t}y=s?function(){return P.nextTick(p)}:i?(h=0,b=new i(p),g=document.createTextNode(\"\"),b.observe(g,{characterData:!0}),function(){g.data=h=++h%2}):c?((f=new MessageChannel).port1.onmessage=p,function(){return f.port2.postMessage(0)}):void 0===e&&\"function\"==typeof V?function(){try{var e=Function(\"return this\")().require(\"vertx\");return void 0!==(t=e.runOnLoop||e.runOnContext)?function(){t(p)}:d()}catch(e){return d()}}():d();var w=Math.random().toString(36).substring(2);function k(){}var x=void 0,E=1,C=2,A={error:null};function F(e){try{return e.then}catch(e){return A.error=e,A}}function j(e,t,r){var n,a,o,i;t.constructor===e.constructor&&r===v&&t.constructor.resolve===D?(o=e,(i=t)._state===E?N(o,i._result):i._state===C?T(o,i._result):S(i,void 0,function(e){return z(o,e)},function(e){return T(o,e)})):r===A?(T(e,A.error),A.error=null):void 0===r?N(e,t):l(r)?(n=t,a=r,u(function(t){var r=!1,e=function(e,t,r,n){try{e.call(t,r,n)}catch(e){return e}}(a,n,function(e){r||(r=!0,n!==e?z(t,e):N(t,e))},function(e){r||(r=!0,T(t,e))},t._label);!r&&e&&(r=!0,T(t,e))},e)):N(e,t)}function z(e,t){var r,n;e===t?T(e,new TypeError(\"You cannot resolve a promise with itself\")):(n=typeof(r=t),null===r||\"object\"!==n&&\"function\"!==n?N(e,t):j(e,t,F(t)))}function q(e){e._onerror&&e._onerror(e._result),R(e)}function N(e,t){e._state===x&&(e._result=t,e._state=E,0!==e._subscribers.length&&u(R,e))}function T(e,t){e._state===x&&(e._state=C,e._result=t,u(q,e))}function S(e,t,r,n){var a=e._subscribers,o=a.length;e._onerror=null,a[o]=t,a[o+E]=r,a[o+C]=n,0===o&&e._state&&u(R,e)}function R(e){var t=e._subscribers,r=e._state;if(0!==t.length){for(var n=void 0,a=void 0,o=e._result,i=0;i<t.length;i+=3)n=t[i],a=t[i+r],n?B(r,n,a,o):a(o);e._subscribers.length=0}}function B(e,t,r,n){var a=l(r),o=void 0,i=void 0,u=void 0,s=void 0;if(a){if((o=function(e,t){try{return e(t)}catch(e){return A.error=e,A}}(r,n))===A?(s=!0,i=o.error,o.error=null):u=!0,t===o)return void T(t,new TypeError(\"A promises callback cannot return that same promise.\"))}else o=n,u=!0;t._state!==x||(a&&u?z(t,o):s?T(t,i):e===E?N(t,o):e===C&&T(t,o))}var O=0;function L(e){e[w]=O++,e._state=void 0,e._result=void 0,e._subscribers=[]}var I=function(){function e(e,t){this._instanceConstructor=e,this.promise=new e(k),this.promise[w]||L(this.promise),r(t)?(this.length=t.length,this._remaining=t.length,this._result=new Array(this.length),0===this.length?N(this.promise,this._result):(this.length=this.length||0,this._enumerate(t),0===this._remaining&&N(this.promise,this._result))):T(this.promise,new Error(\"Array Methods must be provided an Array\"))}return e.prototype._enumerate=function(e){for(var t=0;this._state===x&&t<e.length;t++)this._eachEntry(e[t],t)},e.prototype._eachEntry=function(t,e){var r=this._instanceConstructor,n=r.resolve;if(n===D){var a=F(t);if(a===v&&t._state!==x)this._settledAt(t._state,e,t._result);else if(\"function\"!=typeof a)this._remaining--,this._result[e]=t;else if(r===_){var o=new r(k);j(o,t,a),this._willSettleAt(o,e)}else this._willSettleAt(new r(function(e){return e(t)}),e)}else this._willSettleAt(n(t),e)},e.prototype._settledAt=function(e,t,r){var n=this.promise;n._state===x&&(this._remaining--,e===C?T(n,r):this._result[t]=r),0===this._remaining&&N(n,this._result)},e.prototype._willSettleAt=function(e,t){var r=this;S(e,void 0,function(e){return r._settledAt(E,t,e)},function(e){return r._settledAt(C,t,e)})},e}();var _=function(){function t(e){this[w]=O++,this._result=this._state=void 0,this._subscribers=[],k!==e&&(\"function\"!=typeof e&&function(){throw new TypeError(\"You must pass a resolver function as the first argument to the promise constructor\")}(),this instanceof t?function(t,e){try{e(function(e){z(t,e)},function(e){T(t,e)})}catch(e){T(t,e)}}(this,e):function(){throw new TypeError(\"Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.\")}())}return t.prototype.catch=function(e){return this.then(null,e)},t.prototype.finally=function(t){var r=this.constructor;return l(t)?this.then(function(e){return r.resolve(t()).then(function(){return e})},function(e){return r.resolve(t()).then(function(){throw e})}):this.then(t,t)},t}();return _.prototype.then=v,_.all=function(e){return new I(this,e).promise},_.race=function(a){var o=this;return r(a)?new o(function(e,t){for(var r=a.length,n=0;n<r;n++)o.resolve(a[n]).then(e,t)}):new o(function(e,t){return t(new TypeError(\"You must pass an array to race.\"))})},_.resolve=D,_.reject=function(e){var t=new this(k);return T(t,e),t},_._setScheduler=function(e){a=e},_._setAsap=function(e){u=e},_._asap=u,_.polyfill=function(){var e=void 0;if(void 0!==U)e=U;else if(\"undefined\"!=typeof self)e=self;else try{e=Function(\"return this\")()}catch(e){throw new Error(\"polyfill failed because global object is unavailable in this environment\")}var t=e.Promise;if(t){var r=null;try{r=Object.prototype.toString.call(t.resolve())}catch(e){}if(\"[object Promise]\"===r&&!t.cast)return}e.Promise=_},_.Promise=_},\"object\"==typeof n&&void 0!==r?r.exports=t():\"function\"==typeof define&&define.amd?define(t):e.ES6Promise=t()}).call(this,V(\"_process\"),void 0!==t?t:\"undefined\"!=typeof self?self:void 0!==window?window:{})},{_process:33}],32:[function(e,t,r){function n(e){return!!e.constructor&&\"function\"==typeof e.constructor.isBuffer&&e.constructor.isBuffer(e)}t.exports=function(e){return null!=e&&(n(e)||\"function\"==typeof(t=e).readFloatLE&&\"function\"==typeof t.slice&&n(t.slice(0,0))||!!e._isBuffer);var t}},{}],33:[function(e,t,r){var n,a,o=t.exports={};function i(){throw new Error(\"setTimeout has not been defined\")}function u(){throw new Error(\"clearTimeout has not been defined\")}function s(t){if(n===setTimeout)return setTimeout(t,0);if((n===i||!n)&&setTimeout)return n=setTimeout,setTimeout(t,0);try{return n(t,0)}catch(e){try{return n.call(null,t,0)}catch(e){return n.call(this,t,0)}}}!function(){try{n=\"function\"==typeof setTimeout?setTimeout:i}catch(e){n=i}try{a=\"function\"==typeof clearTimeout?clearTimeout:u}catch(e){a=u}}();var l,c=[],d=!1,m=-1;function p(){d&&l&&(d=!1,l.length?c=l.concat(c):m=-1,c.length&&f())}function f(){if(!d){var e=s(p);d=!0;for(var t=c.length;t;){for(l=c,c=[];++m<t;)l&&l[m].run();m=-1,t=c.length}l=null,d=!1,function(t){if(a===clearTimeout)return clearTimeout(t);if((a===u||!a)&&clearTimeout)return a=clearTimeout,clearTimeout(t);try{a(t)}catch(e){try{return a.call(null,t)}catch(e){return a.call(this,t)}}}(e)}}function h(e,t){this.fun=e,this.array=t}function b(){}o.nextTick=function(e){var t=new Array(arguments.length-1);if(1<arguments.length)for(var r=1;r<arguments.length;r++)t[r-1]=arguments[r];c.push(new h(e,t)),1!==c.length||d||s(f)},h.prototype.run=function(){this.fun.apply(null,this.array)},o.title=\"browser\",o.browser=!0,o.env={},o.argv=[],o.version=\"\",o.versions={},o.on=b,o.addListener=b,o.once=b,o.off=b,o.removeListener=b,o.removeAllListeners=b,o.emit=b,o.prependListener=b,o.prependOnceListener=b,o.listeners=function(e){return[]},o.binding=function(e){throw new Error(\"process.binding is not supported\")},o.cwd=function(){return\"/\"},o.chdir=function(e){throw new Error(\"process.chdir is not supported\")},o.umask=function(){return 0}},{}]},{},[1]);var utils=axe.utils={},i={},T=(N=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e});function r(e,t,r){\"use strict\";var n,a;for(n=0,a=e.length;n<a;n++)t[r](e[n])}function n(e){this.brand=\"axe\",this.application=\"axeAPI\",this.tagExclude=[\"experimental\"],this.defaultConfig=e,this._init(),this._defaultLocale=null}n.prototype._setDefaultLocale=function(){if(!this._defaultLocale){for(var e={checks:{},rules:{}},t=Object.keys(this.data.checks),r=0;r<t.length;r++){var n=t[r],a=this.data.checks[n].messages,o=a.pass,i=a.fail,u=a.incomplete;e.checks[n]={pass:o,fail:i,incomplete:u}}for(var s=Object.keys(this.data.rules),l=0;l<s.length;l++){var c=s[l],d=this.data.rules[c],m=d.description,p=d.help;e.rules[c]={description:m,help:p}}this._defaultLocale=e}},n.prototype._resetLocale=function(){var e=this._defaultLocale;e&&this.applyLocale(e)};function p(a,e,o){return o.performanceTimer&&axe.utils.performanceTimer.mark(\"mark_rule_start_\"+a.id),function(r,n){a.run(e,o,function(e){r(e)},function(e){if(o.debug)n(e);else{var t=Object.assign(new f(a),{result:axe.constants.CANTTELL,description:\"An error occured while running this rule\",message:e.message,stack:e.stack,error:e,errorNode:e.errorNode});r(t)}})}}function o(e,t,r){var n=e.brand,a=e.application;return axe.constants.helpUrlBase+n+\"/\"+(r||axe.version.substring(0,axe.version.lastIndexOf(\".\")))+\"/\"+t+\"?application=\"+a}function c(e){\"use strict\";this.id=e.id,this.data=null,this.relatedNodes=[],this.result=null}function a(e){\"use strict\";return\"string\"==typeof e?new Function(\"return \"+e+\";\")():e}function u(e){e&&(this.id=e.id,this.configure(e))}n.prototype._applyCheckLocale=function(e){for(var t,r,n,a,o=Object.keys(e),i=0;i<o.length;i++){var u=o[i];if(!this.data.checks[u])throw new Error('Locale provided for unknown check: \"'+u+'\"');this.data.checks[u]=(t=this.data.checks[u],r=e[u],a=n=void 0,n=r.pass,a=r.fail,\"string\"==typeof n&&(n=axe.imports.doT.compile(n)),\"string\"==typeof a&&(a=axe.imports.doT.compile(a)),T({},t,{messages:{pass:n||t.messages.pass,fail:a||t.messages.fail,incomplete:\"object\"===N(t.messages.incomplete)?T({},t.messages.incomplete,r.incomplete):r.incomplete}}))}},n.prototype._applyRuleLocale=function(e){for(var t,r,n,a,o=Object.keys(e),i=0;i<o.length;i++){var u=o[i];if(!this.data.rules[u])throw new Error('Locale provided for unknown rule: \"'+u+'\"');this.data.rules[u]=(t=this.data.rules[u],r=e[u],a=n=void 0,n=r.help,a=r.description,\"string\"==typeof n&&(n=axe.imports.doT.compile(n)),\"string\"==typeof a&&(a=axe.imports.doT.compile(a)),T({},t,{help:n||t.help,description:a||t.description}))}},n.prototype.applyLocale=function(e){this._setDefaultLocale(),e.checks&&this._applyCheckLocale(e.checks),e.rules&&this._applyRuleLocale(e.rules)},n.prototype._init=function(){var e=function(e){\"use strict\";var t;return e?(t=axe.utils.clone(e)).commons=e.commons:t={},t.reporter=t.reporter||null,t.rules=t.rules||[],t.checks=t.checks||[],t.data=T({checks:{},rules:{}},t.data),t}(this.defaultConfig);axe.commons=e.commons,this.reporter=e.reporter,this.commands={},this.rules=[],this.checks={},r(e.rules,this,\"addRule\"),r(e.checks,this,\"addCheck\"),this.data={},this.data.checks=e.data&&e.data.checks||{},this.data.rules=e.data&&e.data.rules||{},this.data.failureSummaries=e.data&&e.data.failureSummaries||{},this.data.incompleteFallbackMessage=e.data&&e.data.incompleteFallbackMessage||\"\",this._constructHelpUrls()},n.prototype.registerCommand=function(e){\"use strict\";this.commands[e.id]=e.callback},n.prototype.addRule=function(e){\"use strict\";e.metadata&&(this.data.rules[e.id]=e.metadata);var t=this.getRule(e.id);t?t.configure(e):this.rules.push(new h(e,this))},n.prototype.addCheck=function(e){\"use strict\";var t=e.metadata;\"object\"===(void 0===t?\"undefined\":N(t))&&(this.data.checks[e.id]=t,\"object\"===N(t.messages)&&Object.keys(t.messages).filter(function(e){return t.messages.hasOwnProperty(e)&&\"string\"==typeof t.messages[e]}).forEach(function(e){0===t.messages[e].indexOf(\"function\")&&(t.messages[e]=new Function(\"return \"+t.messages[e]+\";\")())})),this.checks[e.id]?this.checks[e.id].configure(e):this.checks[e.id]=new u(e)},n.prototype.run=function(o,i,u,s){\"use strict\";this.normalizeOptions(i),axe._selectCache=[];var e,r,n,t=(e=this.rules,r=o,n=i,e.reduce(function(e,t){return axe.utils.ruleShouldRun(t,r,n)&&(t.preload?e.later.push(t):e.now.push(t)),e},{now:[],later:[]})),a=t.now,l=t.later,c=axe.utils.queue();a.forEach(function(e){c.defer(p(e,o,i))});var d=axe.utils.queue();l.length&&d.defer(function(r,e){axe.utils.preload(i).then(function(e){var t=e[0];r(t)}).catch(function(e){console.warn(\"Couldn't load preload assets: \",e);r(void 0)})});var m=axe.utils.queue();m.defer(c),m.defer(d),m.then(function(e){var t=e.pop();if(t&&t.length){var r=t[0];r&&(o=T({},o,r))}var n=e[0];if(!l.length)return axe._selectCache=void 0,void u(n.filter(function(e){return!!e}));var a=axe.utils.queue();l.forEach(function(e){var t=p(e,o,i);a.defer(t)}),a.then(function(e){axe._selectCache=void 0,u(n.concat(e).filter(function(e){return!!e}))}).catch(s)}).catch(s)},n.prototype.after=function(e,r){\"use strict\";var n=this.rules;return e.map(function(e){var t=axe.utils.findBy(n,\"id\",e.id);if(!t)throw new Error(\"Result for unknown rule. You may be running mismatch aXe-core versions\");return t.after(e,r)})},n.prototype.getRule=function(t){return this.rules.find(function(e){return e.id===t})},n.prototype.normalizeOptions=function(e){\"use strict\";var t=this;if(\"object\"===N(e.runOnly)){Array.isArray(e.runOnly)&&(e.runOnly={type:\"tag\",values:e.runOnly});var r=e.runOnly;if(r.value&&!r.values&&(r.values=r.value,delete r.value),!Array.isArray(r.values)||0===r.values.length)throw new Error(\"runOnly.values must be a non-empty array\");if([\"rule\",\"rules\"].includes(r.type))r.type=\"rule\",r.values.forEach(function(e){if(!t.getRule(e))throw new Error(\"unknown rule `\"+e+\"` in options.runOnly\")});else{if(![\"tag\",\"tags\",void 0].includes(r.type))throw new Error(\"Unknown runOnly type '\"+r.type+\"'\");r.type=\"tag\";var n=t.rules.reduce(function(e,t){return e.length?e.filter(function(e){return!t.tags.includes(e)}):e},r.values);0!==n.length&&axe.log(\"Could not find tags `\"+n.join(\"`, `\")+\"`\")}}return\"object\"===N(e.rules)&&Object.keys(e.rules).forEach(function(e){if(!t.getRule(e))throw new Error(\"unknown rule `\"+e+\"` in options.rules\")}),e},n.prototype.setBranding=function(e){\"use strict\";var t={brand:this.brand,application:this.application};e&&e.hasOwnProperty(\"brand\")&&e.brand&&\"string\"==typeof e.brand&&(this.brand=e.brand),e&&e.hasOwnProperty(\"application\")&&e.application&&\"string\"==typeof e.application&&(this.application=e.application),this._constructHelpUrls(t)},n.prototype._constructHelpUrls=function(){var r=this,n=0<arguments.length&&void 0!==arguments[0]?arguments[0]:null,a=(axe.version.match(/^[1-9][0-9]*\\.[0-9]+/)||[\"x.y\"])[0];this.rules.forEach(function(e){r.data.rules[e.id]||(r.data.rules[e.id]={});var t=r.data.rules[e.id];(\"string\"!=typeof t.helpUrl||n&&t.helpUrl===o(n,e.id,a))&&(t.helpUrl=o(r,e.id,a))})},n.prototype.resetRulesAndChecks=function(){\"use strict\";this._init(),this._resetLocale()},u.prototype.enabled=!0,u.prototype.run=function(t,e,r,n,a){\"use strict\";var o=(e=e||{}).hasOwnProperty(\"enabled\")?e.enabled:this.enabled,i=e.options||this.options;if(o){var u,s=new c(this),l=axe.utils.checkHelper(s,e,n,a);try{u=this.evaluate.call(l,t.actualNode,i,t,r)}catch(e){return t&&t.actualNode&&(e.errorNode=new O(t.actualNode).toJSON()),void a(e)}l.isAsync||(s.result=u,n(s))}else n(null)},u.prototype.configure=function(t){var r=this;[\"options\",\"enabled\"].filter(function(e){return t.hasOwnProperty(e)}).forEach(function(e){return r[e]=t[e]}),[\"evaluate\",\"after\"].filter(function(e){return t.hasOwnProperty(e)}).forEach(function(e){return r[e]=a(t[e])})};N=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e};function s(e,t,r){\"use strict\";var n,a;e.frames=e.frames||[];var o=document.querySelectorAll(r.shift());e:for(var i=0,u=o.length;i<u;i++){a=o[i];for(var s=0,l=e.frames.length;s<l;s++)if(e.frames[s].node===a){e.frames[s][t].push(r);break e}n={node:a,include:[],exclude:[]},r&&n[t].push(r),e.frames.push(n)}}function l(t,e){\"use strict\";for(var r,n,a=[],o=0,i=t[e].length;o<i;o++){if(\"string\"==typeof(r=t[e][o])){n=Array.from(document.querySelectorAll(r)),a=a.concat(n.map(function(e){return axe.utils.getNodeFromTree(t.flatTree[0],e)}));break}!r||!r.length||r instanceof Node?r instanceof Node&&(r.documentElement instanceof Node?a.push(t.flatTree[0]):a.push(axe.utils.getNodeFromTree(t.flatTree[0],r))):1<r.length?s(t,e,r):(n=Array.from(document.querySelectorAll(r[0])),a=a.concat(n.map(function(e){return axe.utils.getNodeFromTree(t.flatTree[0],e)})))}return a.filter(function(e){return e})}function d(e){\"use strict\";var t,r,n,a=this;this.frames=[],this.initiator=!e||\"boolean\"!=typeof e.initiator||e.initiator,this.page=!1,e=function(e){if(e&&\"object\"===(void 0===e?\"undefined\":N(e))||e instanceof NodeList){if(e instanceof Node)return{include:[e],exclude:[]};if(e.hasOwnProperty(\"include\")||e.hasOwnProperty(\"exclude\"))return{include:e.include&&+e.include.length?e.include:[document],exclude:e.exclude||[]};if(e.length===+e.length)return{include:e,exclude:[]}}return\"string\"==typeof e?{include:[e],exclude:[]}:{include:[document],exclude:[]}}(e),this.flatTree=axe.utils.getFlattenedTree((r=(t=e).include,n=t.exclude,(Array.from(r).concat(Array.from(n)).reduce(function(e,t){return e||(t instanceof Element?t.ownerDocument:t instanceof Document?t:void 0)},null)||document).documentElement)),this.exclude=e.exclude,this.include=e.include,this.include=l(this,\"include\"),this.exclude=l(this,\"exclude\"),axe.utils.select(\"frame, iframe\",this).forEach(function(e){var t,r;Ce(e,a)&&(t=a.frames,r=e.actualNode,axe.utils.isHidden(r)||axe.utils.findBy(t,\"node\",r)||t.push({node:r,include:[],exclude:[]}))}),1===this.include.length&&this.include[0].actualNode===document.documentElement&&(this.page=!0);var o=function(e){if(0===e.include.length){if(0===e.frames.length){var t=axe.utils.respondable.isInFrame()?\"frame\":\"page\";return new Error(\"No elements found for include in \"+t+\" Context\")}e.frames.forEach(function(e,t){if(0===e.include.length)return new Error(\"No elements found for include in Context of frame \"+t)})}}(this);if(o instanceof Error)throw o;Array.isArray(this.include)||(this.include=Array.from(this.include)),this.include.sort(axe.utils.nodeSorter)}function f(e){\"use strict\";this.id=e.id,this.result=axe.constants.NA,this.pageLevel=e.pageLevel,this.impact=null,this.nodes=[]}function h(e,t){\"use strict\";this._audit=t,this.id=e.id,this.selector=e.selector||\"*\",this.excludeHidden=\"boolean\"!=typeof e.excludeHidden||e.excludeHidden,this.enabled=\"boolean\"!=typeof e.enabled||e.enabled,this.pageLevel=\"boolean\"==typeof e.pageLevel&&e.pageLevel,this.any=e.any||[],this.all=e.all||[],this.none=e.none||[],this.tags=e.tags||[],this.preload=!!e.preload,e.matches&&(this.matches=a(e.matches))}h.prototype.matches=function(){\"use strict\";return!0},h.prototype.gather=function(e){\"use strict\";var t=axe.utils.select(this.selector,e);return this.excludeHidden?t.filter(function(e){return!axe.utils.isHidden(e.actualNode)}):t},h.prototype.runChecks=function(t,a,o,i,r,e){\"use strict\";var u=this,s=axe.utils.queue();this[t].forEach(function(e){var r=u._audit.checks[e.id||e],n=axe.utils.getCheckOption(r,u.id,o);s.defer(function(e,t){r.run(a,n,i,e,t)})}),s.then(function(e){e=e.filter(function(e){return e}),r({type:t,results:e})}).catch(e)},h.prototype.run=function(n,o,e,t){var i=this,r=axe.utils.queue(),u=new f(this),a=\"mark_rule_start_\"+this.id,s=\"mark_rule_end_\"+this.id,l=\"mark_runchecks_start_\"+this.id,c=\"mark_runchecks_end_\"+this.id,d=void 0;try{d=this.gather(n).filter(function(e){return i.matches(e.actualNode,e,n)})}catch(e){return void t(new m({cause:e,ruleId:this.id}))}o.performanceTimer&&(axe.log(\"gather (\",d.length,\"):\",axe.utils.performanceTimer.timeElapsed()+\"ms\"),axe.utils.performanceTimer.mark(l)),d.forEach(function(a){r.defer(function(t,r){var e=axe.utils.queue();[\"any\",\"all\",\"none\"].forEach(function(r){e.defer(function(e,t){i.runChecks(r,a,o,n,e,t)})}),e.then(function(e){if(e.length){var r=!1,n={};e.forEach(function(e){var t=e.results.filter(function(e){return e});(n[e.type]=t).length&&(r=!0)}),r&&(n.node=new axe.utils.DqElement(a.actualNode,o),u.nodes.push(n))}t()}).catch(function(e){return r(e)})})}),r.defer(function(e){return setTimeout(e,0)}),o.performanceTimer&&(axe.utils.performanceTimer.mark(c),axe.utils.performanceTimer.mark(s),axe.utils.performanceTimer.measure(\"runchecks_\"+this.id,l,c),axe.utils.performanceTimer.measure(\"rule_\"+this.id,a,s)),r.then(function(){return e(u)}).catch(function(e){return t(e)})},h.prototype.after=function(u,s){\"use strict\";var r,e,n,t,a=(r=this,axe.utils.getAllChecks(r).map(function(e){var t=r._audit.checks[e.id||e];return t&&\"function\"==typeof t.after?t:null}).filter(Boolean)),l=this.id;return a.forEach(function(e){var t,r,n,a=(t=u.nodes,r=e.id,n=[],t.forEach(function(e){axe.utils.getAllChecks(e).forEach(function(e){e.id===r&&n.push(e)})}),n),o=axe.utils.getCheckOption(e,l,s),i=e.after(a,o);a.forEach(function(e){-1===i.indexOf(e)&&(e.filtered=!0)})}),u.nodes=(n=[\"any\",\"all\",\"none\"],t=(e=u).nodes.filter(function(t){var r=0;return n.forEach(function(e){t[e]=t[e].filter(function(e){return!0!==e.filtered}),r+=t[e].length}),0<r}),e.pageLevel&&t.length&&(t=[t.reduce(function(t,r){if(t)return n.forEach(function(e){t[e].push.apply(t[e],r[e])}),t})]),t),u},h.prototype.configure=function(e){\"use strict\";e.hasOwnProperty(\"selector\")&&(this.selector=e.selector),e.hasOwnProperty(\"excludeHidden\")&&(this.excludeHidden=\"boolean\"!=typeof e.excludeHidden||e.excludeHidden),e.hasOwnProperty(\"enabled\")&&(this.enabled=\"boolean\"!=typeof e.enabled||e.enabled),e.hasOwnProperty(\"pageLevel\")&&(this.pageLevel=\"boolean\"==typeof e.pageLevel&&e.pageLevel),e.hasOwnProperty(\"any\")&&(this.any=e.any),e.hasOwnProperty(\"all\")&&(this.all=e.all),e.hasOwnProperty(\"none\")&&(this.none=e.none),e.hasOwnProperty(\"tags\")&&(this.tags=e.tags),e.hasOwnProperty(\"matches\")&&(\"string\"==typeof e.matches?this.matches=new Function(\"return \"+e.matches+\";\")():this.matches=e.matches)},function(axe){var o={helpUrlBase:\"https://dequeuniversity.com/rules/\",results:[],resultGroups:[],resultGroupMap:{},impact:Object.freeze([\"minor\",\"moderate\",\"serious\",\"critical\"]),preloadAssets:Object.freeze([\"cssom\"]),preloadAssetsTimeout:1e4};[{name:\"NA\",value:\"inapplicable\",priority:0,group:\"inapplicable\"},{name:\"PASS\",value:\"passed\",priority:1,group:\"passes\"},{name:\"CANTTELL\",value:\"cantTell\",priority:2,group:\"incomplete\"},{name:\"FAIL\",value:\"failed\",priority:3,group:\"violations\"}].forEach(function(e){var t=e.name,r=e.value,n=e.priority,a=e.group;o[t]=r,o[t+\"_PRIO\"]=n,o[t+\"_GROUP\"]=a,o.results[n]=r,o.resultGroups[n]=a,o.resultGroupMap[r]=a}),Object.freeze(o.results),Object.freeze(o.resultGroups),Object.freeze(o.resultGroupMap),Object.freeze(o),Object.defineProperty(axe,\"constants\",{value:o,enumerable:!0,configurable:!1,writable:!1})}(axe);N=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e};function b(t,r){\"use strict\";if(t=t||function(){},r=r||axe.log,!axe._audit)throw new Error(\"No audit configured\");var n=axe.utils.queue(),a=[];Object.keys(axe.plugins).forEach(function(e){n.defer(function(t){var r=function(e){a.push(e),t()};try{axe.plugins[e].cleanup(t,r)}catch(e){r(e)}})});var e=axe.utils.getFlattenedTree(document.body);axe.utils.querySelectorAll(e,\"iframe, frame\").forEach(function(r){n.defer(function(e,t){return axe.utils.sendCommandToFrame(r.actualNode,{command:\"cleanup-plugin\"},e,t)})}),n.then(function(e){0===a.length?t(e):r(a)}).catch(r)}function g(e,t,r){\"use strict\";var n=r,a=function(e){e instanceof Error==!1&&(e=new Error(e)),r(e)},o=e&&e.context||{};o.hasOwnProperty(\"include\")&&!o.include.length&&(o.include=[document]);var i=e&&e.options||{};switch(e.command){case\"rules\":return k(o,i,function(e,t){n(e),t()},a);case\"cleanup-plugin\":return b(n,a);default:if(axe._audit&&axe._audit.commands&&axe._audit.commands[e.command])return axe._audit.commands[e.command](e,r)}}function y(e){\"use strict\";this._run=e.run,this._collect=e.collect,this._registry={},e.commands.forEach(function(e){axe._audit.registerCommand(e)})}axe.log=function(){\"use strict\";\"object\"===(\"undefined\"==typeof console?\"undefined\":N(console))&&console.log&&Function.prototype.apply.call(console.log,console,arguments)},axe.cleanup=b,axe.configure=function(e){\"use strict\";var t;if(!(t=axe._audit))throw new Error(\"No audit configured\");e.reporter&&(\"function\"==typeof e.reporter||D[e.reporter])&&(t.reporter=e.reporter),e.checks&&e.checks.forEach(function(e){t.addCheck(e)});var r=[];e.rules&&e.rules.forEach(function(e){r.push(e.id),t.addRule(e)}),e.disableOtherRules&&t.rules.forEach(function(e){!1===r.includes(e.id)&&(e.enabled=!1)}),void 0!==e.branding?t.setBranding(e.branding):t._constructHelpUrls(),e.tagExclude&&(t.tagExclude=e.tagExclude),e.locale&&t.applyLocale(e.locale)},axe.getRules=function(e){\"use strict\";var t=(e=e||[]).length?axe._audit.rules.filter(function(t){return!!e.filter(function(e){return-1!==t.tags.indexOf(e)}).length}):axe._audit.rules,r=axe._audit.data.rules||{};return t.map(function(e){var t=r[e.id]||{};return{ruleId:e.id,description:t.description,help:t.help,helpUrl:t.helpUrl,tags:e.tags}})},axe._load=function(e){\"use strict\";axe.utils.respondable.subscribe(\"axe.ping\",function(e,t,r){r({axe:!0})}),axe.utils.respondable.subscribe(\"axe.start\",g),axe._audit=new n(e)},(axe=axe||{}).plugins={},y.prototype.run=function(){\"use strict\";return this._run.apply(this,arguments)},y.prototype.collect=function(){\"use strict\";return this._collect.apply(this,arguments)},y.prototype.cleanup=function(e){\"use strict\";var r=axe.utils.queue(),n=this;Object.keys(this._registry).forEach(function(t){r.defer(function(e){n._registry[t].cleanup(e)})}),r.then(function(){e()})},y.prototype.add=function(e){\"use strict\";this._registry[e.id]=e},axe.registerPlugin=function(e){\"use strict\";axe.plugins[e.id]=new y(e)};var v,D={};function w(){axe._tree=void 0,axe._selectorData=void 0}function k(r,n,a,o){\"use strict\";try{r=new d(r),axe._tree=r.flatTree,axe._selectorData=axe.utils.getSelectorData(r.flatTree)}catch(e){return w(),o(e)}var e=axe.utils.queue(),i=axe._audit;n.performanceTimer&&axe.utils.performanceTimer.auditStart(),r.frames.length&&!1!==n.iframes&&e.defer(function(e,t){axe.utils.collectResultsFromFrames(r,n,\"rules\",null,e,t)});var u=void 0;e.defer(function(e,t){n.restoreScroll&&(u=axe.utils.getScrollState()),i.run(r,n,e,t)}),e.then(function(e){try{u&&axe.utils.setScrollState(u),n.performanceTimer&&axe.utils.performanceTimer.auditEnd();var t=axe.utils.mergeResults(e.map(function(e){return{results:e}}));r.initiator&&((t=i.after(t,n)).forEach(axe.utils.publishMetaData),t=t.map(axe.utils.finalizeRuleResult));try{a(t,w)}catch(e){w(),axe.log(e)}}catch(e){w(),o(e)}}).catch(function(e){w(),o(e)})}axe.getReporter=function(e){\"use strict\";return\"string\"==typeof e&&D[e]?D[e]:\"function\"==typeof e?e:v},axe.addReporter=function(e,t,r){\"use strict\";D[e]=t,r&&(v=t)},axe.reset=function(){\"use strict\";var e=axe._audit;if(!e)throw new Error(\"No audit configured\");e.resetRulesAndChecks()},axe._runRules=k;N=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e};var x=function(){};function E(e,t,r){\"use strict\";var n=new TypeError(\"axe.run arguments are invalid\");if(!function(e){switch(!0){case\"string\"==typeof e:case Array.isArray(e):case Node&&e instanceof Node:case NodeList&&e instanceof NodeList:return!0;case\"object\"!==(void 0===e?\"undefined\":N(e)):return!1;case void 0!==e.include:case void 0!==e.exclude:case\"number\"==typeof e.length:return!0;default:return!1}}(e)){if(void 0!==r)throw n;r=t,t=e,e=document}if(\"object\"!==(void 0===t?\"undefined\":N(t))){if(void 0!==r)throw n;r=t,t={}}if(\"function\"!=typeof r&&void 0!==r)throw n;return{context:e,options:t,callback:r||x}}axe.run=function(e,a,o){\"use strict\";if(!axe._audit)throw new Error(\"No audit configured\");var t=E(e,a,o);e=t.context,a=t.options,o=t.callback,a.reporter=a.reporter||axe._audit.reporter||\"v1\",a.performanceTimer&&axe.utils.performanceTimer.start();var r=void 0,i=x,u=x;return\"function\"==typeof Promise&&o===x&&(r=new Promise(function(e,t){i=t,u=e})),axe._runRules(e,a,function(e,t){var r=function(e){t();try{o(null,e)}catch(e){axe.log(e)}u(e)};a.performanceTimer&&axe.utils.performanceTimer.end();try{var n=axe.getReporter(a.reporter)(e,a,r);void 0!==n&&r(n)}catch(e){t(),o(e),i(e)}},function(e){o(e),i(e)}),r},i.failureSummary=function(e){\"use strict\";var r={};return r.none=e.none.concat(e.all),r.any=e.any,Object.keys(r).map(function(e){if(r[e].length){var t=axe._audit.data.failureSummaries[e];return t&&\"function\"==typeof t.failureMessage?t.failureMessage(r[e].map(function(e){return e.message||\"\"})):void 0}}).filter(function(e){return void 0!==e}).join(\"\\n\\n\")},i.getEnvironmentData=function(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:window,t=e.screen,r=void 0===t?{}:t,n=e.navigator,a=void 0===n?{}:n,o=e.location,i=void 0===o?{}:o,u=e.innerHeight,s=e.innerWidth,l=r.msOrientation||r.orientation||r.mozOrientation||{};return{testEngine:{name:\"axe-core\",version:axe.version},testRunner:{name:axe._audit.brand},testEnvironment:{userAgent:a.userAgent,windowWidth:s,windowHeight:u,orientationAngle:l.angle,orientationType:l.type},timestamp:(new Date).toISOString(),url:i.href}},i.incompleteFallbackMessage=function(){\"use strict\";return axe._audit.data.incompleteFallbackMessage()};N=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e};var C=axe.constants.resultGroups;i.processAggregate=function(e,r){var t=axe.utils.aggregateResult(e);return C.forEach(function(e){r.resultTypes&&!r.resultTypes.includes(e)&&(t[e]||[]).forEach(function(e){Array.isArray(e.nodes)&&0<e.nodes.length&&(e.nodes=[e.nodes[0]])}),t[e]=(t[e]||[]).map(function(t){return t=Object.assign({},t),Array.isArray(t.nodes)&&0<t.nodes.length&&(t.nodes=t.nodes.map(function(e){return\"object\"===N(e.node)&&(e.html=e.node.source,r.elementRef&&!e.node.fromFrame&&(e.element=e.node.element),(!1!==r.selectors||e.node.fromFrame)&&(e.target=e.node.selector),r.xpath&&(e.xpath=e.node.xpath)),delete e.result,delete e.node,function(t,r){\"use strict\";[\"any\",\"all\",\"none\"].forEach(function(e){Array.isArray(t[e])&&t[e].filter(function(e){return Array.isArray(e.relatedNodes)}).forEach(function(e){e.relatedNodes=e.relatedNodes.map(function(e){var t={html:e.source};return r.elementRef&&!e.fromFrame&&(t.element=e.element),(!1!==r.selectors||e.fromFrame)&&(t.target=e.selector),r.xpath&&(t.xpath=e.xpath),t})})})}(e,r),e})),C.forEach(function(e){return delete t[e]}),delete t.pageLevel,delete t.result,t})}),t};T=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e};axe.addReporter(\"na\",function(e,t,r){\"use strict\";\"function\"==typeof t&&(r=t,t={});var n=i.processAggregate(e,t);r(T({},i.getEnvironmentData(),{toolOptions:t,violations:n.violations,passes:n.passes,incomplete:n.incomplete,inapplicable:n.inapplicable}))});T=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e};axe.addReporter(\"no-passes\",function(e,t,r){\"use strict\";\"function\"==typeof t&&(r=t,t={}),t.resultTypes=[\"violations\"];var n=i.processAggregate(e,t);r(T({},i.getEnvironmentData(),{toolOptions:t,violations:n.violations}))}),axe.addReporter(\"raw\",function(e,t,r){\"use strict\";\"function\"==typeof t&&(r=t,t={}),r(e)});T=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e};axe.addReporter(\"v1\",function(e,t,r){\"use strict\";\"function\"==typeof t&&(r=t,t={});var n=i.processAggregate(e,t);n.violations.forEach(function(e){return e.nodes.forEach(function(e){e.failureSummary=i.failureSummary(e)})}),r(T({},i.getEnvironmentData(),{toolOptions:t,violations:n.violations,passes:n.passes,incomplete:n.incomplete,inapplicable:n.inapplicable}))});T=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e};axe.addReporter(\"v2\",function(e,t,r){\"use strict\";\"function\"==typeof t&&(r=t,t={});var n=i.processAggregate(e,t);r(T({},i.getEnvironmentData(),{toolOptions:t,violations:n.violations,passes:n.passes,incomplete:n.incomplete,inapplicable:n.inapplicable}))},!0),axe.utils.aggregate=function(t,e,r){e=e.slice(),r&&e.push(r);var n=e.map(function(e){return t.indexOf(e)}).sort();return t[n.pop()]};var A=axe.constants,F=A.CANTTELL_PRIO,j=A.FAIL_PRIO,z=[];z[axe.constants.PASS_PRIO]=!0,z[axe.constants.CANTTELL_PRIO]=null,z[axe.constants.FAIL_PRIO]=!1;var q=[\"any\",\"all\",\"none\"];function S(r,n){return q.reduce(function(e,t){return e[t]=(r[t]||[]).map(function(e){return n(e,t)}),e},{})}function R(e,t,r){var n=Object.assign({},t);n.nodes=(n[r]||[]).concat(),axe.constants.resultGroups.forEach(function(e){delete n[e]}),e[r].push(n)}axe.utils.aggregateChecks=function(e){var r=Object.assign({},e);S(r,function(e,t){var r=void 0===e.result?-1:z.indexOf(e.result);e.priority=-1!==r?r:axe.constants.CANTTELL_PRIO,\"none\"===t&&(e.priority===axe.constants.PASS_PRIO?e.priority=axe.constants.FAIL_PRIO:e.priority===axe.constants.FAIL_PRIO&&(e.priority=axe.constants.PASS_PRIO))});var n={all:r.all.reduce(function(e,t){return Math.max(e,t.priority)},0),none:r.none.reduce(function(e,t){return Math.max(e,t.priority)},0),any:r.any.reduce(function(e,t){return Math.min(e,t.priority)},4)%4};r.priority=Math.max(n.all,n.none,n.any);var a=[];return q.forEach(function(t){r[t]=r[t].filter(function(e){return e.priority===r.priority&&e.priority===n[t]}),r[t].forEach(function(e){return a.push(e.impact)})}),[F,j].includes(r.priority)?r.impact=axe.utils.aggregate(axe.constants.impact,a):r.impact=null,S(r,function(e){delete e.result,delete e.priority}),r.result=axe.constants.results[r.priority],delete r.priority,r},axe.utils.aggregateNodeResults=function(e){var r={};if((e=e.map(function(e){if(e.any&&e.all&&e.none)return axe.utils.aggregateChecks(e);if(Array.isArray(e.node))return axe.utils.finalizeRuleResult(e);throw new TypeError(\"Invalid Result type\")}))&&e.length){var t=e.map(function(e){return e.result});r.result=axe.utils.aggregate(axe.constants.results,t,r.result)}else r.result=\"inapplicable\";axe.constants.resultGroups.forEach(function(e){return r[e]=[]}),e.forEach(function(e){var t=axe.constants.resultGroupMap[e.result];r[t].push(e)});var n=axe.constants.FAIL_GROUP;if(0===r[n].length&&(n=axe.constants.CANTTELL_GROUP),0<r[n].length){var a=r[n].map(function(e){return e.impact});r.impact=axe.utils.aggregate(axe.constants.impact,a)||null}else r.impact=null;return r},axe.utils.aggregateResult=function(e){var r={};return axe.constants.resultGroups.forEach(function(e){return r[e]=[]}),e.forEach(function(t){t.error?R(r,t,axe.constants.CANTTELL_GROUP):t.result===axe.constants.NA?R(r,t,axe.constants.NA_GROUP):axe.constants.resultGroups.forEach(function(e){Array.isArray(t[e])&&0<t[e].length&&R(r,t,e)})}),r},axe.utils.areStylesSet=function e(t,r,n){\"use strict\";var a=window.getComputedStyle(t,null),o=!1;return!!a&&(r.forEach(function(e){a.getPropertyValue(e.property)===e.value&&(o=!0)}),!!o||!(t.nodeName.toUpperCase()===n.toUpperCase()||!t.parentNode)&&e(t.parentNode,r,n))},axe.utils.checkHelper=function(t,r,n,a){\"use strict\";return{isAsync:!1,async:function(){return this.isAsync=!0,function(e){e instanceof Error==!1?(t.result=e,n(t)):a(e)}},data:function(e){t.data=e},relatedNodes:function(e){e=e instanceof Node?[e]:axe.utils.toArray(e),t.relatedNodes=e.map(function(e){return new axe.utils.DqElement(e,r)})}}};N=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e};function B(e,t){\"use strict\";var r;return axe._tree&&(r=axe.utils.getSelector(t)),new Error(e+\": \"+(r||t))}function O(e,t,r){var n,a;this._fromFrame=!!r,this.spec=r||{},t&&t.absolutePaths&&(this._options={toRoot:!0}),this.source=void 0!==this.spec.source?this.spec.source:((a=(n=e).outerHTML)||\"function\"!=typeof XMLSerializer||(a=(new XMLSerializer).serializeToString(n)),function(e,t){if(t=t||300,e.length>t){var r=e.indexOf(\">\");e=e.substring(0,r+1)}return e}(a||\"\")),this._element=e}axe.utils.clone=function(e){\"use strict\";var t,r,n=e;if(null!==e&&\"object\"===(void 0===e?\"undefined\":N(e)))if(Array.isArray(e))for(n=[],t=0,r=e.length;t<r;t++)n[t]=axe.utils.clone(e[t]);else for(t in n={},e)n[t]=axe.utils.clone(e[t]);return n},axe.utils.sendCommandToFrame=function(t,r,n,a){\"use strict\";var o=t.contentWindow;if(!o)return axe.log(\"Frame does not have a content window\",t),void n(null);var i=setTimeout(function(){i=setTimeout(function(){r.debug?a(B(\"No response from frame\",t)):n(null)},0)},500);axe.utils.respondable(o,\"axe.ping\",null,void 0,function(){clearTimeout(i);var e=r.options&&r.options.frameWaitTime||6e4;i=setTimeout(function(){a(B(\"Axe in frame timed out\",t))},e),axe.utils.respondable(o,\"axe.start\",r,void 0,function(e){clearTimeout(i),e instanceof Error==!1?n(e):a(e)})})},axe.utils.collectResultsFromFrames=function(e,t,r,o,n,a){\"use strict\";var i=axe.utils.queue();e.frames.forEach(function(n){var a={options:t,command:r,parameter:o,context:{initiator:!1,page:e.page,include:n.include||[],exclude:n.exclude||[]}};i.defer(function(t,e){var r=n.node;axe.utils.sendCommandToFrame(r,a,function(e){if(e)return t({results:e,frameElement:r,frame:axe.utils.getSelector(r)});t(null)},e)})}),i.then(function(e){n(axe.utils.mergeResults(e,t))}).catch(a)},axe.utils.contains=function(e,t){\"use strict\";return e.shadowId||t.shadowId?function t(e,r){return e.shadowId===r.shadowId||!!e.children.find(function(e){return t(e,r)})}(e,t):\"function\"==typeof e.actualNode.contains?e.actualNode.contains(t.actualNode):!!(16&e.actualNode.compareDocumentPosition(t.actualNode))},function(axe){var e=new axe.imports.CssSelectorParser;e.registerNestingOperators(\">\"),axe.utils.cssParser=e}(axe),O.prototype={get selector(){return this.spec.selector||[axe.utils.getSelector(this.element,this._options)]},get xpath(){return this.spec.xpath||[axe.utils.getXpath(this.element)]},get element(){return this._element},get fromFrame(){return this._fromFrame},toJSON:function(){\"use strict\";return{selector:this.selector,source:this.source,xpath:this.xpath}}},O.fromFrame=function(e,t,r){return e.selector.unshift(r.selector),e.xpath.unshift(r.xpath),new axe.utils.DqElement(r.element,t,e)},axe.utils.DqElement=O,axe.utils.matchesSelector=function(){\"use strict\";var r;return function(e,t){return r&&e[r]||(r=function(e){var t,r,n=[\"matches\",\"matchesSelector\",\"mozMatchesSelector\",\"webkitMatchesSelector\",\"msMatchesSelector\"],a=n.length;for(t=0;t<a;t++)if(e[r=n[t]])return r}(e)),e[r](t)}}(),axe.utils.escapeSelector=function(e){\"use strict\";for(var t,r=String(e),n=r.length,a=-1,o=\"\",i=r.charCodeAt(0);++a<n;)0!=(t=r.charCodeAt(a))?o+=1<=t&&t<=31||127==t||0==a&&48<=t&&t<=57||1==a&&48<=t&&t<=57&&45==i?\"\\\\\"+t.toString(16)+\" \":(0!=a||1!=n||45!=t)&&(128<=t||45==t||95==t||48<=t&&t<=57||65<=t&&t<=90||97<=t&&t<=122)?r.charAt(a):\"\\\\\"+r.charAt(a):o+=\"�\";return o},axe.utils.extendMetaData=function(t,r){Object.assign(t,r),Object.keys(r).filter(function(e){return\"function\"==typeof r[e]}).forEach(function(e){t[e]=null;try{t[e]=r[e](t)}catch(e){}})},axe.utils.finalizeRuleResult=function(e){return Object.assign(e,axe.utils.aggregateNodeResults(e.nodes)),delete e.nodes,e};var axe;N=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e};function L(e,t){var r={};return{shadowId:t,children:[],actualNode:e,get isFocusable(){return r._isFocusable||(r._isFocusable=axe.commons.dom.isFocusable(e)),r._isFocusable},get tabbableElements(){return r._tabbableElements||(r._tabbableElements=axe.commons.dom.getTabbableElements(this)),r._tabbableElements}}}axe.utils.findBy=function(e,t,r){if(Array.isArray(e))return e.find(function(e){return\"object\"===(void 0===e?\"undefined\":N(e))&&e[t]===r})},(axe=axe||{utils:{}}).utils.getFlattenedTree=function(e,n){var t,r,a;function o(e,t){var r=axe.utils.getFlattenedTree(t,n);return r&&(e=e.concat(r)),e}if(e.documentElement&&(e=e.documentElement),a=e.nodeName.toLowerCase(),axe.utils.isShadowRoot(e))return t=L(e,n),n=\"a\"+Math.random().toString().substring(2),r=Array.from(e.shadowRoot.childNodes),t.children=r.reduce(o,[]),[t];if(\"content\"===a)return(r=Array.from(e.getDistributedNodes())).reduce(o,[]);if(\"slot\"!==a||\"function\"!=typeof e.assignedNodes)return 1===e.nodeType?(t=L(e,n),r=Array.from(e.childNodes),t.children=r.reduce(o,[]),[t]):3===e.nodeType?[L(e)]:void 0;(r=Array.from(e.assignedNodes())).length||(r=function(e){var t=[];for(e=e.firstChild;e;)t.push(e),e=e.nextSibling;return t}(e));window.getComputedStyle(e);return r.reduce(o,[])},axe.utils.getNodeFromTree=function(e,t){var r;return e.actualNode===t?e:(e.children.forEach(function(e){r||(r=e.actualNode===t?e:axe.utils.getNodeFromTree(e,t))}),r)},axe.utils.getAllChecks=function(e){\"use strict\";return[].concat(e.any||[]).concat(e.all||[]).concat(e.none||[])},axe.utils.getBaseLang=function(e){return e?e.trim().split(\"-\")[0].toLowerCase():\"\"},axe.utils.getCheckOption=function(e,t,r){var n=((r.rules&&r.rules[t]||{}).checks||{})[e.id],a=(r.checks||{})[e.id],o=e.enabled,i=e.options;return a&&(a.hasOwnProperty(\"enabled\")&&(o=a.enabled),a.hasOwnProperty(\"options\")&&(i=a.options)),n&&(n.hasOwnProperty(\"enabled\")&&(o=n.enabled),n.hasOwnProperty(\"options\")&&(i=n.options)),{enabled:o,options:i,absolutePaths:r.absolutePaths}};var I=function(e,t){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return function(e,t){var r=[],n=!0,a=!1,o=void 0;try{for(var i,u=e[Symbol.iterator]();!(n=(i=u.next()).done)&&(r.push(i.value),!t||r.length!==t);n=!0);}catch(e){a=!0,o=e}finally{try{!n&&u.return&&u.return()}finally{if(a)throw o}}return r}(e,t);throw new TypeError(\"Invalid attempt to destructure non-iterable instance\")};function _(e,t){return[e.substring(0,t),e.substring(t)]}function P(e){return e.replace(/\\s+$/,\"\")}axe.utils.getFriendlyUriEnd=function(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:\"\",t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{};if(!(e.length<=1||\"data:\"===e.substr(0,5)||\"javascript:\"===e.substr(0,11)||e.includes(\"?\"))){var r=t.currentDomain,n=t.maxLength,a=void 0===n?25:n,o=function(e){var t=e,r=\"\",n=\"\",a=\"\",o=\"\",i=\"\";if(e.includes(\"#\")){var u=_(e,e.indexOf(\"#\")),s=I(u,2);e=s[0],i=s[1]}if(e.includes(\"?\")){var l=_(e,e.indexOf(\"?\")),c=I(l,2);e=c[0],o=c[1]}if(e.includes(\"://\")){var d=e.split(\"://\"),m=I(d,2);r=m[0];var p=_(e=m[1],e.indexOf(\"/\")),f=I(p,2);n=f[0],e=f[1]}else if(\"//\"===e.substr(0,2)){var h=_(e=e.substr(2),e.indexOf(\"/\")),b=I(h,2);n=b[0],e=b[1]}if(\"www.\"===n.substr(0,4)&&(n=n.substr(4)),n&&n.includes(\":\")){var g=_(n,n.indexOf(\":\")),y=I(g,2);n=y[0],a=y[1]}return{original:t,protocol:r,domain:n,port:a,path:e,query:o,hash:i}}(e),i=o.path,u=o.domain,s=o.hash,l=i.substr(i.substr(0,i.length-2).lastIndexOf(\"/\")+1);if(s)return l&&(l+s).length<=a?P(l+s):l.length<2&&2<s.length&&s.length<=a?P(s):void 0;if(u&&u.length<a&&i.length<=1)return P(u+i);if(i===\"/\"+l&&u&&r&&u!==r&&(u+i).length<=a)return P(u+i);var c=l.lastIndexOf(\".\");return(-1===c||1<c)&&(-1!==c||2<l.length)&&l.length<=a&&!l.match(/index(\\.[a-zA-Z]{2-4})?/)&&!function(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:\"\";return 0!==e.length&&(e.match(/[0-9]/g)||\"\").length>=e.length/2}(l)?P(l):void 0}},axe.utils.getRootNode=function(e){var t=e.getRootNode&&e.getRootNode()||document;return t===e&&(t=document),t};var U,V=axe.utils.escapeSelector,M=void 0,H=[\"class\",\"style\",\"id\",\"selected\",\"checked\",\"disabled\",\"tabindex\",\"aria-checked\",\"aria-selected\",\"aria-invalid\",\"aria-activedescendant\",\"aria-busy\",\"aria-disabled\",\"aria-expanded\",\"aria-grabbed\",\"aria-pressed\",\"aria-valuenow\"],G=31;function $(e,t){var r=t.name,n=void 0;if(-1!==r.indexOf(\"href\")||-1!==r.indexOf(\"src\")){var a=axe.utils.getFriendlyUriEnd(e.getAttribute(r));if(a){var o=encodeURI(a);if(!o)return;n=V(t.name)+'$=\"'+V(o)+'\"'}else n=V(t.name)+'=\"'+V(e.getAttribute(r))+'\"'}else n=V(r)+'=\"'+V(t.value)+'\"';return n}function W(e,t){return e.count<t.count?-1:e.count===t.count?0:1}function X(e){return!H.includes(e.name)&&-1===e.name.indexOf(\":\")&&(!e.value||e.value.length<G)}function Y(t,r){var e=t.parentNode&&Array.from(t.parentNode.children||\"\")||[];return e.find(function(e){return e!==t&&axe.utils.matchesSelector(e,r)})?\":nth-child(\"+(1+e.indexOf(t))+\")\":\"\"}function J(e){if(e.getAttribute(\"id\")){var t=e.getRootNode&&e.getRootNode()||document,r=\"#\"+V(e.getAttribute(\"id\")||\"\");return r.match(/player_uid_/)||1!==t.querySelectorAll(r).length?void 0:r}}function K(e){return void 0===M&&(M=axe.utils.isXHTML(document)),V(M?e.localName:e.nodeName.toLowerCase())}function Z(e,t){var r,n,a,o,i,u,s,l,c,d,m=\"\",p=void 0,f=(r=e,a=[],o=(n=t).classes,i=n.tags,r.classList&&Array.from(r.classList).forEach(function(e){var t=V(e);o[t]<i[r.nodeName]&&a.push({name:t,count:o[t],species:\"class\"})}),a.sort(W)),h=(u=e,l=[],c=(s=t).attributes,d=s.tags,u.attributes&&Array.from(u.attributes).filter(X).forEach(function(e){var t=$(u,e);t&&c[t]<d[u.nodeName]&&l.push({name:t,count:c[t],species:\"attribute\"})}),l.sort(W));return f.length&&1===f[0].count?p=[f[0]]:h.length&&1===h[0].count?(p=[h[0]],m=K(e)):((p=f.concat(h)).sort(W),(p=p.slice(0,3)).some(function(e){return\"class\"===e.species})?p.sort(function(e,t){return e.species!==t.species&&\"class\"===e.species?-1:e.species===t.species?0:1}):m=K(e)),m+p.reduce(function(e,t){switch(t.species){case\"class\":return e+\".\"+t.name;case\"attribute\":return e+\"[\"+t.name+\"]\"}return e},\"\")}function Q(e,t,r){if(!axe._selectorData)throw new Error(\"Expect axe._selectorData to be set up\");var n=t.toRoot,a=void 0!==n&&n,o=void 0,i=void 0;do{var u=J(e);u||(u=Z(e,axe._selectorData),u+=Y(e,u)),o=o?u+\" > \"+o:u,i=i?i.filter(function(e){return axe.utils.matchesSelector(e,o)}):Array.from(r.querySelectorAll(o)),e=e.parentElement}while((1<i.length||a)&&e&&11!==e.nodeType);return 1===i.length?o:-1!==o.indexOf(\" > \")?\":root\"+o.substring(o.indexOf(\" > \")):\":root\"}axe.utils.getSelectorData=function(e){for(var n={classes:{},tags:{},attributes:{}},a=(e=Array.isArray(e)?e:[e]).slice(),o=[],t=function(){var e=a.pop(),r=e.actualNode;if(r.querySelectorAll){var t=r.nodeName;n.tags[t]?n.tags[t]++:n.tags[t]=1,r.classList&&Array.from(r.classList).forEach(function(e){var t=V(e);n.classes[t]?n.classes[t]++:n.classes[t]=1}),r.attributes&&Array.from(r.attributes).filter(X).forEach(function(e){var t=$(r,e);t&&(n.attributes[t]?n.attributes[t]++:n.attributes[t]=1)})}for(e.children.length&&(o.push(a),a=e.children.slice());!a.length&&o.length;)a=o.pop()};a.length;)t();return n},axe.utils.getSelector=function(e){var t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{};if(!e)return\"\";var r=e.getRootNode&&e.getRootNode()||document;if(11!==r.nodeType)return Q(e,t,r);for(var n=[];11===r.nodeType;)n.push({elm:e,doc:r}),r=(e=r.host).getRootNode();return n.push({elm:e,doc:r}),n.reverse().map(function(e){return Q(e.elm,t,e.doc)})},axe.utils.getXpath=function(e){var t=function e(t,r){var n,a;if(!t)return[];if(!r&&9===t.nodeType)return r=[{str:\"html\"}];if(r=r||[],t.parentNode&&t.parentNode!==t&&(r=e(t.parentNode,r)),t.previousSibling){for(a=1,n=t.previousSibling;1===n.nodeType&&n.nodeName===t.nodeName&&a++,n=n.previousSibling;);1===a&&(a=null)}else if(t.nextSibling)for(n=t.nextSibling;n=1===n.nodeType&&n.nodeName===t.nodeName?(a=1,null):(a=null,n.previousSibling););if(1===t.nodeType){var o={};o.str=t.nodeName.toLowerCase();var i=t.getAttribute&&axe.utils.escapeSelector(t.getAttribute(\"id\"));i&&1===t.ownerDocument.querySelectorAll(\"#\"+i).length&&(o.id=t.getAttribute(\"id\")),1<a&&(o.count=a),r.push(o)}return r}(e);return t.reduce(function(e,t){return t.id?\"/\"+t.str+\"[@id='\"+t.id+\"']\":e+\"/\"+t.str+(0<t.count?\"[\"+t.count+\"]\":\"\")},\"\")},axe.utils.injectStyle=function(e){\"use strict\";if(U&&U.parentNode)return void 0===U.styleSheet?U.appendChild(document.createTextNode(e)):U.styleSheet.cssText+=e,U;if(e){var t=document.head||document.getElementsByTagName(\"head\")[0];return(U=document.createElement(\"style\")).type=\"text/css\",void 0===U.styleSheet?U.appendChild(document.createTextNode(e)):U.styleSheet.cssText=e,t.appendChild(U),U}},axe.utils.isHidden=function(e,t){\"use strict\";var r;if(9===e.nodeType)return!1;11===e.nodeType&&(e=e.host);var n=window.getComputedStyle(e,null);return!n||!e.parentNode||\"none\"===n.getPropertyValue(\"display\")||!t&&\"hidden\"===n.getPropertyValue(\"visibility\")||\"true\"===e.getAttribute(\"aria-hidden\")||(r=e.assignedSlot?e.assignedSlot:e.parentNode,axe.utils.isHidden(r,!0))};var ee=[\"a\",\"abbr\",\"address\",\"area\",\"article\",\"aside\",\"audio\",\"b\",\"base\",\"bdi\",\"bdo\",\"blockquote\",\"body\",\"br\",\"button\",\"canvas\",\"caption\",\"cite\",\"code\",\"col\",\"colgroup\",\"data\",\"datalist\",\"dd\",\"del\",\"details\",\"dfn\",\"dialog\",\"div\",\"dl\",\"dt\",\"em\",\"embed\",\"fieldset\",\"figcaption\",\"figure\",\"footer\",\"form\",\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\",\"head\",\"header\",\"hgroup\",\"hr\",\"html\",\"i\",\"iframe\",\"img\",\"input\",\"ins\",\"kbd\",\"keygen\",\"label\",\"legend\",\"li\",\"link\",\"main\",\"map\",\"mark\",\"math\",\"menu\",\"menuitem\",\"meta\",\"meter\",\"nav\",\"noscript\",\"object\",\"ol\",\"optgroup\",\"option\",\"output\",\"p\",\"param\",\"picture\",\"pre\",\"progress\",\"q\",\"rb\",\"rp\",\"rt\",\"rtc\",\"ruby\",\"s\",\"samp\",\"script\",\"section\",\"select\",\"slot\",\"small\",\"source\",\"span\",\"strong\",\"style\",\"sub\",\"summary\",\"sup\",\"svg\",\"table\",\"tbody\",\"td\",\"template\",\"textarea\",\"tfoot\",\"th\",\"thead\",\"time\",\"title\",\"tr\",\"track\",\"u\",\"ul\",\"var\",\"video\",\"wbr\"];axe.utils.isHtmlElement=function(e){var t=e.nodeName.toLowerCase();return ee.includes(t)&&\"http://www.w3.org/2000/svg\"!==e.namespaceURI};var te,re,ne,ae,oe=[\"article\",\"aside\",\"blockquote\",\"body\",\"div\",\"footer\",\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\",\"header\",\"main\",\"nav\",\"p\",\"section\",\"span\"];function ie(e){if(Array.isArray(e)){for(var t=0,r=Array(e.length);t<e.length;t++)r[t]=e[t];return r}return Array.from(e)}axe.utils.isShadowRoot=function(e){var t=e.nodeName.toLowerCase();return!(!e.shadowRoot||!/^[a-z][a-z0-9_.-]*-[a-z0-9_.-]*$/.test(t)&&!oe.includes(t))},axe.utils.isXHTML=function(e){\"use strict\";return!!e.createElement&&\"A\"===e.createElement(\"A\").localName},axe.utils.mergeResults=function(e,s){\"use strict\";var l=[];return e.forEach(function(u){var e,t=(e=u)&&e.results?Array.isArray(e.results)?e.results.length?e.results:null:[e.results]:null;t&&t.length&&t.forEach(function(e){var t,r,n,a,o;e.nodes&&u.frame&&(t=e.nodes,r=s,n=u.frameElement,a=u.frame,o={element:n,selector:a,xpath:axe.utils.getXpath(n)},t.forEach(function(e){e.node=axe.utils.DqElement.fromFrame(e.node,r,o);var t=axe.utils.getAllChecks(e);t.length&&t.forEach(function(e){e.relatedNodes=e.relatedNodes.map(function(e){return axe.utils.DqElement.fromFrame(e,r,o)})})}));var i=axe.utils.findBy(l,\"id\",e.id);i?e.nodes.length&&function(e,t){for(var r,n,a=t[0].node,o=0,i=e.length;o<i;o++)if(n=e[o].node,0<(r=axe.utils.nodeSorter({actualNode:n.element},{actualNode:a.element}))||0===r&&a.selector.length<n.selector.length)return e.splice.apply(e,[o,0].concat(t));e.push.apply(e,t)}(i.nodes,e.nodes):l.push(e)})}),l},axe.utils.nodeSorter=function(e,t){return(e=e.actualNode||e)===(t=t.actualNode||t)?0:4&e.compareDocumentPosition(t)?-1:1},utils.performanceTimer=function(){\"use strict\";function e(){if(window.performance&&window.performance)return window.performance.now()}var t=null,r=e();return{start:function(){this.mark(\"mark_axe_start\")},end:function(){this.mark(\"mark_axe_end\"),this.measure(\"axe\",\"mark_axe_start\",\"mark_axe_end\"),this.logMeasures(\"axe\")},auditStart:function(){this.mark(\"mark_audit_start\")},auditEnd:function(){this.mark(\"mark_audit_end\"),this.measure(\"audit_start_to_end\",\"mark_audit_start\",\"mark_audit_end\"),this.logMeasures()},mark:function(e){window.performance&&void 0!==window.performance.mark&&window.performance.mark(e)},measure:function(e,t,r){window.performance&&void 0!==window.performance.measure&&window.performance.measure(e,t,r)},logMeasures:function(e){function t(e){axe.log(\"Measure \"+e.name+\" took \"+e.duration+\"ms\")}if(window.performance&&void 0!==window.performance.getEntriesByType)for(var r=window.performance.getEntriesByType(\"measure\"),n=0;n<r.length;++n){var a=r[n];if(a.name===e)return void t(a);t(a)}},timeElapsed:function(){return e()-r},reset:function(){t||(t=e()),r=e()}}}(),\"function\"!=typeof Object.assign&&(Object.assign=function(e){\"use strict\";if(null==e)throw new TypeError(\"Cannot convert undefined or null to object\");for(var t=Object(e),r=1;r<arguments.length;r++){var n=arguments[r];if(null!=n)for(var a in n)n.hasOwnProperty(a)&&(t[a]=n[a])}return t}),Array.prototype.find||Object.defineProperty(Array.prototype,\"find\",{value:function(e){if(null===this)throw new TypeError(\"Array.prototype.find called on null or undefined\");if(\"function\"!=typeof e)throw new TypeError(\"predicate must be a function\");for(var t,r=Object(this),n=r.length>>>0,a=arguments[1],o=0;o<n;o++)if(t=r[o],e.call(a,t,o,r))return t}}),axe.utils.pollyfillElementsFromPoint=function(){if(document.elementsFromPoint)return document.elementsFromPoint;if(document.msElementsFromPoint)return document.msElementsFromPoint;var e,t=((e=document.createElement(\"x\")).style.cssText=\"pointer-events:auto\",\"auto\"===e.style.pointerEvents),u=t?\"pointer-events\":\"visibility\",s=t?\"none\":\"hidden\",l=document.createElement(\"style\");return l.innerHTML=t?\"* { pointer-events: all }\":\"* { visibility: visible }\",function(e,t){var r,n,a,o=[],i=[];for(document.head.appendChild(l);(r=document.elementFromPoint(e,t))&&-1===o.indexOf(r);)o.push(r),i.push({value:r.style.getPropertyValue(u),priority:r.style.getPropertyPriority(u)}),r.style.setProperty(u,s,\"important\");for(o.indexOf(document.documentElement)<o.length-1&&(o.splice(o.indexOf(document.documentElement),1),o.push(document.documentElement)),n=i.length;a=i[--n];)o[n].style.setProperty(u,a.value?a.value:\"\",a.priority);return document.head.removeChild(l),o}},\"function\"==typeof window.addEventListener&&(document.elementsFromPoint=axe.utils.pollyfillElementsFromPoint()),Array.prototype.includes||Object.defineProperty(Array.prototype,\"includes\",{value:function(e){\"use strict\";var t=Object(this),r=parseInt(t.length,10)||0;if(0===r)return!1;var n,a,o=parseInt(arguments[1],10)||0;for(0<=o?n=o:(n=r+o)<0&&(n=0);n<r;){if(e===(a=t[n])||e!=e&&a!=a)return!0;n++}return!1}}),Array.prototype.some||Object.defineProperty(Array.prototype,\"some\",{value:function(e){\"use strict\";if(null==this)throw new TypeError(\"Array.prototype.some called on null or undefined\");if(\"function\"!=typeof e)throw new TypeError;for(var t=Object(this),r=t.length>>>0,n=2<=arguments.length?arguments[1]:void 0,a=0;a<r;a++)if(a in t&&e.call(n,t[a],a,t))return!0;return!1}}),Array.from||Object.defineProperty(Array,\"from\",{value:(te=Object.prototype.toString,re=function(e){return\"function\"==typeof e||\"[object Function]\"===te.call(e)},ne=Math.pow(2,53)-1,ae=function(e){var t,r=(t=Number(e),isNaN(t)?0:0!==t&&isFinite(t)?(0<t?1:-1)*Math.floor(Math.abs(t)):t);return Math.min(Math.max(r,0),ne)},function(e){var t=Object(e);if(null==e)throw new TypeError(\"Array.from requires an array-like object - not null or undefined\");var r,n=1<arguments.length?arguments[1]:void 0;if(void 0!==n){if(!re(n))throw new TypeError(\"Array.from: when provided, the second argument must be a function\");2<arguments.length&&(r=arguments[2])}for(var a,o=ae(t.length),i=re(this)?Object(new this(o)):new Array(o),u=0;u<o;)a=t[u],i[u]=n?void 0===r?n(a,u):n.call(r,a,u):a,u+=1;return i.length=o,i})}),String.prototype.includes||(String.prototype.includes=function(e,t){return\"number\"!=typeof t&&(t=0),!(t+e.length>this.length)&&-1!==this.indexOf(e,t)}),axe.utils.preloadCssom=function(e){var t,r,n,a=e.timeout,o=e.treeRoot,i=void 0===o?axe._tree[0]:o,u=(t=i,r=[],n=axe.utils.querySelectorAllFilter(t,\"*\",function(e){return!r.includes(e.shadowId)&&(r.push(e.shadowId),!0)}).map(function(e){return{shadowId:e.shadowId,rootNode:axe.utils.getRootNode(e.actualNode)}}),axe.utils.uniqueArray(n,[])),s=axe.utils.queue();if(!u.length)return s;var l=document.implementation.createHTMLDocument(),c=ue(l);return s.defer(function(r,e){var t,y,v,n;(t=u,y=c,v=a,n=axe.utils.queue(),t.forEach(function(e,h){var b=e.rootNode,g=e.shadowId;return n.defer(function(e,t){return(d={rootNode:b,shadowId:g,timeout:v,convertDataToStylesheet:y,rootIndex:h+1},m=d.rootIndex,p=axe.utils.queue(),r=d,s=r.rootNode,l=r.shadowId,c=void 0,c=11===s.nodeType&&l?(i=(a=r).rootNode,u=a.convertDataToStylesheet,Array.from(i.children).filter(se).reduce(function(e,t){var r=t.nodeName.toUpperCase(),n=\"STYLE\"===r?t.textContent:t,a=\"LINK\"===r,o=u({data:n,isLink:a,root:i});return e.push(o.sheet),e},[])):(n=s,Array.from(n.styleSheets).filter(function(e){return le(e.media.mediaText)})),o=[],f=c.filter(function(e){return!e.href||!o.includes(e.href)&&(o.push(e.href),!0)}),f&&f.forEach(function(t,e){var r=[m,e];try{var n=function(t,u,s){var e=axe.utils.queue(),r=t.cssRules,n=Array.from(r);if(!n)return e;var a=n.filter(function(e){return 3===e.type});if(!a.length)return e.defer(function(e){return e({isExternal:!1,priority:s,root:u.rootNode,shadowId:u.shadowId,sheet:t})}),e;a.forEach(function(o,i){return e.defer(function(r,e){var t=o.href,n=[].concat(ie(s),[i]),a={method:\"get\",url:t,timeout:u.timeout};axe.imports.axios(a).then(function(e){var t=e.data;return r(u.convertDataToStylesheet({data:t,isExternal:!0,priority:n,root:u.rootNode,shadowId:u.shadowId}))}).catch(e)})});var o=n.filter(function(e){return 3!==e.type});return o.length&&e.defer(function(e){return e(u.convertDataToStylesheet({data:o.map(function(e){return e.cssText}).join(),isExternal:!1,priority:s,root:u.rootNode,shadowId:u.shadowId}))}),e}(t,d,r);p.defer(n)}catch(e){var a=function(e,n,a){var t=axe.utils.queue();if(!e)return t;var o={method:\"get\",url:e,timeout:n.timeout};return t.defer(function(r,e){axe.imports.axios(o).then(function(e){var t=e.data;return r(n.convertDataToStylesheet({data:t,isExternal:!0,priority:a,root:n.rootNode,shadowId:n.shadowId}))}).catch(e)}),t}(t.href,d,r);p.defer(a)}}),p).then(e).catch(t);var r,n,a,i,u,o,s,l,c,d,m,p,f})}),n).then(function(e){var t=function t(e){var r=[];e.forEach(function(e){Array.isArray(e)?r.push.apply(r,ie(t(e))):r.push(e)});return r}(e);r(t)}).catch(e)}),s};var ue=function(c){return function(e){var t=e.data,r=e.isExternal,n=e.shadowId,a=e.root,o=e.priority,i=e.isLink,u=void 0!==i&&i,s=c.createElement(\"style\");if(u){var l=c.createTextNode('@import \"'+t.href+'\"');s.appendChild(l)}else s.appendChild(c.createTextNode(t));return c.head.appendChild(s),{sheet:s.sheet,isExternal:r,shadowId:n,root:a,priority:o}}};function se(e){var t=e.nodeName.toUpperCase(),r=e.getAttribute(\"href\"),n=e.getAttribute(\"rel\"),a=\"LINK\"===t&&r&&n&&e.rel.toUpperCase().includes(\"STYLESHEET\");return\"STYLE\"===t||a&&le(e.media)}function le(e){return!e||!e.toUpperCase().includes(\"PRINT\")}N=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e};axe.utils.shouldPreload=function(e){return!e||void 0===e.preload||null===e.preload||(\"boolean\"==typeof e.preload?e.preload:\"object\"===(void 0===(t=e.preload)?\"undefined\":N(t))&&Array.isArray(t.assets));var t},axe.utils.getPreloadConfig=function(e){var t={assets:axe.constants.preloadAssets,timeout:axe.constants.preloadAssetsTimeout};if(!e.preload)return t;if(\"boolean\"==typeof e.preload)return t;if(!e.preload.assets.every(function(e){return axe.constants.preloadAssets.includes(e.toLowerCase())}))throw new Error(\"Requested assets, not supported. Supported assets are: \"+axe.constants.preloadAssets.join(\", \")+\".\");return t.assets=axe.utils.uniqueArray(e.preload.assets.map(function(e){return e.toLowerCase()}),[]),e.preload.timeout&&\"number\"==typeof e.preload.timeout&&!Number.isNaN(e.preload.timeout)&&(t.timeout=e.preload.timeout),t},axe.utils.preload=function(e){var t={cssom:axe.utils.preloadCssom},r=axe.utils.queue();if(!axe.utils.shouldPreload(e))return r;var n=axe.utils.getPreloadConfig(e);return n.assets.forEach(function(o){r.defer(function(a,e){t[o](n).then(function(e){var t,r,n;a((t={},r=o,n=e[0],r in t?Object.defineProperty(t,r,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[r]=n,t))}).catch(e)})}),r};N=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e};function ce(a,o){\"use strict\";return function(e){var t=a[e.id]||{},r=t.messages||{},n=Object.assign({},t);delete n.messages,void 0===e.result?\"object\"===N(r.incomplete)?n.message=function(){return function(t,r){function n(e){return e.incomplete&&e.incomplete.default?e.incomplete.default:i.incompleteFallbackMessage()}if(!t||!t.missingData)return n(r);try{var e=r.incomplete[t.missingData[0].reason];if(!e)throw new Error;return e}catch(e){return\"string\"==typeof t.missingData?r.incomplete[t.missingData]:n(r)}}(e.data,r)}:n.message=r.incomplete:n.message=e.result===o?r.pass:r.fail,axe.utils.extendMetaData(e,n)}}axe.utils.publishMetaData=function(e){\"use strict\";var t=axe._audit.data.checks||{},r=axe._audit.data.rules||{},n=axe.utils.findBy(axe._audit.rules,\"id\",e.id)||{};e.tags=axe.utils.clone(n.tags||[]);var a=ce(t,!0),o=ce(t,!1);e.nodes.forEach(function(e){e.any.forEach(a),e.all.forEach(a),e.none.forEach(o)}),axe.utils.extendMetaData(e,axe.utils.clone(r[e.id]||{}))};var de=function(){},me=function(){};var pe,fe=(pe=/(?=[\\-\\[\\]{}()*+?.\\\\\\^$|,#\\s])/g,function(e){return e.replace(pe,\"\\\\\")}),he=/\\\\/g;function be(e){if(e)return e.map(function(e){var t,r,n=e.name.replace(he,\"\"),a=(e.value||\"\").replace(he,\"\");switch(e.operator){case\"^=\":r=new RegExp(\"^\"+fe(a));break;case\"$=\":r=new RegExp(fe(a)+\"$\");break;case\"~=\":r=new RegExp(\"(^|\\\\s)\"+fe(a)+\"(\\\\s|$)\");break;case\"|=\":r=new RegExp(\"^\"+fe(a)+\"(-|$)\");break;case\"=\":t=function(e){return a===e};break;case\"*=\":t=function(e){return e&&e.includes(a)};break;case\"!=\":t=function(e){return a!==e};break;default:t=function(e){return!!e}}return\"\"===a&&/^[*$^]=$/.test(e.operator)&&(t=function(){return!1}),t||(t=function(e){return e&&r.test(e)}),{key:n,value:a,test:t}})}function ge(e){if(e)return e.map(function(e){return{value:e=e.replace(he,\"\"),regexp:new RegExp(\"(^|\\\\s)\"+fe(e)+\"(\\\\s|$)\")}})}function ye(e){if(e)return e.map(function(e){var t;return\"not\"===e.name&&(t=(t=axe.utils.cssParser.parse(e.value)).selectors?t.selectors:[t],t=de(t)),{name:e.name,expressions:t,value:e.value}})}function ve(e,t,r,n){var a={nodes:e.slice(),anyLevel:t,thisLevel:r,parentShadowId:n};return a.nodes.reverse(),a}function De(e,t){return c=e.actualNode,d=t[0],1===c.nodeType&&(\"*\"===d.tag||c.nodeName.toLowerCase()===d.tag)&&(s=e.actualNode,!(l=t[0]).classes||l.classes.reduce(function(e,t){return e&&s.className&&s.className.match(t.regexp)},!0))&&(i=e.actualNode,!(u=t[0]).attributes||u.attributes.reduce(function(e,t){var r=i.getAttribute(t.key);return e&&null!==r&&(!t.value||t.test(r))},!0))&&(a=e.actualNode,!(o=t[0]).id||a.id===o.id)&&(r=e,!((n=t[0]).pseudos&&!n.pseudos.reduce(function(e,t){if(\"not\"===t.name)return e&&!me([r],t.expressions,!1).length;throw new Error(\"the pseudo selector \"+t.name+\" has not yet been implemented\")},!0)));var r,n,a,o,i,u,s,l,c,d}de=function(e){return e.map(function(e){for(var t=[],r=e.rule;r;)t.push({tag:r.tagName?r.tagName.toLowerCase():\"*\",combinator:r.nestingOperator?r.nestingOperator:\" \",id:r.id,attributes:be(r.attrs),classes:ge(r.classNames),pseudos:ye(r.pseudos)}),r=r.rule;return t})},me=function(e,t,r,n){for(var a=[],o=ve(Array.isArray(e)?e:[e],t,[],e[0].shadowId),i=[];o.nodes.length;){for(var u=o.nodes.pop(),s=[],l=[],c=o.anyLevel.slice().concat(o.thisLevel),d=!1,m=0;m<c.length;m++){var p=c[m];if(De(u,p)&&(!p[0].id||u.shadowId===o.parentShadowId))if(1===p.length)d||n&&!n(u)||(i.push(u),d=!0);else{var f=p.slice(1);if(!1===[\" \",\">\"].includes(f[0].combinator))throw new Error(\"axe.utils.querySelectorAll does not support the combinator: \"+p[1].combinator);\">\"===f[0].combinator?s.push(f):l.push(f)}!o.anyLevel.includes(p)||p[0].id&&u.shadowId!==o.parentShadowId||l.push(p)}for(u.children&&u.children.length&&r&&(a.push(o),o=ve(u.children,l,s,u.shadowId));!o.nodes.length&&a.length;)o=a.pop()}return i},axe.utils.querySelectorAll=function(e,t){return axe.utils.querySelectorAllFilter(e,t)},axe.utils.querySelectorAllFilter=function(e,t,r){e=Array.isArray(e)?e:[e];var n=axe.utils.cssParser.parse(t);return n=n.selectors?n.selectors:[n],n=de(n),me(e,n,!0,r)};N=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e};!function(){\"use strict\";function m(){}function p(e){if(\"function\"!=typeof e)throw new TypeError(\"Queue methods require functions as arguments\")}axe.utils.queue=function(){var t,n=[],a=0,o=0,r=m,i=!1,u=function(e){t=e,setTimeout(function(){null!=t&&axe.log(\"Uncaught error (of queue)\",t)},1)},s=u;function l(t){return function(e){n[t]=e,(o-=1)||r===m||(i=!0,r(n))}}function c(e){return r=m,s(e),n}var d={defer:function(e){if(\"object\"===(void 0===e?\"undefined\":N(e))&&e.then&&e.catch){var r=e;e=function(e,t){r.then(e).catch(t)}}if(p(e),void 0===t){if(i)throw new Error(\"Queue already completed\");return n.push(e),++o,function(){for(var e=n.length;a<e;a++){var t=n[a];try{t.call(null,l(a),c)}catch(e){c(e)}}}(),d}},then:function(e){if(p(e),r!==m)throw new Error(\"queue `then` already set\");return t||(r=e,o||(i=!0,r(n))),d},catch:function(e){if(p(e),s!==u)throw new Error(\"queue `catch` already set\");return t?(e(t),t=null):s=e,d},abort:c};return d}}();var we;N=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e};function ke(t,e){\"use strict\";var r,n,a=axe._audit&&axe._audit.tagExclude?axe._audit.tagExclude:[];return n=e.hasOwnProperty(\"include\")||e.hasOwnProperty(\"exclude\")?(r=e.include||[],r=Array.isArray(r)?r:[r],n=e.exclude||[],(n=Array.isArray(n)?n:[n]).concat(a.filter(function(e){return-1===r.indexOf(e)}))):(r=Array.isArray(e)?e:[e],a.filter(function(e){return-1===r.indexOf(e)})),!!(r.some(function(e){return-1!==t.tags.indexOf(e)})||0===r.length&&!1!==t.enabled)&&n.every(function(e){return-1===t.tags.indexOf(e)})}function xe(e){return Array.from(e.children).reduce(function(e,t){var r=function(e){var t=window.getComputedStyle(e),r=\"visible\"===t.getPropertyValue(\"overflow-y\"),n=\"visible\"===t.getPropertyValue(\"overflow-x\");if(!r&&e.scrollHeight>e.clientHeight||!n&&e.scrollWidth>e.clientWidth)return{elm:e,top:e.scrollTop,left:e.scrollLeft}}(t);return r&&e.push(r),e.concat(xe(t))},[])}function Ee(e){\"use strict\";return e.sort(function(e,t){return axe.utils.contains(e,t)?1:-1})[0]}function Ce(t,e){\"use strict\";var r=e.include&&Ee(e.include.filter(function(e){return axe.utils.contains(e,t)})),n=e.exclude&&Ee(e.exclude.filter(function(e){return axe.utils.contains(e,t)}));return!!(!n&&r||n&&axe.utils.contains(n,r))}function Ae(e,t){\"use strict\";var r;if(0===e.length)return t;e.length<t.length&&(r=e,e=t,t=r);for(var n=0,a=t.length;n<a;n++)e.includes(t[n])||e.push(t[n]);return e}!function(e){\"use strict\";var s={},i={},u=Object.freeze([\"EvalError\",\"RangeError\",\"ReferenceError\",\"SyntaxError\",\"TypeError\",\"URIError\"]);function l(){var e=\"axeAPI\",t=\"\";return void 0!==axe&&axe._audit&&axe._audit.application&&(e=axe._audit.application),void 0!==axe&&(t=axe.version),e+\".\"+t}function c(e,t,r,n,a,o){var i;r instanceof Error&&(i={name:r.name,message:r.message,stack:r.stack},r=void 0);var u={uuid:n,topic:t,message:r,error:i,_respondable:!0,_source:l(),_keepalive:a};\"function\"==typeof o&&(s[n]=o),e.postMessage(JSON.stringify(u),\"*\")}function t(e,t,r,n,a){c(e,t,r,we.v1(),n,a)}function d(n,a,o){return function(e,t,r){c(n,a,e,o,t,r)}}function o(e){var t;if(\"string\"==typeof e){try{t=JSON.parse(e)}catch(e){}var r,n,a,o;if(function(e){if(\"object\"!==(void 0===e?\"undefined\":N(e))||\"string\"!=typeof e.uuid||!0!==e._respondable)return!1;var t=l();return e._source===t||\"axeAPI.x.y.z\"===e._source||\"axeAPI.x.y.z\"===t}(t))return\"object\"===N(t.error)?t.error=(r=t.error,n=r.message||\"Unknown error occurred\",a=u.includes(r.name)?r.name:\"Error\",o=window[a]||Error,r.stack&&(n+=\"\\n\"+r.stack.replace(r.message,\"\")),new o(n)):t.error=void 0,t}}t.subscribe=function(e,t){i[e]=t},t.isInFrame=function(e){return!!(e=e||window).frameElement},\"function\"==typeof window.addEventListener&&window.addEventListener(\"message\",function(t){var r=o(t.data);if(r){var n=r.uuid,e=r._keepalive,a=s[n];if(a)a(r.error||r.message,e,d(t.source,r.topic,n)),e||delete s[n];if(!r.error)try{!function(e,t,r){var n=t.topic,a=i[n];if(a){var o=d(e,null,t.uuid);a(t.message,r,o)}}(t.source,r,e)}catch(e){c(t.source,r.topic,e,n,!1)}}},!1),e.respondable=t}(utils),axe.utils.ruleShouldRun=function(e,t,r){\"use strict\";var n=r.runOnly||{},a=(r.rules||{})[e.id];return!(e.pageLevel&&!t.page)&&(\"rule\"===n.type?-1!==n.values.indexOf(e.id):a&&\"boolean\"==typeof a.enabled?a.enabled:\"tag\"===n.type&&n.values?ke(e,n.values):ke(e,[]))},axe.utils.getScrollState=function(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:window,t=e.document.documentElement;return[void 0!==e.pageXOffset?{elm:e,top:e.pageYOffset,left:e.pageXOffset}:{elm:t,top:t.scrollTop,left:t.scrollLeft}].concat(xe(document.body))},axe.utils.setScrollState=function(e){e.forEach(function(e){return function(e,t,r){if(e===window)return e.scroll(t,r);e.scrollTop=t,e.scrollLeft=r}(e.elm,e.top,e.left)})},axe.utils.select=function(e,t){\"use strict\";var r,n=[];if(axe._selectCache)for(var a=0,o=axe._selectCache.length;a<o;a++){var i=axe._selectCache[a];if(i.selector===e)return i.result}for(var u,s=(u=t,function(e){return Ce(e,u)}),l=t.include.reduce(function(e,t){return e.length&&e[e.length-1].actualNode.contains(t.actualNode)||e.push(t),e},[]),c=0;c<l.length;c++)(r=l[c]).actualNode.nodeType===r.actualNode.ELEMENT_NODE&&axe.utils.matchesSelector(r.actualNode,e)&&s(r)&&(n=Ae(n,[r])),n=Ae(n,axe.utils.querySelectorAllFilter(r,e,s));return axe._selectCache&&axe._selectCache.push({selector:e,result:n}),n},axe.utils.toArray=function(e){\"use strict\";return Array.prototype.slice.call(e)},axe.utils.uniqueArray=function(e,t){return e.concat(t).filter(function(e,t,r){return r.indexOf(e)===t})},axe.utils.tokenList=function(e){\"use strict\";return e.trim().replace(/\\s{2,}/g,\" \").split(\" \")},function(e){var i,t=e.crypto||e.msCrypto;if(!i&&t&&t.getRandomValues){var r=new Uint8Array(16);i=function(){return t.getRandomValues(r),r}}if(!i){var n=new Array(16);i=function(){for(var e,t=0;t<16;t++)0==(3&t)&&(e=4294967296*Math.random()),n[t]=e>>>((3&t)<<3)&255;return n}}for(var u=\"function\"==typeof e.Buffer?e.Buffer:Array,a=[],o={},s=0;s<256;s++)a[s]=(s+256).toString(16).substr(1),o[a[s]]=s;function p(e,t){var r=t||0,n=a;return n[e[r++]]+n[e[r++]]+n[e[r++]]+n[e[r++]]+\"-\"+n[e[r++]]+n[e[r++]]+\"-\"+n[e[r++]]+n[e[r++]]+\"-\"+n[e[r++]]+n[e[r++]]+\"-\"+n[e[r++]]+n[e[r++]]+n[e[r++]]+n[e[r++]]+n[e[r++]]+n[e[r++]]}var l=i(),f=[1|l[0],l[1],l[2],l[3],l[4],l[5]],h=16383&(l[6]<<8|l[7]),b=0,g=0;function c(e,t,r){var n=t&&r||0;\"string\"==typeof e&&(t=\"binary\"==e?new u(16):null,e=null);var a=(e=e||{}).random||(e.rng||i)();if(a[6]=15&a[6]|64,a[8]=63&a[8]|128,t)for(var o=0;o<16;o++)t[n+o]=a[o];return t||p(a)}(we=c).v1=function(e,t,r){var n=t&&r||0,a=t||[],o=null!=(e=e||{}).clockseq?e.clockseq:h,i=null!=e.msecs?e.msecs:(new Date).getTime(),u=null!=e.nsecs?e.nsecs:g+1,s=i-b+(u-g)/1e4;if(s<0&&null==e.clockseq&&(o=o+1&16383),(s<0||b<i)&&null==e.nsecs&&(u=0),1e4<=u)throw new Error(\"uuid.v1(): Can't create more than 10M uuids/sec\");b=i,h=o;var l=(1e4*(268435455&(i+=122192928e5))+(g=u))%4294967296;a[n++]=l>>>24&255,a[n++]=l>>>16&255,a[n++]=l>>>8&255,a[n++]=255&l;var c=i/4294967296*1e4&268435455;a[n++]=c>>>8&255,a[n++]=255&c,a[n++]=c>>>24&15|16,a[n++]=c>>>16&255,a[n++]=o>>>8|128,a[n++]=255&o;for(var d=e.node||f,m=0;m<6;m++)a[n+m]=d[m];return t||p(a)},we.v4=c,we.parse=function(e,t,r){var n=t&&r||0,a=0;for(t=t||[],e.toLowerCase().replace(/[0-9a-f]{2}/g,function(e){a<16&&(t[n+a++]=o[e])});a<16;)t[n+a++]=0;return t},we.unparse=p,we.BufferClass=u}(window),axe.utils.validInputTypes=function(){\"use strict\";return[\"hidden\",\"text\",\"search\",\"tel\",\"url\",\"email\",\"password\",\"date\",\"month\",\"week\",\"time\",\"datetime-local\",\"number\",\"range\",\"color\",\"checkbox\",\"radio\",\"file\",\"submit\",\"image\",\"reset\",\"button\"]};var Fe=[\"aa\",\"ab\",\"ae\",\"af\",\"ak\",\"am\",\"an\",\"ar\",\"as\",\"av\",\"ay\",\"az\",\"ba\",\"be\",\"bg\",\"bh\",\"bi\",\"bm\",\"bn\",\"bo\",\"br\",\"bs\",\"ca\",\"ce\",\"ch\",\"co\",\"cr\",\"cs\",\"cu\",\"cv\",\"cy\",\"da\",\"de\",\"dv\",\"dz\",\"ee\",\"el\",\"en\",\"eo\",\"es\",\"et\",\"eu\",\"fa\",\"ff\",\"fi\",\"fj\",\"fo\",\"fr\",\"fy\",\"ga\",\"gd\",\"gl\",\"gn\",\"gu\",\"gv\",\"ha\",\"he\",\"hi\",\"ho\",\"hr\",\"ht\",\"hu\",\"hy\",\"hz\",\"ia\",\"id\",\"ie\",\"ig\",\"ii\",\"ik\",\"in\",\"io\",\"is\",\"it\",\"iu\",\"iw\",\"ja\",\"ji\",\"jv\",\"jw\",\"ka\",\"kg\",\"ki\",\"kj\",\"kk\",\"kl\",\"km\",\"kn\",\"ko\",\"kr\",\"ks\",\"ku\",\"kv\",\"kw\",\"ky\",\"la\",\"lb\",\"lg\",\"li\",\"ln\",\"lo\",\"lt\",\"lu\",\"lv\",\"mg\",\"mh\",\"mi\",\"mk\",\"ml\",\"mn\",\"mo\",\"mr\",\"ms\",\"mt\",\"my\",\"na\",\"nb\",\"nd\",\"ne\",\"ng\",\"nl\",\"nn\",\"no\",\"nr\",\"nv\",\"ny\",\"oc\",\"oj\",\"om\",\"or\",\"os\",\"pa\",\"pi\",\"pl\",\"ps\",\"pt\",\"qu\",\"rm\",\"rn\",\"ro\",\"ru\",\"rw\",\"sa\",\"sc\",\"sd\",\"se\",\"sg\",\"sh\",\"si\",\"sk\",\"sl\",\"sm\",\"sn\",\"so\",\"sq\",\"sr\",\"ss\",\"st\",\"su\",\"sv\",\"sw\",\"ta\",\"te\",\"tg\",\"th\",\"ti\",\"tk\",\"tl\",\"tn\",\"to\",\"tr\",\"ts\",\"tt\",\"tw\",\"ty\",\"ug\",\"uk\",\"ur\",\"uz\",\"ve\",\"vi\",\"vo\",\"wa\",\"wo\",\"xh\",\"yi\",\"yo\",\"za\",\"zh\",\"zu\",\"aaa\",\"aab\",\"aac\",\"aad\",\"aae\",\"aaf\",\"aag\",\"aah\",\"aai\",\"aak\",\"aal\",\"aam\",\"aan\",\"aao\",\"aap\",\"aaq\",\"aas\",\"aat\",\"aau\",\"aav\",\"aaw\",\"aax\",\"aaz\",\"aba\",\"abb\",\"abc\",\"abd\",\"abe\",\"abf\",\"abg\",\"abh\",\"abi\",\"abj\",\"abl\",\"abm\",\"abn\",\"abo\",\"abp\",\"abq\",\"abr\",\"abs\",\"abt\",\"abu\",\"abv\",\"abw\",\"abx\",\"aby\",\"abz\",\"aca\",\"acb\",\"acd\",\"ace\",\"acf\",\"ach\",\"aci\",\"ack\",\"acl\",\"acm\",\"acn\",\"acp\",\"acq\",\"acr\",\"acs\",\"act\",\"acu\",\"acv\",\"acw\",\"acx\",\"acy\",\"acz\",\"ada\",\"adb\",\"add\",\"ade\",\"adf\",\"adg\",\"adh\",\"adi\",\"adj\",\"adl\",\"adn\",\"ado\",\"adp\",\"adq\",\"adr\",\"ads\",\"adt\",\"adu\",\"adw\",\"adx\",\"ady\",\"adz\",\"aea\",\"aeb\",\"aec\",\"aed\",\"aee\",\"aek\",\"ael\",\"aem\",\"aen\",\"aeq\",\"aer\",\"aes\",\"aeu\",\"aew\",\"aey\",\"aez\",\"afa\",\"afb\",\"afd\",\"afe\",\"afg\",\"afh\",\"afi\",\"afk\",\"afn\",\"afo\",\"afp\",\"afs\",\"aft\",\"afu\",\"afz\",\"aga\",\"agb\",\"agc\",\"agd\",\"age\",\"agf\",\"agg\",\"agh\",\"agi\",\"agj\",\"agk\",\"agl\",\"agm\",\"agn\",\"ago\",\"agp\",\"agq\",\"agr\",\"ags\",\"agt\",\"agu\",\"agv\",\"agw\",\"agx\",\"agy\",\"agz\",\"aha\",\"ahb\",\"ahg\",\"ahh\",\"ahi\",\"ahk\",\"ahl\",\"ahm\",\"ahn\",\"aho\",\"ahp\",\"ahr\",\"ahs\",\"aht\",\"aia\",\"aib\",\"aic\",\"aid\",\"aie\",\"aif\",\"aig\",\"aih\",\"aii\",\"aij\",\"aik\",\"ail\",\"aim\",\"ain\",\"aio\",\"aip\",\"aiq\",\"air\",\"ais\",\"ait\",\"aiw\",\"aix\",\"aiy\",\"aja\",\"ajg\",\"aji\",\"ajn\",\"ajp\",\"ajt\",\"aju\",\"ajw\",\"ajz\",\"akb\",\"akc\",\"akd\",\"ake\",\"akf\",\"akg\",\"akh\",\"aki\",\"akj\",\"akk\",\"akl\",\"akm\",\"ako\",\"akp\",\"akq\",\"akr\",\"aks\",\"akt\",\"aku\",\"akv\",\"akw\",\"akx\",\"aky\",\"akz\",\"ala\",\"alc\",\"ald\",\"ale\",\"alf\",\"alg\",\"alh\",\"ali\",\"alj\",\"alk\",\"all\",\"alm\",\"aln\",\"alo\",\"alp\",\"alq\",\"alr\",\"als\",\"alt\",\"alu\",\"alv\",\"alw\",\"alx\",\"aly\",\"alz\",\"ama\",\"amb\",\"amc\",\"ame\",\"amf\",\"amg\",\"ami\",\"amj\",\"amk\",\"aml\",\"amm\",\"amn\",\"amo\",\"amp\",\"amq\",\"amr\",\"ams\",\"amt\",\"amu\",\"amv\",\"amw\",\"amx\",\"amy\",\"amz\",\"ana\",\"anb\",\"anc\",\"and\",\"ane\",\"anf\",\"ang\",\"anh\",\"ani\",\"anj\",\"ank\",\"anl\",\"anm\",\"ann\",\"ano\",\"anp\",\"anq\",\"anr\",\"ans\",\"ant\",\"anu\",\"anv\",\"anw\",\"anx\",\"any\",\"anz\",\"aoa\",\"aob\",\"aoc\",\"aod\",\"aoe\",\"aof\",\"aog\",\"aoh\",\"aoi\",\"aoj\",\"aok\",\"aol\",\"aom\",\"aon\",\"aor\",\"aos\",\"aot\",\"aou\",\"aox\",\"aoz\",\"apa\",\"apb\",\"apc\",\"apd\",\"ape\",\"apf\",\"apg\",\"aph\",\"api\",\"apj\",\"apk\",\"apl\",\"apm\",\"apn\",\"apo\",\"app\",\"apq\",\"apr\",\"aps\",\"apt\",\"apu\",\"apv\",\"apw\",\"apx\",\"apy\",\"apz\",\"aqa\",\"aqc\",\"aqd\",\"aqg\",\"aql\",\"aqm\",\"aqn\",\"aqp\",\"aqr\",\"aqt\",\"aqz\",\"arb\",\"arc\",\"ard\",\"are\",\"arh\",\"ari\",\"arj\",\"ark\",\"arl\",\"arn\",\"aro\",\"arp\",\"arq\",\"arr\",\"ars\",\"art\",\"aru\",\"arv\",\"arw\",\"arx\",\"ary\",\"arz\",\"asa\",\"asb\",\"asc\",\"asd\",\"ase\",\"asf\",\"asg\",\"ash\",\"asi\",\"asj\",\"ask\",\"asl\",\"asn\",\"aso\",\"asp\",\"asq\",\"asr\",\"ass\",\"ast\",\"asu\",\"asv\",\"asw\",\"asx\",\"asy\",\"asz\",\"ata\",\"atb\",\"atc\",\"atd\",\"ate\",\"atg\",\"ath\",\"ati\",\"atj\",\"atk\",\"atl\",\"atm\",\"atn\",\"ato\",\"atp\",\"atq\",\"atr\",\"ats\",\"att\",\"atu\",\"atv\",\"atw\",\"atx\",\"aty\",\"atz\",\"aua\",\"aub\",\"auc\",\"aud\",\"aue\",\"auf\",\"aug\",\"auh\",\"aui\",\"auj\",\"auk\",\"aul\",\"aum\",\"aun\",\"auo\",\"aup\",\"auq\",\"aur\",\"aus\",\"aut\",\"auu\",\"auw\",\"aux\",\"auy\",\"auz\",\"avb\",\"avd\",\"avi\",\"avk\",\"avl\",\"avm\",\"avn\",\"avo\",\"avs\",\"avt\",\"avu\",\"avv\",\"awa\",\"awb\",\"awc\",\"awd\",\"awe\",\"awg\",\"awh\",\"awi\",\"awk\",\"awm\",\"awn\",\"awo\",\"awr\",\"aws\",\"awt\",\"awu\",\"awv\",\"aww\",\"awx\",\"awy\",\"axb\",\"axe\",\"axg\",\"axk\",\"axl\",\"axm\",\"axx\",\"aya\",\"ayb\",\"ayc\",\"ayd\",\"aye\",\"ayg\",\"ayh\",\"ayi\",\"ayk\",\"ayl\",\"ayn\",\"ayo\",\"ayp\",\"ayq\",\"ayr\",\"ays\",\"ayt\",\"ayu\",\"ayx\",\"ayy\",\"ayz\",\"aza\",\"azb\",\"azc\",\"azd\",\"azg\",\"azj\",\"azm\",\"azn\",\"azo\",\"azt\",\"azz\",\"baa\",\"bab\",\"bac\",\"bad\",\"bae\",\"baf\",\"bag\",\"bah\",\"bai\",\"baj\",\"bal\",\"ban\",\"bao\",\"bap\",\"bar\",\"bas\",\"bat\",\"bau\",\"bav\",\"baw\",\"bax\",\"bay\",\"baz\",\"bba\",\"bbb\",\"bbc\",\"bbd\",\"bbe\",\"bbf\",\"bbg\",\"bbh\",\"bbi\",\"bbj\",\"bbk\",\"bbl\",\"bbm\",\"bbn\",\"bbo\",\"bbp\",\"bbq\",\"bbr\",\"bbs\",\"bbt\",\"bbu\",\"bbv\",\"bbw\",\"bbx\",\"bby\",\"bbz\",\"bca\",\"bcb\",\"bcc\",\"bcd\",\"bce\",\"bcf\",\"bcg\",\"bch\",\"bci\",\"bcj\",\"bck\",\"bcl\",\"bcm\",\"bcn\",\"bco\",\"bcp\",\"bcq\",\"bcr\",\"bcs\",\"bct\",\"bcu\",\"bcv\",\"bcw\",\"bcy\",\"bcz\",\"bda\",\"bdb\",\"bdc\",\"bdd\",\"bde\",\"bdf\",\"bdg\",\"bdh\",\"bdi\",\"bdj\",\"bdk\",\"bdl\",\"bdm\",\"bdn\",\"bdo\",\"bdp\",\"bdq\",\"bdr\",\"bds\",\"bdt\",\"bdu\",\"bdv\",\"bdw\",\"bdx\",\"bdy\",\"bdz\",\"bea\",\"beb\",\"bec\",\"bed\",\"bee\",\"bef\",\"beg\",\"beh\",\"bei\",\"bej\",\"bek\",\"bem\",\"beo\",\"bep\",\"beq\",\"ber\",\"bes\",\"bet\",\"beu\",\"bev\",\"bew\",\"bex\",\"bey\",\"bez\",\"bfa\",\"bfb\",\"bfc\",\"bfd\",\"bfe\",\"bff\",\"bfg\",\"bfh\",\"bfi\",\"bfj\",\"bfk\",\"bfl\",\"bfm\",\"bfn\",\"bfo\",\"bfp\",\"bfq\",\"bfr\",\"bfs\",\"bft\",\"bfu\",\"bfw\",\"bfx\",\"bfy\",\"bfz\",\"bga\",\"bgb\",\"bgc\",\"bgd\",\"bge\",\"bgf\",\"bgg\",\"bgi\",\"bgj\",\"bgk\",\"bgl\",\"bgm\",\"bgn\",\"bgo\",\"bgp\",\"bgq\",\"bgr\",\"bgs\",\"bgt\",\"bgu\",\"bgv\",\"bgw\",\"bgx\",\"bgy\",\"bgz\",\"bha\",\"bhb\",\"bhc\",\"bhd\",\"bhe\",\"bhf\",\"bhg\",\"bhh\",\"bhi\",\"bhj\",\"bhk\",\"bhl\",\"bhm\",\"bhn\",\"bho\",\"bhp\",\"bhq\",\"bhr\",\"bhs\",\"bht\",\"bhu\",\"bhv\",\"bhw\",\"bhx\",\"bhy\",\"bhz\",\"bia\",\"bib\",\"bic\",\"bid\",\"bie\",\"bif\",\"big\",\"bij\",\"bik\",\"bil\",\"bim\",\"bin\",\"bio\",\"bip\",\"biq\",\"bir\",\"bit\",\"biu\",\"biv\",\"biw\",\"bix\",\"biy\",\"biz\",\"bja\",\"bjb\",\"bjc\",\"bjd\",\"bje\",\"bjf\",\"bjg\",\"bjh\",\"bji\",\"bjj\",\"bjk\",\"bjl\",\"bjm\",\"bjn\",\"bjo\",\"bjp\",\"bjq\",\"bjr\",\"bjs\",\"bjt\",\"bju\",\"bjv\",\"bjw\",\"bjx\",\"bjy\",\"bjz\",\"bka\",\"bkb\",\"bkc\",\"bkd\",\"bkf\",\"bkg\",\"bkh\",\"bki\",\"bkj\",\"bkk\",\"bkl\",\"bkm\",\"bkn\",\"bko\",\"bkp\",\"bkq\",\"bkr\",\"bks\",\"bkt\",\"bku\",\"bkv\",\"bkw\",\"bkx\",\"bky\",\"bkz\",\"bla\",\"blb\",\"blc\",\"bld\",\"ble\",\"blf\",\"blg\",\"blh\",\"bli\",\"blj\",\"blk\",\"bll\",\"blm\",\"bln\",\"blo\",\"blp\",\"blq\",\"blr\",\"bls\",\"blt\",\"blv\",\"blw\",\"blx\",\"bly\",\"blz\",\"bma\",\"bmb\",\"bmc\",\"bmd\",\"bme\",\"bmf\",\"bmg\",\"bmh\",\"bmi\",\"bmj\",\"bmk\",\"bml\",\"bmm\",\"bmn\",\"bmo\",\"bmp\",\"bmq\",\"bmr\",\"bms\",\"bmt\",\"bmu\",\"bmv\",\"bmw\",\"bmx\",\"bmy\",\"bmz\",\"bna\",\"bnb\",\"bnc\",\"bnd\",\"bne\",\"bnf\",\"bng\",\"bni\",\"bnj\",\"bnk\",\"bnl\",\"bnm\",\"bnn\",\"bno\",\"bnp\",\"bnq\",\"bnr\",\"bns\",\"bnt\",\"bnu\",\"bnv\",\"bnw\",\"bnx\",\"bny\",\"bnz\",\"boa\",\"bob\",\"boe\",\"bof\",\"bog\",\"boh\",\"boi\",\"boj\",\"bok\",\"bol\",\"bom\",\"bon\",\"boo\",\"bop\",\"boq\",\"bor\",\"bot\",\"bou\",\"bov\",\"bow\",\"box\",\"boy\",\"boz\",\"bpa\",\"bpb\",\"bpd\",\"bpg\",\"bph\",\"bpi\",\"bpj\",\"bpk\",\"bpl\",\"bpm\",\"bpn\",\"bpo\",\"bpp\",\"bpq\",\"bpr\",\"bps\",\"bpt\",\"bpu\",\"bpv\",\"bpw\",\"bpx\",\"bpy\",\"bpz\",\"bqa\",\"bqb\",\"bqc\",\"bqd\",\"bqf\",\"bqg\",\"bqh\",\"bqi\",\"bqj\",\"bqk\",\"bql\",\"bqm\",\"bqn\",\"bqo\",\"bqp\",\"bqq\",\"bqr\",\"bqs\",\"bqt\",\"bqu\",\"bqv\",\"bqw\",\"bqx\",\"bqy\",\"bqz\",\"bra\",\"brb\",\"brc\",\"brd\",\"brf\",\"brg\",\"brh\",\"bri\",\"brj\",\"brk\",\"brl\",\"brm\",\"brn\",\"bro\",\"brp\",\"brq\",\"brr\",\"brs\",\"brt\",\"bru\",\"brv\",\"brw\",\"brx\",\"bry\",\"brz\",\"bsa\",\"bsb\",\"bsc\",\"bse\",\"bsf\",\"bsg\",\"bsh\",\"bsi\",\"bsj\",\"bsk\",\"bsl\",\"bsm\",\"bsn\",\"bso\",\"bsp\",\"bsq\",\"bsr\",\"bss\",\"bst\",\"bsu\",\"bsv\",\"bsw\",\"bsx\",\"bsy\",\"bta\",\"btb\",\"btc\",\"btd\",\"bte\",\"btf\",\"btg\",\"bth\",\"bti\",\"btj\",\"btk\",\"btl\",\"btm\",\"btn\",\"bto\",\"btp\",\"btq\",\"btr\",\"bts\",\"btt\",\"btu\",\"btv\",\"btw\",\"btx\",\"bty\",\"btz\",\"bua\",\"bub\",\"buc\",\"bud\",\"bue\",\"buf\",\"bug\",\"buh\",\"bui\",\"buj\",\"buk\",\"bum\",\"bun\",\"buo\",\"bup\",\"buq\",\"bus\",\"but\",\"buu\",\"buv\",\"buw\",\"bux\",\"buy\",\"buz\",\"bva\",\"bvb\",\"bvc\",\"bvd\",\"bve\",\"bvf\",\"bvg\",\"bvh\",\"bvi\",\"bvj\",\"bvk\",\"bvl\",\"bvm\",\"bvn\",\"bvo\",\"bvp\",\"bvq\",\"bvr\",\"bvt\",\"bvu\",\"bvv\",\"bvw\",\"bvx\",\"bvy\",\"bvz\",\"bwa\",\"bwb\",\"bwc\",\"bwd\",\"bwe\",\"bwf\",\"bwg\",\"bwh\",\"bwi\",\"bwj\",\"bwk\",\"bwl\",\"bwm\",\"bwn\",\"bwo\",\"bwp\",\"bwq\",\"bwr\",\"bws\",\"bwt\",\"bwu\",\"bww\",\"bwx\",\"bwy\",\"bwz\",\"bxa\",\"bxb\",\"bxc\",\"bxd\",\"bxe\",\"bxf\",\"bxg\",\"bxh\",\"bxi\",\"bxj\",\"bxk\",\"bxl\",\"bxm\",\"bxn\",\"bxo\",\"bxp\",\"bxq\",\"bxr\",\"bxs\",\"bxu\",\"bxv\",\"bxw\",\"bxx\",\"bxz\",\"bya\",\"byb\",\"byc\",\"byd\",\"bye\",\"byf\",\"byg\",\"byh\",\"byi\",\"byj\",\"byk\",\"byl\",\"bym\",\"byn\",\"byo\",\"byp\",\"byq\",\"byr\",\"bys\",\"byt\",\"byv\",\"byw\",\"byx\",\"byy\",\"byz\",\"bza\",\"bzb\",\"bzc\",\"bzd\",\"bze\",\"bzf\",\"bzg\",\"bzh\",\"bzi\",\"bzj\",\"bzk\",\"bzl\",\"bzm\",\"bzn\",\"bzo\",\"bzp\",\"bzq\",\"bzr\",\"bzs\",\"bzt\",\"bzu\",\"bzv\",\"bzw\",\"bzx\",\"bzy\",\"bzz\",\"caa\",\"cab\",\"cac\",\"cad\",\"cae\",\"caf\",\"cag\",\"cah\",\"cai\",\"caj\",\"cak\",\"cal\",\"cam\",\"can\",\"cao\",\"cap\",\"caq\",\"car\",\"cas\",\"cau\",\"cav\",\"caw\",\"cax\",\"cay\",\"caz\",\"cba\",\"cbb\",\"cbc\",\"cbd\",\"cbe\",\"cbg\",\"cbh\",\"cbi\",\"cbj\",\"cbk\",\"cbl\",\"cbn\",\"cbo\",\"cbq\",\"cbr\",\"cbs\",\"cbt\",\"cbu\",\"cbv\",\"cbw\",\"cby\",\"cca\",\"ccc\",\"ccd\",\"cce\",\"ccg\",\"cch\",\"ccj\",\"ccl\",\"ccm\",\"ccn\",\"cco\",\"ccp\",\"ccq\",\"ccr\",\"ccs\",\"cda\",\"cdc\",\"cdd\",\"cde\",\"cdf\",\"cdg\",\"cdh\",\"cdi\",\"cdj\",\"cdm\",\"cdn\",\"cdo\",\"cdr\",\"cds\",\"cdy\",\"cdz\",\"cea\",\"ceb\",\"ceg\",\"cek\",\"cel\",\"cen\",\"cet\",\"cfa\",\"cfd\",\"cfg\",\"cfm\",\"cga\",\"cgc\",\"cgg\",\"cgk\",\"chb\",\"chc\",\"chd\",\"chf\",\"chg\",\"chh\",\"chj\",\"chk\",\"chl\",\"chm\",\"chn\",\"cho\",\"chp\",\"chq\",\"chr\",\"cht\",\"chw\",\"chx\",\"chy\",\"chz\",\"cia\",\"cib\",\"cic\",\"cid\",\"cie\",\"cih\",\"cik\",\"cim\",\"cin\",\"cip\",\"cir\",\"ciw\",\"ciy\",\"cja\",\"cje\",\"cjh\",\"cji\",\"cjk\",\"cjm\",\"cjn\",\"cjo\",\"cjp\",\"cjr\",\"cjs\",\"cjv\",\"cjy\",\"cka\",\"ckb\",\"ckh\",\"ckl\",\"ckn\",\"cko\",\"ckq\",\"ckr\",\"cks\",\"ckt\",\"cku\",\"ckv\",\"ckx\",\"cky\",\"ckz\",\"cla\",\"clc\",\"cld\",\"cle\",\"clh\",\"cli\",\"clj\",\"clk\",\"cll\",\"clm\",\"clo\",\"clt\",\"clu\",\"clw\",\"cly\",\"cma\",\"cmc\",\"cme\",\"cmg\",\"cmi\",\"cmk\",\"cml\",\"cmm\",\"cmn\",\"cmo\",\"cmr\",\"cms\",\"cmt\",\"cna\",\"cnb\",\"cnc\",\"cng\",\"cnh\",\"cni\",\"cnk\",\"cnl\",\"cno\",\"cnr\",\"cns\",\"cnt\",\"cnu\",\"cnw\",\"cnx\",\"coa\",\"cob\",\"coc\",\"cod\",\"coe\",\"cof\",\"cog\",\"coh\",\"coj\",\"cok\",\"col\",\"com\",\"con\",\"coo\",\"cop\",\"coq\",\"cot\",\"cou\",\"cov\",\"cow\",\"cox\",\"coy\",\"coz\",\"cpa\",\"cpb\",\"cpc\",\"cpe\",\"cpf\",\"cpg\",\"cpi\",\"cpn\",\"cpo\",\"cpp\",\"cps\",\"cpu\",\"cpx\",\"cpy\",\"cqd\",\"cqu\",\"cra\",\"crb\",\"crc\",\"crd\",\"crf\",\"crg\",\"crh\",\"cri\",\"crj\",\"crk\",\"crl\",\"crm\",\"crn\",\"cro\",\"crp\",\"crq\",\"crr\",\"crs\",\"crt\",\"crv\",\"crw\",\"crx\",\"cry\",\"crz\",\"csa\",\"csb\",\"csc\",\"csd\",\"cse\",\"csf\",\"csg\",\"csh\",\"csi\",\"csj\",\"csk\",\"csl\",\"csm\",\"csn\",\"cso\",\"csq\",\"csr\",\"css\",\"cst\",\"csu\",\"csv\",\"csw\",\"csy\",\"csz\",\"cta\",\"ctc\",\"ctd\",\"cte\",\"ctg\",\"cth\",\"ctl\",\"ctm\",\"ctn\",\"cto\",\"ctp\",\"cts\",\"ctt\",\"ctu\",\"ctz\",\"cua\",\"cub\",\"cuc\",\"cug\",\"cuh\",\"cui\",\"cuj\",\"cuk\",\"cul\",\"cum\",\"cuo\",\"cup\",\"cuq\",\"cur\",\"cus\",\"cut\",\"cuu\",\"cuv\",\"cuw\",\"cux\",\"cuy\",\"cvg\",\"cvn\",\"cwa\",\"cwb\",\"cwd\",\"cwe\",\"cwg\",\"cwt\",\"cya\",\"cyb\",\"cyo\",\"czh\",\"czk\",\"czn\",\"czo\",\"czt\",\"daa\",\"dac\",\"dad\",\"dae\",\"daf\",\"dag\",\"dah\",\"dai\",\"daj\",\"dak\",\"dal\",\"dam\",\"dao\",\"dap\",\"daq\",\"dar\",\"das\",\"dau\",\"dav\",\"daw\",\"dax\",\"day\",\"daz\",\"dba\",\"dbb\",\"dbd\",\"dbe\",\"dbf\",\"dbg\",\"dbi\",\"dbj\",\"dbl\",\"dbm\",\"dbn\",\"dbo\",\"dbp\",\"dbq\",\"dbr\",\"dbt\",\"dbu\",\"dbv\",\"dbw\",\"dby\",\"dcc\",\"dcr\",\"dda\",\"ddd\",\"dde\",\"ddg\",\"ddi\",\"ddj\",\"ddn\",\"ddo\",\"ddr\",\"dds\",\"ddw\",\"dec\",\"ded\",\"dee\",\"def\",\"deg\",\"deh\",\"dei\",\"dek\",\"del\",\"dem\",\"den\",\"dep\",\"deq\",\"der\",\"des\",\"dev\",\"dez\",\"dga\",\"dgb\",\"dgc\",\"dgd\",\"dge\",\"dgg\",\"dgh\",\"dgi\",\"dgk\",\"dgl\",\"dgn\",\"dgo\",\"dgr\",\"dgs\",\"dgt\",\"dgu\",\"dgw\",\"dgx\",\"dgz\",\"dha\",\"dhd\",\"dhg\",\"dhi\",\"dhl\",\"dhm\",\"dhn\",\"dho\",\"dhr\",\"dhs\",\"dhu\",\"dhv\",\"dhw\",\"dhx\",\"dia\",\"dib\",\"dic\",\"did\",\"dif\",\"dig\",\"dih\",\"dii\",\"dij\",\"dik\",\"dil\",\"dim\",\"din\",\"dio\",\"dip\",\"diq\",\"dir\",\"dis\",\"dit\",\"diu\",\"diw\",\"dix\",\"diy\",\"diz\",\"dja\",\"djb\",\"djc\",\"djd\",\"dje\",\"djf\",\"dji\",\"djj\",\"djk\",\"djl\",\"djm\",\"djn\",\"djo\",\"djr\",\"dju\",\"djw\",\"dka\",\"dkk\",\"dkl\",\"dkr\",\"dks\",\"dkx\",\"dlg\",\"dlk\",\"dlm\",\"dln\",\"dma\",\"dmb\",\"dmc\",\"dmd\",\"dme\",\"dmg\",\"dmk\",\"dml\",\"dmm\",\"dmn\",\"dmo\",\"dmr\",\"dms\",\"dmu\",\"dmv\",\"dmw\",\"dmx\",\"dmy\",\"dna\",\"dnd\",\"dne\",\"dng\",\"dni\",\"dnj\",\"dnk\",\"dnn\",\"dnr\",\"dnt\",\"dnu\",\"dnv\",\"dnw\",\"dny\",\"doa\",\"dob\",\"doc\",\"doe\",\"dof\",\"doh\",\"doi\",\"dok\",\"dol\",\"don\",\"doo\",\"dop\",\"doq\",\"dor\",\"dos\",\"dot\",\"dov\",\"dow\",\"dox\",\"doy\",\"doz\",\"dpp\",\"dra\",\"drb\",\"drc\",\"drd\",\"dre\",\"drg\",\"drh\",\"dri\",\"drl\",\"drn\",\"dro\",\"drq\",\"drr\",\"drs\",\"drt\",\"dru\",\"drw\",\"dry\",\"dsb\",\"dse\",\"dsh\",\"dsi\",\"dsl\",\"dsn\",\"dso\",\"dsq\",\"dta\",\"dtb\",\"dtd\",\"dth\",\"dti\",\"dtk\",\"dtm\",\"dtn\",\"dto\",\"dtp\",\"dtr\",\"dts\",\"dtt\",\"dtu\",\"dty\",\"dua\",\"dub\",\"duc\",\"dud\",\"due\",\"duf\",\"dug\",\"duh\",\"dui\",\"duj\",\"duk\",\"dul\",\"dum\",\"dun\",\"duo\",\"dup\",\"duq\",\"dur\",\"dus\",\"duu\",\"duv\",\"duw\",\"dux\",\"duy\",\"duz\",\"dva\",\"dwa\",\"dwl\",\"dwr\",\"dws\",\"dwu\",\"dww\",\"dwy\",\"dya\",\"dyb\",\"dyd\",\"dyg\",\"dyi\",\"dym\",\"dyn\",\"dyo\",\"dyu\",\"dyy\",\"dza\",\"dzd\",\"dze\",\"dzg\",\"dzl\",\"dzn\",\"eaa\",\"ebg\",\"ebk\",\"ebo\",\"ebr\",\"ebu\",\"ecr\",\"ecs\",\"ecy\",\"eee\",\"efa\",\"efe\",\"efi\",\"ega\",\"egl\",\"ego\",\"egx\",\"egy\",\"ehu\",\"eip\",\"eit\",\"eiv\",\"eja\",\"eka\",\"ekc\",\"eke\",\"ekg\",\"eki\",\"ekk\",\"ekl\",\"ekm\",\"eko\",\"ekp\",\"ekr\",\"eky\",\"ele\",\"elh\",\"eli\",\"elk\",\"elm\",\"elo\",\"elp\",\"elu\",\"elx\",\"ema\",\"emb\",\"eme\",\"emg\",\"emi\",\"emk\",\"emm\",\"emn\",\"emo\",\"emp\",\"ems\",\"emu\",\"emw\",\"emx\",\"emy\",\"ena\",\"enb\",\"enc\",\"end\",\"enf\",\"enh\",\"enl\",\"enm\",\"enn\",\"eno\",\"enq\",\"enr\",\"enu\",\"env\",\"enw\",\"enx\",\"eot\",\"epi\",\"era\",\"erg\",\"erh\",\"eri\",\"erk\",\"ero\",\"err\",\"ers\",\"ert\",\"erw\",\"ese\",\"esg\",\"esh\",\"esi\",\"esk\",\"esl\",\"esm\",\"esn\",\"eso\",\"esq\",\"ess\",\"esu\",\"esx\",\"esy\",\"etb\",\"etc\",\"eth\",\"etn\",\"eto\",\"etr\",\"ets\",\"ett\",\"etu\",\"etx\",\"etz\",\"euq\",\"eve\",\"evh\",\"evn\",\"ewo\",\"ext\",\"eya\",\"eyo\",\"eza\",\"eze\",\"faa\",\"fab\",\"fad\",\"faf\",\"fag\",\"fah\",\"fai\",\"faj\",\"fak\",\"fal\",\"fam\",\"fan\",\"fap\",\"far\",\"fat\",\"fau\",\"fax\",\"fay\",\"faz\",\"fbl\",\"fcs\",\"fer\",\"ffi\",\"ffm\",\"fgr\",\"fia\",\"fie\",\"fil\",\"fip\",\"fir\",\"fit\",\"fiu\",\"fiw\",\"fkk\",\"fkv\",\"fla\",\"flh\",\"fli\",\"fll\",\"fln\",\"flr\",\"fly\",\"fmp\",\"fmu\",\"fnb\",\"fng\",\"fni\",\"fod\",\"foi\",\"fom\",\"fon\",\"for\",\"fos\",\"fox\",\"fpe\",\"fqs\",\"frc\",\"frd\",\"frk\",\"frm\",\"fro\",\"frp\",\"frq\",\"frr\",\"frs\",\"frt\",\"fse\",\"fsl\",\"fss\",\"fub\",\"fuc\",\"fud\",\"fue\",\"fuf\",\"fuh\",\"fui\",\"fuj\",\"fum\",\"fun\",\"fuq\",\"fur\",\"fut\",\"fuu\",\"fuv\",\"fuy\",\"fvr\",\"fwa\",\"fwe\",\"gaa\",\"gab\",\"gac\",\"gad\",\"gae\",\"gaf\",\"gag\",\"gah\",\"gai\",\"gaj\",\"gak\",\"gal\",\"gam\",\"gan\",\"gao\",\"gap\",\"gaq\",\"gar\",\"gas\",\"gat\",\"gau\",\"gav\",\"gaw\",\"gax\",\"gay\",\"gaz\",\"gba\",\"gbb\",\"gbc\",\"gbd\",\"gbe\",\"gbf\",\"gbg\",\"gbh\",\"gbi\",\"gbj\",\"gbk\",\"gbl\",\"gbm\",\"gbn\",\"gbo\",\"gbp\",\"gbq\",\"gbr\",\"gbs\",\"gbu\",\"gbv\",\"gbw\",\"gbx\",\"gby\",\"gbz\",\"gcc\",\"gcd\",\"gce\",\"gcf\",\"gcl\",\"gcn\",\"gcr\",\"gct\",\"gda\",\"gdb\",\"gdc\",\"gdd\",\"gde\",\"gdf\",\"gdg\",\"gdh\",\"gdi\",\"gdj\",\"gdk\",\"gdl\",\"gdm\",\"gdn\",\"gdo\",\"gdq\",\"gdr\",\"gds\",\"gdt\",\"gdu\",\"gdx\",\"gea\",\"geb\",\"gec\",\"ged\",\"geg\",\"geh\",\"gei\",\"gej\",\"gek\",\"gel\",\"gem\",\"geq\",\"ges\",\"gev\",\"gew\",\"gex\",\"gey\",\"gez\",\"gfk\",\"gft\",\"gfx\",\"gga\",\"ggb\",\"ggd\",\"gge\",\"ggg\",\"ggk\",\"ggl\",\"ggn\",\"ggo\",\"ggr\",\"ggt\",\"ggu\",\"ggw\",\"gha\",\"ghc\",\"ghe\",\"ghh\",\"ghk\",\"ghl\",\"ghn\",\"gho\",\"ghr\",\"ghs\",\"ght\",\"gia\",\"gib\",\"gic\",\"gid\",\"gie\",\"gig\",\"gih\",\"gil\",\"gim\",\"gin\",\"gio\",\"gip\",\"giq\",\"gir\",\"gis\",\"git\",\"giu\",\"giw\",\"gix\",\"giy\",\"giz\",\"gji\",\"gjk\",\"gjm\",\"gjn\",\"gjr\",\"gju\",\"gka\",\"gkd\",\"gke\",\"gkn\",\"gko\",\"gkp\",\"gku\",\"glc\",\"gld\",\"glh\",\"gli\",\"glj\",\"glk\",\"gll\",\"glo\",\"glr\",\"glu\",\"glw\",\"gly\",\"gma\",\"gmb\",\"gmd\",\"gme\",\"gmg\",\"gmh\",\"gml\",\"gmm\",\"gmn\",\"gmq\",\"gmu\",\"gmv\",\"gmw\",\"gmx\",\"gmy\",\"gmz\",\"gna\",\"gnb\",\"gnc\",\"gnd\",\"gne\",\"gng\",\"gnh\",\"gni\",\"gnj\",\"gnk\",\"gnl\",\"gnm\",\"gnn\",\"gno\",\"gnq\",\"gnr\",\"gnt\",\"gnu\",\"gnw\",\"gnz\",\"goa\",\"gob\",\"goc\",\"god\",\"goe\",\"gof\",\"gog\",\"goh\",\"goi\",\"goj\",\"gok\",\"gol\",\"gom\",\"gon\",\"goo\",\"gop\",\"goq\",\"gor\",\"gos\",\"got\",\"gou\",\"gow\",\"gox\",\"goy\",\"goz\",\"gpa\",\"gpe\",\"gpn\",\"gqa\",\"gqi\",\"gqn\",\"gqr\",\"gqu\",\"gra\",\"grb\",\"grc\",\"grd\",\"grg\",\"grh\",\"gri\",\"grj\",\"grk\",\"grm\",\"gro\",\"grq\",\"grr\",\"grs\",\"grt\",\"gru\",\"grv\",\"grw\",\"grx\",\"gry\",\"grz\",\"gse\",\"gsg\",\"gsl\",\"gsm\",\"gsn\",\"gso\",\"gsp\",\"gss\",\"gsw\",\"gta\",\"gti\",\"gtu\",\"gua\",\"gub\",\"guc\",\"gud\",\"gue\",\"guf\",\"gug\",\"guh\",\"gui\",\"guk\",\"gul\",\"gum\",\"gun\",\"guo\",\"gup\",\"guq\",\"gur\",\"gus\",\"gut\",\"guu\",\"guv\",\"guw\",\"gux\",\"guz\",\"gva\",\"gvc\",\"gve\",\"gvf\",\"gvj\",\"gvl\",\"gvm\",\"gvn\",\"gvo\",\"gvp\",\"gvr\",\"gvs\",\"gvy\",\"gwa\",\"gwb\",\"gwc\",\"gwd\",\"gwe\",\"gwf\",\"gwg\",\"gwi\",\"gwj\",\"gwm\",\"gwn\",\"gwr\",\"gwt\",\"gwu\",\"gww\",\"gwx\",\"gxx\",\"gya\",\"gyb\",\"gyd\",\"gye\",\"gyf\",\"gyg\",\"gyi\",\"gyl\",\"gym\",\"gyn\",\"gyo\",\"gyr\",\"gyy\",\"gza\",\"gzi\",\"gzn\",\"haa\",\"hab\",\"hac\",\"had\",\"hae\",\"haf\",\"hag\",\"hah\",\"hai\",\"haj\",\"hak\",\"hal\",\"ham\",\"han\",\"hao\",\"hap\",\"haq\",\"har\",\"has\",\"hav\",\"haw\",\"hax\",\"hay\",\"haz\",\"hba\",\"hbb\",\"hbn\",\"hbo\",\"hbu\",\"hca\",\"hch\",\"hdn\",\"hds\",\"hdy\",\"hea\",\"hed\",\"heg\",\"heh\",\"hei\",\"hem\",\"hgm\",\"hgw\",\"hhi\",\"hhr\",\"hhy\",\"hia\",\"hib\",\"hid\",\"hif\",\"hig\",\"hih\",\"hii\",\"hij\",\"hik\",\"hil\",\"him\",\"hio\",\"hir\",\"hit\",\"hiw\",\"hix\",\"hji\",\"hka\",\"hke\",\"hkk\",\"hkn\",\"hks\",\"hla\",\"hlb\",\"hld\",\"hle\",\"hlt\",\"hlu\",\"hma\",\"hmb\",\"hmc\",\"hmd\",\"hme\",\"hmf\",\"hmg\",\"hmh\",\"hmi\",\"hmj\",\"hmk\",\"hml\",\"hmm\",\"hmn\",\"hmp\",\"hmq\",\"hmr\",\"hms\",\"hmt\",\"hmu\",\"hmv\",\"hmw\",\"hmx\",\"hmy\",\"hmz\",\"hna\",\"hnd\",\"hne\",\"hnh\",\"hni\",\"hnj\",\"hnn\",\"hno\",\"hns\",\"hnu\",\"hoa\",\"hob\",\"hoc\",\"hod\",\"hoe\",\"hoh\",\"hoi\",\"hoj\",\"hok\",\"hol\",\"hom\",\"hoo\",\"hop\",\"hor\",\"hos\",\"hot\",\"hov\",\"how\",\"hoy\",\"hoz\",\"hpo\",\"hps\",\"hra\",\"hrc\",\"hre\",\"hrk\",\"hrm\",\"hro\",\"hrp\",\"hrr\",\"hrt\",\"hru\",\"hrw\",\"hrx\",\"hrz\",\"hsb\",\"hsh\",\"hsl\",\"hsn\",\"hss\",\"hti\",\"hto\",\"hts\",\"htu\",\"htx\",\"hub\",\"huc\",\"hud\",\"hue\",\"huf\",\"hug\",\"huh\",\"hui\",\"huj\",\"huk\",\"hul\",\"hum\",\"huo\",\"hup\",\"huq\",\"hur\",\"hus\",\"hut\",\"huu\",\"huv\",\"huw\",\"hux\",\"huy\",\"huz\",\"hvc\",\"hve\",\"hvk\",\"hvn\",\"hvv\",\"hwa\",\"hwc\",\"hwo\",\"hya\",\"hyw\",\"hyx\",\"iai\",\"ian\",\"iap\",\"iar\",\"iba\",\"ibb\",\"ibd\",\"ibe\",\"ibg\",\"ibh\",\"ibi\",\"ibl\",\"ibm\",\"ibn\",\"ibr\",\"ibu\",\"iby\",\"ica\",\"ich\",\"icl\",\"icr\",\"ida\",\"idb\",\"idc\",\"idd\",\"ide\",\"idi\",\"idr\",\"ids\",\"idt\",\"idu\",\"ifa\",\"ifb\",\"ife\",\"iff\",\"ifk\",\"ifm\",\"ifu\",\"ify\",\"igb\",\"ige\",\"igg\",\"igl\",\"igm\",\"ign\",\"igo\",\"igs\",\"igw\",\"ihb\",\"ihi\",\"ihp\",\"ihw\",\"iin\",\"iir\",\"ijc\",\"ije\",\"ijj\",\"ijn\",\"ijo\",\"ijs\",\"ike\",\"iki\",\"ikk\",\"ikl\",\"iko\",\"ikp\",\"ikr\",\"iks\",\"ikt\",\"ikv\",\"ikw\",\"ikx\",\"ikz\",\"ila\",\"ilb\",\"ilg\",\"ili\",\"ilk\",\"ill\",\"ilm\",\"ilo\",\"ilp\",\"ils\",\"ilu\",\"ilv\",\"ilw\",\"ima\",\"ime\",\"imi\",\"iml\",\"imn\",\"imo\",\"imr\",\"ims\",\"imy\",\"inb\",\"inc\",\"ine\",\"ing\",\"inh\",\"inj\",\"inl\",\"inm\",\"inn\",\"ino\",\"inp\",\"ins\",\"int\",\"inz\",\"ior\",\"iou\",\"iow\",\"ipi\",\"ipo\",\"iqu\",\"iqw\",\"ira\",\"ire\",\"irh\",\"iri\",\"irk\",\"irn\",\"iro\",\"irr\",\"iru\",\"irx\",\"iry\",\"isa\",\"isc\",\"isd\",\"ise\",\"isg\",\"ish\",\"isi\",\"isk\",\"ism\",\"isn\",\"iso\",\"isr\",\"ist\",\"isu\",\"itb\",\"itc\",\"itd\",\"ite\",\"iti\",\"itk\",\"itl\",\"itm\",\"ito\",\"itr\",\"its\",\"itt\",\"itv\",\"itw\",\"itx\",\"ity\",\"itz\",\"ium\",\"ivb\",\"ivv\",\"iwk\",\"iwm\",\"iwo\",\"iws\",\"ixc\",\"ixl\",\"iya\",\"iyo\",\"iyx\",\"izh\",\"izi\",\"izr\",\"izz\",\"jaa\",\"jab\",\"jac\",\"jad\",\"jae\",\"jaf\",\"jah\",\"jaj\",\"jak\",\"jal\",\"jam\",\"jan\",\"jao\",\"jaq\",\"jar\",\"jas\",\"jat\",\"jau\",\"jax\",\"jay\",\"jaz\",\"jbe\",\"jbi\",\"jbj\",\"jbk\",\"jbn\",\"jbo\",\"jbr\",\"jbt\",\"jbu\",\"jbw\",\"jcs\",\"jct\",\"jda\",\"jdg\",\"jdt\",\"jeb\",\"jee\",\"jeg\",\"jeh\",\"jei\",\"jek\",\"jel\",\"jen\",\"jer\",\"jet\",\"jeu\",\"jgb\",\"jge\",\"jgk\",\"jgo\",\"jhi\",\"jhs\",\"jia\",\"jib\",\"jic\",\"jid\",\"jie\",\"jig\",\"jih\",\"jii\",\"jil\",\"jim\",\"jio\",\"jiq\",\"jit\",\"jiu\",\"jiv\",\"jiy\",\"jje\",\"jjr\",\"jka\",\"jkm\",\"jko\",\"jkp\",\"jkr\",\"jku\",\"jle\",\"jls\",\"jma\",\"jmb\",\"jmc\",\"jmd\",\"jmi\",\"jml\",\"jmn\",\"jmr\",\"jms\",\"jmw\",\"jmx\",\"jna\",\"jnd\",\"jng\",\"jni\",\"jnj\",\"jnl\",\"jns\",\"job\",\"jod\",\"jog\",\"jor\",\"jos\",\"jow\",\"jpa\",\"jpr\",\"jpx\",\"jqr\",\"jra\",\"jrb\",\"jrr\",\"jrt\",\"jru\",\"jsl\",\"jua\",\"jub\",\"juc\",\"jud\",\"juh\",\"jui\",\"juk\",\"jul\",\"jum\",\"jun\",\"juo\",\"jup\",\"jur\",\"jus\",\"jut\",\"juu\",\"juw\",\"juy\",\"jvd\",\"jvn\",\"jwi\",\"jya\",\"jye\",\"jyy\",\"kaa\",\"kab\",\"kac\",\"kad\",\"kae\",\"kaf\",\"kag\",\"kah\",\"kai\",\"kaj\",\"kak\",\"kam\",\"kao\",\"kap\",\"kaq\",\"kar\",\"kav\",\"kaw\",\"kax\",\"kay\",\"kba\",\"kbb\",\"kbc\",\"kbd\",\"kbe\",\"kbf\",\"kbg\",\"kbh\",\"kbi\",\"kbj\",\"kbk\",\"kbl\",\"kbm\",\"kbn\",\"kbo\",\"kbp\",\"kbq\",\"kbr\",\"kbs\",\"kbt\",\"kbu\",\"kbv\",\"kbw\",\"kbx\",\"kby\",\"kbz\",\"kca\",\"kcb\",\"kcc\",\"kcd\",\"kce\",\"kcf\",\"kcg\",\"kch\",\"kci\",\"kcj\",\"kck\",\"kcl\",\"kcm\",\"kcn\",\"kco\",\"kcp\",\"kcq\",\"kcr\",\"kcs\",\"kct\",\"kcu\",\"kcv\",\"kcw\",\"kcx\",\"kcy\",\"kcz\",\"kda\",\"kdc\",\"kdd\",\"kde\",\"kdf\",\"kdg\",\"kdh\",\"kdi\",\"kdj\",\"kdk\",\"kdl\",\"kdm\",\"kdn\",\"kdo\",\"kdp\",\"kdq\",\"kdr\",\"kdt\",\"kdu\",\"kdv\",\"kdw\",\"kdx\",\"kdy\",\"kdz\",\"kea\",\"keb\",\"kec\",\"ked\",\"kee\",\"kef\",\"keg\",\"keh\",\"kei\",\"kej\",\"kek\",\"kel\",\"kem\",\"ken\",\"keo\",\"kep\",\"keq\",\"ker\",\"kes\",\"ket\",\"keu\",\"kev\",\"kew\",\"kex\",\"key\",\"kez\",\"kfa\",\"kfb\",\"kfc\",\"kfd\",\"kfe\",\"kff\",\"kfg\",\"kfh\",\"kfi\",\"kfj\",\"kfk\",\"kfl\",\"kfm\",\"kfn\",\"kfo\",\"kfp\",\"kfq\",\"kfr\",\"kfs\",\"kft\",\"kfu\",\"kfv\",\"kfw\",\"kfx\",\"kfy\",\"kfz\",\"kga\",\"kgb\",\"kgc\",\"kgd\",\"kge\",\"kgf\",\"kgg\",\"kgh\",\"kgi\",\"kgj\",\"kgk\",\"kgl\",\"kgm\",\"kgn\",\"kgo\",\"kgp\",\"kgq\",\"kgr\",\"kgs\",\"kgt\",\"kgu\",\"kgv\",\"kgw\",\"kgx\",\"kgy\",\"kha\",\"khb\",\"khc\",\"khd\",\"khe\",\"khf\",\"khg\",\"khh\",\"khi\",\"khj\",\"khk\",\"khl\",\"khn\",\"kho\",\"khp\",\"khq\",\"khr\",\"khs\",\"kht\",\"khu\",\"khv\",\"khw\",\"khx\",\"khy\",\"khz\",\"kia\",\"kib\",\"kic\",\"kid\",\"kie\",\"kif\",\"kig\",\"kih\",\"kii\",\"kij\",\"kil\",\"kim\",\"kio\",\"kip\",\"kiq\",\"kis\",\"kit\",\"kiu\",\"kiv\",\"kiw\",\"kix\",\"kiy\",\"kiz\",\"kja\",\"kjb\",\"kjc\",\"kjd\",\"kje\",\"kjf\",\"kjg\",\"kjh\",\"kji\",\"kjj\",\"kjk\",\"kjl\",\"kjm\",\"kjn\",\"kjo\",\"kjp\",\"kjq\",\"kjr\",\"kjs\",\"kjt\",\"kju\",\"kjv\",\"kjx\",\"kjy\",\"kjz\",\"kka\",\"kkb\",\"kkc\",\"kkd\",\"kke\",\"kkf\",\"kkg\",\"kkh\",\"kki\",\"kkj\",\"kkk\",\"kkl\",\"kkm\",\"kkn\",\"kko\",\"kkp\",\"kkq\",\"kkr\",\"kks\",\"kkt\",\"kku\",\"kkv\",\"kkw\",\"kkx\",\"kky\",\"kkz\",\"kla\",\"klb\",\"klc\",\"kld\",\"kle\",\"klf\",\"klg\",\"klh\",\"kli\",\"klj\",\"klk\",\"kll\",\"klm\",\"kln\",\"klo\",\"klp\",\"klq\",\"klr\",\"kls\",\"klt\",\"klu\",\"klv\",\"klw\",\"klx\",\"kly\",\"klz\",\"kma\",\"kmb\",\"kmc\",\"kmd\",\"kme\",\"kmf\",\"kmg\",\"kmh\",\"kmi\",\"kmj\",\"kmk\",\"kml\",\"kmm\",\"kmn\",\"kmo\",\"kmp\",\"kmq\",\"kmr\",\"kms\",\"kmt\",\"kmu\",\"kmv\",\"kmw\",\"kmx\",\"kmy\",\"kmz\",\"kna\",\"knb\",\"knc\",\"knd\",\"kne\",\"knf\",\"kng\",\"kni\",\"knj\",\"knk\",\"knl\",\"knm\",\"knn\",\"kno\",\"knp\",\"knq\",\"knr\",\"kns\",\"knt\",\"knu\",\"knv\",\"knw\",\"knx\",\"kny\",\"knz\",\"koa\",\"koc\",\"kod\",\"koe\",\"kof\",\"kog\",\"koh\",\"koi\",\"koj\",\"kok\",\"kol\",\"koo\",\"kop\",\"koq\",\"kos\",\"kot\",\"kou\",\"kov\",\"kow\",\"kox\",\"koy\",\"koz\",\"kpa\",\"kpb\",\"kpc\",\"kpd\",\"kpe\",\"kpf\",\"kpg\",\"kph\",\"kpi\",\"kpj\",\"kpk\",\"kpl\",\"kpm\",\"kpn\",\"kpo\",\"kpp\",\"kpq\",\"kpr\",\"kps\",\"kpt\",\"kpu\",\"kpv\",\"kpw\",\"kpx\",\"kpy\",\"kpz\",\"kqa\",\"kqb\",\"kqc\",\"kqd\",\"kqe\",\"kqf\",\"kqg\",\"kqh\",\"kqi\",\"kqj\",\"kqk\",\"kql\",\"kqm\",\"kqn\",\"kqo\",\"kqp\",\"kqq\",\"kqr\",\"kqs\",\"kqt\",\"kqu\",\"kqv\",\"kqw\",\"kqx\",\"kqy\",\"kqz\",\"kra\",\"krb\",\"krc\",\"krd\",\"kre\",\"krf\",\"krh\",\"kri\",\"krj\",\"krk\",\"krl\",\"krm\",\"krn\",\"kro\",\"krp\",\"krr\",\"krs\",\"krt\",\"kru\",\"krv\",\"krw\",\"krx\",\"kry\",\"krz\",\"ksa\",\"ksb\",\"ksc\",\"ksd\",\"kse\",\"ksf\",\"ksg\",\"ksh\",\"ksi\",\"ksj\",\"ksk\",\"ksl\",\"ksm\",\"ksn\",\"kso\",\"ksp\",\"ksq\",\"ksr\",\"kss\",\"kst\",\"ksu\",\"ksv\",\"ksw\",\"ksx\",\"ksy\",\"ksz\",\"kta\",\"ktb\",\"ktc\",\"ktd\",\"kte\",\"ktf\",\"ktg\",\"kth\",\"kti\",\"ktj\",\"ktk\",\"ktl\",\"ktm\",\"ktn\",\"kto\",\"ktp\",\"ktq\",\"ktr\",\"kts\",\"ktt\",\"ktu\",\"ktv\",\"ktw\",\"ktx\",\"kty\",\"ktz\",\"kub\",\"kuc\",\"kud\",\"kue\",\"kuf\",\"kug\",\"kuh\",\"kui\",\"kuj\",\"kuk\",\"kul\",\"kum\",\"kun\",\"kuo\",\"kup\",\"kuq\",\"kus\",\"kut\",\"kuu\",\"kuv\",\"kuw\",\"kux\",\"kuy\",\"kuz\",\"kva\",\"kvb\",\"kvc\",\"kvd\",\"kve\",\"kvf\",\"kvg\",\"kvh\",\"kvi\",\"kvj\",\"kvk\",\"kvl\",\"kvm\",\"kvn\",\"kvo\",\"kvp\",\"kvq\",\"kvr\",\"kvs\",\"kvt\",\"kvu\",\"kvv\",\"kvw\",\"kvx\",\"kvy\",\"kvz\",\"kwa\",\"kwb\",\"kwc\",\"kwd\",\"kwe\",\"kwf\",\"kwg\",\"kwh\",\"kwi\",\"kwj\",\"kwk\",\"kwl\",\"kwm\",\"kwn\",\"kwo\",\"kwp\",\"kwq\",\"kwr\",\"kws\",\"kwt\",\"kwu\",\"kwv\",\"kww\",\"kwx\",\"kwy\",\"kwz\",\"kxa\",\"kxb\",\"kxc\",\"kxd\",\"kxe\",\"kxf\",\"kxh\",\"kxi\",\"kxj\",\"kxk\",\"kxl\",\"kxm\",\"kxn\",\"kxo\",\"kxp\",\"kxq\",\"kxr\",\"kxs\",\"kxt\",\"kxu\",\"kxv\",\"kxw\",\"kxx\",\"kxy\",\"kxz\",\"kya\",\"kyb\",\"kyc\",\"kyd\",\"kye\",\"kyf\",\"kyg\",\"kyh\",\"kyi\",\"kyj\",\"kyk\",\"kyl\",\"kym\",\"kyn\",\"kyo\",\"kyp\",\"kyq\",\"kyr\",\"kys\",\"kyt\",\"kyu\",\"kyv\",\"kyw\",\"kyx\",\"kyy\",\"kyz\",\"kza\",\"kzb\",\"kzc\",\"kzd\",\"kze\",\"kzf\",\"kzg\",\"kzh\",\"kzi\",\"kzj\",\"kzk\",\"kzl\",\"kzm\",\"kzn\",\"kzo\",\"kzp\",\"kzq\",\"kzr\",\"kzs\",\"kzt\",\"kzu\",\"kzv\",\"kzw\",\"kzx\",\"kzy\",\"kzz\",\"laa\",\"lab\",\"lac\",\"lad\",\"lae\",\"laf\",\"lag\",\"lah\",\"lai\",\"laj\",\"lak\",\"lal\",\"lam\",\"lan\",\"lap\",\"laq\",\"lar\",\"las\",\"lau\",\"law\",\"lax\",\"lay\",\"laz\",\"lba\",\"lbb\",\"lbc\",\"lbe\",\"lbf\",\"lbg\",\"lbi\",\"lbj\",\"lbk\",\"lbl\",\"lbm\",\"lbn\",\"lbo\",\"lbq\",\"lbr\",\"lbs\",\"lbt\",\"lbu\",\"lbv\",\"lbw\",\"lbx\",\"lby\",\"lbz\",\"lcc\",\"lcd\",\"lce\",\"lcf\",\"lch\",\"lcl\",\"lcm\",\"lcp\",\"lcq\",\"lcs\",\"lda\",\"ldb\",\"ldd\",\"ldg\",\"ldh\",\"ldi\",\"ldj\",\"ldk\",\"ldl\",\"ldm\",\"ldn\",\"ldo\",\"ldp\",\"ldq\",\"lea\",\"leb\",\"lec\",\"led\",\"lee\",\"lef\",\"leg\",\"leh\",\"lei\",\"lej\",\"lek\",\"lel\",\"lem\",\"len\",\"leo\",\"lep\",\"leq\",\"ler\",\"les\",\"let\",\"leu\",\"lev\",\"lew\",\"lex\",\"ley\",\"lez\",\"lfa\",\"lfn\",\"lga\",\"lgb\",\"lgg\",\"lgh\",\"lgi\",\"lgk\",\"lgl\",\"lgm\",\"lgn\",\"lgq\",\"lgr\",\"lgt\",\"lgu\",\"lgz\",\"lha\",\"lhh\",\"lhi\",\"lhl\",\"lhm\",\"lhn\",\"lhp\",\"lhs\",\"lht\",\"lhu\",\"lia\",\"lib\",\"lic\",\"lid\",\"lie\",\"lif\",\"lig\",\"lih\",\"lii\",\"lij\",\"lik\",\"lil\",\"lio\",\"lip\",\"liq\",\"lir\",\"lis\",\"liu\",\"liv\",\"liw\",\"lix\",\"liy\",\"liz\",\"lja\",\"lje\",\"lji\",\"ljl\",\"ljp\",\"ljw\",\"ljx\",\"lka\",\"lkb\",\"lkc\",\"lkd\",\"lke\",\"lkh\",\"lki\",\"lkj\",\"lkl\",\"lkm\",\"lkn\",\"lko\",\"lkr\",\"lks\",\"lkt\",\"lku\",\"lky\",\"lla\",\"llb\",\"llc\",\"lld\",\"lle\",\"llf\",\"llg\",\"llh\",\"lli\",\"llj\",\"llk\",\"lll\",\"llm\",\"lln\",\"llo\",\"llp\",\"llq\",\"lls\",\"llu\",\"llx\",\"lma\",\"lmb\",\"lmc\",\"lmd\",\"lme\",\"lmf\",\"lmg\",\"lmh\",\"lmi\",\"lmj\",\"lmk\",\"lml\",\"lmm\",\"lmn\",\"lmo\",\"lmp\",\"lmq\",\"lmr\",\"lmu\",\"lmv\",\"lmw\",\"lmx\",\"lmy\",\"lmz\",\"lna\",\"lnb\",\"lnd\",\"lng\",\"lnh\",\"lni\",\"lnj\",\"lnl\",\"lnm\",\"lnn\",\"lno\",\"lns\",\"lnu\",\"lnw\",\"lnz\",\"loa\",\"lob\",\"loc\",\"loe\",\"lof\",\"log\",\"loh\",\"loi\",\"loj\",\"lok\",\"lol\",\"lom\",\"lon\",\"loo\",\"lop\",\"loq\",\"lor\",\"los\",\"lot\",\"lou\",\"lov\",\"low\",\"lox\",\"loy\",\"loz\",\"lpa\",\"lpe\",\"lpn\",\"lpo\",\"lpx\",\"lra\",\"lrc\",\"lre\",\"lrg\",\"lri\",\"lrk\",\"lrl\",\"lrm\",\"lrn\",\"lro\",\"lrr\",\"lrt\",\"lrv\",\"lrz\",\"lsa\",\"lsd\",\"lse\",\"lsg\",\"lsh\",\"lsi\",\"lsl\",\"lsm\",\"lso\",\"lsp\",\"lsr\",\"lss\",\"lst\",\"lsy\",\"ltc\",\"ltg\",\"lth\",\"lti\",\"ltn\",\"lto\",\"lts\",\"ltu\",\"lua\",\"luc\",\"lud\",\"lue\",\"luf\",\"lui\",\"luj\",\"luk\",\"lul\",\"lum\",\"lun\",\"luo\",\"lup\",\"luq\",\"lur\",\"lus\",\"lut\",\"luu\",\"luv\",\"luw\",\"luy\",\"luz\",\"lva\",\"lvk\",\"lvs\",\"lvu\",\"lwa\",\"lwe\",\"lwg\",\"lwh\",\"lwl\",\"lwm\",\"lwo\",\"lws\",\"lwt\",\"lwu\",\"lww\",\"lya\",\"lyg\",\"lyn\",\"lzh\",\"lzl\",\"lzn\",\"lzz\",\"maa\",\"mab\",\"mad\",\"mae\",\"maf\",\"mag\",\"mai\",\"maj\",\"mak\",\"mam\",\"man\",\"map\",\"maq\",\"mas\",\"mat\",\"mau\",\"mav\",\"maw\",\"max\",\"maz\",\"mba\",\"mbb\",\"mbc\",\"mbd\",\"mbe\",\"mbf\",\"mbh\",\"mbi\",\"mbj\",\"mbk\",\"mbl\",\"mbm\",\"mbn\",\"mbo\",\"mbp\",\"mbq\",\"mbr\",\"mbs\",\"mbt\",\"mbu\",\"mbv\",\"mbw\",\"mbx\",\"mby\",\"mbz\",\"mca\",\"mcb\",\"mcc\",\"mcd\",\"mce\",\"mcf\",\"mcg\",\"mch\",\"mci\",\"mcj\",\"mck\",\"mcl\",\"mcm\",\"mcn\",\"mco\",\"mcp\",\"mcq\",\"mcr\",\"mcs\",\"mct\",\"mcu\",\"mcv\",\"mcw\",\"mcx\",\"mcy\",\"mcz\",\"mda\",\"mdb\",\"mdc\",\"mdd\",\"mde\",\"mdf\",\"mdg\",\"mdh\",\"mdi\",\"mdj\",\"mdk\",\"mdl\",\"mdm\",\"mdn\",\"mdp\",\"mdq\",\"mdr\",\"mds\",\"mdt\",\"mdu\",\"mdv\",\"mdw\",\"mdx\",\"mdy\",\"mdz\",\"mea\",\"meb\",\"mec\",\"med\",\"mee\",\"mef\",\"meg\",\"meh\",\"mei\",\"mej\",\"mek\",\"mel\",\"mem\",\"men\",\"meo\",\"mep\",\"meq\",\"mer\",\"mes\",\"met\",\"meu\",\"mev\",\"mew\",\"mey\",\"mez\",\"mfa\",\"mfb\",\"mfc\",\"mfd\",\"mfe\",\"mff\",\"mfg\",\"mfh\",\"mfi\",\"mfj\",\"mfk\",\"mfl\",\"mfm\",\"mfn\",\"mfo\",\"mfp\",\"mfq\",\"mfr\",\"mfs\",\"mft\",\"mfu\",\"mfv\",\"mfw\",\"mfx\",\"mfy\",\"mfz\",\"mga\",\"mgb\",\"mgc\",\"mgd\",\"mge\",\"mgf\",\"mgg\",\"mgh\",\"mgi\",\"mgj\",\"mgk\",\"mgl\",\"mgm\",\"mgn\",\"mgo\",\"mgp\",\"mgq\",\"mgr\",\"mgs\",\"mgt\",\"mgu\",\"mgv\",\"mgw\",\"mgx\",\"mgy\",\"mgz\",\"mha\",\"mhb\",\"mhc\",\"mhd\",\"mhe\",\"mhf\",\"mhg\",\"mhh\",\"mhi\",\"mhj\",\"mhk\",\"mhl\",\"mhm\",\"mhn\",\"mho\",\"mhp\",\"mhq\",\"mhr\",\"mhs\",\"mht\",\"mhu\",\"mhw\",\"mhx\",\"mhy\",\"mhz\",\"mia\",\"mib\",\"mic\",\"mid\",\"mie\",\"mif\",\"mig\",\"mih\",\"mii\",\"mij\",\"mik\",\"mil\",\"mim\",\"min\",\"mio\",\"mip\",\"miq\",\"mir\",\"mis\",\"mit\",\"miu\",\"miw\",\"mix\",\"miy\",\"miz\",\"mja\",\"mjb\",\"mjc\",\"mjd\",\"mje\",\"mjg\",\"mjh\",\"mji\",\"mjj\",\"mjk\",\"mjl\",\"mjm\",\"mjn\",\"mjo\",\"mjp\",\"mjq\",\"mjr\",\"mjs\",\"mjt\",\"mju\",\"mjv\",\"mjw\",\"mjx\",\"mjy\",\"mjz\",\"mka\",\"mkb\",\"mkc\",\"mke\",\"mkf\",\"mkg\",\"mkh\",\"mki\",\"mkj\",\"mkk\",\"mkl\",\"mkm\",\"mkn\",\"mko\",\"mkp\",\"mkq\",\"mkr\",\"mks\",\"mkt\",\"mku\",\"mkv\",\"mkw\",\"mkx\",\"mky\",\"mkz\",\"mla\",\"mlb\",\"mlc\",\"mld\",\"mle\",\"mlf\",\"mlh\",\"mli\",\"mlj\",\"mlk\",\"mll\",\"mlm\",\"mln\",\"mlo\",\"mlp\",\"mlq\",\"mlr\",\"mls\",\"mlu\",\"mlv\",\"mlw\",\"mlx\",\"mlz\",\"mma\",\"mmb\",\"mmc\",\"mmd\",\"mme\",\"mmf\",\"mmg\",\"mmh\",\"mmi\",\"mmj\",\"mmk\",\"mml\",\"mmm\",\"mmn\",\"mmo\",\"mmp\",\"mmq\",\"mmr\",\"mmt\",\"mmu\",\"mmv\",\"mmw\",\"mmx\",\"mmy\",\"mmz\",\"mna\",\"mnb\",\"mnc\",\"mnd\",\"mne\",\"mnf\",\"mng\",\"mnh\",\"mni\",\"mnj\",\"mnk\",\"mnl\",\"mnm\",\"mnn\",\"mno\",\"mnp\",\"mnq\",\"mnr\",\"mns\",\"mnt\",\"mnu\",\"mnv\",\"mnw\",\"mnx\",\"mny\",\"mnz\",\"moa\",\"moc\",\"mod\",\"moe\",\"mof\",\"mog\",\"moh\",\"moi\",\"moj\",\"mok\",\"mom\",\"moo\",\"mop\",\"moq\",\"mor\",\"mos\",\"mot\",\"mou\",\"mov\",\"mow\",\"mox\",\"moy\",\"moz\",\"mpa\",\"mpb\",\"mpc\",\"mpd\",\"mpe\",\"mpg\",\"mph\",\"mpi\",\"mpj\",\"mpk\",\"mpl\",\"mpm\",\"mpn\",\"mpo\",\"mpp\",\"mpq\",\"mpr\",\"mps\",\"mpt\",\"mpu\",\"mpv\",\"mpw\",\"mpx\",\"mpy\",\"mpz\",\"mqa\",\"mqb\",\"mqc\",\"mqe\",\"mqf\",\"mqg\",\"mqh\",\"mqi\",\"mqj\",\"mqk\",\"mql\",\"mqm\",\"mqn\",\"mqo\",\"mqp\",\"mqq\",\"mqr\",\"mqs\",\"mqt\",\"mqu\",\"mqv\",\"mqw\",\"mqx\",\"mqy\",\"mqz\",\"mra\",\"mrb\",\"mrc\",\"mrd\",\"mre\",\"mrf\",\"mrg\",\"mrh\",\"mrj\",\"mrk\",\"mrl\",\"mrm\",\"mrn\",\"mro\",\"mrp\",\"mrq\",\"mrr\",\"mrs\",\"mrt\",\"mru\",\"mrv\",\"mrw\",\"mrx\",\"mry\",\"mrz\",\"msb\",\"msc\",\"msd\",\"mse\",\"msf\",\"msg\",\"msh\",\"msi\",\"msj\",\"msk\",\"msl\",\"msm\",\"msn\",\"mso\",\"msp\",\"msq\",\"msr\",\"mss\",\"mst\",\"msu\",\"msv\",\"msw\",\"msx\",\"msy\",\"msz\",\"mta\",\"mtb\",\"mtc\",\"mtd\",\"mte\",\"mtf\",\"mtg\",\"mth\",\"mti\",\"mtj\",\"mtk\",\"mtl\",\"mtm\",\"mtn\",\"mto\",\"mtp\",\"mtq\",\"mtr\",\"mts\",\"mtt\",\"mtu\",\"mtv\",\"mtw\",\"mtx\",\"mty\",\"mua\",\"mub\",\"muc\",\"mud\",\"mue\",\"mug\",\"muh\",\"mui\",\"muj\",\"muk\",\"mul\",\"mum\",\"mun\",\"muo\",\"mup\",\"muq\",\"mur\",\"mus\",\"mut\",\"muu\",\"muv\",\"mux\",\"muy\",\"muz\",\"mva\",\"mvb\",\"mvd\",\"mve\",\"mvf\",\"mvg\",\"mvh\",\"mvi\",\"mvk\",\"mvl\",\"mvm\",\"mvn\",\"mvo\",\"mvp\",\"mvq\",\"mvr\",\"mvs\",\"mvt\",\"mvu\",\"mvv\",\"mvw\",\"mvx\",\"mvy\",\"mvz\",\"mwa\",\"mwb\",\"mwc\",\"mwd\",\"mwe\",\"mwf\",\"mwg\",\"mwh\",\"mwi\",\"mwj\",\"mwk\",\"mwl\",\"mwm\",\"mwn\",\"mwo\",\"mwp\",\"mwq\",\"mwr\",\"mws\",\"mwt\",\"mwu\",\"mwv\",\"mww\",\"mwx\",\"mwy\",\"mwz\",\"mxa\",\"mxb\",\"mxc\",\"mxd\",\"mxe\",\"mxf\",\"mxg\",\"mxh\",\"mxi\",\"mxj\",\"mxk\",\"mxl\",\"mxm\",\"mxn\",\"mxo\",\"mxp\",\"mxq\",\"mxr\",\"mxs\",\"mxt\",\"mxu\",\"mxv\",\"mxw\",\"mxx\",\"mxy\",\"mxz\",\"myb\",\"myc\",\"myd\",\"mye\",\"myf\",\"myg\",\"myh\",\"myi\",\"myj\",\"myk\",\"myl\",\"mym\",\"myn\",\"myo\",\"myp\",\"myq\",\"myr\",\"mys\",\"myt\",\"myu\",\"myv\",\"myw\",\"myx\",\"myy\",\"myz\",\"mza\",\"mzb\",\"mzc\",\"mzd\",\"mze\",\"mzg\",\"mzh\",\"mzi\",\"mzj\",\"mzk\",\"mzl\",\"mzm\",\"mzn\",\"mzo\",\"mzp\",\"mzq\",\"mzr\",\"mzs\",\"mzt\",\"mzu\",\"mzv\",\"mzw\",\"mzx\",\"mzy\",\"mzz\",\"naa\",\"nab\",\"nac\",\"nad\",\"nae\",\"naf\",\"nag\",\"nah\",\"nai\",\"naj\",\"nak\",\"nal\",\"nam\",\"nan\",\"nao\",\"nap\",\"naq\",\"nar\",\"nas\",\"nat\",\"naw\",\"nax\",\"nay\",\"naz\",\"nba\",\"nbb\",\"nbc\",\"nbd\",\"nbe\",\"nbf\",\"nbg\",\"nbh\",\"nbi\",\"nbj\",\"nbk\",\"nbm\",\"nbn\",\"nbo\",\"nbp\",\"nbq\",\"nbr\",\"nbs\",\"nbt\",\"nbu\",\"nbv\",\"nbw\",\"nbx\",\"nby\",\"nca\",\"ncb\",\"ncc\",\"ncd\",\"nce\",\"ncf\",\"ncg\",\"nch\",\"nci\",\"ncj\",\"nck\",\"ncl\",\"ncm\",\"ncn\",\"nco\",\"ncp\",\"ncq\",\"ncr\",\"ncs\",\"nct\",\"ncu\",\"ncx\",\"ncz\",\"nda\",\"ndb\",\"ndc\",\"ndd\",\"ndf\",\"ndg\",\"ndh\",\"ndi\",\"ndj\",\"ndk\",\"ndl\",\"ndm\",\"ndn\",\"ndp\",\"ndq\",\"ndr\",\"nds\",\"ndt\",\"ndu\",\"ndv\",\"ndw\",\"ndx\",\"ndy\",\"ndz\",\"nea\",\"neb\",\"nec\",\"ned\",\"nee\",\"nef\",\"neg\",\"neh\",\"nei\",\"nej\",\"nek\",\"nem\",\"nen\",\"neo\",\"neq\",\"ner\",\"nes\",\"net\",\"neu\",\"nev\",\"new\",\"nex\",\"ney\",\"nez\",\"nfa\",\"nfd\",\"nfl\",\"nfr\",\"nfu\",\"nga\",\"ngb\",\"ngc\",\"ngd\",\"nge\",\"ngf\",\"ngg\",\"ngh\",\"ngi\",\"ngj\",\"ngk\",\"ngl\",\"ngm\",\"ngn\",\"ngo\",\"ngp\",\"ngq\",\"ngr\",\"ngs\",\"ngt\",\"ngu\",\"ngv\",\"ngw\",\"ngx\",\"ngy\",\"ngz\",\"nha\",\"nhb\",\"nhc\",\"nhd\",\"nhe\",\"nhf\",\"nhg\",\"nhh\",\"nhi\",\"nhk\",\"nhm\",\"nhn\",\"nho\",\"nhp\",\"nhq\",\"nhr\",\"nht\",\"nhu\",\"nhv\",\"nhw\",\"nhx\",\"nhy\",\"nhz\",\"nia\",\"nib\",\"nic\",\"nid\",\"nie\",\"nif\",\"nig\",\"nih\",\"nii\",\"nij\",\"nik\",\"nil\",\"nim\",\"nin\",\"nio\",\"niq\",\"nir\",\"nis\",\"nit\",\"niu\",\"niv\",\"niw\",\"nix\",\"niy\",\"niz\",\"nja\",\"njb\",\"njd\",\"njh\",\"nji\",\"njj\",\"njl\",\"njm\",\"njn\",\"njo\",\"njr\",\"njs\",\"njt\",\"nju\",\"njx\",\"njy\",\"njz\",\"nka\",\"nkb\",\"nkc\",\"nkd\",\"nke\",\"nkf\",\"nkg\",\"nkh\",\"nki\",\"nkj\",\"nkk\",\"nkm\",\"nkn\",\"nko\",\"nkp\",\"nkq\",\"nkr\",\"nks\",\"nkt\",\"nku\",\"nkv\",\"nkw\",\"nkx\",\"nkz\",\"nla\",\"nlc\",\"nle\",\"nlg\",\"nli\",\"nlj\",\"nlk\",\"nll\",\"nlm\",\"nln\",\"nlo\",\"nlq\",\"nlr\",\"nlu\",\"nlv\",\"nlw\",\"nlx\",\"nly\",\"nlz\",\"nma\",\"nmb\",\"nmc\",\"nmd\",\"nme\",\"nmf\",\"nmg\",\"nmh\",\"nmi\",\"nmj\",\"nmk\",\"nml\",\"nmm\",\"nmn\",\"nmo\",\"nmp\",\"nmq\",\"nmr\",\"nms\",\"nmt\",\"nmu\",\"nmv\",\"nmw\",\"nmx\",\"nmy\",\"nmz\",\"nna\",\"nnb\",\"nnc\",\"nnd\",\"nne\",\"nnf\",\"nng\",\"nnh\",\"nni\",\"nnj\",\"nnk\",\"nnl\",\"nnm\",\"nnn\",\"nnp\",\"nnq\",\"nnr\",\"nns\",\"nnt\",\"nnu\",\"nnv\",\"nnw\",\"nnx\",\"nny\",\"nnz\",\"noa\",\"noc\",\"nod\",\"noe\",\"nof\",\"nog\",\"noh\",\"noi\",\"noj\",\"nok\",\"nol\",\"nom\",\"non\",\"noo\",\"nop\",\"noq\",\"nos\",\"not\",\"nou\",\"nov\",\"now\",\"noy\",\"noz\",\"npa\",\"npb\",\"npg\",\"nph\",\"npi\",\"npl\",\"npn\",\"npo\",\"nps\",\"npu\",\"npx\",\"npy\",\"nqg\",\"nqk\",\"nql\",\"nqm\",\"nqn\",\"nqo\",\"nqq\",\"nqy\",\"nra\",\"nrb\",\"nrc\",\"nre\",\"nrf\",\"nrg\",\"nri\",\"nrk\",\"nrl\",\"nrm\",\"nrn\",\"nrp\",\"nrr\",\"nrt\",\"nru\",\"nrx\",\"nrz\",\"nsa\",\"nsc\",\"nsd\",\"nse\",\"nsf\",\"nsg\",\"nsh\",\"nsi\",\"nsk\",\"nsl\",\"nsm\",\"nsn\",\"nso\",\"nsp\",\"nsq\",\"nsr\",\"nss\",\"nst\",\"nsu\",\"nsv\",\"nsw\",\"nsx\",\"nsy\",\"nsz\",\"ntd\",\"nte\",\"ntg\",\"nti\",\"ntj\",\"ntk\",\"ntm\",\"nto\",\"ntp\",\"ntr\",\"nts\",\"ntu\",\"ntw\",\"ntx\",\"nty\",\"ntz\",\"nua\",\"nub\",\"nuc\",\"nud\",\"nue\",\"nuf\",\"nug\",\"nuh\",\"nui\",\"nuj\",\"nuk\",\"nul\",\"num\",\"nun\",\"nuo\",\"nup\",\"nuq\",\"nur\",\"nus\",\"nut\",\"nuu\",\"nuv\",\"nuw\",\"nux\",\"nuy\",\"nuz\",\"nvh\",\"nvm\",\"nvo\",\"nwa\",\"nwb\",\"nwc\",\"nwe\",\"nwg\",\"nwi\",\"nwm\",\"nwo\",\"nwr\",\"nwx\",\"nwy\",\"nxa\",\"nxd\",\"nxe\",\"nxg\",\"nxi\",\"nxk\",\"nxl\",\"nxm\",\"nxn\",\"nxo\",\"nxq\",\"nxr\",\"nxu\",\"nxx\",\"nyb\",\"nyc\",\"nyd\",\"nye\",\"nyf\",\"nyg\",\"nyh\",\"nyi\",\"nyj\",\"nyk\",\"nyl\",\"nym\",\"nyn\",\"nyo\",\"nyp\",\"nyq\",\"nyr\",\"nys\",\"nyt\",\"nyu\",\"nyv\",\"nyw\",\"nyx\",\"nyy\",\"nza\",\"nzb\",\"nzd\",\"nzi\",\"nzk\",\"nzm\",\"nzs\",\"nzu\",\"nzy\",\"nzz\",\"oaa\",\"oac\",\"oar\",\"oav\",\"obi\",\"obk\",\"obl\",\"obm\",\"obo\",\"obr\",\"obt\",\"obu\",\"oca\",\"och\",\"oco\",\"ocu\",\"oda\",\"odk\",\"odt\",\"odu\",\"ofo\",\"ofs\",\"ofu\",\"ogb\",\"ogc\",\"oge\",\"ogg\",\"ogo\",\"ogu\",\"oht\",\"ohu\",\"oia\",\"oin\",\"ojb\",\"ojc\",\"ojg\",\"ojp\",\"ojs\",\"ojv\",\"ojw\",\"oka\",\"okb\",\"okd\",\"oke\",\"okg\",\"okh\",\"oki\",\"okj\",\"okk\",\"okl\",\"okm\",\"okn\",\"oko\",\"okr\",\"oks\",\"oku\",\"okv\",\"okx\",\"ola\",\"old\",\"ole\",\"olk\",\"olm\",\"olo\",\"olr\",\"olt\",\"olu\",\"oma\",\"omb\",\"omc\",\"ome\",\"omg\",\"omi\",\"omk\",\"oml\",\"omn\",\"omo\",\"omp\",\"omq\",\"omr\",\"omt\",\"omu\",\"omv\",\"omw\",\"omx\",\"ona\",\"onb\",\"one\",\"ong\",\"oni\",\"onj\",\"onk\",\"onn\",\"ono\",\"onp\",\"onr\",\"ons\",\"ont\",\"onu\",\"onw\",\"onx\",\"ood\",\"oog\",\"oon\",\"oor\",\"oos\",\"opa\",\"opk\",\"opm\",\"opo\",\"opt\",\"opy\",\"ora\",\"orc\",\"ore\",\"org\",\"orh\",\"orn\",\"oro\",\"orr\",\"ors\",\"ort\",\"oru\",\"orv\",\"orw\",\"orx\",\"ory\",\"orz\",\"osa\",\"osc\",\"osi\",\"oso\",\"osp\",\"ost\",\"osu\",\"osx\",\"ota\",\"otb\",\"otd\",\"ote\",\"oti\",\"otk\",\"otl\",\"otm\",\"otn\",\"oto\",\"otq\",\"otr\",\"ots\",\"ott\",\"otu\",\"otw\",\"otx\",\"oty\",\"otz\",\"oua\",\"oub\",\"oue\",\"oui\",\"oum\",\"oun\",\"ovd\",\"owi\",\"owl\",\"oyb\",\"oyd\",\"oym\",\"oyy\",\"ozm\",\"paa\",\"pab\",\"pac\",\"pad\",\"pae\",\"paf\",\"pag\",\"pah\",\"pai\",\"pak\",\"pal\",\"pam\",\"pao\",\"pap\",\"paq\",\"par\",\"pas\",\"pat\",\"pau\",\"pav\",\"paw\",\"pax\",\"pay\",\"paz\",\"pbb\",\"pbc\",\"pbe\",\"pbf\",\"pbg\",\"pbh\",\"pbi\",\"pbl\",\"pbm\",\"pbn\",\"pbo\",\"pbp\",\"pbr\",\"pbs\",\"pbt\",\"pbu\",\"pbv\",\"pby\",\"pbz\",\"pca\",\"pcb\",\"pcc\",\"pcd\",\"pce\",\"pcf\",\"pcg\",\"pch\",\"pci\",\"pcj\",\"pck\",\"pcl\",\"pcm\",\"pcn\",\"pcp\",\"pcr\",\"pcw\",\"pda\",\"pdc\",\"pdi\",\"pdn\",\"pdo\",\"pdt\",\"pdu\",\"pea\",\"peb\",\"ped\",\"pee\",\"pef\",\"peg\",\"peh\",\"pei\",\"pej\",\"pek\",\"pel\",\"pem\",\"peo\",\"pep\",\"peq\",\"pes\",\"pev\",\"pex\",\"pey\",\"pez\",\"pfa\",\"pfe\",\"pfl\",\"pga\",\"pgd\",\"pgg\",\"pgi\",\"pgk\",\"pgl\",\"pgn\",\"pgs\",\"pgu\",\"pgy\",\"pgz\",\"pha\",\"phd\",\"phg\",\"phh\",\"phi\",\"phk\",\"phl\",\"phm\",\"phn\",\"pho\",\"phq\",\"phr\",\"pht\",\"phu\",\"phv\",\"phw\",\"pia\",\"pib\",\"pic\",\"pid\",\"pie\",\"pif\",\"pig\",\"pih\",\"pii\",\"pij\",\"pil\",\"pim\",\"pin\",\"pio\",\"pip\",\"pir\",\"pis\",\"pit\",\"piu\",\"piv\",\"piw\",\"pix\",\"piy\",\"piz\",\"pjt\",\"pka\",\"pkb\",\"pkc\",\"pkg\",\"pkh\",\"pkn\",\"pko\",\"pkp\",\"pkr\",\"pks\",\"pkt\",\"pku\",\"pla\",\"plb\",\"plc\",\"pld\",\"ple\",\"plf\",\"plg\",\"plh\",\"plj\",\"plk\",\"pll\",\"pln\",\"plo\",\"plp\",\"plq\",\"plr\",\"pls\",\"plt\",\"plu\",\"plv\",\"plw\",\"ply\",\"plz\",\"pma\",\"pmb\",\"pmc\",\"pmd\",\"pme\",\"pmf\",\"pmh\",\"pmi\",\"pmj\",\"pmk\",\"pml\",\"pmm\",\"pmn\",\"pmo\",\"pmq\",\"pmr\",\"pms\",\"pmt\",\"pmu\",\"pmw\",\"pmx\",\"pmy\",\"pmz\",\"pna\",\"pnb\",\"pnc\",\"pne\",\"png\",\"pnh\",\"pni\",\"pnj\",\"pnk\",\"pnl\",\"pnm\",\"pnn\",\"pno\",\"pnp\",\"pnq\",\"pnr\",\"pns\",\"pnt\",\"pnu\",\"pnv\",\"pnw\",\"pnx\",\"pny\",\"pnz\",\"poc\",\"pod\",\"poe\",\"pof\",\"pog\",\"poh\",\"poi\",\"pok\",\"pom\",\"pon\",\"poo\",\"pop\",\"poq\",\"pos\",\"pot\",\"pov\",\"pow\",\"pox\",\"poy\",\"poz\",\"ppa\",\"ppe\",\"ppi\",\"ppk\",\"ppl\",\"ppm\",\"ppn\",\"ppo\",\"ppp\",\"ppq\",\"ppr\",\"pps\",\"ppt\",\"ppu\",\"pqa\",\"pqe\",\"pqm\",\"pqw\",\"pra\",\"prb\",\"prc\",\"prd\",\"pre\",\"prf\",\"prg\",\"prh\",\"pri\",\"prk\",\"prl\",\"prm\",\"prn\",\"pro\",\"prp\",\"prq\",\"prr\",\"prs\",\"prt\",\"pru\",\"prw\",\"prx\",\"pry\",\"prz\",\"psa\",\"psc\",\"psd\",\"pse\",\"psg\",\"psh\",\"psi\",\"psl\",\"psm\",\"psn\",\"pso\",\"psp\",\"psq\",\"psr\",\"pss\",\"pst\",\"psu\",\"psw\",\"psy\",\"pta\",\"pth\",\"pti\",\"ptn\",\"pto\",\"ptp\",\"ptq\",\"ptr\",\"ptt\",\"ptu\",\"ptv\",\"ptw\",\"pty\",\"pua\",\"pub\",\"puc\",\"pud\",\"pue\",\"puf\",\"pug\",\"pui\",\"puj\",\"puk\",\"pum\",\"puo\",\"pup\",\"puq\",\"pur\",\"put\",\"puu\",\"puw\",\"pux\",\"puy\",\"puz\",\"pwa\",\"pwb\",\"pwg\",\"pwi\",\"pwm\",\"pwn\",\"pwo\",\"pwr\",\"pww\",\"pxm\",\"pye\",\"pym\",\"pyn\",\"pys\",\"pyu\",\"pyx\",\"pyy\",\"pzn\",\"qaa..qtz\",\"qua\",\"qub\",\"quc\",\"qud\",\"quf\",\"qug\",\"quh\",\"qui\",\"quk\",\"qul\",\"qum\",\"qun\",\"qup\",\"quq\",\"qur\",\"qus\",\"quv\",\"quw\",\"qux\",\"quy\",\"quz\",\"qva\",\"qvc\",\"qve\",\"qvh\",\"qvi\",\"qvj\",\"qvl\",\"qvm\",\"qvn\",\"qvo\",\"qvp\",\"qvs\",\"qvw\",\"qvy\",\"qvz\",\"qwa\",\"qwc\",\"qwe\",\"qwh\",\"qwm\",\"qws\",\"qwt\",\"qxa\",\"qxc\",\"qxh\",\"qxl\",\"qxn\",\"qxo\",\"qxp\",\"qxq\",\"qxr\",\"qxs\",\"qxt\",\"qxu\",\"qxw\",\"qya\",\"qyp\",\"raa\",\"rab\",\"rac\",\"rad\",\"raf\",\"rag\",\"rah\",\"rai\",\"raj\",\"rak\",\"ral\",\"ram\",\"ran\",\"rao\",\"rap\",\"raq\",\"rar\",\"ras\",\"rat\",\"rau\",\"rav\",\"raw\",\"rax\",\"ray\",\"raz\",\"rbb\",\"rbk\",\"rbl\",\"rbp\",\"rcf\",\"rdb\",\"rea\",\"reb\",\"ree\",\"reg\",\"rei\",\"rej\",\"rel\",\"rem\",\"ren\",\"rer\",\"res\",\"ret\",\"rey\",\"rga\",\"rge\",\"rgk\",\"rgn\",\"rgr\",\"rgs\",\"rgu\",\"rhg\",\"rhp\",\"ria\",\"rie\",\"rif\",\"ril\",\"rim\",\"rin\",\"rir\",\"rit\",\"riu\",\"rjg\",\"rji\",\"rjs\",\"rka\",\"rkb\",\"rkh\",\"rki\",\"rkm\",\"rkt\",\"rkw\",\"rma\",\"rmb\",\"rmc\",\"rmd\",\"rme\",\"rmf\",\"rmg\",\"rmh\",\"rmi\",\"rmk\",\"rml\",\"rmm\",\"rmn\",\"rmo\",\"rmp\",\"rmq\",\"rmr\",\"rms\",\"rmt\",\"rmu\",\"rmv\",\"rmw\",\"rmx\",\"rmy\",\"rmz\",\"rna\",\"rnd\",\"rng\",\"rnl\",\"rnn\",\"rnp\",\"rnr\",\"rnw\",\"roa\",\"rob\",\"roc\",\"rod\",\"roe\",\"rof\",\"rog\",\"rol\",\"rom\",\"roo\",\"rop\",\"ror\",\"rou\",\"row\",\"rpn\",\"rpt\",\"rri\",\"rro\",\"rrt\",\"rsb\",\"rsi\",\"rsl\",\"rsm\",\"rtc\",\"rth\",\"rtm\",\"rts\",\"rtw\",\"rub\",\"ruc\",\"rue\",\"ruf\",\"rug\",\"ruh\",\"rui\",\"ruk\",\"ruo\",\"rup\",\"ruq\",\"rut\",\"ruu\",\"ruy\",\"ruz\",\"rwa\",\"rwk\",\"rwm\",\"rwo\",\"rwr\",\"rxd\",\"rxw\",\"ryn\",\"rys\",\"ryu\",\"rzh\",\"saa\",\"sab\",\"sac\",\"sad\",\"sae\",\"saf\",\"sah\",\"sai\",\"saj\",\"sak\",\"sal\",\"sam\",\"sao\",\"sap\",\"saq\",\"sar\",\"sas\",\"sat\",\"sau\",\"sav\",\"saw\",\"sax\",\"say\",\"saz\",\"sba\",\"sbb\",\"sbc\",\"sbd\",\"sbe\",\"sbf\",\"sbg\",\"sbh\",\"sbi\",\"sbj\",\"sbk\",\"sbl\",\"sbm\",\"sbn\",\"sbo\",\"sbp\",\"sbq\",\"sbr\",\"sbs\",\"sbt\",\"sbu\",\"sbv\",\"sbw\",\"sbx\",\"sby\",\"sbz\",\"sca\",\"scb\",\"sce\",\"scf\",\"scg\",\"sch\",\"sci\",\"sck\",\"scl\",\"scn\",\"sco\",\"scp\",\"scq\",\"scs\",\"sct\",\"scu\",\"scv\",\"scw\",\"scx\",\"sda\",\"sdb\",\"sdc\",\"sde\",\"sdf\",\"sdg\",\"sdh\",\"sdj\",\"sdk\",\"sdl\",\"sdm\",\"sdn\",\"sdo\",\"sdp\",\"sdr\",\"sds\",\"sdt\",\"sdu\",\"sdv\",\"sdx\",\"sdz\",\"sea\",\"seb\",\"sec\",\"sed\",\"see\",\"sef\",\"seg\",\"seh\",\"sei\",\"sej\",\"sek\",\"sel\",\"sem\",\"sen\",\"seo\",\"sep\",\"seq\",\"ser\",\"ses\",\"set\",\"seu\",\"sev\",\"sew\",\"sey\",\"sez\",\"sfb\",\"sfe\",\"sfm\",\"sfs\",\"sfw\",\"sga\",\"sgb\",\"sgc\",\"sgd\",\"sge\",\"sgg\",\"sgh\",\"sgi\",\"sgj\",\"sgk\",\"sgl\",\"sgm\",\"sgn\",\"sgo\",\"sgp\",\"sgr\",\"sgs\",\"sgt\",\"sgu\",\"sgw\",\"sgx\",\"sgy\",\"sgz\",\"sha\",\"shb\",\"shc\",\"shd\",\"she\",\"shg\",\"shh\",\"shi\",\"shj\",\"shk\",\"shl\",\"shm\",\"shn\",\"sho\",\"shp\",\"shq\",\"shr\",\"shs\",\"sht\",\"shu\",\"shv\",\"shw\",\"shx\",\"shy\",\"shz\",\"sia\",\"sib\",\"sid\",\"sie\",\"sif\",\"sig\",\"sih\",\"sii\",\"sij\",\"sik\",\"sil\",\"sim\",\"sio\",\"sip\",\"siq\",\"sir\",\"sis\",\"sit\",\"siu\",\"siv\",\"siw\",\"six\",\"siy\",\"siz\",\"sja\",\"sjb\",\"sjd\",\"sje\",\"sjg\",\"sjk\",\"sjl\",\"sjm\",\"sjn\",\"sjo\",\"sjp\",\"sjr\",\"sjs\",\"sjt\",\"sju\",\"sjw\",\"ska\",\"skb\",\"skc\",\"skd\",\"ske\",\"skf\",\"skg\",\"skh\",\"ski\",\"skj\",\"skk\",\"skm\",\"skn\",\"sko\",\"skp\",\"skq\",\"skr\",\"sks\",\"skt\",\"sku\",\"skv\",\"skw\",\"skx\",\"sky\",\"skz\",\"sla\",\"slc\",\"sld\",\"sle\",\"slf\",\"slg\",\"slh\",\"sli\",\"slj\",\"sll\",\"slm\",\"sln\",\"slp\",\"slq\",\"slr\",\"sls\",\"slt\",\"slu\",\"slw\",\"slx\",\"sly\",\"slz\",\"sma\",\"smb\",\"smc\",\"smd\",\"smf\",\"smg\",\"smh\",\"smi\",\"smj\",\"smk\",\"sml\",\"smm\",\"smn\",\"smp\",\"smq\",\"smr\",\"sms\",\"smt\",\"smu\",\"smv\",\"smw\",\"smx\",\"smy\",\"smz\",\"snb\",\"snc\",\"sne\",\"snf\",\"sng\",\"snh\",\"sni\",\"snj\",\"snk\",\"snl\",\"snm\",\"snn\",\"sno\",\"snp\",\"snq\",\"snr\",\"sns\",\"snu\",\"snv\",\"snw\",\"snx\",\"sny\",\"snz\",\"soa\",\"sob\",\"soc\",\"sod\",\"soe\",\"sog\",\"soh\",\"soi\",\"soj\",\"sok\",\"sol\",\"son\",\"soo\",\"sop\",\"soq\",\"sor\",\"sos\",\"sou\",\"sov\",\"sow\",\"sox\",\"soy\",\"soz\",\"spb\",\"spc\",\"spd\",\"spe\",\"spg\",\"spi\",\"spk\",\"spl\",\"spm\",\"spn\",\"spo\",\"spp\",\"spq\",\"spr\",\"sps\",\"spt\",\"spu\",\"spv\",\"spx\",\"spy\",\"sqa\",\"sqh\",\"sqj\",\"sqk\",\"sqm\",\"sqn\",\"sqo\",\"sqq\",\"sqr\",\"sqs\",\"sqt\",\"squ\",\"sra\",\"srb\",\"src\",\"sre\",\"srf\",\"srg\",\"srh\",\"sri\",\"srk\",\"srl\",\"srm\",\"srn\",\"sro\",\"srq\",\"srr\",\"srs\",\"srt\",\"sru\",\"srv\",\"srw\",\"srx\",\"sry\",\"srz\",\"ssa\",\"ssb\",\"ssc\",\"ssd\",\"sse\",\"ssf\",\"ssg\",\"ssh\",\"ssi\",\"ssj\",\"ssk\",\"ssl\",\"ssm\",\"ssn\",\"sso\",\"ssp\",\"ssq\",\"ssr\",\"sss\",\"sst\",\"ssu\",\"ssv\",\"ssx\",\"ssy\",\"ssz\",\"sta\",\"stb\",\"std\",\"ste\",\"stf\",\"stg\",\"sth\",\"sti\",\"stj\",\"stk\",\"stl\",\"stm\",\"stn\",\"sto\",\"stp\",\"stq\",\"str\",\"sts\",\"stt\",\"stu\",\"stv\",\"stw\",\"sty\",\"sua\",\"sub\",\"suc\",\"sue\",\"sug\",\"sui\",\"suj\",\"suk\",\"sul\",\"sum\",\"suq\",\"sur\",\"sus\",\"sut\",\"suv\",\"suw\",\"sux\",\"suy\",\"suz\",\"sva\",\"svb\",\"svc\",\"sve\",\"svk\",\"svm\",\"svr\",\"svs\",\"svx\",\"swb\",\"swc\",\"swf\",\"swg\",\"swh\",\"swi\",\"swj\",\"swk\",\"swl\",\"swm\",\"swn\",\"swo\",\"swp\",\"swq\",\"swr\",\"sws\",\"swt\",\"swu\",\"swv\",\"sww\",\"swx\",\"swy\",\"sxb\",\"sxc\",\"sxe\",\"sxg\",\"sxk\",\"sxl\",\"sxm\",\"sxn\",\"sxo\",\"sxr\",\"sxs\",\"sxu\",\"sxw\",\"sya\",\"syb\",\"syc\",\"syd\",\"syi\",\"syk\",\"syl\",\"sym\",\"syn\",\"syo\",\"syr\",\"sys\",\"syw\",\"syx\",\"syy\",\"sza\",\"szb\",\"szc\",\"szd\",\"sze\",\"szg\",\"szl\",\"szn\",\"szp\",\"szs\",\"szv\",\"szw\",\"taa\",\"tab\",\"tac\",\"tad\",\"tae\",\"taf\",\"tag\",\"tai\",\"taj\",\"tak\",\"tal\",\"tan\",\"tao\",\"tap\",\"taq\",\"tar\",\"tas\",\"tau\",\"tav\",\"taw\",\"tax\",\"tay\",\"taz\",\"tba\",\"tbb\",\"tbc\",\"tbd\",\"tbe\",\"tbf\",\"tbg\",\"tbh\",\"tbi\",\"tbj\",\"tbk\",\"tbl\",\"tbm\",\"tbn\",\"tbo\",\"tbp\",\"tbq\",\"tbr\",\"tbs\",\"tbt\",\"tbu\",\"tbv\",\"tbw\",\"tbx\",\"tby\",\"tbz\",\"tca\",\"tcb\",\"tcc\",\"tcd\",\"tce\",\"tcf\",\"tcg\",\"tch\",\"tci\",\"tck\",\"tcl\",\"tcm\",\"tcn\",\"tco\",\"tcp\",\"tcq\",\"tcs\",\"tct\",\"tcu\",\"tcw\",\"tcx\",\"tcy\",\"tcz\",\"tda\",\"tdb\",\"tdc\",\"tdd\",\"tde\",\"tdf\",\"tdg\",\"tdh\",\"tdi\",\"tdj\",\"tdk\",\"tdl\",\"tdm\",\"tdn\",\"tdo\",\"tdq\",\"tdr\",\"tds\",\"tdt\",\"tdu\",\"tdv\",\"tdx\",\"tdy\",\"tea\",\"teb\",\"tec\",\"ted\",\"tee\",\"tef\",\"teg\",\"teh\",\"tei\",\"tek\",\"tem\",\"ten\",\"teo\",\"tep\",\"teq\",\"ter\",\"tes\",\"tet\",\"teu\",\"tev\",\"tew\",\"tex\",\"tey\",\"tez\",\"tfi\",\"tfn\",\"tfo\",\"tfr\",\"tft\",\"tga\",\"tgb\",\"tgc\",\"tgd\",\"tge\",\"tgf\",\"tgg\",\"tgh\",\"tgi\",\"tgj\",\"tgn\",\"tgo\",\"tgp\",\"tgq\",\"tgr\",\"tgs\",\"tgt\",\"tgu\",\"tgv\",\"tgw\",\"tgx\",\"tgy\",\"tgz\",\"thc\",\"thd\",\"the\",\"thf\",\"thh\",\"thi\",\"thk\",\"thl\",\"thm\",\"thn\",\"thp\",\"thq\",\"thr\",\"ths\",\"tht\",\"thu\",\"thv\",\"thw\",\"thx\",\"thy\",\"thz\",\"tia\",\"tic\",\"tid\",\"tie\",\"tif\",\"tig\",\"tih\",\"tii\",\"tij\",\"tik\",\"til\",\"tim\",\"tin\",\"tio\",\"tip\",\"tiq\",\"tis\",\"tit\",\"tiu\",\"tiv\",\"tiw\",\"tix\",\"tiy\",\"tiz\",\"tja\",\"tjg\",\"tji\",\"tjl\",\"tjm\",\"tjn\",\"tjo\",\"tjs\",\"tju\",\"tjw\",\"tka\",\"tkb\",\"tkd\",\"tke\",\"tkf\",\"tkg\",\"tkk\",\"tkl\",\"tkm\",\"tkn\",\"tkp\",\"tkq\",\"tkr\",\"tks\",\"tkt\",\"tku\",\"tkv\",\"tkw\",\"tkx\",\"tkz\",\"tla\",\"tlb\",\"tlc\",\"tld\",\"tlf\",\"tlg\",\"tlh\",\"tli\",\"tlj\",\"tlk\",\"tll\",\"tlm\",\"tln\",\"tlo\",\"tlp\",\"tlq\",\"tlr\",\"tls\",\"tlt\",\"tlu\",\"tlv\",\"tlw\",\"tlx\",\"tly\",\"tma\",\"tmb\",\"tmc\",\"tmd\",\"tme\",\"tmf\",\"tmg\",\"tmh\",\"tmi\",\"tmj\",\"tmk\",\"tml\",\"tmm\",\"tmn\",\"tmo\",\"tmp\",\"tmq\",\"tmr\",\"tms\",\"tmt\",\"tmu\",\"tmv\",\"tmw\",\"tmy\",\"tmz\",\"tna\",\"tnb\",\"tnc\",\"tnd\",\"tne\",\"tnf\",\"tng\",\"tnh\",\"tni\",\"tnk\",\"tnl\",\"tnm\",\"tnn\",\"tno\",\"tnp\",\"tnq\",\"tnr\",\"tns\",\"tnt\",\"tnu\",\"tnv\",\"tnw\",\"tnx\",\"tny\",\"tnz\",\"tob\",\"toc\",\"tod\",\"toe\",\"tof\",\"tog\",\"toh\",\"toi\",\"toj\",\"tol\",\"tom\",\"too\",\"top\",\"toq\",\"tor\",\"tos\",\"tou\",\"tov\",\"tow\",\"tox\",\"toy\",\"toz\",\"tpa\",\"tpc\",\"tpe\",\"tpf\",\"tpg\",\"tpi\",\"tpj\",\"tpk\",\"tpl\",\"tpm\",\"tpn\",\"tpo\",\"tpp\",\"tpq\",\"tpr\",\"tpt\",\"tpu\",\"tpv\",\"tpw\",\"tpx\",\"tpy\",\"tpz\",\"tqb\",\"tql\",\"tqm\",\"tqn\",\"tqo\",\"tqp\",\"tqq\",\"tqr\",\"tqt\",\"tqu\",\"tqw\",\"tra\",\"trb\",\"trc\",\"trd\",\"tre\",\"trf\",\"trg\",\"trh\",\"tri\",\"trj\",\"trk\",\"trl\",\"trm\",\"trn\",\"tro\",\"trp\",\"trq\",\"trr\",\"trs\",\"trt\",\"tru\",\"trv\",\"trw\",\"trx\",\"try\",\"trz\",\"tsa\",\"tsb\",\"tsc\",\"tsd\",\"tse\",\"tsf\",\"tsg\",\"tsh\",\"tsi\",\"tsj\",\"tsk\",\"tsl\",\"tsm\",\"tsp\",\"tsq\",\"tsr\",\"tss\",\"tst\",\"tsu\",\"tsv\",\"tsw\",\"tsx\",\"tsy\",\"tsz\",\"tta\",\"ttb\",\"ttc\",\"ttd\",\"tte\",\"ttf\",\"ttg\",\"tth\",\"tti\",\"ttj\",\"ttk\",\"ttl\",\"ttm\",\"ttn\",\"tto\",\"ttp\",\"ttq\",\"ttr\",\"tts\",\"ttt\",\"ttu\",\"ttv\",\"ttw\",\"tty\",\"ttz\",\"tua\",\"tub\",\"tuc\",\"tud\",\"tue\",\"tuf\",\"tug\",\"tuh\",\"tui\",\"tuj\",\"tul\",\"tum\",\"tun\",\"tuo\",\"tup\",\"tuq\",\"tus\",\"tut\",\"tuu\",\"tuv\",\"tuw\",\"tux\",\"tuy\",\"tuz\",\"tva\",\"tvd\",\"tve\",\"tvk\",\"tvl\",\"tvm\",\"tvn\",\"tvo\",\"tvs\",\"tvt\",\"tvu\",\"tvw\",\"tvy\",\"twa\",\"twb\",\"twc\",\"twd\",\"twe\",\"twf\",\"twg\",\"twh\",\"twl\",\"twm\",\"twn\",\"two\",\"twp\",\"twq\",\"twr\",\"twt\",\"twu\",\"tww\",\"twx\",\"twy\",\"txa\",\"txb\",\"txc\",\"txe\",\"txg\",\"txh\",\"txi\",\"txj\",\"txm\",\"txn\",\"txo\",\"txq\",\"txr\",\"txs\",\"txt\",\"txu\",\"txx\",\"txy\",\"tya\",\"tye\",\"tyh\",\"tyi\",\"tyj\",\"tyl\",\"tyn\",\"typ\",\"tyr\",\"tys\",\"tyt\",\"tyu\",\"tyv\",\"tyx\",\"tyz\",\"tza\",\"tzh\",\"tzj\",\"tzl\",\"tzm\",\"tzn\",\"tzo\",\"tzx\",\"uam\",\"uan\",\"uar\",\"uba\",\"ubi\",\"ubl\",\"ubr\",\"ubu\",\"uby\",\"uda\",\"ude\",\"udg\",\"udi\",\"udj\",\"udl\",\"udm\",\"udu\",\"ues\",\"ufi\",\"uga\",\"ugb\",\"uge\",\"ugn\",\"ugo\",\"ugy\",\"uha\",\"uhn\",\"uis\",\"uiv\",\"uji\",\"uka\",\"ukg\",\"ukh\",\"ukk\",\"ukl\",\"ukp\",\"ukq\",\"uks\",\"uku\",\"ukw\",\"uky\",\"ula\",\"ulb\",\"ulc\",\"ule\",\"ulf\",\"uli\",\"ulk\",\"ull\",\"ulm\",\"uln\",\"ulu\",\"ulw\",\"uma\",\"umb\",\"umc\",\"umd\",\"umg\",\"umi\",\"umm\",\"umn\",\"umo\",\"ump\",\"umr\",\"ums\",\"umu\",\"una\",\"und\",\"une\",\"ung\",\"unk\",\"unm\",\"unn\",\"unp\",\"unr\",\"unu\",\"unx\",\"unz\",\"uok\",\"upi\",\"upv\",\"ura\",\"urb\",\"urc\",\"ure\",\"urf\",\"urg\",\"urh\",\"uri\",\"urj\",\"urk\",\"url\",\"urm\",\"urn\",\"uro\",\"urp\",\"urr\",\"urt\",\"uru\",\"urv\",\"urw\",\"urx\",\"ury\",\"urz\",\"usa\",\"ush\",\"usi\",\"usk\",\"usp\",\"usu\",\"uta\",\"ute\",\"utp\",\"utr\",\"utu\",\"uum\",\"uun\",\"uur\",\"uuu\",\"uve\",\"uvh\",\"uvl\",\"uwa\",\"uya\",\"uzn\",\"uzs\",\"vaa\",\"vae\",\"vaf\",\"vag\",\"vah\",\"vai\",\"vaj\",\"val\",\"vam\",\"van\",\"vao\",\"vap\",\"var\",\"vas\",\"vau\",\"vav\",\"vay\",\"vbb\",\"vbk\",\"vec\",\"ved\",\"vel\",\"vem\",\"veo\",\"vep\",\"ver\",\"vgr\",\"vgt\",\"vic\",\"vid\",\"vif\",\"vig\",\"vil\",\"vin\",\"vis\",\"vit\",\"viv\",\"vka\",\"vki\",\"vkj\",\"vkk\",\"vkl\",\"vkm\",\"vko\",\"vkp\",\"vkt\",\"vku\",\"vlp\",\"vls\",\"vma\",\"vmb\",\"vmc\",\"vmd\",\"vme\",\"vmf\",\"vmg\",\"vmh\",\"vmi\",\"vmj\",\"vmk\",\"vml\",\"vmm\",\"vmp\",\"vmq\",\"vmr\",\"vms\",\"vmu\",\"vmv\",\"vmw\",\"vmx\",\"vmy\",\"vmz\",\"vnk\",\"vnm\",\"vnp\",\"vor\",\"vot\",\"vra\",\"vro\",\"vrs\",\"vrt\",\"vsi\",\"vsl\",\"vsv\",\"vto\",\"vum\",\"vun\",\"vut\",\"vwa\",\"waa\",\"wab\",\"wac\",\"wad\",\"wae\",\"waf\",\"wag\",\"wah\",\"wai\",\"waj\",\"wak\",\"wal\",\"wam\",\"wan\",\"wao\",\"wap\",\"waq\",\"war\",\"was\",\"wat\",\"wau\",\"wav\",\"waw\",\"wax\",\"way\",\"waz\",\"wba\",\"wbb\",\"wbe\",\"wbf\",\"wbh\",\"wbi\",\"wbj\",\"wbk\",\"wbl\",\"wbm\",\"wbp\",\"wbq\",\"wbr\",\"wbs\",\"wbt\",\"wbv\",\"wbw\",\"wca\",\"wci\",\"wdd\",\"wdg\",\"wdj\",\"wdk\",\"wdu\",\"wdy\",\"wea\",\"wec\",\"wed\",\"weg\",\"weh\",\"wei\",\"wem\",\"wen\",\"weo\",\"wep\",\"wer\",\"wes\",\"wet\",\"weu\",\"wew\",\"wfg\",\"wga\",\"wgb\",\"wgg\",\"wgi\",\"wgo\",\"wgu\",\"wgw\",\"wgy\",\"wha\",\"whg\",\"whk\",\"whu\",\"wib\",\"wic\",\"wie\",\"wif\",\"wig\",\"wih\",\"wii\",\"wij\",\"wik\",\"wil\",\"wim\",\"win\",\"wir\",\"wit\",\"wiu\",\"wiv\",\"wiw\",\"wiy\",\"wja\",\"wji\",\"wka\",\"wkb\",\"wkd\",\"wkl\",\"wku\",\"wkw\",\"wky\",\"wla\",\"wlc\",\"wle\",\"wlg\",\"wli\",\"wlk\",\"wll\",\"wlm\",\"wlo\",\"wlr\",\"wls\",\"wlu\",\"wlv\",\"wlw\",\"wlx\",\"wly\",\"wma\",\"wmb\",\"wmc\",\"wmd\",\"wme\",\"wmh\",\"wmi\",\"wmm\",\"wmn\",\"wmo\",\"wms\",\"wmt\",\"wmw\",\"wmx\",\"wnb\",\"wnc\",\"wnd\",\"wne\",\"wng\",\"wni\",\"wnk\",\"wnm\",\"wnn\",\"wno\",\"wnp\",\"wnu\",\"wnw\",\"wny\",\"woa\",\"wob\",\"woc\",\"wod\",\"woe\",\"wof\",\"wog\",\"woi\",\"wok\",\"wom\",\"won\",\"woo\",\"wor\",\"wos\",\"wow\",\"woy\",\"wpc\",\"wra\",\"wrb\",\"wrd\",\"wrg\",\"wrh\",\"wri\",\"wrk\",\"wrl\",\"wrm\",\"wrn\",\"wro\",\"wrp\",\"wrr\",\"wrs\",\"wru\",\"wrv\",\"wrw\",\"wrx\",\"wry\",\"wrz\",\"wsa\",\"wsg\",\"wsi\",\"wsk\",\"wsr\",\"wss\",\"wsu\",\"wsv\",\"wtf\",\"wth\",\"wti\",\"wtk\",\"wtm\",\"wtw\",\"wua\",\"wub\",\"wud\",\"wuh\",\"wul\",\"wum\",\"wun\",\"wur\",\"wut\",\"wuu\",\"wuv\",\"wux\",\"wuy\",\"wwa\",\"wwb\",\"wwo\",\"wwr\",\"www\",\"wxa\",\"wxw\",\"wya\",\"wyb\",\"wyi\",\"wym\",\"wyr\",\"wyy\",\"xaa\",\"xab\",\"xac\",\"xad\",\"xae\",\"xag\",\"xai\",\"xaj\",\"xak\",\"xal\",\"xam\",\"xan\",\"xao\",\"xap\",\"xaq\",\"xar\",\"xas\",\"xat\",\"xau\",\"xav\",\"xaw\",\"xay\",\"xba\",\"xbb\",\"xbc\",\"xbd\",\"xbe\",\"xbg\",\"xbi\",\"xbj\",\"xbm\",\"xbn\",\"xbo\",\"xbp\",\"xbr\",\"xbw\",\"xbx\",\"xby\",\"xcb\",\"xcc\",\"xce\",\"xcg\",\"xch\",\"xcl\",\"xcm\",\"xcn\",\"xco\",\"xcr\",\"xct\",\"xcu\",\"xcv\",\"xcw\",\"xcy\",\"xda\",\"xdc\",\"xdk\",\"xdm\",\"xdo\",\"xdy\",\"xeb\",\"xed\",\"xeg\",\"xel\",\"xem\",\"xep\",\"xer\",\"xes\",\"xet\",\"xeu\",\"xfa\",\"xga\",\"xgb\",\"xgd\",\"xgf\",\"xgg\",\"xgi\",\"xgl\",\"xgm\",\"xgn\",\"xgr\",\"xgu\",\"xgw\",\"xha\",\"xhc\",\"xhd\",\"xhe\",\"xhr\",\"xht\",\"xhu\",\"xhv\",\"xia\",\"xib\",\"xii\",\"xil\",\"xin\",\"xip\",\"xir\",\"xis\",\"xiv\",\"xiy\",\"xjb\",\"xjt\",\"xka\",\"xkb\",\"xkc\",\"xkd\",\"xke\",\"xkf\",\"xkg\",\"xkh\",\"xki\",\"xkj\",\"xkk\",\"xkl\",\"xkn\",\"xko\",\"xkp\",\"xkq\",\"xkr\",\"xks\",\"xkt\",\"xku\",\"xkv\",\"xkw\",\"xkx\",\"xky\",\"xkz\",\"xla\",\"xlb\",\"xlc\",\"xld\",\"xle\",\"xlg\",\"xli\",\"xln\",\"xlo\",\"xlp\",\"xls\",\"xlu\",\"xly\",\"xma\",\"xmb\",\"xmc\",\"xmd\",\"xme\",\"xmf\",\"xmg\",\"xmh\",\"xmj\",\"xmk\",\"xml\",\"xmm\",\"xmn\",\"xmo\",\"xmp\",\"xmq\",\"xmr\",\"xms\",\"xmt\",\"xmu\",\"xmv\",\"xmw\",\"xmx\",\"xmy\",\"xmz\",\"xna\",\"xnb\",\"xnd\",\"xng\",\"xnh\",\"xni\",\"xnk\",\"xnn\",\"xno\",\"xnr\",\"xns\",\"xnt\",\"xnu\",\"xny\",\"xnz\",\"xoc\",\"xod\",\"xog\",\"xoi\",\"xok\",\"xom\",\"xon\",\"xoo\",\"xop\",\"xor\",\"xow\",\"xpa\",\"xpc\",\"xpe\",\"xpg\",\"xpi\",\"xpj\",\"xpk\",\"xpm\",\"xpn\",\"xpo\",\"xpp\",\"xpq\",\"xpr\",\"xps\",\"xpt\",\"xpu\",\"xpy\",\"xqa\",\"xqt\",\"xra\",\"xrb\",\"xrd\",\"xre\",\"xrg\",\"xri\",\"xrm\",\"xrn\",\"xrq\",\"xrr\",\"xrt\",\"xru\",\"xrw\",\"xsa\",\"xsb\",\"xsc\",\"xsd\",\"xse\",\"xsh\",\"xsi\",\"xsj\",\"xsl\",\"xsm\",\"xsn\",\"xso\",\"xsp\",\"xsq\",\"xsr\",\"xss\",\"xsu\",\"xsv\",\"xsy\",\"xta\",\"xtb\",\"xtc\",\"xtd\",\"xte\",\"xtg\",\"xth\",\"xti\",\"xtj\",\"xtl\",\"xtm\",\"xtn\",\"xto\",\"xtp\",\"xtq\",\"xtr\",\"xts\",\"xtt\",\"xtu\",\"xtv\",\"xtw\",\"xty\",\"xtz\",\"xua\",\"xub\",\"xud\",\"xug\",\"xuj\",\"xul\",\"xum\",\"xun\",\"xuo\",\"xup\",\"xur\",\"xut\",\"xuu\",\"xve\",\"xvi\",\"xvn\",\"xvo\",\"xvs\",\"xwa\",\"xwc\",\"xwd\",\"xwe\",\"xwg\",\"xwj\",\"xwk\",\"xwl\",\"xwo\",\"xwr\",\"xwt\",\"xww\",\"xxb\",\"xxk\",\"xxm\",\"xxr\",\"xxt\",\"xya\",\"xyb\",\"xyj\",\"xyk\",\"xyl\",\"xyt\",\"xyy\",\"xzh\",\"xzm\",\"xzp\",\"yaa\",\"yab\",\"yac\",\"yad\",\"yae\",\"yaf\",\"yag\",\"yah\",\"yai\",\"yaj\",\"yak\",\"yal\",\"yam\",\"yan\",\"yao\",\"yap\",\"yaq\",\"yar\",\"yas\",\"yat\",\"yau\",\"yav\",\"yaw\",\"yax\",\"yay\",\"yaz\",\"yba\",\"ybb\",\"ybd\",\"ybe\",\"ybh\",\"ybi\",\"ybj\",\"ybk\",\"ybl\",\"ybm\",\"ybn\",\"ybo\",\"ybx\",\"yby\",\"ych\",\"ycl\",\"ycn\",\"ycp\",\"yda\",\"ydd\",\"yde\",\"ydg\",\"ydk\",\"yds\",\"yea\",\"yec\",\"yee\",\"yei\",\"yej\",\"yel\",\"yen\",\"yer\",\"yes\",\"yet\",\"yeu\",\"yev\",\"yey\",\"yga\",\"ygi\",\"ygl\",\"ygm\",\"ygp\",\"ygr\",\"ygs\",\"ygu\",\"ygw\",\"yha\",\"yhd\",\"yhl\",\"yhs\",\"yia\",\"yif\",\"yig\",\"yih\",\"yii\",\"yij\",\"yik\",\"yil\",\"yim\",\"yin\",\"yip\",\"yiq\",\"yir\",\"yis\",\"yit\",\"yiu\",\"yiv\",\"yix\",\"yiy\",\"yiz\",\"yka\",\"ykg\",\"yki\",\"ykk\",\"ykl\",\"ykm\",\"ykn\",\"yko\",\"ykr\",\"ykt\",\"yku\",\"yky\",\"yla\",\"ylb\",\"yle\",\"ylg\",\"yli\",\"yll\",\"ylm\",\"yln\",\"ylo\",\"ylr\",\"ylu\",\"yly\",\"yma\",\"ymb\",\"ymc\",\"ymd\",\"yme\",\"ymg\",\"ymh\",\"ymi\",\"ymk\",\"yml\",\"ymm\",\"ymn\",\"ymo\",\"ymp\",\"ymq\",\"ymr\",\"yms\",\"ymt\",\"ymx\",\"ymz\",\"yna\",\"ynd\",\"yne\",\"yng\",\"ynh\",\"ynk\",\"ynl\",\"ynn\",\"yno\",\"ynq\",\"yns\",\"ynu\",\"yob\",\"yog\",\"yoi\",\"yok\",\"yol\",\"yom\",\"yon\",\"yos\",\"yot\",\"yox\",\"yoy\",\"ypa\",\"ypb\",\"ypg\",\"yph\",\"ypk\",\"ypm\",\"ypn\",\"ypo\",\"ypp\",\"ypz\",\"yra\",\"yrb\",\"yre\",\"yri\",\"yrk\",\"yrl\",\"yrm\",\"yrn\",\"yro\",\"yrs\",\"yrw\",\"yry\",\"ysc\",\"ysd\",\"ysg\",\"ysl\",\"ysn\",\"yso\",\"ysp\",\"ysr\",\"yss\",\"ysy\",\"yta\",\"ytl\",\"ytp\",\"ytw\",\"yty\",\"yua\",\"yub\",\"yuc\",\"yud\",\"yue\",\"yuf\",\"yug\",\"yui\",\"yuj\",\"yuk\",\"yul\",\"yum\",\"yun\",\"yup\",\"yuq\",\"yur\",\"yut\",\"yuu\",\"yuw\",\"yux\",\"yuy\",\"yuz\",\"yva\",\"yvt\",\"ywa\",\"ywg\",\"ywl\",\"ywn\",\"ywq\",\"ywr\",\"ywt\",\"ywu\",\"yww\",\"yxa\",\"yxg\",\"yxl\",\"yxm\",\"yxu\",\"yxy\",\"yyr\",\"yyu\",\"yyz\",\"yzg\",\"yzk\",\"zaa\",\"zab\",\"zac\",\"zad\",\"zae\",\"zaf\",\"zag\",\"zah\",\"zai\",\"zaj\",\"zak\",\"zal\",\"zam\",\"zao\",\"zap\",\"zaq\",\"zar\",\"zas\",\"zat\",\"zau\",\"zav\",\"zaw\",\"zax\",\"zay\",\"zaz\",\"zbc\",\"zbe\",\"zbl\",\"zbt\",\"zbw\",\"zca\",\"zch\",\"zdj\",\"zea\",\"zeg\",\"zeh\",\"zen\",\"zga\",\"zgb\",\"zgh\",\"zgm\",\"zgn\",\"zgr\",\"zhb\",\"zhd\",\"zhi\",\"zhn\",\"zhw\",\"zhx\",\"zia\",\"zib\",\"zik\",\"zil\",\"zim\",\"zin\",\"zir\",\"ziw\",\"ziz\",\"zka\",\"zkb\",\"zkd\",\"zkg\",\"zkh\",\"zkk\",\"zkn\",\"zko\",\"zkp\",\"zkr\",\"zkt\",\"zku\",\"zkv\",\"zkz\",\"zle\",\"zlj\",\"zlm\",\"zln\",\"zlq\",\"zls\",\"zlw\",\"zma\",\"zmb\",\"zmc\",\"zmd\",\"zme\",\"zmf\",\"zmg\",\"zmh\",\"zmi\",\"zmj\",\"zmk\",\"zml\",\"zmm\",\"zmn\",\"zmo\",\"zmp\",\"zmq\",\"zmr\",\"zms\",\"zmt\",\"zmu\",\"zmv\",\"zmw\",\"zmx\",\"zmy\",\"zmz\",\"zna\",\"znd\",\"zne\",\"zng\",\"znk\",\"zns\",\"zoc\",\"zoh\",\"zom\",\"zoo\",\"zoq\",\"zor\",\"zos\",\"zpa\",\"zpb\",\"zpc\",\"zpd\",\"zpe\",\"zpf\",\"zpg\",\"zph\",\"zpi\",\"zpj\",\"zpk\",\"zpl\",\"zpm\",\"zpn\",\"zpo\",\"zpp\",\"zpq\",\"zpr\",\"zps\",\"zpt\",\"zpu\",\"zpv\",\"zpw\",\"zpx\",\"zpy\",\"zpz\",\"zqe\",\"zra\",\"zrg\",\"zrn\",\"zro\",\"zrp\",\"zrs\",\"zsa\",\"zsk\",\"zsl\",\"zsm\",\"zsr\",\"zsu\",\"zte\",\"ztg\",\"ztl\",\"ztm\",\"ztn\",\"ztp\",\"ztq\",\"zts\",\"ztt\",\"ztu\",\"ztx\",\"zty\",\"zua\",\"zuh\",\"zum\",\"zun\",\"zuy\",\"zwa\",\"zxx\",\"zyb\",\"zyg\",\"zyj\",\"zyn\",\"zyp\",\"zza\",\"zzj\"];axe.utils.validLangs=function(){\"use strict\";return Fe};T=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},N=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e};function ie(e){if(Array.isArray(e)){for(var t=0,r=Array(e.length);t<e.length;t++)r[t]=e[t];return r}return Array.from(e)}axe._load({data:{rules:{accesskeys:{description:\"Ensures every accesskey attribute value is unique\",help:\"accesskey attribute value must be unique\"},\"area-alt\":{description:\"Ensures <area> elements of image maps have alternate text\",help:\"Active <area> elements must have alternate text\"},\"aria-allowed-attr\":{description:\"Ensures ARIA attributes are allowed for an element's role\",help:\"Elements must only use allowed ARIA attributes\"},\"aria-allowed-role\":{description:\"Ensures role attribute has an appropriate value for the element\",help:\"ARIA role must be appropriate for the element\"},\"aria-dpub-role-fallback\":{description:\"Ensures unsupported DPUB roles are only used on elements with implicit fallback roles\",help:\"Unsupported DPUB ARIA roles should be used on elements with implicit fallback roles\"},\"aria-hidden-body\":{description:\"Ensures aria-hidden='true' is not present on the document body.\",help:\"aria-hidden='true' must not be present on the document body\"},\"aria-hidden-focus\":{description:\"Ensures aria-hidden elements do not contain focusable elements\",help:\"ARIA hidden element must not contain focusable elements\"},\"aria-required-attr\":{description:\"Ensures elements with ARIA roles have all required ARIA attributes\",help:\"Required ARIA attributes must be provided\"},\"aria-required-children\":{description:\"Ensures elements with an ARIA role that require child roles contain them\",help:\"Certain ARIA roles must contain particular children\"},\"aria-required-parent\":{description:\"Ensures elements with an ARIA role that require parent roles are contained by them\",help:\"Certain ARIA roles must be contained by particular parents\"},\"aria-roles\":{description:\"Ensures all elements with a role attribute use a valid value\",help:\"ARIA roles used must conform to valid values\"},\"aria-valid-attr-value\":{description:\"Ensures all ARIA attributes have valid values\",help:\"ARIA attributes must conform to valid values\"},\"aria-valid-attr\":{description:\"Ensures attributes that begin with aria- are valid ARIA attributes\",help:\"ARIA attributes must conform to valid names\"},\"audio-caption\":{description:\"Ensures <audio> elements have captions\",help:\"<audio> elements must have a captions track\"},\"autocomplete-valid\":{description:\"Ensure the autocomplete attribute is correct and suitable for the form field\",help:\"autocomplete attribute must be used correctly\"},blink:{description:\"Ensures <blink> elements are not used\",help:\"<blink> elements are deprecated and must not be used\"},\"button-name\":{description:\"Ensures buttons have discernible text\",help:\"Buttons must have discernible text\"},bypass:{description:\"Ensures each page has at least one mechanism for a user to bypass navigation and jump straight to the content\",help:\"Page must have means to bypass repeated blocks\"},checkboxgroup:{description:'Ensures related <input type=\"checkbox\"> elements have a group and that the group designation is consistent',help:\"Checkbox inputs with the same name attribute value must be part of a group\"},\"color-contrast\":{description:\"Ensures the contrast between foreground and background colors meets WCAG 2 AA contrast ratio thresholds\",help:\"Elements must have sufficient color contrast\"},\"css-orientation-lock\":{description:\"Ensures content is not locked to any specific display orientation, and the content is operable in all display orientations\",help:\"CSS Media queries are not used to lock display orientation\"},\"definition-list\":{description:\"Ensures <dl> elements are structured correctly\",help:\"<dl> elements must only directly contain properly-ordered <dt> and <dd> groups, <script> or <template> elements\"},dlitem:{description:\"Ensures <dt> and <dd> elements are contained by a <dl>\",help:\"<dt> and <dd> elements must be contained by a <dl>\"},\"document-title\":{description:\"Ensures each HTML document contains a non-empty <title> element\",help:\"Documents must have <title> element to aid in navigation\"},\"duplicate-id-active\":{description:\"Ensures every id attribute value of active elements is unique\",help:\"IDs of active elements must be unique\"},\"duplicate-id-aria\":{description:\"Ensures every id attribute value used in ARIA and in labels is unique\",help:\"IDs used in ARIA and labels must be unique\"},\"duplicate-id\":{description:\"Ensures every id attribute value is unique\",help:\"id attribute value must be unique\"},\"empty-heading\":{description:\"Ensures headings have discernible text\",help:\"Headings must not be empty\"},\"focus-order-semantics\":{description:\"Ensures elements in the focus order have an appropriate role\",help:\"Elements in the focus order need a role appropriate for interactive content\"},\"form-field-multiple-labels\":{description:\"Ensures form field does not have multiple label elements\",help:\"Form field must not have multiple label elements\"},\"frame-tested\":{description:\"Ensures <iframe> and <frame> elements contain the axe-core script\",help:\"Frames must be tested with axe-core\"},\"frame-title-unique\":{description:\"Ensures <iframe> and <frame> elements contain a unique title attribute\",help:\"Frames must have a unique title attribute\"},\"frame-title\":{description:\"Ensures <iframe> and <frame> elements contain a non-empty title attribute\",help:\"Frames must have title attribute\"},\"heading-order\":{description:\"Ensures the order of headings is semantically correct\",help:\"Heading levels should only increase by one\"},\"hidden-content\":{description:\"Informs users about hidden content.\",help:\"Hidden content on the page cannot be analyzed\"},\"html-has-lang\":{description:\"Ensures every HTML document has a lang attribute\",help:\"<html> element must have a lang attribute\"},\"html-lang-valid\":{description:\"Ensures the lang attribute of the <html> element has a valid value\",help:\"<html> element must have a valid value for the lang attribute\"},\"html-xml-lang-mismatch\":{description:\"Ensure that HTML elements with both valid lang and xml:lang attributes agree on the base language of the page\",help:\"HTML elements with lang and xml:lang must have the same base language\"},\"image-alt\":{description:\"Ensures <img> elements have alternate text or a role of none or presentation\",help:\"Images must have alternate text\"},\"image-redundant-alt\":{description:\"Ensure button and link text is not repeated as image alternative\",help:\"Text of buttons and links should not be repeated in the image alternative\"},\"input-image-alt\":{description:'Ensures <input type=\"image\"> elements have alternate text',help:\"Image buttons must have alternate text\"},\"label-content-name-mismatch\":{description:\"Ensures that elements labelled through their content must have their visible text as part of their accessible name\",help:\"Elements must have their visible text as part of their accessible name\"},\"label-title-only\":{description:\"Ensures that every form element is not solely labeled using the title or aria-describedby attributes\",help:\"Form elements should have a visible label\"},label:{description:\"Ensures every form element has a label\",help:\"Form elements must have labels\"},\"landmark-banner-is-top-level\":{description:\"Ensures the banner landmark is at top level\",help:\"Banner landmark must not be contained in another landmark\"},\"landmark-complementary-is-top-level\":{description:\"Ensures the complementary landmark or aside is at top level\",help:\"Aside must not be contained in another landmark\"},\"landmark-contentinfo-is-top-level\":{description:\"Ensures the contentinfo landmark is at top level\",help:\"Contentinfo landmark must not be contained in another landmark\"},\"landmark-main-is-top-level\":{description:\"Ensures the main landmark is at top level\",help:\"Main landmark must not be contained in another landmark\"},\"landmark-no-duplicate-banner\":{description:\"Ensures the document has at most one banner landmark\",help:\"Document must not have more than one banner landmark\"},\"landmark-no-duplicate-contentinfo\":{description:\"Ensures the document has at most one contentinfo landmark\",help:\"Document must not have more than one contentinfo landmark\"},\"landmark-one-main\":{description:\"Ensures the document has only one main landmark and each iframe in the page has at most one main landmark\",help:\"Document must have one main landmark\"},\"layout-table\":{description:\"Ensures presentational <table> elements do not use <th>, <caption> elements or the summary attribute\",help:\"Layout tables must not use data table elements\"},\"link-in-text-block\":{description:\"Links can be distinguished without relying on color\",help:\"Links must be distinguished from surrounding text in a way that does not rely on color\"},\"link-name\":{description:\"Ensures links have discernible text\",help:\"Links must have discernible text\"},list:{description:\"Ensures that lists are structured correctly\",help:\"<ul> and <ol> must only directly contain <li>, <script> or <template> elements\"},listitem:{description:\"Ensures <li> elements are used semantically\",help:\"<li> elements must be contained in a <ul> or <ol>\"},marquee:{description:\"Ensures <marquee> elements are not used\",help:\"<marquee> elements are deprecated and must not be used\"},\"meta-refresh\":{description:'Ensures <meta http-equiv=\"refresh\"> is not used',help:\"Timed refresh must not exist\"},\"meta-viewport-large\":{description:'Ensures <meta name=\"viewport\"> can scale a significant amount',help:\"Users should be able to zoom and scale the text up to 500%\"},\"meta-viewport\":{description:'Ensures <meta name=\"viewport\"> does not disable text scaling and zooming',help:\"Zooming and scaling must not be disabled\"},\"object-alt\":{description:\"Ensures <object> elements have alternate text\",help:\"<object> elements must have alternate text\"},\"p-as-heading\":{description:\"Ensure p elements are not used to style headings\",help:\"Bold, italic text and font-size are not used to style p elements as a heading\"},\"page-has-heading-one\":{description:\"Ensure that the page, or at least one of its frames contains a level-one heading\",help:\"Page must contain a level-one heading\"},radiogroup:{description:'Ensures related <input type=\"radio\"> elements have a group and that the group designation is consistent',help:\"Radio inputs with the same name attribute value must be part of a group\"},region:{description:\"Ensures all page content is contained by landmarks\",help:\"All page content must be contained by landmarks\"},\"scope-attr-valid\":{description:\"Ensures the scope attribute is used correctly on tables\",help:\"scope attribute should be used correctly\"},\"server-side-image-map\":{description:\"Ensures that server-side image maps are not used\",help:\"Server-side image maps must not be used\"},\"skip-link\":{description:\"Ensure all skip links have a focusable target\",help:\"The skip-link target should exist and be focusable\"},tabindex:{description:\"Ensures tabindex attribute values are not greater than 0\",help:\"Elements should not have tabindex greater than zero\"},\"table-duplicate-name\":{description:\"Ensure that tables do not have the same summary and caption\",help:\"The <caption> element should not contain the same text as the summary attribute\"},\"table-fake-caption\":{description:\"Ensure that tables with a caption use the <caption> element.\",help:\"Data or header cells should not be used to give caption to a data table.\"},\"td-has-header\":{description:\"Ensure that each non-empty data cell in a large table has one or more table headers\",help:\"All non-empty td element in table larger than 3 by 3 must have an associated table header\"},\"td-headers-attr\":{description:\"Ensure that each cell in a table using the headers refers to another cell in that table\",help:\"All cells in a table element that use the headers attribute must only refer to other cells of that same table\"},\"th-has-data-cells\":{description:\"Ensure that each table header in a data table refers to data cells\",help:\"All th elements and elements with role=columnheader/rowheader must have data cells they describe\"},\"valid-lang\":{description:\"Ensures lang attributes have valid values\",help:\"lang attribute must have a valid value\"},\"video-caption\":{description:\"Ensures <video> elements have captions\",help:\"<video> elements must have captions\"},\"video-description\":{description:\"Ensures <video> elements have audio descriptions\",help:\"<video> elements must have an audio description track\"}},checks:{accesskeys:{impact:\"serious\",messages:{pass:function(e){return\"Accesskey attribute value is unique\"},fail:function(e){return\"Document has multiple elements with the same accesskey\"}}},\"non-empty-alt\":{impact:\"critical\",messages:{pass:function(e){return\"Element has a non-empty alt attribute\"},fail:function(e){return\"Element has no alt attribute or the alt attribute is empty\"}}},\"non-empty-title\":{impact:\"serious\",messages:{pass:function(e){return\"Element has a title attribute\"},fail:function(e){return\"Element has no title attribute or the title attribute is empty\"}}},\"aria-label\":{impact:\"serious\",messages:{pass:function(e){return\"aria-label attribute exists and is not empty\"},fail:function(e){return\"aria-label attribute does not exist or is empty\"}}},\"aria-labelledby\":{impact:\"serious\",messages:{pass:function(e){return\"aria-labelledby attribute exists and references elements that are visible to screen readers\"},fail:function(e){return\"aria-labelledby attribute does not exist, references elements that do not exist or references elements that are empty\"}}},\"aria-allowed-attr\":{impact:\"critical\",messages:{pass:function(e){return\"ARIA attributes are used correctly for the defined role\"},fail:function(e){var t=\"ARIA attribute\"+(e.data&&1<e.data.length?\"s are\":\" is\")+\" not allowed:\",r=e.data;if(r)for(var n=-1,a=r.length-1;n<a;)t+=\" \"+r[n+=1];return t}}},\"aria-unsupported-attr\":{impact:\"critical\",messages:{pass:function(e){return\"ARIA attribute is supported\"},fail:function(e){var t=\"ARIA attribute is not widely supported in screen readers and assistive technologies: \",r=e.data;if(r)for(var n=-1,a=r.length-1;n<a;)t+=\" \"+r[n+=1];return t}}},\"aria-allowed-role\":{impact:\"minor\",messages:{pass:function(e){return\"ARIA role is allowed for given element\"},fail:function(e){return\"ARIA role\"+(e.data&&1<e.data.length?\"s\":\"\")+\" \"+e.data.join(\", \")+\" \"+(e.data&&1<e.data.length?\"are\":\" is\")+\" not allowed for given element\"},incomplete:function(e){return\"ARIA role\"+(e.data&&1<e.data.length?\"s\":\"\")+\" \"+e.data.join(\", \")+\" must be removed when the element is made visible, as \"+(e.data&&1<e.data.length?\"they are\":\"it is\")+\" not allowed for the element\"}}},\"implicit-role-fallback\":{impact:\"moderate\",messages:{pass:function(e){return\"Element’s implicit ARIA role is an appropriate fallback\"},fail:function(e){return\"Element’s implicit ARIA role is not a good fallback for the (unsupported) role\"}}},\"aria-hidden-body\":{impact:\"critical\",messages:{pass:function(e){return\"No aria-hidden attribute is present on document body\"},fail:function(e){return\"aria-hidden=true should not be present on the document body\"}}},\"focusable-disabled\":{impact:\"serious\",messages:{pass:function(e){return\"No focusable elements contained within element\"},fail:function(e){return\"Focusable content should be disabled or be removed from the DOM\"}}},\"focusable-not-tabbable\":{impact:\"serious\",messages:{pass:function(e){return\"No focusable elements contained within element\"},fail:function(e){return\"Focusable content should have tabindex='-1' or be removed from the DOM\"}}},\"aria-required-attr\":{impact:\"critical\",messages:{pass:function(e){return\"All required ARIA attributes are present\"},fail:function(e){var t=\"Required ARIA attribute\"+(e.data&&1<e.data.length?\"s\":\"\")+\" not present:\",r=e.data;if(r)for(var n=-1,a=r.length-1;n<a;)t+=\" \"+r[n+=1];return t}}},\"aria-required-children\":{impact:\"critical\",messages:{pass:function(e){return\"Required ARIA children are present\"},fail:function(e){var t=\"Required ARIA \"+(e.data&&1<e.data.length?\"children\":\"child\")+\" role not present:\",r=e.data;if(r)for(var n=-1,a=r.length-1;n<a;)t+=\" \"+r[n+=1];return t},incomplete:function(e){var t=\"Expecting ARIA \"+(e.data&&1<e.data.length?\"children\":\"child\")+\" role to be added:\",r=e.data;if(r)for(var n=-1,a=r.length-1;n<a;)t+=\" \"+r[n+=1];return t}}},\"aria-required-parent\":{impact:\"critical\",messages:{pass:function(e){return\"Required ARIA parent role present\"},fail:function(e){var t=\"Required ARIA parent\"+(e.data&&1<e.data.length?\"s\":\"\")+\" role not present:\",r=e.data;if(r)for(var n=-1,a=r.length-1;n<a;)t+=\" \"+r[n+=1];return t}}},invalidrole:{impact:\"critical\",messages:{pass:function(e){return\"ARIA role is valid\"},fail:function(e){return\"Role must be one of the valid ARIA roles\"}}},abstractrole:{impact:\"serious\",messages:{pass:function(e){return\"Abstract roles are not used\"},fail:function(e){return\"Abstract roles cannot be directly used\"}}},unsupportedrole:{impact:\"critical\",messages:{pass:function(e){return\"ARIA role is supported\"},fail:function(e){var t=\"The role used is not widely supported in screen readers and assistive technologies: \",r=e.data;if(r)for(var n=-1,a=r.length-1;n<a;)t+=\" \"+r[n+=1];return t}}},\"aria-valid-attr-value\":{impact:\"critical\",messages:{pass:function(e){return\"ARIA attribute values are valid\"},fail:function(e){var t=\"Invalid ARIA attribute value\"+(e.data&&1<e.data.length?\"s\":\"\")+\":\",r=e.data;if(r)for(var n=-1,a=r.length-1;n<a;)t+=\" \"+r[n+=1];return t}}},\"aria-errormessage\":{impact:\"critical\",messages:{pass:function(e){return\"Uses a supported aria-errormessage technique\"},fail:function(e){var t=\"aria-errormessage value\"+(e.data&&1<e.data.length?\"s\":\"\")+\" \",r=e.data;if(r)for(var n=-1,a=r.length-1;n<a;)t+=\" `\"+r[n+=1];return t+=\"` must use a technique to announce the message (e.g., aria-live, aria-describedby, role=alert, etc.)\"}}},\"aria-valid-attr\":{impact:\"critical\",messages:{pass:function(e){return\"ARIA attribute name\"+(e.data&&1<e.data.length?\"s\":\"\")+\" are valid\"},fail:function(e){var t=\"Invalid ARIA attribute name\"+(e.data&&1<e.data.length?\"s\":\"\")+\":\",r=e.data;if(r)for(var n=-1,a=r.length-1;n<a;)t+=\" \"+r[n+=1];return t}}},caption:{impact:\"critical\",messages:{pass:function(e){return\"The multimedia element has a captions track\"},incomplete:function(e){return\"Check that captions is available for the element\"}}},\"autocomplete-valid\":{impact:\"serious\",messages:{pass:function(e){return\"the autocomplete attribute is correctly formatted\"},fail:function(e){return\"the autocomplete attribute is incorrectly formatted\"}}},\"autocomplete-appropriate\":{impact:\"serious\",messages:{pass:function(e){return\"the autocomplete value is on an appropriate element\"},fail:function(e){return\"the autocomplete value is inappropriate for this type of input\"}}},\"is-on-screen\":{impact:\"serious\",messages:{pass:function(e){return\"Element is not visible\"},fail:function(e){return\"Element is visible\"}}},\"non-empty-if-present\":{impact:\"critical\",messages:{pass:function(e){var t=\"Element \";return e.data?t+=\"has a non-empty value attribute\":t+=\"does not have a value attribute\",t},fail:function(e){return\"Element has a value attribute and the value attribute is empty\"}}},\"non-empty-value\":{impact:\"critical\",messages:{pass:function(e){return\"Element has a non-empty value attribute\"},fail:function(e){return\"Element has no value attribute or the value attribute is empty\"}}},\"button-has-visible-text\":{impact:\"critical\",messages:{pass:function(e){return\"Element has inner text that is visible to screen readers\"},fail:function(e){return\"Element does not have inner text that is visible to screen readers\"}}},\"role-presentation\":{impact:\"minor\",messages:{pass:function(e){return'Element\\'s default semantics were overriden with role=\"presentation\"'},fail:function(e){return'Element\\'s default semantics were not overridden with role=\"presentation\"'}}},\"role-none\":{impact:\"minor\",messages:{pass:function(e){return'Element\\'s default semantics were overriden with role=\"none\"'},fail:function(e){return'Element\\'s default semantics were not overridden with role=\"none\"'}}},\"focusable-no-name\":{impact:\"serious\",messages:{pass:function(e){return\"Element is not in tab order or has accessible text\"},fail:function(e){return\"Element is in tab order and does not have accessible text\"}}},\"internal-link-present\":{impact:\"serious\",messages:{pass:function(e){return\"Valid skip link found\"},fail:function(e){return\"No valid skip link found\"}}},\"header-present\":{impact:\"serious\",messages:{pass:function(e){return\"Page has a header\"},fail:function(e){return\"Page does not have a header\"}}},landmark:{impact:\"serious\",messages:{pass:function(e){return\"Page has a landmark region\"},fail:function(e){return\"Page does not have a landmark region\"}}},\"group-labelledby\":{impact:\"critical\",messages:{pass:function(e){return'Elements with the name \"'+e.data.name+'\" have both a shared label, and a unique label, referenced through aria-labelledby'},fail:function(e){var t=\"\",r=e.data&&e.data.failureCode;return t+='Elements with the name \"'+e.data.name+'\" do not all have ',t+=\"no-shared-label\"===r?\"a shared label\":\"no-unique-label\"===r?\"a unique label\":\"both a shared label, and a unique label\",t+=\", referenced through aria-labelledby\"}}},fieldset:{impact:\"critical\",messages:{pass:function(e){return\"Element is contained in a fieldset\"},fail:function(e){var t=\"\",r=e.data&&e.data.failureCode;return t+=\"no-legend\"===r?\"Fieldset does not have a legend as its first child\":\"empty-legend\"===r?\"Legend does not have text that is visible to screen readers\":\"mixed-inputs\"===r?\"Fieldset contains unrelated inputs\":\"no-group-label\"===r?\"ARIA group does not have aria-label or aria-labelledby\":\"group-mixed-inputs\"===r?\"ARIA group contains unrelated inputs\":\"Element does not have a containing fieldset or ARIA group\"}}},\"color-contrast\":{impact:\"serious\",messages:{pass:function(e){return\"Element has sufficient color contrast of \"+e.data.contrastRatio},fail:function(e){return\"Element has insufficient color contrast of \"+e.data.contrastRatio+\" (foreground color: \"+e.data.fgColor+\", background color: \"+e.data.bgColor+\", font size: \"+e.data.fontSize+\", font weight: \"+e.data.fontWeight+\"). Expected contrast ratio of \"+e.data.expectedContrastRatio},incomplete:{bgImage:\"Element's background color could not be determined due to a background image\",bgGradient:\"Element's background color could not be determined due to a background gradient\",imgNode:\"Element's background color could not be determined because element contains an image node\",bgOverlap:\"Element's background color could not be determined because it is overlapped by another element\",fgAlpha:\"Element's foreground color could not be determined because of alpha transparency\",elmPartiallyObscured:\"Element's background color could not be determined because it's partially obscured by another element\",elmPartiallyObscuring:\"Element's background color could not be determined because it partially overlaps other elements\",outsideViewport:\"Element's background color could not be determined because it's outside the viewport\",equalRatio:\"Element has a 1:1 contrast ratio with the background\",shortTextContent:\"Element content is too short to determine if it is actual text content\",default:\"Unable to determine contrast ratio\"}}},\"css-orientation-lock\":{impact:\"serious\",messages:{pass:function(e){return\"Display is operable, and orientation lock does not exist\"},fail:function(e){return\"CSS Orientation lock is applied, and makes display inoperable\"},incomplete:function(e){return\"CSS Orientation lock cannot be determined\"}}},\"structured-dlitems\":{impact:\"serious\",messages:{pass:function(e){return\"When not empty, element has both <dt> and <dd> elements\"},fail:function(e){return\"When not empty, element does not have at least one <dt> element followed by at least one <dd> element\"}}},\"only-dlitems\":{impact:\"serious\",messages:{pass:function(e){return\"List element only has direct children that are allowed inside <dt> or <dd> elements\"},fail:function(e){return\"List element has direct children that are not allowed inside <dt> or <dd> elements\"}}},dlitem:{impact:\"serious\",messages:{pass:function(e){return\"Description list item has a <dl> parent element\"},fail:function(e){return\"Description list item does not have a <dl> parent element\"}}},\"doc-has-title\":{impact:\"serious\",messages:{pass:function(e){return\"Document has a non-empty <title> element\"},fail:function(e){return\"Document does not have a non-empty <title> element\"}}},\"duplicate-id-active\":{impact:\"serious\",messages:{pass:function(e){return\"Document has no active elements that share the same id attribute\"},fail:function(e){return\"Document has active elements with the same id attribute: \"+e.data}}},\"duplicate-id-aria\":{impact:\"critical\",messages:{pass:function(e){return\"Document has no elements referenced with ARIA or labels that share the same id attribute\"},fail:function(e){return\"Document has multiple elements referenced with ARIA with the same id attribute: \"+e.data}}},\"duplicate-id\":{impact:\"minor\",messages:{pass:function(e){return\"Document has no static elements that share the same id attribute\"},fail:function(e){return\"Document has multiple static elements with the same id attribute\"}}},\"has-visible-text\":{impact:\"minor\",messages:{pass:function(e){return\"Element has text that is visible to screen readers\"},fail:function(e){return\"Element does not have text that is visible to screen readers\"}}},\"has-widget-role\":{impact:\"minor\",messages:{pass:function(e){return\"Element has a widget role.\"},fail:function(e){return\"Element does not have a widget role.\"}}},\"valid-scrollable-semantics\":{impact:\"minor\",messages:{pass:function(e){return\"Element has valid semantics for an element in the focus order.\"},fail:function(e){return\"Element has invalid semantics for an element in the focus order.\"}}},\"multiple-label\":{impact:\"moderate\",messages:{pass:function(e){return\"Form field does not have multiple label elements\"},fail:function(e){return\"Multiple label elements is not widely supported in assistive technologies\"}}},\"frame-tested\":{impact:\"critical\",messages:{pass:function(e){return\"The iframe was tested with axe-core\"},fail:function(e){return\"The iframe could not be tested with axe-core\"},incomplete:function(e){return\"The iframe still has to be tested with axe-core\"}}},\"unique-frame-title\":{impact:\"serious\",messages:{pass:function(e){return\"Element's title attribute is unique\"},fail:function(e){return\"Element's title attribute is not unique\"}}},\"heading-order\":{impact:\"moderate\",messages:{pass:function(e){return\"Heading order valid\"},fail:function(e){return\"Heading order invalid\"}}},\"hidden-content\":{impact:\"minor\",messages:{pass:function(e){return\"All content on the page has been analyzed.\"},fail:function(e){return\"There were problems analyzing the content on this page.\"},incomplete:function(e){return\"There is hidden content on the page that was not analyzed. You will need to trigger the display of this content in order to analyze it.\"}}},\"has-lang\":{impact:\"serious\",messages:{pass:function(e){return\"The <html> element has a lang attribute\"},fail:function(e){return\"The <html> element does not have a lang attribute\"}}},\"valid-lang\":{impact:\"serious\",messages:{pass:function(e){return\"Value of lang attribute is included in the list of valid languages\"},fail:function(e){return\"Value of lang attribute not included in the list of valid languages\"}}},\"xml-lang-mismatch\":{impact:\"moderate\",messages:{pass:function(e){return\"Lang and xml:lang attributes have the same base language\"},fail:function(e){return\"Lang and xml:lang attributes do not have the same base language\"}}},\"has-alt\":{impact:\"critical\",messages:{pass:function(e){return\"Element has an alt attribute\"},fail:function(e){return\"Element does not have an alt attribute\"}}},\"alt-space-value\":{impact:\"critical\",messages:{pass:function(e){return\"Element has a valid alt attribute value\"},fail:function(e){return\"Element has an alt attribute containing only a space character, which is not ignored by all screen readers\"}}},\"duplicate-img-label\":{impact:\"minor\",messages:{pass:function(e){return\"Element does not duplicate existing text in <img> alt text\"},fail:function(e){return\"Element contains <img> element with alt text that duplicates existing text\"}}},\"label-content-name-mismatch\":{impact:\"serious\",messages:{pass:function(e){return\"Element contains visible text as part of it's accessible name\"},fail:function(e){return\"Text inside the element is not included in the accessible name\"}}},\"title-only\":{impact:\"serious\",messages:{pass:function(e){return\"Form element does not solely use title attribute for its label\"},fail:function(e){return\"Only title used to generate label for form element\"}}},\"implicit-label\":{impact:\"critical\",messages:{pass:function(e){return\"Form element has an implicit (wrapped) <label>\"},fail:function(e){return\"Form element does not have an implicit (wrapped) <label>\"}}},\"explicit-label\":{impact:\"critical\",messages:{pass:function(e){return\"Form element has an explicit <label>\"},fail:function(e){return\"Form element does not have an explicit <label>\"}}},\"help-same-as-label\":{impact:\"minor\",messages:{pass:function(e){return\"Help text (title or aria-describedby) does not duplicate label text\"},fail:function(e){return\"Help text (title or aria-describedby) text is the same as the label text\"}}},\"hidden-explicit-label\":{impact:\"critical\",messages:{pass:function(e){return\"Form element has a visible explicit <label>\"},fail:function(e){return\"Form element has explicit <label> that is hidden\"}}},\"landmark-is-top-level\":{impact:\"moderate\",messages:{pass:function(e){return\"The \"+e.data.role+\" landmark is at the top level.\"},fail:function(e){return\"The \"+e.data.role+\" landmark is contained in another landmark.\"}}},\"page-no-duplicate-banner\":{impact:\"moderate\",messages:{pass:function(e){return\"Document does not have more than one banner landmark\"},fail:function(e){return\"Document has more than one banner landmark\"}}},\"page-no-duplicate-contentinfo\":{impact:\"moderate\",messages:{pass:function(e){return\"Document does not have more than one contentinfo landmark\"},fail:function(e){return\"Document has more than one contentinfo landmark\"}}},\"page-has-main\":{impact:\"moderate\",messages:{pass:function(e){return\"Document has at least one main landmark\"},fail:function(e){return\"Document does not have a main landmark\"}}},\"page-no-duplicate-main\":{impact:\"moderate\",messages:{pass:function(e){return\"Document does not have more than one main landmark\"},fail:function(e){return\"Document has more than one main landmark\"}}},\"has-th\":{impact:\"serious\",messages:{pass:function(e){return\"Layout table does not use <th> elements\"},fail:function(e){return\"Layout table uses <th> elements\"}}},\"has-caption\":{impact:\"serious\",messages:{pass:function(e){return\"Layout table does not use <caption> element\"},fail:function(e){return\"Layout table uses <caption> element\"}}},\"has-summary\":{impact:\"serious\",messages:{pass:function(e){return\"Layout table does not use summary attribute\"},fail:function(e){return\"Layout table uses summary attribute\"}}},\"link-in-text-block\":{impact:\"serious\",messages:{pass:function(e){return\"Links can be distinguished from surrounding text in some way other than by color\"},fail:function(e){return\"Links need to be distinguished from surrounding text in some way other than by color\"},incomplete:{bgContrast:\"Element's contrast ratio could not be determined. Check for a distinct hover/focus style\",bgImage:\"Element's contrast ratio could not be determined due to a background image\",bgGradient:\"Element's contrast ratio could not be determined due to a background gradient\",imgNode:\"Element's contrast ratio could not be determined because element contains an image node\",bgOverlap:\"Element's contrast ratio could not be determined because of element overlap\",default:\"Unable to determine contrast ratio\"}}},\"only-listitems\":{impact:\"serious\",messages:{pass:function(e){return\"List element only has direct children that are allowed inside <li> elements\"},fail:function(e){return\"List element has direct children that are not allowed inside <li> elements\"}}},listitem:{impact:\"serious\",messages:{pass:function(e){return'List item has a <ul>, <ol> or role=\"list\" parent element'},fail:function(e){return'List item does not have a <ul>, <ol> or role=\"list\" parent element'}}},\"meta-refresh\":{impact:\"critical\",messages:{pass:function(e){return\"<meta> tag does not immediately refresh the page\"},fail:function(e){return\"<meta> tag forces timed refresh of page\"}}},\"meta-viewport-large\":{impact:\"minor\",messages:{pass:function(e){return\"<meta> tag does not prevent significant zooming on mobile devices\"},fail:function(e){return\"<meta> tag limits zooming on mobile devices\"}}},\"meta-viewport\":{impact:\"critical\",messages:{pass:function(e){return\"<meta> tag does not disable zooming on mobile devices\"},fail:function(e){return e.data+\" on <meta> tag disables zooming on mobile devices\"}}},\"p-as-heading\":{impact:\"serious\",messages:{pass:function(e){return\"<p> elements are not styled as headings\"},fail:function(e){return\"Heading elements should be used instead of styled p elements\"}}},\"page-has-heading-one\":{impact:\"moderate\",messages:{pass:function(e){return\"Page has at least one level-one heading\"},fail:function(e){return\"Page must have a level-one heading\"}}},region:{impact:\"moderate\",messages:{pass:function(e){return\"All page content is contained by landmarks\"},fail:function(e){return\"Some page content is not contained by landmarks\"}}},\"html5-scope\":{impact:\"moderate\",messages:{pass:function(e){return\"Scope attribute is only used on table header elements (<th>)\"},fail:function(e){return\"In HTML 5, scope attributes may only be used on table header elements (<th>)\"}}},\"scope-value\":{impact:\"critical\",messages:{pass:function(e){return\"Scope attribute is used correctly\"},fail:function(e){return\"The value of the scope attribute may only be 'row' or 'col'\"}}},exists:{impact:\"minor\",messages:{pass:function(e){return\"Element does not exist\"},fail:function(e){return\"Element exists\"}}},\"skip-link\":{impact:\"moderate\",messages:{pass:function(e){return\"Skip link target exists\"},incomplete:function(e){return\"Skip link target should become visible on activation\"},fail:function(e){return\"No skip link target\"}}},tabindex:{impact:\"serious\",messages:{pass:function(e){return\"Element does not have a tabindex greater than 0\"},fail:function(e){return\"Element has a tabindex greater than 0\"}}},\"same-caption-summary\":{impact:\"minor\",messages:{pass:function(e){return\"Content of summary attribute and <caption> are not duplicated\"},fail:function(e){return\"Content of summary attribute and <caption> element are identical\"}}},\"caption-faked\":{impact:\"serious\",messages:{pass:function(e){return\"The first row of a table is not used as a caption\"},fail:function(e){return\"The first row of the table should be a caption instead of a table cell\"}}},\"td-has-header\":{impact:\"critical\",messages:{pass:function(e){return\"All non-empty data cells have table headers\"},fail:function(e){return\"Some non-empty data cells do not have table headers\"}}},\"td-headers-attr\":{impact:\"serious\",messages:{pass:function(e){return\"The headers attribute is exclusively used to refer to other cells in the table\"},fail:function(e){return\"The headers attribute is not exclusively used to refer to other cells in the table\"}}},\"th-has-data-cells\":{impact:\"serious\",messages:{pass:function(e){return\"All table header cells refer to data cells\"},fail:function(e){return\"Not all table header cells refer to data cells\"},incomplete:function(e){return\"Table data cells are missing or empty\"}}},description:{impact:\"critical\",messages:{pass:function(e){return\"The multimedia element has an audio description track\"},incomplete:function(e){return\"Check that audio description is available for the element\"}}}},failureSummaries:{any:{failureMessage:function(e){var t=\"Fix any of the following:\",r=e;if(r)for(var n=-1,a=r.length-1;n<a;)t+=\"\\n \"+r[n+=1].split(\"\\n\").join(\"\\n \");return t}},none:{failureMessage:function(e){var t=\"Fix all of the following:\",r=e;if(r)for(var n=-1,a=r.length-1;n<a;)t+=\"\\n \"+r[n+=1].split(\"\\n\").join(\"\\n \");return t}}},incompleteFallbackMessage:function(e){return\"aXe couldn't tell the reason. Time to break out the element inspector!\"}},rules:[{id:\"accesskeys\",selector:\"[accesskey]\",excludeHidden:!1,tags:[\"best-practice\",\"cat.keyboard\"],all:[],any:[],none:[\"accesskeys\"]},{id:\"area-alt\",selector:\"map area[href]\",excludeHidden:!1,tags:[\"cat.text-alternatives\",\"wcag2a\",\"wcag111\",\"section508\",\"section508.22.a\"],all:[],any:[\"non-empty-alt\",\"non-empty-title\",\"aria-label\",\"aria-labelledby\"],none:[]},{id:\"aria-allowed-attr\",matches:function(e,t,r){var n=/^aria-/;if(e.hasAttributes())for(var a=e.attributes,o=0,i=a.length;o<i;o++)if(n.test(a[o].name))return!0;return!1},tags:[\"cat.aria\",\"wcag2a\",\"wcag412\"],all:[],any:[\"aria-allowed-attr\"],none:[\"aria-unsupported-attr\"]},{id:\"aria-allowed-role\",excludeHidden:!1,selector:\"[role]\",matches:function(e,t,r){return null!==axe.commons.aria.getRole(e,{noImplicit:!0,dpub:!0,fallback:!0})},tags:[\"cat.aria\",\"best-practice\"],all:[],any:[{options:{allowImplicit:!0,ignoredTags:[]},id:\"aria-allowed-role\"}],none:[]},{id:\"aria-dpub-role-fallback\",selector:\"[role]\",matches:function(e,t,r){var n=e.getAttribute(\"role\");return[\"doc-backlink\",\"doc-biblioentry\",\"doc-biblioref\",\"doc-cover\",\"doc-endnote\",\"doc-glossref\",\"doc-noteref\"].includes(n)},tags:[\"cat.aria\",\"wcag2a\",\"wcag131\"],all:[\"implicit-role-fallback\"],any:[],none:[]},{id:\"aria-hidden-body\",selector:\"body\",excludeHidden:!1,tags:[\"cat.aria\",\"wcag2a\",\"wcag412\"],all:[],any:[\"aria-hidden-body\"],none:[]},{id:\"aria-hidden-focus\",selector:'[aria-hidden=\"true\"]',matches:function(e,t,r){var n=axe.commons.dom.getComposedParent;return function e(t){return!t||\"true\"!==t.getAttribute(\"aria-hidden\")&&e(n(t))}(n(e))},excludeHidden:!1,tags:[\"cat.name-role-value\",\"wcag2a\",\"wcag412\"],all:[\"focusable-disabled\",\"focusable-not-tabbable\"],any:[],none:[]},{id:\"aria-required-attr\",selector:\"[role]\",tags:[\"cat.aria\",\"wcag2a\",\"wcag412\"],all:[],any:[\"aria-required-attr\"],none:[]},{id:\"aria-required-children\",selector:\"[role]\",tags:[\"cat.aria\",\"wcag2a\",\"wcag131\"],all:[],any:[{options:{reviewEmpty:[\"listbox\"]},id:\"aria-required-children\"}],none:[]},{id:\"aria-required-parent\",selector:\"[role]\",tags:[\"cat.aria\",\"wcag2a\",\"wcag131\"],all:[],any:[\"aria-required-parent\"],none:[]},{id:\"aria-roles\",selector:\"[role]\",tags:[\"cat.aria\",\"wcag2a\",\"wcag412\"],all:[],any:[],none:[\"invalidrole\",\"abstractrole\",\"unsupportedrole\"]},{id:\"aria-valid-attr-value\",matches:function(e,t,r){var n=/^aria-/;if(e.hasAttributes())for(var a=e.attributes,o=0,i=a.length;o<i;o++)if(n.test(a[o].name))return!0;return!1},tags:[\"cat.aria\",\"wcag2a\",\"wcag412\"],all:[{options:[],id:\"aria-valid-attr-value\"},\"aria-errormessage\"],any:[],none:[]},{id:\"aria-valid-attr\",matches:function(e,t,r){var n=/^aria-/;if(e.hasAttributes())for(var a=e.attributes,o=0,i=a.length;o<i;o++)if(n.test(a[o].name))return!0;return!1},tags:[\"cat.aria\",\"wcag2a\",\"wcag412\"],all:[],any:[{options:[],id:\"aria-valid-attr\"}],none:[]},{id:\"audio-caption\",selector:\"audio\",enabled:!1,excludeHidden:!1,tags:[\"cat.time-and-media\",\"wcag2a\",\"wcag121\",\"section508\",\"section508.22.a\"],all:[],any:[],none:[\"caption\"]},{id:\"autocomplete-valid\",matches:function(e,t,r){var n=axe.commons,a=n.text,o=n.aria,i=n.dom,u=e.getAttribute(\"autocomplete\");if(!u||\"\"===a.sanitize(u))return!1;var s=e.nodeName.toUpperCase();if(!1===[\"TEXTAREA\",\"INPUT\",\"SELECT\"].includes(s))return!1;if(\"INPUT\"===s&&[\"submit\",\"reset\",\"button\",\"hidden\"].includes(e.type))return!1;var l=e.getAttribute(\"aria-disabled\")||\"false\";if(e.disabled||\"true\"===l.toLowerCase())return!1;var c=e.getAttribute(\"role\"),d=e.getAttribute(\"tabindex\");if(\"-1\"===d&&c){var m=o.lookupTable.role[c];if(void 0===m||\"widget\"!==m.type)return!1}return!(\"-1\"===d&&!i.isVisible(e,!1)&&!i.isVisible(e,!0))},tags:[\"cat.forms\",\"wcag21aa\",\"wcag135\"],all:[\"autocomplete-valid\",\"autocomplete-appropriate\"],any:[],none:[]},{id:\"blink\",selector:\"blink\",excludeHidden:!1,tags:[\"cat.time-and-media\",\"wcag2a\",\"wcag222\",\"section508\",\"section508.22.j\"],all:[],any:[],none:[\"is-on-screen\"]},{id:\"button-name\",selector:'button, [role=\"button\"], input[type=\"button\"], input[type=\"submit\"], input[type=\"reset\"]',tags:[\"cat.name-role-value\",\"wcag2a\",\"wcag412\",\"section508\",\"section508.22.a\"],all:[],any:[\"non-empty-if-present\",\"non-empty-value\",\"button-has-visible-text\",\"aria-label\",\"aria-labelledby\",\"role-presentation\",\"role-none\",\"non-empty-title\"],none:[\"focusable-no-name\"]},{id:\"bypass\",selector:\"html\",pageLevel:!0,matches:function(e,t,r){return!!e.querySelector(\"a[href]\")},tags:[\"cat.keyboard\",\"wcag2a\",\"wcag241\",\"section508\",\"section508.22.o\"],all:[],any:[\"internal-link-present\",\"header-present\",\"landmark\"],none:[]},{id:\"checkboxgroup\",selector:\"input[type=checkbox][name]\",tags:[\"cat.forms\",\"best-practice\"],all:[],any:[\"group-labelledby\",\"fieldset\"],none:[]},{id:\"color-contrast\",matches:function(e,t,r){var n=e.nodeName.toUpperCase(),a=e.type;if(\"true\"===e.getAttribute(\"aria-disabled\")||axe.commons.dom.findUpVirtual(t,'[aria-disabled=\"true\"]'))return!1;if(\"INPUT\"===n)return-1===[\"hidden\",\"range\",\"color\",\"checkbox\",\"radio\",\"image\"].indexOf(a)&&!e.disabled;if(\"SELECT\"===n)return!!e.options.length&&!e.disabled;if(\"TEXTAREA\"===n)return!e.disabled;if(\"OPTION\"===n)return!1;if(\"BUTTON\"===n&&e.disabled||axe.commons.dom.findUpVirtual(t,\"button[disabled]\"))return!1;if(\"FIELDSET\"===n&&e.disabled||axe.commons.dom.findUpVirtual(t,\"fieldset[disabled]\"))return!1;var o=axe.commons.dom.findUpVirtual(t,\"label\");if(\"LABEL\"===n||o){var i=e,u=t;o&&(i=o,u=axe.utils.getNodeFromTree(axe._tree[0],o));var s=axe.commons.dom.getRootNode(i);if((l=i.htmlFor&&s.getElementById(i.htmlFor))&&l.disabled)return!1;if((l=axe.utils.querySelectorAll(u,'input:not([type=\"hidden\"]):not([type=\"image\"]):not([type=\"button\"]):not([type=\"submit\"]):not([type=\"reset\"]), select, textarea')).length&&l[0].actualNode.disabled)return!1}if(e.getAttribute(\"id\")){var l,c=axe.utils.escapeSelector(e.getAttribute(\"id\"));if((l=axe.commons.dom.getRootNode(e).querySelector(\"[aria-labelledby~=\"+c+\"]\"))&&l.disabled)return!1}if(\"\"===axe.commons.text.visibleVirtual(t,!1,!0))return!1;var d,m,p=document.createRange(),f=t.children,h=f.length;for(m=0;m<h;m++)3===(d=f[m]).actualNode.nodeType&&\"\"!==axe.commons.text.sanitize(d.actualNode.nodeValue)&&p.selectNodeContents(d.actualNode);var b=p.getClientRects();for(h=b.length,m=0;m<h;m++)if(axe.commons.dom.visuallyOverlaps(b[m],e))return!0;return!1},excludeHidden:!1,options:{noScroll:!1},tags:[\"cat.color\",\"wcag2aa\",\"wcag143\"],all:[],any:[\"color-contrast\"],none:[]},{id:\"css-orientation-lock\",selector:\"html\",tags:[\"cat.structure\",\"wcag134\",\"wcag21aa\",\"experimental\"],all:[\"css-orientation-lock\"],any:[],none:[],preload:!0},{id:\"definition-list\",selector:\"dl\",matches:function(e,t,r){return!e.getAttribute(\"role\")},tags:[\"cat.structure\",\"wcag2a\",\"wcag131\"],all:[],any:[],none:[\"structured-dlitems\",\"only-dlitems\"]},{id:\"dlitem\",selector:\"dd, dt\",matches:function(e,t,r){return!e.getAttribute(\"role\")},tags:[\"cat.structure\",\"wcag2a\",\"wcag131\"],all:[],any:[\"dlitem\"],none:[]},{id:\"document-title\",selector:\"html\",matches:function(e,t,r){return e.ownerDocument.defaultView.self===e.ownerDocument.defaultView.top},tags:[\"cat.text-alternatives\",\"wcag2a\",\"wcag242\"],all:[],any:[\"doc-has-title\"],none:[]},{id:\"duplicate-id-active\",selector:\"[id]\",matches:function(e,t,r){var n=axe.commons,a=n.dom,o=n.aria,i=e.getAttribute(\"id\").trim(),u='*[id=\"'+axe.utils.escapeSelector(i)+'\"]';return Array.from(a.getRootNode(e).querySelectorAll(u)).some(a.isFocusable)&&!o.isAccessibleRef(e)},excludeHidden:!1,tags:[\"cat.parsing\",\"wcag2a\",\"wcag411\"],all:[],any:[\"duplicate-id-active\"],none:[]},{id:\"duplicate-id-aria\",selector:\"[id]\",matches:function(e,t,r){return axe.commons.aria.isAccessibleRef(e)},excludeHidden:!1,tags:[\"cat.parsing\",\"wcag2a\",\"wcag411\"],all:[],any:[\"duplicate-id-aria\"],none:[]},{id:\"duplicate-id\",selector:\"[id]\",matches:function(e,t,r){var n=axe.commons,a=n.dom,o=n.aria,i=e.getAttribute(\"id\").trim(),u='*[id=\"'+axe.utils.escapeSelector(i)+'\"]';return Array.from(a.getRootNode(e).querySelectorAll(u)).every(function(e){return!a.isFocusable(e)})&&!o.isAccessibleRef(e)},excludeHidden:!1,tags:[\"cat.parsing\",\"wcag2a\",\"wcag411\"],all:[],any:[\"duplicate-id\"],none:[]},{id:\"empty-heading\",selector:'h1, h2, h3, h4, h5, h6, [role=\"heading\"]',matches:function(e,t,r){var n=void 0;return e.hasAttribute(\"role\")&&(n=e.getAttribute(\"role\").split(/\\s+/i).filter(axe.commons.aria.isValidRole)),n&&0<n.length?n.includes(\"heading\"):\"heading\"===axe.commons.aria.implicitRole(e)},tags:[\"cat.name-role-value\",\"best-practice\"],all:[],any:[\"has-visible-text\"],none:[]},{id:\"focus-order-semantics\",selector:\"div, h1, h2, h3, h4, h5, h6, [role=heading], p, span\",matches:function(e,t,r){return axe.commons.dom.insertedIntoFocusOrder(e)},tags:[\"cat.keyboard\",\"best-practice\",\"experimental\"],all:[],any:[{options:[],id:\"has-widget-role\"},{options:[],id:\"valid-scrollable-semantics\"}],none:[]},{id:\"form-field-multiple-labels\",selector:\"input, select, textarea\",matches:function(e,t,r){if(\"input\"!==e.nodeName.toLowerCase()||!1===e.hasAttribute(\"type\"))return!0;var n=e.getAttribute(\"type\").toLowerCase();return!1===[\"hidden\",\"image\",\"button\",\"submit\",\"reset\"].includes(n)},tags:[\"cat.forms\",\"wcag2a\",\"wcag332\"],all:[],any:[],none:[\"multiple-label\"]},{id:\"frame-tested\",selector:\"frame, iframe\",tags:[\"cat.structure\",\"review-item\",\"best-practice\"],all:[{options:{isViolation:!1},id:\"frame-tested\"}],any:[],none:[]},{id:\"frame-title-unique\",selector:\"frame[title], iframe[title]\",matches:function(e,t,r){var n=e.getAttribute(\"title\");return!(!n||!axe.commons.text.sanitize(n).trim())},tags:[\"cat.text-alternatives\",\"best-practice\"],all:[],any:[],none:[\"unique-frame-title\"]},{id:\"frame-title\",selector:\"frame, iframe\",tags:[\"cat.text-alternatives\",\"wcag2a\",\"wcag241\",\"wcag412\",\"section508\",\"section508.22.i\"],all:[],any:[\"aria-label\",\"aria-labelledby\",\"non-empty-title\",\"role-presentation\",\"role-none\"],none:[]},{id:\"heading-order\",selector:\"h1, h2, h3, h4, h5, h6, [role=heading]\",matches:function(e,t,r){var n=void 0;return e.hasAttribute(\"role\")&&(n=e.getAttribute(\"role\").split(/\\s+/i).filter(axe.commons.aria.isValidRole)),n&&0<n.length?n.includes(\"heading\"):\"heading\"===axe.commons.aria.implicitRole(e)},tags:[\"cat.semantics\",\"best-practice\"],all:[],any:[\"heading-order\"],none:[]},{id:\"hidden-content\",selector:\"*\",excludeHidden:!1,tags:[\"cat.structure\",\"experimental\",\"review-item\",\"best-practice\"],all:[],any:[\"hidden-content\"],none:[]},{id:\"html-has-lang\",selector:\"html\",tags:[\"cat.language\",\"wcag2a\",\"wcag311\"],all:[],any:[\"has-lang\"],none:[]},{id:\"html-lang-valid\",selector:\"html[lang], html[xml\\\\:lang]\",tags:[\"cat.language\",\"wcag2a\",\"wcag311\"],all:[],any:[],none:[\"valid-lang\"]},{id:\"html-xml-lang-mismatch\",selector:\"html[lang][xml\\\\:lang]\",matches:function(e,t,r){var n=axe.utils.getBaseLang,a=n(e.getAttribute(\"lang\")),o=n(e.getAttribute(\"xml:lang\"));return axe.utils.validLangs().includes(a)&&axe.utils.validLangs().includes(o)},tags:[\"cat.language\",\"wcag2a\",\"wcag311\"],all:[\"xml-lang-mismatch\"],any:[],none:[]},{id:\"image-alt\",selector:\"img, [role='img']:not(svg)\",tags:[\"cat.text-alternatives\",\"wcag2a\",\"wcag111\",\"section508\",\"section508.22.a\"],all:[],any:[\"has-alt\",\"aria-label\",\"aria-labelledby\",\"non-empty-title\",\"role-presentation\",\"role-none\"],none:[\"alt-space-value\"]},{id:\"image-redundant-alt\",selector:'button, [role=\"button\"], a[href], p, li, td, th',tags:[\"cat.text-alternatives\",\"best-practice\"],all:[],any:[],none:[\"duplicate-img-label\"]},{id:\"input-image-alt\",selector:'input[type=\"image\"]',tags:[\"cat.text-alternatives\",\"wcag2a\",\"wcag111\",\"section508\",\"section508.22.a\"],all:[],any:[\"non-empty-alt\",\"aria-label\",\"aria-labelledby\",\"non-empty-title\"],none:[]},{id:\"label-content-name-mismatch\",matches:function(e,t,r){var n=axe.commons,a=n.aria,o=n.text,i=a.getRole(e);return!!i&&(!!a.lookupTable.rolesOfType.widget.includes(i)&&(!!a.getRolesWithNameFromContents().includes(i)&&(!(!o.sanitize(a.arialabelText(e))&&!o.sanitize(a.arialabelledbyText(e)))&&!!o.sanitize(o.visibleVirtual(t)))))},tags:[\"wcag21a\",\"wcag253\",\"experimental\"],all:[],any:[\"label-content-name-mismatch\"],none:[]},{id:\"label-title-only\",selector:\"input, select, textarea\",matches:function(e,t,r){if(\"input\"!==e.nodeName.toLowerCase()||!1===e.hasAttribute(\"type\"))return!0;var n=e.getAttribute(\"type\").toLowerCase();return!1===[\"hidden\",\"image\",\"button\",\"submit\",\"reset\"].includes(n)},tags:[\"cat.forms\",\"best-practice\"],all:[],any:[],none:[\"title-only\"]},{id:\"label\",selector:\"input, select, textarea\",matches:function(e,t,r){if(\"input\"!==e.nodeName.toLowerCase()||!1===e.hasAttribute(\"type\"))return!0;var n=e.getAttribute(\"type\").toLowerCase();return!1===[\"hidden\",\"image\",\"button\",\"submit\",\"reset\"].includes(n)},tags:[\"cat.forms\",\"wcag2a\",\"wcag332\",\"wcag131\",\"section508\",\"section508.22.n\"],all:[],any:[\"aria-label\",\"aria-labelledby\",\"implicit-label\",\"explicit-label\",\"non-empty-title\"],none:[\"help-same-as-label\",\"hidden-explicit-label\"]},{id:\"landmark-banner-is-top-level\",selector:\"header:not([role]), [role=banner]\",matches:function(e,t,r){return e.hasAttribute(\"role\")||!axe.commons.dom.findUpVirtual(t,\"article, aside, main, nav, section\")},tags:[\"cat.semantics\",\"best-practice\"],all:[],any:[\"landmark-is-top-level\"],none:[]},{id:\"landmark-complementary-is-top-level\",selector:\"aside:not([role]), [role=complementary]\",tags:[\"cat.semantics\",\"best-practice\"],all:[],any:[\"landmark-is-top-level\"],none:[]},{id:\"landmark-contentinfo-is-top-level\",selector:\"footer:not([role]), [role=contentinfo]\",matches:function(e,t,r){return e.hasAttribute(\"role\")||!axe.commons.dom.findUpVirtual(t,\"article, aside, main, nav, section\")},tags:[\"cat.semantics\",\"best-practice\"],all:[],any:[\"landmark-is-top-level\"],none:[]},{id:\"landmark-main-is-top-level\",selector:\"main:not([role]), [role=main]\",tags:[\"cat.semantics\",\"best-practice\"],all:[],any:[\"landmark-is-top-level\"],none:[]},{id:\"landmark-no-duplicate-banner\",selector:\"html\",tags:[\"cat.semantics\",\"best-practice\"],all:[],any:[{options:{selector:\"header:not([role]), [role=banner]\",nativeScopeFilter:\"article, aside, main, nav, section\"},id:\"page-no-duplicate-banner\"}],none:[]},{id:\"landmark-no-duplicate-contentinfo\",selector:\"html\",tags:[\"cat.semantics\",\"best-practice\"],all:[],any:[{options:{selector:\"footer:not([role]), [role=contentinfo]\",nativeScopeFilter:\"article, aside, main, nav, section\"},id:\"page-no-duplicate-contentinfo\"}],none:[]},{id:\"landmark-one-main\",selector:\"html\",tags:[\"cat.semantics\",\"best-practice\"],all:[{options:{selector:\"main:not([role]), [role='main']\"},id:\"page-has-main\"},{options:{selector:\"main:not([role]), [role='main']\"},id:\"page-no-duplicate-main\"}],any:[],none:[]},{id:\"layout-table\",selector:\"table\",matches:function(e,t,r){var n=(e.getAttribute(\"role\")||\"\").toLowerCase();return!((\"presentation\"===n||\"none\"===n)&&!axe.commons.dom.isFocusable(e)||axe.commons.table.isDataTable(e))},tags:[\"cat.semantics\",\"wcag2a\",\"wcag131\"],all:[],any:[],none:[\"has-th\",\"has-caption\",\"has-summary\"]},{id:\"link-in-text-block\",selector:\"a[href], [role=link]\",matches:function(e,t,r){var n=axe.commons.text.sanitize(e.textContent),a=e.getAttribute(\"role\");return(!a||\"link\"===a)&&(!!n&&(!!axe.commons.dom.isVisible(e,!1)&&axe.commons.dom.isInTextBlock(e)))},excludeHidden:!1,tags:[\"cat.color\",\"experimental\",\"wcag2a\",\"wcag141\"],all:[\"link-in-text-block\"],any:[],none:[]},{id:\"link-name\",selector:\"a[href], [role=link][href]\",matches:function(e,t,r){return\"button\"!==e.getAttribute(\"role\")},tags:[\"cat.name-role-value\",\"wcag2a\",\"wcag412\",\"wcag244\",\"section508\",\"section508.22.a\"],all:[],any:[\"has-visible-text\",\"aria-label\",\"aria-labelledby\",\"role-presentation\",\"role-none\"],none:[\"focusable-no-name\"]},{id:\"list\",selector:\"ul, ol\",matches:function(e,t,r){return!e.getAttribute(\"role\")},tags:[\"cat.structure\",\"wcag2a\",\"wcag131\"],all:[],any:[],none:[\"only-listitems\"]},{id:\"listitem\",selector:\"li\",matches:function(e,t,r){return!e.getAttribute(\"role\")},tags:[\"cat.structure\",\"wcag2a\",\"wcag131\"],all:[],any:[\"listitem\"],none:[]},{id:\"marquee\",selector:\"marquee\",excludeHidden:!1,tags:[\"cat.parsing\",\"wcag2a\",\"wcag222\"],all:[],any:[],none:[\"is-on-screen\"]},{id:\"meta-refresh\",selector:'meta[http-equiv=\"refresh\"]',excludeHidden:!1,tags:[\"cat.time\",\"wcag2a\",\"wcag2aaa\",\"wcag221\",\"wcag224\",\"wcag325\"],all:[],any:[\"meta-refresh\"],none:[]},{id:\"meta-viewport-large\",selector:'meta[name=\"viewport\"]',excludeHidden:!1,tags:[\"cat.sensory-and-visual-cues\",\"best-practice\"],all:[],any:[{options:{scaleMinimum:5,lowerBound:2},id:\"meta-viewport-large\"}],none:[]},{id:\"meta-viewport\",selector:'meta[name=\"viewport\"]',excludeHidden:!1,tags:[\"cat.sensory-and-visual-cues\",\"wcag2aa\",\"wcag144\"],all:[],any:[{options:{scaleMinimum:2},id:\"meta-viewport\"}],none:[]},{id:\"object-alt\",selector:\"object\",tags:[\"cat.text-alternatives\",\"wcag2a\",\"wcag111\",\"section508\",\"section508.22.a\"],all:[],any:[\"has-visible-text\",\"aria-label\",\"aria-labelledby\",\"non-empty-title\",\"role-presentation\",\"role-none\"],none:[]},{id:\"p-as-heading\",selector:\"p\",matches:function(e,t,r){var n=Array.from(e.parentNode.childNodes),a=e.textContent.trim();return!(0===a.length||2<=(a.match(/[.!?:;](?![.!?:;])/g)||[]).length)&&0!==n.slice(n.indexOf(e)+1).filter(function(e){return\"P\"===e.nodeName.toUpperCase()&&\"\"!==e.textContent.trim()}).length},tags:[\"cat.semantics\",\"wcag2a\",\"wcag131\",\"experimental\"],all:[{options:{margins:[{weight:150,italic:!0},{weight:150,size:1.15},{italic:!0,size:1.15},{size:1.4}]},id:\"p-as-heading\"}],any:[],none:[]},{id:\"page-has-heading-one\",selector:\"html\",tags:[\"cat.semantics\",\"best-practice\"],all:[{options:{selector:'h1:not([role]), [role=\"heading\"][aria-level=\"1\"]'},id:\"page-has-heading-one\"}],any:[],none:[]},{id:\"radiogroup\",selector:\"input[type=radio][name]\",tags:[\"cat.forms\",\"best-practice\"],all:[],any:[\"group-labelledby\",\"fieldset\"],none:[]},{id:\"region\",selector:\"html\",pageLevel:!0,tags:[\"cat.keyboard\",\"best-practice\"],all:[],any:[\"region\"],none:[]},{id:\"scope-attr-valid\",selector:\"td[scope], th[scope]\",tags:[\"cat.tables\",\"best-practice\"],all:[\"html5-scope\",\"scope-value\"],any:[],none:[]},{id:\"server-side-image-map\",selector:\"img[ismap]\",tags:[\"cat.text-alternatives\",\"wcag2a\",\"wcag211\",\"section508\",\"section508.22.f\"],all:[],any:[],none:[\"exists\"]},{id:\"skip-link\",selector:\"a[href]\",matches:function(e,t,r){return/^#[^/!]/.test(e.getAttribute(\"href\"))},tags:[\"cat.keyboard\",\"best-practice\"],all:[],any:[\"skip-link\"],none:[]},{id:\"tabindex\",selector:\"[tabindex]\",tags:[\"cat.keyboard\",\"best-practice\"],all:[],any:[\"tabindex\"],none:[]},{id:\"table-duplicate-name\",selector:\"table\",tags:[\"cat.tables\",\"best-practice\"],all:[],any:[],none:[\"same-caption-summary\"]},{id:\"table-fake-caption\",selector:\"table\",matches:function(e,t,r){return axe.commons.table.isDataTable(e)},tags:[\"cat.tables\",\"experimental\",\"wcag2a\",\"wcag131\",\"section508\",\"section508.22.g\"],all:[\"caption-faked\"],any:[],none:[]},{id:\"td-has-header\",selector:\"table\",matches:function(e,t,r){if(axe.commons.table.isDataTable(e)){var n=axe.commons.table.toArray(e);return 3<=n.length&&3<=n[0].length&&3<=n[1].length&&3<=n[2].length}return!1},tags:[\"cat.tables\",\"experimental\",\"wcag2a\",\"wcag131\",\"section508\",\"section508.22.g\"],all:[\"td-has-header\"],any:[],none:[]},{id:\"td-headers-attr\",selector:\"table\",tags:[\"cat.tables\",\"wcag2a\",\"wcag131\",\"section508\",\"section508.22.g\"],all:[\"td-headers-attr\"],any:[],none:[]},{id:\"th-has-data-cells\",selector:\"table\",matches:function(e,t,r){return axe.commons.table.isDataTable(e)},tags:[\"cat.tables\",\"wcag2a\",\"wcag131\",\"section508\",\"section508.22.g\"],all:[\"th-has-data-cells\"],any:[],none:[]},{id:\"valid-lang\",selector:\"[lang], [xml\\\\:lang]\",matches:function(e,t,r){return\"html\"!==e.nodeName.toLowerCase()},tags:[\"cat.language\",\"wcag2aa\",\"wcag312\"],all:[],any:[],none:[\"valid-lang\"]},{id:\"video-caption\",selector:\"video\",excludeHidden:!1,tags:[\"cat.text-alternatives\",\"wcag2a\",\"wcag122\",\"section508\",\"section508.22.a\"],all:[],any:[],none:[\"caption\"]},{id:\"video-description\",selector:\"video\",excludeHidden:!1,tags:[\"cat.text-alternatives\",\"wcag2aa\",\"wcag125\",\"section508\",\"section508.22.b\"],all:[],any:[],none:[\"description\"]}],checks:[{id:\"abstractrole\",evaluate:function(e,t,r,n){return\"abstract\"===axe.commons.aria.getRoleType(e.getAttribute(\"role\"))}},{id:\"aria-allowed-attr\",evaluate:function(e,t,r,n){t=t||{};var a,o,i,u=[],s=e.getAttribute(\"role\"),l=e.attributes;if(s||(s=axe.commons.aria.implicitRole(e)),i=axe.commons.aria.allowedAttr(s),Array.isArray(t[s])&&(i=axe.utils.uniqueArray(t[s].concat(i))),s&&i)for(var c=0,d=l.length;c<d;c++)o=(a=l[c]).name,axe.commons.aria.validateAttr(o)&&!i.includes(o)&&u.push(o+'=\"'+a.nodeValue+'\"');return!u.length||(this.data(u),!1)}},{id:\"aria-allowed-role\",evaluate:function(e,t,r,n){var a=axe.commons.dom,o=t||{},i=o.allowImplicit,u=void 0===i||i,s=o.ignoredTags,l=void 0===s?[]:s,c=e.nodeName.toUpperCase();if(l.map(function(e){return e.toUpperCase()}).includes(c))return!0;var d=axe.commons.aria.getElementUnallowedRoles(e,u);if(d.length){if(this.data(d),!a.isVisible(e,!0))return;return!1}return!0},options:{allowImplicit:!0,ignoredTags:[]}},{id:\"aria-hidden-body\",evaluate:function(e,t,r,n){return\"true\"!==e.getAttribute(\"aria-hidden\")}},{id:\"aria-errormessage\",evaluate:function(r,e,t,n){var a=axe.commons,o=a.aria,i=a.dom;e=Array.isArray(e)?e:[];var u=r.getAttribute(\"aria-errormessage\"),s=r.hasAttribute(\"aria-errormessage\"),l=i.getRootNode(r);return!(-1===e.indexOf(u)&&s&&!function(e){if(\"\"===e.trim())return o.lookupTable.attributes[\"aria-errormessage\"].allowEmpty;var t=e&&l.getElementById(e);return t?\"alert\"===t.getAttribute(\"role\")||\"assertive\"===t.getAttribute(\"aria-live\")||-1<axe.utils.tokenList(r.getAttribute(\"aria-describedby\")||\"\").indexOf(e):void 0}(u))||(this.data(axe.utils.tokenList(u)),!1)}},{id:\"has-widget-role\",evaluate:function(e,t,r,n){var a=e.getAttribute(\"role\");if(null===a)return!1;var o=axe.commons.aria.getRoleType(a);return\"widget\"===o||\"composite\"===o},options:[]},{id:\"implicit-role-fallback\",evaluate:function(e,t,r,n){var a=e.getAttribute(\"role\");if(null===a||!axe.commons.aria.isValidRole(a))return!0;var o=axe.commons.aria.getRoleType(a);return axe.commons.aria.implicitRole(e)===o}},{id:\"invalidrole\",evaluate:function(e,t,r,n){return!axe.commons.aria.isValidRole(e.getAttribute(\"role\"),{allowAbstract:!0})}},{id:\"aria-required-attr\",evaluate:function(e,t,r,n){t=t||{};var a=[];if(e.hasAttributes()){var o,i=e.getAttribute(\"role\"),u=axe.commons.aria.requiredAttr(i);if(Array.isArray(t[i])&&(u=axe.utils.uniqueArray(t[i],u)),i&&u)for(var s=0,l=u.length;s<l;s++)o=u[s],e.getAttribute(o)||a.push(o)}return!a.length||(this.data(a),!1)}},{id:\"aria-required-children\",evaluate:function(e,t,m,r){var n=axe.commons.aria.requiredOwned,i=axe.commons.aria.implicitNodes,u=axe.utils.matchesSelector,p=axe.commons.dom.idrefs,a=t&&Array.isArray(t.reviewEmpty)?t.reviewEmpty:[];function f(e,t,r,n){if(null===e)return!1;var a=i(r),o=['[role=\"'+r+'\"]'];return a&&(o=o.concat(a)),o=o.join(\",\"),n&&u(e,o)||!!axe.utils.querySelectorAll(t,o)[0]}function h(e,t){var r,n;for(r=0,n=e.length;r<n;r++)if(null!==e[r]){var a=axe.utils.getNodeFromTree(axe._tree[0],e[r]);if(f(e[r],a,t,!0))return!0}return!1}var o=e.getAttribute(\"role\"),s=n(o);if(!s)return!0;var l=!1,c=s.one;if(!c){l=!0;c=s.all}var d=function(e,t,r,n){var a,o=t.length,i=[],u=p(e,\"aria-owns\");for(a=0;a<o;a++){var s=t[a];if(f(e,m,s)||h(u,s)){if(!r)return null}else r&&i.push(s)}if(\"combobox\"===n){var l=i.indexOf(\"textbox\");0<=l&&\"INPUT\"===e.nodeName.toUpperCase()&&[\"text\",\"search\",\"email\",\"url\",\"tel\"].includes(e.type)&&i.splice(l,1);var c=i.indexOf(\"listbox\"),d=e.getAttribute(\"aria-expanded\");0<=c&&(!d||\"false\"===d)&&i.splice(c,1)}return i.length?i:!r&&t.length?t:null}(e,c,l,o);return!d||(this.data(d),!!a.includes(o)&&void 0)},options:{reviewEmpty:[\"listbox\"]}},{id:\"aria-required-parent\",evaluate:function(e,t,r,n){function u(e){return(axe.commons.aria.implicitNodes(e)||[]).concat('[role=\"'+e+'\"]').join(\",\")}function a(e,t,r){var n,a,o=e.actualNode.getAttribute(\"role\"),i=[];if(t||(t=axe.commons.aria.requiredContext(o)),!t)return null;for(n=0,a=t.length;n<a;n++){if(r&&axe.utils.matchesSelector(e.actualNode,u(t[n])))return null;if(axe.commons.dom.findUpVirtual(e,u(t[n])))return null;i.push(t[n])}return i}var o=a(r);if(!o)return!0;var i=function(e){for(var t=[],r=null;e;){if(e.getAttribute(\"id\")){var n=axe.utils.escapeSelector(e.getAttribute(\"id\"));(r=axe.commons.dom.getRootNode(e).querySelector(\"[aria-owns~=\"+n+\"]\"))&&t.push(r)}e=e.parentElement}return t.length?t:null}(e);if(i)for(var s=0,l=i.length;s<l;s++)if(!(o=a(axe.utils.getNodeFromTree(axe._tree[0],i[s]),o,!0)))return!0;return this.data(o),!1}},{id:\"aria-unsupported-attr\",evaluate:function(o,e,t,r){var i=o.nodeName.toUpperCase(),u=axe.commons.aria.lookupTable,s=axe.commons.aria.getRole(o),n=Array.from(o.attributes).filter(function(e){var t=e.name,r=u.attributes[t];if(!axe.commons.aria.validateAttr(t))return!1;var n=r.unsupported;if(\"object\"!==(void 0===n?\"undefined\":N(n)))return!!n;var a=axe.commons.matches(o,n.exceptions);return Object.keys(u.evaluateRoleForElement).includes(i)?!u.evaluateRoleForElement[i]({node:o,role:s,out:a}):!a}).map(function(e){return e.name.toString()});return!!n.length&&(this.data(n),!0)}},{id:\"unsupportedrole\",evaluate:function(e,t,r,n){return axe.commons.aria.isUnsupportedRole(axe.commons.aria.getRole(e))}},{id:\"aria-valid-attr-value\",evaluate:function(e,t,r,n){t=Array.isArray(t)?t:[];for(var a,o,i=[],u=/^aria-/,s=e.attributes,l=[\"aria-errormessage\"],c=0,d=s.length;c<d;c++)o=(a=s[c]).name,l.includes(o)||-1===t.indexOf(o)&&u.test(o)&&!axe.commons.aria.validateAttrValue(e,o)&&i.push(o+'=\"'+a.nodeValue+'\"');return!i.length||(this.data(i),!1)},options:[]},{id:\"aria-valid-attr\",evaluate:function(e,t,r,n){t=Array.isArray(t)?t:[];for(var a,o=[],i=/^aria-/,u=e.attributes,s=0,l=u.length;s<l;s++)a=u[s].name,-1===t.indexOf(a)&&i.test(a)&&!axe.commons.aria.validateAttr(a)&&o.push(a);return!o.length||(this.data(o),!1)},options:[]},{id:\"valid-scrollable-semantics\",evaluate:function(e,t,r,n){var a,o,i,u={ARTICLE:!0,ASIDE:!0,NAV:!0,SECTION:!0},s={application:!0,banner:!1,complementary:!0,contentinfo:!0,form:!0,main:!0,navigation:!0,region:!0,search:!1};return(i=(a=e).getAttribute(\"role\"))&&s[i.toLowerCase()]||(o=a.nodeName.toUpperCase(),u[o]||!1)},options:[]},{id:\"color-contrast\",evaluate:function(e,t,r,n){var a=axe.commons,o=a.dom,i=a.color,u=a.text;if(!o.isVisible(e,!1))return!0;var s=!!(t||{}).noScroll,l=[],c=i.getBackgroundColor(e,l,s),d=i.getForegroundColor(e,s),m=window.getComputedStyle(e),p=parseFloat(m.getPropertyValue(\"font-size\")),f=m.getPropertyValue(\"font-weight\"),h=-1!==[\"bold\",\"bolder\",\"600\",\"700\",\"800\",\"900\"].indexOf(f),b=i.hasValidContrastRatio(c,d,p,h),g=Math.floor(100*b.contrastRatio)/100,y=void 0;null===c&&(y=i.incompleteData.get(\"bgColor\"));var v=1===g,D=1===u.visibleVirtual(r,!1,!0).length;v?y=i.incompleteData.set(\"bgColor\",\"equalRatio\"):D&&(y=\"shortTextContent\");var w={fgColor:d?d.toHexString():void 0,bgColor:c?c.toHexString():void 0,contrastRatio:b?g:void 0,fontSize:(72*p/96).toFixed(1)+\"pt\",fontWeight:h?\"bold\":\"normal\",missingData:y,expectedContrastRatio:b.expectedContrastRatio+\":1\"};return this.data(w),null===d||null===c||v||D&&!b.isValid?(y=null,i.incompleteData.clear(),void this.relatedNodes(l)):(b.isValid||this.relatedNodes(l),b.isValid)}},{id:\"link-in-text-block\",evaluate:function(e,t,r,n){var a=axe.commons,o=a.color,i=a.dom;function u(e,t){var r=e.getRelativeLuminance(),n=t.getRelativeLuminance();return(Math.max(r,n)+.05)/(Math.min(r,n)+.05)}var s=[\"block\",\"list-item\",\"table\",\"flex\",\"grid\",\"inline-block\"];function l(e){var t=window.getComputedStyle(e).getPropertyValue(\"display\");return-1!==s.indexOf(t)||\"table-\"===t.substr(0,6)}if(l(e))return!1;for(var c,d,m=i.getComposedParent(e);1===m.nodeType&&!l(m);)m=i.getComposedParent(m);if(this.relatedNodes([m]),o.elementIsDistinct(e,m))return!0;if(c=o.getForegroundColor(e),d=o.getForegroundColor(m),c&&d){var p=u(c,d);if(1===p)return!0;if(3<=p)return axe.commons.color.incompleteData.set(\"fgColor\",\"bgContrast\"),this.data({missingData:axe.commons.color.incompleteData.get(\"fgColor\")}),void axe.commons.color.incompleteData.clear();if(c=o.getBackgroundColor(e),d=o.getBackgroundColor(m),!c||!d||3<=u(c,d)){var f=void 0;return f=c&&d?\"bgContrast\":axe.commons.color.incompleteData.get(\"bgColor\"),axe.commons.color.incompleteData.set(\"fgColor\",f),this.data({missingData:axe.commons.color.incompleteData.get(\"fgColor\")}),void axe.commons.color.incompleteData.clear()}return!1}}},{id:\"autocomplete-appropriate\",evaluate:function(e,t,r,n){if(\"INPUT\"!==e.nodeName.toUpperCase())return!0;var a=[\"text\",\"search\",\"number\"],o=[\"text\",\"search\",\"url\"],i={bday:[\"text\",\"search\",\"date\"],email:[\"text\",\"search\",\"email\"],\"cc-exp\":[\"text\",\"search\",\"month\"],\"street-address\":[\"text\"],tel:[\"text\",\"search\",\"tel\"],\"cc-exp-month\":a,\"cc-exp-year\":a,\"transaction-amount\":a,\"bday-day\":a,\"bday-month\":a,\"bday-year\":a,\"new-password\":[\"text\",\"search\",\"password\"],\"current-password\":[\"text\",\"search\",\"password\"],url:o,photo:o,impp:o};\"object\"===(void 0===t?\"undefined\":N(t))&&Object.keys(t).forEach(function(e){i[e]||(i[e]=[]),i[e]=i[e].concat(t[e])});var u=e.getAttribute(\"autocomplete\").split(/\\s+/g).map(function(e){return e.toLowerCase()}),s=u[u.length-1];if(axe.commons.text.autocomplete.stateTerms.includes(s))return!0;var l=i[s],c=e.hasAttribute(\"type\")?axe.commons.text.sanitize(e.getAttribute(\"type\")).toLowerCase():\"text\";return c=axe.utils.validInputTypes().includes(c)?c:\"text\",void 0===l?\"text\"===c:l.includes(c)}},{id:\"autocomplete-valid\",evaluate:function(e,t,r,n){var a=e.getAttribute(\"autocomplete\")||\"\";return axe.commons.text.isValidAutocomplete(a,t)}},{id:\"fieldset\",evaluate:function(e,t,r,n){var u,s=this;function l(e,t){return axe.utils.toArray(e.querySelectorAll('select,textarea,button,input:not([name=\"'+t+'\"]):not([type=\"hidden\"])'))}var a={name:e.getAttribute(\"name\"),type:e.getAttribute(\"type\")},o=function(e){var t=axe.utils.escapeSelector(e.actualNode.name),r=axe.commons.dom.getRootNode(e.actualNode).querySelectorAll('input[type=\"'+axe.utils.escapeSelector(e.actualNode.type)+'\"][name=\"'+t+'\"]');if(r.length<2)return!0;var n,a,o=axe.commons.dom.findUpVirtual(e,\"fieldset\"),i=axe.commons.dom.findUpVirtual(e,'[role=\"group\"]'+(\"radio\"===e.actualNode.type?',[role=\"radiogroup\"]':\"\"));return i||o?o?function(e,t){var r=e.firstElementChild;if(!r||\"LEGEND\"!==r.nodeName.toUpperCase())return s.relatedNodes([e]),!(u=\"no-legend\");if(!axe.commons.text.accessibleText(r))return s.relatedNodes([r]),!(u=\"empty-legend\");var n=l(e,t);return!(n.length&&(s.relatedNodes(n),u=\"mixed-inputs\"))}(o,t):function(e,t){var r=axe.commons.dom.idrefs(e,\"aria-labelledby\").some(function(e){return e&&axe.commons.text.accessibleText(e)}),n=e.getAttribute(\"aria-label\");if(!(r||n&&axe.commons.text.sanitize(n)))return s.relatedNodes(e),!(u=\"no-group-label\");var a=l(e,t);return!(a.length&&(s.relatedNodes(a),u=\"group-mixed-inputs\"))}(i,t):(u=\"no-group\",s.relatedNodes((n=r,a=e.actualNode,axe.utils.toArray(n).filter(function(e){return e!==a}))),!1)}(r);return o||(a.failureCode=u),this.data(a),o},after:function(e,t){var n={};return e.filter(function(e){if(e.result)return!0;var t=e.data;if(t){if(n[t.type]=n[t.type]||{},!n[t.type][t.name])return n[t.type][t.name]=[t],!0;var r=n[t.type][t.name].some(function(e){return e.failureCode===t.failureCode});return r||n[t.type][t.name].push(t),!r}return!1})}},{id:\"group-labelledby\",evaluate:function(r,e,t,n){var a=axe.commons,o=a.dom,i=a.text,u=axe.utils.escapeSelector(r.type),s=axe.utils.escapeSelector(r.name),l=o.getRootNode(r),c={name:r.name,type:r.type},d=Array.from(l.querySelectorAll('input[type=\"'+u+'\"][name=\"'+s+'\"]'));if(d.length<=1)return this.data(c),!0;var m=o.idrefs(r,\"aria-labelledby\").filter(function(e){return!!e}),p=m.slice();d.forEach(function(e){if(e!==r){var t=o.idrefs(e,\"aria-labelledby\").filter(function(e){return e});m=m.filter(function(e){return t.includes(e)}),p=p.filter(function(e){return!t.includes(e)})}});var f={inLabelledByContext:!0};return p=p.filter(function(e){return i.accessibleText(e,f)}),m=m.filter(function(e){return i.accessibleText(e,f)}),0<p.length&&0<m.length?(this.data(c),!0):(0<p.length&&0===m.length?c.failureCode=\"no-shared-label\":0===p.length&&0<m.length&&(c.failureCode=\"no-unique-label\"),this.data(c),!1)},after:function(e,t){var r={};return e.filter(function(e){var t=e.data;return!(!t||(r[t.type]=r[t.type]||{},r[t.type][t.name]))&&(r[t.type][t.name]=!0)})}},{id:\"accesskeys\",evaluate:function(e,t,r,n){return axe.commons.dom.isVisible(e,!1)&&(this.data(e.getAttribute(\"accesskey\")),this.relatedNodes([e])),!0},after:function(e,t){var r={};return e.filter(function(e){if(!e.data)return!1;var t=e.data.toUpperCase();return r[t]?(r[t].relatedNodes.push(e.relatedNodes[0]),!1):((r[t]=e).relatedNodes=[],!0)}).map(function(e){return e.result=!!e.relatedNodes.length,e})}},{id:\"focusable-disabled\",evaluate:function(e,t,r,n){var a=[\"BUTTON\",\"FIELDSET\",\"INPUT\",\"SELECT\",\"TEXTAREA\"],o=r.tabbableElements;if(!o||!o.length)return!0;var i=o.reduce(function(e,t){var r=t.actualNode,n=r.nodeName.toUpperCase();return a.includes(n)&&e.push(r),e},[]);return this.relatedNodes(i),0===i.length}},{id:\"focusable-no-name\",evaluate:function(e,t,r,n){var a=e.getAttribute(\"tabindex\");return!!(axe.commons.dom.isFocusable(e)&&-1<a)&&!axe.commons.text.accessibleTextVirtual(r)}},{id:\"focusable-not-tabbable\",evaluate:function(e,t,r,n){var a=[\"BUTTON\",\"FIELDSET\",\"INPUT\",\"SELECT\",\"TEXTAREA\"],o=r.tabbableElements;if(!o||!o.length)return!0;var i=o.reduce(function(e,t){var r=t.actualNode,n=r.nodeName.toUpperCase();return a.includes(n)||e.push(r),e},[]);return this.relatedNodes(i),0===i.length}},{id:\"landmark-is-top-level\",evaluate:function(e,t,r,n){var a=axe.commons.aria.getRolesByType(\"landmark\"),o=axe.commons.dom.getComposedParent(e);for(this.data({role:e.getAttribute(\"role\")||axe.commons.aria.implicitRole(e)});o;){var i=o.getAttribute(\"role\");if(i||\"FORM\"===o.nodeName.toUpperCase()||(i=axe.commons.aria.implicitRole(o)),i&&a.includes(i))return!1;o=axe.commons.dom.getComposedParent(o)}return!0}},{id:\"page-has-heading-one\",evaluate:function(e,t,r,n){if(!t||!t.selector||\"string\"!=typeof t.selector)throw new TypeError(\"visible-in-page requires options.selector to be a string\");var a=axe.utils.querySelectorAll(r,t.selector);return this.relatedNodes(a.map(function(e){return e.actualNode})),0<a.length},after:function(e,t){return e.some(function(e){return!0===e.result})&&e.forEach(function(e){e.result=!0}),e},options:{selector:'h1:not([role]), [role=\"heading\"][aria-level=\"1\"]'}},{id:\"page-has-main\",evaluate:function(e,t,r,n){if(!t||!t.selector||\"string\"!=typeof t.selector)throw new TypeError(\"visible-in-page requires options.selector to be a string\");var a=axe.utils.querySelectorAll(r,t.selector);return this.relatedNodes(a.map(function(e){return e.actualNode})),0<a.length},after:function(e,t){return e.some(function(e){return!0===e.result})&&e.forEach(function(e){e.result=!0}),e},options:{selector:\"main:not([role]), [role='main']\"}},{id:\"page-no-duplicate-banner\",evaluate:function(e,t,r,n){if(!t||!t.selector||\"string\"!=typeof t.selector)throw new TypeError(\"visible-in-page requires options.selector to be a string\");var a=axe.utils.querySelectorAll(r,t.selector);return\"string\"==typeof t.nativeScopeFilter&&(a=a.filter(function(e){return e.actualNode.hasAttribute(\"role\")||!axe.commons.dom.findUpVirtual(e,t.nativeScopeFilter)})),this.relatedNodes(a.map(function(e){return e.actualNode})),a.length<=1},options:{selector:\"header:not([role]), [role=banner]\",nativeScopeFilter:\"article, aside, main, nav, section\"}},{id:\"page-no-duplicate-contentinfo\",evaluate:function(e,t,r,n){if(!t||!t.selector||\"string\"!=typeof t.selector)throw new TypeError(\"visible-in-page requires options.selector to be a string\");var a=axe.utils.querySelectorAll(r,t.selector);return\"string\"==typeof t.nativeScopeFilter&&(a=a.filter(function(e){return e.actualNode.hasAttribute(\"role\")||!axe.commons.dom.findUpVirtual(e,t.nativeScopeFilter)})),this.relatedNodes(a.map(function(e){return e.actualNode})),a.length<=1},options:{selector:\"footer:not([role]), [role=contentinfo]\",nativeScopeFilter:\"article, aside, main, nav, section\"}},{id:\"page-no-duplicate-main\",evaluate:function(e,t,r,n){if(!t||!t.selector||\"string\"!=typeof t.selector)throw new TypeError(\"visible-in-page requires options.selector to be a string\");var a=axe.utils.querySelectorAll(r,t.selector);return\"string\"==typeof t.nativeScopeFilter&&(a=a.filter(function(e){return e.actualNode.hasAttribute(\"role\")||!axe.commons.dom.findUpVirtual(e,t.nativeScopeFilter)})),this.relatedNodes(a.map(function(e){return e.actualNode})),a.length<=1},options:{selector:\"main:not([role]), [role='main']\"}},{id:\"tabindex\",evaluate:function(e,t,r,n){return e.tabIndex<=0}},{id:\"alt-space-value\",evaluate:function(e,t,r,n){var a=/^\\s+$/.test(e.getAttribute(\"alt\"));return e.hasAttribute(\"alt\")&&a}},{id:\"duplicate-img-label\",evaluate:function(e,t,r,n){var a=axe.commons.text.visibleVirtual(r,!0).toLowerCase();return\"\"!==a&&axe.utils.querySelectorAll(r,\"img\").filter(function(e){var t=e.actualNode;return axe.commons.dom.isVisible(t)&&![\"none\",\"presentation\"].includes(t.getAttribute(\"role\"))}).some(function(e){return a===axe.commons.text.accessibleTextVirtual(e).toLowerCase()})}},{id:\"explicit-label\",evaluate:function(e,t,r,n){if(e.getAttribute(\"id\")){var a=axe.commons.dom.getRootNode(e),o=axe.utils.escapeSelector(e.getAttribute(\"id\")),i=a.querySelector('label[for=\"'+o+'\"]');if(i)return!axe.commons.dom.isVisible(i)||!!axe.commons.text.accessibleText(i)}return!1}},{id:\"help-same-as-label\",evaluate:function(e,t,r,n){var a=axe.commons.text.labelVirtual(r),o=e.getAttribute(\"title\");if(!a)return!1;o||(o=\"\",e.getAttribute(\"aria-describedby\")&&(o=axe.commons.dom.idrefs(e,\"aria-describedby\").map(function(e){return e?axe.commons.text.accessibleText(e):\"\"}).join(\"\")));return axe.commons.text.sanitize(o)===axe.commons.text.sanitize(a)},enabled:!1},{id:\"hidden-explicit-label\",evaluate:function(e,t,r,n){if(e.getAttribute(\"id\")){var a=axe.commons.dom.getRootNode(e),o=axe.utils.escapeSelector(e.getAttribute(\"id\")),i=a.querySelector('label[for=\"'+o+'\"]');if(i&&!axe.commons.dom.isVisible(i,!0))return\"\"===axe.commons.text.accessibleTextVirtual(r).trim()}return!1}},{id:\"implicit-label\",evaluate:function(e,t,r,n){var a=axe.commons,o=a.dom,i=a.text,u=o.findUpVirtual(r,\"label\");return!!u&&!!i.accessibleText(u,{inControlContext:!0})}},{id:\"label-content-name-mismatch\",evaluate:function(e,t,r,n){var a=axe.commons.text,o=a.accessibleText(e).toLowerCase();if(!(a.isHumanInterpretable(o)<1)){var i=a.sanitize(a.visibleVirtual(r)).toLowerCase();return a.isHumanInterpretable(i)<1?!!u(i,o)||void 0:u(i,o)}function u(e,t){var r=s(t),n=s(e);return!(!r||!n)&&r.includes(n)}function s(e){var t=a.removeUnicode(e,{emoji:!0,nonBmp:!0,punctuations:!0});return a.sanitize(t)}}},{id:\"multiple-label\",evaluate:function(e,t,r,n){var a=axe.utils.escapeSelector(e.getAttribute(\"id\")),o=Array.from(document.querySelectorAll('label[for=\"'+a+'\"]')),i=e.parentNode;for(o.length&&(o=o.filter(function(e,t){if(0===t&&!axe.commons.dom.isVisible(e,!0)||axe.commons.dom.isVisible(e,!0))return e}));i;)\"LABEL\"===i.nodeName.toUpperCase()&&-1===o.indexOf(i)&&o.push(i),i=i.parentNode;return this.relatedNodes(o),1<o.length}},{id:\"title-only\",evaluate:function(e,t,r,n){return!(axe.commons.text.labelVirtual(r)||!e.getAttribute(\"title\")&&!e.getAttribute(\"aria-describedby\"))}},{id:\"has-lang\",evaluate:function(e,t,r,n){return!!(e.getAttribute(\"lang\")||e.getAttribute(\"xml:lang\")||\"\").trim()}},{id:\"valid-lang\",evaluate:function(a,e,t,r){var o,n;return o=(e||axe.utils.validLangs()).map(axe.utils.getBaseLang),!!(n=[\"lang\",\"xml:lang\"].reduce(function(e,t){var r=a.getAttribute(t);if(\"string\"!=typeof r)return e;var n=axe.utils.getBaseLang(r);return\"\"!==n&&-1===o.indexOf(n)&&e.push(t+'=\"'+a.getAttribute(t)+'\"'),e},[])).length&&(this.data(n),!0)}},{id:\"xml-lang-mismatch\",evaluate:function(e,t,r,n){var a=axe.utils.getBaseLang;return a(e.getAttribute(\"lang\"))===a(e.getAttribute(\"xml:lang\"))}},{id:\"dlitem\",evaluate:function(e,t,r,n){var a=axe.commons.dom.getComposedParent(e),o=a.nodeName.toUpperCase(),i=axe.commons.aria.getRole(a,{noImplicit:!0});return\"DIV\"===o&&[\"presentation\",\"none\",null].includes(i)&&(o=(a=axe.commons.dom.getComposedParent(a)).nodeName.toUpperCase(),i=axe.commons.aria.getRole(a,{noImplicit:!0})),\"DL\"===o&&(!i||\"list\"===i)}},{id:\"listitem\",evaluate:function(e,t,r,n){var a=axe.commons.dom.getComposedParent(e);if(a){var o=a.nodeName.toUpperCase(),i=(a.getAttribute(\"role\")||\"\").toLowerCase();return\"list\"===i||(!i||!axe.commons.aria.isValidRole(i))&&[\"UL\",\"OL\"].includes(o)}}},{id:\"only-dlitems\",evaluate:function(e,t,r,n){var a=axe.commons,o=a.dom,i=a.aria,u=[\"definition\",\"term\",\"list\"],s=r.children.reduce(function(e,t){var r=t.actualNode;return\"DIV\"===r.nodeName.toUpperCase()&&null===i.getRole(r)?e.concat(t.children):e.concat(t)},[]).reduce(function(e,t){var r=t.actualNode,n=r.nodeName.toUpperCase();if(1===r.nodeType&&o.isVisible(r,!0,!1)){var a=i.getRole(r,{noImplicit:!0});(\"DT\"!==n&&\"DD\"!==n||a)&&(u.includes(a)||e.badNodes.push(r))}else 3===r.nodeType&&\"\"!==r.nodeValue.trim()&&(e.hasNonEmptyTextNode=!0);return e},{badNodes:[],hasNonEmptyTextNode:!1});return s.badNodes.length&&this.relatedNodes(s.badNodes),!!s.badNodes.length||s.hasNonEmptyTextNode}},{id:\"only-listitems\",evaluate:function(e,t,r,n){var d=axe.commons.dom,a=r.children.reduce(function(e,t){var r,n,a,o,i,u=t.actualNode,s=u.nodeName.toUpperCase();if(1===u.nodeType&&d.isVisible(u,!0,!1)){var l=(u.getAttribute(\"role\")||\"\").toLowerCase(),c=(i=s,\"listitem\"===(o=l)||\"LI\"===i&&!o);e.hasListItem=(r=e.hasListItem,n=s,a=c,r||\"LI\"===n&&a||a),c&&(e.isEmpty=!1),\"LI\"!==s||c||e.liItemsWithRole++,\"LI\"===s||c||e.badNodes.push(u)}return 3===u.nodeType&&\"\"!==u.nodeValue.trim()&&(e.hasNonEmptyTextNode=!0),e},{badNodes:[],isEmpty:!0,hasNonEmptyTextNode:!1,hasListItem:!1,liItemsWithRole:0}),o=r.children.filter(function(e){return\"LI\"===e.actualNode.nodeName.toUpperCase()}),i=0<a.liItemsWithRole&&o.length===a.liItemsWithRole;return a.badNodes.length&&this.relatedNodes(a.badNodes),!(a.hasListItem||a.isEmpty&&!i)||!!a.badNodes.length||a.hasNonEmptyTextNode}},{id:\"structured-dlitems\",evaluate:function(e,t,r,n){var a=r.children;if(!a||!a.length)return!1;for(var o,i=!1,u=!1,s=0;s<a.length;s++){if(\"DT\"===(o=a[s].actualNode.nodeName.toUpperCase())&&(i=!0),i&&\"DD\"===o)return!1;\"DD\"===o&&(u=!0)}return i||u}},{id:\"caption\",evaluate:function(e,t,r,n){return!axe.utils.querySelectorAll(r,\"track\").some(function(e){return\"captions\"===(e.actualNode.getAttribute(\"kind\")||\"\").toLowerCase()})&&void 0}},{id:\"description\",evaluate:function(e,t,r,n){return!axe.utils.querySelectorAll(r,\"track\").some(function(e){return\"descriptions\"===(e.actualNode.getAttribute(\"kind\")||\"\").toLowerCase()})&&void 0}},{id:\"frame-tested\",evaluate:function(e,t,r,n){var a=this.async(),o=Object.assign({isViolation:!1,timeout:500},t),i=o.isViolation,u=o.timeout,s=setTimeout(function(){s=setTimeout(function(){s=null,a(!i&&void 0)},0)},u);axe.utils.respondable(e.contentWindow,\"axe.ping\",null,void 0,function(){null!==s&&(clearTimeout(s),a(!0))})},options:{isViolation:!1}},{id:\"css-orientation-lock\",evaluate:function(e,t,r,n){var a=(n||{}).cssom,o=void 0===a?void 0:a;if(o&&o.length){var i=o.reduce(function(e,t){var r=t.sheet,n=t.root,a=t.shadowId,o=a||\"topDocument\";if(e[o]||(e[o]={root:n,rules:[]}),!r||!r.cssRules)return e;var i=Array.from(r.cssRules);return e[o].rules=e[o].rules.concat(i),e},{}),s=!1,l=[];return Object.keys(i).forEach(function(e){var t=i[e],u=t.root,r=t.rules.filter(function(e){return 4===e.type});if(r&&r.length){var n=r.filter(function(e){var t=e.cssText;return/orientation:\\s+landscape/i.test(t)||/orientation:\\s+portrait/i.test(t)});n&&n.length&&n.forEach(function(e){e.cssRules.length&&Array.from(e.cssRules).forEach(function(e){if(e.selectorText&&!(e.style.length<=0)){var t=e.style.transform||!1;if(t){var r=t.match(/rotate\\(([^)]+)deg\\)/),n=parseInt(r&&r[1]||0),a=n%90==0&&n%180!=0;if(a&&\"HTML\"!==e.selectorText.toUpperCase()){var o=e.selectorText,i=Array.from(u.querySelectorAll(o));i&&i.length&&(l=l.concat(i))}s=a}}})})}}),s?(l.length&&this.relatedNodes(l),!1):!0}}},{id:\"meta-viewport-large\",evaluate:function(e,t,r,n){t=t||{};for(var a,o=(e.getAttribute(\"content\")||\"\").split(/[;,]/),i={},u=t.scaleMinimum||2,s=t.lowerBound||!1,l=0,c=o.length;l<c;l++){var d=(a=o[l].split(\"=\")).shift().toLowerCase();d&&a.length&&(i[d.trim()]=a.shift().trim().toLowerCase())}return!!(s&&i[\"maximum-scale\"]&&parseFloat(i[\"maximum-scale\"])<s)||(s||\"no\"!==i[\"user-scalable\"]?!(i[\"maximum-scale\"]&&parseFloat(i[\"maximum-scale\"])<u)||(this.data(\"maximum-scale\"),!1):(this.data(\"user-scalable=no\"),!1))},options:{scaleMinimum:5,lowerBound:2}},{id:\"meta-viewport\",evaluate:function(e,t,r,n){t=t||{};for(var a,o=(e.getAttribute(\"content\")||\"\").split(/[;,]/),i={},u=t.scaleMinimum||2,s=t.lowerBound||!1,l=0,c=o.length;l<c;l++){var d=(a=o[l].split(\"=\")).shift().toLowerCase();d&&a.length&&(i[d.trim()]=a.shift().trim().toLowerCase())}return!!(s&&i[\"maximum-scale\"]&&parseFloat(i[\"maximum-scale\"])<s)||(s||\"no\"!==i[\"user-scalable\"]?!(i[\"maximum-scale\"]&&parseFloat(i[\"maximum-scale\"])<u)||(this.data(\"maximum-scale\"),!1):(this.data(\"user-scalable=no\"),!1))},options:{scaleMinimum:2}},{id:\"header-present\",evaluate:function(e,t,r,n){return!!axe.utils.querySelectorAll(r,'h1, h2, h3, h4, h5, h6, [role=\"heading\"]')[0]}},{id:\"heading-order\",evaluate:function(e,t,r,n){var a=e.getAttribute(\"aria-level\");if(null!==a)return this.data(parseInt(a,10)),!0;var o=e.nodeName.toUpperCase().match(/H(\\d)/);return o&&this.data(parseInt(o[1],10)),!0},after:function(e,t){if(e.length<2)return e;for(var r=e[0].data,n=1;n<e.length;n++)e[n].result&&e[n].data>r+1&&(e[n].result=!1),r=e[n].data;return e}},{id:\"internal-link-present\",evaluate:function(e,t,r,n){return axe.utils.querySelectorAll(r,\"a[href]\").some(function(e){return/^#[^/!]/.test(e.actualNode.getAttribute(\"href\"))})}},{id:\"landmark\",evaluate:function(e,t,r,n){return 0<axe.utils.querySelectorAll(r,'main, [role=\"main\"]').length}},{id:\"meta-refresh\",evaluate:function(e,t,r,n){var a=e.getAttribute(\"content\")||\"\",o=a.split(/[;,]/);return\"\"===a||\"0\"===o[0]}},{id:\"p-as-heading\",evaluate:function(e,t,r,n){var a=Array.from(e.parentNode.children),o=a.indexOf(e),i=(t=t||{}).margins||[],u=a.slice(o+1).find(function(e){return\"P\"===e.nodeName.toUpperCase()}),s=a.slice(0,o).reverse().find(function(e){return\"P\"===e.nodeName.toUpperCase()});function l(e){var t=window.getComputedStyle(function(e){for(var t=e,r=e.textContent.trim(),n=r;n===r&&void 0!==t;){var a=-1;if(0===(e=t).children.length)return e;for(;a++,\"\"===(n=e.children[a].textContent.trim())&&a+1<e.children.length;);t=e.children[a]}return e}(e));return{fontWeight:function(e){switch(e){case\"lighter\":return 100;case\"normal\":return 400;case\"bold\":return 700;case\"bolder\":return 900}return e=parseInt(e),isNaN(e)?400:e}(t.getPropertyValue(\"font-weight\")),fontSize:parseInt(t.getPropertyValue(\"font-size\")),isItalic:\"italic\"===t.getPropertyValue(\"font-style\")}}function c(r,n,e){return e.reduce(function(e,t){return e||(!t.size||r.fontSize/t.size>n.fontSize)&&(!t.weight||r.fontWeight-t.weight>n.fontWeight)&&(!t.italic||r.isItalic&&!n.isItalic)},!1)}var d=l(e),m=u?l(u):null,p=s?l(s):null;if(!m||!c(d,m,i))return!0;var f=axe.commons.dom.findUpVirtual(r,\"blockquote\");return!!(f&&\"BLOCKQUOTE\"===f.nodeName.toUpperCase()||p&&!c(d,p,i))&&void 0},options:{margins:[{weight:150,italic:!0},{weight:150,size:1.15},{italic:!0,size:1.15},{size:1.4}]}},{id:\"region\",evaluate:function(e,t,r,n){var a=axe.commons,s=a.dom,l=a.aria;var c=function(e){var t=axe.utils.querySelectorAll(e,\"a[href]\")[0];if(t&&axe.commons.dom.getElementByReference(t.actualNode,\"href\"))return t.actualNode}(r),d=l.getRolesByType(\"landmark\"),m=d.reduce(function(e,t){return e.concat(l.implicitNodes(t))},[]).filter(function(e){return null!==e});var o=function e(t){var r,a,o,n,i,u=t.actualNode;return o=(a=t).actualNode,n=axe.commons.aria.getRole(o,{noImplicit:!0}),i=(o.getAttribute(\"aria-live\")||\"\").toLowerCase().trim(),(n?\"dialog\"===n||d.includes(n):[\"assertive\",\"polite\"].includes(i)||m.some(function(e){var t=axe.utils.matchesSelector(o,e);if(\"FORM\"!==o.nodeName.toUpperCase())return t;var r=o.getAttribute(\"title\"),n=r&&\"\"!==r.trim()?axe.commons.text.sanitize(r):null;return t&&(!!l.labelVirtual(a)||!!n)}))||(r=t,c&&c===r.actualNode)||!s.isVisible(u,!0)?[]:s.hasContent(u,!0)?[u]:t.children.filter(function(e){return 1===e.actualNode.nodeType}).map(e).reduce(function(e,t){return e.concat(t)},[])}(r);return this.relatedNodes(o),0===o.length},after:function(e,t){return[e[0]]}},{id:\"skip-link\",evaluate:function(e,t,r,n){var a=axe.commons.dom.getElementByReference(e,\"href\");return!!a&&(axe.commons.dom.isVisible(a,!0)||void 0)}},{id:\"unique-frame-title\",evaluate:function(e,t,r,n){var a=axe.commons.text.sanitize(e.title).trim().toLowerCase();return this.data(a),!0},after:function(e,t){var r={};return e.forEach(function(e){r[e.data]=void 0!==r[e.data]?++r[e.data]:0}),e.forEach(function(e){e.result=!!r[e.data]}),e}},{id:\"duplicate-id-active\",evaluate:function(t,e,r,n){var a=t.getAttribute(\"id\").trim();if(!a)return!0;var o=axe.commons.dom.getRootNode(t),i=Array.from(o.querySelectorAll('[id=\"'+axe.utils.escapeSelector(a)+'\"]')).filter(function(e){return e!==t});return i.length&&this.relatedNodes(i),this.data(a),0===i.length},after:function(e,t){var r=[];return e.filter(function(e){return-1===r.indexOf(e.data)&&(r.push(e.data),!0)})}},{id:\"duplicate-id-aria\",evaluate:function(t,e,r,n){var a=t.getAttribute(\"id\").trim();if(!a)return!0;var o=axe.commons.dom.getRootNode(t),i=Array.from(o.querySelectorAll('[id=\"'+axe.utils.escapeSelector(a)+'\"]')).filter(function(e){return e!==t});return i.length&&this.relatedNodes(i),this.data(a),0===i.length},after:function(e,t){var r=[];return e.filter(function(e){return-1===r.indexOf(e.data)&&(r.push(e.data),!0)})}},{id:\"duplicate-id\",evaluate:function(t,e,r,n){var a=t.getAttribute(\"id\").trim();if(!a)return!0;var o=axe.commons.dom.getRootNode(t),i=Array.from(o.querySelectorAll('[id=\"'+axe.utils.escapeSelector(a)+'\"]')).filter(function(e){return e!==t});return i.length&&this.relatedNodes(i),this.data(a),0===i.length},after:function(e,t){var r=[];return e.filter(function(e){return-1===r.indexOf(e.data)&&(r.push(e.data),!0)})}},{id:\"aria-label\",evaluate:function(e,t,r,n){var a=axe.commons,o=a.text,i=a.aria;return!!o.sanitize(i.arialabelText(e))}},{id:\"aria-labelledby\",evaluate:function(e,t,r,n){var a=axe.commons,o=a.text,i=a.aria;return!!o.sanitize(i.arialabelledbyText(e))}},{id:\"button-has-visible-text\",evaluate:function(e,t,r,n){var a=e.nodeName.toUpperCase(),o=e.getAttribute(\"role\"),i=void 0;return(\"BUTTON\"===a||\"button\"===o&&\"INPUT\"!==a)&&(i=axe.commons.text.accessibleTextVirtual(r),this.data(i),!!i)}},{id:\"doc-has-title\",evaluate:function(e,t,r,n){var a=document.title;return!(!a||!axe.commons.text.sanitize(a).trim())}},{id:\"exists\",evaluate:function(e,t,r,n){return!0}},{id:\"has-alt\",evaluate:function(e,t,r,n){var a=e.nodeName.toLowerCase();return e.hasAttribute(\"alt\")&&(\"img\"===a||\"input\"===a||\"area\"===a)}},{id:\"has-visible-text\",evaluate:function(e,t,r,n){return 0<axe.commons.text.accessibleTextVirtual(r).length}},{id:\"is-on-screen\",evaluate:function(e,t,r,n){return axe.commons.dom.isVisible(e,!1)&&!axe.commons.dom.isOffscreen(e)}},{id:\"non-empty-alt\",evaluate:function(e,t,r,n){var a=e.getAttribute(\"alt\");return!(!a||!axe.commons.text.sanitize(a).trim())}},{id:\"non-empty-if-present\",evaluate:function(e,t,r,n){var a=e.nodeName.toUpperCase(),o=(e.getAttribute(\"type\")||\"\").toLowerCase(),i=e.getAttribute(\"value\");return this.data(i),!(\"INPUT\"!==a||![\"submit\",\"reset\"].includes(o))&&null===i}},{id:\"non-empty-title\",evaluate:function(e,t,r,n){var a=axe.commons.text;return!!a.sanitize(a.titleText(e))}},{id:\"non-empty-value\",evaluate:function(e,t,r,n){var a=e.getAttribute(\"value\");return!(!a||!axe.commons.text.sanitize(a).trim())}},{id:\"role-none\",evaluate:function(e,t,r,n){return\"none\"===e.getAttribute(\"role\")}},{id:\"role-presentation\",evaluate:function(e,t,r,n){return\"presentation\"===e.getAttribute(\"role\")}},{id:\"caption-faked\",evaluate:function(e,t,r,n){var a=axe.commons.table.toGrid(e),o=a[0];return a.length<=1||o.length<=1||e.rows.length<=1||o.reduce(function(e,t,r){return e||t!==o[r+1]&&void 0!==o[r+1]},!1)}},{id:\"has-caption\",evaluate:function(e,t,r,n){return!!e.caption}},{id:\"has-summary\",evaluate:function(e,t,r,n){return!!e.summary}},{id:\"has-th\",evaluate:function(e,t,r,n){for(var a,o,i=[],u=0,s=e.rows.length;u<s;u++)for(var l=0,c=(a=e.rows[u]).cells.length;l<c;l++)\"TH\"!==(o=a.cells[l]).nodeName.toUpperCase()&&-1===[\"rowheader\",\"columnheader\"].indexOf(o.getAttribute(\"role\"))||i.push(o);return!!i.length&&(this.relatedNodes(i),!0)}},{id:\"html5-scope\",evaluate:function(e,t,r,n){return!axe.commons.dom.isHTML5(document)||\"TH\"===e.nodeName.toUpperCase()}},{id:\"same-caption-summary\",evaluate:function(e,t,r,n){return!(!e.summary||!e.caption)&&e.summary.toLowerCase()===axe.commons.text.accessibleText(e.caption).toLowerCase()}},{id:\"scope-value\",evaluate:function(e,t,r,n){t=t||{};var a=e.getAttribute(\"scope\").toLowerCase();return-1!==[\"row\",\"col\",\"rowgroup\",\"colgroup\"].indexOf(a)}},{id:\"td-has-header\",evaluate:function(e,t,r,n){var a=axe.commons.table,o=[];return a.getAllCells(e).forEach(function(e){axe.commons.dom.hasContent(e)&&a.isDataCell(e)&&!axe.commons.aria.label(e)&&(a.getHeaders(e).some(function(e){return null!==e&&!!axe.commons.dom.hasContent(e)})||o.push(e))}),!o.length||(this.relatedNodes(o),!1)}},{id:\"td-headers-attr\",evaluate:function(e,t,r,n){for(var a=[],o=0,i=e.rows.length;o<i;o++)for(var u=e.rows[o],s=0,l=u.cells.length;s<l;s++)a.push(u.cells[s]);var c=a.reduce(function(e,t){return t.getAttribute(\"id\")&&e.push(t.getAttribute(\"id\")),e},[]),d=a.reduce(function(e,t){var r,n,a=(t.getAttribute(\"headers\")||\"\").split(/\\s/).reduce(function(e,t){return(t=t.trim())&&e.push(t),e},[]);return 0!==a.length&&(t.getAttribute(\"id\")&&(r=-1!==a.indexOf(t.getAttribute(\"id\").trim())),n=a.reduce(function(e,t){return e||-1===c.indexOf(t)},!1),(r||n)&&e.push(t)),e},[]);return!(0<d.length)||(this.relatedNodes(d),!1)}},{id:\"th-has-data-cells\",evaluate:function(e,t,r,n){var a=axe.commons.table,o=a.getAllCells(e),i=this,u=[];o.forEach(function(e){var t=e.getAttribute(\"headers\");t&&(u=u.concat(t.split(/\\s+/)));var r=e.getAttribute(\"aria-labelledby\");r&&(u=u.concat(r.split(/\\s+/)))});var s=o.filter(function(e){return\"\"!==axe.commons.text.sanitize(e.textContent)&&(\"TH\"===e.nodeName.toUpperCase()||-1!==[\"rowheader\",\"columnheader\"].indexOf(e.getAttribute(\"role\")))}),l=a.toGrid(e);return!!s.reduce(function(e,t){if(t.getAttribute(\"id\")&&u.includes(t.getAttribute(\"id\")))return!!e||e;var r=!1,n=a.getCellPosition(t,l);return a.isColumnHeader(t)&&(r=a.traverse(\"down\",n,l).reduce(function(e,t){return e||axe.commons.dom.hasContent(t)&&!a.isColumnHeader(t)},!1)),!r&&a.isRowHeader(t)&&(r=a.traverse(\"right\",n,l).reduce(function(e,t){return e||axe.commons.dom.hasContent(t)&&!a.isRowHeader(t)},!1)),r||i.relatedNodes(t),e&&r},!0)||void 0}},{id:\"hidden-content\",evaluate:function(e,t,r,n){if(![\"SCRIPT\",\"HEAD\",\"TITLE\",\"NOSCRIPT\",\"STYLE\",\"TEMPLATE\"].includes(e.nodeName.toUpperCase())&&axe.commons.dom.hasContentVirtual(r)){var a=window.getComputedStyle(e);if(\"none\"===a.getPropertyValue(\"display\"))return;if(\"hidden\"===a.getPropertyValue(\"visibility\")){var o=axe.commons.dom.getComposedParent(e),i=o&&window.getComputedStyle(o);if(!i||\"hidden\"!==i.getPropertyValue(\"visibility\"))return}}return!0}}],commons:function(){var commons={},l=commons.aria={},e=l.lookupTable={},t=function(e){return null===e},r=function(e){return null!==e};e.attributes={\"aria-activedescendant\":{type:\"idref\",allowEmpty:!0,unsupported:!1},\"aria-atomic\":{type:\"boolean\",values:[\"true\",\"false\"],unsupported:!1},\"aria-autocomplete\":{type:\"nmtoken\",values:[\"inline\",\"list\",\"both\",\"none\"],unsupported:!1},\"aria-busy\":{type:\"boolean\",values:[\"true\",\"false\"],unsupported:!1},\"aria-checked\":{type:\"nmtoken\",values:[\"true\",\"false\",\"mixed\",\"undefined\"],unsupported:!1},\"aria-colcount\":{type:\"int\",unsupported:!1},\"aria-colindex\":{type:\"int\",unsupported:!1},\"aria-colspan\":{type:\"int\",unsupported:!1},\"aria-controls\":{type:\"idrefs\",allowEmpty:!0,unsupported:!1},\"aria-current\":{type:\"nmtoken\",allowEmpty:!0,values:[\"page\",\"step\",\"location\",\"date\",\"time\",\"true\",\"false\"],unsupported:!1},\"aria-describedby\":{type:\"idrefs\",allowEmpty:!0,unsupported:!1},\"aria-describedat\":{unsupported:!0,unstandardized:!0},\"aria-details\":{unsupported:!0},\"aria-disabled\":{type:\"boolean\",values:[\"true\",\"false\"],unsupported:!1},\"aria-dropeffect\":{type:\"nmtokens\",values:[\"copy\",\"move\",\"reference\",\"execute\",\"popup\",\"none\"],unsupported:!1},\"aria-errormessage\":{type:\"idref\",allowEmpty:!0,unsupported:!1},\"aria-expanded\":{type:\"nmtoken\",values:[\"true\",\"false\",\"undefined\"],unsupported:!1},\"aria-flowto\":{type:\"idrefs\",allowEmpty:!0,unsupported:!1},\"aria-grabbed\":{type:\"nmtoken\",values:[\"true\",\"false\",\"undefined\"],unsupported:!1},\"aria-haspopup\":{type:\"nmtoken\",allowEmpty:!0,values:[\"true\",\"false\",\"menu\",\"listbox\",\"tree\",\"grid\",\"dialog\"],unsupported:!1},\"aria-hidden\":{type:\"boolean\",values:[\"true\",\"false\"],unsupported:!1},\"aria-invalid\":{type:\"nmtoken\",allowEmpty:!0,values:[\"true\",\"false\",\"spelling\",\"grammar\"],unsupported:!1},\"aria-keyshortcuts\":{type:\"string\",allowEmpty:!0,unsupported:!1},\"aria-label\":{type:\"string\",allowEmpty:!0,unsupported:!1},\"aria-labelledby\":{type:\"idrefs\",allowEmpty:!0,unsupported:!1},\"aria-level\":{type:\"int\",unsupported:!1},\"aria-live\":{type:\"nmtoken\",values:[\"off\",\"polite\",\"assertive\"],unsupported:!1},\"aria-modal\":{type:\"boolean\",values:[\"true\",\"false\"],unsupported:!1},\"aria-multiline\":{type:\"boolean\",values:[\"true\",\"false\"],unsupported:!1},\"aria-multiselectable\":{type:\"boolean\",values:[\"true\",\"false\"],unsupported:!1},\"aria-orientation\":{type:\"nmtoken\",values:[\"horizontal\",\"vertical\"],unsupported:!1},\"aria-owns\":{type:\"idrefs\",allowEmpty:!0,unsupported:!1},\"aria-placeholder\":{type:\"string\",allowEmpty:!0,unsupported:!1},\"aria-posinset\":{type:\"int\",unsupported:!1},\"aria-pressed\":{type:\"nmtoken\",values:[\"true\",\"false\",\"mixed\",\"undefined\"],unsupported:!1},\"aria-readonly\":{type:\"boolean\",values:[\"true\",\"false\"],unsupported:!1},\"aria-relevant\":{type:\"nmtokens\",values:[\"additions\",\"removals\",\"text\",\"all\"],unsupported:!1},\"aria-required\":{type:\"boolean\",values:[\"true\",\"false\"],unsupported:!1},\"aria-roledescription\":{type:\"string\",allowEmpty:!0,unsupported:{exceptions:[\"button\",{nodeName:\"input\",properties:{type:[\"button\",\"checkbox\",\"image\",\"radio\",\"reset\",\"submit\"]}},\"img\",\"select\",\"summary\"]}},\"aria-rowcount\":{type:\"int\",unsupported:!1},\"aria-rowindex\":{type:\"int\",unsupported:!1},\"aria-rowspan\":{type:\"int\",unsupported:!1},\"aria-selected\":{type:\"nmtoken\",values:[\"true\",\"false\",\"undefined\"],unsupported:!1},\"aria-setsize\":{type:\"int\",unsupported:!1},\"aria-sort\":{type:\"nmtoken\",values:[\"ascending\",\"descending\",\"other\",\"none\"],unsupported:!1},\"aria-valuemax\":{type:\"decimal\",unsupported:!1},\"aria-valuemin\":{type:\"decimal\",unsupported:!1},\"aria-valuenow\":{type:\"decimal\",unsupported:!1},\"aria-valuetext\":{type:\"string\",unsupported:!1}},e.globalAttributes=[\"aria-atomic\",\"aria-busy\",\"aria-controls\",\"aria-current\",\"aria-describedby\",\"aria-disabled\",\"aria-dropeffect\",\"aria-flowto\",\"aria-grabbed\",\"aria-haspopup\",\"aria-hidden\",\"aria-invalid\",\"aria-keyshortcuts\",\"aria-label\",\"aria-labelledby\",\"aria-live\",\"aria-owns\",\"aria-relevant\",\"aria-roledescription\"],e.role={alert:{type:\"widget\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},alertdialog:{type:\"widget\",attributes:{allowed:[\"aria-expanded\",\"aria-modal\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"dialog\",\"section\"]},application:{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"article\",\"audio\",\"embed\",\"iframe\",\"object\",\"section\",\"svg\",\"video\"]},article:{type:\"structure\",attributes:{allowed:[\"aria-expanded\",\"aria-posinset\",\"aria-setsize\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"article\"],unsupported:!1},banner:{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"header\"],unsupported:!1,allowedElements:[\"section\"]},button:{type:\"widget\",attributes:{allowed:[\"aria-expanded\",\"aria-pressed\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:null,implicit:[\"button\",'input[type=\"button\"]','input[type=\"image\"]','input[type=\"reset\"]','input[type=\"submit\"]',\"summary\"],unsupported:!1,allowedElements:[{nodeName:\"a\",attributes:{href:r}}]},cell:{type:\"structure\",attributes:{allowed:[\"aria-colindex\",\"aria-colspan\",\"aria-rowindex\",\"aria-rowspan\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:[\"row\"],implicit:[\"td\",\"th\"],unsupported:!1},checkbox:{type:\"widget\",attributes:{allowed:[\"aria-checked\",\"aria-required\",\"aria-readonly\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:null,implicit:['input[type=\"checkbox\"]'],unsupported:!1,allowedElements:[\"button\"]},columnheader:{type:\"structure\",attributes:{allowed:[\"aria-colindex\",\"aria-colspan\",\"aria-expanded\",\"aria-rowindex\",\"aria-rowspan\",\"aria-required\",\"aria-readonly\",\"aria-selected\",\"aria-sort\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:[\"row\"],implicit:[\"th\"],unsupported:!1},combobox:{type:\"composite\",attributes:{allowed:[\"aria-autocomplete\",\"aria-required\",\"aria-activedescendant\",\"aria-orientation\",\"aria-errormessage\"],required:[\"aria-expanded\"]},owned:{all:[\"listbox\",\"textbox\"]},nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[{nodeName:\"input\",properties:{type:\"text\"}}]},command:{nameFrom:[\"author\"],type:\"abstract\",unsupported:!1},complementary:{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"aside\"],unsupported:!1,allowedElements:[\"section\"]},composite:{nameFrom:[\"author\"],type:\"abstract\",unsupported:!1},contentinfo:{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"footer\"],unsupported:!1,allowedElements:[\"section\"]},definition:{type:\"structure\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"dd\",\"dfn\"],unsupported:!1},dialog:{type:\"widget\",attributes:{allowed:[\"aria-expanded\",\"aria-modal\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"dialog\"],unsupported:!1,allowedElements:[\"section\"]},directory:{type:\"structure\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:null,unsupported:!1,allowedElements:[\"ol\",\"ul\"]},document:{type:\"structure\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"body\"],unsupported:!1,allowedElements:[\"article\",\"embed\",\"iframe\",\"object\",\"section\",\"svg\"]},\"doc-abstract\":{type:\"section\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-acknowledgments\":{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-afterword\":{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-appendix\":{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-backlink\":{type:\"link\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:null,unsupported:!1,allowedElements:[{nodeName:\"a\",attributes:{href:r}}]},\"doc-biblioentry\":{type:\"listitem\",attributes:{allowed:[\"aria-expanded\",\"aria-level\",\"aria-posinset\",\"aria-setsize\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:[\"doc-bibliography\"],unsupported:!1,allowedElements:[\"li\"]},\"doc-bibliography\":{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-biblioref\":{type:\"link\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:null,unsupported:!1,allowedElements:[{nodeName:\"a\",attributes:{href:r}}]},\"doc-chapter\":{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-colophon\":{type:\"section\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-conclusion\":{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-cover\":{type:\"img\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1},\"doc-credit\":{type:\"section\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-credits\":{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-dedication\":{type:\"section\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-endnote\":{type:\"listitem\",attributes:{allowed:[\"aria-expanded\",\"aria-level\",\"aria-posinset\",\"aria-setsize\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:[\"doc-endnotes\"],unsupported:!1,allowedElements:[\"li\"]},\"doc-endnotes\":{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:[\"doc-endnote\"],namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-epigraph\":{type:\"section\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1},\"doc-epilogue\":{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-errata\":{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-example\":{type:\"section\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"aside\",\"section\"]},\"doc-footnote\":{type:\"section\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"aside\",\"footer\",\"header\"]},\"doc-foreword\":{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-glossary\":{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:[\"term\",\"definition\"],namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"dl\"]},\"doc-glossref\":{type:\"link\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\",\"contents\"],context:null,unsupported:!1,allowedElements:[{nodeName:\"a\",attributes:{href:r}}]},\"doc-index\":{type:\"navigation\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"nav\",\"section\"]},\"doc-introduction\":{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-noteref\":{type:\"link\",attributes:{allowed:[\"aria-expanded\"]},owned:null,namefrom:[\"author\",\"contents\"],context:null,unsupported:!1,allowedElements:[{nodeName:\"a\",attributes:{href:r}}]},\"doc-notice\":{type:\"note\",attributes:{allowed:[\"aria-expanded\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-pagebreak\":{type:\"separator\",attributes:{allowed:[\"aria-expanded\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"hr\"]},\"doc-pagelist\":{type:\"navigation\",attributes:{allowed:[\"aria-expanded\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"nav\",\"section\"]},\"doc-part\":{type:\"landmark\",attributes:{allowed:[\"aria-expanded\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-preface\":{type:\"landmark\",attributes:{allowed:[\"aria-expanded\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-prologue\":{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-pullquote\":{type:\"none\",attributes:{allowed:[\"aria-expanded\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"aside\",\"section\"]},\"doc-qna\":{type:\"section\",attributes:{allowed:[\"aria-expanded\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-subtitle\":{type:\"sectionhead\",attributes:{allowed:[\"aria-expanded\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:{nodeName:[\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\"]}},\"doc-tip\":{type:\"note\",attributes:{allowed:[\"aria-expanded\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"aside\"]},\"doc-toc\":{type:\"navigation\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"nav\",\"section\"]},feed:{type:\"structure\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:{one:[\"article\"]},nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"article\",\"aside\",\"section\"]},figure:{type:\"structure\",unsupported:!0},form:{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"form\"],unsupported:!1},grid:{type:\"composite\",attributes:{allowed:[\"aria-activedescendant\",\"aria-expanded\",\"aria-colcount\",\"aria-level\",\"aria-multiselectable\",\"aria-readonly\",\"aria-rowcount\",\"aria-errormessage\"]},owned:{one:[\"rowgroup\",\"row\"]},nameFrom:[\"author\"],context:null,implicit:[\"table\"],unsupported:!1},gridcell:{type:\"widget\",attributes:{allowed:[\"aria-colindex\",\"aria-colspan\",\"aria-expanded\",\"aria-rowindex\",\"aria-rowspan\",\"aria-selected\",\"aria-readonly\",\"aria-required\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:[\"row\"],implicit:[\"td\",\"th\"],unsupported:!1},group:{type:\"structure\",attributes:{allowed:[\"aria-activedescendant\",\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"details\",\"optgroup\"],unsupported:!1,allowedElements:[\"dl\",\"figcaption\",\"fieldset\",\"figure\",\"footer\",\"header\",\"ol\",\"ul\"]},heading:{type:\"structure\",attributes:{required:[\"aria-level\"],allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:null,implicit:[\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\"],unsupported:!1},img:{type:\"structure\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"img\"],unsupported:!1,allowedElements:[\"embed\",\"iframe\",\"object\",\"svg\"]},input:{nameFrom:[\"author\"],type:\"abstract\",unsupported:!1},landmark:{nameFrom:[\"author\"],type:\"abstract\",unsupported:!1},link:{type:\"widget\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:null,implicit:[\"a[href]\"],unsupported:!1,allowedElements:[\"button\",{nodeName:\"input\",properties:{type:[\"image\",\"button\"]}}]},list:{type:\"structure\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:{all:[\"listitem\"]},nameFrom:[\"author\"],context:null,implicit:[\"ol\",\"ul\",\"dl\"],unsupported:!1},listbox:{type:\"composite\",attributes:{allowed:[\"aria-activedescendant\",\"aria-multiselectable\",\"aria-required\",\"aria-expanded\",\"aria-orientation\",\"aria-errormessage\"]},owned:{all:[\"option\"]},nameFrom:[\"author\"],context:null,implicit:[\"select\"],unsupported:!1,allowedElements:[\"ol\",\"ul\"]},listitem:{type:\"structure\",attributes:{allowed:[\"aria-level\",\"aria-posinset\",\"aria-setsize\",\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:[\"list\"],implicit:[\"li\",\"dt\"],unsupported:!1},log:{type:\"widget\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},main:{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"main\"],unsupported:!1,allowedElements:[\"article\",\"section\"]},marquee:{type:\"widget\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},math:{type:\"structure\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"math\"],unsupported:!1},menu:{type:\"composite\",attributes:{allowed:[\"aria-activedescendant\",\"aria-expanded\",\"aria-orientation\",\"aria-errormessage\"]},owned:{one:[\"menuitem\",\"menuitemradio\",\"menuitemcheckbox\"]},nameFrom:[\"author\"],context:null,implicit:['menu[type=\"context\"]'],unsupported:!1,allowedElements:[\"ol\",\"ul\"]},menubar:{type:\"composite\",attributes:{allowed:[\"aria-activedescendant\",\"aria-expanded\",\"aria-orientation\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"ol\",\"ul\"]},menuitem:{type:\"widget\",attributes:{allowed:[\"aria-posinset\",\"aria-setsize\",\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:[\"menu\",\"menubar\"],implicit:['menuitem[type=\"command\"]'],unsupported:!1,allowedElements:[\"button\",\"li\",{nodeName:\"iput\",properties:{type:[\"image\",\"button\"]}},{nodeName:\"a\",attributes:{href:r}}]},menuitemcheckbox:{type:\"widget\",attributes:{allowed:[\"aria-checked\",\"aria-posinset\",\"aria-setsize\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:[\"menu\",\"menubar\"],implicit:['menuitem[type=\"checkbox\"]'],unsupported:!1,allowedElements:[{nodeName:[\"button\",\"li\"]},{nodeName:\"input\",properties:{type:[\"checkbox\",\"image\",\"button\"]}},{nodeName:\"a\",attributes:{href:r}}]},menuitemradio:{type:\"widget\",attributes:{allowed:[\"aria-checked\",\"aria-selected\",\"aria-posinset\",\"aria-setsize\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:[\"menu\",\"menubar\"],implicit:['menuitem[type=\"radio\"]'],unsupported:!1,allowedElements:[{nodeName:[\"button\",\"li\"]},{nodeName:\"input\",properties:{type:[\"image\",\"button\",\"radio\"]}},{nodeName:\"a\",attributes:{href:r}}]},navigation:{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"nav\"],unsupported:!1,allowedElements:[\"section\"]},none:{type:\"structure\",attributes:null,owned:null,nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[{nodeName:[\"article\",\"aside\",\"dl\",\"embed\",\"figcaption\",\"fieldset\",\"figure\",\"footer\",\"form\",\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\",\"header\",\"iframe\",\"li\",\"ol\",\"section\",\"ul\"]},{nodeName:\"img\",attributes:{alt:r}}]},note:{type:\"structure\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"aside\"]},option:{type:\"widget\",attributes:{allowed:[\"aria-selected\",\"aria-posinset\",\"aria-setsize\",\"aria-checked\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:[\"listbox\"],implicit:[\"option\"],unsupported:!1,allowedElements:[{nodeName:[\"button\",\"li\"]},{nodeName:\"input\",properties:{type:[\"checkbox\",\"button\"]}},{nodeName:\"a\",attributes:{href:r}}]},presentation:{type:\"structure\",attributes:null,owned:null,nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[{nodeName:[\"article\",\"aside\",\"dl\",\"embed\",\"figcaption\",\"fieldset\",\"figure\",\"footer\",\"form\",\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\",\"header\",\"iframe\",\"li\",\"ol\",\"section\",\"ul\"]},{nodeName:\"img\",attributes:{alt:r}}]},progressbar:{type:\"widget\",attributes:{allowed:[\"aria-valuetext\",\"aria-valuenow\",\"aria-valuemax\",\"aria-valuemin\",\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"progress\"],unsupported:!1},radio:{type:\"widget\",attributes:{allowed:[\"aria-selected\",\"aria-posinset\",\"aria-setsize\",\"aria-required\",\"aria-errormessage\"],required:[\"aria-checked\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:null,implicit:['input[type=\"radio\"]'],unsupported:!1,allowedElements:[{nodeName:[\"button\",\"li\"]},{nodeName:\"input\",properties:{type:[\"image\",\"button\"]}}]},radiogroup:{type:\"composite\",attributes:{allowed:[\"aria-activedescendant\",\"aria-required\",\"aria-expanded\",\"aria-readonly\",\"aria-errormessage\"]},owned:{all:[\"radio\"]},nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:{nodeName:[\"ol\",\"ul\"]}},range:{nameFrom:[\"author\"],type:\"abstract\",unsupported:!1},region:{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"section[aria-label]\",\"section[aria-labelledby]\",\"section[title]\"],unsupported:!1,allowedElements:{nodeName:[\"article\",\"aside\"]}},roletype:{type:\"abstract\",unsupported:!1},row:{type:\"structure\",attributes:{allowed:[\"aria-activedescendant\",\"aria-colindex\",\"aria-expanded\",\"aria-level\",\"aria-selected\",\"aria-rowindex\",\"aria-errormessage\"]},owned:{one:[\"cell\",\"columnheader\",\"rowheader\",\"gridcell\"]},nameFrom:[\"author\",\"contents\"],context:[\"rowgroup\",\"grid\",\"treegrid\",\"table\"],implicit:[\"tr\"],unsupported:!1},rowgroup:{type:\"structure\",attributes:{allowed:[\"aria-activedescendant\",\"aria-expanded\",\"aria-errormessage\"]},owned:{all:[\"row\"]},nameFrom:[\"author\",\"contents\"],context:[\"grid\",\"table\"],implicit:[\"tbody\",\"thead\",\"tfoot\"],unsupported:!1},rowheader:{type:\"structure\",attributes:{allowed:[\"aria-colindex\",\"aria-colspan\",\"aria-expanded\",\"aria-rowindex\",\"aria-rowspan\",\"aria-required\",\"aria-readonly\",\"aria-selected\",\"aria-sort\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:[\"row\"],implicit:[\"th\"],unsupported:!1},scrollbar:{type:\"widget\",attributes:{required:[\"aria-controls\",\"aria-valuenow\",\"aria-valuemax\",\"aria-valuemin\"],allowed:[\"aria-valuetext\",\"aria-orientation\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,unsupported:!1},search:{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:{nodeName:[\"aside\",\"form\",\"section\"]}},searchbox:{type:\"widget\",attributes:{allowed:[\"aria-activedescendant\",\"aria-autocomplete\",\"aria-multiline\",\"aria-readonly\",\"aria-required\",\"aria-placeholder\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:['input[type=\"search\"]'],unsupported:!1,allowedElements:{nodeName:\"input\",properties:{type:\"text\"}}},section:{nameFrom:[\"author\",\"contents\"],type:\"abstract\",unsupported:!1},sectionhead:{nameFrom:[\"author\",\"contents\"],type:\"abstract\",unsupported:!1},select:{nameFrom:[\"author\"],type:\"abstract\",unsupported:!1},separator:{type:\"structure\",attributes:{allowed:[\"aria-expanded\",\"aria-orientation\",\"aria-valuenow\",\"aria-valuemax\",\"aria-valuemin\",\"aria-valuetext\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"hr\"],unsupported:!1,allowedElements:[\"li\"]},slider:{type:\"widget\",attributes:{allowed:[\"aria-valuetext\",\"aria-orientation\",\"aria-readonly\",\"aria-errormessage\"],required:[\"aria-valuenow\",\"aria-valuemax\",\"aria-valuemin\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:['input[type=\"range\"]'],unsupported:!1},spinbutton:{type:\"widget\",attributes:{allowed:[\"aria-valuetext\",\"aria-required\",\"aria-readonly\",\"aria-errormessage\"],required:[\"aria-valuenow\",\"aria-valuemax\",\"aria-valuemin\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:['input[type=\"number\"]'],unsupported:!1,allowedElements:{nodeName:\"input\",properties:{type:\"text\"}}},status:{type:\"widget\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"output\"],unsupported:!1,allowedElements:[\"section\"]},structure:{type:\"abstract\",unsupported:!1},switch:{type:\"widget\",attributes:{allowed:[\"aria-errormessage\"],required:[\"aria-checked\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:null,unsupported:!1,allowedElements:[\"button\",{nodeName:\"input\",properties:{type:[\"checkbox\",\"image\",\"button\"]}},{nodeName:\"a\",attributes:{href:r}}]},tab:{type:\"widget\",attributes:{allowed:[\"aria-selected\",\"aria-expanded\",\"aria-setsize\",\"aria-posinset\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:[\"tablist\"],unsupported:!1,allowedElements:[{nodeName:[\"button\",\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\",\"li\"]},{nodeName:\"input\",properties:{type:\"button\"}},{nodeName:\"a\",attributes:{href:r}}]},table:{type:\"structure\",attributes:{allowed:[\"aria-colcount\",\"aria-rowcount\",\"aria-errormessage\"]},owned:{one:[\"rowgroup\",\"row\"]},nameFrom:[\"author\"],context:null,implicit:[\"table\"],unsupported:!1},tablist:{type:\"composite\",attributes:{allowed:[\"aria-activedescendant\",\"aria-expanded\",\"aria-level\",\"aria-multiselectable\",\"aria-orientation\",\"aria-errormessage\"]},owned:{all:[\"tab\"]},nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"ol\",\"ul\"]},tabpanel:{type:\"widget\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},term:{type:\"structure\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:null,implicit:[\"dt\"],unsupported:!1},textbox:{type:\"widget\",attributes:{allowed:[\"aria-activedescendant\",\"aria-autocomplete\",\"aria-multiline\",\"aria-readonly\",\"aria-required\",\"aria-placeholder\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:['input[type=\"text\"]','input[type=\"email\"]','input[type=\"password\"]','input[type=\"tel\"]','input[type=\"url\"]',\"input:not([type])\",\"textarea\"],unsupported:!1},timer:{type:\"widget\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,unsupported:!1},toolbar:{type:\"structure\",attributes:{allowed:[\"aria-activedescendant\",\"aria-expanded\",\"aria-orientation\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:['menu[type=\"toolbar\"]'],unsupported:!1,allowedElements:[\"ol\",\"ul\"]},tooltip:{type:\"widget\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:null,unsupported:!1},tree:{type:\"composite\",attributes:{allowed:[\"aria-activedescendant\",\"aria-multiselectable\",\"aria-required\",\"aria-expanded\",\"aria-orientation\",\"aria-errormessage\"]},owned:{all:[\"treeitem\"]},nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"ol\",\"ul\"]},treegrid:{type:\"composite\",attributes:{allowed:[\"aria-activedescendant\",\"aria-colcount\",\"aria-expanded\",\"aria-level\",\"aria-multiselectable\",\"aria-readonly\",\"aria-required\",\"aria-rowcount\",\"aria-orientation\",\"aria-errormessage\"]},owned:{one:[\"rowgroup\",\"row\"]},nameFrom:[\"author\"],context:null,unsupported:!1},treeitem:{type:\"widget\",attributes:{allowed:[\"aria-checked\",\"aria-selected\",\"aria-expanded\",\"aria-level\",\"aria-posinset\",\"aria-setsize\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:[\"group\",\"tree\"],unsupported:!1,allowedElements:[\"li\",{nodeName:\"a\",attributes:{href:r}}]},widget:{type:\"abstract\",unsupported:!1},window:{nameFrom:[\"author\"],type:\"abstract\",unsupported:!1}},e.elementsAllowedNoRole=[{nodeName:[\"base\",\"body\",\"caption\",\"col\",\"colgroup\",\"datalist\",\"dd\",\"details\",\"dt\",\"head\",\"html\",\"keygen\",\"label\",\"legend\",\"main\",\"map\",\"math\",\"meta\",\"meter\",\"noscript\",\"optgroup\",\"param\",\"picture\",\"progress\",\"script\",\"source\",\"style\",\"template\",\"textarea\",\"title\",\"track\"]},{nodeName:\"area\",attributes:{href:r}},{nodeName:\"input\",properties:{type:[\"color\",\"data\",\"datatime\",\"file\",\"hidden\",\"month\",\"number\",\"password\",\"range\",\"reset\",\"submit\",\"time\",\"week\"]}},{nodeName:\"input\",attributes:{list:t},properties:{type:[\"email\",\"search\",\"tel\",\"url\"]}},{nodeName:\"link\",attributes:{href:r}},{nodeName:\"menu\",attributes:{type:\"context\"}},{nodeName:\"menuitem\",attributes:{type:[\"command\",\"checkbox\",\"radio\"]}},{nodeName:\"select\",condition:function(e){return 1<Number(e.getAttribute(\"size\"))},properties:{multiple:!0}},{nodeName:[\"clippath\",\"cursor\",\"defs\",\"desc\",\"feblend\",\"fecolormatrix\",\"fecomponenttransfer\",\"fecomposite\",\"feconvolvematrix\",\"fediffuselighting\",\"fedisplacementmap\",\"fedistantlight\",\"fedropshadow\",\"feflood\",\"fefunca\",\"fefuncb\",\"fefuncg\",\"fefuncr\",\"fegaussianblur\",\"feimage\",\"femerge\",\"femergenode\",\"femorphology\",\"feoffset\",\"fepointlight\",\"fespecularlighting\",\"fespotlight\",\"fetile\",\"feturbulence\",\"filter\",\"hatch\",\"hatchpath\",\"lineargradient\",\"marker\",\"mask\",\"meshgradient\",\"meshpatch\",\"meshrow\",\"metadata\",\"mpath\",\"pattern\",\"radialgradient\",\"solidcolor\",\"stop\",\"switch\",\"view\"]}],e.elementsAllowedAnyRole=[{nodeName:\"a\",attributes:{href:t}},{nodeName:[\"abbr\",\"address\",\"canvas\",\"div\",\"p\",\"pre\",\"blockquote\",\"ins\",\"del\",\"output\",\"span\",\"table\",\"tbody\",\"thead\",\"tfoot\",\"td\",\"em\",\"strong\",\"small\",\"s\",\"cite\",\"q\",\"dfn\",\"abbr\",\"time\",\"code\",\"var\",\"samp\",\"kbd\",\"sub\",\"sup\",\"i\",\"b\",\"u\",\"mark\",\"ruby\",\"rt\",\"rp\",\"bdi\",\"bdo\",\"br\",\"wbr\",\"th\",\"tr\"]}],e.evaluateRoleForElement={A:function(e){var t=e.node,r=e.out;return\"http://www.w3.org/2000/svg\"===t.namespaceURI||(!t.href.length||r)},AREA:function(e){return!e.node.href},BUTTON:function(e){var t=e.node,r=e.role,n=e.out;return\"menu\"===t.getAttribute(\"type\")?\"menuitem\"===r:n},IMG:function(e){var t=e.node,r=e.out;return t.alt?!r:r},INPUT:function(e){var t=e.node,r=e.role,n=e.out;switch(t.type){case\"button\":case\"image\":return n;case\"checkbox\":return!(\"button\"!==r||!t.hasAttribute(\"aria-pressed\"))||n;case\"radio\":return\"menuitemradio\"===r;case\"text\":return\"combobox\"===r||\"searchbox\"===r||\"spinbutton\"===r;default:return!1}},LI:function(e){var t=e.node,r=e.out;return!axe.utils.matchesSelector(t,\"ol li, ul li\")||r},MENU:function(e){return\"context\"!==e.node.getAttribute(\"type\")},OPTION:function(e){var t=e.node;return!axe.utils.matchesSelector(t,\"select > option, datalist > option, optgroup > option\")},SELECT:function(e){var t=e.node,r=e.role;return!t.multiple&&t.size<=1&&\"menu\"===r},SVG:function(e){var t=e.node,r=e.out;return!(!t.parentNode||\"http://www.w3.org/2000/svg\"!==t.parentNode.namespaceURI)||r}},e.rolesOfType={widget:[\"button\",\"checkbox\",\"dialog\",\"gridcell\",\"heading\",\"link\",\"log\",\"marquee\",\"menuitem\",\"menuitemcheckbox\",\"menuitemradio\",\"option\",\"progressbar\",\"radio\",\"scrollbar\",\"slider\",\"spinbutton\",\"status\",\"switch\",\"tab\",\"tabpanel\",\"textbox\",\"timer\",\"tooltip\",\"tree\",\"treeitem\"]};var c={};commons.color=c;var h=commons.dom={};function i(e,t){return i.fromDefinition(e,t)}commons.matches=i;var o=commons.table={},b=commons.text={EdgeFormDefaults:{}};commons.utils=axe.utils;function u(e){return e.getPropertyValue(\"font-family\").split(/[,;]/g).map(function(e){return e.trim().toLowerCase()})}l.arialabelText=function(e){return 1!==(e=e.actualNode||e).nodeType?\"\":e.getAttribute(\"aria-label\")||\"\"},l.arialabelledbyText=function(n){var a=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{};return 1!==(n=n.actualNode||n).nodeType||a.inLabelledByContext||a.inControlContext?\"\":h.idrefs(n,\"aria-labelledby\").filter(function(e){return e}).reduce(function(e,t){var r=b.accessibleText(t,T({inLabelledByContext:!0,startNode:a.startNode||n},a));return e?e+\" \"+r:r},\"\")},l.requiredAttr=function(e){var t=l.lookupTable.role[e];return t&&t.attributes&&t.attributes.required||[]},l.allowedAttr=function(e){var t=l.lookupTable.role[e],r=t&&t.attributes&&t.attributes.allowed||[],n=t&&t.attributes&&t.attributes.required||[];return r.concat(l.lookupTable.globalAttributes).concat(n)},l.validateAttr=function(e){return!!l.lookupTable.attributes[e]},l.getElementUnallowedRoles=function(t){var r=!(1<arguments.length&&void 0!==arguments[1])||arguments[1],n=t.nodeName.toUpperCase();if(!axe.utils.isHtmlElement(t))return[];var e=function(e){var t=[];if(!e)return t;if(e.hasAttribute(\"role\")){var r=axe.utils.tokenList(e.getAttribute(\"role\").toLowerCase());t=t.concat(r)}if(e.hasAttributeNS(\"http://www.idpf.org/2007/ops\",\"type\")){var n=axe.utils.tokenList(e.getAttributeNS(\"http://www.idpf.org/2007/ops\",\"type\").toLowerCase()).map(function(e){return\"doc-\"+e});t=t.concat(n)}return t=t.filter(function(e){return axe.commons.aria.isValidRole(e)})}(t),a=axe.commons.aria.implicitRole(t);return e.filter(function(e){return(!r||e!==a)&&(!(r||\"row\"===e&&\"TR\"===n&&axe.utils.matchesSelector(t,'table[role=\"grid\"] > tr'))||!l.isAriaRoleAllowedOnElement(t,e))})},l.getOwnedVirtual=function(e){var t=e.actualNode,r=e.children;if(!t||!r)throw new Error(\"getOwnedVirtual requires a virtual node\");return h.idrefs(t,\"aria-owns\").reduce(function(e,t){if(t){var r=axe.utils.getNodeFromTree(axe._tree[0],t);e.push(r)}return e},r)},l.getRole=function(e){var t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},r=t.noImplicit,n=t.fallback,a=t.abstracts,o=t.dpub;if(1!==(e=e.actualNode||e).nodeType)return null;var i=(e.getAttribute(\"role\")||\"\").trim().toLowerCase(),u=(n?axe.utils.tokenList(i):[i]).filter(function(e){return!(!o&&\"doc-\"===e.substr(0,4))&&l.isValidRole(e,{allowAbstract:a})})[0];return u||r?u||null:l.implicitRole(e)},l.isAccessibleRef=function(e){e=e.actualNode||e;var t=h.getRootNode(e);t=t.documentElement||t;var n=e.id,a=Object.keys(l.lookupTable.attributes).filter(function(e){var t=l.lookupTable.attributes[e].type;return/^idrefs?$/.test(t)});return void 0!==function e(t,r){if(r(t))return t;for(var n=0;n<t.children.length;n++){var a=e(t.children[n],r);if(a)return a}}(t,function(r){if(1===r.nodeType)return\"LABEL\"===r.nodeName.toUpperCase()&&r.getAttribute(\"for\")===n||a.filter(function(e){return r.hasAttribute(e)}).some(function(e){var t=r.getAttribute(e);return\"idref\"===l.lookupTable.attributes[e].type?t===n:axe.utils.tokenList(t).includes(n)})})},l.isAriaRoleAllowedOnElement=function(e,t){var r=e.nodeName.toUpperCase(),n=axe.commons.aria.lookupTable;if(i(e,n.elementsAllowedNoRole))return!1;if(i(e,n.elementsAllowedAnyRole))return!0;var a=n.role[t];if(!a||!a.allowedElements)return!1;var o=i(e,a.allowedElements);return Object.keys(n.evaluateRoleForElement).includes(r)?n.evaluateRoleForElement[r]({node:e,role:t,out:o}):o},l.isUnsupportedRole=function(e){var t=l.lookupTable.role[e];return!!t&&t.unsupported},l.labelVirtual=function(e){var t=e.actualNode,r=void 0;return t.getAttribute(\"aria-labelledby\")&&(r=h.idrefs(t,\"aria-labelledby\").map(function(e){var t=axe.utils.getNodeFromTree(axe._tree[0],e);return t?b.visibleVirtual(t,!0):\"\"}).join(\" \").trim())?r:(r=t.getAttribute(\"aria-label\"))&&(r=b.sanitize(r).trim())?r:null},l.label=function(e){return e=axe.utils.getNodeFromTree(axe._tree[0],e),l.labelVirtual(e)},l.namedFromContents=function(e){var t=(1<arguments.length&&void 0!==arguments[1]?arguments[1]:{}).strict;if(1!==(e=e.actualNode||e).nodeType)return!1;var r=l.getRole(e),n=l.lookupTable.role[r];return!!(n&&n.nameFrom.includes(\"contents\")||\"TABLE\"===e.nodeName.toUpperCase())||!t&&(!n||[\"presentation\",\"none\"].includes(r))},l.isValidRole=function(e){var t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},r=t.allowAbstract,n=t.flagUnsupported,a=void 0!==n&&n,o=l.lookupTable.role[e],i=!!o&&o.unsupported;return!(!o||a&&i)&&(!!r||\"abstract\"!==o.type)},l.getRolesWithNameFromContents=function(){return Object.keys(l.lookupTable.role).filter(function(e){return l.lookupTable.role[e].nameFrom&&-1!==l.lookupTable.role[e].nameFrom.indexOf(\"contents\")})},l.getRolesByType=function(t){return Object.keys(l.lookupTable.role).filter(function(e){return l.lookupTable.role[e].type===t})},l.getRoleType=function(e){var t=l.lookupTable.role[e];return t&&t.type||null},l.requiredOwned=function(e){\"use strict\";var t=null,r=l.lookupTable.role[e];return r&&(t=axe.utils.clone(r.owned)),t},l.requiredContext=function(e){\"use strict\";var t=null,r=l.lookupTable.role[e];return r&&(t=axe.utils.clone(r.context)),t},l.implicitNodes=function(e){\"use strict\";var t=null,r=l.lookupTable.role[e];return r&&r.implicit&&(t=axe.utils.clone(r.implicit)),t},l.implicitRole=function(r){\"use strict\";var e=Object.keys(l.lookupTable.role).map(function(e){var t=l.lookupTable.role[e];return{name:e,implicit:t&&t.implicit}}).reduce(function(e,t){return t.implicit&&t.implicit.some(function(e){return axe.utils.matchesSelector(r,e)})&&e.push(t.name),e},[]);if(!e.length)return null;for(var t,n,a=r.attributes,o=[],i=0,u=a.length;i<u;i++){var s=a[i];s.name.match(/^aria-/)&&o.push(s.name)}return(t=e,n=o,t.map(function(e){return{score:(t=e,l.allowedAttr(t).reduce(function(e,t){return e+(-1<n.indexOf(t)?1:0)},0)),name:e};var t}).sort(function(e,t){return t.score-e.score}).map(function(e){return e.name})).shift()},l.validateAttrValue=function(e,t){\"use strict\";var r,n,a=e.getAttribute(t),o=l.lookupTable.attributes[t],i=h.getRootNode(e);if(!o)return!0;if(o.allowEmpty&&(!a||\"\"===a.trim()))return!0;switch(o.type){case\"boolean\":case\"nmtoken\":return\"string\"==typeof a&&o.values.includes(a.toLowerCase());case\"nmtokens\":return(n=axe.utils.tokenList(a)).reduce(function(e,t){return e&&o.values.includes(t)},0!==n.length);case\"idref\":return!(!a||!i.getElementById(a));case\"idrefs\":return(n=axe.utils.tokenList(a)).some(function(e){return i.getElementById(e)});case\"string\":return\"\"!==a.trim();case\"decimal\":return!(!(r=a.match(/^[-+]?([0-9]*)\\.?([0-9]*)$/))||!r[1]&&!r[2]);case\"int\":return/^[-+]?[0-9]+$/.test(a)}},c.Color=function(e,t,r,n){this.red=e,this.green=t,this.blue=r,this.alpha=n,this.toHexString=function(){var e=Math.round(this.red).toString(16),t=Math.round(this.green).toString(16),r=Math.round(this.blue).toString(16);return\"#\"+(15.5<this.red?e:\"0\"+e)+(15.5<this.green?t:\"0\"+t)+(15.5<this.blue?r:\"0\"+r)};var a=/^rgb\\((\\d+), (\\d+), (\\d+)\\)$/,o=/^rgba\\((\\d+), (\\d+), (\\d+), (\\d*(\\.\\d+)?)\\)/;this.parseRgbString=function(e){if(\"transparent\"===e)return this.red=0,this.green=0,this.blue=0,void(this.alpha=0);var t=e.match(a);return t?(this.red=parseInt(t[1],10),this.green=parseInt(t[2],10),this.blue=parseInt(t[3],10),void(this.alpha=1)):(t=e.match(o))?(this.red=parseInt(t[1],10),this.green=parseInt(t[2],10),this.blue=parseInt(t[3],10),void(this.alpha=parseFloat(t[4]))):void 0},this.getRelativeLuminance=function(){var e=this.red/255,t=this.green/255,r=this.blue/255;return.2126*(e<=.03928?e/12.92:Math.pow((e+.055)/1.055,2.4))+.7152*(t<=.03928?t/12.92:Math.pow((t+.055)/1.055,2.4))+.0722*(r<=.03928?r/12.92:Math.pow((r+.055)/1.055,2.4))}},c.flattenColors=function(e,t){var r=e.alpha,n=(1-r)*t.red+r*e.red,a=(1-r)*t.green+r*e.green,o=(1-r)*t.blue+r*e.blue,i=e.alpha+t.alpha*(1-e.alpha);return new c.Color(n,a,o,i)},c.getContrast=function(e,t){if(!t||!e)return null;t.alpha<1&&(t=c.flattenColors(t,e));var r=e.getRelativeLuminance(),n=t.getRelativeLuminance();return(Math.max(n,r)+.05)/(Math.min(n,r)+.05)},c.hasValidContrastRatio=function(e,t,r,n){var a=c.getContrast(e,t),o=n&&Math.ceil(72*r)/96<14||!n&&Math.ceil(72*r)/96<18?4.5:3;return{isValid:o<a,contrastRatio:a,expectedContrastRatio:o}},c.elementIsDistinct=function(e,t){var n=window.getComputedStyle(e);if(\"none\"!==n.getPropertyValue(\"background-image\"))return!0;if([\"border-bottom\",\"border-top\",\"outline\"].reduce(function(e,t){var r=new c.Color;return r.parseRgbString(n.getPropertyValue(t+\"-color\")),e||\"none\"!==n.getPropertyValue(t+\"-style\")&&0<parseFloat(n.getPropertyValue(t+\"-width\"))&&0!==r.alpha},!1))return!0;var r=window.getComputedStyle(t);if(u(n)[0]!==u(r)[0])return!0;var a=[\"text-decoration-line\",\"text-decoration-style\",\"font-weight\",\"font-style\",\"font-size\"].reduce(function(e,t){return e||n.getPropertyValue(t)!==r.getPropertyValue(t)},!1),o=n.getPropertyValue(\"text-decoration\");return o.split(\" \").length<3&&(a=a||o!==r.getPropertyValue(\"text-decoration\")),a};var n,s=[\"IMG\",\"CANVAS\",\"OBJECT\",\"IFRAME\",\"VIDEO\",\"SVG\"];function d(e,t){var r=e.nodeName.toUpperCase();if(s.includes(r))return axe.commons.color.incompleteData.set(\"bgColor\",\"imgNode\"),!0;var n=(t=t||window.getComputedStyle(e)).getPropertyValue(\"background-image\"),a=\"none\"!==n;if(a){var o=/gradient/.test(n);axe.commons.color.incompleteData.set(\"bgColor\",o?\"bgGradient\":\"bgImage\")}return a}function m(e,t){t=t||window.getComputedStyle(e);var r=new c.Color;if(r.parseRgbString(t.getPropertyValue(\"background-color\")),0!==r.alpha){var n=t.getPropertyValue(\"opacity\");r.alpha=r.alpha*n}return r}function p(e,t){var r=e.getClientRects()[0],n=h.shadowElementsFromPoint(r.left,r.top);if(n)for(var a=0;a<n.length;a++)if(n[a]!==e&&n[a]===t)return!0;return!1}c.getCoords=function(e){if(!(e.left>window.innerWidth||e.top>window.innerHeight))return{x:Math.min(Math.ceil(e.left+e.width/2),window.innerWidth-1),y:Math.min(Math.ceil(e.top+e.height/2),window.innerHeight-1)}},c.getRectStack=function(e){var t=c.getCoords(e.getBoundingClientRect());if(!t)return null;var r=h.shadowElementsFromPoint(t.x,t.y),n=Array.from(e.getClientRects());if(!n||n.length<=1)return[r];var a=n.filter(function(e){return e.width&&0<e.width}).map(function(e){var t=c.getCoords(e);if(t)return h.shadowElementsFromPoint(t.x,t.y)});return a.some(function(e){return void 0===e})?null:(a.splice(0,0,r),a)},c.filteredRectStack=function(a){var o=c.getRectStack(a);if(o&&1===o.length)return o[0];if(o&&1<o.length){var i=o.shift(),u=void 0;return o.forEach(function(e,t){if(0!==t){var r=o[t-1],n=o[t];u=r.every(function(e,t){return e===n[t]})||i.includes(a)}}),u?o[0]:(axe.commons.color.incompleteData.set(\"bgColor\",\"elmPartiallyObscuring\"),null)}return axe.commons.color.incompleteData.set(\"bgColor\",\"outsideViewport\"),null},c.getBackgroundStack=function(e){var t,r,n,a=c.filteredRectStack(e);if(null===a)return null;a=function(e,t){var r={TD:[\"TR\",\"TBODY\"],TH:[\"TR\",\"THEAD\"],INPUT:[\"LABEL\"]},n=e.map(function(e){return e.nodeName}),a=e;for(var o in r)if(n.includes(o))for(var i in r[o])if(o.hasOwnProperty(i)){var u=axe.commons.dom.findUp(t,r[o][i]);u&&-1===e.indexOf(u)&&axe.commons.dom.visuallyOverlaps(t.getBoundingClientRect(),u)&&a.splice(n.indexOf(o)+1,0,u),t.nodeName===r[o][i]&&-1===n.indexOf(t.nodeName)&&a.splice(n.indexOf(o)+1,0,t)}return a}(a,e),a=h.reduceToElementsBelowFloating(a,e),r=(t=a).indexOf(document.body),n=t,1<r&&!d(document.documentElement)&&0===m(document.documentElement).alpha&&(n.splice(r,1),n.splice(t.indexOf(document.documentElement),1),n.push(document.body));var o=(a=n).indexOf(e);return.99<=function(e,t,r){var n=0;if(0<e)for(var a=e-1;0<=a;a--){var o=t[a],i=m(o,window.getComputedStyle(o));i.alpha&&p(r,o)?n+=i.alpha:t.splice(a,1)}return n}(o,a,e)?(axe.commons.color.incompleteData.set(\"bgColor\",\"bgOverlap\"),null):-1!==o?a:null},c.getBackgroundColor=function(u){var s=1<arguments.length&&void 0!==arguments[1]?arguments[1]:[];if(!0!==(2<arguments.length&&void 0!==arguments[2]&&arguments[2])){var e=u.getBoundingClientRect().height-2>=2*window.innerHeight;u.scrollIntoView(e)}var l=[],t=c.getBackgroundStack(u);return(t||[]).some(function(e){var t,r,n,a,o=window.getComputedStyle(e),i=m(e,o);return n=i,(a=(t=u)!==(r=e)&&!h.visuallyContains(t,r)&&0!==n.alpha)&&axe.commons.color.incompleteData.set(\"bgColor\",\"elmPartiallyObscured\"),a||d(e,o)?(l=null,s.push(e),!0):0!==i.alpha&&(s.push(e),l.push(i),1===i.alpha)}),null===l||null===t?null:(l.push(new c.Color(255,255,255,1)),l.reduce(c.flattenColors))},h.isOpaque=function(e){var t=window.getComputedStyle(e);return d(e,t)||1===m(e,t).alpha},c.getForegroundColor=function(e,t){var r=window.getComputedStyle(e),n=new c.Color;n.parseRgbString(r.getPropertyValue(\"color\"));var a=r.getPropertyValue(\"opacity\");if(n.alpha=n.alpha*a,1===n.alpha)return n;var o=c.getBackgroundColor(e,[],t);if(null!==o)return c.flattenColors(n,o);var i=axe.commons.color.incompleteData.get(\"bgColor\");return axe.commons.color.incompleteData.set(\"fgColor\",i),null},c.incompleteData=(n={},{set:function(e,t){if(\"string\"!=typeof e)throw new Error(\"Incomplete data: key must be a string\");return t&&(n[e]=t),n[e]},get:function(e){return n[e]},clear:function(){n={}}}),h.reduceToElementsBelowFloating=function(e,t){var r,n,a,o=[\"fixed\",\"sticky\"],i=[],u=!1;for(r=0;r<e.length;++r)(n=e[r])===t&&(u=!0),a=window.getComputedStyle(n),u||-1===o.indexOf(a.position)?i.push(n):i=[];return i},h.findElmsInContext=function(e){var t=e.context,r=e.value,n=e.attr,a=e.elm,o=void 0===a?\"\":a,i=void 0,u=axe.utils.escapeSelector(r);return i=9===t.nodeType||11===t.nodeType?t:h.getRootNode(t),Array.from(i.querySelectorAll(o+\"[\"+n+\"=\"+u+\"]\"))},h.findUp=function(e,t){return h.findUpVirtual(axe.utils.getNodeFromTree(axe._tree[0],e),t)},h.findUpVirtual=function(e,t){var r=void 0;if(r=e.actualNode,!e.shadowId&&\"function\"==typeof e.actualNode.closest){var n=e.actualNode.closest(t);return n||null}for(;(r=r.assignedSlot?r.assignedSlot:r.parentNode)&&11===r.nodeType&&(r=r.host),r&&!axe.utils.matchesSelector(r,t)&&r!==document.documentElement;);return axe.utils.matchesSelector(r,t)?r:null},h.getComposedParent=function e(t){if(t.assignedSlot)return e(t.assignedSlot);if(t.parentNode){var r=t.parentNode;if(1===r.nodeType)return r;if(r.host)return r.host}return null},h.getElementByReference=function(e,t){var r=e.getAttribute(t);if(!r)return null;\"#\"===r.charAt(0)?r=decodeURIComponent(r.substring(1)):\"/#\"===r.substr(0,2)&&(r=decodeURIComponent(r.substring(2)));var n=document.getElementById(r);return n||((n=document.getElementsByName(r)).length?n[0]:null)},h.getElementCoordinates=function(e){\"use strict\";var t=h.getScrollOffset(document),r=t.left,n=t.top,a=e.getBoundingClientRect();return{top:a.top+n,right:a.right+r,bottom:a.bottom+n,left:a.left+r,width:a.right-a.left,height:a.bottom-a.top}},h.getRootNode=axe.utils.getRootNode,h.getScrollOffset=function(e){\"use strict\";if(!e.nodeType&&e.document&&(e=e.document),9!==e.nodeType)return{left:e.scrollLeft,top:e.scrollTop};var t=e.documentElement,r=e.body;return{left:t&&t.scrollLeft||r&&r.scrollLeft||0,top:t&&t.scrollTop||r&&r.scrollTop||0}},h.getTabbableElements=function(e){return axe.utils.querySelectorAll(e,\"*\").filter(function(e){var t=e.isFocusable,r=e.actualNode.getAttribute(\"tabindex\");return(r=r&&!isNaN(parseInt(r,10))?parseInt(r):null)?t&&0<=r:t})},h.getViewportSize=function(e){\"use strict\";var t,r=e.document,n=r.documentElement;return e.innerWidth?{width:e.innerWidth,height:e.innerHeight}:n?{width:n.clientWidth,height:n.clientHeight}:{width:(t=r.body).clientWidth,height:t.clientHeight}};var a=[\"HEAD\",\"TITLE\",\"TEMPLATE\",\"SCRIPT\",\"STYLE\",\"IFRAME\",\"OBJECT\",\"VIDEO\",\"AUDIO\",\"NOSCRIPT\"];function f(e){return e.disabled||h.isHiddenWithCSS(e)&&\"AREA\"!==e.nodeName.toUpperCase()}h.hasContentVirtual=function(e,t){return function(e){if(!a.includes(e.actualNode.nodeName.toUpperCase()))return e.children.some(function(e){var t=e.actualNode;return 3===t.nodeType&&t.nodeValue.trim()})}(e)||h.isVisualContent(e.actualNode)||!!l.labelVirtual(e)||!t&&e.children.some(function(e){return 1===e.actualNode.nodeType&&h.hasContentVirtual(e)})},h.hasContent=function(e,t){return e=axe.utils.getNodeFromTree(axe._tree[0],e),h.hasContentVirtual(e,t)},h.idrefs=function(e,t){\"use strict\";var r,n,a=h.getRootNode(e),o=[],i=e.getAttribute(t);if(i)for(r=0,n=(i=axe.utils.tokenList(i)).length;r<n;r++)o.push(a.getElementById(i[r]));return o},h.isFocusable=function(e){\"use strict\";if(f(e))return!1;if(h.isNativelyFocusable(e))return!0;var t=e.getAttribute(\"tabindex\");return!(!t||isNaN(parseInt(t,10)))},h.isNativelyFocusable=function(e){\"use strict\";if(!e||f(e))return!1;switch(e.nodeName.toUpperCase()){case\"A\":case\"AREA\":if(e.href)return!0;break;case\"INPUT\":return\"hidden\"!==e.type;case\"TEXTAREA\":case\"SELECT\":case\"DETAILS\":case\"BUTTON\":return!0}return!1},h.insertedIntoFocusOrder=function(e){return-1<e.tabIndex&&h.isFocusable(e)&&!h.isNativelyFocusable(e)},h.isHiddenWithCSS=function(e,t){if(9===e.nodeType)return!1;if(11===e.nodeType&&(e=e.host),[\"STYLE\",\"SCRIPT\"].includes(e.nodeName.toUpperCase()))return!1;var r=window.getComputedStyle(e,null);if(!r)throw new Error(\"Style does not exist for the given element.\");if(\"none\"===r.getPropertyValue(\"display\"))return!0;var n=[\"hidden\",\"collapse\"],a=r.getPropertyValue(\"visibility\");if(n.includes(a)&&!t)return!0;if(n.includes(a)&&t&&n.includes(t))return!0;var o=h.getComposedParent(e);return!(!o||n.includes(a))&&h.isHiddenWithCSS(o,a)},h.isHTML5=function(e){var t=e.doctype;return null!==t&&(\"html\"===t.name&&!t.publicId&&!t.systemId)};var g=[\"block\",\"list-item\",\"table\",\"flex\",\"grid\",\"inline-block\"];function y(e){var t=window.getComputedStyle(e).getPropertyValue(\"display\");return g.includes(t)||\"table-\"===t.substr(0,6)}h.isInTextBlock=function(r){if(y(r))return!1;var e=function(e){for(var t=h.getComposedParent(e);t&&!y(t);)t=h.getComposedParent(t);return axe.utils.getNodeFromTree(axe._tree[0],t)}(r),n=\"\",a=\"\",o=0;return function t(e,r){!1!==r(e.actualNode)&&e.children.forEach(function(e){return t(e,r)})}(e,function(e){if(2===o)return!1;if(3===e.nodeType&&(n+=e.nodeValue),1===e.nodeType){var t=(e.nodeName||\"\").toUpperCase();if([\"BR\",\"HR\"].includes(t))0===o?a=n=\"\":o=2;else{if(\"none\"===e.style.display||\"hidden\"===e.style.overflow||![\"\",null,\"none\"].includes(e.style.float)||![\"\",null,\"relative\"].includes(e.style.position))return!1;if(\"A\"===t&&e.href||\"link\"===(e.getAttribute(\"role\")||\"\").toLowerCase())return e===r&&(o=1),a+=e.textContent,!1}}}),n=axe.commons.text.sanitize(n),a=axe.commons.text.sanitize(a),n.length>a.length},h.isNode=function(e){\"use strict\";return e instanceof Node},h.isOffscreen=function(e){var t=void 0,r=document.documentElement,n=window.getComputedStyle(e),a=window.getComputedStyle(document.body||r).getPropertyValue(\"direction\"),o=h.getElementCoordinates(e);if(o.bottom<0&&(function(e,t){for(e=h.getComposedParent(e);e&&\"html\"!==e.nodeName.toLowerCase();){if(e.scrollTop&&0<=(t+=e.scrollTop))return!1;e=h.getComposedParent(e)}return!0}(e,o.bottom)||\"absolute\"===n.position))return!0;if(0===o.left&&0===o.right)return!1;if(\"ltr\"===a){if(o.right<=0)return!0}else if(t=Math.max(r.scrollWidth,h.getViewportSize(window).width),o.left>=t)return!0;return!1},h.isVisible=function(e,t,r){\"use strict\";var n,a,o,i,u;return 9===e.nodeType||(11===e.nodeType&&(e=e.host),null!==(n=window.getComputedStyle(e,null))&&(a=e.nodeName.toUpperCase(),!(\"none\"===n.getPropertyValue(\"display\")||[\"STYLE\",\"SCRIPT\",\"NOSCRIPT\",\"TEMPLATE\"].includes(a)||!t&&(i=n.getPropertyValue(\"clip\"),(u=i.match(/rect\\s*\\(([0-9]+)px,?\\s*([0-9]+)px,?\\s*([0-9]+)px,?\\s*([0-9]+)px\\s*\\)/))&&5===u.length&&u[3]-u[1]<=0&&u[2]-u[4]<=0)||!r&&(\"hidden\"===n.getPropertyValue(\"visibility\")||!t&&h.isOffscreen(e))||t&&\"true\"===e.getAttribute(\"aria-hidden\"))&&(!!(o=e.assignedSlot?e.assignedSlot:e.parentNode)&&h.isVisible(o,t,!0))))};var v=[\"checkbox\",\"img\",\"radio\",\"range\",\"slider\",\"spinbutton\",\"textbox\"];h.isVisualContent=function(e){var t=e.getAttribute(\"role\");if(t)return-1!==v.indexOf(t);switch(e.nodeName.toUpperCase()){case\"IMG\":case\"IFRAME\":case\"OBJECT\":case\"VIDEO\":case\"AUDIO\":case\"CANVAS\":case\"SVG\":case\"MATH\":case\"BUTTON\":case\"SELECT\":case\"TEXTAREA\":case\"KEYGEN\":case\"PROGRESS\":case\"METER\":return!0;case\"INPUT\":return\"hidden\"!==e.type;default:return!1}},h.shadowElementsFromPoint=function(n,a){var t=2<arguments.length&&void 0!==arguments[2]?arguments[2]:document,o=3<arguments.length&&void 0!==arguments[3]?arguments[3]:0;if(999<o)throw new Error(\"Infinite loop detected\");return Array.from(t.elementsFromPoint(n,a)).filter(function(e){return h.getRootNode(e)===t}).reduce(function(e,t){if(axe.utils.isShadowRoot(t)){var r=h.shadowElementsFromPoint(n,a,t.shadowRoot,o+1);(e=e.concat(r)).length&&axe.commons.dom.visuallyContains(e[0],t)&&e.push(t)}else e.push(t);return e},[])},h.visuallyContains=function(e,t){var r=e.getBoundingClientRect(),n=r.top+.01,a=r.bottom-.01,o=r.left+.01,i=r.right-.01,u=t.getBoundingClientRect(),s=u.top,l=u.left,c=s-t.scrollTop,d=s-t.scrollTop+t.scrollHeight,m=l-t.scrollLeft,p=l-t.scrollLeft+t.scrollWidth,f=window.getComputedStyle(t);return\"inline\"===f.getPropertyValue(\"display\")||!(o<m&&o<u.left||n<c&&n<u.top||p<i&&i>u.right||d<a&&a>u.bottom)&&(!(i>u.right||a>u.bottom)||(\"scroll\"===f.overflow||\"auto\"===f.overflow||\"hidden\"===f.overflow||t instanceof HTMLBodyElement||t instanceof HTMLHtmlElement))},h.visuallyOverlaps=function(e,t){var r=t.getBoundingClientRect(),n=r.top,a=r.left,o=n-t.scrollTop,i=n-t.scrollTop+t.scrollHeight,u=a-t.scrollLeft,s=a-t.scrollLeft+t.scrollWidth;if(e.left>s&&e.left>r.right||e.top>i&&e.top>r.bottom||e.right<u&&e.right<r.left||e.bottom<o&&e.bottom<r.top)return!1;var l=window.getComputedStyle(t);return!(e.left>r.right||e.top>r.bottom)||(\"scroll\"===l.overflow||\"auto\"===l.overflow||t instanceof HTMLBodyElement||t instanceof HTMLHtmlElement)},i.attributes=function(t,e){return t=t.actualNode||t,i.fromFunction(function(e){return t.getAttribute(e)},e)},i.condition=function(e,t){return!!t(e)};var D=[\"nodeName\",\"attributes\",\"properties\",\"condition\"];i.fromDefinition=function(n,a){return n=n.actualNode||n,Array.isArray(a)?a.some(function(e){return i(n,e)}):\"string\"==typeof a?axe.utils.matchesSelector(n,a):Object.keys(a).every(function(e){if(!D.includes(e))throw new Error('Unknown matcher type \"'+e+'\"');var t=i[e],r=a[e];return t(n,r)})},i.fromFunction=function(t,r){if(\"object\"!==(void 0===r?\"undefined\":N(r))||Array.isArray(r)||r instanceof RegExp)throw new Error(\"Expect matcher to be an object\");return Object.keys(r).every(function(e){return i.fromPrimative(t(e),r[e])})},i.fromPrimative=function(e,t){var r=void 0===t?\"undefined\":N(t);return Array.isArray(t)&&void 0!==e?t.includes(e):\"function\"===r?!!t(e):t instanceof RegExp?t.test(e):t===e};var w=void 0;function k(e){var t=e.actualNode;return 3!==t.nodeType?\"\":t.textContent}i.nodeName=function(e,t){var r=(2<arguments.length&&void 0!==arguments[2]?arguments[2]:{}).isXHTML;if(e=e.actualNode||e,void 0===r){if(\"string\"==typeof t)return axe.utils.matchesSelector(e,t);void 0===w&&(w=axe.utils.isXHTML(e.ownerDocument)),r=w}var n=r?e.nodeName:e.nodeName.toLowerCase();return i.fromPrimative(n,t)},i.properties=function(t,e){return t=t.actualNode||t,i.fromFunction(function(e){return t[e]},e)},o.getAllCells=function(e){var t,r,n,a,o=[];for(t=0,n=e.rows.length;t<n;t++)for(r=0,a=e.rows[t].cells.length;r<a;r++)o.push(e.rows[t].cells[r]);return o},o.getCellPosition=function(e,t){var r,n;for(t||(t=o.toGrid(h.findUp(e,\"table\"))),r=0;r<t.length;r++)if(t[r]&&-1!==(n=t[r].indexOf(e)))return{x:n,y:r}},o.getHeaders=function(e){if(e.hasAttribute(\"headers\"))return commons.dom.idrefs(e,\"headers\");var t=commons.table.toGrid(commons.dom.findUp(e,\"table\")),r=commons.table.getCellPosition(e,t),n=o.traverse(\"left\",r,t).filter(function(e){return o.isRowHeader(e)}),a=o.traverse(\"up\",r,t).filter(function(e){return o.isColumnHeader(e)});return[].concat(n,a).reverse()},o.getScope=function(e){var t=e.getAttribute(\"scope\"),r=e.getAttribute(\"role\");if(e instanceof Element==!1||-1===[\"TD\",\"TH\"].indexOf(e.nodeName.toUpperCase()))throw new TypeError(\"Expected TD or TH element\");if(\"columnheader\"===r)return\"col\";if(\"rowheader\"===r)return\"row\";if(\"col\"===t||\"row\"===t)return t;if(\"TH\"!==e.nodeName.toUpperCase())return!1;var n=o.toGrid(h.findUp(e,\"table\")),a=o.getCellPosition(e);return n[a.y].reduce(function(e,t){return e&&\"TH\"===t.nodeName.toUpperCase()},!0)?\"col\":n.map(function(e){return e[a.x]}).reduce(function(e,t){return e&&t&&\"TH\"===t.nodeName.toUpperCase()},!0)?\"row\":\"auto\"},o.isColumnHeader=function(e){return-1!==[\"col\",\"auto\"].indexOf(o.getScope(e))},o.isDataCell=function(e){if(!e.children.length&&!e.textContent.trim())return!1;var t=e.getAttribute(\"role\");return axe.commons.aria.isValidRole(t)?[\"cell\",\"gridcell\"].includes(t):\"TD\"===e.nodeName.toUpperCase()},o.isDataTable=function(e){var t=(e.getAttribute(\"role\")||\"\").toLowerCase();if((\"presentation\"===t||\"none\"===t)&&!h.isFocusable(e))return!1;if(\"true\"===e.getAttribute(\"contenteditable\")||h.findUp(e,'[contenteditable=\"true\"]'))return!0;if(\"grid\"===t||\"treegrid\"===t||\"table\"===t)return!0;if(\"landmark\"===commons.aria.getRoleType(t))return!0;if(\"0\"===e.getAttribute(\"datatable\"))return!1;if(e.getAttribute(\"summary\"))return!0;if(e.tHead||e.tFoot||e.caption)return!0;for(var r=0,n=e.children.length;r<n;r++)if(\"COLGROUP\"===e.children[r].nodeName.toUpperCase())return!0;for(var a,o,i=0,u=e.rows.length,s=!1,l=0;l<u;l++)for(var c=0,d=(a=e.rows[l]).cells.length;c<d;c++){if(\"TH\"===(o=a.cells[c]).nodeName.toUpperCase())return!0;if(s||o.offsetWidth===o.clientWidth&&o.offsetHeight===o.clientHeight||(s=!0),o.getAttribute(\"scope\")||o.getAttribute(\"headers\")||o.getAttribute(\"abbr\"))return!0;if([\"columnheader\",\"rowheader\"].includes((o.getAttribute(\"role\")||\"\").toLowerCase()))return!0;if(1===o.children.length&&\"ABBR\"===o.children[0].nodeName.toUpperCase())return!0;i++}if(e.getElementsByTagName(\"table\").length)return!1;if(u<2)return!1;var m,p,f=e.rows[Math.ceil(u/2)];if(1===f.cells.length&&1===f.cells[0].colSpan)return!1;if(5<=f.cells.length)return!0;if(s)return!0;for(l=0;l<u;l++){if(a=e.rows[l],m&&m!==window.getComputedStyle(a).getPropertyValue(\"background-color\"))return!0;if(m=window.getComputedStyle(a).getPropertyValue(\"background-color\"),p&&p!==window.getComputedStyle(a).getPropertyValue(\"background-image\"))return!0;p=window.getComputedStyle(a).getPropertyValue(\"background-image\")}return 20<=u||!(h.getElementCoordinates(e).width>.95*h.getViewportSize(window).width)&&(!(i<10)&&!e.querySelector(\"object, embed, iframe, applet\"))},o.isHeader=function(e){if(o.isColumnHeader(e)||o.isRowHeader(e))return!0;if(e.getAttribute(\"id\")){var t=axe.utils.escapeSelector(e.getAttribute(\"id\"));return!!document.querySelector('[headers~=\"'+t+'\"]')}return!1},o.isRowHeader=function(e){return[\"row\",\"auto\"].includes(o.getScope(e))},o.toGrid=function(e){for(var t=[],r=e.rows,n=0,a=r.length;n<a;n++){var o=r[n].cells;t[n]=t[n]||[];for(var i=0,u=0,s=o.length;u<s;u++)for(var l=0;l<o[u].colSpan;l++){for(var c=0;c<o[u].rowSpan;c++){for(t[n+c]=t[n+c]||[];t[n+c][i];)i++;t[n+c][i]=o[u]}i++}}return t},o.toArray=o.toGrid,o.traverse=function(e,t,r,n){if(Array.isArray(t)&&(n=r,r=t,t={x:0,y:0}),\"string\"==typeof e)switch(e){case\"left\":e={x:-1,y:0};break;case\"up\":e={x:0,y:-1};break;case\"right\":e={x:1,y:0};break;case\"down\":e={x:0,y:1}}return function e(t,r,n,a){var o,i=n[r.y]?n[r.y][r.x]:void 0;return i?\"function\"==typeof a&&!0===(o=a(i,r,n))?[i]:((o=e(t,{x:r.x+t.x,y:r.y+t.y},n,a)).unshift(i),o):[]}(e,{x:t.x+e.x,y:t.y+e.y},r,n)},b.accessibleText=function(e,t){var r=axe.utils.getNodeFromTree(axe._tree[0],e);return b.accessibleTextVirtual(r,t)},b.accessibleTextVirtual=function(r){var n=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},e=r.actualNode;if(n=function(e,t){var r=e.actualNode;t.startNode||(t=T({startNode:e},t));1===r.nodeType&&t.inLabelledByContext&&void 0===t.includeHidden&&(t=T({includeHidden:!h.isVisible(r,!0)},t));return t}(r,n),function(e,t){var r=e.actualNode;if(1!==r.nodeType||t.includeHidden)return!1;return!h.isVisible(r,!0)}(r,n))return\"\";var t=[l.arialabelledbyText,l.arialabelText,b.nativeTextAlternative,b.formControlValue,b.subtreeText,k,b.titleText].reduce(function(e,t){return\"\"!==e?e:t(r,n)},\"\");return n.startNode===r&&(t=b.sanitize(t)),n.debug&&axe.log(t||\"{empty-value}\",e,n),t},b.accessibleTextVirtual.alreadyProcessed=function(e,t){return t.processed=t.processed||[],!!t.processed.includes(e)||(t.processed.push(e),!1)};var x=[\"progressbar\",\"scrollbar\",\"slider\",\"spinbutton\"],E=[\"textbox\"].concat([\"combobox\",\"listbox\"],x);b.formControlValueMethods={nativeTextboxValue:function(e){e=e.actualNode||e;var t=e.nodeName.toUpperCase();if(\"TEXTAREA\"===t||\"INPUT\"===t&&![\"button\",\"checkbox\",\"file\",\"hidden\",\"image\",\"password\",\"radio\",\"reset\",\"submit\",\"color\"].includes(e.type))return e.value||\"\";return\"\"},nativeSelectValue:function(e){return\"SELECT\"===(e=e.actualNode||e).nodeName.toUpperCase()&&Array.from(e.options).filter(function(e){return e.selected}).map(function(e){return e.text}).join(\" \")||\"\"},ariaTextboxValue:function(e){var t=e.actualNode;if(\"textbox\"!==l.getRole(t))return\"\";return h.isHiddenWithCSS(t)?t.textContent:b.visibleVirtual(e,!0)},ariaListboxValue:function(e,t){var r=e.actualNode;if(\"listbox\"!==l.getRole(r))return\"\";var n=l.getOwnedVirtual(e).filter(function(e){return\"option\"===l.getRole(e)&&\"true\"===e.actualNode.getAttribute(\"aria-selected\")});return 0!==n.length?axe.commons.text.accessibleTextVirtual(n[0],t):\"\"},ariaComboboxValue:function(e,t){var r=e.actualNode,n=l.getRole(r,{noImplicit:!0}),a=void 0;return\"combobox\"!==!n&&(a=l.getOwnedVirtual(e).filter(function(e){return\"listbox\"===l.getRole(e)})[0])?b.formControlValueMethods.ariaListboxValue(a,t):\"\"},ariaRangeValue:function(e){e=e.actualNode||e;var t=l.getRole(e);if(!x.includes(t)||!e.hasAttribute(\"aria-valuenow\"))return\"\";var r=+e.getAttribute(\"aria-valuenow\");return isNaN(r)?\"0\":String(r)}},b.formControlValue=function(r){var n=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},e=r.actualNode,t=b.unsupported.accessibleNameFromFieldValue||[],a=l.getRole(e);if(n.startNode===r||!E.includes(a)||t.includes(a))return\"\";var o=Object.keys(b.formControlValueMethods).map(function(e){return b.formControlValueMethods[e]}).reduce(function(e,t){return e||t(r,n)},\"\");return n.debug&&axe.log(o||\"{empty-value}\",e,n),o},b.isHumanInterpretable=function(e){if(!e.length)return 0;if([\"x\",\"i\"].includes(e))return 0;var t=b.removeUnicode(e,{emoji:!0,nonBmp:!0,punctuations:!0});return b.sanitize(t)?1:0};b.autocomplete={stateTerms:[\"on\",\"off\"],standaloneTerms:[\"name\",\"honorific-prefix\",\"given-name\",\"additional-name\",\"family-name\",\"honorific-suffix\",\"nickname\",\"username\",\"new-password\",\"current-password\",\"organization-title\",\"organization\",\"street-address\",\"address-line1\",\"address-line2\",\"address-line3\",\"address-level4\",\"address-level3\",\"address-level2\",\"address-level1\",\"country\",\"country-name\",\"postal-code\",\"cc-name\",\"cc-given-name\",\"cc-additional-name\",\"cc-family-name\",\"cc-number\",\"cc-exp\",\"cc-exp-month\",\"cc-exp-year\",\"cc-csc\",\"cc-type\",\"transaction-currency\",\"transaction-amount\",\"language\",\"bday\",\"bday-day\",\"bday-month\",\"bday-year\",\"sex\",\"url\",\"photo\"],qualifiers:[\"home\",\"work\",\"mobile\",\"fax\",\"pager\"],qualifiedTerms:[\"tel\",\"tel-country-code\",\"tel-national\",\"tel-area-code\",\"tel-local\",\"tel-local-prefix\",\"tel-local-suffix\",\"tel-extension\",\"email\",\"impp\"],locations:[\"billing\",\"shipping\"]},b.isValidAutocomplete=function(e){var t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},r=t.looseTyped,n=void 0!==r&&r,a=t.stateTerms,o=void 0===a?[]:a,i=t.locations,u=void 0===i?[]:i,s=t.qualifiers,l=void 0===s?[]:s,c=t.standaloneTerms,d=void 0===c?[]:c,m=t.qualifiedTerms,p=void 0===m?[]:m;if(e=e.toLowerCase().trim(),(o=o.concat(b.autocomplete.stateTerms)).includes(e)||\"\"===e)return!0;l=l.concat(b.autocomplete.qualifiers),u=u.concat(b.autocomplete.locations),d=d.concat(b.autocomplete.standaloneTerms),p=p.concat(b.autocomplete.qualifiedTerms);var f=e.split(/\\s+/g);if(!n&&(8<f[0].length&&\"section-\"===f[0].substr(0,8)&&f.shift(),u.includes(f[0])&&f.shift(),l.includes(f[0])&&(f.shift(),d=[]),1!==f.length))return!1;var h=f[f.length-1];return d.includes(h)||p.includes(h)},b.labelText=function(e){var t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},r=b.accessibleTextVirtual.alreadyProcessed;if(t.inControlContext||t.inLabelledByContext||r(e,t))return\"\";t.startNode||(t.startNode=e);var n,a=T({inControlContext:!0},t),o=(n=e.actualNode).id?h.findElmsInContext({elm:\"label\",attr:\"for\",value:n.id,context:n}):[],i=h.findUpVirtual(e,\"label\"),u=void 0;return i?(u=[].concat(ie(o),[i])).sort(axe.utils.nodeSorter):u=o,u.map(function(e){return b.accessibleText(e,a)}).filter(function(e){return\"\"!==e}).join(\" \")},b.labelVirtual=function(e){var t,r;if(r=l.labelVirtual(e))return r;if(e.actualNode.id){var n=axe.utils.escapeSelector(e.actualNode.getAttribute(\"id\"));if(r=(t=axe.commons.dom.getRootNode(e.actualNode).querySelector('label[for=\"'+n+'\"]'))&&b.visible(t,!0))return r}return(r=(t=h.findUpVirtual(e,\"label\"))&&b.visible(t,!0))||null},b.label=function(e){return e=axe.utils.getNodeFromTree(axe._tree[0],e),b.labelVirtual(e)},b.nativeElementType=[{matches:[{nodeName:\"textarea\"},{nodeName:\"input\",properties:{type:[\"text\",\"password\",\"search\",\"tel\",\"email\",\"url\"]}}],namingMethods:\"labelText\"},{matches:{nodeName:\"input\",properties:{type:[\"button\",\"submit\",\"reset\"]}},namingMethods:[\"valueText\",\"titleText\",\"buttonDefaultText\"]},{matches:{nodeName:\"input\",properties:{type:\"image\"}},namingMethods:[\"altText\",\"valueText\",\"labelText\",\"titleText\",\"buttonDefaultText\"]},{matches:\"button\",namingMethods:\"subtreeText\"},{matches:\"fieldset\",namingMethods:\"fieldsetLegendText\"},{matches:\"OUTPUT\",namingMethods:\"subtreeText\"},{matches:[{nodeName:\"select\"},{nodeName:\"input\",properties:{type:/^(?!text|password|search|tel|email|url|button|submit|reset)/}}],namingMethods:\"labelText\"},{matches:\"summary\",namingMethods:\"subtreeText\"},{matches:\"figure\",namingMethods:[\"figureText\",\"titleText\"]},{matches:\"img\",namingMethods:\"altText\"},{matches:\"table\",namingMethods:[\"tableCaptionText\",\"tableSummaryText\"]},{matches:[\"hr\",\"br\"],namingMethods:[\"titleText\",\"singleSpace\"]}],b.nativeTextAlternative=function(r){var n=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},e=r.actualNode;if(1!==e.nodeType||[\"presentation\",\"none\"].includes(l.getRole(e)))return\"\";var a,t,o,i,u=(a=r,t=b.nativeElementType,o=b.nativeTextMethods,((i=t.find(function(e){var t=e.matches;return axe.commons.matches(a,t)}))?[].concat(i.namingMethods):[]).map(function(e){return o[e]})).reduce(function(e,t){return e||t(r,n)},\"\");return n.debug&&axe.log(u||\"{empty-value}\",e,n),u};var C={submit:\"Submit\",image:\"Submit\",reset:\"Reset\",button:\"\"};function A(e,t){return t.actualNode.getAttribute(e)||\"\"}function F(e,t,r){var n=t.actualNode,a=[e=e.toLowerCase(),n.nodeName.toLowerCase()].join(\",\"),o=n.querySelector(a);return o&&o.nodeName.toLowerCase()===e?b.accessibleText(o,r):\"\"}b.nativeTextMethods={valueText:function(e){return e.actualNode.value||\"\"},buttonDefaultText:function(e){var t=e.actualNode;return C[t.type]||\"\"},tableCaptionText:F.bind(null,\"caption\"),figureText:F.bind(null,\"figcaption\"),fieldsetLegendText:F.bind(null,\"legend\"),altText:A.bind(null,\"alt\"),tableSummaryText:A.bind(null,\"summary\"),titleText:function(e,t){return b.titleText(e,t)},subtreeText:function(e,t){return b.subtreeText(e,t)},labelText:function(e,t){return b.labelText(e,t)},singleSpace:function(){return\" \"}},b.sanitize=function(e){\"use strict\";return e.replace(/\\r\\n/g,\"\\n\").replace(/\\u00A0/g,\" \").replace(/[\\s]{2,}/g,\" \").trim()},b.subtreeText=function(e){var r=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},t=b.accessibleTextVirtual.alreadyProcessed;r.startNode=r.startNode||e;var n=r.strict;return t(e,r)||!l.namedFromContents(e,{strict:n})?\"\":l.getOwnedVirtual(e).reduce(function(e,t){return function(e,t,r){var n=t.actualNode.nodeName.toUpperCase(),a=b.accessibleTextVirtual(t,r);if(!a)return e;j.includes(n)||(\" \"!==a[0]&&(a+=\" \"),e&&\" \"!==e[e.length-1]&&(a=\" \"+a));return e+a}(e,t,r)},\"\")};var j=[\"A\",\"EM\",\"STRONG\",\"SMALL\",\"MARK\",\"ABBR\",\"DFN\",\"I\",\"B\",\"S\",\"U\",\"CODE\",\"VAR\",\"SAMP\",\"KBD\",\"SUP\",\"SUB\",\"Q\",\"CITE\",\"SPAN\",\"BDO\",\"BDI\",\"WBR\",\"INS\",\"DEL\",\"MAP\",\"AREA\",\"NOSCRIPT\",\"RUBY\",\"BUTTON\",\"LABEL\",\"OUTPUT\",\"DATALIST\",\"KEYGEN\",\"PROGRESS\",\"COMMAND\",\"CANVAS\",\"TIME\",\"METER\",\"#TEXT\"];var z=[\"button\",\"iframe\",\"a[href]\",{nodeName:\"input\",properties:{type:\"button\"}}];function q(){return new RegExp(\"[ᴀ-ᵿᶀ-ᶿ᷀-᷿₠-⃏⃐-⃿℀-⅏⅐-↏←-⇿∀-⋿⌀-⏿␀-␿⑀-⑟①-⓿─-╿▀-▟■-◿☀-⛿✀-➿]\")}return b.titleText=function(e){return 1===(e=e.actualNode||e).nodeType&&e.hasAttribute(\"title\")?!axe.commons.matches(e,z)&&[\"none\",\"presentation\"].includes(l.getRole(e))?\"\":e.getAttribute(\"title\"):\"\"},b.hasUnicode=function(e,t){var r=t.emoji,n=t.nonBmp,a=t.punctuations;return r?axe.imports.emojiRegexText().test(e):n?q().test(e):!!a&&/[\\u2000-\\u206F\\u2E00-\\u2E7F\\\\'!\"#$%&()*+,\\-.\\/:;<=>?@\\[\\]^_`{|}~]/g.test(e)},b.removeUnicode=function(e,t){var r=t.emoji,n=t.nonBmp,a=t.punctuations;return r&&(e=e.replace(axe.imports.emojiRegexText(),\"\")),n&&(e=e.replace(q(),\"\")),a&&(e=e.replace(/[\\u2000-\\u206F\\u2E00-\\u2E7F\\\\'!\"#$%&()*+,\\-.\\/:;<=>?@\\[\\]^_`{|}~]/g,\"\")),e},b.unsupported={accessibleNameFromFieldValue:[\"combobox\",\"listbox\",\"progressbar\"]},b.visibleVirtual=function(r,n,a){var e=r.children.map(function(e){if(3===e.actualNode.nodeType){var t=e.actualNode.nodeValue;if(t&&h.isVisible(r.actualNode,n))return t}else if(!a)return b.visibleVirtual(e,n)}).join(\"\");return b.sanitize(e)},b.visible=function(e,t,r){return e=axe.utils.getNodeFromTree(axe._tree[0],e),b.visibleVirtual(e,t,r)},commons}()})}(\"object\"==typeof window?window:this);";
+const pageFunctions=require('../../lib/page-functions.js');
@@ -11643,8 +11990,15 @@ rules:{
'td-has-header':{enabled:false},
'marquee':{enabled:false},
'area-alt':{enabled:false},
+'aria-dpub-role-fallback':{enabled:false},
+'aria-hidden-body':{enabled:false},
+'duplicate-id-active':{enabled:false},
+'duplicate-id-aria':{enabled:false},
+'html-xml-lang-mismatch':{enabled:false},
'blink':{enabled:false},
-'server-side-image-map':{enabled:false}}}).
+'server-side-image-map':{enabled:false},
+'aria-hidden-focus':{enabled:false},
+'form-field-multiple-labels':{enabled:false}}}).
then(axeResult=>{
@@ -11656,6 +12010,8 @@ node.path=getNodePath(node.element);
node.snippet=getOuterHTMLSnippet(node.element);
+node.nodeLabel=getNodeLabel(node.element);
+
node.element=node.any=node.all=node.none=undefined;
}));
@@ -11675,6 +12031,7 @@ const driver=passContext.driver;
const expression=`(function () {
${pageFunctions.getOuterHTMLSnippetString};
${pageFunctions.getNodePathString};
+ ${pageFunctions.getNodeLabelString};
${axeLibSource};
return (${runA11yChecks.toString()}());
})()`;
@@ -11693,7 +12050,7 @@ return returnedValue;
module.exports=Accessibility;
-},{"../../lib/page-functions":72,"./gatherer":48}],"../gather/gatherers/anchor-elements":[function(require,module,exports){
+},{"../../lib/page-functions.js":75,"./gatherer.js":51}],"../gather/gatherers/anchor-elements":[function(require,module,exports){
@@ -11775,7 +12132,7 @@ return driver.evaluateAsync(expression,{useIsolation:true});
module.exports=AnchorElements;
-},{"../../lib/page-functions.js":72,"./gatherer.js":48}],"../gather/gatherers/cache-contents":[function(require,module,exports){
+},{"../../lib/page-functions.js":75,"./gatherer.js":51}],"../gather/gatherers/cache-contents":[function(require,module,exports){
@@ -11785,7 +12142,7 @@ module.exports=AnchorElements;
-const Gatherer=require('./gatherer');
+const Gatherer=require('./gatherer.js');
@@ -11836,7 +12193,7 @@ return cacheUrls;
module.exports=CacheContents;
-},{"./gatherer":48}],"../gather/gatherers/chrome-console-messages":[function(require,module,exports){
+},{"./gatherer.js":51}],"../gather/gatherers/console-messages":[function(require,module,exports){
@@ -11849,9 +12206,9 @@ module.exports=CacheContents;
'use strict';
-const Gatherer=require('./gatherer');
+const Gatherer=require('./gatherer.js');
-class ChromeConsoleMessages extends Gatherer{
+class ConsoleMessages extends Gatherer{
constructor(){
super();
@@ -11890,9 +12247,9 @@ return this._logEntries;
}}
-module.exports=ChromeConsoleMessages;
+module.exports=ConsoleMessages;
-},{"./gatherer":48}],"../gather/gatherers/css-usage":[function(require,module,exports){
+},{"./gatherer.js":51}],"../gather/gatherers/css-usage":[function(require,module,exports){
@@ -11900,7 +12257,7 @@ module.exports=ChromeConsoleMessages;
'use strict';
-const Gatherer=require('./gatherer');
+const Gatherer=require('./gatherer.js');
@@ -11953,7 +12310,7 @@ stylesheets:Array.from(dedupedStylesheets.values())};
module.exports=CSSUsage;
-},{"./gatherer":48}],"../gather/gatherers/dobetterweb/appcache":[function(require,module,exports){
+},{"./gatherer.js":51}],"../gather/gatherers/dobetterweb/appcache":[function(require,module,exports){
@@ -11961,7 +12318,7 @@ module.exports=CSSUsage;
'use strict';
-const Gatherer=require('../gatherer');
+const Gatherer=require('../gatherer.js');
class AppCacheManifest extends Gatherer{
@@ -11980,7 +12337,7 @@ then(node=>node&&node.getAttribute('manifest'));
module.exports=AppCacheManifest;
-},{"../gatherer":48}],"../gather/gatherers/dobetterweb/doctype":[function(require,module,exports){
+},{"../gatherer.js":51}],"../gather/gatherers/dobetterweb/doctype":[function(require,module,exports){
@@ -11988,7 +12345,7 @@ module.exports=AppCacheManifest;
'use strict';
-const Gatherer=require('../gatherer');
+const Gatherer=require('../gatherer.js');
@@ -12018,7 +12375,7 @@ return driver.evaluateAsync(`(${getDoctype.toString()}())`);
module.exports=Doctype;
-},{"../gatherer":48}],"../gather/gatherers/dobetterweb/domstats":[function(require,module,exports){
+},{"../gatherer.js":51}],"../gather/gatherers/dobetterweb/domstats":[function(require,module,exports){
@@ -12034,8 +12391,8 @@ module.exports=Doctype;
'use strict';
-const Gatherer=require('../gatherer');
-const pageFunctions=require('../../../lib/page-functions');
+const Gatherer=require('../gatherer.js');
+const pageFunctions=require('../../../lib/page-functions.js');
@@ -12106,9 +12463,10 @@ return path;
function getDOMStats(element,deep=true){
-let deepestNode=null;
+let deepestElement=null;
let maxDepth=0;
let maxWidth=0;
+let numElements=0;
let parentWithMostChildren=null;
@@ -12117,7 +12475,7 @@ let parentWithMostChildren=null;
const _calcDOMWidthAndHeight=function(element,depth=1){
if(depth>maxDepth){
-deepestNode=element;
+deepestElement=element;
maxDepth=depth;
}
if(element.children.length>maxWidth){
@@ -12133,9 +12491,10 @@ if(deep&&child.shadowRoot){
_calcDOMWidthAndHeight(child.shadowRoot,depth+1);
}
child=child.nextElementSibling;
+numElements++;
}
-return{maxDepth,maxWidth};
+return{maxDepth,maxWidth,numElements};
};
const result=_calcDOMWidthAndHeight(element);
@@ -12143,15 +12502,16 @@ const result=_calcDOMWidthAndHeight(element);
return{
depth:{
max:result.maxDepth,
-pathToElement:elementPathInDOM(deepestNode),
+pathToElement:elementPathInDOM(deepestElement),
-snippet:getOuterHTMLSnippet(deepestNode,['style'])},
+snippet:getOuterHTMLSnippet(deepestElement,['style'])},
width:{
max:result.maxWidth,
pathToElement:elementPathInDOM(parentWithMostChildren),
-snippet:getOuterHTMLSnippet(parentWithMostChildren,['style'])}};
+snippet:getOuterHTMLSnippet(parentWithMostChildren,['style'])},
+totalBodyElements:result.numElements};
}
@@ -12160,89 +12520,25 @@ class DOMStats extends Gatherer{
-afterPass(passContext){
+async afterPass(passContext){
+const driver=passContext.driver;
+
const expression=`(function() {
${pageFunctions.getOuterHTMLSnippetString};
${createSelectorsLabel.toString()};
${elementPathInDOM.toString()};
- return (${getDOMStats.toString()}(document.documentElement));
+ return (${getDOMStats.toString()}(document.body));
})()`;
-return passContext.driver.sendCommand('DOM.enable').
-then(()=>passContext.driver.evaluateAsync(expression,{useIsolation:true})).
-then(results=>passContext.driver.getElementsInDocument().then(allNodes=>{
-results.totalDOMNodes=allNodes.length;
-return passContext.driver.sendCommand('DOM.disable').then(()=>results);
-}));
+await driver.sendCommand('DOM.enable');
+const results=await driver.evaluateAsync(expression,{useIsolation:true});
+await driver.sendCommand('DOM.disable');
+return results;
}}
module.exports=DOMStats;
-},{"../../../lib/page-functions":72,"../gatherer":48}],"../gather/gatherers/dobetterweb/js-libraries":[function(require,module,exports){
-
-
-
-
-
-
-
-
-
-
-
-
-
-'use strict';
-
-const Gatherer=require('../gatherer');
-
-const libDetectorSource="var UNKNOWN_VERSION = null;\nvar d41d8cd98f00b204e9800998ecf8427e_LibraryDetectorTests = {\n\n 'GWT': {\n icon: 'gwt',\n url: 'http://www.gwtproject.org/',\n test: function(win) {\n // pretty complicated, many possible tell tales\n var doc = win.document,\n hasHistFrame = doc.getElementById('__gwt_historyFrame'),\n hasGwtUid = doc.gwt_uid,\n hasBodyListener = doc.body.__listener,\n hasBodyEventBits = doc.body.__eventBits,\n hasModules = win.__gwt_activeModules,\n hasJsonP = win.__gwt_jsonp__,\n hasRootWinApp = win.__gwt_scriptsLoaded || win.__gwt_stylesLoaded || win.__gwt_activeModules;\n\n // use the many possible indicators\n if(hasHistFrame || hasGwtUid || hasBodyListener || hasBodyEventBits || hasModules || hasJsonP || hasRootWinApp) {\n\n // carefully look at frames, but only if certain is GWT frame\n var frames = doc.getElementsByTagName('iframe'),\n gwtVersion = UNKNOWN_VERSION;\n for(var n=0; n<frames.length; n++) {\n // catch security access errors\n try {\n var hasNegativeTabIndex = frames[n].tabIndex < 0; // on for GWT\n if(hasNegativeTabIndex && frames[n].contentWindow && frames[n].contentWindow.$gwt_version) {\n gwtVersion = frames[n].contentWindow.$gwt_version;\n break;\n }\n }\n catch(e) {}\n }\n\n if(gwtVersion=='0.0.999') {\n gwtVersion = 'Google Internal';\n }\n\n return { version: gwtVersion };\n }\n return false;\n }\n },\n\n 'Ink': {\n icon: 'ink',\n url: 'http://ink.sapo.pt/',\n test: function(win) {\n if (win.Ink && win.Ink.createModule) {\n return { version: UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'Vaadin': {\n icon: 'vaadin',\n url: 'https://vaadin.com/',\n test: function(win) {\n if (win.vaadin && win.vaadin.registerWidgetset) {\n return { version: UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'Bootstrap': {\n icon: 'bootstrap',\n url: 'http://getbootstrap.com/',\n npm: 'bootstrap',\n // look for a function Boostrap has added to jQuery - regex for BS 2 & 3\n test: function(win) {\n var jQueryAvailable = win.$ && win.$.fn,\n RE_PREFIX_V2 = '\\\\$this\\\\.data\\\\((?:\\'|\")',\n RE_PREFIX_V3 = '\\\\$this\\\\.data\\\\((?:\\'|\")(?:bs\\\\.){1}',\n bootstrapComponents = [\n 'affix', 'alert', 'button', 'carousel', 'collapse', 'dropdown',\n 'modal', 'popover', 'scrollspy', 'tab', 'tooltip'\n ];\n\n if(jQueryAvailable) {\n var bootstrapVersion;\n\n bootstrapComponents.some(function(component) {\n if(win.$.fn[component]) {\n // Bootstrap >= 3.2.0 detection\n if(win.$.fn[component].Constructor && win.$.fn[component].Constructor.VERSION) {\n bootstrapVersion = win.$.fn[component].Constructor.VERSION;\n return true;\n // Bootstrap >= 2.0.0 and <= 3.1.0 detection\n } else if(new RegExp(RE_PREFIX_V3 + component).test(win.$.fn[component].toString())) {\n bootstrapVersion = '>= 3.0.0 & <= 3.1.1';\n return true;\n // Bootstrap < 3.1.0 detection\n } else if(new RegExp(RE_PREFIX_V2 + component).test(win.$.fn[component].toString())) {\n bootstrapVersion = '>= 2.0.0 & <= 2.3.2';\n return true;\n }\n }\n\n return false;\n });\n\n if (bootstrapVersion) {\n return { version: bootstrapVersion };\n }\n }\n\n return false;\n }\n },\n\n 'Zurb': {\n icon: 'zurb',\n url: 'https://foundation.zurb.com/',\n npm: 'foundation-sites',\n test: function(win) {\n if(win.Foundation && win.Foundation.Toggler) {\n return { version: win.Foundation.version || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'Polymer': {\n icon: 'polymer',\n url: 'https://www.polymer-project.org/',\n npm: '@polymer/polymer',\n test: function(win) {\n if(win.Polymer && win.Polymer.dom) {\n return { version: win.Polymer.version || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'Highcharts': {\n icon: 'highcharts',\n url: 'http://www.highcharts.com',\n npm: 'highcharts',\n test: function(win) {\n if(win.Highcharts && win.Highcharts.Point) {\n return { version: win.Highcharts.version || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'InfoVis': {\n icon: 'jit',\n url: 'http://philogb.github.com/jit/',\n test: function test(win) {\n if(win.$jit && win.$jit.PieChart) {\n return { version: win.$jit.version || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'FlotCharts': {\n icon: 'flotcharts',\n url: 'http://www.flotcharts.org/',\n npm: 'flot',\n test: function(win) {\n if(win.$ && win.$.plot) {\n return { version: win.$.plot.version || UNKNOWN_VERSION};\n }\n return false;\n }\n },\n\n 'CreateJS': {\n icon: 'createjs',\n url: 'https://createjs.com/',\n npm: 'createjs',\n test: function(win) {\n if(win.createjs && win.createjs.promote) {\n return { version: UNKNOWN_VERSION}; // no version info available\n }\n return false;\n }\n },\n\n 'Google Maps': {\n icon: 'gmaps',\n url: 'https://developers.google.com/maps/',\n test: function(win) {\n if (win.google && win.google.maps) {\n return { version: win.google.maps.version || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'jQuery': {\n icon: 'jquery',\n url: 'http://jquery.com',\n npm: 'jquery',\n test: function(win) {\n var jq = win.jQuery || win.$;\n if (jq && jq.fn) {\n return { version: jq.fn.jquery.replace(/[^\\d+\\.+]/g, '') || UNKNOWN_VERSION};\n }\n return false;\n }\n },\n\n 'jQuery UI': {\n icon: 'jquery_ui',\n url: 'http://jqueryui.com',\n npm: 'jquery-ui',\n test: function(win) {\n var jq = win.jQuery || win.$ || win.$jq || win.$j;\n if(jq && jq.fn && jq.fn.jquery && jq.ui) {\n var plugins = 'accordion,datepicker,dialog,draggable,droppable,progressbar,resizable,selectable,slider,menu,grid,tabs'.split(','), concat = [];\n for (var i=0; i < plugins.length; i++) { if(jq.ui[plugins[i]]) concat.push(plugins[i].substr(0,1).toUpperCase() + plugins[i].substr(1)); }\n return { version: jq.ui.version || UNKNOWN_VERSION, details: concat.length ? 'Plugins used: '+concat.join(',') : '' };\n }\n return false;\n }\n },\n\n 'Dojo': {\n icon: 'dojo',\n url: 'http://dojotoolkit.org',\n npm: 'dojo',\n test: function(win) {\n if(win.dojo && win.dojo.delegate) {\n var version = win.dojo.version ? win.dojo.version.toString() : UNKNOWN_VERSION;\n return { version: version, details: 'Details: '+(win.dijit ? 'Uses Dijit' : 'none') };\n }\n return false;\n }\n },\n\n 'Prototype': {\n icon: 'prototype',\n url: 'http://prototypejs.org',\n test: function(win) {\n if(win.Prototype && win.Prototype.BrowserFeatures) {\n return { version: win.Prototype.Version || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'Scriptaculous': {\n icon: 'scriptaculous',\n url: 'http://script.aculo.us',\n test: function(win) {\n if(win.Scriptaculous && win.Scriptaculous.load) {\n return { version: win.Scriptaculous.Version || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'MooTools': {\n icon: 'mootools',\n url: 'https://mootools.net/',\n test: function(win) {\n if(win.MooTools && win.MooTools.build) {\n return { version: win.MooTools.version || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'Spry': {\n icon: 'spry',\n url: 'http://labs.adobe.com/technologies/spry',\n test: function(win) {\n if (win.Spry && win.Spry.Data) {\n return { version: UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'YUI 2': {\n icon: 'yui',\n url: 'http://developer.yahoo.com/yui/2/',\n test: function(win) {\n if (win.YAHOO && win.YAHOO.util) {\n return { version: win.YAHOO.VERSION || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'YUI 3': {\n icon: 'yui3',\n url: 'https://yuilibrary.com/',\n npm: 'yui',\n test: function(win) {\n if (win.YUI && win.YUI.Env) {\n return { version: win.YUI.version || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'Qooxdoo': {\n icon: 'qooxdoo',\n url: 'http://www.qooxdoo.org/',\n npm: 'qooxdoo',\n test: function(win) {\n if(win.qx && win.qx.Bootstrap) {\n return { version: UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'Ext JS': {\n icon: 'extjs',\n url: 'https://www.sencha.com/products/extjs/',\n test: function(win) {\n if (win.Ext && win.Ext.versions) {\n return { version: win.Ext.versions.core.version };\n }\n else if(win.Ext) {\n return { version: win.Ext.version || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'base2': {\n icon: 'base2',\n url: 'http://code.google.com/p/base2',\n test: function(win) {\n if(win.base2 && win.base2.dom) {\n return { version: win.base2.version || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'Closure Library': {\n icon: 'closure',\n url: 'https://developers.google.com/closure/library/',\n npm: 'google-closure-library',\n test: function(win) {\n if(win.goog && win.goog.provide) {\n return { version: UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'Rapha&euml;l': {\n icon: 'raphael',\n url: 'http://dmitrybaranovskiy.github.io/raphael/',\n test: function(win) {\n if (win.Raphael && win.Raphael.circle) {\n return { version: win.Raphael.version || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'React': {\n icon: 'react',\n url: 'https://reactjs.org/',\n npm: 'react',\n test: function(win) {\n function isReactNode(node) {\n return node._reactRootContainer!=null;\n }\n var reactRoot = document.getElementById('react-root');\n var altHasReact = document.querySelector('*[data-reactroot]');\n var bodyReactRoot = isReactNode(document.body) || isReactNode(document.body.firstElementChild || {});\n var hasReactRoot = bodyReactRoot|| document.createTreeWalker(document.body, 3, isReactNode).nextNode() != null;\n if (hasReactRoot || reactRoot && reactRoot.innerText.length > 0 || altHasReact || win.React && win.React.Component) {\n return { version: win.React && win.React.version || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'Preact': {\n icon: 'preact',\n url: 'https://preactjs.com/',\n npm: 'preact',\n test: function(win) {\n var expando = typeof Symbol!='undefined' && Symbol.for && Symbol.for('preactattr');\n function isPreactNode(node) {\n if (node._component!=null || node.__preactattr_!=null || expando && node[expando]!=null) {\n return node;\n }\n return null;\n }\n var preactRoot = isPreactNode(document.body) || isPreactNode(document.body.firstElementChild || {});\n if (!preactRoot) {\n preactRoot = document.createTreeWalker(document.body, 3, isPreactNode).nextNode();\n }\n if (preactRoot || win.preact) {\n var version = UNKNOWN_VERSION;\n if (expando && preactRoot && preactRoot[expando]!=null) {\n version = '7';\n }\n return { version: version };\n }\n return false;\n }\n },\n\n 'Modernizr': {\n icon: 'modernizr',\n url: 'https://modernizr.com/',\n npm: 'modernizr',\n test: function(win) {\n if (win.Modernizr && win.Modernizr.addTest) {\n return { version: win.Modernizr._version || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'Processing.js': {\n icon: 'processingjs',\n url: 'http://processingjs.org',\n npm: 'processing-js',\n test: function(win) {\n if(win.Processing && win.Processing.box) {\n return { version: Processing.version || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'Backbone': {\n icon: 'backbone',\n url: 'http://backbonejs.org/',\n npm: 'backbone',\n test: function(win) {\n if (win.Backbone && win.Backbone.Model.extend) {\n return {version: win.Backbone.VERSION || UNKNOWN_VERSION};\n }\n return false;\n }\n },\n\n 'Leaflet': {\n icon: 'leaflet',\n url: 'http://leafletjs.com',\n npm: 'leaflet',\n test: function(win) {\n // Leaflet 3.1 uses L.Marker and L.VERSION; later versions use L.marker and L.version\n if (win.L && win.L.GeoJSON && (win.L.marker || win.L.Marker)) {\n return { version: win.L.version || win.L.VERSION || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'Mapbox': {\n icon: 'mapbox',\n url: 'https://www.mapbox.com/',\n npm: 'mapbox-gl',\n test: function(win) {\n if (win.L && win.L.mapbox && win.L.mapbox.geocoder) {\n return { version: win.L.mapbox.VERSION || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'Lo-Dash': {\n icon: 'lodash',\n url: 'https://lodash.com/',\n npm: 'lodash',\n test: function(win) {\n var _ = typeof (_ = win._) == 'function' && _,\n chain = typeof (chain = _ && _.chain) == 'function' && chain,\n wrapper = (chain || _ || function() { return {}; })(1);\n\n if (_ && wrapper.__wrapped__) {\n return { version: _.VERSION || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'Underscore': {\n icon: 'underscore',\n url: 'http://underscorejs.org/',\n npm: 'underscore',\n test: function(win) {\n if (win._ && typeof win._.tap === 'function' &&\n !d41d8cd98f00b204e9800998ecf8427e_LibraryDetectorTests['Lo-Dash'].test(win)) {\n return {version: win._.VERSION || UNKNOWN_VERSION};\n }\n return false;\n }\n },\n\n 'Sammy': {\n icon: 'sammy',\n url: 'http://sammyjs.org',\n test: function(win) {\n if (win.Sammy && win.Sammy.Application.curry) {\n return {version: win.Sammy.VERSION || UNKNOWN_VERSION};\n }\n return false;\n }\n },\n\n 'Rico': {\n icon: 'rico',\n url: 'http://openrico.sourceforge.net/examples/index.html',\n test: function(win) {\n if (win.Rico && window.Rico.checkIfComplete) {\n return {version: win.Rico.Version || UNKNOWN_VERSION};\n }\n return false;\n }\n },\n\n 'MochiKit': {\n icon: 'mochikit',\n url: 'https://mochi.github.io/mochikit/',\n test: function(win) {\n if (win.MochiKit && win.MochiKit.Base.module) {\n return {version: MochiKit.VERSION || UNKNOWN_VERSION};\n }\n return false;\n }\n },\n\n 'gRapha&euml;l': {\n icon: 'graphael',\n url: 'https://github.com/DmitryBaranovskiy/g.raphael',\n test: function(win) {\n if (win.Raphael && win.Raphael.fn.g) {\n return {version: UNKNOWN_VERSION};\n }\n return false;\n }\n },\n\n 'Glow': {\n icon: 'glow',\n url: 'http://www.bbc.co.uk/glow/',\n test: function(win) {\n if (win.gloader && win.gloader.getRequests) {\n return {version: UNKNOWN_VERSION};\n }\n else if (win.glow && win.glow.dom) {\n return {version: win.glow.VERSION || UNKNOWN_VERSION};\n }\n else if (win.Glow) {\n return {version: win.Glow.version || UNKNOWN_VERSION};\n }\n return false;\n }\n },\n\n 'Socket.IO': {\n icon: 'socketio', // currently has no icon\n url: 'https://socket.io/',\n npm: 'socket.io',\n test: function(win) {\n // version 0.6.2 uses only io.Socket; more recent versions also have io.sockets\n if (win.io && (win.io.sockets || win.io.Socket)) {\n return {version: win.io.version || UNKNOWN_VERSION};\n }\n return false;\n }\n },\n\n 'Mustache': {\n icon: 'mustache',\n url: 'http://mustache.github.io/',\n npm: 'mustache',\n test: function(win) {\n if (win.Mustache && win.Mustache.to_html) {\n return {version: win.Mustache.version || UNKNOWN_VERSION};\n }\n return false;\n }\n },\n\n 'Fabric.js': {\n icon: 'icon38', // currently has no icon\n url: 'http://fabricjs.com/',\n npm: 'fabric',\n test: function(win) {\n if (win.fabric && win.fabric.util) {\n return {version: win.fabric.version || UNKNOWN_VERSION};\n }\n return false;\n }\n },\n\n 'FuseJS': {\n icon: 'fusejs',\n url: 'http://fusejs.io/',\n npm: 'fuse.js',\n test: function(win) {\n if (win.Fuse) {\n return {version: UNKNOWN_VERSION};\n }\n return false;\n }\n },\n\n 'Tween.js': {\n icon: 'icon38', // currently has no icon\n url: 'https://github.com/tweenjs/tween.js',\n npm: 'tween.js',\n test: function(win) {\n if (win.TWEEN && win.TWEEN.Easing) {\n return {version: UNKNOWN_VERSION};\n }\n return false;\n }\n },\n\n 'SproutCore': {\n icon: 'sproutcore',\n url: 'http://sproutcore.com/',\n test: function(win) {\n if (win.SC && win.SC.Application) {\n return {version: UNKNOWN_VERSION};\n }\n return false;\n }\n },\n\n 'Zepto.js': {\n icon: 'zepto',\n url: 'http://zeptojs.com',\n npm: 'zepto',\n test: function(win) {\n if (win.Zepto && win.Zepto.fn) {\n return {version: UNKNOWN_VERSION};\n }\n return false;\n }\n },\n\n 'three.js': {\n icon: 'icon38', // currently has no icon\n url: 'https://threejs.org/',\n npm: 'three',\n test: function(win) {\n if (win.THREE && win.THREE.REVISION) {\n return {version: 'r' + win.THREE.REVISION};\n }\n else if (win.THREE) {\n return {version: UNKNOWN_VERSION};\n }\n return false;\n }\n },\n\n 'PhiloGL': {\n icon: 'philogl',\n url: 'http://www.senchalabs.org/philogl/',\n npm: 'philogl',\n test: function(win) {\n if (win.PhiloGL && win.PhiloGL.Camera) {\n return {version: win.PhiloGL.version || UNKNOWN_VERSION};\n }\n return false;\n }\n },\n\n 'CamanJS': {\n icon: 'camanjs',\n url: 'http://camanjs.com/',\n npm: 'caman',\n test: function(win) {\n if (win.Caman && win.Caman.version) {\n return {version: win.Caman.version.release};\n }\n else if (win.Caman) {\n return {version: UNKNOWN_VERSION};\n }\n return false;\n }\n },\n\n 'yepnope': {\n icon: 'yepnope',\n url: 'http://yepnopejs.com/',\n test: function(win) {\n if (win.yepnope && win.yepnope.injectJs) {\n return {version: UNKNOWN_VERSION};\n }\n return false;\n }\n },\n\n 'LABjs': {\n icon: 'icon38',\n url: 'https://github.com/getify/LABjs',\n test: function(win) {\n if (win.$LAB && win.$LAB.setOptions) {\n return {version: UNKNOWN_VERSION};\n }\n return false;\n }\n },\n\n 'Head JS': {\n icon: 'headjs',\n url: 'http://headjs.com/',\n npm: 'headjs',\n test: function(win) {\n if (win.head && win.head.js) {\n return {version: UNKNOWN_VERSION};\n }\n return false;\n }\n },\n\n 'ControlJS': {\n icon: 'icon38',\n url: 'http://stevesouders.com/controljs/',\n test: function(win) {\n if (win.CJS && win.CJS.start) {\n return {version: UNKNOWN_VERSION};\n }\n return false;\n }\n },\n\n 'RequireJS': {\n icon: 'requirejs',\n url: 'http://requirejs.org/',\n npm: 'requirejs',\n test: function(win) {\n var req = win.require || win.requirejs;\n if (req && (req.load || (req.s && req.s.contexts && req.s.contexts._ && (req.s.contexts._.loaded || req.s.contexts._.load)))) {\n return { version: req.version || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'RightJS': {\n icon: 'rightjs',\n url: 'http://rightjs.org/',\n test: function(win) {\n if (win.RightJS && win.RightJS.isNode) {\n return { version: win.RightJS.version || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'jQuery Tools': {\n icon: 'jquerytools',\n url: 'http://jquerytools.github.io/',\n test: function(win) {\n var jq = win.jQuery || win.$;\n if(jq && jq.tools) {\n return { version: jq.tools.version || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'Pusher': {\n icon: 'pusher',\n url: 'https://pusher.com/docs/',\n npm: 'pusher-js',\n test: function(win) {\n if(win.Pusher && win.Pusher.Channel) {\n return { version: win.Pusher.VERSION || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'Paper.js': {\n icon: 'paperjs',\n url: 'http://paperjs.org/',\n npm: 'paper',\n test: function(win) {\n if(win.paper && win.paper.Point) {\n return { version: win.paper.version || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'Swiffy': {\n icon: 'icon38',\n url: 'https://developers.google.com/swiffy/',\n test: function(win) {\n if(win.swiffy && win.swiffy.Stage) {\n return { version: UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'Move': {\n icon: 'move',\n url: 'https://github.com/rsms/move',\n npm: 'move',\n test: function(win) {\n if(win.move && win.move.compile) {\n return { version: win.move.version() || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'AmplifyJS': {\n icon: 'amplifyjs',\n url: 'http://amplifyjs.com/',\n npm: 'amplifyjs',\n test: function(win) {\n if(win.amplify && win.amplify.publish) {\n return { version: UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'Popcorn.js': {\n icon: 'popcornjs',\n url: 'https://github.com/mozilla/popcorn-js/',\n test: function(win) {\n if (win.Popcorn && win.Popcorn.Events) {\n return { version: win.Popcorn.version || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'D3': {\n icon: 'd3',\n url: 'https://d3js.org/',\n npm: 'd3',\n test: function(win) {\n if (win.d3 && win.d3.select) {\n return { version: win.d3.version || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'Handlebars': {\n icon: 'handlebars',\n url: 'http://handlebarsjs.com/',\n npm: 'handlebars',\n test: function(win) {\n if(win.Handlebars && win.Handlebars.compile) {\n return { version: win.Handlebars.VERSION || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'Knockout': {\n icon: 'knockout',\n url: 'http://knockoutjs.com/',\n npm: 'knockout',\n test: function(win) {\n if (win.ko && win.ko.applyBindings) {\n return { version: win.ko.version || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'Spine': {\n icon: 'icon38',\n url: 'http://spine.github.io/',\n test: function(win) {\n if (win.Spine && win.Spine.Controller) {\n return {version: win.Spine.version || UNKNOWN_VERSION};\n }\n return false;\n }\n },\n\n 'jQuery Mobile': {\n icon: 'jquery_mobile',\n url: 'http://jquerymobile.com/',\n npm: 'jquery-mobile',\n test: function(win) {\n var jq = win.jQuery || win.$ || win.$jq || win.$j;\n if(jq && jq.fn && jq.fn.jquery && jq.mobile) {\n return { version: jq.mobile.version || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'WebFont Loader': {\n icon: 'icon38',\n url: 'https://github.com/typekit/webfontloader',\n npm: 'webfontloader',\n test: function(win) {\n if(win.WebFont && win.WebFont.load) {\n return { version: UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'Angular': {\n icon: 'angular',\n url: 'https://angular.io/',\n npm: '@angular/core',\n test: function(win) {\n var ng = win.document.querySelector('[ng-version]');\n if (ng) {\n return { version: ng.getAttribute('ng-version') || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'AngularJS': {\n icon: 'angularjs',\n url: 'https://angularjs.org/',\n npm: 'angular',\n test: function(win) {\n var ng = win.angular;\n if(ng && ng.version && ng.version.full) {\n return { version: ng.version.full };\n }\n else if (ng) {\n return { version: UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'Ember.js': {\n icon: 'emberjs',\n url: 'https://emberjs.com/',\n npm: 'ember-source',\n test: function(win) {\n var ember = win.Ember || win.Em;\n if (ember && ember.propertyDidChange) {\n return { version: ember.VERSION || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'Hammer.js': {\n icon: 'hammerjs',\n url: 'http://eightmedia.github.io/hammer.js/',\n npm: 'hammerjs',\n test: function(win) {\n if(win.Hammer && win.Hammer.Pinch) {\n // Hammer.VERSION available in 1.0.10+\n return { version: win.Hammer.VERSION || \"&lt; 1.0.10\" };\n }\n return false;\n }\n },\n\n 'Visibility.js': {\n icon: 'icon38',\n url: 'https://github.com/ai/visibilityjs',\n npm: 'visibilityjs',\n test: function(win) {\n if(win.Visibility && win.Visibility.every) {\n return { version: UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'Velocity.js': {\n icon: 'icon38',\n url: 'http://velocityjs.org/',\n npm: 'velocity-animate',\n test: function(win) {\n var jq = win.jQuery || win.$,\n velocity = jq ? jq.Velocity : win.Velocity;\n\n if(velocity && velocity.RegisterEffect && velocity.version) {\n return {\n version:\n velocity.version.major + \".\" +\n velocity.version.minor + \".\" +\n velocity.version.patch\n };\n }\n else if (velocity && velocity.RegisterEffect) {\n return { version: UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'IfVisible.js': {\n icon: 'icon38',\n url: 'http://serkanyersen.github.io/ifvisible.js/',\n npm: 'ifvisible.js',\n test: function(win) {\n var iv = win.ifvisible;\n if(iv && iv.__ceGUID === \"ifvisible.object.event.identifier\") {\n return { version: UNKNOWN_VERSION };\n }\n return false;\n }\n },\n 'Pixi.js': {\n icon: 'pixi',\n url: 'http://www.pixijs.com/',\n npm: 'pixi.js',\n test: function(win) {\n var px = win.PIXI;\n if(px && px.WebGLRenderer && px.VERSION) {\n // version 4.4.3 returns simply \"4.4.3\"; version 1.5.2 returns \"v1.5.2\"\n return { version: px.VERSION.replace('v', '') || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n 'DC.js': {\n icon: 'dcjs',\n url: 'http://dc-js.github.io/dc.js/',\n npm: 'dc',\n test: function(win) {\n var dc = win.dc;\n if(dc && dc.registerChart) {\n return { version: dc.version || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n 'GreenSock JS': {\n icon: 'greensock',\n url: 'https://greensock.com/gsap',\n npm: 'gsap',\n test: function(win) {\n if (win.TweenMax && win.TweenMax.pauseAll) {\n return { version: win.TweenMax.version || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n 'FastClick': {\n icon: 'fastclick',\n url: 'https://github.com/ftlabs/fastclick',\n npm: 'fastclick',\n test: function(win) {\n if(win.FastClick && win.FastClick.notNeeded) {\n return { version: UNKNOWN_VERSION };\n }\n return false;\n }\n },\n 'Isotope': {\n icon: 'isotope',\n url: 'https://isotope.metafizzy.co/',\n npm: 'isotope-layout',\n test: function(win) {\n if(win.Isotope || (win.$ != null && win.$.Isotope)) {\n return { version: UNKNOWN_VERSION };\n }\n return false;\n }\n },\n 'Marionette': {\n icon: 'marionette',\n url: 'https://marionettejs.com/',\n npm: 'backbone.marionette',\n test: function(win) {\n if(win.Marionette && win.Marionette.Application) {\n return { version: win.Marionette.VERSION || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n 'Can': {\n icon: 'canjs',\n url: 'https://canjs.com/',\n npm: 'can',\n test: function (win) {\n if (win.can && win.can.Construct) {\n return { version: win.can.VERSION || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n 'Vue': {\n icon: 'vue',\n url: 'https://vuejs.org/',\n npm: 'vue',\n test: function(win) {\n if (win.Vue && win.Vue.nextTick) {\n return { version: win.Vue.version || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n 'Two': {\n icon: 'two',\n url: 'https://two.js.org/',\n npm: 'two.js',\n test: function(win) {\n if (win.Two && win.Two.Utils) {\n return { version: win.Two.Version || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n 'Brewser': {\n icon: 'brewser',\n url: 'https://robertpataki.github.io/brewser/',\n npm: 'brewser',\n test: function(win) {\n if(win.BREWSER && win.BREWSER.ua) {\n return { version: BREWSER.VERSION || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n 'Material Design Lite': {\n icon: 'mdl',\n url: 'https://getmdl.io/',\n npm: 'material-design-lite',\n test: function(win) {\n if(win.componentHandler && win.componentHandler.upgradeElement) {\n return { version: UNKNOWN_VERSION};\n }\n return false;\n }\n },\n 'Kendo UI': {\n icon: 'kendoui',\n url: 'https://github.com/telerik/kendo-ui-core',\n npm: 'kendo-ui-core',\n test: function(win) {\n if (win.kendo && win.kendo.View && win.kendo.View.extend) {\n return {version: win.kendo.version || UNKNOWN_VERSION};\n }\n return false;\n }\n },\n 'Matter.js': {\n icon: 'matter-js',\n url: 'http://brm.io/matter-js/',\n npm: 'matter-js',\n test: function(win) {\n if (win.Matter && win.Matter.Engine) {\n return {version: UNKNOWN_VERSION};\n }\n return false;\n }\n },\n 'Riot': {\n icon: 'riot',\n url: 'http://riotjs.com/',\n npm: 'riot',\n test: function(win) {\n if (win.riot && win.riot.mixin) {\n return { version: win.riot.version || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n 'Sea.js': {\n icon: 'icon38',\n url: 'https://seajs.github.io/seajs/docs/',\n npm: 'seajs',\n test: function(win) {\n if(win.seajs && win.seajs.use) {\n return { version: win.seajs.version || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n 'Moment.js': {\n icon: 'momentjs',\n url: 'http://momentjs.com/',\n npm: 'moment',\n test: function(win) {\n if(win.moment && (win.moment.isMoment || win.moment.lang)) {\n // version 1.0.0 has neither \"isMoment\" nor \"version\"\n return { version: win.moment.version || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n 'Moment Timezone': {\n icon: 'momentjs',\n url: 'http://momentjs.com/timezone/',\n npm: 'moment-timezone',\n test: function(win) {\n if (win.moment && win.moment.tz) {\n return { version: win.moment.tz.version || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n 'ScrollMagic': {\n icon: 'scrollmagic',\n url: 'http://scrollmagic.io/',\n npm: 'scrollmagic',\n test: function(win) {\n if (win.ScrollMagic && win.ScrollMagic.Controller) {\n return {version: ScrollMagic.version || UNKNOWN_VERSION};\n }\n return false;\n }\n },\n 'SWFObject': {\n icon: 'icon38', // currently has no icon\n url: 'https://github.com/swfobject/swfobject',\n test: function(win) {\n if (win.swfobject && win.swfobject.embedSWF) {\n // 2.x - exact version only for 2.3\n return { version: win.swfobject.version || UNKNOWN_VERSION };\n } else if(win.deconcept && win.deconcept.SWFObject) {\n // 1.x\n return { version: UNKNOWN_VERSION };\n }\n return false;\n }\n },\n 'FlexSlider': {\n icon: 'icon38', // currently has no icon\n url: 'https://woocommerce.com/flexslider/',\n npm: 'flexslider',\n test: function(win) {\n var jq = win.jQuery || win.$ || win.$jq || win.$j;\n if (jq && jq.fn && jq.fn.jquery && jq.flexslider){\n return { version: UNKNOWN_VERSION };\n }\n return false;\n }\n },\n 'SPF': {\n icon: 'icon38', // currently has no icon\n url: 'https://youtube.github.io/spfjs/',\n npm: 'spf',\n test: function(win) {\n if (win.spf && win.spf.init) {\n return { version: UNKNOWN_VERSION };\n }\n return false;\n }\n },\n 'Numeral.js': {\n icon: 'icon38', // currently has no icon\n url: 'http://numeraljs.com/',\n npm: 'numeraljs',\n test: function(win) {\n if (win.numeral && win.isNumeral) {\n return { version: win.numeral.version || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n 'boomerang.js': {\n icon: 'icon38', // currently has no icon\n url: 'https://soasta.github.io/boomerang/',\n npm: 'boomerangjs',\n test: function(win) {\n if (win.BOOMR && win.BOOMR.utils && win.BOOMR.init) {\n return { version: win.BOOMR.version || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n 'Framer': {\n icon: 'framer',\n url: 'https://framer.com/',\n npm: 'framerjs',\n test: function(win) {\n if (win.Framer && win.Framer.Layer) {\n return { version: win.Framer.Version.build || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n 'Marko': {\n icon: 'marko',\n url: 'https://markojs.com/',\n npm: 'marko',\n test: function (win) {\n var selector = '[data-marko-key], [data-marko]';\n var markoElement = document.querySelector(selector);\n if (markoElement) {\n return { version: UNKNOWN_VERSION };\n }\n return false;\n }\n },\n 'AMP': {\n icon: 'amp',\n url: 'https://ampproject.org/',\n npm: null,\n test: function (win) {\n var version = win.document.documentElement.getAttribute(\"amp-version\");\n return version ? { version: version } : false;\n }\n },\n 'Workbox': {\n icon: 'workbox',\n url: 'https://developers.google.com/web/tools/workbox/',\n npm: 'workbox-sw',\n test: async function (win) {\n var nav = win.navigator;\n // Service Workers not supported\n if (!('serviceWorker' in nav)) {\n return false;\n }\n return nav.serviceWorker.getRegistration()\n .then(function(registration) {\n var scriptURL = nav.serviceWorker.controller.scriptURL;\n return fetch(scriptURL, { credentials: 'include',\n headers: { 'service-worker': 'script' }\n })\n .then(function(response) {\n return response.text();\n })\n .then(function(scriptContent) {\n var workboxRegExp = /new Workbox|new workbox|workbox\\.precaching\\.|workbox\\.strategies/gm;\n if (workboxRegExp.test(scriptContent)) {\n // Adapted from\n // https://github.com/semver/semver/issues/232#issue-48635632\n var semVerRegExp = /workbox.*?\\b((0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(-(0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(\\.(0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*)?(\\+[0-9a-zA-Z-]+(\\.[0-9a-zA-Z-]+)*)?)\\b/gim;\n var matches = semVerRegExp.exec(scriptContent);\n var version = UNKNOWN_VERSION;\n if (Array.isArray(matches) && matches.length > 1 && matches[1]) {\n version = matches[1];\n }\n return { version: version };\n }\n return false;\n });\n }).catch(function(exception) {\n return false;\n });\n }\n }\n};\n";
-
-
-
-
-
-function detectLibraries(){
-
-const libraries=[];
-
-
-
-
-Object.entries(d41d8cd98f00b204e9800998ecf8427e_LibraryDetectorTests).forEach(async([name,lib])=>{
-try{
-const result=await lib.test(window);
-if(result){
-libraries.push({
-name:name,
-version:result.version,
-npmPkgName:lib.npm});
-
-}
-}catch(e){}
-});
-
-return libraries;
-}
-
-class JSLibraries extends Gatherer{
-
-
-
-
-afterPass(passContext){
-const expression=`(function () {
- ${libDetectorSource};
- return (${detectLibraries.toString()}());
- })()`;
-
-return passContext.driver.evaluateAsync(expression);
-}}
-
-
-module.exports=JSLibraries;
-
-},{"../gatherer":48}],"../gather/gatherers/dobetterweb/optimized-images":[function(require,module,exports){
+},{"../../../lib/page-functions.js":75,"../gatherer.js":51}],"../gather/gatherers/dobetterweb/optimized-images":[function(require,module,exports){
@@ -12255,10 +12551,10 @@ module.exports=JSLibraries;
'use strict';
-const Gatherer=require('../gatherer');
-const URL=require('../../../lib/url-shim');
-const NetworkRequest=require('../../../lib/network-request');
-const Sentry=require('../../../lib/sentry');
+const Gatherer=require('../gatherer.js');
+const URL=require('../../../lib/url-shim.js');
+const NetworkRequest=require('../../../lib/network-request.js');
+const Sentry=require('../../../lib/sentry.js');
const Driver=require('../../driver.js');
@@ -12412,7 +12708,7 @@ return results;
module.exports=OptimizedImages;
-},{"../../../lib/network-request":71,"../../../lib/sentry":74,"../../../lib/url-shim":"url","../../driver.js":46,"../gatherer":48}],"../gather/gatherers/dobetterweb/password-inputs-with-prevented-paste":[function(require,module,exports){
+},{"../../../lib/network-request.js":74,"../../../lib/sentry.js":77,"../../../lib/url-shim.js":"url","../../driver.js":49,"../gatherer.js":51}],"../gather/gatherers/dobetterweb/password-inputs-with-prevented-paste":[function(require,module,exports){
@@ -12422,8 +12718,8 @@ module.exports=OptimizedImages;
-const Gatherer=require('../gatherer');
-const pageFunctions=require('../../../lib/page-functions');
+const Gatherer=require('../gatherer.js');
+const pageFunctions=require('../../../lib/page-functions.js');
@@ -12459,7 +12755,7 @@ return passContext.driver.evaluateAsync(`(() => {
module.exports=PasswordInputsWithPreventedPaste;
-},{"../../../lib/page-functions":72,"../gatherer":48}],"../gather/gatherers/dobetterweb/response-compression":[function(require,module,exports){
+},{"../../../lib/page-functions.js":75,"../gatherer.js":51}],"../gather/gatherers/dobetterweb/response-compression":[function(require,module,exports){
(function(Buffer){
@@ -12473,10 +12769,10 @@ module.exports=PasswordInputsWithPreventedPaste;
'use strict';
-const Gatherer=require('../gatherer');
-const URL=require('../../../lib/url-shim');
-const Sentry=require('../../../lib/sentry');
-const NetworkRequest=require('../../../lib/network-request');
+const Gatherer=require('../gatherer.js');
+const URL=require('../../../lib/url-shim.js');
+const Sentry=require('../../../lib/sentry.js');
+const NetworkRequest=require('../../../lib/network-request.js');
const gzip=require('zlib').gzip;
const CHROME_EXTENSION_PROTOCOL='chrome-extension:';
@@ -12585,7 +12881,7 @@ return record;
module.exports=ResponseCompression;
}).call(this,require("buffer").Buffer);
-},{"../../../lib/network-request":71,"../../../lib/sentry":74,"../../../lib/url-shim":"url","../gatherer":48,"buffer":94,"zlib":92}],"../gather/gatherers/dobetterweb/tags-blocking-first-paint":[function(require,module,exports){
+},{"../../../lib/network-request.js":74,"../../../lib/sentry.js":77,"../../../lib/url-shim.js":"url","../gatherer.js":51,"buffer":99,"zlib":97}],"../gather/gatherers/dobetterweb/tags-blocking-first-paint":[function(require,module,exports){
@@ -12607,7 +12903,7 @@ module.exports=ResponseCompression;
'use strict';
-const Gatherer=require('../gatherer');
+const Gatherer=require('../gatherer.js');
const Driver=require('../../driver.js');
@@ -12644,6 +12940,7 @@ return(
!scriptTag.hasAttribute('async')&&
!scriptTag.hasAttribute('defer')&&
!/^data:/.test(scriptTag.src)&&
+!/^blob:/.test(scriptTag.src)&&
scriptTag.getAttribute('type')!=='module');
}else if(tag.tagName==='LINK'){
@@ -12777,7 +13074,7 @@ return TagsBlockingFirstPaint.findBlockingTags(passContext.driver,loadData.netwo
module.exports=TagsBlockingFirstPaint;
-},{"../../driver.js":46,"../gatherer":48}],"../gather/gatherers/html-without-javascript":[function(require,module,exports){
+},{"../../driver.js":49,"../gatherer.js":51}],"../gather/gatherers/html-without-javascript":[function(require,module,exports){
@@ -12785,7 +13082,7 @@ module.exports=TagsBlockingFirstPaint;
'use strict';
-const Gatherer=require('./gatherer');
+const Gatherer=require('./gatherer.js');
@@ -12835,7 +13132,7 @@ hasNoScript};
module.exports=HTMLWithoutJavaScript;
-},{"./gatherer":48}],"../gather/gatherers/http-redirect":[function(require,module,exports){
+},{"./gatherer.js":51}],"../gather/gatherers/http-redirect":[function(require,module,exports){
@@ -12843,7 +13140,7 @@ module.exports=HTMLWithoutJavaScript;
'use strict';
-const Gatherer=require('./gatherer');
+const Gatherer=require('./gatherer.js');
@@ -12882,7 +13179,7 @@ value:isHttps};
module.exports=HTTPRedirect;
-},{"./gatherer":48}],"../gather/gatherers/image-elements":[function(require,module,exports){
+},{"./gatherer.js":51}],"../gather/gatherers/image-elements":[function(require,module,exports){
@@ -12894,7 +13191,7 @@ module.exports=HTTPRedirect;
'use strict';
-const Gatherer=require('./gatherer');
+const Gatherer=require('./gatherer.js');
const pageFunctions=require('../../lib/page-functions.js');
const Driver=require('../driver.js');
@@ -12902,7 +13199,6 @@ const Driver=require('../driver.js');
-function collectImageElementInfo(){
function getClientRect(element){
const clientRect=element.getBoundingClientRect();
@@ -12917,13 +13213,15 @@ right:clientRect.right};
-const allElements=getElementsInDocument();
+
+
+
+function getHTMLImages(allElements){
const allImageElements=allElements.filter(element=>{
return element.localName==='img';
});
-
-const htmlImages=allImageElements.map(element=>{
+return allImageElements.map(element=>{
const computedStyle=window.getComputedStyle(element);
return{
@@ -12942,30 +13240,30 @@ computedStyle.getPropertyValue('object-fit'))};
});
+}
+
+
+
+function getCSSImages(allElements){
+
+
const CSS_URL_REGEX=/^url\("([^"]+)"\)$/;
-const CSS_SIZE_REGEX=/(auto|contain|cover)/;
-const cssImages=allElements.reduce((images,element)=>{
+const images=[];
+
+for(const element of allElements){
const style=window.getComputedStyle(element);
-if(!style.backgroundImage||!CSS_URL_REGEX.test(style.backgroundImage)||
-!style.backgroundSize||!CSS_SIZE_REGEX.test(style.backgroundSize)){
-return images;
-}
+
+if(!style.backgroundImage||!CSS_URL_REGEX.test(style.backgroundImage))continue;
const imageMatch=style.backgroundImage.match(CSS_URL_REGEX);
const url=imageMatch[1];
-
-const differentImages=images.filter(image=>image.src!==url);
-if(images.length-differentImages.length>2){
-return differentImages;
-}
-
images.push({
src:url,
displayedWidth:element.clientWidth,
@@ -12979,11 +13277,18 @@ isPicture:false,
usesObjectFit:false,
resourceSize:0});
+}
return images;
-},[]);
+}
+
-return htmlImages.concat(cssImages);
+
+function collectImageElementInfo(){
+
+
+const allElements=getElementsInDocument();
+return getHTMLImages(allElements).concat(getCSSImages(allElements));
}
@@ -13045,16 +13350,23 @@ return map;
const expression=`(function() {
${pageFunctions.getElementsInDocumentString}; // define function on page
- return (${collectImageElementInfo.toString()})();
+ ${getClientRect.toString()};
+ ${getHTMLImages.toString()};
+ ${getCSSImages.toString()};
+ ${collectImageElementInfo.toString()};
+
+ return collectImageElementInfo();
})()`;
const elements=await driver.evaluateAsync(expression);
+
const imageUsage=[];
const top50Images=Object.values(indexedNetworkRecords).
sort((a,b)=>b.resourceSize-a.resourceSize).
slice(0,50);
+
for(let element of elements){
const networkRecord=indexedNetworkRecords[element.src]||{};
@@ -13088,7 +13400,7 @@ return imageUsage;
module.exports=ImageElements;
-},{"../../lib/page-functions.js":72,"../driver.js":46,"./gatherer":48}],"../gather/gatherers/js-usage":[function(require,module,exports){
+},{"../../lib/page-functions.js":75,"../driver.js":49,"./gatherer.js":51}],"../gather/gatherers/js-usage":[function(require,module,exports){
@@ -13096,7 +13408,7 @@ module.exports=ImageElements;
'use strict';
-const Gatherer=require('./gatherer');
+const Gatherer=require('./gatherer.js');
@@ -13126,7 +13438,7 @@ return coverageResponse.result;
module.exports=JsUsage;
-},{"./gatherer":48}],"../gather/gatherers/link-elements":[function(require,module,exports){
+},{"./gatherer.js":51}],"../gather/gatherers/link-elements":[function(require,module,exports){
@@ -13249,7 +13561,7 @@ return linkElements;
module.exports=LinkElements;
-},{"../../lib/dependency-graph/simulator/network-analyzer.js":57,"../../lib/page-functions.js":72,"../../lib/url-shim.js":"url","./gatherer.js":48,"http-link-header":101}],"../gather/gatherers/meta-elements":[function(require,module,exports){
+},{"../../lib/dependency-graph/simulator/network-analyzer.js":60,"../../lib/page-functions.js":75,"../../lib/url-shim.js":"url","./gatherer.js":51,"http-link-header":106}],"../gather/gatherers/meta-elements":[function(require,module,exports){
@@ -13285,7 +13597,7 @@ return driver.evaluateAsync(`(() => {
module.exports=MetaElements;
-},{"../../lib/page-functions.js":72,"./gatherer.js":48}],"../gather/gatherers/mixed-content":[function(require,module,exports){
+},{"../../lib/page-functions.js":75,"./gatherer.js":51}],"../gather/gatherers/mixed-content":[function(require,module,exports){
(function(Buffer){
@@ -13294,8 +13606,8 @@ module.exports=MetaElements;
'use strict';
-const Gatherer=require('./gatherer');
-const URL=require('../../lib/url-shim');
+const Gatherer=require('./gatherer.js');
+const URL=require('../../lib/url-shim.js');
const Driver=require('../driver.js');
@@ -13409,7 +13721,7 @@ return{url:passContext.url};
module.exports=MixedContent;
}).call(this,require("buffer").Buffer);
-},{"../../lib/url-shim":"url","../driver.js":46,"./gatherer":48,"buffer":94}],"../gather/gatherers/offline":[function(require,module,exports){
+},{"../../lib/url-shim.js":"url","../driver.js":49,"./gatherer.js":51,"buffer":99}],"../gather/gatherers/offline":[function(require,module,exports){
@@ -13417,8 +13729,8 @@ module.exports=MixedContent;
'use strict';
-const Gatherer=require('./gatherer');
-const URL=require('../../lib/url-shim');
+const Gatherer=require('./gatherer.js');
+const URL=require('../../lib/url-shim.js');
class Offline extends Gatherer{
@@ -13446,7 +13758,7 @@ then(_=>navigationRecord?navigationRecord.statusCode:-1);
module.exports=Offline;
-},{"../../lib/url-shim":"url","./gatherer":48}],"../gather/gatherers/runtime-exceptions":[function(require,module,exports){
+},{"../../lib/url-shim.js":"url","./gatherer.js":51}],"../gather/gatherers/runtime-exceptions":[function(require,module,exports){
@@ -13459,7 +13771,7 @@ module.exports=Offline;
'use strict';
-const Gatherer=require('./gatherer');
+const Gatherer=require('./gatherer.js');
class RuntimeExceptions extends Gatherer{
constructor(){
@@ -13496,7 +13808,7 @@ return this._exceptions;
module.exports=RuntimeExceptions;
-},{"./gatherer":48}],"../gather/gatherers/script-elements":[function(require,module,exports){
+},{"./gatherer.js":51}],"../gather/gatherers/script-elements":[function(require,module,exports){
@@ -13508,6 +13820,9 @@ const Gatherer=require('./gatherer.js');
const NetworkAnalyzer=require('../../lib/dependency-graph/simulator/network-analyzer.js');
const NetworkRequest=require('../../lib/network-request.js');
const getElementsInDocumentString=require('../../lib/page-functions.js').getElementsInDocumentString;
+const pageFunctions=require('../../lib/page-functions.js');
+
+
@@ -13525,6 +13840,8 @@ src:script.src||null,
async:script.async,
defer:script.defer,
source:script.closest('head')?'head':'body',
+
+devtoolsNodePath:getNodePath(script),
content:script.src?null:script.text,
requestId:null};
@@ -13547,6 +13864,7 @@ const mainResource=NetworkAnalyzer.findMainDocument(loadData.networkRecords,pass
const scripts=await driver.evaluateAsync(`(() => {
${getElementsInDocumentString}
+ ${pageFunctions.getNodePathString};
return (${collectAllScriptElements.toString()})();
})()`,{useIsolation:true});
@@ -13571,6 +13889,7 @@ matchedScriptElement.requestId=record.requestId;
matchedScriptElement.content=content;
}else{
scripts.push({
+devtoolsNodePath:'',
type:null,
src:record.url,
async:false,
@@ -13589,7 +13908,7 @@ return scripts;
module.exports=ScriptElements;
-},{"../../lib/dependency-graph/simulator/network-analyzer.js":57,"../../lib/network-request.js":71,"../../lib/page-functions.js":72,"./gatherer.js":48}],"../gather/gatherers/seo/embedded-content":[function(require,module,exports){
+},{"../../lib/dependency-graph/simulator/network-analyzer.js":60,"../../lib/network-request.js":74,"../../lib/page-functions.js":75,"./gatherer.js":51}],"../gather/gatherers/seo/embedded-content":[function(require,module,exports){
@@ -13597,7 +13916,7 @@ module.exports=ScriptElements;
'use strict';
-const Gatherer=require('../gatherer');
+const Gatherer=require('../gatherer.js');
const pageFunctions=require('../../../lib/page-functions.js');
class EmbeddedContent extends Gatherer{
@@ -13632,7 +13951,7 @@ return passContext.driver.evaluateAsync(expression);
module.exports=EmbeddedContent;
-},{"../../../lib/page-functions.js":72,"../gatherer":48}],"../gather/gatherers/seo/font-size":[function(require,module,exports){
+},{"../../../lib/page-functions.js":75,"../gatherer.js":51}],"../gather/gatherers/seo/font-size":[function(require,module,exports){
@@ -13651,7 +13970,7 @@ module.exports=EmbeddedContent;
-const Gatherer=require('../gatherer');
+const Gatherer=require('../gatherer.js');
const Sentry=require('../../../lib/sentry.js');
const FONT_SIZE_PROPERTY_NAME='font-size';
const TEXT_NODE_BLOCK_LIST=new Set(['SCRIPT','STYLE','NOSCRIPT']);
@@ -13995,7 +14314,7 @@ module.exports.TEXT_NODE_TYPE=TEXT_NODE_TYPE;
module.exports.computeSelectorSpecificity=computeSelectorSpecificity;
module.exports.getEffectiveFontRule=getEffectiveFontRule;
-},{"../../../lib/sentry.js":74,"../gatherer":48}],"../gather/gatherers/seo/robots-txt":[function(require,module,exports){
+},{"../../../lib/sentry.js":77,"../gatherer.js":51}],"../gather/gatherers/seo/robots-txt":[function(require,module,exports){
@@ -14003,7 +14322,7 @@ module.exports.getEffectiveFontRule=getEffectiveFontRule;
'use strict';
-const Gatherer=require('../gatherer');
+const Gatherer=require('../gatherer.js');
@@ -14036,7 +14355,7 @@ return passContext.driver.evaluateAsync(`(${getRobotsTxtContent.toString()}())`)
module.exports=RobotsTxt;
-},{"../gatherer":48}],"../gather/gatherers/seo/tap-targets":[function(require,module,exports){
+},{"../gatherer.js":51}],"../gather/gatherers/seo/tap-targets":[function(require,module,exports){
@@ -14046,9 +14365,14 @@ module.exports=RobotsTxt;
-const Gatherer=require('../gatherer');
+const Gatherer=require('../gatherer.js');
const pageFunctions=require('../../../lib/page-functions.js');
-const{rectContainsString,rectContains}=require('../../../lib/rect-helpers');
+const{
+rectContains,
+getRectArea,
+getRectCenterPoint,
+getLargestRect}=
+require('../../../lib/rect-helpers.js');
const TARGET_SELECTORS=[
'button',
@@ -14109,64 +14433,6 @@ return true;
-function allClientRectsEmpty(clientRects){
-return clientRects.every(cr=>cr.width===0&&cr.height===0);
-}
-
-
-
-
-
-function getVisibleClientRects(element){
-if(!elementIsVisible(element)){
-return[];
-}
-
-let clientRects=getClientRects(element);
-
-if(allClientRectsEmpty(clientRects)){
-return[];
-}
-
-
-
-
-
-
-clientRects=filterClientRectsWithinAncestorsVisibleScrollArea(element,clientRects);
-
-return clientRects;
-}
-
-
-
-
-
-
-
-
-function filterClientRectsWithinAncestorsVisibleScrollArea(element,clientRects){
-const parent=element.parentElement;
-if(!parent){
-return clientRects;
-}
-if(getComputedStyle(parent).overflowY!=='visible'){
-const parentBCR=parent.getBoundingClientRect();
-clientRects=clientRects.filter(cr=>rectContains(parentBCR,cr));
-}
-if(parent.parentElement&&parent.parentElement.tagName!=='BODY'){
-return filterClientRectsWithinAncestorsVisibleScrollArea(
-parent,
-clientRects);
-
-}
-return clientRects;
-}
-
-
-
-
-
function getClientRects(element){
const clientRects=Array.from(
@@ -14264,28 +14530,59 @@ return false;
-function elementIsPositionFixedStickyOrAbsolute(element){
-const{position}=getComputedStyle(element);
-if(position==='fixed'||position==='absolute'||position==='sticky'){
-return true;
+
+function truncate(str,maxLength){
+if(str.length<=maxLength){
+return str;
}
-if(element.parentElement){
-return elementIsPositionFixedStickyOrAbsolute(element.parentElement);
+return str.slice(0,maxLength-1)+'…';
}
-return false;
+
+
+
+
+
+
+function elementCenterIsAtZAxisTop(el,elCenterPoint){
+const viewportHeight=window.innerHeight;
+const targetScrollY=Math.floor(elCenterPoint.y/viewportHeight)*viewportHeight;
+if(window.scrollY!==targetScrollY){
+window.scrollTo(0,targetScrollY);
}
+const topEl=document.elementFromPoint(
+elCenterPoint.x,
+elCenterPoint.y-window.scrollY);
+return topEl===el||el.contains(topEl);
+}
-function truncate(str,maxLength){
-if(str.length<=maxLength){
-return str;
+
+
+
+function disableFixedAndStickyElementPointerEvents(){
+const className='lighthouse-disable-pointer-events';
+const styleTag=document.createElement('style');
+styleTag.textContent=`.${className} { pointer-events: none !important }`;
+document.body.appendChild(styleTag);
+
+document.querySelectorAll('*').forEach(el=>{
+const position=getComputedStyle(el).position;
+if(position==='fixed'||position==='sticky'){
+el.classList.add(className);
}
-return str.slice(0,maxLength-1)+'…';
+});
+
+return function undo(){
+Array.from(document.getElementsByClassName(className)).forEach(el=>{
+el.classList.remove(className);
+});
+styleTag.remove();
+};
}
@@ -14297,9 +14594,17 @@ function gatherTapTargets(){
const targets=[];
+window.scrollTo(0,0);
+
+
const tapTargetElements=getElementsInDocument(tapTargetsSelector);
+
+
+
+
+const tapTargetsWithClientRects=[];
tapTargetElements.forEach(tapTargetElement=>{
if(elementHasAncestorTapTarget(tapTargetElement)){
@@ -14312,20 +14617,54 @@ if(elementIsInTextBlock(tapTargetElement)){
return;
}
-if(elementIsPositionFixedStickyOrAbsolute(tapTargetElement)){
+if(!elementIsVisible(tapTargetElement)){
+return;
+}
+
+tapTargetsWithClientRects.push({
+tapTargetElement,
+clientRects:getClientRects(tapTargetElement)});
+});
-return;
-}
+const reenableFixedAndStickyElementPointerEvents=disableFixedAndStickyElementPointerEvents();
+
+
+
+
+
+const tapTargetsWithVisibleClientRects=[];
+
+
+
+tapTargetsWithClientRects.forEach(({tapTargetElement,clientRects})=>{
+
+let visibleClientRects=clientRects.filter(cr=>cr.width!==0&&cr.height!==0);
+
+
+
+
+
+
+visibleClientRects=visibleClientRects.filter(rect=>{
+
+
+const rectCenterPoint=getRectCenterPoint(rect);
+return elementCenterIsAtZAxisTop(tapTargetElement,rectCenterPoint);
+});
+
+if(visibleClientRects.length>0){
+tapTargetsWithVisibleClientRects.push({
+tapTargetElement,
+visibleClientRects});
-const visibleClientRects=getVisibleClientRects(tapTargetElement);
-if(visibleClientRects.length===0){
-return;
}
+});
+for(const{tapTargetElement,visibleClientRects}of tapTargetsWithVisibleClientRects){
targets.push({
clientRects:visibleClientRects,
snippet:truncate(tapTargetElement.outerHTML,300),
@@ -14333,9 +14672,13 @@ snippet:truncate(tapTargetElement.outerHTML,300),
path:getNodePath(tapTargetElement),
selector:getNodeSelector(tapTargetElement),
+
+nodeLabel:getNodeLabel(tapTargetElement),
href:tapTargetElement['href']||''});
-});
+}
+
+reenableFixedAndStickyElementPointerEvents();
return targets;
}
@@ -14349,19 +14692,21 @@ afterPass(passContext){
const expression=`(function() {
const tapTargetsSelector = "${tapTargetsSelector}";
${pageFunctions.getElementsInDocumentString};
- ${filterClientRectsWithinAncestorsVisibleScrollArea.toString()};
- ${elementIsPositionFixedStickyOrAbsolute.toString()};
+ ${disableFixedAndStickyElementPointerEvents.toString()};
${elementIsVisible.toString()};
${elementHasAncestorTapTarget.toString()};
- ${getVisibleClientRects.toString()};
+ ${elementCenterIsAtZAxisTop.toString()}
${truncate.toString()};
${getClientRects.toString()};
${hasTextNodeSiblingsFormingTextBlock.toString()};
${elementIsInTextBlock.toString()};
- ${allClientRectsEmpty.toString()};
- ${rectContainsString};
+ ${getRectArea.toString()};
+ ${getLargestRect.toString()};
+ ${getRectCenterPoint.toString()};
+ ${rectContains.toString()};
${pageFunctions.getNodePathString};
${pageFunctions.getNodeSelectorString};
+ ${pageFunctions.getNodeLabelString};
${gatherTapTargets.toString()};
return gatherTapTargets();
@@ -14373,7 +14718,7 @@ return passContext.driver.evaluateAsync(expression,{useIsolation:true});
module.exports=TapTargets;
-},{"../../../lib/page-functions.js":72,"../../../lib/rect-helpers":73,"../gatherer":48}],"../gather/gatherers/service-worker":[function(require,module,exports){
+},{"../../../lib/page-functions.js":75,"../../../lib/rect-helpers.js":76,"../gatherer.js":51}],"../gather/gatherers/service-worker":[function(require,module,exports){
@@ -14381,7 +14726,7 @@ module.exports=TapTargets;
'use strict';
-const Gatherer=require('./gatherer');
+const Gatherer=require('./gatherer.js');
class ServiceWorker extends Gatherer{
@@ -14401,7 +14746,7 @@ registrations};
module.exports=ServiceWorker;
-},{"./gatherer":48}],"../gather/gatherers/start-url":[function(require,module,exports){
+},{"./gatherer.js":51}],"../gather/gatherers/start-url":[function(require,module,exports){
@@ -14409,7 +14754,7 @@ module.exports=ServiceWorker;
'use strict';
-const Gatherer=require('./gatherer');
+const Gatherer=require('./gatherer.js');
@@ -14497,7 +14842,7 @@ then(()=>Promise.race([fetchPromise,timeoutPromise]));
module.exports=StartUrl;
-},{"./gatherer":48}],"../gather/gatherers/viewport-dimensions":[function(require,module,exports){
+},{"./gatherer.js":51}],"../gather/gatherers/viewport-dimensions":[function(require,module,exports){
@@ -14505,7 +14850,7 @@ module.exports=StartUrl;
'use strict';
-const Gatherer=require('./gatherer');
+const Gatherer=require('./gatherer.js');
@@ -14550,7 +14895,7 @@ return dimensions;
module.exports=ViewportDimensions;
-},{"./gatherer":48}],1:[function(require,module,exports){
+},{"./gatherer.js":51}],1:[function(require,module,exports){
@@ -14618,7 +14963,7 @@ self.runLighthouseInWorker=runLighthouseInWorker;
self.listenForStatus=listenForStatus;
}
-},{"../lighthouse-core/gather/connections/raw.js":44,"../lighthouse-core/index.js":49,"lighthouse-logger":120}],2:[function(require,module,exports){
+},{"../lighthouse-core/gather/connections/raw.js":47,"../lighthouse-core/index.js":52,"lighthouse-logger":125}],2:[function(require,module,exports){
(function(__filename){
@@ -14632,7 +14977,7 @@ self.listenForStatus=listenForStatus;
-const Audit=require('../audit');
+const Audit=require('../audit.js');
const i18n=require('../../lib/i18n/i18n.js');
const UIStrings={
@@ -14656,7 +15001,7 @@ const notApplicables=artifacts.Accessibility.notApplicable||[];
const isNotApplicable=notApplicables.find(result=>result.id===this.meta.id);
if(isNotApplicable){
return{
-rawValue:true,
+score:1,
notApplicable:true};
}
@@ -14675,7 +15020,8 @@ type:'node',
selector:Array.isArray(node.target)?node.target.join(' '):'',
path:node.path,
snippet:node.html||node.snippet,
-explanation:node.failureSummary}}));
+explanation:node.failureSummary,
+nodeLabel:node.nodeLabel}}));
}
@@ -14686,21 +15032,21 @@ const headings=[
-let diagnostic;
+let debugData;
if(impact||tags){
-diagnostic={
-type:'diagnostic',
+debugData={
+type:'debugdata',
impact,
tags};
}
return{
-rawValue:typeof rule==='undefined',
+score:Number(rule===undefined),
extendedInfo:{
value:rule},
-details:{...Audit.makeTableDetails(headings,items),diagnostic}};
+details:{...Audit.makeTableDetails(headings,items),debugData}};
}}
@@ -14709,7 +15055,7 @@ module.exports=AxeAudit;
module.exports.UIStrings=UIStrings;
}).call(this,"/lighthouse-core/audits/accessibility/axe-audit.js");
-},{"../../lib/i18n/i18n.js":63,"../audit":3}],3:[function(require,module,exports){
+},{"../../lib/i18n/i18n.js":66,"../audit.js":3}],3:[function(require,module,exports){
@@ -14717,8 +15063,8 @@ module.exports.UIStrings=UIStrings;
'use strict';
-const statistics=require('../lib/statistics');
-const Util=require('../report/html/renderer/util');
+const statistics=require('../lib/statistics.js');
+const Util=require('../report/html/renderer/util.js');
const DEFAULT_PASS='defaultPass';
@@ -14806,18 +15152,6 @@ return clampTo2Decimals(score);
-static generateErrorAuditResult(audit,errorMessage){
-return Audit.generateAuditResult(audit,{
-rawValue:null,
-errorMessage});
-
-}
-
-
-
-
-
-
static makeTableDetails(headings,results,summary){
if(results.length===0){
@@ -14925,21 +15259,34 @@ overallSavingsBytes};
-static _normalizeAuditScore(audit,result){
-let score=result.score===undefined?Number(result.rawValue):result.score;
+static _normalizeAuditScore(score,scoreDisplayMode,auditId){
+if(scoreDisplayMode!==Audit.SCORING_MODES.BINARY&&
+scoreDisplayMode!==Audit.SCORING_MODES.NUMERIC){
+return null;
+}
+
-if(!Number.isFinite(score))throw new Error(`Invalid score: ${score}`);
-if(score>1)throw new Error(`Audit score for ${audit.meta.id} is > 1`);
-if(score<0)throw new Error(`Audit score for ${audit.meta.id} is < 0`);
+if(score===null||!Number.isFinite(score)){
+throw new Error(`Invalid score for ${auditId}: ${score}`);
+}
+if(score>1)throw new Error(`Audit score for ${auditId} is > 1`);
+if(score<0)throw new Error(`Audit score for ${auditId} is < 0`);
score=clampTo2Decimals(score);
-const scoreDisplayMode=audit.meta.scoreDisplayMode||Audit.SCORING_MODES.BINARY;
+return score;
+}
+
+
+
-return{
-score,
-scoreDisplayMode};
+
+
+static generateErrorAuditResult(audit,errorMessage){
+return Audit.generateAuditResult(audit,{
+score:null,
+errorMessage});
}
@@ -14948,36 +15295,32 @@ scoreDisplayMode};
-static generateAuditResult(audit,result){
-if(typeof result.rawValue==='undefined'){
-throw new Error('generateAuditResult requires a rawValue');
+static generateAuditResult(audit,product){
+if(product.score===undefined){
+throw new Error('generateAuditResult requires a score');
}
-let{score,scoreDisplayMode}=Audit._normalizeAuditScore(audit,result);
+let scoreDisplayMode=audit.meta.scoreDisplayMode||Audit.SCORING_MODES.BINARY;
-if(result.notApplicable){
-scoreDisplayMode=Audit.SCORING_MODES.NOT_APPLICABLE;
-result.rawValue=true;
-}
+if(product.errorMessage){
-if(result.errorMessage){
scoreDisplayMode=Audit.SCORING_MODES.ERROR;
+}else if(product.notApplicable){
+
+scoreDisplayMode=Audit.SCORING_MODES.NOT_APPLICABLE;
}
+const score=Audit._normalizeAuditScore(product.score,scoreDisplayMode,audit.meta.id);
+
let auditTitle=audit.meta.title;
if(audit.meta.failureTitle){
-if(Number(score)<Util.PASS_THRESHOLD){
+if(score!==null&&score<Util.PASS_THRESHOLD){
auditTitle=audit.meta.failureTitle;
}
}
-if(scoreDisplayMode!==Audit.SCORING_MODES.BINARY&&
-scoreDisplayMode!==Audit.SCORING_MODES.NUMERIC){
-score=null;
-}
-
return{
id:audit.meta.id,
title:auditTitle,
@@ -14985,21 +15328,21 @@ description:audit.meta.description,
score,
scoreDisplayMode,
-rawValue:result.rawValue,
+numericValue:product.numericValue,
-displayValue:result.displayValue,
-explanation:result.explanation,
-errorMessage:result.errorMessage,
-warnings:result.warnings,
+displayValue:product.displayValue,
+explanation:product.explanation,
+errorMessage:product.errorMessage,
+warnings:product.warnings,
-details:result.details};
+details:product.details};
}}
module.exports=Audit;
-},{"../lib/statistics":75,"../report/html/renderer/util":80}],4:[function(require,module,exports){
+},{"../lib/statistics.js":80,"../report/html/renderer/util.js":85}],4:[function(require,module,exports){
(function(__filename){
@@ -15008,8 +15351,8 @@ module.exports=Audit;
'use strict';
-const Audit=require('../audit');
-const linearInterpolation=require('../../lib/statistics').linearInterpolation;
+const Audit=require('../audit.js');
+const linearInterpolation=require('../../lib/statistics.js').linearInterpolation;
const Interactive=require('../../computed/metrics/lantern-interactive.js');
const i18n=require('../../lib/i18n/i18n.js');
const NetworkRecords=require('../../computed/network-records.js');
@@ -15211,7 +15554,7 @@ return{
explanation:result.explanation,
warnings:result.warnings,
displayValue,
-rawValue:wastedMs,
+numericValue:wastedMs,
score:UnusedBytes.scoreForWastedMs(wastedMs),
extendedInfo:{
value:{
@@ -15242,7 +15585,7 @@ throw new Error('audit_ unimplemented');
module.exports=UnusedBytes;
}).call(this,"/lighthouse-core/audits/byte-efficiency/byte-efficiency-audit.js");
-},{"../../computed/load-simulator.js":10,"../../computed/metrics/lantern-interactive.js":23,"../../computed/network-records.js":31,"../../computed/page-dependency-graph.js":32,"../../lib/i18n/i18n.js":63,"../../lib/statistics":75,"../audit":3}],5:[function(require,module,exports){
+},{"../../computed/load-simulator.js":10,"../../computed/metrics/lantern-interactive.js":23,"../../computed/network-records.js":31,"../../computed/page-dependency-graph.js":32,"../../lib/i18n/i18n.js":66,"../../lib/statistics.js":80,"../audit.js":3}],5:[function(require,module,exports){
@@ -15255,7 +15598,7 @@ module.exports=UnusedBytes;
-const Audit=require('../audit');
+const Audit=require('../audit.js');
class ManualAudit extends Audit{
@@ -15273,7 +15616,7 @@ requiredArtifacts:[]};
static audit(){
return{
-rawValue:false};
+score:0};
}}
@@ -15281,7 +15624,7 @@ rawValue:false};
module.exports=ManualAudit;
-},{"../audit":3}],6:[function(require,module,exports){
+},{"../audit.js":3}],6:[function(require,module,exports){
@@ -15293,7 +15636,7 @@ module.exports=ManualAudit;
-const Audit=require('./audit');
+const Audit=require('./audit.js');
class MultiCheckAudit extends Audit{
@@ -15328,7 +15671,7 @@ detailsItem[check.id]=check.passing;
const details={
-type:'diagnostic',
+type:'debugdata',
items:[detailsItem]};
@@ -15336,7 +15679,7 @@ items:[detailsItem]};
if(result.failures.length>0){
return{
-rawValue:false,
+score:0,
explanation:`Failures: ${result.failures.join(',\n')}.`,
details};
@@ -15344,7 +15687,7 @@ details};
return{
-rawValue:true,
+score:1,
details};
}
@@ -15365,7 +15708,7 @@ throw new Error('audit_ unimplemented');
module.exports=MultiCheckAudit;
-},{"./audit":3}],7:[function(require,module,exports){
+},{"./audit.js":3}],7:[function(require,module,exports){
@@ -15373,7 +15716,7 @@ module.exports=MultiCheckAudit;
'use strict';
-const Audit=require('./audit');
+const Audit=require('./audit.js');
class ViolationAudit extends Audit{
@@ -15383,7 +15726,7 @@ class ViolationAudit extends Audit{
static getViolationResults(artifacts,pattern){
const seen=new Set();
-return artifacts.ChromeConsoleMessages.
+return artifacts.ConsoleMessages.
map(message=>message.entry).
filter(entry=>entry.url&&entry.source==='violation'&&pattern.test(entry.text)).
map(entry=>({label:`line: ${entry.lineNumber}`,url:entry.url})).
@@ -15400,7 +15743,7 @@ return true;
module.exports=ViolationAudit;
-},{"./audit":3}],8:[function(require,module,exports){
+},{"./audit.js":3}],8:[function(require,module,exports){
@@ -15456,7 +15799,7 @@ return Object.assign(computableArtifact,{request});
module.exports=makeComputedArtifact;
-},{"../lib/arbitrary-equality-map.js":50,"lighthouse-logger":120}],9:[function(require,module,exports){
+},{"../lib/arbitrary-equality-map.js":53,"lighthouse-logger":125}],9:[function(require,module,exports){
@@ -15488,6 +15831,14 @@ return false;
}
+
+
+
+while(request.redirectDestination){
+request=request.redirectDestination;
+}
+
+
const isIframe=request.resourceType===NetworkRequest.TYPES.Document&&
request.frameId!==mainResource.frameId;
@@ -15617,7 +15968,7 @@ return CriticalRequestChains.extractChain(networkRecords,mainResource);
module.exports=makeComputedArtifact(CriticalRequestChains);
-},{"../lib/network-request.js":71,"./computed-artifact.js":8,"./main-resource.js":11,"./network-records.js":31,"assert":84}],10:[function(require,module,exports){
+},{"../lib/network-request.js":74,"./computed-artifact.js":8,"./main-resource.js":11,"./network-records.js":31,"assert":89}],10:[function(require,module,exports){
@@ -15710,7 +16061,7 @@ return lanternData;
module.exports=makeComputedArtifact(LoadSimulator);
-},{"../config/constants.js":40,"../lib/dependency-graph/simulator/simulator.js":58,"./computed-artifact.js":8,"./network-analysis.js":30}],11:[function(require,module,exports){
+},{"../config/constants.js":43,"../lib/dependency-graph/simulator/simulator.js":61,"./computed-artifact.js":8,"./network-analysis.js":30}],11:[function(require,module,exports){
@@ -15746,7 +16097,7 @@ return mainResource;
module.exports=makeComputedArtifact(MainResource);
-},{"../lib/dependency-graph/simulator/network-analyzer.js":57,"./computed-artifact.js":8,"./network-records.js":31}],12:[function(require,module,exports){
+},{"../lib/dependency-graph/simulator/network-analyzer.js":60,"./computed-artifact.js":8,"./network-records.js":31}],12:[function(require,module,exports){
@@ -16026,7 +16377,7 @@ return MainThreadTasks.getMainThreadTasks(mainThreadEvents,timestamps.traceEnd);
module.exports=makeComputedArtifact(MainThreadTasks);
-},{"../lib/task-groups.js":77,"./computed-artifact.js":8,"./trace-of-tab.js":35}],13:[function(require,module,exports){
+},{"../lib/task-groups.js":82,"./computed-artifact.js":8,"./trace-of-tab.js":36}],13:[function(require,module,exports){
@@ -16145,7 +16496,7 @@ allChecks:remainingChecks};
module.exports=makeComputedArtifact(ManifestValues);
-},{"../lib/icons.js":65,"./computed-artifact.js":8}],14:[function(require,module,exports){
+},{"../lib/icons.js":68,"./computed-artifact.js":8}],14:[function(require,module,exports){
@@ -16221,7 +16572,7 @@ timing:EstimatedInputLatency.calculateRollingWindowEIL(events)});
module.exports=makeComputedArtifact(EstimatedInputLatency);
-},{"../../lib/lh-error.js":67,"../../lib/traces/tracing-processor.js":79,"../computed-artifact.js":8,"./lantern-estimated-input-latency.js":19,"./metric.js":28}],15:[function(require,module,exports){
+},{"../../lib/lh-error.js":70,"../../lib/traces/tracing-processor.js":84,"../computed-artifact.js":8,"./lantern-estimated-input-latency.js":19,"./metric.js":28}],15:[function(require,module,exports){
@@ -16475,7 +16826,7 @@ timestamp:valueInMs*1000+navStart});
module.exports=makeComputedArtifact(FirstCPUIdle);
-},{"../../lib/lh-error.js":67,"../../lib/traces/tracing-processor.js":79,"../computed-artifact.js":8,"./lantern-first-cpu-idle.js":21,"./metric.js":28}],17:[function(require,module,exports){
+},{"../../lib/lh-error.js":70,"../../lib/traces/tracing-processor.js":84,"../computed-artifact.js":8,"./lantern-first-cpu-idle.js":21,"./metric.js":28}],17:[function(require,module,exports){
@@ -16518,7 +16869,7 @@ timestamp:traceOfTab.timestamps.firstMeaningfulPaint};
module.exports=makeComputedArtifact(FirstMeaningfulPaint);
-},{"../../lib/lh-error.js":67,"../computed-artifact.js":8,"./lantern-first-meaningful-paint.js":22,"./metric.js":28}],18:[function(require,module,exports){
+},{"../../lib/lh-error.js":70,"../computed-artifact.js":8,"./lantern-first-meaningful-paint.js":22,"./metric.js":28}],18:[function(require,module,exports){
@@ -16709,7 +17060,7 @@ module.exports=makeComputedArtifact(Interactive);
-},{"../../lib/lh-error.js":67,"../../lib/network-recorder.js":70,"../../lib/traces/tracing-processor.js":79,"../computed-artifact.js":8,"./lantern-interactive.js":23,"./metric.js":28}],19:[function(require,module,exports){
+},{"../../lib/lh-error.js":70,"../../lib/network-recorder.js":73,"../../lib/traces/tracing-processor.js":84,"../computed-artifact.js":8,"./lantern-interactive.js":23,"./metric.js":28}],19:[function(require,module,exports){
@@ -16812,7 +17163,7 @@ return events.sort((a,b)=>a.start-b.start);
module.exports=makeComputedArtifact(LanternEstimatedInputLatency);
-},{"../../lib/dependency-graph/base-node.js":52,"../computed-artifact.js":8,"./estimated-input-latency.js":14,"./lantern-first-meaningful-paint.js":22,"./lantern-metric.js":25}],20:[function(require,module,exports){
+},{"../../lib/dependency-graph/base-node.js":55,"../computed-artifact.js":8,"./estimated-input-latency.js":14,"./lantern-first-meaningful-paint.js":22,"./lantern-metric.js":25}],20:[function(require,module,exports){
@@ -16826,6 +17177,8 @@ const BaseNode=require('../../lib/dependency-graph/base-node.js');
+
+
class LanternFirstContentfulPaint extends LanternMetric{
@@ -16843,24 +17196,93 @@ pessimistic:0.5};
-static getOptimisticGraph(dependencyGraph,traceOfTab){
-const fcp=traceOfTab.timestamps.firstContentfulPaint;
-const blockingScriptUrls=LanternMetric.getScriptUrls(dependencyGraph,node=>{
-return(
-node.endTime<=fcp&&node.hasRenderBlockingPriority()&&node.initiatorType!=='script');
-});
-return dependencyGraph.cloneWithRelationships(node=>{
-if(node.endTime>fcp&&!node.isMainDocument())return false;
+
+
+
+
+
+
+
+static getBlockingNodeData(
+graph,
+filterTimestamp,
+blockingScriptFilter,
+extraBlockingCpuNodesToIncludeFilter)
+{
+
+const scriptUrlToNodeMap=new Map();
+
+
+const cpuNodes=[];
+graph.traverse(node=>{
if(node.type===BaseNode.TYPES.CPU){
-return node.isEvaluateScriptFor(blockingScriptUrls);
+
+
+if(node.startTime<=filterTimestamp)cpuNodes.push(node);
+
+
+const scriptUrls=node.getEvaluateScriptURLs();
+for(const url of scriptUrls){
+
+const existing=scriptUrlToNodeMap.get(url)||node;
+scriptUrlToNodeMap.set(url,node.startTime<existing.startTime?node:existing);
+}
}
+});
+
+cpuNodes.sort((a,b)=>a.startTime-b.startTime);
-return node.hasRenderBlockingPriority()&&node.initiatorType!=='script';
+const possiblyRenderBlockingScriptUrls=LanternMetric.getScriptUrls(graph,node=>{
+return node.endTime<=filterTimestamp&&blockingScriptFilter(node);
});
+
+
+
+const definitelyNotRenderBlockingScriptUrls=new Set();
+
+const blockingCpuNodeIds=new Set();
+for(const url of possiblyRenderBlockingScriptUrls){
+
+const cpuNodeForUrl=scriptUrlToNodeMap.get(url);
+
+
+if(!cpuNodeForUrl)continue;
+
+
+if(cpuNodes.includes(cpuNodeForUrl)){
+blockingCpuNodeIds.add(cpuNodeForUrl.id);
+continue;
+}
+
+
+
+definitelyNotRenderBlockingScriptUrls.add(url);
+}
+
+
+
+const firstLayout=cpuNodes.find(node=>node.didPerformLayout());
+if(firstLayout)blockingCpuNodeIds.add(firstLayout.id);
+const firstPaint=cpuNodes.find(node=>node.childEvents.some(e=>e.name==='Paint'));
+if(firstPaint)blockingCpuNodeIds.add(firstPaint.id);
+const firstParse=cpuNodes.find(node=>node.childEvents.some(e=>e.name==='ParseHTML'));
+if(firstParse)blockingCpuNodeIds.add(firstParse.id);
+
+
+if(extraBlockingCpuNodesToIncludeFilter){
+cpuNodes.
+filter(extraBlockingCpuNodesToIncludeFilter).
+forEach(node=>blockingCpuNodeIds.add(node.id));
+}
+
+return{
+definitelyNotRenderBlockingScriptUrls,
+blockingCpuNodeIds};
+
}
@@ -16868,28 +17290,81 @@ return node.hasRenderBlockingPriority()&&node.initiatorType!=='script';
-static getPessimisticGraph(dependencyGraph,traceOfTab){
-const fcp=traceOfTab.timestamps.firstContentfulPaint;
-const blockingScriptUrls=LanternMetric.getScriptUrls(dependencyGraph,node=>{
-return node.endTime<=fcp&&node.hasRenderBlockingPriority();
-});
+
+
+
+
+
+
+
+static getFirstPaintBasedGraph(
+dependencyGraph,
+paintTs,
+blockingResourcesFilter,
+extraBlockingCpuNodesToIncludeFilter)
+{
+const{
+definitelyNotRenderBlockingScriptUrls,
+blockingCpuNodeIds}=
+this.getBlockingNodeData(
+dependencyGraph,
+paintTs,
+blockingResourcesFilter,
+extraBlockingCpuNodesToIncludeFilter);
+
return dependencyGraph.cloneWithRelationships(node=>{
-if(node.endTime>fcp&&!node.isMainDocument())return false;
+if(node.type===BaseNode.TYPES.NETWORK){
-if(node.type===BaseNode.TYPES.CPU){
-return node.isEvaluateScriptFor(blockingScriptUrls);
+if(node.endTime>paintTs&&!node.isMainDocument())return false;
+
+const url=node.record.url;
+
+if(definitelyNotRenderBlockingScriptUrls.has(url)){
+return false;
}
+return blockingResourcesFilter(node);
+}else{
-return node.hasRenderBlockingPriority();
+return blockingCpuNodeIds.has(node.id);
+}
});
+}
+
+
+
+
+
+
+static getOptimisticGraph(dependencyGraph,traceOfTab){
+return this.getFirstPaintBasedGraph(
+dependencyGraph,
+traceOfTab.timestamps.firstContentfulPaint,
+
+
+
+node=>node.hasRenderBlockingPriority()&&node.initiatorType!=='script');
+
+}
+
+
+
+
+
+
+static getPessimisticGraph(dependencyGraph,traceOfTab){
+return this.getFirstPaintBasedGraph(
+dependencyGraph,
+traceOfTab.timestamps.firstContentfulPaint,
+node=>node.hasRenderBlockingPriority());
+
}}
module.exports=makeComputedArtifact(LanternFirstContentfulPaint);
-},{"../../lib/dependency-graph/base-node.js":52,"../computed-artifact.js":8,"./lantern-metric.js":25}],21:[function(require,module,exports){
+},{"../../lib/dependency-graph/base-node.js":55,"../computed-artifact.js":8,"./lantern-metric.js":25}],21:[function(require,module,exports){
@@ -16946,7 +17421,7 @@ longTasks.push({start:timing.startTime,end:timing.endTime});
longTasks.sort((a,b)=>a.start-b.start);
-const FirstCPUIdle=require('./first-cpu-idle');
+const FirstCPUIdle=require('./first-cpu-idle.js');
return FirstCPUIdle.findQuietWindow(fmpTimeInMs,Infinity,longTasks);
}
@@ -16962,7 +17437,7 @@ return super.compute_(data,context);
module.exports=makeComputedArtifact(LanternFirstCPUIdle);
-},{"../../lib/dependency-graph/base-node.js":52,"../computed-artifact.js":8,"./first-cpu-idle":16,"./lantern-interactive.js":23}],22:[function(require,module,exports){
+},{"../../lib/dependency-graph/base-node.js":55,"../computed-artifact.js":8,"./first-cpu-idle.js":16,"./lantern-interactive.js":23}],22:[function(require,module,exports){
@@ -16972,7 +17447,6 @@ module.exports=makeComputedArtifact(LanternFirstCPUIdle);
const makeComputedArtifact=require('../computed-artifact.js');
const LanternMetric=require('./lantern-metric.js');
-const BaseNode=require('../../lib/dependency-graph/base-node.js');
const LHError=require('../../lib/lh-error.js');
const LanternFirstContentfulPaint=require('./lantern-first-contentful-paint.js');
@@ -17001,22 +17475,13 @@ if(!fmp){
throw new LHError(LHError.errors.NO_FMP);
}
-const blockingScriptUrls=LanternMetric.getScriptUrls(dependencyGraph,node=>{
-return(
-node.endTime<=fmp&&node.hasRenderBlockingPriority()&&node.initiatorType!=='script');
-
-});
-
-return dependencyGraph.cloneWithRelationships(node=>{
-if(node.endTime>fmp&&!node.isMainDocument())return false;
+return LanternFirstContentfulPaint.getFirstPaintBasedGraph(
+dependencyGraph,
+fmp,
-if(node.type===BaseNode.TYPES.CPU){
-return node.isEvaluateScriptFor(blockingScriptUrls);
-}
+node=>node.hasRenderBlockingPriority()&&node.initiatorType!=='script');
-return node.hasRenderBlockingPriority()&&node.initiatorType!=='script';
-});
}
@@ -17030,21 +17495,13 @@ if(!fmp){
throw new LHError(LHError.errors.NO_FMP);
}
-const requiredScriptUrls=LanternMetric.getScriptUrls(dependencyGraph,node=>{
-return node.endTime<=fmp&&node.hasRenderBlockingPriority();
-});
+return LanternFirstContentfulPaint.getFirstPaintBasedGraph(
+dependencyGraph,
+fmp,
+node=>node.hasRenderBlockingPriority(),
-return dependencyGraph.cloneWithRelationships(node=>{
-if(node.endTime>fmp&&!node.isMainDocument())return false;
+node=>node.didPerformLayout());
-
-if(node.type===BaseNode.TYPES.CPU){
-return node.didPerformLayout()||node.isEvaluateScriptFor(requiredScriptUrls);
-}
-
-
-return node.hasRenderBlockingPriority();
-});
}
@@ -17062,7 +17519,7 @@ return metricResult;
module.exports=makeComputedArtifact(LanternFirstMeaningfulPaint);
-},{"../../lib/dependency-graph/base-node.js":52,"../../lib/lh-error.js":67,"../computed-artifact.js":8,"./lantern-first-contentful-paint.js":20,"./lantern-metric.js":25}],23:[function(require,module,exports){
+},{"../../lib/lh-error.js":70,"../computed-artifact.js":8,"./lantern-first-contentful-paint.js":20,"./lantern-metric.js":25}],23:[function(require,module,exports){
@@ -17172,7 +17629,7 @@ reduce((max,x)=>Math.max(max||0,x||0),0);
module.exports=makeComputedArtifact(LanternInteractive);
-},{"../../lib/dependency-graph/base-node.js":52,"../../lib/network-request.js":71,"../computed-artifact.js":8,"./lantern-first-meaningful-paint.js":22,"./lantern-metric.js":25}],24:[function(require,module,exports){
+},{"../../lib/dependency-graph/base-node.js":55,"../../lib/network-request.js":74,"../computed-artifact.js":8,"./lantern-first-meaningful-paint.js":22,"./lantern-metric.js":25}],24:[function(require,module,exports){
@@ -17181,8 +17638,8 @@ module.exports=makeComputedArtifact(LanternInteractive);
'use strict';
const makeComputedArtifact=require('../computed-artifact.js');
-const LanternMetricArtifact=require('./lantern-metric');
-const BaseNode=require('../../lib/dependency-graph/base-node');
+const LanternMetricArtifact=require('./lantern-metric.js');
+const BaseNode=require('../../lib/dependency-graph/base-node.js');
const LanternFirstContentfulPaint=require('./lantern-first-contentful-paint.js');
@@ -17262,7 +17719,7 @@ map(([_,timing])=>timing);
module.exports=makeComputedArtifact(LanternMaxPotentialFID);
-},{"../../lib/dependency-graph/base-node":52,"../computed-artifact.js":8,"./lantern-first-contentful-paint.js":20,"./lantern-metric":25}],25:[function(require,module,exports){
+},{"../../lib/dependency-graph/base-node.js":55,"../computed-artifact.js":8,"./lantern-first-contentful-paint.js":20,"./lantern-metric.js":25}],25:[function(require,module,exports){
@@ -17415,7 +17872,7 @@ return this.computeMetricWithGraphs(data,context);
module.exports=LanternMetricArtifact;
-},{"../../lib/dependency-graph/base-node.js":52,"../../lib/network-request.js":71,"../load-simulator.js":10,"../page-dependency-graph.js":32,"../trace-of-tab.js":35}],26:[function(require,module,exports){
+},{"../../lib/dependency-graph/base-node.js":55,"../../lib/network-request.js":74,"../load-simulator.js":10,"../page-dependency-graph.js":32,"../trace-of-tab.js":36}],26:[function(require,module,exports){
@@ -17563,7 +18020,7 @@ return totalWeightedTime/totalWeight;
module.exports=makeComputedArtifact(LanternSpeedIndex);
-},{"../../config/constants.js":40,"../../lib/dependency-graph/base-node.js":52,"../computed-artifact.js":8,"../speedline.js":34,"./lantern-first-contentful-paint.js":20,"./lantern-metric.js":25}],27:[function(require,module,exports){
+},{"../../config/constants.js":43,"../../lib/dependency-graph/base-node.js":55,"../computed-artifact.js":8,"../speedline.js":35,"./lantern-first-contentful-paint.js":20,"./lantern-metric.js":25}],27:[function(require,module,exports){
@@ -17572,10 +18029,10 @@ module.exports=makeComputedArtifact(LanternSpeedIndex);
'use strict';
const makeComputedArtifact=require('../computed-artifact.js');
-const MetricArtifact=require('./metric');
+const MetricArtifact=require('./metric.js');
const LanternMaxPotentialFID=require('./lantern-max-potential-fid.js');
-const LHError=require('../../lib/lh-error');
-const TracingProcessor=require('../../lib/traces/tracing-processor');
+const LHError=require('../../lib/lh-error.js');
+const TracingProcessor=require('../../lib/traces/tracing-processor.js');
class MaxPotentialFID extends MetricArtifact{
@@ -17610,7 +18067,7 @@ timing:Math.max(...events.map(evt=>evt.duration),16)});
module.exports=makeComputedArtifact(MaxPotentialFID);
-},{"../../lib/lh-error":67,"../../lib/traces/tracing-processor":79,"../computed-artifact.js":8,"./lantern-max-potential-fid.js":24,"./metric":28}],28:[function(require,module,exports){
+},{"../../lib/lh-error.js":70,"../../lib/traces/tracing-processor.js":84,"../computed-artifact.js":8,"./lantern-max-potential-fid.js":24,"./metric.js":28}],28:[function(require,module,exports){
@@ -17684,7 +18141,7 @@ throw new TypeError(`Unrecognized throttling method: ${settings.throttlingMethod
module.exports=ComputedMetric;
-},{"../../lib/traces/tracing-processor.js":79,"../network-records.js":31,"../trace-of-tab.js":35}],29:[function(require,module,exports){
+},{"../../lib/traces/tracing-processor.js":84,"../network-records.js":31,"../trace-of-tab.js":36}],29:[function(require,module,exports){
@@ -17722,7 +18179,7 @@ return Promise.resolve({timing,timestamp});
module.exports=makeComputedArtifact(SpeedIndex);
-},{"../computed-artifact.js":8,"../speedline.js":34,"./lantern-speed-index.js":26,"./metric.js":28}],30:[function(require,module,exports){
+},{"../computed-artifact.js":8,"../speedline.js":35,"./lantern-speed-index.js":26,"./metric.js":28}],30:[function(require,module,exports){
@@ -17788,7 +18245,7 @@ return{throughput,...rttAndServerResponseTime};
module.exports=makeComputedArtifact(NetworkAnalysis);
-},{"../lib/dependency-graph/simulator/network-analyzer.js":57,"./computed-artifact.js":8,"./network-records.js":31}],31:[function(require,module,exports){
+},{"../lib/dependency-graph/simulator/network-analyzer.js":60,"./computed-artifact.js":8,"./network-records.js":31}],31:[function(require,module,exports){
@@ -17811,7 +18268,7 @@ return NetworkRecorder.recordsFromLogs(devtoolsLog);
module.exports=makeComputedArtifact(NetworkRecords);
-},{"../lib/network-recorder.js":70,"./computed-artifact.js":8}],32:[function(require,module,exports){
+},{"../lib/network-recorder.js":73,"./computed-artifact.js":8}],32:[function(require,module,exports){
@@ -17844,9 +18301,23 @@ class PageDependencyGraph{
static getNetworkInitiators(record){
if(!record.initiator)return[];
if(record.initiator.url)return[record.initiator.url];
-if(record.initiator.type==='script'&&record.initiator.stack){
-const frames=record.initiator.stack.callFrames;
-return Array.from(new Set(frames.map(frame=>frame.url))).filter(Boolean);
+if(record.initiator.type==='script'){
+
+
+
+
+const scriptURLs=new Set();
+let stack=record.initiator.stack;
+while(stack){
+const callFrames=stack.callFrames||[];
+for(const frame of callFrames){
+if(frame.url)scriptURLs.add(frame.url);
+}
+
+stack=stack.parent;
+}
+
+return Array.from(scriptURLs);
}
return[];
@@ -18171,7 +18642,93 @@ module.exports=makeComputedArtifact(PageDependencyGraph);
-},{"../lib/dependency-graph/cpu-node.js":53,"../lib/dependency-graph/network-node.js":54,"../lib/dependency-graph/simulator/network-analyzer.js":57,"../lib/network-request.js":71,"../lib/traces/tracing-processor.js":79,"./computed-artifact.js":8,"./network-records.js":31,"./trace-of-tab.js":35}],33:[function(require,module,exports){
+},{"../lib/dependency-graph/cpu-node.js":56,"../lib/dependency-graph/network-node.js":57,"../lib/dependency-graph/simulator/network-analyzer.js":60,"../lib/network-request.js":74,"../lib/traces/tracing-processor.js":84,"./computed-artifact.js":8,"./network-records.js":31,"./trace-of-tab.js":36}],33:[function(require,module,exports){
+
+
+
+
+
+'use strict';
+
+const makeComputedArtifact=require('./computed-artifact.js');
+const NetworkRecords=require('./network-records.js');
+const MainResource=require('./main-resource.js');
+const URL=require('../lib/url-shim.js');
+
+
+class ResourceSummary{
+
+
+
+
+static determineResourceType(record){
+if(!record.resourceType)return'other';
+
+const requestToResourceType={
+'Stylesheet':'stylesheet',
+'Image':'image',
+'Media':'media',
+'Font':'font',
+'Script':'script',
+'Document':'document'};
+
+return requestToResourceType[record.resourceType]||'other';
+}
+
+
+
+
+
+
+static summarize(networkRecords,mainResourceURL){
+
+const resourceSummary={
+'stylesheet':{count:0,size:0},
+'image':{count:0,size:0},
+'media':{count:0,size:0},
+'font':{count:0,size:0},
+'script':{count:0,size:0},
+'document':{count:0,size:0},
+'other':{count:0,size:0},
+'total':{count:0,size:0},
+'third-party':{count:0,size:0}};
+
+
+for(const record of networkRecords){
+const type=this.determineResourceType(record);
+resourceSummary[type].count++;
+resourceSummary[type].size+=record.transferSize;
+
+resourceSummary.total.count++;
+resourceSummary.total.size+=record.transferSize;
+
+
+if(!URL.rootDomainsMatch(record.url,mainResourceURL)){
+resourceSummary['third-party'].count++;
+resourceSummary['third-party'].size+=record.transferSize;
+}
+}
+return resourceSummary;
+}
+
+
+
+
+
+
+static async compute_(data,context){
+const[networkRecords,mainResource]=await Promise.all([
+NetworkRecords.request(data.devtoolsLog,context),
+MainResource.request(data,context)]);
+
+
+return ResourceSummary.summarize(networkRecords,mainResource.url);
+}}
+
+
+module.exports=makeComputedArtifact(ResourceSummary);
+
+},{"../lib/url-shim.js":"url","./computed-artifact.js":8,"./main-resource.js":11,"./network-records.js":31}],34:[function(require,module,exports){
@@ -18193,7 +18750,7 @@ return trace.traceEvents.
filter(evt=>evt.name===SCREENSHOT_TRACE_NAME).
map(evt=>{
return{
-timestamp:evt.ts/1000,
+timestamp:evt.ts,
datauri:`data:image/jpeg;base64,${evt.args.snapshot}`};
});
@@ -18202,7 +18759,7 @@ datauri:`data:image/jpeg;base64,${evt.args.snapshot}`};
module.exports=makeComputedArtifact(Screenshots);
-},{"./computed-artifact.js":8}],34:[function(require,module,exports){
+},{"./computed-artifact.js":8}],35:[function(require,module,exports){
@@ -18258,7 +18815,7 @@ return speedline;
module.exports=makeComputedArtifact(Speedline);
-},{"../lib/lh-error.js":67,"./computed-artifact.js":8,"./trace-of-tab.js":35,"speedline-core":160}],35:[function(require,module,exports){
+},{"../lib/lh-error.js":70,"./computed-artifact.js":8,"./trace-of-tab.js":36,"speedline-core":165}],36:[function(require,module,exports){
@@ -18452,7 +19009,7 @@ fmpFellBack};
module.exports=makeComputedArtifact(TraceOfTab);
-},{"../lib/lh-error.js":67,"../lib/sentry.js":74,"../lib/traces/tracing-processor.js":79,"./computed-artifact.js":8,"lighthouse-logger":120}],36:[function(require,module,exports){
+},{"../lib/lh-error.js":70,"../lib/sentry.js":77,"../lib/traces/tracing-processor.js":84,"./computed-artifact.js":8,"lighthouse-logger":125}],37:[function(require,module,exports){
@@ -18537,7 +19094,7 @@ return userTimings;
module.exports=makeComputedArtifact(UserTimings);
-},{"./computed-artifact.js":8,"./trace-of-tab.js":35}],37:[function(require,module,exports){
+},{"./computed-artifact.js":8,"./trace-of-tab.js":36}],38:[function(require,module,exports){
@@ -18554,7 +19111,7 @@ class ViewportMeta{
-static async compute_({MetaElements}){
+static async compute_(MetaElements){
const viewportMeta=MetaElements.find(meta=>meta.name==='viewport');
if(!viewportMeta){
@@ -18595,7 +19152,407 @@ module.exports=makeComputedArtifact(ViewportMeta);
-},{"./computed-artifact.js":8,"metaviewport-parser":124}],38:[function(require,module,exports){
+},{"./computed-artifact.js":8,"metaviewport-parser":129}],39:[function(require,module,exports){
+
+
+
+
+
+'use strict';
+
+
+
+
+
+function isArrayOfUnknownObjects(arr){
+return Array.isArray(arr)&&arr.every(isObjectOfUnknownProperties);
+}
+
+
+
+
+
+function isObjectOfUnknownProperties(val){
+return typeof val==='object'&&val!==null&&!Array.isArray(val);
+}
+
+
+
+
+
+
+
+function isNumber(val){
+return typeof val==='number'&&!isNaN(val);
+}
+
+class Budget{
+
+
+
+
+
+
+static assertNoExcessProperties(obj,objectName){
+const invalidKeys=Object.keys(obj);
+if(invalidKeys.length>0){
+const keys=invalidKeys.join(', ');
+throw new Error(`${objectName} has unrecognized properties: [${keys}]`);
+}
+}
+
+
+
+
+
+
+
+static assertNoDuplicateStrings(strings,arrayName){
+const foundStrings=new Set();
+for(const string of strings){
+if(foundStrings.has(string)){
+throw new Error(`${arrayName} has duplicate entry of type '${string}'`);
+}
+foundStrings.add(string);
+}
+}
+
+
+
+
+
+static validateResourceBudget(resourceBudget){
+const{resourceType,budget,...invalidRest}=resourceBudget;
+Budget.assertNoExcessProperties(invalidRest,'Resource Budget');
+
+
+const validResourceTypes=[
+'total',
+'document',
+'script',
+'stylesheet',
+'image',
+'media',
+'font',
+'other',
+'third-party'];
+
+
+if(!validResourceTypes.includes(resourceType)){
+throw new Error(`Invalid resource type: ${resourceType}. \n`+
+`Valid resource types are: ${validResourceTypes.join(', ')}`);
+}
+if(!isNumber(budget)){
+throw new Error(`Invalid budget: ${budget}`);
+}
+return{
+resourceType:resourceType,
+budget};
+
+}
+
+
+
+
+
+static validateTimingBudget(timingBudget){
+const{metric,budget,tolerance,...invalidRest}=timingBudget;
+Budget.assertNoExcessProperties(invalidRest,'Timing Budget');
+
+
+const validTimingMetrics=[
+'first-contentful-paint',
+'first-cpu-idle',
+'interactive',
+'first-meaningful-paint',
+'max-potential-fid'];
+
+
+if(!validTimingMetrics.includes(metric)){
+throw new Error(`Invalid timing metric: ${metric}. \n`+
+`Valid timing metrics are: ${validTimingMetrics.join(', ')}`);
+}
+if(!isNumber(budget)){
+throw new Error(`Invalid budget: ${budget}`);
+}
+if(typeof tolerance!=='undefined'&&!isNumber(tolerance)){
+throw new Error(`Invalid tolerance: ${tolerance}`);
+}
+return{
+metric:metric,
+budget,
+tolerance};
+
+}
+
+
+
+
+
+
+
+static initializeBudget(budgetJson){
+
+budgetJson=JSON.parse(JSON.stringify(budgetJson));
+if(!isArrayOfUnknownObjects(budgetJson)){
+throw new Error('Budget file is not defined as an array of budgets.');
+}
+
+const budgets=budgetJson.map((b,index)=>{
+
+const budget={};
+
+const{resourceSizes,resourceCounts,timings,...invalidRest}=b;
+Budget.assertNoExcessProperties(invalidRest,'Budget');
+
+if(isArrayOfUnknownObjects(resourceSizes)){
+budget.resourceSizes=resourceSizes.map(Budget.validateResourceBudget);
+Budget.assertNoDuplicateStrings(budget.resourceSizes.map(r=>r.resourceType),
+`budgets[${index}].resourceSizes`);
+}else if(resourceSizes!==undefined){
+throw new Error(`Invalid resourceSizes entry in budget at index ${index}`);
+}
+
+if(isArrayOfUnknownObjects(resourceCounts)){
+budget.resourceCounts=resourceCounts.map(Budget.validateResourceBudget);
+Budget.assertNoDuplicateStrings(budget.resourceCounts.map(r=>r.resourceType),
+`budgets[${index}].resourceCounts`);
+}else if(resourceCounts!==undefined){
+throw new Error(`Invalid resourceCounts entry in budget at index ${index}`);
+}
+
+if(isArrayOfUnknownObjects(timings)){
+budget.timings=timings.map(Budget.validateTimingBudget);
+Budget.assertNoDuplicateStrings(budget.timings.map(r=>r.metric),
+`budgets[${index}].timings`);
+}else if(timings!==undefined){
+throw new Error(`Invalid timings entry in budget at index ${index}`);
+}
+
+return budget;
+});
+
+return budgets;
+}}
+
+
+module.exports=Budget;
+
+},{}],40:[function(require,module,exports){
+(function(process,__dirname){
+
+
+
+
+
+'use strict';
+
+const path=require('path');
+const Audit=require('../audits/audit.js');
+const Runner=require('../runner.js');
+
+
+
+
+
+
+
+
+
+const mergeOptionsOfItems=function(items){
+
+const mergedItems=[];
+
+for(const item of items){
+const existingItem=item.path&&mergedItems.find(candidate=>candidate.path===item.path);
+if(!existingItem){
+mergedItems.push(item);
+continue;
+}
+
+existingItem.options=Object.assign({},existingItem.options,item.options);
+}
+
+return mergedItems;
+};
+
+
+
+
+
+
+function assertValidAudit(auditDefinition){
+const{implementation,path:auditPath}=auditDefinition;
+const auditName=auditPath||
+implementation&&implementation.meta&&implementation.meta.id||
+'Unknown audit';
+
+if(typeof implementation.audit!=='function'||implementation.audit===Audit.audit){
+throw new Error(`${auditName} has no audit() method.`);
+}
+
+if(typeof implementation.meta.id!=='string'){
+throw new Error(`${auditName} has no meta.id property, or the property is not a string.`);
+}
+
+if(typeof implementation.meta.title!=='string'){
+throw new Error(`${auditName} has no meta.title property, or the property is not a string.`);
+}
+
+
+if(
+typeof implementation.meta.failureTitle!=='string'&&
+implementation.meta.scoreDisplayMode===Audit.SCORING_MODES.BINARY)
+{
+throw new Error(`${auditName} has no failureTitle and should.`);
+}
+
+if(typeof implementation.meta.description!=='string'){
+throw new Error(
+`${auditName} has no meta.description property, or the property is not a string.`);
+
+}else if(implementation.meta.description===''){
+throw new Error(
+`${auditName} has an empty meta.description string. Please add a description for the UI.`);
+
+}
+
+if(!Array.isArray(implementation.meta.requiredArtifacts)){
+throw new Error(
+`${auditName} has no meta.requiredArtifacts property, or the property is not an array.`);
+
+}
+}
+
+
+
+
+
+
+function expandAuditShorthand(audits){
+if(!audits){
+return null;
+}
+
+const newAudits=audits.map(audit=>{
+if(typeof audit==='string'){
+
+return{path:audit,options:{}};
+}else if('implementation'in audit&&typeof audit.implementation.audit==='function'){
+
+return audit;
+}else if('path'in audit&&typeof audit.path==='string'){
+
+return audit;
+}else if('audit'in audit&&typeof audit.audit==='function'){
+
+return{implementation:audit,options:{}};
+}else{
+throw new Error('Invalid Audit type '+JSON.stringify(audit));
+}
+});
+
+return newAudits;
+}
+
+
+
+
+
+
+
+
+
+function requireAudits(audits,configDir){
+const expandedAudits=expandAuditShorthand(audits);
+if(!expandedAudits){
+return null;
+}
+
+const coreList=Runner.getAuditList();
+const auditDefns=expandedAudits.map(audit=>{
+let implementation;
+if('implementation'in audit){
+implementation=audit.implementation;
+}else{
+
+const auditPathJs=`${audit.path}.js`;
+const coreAudit=coreList.find(a=>a===auditPathJs);
+let requirePath=`../audits/${audit.path}`;
+if(!coreAudit){
+
+requirePath=resolveModule(audit.path,configDir,'audit');
+}
+implementation=require(requirePath);
+}
+
+return{
+implementation,
+path:audit.path,
+options:audit.options||{}};
+
+});
+
+const mergedAuditDefns=mergeOptionsOfItems(auditDefns);
+mergedAuditDefns.forEach(audit=>assertValidAudit(audit));
+return mergedAuditDefns;
+}
+
+
+
+
+
+
+
+
+
+
+
+function resolveModule(moduleIdentifier,configDir,category){
+
+
+
+
+try{
+return require.resolve(moduleIdentifier);
+}catch(e){}
+
+
+
+
+const cwdPath=path.resolve(process.cwd(),moduleIdentifier);
+try{
+return require.resolve(cwdPath);
+}catch(e){}
+
+const errorString=
+'Unable to locate '+(
+category?`${category}: `:'')+
+`${moduleIdentifier} (tried to require() from '${__dirname}' and load from '${cwdPath}'`;
+
+if(!configDir){
+throw new Error(errorString+')');
+}
+
+
+
+
+const relativePath=path.resolve(configDir,moduleIdentifier);
+try{
+return require.resolve(relativePath);
+}catch(requireError){}
+
+throw new Error(errorString+` and '${relativePath}')`);
+}
+
+module.exports={
+mergeOptionsOfItems,
+requireAudits,
+resolveModule};
+
+
+}).call(this,require('_process'),"/lighthouse-core/config");
+},{"../audits/audit.js":3,"../runner.js":87,"_process":142,"path":140}],41:[function(require,module,exports){
@@ -18820,8 +19777,8 @@ groups:ConfigPlugin._parseGroups(pluginGroupsJson,pluginName)};
module.exports=ConfigPlugin;
-},{}],39:[function(require,module,exports){
-(function(process,__dirname){
+},{}],42:[function(require,module,exports){
+(function(__dirname){
@@ -18838,9 +19795,10 @@ const i18n=require('./../lib/i18n/i18n.js');
const isDeepEqual=require('lodash.isequal');
const log=require('lighthouse-logger');
const path=require('path');
-const Audit=require('../audits/audit.js');
const Runner=require('../runner.js');
const ConfigPlugin=require('./config-plugin.js');
+const Budget=require('./budget.js');
+const{requireAudits,mergeOptionsOfItems,resolveModule}=require('./config-helpers.js');
@@ -18849,7 +19807,7 @@ const ConfigPlugin=require('./config-plugin.js');
-function validatePasses(passes,audits){
+function assertValidPasses(passes,audits){
if(!Array.isArray(passes)){
return;
}
@@ -18884,7 +19842,7 @@ usedNames.add(passName);
-function validateCategories(categories,audits,groups){
+function assertValidCategories(categories,audits,groups){
if(!categories){
return;
}
@@ -18926,51 +19884,6 @@ throw new Error(`${auditRef.id} references unknown group ${auditRef.group}`);
-function assertValidAudit(auditDefinition,auditPath){
-const auditName=auditPath||
-auditDefinition&&auditDefinition.meta&&auditDefinition.meta.id;
-
-if(typeof auditDefinition.audit!=='function'||auditDefinition.audit===Audit.audit){
-throw new Error(`${auditName} has no audit() method.`);
-}
-
-if(typeof auditDefinition.meta.id!=='string'){
-throw new Error(`${auditName} has no meta.id property, or the property is not a string.`);
-}
-
-if(typeof auditDefinition.meta.title!=='string'){
-throw new Error(
-`${auditName} has no meta.title property, or the property is not a string.`);
-
-}
-
-
-if(typeof auditDefinition.meta.failureTitle!=='string'&&
-auditDefinition.meta.scoreDisplayMode===Audit.SCORING_MODES.BINARY){
-throw new Error(`${auditName} has no failureTitle and should.`);
-}
-
-if(typeof auditDefinition.meta.description!=='string'){
-throw new Error(
-`${auditName} has no meta.description property, or the property is not a string.`);
-
-}else if(auditDefinition.meta.description===''){
-throw new Error(
-`${auditName} has an empty meta.description string. Please add a description for the UI.`);
-
-}
-
-if(!Array.isArray(auditDefinition.meta.requiredArtifacts)){
-throw new Error(
-`${auditName} has no meta.requiredArtifacts property, or the property is not an array.`);
-
-}
-}
-
-
-
-
-
function assertValidGatherer(gathererInstance,gathererName){
gathererName=gathererName||gathererInstance.name||'gatherer';
@@ -19124,31 +20037,6 @@ cloned.audits=cloneArrayWithPluginSafety(json.audits);
return cloned;
}
-
-
-
-
-
-
-
-
-const mergeOptionsOfItems=function(items){
-
-const mergedItems=[];
-
-for(const item of items){
-const existingItem=item.path&&mergedItems.find(candidate=>candidate.path===item.path);
-if(!existingItem){
-mergedItems.push(item);
-continue;
-}
-
-existingItem.options=Object.assign({},existingItem.options,item.options);
-}
-
-return mergedItems;
-};
-
class Config{
@@ -19208,8 +20096,8 @@ this.groups=configJSON.groups||null;
Config.filterConfigIfNeeded(this);
-validatePasses(this.passes,this.audits);
-validateCategories(this.categories,this.audits,this.groups);
+assertValidPasses(this.passes,this.audits);
+assertValidCategories(this.categories,this.audits,this.groups);
@@ -19295,7 +20183,7 @@ const pluginNames=new Set([...configPlugins,...flagPlugins]);
for(const pluginName of pluginNames){
assertValidPluginName(configJSON,pluginName);
-const pluginPath=Config.resolveModule(pluginName,configDir,'plugin');
+const pluginPath=resolveModule(pluginName,configDir,'plugin');
const rawPluginJson=require(pluginPath);
const pluginJson=ConfigPlugin.parsePlugin(rawPluginJson,pluginName);
@@ -19336,6 +20224,9 @@ const settingWithDefaults=merge(deepClone(defaultSettings),settingsJson,true);
const settingsWithFlags=merge(settingWithDefaults||{},cleanFlagsForSettings(flags),true);
+if(settingsWithFlags.budgets){
+settingsWithFlags.budgets=Budget.initializeBudget(settingsWithFlags.budgets);
+}
settingsWithFlags.locale=locale;
@@ -19347,37 +20238,6 @@ return settingsWithFlags;
-static expandAuditShorthand(audits){
-if(!audits){
-return null;
-}
-
-const newAudits=audits.map(audit=>{
-if(typeof audit==='string'){
-
-return{path:audit,options:{}};
-}else if('implementation'in audit&&typeof audit.implementation.audit==='function'){
-
-return audit;
-}else if('path'in audit&&typeof audit.path==='string'){
-
-return audit;
-}else if('audit'in audit&&typeof audit.audit==='function'){
-
-return{implementation:audit,options:{}};
-}else{
-throw new Error('Invalid Audit type '+JSON.stringify(audit));
-}
-});
-
-return newAudits;
-}
-
-
-
-
-
-
@@ -19625,39 +20485,9 @@ return filteredPasses;
static requireAudits(audits,configDir){
const status={msg:'Requiring audits',id:'lh:config:requireAudits'};
log.time(status,'verbose');
-const expandedAudits=Config.expandAuditShorthand(audits);
-if(!expandedAudits){
-return null;
-}
-
-const coreList=Runner.getAuditList();
-const auditDefns=expandedAudits.map(audit=>{
-let implementation;
-if('implementation'in audit){
-implementation=audit.implementation;
-}else{
-
-const auditPathJs=`${audit.path}.js`;
-const coreAudit=coreList.find(a=>a===auditPathJs);
-let requirePath=`../audits/${audit.path}`;
-if(!coreAudit){
-
-requirePath=Config.resolveModule(audit.path,configDir,'audit');
-}
-implementation=require(requirePath);
-}
-
-return{
-implementation,
-path:audit.path,
-options:audit.options||{}};
-
-});
-
-const mergedAuditDefns=mergeOptionsOfItems(auditDefns);
-mergedAuditDefns.forEach(audit=>assertValidAudit(audit.implementation,audit.path));
+const auditDefns=requireAudits(audits,configDir);
log.timeEnd(status);
-return mergedAuditDefns;
+return auditDefns;
}
@@ -19673,7 +20503,7 @@ const coreGatherer=coreAuditList.find(a=>a===`${path}.js`);
let requirePath=`../gather/gatherers/${path}`;
if(!coreGatherer){
-requirePath=Config.resolveModule(path,configDir,'gatherer');
+requirePath=resolveModule(path,configDir,'gatherer');
}
const GathererClass=require(requirePath);
@@ -19735,59 +20565,13 @@ return Object.assign(pass,{gatherers:mergedDefns});
});
log.timeEnd(status);
return fullPasses;
-}
-
-
-
-
-
-
-
-
-
-
-
-static resolveModule(moduleIdentifier,configDir,category){
-
-
-
-
-try{
-return require.resolve(moduleIdentifier);
-}catch(e){}
-
-
-
-
-const cwdPath=path.resolve(process.cwd(),moduleIdentifier);
-try{
-return require.resolve(cwdPath);
-}catch(e){}
-
-const errorString='Unable to locate '+(
-category?`${category}: `:'')+
-`${moduleIdentifier} (tried to require() from '${__dirname}' and load from '${cwdPath}'`;
-
-if(!configDir){
-throw new Error(errorString+')');
-}
-
-
-
-
-const relativePath=path.resolve(configDir,moduleIdentifier);
-try{
-return require.resolve(relativePath);
-}catch(requireError){}
-
-throw new Error(errorString+` and '${relativePath}')`);
}}
module.exports=Config;
-}).call(this,require('_process'),"/lighthouse-core/config");
-},{"../audits/audit.js":3,"../runner.js":82,"./../lib/i18n/i18n.js":63,"./config-plugin.js":38,"./constants.js":40,"./default-config.js":41,"./full-config.js":42,"_process":137,"lighthouse-logger":120,"lodash.isequal":121,"path":135}],40:[function(require,module,exports){
+}).call(this,"/lighthouse-core/config");
+},{"../runner.js":87,"./../lib/i18n/i18n.js":66,"./budget.js":39,"./config-helpers.js":40,"./config-plugin.js":41,"./constants.js":43,"./default-config.js":44,"./full-config.js":45,"lighthouse-logger":125,"lodash.isequal":126,"path":140}],43:[function(require,module,exports){
@@ -19840,12 +20624,12 @@ throttling:throttling.mobileSlow4G,
auditMode:false,
gatherMode:false,
disableStorageReset:false,
-disableDeviceEmulation:false,
emulatedFormFactor:'mobile',
channel:'node',
+budgets:null,
locale:'en-US',
blockedUrlPatterns:null,
additionalTraceCategories:null,
@@ -19882,7 +20666,7 @@ defaultPassConfig,
nonSimulatedPassConfigOverrides};
-},{}],41:[function(require,module,exports){
+},{}],44:[function(require,module,exports){
(function(__filename){
@@ -19893,13 +20677,17 @@ nonSimulatedPassConfigOverrides};
-const constants=require('./constants');
+const constants=require('./constants.js');
const i18n=require('../lib/i18n/i18n.js');
const UIStrings={
performanceCategoryTitle:'Performance',
+budgetsGroupTitle:'Budgets',
+
+budgetsGroupDescription:'Performance budgets set standards for the performance of your site.',
+
metricGroupTitle:'Metrics',
loadOpportunitiesGroupTitle:'Opportunities',
@@ -19964,6 +20752,19 @@ seoCategoryDescription:'These checks ensure that your page is optimized for sear
seoCategoryManualDescription:'Run these additional validators on your site to check additional SEO best practices.',
+seoMobileGroupTitle:'Mobile Friendly',
+
+seoMobileGroupDescription:'Make sure your pages are mobile friendly so users don’t have to pinch or zoom '+
+'in order to read the content pages. [Learn more](https://developers.google.com/search/mobile-sites/).',
+
+seoContentGroupTitle:'Content Best Practices',
+
+seoContentGroupDescription:'Format your HTML in a way that enables crawlers to better understand your app’s content.',
+
+seoCrawlingGroupTitle:'Crawling and Indexing',
+
+seoCrawlingGroupDescription:'To appear in search results, crawlers need access to your app.',
+
pwaFastReliableGroupTitle:'Fast and reliable',
pwaInstallableGroupTitle:'Installable',
@@ -19987,8 +20788,7 @@ gatherers:[
'css-usage',
'viewport-dimensions',
'runtime-exceptions',
-'chrome-console-messages',
-'accessibility',
+'console-messages',
'anchor-elements',
'image-elements',
'link-elements',
@@ -19997,7 +20797,6 @@ gatherers:[
'dobetterweb/appcache',
'dobetterweb/doctype',
'dobetterweb/domstats',
-'dobetterweb/js-libraries',
'dobetterweb/optimized-images',
'dobetterweb/password-inputs-with-prevented-paste',
'dobetterweb/response-compression',
@@ -20005,7 +20804,9 @@ gatherers:[
'seo/font-size',
'seo/embedded-content',
'seo/robots-txt',
-'seo/tap-targets']},
+'seo/tap-targets',
+
+'accessibility']},
{
@@ -20048,6 +20849,7 @@ audits:[
'critical-request-chains',
'redirects',
'installable-manifest',
+'apple-touch-icon',
'splash-screen',
'themed-omnibox',
'content-width',
@@ -20065,6 +20867,8 @@ audits:[
'main-thread-tasks',
'metrics',
'offline-start-url',
+'performance-budget',
+'resource-summary',
'manual/pwa-cross-browser',
'manual/pwa-page-transitions',
'manual/pwa-each-page-has-url',
@@ -20159,6 +20963,10 @@ title:str_(UIStrings.metricGroupTitle)},
title:str_(UIStrings.loadOpportunitiesGroupTitle),
description:str_(UIStrings.loadOpportunitiesGroupDescription)},
+'budgets':{
+title:str_(UIStrings.budgetsGroupTitle),
+description:str_(UIStrings.budgetsGroupDescription)},
+
'diagnostics':{
title:str_(UIStrings.diagnosticsGroupTitle),
description:str_(UIStrings.diagnosticsGroupDescription)},
@@ -20205,17 +21013,16 @@ title:str_(UIStrings.a11yTablesListsVideoGroupTitle),
description:str_(UIStrings.a11yTablesListsVideoGroupDescription)},
'seo-mobile':{
-title:'Mobile Friendly',
-description:'Make sure your pages are mobile friendly so users don’t have to pinch or zoom '+
-'in order to read the content pages. [Learn more](https://developers.google.com/search/mobile-sites/).'},
+title:str_(UIStrings.seoMobileGroupTitle),
+description:str_(UIStrings.seoMobileGroupDescription)},
'seo-content':{
-title:'Content Best Practices',
-description:'Format your HTML in a way that enables crawlers to better understand your app’s content.'},
+title:str_(UIStrings.seoContentGroupTitle),
+description:str_(UIStrings.seoContentGroupDescription)},
'seo-crawl':{
-title:'Crawling and Indexing',
-description:'To appear in search results, crawlers need access to your app.'}},
+title:str_(UIStrings.seoCrawlingGroupTitle),
+description:str_(UIStrings.seoCrawlingGroupDescription)}},
categories:{
@@ -20227,8 +21034,8 @@ auditRefs:[
{id:'speed-index',weight:4,group:'metrics'},
{id:'interactive',weight:5,group:'metrics'},
{id:'first-cpu-idle',weight:2,group:'metrics'},
-{id:'estimated-input-latency',weight:0,group:'metrics'},
-{id:'max-potential-fid',weight:0},
+{id:'max-potential-fid',weight:0,group:'metrics'},
+{id:'estimated-input-latency',weight:0},
{id:'render-blocking-resources',weight:0,group:'load-opportunities'},
{id:'uses-responsive-images',weight:0,group:'load-opportunities'},
@@ -20252,6 +21059,8 @@ auditRefs:[
{id:'bootup-time',weight:0,group:'diagnostics'},
{id:'mainthread-work-breakdown',weight:0,group:'diagnostics'},
{id:'font-display',weight:0,group:'diagnostics'},
+{id:'performance-budget',weight:0,group:'budgets'},
+{id:'resource-summary',weight:0,group:'diagnostics'},
{id:'network-requests',weight:0},
{id:'network-rtt',weight:0},
@@ -20267,42 +21076,46 @@ auditRefs:[
title:str_(UIStrings.a11yCategoryTitle),
description:str_(UIStrings.a11yCategoryDescription),
manualDescription:str_(UIStrings.a11yCategoryManualDescription),
+
+
+
+
auditRefs:[
{id:'accesskeys',weight:3,group:'a11y-navigation'},
-{id:'aria-allowed-attr',weight:3,group:'a11y-aria'},
-{id:'aria-required-attr',weight:2,group:'a11y-aria'},
-{id:'aria-required-children',weight:5,group:'a11y-aria'},
-{id:'aria-required-parent',weight:2,group:'a11y-aria'},
-{id:'aria-roles',weight:3,group:'a11y-aria'},
-{id:'aria-valid-attr-value',weight:2,group:'a11y-aria'},
-{id:'aria-valid-attr',weight:5,group:'a11y-aria'},
-{id:'audio-caption',weight:4,group:'a11y-audio-video'},
+{id:'aria-allowed-attr',weight:10,group:'a11y-aria'},
+{id:'aria-required-attr',weight:10,group:'a11y-aria'},
+{id:'aria-required-children',weight:10,group:'a11y-aria'},
+{id:'aria-required-parent',weight:10,group:'a11y-aria'},
+{id:'aria-roles',weight:10,group:'a11y-aria'},
+{id:'aria-valid-attr-value',weight:10,group:'a11y-aria'},
+{id:'aria-valid-attr',weight:10,group:'a11y-aria'},
+{id:'audio-caption',weight:10,group:'a11y-audio-video'},
{id:'button-name',weight:10,group:'a11y-names-labels'},
-{id:'bypass',weight:10,group:'a11y-navigation'},
-{id:'color-contrast',weight:6,group:'a11y-color-contrast'},
-{id:'definition-list',weight:1,group:'a11y-tables-lists'},
-{id:'dlitem',weight:1,group:'a11y-tables-lists'},
-{id:'document-title',weight:2,group:'a11y-names-labels'},
-{id:'duplicate-id',weight:5,group:'a11y-best-practices'},
-{id:'frame-title',weight:5,group:'a11y-names-labels'},
-{id:'html-has-lang',weight:4,group:'a11y-language'},
-{id:'html-lang-valid',weight:1,group:'a11y-language'},
-{id:'image-alt',weight:8,group:'a11y-names-labels'},
-{id:'input-image-alt',weight:1,group:'a11y-names-labels'},
+{id:'bypass',weight:3,group:'a11y-navigation'},
+{id:'color-contrast',weight:3,group:'a11y-color-contrast'},
+{id:'definition-list',weight:3,group:'a11y-tables-lists'},
+{id:'dlitem',weight:3,group:'a11y-tables-lists'},
+{id:'document-title',weight:3,group:'a11y-names-labels'},
+{id:'duplicate-id',weight:1,group:'a11y-best-practices'},
+{id:'frame-title',weight:3,group:'a11y-names-labels'},
+{id:'html-has-lang',weight:3,group:'a11y-language'},
+{id:'html-lang-valid',weight:3,group:'a11y-language'},
+{id:'image-alt',weight:10,group:'a11y-names-labels'},
+{id:'input-image-alt',weight:10,group:'a11y-names-labels'},
{id:'label',weight:10,group:'a11y-names-labels'},
-{id:'layout-table',weight:1,group:'a11y-tables-lists'},
-{id:'link-name',weight:9,group:'a11y-names-labels'},
-{id:'list',weight:5,group:'a11y-tables-lists'},
-{id:'listitem',weight:4,group:'a11y-tables-lists'},
-{id:'meta-refresh',weight:1,group:'a11y-best-practices'},
-{id:'meta-viewport',weight:3,group:'a11y-best-practices'},
-{id:'object-alt',weight:4,group:'a11y-names-labels'},
-{id:'tabindex',weight:4,group:'a11y-navigation'},
-{id:'td-headers-attr',weight:1,group:'a11y-tables-lists'},
-{id:'th-has-data-cells',weight:1,group:'a11y-tables-lists'},
-{id:'valid-lang',weight:1,group:'a11y-language'},
-{id:'video-caption',weight:4,group:'a11y-audio-video'},
-{id:'video-description',weight:3,group:'a11y-audio-video'},
+{id:'layout-table',weight:3,group:'a11y-tables-lists'},
+{id:'link-name',weight:3,group:'a11y-names-labels'},
+{id:'list',weight:3,group:'a11y-tables-lists'},
+{id:'listitem',weight:3,group:'a11y-tables-lists'},
+{id:'meta-refresh',weight:10,group:'a11y-best-practices'},
+{id:'meta-viewport',weight:10,group:'a11y-best-practices'},
+{id:'object-alt',weight:3,group:'a11y-names-labels'},
+{id:'tabindex',weight:3,group:'a11y-navigation'},
+{id:'td-headers-attr',weight:3,group:'a11y-tables-lists'},
+{id:'th-has-data-cells',weight:3,group:'a11y-tables-lists'},
+{id:'valid-lang',weight:3,group:'a11y-language'},
+{id:'video-caption',weight:10,group:'a11y-audio-video'},
+{id:'video-description',weight:10,group:'a11y-audio-video'},
{id:'logical-tab-order',weight:0},
{id:'focusable-controls',weight:0},
@@ -20349,6 +21162,7 @@ auditRefs:[
{id:'link-text',weight:1,group:'seo-content'},
{id:'is-crawlable',weight:1,group:'seo-crawl'},
{id:'robots-txt',weight:1,group:'seo-crawl'},
+{id:'image-alt',weight:1,group:'seo-content'},
{id:'hreflang',weight:1,group:'seo-content'},
{id:'canonical',weight:1,group:'seo-content'},
{id:'font-size',weight:1,group:'seo-mobile'},
@@ -20380,6 +21194,7 @@ auditRefs:[
{id:'content-width',weight:1,group:'pwa-optimized'},
{id:'viewport',weight:2,group:'pwa-optimized'},
{id:'without-javascript',weight:1,group:'pwa-optimized'},
+{id:'apple-touch-icon',weight:1,group:'pwa-optimized'},
{id:'pwa-cross-browser',weight:0},
{id:'pwa-page-transitions',weight:0},
@@ -20398,7 +21213,7 @@ get:()=>UIStrings});
}).call(this,"/lighthouse-core/config/default-config.js");
-},{"../lib/i18n/i18n.js":63,"./constants":40}],42:[function(require,module,exports){
+},{"../lib/i18n/i18n.js":66,"./constants.js":43}],45:[function(require,module,exports){
@@ -20433,7 +21248,7 @@ auditRefs:[
module.exports=fullConfig;
-},{}],43:[function(require,module,exports){
+},{}],46:[function(require,module,exports){
@@ -20443,7 +21258,7 @@ module.exports=fullConfig;
const EventEmitter=require('events').EventEmitter;
const log=require('lighthouse-logger');
-const LHError=require('../../lib/lh-error');
+const LHError=require('../../lib/lh-error.js');
@@ -20596,7 +21411,7 @@ this._eventEmitter=null;
module.exports=Connection;
-},{"../../lib/lh-error":67,"events":100,"lighthouse-logger":120}],44:[function(require,module,exports){
+},{"../../lib/lh-error.js":70,"events":105,"lighthouse-logger":125}],47:[function(require,module,exports){
@@ -20656,7 +21471,7 @@ this._port.send(message);
module.exports=RawConnection;
-},{"./connection.js":43}],45:[function(require,module,exports){
+},{"./connection.js":46}],48:[function(require,module,exports){
@@ -20713,7 +21528,7 @@ this._messages.push(message);
module.exports=DevtoolsLog;
-},{}],46:[function(require,module,exports){
+},{}],49:[function(require,module,exports){
(function(Buffer){
@@ -20722,17 +21537,17 @@ module.exports=DevtoolsLog;
'use strict';
-const NetworkRecorder=require('../lib/network-recorder');
-const emulation=require('../lib/emulation');
-const Element=require('../lib/element');
-const LHError=require('../lib/lh-error');
-const NetworkRequest=require('../lib/network-request');
+const NetworkRecorder=require('../lib/network-recorder.js');
+const emulation=require('../lib/emulation.js');
+const Element=require('../lib/element.js');
+const LHError=require('../lib/lh-error.js');
+const NetworkRequest=require('../lib/network-request.js');
const EventEmitter=require('events').EventEmitter;
-const URL=require('../lib/url-shim');
-const constants=require('../config/constants');
+const URL=require('../lib/url-shim.js');
+const constants=require('../config/constants.js');
const log=require('lighthouse-logger');
-const DevtoolsLog=require('./devtools-log');
+const DevtoolsLog=require('./devtools-log.js');
const pageFunctions=require('../lib/page-functions.js');
@@ -21242,7 +22057,14 @@ return value;
async getAppManifest(){
-this.setNextProtocolTimeout(3000);
+
+
+
+
+
+
+
+this.setNextProtocolTimeout(10000);
let response;
try{
response=await this.sendCommand('Page.getAppManifest');
@@ -22054,9 +22876,6 @@ traceCategories[toplevelIndex]='toplevel';
const uniqueCategories=Array.from(new Set(traceCategories));
-if(this.isDomainEnabled('Debugger')){
-throw new Error('Debugger domain enabled when starting trace');
-}
if(this.isDomainEnabled('CSS')){
throw new Error('CSS domain enabled when starting trace');
}
@@ -22126,14 +22945,24 @@ return this.sendCommand('Runtime.enable');
+
+
+async enableAsyncStacks(){
+await this.sendCommand('Debugger.enable');
+await this.sendCommand('Debugger.setSkipAllPauses',{skip:true});
+await this.sendCommand('Debugger.setAsyncCallStackDepth',{maxDepth:8});
+}
+
+
+
+
+
async beginEmulation(settings){
-if(!settings.disableDeviceEmulation){
if(settings.emulatedFormFactor==='mobile'){
await emulation.enableNexus5X(this);
}else if(settings.emulatedFormFactor==='desktop'){
await emulation.enableDesktop(this);
}
-}
await this.setThrottling(settings,{useThrottling:true});
}
@@ -22182,12 +23011,17 @@ this.online=true;
-cleanBrowserCaches(){
+async cleanBrowserCaches(){
+const status={msg:'Cleaning browser cache',id:'lh:driver:cleanBrowserCaches'};
+log.time(status);
+
-return this.sendCommand('Network.clearBrowserCache').
+await this.sendCommand('Network.clearBrowserCache');
-then(_=>this.sendCommand('Network.setCacheDisabled',{cacheDisabled:true})).
-then(_=>this.sendCommand('Network.setCacheDisabled',{cacheDisabled:false}));
+await this.sendCommand('Network.setCacheDisabled',{cacheDisabled:true});
+await this.sendCommand('Network.setCacheDisabled',{cacheDisabled:false});
+
+log.timeEnd(status);
}
@@ -22289,7 +23123,7 @@ await this.sendCommand('Page.enable');
module.exports=Driver;
}).call(this,require("buffer").Buffer);
-},{"../config/constants":40,"../lib/element":60,"../lib/emulation":61,"../lib/lh-error":67,"../lib/network-recorder":70,"../lib/network-request":71,"../lib/page-functions.js":72,"../lib/url-shim":"url","./connections/connection.js":43,"./devtools-log":45,"buffer":94,"events":100,"lighthouse-logger":120}],47:[function(require,module,exports){
+},{"../config/constants.js":43,"../lib/element.js":63,"../lib/emulation.js":64,"../lib/lh-error.js":70,"../lib/network-recorder.js":73,"../lib/network-request.js":74,"../lib/page-functions.js":75,"../lib/url-shim.js":"url","./connections/connection.js":46,"./devtools-log.js":48,"buffer":99,"events":105,"lighthouse-logger":125}],50:[function(require,module,exports){
@@ -22299,46 +23133,12 @@ module.exports=Driver;
const log=require('lighthouse-logger');
const manifestParser=require('../lib/manifest-parser.js');
+const stacksGatherer=require('../lib/stack-collector.js');
const LHError=require('../lib/lh-error.js');
const URL=require('../lib/url-shim.js');
const NetworkRecorder=require('../lib/network-recorder.js');
const constants=require('../config/constants.js');
-const Driver=require('../gather/driver.js');
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -22379,13 +23179,34 @@ log.timeEnd(status);
+
static async loadPage(driver,passContext){
+const gatherers=passContext.passConfig.gatherers;
+const status={
+msg:'Loading page & waiting for onload',
+id:`lh:gather:loadPage-${passContext.passConfig.passName}`,
+args:[gatherers.map(g=>g.instance.name).join(', ')]};
+
+log.time(status);
+try{
const finalUrl=await driver.gotoURL(passContext.url,{
waitForFCP:passContext.passConfig.recordTrace,
waitForLoad:true,
passContext});
passContext.url=finalUrl;
+}catch(err){
+
+if(err.code==='NO_FCP'){
+return{navigationError:err};
+}
+
+throw err;
+}finally{
+log.timeEnd(status);
+}
+
+return{};
}
@@ -22400,6 +23221,7 @@ const resetStorage=!options.settings.disableStorageReset;
await driver.assertNoSameOriginServiceWorkerClients(options.requestedUrl);
await driver.beginEmulation(options.settings);
await driver.enableRuntimeEvents();
+await driver.enableAsyncStacks();
await driver.cacheNatives();
await driver.registerPerformanceObserver();
await driver.dismissJavaScriptDialogs();
@@ -22411,11 +23233,17 @@ log.timeEnd(status);
-static async disposeDriver(driver){
+
+
+static async disposeDriver(driver,options){
const status={msg:'Disconnecting from browser...',id:'lh:gather:disconnect'};
log.time(status);
try{
+
+const resetStorage=!options.settings.disableStorageReset;
+if(resetStorage)await driver.clearDataForOrigin(options.requestedUrl);
+
await driver.disconnect();
}catch(err){
@@ -22433,7 +23261,7 @@ log.timeEnd(status);
-static getPageLoadError(url,networkRecords){
+static getNetworkError(url,networkRecords){
const mainRecord=networkRecords.find(record=>{
return URL.equalWithExcludedFragments(record.url,url);
@@ -22472,9 +23300,37 @@ LHError.errors.ERRORED_DOCUMENT_REQUEST,
-static async beforePass(passContext,gathererResults){
-const bpStatus={msg:`Running beforePass methods`,id:`lh:gather:beforePass`};
-log.time(bpStatus,'verbose');
+
+static getPageLoadError(passContext,loadData,navigationError){
+const networkError=GatherRunner.getNetworkError(passContext.url,loadData.networkRecords);
+
+
+if(!passContext.driver.online)return;
+
+
+
+
+if(networkError)return networkError;
+
+
+
+
+return navigationError;
+}
+
+
+
+
+
+
+
+static async setupPassNetwork(passContext){
+const status={msg:'Setting up network for the pass trace',id:`lh:gather:setupPassNetwork`};
+log.time(status);
+
+const passConfig=passContext.passConfig;
+await passContext.driver.setThrottling(passContext.settings,passConfig);
+
const blockedUrls=(passContext.passConfig.blockedUrlPatterns||[]).
concat(passContext.settings.blockedUrlPatterns||[]);
@@ -22484,12 +23340,79 @@ concat(passContext.settings.blockedUrlPatterns||[]);
await passContext.driver.blockUrlPatterns(blockedUrls);
await passContext.driver.setExtraHTTPHeaders(passContext.settings.extraHeaders);
+log.timeEnd(status);
+}
+
+
+
+
+
+
+static async beginRecording(passContext){
+const status={msg:'Beginning devtoolsLog and trace',id:'lh:gather:beginRecording'};
+log.time(status);
+
+const{driver,passConfig,settings}=passContext;
+
+
+await driver.beginDevtoolsLog();
+
+if(passConfig.recordTrace){
+await driver.beginTrace(settings);
+}
+
+log.timeEnd(status);
+}
+
+
+
+
+
+
+
+static async endRecording(passContext){
+const{driver,passConfig}=passContext;
+
+let trace;
+if(passConfig.recordTrace){
+const status={msg:'Gathering trace',id:`lh:gather:getTrace`};
+log.time(status);
+trace=await driver.endTrace();
+log.timeEnd(status);
+}
+
+const status={
+msg:'Gathering devtoolsLog & network records',
+id:`lh:gather:getDevtoolsLog`};
+
+log.time(status);
+const devtoolsLog=driver.endDevtoolsLog();
+const networkRecords=NetworkRecorder.recordsFromLogs(devtoolsLog);
+log.timeEnd(status);
+
+return{
+networkRecords,
+devtoolsLog,
+trace};
+
+}
+
+
+
+
+
+
+
+static async beforePass(passContext,gathererResults){
+const bpStatus={msg:`Running beforePass methods`,id:`lh:gather:beforePass`};
+log.time(bpStatus,'verbose');
+
for(const gathererDefn of passContext.passConfig.gatherers){
const gatherer=gathererDefn.instance;
passContext.options=gathererDefn.options||{};
const status={
-msg:`Retrieving setup: ${gatherer.name}`,
+msg:`Gathering setup: ${gatherer.name}`,
id:`lh:gather:beforePass:${gatherer.name}`};
log.time(status,'verbose');
@@ -22507,42 +23430,19 @@ log.timeEnd(bpStatus);
-
static async pass(passContext,gathererResults){
-const driver=passContext.driver;
const config=passContext.passConfig;
-const settings=passContext.settings;
const gatherers=config.gatherers;
-const recordTrace=config.recordTrace;
-const isPerfRun=!settings.disableStorageReset&&recordTrace&&config.useThrottling;
-
-const status={
-msg:'Loading page & waiting for onload',
-id:`lh:gather:loadPage-${passContext.passConfig.passName}`,
-args:[gatherers.map(g=>g.instance.name).join(', ')]};
-
-log.time(status);
-
-
-if(isPerfRun)await driver.cleanBrowserCaches();
-
-await driver.beginDevtoolsLog();
-
-if(recordTrace)await driver.beginTrace(settings);
-
-
-await GatherRunner.loadPage(driver,passContext);
-log.timeEnd(status);
-
const pStatus={msg:`Running pass methods`,id:`lh:gather:pass`};
log.time(pStatus,'verbose');
+
for(const gathererDefn of gatherers){
const gatherer=gathererDefn.instance;
passContext.options=gathererDefn.options||{};
const status={
-msg:`Retrieving in-page: ${gatherer.name}`,
+msg:`Gathering in-page: ${gatherer.name}`,
id:`lh:gather:pass:${gatherer.name}`};
log.time(status);
@@ -22553,7 +23453,7 @@ gathererResult.push(artifactPromise);
gathererResults[gatherer.name]=gathererResult;
await artifactPromise.catch(()=>{});
}
-log.timeEnd(status);
+
log.timeEnd(pStatus);
}
@@ -22564,67 +23464,25 @@ log.timeEnd(pStatus);
-
-static async afterPass(passContext,gathererResults){
-const driver=passContext.driver;
+static async afterPass(passContext,loadData,gathererResults){
const config=passContext.passConfig;
const gatherers=config.gatherers;
-let trace;
-if(config.recordTrace){
-const status={msg:'Retrieving trace',id:`lh:gather:getTrace`};
-log.time(status);
-trace=await driver.endTrace();
-log.timeEnd(status);
-}
-
-const status={
-msg:'Retrieving devtoolsLog & network records',
-id:`lh:gather:getDevtoolsLog`};
-
-log.time(status);
-const devtoolsLog=driver.endDevtoolsLog();
-const networkRecords=NetworkRecorder.recordsFromLogs(devtoolsLog);
-log.timeEnd(status);
-
-let pageLoadError=GatherRunner.getPageLoadError(passContext.url,networkRecords);
-
-if(!driver.online)pageLoadError=undefined;
-
-if(pageLoadError){
-log.error('GatherRunner',pageLoadError.message,passContext.url);
-passContext.LighthouseRunWarnings.push(pageLoadError.friendlyMessage);
-}
-
-
-
-const passData={
-networkRecords,
-devtoolsLog,
-trace};
-
-
const apStatus={msg:`Running afterPass methods`,id:`lh:gather:afterPass`};
-
-await driver.setThrottling(passContext.settings,{useThrottling:false});
log.time(apStatus,'verbose');
for(const gathererDefn of gatherers){
const gatherer=gathererDefn.instance;
const status={
-msg:`Retrieving: ${gatherer.name}`,
+msg:`Gathering: ${gatherer.name}`,
id:`lh:gather:afterPass:${gatherer.name}`};
log.time(status);
passContext.options=gathererDefn.options||{};
-
-
-const artifactPromise=pageLoadError?
-Promise.reject(pageLoadError):
-
-Promise.resolve().then(_=>gatherer.afterPass(passContext,passData));
+const artifactPromise=Promise.resolve().
+then(_=>gatherer.afterPass(passContext,loadData));
const gathererResult=gathererResults[gatherer.name]||[];
gathererResult.push(artifactPromise);
@@ -22633,11 +23491,29 @@ await artifactPromise.catch(()=>{});
log.timeEnd(status);
}
log.timeEnd(apStatus);
+}
+
+
+
+
+
-return passData;
+
+static generatePageLoadErrorArtifacts(passContext,pageLoadError){
+
+const errorArtifacts={};
+for(const gathererDefn of passContext.passConfig.gatherers){
+const gatherer=gathererDefn.instance;
+errorArtifacts[gatherer.name]=pageLoadError;
}
+return{
+pageLoadError,
+
+artifacts:errorArtifacts};
+
+}
@@ -22647,14 +23523,12 @@ return passData;
-static async collectArtifacts(gathererResults,baseArtifacts){
+static async collectArtifacts(gathererResults){
const gathererArtifacts={};
const resultsEntries=Object.entries(gathererResults);
for(const[gathererName,phaseResultsPromises]of resultsEntries){
-if(gathererArtifacts[gathererName]!==undefined)continue;
-
try{
const phaseResults=await Promise.all(phaseResultsPromises);
@@ -22672,21 +23546,18 @@ throw new Error(`${gathererName} failed to provide an artifact.`);
}
}
+return{
+artifacts:gathererArtifacts};
-baseArtifacts.LighthouseRunWarnings=Array.from(new Set(baseArtifacts.LighthouseRunWarnings));
-
-
-baseArtifacts.Timing=log.getTimeEntries();
+}
-return{...baseArtifacts,...gathererArtifacts};
-}
-static async getBaseArtifacts(options){
+static async initializeBaseArtifacts(options){
const hostUserAgent=(await options.driver.getBrowserVersion()).userAgent;
const{emulatedFormFactor}=options.settings;
@@ -22703,6 +23574,7 @@ HostUserAgent:hostUserAgent,
NetworkUserAgent:'',
BenchmarkIndex:0,
WebAppManifest:null,
+Stacks:[],
traces:{},
devtoolsLogs:{},
settings:options.settings,
@@ -22717,6 +23589,47 @@ Timing:[]};
+static async populateBaseArtifacts(passContext){
+const baseArtifacts=passContext.baseArtifacts;
+
+
+baseArtifacts.URL.finalUrl=passContext.url;
+
+
+baseArtifacts.WebAppManifest=await GatherRunner.getWebAppManifest(passContext);
+
+baseArtifacts.Stacks=await stacksGatherer(passContext);
+
+
+const devtoolsLog=baseArtifacts.devtoolsLogs[passContext.passConfig.passName];
+const userAgentEntry=devtoolsLog.find(entry=>
+entry.method==='Network.requestWillBeSent'&&
+!!entry.params.request.headers['User-Agent']);
+
+if(userAgentEntry){
+
+baseArtifacts.NetworkUserAgent=userAgentEntry.params.request.headers['User-Agent'];
+}
+}
+
+
+
+
+
+static finalizeBaseArtifacts(baseArtifacts){
+
+baseArtifacts.LighthouseRunWarnings=Array.from(new Set(baseArtifacts.LighthouseRunWarnings));
+
+
+baseArtifacts.Timing=log.getTimeEntries();
+}
+
+
+
+
+
+
+
@@ -22734,86 +23647,111 @@ return manifestParser(response.data,response.url,passContext.url);
-static async run(passes,options){
+static async run(passConfigs,options){
const driver=options.driver;
-const gathererResults={};
+const artifacts={};
try{
await driver.connect();
-const baseArtifacts=await GatherRunner.getBaseArtifacts(options);
await GatherRunner.loadBlank(driver);
+
+const baseArtifacts=await GatherRunner.initializeBaseArtifacts(options);
baseArtifacts.BenchmarkIndex=await options.driver.getBenchmarkIndex();
-await GatherRunner.setupDriver(driver,options);
+await GatherRunner.setupDriver(driver,options);
let isFirstPass=true;
-for(const passConfig of passes){
-const passContext={
-driver:options.driver,
+for(const passConfig of passConfigs){
+const passContext={
+driver,
url:options.requestedUrl,
settings:options.settings,
passConfig,
baseArtifacts,
-
LighthouseRunWarnings:baseArtifacts.LighthouseRunWarnings};
+const passResults=await GatherRunner.runPass(passContext);
+Object.assign(artifacts,passResults.artifacts);
+
+if(isFirstPass){
+await GatherRunner.populateBaseArtifacts(passContext);
+isFirstPass=false;
+}
+}
-await driver.setThrottling(options.settings,passConfig);
-if(!isFirstPass){
+await GatherRunner.disposeDriver(driver,options);
+GatherRunner.finalizeBaseArtifacts(baseArtifacts);
+return{...baseArtifacts,...artifacts};
+}catch(err){
-await GatherRunner.loadBlank(driver,passConfig.blankPage);
+GatherRunner.disposeDriver(driver,options);
+throw err;
}
-await GatherRunner.beforePass(passContext,gathererResults);
-await GatherRunner.pass(passContext,gathererResults);
-if(isFirstPass){
-baseArtifacts.WebAppManifest=await GatherRunner.getWebAppManifest(passContext);
}
-const passData=await GatherRunner.afterPass(passContext,gathererResults);
-baseArtifacts.devtoolsLogs[passConfig.passName]=passData.devtoolsLog;
-const userAgentEntry=passData.devtoolsLog.find(entry=>
-entry.method==='Network.requestWillBeSent'&&
-!!entry.params.request.headers['User-Agent']);
-if(userAgentEntry&&!baseArtifacts.NetworkUserAgent){
-baseArtifacts.NetworkUserAgent=userAgentEntry.params.request.headers['User-Agent'];
+static isPerfPass(passContext){
+const{settings,passConfig}=passContext;
+return!settings.disableStorageReset&&passConfig.recordTrace&&passConfig.useThrottling;
}
-if(passData.trace){
-baseArtifacts.traces[passConfig.passName]=passData.trace;
-}
-if(isFirstPass){
-baseArtifacts.URL.finalUrl=passContext.url;
-isFirstPass=false;
-}
-}
-const resetStorage=!options.settings.disableStorageReset;
-if(resetStorage)await driver.clearDataForOrigin(options.requestedUrl);
-await GatherRunner.disposeDriver(driver);
-return GatherRunner.collectArtifacts(gathererResults,baseArtifacts);
-}catch(err){
-GatherRunner.disposeDriver(driver);
-throw err;
+
+static async runPass(passContext){
+
+const gathererResults={};
+const{driver,passConfig}=passContext;
+
+
+await GatherRunner.loadBlank(driver,passConfig.blankPage);
+await GatherRunner.setupPassNetwork(passContext);
+const isPerfPass=GatherRunner.isPerfPass(passContext);
+if(isPerfPass)await driver.cleanBrowserCaches();
+await GatherRunner.beforePass(passContext,gathererResults);
+
+
+await GatherRunner.beginRecording(passContext);
+const{navigationError:possibleNavError}=await GatherRunner.loadPage(driver,passContext);
+await GatherRunner.pass(passContext,gathererResults);
+const loadData=await GatherRunner.endRecording(passContext);
+
+
+await driver.setThrottling(passContext.settings,{useThrottling:false});
+
+
+const baseArtifacts=passContext.baseArtifacts;
+baseArtifacts.devtoolsLogs[passConfig.passName]=loadData.devtoolsLog;
+if(loadData.trace)baseArtifacts.traces[passConfig.passName]=loadData.trace;
+
+
+const pageLoadError=GatherRunner.getPageLoadError(passContext,loadData,possibleNavError);
+if(pageLoadError){
+log.error('GatherRunner',pageLoadError.friendlyMessage,passContext.url);
+passContext.LighthouseRunWarnings.push(pageLoadError.friendlyMessage);
+return GatherRunner.generatePageLoadErrorArtifacts(passContext,pageLoadError);
}
+
+
+await GatherRunner.afterPass(passContext,loadData,gathererResults);
+return GatherRunner.collectArtifacts(gathererResults);
}}
module.exports=GatherRunner;
-},{"../config/constants.js":40,"../gather/driver.js":46,"../lib/lh-error.js":67,"../lib/manifest-parser.js":68,"../lib/network-recorder.js":70,"../lib/url-shim.js":"url","lighthouse-logger":120}],48:[function(require,module,exports){
+},{"../config/constants.js":43,"../lib/lh-error.js":70,"../lib/manifest-parser.js":71,"../lib/network-recorder.js":73,"../lib/stack-collector.js":78,"../lib/url-shim.js":"url","lighthouse-logger":125}],51:[function(require,module,exports){
@@ -22874,7 +23812,7 @@ afterPass(passContext,loadData){}}
module.exports=Gatherer;
-},{}],49:[function(require,module,exports){
+},{}],52:[function(require,module,exports){
@@ -22882,10 +23820,10 @@ module.exports=Gatherer;
'use strict';
-const Runner=require('./runner');
+const Runner=require('./runner.js');
const log=require('lighthouse-logger');
const ChromeProtocol=require('./gather/connections/cri.js');
-const Config=require('./config/config');
+const Config=require('./config/config.js');
const URL=require('./lib/url-shim.js');
const LHError=require('./lib/lh-error.js');
@@ -22947,13 +23885,14 @@ return new Config(configJson,flags);
lighthouse.generateConfig=generateConfig;
lighthouse.getAuditList=Runner.getAuditList;
-lighthouse.traceCategories=require('./gather/driver').traceCategories;
-lighthouse.Audit=require('./audits/audit');
-lighthouse.Gatherer=require('./gather/gatherers/gatherer');
+lighthouse.traceCategories=require('./gather/driver.js').traceCategories;
+lighthouse.Audit=require('./audits/audit.js');
+lighthouse.Gatherer=require('./gather/gatherers/gatherer.js');
+lighthouse.NetworkRecords=require('./computed/network-records.js');
module.exports=lighthouse;
-},{"./audits/audit":3,"./config/config":39,"./gather/connections/cri.js":93,"./gather/driver":46,"./gather/gatherers/gatherer":48,"./lib/lh-error.js":67,"./lib/url-shim.js":"url","./runner":82,"lighthouse-logger":120}],50:[function(require,module,exports){
+},{"./audits/audit.js":3,"./computed/network-records.js":31,"./config/config.js":42,"./gather/connections/cri.js":98,"./gather/driver.js":49,"./gather/gatherers/gatherer.js":51,"./lib/lh-error.js":70,"./lib/url-shim.js":"url","./runner.js":87,"lighthouse-logger":125}],53:[function(require,module,exports){
@@ -23036,7 +23975,7 @@ return isEqual(objA,objB);
module.exports=ArbitraryEqualityMap;
-},{"lodash.isequal":121}],51:[function(require,module,exports){
+},{"lodash.isequal":126}],54:[function(require,module,exports){
(function(process){
@@ -23184,7 +24123,6 @@ return assets;
-
function*traceJsonGenerator(traceData){
const EVENTS_PER_ITERATION=500;
const keys=Object.keys(traceData);
@@ -23297,28 +24235,6 @@ await saveLanternDebugTraces(pathWithBasename);
-
-async function logAssets(artifacts,audits){
-const allAssets=await prepareAssets(artifacts,audits);
-allAssets.map(passAssets=>{
-const dtlogdata=JSON.stringify(passAssets.devtoolsLog);
-
-console.log(`loggedAsset %%% devtoolslog-${passAssets.passName}.json %%% ${dtlogdata}`);
-const traceIter=traceJsonGenerator(passAssets.traceData);
-let traceJson='';
-for(const trace of traceIter){
-traceJson+=trace;
-}
-
-console.log(`loggedAsset %%% trace-${passAssets.passName}.json %%% ${traceJson}`);
-});
-}
-
-
-
-
-
-
async function saveLanternNetworkData(devtoolsLog,outputPath){
const context={computedCache:new Map()};
const networkAnalysis=await NetworkAnalysisComputed.request(devtoolsLog,context);
@@ -23333,12 +24249,11 @@ loadArtifacts,
saveAssets,
prepareAssets,
saveTrace,
-logAssets,
saveLanternNetworkData};
}).call(this,require('_process'));
-},{"../computed/load-simulator.js":10,"../computed/network-analysis.js":30,"./dependency-graph/simulator/simulator.js":58,"./lantern-trace-saver.js":66,"./traces/pwmetrics-events.js":78,"_process":137,"lighthouse-logger":120,"mkdirp":93,"path":135,"rimraf":93,"stream":162}],52:[function(require,module,exports){
+},{"../computed/load-simulator.js":10,"../computed/network-analysis.js":30,"./dependency-graph/simulator/simulator.js":61,"./lantern-trace-saver.js":69,"./traces/pwmetrics-events.js":83,"_process":142,"lighthouse-logger":125,"mkdirp":98,"path":140,"rimraf":98,"stream":167}],55:[function(require,module,exports){
@@ -23653,7 +24568,7 @@ CPU:'cpu'};
module.exports=BaseNode;
-},{}],53:[function(require,module,exports){
+},{}],56:[function(require,module,exports){
@@ -23661,7 +24576,7 @@ module.exports=BaseNode;
'use strict';
-const BaseNode=require('./base-node');
+const BaseNode=require('./base-node.js');
class CPUNode extends BaseNode{
@@ -23719,14 +24634,16 @@ return this._childEvents.some(evt=>evt.name==='Layout');
+getEvaluateScriptURLs(){
+const urls=new Set();
+for(const event of this._childEvents){
+if(event.name!=='EvaluateScript')continue;
+if(!event.args.data||!event.args.data.url)continue;
+urls.add(event.args.data.url);
+}
-isEvaluateScriptFor(urls){
-return this._childEvents.some(evt=>{
-return evt.name==='EvaluateScript'&&
-!!evt.args.data&&!!evt.args.data.url&&
-urls.has(evt.args.data.url);
-});
+return urls;
}
@@ -23739,7 +24656,7 @@ return new CPUNode(this._event,this._childEvents);
module.exports=CPUNode;
-},{"./base-node":52}],54:[function(require,module,exports){
+},{"./base-node.js":55}],57:[function(require,module,exports){
@@ -23747,8 +24664,8 @@ module.exports=CPUNode;
'use strict';
-const BaseNode=require('./base-node');
-const NetworkRequest=require('../network-request');
+const BaseNode=require('./base-node.js');
+const NetworkRequest=require('../network-request.js');
class NetworkNode extends BaseNode{
@@ -23823,7 +24740,7 @@ return node;
module.exports=NetworkNode;
-},{"../network-request":71,"./base-node":52}],55:[function(require,module,exports){
+},{"../network-request.js":74,"./base-node.js":55}],58:[function(require,module,exports){
@@ -23831,8 +24748,8 @@ module.exports=NetworkNode;
'use strict';
-const NetworkAnalyzer=require('./network-analyzer');
-const TcpConnection=require('./tcp-connection');
+const NetworkAnalyzer=require('./network-analyzer.js');
+const TcpConnection=require('./tcp-connection.js');
const DEFAULT_SERVER_RESPONSE_TIME=30;
const TLS_SCHEMES=['https','wss'];
@@ -23994,7 +24911,7 @@ this._connectionsInUse.delete(connection);
}};
-},{"./network-analyzer":57,"./tcp-connection":59}],56:[function(require,module,exports){
+},{"./network-analyzer.js":60,"./tcp-connection.js":62}],59:[function(require,module,exports){
@@ -24069,7 +24986,7 @@ DNSCache.RTT_MULTIPLIER=DNS_RESOLUTION_RTT_MULTIPLIER;
module.exports=DNSCache;
-},{}],57:[function(require,module,exports){
+},{}],60:[function(require,module,exports){
@@ -24546,7 +25463,7 @@ module.exports=NetworkAnalyzer;
-},{"../../network-request.js":71,"../../url-shim.js":"url"}],58:[function(require,module,exports){
+},{"../../network-request.js":74,"../../url-shim.js":"url"}],61:[function(require,module,exports){
@@ -24554,11 +25471,11 @@ module.exports=NetworkAnalyzer;
'use strict';
-const BaseNode=require('../base-node');
-const TcpConnection=require('./tcp-connection');
-const ConnectionPool=require('./connection-pool');
-const DNSCache=require('./dns-cache');
-const mobileSlow4G=require('../../../config/constants').throttling.mobileSlow4G;
+const BaseNode=require('../base-node.js');
+const TcpConnection=require('./tcp-connection.js');
+const ConnectionPool=require('./connection-pool.js');
+const DNSCache=require('./dns-cache.js');
+const mobileSlow4G=require('../../../config/constants.js').throttling.mobileSlow4G;
@@ -25057,7 +25974,7 @@ module.exports=Simulator;
-},{"../../../config/constants":40,"../base-node":52,"./connection-pool":55,"./dns-cache":56,"./tcp-connection":59}],59:[function(require,module,exports){
+},{"../../../config/constants.js":43,"../base-node.js":55,"./connection-pool.js":58,"./dns-cache.js":59,"./tcp-connection.js":62}],62:[function(require,module,exports){
@@ -25265,7 +26182,7 @@ module.exports=TcpConnection;
-},{}],60:[function(require,module,exports){
+},{}],63:[function(require,module,exports){
@@ -25338,7 +26255,7 @@ catch(()=>null);
module.exports=Element;
-},{"../gather/driver.js":46}],61:[function(require,module,exports){
+},{"../gather/driver.js":49}],64:[function(require,module,exports){
@@ -25497,7 +26414,7 @@ MOBILE_USERAGENT:NEXUS5X_USERAGENT,
DESKTOP_USERAGENT};
-},{}],62:[function(require,module,exports){
+},{}],65:[function(require,module,exports){
module.exports={
"lighthouse-core/audits/accessibility/accesskeys.js | description":{
"message":"Access keys let users quickly focus a part of the page. For proper navigation, each access key must be unique. [Learn more](https://dequeuniversity.com/rules/axe/3.1/accesskeys?application=lighthouse).",
@@ -25923,6 +26840,22 @@ module.exports={
"message":"`<video>` elements contain a `<track>` element with `[kind=\"description\"]`",
"description":"Title of an accesibility audit that evaluates if all video elements have child track elements that contain a description of the video content. This title is descriptive of the successful state and is shown to users when no user action is required."},
+"lighthouse-core/audits/apple-touch-icon.js | description":{
+"message":"For ideal appearance on iOS when users add to the home screen, define an apple-touch-icon. It must point to a non-transparent 192px (or 180px) square PNG. [Learn More](https://developers.google.com/web/fundamentals/design-and-ux/browser-customization/).",
+"description":"Description of a Lighthouse audit that tells the user what having a valid apple-touch-icon does. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation. \"apple-touch-icon\" is an HTML attribute value and should not be translated."},
+
+"lighthouse-core/audits/apple-touch-icon.js | failureTitle":{
+"message":"Does not provide a valid `apple-touch-icon`",
+"description":"Title of a Lighthouse audit that tells the user that their site contains a vaild touch icon. This descriptive title is shown when the page does not contain a valid iOS touch icon. \"apple-touch-icon\" is an HTML attribute value and should not be translated."},
+
+"lighthouse-core/audits/apple-touch-icon.js | precomposedWarning":{
+"message":"`apple-touch-icon-precomposed` is out of date; `apple-touch-icon` is preferred.",
+"description":"Warning that HTML attribute `apple-touch-icon-precomposed` should not be used in favor of `apple-touch-icon`. \"apple-touch-icon-precomposed\" and \"apple-touch-icon\" are HTML attribute values and should not be translated."},
+
+"lighthouse-core/audits/apple-touch-icon.js | title":{
+"message":"Provides a valid `apple-touch-icon`",
+"description":"Title of a Lighthouse audit that tells the user that their site contains a vaild touch icon. This descriptive title is shown when the page contains a valid iOS touch icon. \"apple-touch-icon\" is an HTML attribute value and should not be translated."},
+
"lighthouse-core/audits/bootup-time.js | chromeExtensionsWarning":{
"message":"Chrome extensions negatively affected this page's load performance. Try auditing the page in incognito mode or from a Chrome profile without extensions.",
"description":"A message displayed in a Lighthouse audit result warning that Chrome extensions on the user's system substantially affected Lighthouse's measurements and instructs the user on how to run again without those extensions."},
@@ -26089,31 +27022,31 @@ module.exports={
"lighthouse-core/audits/dobetterweb/dom-size.js | columnStatistic":{
"message":"Statistic",
-"description":"Table column header for the type of statistic. These statistics describe how big the DOM is (count of DOM nodes, children, depth)."},
+"description":"Table column header for the type of statistic. These statistics describe how big the DOM is (count of DOM elements, children, depth)."},
"lighthouse-core/audits/dobetterweb/dom-size.js | columnValue":{
"message":"Value",
"description":"Table column header for the observed value of the DOM statistic."},
"lighthouse-core/audits/dobetterweb/dom-size.js | description":{
-"message":"Browser engineers recommend pages contain fewer than ~1,500 DOM nodes. The sweet spot is a tree depth < 32 elements and fewer than 60 children/parent element. A large DOM can increase memory usage, cause longer [style calculations](https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations), and produce costly [layout reflows](https://developers.google.com/speed/articles/reflow). [Learn more](https://developers.google.com/web/tools/lighthouse/audits/dom-size).",
-"description":"Description of a Lighthouse audit that tells the user *why* they should reduce the size of the web page's DOM. The size of a DOM is characterized by the total number of DOM nodes and greatest DOM depth. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation."},
+"message":"Browser engineers recommend pages contain fewer than ~1,500 DOM elements. The sweet spot is a tree depth < 32 elements and fewer than 60 children/parent element. A large DOM can increase memory usage, cause longer [style calculations](https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations), and produce costly [layout reflows](https://developers.google.com/speed/articles/reflow). [Learn more](https://developers.google.com/web/tools/lighthouse/audits/dom-size).",
+"description":"Description of a Lighthouse audit that tells the user *why* they should reduce the size of the web page's DOM. The size of a DOM is characterized by the total number of DOM elements and greatest DOM depth. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation."},
"lighthouse-core/audits/dobetterweb/dom-size.js | displayValue":{
-"message":"{itemCount, plural,\n =1 {1 node}\n other {# nodes}\n }",
-"description":"[ICU Syntax] Label for an audit identifying the number of DOM nodes found in the page."},
+"message":"{itemCount, plural,\n =1 {1 element}\n other {# elements}\n }",
+"description":"[ICU Syntax] Label for an audit identifying the number of DOM elements found in the page."},
"lighthouse-core/audits/dobetterweb/dom-size.js | failureTitle":{
"message":"Avoid an excessive DOM size",
-"description":"Title of a diagnostic audit that provides detail on the size of the web page's DOM. The size of a DOM is characterized by the total number of DOM nodes and greatest DOM depth. This imperative title is shown to users when there is a significant amount of execution time that could be reduced."},
+"description":"Title of a diagnostic audit that provides detail on the size of the web page's DOM. The size of a DOM is characterized by the total number of DOM elements and greatest DOM depth. This imperative title is shown to users when there is a significant amount of execution time that could be reduced."},
"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMDepth":{
"message":"Maximum DOM Depth",
"description":"Label for the numeric value of the maximum depth in the page's DOM tree."},
-"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMNodes":{
-"message":"Total DOM Nodes",
-"description":"Label for the total number of DOM nodes found in the page."},
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMElements":{
+"message":"Total DOM Elements",
+"description":"Label for the total number of DOM elements found in the page."},
"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMWidth":{
"message":"Maximum Child Elements",
@@ -26121,7 +27054,7 @@ module.exports={
"lighthouse-core/audits/dobetterweb/dom-size.js | title":{
"message":"Avoids an excessive DOM size",
-"description":"Title of a diagnostic audit that provides detail on the size of the web page's DOM. The size of a DOM is characterized by the total number of DOM nodes and greatest DOM depth. This descriptive title is shown to users when the amount is acceptable and no user action is required."},
+"description":"Title of a diagnostic audit that provides detail on the size of the web page's DOM. The size of a DOM is characterized by the total number of DOM elements and greatest DOM depth. This descriptive title is shown to users when the amount is acceptable and no user action is required."},
"lighthouse-core/audits/font-display.js | description":{
"message":"Leverage the font-display CSS feature to ensure text is user-visible while webfonts are loading. [Learn more](https://developers.google.com/web/updates/2016/02/font-display).",
@@ -26212,11 +27145,11 @@ module.exports={
"description":"The name of the metric that marks the time at which the page is fully loaded and is able to quickly respond to user input (clicks, taps, and keypresses feel responsive). Shown to users as the label for the numeric metric value. Ideally fits within a ~40 character limit."},
"lighthouse-core/audits/metrics/max-potential-fid.js | description":{
-"message":"The potential First Input Delay that your users could experience is the duration, in milliseconds, of the longest task.",
+"message":"The maximum potential First Input Delay that your users could experience is the duration, in milliseconds, of the longest task. [Learn more](https://developers.google.com/web/updates/2018/05/first-input-delay).",
"description":"Description of the Maximum Potential First Input Delay metric that marks the maximum estimated time between the page receiving input (a user clicking, tapping, or typing) and the page responding. This description is displayed within a tooltip when the user hovers on the metric name to see more. No character length limits. 'Learn More' becomes link text to additional documentation."},
"lighthouse-core/audits/metrics/max-potential-fid.js | title":{
-"message":"Max Potential FID",
+"message":"Max Potential First Input Delay",
"description":"The name of the metric \"Maximum Potential First Input Delay\" that marks the maximum estimated time between the page receiving input (a user clicking, tapping, or typing) and the page responding. Shown to users as the label for the numeric metric value. Ideally fits within a ~40 character limit."},
"lighthouse-core/audits/metrics/speed-index.js | description":{
@@ -26243,6 +27176,18 @@ module.exports={
"message":"Server Backend Latencies",
"description":"Descriptive title of a Lighthouse audit that tells the user the server latencies observed from each origin the page connected to. This is displayed in a list of audit titles that Lighthouse generates."},
+"lighthouse-core/audits/performance-budget.js | description":{
+"message":"Keep the quantity and size of network requests under the targets set by the provided performance budget. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/budgets).",
+"description":"Description of a Lighthouse audit where a user sets budgets for the quantity and size of page resources. No character length limits. 'Learn More' becomes link text to additional documentation."},
+
+"lighthouse-core/audits/performance-budget.js | requestCountOverBudget":{
+"message":"{count, plural,\n =1 {1 request}\n other {# requests}\n }",
+"description":"[ICU Syntax] Entry in a data table identifying the number of network requests of a particular type. Count will be a whole number. String should be as short as possible to be able to fit well into the table."},
+
+"lighthouse-core/audits/performance-budget.js | title":{
+"message":"Performance budget",
+"description":"Title of a Lighthouse audit that compares the size and quantity of page resources against targets set by the user. These targets are thought of as \"performance budgets\" because these metrics impact page performance (i.e. how quickly a page loads)."},
+
"lighthouse-core/audits/redirects.js | description":{
"message":"Redirects introduce additional delays before the page can be loaded. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/redirects).",
"description":"Description of a Lighthouse audit that tells users why they should reduce the number of server-side redirects on their page. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation."},
@@ -26251,6 +27196,18 @@ module.exports={
"message":"Avoid multiple page redirects",
"description":"Imperative title of a Lighthouse audit that tells the user to eliminate the redirects taken through multiple URLs to load the page. This is shown in a list of audits that Lighthouse generates."},
+"lighthouse-core/audits/resource-summary.js | description":{
+"message":"To set budgets for the quantity and size of page resources, add a budget.json file. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/budgets).",
+"description":"Description of a Lighthouse audit that tells the user that they can setup a budgets for the quantity and size of page resources. No character length limits. 'Learn More' becomes link text to additional documentation."},
+
+"lighthouse-core/audits/resource-summary.js | displayValue":{
+"message":"{requestCount, plural, =1 {1 request} other {# requests}} • { byteCount, number, bytes } KB",
+"description":"[ICU Syntax] Label for an audit identifying the number of requests and kilobytes used to load the page."},
+
+"lighthouse-core/audits/resource-summary.js | title":{
+"message":"Keep request counts low and transfer sizes small",
+"description":"Imperative title of a Lighthouse audit that tells the user to minimize the size and quantity of resources used to load the page."},
+
"lighthouse-core/audits/seo/canonical.js | description":{
"message":"Canonical links suggest which URL to show in search results. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/canonical).",
"description":"Description of a Lighthouse audit that tells the user *why* they need to have a valid rel=canonical link. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation."},
@@ -26603,6 +27560,14 @@ module.exports={
"message":"Tables and lists",
"description":"Title of the navigation section within the Accessibility category. Within this section are audits with descriptive titles that highlight opportunities to improve the experience of reading tabular or list data using assistive technology."},
+"lighthouse-core/config/default-config.js | budgetsGroupDescription":{
+"message":"Performance budgets set standards for the performance of your site.",
+"description":"Description of the Budgets section of the Performance category. Within this section the budget results are displayed."},
+
+"lighthouse-core/config/default-config.js | budgetsGroupTitle":{
+"message":"Budgets",
+"description":"Title of the Budgets section of the Performance Category. 'Budgets' refers to a budget (like a financial budget), but applied to the amount of resources on a page, rather than money."},
+
"lighthouse-core/config/default-config.js | diagnosticsGroupDescription":{
"message":"More information about the performance of your application.",
"description":"Description of the diagnostics section of the Performance category. Within this section are audits with non-imperative titles that provide more detail on the page's page load performance characteristics. Whereas the 'Opportunities' suggest an action along with expected time savings, diagnostics do not. Within this section, the user may read the details and deduce additional actions they could take."},
@@ -26667,12 +27632,36 @@ module.exports={
"message":"SEO",
"description":"Title of the Search Engine Optimization (SEO) category of audits. This is displayed at the top of a list of audits focused on topics related to optimizing a website for indexing by search engines. Also used as a label of a score gauge; try to limit to 20 characters."},
+"lighthouse-core/config/default-config.js | seoContentGroupDescription":{
+"message":"Format your HTML in a way that enables crawlers to better understand your app’s content.",
+"description":"Description of the navigation section within the Search Engine Optimization (SEO) category. Within this section are audits with descriptive titles that highlight ways to make a website content more easily understood by search engine crawler bots."},
+
+"lighthouse-core/config/default-config.js | seoContentGroupTitle":{
+"message":"Content Best Practices",
+"description":"Title of the navigation section within the Search Engine Optimization (SEO) category. Within this section are audits with descriptive titles that highlight ways to make a website content more easily understood by search engine crawler bots."},
+
+"lighthouse-core/config/default-config.js | seoCrawlingGroupDescription":{
+"message":"To appear in search results, crawlers need access to your app.",
+"description":"Description of the navigation section within the Search Engine Optimization (SEO) category. Within this section are audits with descriptive titles that highlight ways to make a website accessible to search engine crawlers."},
+
+"lighthouse-core/config/default-config.js | seoCrawlingGroupTitle":{
+"message":"Crawling and Indexing",
+"description":"Title of the navigation section within the Search Engine Optimization (SEO) category. Within this section are audits with descriptive titles that highlight ways to make a website accessible to search engine crawlers."},
+
+"lighthouse-core/config/default-config.js | seoMobileGroupDescription":{
+"message":"Make sure your pages are mobile friendly so users don’t have to pinch or zoom in order to read the content pages. [Learn more](https://developers.google.com/search/mobile-sites/).",
+"description":"Description of the navigation section within the Search Engine Optimization (SEO) category. Within this section are audits with descriptive titles that highlight opportunities to make a page more usable on mobile devices."},
+
+"lighthouse-core/config/default-config.js | seoMobileGroupTitle":{
+"message":"Mobile Friendly",
+"description":"Title of the navigation section within the Search Engine Optimization (SEO) category. Within this section are audits with descriptive titles that highlight opportunities to make a page more usable on mobile devices."},
+
"lighthouse-core/lib/i18n/i18n.js | columnCacheTTL":{
"message":"Cache TTL",
"description":"Label for the TTL column in data tables, entries will be the time to live value of the cache header on a web resource"},
"lighthouse-core/lib/i18n/i18n.js | columnSize":{
-"message":"Size (KB)",
+"message":"Size",
"description":"Label for the size column in data tables, entries will be the size of a web resource in kilobytes"},
"lighthouse-core/lib/i18n/i18n.js | columnTimeSpent":{
@@ -26684,11 +27673,11 @@ module.exports={
"description":"Label for the URL column in data tables, entries will be the URL of a web resource"},
"lighthouse-core/lib/i18n/i18n.js | columnWastedBytes":{
-"message":"Potential Savings (KB)",
+"message":"Potential Savings",
"description":"Label for the wasted bytes column in data tables, entries will be the number of kilobytes the user could reduce their page by if they implemented the suggestions"},
"lighthouse-core/lib/i18n/i18n.js | columnWastedMs":{
-"message":"Potential Savings (ms)",
+"message":"Potential Savings",
"description":"Label for the wasted bytes column in data tables, entries will be the number of milliseconds the user could reduce page load by if they implemented the suggestions"},
"lighthouse-core/lib/i18n/i18n.js | displayValueByteSavings":{
@@ -26699,18 +27688,58 @@ module.exports={
"message":"Potential savings of {wastedMs, number, milliseconds} ms",
"description":"Label shown per-audit to show how many milliseconds faster the page load could be if the user implemented the suggestions. The `{wastedMs}` placeholder will be replaced with the time duration, shown in milliseconds (e.g. 140 ms)"},
+"lighthouse-core/lib/i18n/i18n.js | documentResourceType":{
+"message":"Document",
+"description":"Label for a row in a data table; entries will be the total number and byte size of all 'Document' resources loaded by a web page."},
+
+"lighthouse-core/lib/i18n/i18n.js | fontResourceType":{
+"message":"Font",
+"description":"Label for a row in a data table; entries will be the total number and byte size of all 'Font' resources loaded by a web page."},
+
+"lighthouse-core/lib/i18n/i18n.js | imageResourceType":{
+"message":"Image",
+"description":"Label for a row in a data table; entries will be the total number and byte size of all 'Image' resources loaded by a web page."},
+
+"lighthouse-core/lib/i18n/i18n.js | mediaResourceType":{
+"message":"Media",
+"description":"Label for a row in a data table; entries will be the total number and byte size of all 'Media' resources loaded by a web page. 'Media' refers to audio and video files."},
+
"lighthouse-core/lib/i18n/i18n.js | ms":{
"message":"{timeInMs, number, milliseconds} ms",
"description":"Used to show the duration in milliseconds that something lasted. The `{timeInMs}` placeholder will be replaced with the time duration, shown in milliseconds (e.g. 63 ms)"},
+"lighthouse-core/lib/i18n/i18n.js | otherResourceType":{
+"message":"Other",
+"description":"Label for a row in a data table; entries will be the total number and byte size of all resources loaded by a web page that don't fit into the categories of Document, Script, Stylesheet, Image, Media, & Font."},
+
+"lighthouse-core/lib/i18n/i18n.js | scriptResourceType":{
+"message":"Script",
+"description":"Label for a row in a data table; entries will be the total number and byte size of all 'Script' resources loaded by a web page. 'Script' refers to JavaScript or other files that are executable by a browser."},
+
"lighthouse-core/lib/i18n/i18n.js | seconds":{
"message":"{timeInMs, number, seconds} s",
"description":"Used to show the duration in seconds that something lasted. The {timeInMs} placeholder will be replaced with the time duration, shown in seconds (e.g. 5.2 s)"},
+"lighthouse-core/lib/i18n/i18n.js | stylesheetResourceType":{
+"message":"Stylesheet",
+"description":"Label for a row in a data table; entries will be the total number and byte size of all 'Stylesheet' resources loaded by a web page. 'Stylesheet' refers to CSS stylesheets."},
+
+"lighthouse-core/lib/i18n/i18n.js | thirdPartyResourceType":{
+"message":"Third-party",
+"description":"Label for a row in a data table; entries will be the total number and byte size of all third-party resources loaded by a web page. 'Third-party resources are items loaded from URLs that aren't controlled by the owner of the web page."},
+
+"lighthouse-core/lib/i18n/i18n.js | totalResourceType":{
+"message":"Total",
+"description":"Label for a row in a data table; entries will be the total number and byte size of all resources loaded by a web page."},
+
"lighthouse-core/lib/lh-error.js | badTraceRecording":{
"message":"Something went wrong with recording the trace over your page load. Please run Lighthouse again. ({errorCode})",
"description":"Error message explaining that the network trace was not able to be recorded for the Lighthouse run."},
+"lighthouse-core/lib/lh-error.js | criTimeout":{
+"message":"Timeout waiting for initial Debugger Protocol connection.",
+"description":"Error message explaining that Lighthouse timed out while waiting for the initial connection to the Chrome Devtools protocol."},
+
"lighthouse-core/lib/lh-error.js | didntCollectScreenshots":{
"message":"Chrome didn't collect any screenshots during the page load. Please make sure there is content visible on the page, and then try re-running Lighthouse. ({errorCode})",
"description":"Error message explaining that the Lighthouse run was not able to collect screenshots through Chrome."},
@@ -26732,8 +27761,8 @@ module.exports={
"description":"Error message explaining that Lighthouse couldn't complete because the page has stopped responding to its instructions."},
"lighthouse-core/lib/lh-error.js | pageLoadFailedInsecure":{
-"message":"The URL you have provided does not have valid security credentials. {securityMessages}",
-"description":"Error message explaining that the credentials included in the Lighthouse run were invalid, so the URL cannot be accessed. securityMessages will be replaced with one or more strings from the browser explaining what was insecure about the page load."},
+"message":"The URL you have provided does not have a valid security certificate. {securityMessages}",
+"description":"Error message explaining that the security certificate of the page Lighthouse observed was invalid, so the URL cannot be accessed. securityMessages will be replaced with one or more strings from the browser explaining what was insecure about the page load."},
"lighthouse-core/lib/lh-error.js | pageLoadFailedWithDetails":{
"message":"Lighthouse was unable to reliably load the page you requested. Make sure you are testing the correct URL and that the server is properly responding to all requests. (Details: {errorDetails})",
@@ -26807,10 +27836,6 @@ module.exports={
"message":"Passed audits",
"description":"Section heading shown above a list of audits that are passing. 'Passed' here refers to a passing grade. This section is collapsed by default, as the user should be focusing on the failed audits instead. Users can click this heading to reveal the list."},
-"lighthouse-core/report/html/renderer/util.js | scorescaleLabel":{
-"message":"Score scale:",
-"description":"Label preceding a pictorial explanation of the scoring scale: 0-50 is red (bad), 50-90 is orange (ok), 90-100 is green (good). These colors are used throughout the report to provide context for how good/bad a particular result is."},
-
"lighthouse-core/report/html/renderer/util.js | snippetCollapseButtonLabel":{
"message":"Collapse snippet",
"description":"Label for button that only shows a few lines of the snippet when clicked"},
@@ -26819,6 +27844,10 @@ module.exports={
"message":"Expand snippet",
"description":"Label for button that shows all lines of the snippet when clicked"},
+"lighthouse-core/report/html/renderer/util.js | thirdPartyResourcesLabel":{
+"message":"Show 3rd-party resources",
+"description":"This label is for a checkbox above a table of items loaded by a web page. The checkbox is used to show or hide third-party (or \"3rd-party\") resources in the table, where \"third-party resources\" refers to items loaded by a web page from URLs that aren't controlled by the owner of the web page."},
+
"lighthouse-core/report/html/renderer/util.js | toplevelWarningsMessage":{
"message":"There were issues affecting this run of Lighthouse:",
"description":"Label shown preceding any important warnings that may have invalidated the entire report. For example, if the user has Chrome extensions installed, they may add enough performance overhead that Lighthouse's performance metrics are unreliable. If shown, this will be displayed at the top of the report UI."},
@@ -26833,11 +27862,67 @@ module.exports={
"lighthouse-core/report/html/renderer/util.js | warningHeader":{
"message":"Warnings: ",
-"description":"This label is shown above a bulleted list of warnings. It is shown directly below an audit that produced warnings. Warnings describe situations the user should be aware of, as Lighthouse was unable to complete all the work required on this audit. For example, The 'Unable to decode image (biglogo.jpg)' warning may show up below an image encoding audit."}};
+"description":"This label is shown above a bulleted list of warnings. It is shown directly below an audit that produced warnings. Warnings describe situations the user should be aware of, as Lighthouse was unable to complete all the work required on this audit. For example, The 'Unable to decode image (biglogo.jpg)' warning may show up below an image encoding audit."},
+"stack-packs/packs/wordpress.js | efficient_animated_content":{
+"message":"Consider uploading your GIF to a service which will make it available to embed as an HTML5 video.",
+"description":"Additional description of a Lighthouse audit that tells the user how they can improve performance by encoding animated images as video, in the context of the Wordpress CMS platform. This is displayed after a user expands the section to see more. No character length limits. Links in (parenthesis) become link texts to additional documentation."},
+"stack-packs/packs/wordpress.js | offscreen_images":{
+"message":"Install a [lazy-load WordPress plugin](https://wordpress.org/plugins/search/lazy+load/) that provides the ability to defer any offscreen images, or switch to a theme that provides that functionality. Also consider using [the AMP plugin](https://wordpress.org/plugins/amp/).",
+"description":"Additional description of a Lighthouse audit that tells the user how they can improve performance by lazy loading images that are initially offscreen in the context of the Wordpress CMS platform. This is displayed after a user expands the section to see more. No character length limits. Links in (parenthesis) become link texts to additional documentation."},
-},{}],63:[function(require,module,exports){
+"stack-packs/packs/wordpress.js | render_blocking_resources":{
+"message":"There are a number of WordPress plugins that can help you [inline critical assets](https://wordpress.org/plugins/search/critical+css/) or [defer less important resources](https://wordpress.org/plugins/search/defer+css+javascript/). Beware that optimizations provided by these plugins may break features of your theme or plugins, so you will likely need to make code changes.",
+"description":"Additional description of a Lighthouse audit that tells the user how they can improve performance by reducing the amount of render blocking resources present on their page, in the context of the Wordpress CMS platform. This is displayed after a user expands the section to see more. No character length limits. Links in (parenthesis) become link texts to additional documentation."},
+
+"stack-packs/packs/wordpress.js | time_to_first_byte":{
+"message":"Themes, plugins, and server specifications all contribute to server response time. Consider finding a more optimized theme, carefully selecting an optimization plugin, and/or upgrading your server.",
+"description":"Additional description of a Lighthouse audit that tells the user how they can improve the time to first byte speed metric, in the context of the Wordpress CMS platform. This is displayed after a user expands the section to see more. No character length limits. Links in (parenthesis) become link texts to additional documentation."},
+
+"stack-packs/packs/wordpress.js | total_byte_weight":{
+"message":"Consider showing excerpts in your post lists (e.g. via the more tag), reducing the number of posts shown on a given page, breaking your long posts into multiple pages, or using a plugin to lazy-load comments.",
+"description":"Additional description of a Lighthouse audit that tells the user how they can improve site loading performance by reducing the total bytes delivered by their page in the context of the Wordpress CMS platform. This is displayed after a user expands the section to see more. No character length limits. Links in (parenthesis) become link texts to additional documentation."},
+
+"stack-packs/packs/wordpress.js | unminified_css":{
+"message":"A number of [WordPress plugins](https://wordpress.org/plugins/search/minify+css/) can speed up your site by concatenating, minifying, and compressing your styles. You may also want to use a build process to do this minification up-front if possible.",
+"description":"Additional description of a Lighthouse audit that tells the user how they can improve performance by minifying their CSS files in the context of the Wordpress CMS platform. This is displayed after a user expands the section to see more. No character length limits. Links in (parenthesis) become link texts to additional documentation."},
+
+"stack-packs/packs/wordpress.js | unminified_javascript":{
+"message":"A number of [WordPress plugins](https://wordpress.org/plugins/search/minify+javascript/) can speed up your site by concatenating, minifying, and compressing your scripts. You may also want to use a build process to do this minification up front if possible.",
+"description":"Additional description of a Lighthouse audit that tells the user how they can improve performance by minifying their Javascript files in the context of the Wordpress CMS platform. This is displayed after a user expands the section to see more. No character length limits. Links in (parenthesis) become link texts to additional documentation."},
+
+"stack-packs/packs/wordpress.js | unused_css_rules":{
+"message":"Consider reducing, or switching, the number of [WordPress plugins](https://wordpress.org/plugins/) loading unused CSS in your page. To identify plugins that are adding extraneous CSS, try running [code coverage](https://developers.google.com/web/updates/2017/04/devtools-release-notes#coverage) in Chrome DevTools. You can identify the theme/plugin responsible from the URL of the stylesheet. Look out for plugins that have many stylesheets in the list which have a lot of red in code coverage. A plugin should only enqueue a stylesheet if it is actually used on the page.",
+"description":"Additional description of a Lighthouse audit that tells the user how they can improve performance by removing unused CSS, in the context of the Wordpress CMS platform. This is displayed after a user expands the section to see more. No character length limits. Links in (parenthesis) become link texts to additional documentation."},
+
+"stack-packs/packs/wordpress.js | unused_javascript":{
+"message":"Consider reducing, or switching, the number of [WordPress plugins](https://wordpress.org/plugins/) loading unused JavaScript in your page. To identify plugins that are adding extraneous JS, try running [code coverage](https://developers.google.com/web/updates/2017/04/devtools-release-notes#coverage) in Chrome DevTools. You can identify the theme/plugin responsible from the URL of the script. Look out for plugins that have many scripts in the list which have a lot of red in code coverage. A plugin should only enqueue a script if it is actually used on the page.",
+"description":"Additional description of a Lighthouse audit that tells the user how they can improve performance by removing unused Javascript files in the context of the Wordpress CMS platform. This is displayed after a user expands the section to see more. No character length limits. Links in (parenthesis) become link texts to additional documentation."},
+
+"stack-packs/packs/wordpress.js | uses_long_cache_ttl":{
+"message":"Read about [Browser Caching in WordPress](https://codex.wordpress.org/WordPress_Optimization#Browser_Caching).",
+"description":"Additional description of a Lighthouse audit that tells the user how they can improve their site by enabling long caching in the context of the Wordpress CMS platform. This is displayed after a user expands the section to see more. No character length limits. Links in (parenthesis) become link texts to additional documentation."},
+
+"stack-packs/packs/wordpress.js | uses_optimized_images":{
+"message":"Consider using an [image optimization WordPress plugin](https://wordpress.org/plugins/search/optimize+images/) that compresses your images while retaining quality.",
+"description":"Additional description of a Lighthouse audit that tells the user how they can improve site performance by optimizing images, in the context of the Wordpress CMS platform. This is displayed after a user expands the section to see more. No character length limits. Links in (parenthesis) become link texts to additional documentation."},
+
+"stack-packs/packs/wordpress.js | uses_responsive_images":{
+"message":"Upload images directly through the [media library](https://codex.wordpress.org/Media_Library_Screen) to ensure that the required image sizes are available, and then insert them from the media library or use the image widget to ensure the optimal image sizes are used (including those for the responsive breakpoints). Avoid using `Full Size` images unless the dimensions are adequate for their usage. [Learn More](https://codex.wordpress.org/Inserting_Images_into_Posts_and_Pages#Image_Size).",
+"description":"Additional description of a Lighthouse audit that tells the user how they can improve performance by using responsive images in the context of the Wordpress CMS platform. This is displayed after a user expands the section to see more. No character length limits. Links in (parenthesis) become link texts to additional documentation."},
+
+"stack-packs/packs/wordpress.js | uses_text_compression":{
+"message":"You can enable text compression in your web server configuration.",
+"description":"Additional description of a Lighthouse audit that tells the user how they can improve performance via enabling text compression in the context of the Wordpress CMS platform. This is displayed after a user expands the section to see more. No character length limits. Links in (parenthesis) become link texts to additional documentation."},
+
+"stack-packs/packs/wordpress.js | uses_webp_images":{
+"message":"Consider using a [plugin](https://wordpress.org/plugins/search/convert+webp/) or service that will automatically convert your uploaded images to the optimal formats.",
+"description":"Additional description of a Lighthouse audit that tells the user how they can improve image loading by using webp in the context of the Wordpress CMS platform. This is displayed after a user expands the section to see more. No character length limits. Links in (parenthesis) become link texts to additional documentation."}};
+
+
+
+},{}],66:[function(require,module,exports){
(function(__filename,__dirname){
@@ -26888,15 +27973,33 @@ displayValueMsSavings:'Potential savings of {wastedMs, number, milliseconds}\xa0
columnURL:'URL',
-columnSize:'Size (KB)',
+columnSize:'Size',
columnCacheTTL:'Cache TTL',
-columnWastedBytes:'Potential Savings (KB)',
+columnWastedBytes:'Potential Savings',
+
+columnWastedMs:'Potential Savings',
+
+columnTimeSpent:'Time Spent',
+
+totalResourceType:'Total',
+
+documentResourceType:'Document',
+
+scriptResourceType:'Script',
+
+stylesheetResourceType:'Stylesheet',
+
+imageResourceType:'Image',
-columnWastedMs:'Potential Savings (ms)',
+mediaResourceType:'Media',
-columnTimeSpent:'Time Spent'};
+fontResourceType:'Font',
+
+otherResourceType:'Other',
+
+thirdPartyResourceType:'Third-party'};
const formats={
@@ -27177,7 +28280,7 @@ isIcuMessage};
}).call(this,"/lighthouse-core/lib/i18n/i18n.js","/lighthouse-core/lib/i18n");
-},{"./locales.js":64,"intl":93,"intl-messageformat":109,"intl-messageformat-parser":107,"lighthouse-logger":120,"lodash.isequal":121,"lookup-closest-locale":122,"path":135}],64:[function(require,module,exports){
+},{"./locales.js":67,"intl":98,"intl-messageformat":114,"intl-messageformat-parser":112,"lighthouse-logger":125,"lodash.isequal":126,"lookup-closest-locale":127,"path":140}],67:[function(require,module,exports){
@@ -27265,7 +28368,7 @@ const locales={
module.exports=locales;
-},{"./en-US.json":62,"./locales/ar-XB.json":93,"./locales/ar.json":93,"./locales/bg.json":93,"./locales/ca.json":93,"./locales/cs.json":93,"./locales/da.json":93,"./locales/de.json":93,"./locales/el.json":93,"./locales/en-GB.json":93,"./locales/en-XA.json":93,"./locales/es.json":93,"./locales/fi.json":93,"./locales/fil.json":93,"./locales/fr.json":93,"./locales/he.json":93,"./locales/hi.json":93,"./locales/hr.json":93,"./locales/hu.json":93,"./locales/id.json":93,"./locales/it.json":93,"./locales/ja.json":93,"./locales/ko.json":93,"./locales/lt.json":93,"./locales/lv.json":93,"./locales/nl.json":93,"./locales/no.json":93,"./locales/pl.json":93,"./locales/pt-PT.json":93,"./locales/pt.json":93,"./locales/ro.json":93,"./locales/ru.json":93,"./locales/sk.json":93,"./locales/sl.json":93,"./locales/sr-Latn.json":93,"./locales/sr.json":93,"./locales/sv.json":93,"./locales/ta.json":93,"./locales/te.json":93,"./locales/th.json":93,"./locales/tr.json":93,"./locales/uk.json":93,"./locales/vi.json":93,"./locales/zh-HK.json":93,"./locales/zh-TW.json":93,"./locales/zh.json":93}],65:[function(require,module,exports){
+},{"./en-US.json":65,"./locales/ar-XB.json":98,"./locales/ar.json":98,"./locales/bg.json":98,"./locales/ca.json":98,"./locales/cs.json":98,"./locales/da.json":98,"./locales/de.json":98,"./locales/el.json":98,"./locales/en-GB.json":98,"./locales/en-XA.json":98,"./locales/es.json":98,"./locales/fi.json":98,"./locales/fil.json":98,"./locales/fr.json":98,"./locales/he.json":98,"./locales/hi.json":98,"./locales/hr.json":98,"./locales/hu.json":98,"./locales/id.json":98,"./locales/it.json":98,"./locales/ja.json":98,"./locales/ko.json":98,"./locales/lt.json":98,"./locales/lv.json":98,"./locales/nl.json":98,"./locales/no.json":98,"./locales/pl.json":98,"./locales/pt-PT.json":98,"./locales/pt.json":98,"./locales/ro.json":98,"./locales/ru.json":98,"./locales/sk.json":98,"./locales/sl.json":98,"./locales/sr-Latn.json":98,"./locales/sr.json":98,"./locales/sv.json":98,"./locales/ta.json":98,"./locales/te.json":98,"./locales/th.json":98,"./locales/tr.json":98,"./locales/uk.json":98,"./locales/vi.json":98,"./locales/zh-HK.json":98,"./locales/zh-TW.json":98,"./locales/zh.json":98}],68:[function(require,module,exports){
@@ -27339,7 +28442,7 @@ doExist,
pngSizedAtLeast};
-},{"./url-shim.js":"url"}],66:[function(require,module,exports){
+},{"./url-shim.js":"url"}],69:[function(require,module,exports){
@@ -27547,7 +28650,7 @@ simulationNamesToIgnore:[
convertNodeTimingsToTrace};
-},{}],67:[function(require,module,exports){
+},{}],70:[function(require,module,exports){
(function(__filename){
@@ -27573,7 +28676,7 @@ pageLoadFailedWithStatusCode:'Lighthouse was unable to reliably load the page yo
pageLoadFailedWithDetails:'Lighthouse was unable to reliably load the page you requested. Make sure you are testing the correct URL and that the server is properly responding to all requests. (Details: {errorDetails})',
-pageLoadFailedInsecure:'The URL you have provided does not have valid security credentials. {securityMessages}',
+pageLoadFailedInsecure:'The URL you have provided does not have a valid security certificate. {securityMessages}',
internalChromeError:'An internal Chrome error occurred. Please restart Chrome and try re-running Lighthouse.',
@@ -27585,7 +28688,9 @@ protocolTimeout:'Waiting for DevTools protocol response has exceeded the allotte
dnsFailure:'DNS servers could not resolve the provided domain.',
-pageLoadFailedHung:'Lighthouse was unable to reliably load the URL you requested because the page stopped responding.'};
+pageLoadFailedHung:'Lighthouse was unable to reliably load the URL you requested because the page stopped responding.',
+
+criTimeout:'Timeout waiting for initial Debugger Protocol connection.'};
const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
@@ -27775,6 +28880,13 @@ lhrRuntimeError:true},
DNS_FAILURE:{
code:'DNS_FAILURE',
message:UIStrings.dnsFailure,
+lhrRuntimeError:true},
+
+
+
+CRI_TIMEOUT:{
+code:'CRI_TIMEOUT',
+message:UIStrings.criTimeout,
lhrRuntimeError:true}};
@@ -27789,7 +28901,7 @@ module.exports=LighthouseError;
module.exports.UIStrings=UIStrings;
}).call(this,"/lighthouse-core/lib/lh-error.js");
-},{"./i18n/i18n.js":63}],68:[function(require,module,exports){
+},{"./i18n/i18n.js":66}],71:[function(require,module,exports){
@@ -27797,7 +28909,7 @@ module.exports.UIStrings=UIStrings;
'use strict';
-const URL=require('./url-shim');
+const URL=require('./url-shim.js');
const cssParsers=require('cssstyle/lib/parsers');
const ALLOWED_DISPLAY_VALUES=[
@@ -28261,7 +29373,7 @@ warning:undefined};
module.exports=parse;
-},{"./url-shim":"url","cssstyle/lib/parsers":97}],69:[function(require,module,exports){
+},{"./url-shim.js":"url","cssstyle/lib/parsers":102}],72:[function(require,module,exports){
@@ -28432,7 +29544,7 @@ return computeTokenLength(content,{singlelineComments:false,regex:false});
module.exports={computeJSTokenLength,computeCSSTokenLength};
-},{}],70:[function(require,module,exports){
+},{}],73:[function(require,module,exports){
@@ -28440,7 +29552,7 @@ module.exports={computeJSTokenLength,computeCSSTokenLength};
'use strict';
-const NetworkRequest=require('./network-request');
+const NetworkRequest=require('./network-request.js');
const EventEmitter=require('events').EventEmitter;
const log=require('lighthouse-logger');
@@ -28824,7 +29936,7 @@ return records;
module.exports=NetworkRecorder;
-},{"./network-request":71,"events":100,"lighthouse-logger":120}],71:[function(require,module,exports){
+},{"./network-request.js":74,"events":105,"lighthouse-logger":125}],74:[function(require,module,exports){
(function(global){
@@ -28839,7 +29951,7 @@ module.exports=NetworkRecorder;
-const URL=require('./url-shim');
+const URL=require('./url-shim.js');
const SECURE_SCHEMES=['data','https','wss','blob','chrome','chrome-extension','about'];
@@ -29306,7 +30418,7 @@ NetworkRequest.HEADER_FETCHED_SIZE=HEADER_FETCHED_SIZE;
module.exports=NetworkRequest;
}).call(this,typeof global!=="undefined"?global:typeof self!=="undefined"?self:typeof window!=="undefined"?window:{});
-},{"./url-shim":"url"}],72:[function(require,module,exports){
+},{"./url-shim.js":"url"}],75:[function(require,module,exports){
@@ -29477,8 +30589,7 @@ let prevNode;
while(prevNode=node.previousSibling){
node=prevNode;
-if(node.nodeType===Node.TEXT_NODE&&node.textContent&&
-node.textContent.trim().length===0)continue;
+if(node.nodeType===Node.TEXT_NODE&&node.nodeValue.trim().length===0)continue;
index++;
}
return index;
@@ -29527,6 +30638,47 @@ break;
return parts.join(' > ');
}
+
+
+
+
+
+
+
+
+function getNodeLabel(node){
+
+
+
+
+
+
+
+function truncate(str,maxLength){
+if(str.length<=maxLength){
+return str;
+}
+return str.slice(0,maxLength-1)+'…';
+}
+
+const tagName=node.tagName.toLowerCase();
+
+if(tagName!=='html'&&tagName!=='body'){
+const nodeLabel=node.innerText||node.getAttribute('alt')||node.getAttribute('aria-label');
+if(nodeLabel){
+return truncate(nodeLabel,80);
+}else{
+
+
+const nodeToUseForLabel=node.querySelector('[alt], [aria-label]');
+if(nodeToUseForLabel){
+return getNodeLabel(nodeToUseForLabel);
+}
+}
+}
+return tagName;
+}
+
module.exports={
wrapRuntimeEvalErrorInBrowserString:wrapRuntimeEvalErrorInBrowser.toString(),
registerPerformanceObserverInPageString:registerPerformanceObserverInPage.toString(),
@@ -29538,10 +30690,12 @@ ultradumbBenchmark:ultradumbBenchmark,
ultradumbBenchmarkString:ultradumbBenchmark.toString(),
getNodePathString:getNodePath.toString(),
getNodeSelectorString:getNodeSelector.toString(),
-getNodeSelector:getNodeSelector};
+getNodeSelector:getNodeSelector,
+getNodeLabel:getNodeLabel,
+getNodeLabelString:getNodeLabel.toString()};
-},{}],73:[function(require,module,exports){
+},{}],76:[function(require,module,exports){
@@ -29574,11 +30728,6 @@ rect2.left>=rect1.left;
}
-const rectContainsString=`
- ${rectContains.toString()};
-`;
-
-
@@ -29612,6 +30761,7 @@ return Array.from(rectsToKeep);
+
function getRectCenterPoint(rect){
return{
x:rect.left+rect.width/2,
@@ -29641,7 +30791,7 @@ rectB.top<=rectA.bottom);
-function getBoundingRectWithPadding(rects,minimumSize){
+function getBoundingRectWithPadding(rects,padding){
if(rects.length===0){
throw new Error('No rects to take bounds of');
}
@@ -29658,7 +30808,7 @@ bottom=Math.max(bottom,rect.bottom);
}
-const halfMinSize=minimumSize/2;
+const halfMinSize=padding/2;
left-=halfMinSize;
right+=halfMinSize;
top-=halfMinSize;
@@ -29677,18 +30827,8 @@ height:bottom-top};
-
-function getBoundingRect(rectA,rectB){
-const left=Math.min(rectA.left,rectB.left);
-const right=Math.max(rectA.right,rectB.right);
-const top=Math.min(rectA.top,rectB.top);
-const bottom=Math.max(rectA.bottom,rectB.bottom);
-return addRectWidthAndHeight({
-left,
-right,
-top,
-bottom});
-
+function getBoundingRect(rects){
+return getBoundingRectWithPadding(rects,0);
}
@@ -29752,6 +30892,7 @@ bottom:rect.bottom-rect.height/2+centerRectSize/2});
+
function getRectArea(rect){
return rect.width*rect.height;
}
@@ -29759,6 +30900,7 @@ return rect.width*rect.height;
+
function getLargestRect(rects){
let largestRect=rects[0];
for(const rect of rects){
@@ -29788,12 +30930,12 @@ return true;
module.exports={
rectContainsPoint,
rectContains,
-rectContainsString,
addRectWidthAndHeight,
addRectTopAndBottom,
getRectOverlapArea,
getRectAtCenter,
getLargestRect,
+getRectArea,
getRectCenterPoint,
getBoundingRect,
getBoundingRectWithPadding,
@@ -29803,7 +30945,7 @@ filterOutRectsContainedByOthers,
filterOutTinyRects};
-},{}],74:[function(require,module,exports){
+},{}],77:[function(require,module,exports){
@@ -29916,7 +31058,6 @@ Sentry.captureException(err,opts,()=>resolve());
const context=Object.assign({
url:opts.url,
-deviceEmulation:!opts.flags.disableDeviceEmulation,
emulatedFormFactor:opts.flags.emulatedFormFactor,
throttlingMethod:opts.flags.throttlingMethod},
opts.flags.throttling);
@@ -29931,7 +31072,158 @@ log.warn(
module.exports=sentryDelegate;
-},{"lighthouse-logger":120,"raven":93}],75:[function(require,module,exports){
+},{"lighthouse-logger":125,"raven":98}],78:[function(require,module,exports){
+
+
+
+
+
+
+
+
+
+
+
+
+
+'use strict';
+
+
+const libDetectorSource="var UNKNOWN_VERSION = null;\nvar d41d8cd98f00b204e9800998ecf8427e_LibraryDetectorTests = {\n\n 'GWT': {\n icon: 'gwt',\n url: 'http://www.gwtproject.org/',\n test: function(win) {\n // pretty complicated, many possible tell tales\n var doc = win.document,\n hasHistFrame = doc.getElementById('__gwt_historyFrame'),\n hasGwtUid = doc.gwt_uid,\n hasBodyListener = doc.body.__listener,\n hasBodyEventBits = doc.body.__eventBits,\n hasModules = win.__gwt_activeModules,\n hasJsonP = win.__gwt_jsonp__,\n hasRootWinApp = win.__gwt_scriptsLoaded || win.__gwt_stylesLoaded || win.__gwt_activeModules;\n\n // use the many possible indicators\n if(hasHistFrame || hasGwtUid || hasBodyListener || hasBodyEventBits || hasModules || hasJsonP || hasRootWinApp) {\n\n // carefully look at frames, but only if certain is GWT frame\n var frames = doc.getElementsByTagName('iframe'),\n gwtVersion = UNKNOWN_VERSION;\n for(var n=0; n<frames.length; n++) {\n // catch security access errors\n try {\n var hasNegativeTabIndex = frames[n].tabIndex < 0; // on for GWT\n if(hasNegativeTabIndex && frames[n].contentWindow && frames[n].contentWindow.$gwt_version) {\n gwtVersion = frames[n].contentWindow.$gwt_version;\n break;\n }\n }\n catch(e) {}\n }\n\n if(gwtVersion=='0.0.999') {\n gwtVersion = 'Google Internal';\n }\n\n return { version: gwtVersion };\n }\n return false;\n }\n },\n\n 'Ink': {\n icon: 'ink',\n url: 'http://ink.sapo.pt/',\n test: function(win) {\n if (win.Ink && win.Ink.createModule) {\n return { version: UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'Vaadin': {\n icon: 'vaadin',\n url: 'https://vaadin.com/',\n test: function(win) {\n if (win.vaadin && win.vaadin.registerWidgetset) {\n return { version: UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'Bootstrap': {\n icon: 'bootstrap',\n url: 'http://getbootstrap.com/',\n npm: 'bootstrap',\n // look for a function Boostrap has added to jQuery - regex for BS 2 & 3\n test: function(win) {\n var jQueryAvailable = win.$ && win.$.fn,\n RE_PREFIX_V2 = '\\\\$this\\\\.data\\\\((?:\\'|\")',\n RE_PREFIX_V3 = '\\\\$this\\\\.data\\\\((?:\\'|\")(?:bs\\\\.){1}',\n bootstrapComponents = [\n 'affix', 'alert', 'button', 'carousel', 'collapse', 'dropdown',\n 'modal', 'popover', 'scrollspy', 'tab', 'tooltip'\n ];\n\n if(jQueryAvailable) {\n var bootstrapVersion;\n\n bootstrapComponents.some(function(component) {\n if(win.$.fn[component]) {\n // Bootstrap >= 3.2.0 detection\n if(win.$.fn[component].Constructor && win.$.fn[component].Constructor.VERSION) {\n bootstrapVersion = win.$.fn[component].Constructor.VERSION;\n return true;\n // Bootstrap >= 2.0.0 and <= 3.1.0 detection\n } else if(new RegExp(RE_PREFIX_V3 + component).test(win.$.fn[component].toString())) {\n bootstrapVersion = '>= 3.0.0 & <= 3.1.1';\n return true;\n // Bootstrap < 3.1.0 detection\n } else if(new RegExp(RE_PREFIX_V2 + component).test(win.$.fn[component].toString())) {\n bootstrapVersion = '>= 2.0.0 & <= 2.3.2';\n return true;\n }\n }\n\n return false;\n });\n\n if (bootstrapVersion) {\n return { version: bootstrapVersion };\n }\n }\n\n return false;\n }\n },\n\n 'Zurb': {\n icon: 'zurb',\n url: 'https://foundation.zurb.com/',\n npm: 'foundation-sites',\n test: function(win) {\n if(win.Foundation && win.Foundation.Toggler) {\n return { version: win.Foundation.version || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'Polymer': {\n icon: 'polymer',\n url: 'https://www.polymer-project.org/',\n npm: '@polymer/polymer',\n test: function(win) {\n if(win.Polymer && win.Polymer.dom) {\n return { version: win.Polymer.version || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'Highcharts': {\n icon: 'highcharts',\n url: 'http://www.highcharts.com',\n npm: 'highcharts',\n test: function(win) {\n if(win.Highcharts && win.Highcharts.Point) {\n return { version: win.Highcharts.version || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'InfoVis': {\n icon: 'jit',\n url: 'http://philogb.github.com/jit/',\n test: function test(win) {\n if(win.$jit && win.$jit.PieChart) {\n return { version: win.$jit.version || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'FlotCharts': {\n icon: 'flotcharts',\n url: 'http://www.flotcharts.org/',\n npm: 'flot',\n test: function(win) {\n if(win.$ && win.$.plot) {\n return { version: win.$.plot.version || UNKNOWN_VERSION};\n }\n return false;\n }\n },\n\n 'CreateJS': {\n icon: 'createjs',\n url: 'https://createjs.com/',\n npm: 'createjs',\n test: function(win) {\n if(win.createjs && win.createjs.promote) {\n return { version: UNKNOWN_VERSION}; // no version info available\n }\n return false;\n }\n },\n\n 'Google Maps': {\n icon: 'gmaps',\n url: 'https://developers.google.com/maps/',\n test: function(win) {\n if (win.google && win.google.maps) {\n return { version: win.google.maps.version || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'jQuery': {\n icon: 'jquery',\n url: 'http://jquery.com',\n npm: 'jquery',\n test: function(win) {\n var jq = win.jQuery || win.$;\n if (jq && jq.fn) {\n return { version: jq.fn.jquery.replace(/[^\\d+\\.+]/g, '') || UNKNOWN_VERSION};\n }\n return false;\n }\n },\n\n 'jQuery UI': {\n icon: 'jquery_ui',\n url: 'http://jqueryui.com',\n npm: 'jquery-ui',\n test: function(win) {\n var jq = win.jQuery || win.$ || win.$jq || win.$j;\n if(jq && jq.fn && jq.fn.jquery && jq.ui) {\n var plugins = 'accordion,datepicker,dialog,draggable,droppable,progressbar,resizable,selectable,slider,menu,grid,tabs'.split(','), concat = [];\n for (var i=0; i < plugins.length; i++) { if(jq.ui[plugins[i]]) concat.push(plugins[i].substr(0,1).toUpperCase() + plugins[i].substr(1)); }\n return { version: jq.ui.version || UNKNOWN_VERSION, details: concat.length ? 'Plugins used: '+concat.join(',') : '' };\n }\n return false;\n }\n },\n\n 'Dojo': {\n icon: 'dojo',\n url: 'http://dojotoolkit.org',\n npm: 'dojo',\n test: function(win) {\n if(win.dojo && win.dojo.delegate) {\n var version = win.dojo.version ? win.dojo.version.toString() : UNKNOWN_VERSION;\n return { version: version, details: 'Details: '+(win.dijit ? 'Uses Dijit' : 'none') };\n }\n return false;\n }\n },\n\n 'Prototype': {\n icon: 'prototype',\n url: 'http://prototypejs.org',\n test: function(win) {\n if(win.Prototype && win.Prototype.BrowserFeatures) {\n return { version: win.Prototype.Version || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'Scriptaculous': {\n icon: 'scriptaculous',\n url: 'http://script.aculo.us',\n test: function(win) {\n if(win.Scriptaculous && win.Scriptaculous.load) {\n return { version: win.Scriptaculous.Version || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'MooTools': {\n icon: 'mootools',\n url: 'https://mootools.net/',\n test: function(win) {\n if(win.MooTools && win.MooTools.build) {\n return { version: win.MooTools.version || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'Spry': {\n icon: 'spry',\n url: 'http://labs.adobe.com/technologies/spry',\n test: function(win) {\n if (win.Spry && win.Spry.Data) {\n return { version: UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'YUI 2': {\n icon: 'yui',\n url: 'http://developer.yahoo.com/yui/2/',\n test: function(win) {\n if (win.YAHOO && win.YAHOO.util) {\n return { version: win.YAHOO.VERSION || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'YUI 3': {\n icon: 'yui3',\n url: 'https://yuilibrary.com/',\n npm: 'yui',\n test: function(win) {\n if (win.YUI && win.YUI.Env) {\n return { version: win.YUI.version || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'Qooxdoo': {\n icon: 'qooxdoo',\n url: 'http://www.qooxdoo.org/',\n npm: 'qooxdoo',\n test: function(win) {\n if(win.qx && win.qx.Bootstrap) {\n return { version: UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'Ext JS': {\n icon: 'extjs',\n url: 'https://www.sencha.com/products/extjs/',\n test: function(win) {\n if (win.Ext && win.Ext.versions) {\n return { version: win.Ext.versions.core.version };\n }\n else if(win.Ext) {\n return { version: win.Ext.version || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'base2': {\n icon: 'base2',\n url: 'http://code.google.com/p/base2',\n test: function(win) {\n if(win.base2 && win.base2.dom) {\n return { version: win.base2.version || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'Closure Library': {\n icon: 'closure',\n url: 'https://developers.google.com/closure/library/',\n npm: 'google-closure-library',\n test: function(win) {\n if(win.goog && win.goog.provide) {\n return { version: UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'Rapha&euml;l': {\n icon: 'raphael',\n url: 'http://dmitrybaranovskiy.github.io/raphael/',\n test: function(win) {\n if (win.Raphael && win.Raphael.circle) {\n return { version: win.Raphael.version || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'React': {\n icon: 'react',\n url: 'https://reactjs.org/',\n npm: 'react',\n test: function(win) {\n function isMatch(node) {\n return node!=null && node._reactRootContainer!=null;\n }\n function nodeFilter(node) {\n return isMatch(node) ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP;\n }\n var reactRoot = document.getElementById('react-root');\n var altHasReact = document.querySelector('*[data-reactroot]');\n var bodyReactRoot = isMatch(document.body) || isMatch(document.body.firstElementChild);\n var hasReactRoot = bodyReactRoot|| document.createTreeWalker(document.body, NodeFilter.SHOW_ELEMENT, nodeFilter).nextNode() != null;\n if (hasReactRoot || reactRoot && reactRoot.innerText.length > 0 || altHasReact || win.React && win.React.Component) {\n return { version: win.React && win.React.version || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'Next.js': {\n icon: 'next',\n url: 'https://nextjs.org/',\n npm: 'next',\n test: function(win) {\n if (win.__NEXT_DATA__ && win.__NEXT_DATA__.buildId) {\n return { version: UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'Preact': {\n icon: 'preact',\n url: 'https://preactjs.com/',\n npm: 'preact',\n test: function(win) {\n var expando = typeof Symbol!='undefined' && Symbol.for && Symbol.for('preactattr');\n function isMatch(node) {\n return node._component!=null || node.__preactattr_!=null || expando && node[expando]!=null;\n }\n function getMatch(node) {\n return node!=null && isMatch(node) && node;\n }\n function nodeFilter(node) {\n return isMatch(node) ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP;\n }\n var preactRoot = getMatch(document.body) || getMatch(document.body.firstElementChild);\n if (!preactRoot) {\n preactRoot = document.createTreeWalker(document.body, NodeFilter.SHOW_ELEMENT, nodeFilter).nextNode();\n }\n if (preactRoot || win.preact) {\n var version = UNKNOWN_VERSION;\n if (expando && preactRoot && preactRoot[expando]!=null) {\n version = '7';\n }\n return { version: version };\n }\n return false;\n }\n },\n\n 'Modernizr': {\n icon: 'modernizr',\n url: 'https://modernizr.com/',\n npm: 'modernizr',\n test: function(win) {\n if (win.Modernizr && win.Modernizr.addTest) {\n return { version: win.Modernizr._version || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'Processing.js': {\n icon: 'processingjs',\n url: 'http://processingjs.org',\n npm: 'processing-js',\n test: function(win) {\n if(win.Processing && win.Processing.box) {\n return { version: Processing.version || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'Backbone': {\n icon: 'backbone',\n url: 'http://backbonejs.org/',\n npm: 'backbone',\n test: function(win) {\n if (win.Backbone && win.Backbone.Model.extend) {\n return {version: win.Backbone.VERSION || UNKNOWN_VERSION};\n }\n return false;\n }\n },\n\n 'Leaflet': {\n icon: 'leaflet',\n url: 'http://leafletjs.com',\n npm: 'leaflet',\n test: function(win) {\n // Leaflet 3.1 uses L.Marker and L.VERSION; later versions use L.marker and L.version\n if (win.L && win.L.GeoJSON && (win.L.marker || win.L.Marker)) {\n return { version: win.L.version || win.L.VERSION || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'Mapbox': {\n icon: 'mapbox',\n url: 'https://www.mapbox.com/',\n npm: 'mapbox-gl',\n test: function(win) {\n if (win.L && win.L.mapbox && win.L.mapbox.geocoder) {\n return { version: win.L.mapbox.VERSION || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'Lo-Dash': {\n icon: 'lodash',\n url: 'https://lodash.com/',\n npm: 'lodash',\n test: function(win) {\n var _ = typeof (_ = win._) == 'function' && _,\n chain = typeof (chain = _ && _.chain) == 'function' && chain,\n wrapper = (chain || _ || function() { return {}; })(1);\n\n if (_ && wrapper.__wrapped__) {\n return { version: _.VERSION || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'Underscore': {\n icon: 'underscore',\n url: 'http://underscorejs.org/',\n npm: 'underscore',\n test: function(win) {\n if (win._ && typeof win._.tap === 'function' &&\n !d41d8cd98f00b204e9800998ecf8427e_LibraryDetectorTests['Lo-Dash'].test(win)) {\n return {version: win._.VERSION || UNKNOWN_VERSION};\n }\n return false;\n }\n },\n\n 'Sammy': {\n icon: 'sammy',\n url: 'http://sammyjs.org',\n test: function(win) {\n if (win.Sammy && win.Sammy.Application.curry) {\n return {version: win.Sammy.VERSION || UNKNOWN_VERSION};\n }\n return false;\n }\n },\n\n 'Rico': {\n icon: 'rico',\n url: 'http://openrico.sourceforge.net/examples/index.html',\n test: function(win) {\n if (win.Rico && window.Rico.checkIfComplete) {\n return {version: win.Rico.Version || UNKNOWN_VERSION};\n }\n return false;\n }\n },\n\n 'MochiKit': {\n icon: 'mochikit',\n url: 'https://mochi.github.io/mochikit/',\n test: function(win) {\n if (win.MochiKit && win.MochiKit.Base.module) {\n return {version: MochiKit.VERSION || UNKNOWN_VERSION};\n }\n return false;\n }\n },\n\n 'gRapha&euml;l': {\n icon: 'graphael',\n url: 'https://github.com/DmitryBaranovskiy/g.raphael',\n test: function(win) {\n if (win.Raphael && win.Raphael.fn.g) {\n return {version: UNKNOWN_VERSION};\n }\n return false;\n }\n },\n\n 'Glow': {\n icon: 'glow',\n url: 'http://www.bbc.co.uk/glow/',\n test: function(win) {\n if (win.gloader && win.gloader.getRequests) {\n return {version: UNKNOWN_VERSION};\n }\n else if (win.glow && win.glow.dom) {\n return {version: win.glow.VERSION || UNKNOWN_VERSION};\n }\n else if (win.Glow) {\n return {version: win.Glow.version || UNKNOWN_VERSION};\n }\n return false;\n }\n },\n\n 'Socket.IO': {\n icon: 'socketio', // currently has no icon\n url: 'https://socket.io/',\n npm: 'socket.io',\n test: function(win) {\n // version 0.6.2 uses only io.Socket; more recent versions also have io.sockets\n if (win.io && (win.io.sockets || win.io.Socket)) {\n return {version: win.io.version || UNKNOWN_VERSION};\n }\n return false;\n }\n },\n\n 'Mustache': {\n icon: 'mustache',\n url: 'http://mustache.github.io/',\n npm: 'mustache',\n test: function(win) {\n if (win.Mustache && win.Mustache.to_html) {\n return {version: win.Mustache.version || UNKNOWN_VERSION};\n }\n return false;\n }\n },\n\n 'Fabric.js': {\n icon: 'icon38', // currently has no icon\n url: 'http://fabricjs.com/',\n npm: 'fabric',\n test: function(win) {\n if (win.fabric && win.fabric.util) {\n return {version: win.fabric.version || UNKNOWN_VERSION};\n }\n return false;\n }\n },\n\n 'FuseJS': {\n icon: 'fusejs',\n url: 'http://fusejs.io/',\n npm: 'fuse.js',\n test: function(win) {\n if (win.Fuse) {\n return {version: UNKNOWN_VERSION};\n }\n return false;\n }\n },\n\n 'Tween.js': {\n icon: 'icon38', // currently has no icon\n url: 'https://github.com/tweenjs/tween.js',\n npm: 'tween.js',\n test: function(win) {\n if (win.TWEEN && win.TWEEN.Easing) {\n return {version: UNKNOWN_VERSION};\n }\n return false;\n }\n },\n\n 'SproutCore': {\n icon: 'sproutcore',\n url: 'http://sproutcore.com/',\n test: function(win) {\n if (win.SC && win.SC.Application) {\n return {version: UNKNOWN_VERSION};\n }\n return false;\n }\n },\n\n 'Zepto.js': {\n icon: 'zepto',\n url: 'http://zeptojs.com',\n npm: 'zepto',\n test: function(win) {\n if (win.Zepto && win.Zepto.fn) {\n return {version: UNKNOWN_VERSION};\n }\n return false;\n }\n },\n\n 'three.js': {\n icon: 'icon38', // currently has no icon\n url: 'https://threejs.org/',\n npm: 'three',\n test: function(win) {\n if (win.THREE && win.THREE.REVISION) {\n return {version: 'r' + win.THREE.REVISION};\n }\n else if (win.THREE) {\n return {version: UNKNOWN_VERSION};\n }\n return false;\n }\n },\n\n 'PhiloGL': {\n icon: 'philogl',\n url: 'http://www.senchalabs.org/philogl/',\n npm: 'philogl',\n test: function(win) {\n if (win.PhiloGL && win.PhiloGL.Camera) {\n return {version: win.PhiloGL.version || UNKNOWN_VERSION};\n }\n return false;\n }\n },\n\n 'CamanJS': {\n icon: 'camanjs',\n url: 'http://camanjs.com/',\n npm: 'caman',\n test: function(win) {\n if (win.Caman && win.Caman.version) {\n return {version: win.Caman.version.release};\n }\n else if (win.Caman) {\n return {version: UNKNOWN_VERSION};\n }\n return false;\n }\n },\n\n 'yepnope': {\n icon: 'yepnope',\n url: 'http://yepnopejs.com/',\n test: function(win) {\n if (win.yepnope && win.yepnope.injectJs) {\n return {version: UNKNOWN_VERSION};\n }\n return false;\n }\n },\n\n 'LABjs': {\n icon: 'icon38',\n url: 'https://github.com/getify/LABjs',\n test: function(win) {\n if (win.$LAB && win.$LAB.setOptions) {\n return {version: UNKNOWN_VERSION};\n }\n return false;\n }\n },\n\n 'Head JS': {\n icon: 'headjs',\n url: 'http://headjs.com/',\n npm: 'headjs',\n test: function(win) {\n if (win.head && win.head.js) {\n return {version: UNKNOWN_VERSION};\n }\n return false;\n }\n },\n\n 'ControlJS': {\n icon: 'icon38',\n url: 'http://stevesouders.com/controljs/',\n test: function(win) {\n if (win.CJS && win.CJS.start) {\n return {version: UNKNOWN_VERSION};\n }\n return false;\n }\n },\n\n 'RequireJS': {\n icon: 'requirejs',\n url: 'http://requirejs.org/',\n npm: 'requirejs',\n test: function(win) {\n var req = win.require || win.requirejs;\n if (req && (req.load || (req.s && req.s.contexts && req.s.contexts._ && (req.s.contexts._.loaded || req.s.contexts._.load)))) {\n return { version: req.version || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'RightJS': {\n icon: 'rightjs',\n url: 'http://rightjs.org/',\n test: function(win) {\n if (win.RightJS && win.RightJS.isNode) {\n return { version: win.RightJS.version || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'jQuery Tools': {\n icon: 'jquerytools',\n url: 'http://jquerytools.github.io/',\n test: function(win) {\n var jq = win.jQuery || win.$;\n if(jq && jq.tools) {\n return { version: jq.tools.version || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'Pusher': {\n icon: 'pusher',\n url: 'https://pusher.com/docs/',\n npm: 'pusher-js',\n test: function(win) {\n if(win.Pusher && win.Pusher.Channel) {\n return { version: win.Pusher.VERSION || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'Paper.js': {\n icon: 'paperjs',\n url: 'http://paperjs.org/',\n npm: 'paper',\n test: function(win) {\n if(win.paper && win.paper.Point) {\n return { version: win.paper.version || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'Swiffy': {\n icon: 'icon38',\n url: 'https://developers.google.com/swiffy/',\n test: function(win) {\n if(win.swiffy && win.swiffy.Stage) {\n return { version: UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'Move': {\n icon: 'move',\n url: 'https://github.com/rsms/move',\n npm: 'move',\n test: function(win) {\n if(win.move && win.move.compile) {\n return { version: win.move.version() || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'AmplifyJS': {\n icon: 'amplifyjs',\n url: 'http://amplifyjs.com/',\n npm: 'amplifyjs',\n test: function(win) {\n if(win.amplify && win.amplify.publish) {\n return { version: UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'Popcorn.js': {\n icon: 'popcornjs',\n url: 'https://github.com/mozilla/popcorn-js/',\n test: function(win) {\n if (win.Popcorn && win.Popcorn.Events) {\n return { version: win.Popcorn.version || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'D3': {\n icon: 'd3',\n url: 'https://d3js.org/',\n npm: 'd3',\n test: function(win) {\n if (win.d3 && win.d3.select) {\n return { version: win.d3.version || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'Handlebars': {\n icon: 'handlebars',\n url: 'http://handlebarsjs.com/',\n npm: 'handlebars',\n test: function(win) {\n if(win.Handlebars && win.Handlebars.compile) {\n return { version: win.Handlebars.VERSION || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'Knockout': {\n icon: 'knockout',\n url: 'http://knockoutjs.com/',\n npm: 'knockout',\n test: function(win) {\n if (win.ko && win.ko.applyBindings) {\n return { version: win.ko.version || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'Spine': {\n icon: 'icon38',\n url: 'http://spine.github.io/',\n test: function(win) {\n if (win.Spine && win.Spine.Controller) {\n return {version: win.Spine.version || UNKNOWN_VERSION};\n }\n return false;\n }\n },\n\n 'jQuery Mobile': {\n icon: 'jquery_mobile',\n url: 'http://jquerymobile.com/',\n npm: 'jquery-mobile',\n test: function(win) {\n var jq = win.jQuery || win.$ || win.$jq || win.$j;\n if(jq && jq.fn && jq.fn.jquery && jq.mobile) {\n return { version: jq.mobile.version || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'WebFont Loader': {\n icon: 'icon38',\n url: 'https://github.com/typekit/webfontloader',\n npm: 'webfontloader',\n test: function(win) {\n if(win.WebFont && win.WebFont.load) {\n return { version: UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'Angular': {\n icon: 'angular',\n url: 'https://angular.io/',\n npm: '@angular/core',\n test: function(win) {\n var ngVersion = win.document.querySelector('[ng-version]');\n if (ngVersion) {\n return { version: ngVersion.getAttribute('ng-version') || UNKNOWN_VERSION };\n }\n else if (win.ng && win.ng.probe instanceof Function) {\n return { version: UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'AngularJS': {\n icon: 'angularjs',\n url: 'https://angularjs.org/',\n npm: 'angular',\n test: function(win) {\n var ng = win.angular;\n if(ng && ng.version && ng.version.full) {\n return { version: ng.version.full };\n }\n else if (ng) {\n return { version: UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'Ember.js': {\n icon: 'emberjs',\n url: 'https://emberjs.com/',\n npm: 'ember-source',\n test: function(win) {\n var ember = win.Ember || win.Em;\n if (ember && ember.propertyDidChange) {\n return { version: ember.VERSION || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'Hammer.js': {\n icon: 'hammerjs',\n url: 'http://eightmedia.github.io/hammer.js/',\n npm: 'hammerjs',\n test: function(win) {\n if(win.Hammer && win.Hammer.Pinch) {\n // Hammer.VERSION available in 1.0.10+\n return { version: win.Hammer.VERSION || \"&lt; 1.0.10\" };\n }\n return false;\n }\n },\n\n 'Visibility.js': {\n icon: 'icon38',\n url: 'https://github.com/ai/visibilityjs',\n npm: 'visibilityjs',\n test: function(win) {\n if(win.Visibility && win.Visibility.every) {\n return { version: UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'Velocity.js': {\n icon: 'icon38',\n url: 'http://velocityjs.org/',\n npm: 'velocity-animate',\n test: function(win) {\n var jq = win.jQuery || win.$,\n velocity = jq ? jq.Velocity : win.Velocity;\n\n if(velocity && velocity.RegisterEffect && velocity.version) {\n return {\n version:\n velocity.version.major + \".\" +\n velocity.version.minor + \".\" +\n velocity.version.patch\n };\n }\n else if (velocity && velocity.RegisterEffect) {\n return { version: UNKNOWN_VERSION };\n }\n return false;\n }\n },\n\n 'IfVisible.js': {\n icon: 'icon38',\n url: 'http://serkanyersen.github.io/ifvisible.js/',\n npm: 'ifvisible.js',\n test: function(win) {\n var iv = win.ifvisible;\n if(iv && iv.__ceGUID === \"ifvisible.object.event.identifier\") {\n return { version: UNKNOWN_VERSION };\n }\n return false;\n }\n },\n 'Pixi.js': {\n icon: 'pixi',\n url: 'http://www.pixijs.com/',\n npm: 'pixi.js',\n test: function(win) {\n var px = win.PIXI;\n if(px && px.WebGLRenderer && px.VERSION) {\n // version 4.4.3 returns simply \"4.4.3\"; version 1.5.2 returns \"v1.5.2\"\n return { version: px.VERSION.replace('v', '') || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n 'DC.js': {\n icon: 'dcjs',\n url: 'http://dc-js.github.io/dc.js/',\n npm: 'dc',\n test: function(win) {\n var dc = win.dc;\n if(dc && dc.registerChart) {\n return { version: dc.version || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n 'GreenSock JS': {\n icon: 'greensock',\n url: 'https://greensock.com/gsap',\n npm: 'gsap',\n test: function(win) {\n if (win.TweenMax && win.TweenMax.pauseAll) {\n return { version: win.TweenMax.version || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n 'FastClick': {\n icon: 'fastclick',\n url: 'https://github.com/ftlabs/fastclick',\n npm: 'fastclick',\n test: function(win) {\n if(win.FastClick && win.FastClick.notNeeded) {\n return { version: UNKNOWN_VERSION };\n }\n return false;\n }\n },\n 'Isotope': {\n icon: 'isotope',\n url: 'https://isotope.metafizzy.co/',\n npm: 'isotope-layout',\n test: function(win) {\n if(win.Isotope || (win.$ != null && win.$.Isotope)) {\n return { version: UNKNOWN_VERSION };\n }\n return false;\n }\n },\n 'Marionette': {\n icon: 'marionette',\n url: 'https://marionettejs.com/',\n npm: 'backbone.marionette',\n test: function(win) {\n if(win.Marionette && win.Marionette.Application) {\n return { version: win.Marionette.VERSION || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n 'Can': {\n icon: 'canjs',\n url: 'https://canjs.com/',\n npm: 'can',\n test: function (win) {\n if (win.can && win.can.Construct) {\n return { version: win.can.VERSION || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n 'Vue': {\n icon: 'vue',\n url: 'https://vuejs.org/',\n npm: 'vue',\n test: function(win) {\n function isVueNode(node) {\n return node.__vue__ != null ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP;\n }\n var hasVueNode = document.createTreeWalker(document.body, NodeFilter.SHOW_ELEMENT, isVueNode).nextNode() !== null;\n if (hasVueNode) {\n return { version: win.Vue && win.Vue.version || UNKNOWN_VERSION }\n }\n return false;\n }\n },\n 'Nuxt.js': {\n icon: 'nuxt',\n url: 'https://nuxtjs.org/',\n npm: 'nuxt',\n test: function(win) {\n if ((win.__NUXT__ && win.__NUXT__.data != null) || win.$nuxt) {\n return { version: UNKNOWN_VERSION };\n }\n return false;\n }\n },\n 'Two': {\n icon: 'two',\n url: 'https://two.js.org/',\n npm: 'two.js',\n test: function(win) {\n if (win.Two && win.Two.Utils) {\n return { version: win.Two.Version || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n 'Brewser': {\n icon: 'brewser',\n url: 'https://robertpataki.github.io/brewser/',\n npm: 'brewser',\n test: function(win) {\n if(win.BREWSER && win.BREWSER.ua) {\n return { version: BREWSER.VERSION || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n 'Material Design Lite': {\n icon: 'mdl',\n url: 'https://getmdl.io/',\n npm: 'material-design-lite',\n test: function(win) {\n if(win.componentHandler && win.componentHandler.upgradeElement) {\n return { version: UNKNOWN_VERSION};\n }\n return false;\n }\n },\n 'Kendo UI': {\n icon: 'kendoui',\n url: 'https://github.com/telerik/kendo-ui-core',\n npm: 'kendo-ui-core',\n test: function(win) {\n if (win.kendo && win.kendo.View && win.kendo.View.extend) {\n return {version: win.kendo.version || UNKNOWN_VERSION};\n }\n return false;\n }\n },\n 'Matter.js': {\n icon: 'matter-js',\n url: 'http://brm.io/matter-js/',\n npm: 'matter-js',\n test: function(win) {\n if (win.Matter && win.Matter.Engine) {\n return {version: UNKNOWN_VERSION};\n }\n return false;\n }\n },\n 'Riot': {\n icon: 'riot',\n url: 'http://riotjs.com/',\n npm: 'riot',\n test: function(win) {\n if (win.riot && win.riot.mixin) {\n return { version: win.riot.version || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n 'Sea.js': {\n icon: 'icon38',\n url: 'https://seajs.github.io/seajs/docs/',\n npm: 'seajs',\n test: function(win) {\n if(win.seajs && win.seajs.use) {\n return { version: win.seajs.version || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n 'Moment.js': {\n icon: 'momentjs',\n url: 'http://momentjs.com/',\n npm: 'moment',\n test: function(win) {\n if(win.moment && (win.moment.isMoment || win.moment.lang)) {\n // version 1.0.0 has neither \"isMoment\" nor \"version\"\n return { version: win.moment.version || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n 'Moment Timezone': {\n icon: 'momentjs',\n url: 'http://momentjs.com/timezone/',\n npm: 'moment-timezone',\n test: function(win) {\n if (win.moment && win.moment.tz) {\n return { version: win.moment.tz.version || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n 'ScrollMagic': {\n icon: 'scrollmagic',\n url: 'http://scrollmagic.io/',\n npm: 'scrollmagic',\n test: function(win) {\n if (win.ScrollMagic && win.ScrollMagic.Controller) {\n return {version: ScrollMagic.version || UNKNOWN_VERSION};\n }\n return false;\n }\n },\n 'SWFObject': {\n icon: 'icon38', // currently has no icon\n url: 'https://github.com/swfobject/swfobject',\n test: function(win) {\n if (win.swfobject && win.swfobject.embedSWF) {\n // 2.x - exact version only for 2.3\n return { version: win.swfobject.version || UNKNOWN_VERSION };\n } else if(win.deconcept && win.deconcept.SWFObject) {\n // 1.x\n return { version: UNKNOWN_VERSION };\n }\n return false;\n }\n },\n 'FlexSlider': {\n icon: 'icon38', // currently has no icon\n url: 'https://woocommerce.com/flexslider/',\n npm: 'flexslider',\n test: function(win) {\n var jq = win.jQuery || win.$ || win.$jq || win.$j;\n if (jq && jq.fn && jq.fn.jquery && jq.flexslider){\n return { version: UNKNOWN_VERSION };\n }\n return false;\n }\n },\n 'SPF': {\n icon: 'icon38', // currently has no icon\n url: 'https://youtube.github.io/spfjs/',\n npm: 'spf',\n test: function(win) {\n if (win.spf && win.spf.init) {\n return { version: UNKNOWN_VERSION };\n }\n return false;\n }\n },\n 'Numeral.js': {\n icon: 'icon38', // currently has no icon\n url: 'http://numeraljs.com/',\n npm: 'numeraljs',\n test: function(win) {\n if (win.numeral && win.isNumeral) {\n return { version: win.numeral.version || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n 'boomerang.js': {\n icon: 'icon38', // currently has no icon\n url: 'https://soasta.github.io/boomerang/',\n npm: 'boomerangjs',\n test: function(win) {\n if (win.BOOMR && win.BOOMR.utils && win.BOOMR.init) {\n return { version: win.BOOMR.version || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n 'Framer': {\n icon: 'framer',\n url: 'https://framer.com/',\n npm: 'framerjs',\n test: function(win) {\n if (win.Framer && win.Framer.Layer) {\n return { version: win.Framer.Version.build || UNKNOWN_VERSION };\n }\n return false;\n }\n },\n 'Marko': {\n icon: 'marko',\n url: 'https://markojs.com/',\n npm: 'marko',\n test: function (win) {\n var selector = '[data-marko-key], [data-marko]';\n var markoElement = document.querySelector(selector);\n if (markoElement) {\n return { version: UNKNOWN_VERSION };\n }\n return false;\n }\n },\n 'AMP': {\n icon: 'amp',\n url: 'https://ampproject.org/',\n npm: null,\n test: function (win) {\n var version = win.document.documentElement.getAttribute(\"amp-version\");\n return version ? { version: version } : false;\n }\n },\n 'Gatsby': {\n icon: 'gatsby',\n url: 'https://www.gatsbyjs.org/',\n npm: 'gatsby',\n test: function (win) {\n if (document.getElementById('___gatsby')) {\n return { version: UNKNOWN_VERSION };\n }\n return false;\n }\n },\n 'Shopify': {\n icon: 'shopify',\n url: 'https://www.shopify.com/',\n npm: null,\n test: function (win) {\n if (win.Shopify && win.Shopify.shop) {\n return { version: UNKNOWN_VERSION };\n }\n return false;\n }\n },\n 'WordPress': {\n icon: 'wordpress',\n url: 'https://wordpress.org/',\n npm: null,\n test: function (win) {\n const hasAPILinkElem = !!document.querySelector('link[rel=\"https://api.w.org/\"]');\n const hasWPIncludes = !!document.querySelectorAll('link[href*=\"wp-includes\"], script[src*=\"wp-includes\"]').length;\n \n if (!hasAPILinkElem && !hasWPIncludes) return false;\n \n const generatorMeta = document.querySelector('meta[name=generator][content^=\"WordPress\"]')\n const version = generatorMeta ? generatorMeta.getAttribute(\"content\").replace(/^\\w+\\s/,'') : UNKNOWN_VERSION;\n return { version };\n }\n },\n 'Wix': {\n icon: 'wix',\n url: 'https://www.wix.com/',\n npm: null,\n test: function (win) {\n if (win.wixBiSession) {\n return { version: UNKNOWN_VERSION };\n }\n return false;\n }\n },\n 'Workbox': {\n icon: 'workbox',\n url: 'https://developers.google.com/web/tools/workbox/',\n npm: 'workbox-sw',\n test: async function (win) {\n var nav = win.navigator;\n // Service Workers not supported\n if (!('serviceWorker' in nav)) {\n return false;\n }\n return nav.serviceWorker.getRegistration()\n .then(function(registration) {\n var scriptURL = nav.serviceWorker.controller.scriptURL;\n return fetch(scriptURL, { credentials: 'include',\n headers: { 'service-worker': 'script' }\n })\n .then(function(response) {\n return response.text();\n })\n .then(function(scriptContent) {\n var workboxRegExp = /new Workbox|new workbox|workbox\\.precaching\\.|workbox\\.strategies/gm;\n if (workboxRegExp.test(scriptContent)) {\n // Adapted from\n // https://github.com/semver/semver/issues/232#issue-48635632\n var semVerRegExp = /workbox.*?\\b((0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(-(0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(\\.(0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*)?(\\+[0-9a-zA-Z-]+(\\.[0-9a-zA-Z-]+)*)?)\\b/gim;\n var matches = semVerRegExp.exec(scriptContent);\n var version = UNKNOWN_VERSION;\n if (Array.isArray(matches) && matches.length > 1 && matches[1]) {\n version = matches[1];\n }\n return { version: version };\n }\n return false;\n });\n }).catch(function(exception) {\n return false;\n });\n }\n }\n};\n";
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+async function detectLibraries(){
+
+const libraries=[];
+
+
+
+
+
+const libraryDetectorTests=d41d8cd98f00b204e9800998ecf8427e_LibraryDetectorTests;
+
+for(const[name,lib]of Object.entries(libraryDetectorTests)){
+try{
+const result=await lib.test(window);
+if(result){
+libraries.push({
+name:name,
+icon:lib.icon,
+version:result.version,
+npm:lib.npm});
+
+}
+}catch(e){}
+}
+
+return libraries;
+}
+
+
+
+
+
+async function collectStacks(passContext){
+const expression=`(function () {
+ ${libDetectorSource};
+ return (${detectLibraries.toString()}());
+ })()`;
+
+
+const jsLibraries=await passContext.driver.evaluateAsync(expression);
+
+return jsLibraries.map(lib=>({
+detector:'js',
+id:lib.npm||lib.icon,
+name:lib.name,
+version:lib.version||undefined,
+npm:lib.npm||undefined}));
+
+}
+
+module.exports=collectStacks;
+
+},{}],79:[function(require,module,exports){
+
+
+
+
+
+'use strict';
+
+const stackPacks=require('../../stack-packs/index.js');
+const log=require('lighthouse-logger');
+
+
+
+
+
+
+const stackPacksToInclude=[{
+packId:'wordpress',
+requiredStacks:['js:wordpress']}];
+
+
+
+
+
+
+
+function getStackPacks(pageStacks){
+
+const packs=[];
+
+for(const pageStack of pageStacks){
+const stackPackToIncl=stackPacksToInclude.find(stackPackToIncl=>
+stackPackToIncl.requiredStacks.includes(`${pageStack.detector}:${pageStack.id}`));
+if(!stackPackToIncl){
+continue;
+}
+
+
+const matchedPack=stackPacks.find(pack=>pack.id===stackPackToIncl.packId);
+if(!matchedPack){
+log.warn('StackPacks',
+`'${stackPackToIncl.packId}' stack pack was matched but is not found in stack-packs lib`);
+continue;
+}
+
+packs.push({
+id:matchedPack.id,
+title:matchedPack.title,
+iconDataURL:matchedPack.iconDataURL,
+descriptions:matchedPack.descriptions});
+
+}
+
+return packs;
+}
+
+module.exports={
+getStackPacks};
+
+
+},{"../../stack-packs/index.js":173,"lighthouse-logger":125}],80:[function(require,module,exports){
@@ -30012,7 +31304,7 @@ linearInterpolation,
getLogNormalDistribution};
-},{}],76:[function(require,module,exports){
+},{}],81:[function(require,module,exports){
@@ -30027,7 +31319,7 @@ rectsTouchOrOverlap,
rectContainsPoint,
getBoundingRect,
getRectCenterPoint}=
-require('./rect-helpers');
+require('./rect-helpers.js');
@@ -30087,7 +31379,7 @@ rectsTouchOrOverlap(crA,crB)&&(
rectsLineUpHorizontally||rectsLineUpVertically);
if(canMerge){
-const replacementClientRect=getBoundingRect(crA,crB);
+const replacementClientRect=getBoundingRect([crA,crB]);
const mergedRectCenter=getRectCenterPoint(replacementClientRect);
if(
@@ -30120,7 +31412,7 @@ module.exports={
getTappableRectsFromClientRects};
-},{"./rect-helpers":73}],77:[function(require,module,exports){
+},{"./rect-helpers.js":76}],82:[function(require,module,exports){
@@ -30233,7 +31525,7 @@ taskGroups,
taskNameToGroup};
-},{}],78:[function(require,module,exports){
+},{}],83:[function(require,module,exports){
@@ -30438,7 +31730,7 @@ return fakeEvents;
module.exports=Metrics;
-},{"lighthouse-logger":120}],79:[function(require,module,exports){
+},{"lighthouse-logger":125}],84:[function(require,module,exports){
@@ -30459,7 +31751,7 @@ const SCHEDULABLE_TASK_TITLE_ALT2='ThreadControllerImpl::DoWork';
const SCHEDULABLE_TASK_TITLE_ALT3='TaskQueueManager::ProcessTaskFromWorkQueue';
-const LHError=require('../lh-error');
+const LHError=require('../lh-error.js');
class TraceProcessor{
@@ -30725,7 +32017,7 @@ evt.name===SCHEDULABLE_TASK_TITLE_ALT3;
module.exports=TraceProcessor;
-},{"../lh-error":67}],80:[function(require,module,exports){
+},{"../lh-error.js":70}],85:[function(require,module,exports){
@@ -30749,6 +32041,7 @@ module.exports=TraceProcessor;
const ELLIPSIS='\u2026';
const NBSP='\xa0';
const PASS_THRESHOLD=0.9;
+const SCREENSHOT_PREFIX='data:image/jpeg;base64,';
const RATINGS={
PASS:{label:'pass',minScore:PASS_THRESHOLD},
@@ -30757,6 +32050,14 @@ FAIL:{label:'fail'},
ERROR:{label:'error'}};
+
+
+
+const listOfTlds=[
+'com','co','gov','edu','ac','org','go','gob','or','net','in','ne','nic','gouv',
+'web','spb','blog','jus','kiev','mil','wi','qc','ca','bel','on'];
+
+
class Util{
static get PASS_THRESHOLD(){
return PASS_THRESHOLD;
@@ -30774,6 +32075,7 @@ return`%10d${NBSP}ms`;
+
static prepareReportResult(result){
const clone=JSON.parse(JSON.stringify(result));
@@ -30782,29 +32084,61 @@ const clone=JSON.parse(JSON.stringify(result));
if(!clone.configSettings.locale){
clone.configSettings.locale='en';
}
-Util.setNumberDateLocale(clone.configSettings.locale);
-if(clone.i18n&&clone.i18n.rendererFormattedStrings){
-Util.updateAllUIStrings(clone.i18n.rendererFormattedStrings);
-}
-
-if(typeof clone.categories!=='object')throw new Error('No categories provided.');
-clone.reportCategories=Object.values(clone.categories);
+for(const audit of Object.values(clone.audits)){
-for(const audit of Object.values(clone.audits)){
if(audit.scoreDisplayMode==='not_applicable'||audit.scoreDisplayMode==='not-applicable'){
audit.scoreDisplayMode='notApplicable';
}
+
+if(audit.details){
+
+
+
+if(audit.details.type===undefined||audit.details.type==='diagnostic'){
+audit.details.type='debugdata';
}
-for(const category of clone.reportCategories){
-category.auditRefs.forEach(auditMeta=>{
-const result=clone.audits[auditMeta.id];
-auditMeta.result=result;
+if(audit.details.type==='filmstrip'){
+for(const screenshot of audit.details.items){
+if(!screenshot.data.startsWith(SCREENSHOT_PREFIX)){
+screenshot.data=SCREENSHOT_PREFIX+screenshot.data;
+}
+}
+}
+}
+}
+
+
+Util.setNumberDateLocale(clone.configSettings.locale);
+if(clone.i18n&&clone.i18n.rendererFormattedStrings){
+Util.updateAllUIStrings(clone.i18n.rendererFormattedStrings);
+}
+
+
+if(typeof clone.categories!=='object')throw new Error('No categories provided.');
+for(const category of Object.values(clone.categories)){
+category.auditRefs.forEach(auditRef=>{
+const result=clone.audits[auditRef.id];
+auditRef.result=result;
+
+
+if(clone.stackPacks){
+clone.stackPacks.forEach(pack=>{
+if(pack.descriptions[auditRef.id]){
+auditRef.stackPacks=auditRef.stackPacks||[];
+auditRef.stackPacks.push({
+title:pack.title,
+iconDataURL:pack.iconDataURL,
+description:pack.descriptions[auditRef.id]});
+
+}
+});
+}
});
}
@@ -31054,6 +32388,51 @@ origin:parsedUrl.origin};
+static createOrReturnURL(value){
+if(value instanceof URL){
+return value;
+}
+
+return new URL(value);
+}
+
+
+
+
+
+
+
+static getTld(hostname){
+const tlds=hostname.split('.').slice(-2);
+
+if(!listOfTlds.includes(tlds[0])){
+return`.${tlds[tlds.length-1]}`;
+}
+
+return`.${tlds.join('.')}`;
+}
+
+
+
+
+
+
+static getRootDomain(url){
+const hostname=Util.createOrReturnURL(url).hostname;
+const tld=Util.getTld(hostname);
+
+
+
+const splitTld=tld.split('.');
+
+
+return hostname.split('.').slice(-splitTld.length).join('.');
+}
+
+
+
+
+
static getEnvironmentDisplayValues(settings){
const emulationDesc=Util.getEmulationDescriptions(settings);
@@ -31114,10 +32493,8 @@ summary='Unknown';}
let deviceEmulation='No emulation';
-if(!settings.disableDeviceEmulation){
if(settings.emulatedFormFactor==='mobile')deviceEmulation='Emulated Nexus 5X';
if(settings.emulatedFormFactor==='desktop')deviceEmulation='Emulated Desktop';
-}
return{
deviceEmulation,
@@ -31178,6 +32555,13 @@ lineNumbersToKeep.add(surroundingLineNumber);
});
return lines.filter(line=>lineNumbersToKeep.has(line.lineNumber));
+}
+
+
+
+
+static isPluginCategory(categoryId){
+return categoryId.startsWith('lighthouse-plugin-');
}}
@@ -31219,8 +32603,6 @@ manualAuditsGroupTitle:'Additional items to manually check',
toplevelWarningsMessage:'There were issues affecting this run of Lighthouse:',
-scorescaleLabel:'Score scale:',
-
crcInitialNavigation:'Initial Navigation',
@@ -31234,7 +32616,10 @@ snippetCollapseButtonLabel:'Collapse snippet',
lsPerformanceCategoryDescription:'[Lighthouse](https://developers.google.com/web/tools/lighthouse/) analysis of the current page on an emulated mobile network. Values are estimated and may vary.',
-labDataTitle:'Lab Data'};
+labDataTitle:'Lab Data',
+
+
+thirdPartyResourcesLabel:'Show 3rd-party resources'};
if(typeof module!=='undefined'&&module.exports){
@@ -31243,7 +32628,7 @@ module.exports=Util;
self.Util=Util;
}
-},{}],81:[function(require,module,exports){
+},{}],86:[function(require,module,exports){
@@ -31251,7 +32636,7 @@ self.Util=Util;
'use strict';
-const htmlReportAssets=require('./html/html-report-assets');
+const htmlReportAssets=require('./html/html-report-assets.js');
class ReportGenerator{
@@ -31363,7 +32748,7 @@ return outputAsArray?output:output[0];
module.exports=ReportGenerator;
-},{"./html/html-report-assets":93}],82:[function(require,module,exports){
+},{"./html/html-report-assets.js":98}],87:[function(require,module,exports){
(function(process){
@@ -31374,17 +32759,18 @@ module.exports=ReportGenerator;
const isDeepEqual=require('lodash.isequal');
const Driver=require('./gather/driver.js');
-const GatherRunner=require('./gather/gather-runner');
-const ReportScoring=require('./scoring');
-const Audit=require('./audits/audit');
+const GatherRunner=require('./gather/gather-runner.js');
+const ReportScoring=require('./scoring.js');
+const Audit=require('./audits/audit.js');
const log=require('lighthouse-logger');
const i18n=require('./lib/i18n/i18n.js');
-const assetSaver=require('./lib/asset-saver');
+const stackPacks=require('./lib/stack-packs.js');
+const assetSaver=require('./lib/asset-saver.js');
const path=require('path');
-const URL=require('./lib/url-shim');
-const Sentry=require('./lib/sentry');
-const generateReport=require('./report/report-generator').generateReport;
+const URL=require('./lib/url-shim.js');
+const Sentry=require('./lib/sentry.js');
+const generateReport=require('./report/report-generator.js').generateReport;
const LHError=require('./lib/lh-error.js');
@@ -31512,8 +32898,9 @@ categoryGroups:runOpts.config.groups||undefined,
timing:this._getTiming(artifacts),
i18n:{
rendererFormattedStrings:i18n.getRendererFormattedStrings(settings.locale),
-icuMessagePaths:{}}};
+icuMessagePaths:{}},
+stackPacks:stackPacks.getStackPacks(artifacts.Stacks)};
@@ -31551,9 +32938,12 @@ const timingEntries=Array.from(new Map(timingEntriesKeyValues).values()).
map(entry=>{
return{
-...entry,
+
+
+startTime:parseFloat(entry.startTime.toFixed(2)),
+name:entry.name,
duration:parseFloat(entry.duration.toFixed(2)),
-startTime:parseFloat(entry.startTime.toFixed(2))};
+entryType:entry.entryType};
});
const runnerEntry=timingEntries.find(e=>e.name==='lh:runner:run');
@@ -31598,7 +32988,8 @@ const overrides={
locale:undefined,
gatherMode:undefined,
auditMode:undefined,
-output:undefined};
+output:undefined,
+budgets:undefined};
const normalizedGatherSettings=Object.assign({},artifacts.settings,overrides);
const normalizedAuditSettings=Object.assign({},settings,overrides);
@@ -31638,7 +33029,7 @@ return auditResults;
static async _runAudit(auditDefn,artifacts,sharedAuditContext){
const audit=auditDefn.implementation;
const status={
-msg:`Evaluating: ${i18n.getFormatted(audit.meta.title,'en-US')}`,
+msg:`Auditing: ${i18n.getFormatted(audit.meta.title,'en-US')}`,
id:`lh:audit:${audit.meta.id}`};
log.time(status);
@@ -31689,7 +33080,15 @@ options:auditOptions,
...sharedAuditContext};
-const product=await audit.audit(artifacts,auditContext);
+
+
+
+const requiredArtifacts=audit.meta.requiredArtifacts.
+reduce((requiredArtifacts,artifactName)=>{
+requiredArtifacts[artifactName]=artifacts[artifactName];
+return requiredArtifacts;
+},{});
+const product=await audit.audit(requiredArtifacts,auditContext);
auditResult=Audit.generateAuditResult(audit,product);
}catch(err){
log.warn(audit.meta.id,`Caught exception: ${err.message}`);
@@ -31739,7 +33138,7 @@ const ignoredFiles=[
const fileList=[
-...["accessibility","audit.js","bootup-time.js","byte-efficiency","content-width.js","critical-request-chains.js","deprecations.js","diagnostics.js","dobetterweb","errors-in-console.js","final-screenshot.js","font-display.js","image-aspect-ratio.js","installable-manifest.js","is-on-https.js","load-fast-enough-for-pwa.js","main-thread-tasks.js","mainthread-work-breakdown.js","manual","metrics","metrics.js","mixed-content.js","multi-check-audit.js","network-requests.js","network-rtt.js","network-server-latency.js","offline-start-url.js","predictive-perf.js","redirects-http.js","redirects.js","screenshot-thumbnails.js","seo","service-worker.js","splash-screen.js","themed-omnibox.js","time-to-first-byte.js","user-timings.js","uses-rel-preconnect.js","uses-rel-preload.js","viewport.js","violation-audit.js","without-javascript.js","works-offline.js"],
+...["accessibility","apple-touch-icon.js","audit.js","bootup-time.js","byte-efficiency","content-width.js","critical-request-chains.js","deprecations.js","diagnostics.js","dobetterweb","errors-in-console.js","final-screenshot.js","font-display.js","image-aspect-ratio.js","installable-manifest.js","is-on-https.js","load-fast-enough-for-pwa.js","main-thread-tasks.js","mainthread-work-breakdown.js","manual","metrics","metrics.js","mixed-content.js","multi-check-audit.js","network-requests.js","network-rtt.js","network-server-latency.js","offline-start-url.js","performance-budget.js","predictive-perf.js","redirects-http.js","redirects.js","resource-summary.js","screenshot-thumbnails.js","seo","service-worker.js","splash-screen.js","themed-omnibox.js","time-to-first-byte.js","user-timings.js","uses-rel-preconnect.js","uses-rel-preload.js","viewport.js","violation-audit.js","without-javascript.js","works-offline.js"],
...["appcache-manifest.js","doctype.js","dom-size.js","external-anchors-use-rel-noopener.js","geolocation-on-start.js","js-libraries.js","no-document-write.js","no-vulnerable-libraries.js","notification-on-start.js","password-inputs-can-be-pasted-into.js","uses-http2.js","uses-passive-event-listeners.js"].map(f=>`dobetterweb/${f}`),
...["estimated-input-latency.js","first-contentful-paint-3g.js","first-contentful-paint.js","first-cpu-idle.js","first-meaningful-paint.js","interactive.js","max-potential-fid.js","speed-index.js"].map(f=>`metrics/${f}`),
...["canonical.js","font-size.js","hreflang.js","http-status-code.js","is-crawlable.js","link-text.js","manual","meta-description.js","plugins.js","robots-txt.js","tap-targets.js"].map(f=>`seo/${f}`),
@@ -31763,9 +33162,9 @@ return /\.js$/.test(f)&&!ignoredFiles.includes(f);
static getGathererList(){
const fileList=[
-...["accessibility.js","anchor-elements.js","cache-contents.js","chrome-console-messages.js","css-usage.js","dobetterweb","gatherer.js","html-without-javascript.js","http-redirect.js","image-elements.js","js-usage.js","link-elements.js","meta-elements.js","mixed-content.js","offline.js","runtime-exceptions.js","script-elements.js","seo","service-worker.js","start-url.js","viewport-dimensions.js"],
+...["accessibility.js","anchor-elements.js","cache-contents.js","console-messages.js","css-usage.js","dobetterweb","gatherer.js","html-without-javascript.js","http-redirect.js","image-elements.js","js-usage.js","link-elements.js","meta-elements.js","mixed-content.js","offline.js","runtime-exceptions.js","script-elements.js","seo","service-worker.js","start-url.js","viewport-dimensions.js"],
...["embedded-content.js","font-size.js","robots-txt.js","tap-targets.js"].map(f=>`seo/${f}`),
-...["appcache.js","doctype.js","domstats.js","js-libraries.js","optimized-images.js","password-inputs-with-prevented-paste.js","response-compression.js","tags-blocking-first-paint.js"].
+...["appcache.js","doctype.js","domstats.js","optimized-images.js","password-inputs-with-prevented-paste.js","response-compression.js","tags-blocking-first-paint.js"].
map(f=>`dobetterweb/${f}`)];
return fileList.filter(f=>/\.js$/.test(f)&&f!=='gatherer.js').sort();
@@ -31790,7 +33189,7 @@ return path.join(process.cwd(),'latest-run');
module.exports=Runner;
}).call(this,require('_process'));
-},{"../package.json":167,"./audits/audit":3,"./gather/driver.js":46,"./gather/gather-runner":47,"./lib/asset-saver":51,"./lib/i18n/i18n.js":63,"./lib/lh-error.js":67,"./lib/sentry":74,"./lib/url-shim":"url","./report/report-generator":81,"./scoring":83,"_process":137,"lighthouse-logger":120,"lodash.isequal":121,"path":135}],83:[function(require,module,exports){
+},{"../package.json":172,"./audits/audit.js":3,"./gather/driver.js":49,"./gather/gather-runner.js":50,"./lib/asset-saver.js":54,"./lib/i18n/i18n.js":66,"./lib/lh-error.js":70,"./lib/sentry.js":77,"./lib/stack-packs.js":79,"./lib/url-shim.js":"url","./report/report-generator.js":86,"./scoring.js":88,"_process":142,"lighthouse-logger":125,"lodash.isequal":126,"path":140}],88:[function(require,module,exports){
@@ -31799,7 +33198,7 @@ module.exports=Runner;
'use strict';
-const Audit=require('./audits/audit');
+const Audit=require('./audits/audit.js');
@@ -31885,7 +33284,7 @@ return scoredCategories;
module.exports=ReportScoring;
-},{"./audits/audit":3}],84:[function(require,module,exports){
+},{"./audits/audit.js":3}],89:[function(require,module,exports){
(function(global){
'use strict';
@@ -32379,7 +33778,7 @@ return keys;
};
}).call(this,typeof global!=="undefined"?global:typeof self!=="undefined"?self:typeof window!=="undefined"?window:{});
-},{"util/":87}],85:[function(require,module,exports){
+},{"util/":92}],90:[function(require,module,exports){
if(typeof Object.create==='function'){
module.exports=function inherits(ctor,superCtor){
@@ -32404,14 +33803,14 @@ ctor.prototype.constructor=ctor;
};
}
-},{}],86:[function(require,module,exports){
+},{}],91:[function(require,module,exports){
module.exports=function isBuffer(arg){
return arg&&typeof arg==='object'&&
typeof arg.copy==='function'&&
typeof arg.fill==='function'&&
typeof arg.readUInt8==='function';
};
-},{}],87:[function(require,module,exports){
+},{}],92:[function(require,module,exports){
(function(process,global){
@@ -33001,10 +34400,9 @@ return Object.prototype.hasOwnProperty.call(obj,prop);
}
}).call(this,require('_process'),typeof global!=="undefined"?global:typeof self!=="undefined"?self:typeof window!=="undefined"?window:{});
-},{"./support/isBuffer":86,"_process":137,"inherits":85}],88:[function(require,module,exports){
+},{"./support/isBuffer":91,"_process":142,"inherits":90}],93:[function(require,module,exports){
-
-var langs=[
+const langs=[
'aa',
'ab',
'ae',
@@ -41151,13 +42549,12 @@ var langs=[
-
axe.utils.validLangs=function(){
'use strict';
return langs;
};
-},{}],89:[function(require,module,exports){
+},{}],94:[function(require,module,exports){
'use strict';
exports.byteLength=byteLength;
@@ -41310,9 +42707,9 @@ lookup[tmp<<2&0x3F]+
return parts.join('');
}
-},{}],90:[function(require,module,exports){
+},{}],95:[function(require,module,exports){
-},{}],91:[function(require,module,exports){
+},{}],96:[function(require,module,exports){
(function(process,Buffer){
'use strict';
@@ -41724,7 +43121,7 @@ this._error('Failed to reset stream');
exports.Zlib=Zlib;
}).call(this,require('_process'),require("buffer").Buffer);
-},{"_process":137,"assert":84,"buffer":94,"pako/lib/zlib/constants":128,"pako/lib/zlib/deflate.js":130,"pako/lib/zlib/inflate.js":93,"pako/lib/zlib/zstream":133}],92:[function(require,module,exports){
+},{"_process":142,"assert":89,"buffer":99,"pako/lib/zlib/constants":133,"pako/lib/zlib/deflate.js":135,"pako/lib/zlib/inflate.js":98,"pako/lib/zlib/zstream":138}],97:[function(require,module,exports){
(function(process){
'use strict';
@@ -42336,9 +43733,9 @@ util.inherits(DeflateRaw,Zlib);
util.inherits(InflateRaw,Zlib);
util.inherits(Unzip,Zlib);
}).call(this,require('_process'));
-},{"./binding":91,"_process":137,"assert":84,"buffer":94,"stream":162,"util":166}],93:[function(require,module,exports){
-arguments[4][90][0].apply(exports,arguments);
-},{"dup":90}],94:[function(require,module,exports){
+},{"./binding":96,"_process":142,"assert":89,"buffer":99,"stream":167,"util":171}],98:[function(require,module,exports){
+arguments[4][95][0].apply(exports,arguments);
+},{"dup":95}],99:[function(require,module,exports){
(function(Buffer){
@@ -44119,7 +45516,7 @@ return obj!==obj;
}
}).call(this,require("buffer").Buffer);
-},{"base64-js":89,"buffer":94,"ieee754":103}],95:[function(require,module,exports){
+},{"base64-js":94,"buffer":99,"ieee754":108}],100:[function(require,module,exports){
(function(Buffer){
@@ -44230,7 +45627,7 @@ return Object.prototype.toString.call(o);
}
}).call(this,{"isBuffer":require("../../insert-module-globals/node_modules/is-buffer/index.js")});
-},{"../../insert-module-globals/node_modules/is-buffer/index.js":106}],96:[function(require,module,exports){
+},{"../../insert-module-globals/node_modules/is-buffer/index.js":111}],101:[function(require,module,exports){
module.exports=[
"aliceblue",
"antiquewhite",
@@ -44382,7 +45779,7 @@ module.exports=[
"yellowgreen"];
-},{}],97:[function(require,module,exports){
+},{}],102:[function(require,module,exports){
@@ -45081,7 +46478,7 @@ dashed='-'+dashed;
return dashed;
};
-},{"./named_colors.json":96}],98:[function(require,module,exports){
+},{"./named_colors.json":101}],103:[function(require,module,exports){
(function(process){
@@ -45270,7 +46667,7 @@ return window.localStorage;
}
}).call(this,require('_process'));
-},{"./debug":99,"_process":137}],99:[function(require,module,exports){
+},{"./debug":104,"_process":142}],104:[function(require,module,exports){
@@ -45474,7 +46871,7 @@ if(val instanceof Error)return val.stack||val.message;
return val;
}
-},{"ms":125}],100:[function(require,module,exports){
+},{"ms":130}],105:[function(require,module,exports){
@@ -45999,7 +47396,7 @@ return fn.apply(context,arguments);
};
}
-},{}],101:[function(require,module,exports){
+},{}],106:[function(require,module,exports){
(function(Buffer){
var querystring=require('querystring');
var trim=require('./trim');
@@ -46306,12 +47703,12 @@ return refs.join(', ');
module.exports=Link;
}).call(this,{"isBuffer":require("../../insert-module-globals/node_modules/is-buffer/index.js")});
-},{"../../insert-module-globals/node_modules/is-buffer/index.js":106,"./trim":102,"querystring":140}],102:[function(require,module,exports){
+},{"../../insert-module-globals/node_modules/is-buffer/index.js":111,"./trim":107,"querystring":145}],107:[function(require,module,exports){
module.exports=function trim(value){
return value.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,'');
};
-},{}],103:[function(require,module,exports){
+},{}],108:[function(require,module,exports){
exports.read=function(buffer,offset,isLE,mLen,nBytes){
var e,m;
var eLen=nBytes*8-mLen-1;
@@ -46397,7 +47794,7 @@ for(;eLen>0;buffer[offset+i]=e&0xff,i+=d,e/=256,eLen-=8){}
buffer[offset+i-d]|=s*128;
};
-},{}],104:[function(require,module,exports){
+},{}],109:[function(require,module,exports){
@@ -46542,9 +47939,9 @@ return sumLuma/lumaValues.length;
})(ImageSSIM||(ImageSSIM={}));
module.exports=ImageSSIM;
-},{}],105:[function(require,module,exports){
-arguments[4][85][0].apply(exports,arguments);
-},{"dup":85}],106:[function(require,module,exports){
+},{}],110:[function(require,module,exports){
+arguments[4][90][0].apply(exports,arguments);
+},{"dup":90}],111:[function(require,module,exports){
@@ -46567,13 +47964,13 @@ function isSlowBuffer(obj){
return typeof obj.readFloatLE==='function'&&typeof obj.slice==='function'&&isBuffer(obj.slice(0,0));
}
-},{}],107:[function(require,module,exports){
+},{}],112:[function(require,module,exports){
'use strict';
exports=module.exports=require('./lib/parser')['default'];
exports['default']=exports;
-},{"./lib/parser":108}],108:[function(require,module,exports){
+},{"./lib/parser":113}],113:[function(require,module,exports){
"use strict";
exports["default"]=function(){
@@ -47975,7 +49372,7 @@ parse:peg$parse};
}();
-},{}],109:[function(require,module,exports){
+},{}],114:[function(require,module,exports){
'use strict';
@@ -47992,7 +49389,7 @@ require('./lib/locales');
exports=module.exports=IntlMessageFormat;
exports['default']=exports;
-},{"./lib/locales":90,"./lib/main":114}],110:[function(require,module,exports){
+},{"./lib/locales":95,"./lib/main":119}],115:[function(require,module,exports){
@@ -48202,7 +49599,7 @@ return options[value]||options.other;
};
-},{}],111:[function(require,module,exports){
+},{}],116:[function(require,module,exports){
@@ -48480,13 +49877,13 @@ locales.join(', ')+', or the default locale: '+defaultLocale);
};
-},{"./compiler":110,"./es5":113,"./utils":115,"intl-messageformat-parser":107}],112:[function(require,module,exports){
+},{"./compiler":115,"./es5":118,"./utils":120,"intl-messageformat-parser":112}],117:[function(require,module,exports){
"use strict";
exports["default"]={"locale":"en","pluralRuleFunction":function(n,ord){var s=String(n).split("."),v0=!s[1],t0=Number(s[0])==n,n10=t0&&s[0].slice(-1),n100=t0&&s[0].slice(-2);if(ord)return n10==1&&n100!=11?"one":n10==2&&n100!=12?"two":n10==3&&n100!=13?"few":"other";return n==1&&v0?"one":"other";}};
-},{}],113:[function(require,module,exports){
+},{}],118:[function(require,module,exports){
@@ -48537,7 +49934,7 @@ return obj;
exports.defineProperty=defineProperty,exports.objCreate=objCreate;
-},{"./utils":115}],114:[function(require,module,exports){
+},{"./utils":120}],119:[function(require,module,exports){
"use strict";
@@ -48549,7 +49946,7 @@ src$core$$["default"].defaultLocale='en';
exports["default"]=src$core$$["default"];
-},{"./core":111,"./en":112}],115:[function(require,module,exports){
+},{"./core":116,"./en":117}],120:[function(require,module,exports){
@@ -48582,14 +49979,14 @@ return obj;
exports.hop=hop;
-},{}],116:[function(require,module,exports){
+},{}],121:[function(require,module,exports){
var toString={}.toString;
module.exports=Array.isArray||function(arr){
return toString.call(arr)=='[object Array]';
};
-},{}],117:[function(require,module,exports){
+},{}],122:[function(require,module,exports){
var encode=require('./lib/encoder'),
decode=require('./lib/decoder');
@@ -48598,7 +49995,7 @@ encode:encode,
decode:decode};
-},{"./lib/decoder":118,"./lib/encoder":119}],118:[function(require,module,exports){
+},{"./lib/decoder":123,"./lib/encoder":124}],123:[function(require,module,exports){
(function(Buffer){
@@ -49588,7 +50985,7 @@ return image;
}
}).call(this,require("buffer").Buffer);
-},{"buffer":94}],119:[function(require,module,exports){
+},{"buffer":99}],124:[function(require,module,exports){
(function(Buffer){
@@ -50358,7 +51755,7 @@ return ctx.getImageData(0,0,cvs.width,cvs.height);
}
}).call(this,require("buffer").Buffer);
-},{"buffer":94}],120:[function(require,module,exports){
+},{"buffer":99}],125:[function(require,module,exports){
(function(process){
@@ -50603,7 +52000,7 @@ Log.getTimeEntries=()=>marky.getEntries();
module.exports=Log;
}).call(this,require('_process'));
-},{"_process":137,"debug":98,"events":100,"marky":123}],121:[function(require,module,exports){
+},{"_process":142,"debug":103,"events":105,"marky":128}],126:[function(require,module,exports){
(function(global){
@@ -52455,7 +53852,7 @@ return false;
module.exports=isEqual;
}).call(this,typeof global!=="undefined"?global:typeof self!=="undefined"?self:typeof window!=="undefined"?window:{});
-},{}],122:[function(require,module,exports){
+},{}],127:[function(require,module,exports){
@@ -52472,7 +53869,7 @@ current.pop();
}
};
-},{}],123:[function(require,module,exports){
+},{}],128:[function(require,module,exports){
'use strict';
Object.defineProperty(exports,'__esModule',{value:true});
@@ -52552,7 +53949,7 @@ exports.getEntries=function(){return entries;};
exports.clear=function(){entries=[];};
}
-},{}],124:[function(require,module,exports){
+},{}],129:[function(require,module,exports){
exports.getRenderingDataFromViewport=function(viewportProperties,uaDeviceWidth,uaDeviceHeight,uaMaxZoom,uaMinZoom){
var vw=uaDeviceWidth/100;
@@ -52895,7 +54292,7 @@ exports.expectedValues={
"viewport-fit":["auto","cover"]};
-},{}],125:[function(require,module,exports){
+},{}],130:[function(require,module,exports){
@@ -53049,7 +54446,7 @@ return Math.floor(ms/n)+' '+name;
return Math.ceil(ms/n)+' '+name+'s';
}
-},{}],126:[function(require,module,exports){
+},{}],131:[function(require,module,exports){
'use strict';
@@ -53156,7 +54553,7 @@ exports.assign(exports,fnUntyped);
exports.setTyped(TYPED_OK);
-},{}],127:[function(require,module,exports){
+},{}],132:[function(require,module,exports){
'use strict';
@@ -53209,7 +54606,7 @@ return s1|s2<<16|0;
module.exports=adler32;
-},{}],128:[function(require,module,exports){
+},{}],133:[function(require,module,exports){
'use strict';
@@ -53279,7 +54676,7 @@ Z_DEFLATED:8};
-},{}],129:[function(require,module,exports){
+},{}],134:[function(require,module,exports){
'use strict';
@@ -53340,7 +54737,7 @@ return crc^-1;
module.exports=crc32;
-},{}],130:[function(require,module,exports){
+},{}],135:[function(require,module,exports){
'use strict';
@@ -55216,7 +56613,7 @@ exports.deflateInfo='pako deflate (from Nodeca project)';
-},{"../utils/common":126,"./adler32":127,"./crc32":129,"./messages":131,"./trees":132}],131:[function(require,module,exports){
+},{"../utils/common":131,"./adler32":132,"./crc32":134,"./messages":136,"./trees":137}],136:[function(require,module,exports){
'use strict';
@@ -55250,7 +56647,7 @@ module.exports={
'-6':'incompatible version'};
-},{}],132:[function(require,module,exports){
+},{}],137:[function(require,module,exports){
'use strict';
@@ -56474,7 +57871,7 @@ exports._tr_flush_block=_tr_flush_block;
exports._tr_tally=_tr_tally;
exports._tr_align=_tr_align;
-},{"../utils/common":126}],133:[function(require,module,exports){
+},{"../utils/common":131}],138:[function(require,module,exports){
'use strict';
@@ -56523,7 +57920,7 @@ this.adler=0;
module.exports=ZStream;
-},{}],134:[function(require,module,exports){
+},{}],139:[function(require,module,exports){
module.exports=function parseCacheControl(field){
if(typeof field!=='string'){
@@ -56562,7 +57959,7 @@ catch(err){}
return err?null:header;
};
-},{}],135:[function(require,module,exports){
+},{}],140:[function(require,module,exports){
(function(process){
@@ -56868,7 +58265,7 @@ return str.substr(start,len);
}).call(this,require('_process'));
-},{"_process":137}],136:[function(require,module,exports){
+},{"_process":142}],141:[function(require,module,exports){
(function(process){
'use strict';
@@ -56915,7 +58312,7 @@ fn.apply(null,args);
}
}).call(this,require('_process'));
-},{"_process":137}],137:[function(require,module,exports){
+},{"_process":142}],142:[function(require,module,exports){
var process=module.exports={};
@@ -57101,7 +58498,7 @@ throw new Error('process.chdir is not supported');
};
process.umask=function(){return 0;};
-},{}],138:[function(require,module,exports){
+},{}],143:[function(require,module,exports){
@@ -57187,7 +58584,7 @@ var isArray=Array.isArray||function(xs){
return Object.prototype.toString.call(xs)==='[object Array]';
};
-},{}],139:[function(require,module,exports){
+},{}],144:[function(require,module,exports){
@@ -57274,16 +58671,16 @@ if(Object.prototype.hasOwnProperty.call(obj,key))res.push(key);
return res;
};
-},{}],140:[function(require,module,exports){
+},{}],145:[function(require,module,exports){
'use strict';
exports.decode=exports.parse=require('./decode');
exports.encode=exports.stringify=require('./encode');
-},{"./decode":138,"./encode":139}],141:[function(require,module,exports){
+},{"./decode":143,"./encode":144}],146:[function(require,module,exports){
module.exports=require('./lib/_stream_duplex.js');
-},{"./lib/_stream_duplex.js":142}],142:[function(require,module,exports){
+},{"./lib/_stream_duplex.js":147}],147:[function(require,module,exports){
@@ -57408,7 +58805,7 @@ for(var i=0,l=xs.length;i<l;i++){
f(xs[i],i);
}
}
-},{"./_stream_readable":144,"./_stream_writable":146,"core-util-is":95,"inherits":105,"process-nextick-args":136}],143:[function(require,module,exports){
+},{"./_stream_readable":149,"./_stream_writable":151,"core-util-is":100,"inherits":110,"process-nextick-args":141}],148:[function(require,module,exports){
@@ -57456,7 +58853,7 @@ Transform.call(this,options);
PassThrough.prototype._transform=function(chunk,encoding,cb){
cb(null,chunk);
};
-},{"./_stream_transform":145,"core-util-is":95,"inherits":105}],144:[function(require,module,exports){
+},{"./_stream_transform":150,"core-util-is":100,"inherits":110}],149:[function(require,module,exports){
(function(process,global){
@@ -58466,7 +59863,7 @@ if(xs[i]===x)return i;
return-1;
}
}).call(this,require('_process'),typeof global!=="undefined"?global:typeof self!=="undefined"?self:typeof window!=="undefined"?window:{});
-},{"./_stream_duplex":142,"./internal/streams/BufferList":147,"./internal/streams/destroy":148,"./internal/streams/stream":149,"_process":137,"core-util-is":95,"events":100,"inherits":105,"isarray":116,"process-nextick-args":136,"safe-buffer":157,"string_decoder/":150,"util":90}],145:[function(require,module,exports){
+},{"./_stream_duplex":147,"./internal/streams/BufferList":152,"./internal/streams/destroy":153,"./internal/streams/stream":154,"_process":142,"core-util-is":100,"events":105,"inherits":110,"isarray":121,"process-nextick-args":141,"safe-buffer":162,"string_decoder/":155,"util":95}],150:[function(require,module,exports){
@@ -58681,7 +60078,7 @@ if(ts.transforming)throw new Error('Calling transform done when still transformi
return stream.push(null);
}
-},{"./_stream_duplex":142,"core-util-is":95,"inherits":105}],146:[function(require,module,exports){
+},{"./_stream_duplex":147,"core-util-is":100,"inherits":110}],151:[function(require,module,exports){
(function(process,global,setImmediate){
@@ -59348,7 +60745,7 @@ this.end();
cb(err);
};
}).call(this,require('_process'),typeof global!=="undefined"?global:typeof self!=="undefined"?self:typeof window!=="undefined"?window:{},require("timers").setImmediate);
-},{"./_stream_duplex":142,"./internal/streams/destroy":148,"./internal/streams/stream":149,"_process":137,"core-util-is":95,"inherits":105,"process-nextick-args":136,"safe-buffer":157,"timers":163,"util-deprecate":164}],147:[function(require,module,exports){
+},{"./_stream_duplex":147,"./internal/streams/destroy":153,"./internal/streams/stream":154,"_process":142,"core-util-is":100,"inherits":110,"process-nextick-args":141,"safe-buffer":162,"timers":168,"util-deprecate":169}],152:[function(require,module,exports){
'use strict';
@@ -59423,7 +60820,7 @@ return ret;
return BufferList;
}();
-},{"safe-buffer":157}],148:[function(require,module,exports){
+},{"safe-buffer":162}],153:[function(require,module,exports){
'use strict';
@@ -59496,10 +60893,10 @@ module.exports={
destroy:destroy,
undestroy:undestroy};
-},{"process-nextick-args":136}],149:[function(require,module,exports){
+},{"process-nextick-args":141}],154:[function(require,module,exports){
module.exports=require('events').EventEmitter;
-},{"events":100}],150:[function(require,module,exports){
+},{"events":105}],155:[function(require,module,exports){
'use strict';
var Buffer=require('safe-buffer').Buffer;
@@ -59772,10 +61169,10 @@ return buf.toString(this.encoding);
function simpleEnd(buf){
return buf&&buf.length?this.write(buf):'';
}
-},{"safe-buffer":157}],151:[function(require,module,exports){
+},{"safe-buffer":162}],156:[function(require,module,exports){
module.exports=require('./readable').PassThrough;
-},{"./readable":152}],152:[function(require,module,exports){
+},{"./readable":157}],157:[function(require,module,exports){
exports=module.exports=require('./lib/_stream_readable.js');
exports.Stream=exports;
exports.Readable=exports;
@@ -59784,13 +61181,13 @@ exports.Duplex=require('./lib/_stream_duplex.js');
exports.Transform=require('./lib/_stream_transform.js');
exports.PassThrough=require('./lib/_stream_passthrough.js');
-},{"./lib/_stream_duplex.js":142,"./lib/_stream_passthrough.js":143,"./lib/_stream_readable.js":144,"./lib/_stream_transform.js":145,"./lib/_stream_writable.js":146}],153:[function(require,module,exports){
+},{"./lib/_stream_duplex.js":147,"./lib/_stream_passthrough.js":148,"./lib/_stream_readable.js":149,"./lib/_stream_transform.js":150,"./lib/_stream_writable.js":151}],158:[function(require,module,exports){
module.exports=require('./readable').Transform;
-},{"./readable":152}],154:[function(require,module,exports){
+},{"./readable":157}],159:[function(require,module,exports){
module.exports=require('./lib/_stream_writable.js');
-},{"./lib/_stream_writable.js":146}],155:[function(require,module,exports){
+},{"./lib/_stream_writable.js":151}],160:[function(require,module,exports){
var URL=require('url').URL;
@@ -60213,13 +61610,13 @@ return this._sitemaps.slice(0);
module.exports=Robots;
-},{"url":"url"}],156:[function(require,module,exports){
+},{"url":"url"}],161:[function(require,module,exports){
var Robots=require('./Robots');
module.exports=function(url,contents){
return new Robots(url,contents);
};
-},{"./Robots":155}],157:[function(require,module,exports){
+},{"./Robots":160}],162:[function(require,module,exports){
var buffer=require('buffer');
var Buffer=buffer.Buffer;
@@ -60283,7 +61680,7 @@ throw new TypeError('Argument must be a number');
return buffer.SlowBuffer(size);
};
-},{"buffer":94}],158:[function(require,module,exports){
+},{"buffer":99}],163:[function(require,module,exports){
(function(process){
exports=module.exports=SemVer;
@@ -61490,7 +62887,7 @@ return parsed&&parsed.prerelease.length?parsed.prerelease:null;
}
}).call(this,require('_process'));
-},{"_process":137}],159:[function(require,module,exports){
+},{"_process":142}],164:[function(require,module,exports){
(function(Buffer){
'use strict';
@@ -61732,7 +63129,7 @@ create:frame};
}).call(this,require("buffer").Buffer);
-},{"buffer":94,"jpeg-js":117}],160:[function(require,module,exports){
+},{"buffer":99,"jpeg-js":122}],165:[function(require,module,exports){
'use strict';
const frame=require('./frame');
@@ -61802,7 +63199,7 @@ return calculateValues(frames,data);
});
};
-},{"./frame":159,"./speed-index":161}],161:[function(require,module,exports){
+},{"./frame":164,"./speed-index":166}],166:[function(require,module,exports){
'use strict';
const imageSSIM=require('image-ssim');
@@ -62074,7 +63471,7 @@ calculatePerceptualProgress,
calculateSpeedIndexes};
-},{"image-ssim":104}],162:[function(require,module,exports){
+},{"image-ssim":109}],167:[function(require,module,exports){
@@ -62203,7 +63600,7 @@ dest.emit('pipe',source);
return dest;
};
-},{"events":100,"inherits":105,"readable-stream/duplex.js":141,"readable-stream/passthrough.js":151,"readable-stream/readable.js":152,"readable-stream/transform.js":153,"readable-stream/writable.js":154}],163:[function(require,module,exports){
+},{"events":105,"inherits":110,"readable-stream/duplex.js":146,"readable-stream/passthrough.js":156,"readable-stream/readable.js":157,"readable-stream/transform.js":158,"readable-stream/writable.js":159}],168:[function(require,module,exports){
(function(setImmediate,clearImmediate){
var nextTick=require('process/browser.js').nextTick;
var apply=Function.prototype.apply;
@@ -62282,7 +63679,7 @@ exports.clearImmediate=typeof clearImmediate==="function"?clearImmediate:functio
delete immediateIds[id];
};
}).call(this,require("timers").setImmediate,require("timers").clearImmediate);
-},{"process/browser.js":137,"timers":163}],164:[function(require,module,exports){
+},{"process/browser.js":142,"timers":168}],169:[function(require,module,exports){
(function(global){
@@ -62353,15 +63750,103 @@ return String(val).toLowerCase()==='true';
}
}).call(this,typeof global!=="undefined"?global:typeof self!=="undefined"?self:typeof window!=="undefined"?window:{});
-},{}],165:[function(require,module,exports){
-arguments[4][86][0].apply(exports,arguments);
-},{"dup":86}],166:[function(require,module,exports){
-arguments[4][87][0].apply(exports,arguments);
-},{"./support/isBuffer":165,"_process":137,"dup":87,"inherits":105}],167:[function(require,module,exports){
+},{}],170:[function(require,module,exports){
+arguments[4][91][0].apply(exports,arguments);
+},{"dup":91}],171:[function(require,module,exports){
+arguments[4][92][0].apply(exports,arguments);
+},{"./support/isBuffer":170,"_process":142,"dup":92,"inherits":110}],172:[function(require,module,exports){
module.exports={
-"version":"4.3.1"};
+"version":"5.1.0"};
+
+},{}],173:[function(require,module,exports){
+
+
+
+
+
+
+'use strict';
+
+
+const stackPacks=[
+require('./packs/wordpress.js')];
+
+
+module.exports=stackPacks;
+
+},{"./packs/wordpress.js":174}],174:[function(require,module,exports){
+(function(__filename){
+
+
+
+
+
+
+
+'use strict';
+
+const i18n=require('../../lighthouse-core/lib/i18n/i18n.js');
+
+const wordpressIcon=`data:image/svg+xml,%3Csvg viewBox='0 0 122.5 122.5' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='%232f3439'%3E%3Cpath d='M8.7 61.3c0 20.8 12.1 38.7 29.6 47.3l-25-68.7c-3 6.5-4.6 13.7-4.6 21.4zM96.7 58.6c0-6.5-2.3-11-4.3-14.5-2.7-4.3-5.2-8-5.2-12.3 0-4.8 3.7-9.3 8.9-9.3h.7a52.4 52.4 0 0 0-79.4 9.9h3.3c5.5 0 14-.6 14-.6 2.9-.2 3.2 4 .4 4.3 0 0-2.9.4-6 .5l19.1 57L59.7 59l-8.2-22.5c-2.8-.1-5.5-.5-5.5-.5-2.8-.1-2.5-4.5.3-4.3 0 0 8.7.7 13.9.7 5.5 0 14-.7 14-.7 2.8-.2 3.2 4 .3 4.3 0 0-2.8.4-6 .5l19 56.5 5.2-17.5c2.3-7.3 4-12.5 4-17z'/%3E%3Cpath d='M62.2 65.9l-15.8 45.8a52.6 52.6 0 0 0 32.3-.9l-.4-.7zM107.4 36a49.6 49.6 0 0 1-3.6 24.2l-16.1 46.5A52.5 52.5 0 0 0 107.4 36z'/%3E%3Cpath d='M61.3 0a61.3 61.3 0 1 0 .1 122.7A61.3 61.3 0 0 0 61.3 0zm0 119.7a58.5 58.5 0 1 1 .1-117 58.5 58.5 0 0 1-.1 117z'/%3E%3C/g%3E%3C/svg%3E`;
+
+const UIStrings={
+
+unused_css_rules:'Consider reducing, or switching, the number of [WordPress plugins](https://wordpress.org/plugins/) loading unused CSS in your page. To identify plugins that are adding extraneous CSS, try running [code coverage](https://developers.google.com/web/updates/2017/04/devtools-release-notes#coverage) in Chrome DevTools. You can identify the theme/plugin responsible from the URL of the stylesheet. Look out for plugins that have many stylesheets in the list which have a lot of red in code coverage. A plugin should only enqueue a stylesheet if it is actually used on the page.',
+
+uses_webp_images:'Consider using a [plugin](https://wordpress.org/plugins/search/convert+webp/) or service that will automatically convert your uploaded images to the optimal formats.',
+
+offscreen_images:'Install a [lazy-load WordPress plugin](https://wordpress.org/plugins/search/lazy+load/) that provides the ability to defer any offscreen images, or switch to a theme that provides that functionality. Also consider using [the AMP plugin](https://wordpress.org/plugins/amp/).',
+
+total_byte_weight:'Consider showing excerpts in your post lists (e.g. via the more tag), reducing the number of posts shown on a given page, breaking your long posts into multiple pages, or using a plugin to lazy-load comments.',
+
+render_blocking_resources:'There are a number of WordPress plugins that can help you [inline critical assets](https://wordpress.org/plugins/search/critical+css/) or [defer less important resources](https://wordpress.org/plugins/search/defer+css+javascript/). Beware that optimizations provided by these plugins may break features of your theme or plugins, so you will likely need to make code changes.',
+
+unminified_css:'A number of [WordPress plugins](https://wordpress.org/plugins/search/minify+css/) can speed up your site by concatenating, minifying, and compressing your styles. You may also want to use a build process to do this minification up-front if possible.',
+
+unminified_javascript:'A number of [WordPress plugins](https://wordpress.org/plugins/search/minify+javascript/) can speed up your site by concatenating, minifying, and compressing your scripts. You may also want to use a build process to do this minification up front if possible.',
+
+efficient_animated_content:'Consider uploading your GIF to a service which will make it available to embed as an HTML5 video.',
+
+unused_javascript:'Consider reducing, or switching, the number of [WordPress plugins](https://wordpress.org/plugins/) loading unused JavaScript in your page. To identify plugins that are adding extraneous JS, try running [code coverage](https://developers.google.com/web/updates/2017/04/devtools-release-notes#coverage) in Chrome DevTools. You can identify the theme/plugin responsible from the URL of the script. Look out for plugins that have many scripts in the list which have a lot of red in code coverage. A plugin should only enqueue a script if it is actually used on the page.',
+
+uses_long_cache_ttl:'Read about [Browser Caching in WordPress](https://codex.wordpress.org/WordPress_Optimization#Browser_Caching).',
+
+uses_optimized_images:'Consider using an [image optimization WordPress plugin](https://wordpress.org/plugins/search/optimize+images/) that compresses your images while retaining quality.',
+
+uses_text_compression:'You can enable text compression in your web server configuration.',
+
+uses_responsive_images:'Upload images directly through the [media library](https://codex.wordpress.org/Media_Library_Screen) to ensure that the required image sizes are available, and then insert them from the media library or use the image widget to ensure the optimal image sizes are used (including those for the responsive breakpoints). Avoid using `Full Size` images unless the dimensions are adequate for their usage. [Learn More](https://codex.wordpress.org/Inserting_Images_into_Posts_and_Pages#Image_Size).',
+
+time_to_first_byte:'Themes, plugins, and server specifications all contribute to server response time. Consider finding a more optimized theme, carefully selecting an optimization plugin, and/or upgrading your server.'};
+
+
+const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-},{}],168:[function(require,module,exports){
+module.exports={
+id:'wordpress',
+iconDataURL:wordpressIcon,
+title:'WordPress',
+descriptions:{
+'unused-css-rules':str_(UIStrings.unused_css_rules),
+'uses-webp-images':str_(UIStrings.uses_webp_images),
+'offscreen-images':str_(UIStrings.offscreen_images),
+'total-byte-weight':str_(UIStrings.total_byte_weight),
+'render-blocking-resources':str_(UIStrings.render_blocking_resources),
+'unminified-css':str_(UIStrings.unminified_css),
+'unminified-javascript':str_(UIStrings.unminified_javascript),
+'efficient-animated-content':str_(UIStrings.efficient_animated_content),
+'unused-javascript':str_(UIStrings.unused_javascript),
+'uses-long-cache-ttl':str_(UIStrings.uses_long_cache_ttl),
+'uses-optimized-images':str_(UIStrings.uses_optimized_images),
+'uses-text-compression':str_(UIStrings.uses_text_compression),
+'uses-responsive-images':str_(UIStrings.uses_responsive_images),
+'time-to-first-byte':str_(UIStrings.time_to_first_byte)}};
+
+
+module.exports.UIStrings=UIStrings;
+
+}).call(this,"/stack-packs/packs/wordpress.js");
+},{"../../lighthouse-core/lib/i18n/i18n.js":66}],175:[function(require,module,exports){
module.exports={
"npm":{
"angular":[
@@ -62497,18 +63982,6 @@ module.exports={
const Util=require('../report/html/renderer/util.js');
-
-const URL=typeof self!=='undefined'&&self.URL||
-require('url').URL;
-
-
-
-
-const listOfTlds=[
-'com','co','gov','edu','ac','org','go','gob','or','net','in','ne','nic','gouv',
-'web','spb','blog','jus','kiev','mil','wi','qc','ca','bel','on'];
-
-
const allowedProtocols=[
'https:','http:','chrome:','chrome-extension:'];
@@ -62589,28 +64062,12 @@ return null;
-static getTld(hostname){
-const tlds=hostname.split('.').slice(-2);
-
-if(!listOfTlds.includes(tlds[0])){
-return`.${tlds[tlds.length-1]}`;
-}
-
-return`.${tlds.join('.')}`;
-}
-
-
-
-
-
-
-
static rootDomainsMatch(urlA,urlB){
let urlAInfo;
let urlBInfo;
try{
-urlAInfo=new URL(urlA);
-urlBInfo=new URL(urlB);
+urlAInfo=Util.createOrReturnURL(urlA);
+urlBInfo=Util.createOrReturnURL(urlB);
}catch(err){
return false;
}
@@ -62619,14 +64076,9 @@ if(!urlAInfo.hostname||!urlBInfo.hostname){
return false;
}
-const tldA=URLShim.getTld(urlAInfo.hostname);
-const tldB=URLShim.getTld(urlBInfo.hostname);
-
-const urlARootDomain=urlAInfo.hostname.replace(new RegExp(`${tldA}$`),'').
-split('.').splice(-1)[0];
-const urlBRootDomain=urlBInfo.hostname.replace(new RegExp(`${tldB}$`),'').
-split('.').splice(-1)[0];
+const urlARootDomain=Util.getRootDomain(urlAInfo);
+const urlBRootDomain=Util.getRootDomain(urlBInfo);
return urlARootDomain===urlBRootDomain;
}
@@ -62700,4 +64152,4 @@ URLShim.INVALID_URL_DEBUG_STRING=
module.exports=URLShim;
-},{"../report/html/renderer/util.js":80,"url":"url"}]},{},[1]); \ No newline at end of file
+},{"../report/html/renderer/util.js":85}]},{},[1]); \ No newline at end of file
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/bindings/bindings_strings.grdp b/chromium/third_party/blink/renderer/devtools/front_end/bindings/bindings_strings.grdp
new file mode 100644
index 00000000000..dd879ed08e5
--- /dev/null
+++ b/chromium/third_party/blink/renderer/devtools/front_end/bindings/bindings_strings.grdp
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<grit-part>
+ <message name="IDS_DEVTOOLS_412dac8227bbaf752fecaad8826f20e6" desc="">
+ LiveEdit failed: <ph name="ERROR">$1s</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_d3ff22990e37ccce8a501ffba38626b7" desc="">
+ LiveEdit compile failed: <ph name="EXCEPTIONDETAILS_TEXT">$1s</ph>
+ </message>
+</grit-part> \ No newline at end of file
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/browser_debugger/browser_debugger_strings.grdp b/chromium/third_party/blink/renderer/devtools/front_end/browser_debugger/browser_debugger_strings.grdp
new file mode 100644
index 00000000000..1d7528f48bf
--- /dev/null
+++ b/chromium/third_party/blink/renderer/devtools/front_end/browser_debugger/browser_debugger_strings.grdp
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="utf-8"?>
+<grit-part>
+ <message name="IDS_DEVTOOLS_0ca08f8f4a8a19f7f1ae87c119494327" desc="">
+ Overrides
+ </message>
+ <message name="IDS_DEVTOOLS_1106d01848580ffc52dd36e2d60316d9" desc="">
+ XHR/fetch Breakpoints
+ </message>
+ <message name="IDS_DEVTOOLS_193cfc9be3b995831c6af2fea6650e60" desc="">
+ Page
+ </message>
+ <message name="IDS_DEVTOOLS_2daf59f0ff992924e42c14c1e674bd6a" desc="">
+ Attribute modified
+ </message>
+ <message name="IDS_DEVTOOLS_30d67fd6c32c9a9ff5ecb4472b44ed54" desc="">
+ Break when URL contains:
+ </message>
+ <message name="IDS_DEVTOOLS_340641a167ad6da1bcb4016357f4695d" desc="">
+ Content scripts
+ </message>
+ <message name="IDS_DEVTOOLS_39c145d69ad05e44e74017346c116251" desc="">
+ Remove all DOM breakpoints
+ </message>
+ <message name="IDS_DEVTOOLS_47bda3033cb8fe0e76c45c293db011b5" desc="">
+ No breakpoints
+ </message>
+ <message name="IDS_DEVTOOLS_59eaf6955f44a94237b6d26911c1d983" desc="">
+ Break on
+ </message>
+ <message name="IDS_DEVTOOLS_626585724f35f9d9fce0bd36525cb7de" desc="">
+ DOM Breakpoint
+ </message>
+ <message name="IDS_DEVTOOLS_63a6a88c066880c5ac42394a22803ca6" desc="">
+ Refresh
+ </message>
+ <message name="IDS_DEVTOOLS_66b74432bdc2797086f419010cc5ff86" desc="">
+ DOM Breakpoints
+ </message>
+ <message name="IDS_DEVTOOLS_6ba3a9ac3e0d57683c56299484b7ee3b" desc="">
+ Remove all breakpoints
+ </message>
+ <message name="IDS_DEVTOOLS_b4e79b551a1ceae24b7de243ab1fd27c" desc="">
+ Add breakpoint
+ </message>
+ <message name="IDS_DEVTOOLS_b839f802a330e4d4145cb182e6767f45" desc="">
+ Any XHR or fetch
+ </message>
+ <message name="IDS_DEVTOOLS_c22470110316d6334bed53ae61a08f59" desc="">
+ URL contains &quot;<ph name="URL">$1s</ph>&quot;
+ </message>
+ <message name="IDS_DEVTOOLS_c4bd9c57c6b315e3f7374cf77143ca58" desc="">
+ Subtree modified
+ </message>
+ <message name="IDS_DEVTOOLS_d5bfaaca8e28f8b9b9211038f86a4494" desc="">
+ Remove breakpoint
+ </message>
+ <message name="IDS_DEVTOOLS_e30c4292775f68b2bc9eb3957a69f899" desc="">
+ Global Listeners
+ </message>
+ <message name="IDS_DEVTOOLS_ebdb33cde9015fa4b294220ee89cff00" desc="">
+ Event Listener Breakpoints
+ </message>
+ <message name="IDS_DEVTOOLS_f80938ab8ce27f3427af09c97a718fff" desc="">
+ Node removed
+ </message>
+</grit-part> \ No newline at end of file
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/browser_sdk/browser_sdk_strings.grdp b/chromium/third_party/blink/renderer/devtools/front_end/browser_sdk/browser_sdk_strings.grdp
new file mode 100644
index 00000000000..27e6fc69693
--- /dev/null
+++ b/chromium/third_party/blink/renderer/devtools/front_end/browser_sdk/browser_sdk_strings.grdp
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<grit-part>
+ <message name="IDS_DEVTOOLS_07c7413a65777a3d70e32ea32dafa509" desc="">
+ Do not preserve log on page reload / navigation
+ </message>
+ <message name="IDS_DEVTOOLS_6aed54027cf3a260de904a43cf439cc9" desc="">
+ Preserve log on page reload / navigation
+ </message>
+ <message name="IDS_DEVTOOLS_edd24cce7afedea5a1b2f90675880687" desc="">
+ Preserve log
+ </message>
+ <message name="IDS_DEVTOOLS_eec89088ee408b80387155272b113256" desc="">
+ Network
+ </message>
+</grit-part> \ No newline at end of file
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/changes/changes_strings.grdp b/chromium/third_party/blink/renderer/devtools/front_end/changes/changes_strings.grdp
new file mode 100644
index 00000000000..2da2df97d6b
--- /dev/null
+++ b/chromium/third_party/blink/renderer/devtools/front_end/changes/changes_strings.grdp
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<grit-part>
+ <message name="IDS_DEVTOOLS_025502db49a6cf61a8245998129bd973" desc="">
+ <ph name="DELETIONS">$1s</ph> deletions (-)
+ </message>
+ <message name="IDS_DEVTOOLS_5c2892cb638ec999fe22612587cd4a00" desc="">
+ No changes
+ </message>
+ <message name="IDS_DEVTOOLS_70c85e43e99bc0cfcbb656123306eb19" desc="">
+ <ph name="INSERTIONS">$1s</ph> insertion (+),
+ </message>
+ <message name="IDS_DEVTOOLS_af2c230293677261fe33ba6d3fbf02e3" desc="">
+ <ph name="INSERTIONS">$1s</ph> insertions (+),
+ </message>
+ <message name="IDS_DEVTOOLS_c112bb3542e98308d12d5ecb10a67abc" desc="">
+ Changes
+ </message>
+ <message name="IDS_DEVTOOLS_c73e4e53c15d9971d9293fcff6c0d8c0" desc="">
+ ( … Skipping <ph name="LINES_LENGTH___PADDINGLINES____">$1d</ph> matching lines … )
+ </message>
+ <message name="IDS_DEVTOOLS_ca012662d53a8bde28b4d82722aaff7e" desc="">
+ Changes drawer
+ </message>
+ <message name="IDS_DEVTOOLS_df5f7764a0991b372d30c55eb57f6a55" desc="">
+ Revert all changes
+ </message>
+ <message name="IDS_DEVTOOLS_e0e5ea9203300d2eb8ced39dd88c214e" desc="">
+ <ph name="DELETIONS">$1s</ph> deletion (-)
+ </message>
+ <message name="IDS_DEVTOOLS_f550ec70278cc72604795d91ff8dcd30" desc="">
+ Binary data
+ </message>
+ <message name="IDS_DEVTOOLS_fa6711f918fe2018131a4ad0380b9e56" desc="">
+ <ph name="THIS_UISOURCECODE_DISPLAYNAME__">$1s</ph> (from source map)
+ </message>
+</grit-part> \ No newline at end of file
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/color_picker/color_picker_strings.grdp b/chromium/third_party/blink/renderer/devtools/front_end/color_picker/color_picker_strings.grdp
new file mode 100644
index 00000000000..2ddfef30498
--- /dev/null
+++ b/chromium/third_party/blink/renderer/devtools/front_end/color_picker/color_picker_strings.grdp
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="utf-8"?>
+<grit-part>
+ <message name="IDS_DEVTOOLS_146ffe2fd9fa5bec3b63b52543793ec7" desc="">
+ Show more
+ </message>
+ <message name="IDS_DEVTOOLS_158eabad9d23e8a99bbcfd6f411c575f" desc="">
+ Remove color
+ </message>
+ <message name="IDS_DEVTOOLS_1690e1c6a6b4c615cc36ab66570996b4" desc="">
+ Toggle color picker
+ </message>
+ <message name="IDS_DEVTOOLS_19dcdfb6d075db15609e75214f67189f" desc="">
+ Remove all to the right
+ </message>
+ <message name="IDS_DEVTOOLS_2e8882b1e1deaa1bb50cbdfe188755f6" desc="">
+ Copy color to clipboard
+ </message>
+ <message name="IDS_DEVTOOLS_38d7dc102a918c3b0031c9fde807308a" desc="">
+ Pick background color
+ </message>
+ <message name="IDS_DEVTOOLS_39186fc9ea0f3ccf697b31a288e0723f" desc="">
+ Toggle background color picker
+ </message>
+ <message name="IDS_DEVTOOLS_3b98e2dffc6cb06a89dcb0d5c60a0206" desc="">
+ AA
+ </message>
+ <message name="IDS_DEVTOOLS_74421a69b1bc40c166be4de5caf0b036" desc="">
+ Contrast ratio
+ </message>
+ <message name="IDS_DEVTOOLS_b201b2e7e7a20df48b625f20c2f0933e" desc="">
+ Color Palettes
+ </message>
+ <message name="IDS_DEVTOOLS_b74447172f9edfe492a21feee374c1fd" desc="">
+ Clear palette
+ </message>
+ <message name="IDS_DEVTOOLS_bbe0cb0a04956e97e8fc70f519d10e0d" desc="">
+ <ph name="PALETTE_COLORS_I_">$1s</ph>. Long-click to show alternate shades.
+ </message>
+ <message name="IDS_DEVTOOLS_c74ea6dbff701bfa23819583c52ebd97" desc="">
+ Show less
+ </message>
+ <message name="IDS_DEVTOOLS_ce82e07fa1f0521f5cee30e368fe2e73" desc="">
+ : <ph name="AA_TOFIXED___">$1s</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_d1e2107b34fa404fabd54bcce4fd858f" desc="">
+ Add to palette
+ </message>
+ <message name="IDS_DEVTOOLS_e1faffb3e614e6c2fba74296962386b7" desc="">
+ AAA
+ </message>
+</grit-part> \ No newline at end of file
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/color_picker/spectrum.css b/chromium/third_party/blink/renderer/devtools/front_end/color_picker/spectrum.css
index a46f872f897..7dc2a4a269e 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/color_picker/spectrum.css
+++ b/chromium/third_party/blink/renderer/devtools/front_end/color_picker/spectrum.css
@@ -27,12 +27,6 @@
flex: none;
}
-.spectrum-display-value {
- -webkit-user-select: text;
- display: inline-block;
- padding-left: 2px;
-}
-
.spectrum-hue {
top: 16px;
}
@@ -186,14 +180,6 @@
left: auto;
}
-.contrast-threshold-value {
- font-weight: bold;
-}
-
-.contrast-link {
- margin-left: 0.5em;
-}
-
.contrast-details-value {
color: #333;
margin: 1px 5px;
@@ -282,7 +268,7 @@
background-color: rgba(0, 0, 0, .5);
}
-.copy-color-icon {
+[is=ui-icon].icon-mask.copy-color-icon {
background-color: white;
}
@@ -324,16 +310,6 @@
text-align: center;
}
-.spectrum-palette-value {
- background-color: rgb(65, 75, 217);
- border-radius: 2px;
- margin-top: 12px;
- margin-left: 12px;
- width: 12px;
- height: 12px;
- display: inline-block;
-}
-
.spectrum-switcher {
border-radius: 2px;
height: 20px;
@@ -607,18 +583,3 @@ div.palette-preview {
.swatch.contrast [is=ui-icon] {
margin: -2px;
}
-
-button.background-color-picker {
- border: 0;
- padding: 0;
- background: none;
- position: relative;
- margin: 0;
-}
-
-button.background-color-picker.active [is=ui-icon].largeicon-eyedropper.icon-mask {
- background-color: hsl(218, 81%, 59%);
-}
-
-button.background-color-picker:hover [is=ui-icon].largeicon-eyedropper.icon-mask {
- background-color: #333;
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/common/UIString.js b/chromium/third_party/blink/renderer/devtools/front_end/common/UIString.js
index 7bd56dd539d..8845ed7b66a 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/common/UIString.js
+++ b/chromium/third_party/blink/renderer/devtools/front_end/common/UIString.js
@@ -84,6 +84,8 @@ Common.UIStringFormat = class {
}
};
+/** @type {!WeakMap<!Array<string>, string>} */
+Common._substitutionStrings = new WeakMap();
/**
* @param {!Array<string>|string} strings
@@ -93,13 +95,10 @@ Common.UIStringFormat = class {
self.ls = function(strings, vararg) {
if (typeof strings === 'string')
return strings;
- const values = Array.prototype.slice.call(arguments, 1);
- if (!values.length)
- return strings[0];
- let result = '';
- for (let i = 0; i < values.length; i++) {
- result += strings[i];
- result += '' + values[i];
+ let substitutionString = Common._substitutionStrings.get(strings);
+ if (!substitutionString) {
+ substitutionString = strings.join('%s');
+ Common._substitutionStrings.set(strings, substitutionString);
}
- return result + strings[values.length];
+ return Common.UIString(substitutionString, ...Array.prototype.slice.call(arguments, 1));
};
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/components/Linkifier.js b/chromium/third_party/blink/renderer/devtools/front_end/components/Linkifier.js
index c4845c3a860..d6a04090421 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/components/Linkifier.js
+++ b/chromium/third_party/blink/renderer/devtools/front_end/components/Linkifier.js
@@ -414,6 +414,7 @@ Components.Linkifier = class {
} else {
link.classList.add('devtools-link-prevent-click');
}
+ UI.ARIAUtils.markAsLink(link);
return link;
}
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/components/components_strings.grdp b/chromium/third_party/blink/renderer/devtools/front_end/components/components_strings.grdp
new file mode 100644
index 00000000000..0ad7f6d2471
--- /dev/null
+++ b/chromium/third_party/blink/renderer/devtools/front_end/components/components_strings.grdp
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<grit-part>
+ <message name="IDS_DEVTOOLS_013cf261f9ccf5d4f027bc001d0d1d0c" desc="">
+ (unknown)
+ </message>
+ <message name="IDS_DEVTOOLS_0b484cfcf50c8fabff48c0aad426f544" desc="">
+ Dock to left
+ </message>
+ <message name="IDS_DEVTOOLS_131c97f8ba5bc0277386d660a18f13b6" desc="">
+ Reveal in <ph name="DESTINATION">$1s</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_393c3f5ea8ad35c02691d507bdbb31b0" desc="">
+ Reveal
+ </message>
+ <message name="IDS_DEVTOOLS_7f52f5f786eb8d9bf9e56ce89fb3db3a" desc="">
+ Show 1 more frame
+ </message>
+ <message name="IDS_DEVTOOLS_93898e12951c906e5286ccb36d980ce5" desc="">
+ Blackbox script
+ </message>
+ <message name="IDS_DEVTOOLS_9df22f196a33acd0b372fe502de51211" desc="">
+ auto
+ </message>
+ <message name="IDS_DEVTOOLS_a498f0751d1221223efb0defc71cc804" desc="">
+ <ph name="RENDEREDWIDTH">$1s</ph> × <ph name="RENDEREDHEIGHT">$2s</ph> pixels
+ </message>
+ <message name="IDS_DEVTOOLS_b836d99a391a4d2baf6624f8f4acbfc0" desc="">
+ (intrinsic: <ph name="INTRINSICWIDTH">$1s</ph> × <ph name="INTRINSICHEIGHT">$2s</ph> pixels)
+ </message>
+ <message name="IDS_DEVTOOLS_b9dee6bade160c89fb7f0e539d453513" desc="">
+ Dock to bottom
+ </message>
+ <message name="IDS_DEVTOOLS_c3fe109bf99ade2d76a55e5737015e3e" desc="">
+ Stop blackboxing
+ </message>
+ <message name="IDS_DEVTOOLS_c850ae12703fa2b00eeaf8445ecf00ef" desc="">
+ Show <ph name="TOTALHIDDENCALLFRAMESCOUNT">$1s</ph> more frames
+ </message>
+ <message name="IDS_DEVTOOLS_d3d2e617335f08df83599665eef8a418" desc="">
+ Close
+ </message>
+ <message name="IDS_DEVTOOLS_e48081c5f0698efee665fbf8e9d123f9" desc="">
+ Open using <ph name="TITLE">$1s</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_e6cd0f8a4fe4fb9e08505b784e48caa2" desc="">
+ Link handling:
+ </message>
+ <message name="IDS_DEVTOOLS_f53944c3a55bdb5ad65c6226e358a626" desc="">
+ Undock into separate window
+ </message>
+ <message name="IDS_DEVTOOLS_fe7fb037b290768d6a6be30b237e183d" desc="">
+ Dock to right
+ </message>
+</grit-part> \ No newline at end of file
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/console/ConsoleView.js b/chromium/third_party/blink/renderer/devtools/front_end/console/ConsoleView.js
index 91419c0ccba..7600d80817e 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/console/ConsoleView.js
+++ b/chromium/third_party/blink/renderer/devtools/front_end/console/ConsoleView.js
@@ -146,6 +146,9 @@ Console.ConsoleView = class extends UI.VBox {
Common.settings.moduleSetting('consoleEagerEval'), ls`Eagerly evaluate text in the prompt`);
settingsToolbarRight.appendToolbarItem(eagerEvalCheckbox);
settingsToolbarRight.appendToolbarItem(new UI.ToolbarSettingCheckbox(this._consoleHistoryAutocompleteSetting));
+ const userGestureCheckbox =
+ new UI.ToolbarSettingCheckbox(Common.settings.moduleSetting('consoleUserActivationEval'));
+ settingsToolbarRight.appendToolbarItem(userGestureCheckbox);
if (!this._showSettingsPaneSetting.get())
settingsPane.element.classList.add('hidden');
this._showSettingsPaneSetting.addChangeListener(
@@ -225,10 +228,14 @@ Console.ConsoleView = class extends UI.VBox {
UI.context.addFlavorChangeListener(SDK.ExecutionContext, this._executionContextChanged, this);
this._messagesElement.addEventListener(
- 'mousedown', event => this._updateStickToBottomOnMouseDown(event.button === 2), false);
- this._messagesElement.addEventListener('mouseup', this._updateStickToBottomOnMouseUp.bind(this), false);
- this._messagesElement.addEventListener('mouseleave', this._updateStickToBottomOnMouseUp.bind(this), false);
+ 'mousedown', event => this._updateStickToBottomOnPointerDown(event.button === 2), false);
+ this._messagesElement.addEventListener('mouseup', this._updateStickToBottomOnPointerUp.bind(this), false);
+ this._messagesElement.addEventListener('mouseleave', this._updateStickToBottomOnPointerUp.bind(this), false);
this._messagesElement.addEventListener('wheel', this._updateStickToBottomOnWheel.bind(this), false);
+ this._messagesElement.addEventListener(
+ 'touchstart', this._updateStickToBottomOnPointerDown.bind(this, false), false);
+ this._messagesElement.addEventListener('touchend', this._updateStickToBottomOnPointerUp.bind(this), false);
+ this._messagesElement.addEventListener('touchcancel', this._updateStickToBottomOnPointerUp.bind(this), false);
SDK.consoleModel.addEventListener(SDK.ConsoleModel.Events.ConsoleCleared, this._consoleCleared, this);
SDK.consoleModel.addEventListener(SDK.ConsoleModel.Events.MessageAdded, this._onConsoleMessageAdded, this);
@@ -917,35 +924,8 @@ Console.ConsoleView = class extends UI.VBox {
_registerShortcuts() {
this._shortcuts = {};
-
- const shortcut = UI.KeyboardShortcut;
- const section = UI.shortcutsScreen.section(Common.UIString('Console'));
-
- const shortcutL = shortcut.makeDescriptor('l', UI.KeyboardShortcut.Modifiers.Ctrl);
- let keys = [shortcutL];
- if (Host.isMac()) {
- const shortcutK = shortcut.makeDescriptor('k', UI.KeyboardShortcut.Modifiers.Meta);
- keys.unshift(shortcutK);
- }
- section.addAlternateKeys(keys, Common.UIString('Clear console'));
-
- keys = [shortcut.makeDescriptor(shortcut.Keys.Tab), shortcut.makeDescriptor(shortcut.Keys.Right)];
- section.addRelatedKeys(keys, Common.UIString('Accept suggestion'));
-
- const shortcutU = shortcut.makeDescriptor('u', UI.KeyboardShortcut.Modifiers.Ctrl);
- this._shortcuts[shortcutU.key] = this._clearPromptBackwards.bind(this);
- section.addAlternateKeys([shortcutU], Common.UIString('Clear console prompt'));
-
- keys = [shortcut.makeDescriptor(shortcut.Keys.Down), shortcut.makeDescriptor(shortcut.Keys.Up)];
- section.addRelatedKeys(keys, Common.UIString('Next/previous line'));
-
- if (Host.isMac()) {
- keys =
- [shortcut.makeDescriptor('N', shortcut.Modifiers.Alt), shortcut.makeDescriptor('P', shortcut.Modifiers.Alt)];
- section.addRelatedKeys(keys, Common.UIString('Next/previous command'));
- }
-
- section.addKey(shortcut.makeDescriptor(shortcut.Keys.Enter), Common.UIString('Execute command'));
+ this._shortcuts[UI.KeyboardShortcut.makeKey('u', UI.KeyboardShortcut.Modifiers.Ctrl)] =
+ this._clearPromptBackwards.bind(this);
}
_clearPromptBackwards() {
@@ -1169,7 +1149,7 @@ Console.ConsoleView = class extends UI.VBox {
/**
* @param {boolean=} isRightClick
*/
- _updateStickToBottomOnMouseDown(isRightClick) {
+ _updateStickToBottomOnPointerDown(isRightClick) {
this._muteViewportUpdates = !isRightClick;
this._viewport.setStickToBottom(false);
if (this._waitForScrollTimeout) {
@@ -1178,7 +1158,7 @@ Console.ConsoleView = class extends UI.VBox {
}
}
- _updateStickToBottomOnMouseUp() {
+ _updateStickToBottomOnPointerUp() {
if (!this._muteViewportUpdates)
return;
@@ -1208,8 +1188,8 @@ Console.ConsoleView = class extends UI.VBox {
}
_updateStickToBottomOnWheel() {
- this._updateStickToBottomOnMouseDown();
- this._updateStickToBottomOnMouseUp();
+ this._updateStickToBottomOnPointerDown();
+ this._updateStickToBottomOnPointerUp();
}
_promptTextChanged() {
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/console/consoleSidebar.css b/chromium/third_party/blink/renderer/devtools/front_end/console/consoleSidebar.css
index 63cfa80030f..2ea46476ef2 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/console/consoleSidebar.css
+++ b/chromium/third_party/blink/renderer/devtools/front_end/console/consoleSidebar.css
@@ -27,10 +27,6 @@
background-color: #555;
}
-[is=ui-icon].icon-warning {
- background: linear-gradient(45deg, hsla(48, 100%, 50%, 1), hsla(48, 70%, 50%, 1));
-}
-
li {
height: 24px;
}
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/console/console_strings.grdp b/chromium/third_party/blink/renderer/devtools/front_end/console/console_strings.grdp
new file mode 100644
index 00000000000..7d58b2c95a6
--- /dev/null
+++ b/chromium/third_party/blink/renderer/devtools/front_end/console/console_strings.grdp
@@ -0,0 +1,294 @@
+<?xml version="1.0" encoding="utf-8"?>
+<grit-part>
+ <message name="IDS_DEVTOOLS_02969932cf572213e2401893f4182af2" desc="">
+ Remove all expressions
+ </message>
+ <message name="IDS_DEVTOOLS_03342349032c8ef8f5898c49a088de55" desc="">
+ Accept suggestion
+ </message>
+ <message name="IDS_DEVTOOLS_047e62ee63b0c14a249a79bc6be0a493" desc="">
+ Do not group similar messages in console
+ </message>
+ <message name="IDS_DEVTOOLS_04c247c2ba261c7511e4f479728bd7ea" desc="">
+ Do not treat evaluation as user activation
+ </message>
+ <message name="IDS_DEVTOOLS_0511551e6cf7d61acd9b62f9304efa93" desc="">
+ Do not clear log on page reload / navigation
+ </message>
+ <message name="IDS_DEVTOOLS_07213a0161f52846ab198be103b5ab43" desc="">
+ errors
+ </message>
+ <message name="IDS_DEVTOOLS_0a2f561bf52ee6d8cd2dda123c8f74fe" desc="">
+ Default levels
+ </message>
+ <message name="IDS_DEVTOOLS_0b03bf8af8380330766ad55ff2004a95" desc="">
+ Selected context only
+ </message>
+ <message name="IDS_DEVTOOLS_0bafe921e13474bf5fc3f1ad62496905" desc="">
+ [Intervention] <ph name="MESSAGETEXT">$1s</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_0bbce02e304562c295a1d57d66c296d3" desc="">
+ &lt;URL&gt;
+ </message>
+ <message name="IDS_DEVTOOLS_0eaadb4fcb48a0a0ed7bc9868be9fbaa" desc="">
+ Warning
+ </message>
+ <message name="IDS_DEVTOOLS_0fa06588bd5c83bd6f3b1734eefc6b16" desc="">
+ Hide messages from <ph name="NEW_COMMON_PARSEDURL_CONSOLEMESSAGE_URL__DISPLAYNAME">$1s</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_142329f312b9f9a97f9726342813dec2" desc="">
+ Next/previous line
+ </message>
+ <message name="IDS_DEVTOOLS_1a37d25ba6689d174f51ba8e2425fde6" desc="">
+ &lt;other&gt;
+ </message>
+ <message name="IDS_DEVTOOLS_1ebc7540a5327b857144f04cf1435b4e" desc="">
+ Replay XHR
+ </message>
+ <message name="IDS_DEVTOOLS_26649c8f3cadc9c0170f2443e6fc0252" desc="">
+ &lt;attribute&gt;
+ </message>
+ <message name="IDS_DEVTOOLS_278cf66841e1d342f3115006e82c5dd9" desc="">
+ Repeat <ph name="THIS__REPEATCOUNT">$1s</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_2a5a5a712c2bfb6c506cb669b8d81709" desc="">
+ Clear console history
+ </message>
+ <message name="IDS_DEVTOOLS_2b76cfdf5b790de0a27ba7fc58a919c8" desc="">
+ Warning <ph name="ACCESSIBLENAME">$1s</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_2b918231caba2d08f2223246ac06222c" desc="">
+ Copy visible styled selection
+ </message>
+ <message name="IDS_DEVTOOLS_2c7aea4237e25b4f8ee3b0bf77d6fed0" desc="">
+ verbose
+ </message>
+ <message name="IDS_DEVTOOLS_2d82fe5a069854a35204b4e64e8e08ae" desc="">
+ Console settings
+ </message>
+ <message name="IDS_DEVTOOLS_2f20693f226f0545a8b68ef4f59fb02e" desc="">
+ [Violation] <ph name="MESSAGETEXT">$1s</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_375855385115b292f160b5131495003d" desc="">
+ console.clear() was prevented due to &apos;Preserve log&apos;
+ </message>
+ <message name="IDS_DEVTOOLS_383b1deb90603a79d86f3ae82e55a9e2" desc="">
+ <ph name="THIS__HIDDENBYFILTERCOUNT">$1s</ph> hidden
+ </message>
+ <message name="IDS_DEVTOOLS_3879149292f9af4469cec013785d6dfd" desc="">
+ warnings
+ </message>
+ <message name="IDS_DEVTOOLS_388024c56c38c3d1c635b09a2b28b8ac" desc="">
+ Value below was evaluated just now.
+ </message>
+ <message name="IDS_DEVTOOLS_3cec12c2368b11d9585823ac9d631edb" desc="">
+ Hide all
+ </message>
+ <message name="IDS_DEVTOOLS_4059b0251f66a18cb56f544728796875" desc="">
+ Info
+ </message>
+ <message name="IDS_DEVTOOLS_405b66a12f196edc715fe9f3f2c84b04" desc="">
+ Hide timestamps
+ </message>
+ <message name="IDS_DEVTOOLS_411f3a865d83fba7f4772925666cfa7c" desc="">
+ Hide network messages
+ </message>
+ <message name="IDS_DEVTOOLS_468312e6ff2ebf1b104e5d7f489de74d" desc="">
+ Eagerly evaluate text in the prompt
+ </message>
+ <message name="IDS_DEVTOOLS_4c8b530161336f95d0c2f13337556954" desc="">
+ Show network messages
+ </message>
+ <message name="IDS_DEVTOOLS_4cad9e20fde3f8991c5dd1d6a0fe13e7" desc="">
+ Remove expression
+ </message>
+ <message name="IDS_DEVTOOLS_4d1b0b75a9737b7dcdc3a15a84fe856b" desc="">
+ Searching…
+ </message>
+ <message name="IDS_DEVTOOLS_4f9afe303d0e8c68e3518756e1734924" desc="">
+ Clear console prompt
+ </message>
+ <message name="IDS_DEVTOOLS_53f0fca28a013c116a1df533d9bdf764" desc="">
+ [Deprecation] <ph name="MESSAGETEXT">$1s</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_5ef0c737746fae2ca90e66c39333f8f6" desc="">
+ Errors
+ </message>
+ <message name="IDS_DEVTOOLS_5f8442a46861496e9d2a3d11be13692b" desc="">
+ Writing file…
+ </message>
+ <message name="IDS_DEVTOOLS_6047a6c9fb775557639afb3fbc90b4e7" desc="">
+ Log levels
+ </message>
+ <message name="IDS_DEVTOOLS_63e4e92bb7d207ca577b11c07f827279" desc="">
+ Extension
+ </message>
+ <message name="IDS_DEVTOOLS_650140bd73628d283d870d4648ae3324" desc="">
+ Find string in logs
+ </message>
+ <message name="IDS_DEVTOOLS_689202409e48743b914713f96d93947c" desc="">
+ Value
+ </message>
+ <message name="IDS_DEVTOOLS_6cdd8769d46bb96331ac4a96d3ea84b8" desc="">
+ Clear all messages with <ph name="UI_SHORTCUTREGISTRY_SHORTCUTTITLEFORACTION__CONSOLE_CLEAR__">$1s</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_6eed4ce2d5859b11dc44a5e3bd91af20" desc="">
+ Eager evaluation
+ </message>
+ <message name="IDS_DEVTOOLS_78e731027d8fd50ed642340b7c9a63b3" desc="">
+ message
+ </message>
+ <message name="IDS_DEVTOOLS_7a1920d61156abc05a60135aefe8bc67" desc="">
+ Default
+ </message>
+ <message name="IDS_DEVTOOLS_7b83d3f08fa392b79e3f553b585971cd" desc="">
+ warning
+ </message>
+ <message name="IDS_DEVTOOLS_7be1a30a7758269755609f1f7434d828" desc="">
+ Group similar messages in console
+ </message>
+ <message name="IDS_DEVTOOLS_84d0c431d1472a0609d69b39dcb3a287" desc="">
+ (index)
+ </message>
+ <message name="IDS_DEVTOOLS_902b0d55fddef6f8d651fe1035b7d4bd" desc="">
+ Error
+ </message>
+ <message name="IDS_DEVTOOLS_93977f1310f482395375a9950b512462" desc="">
+ Eagerly evaluate console prompt text
+ </message>
+ <message name="IDS_DEVTOOLS_95c74dafb449d894014c2eb1d80ded01" desc="">
+ Edit expression
+ </message>
+ <message name="IDS_DEVTOOLS_988aa266ba49ce9da4c7e10f4b477ec4" desc="">
+ Next/previous command
+ </message>
+ <message name="IDS_DEVTOOLS_9aae9fe27dbf2db0ad90762b5b59d3a7" desc="">
+ Clear console
+ </message>
+ <message name="IDS_DEVTOOLS_9d8c209e49e328528c39c273798e98c9" desc="">
+ Save as...
+ </message>
+ <message name="IDS_DEVTOOLS_a092483ed730ed040e5df5776dca49e5" desc="">
+ Log XMLHttpRequests
+ </message>
+ <message name="IDS_DEVTOOLS_a1948ddb50d0bbd31e36f1fbc45479a0" desc="">
+ Autocomplete from history
+ </message>
+ <message name="IDS_DEVTOOLS_a1a6657be79cc0fc1e9b23b9e108f043" desc="">
+ Expression
+ </message>
+ <message name="IDS_DEVTOOLS_a3eb3c95c4cb8e06fd3682c1f0d70bc0" desc="">
+ Only show messages from the current context (top, iframe, worker, extension)
+ </message>
+ <message name="IDS_DEVTOOLS_abba8787b900565790eae8ceceed3c2b" desc="">
+ Do not autocomplete from history
+ </message>
+ <message name="IDS_DEVTOOLS_ac17bdcb3f6c8d86ccb64aff1ab8db7c" desc="">
+ Console was cleared
+ </message>
+ <message name="IDS_DEVTOOLS_ac2671ba859591dd83845c680aaa144e" desc="">
+ user messages
+ </message>
+ <message name="IDS_DEVTOOLS_ace3e0307b2ce23a81b18747fc5f555f" desc="">
+ Function was resolved from bound function.
+ </message>
+ <message name="IDS_DEVTOOLS_b184e7a44bed11a41d9c104529010e23" desc="">
+ <ph name="THIS__LEVELLABELS_NAME_">$1s</ph> only
+ </message>
+ <message name="IDS_DEVTOOLS_b2f8489bbd55a4e9b9edbbbfe49edf70" desc="">
+ not available
+ </message>
+ <message name="IDS_DEVTOOLS_b5735f8c6deff6306a2216612ca80f0e" desc="">
+ JavaScript contexts
+ </message>
+ <message name="IDS_DEVTOOLS_bafd7322c6e97d25b6299b5d6fe8920b" desc="">
+ No
+ </message>
+ <message name="IDS_DEVTOOLS_bb63b17b21e67aa2cc30cf01bae36695" desc="">
+ Execute command
+ </message>
+ <message name="IDS_DEVTOOLS_bccaa4aa80831b76c11240a16447975f" desc="">
+ Console
+ </message>
+ <message name="IDS_DEVTOOLS_c0274fa278f2e0dfef862234e0eb9b8b" desc="">
+ &lt;exception&gt;
+ </message>
+ <message name="IDS_DEVTOOLS_c9818b2c0890a205d294a2b31354f8b4" desc="">
+ All levels
+ </message>
+ <message name="IDS_DEVTOOLS_ca3c4b269c23985d3c1204c203ad84d8" desc="">
+ Group similar
+ </message>
+ <message name="IDS_DEVTOOLS_ca6ceb8e597abb1298b84b1aaadc229b" desc="">
+ Show timestamps
+ </message>
+ <message name="IDS_DEVTOOLS_caf037034c3205725511c1216f772402" desc="">
+ &lt;some&gt; event
+ </message>
+ <message name="IDS_DEVTOOLS_caf9b6b99962bf5c2264824231d7a40c" desc="">
+ info
+ </message>
+ <message name="IDS_DEVTOOLS_cb5e100e5a9a3e7f6d1fd97512215282" desc="">
+ error
+ </message>
+ <message name="IDS_DEVTOOLS_cf3eed6aa30c47cec1321a835dc7b1ac" desc="">
+ Treat evaluation as user activation
+ </message>
+ <message name="IDS_DEVTOOLS_d0990066fbdfd3753fb45300d57e4364" desc="">
+ Hide network
+ </message>
+ <message name="IDS_DEVTOOLS_d35866a5d1161b48670e28e8c8550e89" desc="">
+ Assertion failed:
+ </message>
+ <message name="IDS_DEVTOOLS_d3f526e5326c06d47ab12240d604f87a" desc="">
+ took &lt;N&gt;ms
+ </message>
+ <message name="IDS_DEVTOOLS_d4a9fa383ab700c5bdd6f31cf7df0faf" desc="">
+ Verbose
+ </message>
+ <message name="IDS_DEVTOOLS_d61de8e8b9dfdf0e7a52bf2e4fd23e72" desc="">
+ M&lt;XX&gt;
+ </message>
+ <message name="IDS_DEVTOOLS_d7746aa6b562c73487a4015eef3244e9" desc="">
+ IFrame
+ </message>
+ <message name="IDS_DEVTOOLS_d7778d0c64b6ba21494c97f77a66885a" desc="">
+ Filter
+ </message>
+ <message name="IDS_DEVTOOLS_d779282283c011149d163edbcd5e5f11" desc="">
+ Evaluate, allowing side effects
+ </message>
+ <message name="IDS_DEVTOOLS_de6fc8cb2d1b20158aeda5cd1cb2e03c" desc="">
+ Show messages from all contexts
+ </message>
+ <message name="IDS_DEVTOOLS_de70938849b75d3db63bba421c93e018" desc="">
+ messages
+ </message>
+ <message name="IDS_DEVTOOLS_dfcc689f6e70e39a408b78912822cec9" desc="">
+ Error <ph name="ACCESSIBLENAME">$1s</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_e178ba306750ffbfdba284f60a3743b0" desc="">
+ Do not eagerly evaluate console prompt text
+ </message>
+ <message name="IDS_DEVTOOLS_e17fdb615452f440c793b5ddad90dd5e" desc="">
+ Warnings
+ </message>
+ <message name="IDS_DEVTOOLS_e1dd1b8e32626f508bd3a5612a60ab97" desc="">
+ Create live expression
+ </message>
+ <message name="IDS_DEVTOOLS_eacaf2bd1c1414e5086cf04573e154ef" desc="">
+ e.g. /event\d/ -cdn url:a.com
+ </message>
+ <message name="IDS_DEVTOOLS_ebfab4df1bb91688c62d4523eba870a5" desc="">
+ Evaluate triggers user activation
+ </message>
+ <message name="IDS_DEVTOOLS_f8ec55cf268ca6106fb23a98523b7549" desc="">
+ user message
+ </message>
+ <message name="IDS_DEVTOOLS_fb554075057f4d116097df434bcef393" desc="">
+ This value will not be collected until console is cleared.
+ </message>
+ <message name="IDS_DEVTOOLS_fbb5dc83cad4daf746720c90bfb8d306" desc="">
+ Custom levels
+ </message>
+</grit-part> \ No newline at end of file
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/console/module.json b/chromium/third_party/blink/renderer/devtools/front_end/console/module.json
index 9f04380d03b..6ed5134eba6 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/console/module.json
+++ b/chromium/third_party/blink/renderer/devtools/front_end/console/module.json
@@ -186,6 +186,24 @@
"title": "Do not eagerly evaluate console prompt text"
}
]
+ },
+ {
+ "type": "setting",
+ "category": "Console",
+ "title": "Evaluate triggers user activation",
+ "settingName": "consoleUserActivationEval",
+ "settingType": "boolean",
+ "defaultValue": true,
+ "options": [
+ {
+ "value": true,
+ "title": "Treat evaluation as user activation"
+ },
+ {
+ "value": false,
+ "title": "Do not treat evaluation as user activation"
+ }
+ ]
}
],
"dependencies": [
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/console_counters/console_counters_strings.grdp b/chromium/third_party/blink/renderer/devtools/front_end/console_counters/console_counters_strings.grdp
new file mode 100644
index 00000000000..d2ead3ed318
--- /dev/null
+++ b/chromium/third_party/blink/renderer/devtools/front_end/console_counters/console_counters_strings.grdp
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<grit-part>
+ <message name="IDS_DEVTOOLS_5415b9709f6fda34d7148558bbf4e36b" desc="">
+ <ph name="WARNINGS">$1s</ph> warning
+ </message>
+ <message name="IDS_DEVTOOLS_8e8fda2f7538782b27f82f8ec3c160eb" desc="">
+ <ph name="WARNINGS">$1s</ph> warnings
+ </message>
+ <message name="IDS_DEVTOOLS_9a075279073f00bab27c1c7612bb9fc0" desc="">
+ <ph name="ERRORS">$1s</ph> errors
+ </message>
+ <message name="IDS_DEVTOOLS_a1c00c8d8c543411f73883be7ecfb01b" desc="">
+ <ph name="ERRORS">$1s</ph> error
+ </message>
+ <message name="IDS_DEVTOOLS_dac90a385f9ee1c4d4cac02579d68185" desc="">
+ <ph name="VIOLATIONS">$1s</ph> violation
+ </message>
+ <message name="IDS_DEVTOOLS_de292077f92bbd36f5b8bd7131f2ef5a" desc="">
+ <ph name="VIOLATIONS">$1s</ph> violations
+ </message>
+</grit-part> \ No newline at end of file
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/cookie_table/CookiesTable.js b/chromium/third_party/blink/renderer/devtools/front_end/cookie_table/CookiesTable.js
index 181729dce95..0052dedda78 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/cookie_table/CookiesTable.js
+++ b/chromium/third_party/blink/renderer/devtools/front_end/cookie_table/CookiesTable.js
@@ -50,7 +50,7 @@ CookieTable.CookiesTable = class extends UI.VBox {
const columns = /** @type {!Array<!DataGrid.DataGrid.ColumnDescriptor>} */ ([
{
id: 'name',
- title: Common.UIString('Name'),
+ title: ls`Name`,
sortable: true,
disclosure: editable,
sort: DataGrid.DataGrid.Order.Ascending,
@@ -58,31 +58,14 @@ CookieTable.CookiesTable = class extends UI.VBox {
weight: 24,
editable: editable
},
- {id: 'value', title: Common.UIString('Value'), sortable: true, longText: true, weight: 34, editable: editable},
- {id: 'domain', title: Common.UIString('Domain'), sortable: true, weight: 7, editable: editable},
- {id: 'path', title: Common.UIString('Path'), sortable: true, weight: 7, editable: editable},
- {id: 'expires', title: Common.UIString('Expires / Max-Age'), sortable: true, weight: 7, editable: editable},
- {id: 'size', title: Common.UIString('Size'), sortable: true, align: DataGrid.DataGrid.Align.Right, weight: 7}, {
- id: 'httpOnly',
- title: Common.UIString('HTTP'),
- sortable: true,
- align: DataGrid.DataGrid.Align.Center,
- weight: 7
- },
- {
- id: 'secure',
- title: Common.UIString('Secure'),
- sortable: true,
- align: DataGrid.DataGrid.Align.Center,
- weight: 7
- },
- {
- id: 'sameSite',
- title: Common.UIString('SameSite'),
- sortable: true,
- align: DataGrid.DataGrid.Align.Center,
- weight: 7
- }
+ {id: 'value', title: ls`Value`, sortable: true, longText: true, weight: 34, editable: editable},
+ {id: 'domain', title: ls`Domain`, sortable: true, weight: 7, editable: editable},
+ {id: 'path', title: ls`Path`, sortable: true, weight: 7, editable: editable},
+ {id: 'expires', title: ls`Expires / Max-Age`, sortable: true, weight: 7, editable: editable},
+ {id: 'size', title: ls`Size`, sortable: true, align: DataGrid.DataGrid.Align.Right, weight: 7},
+ {id: 'httpOnly', title: ls`HttpOnly`, sortable: true, align: DataGrid.DataGrid.Align.Center, weight: 7},
+ {id: 'secure', title: ls`Secure`, sortable: true, align: DataGrid.DataGrid.Align.Center, weight: 7},
+ {id: 'sameSite', title: ls`SameSite`, sortable: true, align: DataGrid.DataGrid.Align.Center, weight: 7}
]);
if (editable) {
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/cookie_table/cookie_table_strings.grdp b/chromium/third_party/blink/renderer/devtools/front_end/cookie_table/cookie_table_strings.grdp
new file mode 100644
index 00000000000..3c816c93b4a
--- /dev/null
+++ b/chromium/third_party/blink/renderer/devtools/front_end/cookie_table/cookie_table_strings.grdp
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<grit-part>
+ <message name="IDS_DEVTOOLS_2e7501c512976a9d9a9dca45bce9f128" desc="">
+ Expires / Max-Age
+ </message>
+ <message name="IDS_DEVTOOLS_382b0f5185773fa0f67a8ed8056c7759" desc="">
+ N/A
+ </message>
+ <message name="IDS_DEVTOOLS_49ee3087348e8d44e1feda1917443987" desc="">
+ Name
+ </message>
+ <message name="IDS_DEVTOOLS_6c8f0cef6081f0f97ec0f01a5a3ce2a7" desc="">
+ HttpOnly
+ </message>
+ <message name="IDS_DEVTOOLS_6f6cb72d544962fa333e2e34ce64f719" desc="">
+ Size
+ </message>
+ <message name="IDS_DEVTOOLS_71c7ae294b7abd866b3fb295b3b9e4a4" desc="">
+ Session
+ </message>
+ <message name="IDS_DEVTOOLS_7a2ccf251ecb20b2b84ce0e3c3f72a29" desc="">
+ Secure
+ </message>
+ <message name="IDS_DEVTOOLS_9f8e4d5e9b6d7a439dc6b5ebc5eedca4" desc="">
+ SameSite
+ </message>
+ <message name="IDS_DEVTOOLS_ac70412e939d72a9234cdebb1af5867b" desc="">
+ Path
+ </message>
+ <message name="IDS_DEVTOOLS_eae639a70006feff484a39363c977e24" desc="">
+ Domain
+ </message>
+</grit-part> \ No newline at end of file
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/coverage/coverage_strings.grdp b/chromium/third_party/blink/renderer/devtools/front_end/coverage/coverage_strings.grdp
new file mode 100644
index 00000000000..42fd14a89a7
--- /dev/null
+++ b/chromium/third_party/blink/renderer/devtools/front_end/coverage/coverage_strings.grdp
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="utf-8"?>
+<grit-part>
+ <message name="IDS_DEVTOOLS_0975cd80b6efbfa27546aa1567bc8143" desc="">
+ Instrument coverage
+ </message>
+ <message name="IDS_DEVTOOLS_140f5ed61f8c7390c3e38d7f6af6bd4b" desc="">
+ Click the record button <ph name="RECORDBUTTON">$1s</ph> to start capturing coverage.
+Click the reload button <ph name="RELOADBUTTON">$2s</ph> to reload and start capturing coverage.
+ </message>
+ <message name="IDS_DEVTOOLS_1a49594b5f00e4f511ae8935c027cd8e" desc="">
+ Unused Bytes
+ </message>
+ <message name="IDS_DEVTOOLS_2adbfb69a37aa4a29ca846736d2111db" desc="">
+ JS (coarse)
+ </message>
+ <message name="IDS_DEVTOOLS_2c56c360580420d293172f42d85dfbed" desc="">
+ CSS
+ </message>
+ <message name="IDS_DEVTOOLS_5bc06f5800d415cc95e1349edbaca425" desc="">
+ JS
+ </message>
+ <message name="IDS_DEVTOOLS_6525b37c568c526bde7c02fac8195c73" desc="">
+ <ph name="UNUSEDSIZE___THIS__COVERAGEINFO_SIZE________">$1.1f</ph> %%
+ </message>
+ <message name="IDS_DEVTOOLS_73af525212a812236f1a3618e9cfa717" desc="">
+ Export...
+ </message>
+ <message name="IDS_DEVTOOLS_8324d82d6d4baaa0405621a1a15f365a" desc="">
+ Stop instrumenting coverage and show results
+ </message>
+ <message name="IDS_DEVTOOLS_832e506a71f4a57ed15ecbcd771f9247" desc="">
+ Total Bytes
+ </message>
+ <message name="IDS_DEVTOOLS_8e8c9f0a8c3469d9900728e8b1d451cb" desc="">
+ URL filter
+ </message>
+ <message name="IDS_DEVTOOLS_95dd3a82779cda9791819969c51c97d3" desc="">
+ Click the record button <ph name="RECORDBUTTON">$1s</ph> to start capturing coverage.
+ </message>
+ <message name="IDS_DEVTOOLS_9841bdc50c4226cb6ec5db76494249e6" desc="">
+ Coverage
+ </message>
+ <message name="IDS_DEVTOOLS_a1fa27779242b4902f7ae3bdd5c6d508" desc="">
+ Type
+ </message>
+ <message name="IDS_DEVTOOLS_bca27ccb808f436cd1ce828dd47604b7" desc="">
+ Start instrumenting coverage and reload page
+ </message>
+ <message name="IDS_DEVTOOLS_c4ba5b981ea7d2c17178a6c879cc03bd" desc="">
+ <ph name="NUMBER_BYTESTOSTRING_UNUSED_">$1s</ph> of <ph name="NUMBER_BYTESTOSTRING_TOTAL_">$2s</ph> bytes are not used. (<ph name="PERCENTUNUSED">$3d</ph>%%)
+ </message>
+ <message name="IDS_DEVTOOLS_d95b97f3bac1a32fc1f27686f74b97de" desc="">
+ JS coverage is function-level only. Reload the page for block-level coverage.
+ </message>
+ <message name="IDS_DEVTOOLS_d98bd5257b9f29c266777264411735a3" desc="">
+ Include extension content scripts
+ </message>
+ <message name="IDS_DEVTOOLS_e6b391a8d2c4d45902a23a8b6585703d" desc="">
+ URL
+ </message>
+</grit-part> \ No newline at end of file
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/data_grid/data_grid_strings.grdp b/chromium/third_party/blink/renderer/devtools/front_end/data_grid/data_grid_strings.grdp
new file mode 100644
index 00000000000..0cd51ef89cd
--- /dev/null
+++ b/chromium/third_party/blink/renderer/devtools/front_end/data_grid/data_grid_strings.grdp
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<grit-part>
+ <message name="IDS_DEVTOOLS_28de94c6a82d4419a4014addb8aba93c" desc="">
+ Show <ph name="THIS__CHUNKSIZE">$1d</ph> after
+ </message>
+ <message name="IDS_DEVTOOLS_b33d161950658a73abe8675d311345d2" desc="">
+ Edit &quot;<ph name="THIS__COLUMNS_COLUMNID__TITLE">$1s</ph>&quot;
+ </message>
+ <message name="IDS_DEVTOOLS_d73d1ee203c4075522513de6fe5557c8" desc="">
+ Show <ph name="THIS__CHUNKSIZE">$1d</ph> before
+ </message>
+ <message name="IDS_DEVTOOLS_e199c6bb662785b037c5f330f58878ce" desc="">
+ Show all <ph name="TOTALSIZE">$1d</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_ef61fb324d729c341ea8ab9901e23566" desc="">
+ Add new
+ </message>
+ <message name="IDS_DEVTOOLS_f2a6c498fb90ee345d997f888fce3b18" desc="">
+ Delete
+ </message>
+</grit-part> \ No newline at end of file
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/devices/DevicesView.js b/chromium/third_party/blink/renderer/devtools/front_end/devices/DevicesView.js
index 7a82bdf5e18..002876b75b2 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/devices/DevicesView.js
+++ b/chromium/third_party/blink/renderer/devtools/front_end/devices/DevicesView.js
@@ -376,10 +376,11 @@ Devices.DevicesView.PortForwardingView = class extends UI.VBox {
const content = editor.contentElement();
const fields = content.createChild('div', 'port-forwarding-edit-row');
fields.createChild('div', 'port-forwarding-value port-forwarding-port')
- .appendChild(editor.createInput('port', 'text', 'Device port (3333)', portValidator.bind(this)));
+ .appendChild(editor.createInput('port', 'text', ls`Device port (3333)`, portValidator.bind(this)));
fields.createChild('div', 'port-forwarding-separator port-forwarding-separator-invisible');
fields.createChild('div', 'port-forwarding-value')
- .appendChild(editor.createInput('address', 'text', 'Local address (dev.example.corp:3333)', addressValidator));
+ .appendChild(
+ editor.createInput('address', 'text', ls`Local address (dev.example.corp:3333)`, addressValidator));
return editor;
/**
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/devices/devicesView.css b/chromium/third_party/blink/renderer/devtools/front_end/devices/devicesView.css
index 60421188719..6252ebe8caf 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/devices/devicesView.css
+++ b/chromium/third_party/blink/renderer/devtools/front_end/devices/devicesView.css
@@ -195,13 +195,6 @@
white-space: pre-wrap;
}
-.network-discovery-header {
- display: flex;
- align-items: center;
- flex-direction: row;
- margin-top: 5px;
-}
-
.add-network-target-button {
margin: 10px 25px;
align-self: flex-start;
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/devices/devices_strings.grdp b/chromium/third_party/blink/renderer/devtools/front_end/devices/devices_strings.grdp
new file mode 100644
index 00000000000..07a3116d32c
--- /dev/null
+++ b/chromium/third_party/blink/renderer/devtools/front_end/devices/devices_strings.grdp
@@ -0,0 +1,111 @@
+<?xml version="1.0" encoding="utf-8"?>
+<grit-part>
+ <message name="IDS_DEVTOOLS_00fcbe531dd989e566cab0a9e250f14c" desc="">
+ Port Forwarding:
+ </message>
+ <message name="IDS_DEVTOOLS_03fc5c0bd59679c442b86074c7a7cc3a" desc="">
+ Port forwarding
+ </message>
+ <message name="IDS_DEVTOOLS_042909a8044ec8e1a97069bfdde2fe58" desc="">
+ Connected: <ph name="CONNECTED_JOIN______">$1s</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_049c45b298c6bc7540d84ab593bedaa6" desc="">
+ Transient: <ph name="TRANSIENT_JOIN______">$1s</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_0dec6438ad2d934e57d33026770654d1" desc="">
+ remote debugging documentation
+ </message>
+ <message name="IDS_DEVTOOLS_10e10a814f3c1f9a5e847376c975ea3c" desc="">
+ Error: <ph name="ERROR_JOIN______">$1s</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_2157ba7738ed20565fd089f2a6287cdd" desc="">
+ View less tabs…
+ </message>
+ <message name="IDS_DEVTOOLS_258771f02f7548d3282560829e7c9b69" desc="">
+ Define the listening port on your device that maps to a port accessible from your development machine.
+ </message>
+ <message name="IDS_DEVTOOLS_2ec0d16e4ca169baedb9b2d50ec5c6d7" desc="">
+ Connected
+ </message>
+ <message name="IDS_DEVTOOLS_34fdf6d76ae3464206146053c8aedcd7" desc="">
+ <ph name="THIS__DEVICES_LENGTH">$1d</ph> devices detected.
+ </message>
+ <message name="IDS_DEVTOOLS_35a9dbe6b748771b9ea4d5962d37ff6f" desc="">
+ Inspect
+ </message>
+ <message name="IDS_DEVTOOLS_405590b3c5865df635f2373ee4cb799c" desc="">
+ Remote devices
+ </message>
+ <message name="IDS_DEVTOOLS_4d1c8263ba1036754f8db14a98f9f006" desc="">
+ Reload
+ </message>
+ <message name="IDS_DEVTOOLS_67afa587522e088dedac9f252362d16a" desc="">
+ Discover USB devices
+ </message>
+ <message name="IDS_DEVTOOLS_6ab4529805e55f79b589f0676435dc4e" desc="">
+ Pending Authorization
+ </message>
+ <message name="IDS_DEVTOOLS_85bd3d2945bf008087e0a3a7d714ae80" desc="">
+ localhost:
+ </message>
+ <message name="IDS_DEVTOOLS_88183b946cc5f0e8c96b2e66e1c74a7e" desc="">
+ Unknown
+ </message>
+ <message name="IDS_DEVTOOLS_8c7074069d61ba9d2f76b078fb1dd154" desc="">
+ Need help? Read Chrome
+ </message>
+ <message name="IDS_DEVTOOLS_926f97ab5b90b053d6a3a31082316f15" desc="">
+ No browsers detected.
+ </message>
+ <message name="IDS_DEVTOOLS_9b5e7fc14b157afb268b71b01d397eef" desc="">
+ Add rule
+ </message>
+ <message name="IDS_DEVTOOLS_9ba01fbecae523e4160afa26f75f1757" desc="">
+ View more tabs…
+ </message>
+ <message name="IDS_DEVTOOLS_a105a2ea6a8f53afe9640d8684ffe5d5" desc="">
+ Read
+ </message>
+ <message name="IDS_DEVTOOLS_a2040c5569ac3718b10af77aaa3fbb03" desc="">
+ Pending authentication: please accept debugging session on the device.
+ </message>
+ <message name="IDS_DEVTOOLS_bcca96534b404f08faf65d76be6aa782" desc="">
+ 1 device detected.
+ </message>
+ <message name="IDS_DEVTOOLS_c03ca67dda321195d74c951097f240c6" desc="">
+ Devices
+ </message>
+ <message name="IDS_DEVTOOLS_c3bf447eabe632720a3aa1a7ce401274" desc="">
+ Open
+ </message>
+ <message name="IDS_DEVTOOLS_c9d2bd107ad7a2c20f80efcaaf365d23" desc="">
+ for more information.
+ </message>
+ <message name="IDS_DEVTOOLS_cc63a5ac37dd9d1c607a59aad3292392" desc="">
+ No rules
+ </message>
+ <message name="IDS_DEVTOOLS_ceb747e16b7e536d03047492e4491314" desc="">
+ remote debugging documentation.
+ </message>
+ <message name="IDS_DEVTOOLS_d38dcac8af912356e255cbace8984e9a" desc="">
+ New tab:
+ </message>
+ <message name="IDS_DEVTOOLS_dabcc308341c912a6b620e1c980e16d6" desc="">
+ No devices detected.
+ </message>
+ <message name="IDS_DEVTOOLS_e1f70f4a4265cb51c1b219aa60eaa441" desc="">
+ Enter URL
+ </message>
+ <message name="IDS_DEVTOOLS_e24ee2487879116dcab772c0ac4fe341" desc="">
+ Focus
+ </message>
+ <message name="IDS_DEVTOOLS_f114563447e4786042d7e7ce05f1157c" desc="">
+ Device port (3333)
+ </message>
+ <message name="IDS_DEVTOOLS_f4f70727dc34561dfde1a3c529b6205c" desc="">
+ Settings
+ </message>
+ <message name="IDS_DEVTOOLS_ff89b835f4fc414c9c8f4f96695c2ea8" desc="">
+ Local address (dev.example.corp:3333)
+ </message>
+</grit-part> \ No newline at end of file
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/devtools_app.json b/chromium/third_party/blink/renderer/devtools/front_end/devtools_app.json
index 40f67e9ee0d..82b5657eaa4 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/devtools_app.json
+++ b/chromium/third_party/blink/renderer/devtools/front_end/devtools_app.json
@@ -22,7 +22,8 @@
{ "name": "resources" },
{ "name": "security" },
{ "name": "timeline" },
- { "name": "timeline_model" }
+ { "name": "timeline_model" },
+ { "name": "web_audio" }
],
"extends": "shell",
"has_html": true
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/devtools_compatibility.js b/chromium/third_party/blink/renderer/devtools/front_end/devtools_compatibility.js
index 0188e678631..3607966d740 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/devtools_compatibility.js
+++ b/chromium/third_party/blink/renderer/devtools/front_end/devtools_compatibility.js
@@ -550,6 +550,14 @@
/**
* @override
+ * @param {string} umaName
+ */
+ recordUserMetricsAction(umaName) {
+ DevToolsAPI.sendMessageToEmbedder('recordUserMetricsAction', [umaName], null);
+ }
+
+ /**
+ * @override
*/
requestFileSystems() {
DevToolsAPI.sendMessageToEmbedder('requestFileSystems', [], null);
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/elements/ElementsTreeElement.js b/chromium/third_party/blink/renderer/devtools/front_end/elements/ElementsTreeElement.js
index c304d00d5b9..9c9c058a116 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/elements/ElementsTreeElement.js
+++ b/chromium/third_party/blink/renderer/devtools/front_end/elements/ElementsTreeElement.js
@@ -250,7 +250,8 @@ Elements.ElementsTreeElement = class extends UI.TreeElement {
_createHint() {
if (this.listItemElement && !this._hintElement) {
this._hintElement = this.listItemElement.createChild('span', 'selected-hint');
- this._hintElement.title = Common.UIString('Use $0 in the console to refer to this element.');
+ const selectedElementCommand = '$0';
+ this._hintElement.title = ls`Use ${selectedElementCommand} in the console to refer to this element.`;
UI.ARIAUtils.markAsHidden(this._hintElement);
}
}
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/elements/ElementsTreeOutline.js b/chromium/third_party/blink/renderer/devtools/front_end/elements/ElementsTreeOutline.js
index 035dde1ae5c..27390a412a0 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/elements/ElementsTreeOutline.js
+++ b/chromium/third_party/blink/renderer/devtools/front_end/elements/ElementsTreeOutline.js
@@ -1244,6 +1244,8 @@ Elements.ElementsTreeOutline = class extends UI.TreeOutline {
_hasVisibleChildren(node) {
if (node.isIframe())
return true;
+ if (node.isPortal())
+ return true;
if (node.contentDocument())
return true;
if (node.importedDocument())
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/elements/EventListenersWidget.js b/chromium/third_party/blink/renderer/devtools/front_end/elements/EventListenersWidget.js
index 18adda69c87..921080746a2 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/elements/EventListenersWidget.js
+++ b/chromium/third_party/blink/renderer/devtools/front_end/elements/EventListenersWidget.js
@@ -55,6 +55,7 @@ Elements.EventListenersWidget = class extends UI.ThrottledWidget {
this._showForAncestorsSetting, Common.UIString('Show listeners on the ancestors'),
Common.UIString('Ancestors')));
const dispatchFilter = new UI.ToolbarComboBox(this._onDispatchFilterTypeChanged.bind(this));
+ dispatchFilter.setTitle(ls`Event listeners category`);
/**
* @param {string} name
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/elements/StylePropertyTreeElement.js b/chromium/third_party/blink/renderer/devtools/front_end/elements/StylePropertyTreeElement.js
index edea0b5d136..9012b72946b 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/elements/StylePropertyTreeElement.js
+++ b/chromium/third_party/blink/renderer/devtools/front_end/elements/StylePropertyTreeElement.js
@@ -32,9 +32,11 @@ Elements.StylePropertyTreeElement = class extends UI.TreeElement {
this.nameElement = null;
this._expandElement = null;
this._originalPropertyText = '';
+ this._hasBeenEditedIncrementally = false;
this._prompt = null;
- this._propertyHasBeenEditedIncrementally = false;
this._lastComputedValue = null;
+ /** @type {(!Elements.StylePropertyTreeElement.Context|undefined)} */
+ this._contextForTest;
}
/**
@@ -548,8 +550,10 @@ Elements.StylePropertyTreeElement = class extends UI.TreeElement {
expanded: this.expanded,
hasChildren: this.isExpandable(),
isEditingName: isEditingName,
+ originalProperty: this.property,
previousContent: selectElement.textContent
};
+ this._contextForTest = context;
// Lie about our children to prevent expanding on double click and to collapse shorthands.
this.setExpandable(false);
@@ -610,14 +614,10 @@ Elements.StylePropertyTreeElement = class extends UI.TreeElement {
this._prompt = new Elements.StylesSidebarPane.CSSPropertyPrompt(this, isEditingName);
this._prompt.setAutocompletionTimeout(0);
- // Do not live-edit "content" property of pseudo elements. crbug.com/433889
- if (!isEditingName && (!this._parentPane.node().pseudoType() || this.name !== 'content'))
- this._prompt.addEventListener(UI.TextPrompt.Events.TextChanged, this._applyFreeFlowStyleTextEdit.bind(this));
+ this._prompt.addEventListener(
+ UI.TextPrompt.Events.TextChanged, this._applyFreeFlowStyleTextEdit.bind(this, context));
- // Attach prompt before `section.startEditing()`, which manually sets height. crbug.com/949383
const proxyElement = this._prompt.attachAndStartEditing(selectElement, blurListener.bind(this, context));
- if (section)
- section.startEditing();
this._navigateToSource(selectElement, true);
proxyElement.addEventListener('keydown', this._editingNameValueKeyDown.bind(this, context), false);
@@ -710,19 +710,48 @@ Elements.StylePropertyTreeElement = class extends UI.TreeElement {
}
/**
+ * @param {!Elements.StylePropertyTreeElement.Context} context
* @return {!Promise}
*/
- async _applyFreeFlowStyleTextEdit() {
+ async _applyFreeFlowStyleTextEdit(context) {
+ if (!this._prompt || !this._parentPane.node())
+ return;
+
+ const enteredText = this._prompt.text();
+ if (context.isEditingName && enteredText.includes(':')) {
+ this._editingCommitted(enteredText, context, 'forward');
+ return;
+ }
+
const valueText = this._prompt.textWithCurrentSuggestion();
- if (valueText.indexOf(';') === -1)
- await this.applyStyleText(this.nameElement.textContent + ': ' + valueText, false);
+ if (valueText.includes(';'))
+ return;
+ // Prevent destructive side-effects during live-edit. crbug.com/433889
+ const isPseudo = !!this._parentPane.node().pseudoType();
+ if (isPseudo) {
+ if (this.name.toLowerCase() === 'content')
+ return;
+ const lowerValueText = valueText.trim().toLowerCase();
+ if (lowerValueText.startsWith('content:') || lowerValueText === 'display: none')
+ return;
+ }
+
+ if (context.isEditingName) {
+ if (valueText.includes(':'))
+ await this.applyStyleText(valueText, false);
+ else if (this._hasBeenEditedIncrementally)
+ await this._applyOriginalStyle(context);
+ } else {
+ await this.applyStyleText(`${this.nameElement.textContent}: ${valueText}`, false);
+ }
}
/**
* @return {!Promise}
*/
kickFreeFlowStyleEditForTest() {
- return this._applyFreeFlowStyleTextEdit();
+ const context = this._contextForTest;
+ return this._applyFreeFlowStyleTextEdit(/** @type {!Elements.StylePropertyTreeElement.Context} */ (context));
}
/**
@@ -746,20 +775,22 @@ Elements.StylePropertyTreeElement = class extends UI.TreeElement {
*/
editingCancelled(element, context) {
this._removePrompt();
- this._revertStyleUponEditingCanceled();
+
+ if (this._hasBeenEditedIncrementally)
+ this._applyOriginalStyle(context);
+ else if (this._newProperty)
+ this.treeOutline.removeChild(this);
+ this.updateTitle();
+
// This should happen last, as it clears the info necessary to restore the property value after [Page]Up/Down changes.
this.editingEnded(context);
}
- _revertStyleUponEditingCanceled() {
- if (this._propertyHasBeenEditedIncrementally) {
- this.applyStyleText(this._originalPropertyText, false);
- this._originalPropertyText = '';
- } else if (this._newProperty) {
- this.treeOutline.removeChild(this);
- } else {
- this.updateTitle();
- }
+ /**
+ * @param {!Elements.StylePropertyTreeElement.Context} context
+ */
+ async _applyOriginalStyle(context) {
+ await this.applyStyleText(this._originalPropertyText, false, context.originalProperty);
}
/**
@@ -781,10 +812,10 @@ Elements.StylePropertyTreeElement = class extends UI.TreeElement {
* @param {string} moveDirection
*/
async _editingCommitted(userInput, context, moveDirection) {
- const hadFocus = this._parentPane.element.hasFocus();
this._removePrompt();
this.editingEnded(context);
const isEditingName = context.isEditingName;
+ const nameValueEntered = isEditingName && this.nameElement.textContent.includes(':');
// Determine where to move to before making changes
let createNewProperty, moveToSelector;
@@ -812,13 +843,14 @@ Elements.StylePropertyTreeElement = class extends UI.TreeElement {
let moveToIndex = moveTo && this.treeOutline ? this.treeOutline.rootElement().indexOfChild(moveTo) : -1;
const blankInput = userInput.isWhitespace();
const shouldCommitNewProperty = this._newProperty &&
- (isPropertySplitPaste || moveToOther || (!moveDirection && !isEditingName) || (isEditingName && blankInput));
+ (isPropertySplitPaste || moveToOther || (!moveDirection && !isEditingName) || (isEditingName && blankInput) ||
+ nameValueEntered);
const section = /** @type {!Elements.StylePropertiesSection} */ (this.section());
if (((userInput !== context.previousContent || isDirtyViaPaste) && !this._newProperty) || shouldCommitNewProperty) {
- if (hadFocus)
- this._parentPane.element.focus();
let propertyText;
- if (blankInput || (this._newProperty && this.valueElement.textContent.isWhitespace())) {
+ if (nameValueEntered) {
+ propertyText = this.nameElement.textContent;
+ } else if (blankInput || (this._newProperty && this.valueElement.textContent.isWhitespace())) {
propertyText = '';
} else {
if (isEditingName)
@@ -914,9 +946,6 @@ Elements.StylePropertyTreeElement = class extends UI.TreeElement {
this._prompt.detach();
this._prompt = null;
}
- const section = this.section();
- if (section)
- section.stopEditing();
}
styleTextAppliedForTest() {
@@ -925,18 +954,20 @@ Elements.StylePropertyTreeElement = class extends UI.TreeElement {
/**
* @param {string} styleText
* @param {boolean} majorChange
+ * @param {?SDK.CSSProperty=} property
* @return {!Promise}
*/
- applyStyleText(styleText, majorChange) {
- return this._applyStyleThrottler.schedule(this._innerApplyStyleText.bind(this, styleText, majorChange));
+ applyStyleText(styleText, majorChange, property) {
+ return this._applyStyleThrottler.schedule(this._innerApplyStyleText.bind(this, styleText, majorChange, property));
}
/**
* @param {string} styleText
* @param {boolean} majorChange
+ * @param {?SDK.CSSProperty=} property
* @return {!Promise}
*/
- async _innerApplyStyleText(styleText, majorChange) {
+ async _innerApplyStyleText(styleText, majorChange, property) {
if (!this.treeOutline)
return;
@@ -944,8 +975,9 @@ Elements.StylePropertyTreeElement = class extends UI.TreeElement {
if (!oldStyleRange)
return;
+ const hasBeenEditedIncrementally = this._hasBeenEditedIncrementally;
styleText = styleText.replace(/\s/g, ' ').trim(); // Replace &nbsp; with whitespace.
- if (!styleText.length && majorChange && this._newProperty && !this._propertyHasBeenEditedIncrementally) {
+ if (!styleText.length && majorChange && this._newProperty && !hasBeenEditedIncrementally) {
// The user deleted everything and never applied a new property value via Up/Down scrolling/live editing, so remove the tree element and update.
this.parent.removeChild(this);
return;
@@ -958,10 +990,10 @@ Elements.StylePropertyTreeElement = class extends UI.TreeElement {
// FIXME: this does not handle trailing comments.
if (styleText.length && !/;\s*$/.test(styleText))
styleText += ';';
- const overwriteProperty = !this._newProperty || this._propertyHasBeenEditedIncrementally;
+ const overwriteProperty = !this._newProperty || hasBeenEditedIncrementally;
let success = await this.property.setText(styleText, majorChange, overwriteProperty);
// Revert to the original text if applying the new text failed
- if (this._propertyHasBeenEditedIncrementally && majorChange && !success) {
+ if (hasBeenEditedIncrementally && majorChange && !success) {
majorChange = false;
success = await this.property.setText(this._originalPropertyText, majorChange, overwriteProperty);
}
@@ -980,8 +1012,8 @@ Elements.StylePropertyTreeElement = class extends UI.TreeElement {
}
this._matchedStyles.resetActiveProperties();
- this._propertyHasBeenEditedIncrementally = true;
- this.property = this._style.propertyAt(this.property.index);
+ this._hasBeenEditedIncrementally = true;
+ this.property = property || this._style.propertyAt(this.property.index);
if (currentNode === this.node())
this._updatePane();
@@ -1007,6 +1039,15 @@ Elements.StylePropertyTreeElement = class extends UI.TreeElement {
}
};
-/** @typedef {{expanded: boolean, hasChildren: boolean, isEditingName: boolean, previousContent: string}} */
+/** @typedef {{
+ * expanded: boolean,
+ * hasChildren: boolean,
+ * isEditingName: boolean,
+ * originalProperty: (!SDK.CSSProperty|undefined),
+ * originalName: (string|undefined),
+ * originalValue: (string|undefined),
+ * previousContent: string
+ * }}
+ */
Elements.StylePropertyTreeElement.Context;
Elements.StylePropertyTreeElement.ActiveSymbol = Symbol('ActiveSymbol');
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/elements/StylesSidebarPane.js b/chromium/third_party/blink/renderer/devtools/front_end/elements/StylesSidebarPane.js
index 7813d0cefbe..dafcf70d54d 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/elements/StylesSidebarPane.js
+++ b/chromium/third_party/blink/renderer/devtools/front_end/elements/StylesSidebarPane.js
@@ -69,6 +69,7 @@ Elements.StylesSidebarPane = class extends Elements.ElementsSidebarPane {
/** @type {!Array<!Elements.SectionBlock>} */
this._sectionBlocks = [];
+ this._needsForceUpdate = false;
Elements.StylesSidebarPane._instance = this;
UI.context.addFlavorChangeListener(SDK.DOMNode, this.forceUpdate, this);
this.contentElement.addEventListener('copy', this._clipboardCopy.bind(this));
@@ -195,6 +196,7 @@ Elements.StylesSidebarPane = class extends Elements.ElementsSidebarPane {
}
forceUpdate() {
+ this._needsForceUpdate = true;
this._swatchPopoverHelper.hide();
this._resetCache();
this.update();
@@ -453,6 +455,13 @@ Elements.StylesSidebarPane = class extends Elements.ElementsSidebarPane {
* @return {!Promise}
*/
async _innerRebuildUpdate(matchedStyles) {
+ // Elements.ElementsSidebarPane's throttler schedules this method. Usually,
+ // rebuild is suppressed while editing (see onCSSModelChanged()), but we need a
+ // 'force' flag since the currently running throttler process cannot be canceled.
+ if (this._needsForceUpdate)
+ this._needsForceUpdate = false;
+ else if (this._isEditingStyle || this._userOperation)
+ return;
const focusedIndex = this._focusedSectionIndex();
this._linkifier.reset();
@@ -819,7 +828,6 @@ Elements.StylePropertiesSection = class {
this.element = createElementWithClass('div', 'styles-section matched-styles monospace');
this.element.tabIndex = -1;
UI.ARIAUtils.markAsTreeitem(this.element);
- this._editing = false;
this.element.addEventListener('keydown', this._onKeyDown.bind(this), false);
this.element._section = this;
this._innerElement = this.element.createChild('div');
@@ -889,9 +897,6 @@ Elements.StylePropertiesSection = class {
this.propertiesTreeOutline.element.classList.add('read-only');
}
- const throttler = new Common.Throttler(100);
- this._scheduleHeightUpdate = () => throttler.schedule(this._manuallySetHeight.bind(this));
-
this._hoverableSelectorsMode = false;
this._markSelectorMatches();
this.onpopulate();
@@ -954,7 +959,7 @@ Elements.StylePropertiesSection = class {
* @param {!Event} event
*/
_onKeyDown(event) {
- if (this._editing || !this.editable || event.altKey || event.ctrlKey || event.metaKey)
+ if (UI.isEditing() || !this.editable || event.altKey || event.ctrlKey || event.metaKey)
return;
switch (event.key) {
case 'Enter':
@@ -1604,7 +1609,6 @@ Elements.StylePropertiesSection = class {
this._editingMediaCommitted.bind(this, media), this._editingMediaCancelled.bind(this, element), undefined,
this._editingMediaBlurHandler.bind(this));
UI.InplaceEditor.startEditing(element, config);
- this.startEditing();
element.getComponentSelection().selectAllChildren(element);
this._parentPane.setEditingStyle(true);
@@ -1621,7 +1625,6 @@ Elements.StylePropertiesSection = class {
this._parentPane.setEditingStyle(false);
const parentMediaElement = element.enclosingNodeOrSelfWithClass('media');
parentMediaElement.classList.remove('editing-media');
- this.stopEditing();
}
/**
@@ -1736,7 +1739,6 @@ Elements.StylePropertiesSection = class {
const config =
new UI.InplaceEditor.Config(this.editingSelectorCommitted.bind(this), this.editingSelectorCancelled.bind(this));
UI.InplaceEditor.startEditing(this._selectorElement, config);
- this.startEditing();
element.getComponentSelection().selectAllChildren(element);
this._parentPane.setEditingStyle(true);
@@ -1853,7 +1855,6 @@ Elements.StylePropertiesSection = class {
_editingSelectorEnded() {
this._parentPane.setEditingStyle(false);
- this.stopEditing();
}
editingSelectorCancelled() {
@@ -1863,30 +1864,6 @@ Elements.StylePropertiesSection = class {
// This is overridden by BlankStylePropertiesSection.
this._markSelectorMatches();
}
-
- startEditing() {
- this._manuallySetHeight();
- this.element.addEventListener('input', this._scheduleHeightUpdate, true);
- this._editing = true;
- }
-
- /**
- * @return {!Promise}
- */
- _manuallySetHeight() {
- this.element.style.height = (this._innerElement.clientHeight + 1) + 'px';
- this.element.style.contain = 'strict';
- return Promise.resolve();
- }
-
- stopEditing() {
- this.element.style.removeProperty('height');
- this.element.style.removeProperty('contain');
- this.element.removeEventListener('input', this._scheduleHeightUpdate, true);
- this._editing = false;
- if (this._parentPane.element === this._parentPane.element.ownerDocument.deepActiveElement())
- this.element.focus();
- }
};
Elements.BlankStylePropertiesSection = class extends Elements.StylePropertiesSection {
@@ -2114,6 +2091,7 @@ Elements.StylesSidebarPane.CSSPropertyPrompt = class extends UI.TextPrompt {
super();
this.initialize(this._buildPropertyCompletions.bind(this), UI.StyleValueDelimiters);
this._isColorAware = SDK.cssMetadata().isColorAwareProperty(treeElement.property.name);
+ /** @type {!Array<string>} */
this._cssCompletions = [];
if (isEditingName) {
this._cssCompletions = SDK.cssMetadata().allProperties();
@@ -2263,6 +2241,11 @@ Elements.StylesSidebarPane.CSSPropertyPrompt = class extends UI.TextPrompt {
const anywhereResults = [];
if (!editingVariable)
this._cssCompletions.forEach(completion => filterCompletions.call(this, completion, false /* variable */));
+ if (this._isEditingName) {
+ const nameValuePresets = SDK.cssMetadata().nameValuePresets(this._treeElement.node().isSVGNode());
+ nameValuePresets.forEach(
+ preset => filterCompletions.call(this, preset, false /* variable */, true /* nameValue */));
+ }
if (this._isEditingName || editingVariable)
this._cssVariables.forEach(variable => filterCompletions.call(this, variable, true /* variable */));
@@ -2301,9 +2284,10 @@ Elements.StylesSidebarPane.CSSPropertyPrompt = class extends UI.TextPrompt {
/**
* @param {string} completion
* @param {boolean} variable
+ * @param {boolean=} nameValue
* @this {Elements.StylesSidebarPane.CSSPropertyPrompt}
*/
- function filterCompletions(completion, variable) {
+ function filterCompletions(completion, variable, nameValue) {
const index = completion.toLowerCase().indexOf(lowerQuery);
const result = {text: completion};
if (variable) {
@@ -2315,6 +2299,8 @@ Elements.StylesSidebarPane.CSSPropertyPrompt = class extends UI.TextPrompt {
result.subtitleRenderer = swatchRenderer.bind(null, color);
}
}
+ if (nameValue)
+ result.hideGhostText = true;
if (index === 0) {
result.priority = this._isEditingName ? SDK.cssMetadata().propertyUsageWeight(completion) : 1;
prefixResults.push(result);
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/elements/elementsTreeOutline.css b/chromium/third_party/blink/renderer/devtools/front_end/elements/elementsTreeOutline.css
index 7291d0120a9..fc95c24cd2c 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/elements/elementsTreeOutline.css
+++ b/chromium/third_party/blink/renderer/devtools/front_end/elements/elementsTreeOutline.css
@@ -305,7 +305,8 @@ ol:hover > li > .elements-tree-shortcut-link {
}
.gutter-menu-icon {
- display: none;
+ display: block;
+ visibility: hidden;
transform: rotate(-90deg) scale(0.8);
background-color: white;
position: relative;
@@ -314,7 +315,7 @@ ol:hover > li > .elements-tree-shortcut-link {
}
.elements-disclosure li.selected .gutter-container:not(.has-decorations) .gutter-menu-icon {
- display: block;
+ visibility: visible;
}
/** Guide line */
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/elements/elements_strings.grdp b/chromium/third_party/blink/renderer/devtools/front_end/elements/elements_strings.grdp
new file mode 100644
index 00000000000..6a32e8614fe
--- /dev/null
+++ b/chromium/third_party/blink/renderer/devtools/front_end/elements/elements_strings.grdp
@@ -0,0 +1,327 @@
+<?xml version="1.0" encoding="utf-8"?>
+<grit-part>
+ <message name="IDS_DEVTOOLS_068bc495b79facfaa7918369fa9909eb" desc="">
+ Cut element
+ </message>
+ <message name="IDS_DEVTOOLS_07f01edb2a05909a9c0d04031d7c43e1" desc="">
+ Filter Styles
+ </message>
+ <message name="IDS_DEVTOOLS_081c9f670acb11b080077b3fb6127b4c" desc="">
+ Add box-shadow
+ </message>
+ <message name="IDS_DEVTOOLS_084cd932d6dd317197a20945c76603e2" desc="">
+ Inherited from<ph name="___">$1s</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_0b17e22ff13be64e3216014d9c2a5354" desc="">
+ Enable DOM word wrap
+ </message>
+ <message name="IDS_DEVTOOLS_10d084d908583b210d2b1c470855a1d4" desc="">
+ Hide HTML comments
+ </message>
+ <message name="IDS_DEVTOOLS_14ec3eb094717596986aeef905ecb2d2" desc="">
+ New Style Rule
+ </message>
+ <message name="IDS_DEVTOOLS_1bc005d87dc22486bbb3c662b6fe46ce" desc="">
+ Pseudo ::<ph name="PSEUDOTYPE">$1s</ph> element
+ </message>
+ <message name="IDS_DEVTOOLS_1cc5c88b14a818f9f8d053f3c9f9249e" desc="">
+ Word wrap
+ </message>
+ <message name="IDS_DEVTOOLS_20bfc7bb53e1d2639556bce9852c32d8" desc="">
+ Resolve event listeners bound with framework
+ </message>
+ <message name="IDS_DEVTOOLS_21c12abe8367dcbdf5d3fee56a4ae9d8" desc="">
+ Show detailed inspect tooltip
+ </message>
+ <message name="IDS_DEVTOOLS_22a11a2e07e4412afd106977262d7617" desc="">
+ Copy selector
+ </message>
+ <message name="IDS_DEVTOOLS_254dd634c2a4b01fad95fe963b193ba8" desc="">
+ Page DOM
+ </message>
+ <message name="IDS_DEVTOOLS_28c0a3050f784583d52339ddb0bc1274" desc="">
+ Paste element
+ </message>
+ <message name="IDS_DEVTOOLS_2becb310c9830fe3fb19d18eb1808712" desc="">
+ (<ph name="USAGE">$1d</ph> glyph)
+ </message>
+ <message name="IDS_DEVTOOLS_2c0a7043a9e736eaf14b6614fff102c0" desc="">
+ Computed
+ </message>
+ <message name="IDS_DEVTOOLS_2ce5967e3862c73a31059c4aa5847464" desc="">
+ Open shadow editor.
+ </message>
+ <message name="IDS_DEVTOOLS_2ddaa8e6378b906b42429dc4003edbd3" desc="">
+ Reveal in Elements panel
+ </message>
+ <message name="IDS_DEVTOOLS_2de42fbb00305f8282310f1b3e10ce9a" desc="">
+ border
+ </message>
+ <message name="IDS_DEVTOOLS_2dff19d6ed78c6ca35cb3beab7b5bf55" desc="">
+ Rendered Fonts
+ </message>
+ <message name="IDS_DEVTOOLS_2e6591ba49ec23bf6725b74589b66ba3" desc="">
+ styles sidebar
+ </message>
+ <message name="IDS_DEVTOOLS_2f76fab71405b40cf521f64eab0d350f" desc="">
+ Delete element
+ </message>
+ <message name="IDS_DEVTOOLS_3427db2c4cb9d8d61c1dd32d218d5699" desc="">
+ Use <ph name="ELEMENTS_HINT">$1s</ph> in the console to refer to this element.
+ </message>
+ <message name="IDS_DEVTOOLS_365fee797b55ffeac84d2ba82507b721" desc="">
+ user agent stylesheet
+ </message>
+ <message name="IDS_DEVTOOLS_3afbd9828e011526955ca93b48b57524" desc="">
+ Screenshot
+ </message>
+ <message name="IDS_DEVTOOLS_3bb3e8c8a24891ba0f7608bcc96f8b0a" desc="">
+ Frame
+ </message>
+ <message name="IDS_DEVTOOLS_3e255d6c811a40b9ad197fedeadc342c" desc="">
+ Local file
+ </message>
+ <message name="IDS_DEVTOOLS_3e9bec182c7495247f5f93d3881d630b" desc="">
+ :hov
+ </message>
+ <message name="IDS_DEVTOOLS_3f8f88e3686b2345cecc9530e19e6172" desc="">
+ Store as global variable
+ </message>
+ <message name="IDS_DEVTOOLS_417117e823d14c9b7c6533e4b04600a6" desc="">
+ (text)
+ </message>
+ <message name="IDS_DEVTOOLS_44beac36afb00f088edb0aeab28a300d" desc="">
+ Edit text
+ </message>
+ <message name="IDS_DEVTOOLS_45a921ffccbc28c2ff80adada350224f" desc="">
+ &lt;node&gt;
+ </message>
+ <message name="IDS_DEVTOOLS_47210336f82b1488b69932b14038bdff" desc="">
+ Increment/decrement with mousewheel or up/down keys. <ph name="CMDORCTRL">$1s</ph>: ±100, Shift: ±10, Alt: ±0.1
+ </message>
+ <message name="IDS_DEVTOOLS_4757fe07fd492a8be0ea6a760d683d6e" desc="">
+ position
+ </message>
+ <message name="IDS_DEVTOOLS_4c1c7d945fcd04d68bd3b3f1d99a55a1" desc="">
+ Styles
+ </message>
+ <message name="IDS_DEVTOOLS_4ca94080ccbd5784f5fe296bf1ae3e12" desc="">
+ Event Listeners
+ </message>
+ <message name="IDS_DEVTOOLS_4cf8e5f6ffbb182b5d480cbabae6a028" desc="">
+ Edit attribute
+ </message>
+ <message name="IDS_DEVTOOLS_4d9468d79ef34f71ba78a28688fa5d31" desc="">
+ Ancestors
+ </message>
+ <message name="IDS_DEVTOOLS_5134111907df828fc575c69e22480c1e" desc="">
+ Hide element
+ </message>
+ <message name="IDS_DEVTOOLS_51f30f4743bd8f0e7141781bd2d93abb" desc="">
+ Set color format as authored
+ </message>
+ <message name="IDS_DEVTOOLS_55e1bbb4e00add64284ed28f15d40b25" desc="">
+ Color format:
+ </message>
+ <message name="IDS_DEVTOOLS_581b87189d0bd86aa707e42553032a3e" desc="">
+ Children:
+ </message>
+ <message name="IDS_DEVTOOLS_5ad5ecf0bc5b6e08d886efd6f6e5649b" desc="">
+ Show HTML comments
+ </message>
+ <message name="IDS_DEVTOOLS_5adda1916cde33ce6e49c22ba58f03f7" desc="">
+ injected stylesheet
+ </message>
+ <message name="IDS_DEVTOOLS_5c6236c705b0086fbbdb2df3133f8a06" desc="">
+ Reveal DOM node on hover
+ </message>
+ <message name="IDS_DEVTOOLS_5de39fa1bce4bbf9232597a2120bc4d4" desc="">
+ Open cubic bezier editor.
+ </message>
+ <message name="IDS_DEVTOOLS_5eeb03a9c080c299d4804ac765c818c2" desc="">
+ No matching selector or style
+ </message>
+ <message name="IDS_DEVTOOLS_5fb63579fc981698f97d55bfecb213ea" desc="">
+ Copy
+ </message>
+ <message name="IDS_DEVTOOLS_6053f828a109e7d9da3690a7416e4eec" desc="">
+ Copy XPath
+ </message>
+ <message name="IDS_DEVTOOLS_605e072850e19521394f8bad7082acf4" desc="">
+ Force element state
+ </message>
+ <message name="IDS_DEVTOOLS_63041e09c8660107e507c9c27c08199c" desc="">
+ Expand recursively
+ </message>
+ <message name="IDS_DEVTOOLS_686676f33cf19ca00788564f43b992cb" desc="">
+ Filter Computed Styles
+ </message>
+ <message name="IDS_DEVTOOLS_68a483c15a1730a88f2a57b1b1b8b69a" desc="">
+ Event listeners category
+ </message>
+ <message name="IDS_DEVTOOLS_69f83bbab45ca27c374e76d304ab76be" desc="">
+ Find by string, selector, or XPath
+ </message>
+ <message name="IDS_DEVTOOLS_6ac7142d0aa79d17f03677fac1249c98" desc="">
+ Force state
+ </message>
+ <message name="IDS_DEVTOOLS_6ae2f9f803d108269a2cdb714b9851a1" desc="">
+ <ph name="NODE_NODENAMEINCORRECTCASE__">$1s</ph>[Attributes Style]
+ </message>
+ <message name="IDS_DEVTOOLS_6f3cab519fe7e8f3b7834cf882f9dfe6" desc="">
+ Element Classes
+ </message>
+ <message name="IDS_DEVTOOLS_78e0b69d17e0287aaae4f79171e5b059" desc="">
+ Disable DOM word wrap
+ </message>
+ <message name="IDS_DEVTOOLS_795630f9fe735d5c002f28f851d78fac" desc="">
+ Framework listeners
+ </message>
+ <message name="IDS_DEVTOOLS_7c90d60be6418bb4a858b3733b2560a8" desc="">
+ Unknown property name
+ </message>
+ <message name="IDS_DEVTOOLS_8551fe4a09c280c278283c10a5a6aa4e" desc="">
+ Increment/decrement with mousewheel or up/down keys. <ph name="CMDORCTRL">$1s</ph>: R ±1, Shift: G ±1, Alt: B ±1
+ </message>
+ <message name="IDS_DEVTOOLS_88556207e275bc7d802b4706268d61ae" desc="">
+ Copy JS path
+ </message>
+ <message name="IDS_DEVTOOLS_88a306e559954dc8c8ae9eb55d62297f" desc="">
+ Add attribute
+ </message>
+ <message name="IDS_DEVTOOLS_8bd236209fc42bdeffdecd1cc68d7b86" desc="">
+ Open color picker. <ph name="SHIFTCLICKMESSAGE">$1s</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_8d41e41bf0856d309b43d776c24a0316" desc="">
+ Add new class
+ </message>
+ <message name="IDS_DEVTOOLS_8f17243e20db8af877d205e488b1f521" desc="">
+ Element state: <ph name="______NODE_DOMMODEL___CSSMODEL___PSEUDOSTATE_NODE__JOIN_______">$1s</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_91d17eff6a1529e8a4f67a5aa4cabec7" desc="">
+ No matching property
+ </message>
+ <message name="IDS_DEVTOOLS_956853d02d2c6947b6c15515e669dfad" desc="">
+ Set color format to RGB
+ </message>
+ <message name="IDS_DEVTOOLS_9835cebf3cf1d09803b6e2c02bc71401" desc="">
+ HSL: hsl(300, 80%, 90%)
+ </message>
+ <message name="IDS_DEVTOOLS_9a0364b9e99bb480dd25e1f0284c8555" desc="">
+ content
+ </message>
+ <message name="IDS_DEVTOOLS_9fc2d28c05ed9eb1d75ba4465abf15a9" desc="">
+ Properties
+ </message>
+ <message name="IDS_DEVTOOLS_a05fb8660778069f6d4a5c5b40a6dbc9" desc="">
+ Show user agent shadow DOM
+ </message>
+ <message name="IDS_DEVTOOLS_a2f8f2d457d122dd0d135781187aef31" desc="">
+ Invalid property value
+ </message>
+ <message name="IDS_DEVTOOLS_a78163b8c3f5e5a69fddd2a70c7f7309" desc="">
+ Style Attribute
+ </message>
+ <message name="IDS_DEVTOOLS_a98895bde5922dd43c82ad7050abc05a" desc="">
+ Show listeners on the ancestors
+ </message>
+ <message name="IDS_DEVTOOLS_aa56a2e65d8106aef3c61e4f6bf94fdb" desc="">
+ Elements
+ </message>
+ <message name="IDS_DEVTOOLS_abdf882c25e08d9ba219fe33f17591fe" desc="">
+ reveal
+ </message>
+ <message name="IDS_DEVTOOLS_acc24772ac31677d076f17d9002b57cd" desc="">
+ Collapse children
+ </message>
+ <message name="IDS_DEVTOOLS_ad4ac01e4a5688063dace5ba5d0f04de" desc="">
+ Insert Style Rule Below
+ </message>
+ <message name="IDS_DEVTOOLS_b0351810a5721f657b088608865849dd" desc="">
+ via inspector
+ </message>
+ <message name="IDS_DEVTOOLS_b1c94ca2fbc3e78fc30069c8d0f01680" desc="">
+ All
+ </message>
+ <message name="IDS_DEVTOOLS_b70cdb878a204fecf91c7dd1af312421" desc="">
+ padding
+ </message>
+ <message name="IDS_DEVTOOLS_b9740e9a829cf440e2e863124d53eba3" desc="">
+ Shift + Click to change color format.
+ </message>
+ <message name="IDS_DEVTOOLS_bd0ca6be53b0f3d2886fd53fcb52574e" desc="">
+ Blocking
+ </message>
+ <message name="IDS_DEVTOOLS_be9548cd999232697505d4ca2eed2a23" desc="">
+ Elements panel
+ </message>
+ <message name="IDS_DEVTOOLS_bf22eb56a74b42a33fecf10c831e9509" desc="">
+ Copy outerHTML
+ </message>
+ <message name="IDS_DEVTOOLS_c3c20058cbdd08782b780612204daafd" desc="">
+ Select an element in the page to inspect it
+ </message>
+ <message name="IDS_DEVTOOLS_c63621d0ad5163e8c643bb65c65b5aee" desc="">
+ Set color format to HEX
+ </message>
+ <message name="IDS_DEVTOOLS_c64955a6a59816d4e1206d600020a9fe" desc="">
+ Copy element
+ </message>
+ <message name="IDS_DEVTOOLS_c736f6b512801b5fe4670e5968ee7be7" desc="">
+ Toggle Element State
+ </message>
+ <message name="IDS_DEVTOOLS_c8466ef18413aebb4d6ebfce4e1f739d" desc="">
+ RGB: rgb(128, 255, 255)
+ </message>
+ <message name="IDS_DEVTOOLS_c8997c00026b49aa07e0a8c11511e390" desc="">
+ Add text-shadow
+ </message>
+ <message name="IDS_DEVTOOLS_c8f439c7ee24c34bc0b2e39a976509ad" desc="">
+ (<ph name="USAGE">$1d</ph> glyphs)
+ </message>
+ <message name="IDS_DEVTOOLS_cbb022167129a9f635cb4a73b5c72caa" desc="">
+ &lt;value is too large to edit&gt;
+ </message>
+ <message name="IDS_DEVTOOLS_d0ad356f675744ef8f0311e83400b6ba" desc="">
+ Network resource
+ </message>
+ <message name="IDS_DEVTOOLS_d42f4851e770aa0f758b01388874f67b" desc="">
+ margin
+ </message>
+ <message name="IDS_DEVTOOLS_d838bef326860912aa08d977cf3a5f8b" desc="">
+ HEX: #dac0de
+ </message>
+ <message name="IDS_DEVTOOLS_d981fcf0c74837202331700aca88c801" desc="">
+ As authored
+ </message>
+ <message name="IDS_DEVTOOLS_eb92025cb8c66f1850c13a9b602a1856" desc="">
+ Show all
+ </message>
+ <message name="IDS_DEVTOOLS_eeb9a8e813f34f5f036332efc0257246" desc="">
+ Capture area screenshot
+ </message>
+ <message name="IDS_DEVTOOLS_f2a70e3a6d14a56de7ebbb5b748ed127" desc="">
+ Add color
+ </message>
+ <message name="IDS_DEVTOOLS_f3d48b9ad0a801282e3adc8b452d5fc0" desc="">
+ Edit as HTML
+ </message>
+ <message name="IDS_DEVTOOLS_f750c8807bc5f4a7bd259788114a4ebd" desc="">
+ Add background-color
+ </message>
+ <message name="IDS_DEVTOOLS_f80bc338b6146b566004a046f8137c85" desc="">
+ Passive
+ </message>
+ <message name="IDS_DEVTOOLS_f8d0f1896a9e4ad16d43caa28534df32" desc="">
+ Show All Properties (<ph name="PROPERTIES_LENGTH___COUNT">$1s</ph> more)
+ </message>
+ <message name="IDS_DEVTOOLS_fa480abba67730dd6bd15aa40308d78a" desc="">
+ Set color format to HSL
+ </message>
+ <message name="IDS_DEVTOOLS_fcc980247db918e1b666b78ec7093d8c" desc="">
+ Element is hidden
+ </message>
+ <message name="IDS_DEVTOOLS_fd9bcae718daadf263a2e73c7745f0a7" desc="">
+ Show All Nodes (<ph name="VISIBLECHILDREN_LENGTH___EXPANDEDCHILDCOUNT">$1d</ph> More)
+ </message>
+</grit-part> \ No newline at end of file
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/elements_test_runner/ElementsTestRunner.js b/chromium/third_party/blink/renderer/devtools/front_end/elements_test_runner/ElementsTestRunner.js
index 482dd3fb6ff..177d9f4fd9e 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/elements_test_runner/ElementsTestRunner.js
+++ b/chromium/third_party/blink/renderer/devtools/front_end/elements_test_runner/ElementsTestRunner.js
@@ -533,7 +533,6 @@ ElementsTestRunner.showComputedStyles = function() {
return ElementsTestRunner.computedStyleWidget().doUpdate();
};
-
ElementsTestRunner.expandAndDumpSelectedElementEventListeners = function(callback, force) {
ElementsTestRunner.expandAndDumpEventListeners(
ElementsTestRunner.eventListenersWidget()._eventListenersView, callback, force);
@@ -1126,6 +1125,23 @@ ElementsTestRunner.dumpInspectorHighlightJSON = function(idValue, callback) {
}
};
+ElementsTestRunner.dumpInspectorDistanceJSON = function(idValue, callback) {
+ ElementsTestRunner.nodeWithId(idValue, nodeResolved);
+
+ async function nodeResolved(node) {
+ const result = await TestRunner.OverlayAgent.getHighlightObjectForTest(node.id, true);
+ const info = result['distanceInfo'];
+ if (!info) {
+ TestRunner.addResult(`${idValue}: No distance info`);
+ } else {
+ if (info['style'])
+ info['style'] = '<style data>';
+ TestRunner.addResult(idValue + JSON.stringify(info, null, 2));
+ }
+ callback();
+ }
+};
+
ElementsTestRunner.waitForAnimationAdded = function(callback) {
TestRunner.addSniffer(Animation.AnimationTimeline.prototype, '_addAnimationGroup', callback);
};
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/emulated_devices/emulated_devices_strings.grdp b/chromium/third_party/blink/renderer/devtools/front_end/emulated_devices/emulated_devices_strings.grdp
new file mode 100644
index 00000000000..ab04673f0a4
--- /dev/null
+++ b/chromium/third_party/blink/renderer/devtools/front_end/emulated_devices/emulated_devices_strings.grdp
@@ -0,0 +1,102 @@
+<?xml version="1.0" encoding="utf-8"?>
+<grit-part>
+ <message name="IDS_DEVTOOLS_012528cb9fb45d278755f9fec090ed11" desc="">
+ Laptop with MDPI screen
+ </message>
+ <message name="IDS_DEVTOOLS_079a3d134d2387adc52b2b3895f85e55" desc="">
+ iPhone X
+ </message>
+ <message name="IDS_DEVTOOLS_0d1160fe394d87ddbc2ca8e7cc25379d" desc="">
+ Laptop with touch
+ </message>
+ <message name="IDS_DEVTOOLS_0e5aeadd53726e96d7d9faa671b423ae" desc="">
+ Kindle Fire HDX
+ </message>
+ <message name="IDS_DEVTOOLS_1b9018182a49e16ba85bb095f224867c" desc="">
+ iPad
+ </message>
+ <message name="IDS_DEVTOOLS_2235bd527cc1684230b1db146c570a9d" desc="">
+ Pixel 2
+ </message>
+ <message name="IDS_DEVTOOLS_2c17ed2506add59c15ea763801cfafb1" desc="">
+ Nexus 6
+ </message>
+ <message name="IDS_DEVTOOLS_2d1fbe61c136940101281ec1df805c01" desc="">
+ Nexus 5
+ </message>
+ <message name="IDS_DEVTOOLS_2d9a25096b47a022c95787ab90308d6b" desc="">
+ LG Optimus L70
+ </message>
+ <message name="IDS_DEVTOOLS_4a321c67ad4bac0f3386f5e257b1fba3" desc="">
+ Laptop with HiDPI screen
+ </message>
+ <message name="IDS_DEVTOOLS_6247fa438881677e5f910b89db1974a7" desc="">
+ Nokia N9
+ </message>
+ <message name="IDS_DEVTOOLS_659810deafc0279869114daf8446ef4a" desc="">
+ Nexus 10
+ </message>
+ <message name="IDS_DEVTOOLS_6d9131a4a569108e7d19038b27111c86" desc="">
+ Nexus 5X
+ </message>
+ <message name="IDS_DEVTOOLS_71e3580e3c3a03f17798ebccaad9e6cb" desc="">
+ Nexus 7
+ </message>
+ <message name="IDS_DEVTOOLS_71f859515e31ad9bb417977247315f0a" desc="">
+ iPad Pro
+ </message>
+ <message name="IDS_DEVTOOLS_76c4064f51952f873baa0f9a201b49a3" desc="">
+ Nokia Lumia 520
+ </message>
+ <message name="IDS_DEVTOOLS_8be08fbcf1f787159e451a97a7c1cc90" desc="">
+ iPhone 6/7/8 Plus
+ </message>
+ <message name="IDS_DEVTOOLS_8d0c6a99bcfbb75724c123476d683d3f" desc="">
+ iPhone 4
+ </message>
+ <message name="IDS_DEVTOOLS_99d1a0f994cdce14eea8b6ae823d5a76" desc="">
+ Galaxy S III
+ </message>
+ <message name="IDS_DEVTOOLS_a75624548994321c1cc7173b9933438b" desc="">
+ Microsoft Lumia 550
+ </message>
+ <message name="IDS_DEVTOOLS_aa5fa1bdadb078da054c34752031a5e9" desc="">
+ iPhone 6/7/8
+ </message>
+ <message name="IDS_DEVTOOLS_b9e5554cdd9d9f2d3df1f30914b617c2" desc="">
+ Galaxy Note 3
+ </message>
+ <message name="IDS_DEVTOOLS_be6a9d69eff86af39e5a73345c585da6" desc="">
+ iPad Mini
+ </message>
+ <message name="IDS_DEVTOOLS_c99b8431589c0273278e87ebf44a7fd6" desc="">
+ iPhone 5/SE
+ </message>
+ <message name="IDS_DEVTOOLS_cc810fb8b8bc7c7d6a8327f0e7b2aead" desc="">
+ Nexus 6P
+ </message>
+ <message name="IDS_DEVTOOLS_d4f2f5453f28c5fd35c68f52e4da07cd" desc="">
+ BlackBerry Z30
+ </message>
+ <message name="IDS_DEVTOOLS_d6162eb3dd4dc5a9bc67222e24f19b25" desc="">
+ Nexus 4
+ </message>
+ <message name="IDS_DEVTOOLS_d8860bf736e83cfb5c13ee82a8f61a43" desc="">
+ Microsoft Lumia 950
+ </message>
+ <message name="IDS_DEVTOOLS_dfd6e576e036db4f857c8c03c977d975" desc="">
+ Galaxy Note II
+ </message>
+ <message name="IDS_DEVTOOLS_e0261d2f1730ebff89bbde9a4bc74ac5" desc="">
+ JioPhone 2
+ </message>
+ <message name="IDS_DEVTOOLS_e770076f957c87605ff906d0ed2c4b52" desc="">
+ Blackberry PlayBook
+ </message>
+ <message name="IDS_DEVTOOLS_eb850446088fbc75e974788cc2b39caa" desc="">
+ Pixel 2 XL
+ </message>
+ <message name="IDS_DEVTOOLS_f8896f769d62b6102e48039154c4ca5e" desc="">
+ Galaxy S5
+ </message>
+</grit-part> \ No newline at end of file
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/emulation/SensorsView.js b/chromium/third_party/blink/renderer/devtools/front_end/emulation/SensorsView.js
index 90d603a74ed..e255e3ac0fc 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/emulation/SensorsView.js
+++ b/chromium/third_party/blink/renderer/devtools/front_end/emulation/SensorsView.js
@@ -203,7 +203,6 @@ Emulation.SensorsView = class extends UI.VBox {
this._deviceOrientationFieldset = this._createDeviceOrientationOverrideElement(this._deviceOrientation);
this._stageElement = orientationContent.createChild('div', 'orientation-stage');
- this._stageElement.title = Common.UIString('Shift+drag horizontally to rotate around the y-axis');
this._orientationLayer = this._stageElement.createChild('div', 'orientation-layer');
this._boxElement = this._orientationLayer.createChild('section', 'orientation-box orientation-element');
@@ -230,9 +229,11 @@ Emulation.SensorsView = class extends UI.VBox {
if (disable) {
this._deviceOrientationFieldset.disabled = true;
this._stageElement.classList.add('disabled');
+ this._stageElement.title = ls`Enable orientation to rotate`;
} else {
this._deviceOrientationFieldset.disabled = false;
this._stageElement.classList.remove('disabled');
+ this._stageElement.title = ls`Shift+drag horizontally to rotate around the y-axis`;
}
}
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/emulation/devicesSettingsTab.css b/chromium/third_party/blink/renderer/devtools/front_end/emulation/devicesSettingsTab.css
index 68d2e3f1724..0ea2b61bc0d 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/emulation/devicesSettingsTab.css
+++ b/chromium/third_party/blink/renderer/devtools/front_end/emulation/devicesSettingsTab.css
@@ -12,12 +12,6 @@
margin: 0;
}
-.devices-settings-tab .devices-title {
- font-size: 120%;
- color: #222;
- flex: none;
-}
-
.devices-settings-tab .devices-button-row {
flex: none;
display: flex;
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/emulation/emulation_strings.grdp b/chromium/third_party/blink/renderer/devtools/front_end/emulation/emulation_strings.grdp
new file mode 100644
index 00000000000..1375e7311cf
--- /dev/null
+++ b/chromium/third_party/blink/renderer/devtools/front_end/emulation/emulation_strings.grdp
@@ -0,0 +1,279 @@
+<?xml version="1.0" encoding="utf-8"?>
+<grit-part>
+ <message name="IDS_DEVTOOLS_09109d98eee81aa68f1196a7a0753240" desc="">
+ DPR: <ph name="DEVICESCALE">$1.1f</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_0c78cd3aa4c94a64675bc6aa77802843" desc="">
+ Device-based
+ </message>
+ <message name="IDS_DEVTOOLS_0eb264d46c88af61e587c18f60662df0" desc="">
+ Device pixel ratio
+ </message>
+ <message name="IDS_DEVTOOLS_0edd9b471d32d5e3bbec7ca8df113568" desc="">
+ Toggle device toolbar
+ </message>
+ <message name="IDS_DEVTOOLS_138d1a442ecb2e2fd3b083f1842658d0" desc="">
+ Custom orientation...
+ </message>
+ <message name="IDS_DEVTOOLS_146bdebb324a64d327b1dde22a07d0bd" desc="">
+ Laptop
+ </message>
+ <message name="IDS_DEVTOOLS_19ada73af65f7c221bd28e78b2eda5cd" desc="">
+ Edit…
+ </message>
+ <message name="IDS_DEVTOOLS_1b962c3d36319947efad5a45c1ee62b0" desc="">
+ Desktop (touch)
+ </message>
+ <message name="IDS_DEVTOOLS_1c7444be9626d149ab598fb79b639f96" desc="">
+ Portrait
+ </message>
+ <message name="IDS_DEVTOOLS_21e2bb42873eddcb9b476b8eafbe0c18" desc="">
+ Reset to defaults
+ </message>
+ <message name="IDS_DEVTOOLS_223bf25f178896660d7d73af6e0a540d" desc="">
+ Laptop L
+ </message>
+ <message name="IDS_DEVTOOLS_2496af30b64c3a4ff21e8505ea439a73" desc="">
+ 50%
+ </message>
+ <message name="IDS_DEVTOOLS_29260f495ba8adcc62fd1307c758ff4e" desc="">
+ Show rulers
+ </message>
+ <message name="IDS_DEVTOOLS_29296fcb28eb4edf5d0049b6cac7bbd1" desc="">
+ <ph name="THIS__MODEL_SCALE________">$1.0f</ph>%%
+ </message>
+ <message name="IDS_DEVTOOLS_29eaeee66d8210c1261d748071fb7b0a" desc="">
+ Landscape right
+ </message>
+ <message name="IDS_DEVTOOLS_2a04aad9d1e40781d70537def184749d" desc="">
+ α (alpha)
+ </message>
+ <message name="IDS_DEVTOOLS_2d7084def320939c86d40f1208717083" desc="">
+ Location unavailable
+ </message>
+ <message name="IDS_DEVTOOLS_30bd7ce7de206924302499f197c7a966" desc="">
+ 100%
+ </message>
+ <message name="IDS_DEVTOOLS_323d4eb70b252acb4a04eaf9e0882597" desc="">
+ Geolocation
+ </message>
+ <message name="IDS_DEVTOOLS_32954654ac8fe66a1d09be19001de2d4" desc="">
+ Width
+ </message>
+ <message name="IDS_DEVTOOLS_34e34c43ec6b943c10a3cc1a1a16fb11" desc="">
+ Manage
+ </message>
+ <message name="IDS_DEVTOOLS_36384a9ea3ec791e6bd4ab6b36f2ff2a" desc="">
+ Tablet
+ </message>
+ <message name="IDS_DEVTOOLS_3836c33415a6d95d4a63388a6bcadf3b" desc="">
+ Device type
+ </message>
+ <message name="IDS_DEVTOOLS_38795baa79c9e2422a84156b83d0b73a" desc="">
+ Mobile (no touch)
+ </message>
+ <message name="IDS_DEVTOOLS_39335086fbaba7128eff0ef52d396131" desc="">
+ Show media queries
+ </message>
+ <message name="IDS_DEVTOOLS_396f64970a094d8b66d9863bd073eb72" desc="">
+ Force enabled
+ </message>
+ <message name="IDS_DEVTOOLS_3b0eb7469ba9c95f3a05c4cef1f6aac4" desc="">
+ Latitude
+ </message>
+ <message name="IDS_DEVTOOLS_414b730ab2cf9123d9230740864ffeec" desc="">
+ Close DevTools
+ </message>
+ <message name="IDS_DEVTOOLS_4252b72e6ebcd4d4b4c2e46a786f03d2" desc="">
+ Zoom
+ </message>
+ <message name="IDS_DEVTOOLS_45f80006d304f294d6c1de50c244856e" desc="">
+ Add location...
+ </message>
+ <message name="IDS_DEVTOOLS_4dab36ac83853282fc0d7bae20c19e90" desc="">
+ More options
+ </message>
+ <message name="IDS_DEVTOOLS_50510c6a5a0e14ddd3a68f6dd1cf2f79" desc="">
+ Device name
+ </message>
+ <message name="IDS_DEVTOOLS_526d688f37a86d3c3f27d0c5016eb71d" desc="">
+ Reset
+ </message>
+ <message name="IDS_DEVTOOLS_58cc7602635a11277aa7531e14b32c97" desc="">
+ Portrait upside down
+ </message>
+ <message name="IDS_DEVTOOLS_59c06928c1dcdb1a687bf21d73e53a09" desc="">
+ Show device frame
+ </message>
+ <message name="IDS_DEVTOOLS_614103b76fd0d9de068d69034fb6f987" desc="">
+ (<ph name="THIS__MODEL_DEVICE___TITLE">$1s</ph>)
+ </message>
+ <message name="IDS_DEVTOOLS_6149711fb8edc5e2adeea7aa63ee11ff" desc="">
+ 150%
+ </message>
+ <message name="IDS_DEVTOOLS_62759e0d418d7391bf2d54e70cbcc05d" desc="">
+ Remove device type
+ </message>
+ <message name="IDS_DEVTOOLS_633c01074b6726183e20f42bb3ee01c0" desc="">
+ 4K
+ </message>
+ <message name="IDS_DEVTOOLS_649676015173b6195516eed77e5aee60" desc="">
+ 125%
+ </message>
+ <message name="IDS_DEVTOOLS_6adf97f83acf6453d4a6a4b1070f3754" desc="">
+ None
+ </message>
+ <message name="IDS_DEVTOOLS_7087f70b643f941c968dc3b327cbe111" desc="">
+ Adjust with mousewheel or up/down keys. <ph name="CMDORCTRL">$1s</ph>: ±10, Shift: ±1, Alt: ±0.01
+ </message>
+ <message name="IDS_DEVTOOLS_75a37bfcbfe2678114513aef903c4ba5" desc="">
+ Default: <ph name="DEFAULTVALUE">$1.1f</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_7ad87024f63b3bb0292c21d76f2c7438" desc="">
+ Add device pixel ratio
+ </message>
+ <message name="IDS_DEVTOOLS_7addb86955014a622eaefae5134fcb7a" desc="">
+ Remove device pixel ratio
+ </message>
+ <message name="IDS_DEVTOOLS_7f163d0494446906a484df67e90c1d6b" desc="">
+ Hide device frame
+ </message>
+ <message name="IDS_DEVTOOLS_815dff01257e5ef182b25d4c1ef0a7a0" desc="">
+ Landscape
+ </message>
+ <message name="IDS_DEVTOOLS_81c3744a7fe979d029d1e7b84afd613f" desc="">
+ *Requires reload
+ </message>
+ <message name="IDS_DEVTOOLS_82a9b801e28c4dec617b1cabc329f5bd" desc="">
+ Capture screenshot
+ </message>
+ <message name="IDS_DEVTOOLS_8394f0347c184cf156ac5924dccb773b" desc="">
+ Long
+ </message>
+ <message name="IDS_DEVTOOLS_8d2de5368588552fbae54044ac5c7b3d" desc="">
+ Rotate
+ </message>
+ <message name="IDS_DEVTOOLS_8d7b5211545faceef57a041ee56a2f5e" desc="">
+ Capture full size screenshot
+ </message>
+ <message name="IDS_DEVTOOLS_901bc0a4714ff81c24943a50e620de71" desc="">
+ User agent string
+ </message>
+ <message name="IDS_DEVTOOLS_95129d2a7de16087427f1632dc691287" desc="">
+ Hide media queries
+ </message>
+ <message name="IDS_DEVTOOLS_9b4dabc50f0b8ccba1c8981831abdad8" desc="">
+ Longitude
+ </message>
+ <message name="IDS_DEVTOOLS_9fa08fa6b5a65fd3a2e14858a2559027" desc="">
+ β (beta)
+ </message>
+ <message name="IDS_DEVTOOLS_9fd04ab471b39141991551708305ceb5" desc="">
+ Add custom device...
+ </message>
+ <message name="IDS_DEVTOOLS_a043e816a2c42b9290b672b1aa22cb73" desc="">
+ Mobile M
+ </message>
+ <message name="IDS_DEVTOOLS_a07f7588275e6b286450c54c3fb5bc92" desc="">
+ No override
+ </message>
+ <message name="IDS_DEVTOOLS_a68cfcae283e3b2a60c99386c809fd6e" desc="">
+ Shift+drag horizontally to rotate around the y-axis
+ </message>
+ <message name="IDS_DEVTOOLS_a7e2da1e5160847a88912b69027bca09" desc="">
+ Enable orientation to rotate
+ </message>
+ <message name="IDS_DEVTOOLS_a88789aba0125292a7a2b8774a979b37" desc="">
+ Geolocations
+ </message>
+ <message name="IDS_DEVTOOLS_abbd64f40c34c537d3a571af068fce29" desc="">
+ Orientation
+ </message>
+ <message name="IDS_DEVTOOLS_af29aa178ae43211319e28f627e96590" desc="">
+ Sensors
+ </message>
+ <message name="IDS_DEVTOOLS_b0ac9a67aaac87b4b70f5e1b7292b2cc" desc="">
+ Fit to window (<ph name="THIS__MODEL_FITSCALE________">$1.0f</ph>%%)
+ </message>
+ <message name="IDS_DEVTOOLS_b1596787a9a32a2626743258abf34e80" desc="">
+ Landscape left
+ </message>
+ <message name="IDS_DEVTOOLS_b2b22e112d16f958f75ea888f9ce8eeb" desc="">
+ Display down
+ </message>
+ <message name="IDS_DEVTOOLS_b2b2df378a7c7ade199bbaf944cb3f35" desc="">
+ Responsive
+ </message>
+ <message name="IDS_DEVTOOLS_b435e227d5dd201e1768b2bcb2e0aa81" desc="">
+ height
+ </message>
+ <message name="IDS_DEVTOOLS_b85e1916c38f0c0c2d0f7c8d210bcf9e" desc="">
+ Height (leave empty for full)
+ </message>
+ <message name="IDS_DEVTOOLS_b8d750b6ef9a441434c83df4334c4fa0" desc="">
+ Display up
+ </message>
+ <message name="IDS_DEVTOOLS_b90203c84f857a0403751bf77f100400" desc="">
+ Reveal in source code
+ </message>
+ <message name="IDS_DEVTOOLS_bb3680a6300bf660b59ba8783b18689b" desc="">
+ Hide rulers
+ </message>
+ <message name="IDS_DEVTOOLS_c107e6e26d3b1b5eadbf9e842f6c0e05" desc="">
+ Add device type
+ </message>
+ <message name="IDS_DEVTOOLS_c23fc6f13afcbcd7dee750fe4f074421" desc="">
+ Lat
+ </message>
+ <message name="IDS_DEVTOOLS_c3abc91ecb930fd1d8a6b1e738eb36be" desc="">
+ Custom Geolocations
+ </message>
+ <message name="IDS_DEVTOOLS_c3c3720080d9497b9df37fcd78994144" desc="">
+ Location name
+ </message>
+ <message name="IDS_DEVTOOLS_c4ca4238a0b923820dcc509a6f75849b" desc="">
+ 1
+ </message>
+ <message name="IDS_DEVTOOLS_c81e728d9d4c2f636f067f89cc14862c" desc="">
+ 2
+ </message>
+ <message name="IDS_DEVTOOLS_cb211766ff41a03bb9f324be3db9dae0" desc="">
+ Mobile L
+ </message>
+ <message name="IDS_DEVTOOLS_d15305d7a4e34e02489c74a5ef542f36" desc="">
+ Off
+ </message>
+ <message name="IDS_DEVTOOLS_da31f3ff326e70f6b08748520c553920" desc="">
+ γ (gamma)
+ </message>
+ <message name="IDS_DEVTOOLS_decc67818f6be186e03a3c27c2eedc9e" desc="">
+ Double-click for full height
+ </message>
+ <message name="IDS_DEVTOOLS_e67750c8b85dbe1b938397e55488e2d8" desc="">
+ Other…
+ </message>
+ <message name="IDS_DEVTOOLS_e85c8bc51cfa9b2d3713091fdc87d551" desc="">
+ Auto-adjust zoom
+ </message>
+ <message name="IDS_DEVTOOLS_eccbc87e4b5ce2fe28308fd9f2a7baf3" desc="">
+ 3
+ </message>
+ <message name="IDS_DEVTOOLS_ee1cab1975e28575b1631ee8fc4ea749" desc="">
+ Capture node screenshot
+ </message>
+ <message name="IDS_DEVTOOLS_ee4cf994f6defec5951824b44f8047b1" desc="">
+ Screen options
+ </message>
+ <message name="IDS_DEVTOOLS_f0f31c9700c6b10d8a20dc487b2ae6a8" desc="">
+ Touch
+ </message>
+ <message name="IDS_DEVTOOLS_f2a72a44f7b7d30829c0405ed2385345" desc="">
+ Mobile S
+ </message>
+ <message name="IDS_DEVTOOLS_f819de81247be4a5428dc0e169de28b8" desc="">
+ 75%
+ </message>
+ <message name="IDS_DEVTOOLS_fd0a6990abd15cd06c80309237b01262" desc="">
+ Emulated Devices
+ </message>
+</grit-part> \ No newline at end of file
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/emulation/geolocationsSettingsTab.css b/chromium/third_party/blink/renderer/devtools/front_end/emulation/geolocationsSettingsTab.css
index 53c1f185e34..f6a0a37b958 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/emulation/geolocationsSettingsTab.css
+++ b/chromium/third_party/blink/renderer/devtools/front_end/emulation/geolocationsSettingsTab.css
@@ -86,9 +86,3 @@
text-align: inherit;
}
-.geolocations-edit-optional {
- position: absolute;
- bottom: -20px;
- right: 0;
- color: rgb(128, 128, 128);
-}
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/emulation/sensors.css b/chromium/third_party/blink/renderer/devtools/front_end/emulation/sensors.css
index acac8d9ff25..f89c59e63b2 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/emulation/sensors.css
+++ b/chromium/third_party/blink/renderer/devtools/front_end/emulation/sensors.css
@@ -32,10 +32,6 @@
opacity: 0.5;
}
-.sensors-view .field-error-message {
- display: none;
-}
-
.sensors-view input:focus::-webkit-input-placeholder {
color: transparent !important;
}
@@ -287,14 +283,6 @@ fieldset.device-orientation-override-section {
display: flex;
}
-.touch-label {
- margin-top: 10px;
-}
-
-.touch-label select {
- margin-left: 10px;
-}
-
.panel-section-separator {
height: 2px;
margin-bottom: 8px;
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/event_listeners/event_listeners_strings.grdp b/chromium/third_party/blink/renderer/devtools/front_end/event_listeners/event_listeners_strings.grdp
new file mode 100644
index 00000000000..5e2d7f68513
--- /dev/null
+++ b/chromium/third_party/blink/renderer/devtools/front_end/event_listeners/event_listeners_strings.grdp
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<grit-part>
+ <message name="IDS_DEVTOOLS_0b9c1def3b0d84fe6234388ff8dfa8b7" desc="">
+ Toggle whether event listener is passive or blocking
+ </message>
+ <message name="IDS_DEVTOOLS_1063e38cb53d94d386f21227fcd84717" desc="">
+ Remove
+ </message>
+ <message name="IDS_DEVTOOLS_7667495b756ef15210cd60285d8de58a" desc="">
+ No event listeners
+ </message>
+ <message name="IDS_DEVTOOLS_8d036bf35b7274602d923724afeb7878" desc="">
+ Toggle Passive
+ </message>
+ <message name="IDS_DEVTOOLS_ba54da0de85f689f31c5e48b3e4c0de3" desc="">
+ Delete event listener
+ </message>
+</grit-part> \ No newline at end of file
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/externs.js b/chromium/third_party/blink/renderer/devtools/front_end/externs.js
index 9b862d98ef9..925c138e214 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/externs.js
+++ b/chromium/third_party/blink/renderer/devtools/front_end/externs.js
@@ -906,6 +906,24 @@ ReportRenderer.prototype = {
};
/**
+ * @constructor
+ * @param {!DOM} dom
+ */
+const ReportUIFeatures = function(dom) {};
+
+ReportUIFeatures.prototype = {
+ /**
+ * @param {!Document|!Element} context
+ */
+ setTemplateContext: function(context) {},
+
+ /**
+ * @param {!ReportRenderer.ReportJSON} report
+ */
+ initFeatures: function(report) {},
+};
+
+/**
* @typedef {{
* rawValue: (number|boolean|undefined),
* id: string,
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/har_importer/HARFormat.js b/chromium/third_party/blink/renderer/devtools/front_end/har_importer/HARFormat.js
index 07a39899227..c8178e09f86 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/har_importer/HARFormat.js
+++ b/chromium/third_party/blink/renderer/devtools/front_end/har_importer/HARFormat.js
@@ -73,6 +73,15 @@ HARImporter.HARBase = class {
return;
return value;
}
+
+ /**
+ * @param {string} name
+ * @return {!Array|undefined}
+ */
+ customAsArray(name) {
+ const value = /** @type {!Object} */ (this)['_' + name];
+ return Array.isArray(value) ? value : undefined;
+ }
};
// Using any of these classes may throw.
@@ -164,6 +173,8 @@ HARImporter.HAREntry = class extends HARImporter.HARBase {
this._initiator = new HARImporter.HARInitiator(data['_initiator']);
this._priority = HARImporter.HARBase._optionalString(data['_priority']);
this._resourceType = HARImporter.HARBase._optionalString(data['_resourceType']);
+ if (Array.isArray(data['_webSocketMessages']))
+ this._webSocketMessages = data['_webSocketMessages'].map(message => new HARImporter.HARWebSocketMessage(message));
}
};
@@ -331,3 +342,16 @@ HARImporter.HARInitiator = class extends HARImporter.HARBase {
this.lineNumber = HARImporter.HARBase._optionalNumber(data['lineNumber']);
}
};
+
+HARImporter.HARWebSocketMessage = class extends HARImporter.HARBase {
+ /**
+ * @param {*} data
+ */
+ constructor(data) {
+ super(data);
+ this.time = HARImporter.HARBase._optionalNumber(data['time']);
+ this.opcode = HARImporter.HARBase._optionalNumber(data['opcode']);
+ this.data = HARImporter.HARBase._optionalString(data['data']);
+ this.type = HARImporter.HARBase._optionalString(data['type']);
+ }
+};
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/har_importer/HARImporter.js b/chromium/third_party/blink/renderer/devtools/front_end/har_importer/HARImporter.js
index aa982f445b7..9d675efdf54 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/har_importer/HARImporter.js
+++ b/chromium/third_party/blink/renderer/devtools/front_end/har_importer/HARImporter.js
@@ -122,6 +122,24 @@ HARImporter.Importer = class {
if (Protocol.Network.ResourcePriority.hasOwnProperty(priority))
request.setPriority(/** @type {!Protocol.Network.ResourcePriority} */ (priority));
+ const messages = entry.customAsArray('webSocketMessages');
+ if (messages) {
+ for (const message of messages) {
+ if (message.time === undefined)
+ continue;
+ if (!Object.values(SDK.NetworkRequest.WebSocketFrameType).includes(message.type))
+ continue;
+ if (message.opcode === undefined)
+ continue;
+ if (message.data === undefined)
+ continue;
+
+ const mask = message.type === SDK.NetworkRequest.WebSocketFrameType.Send;
+ request.addFrame(
+ {time: message.time, text: message.data, opCode: message.opcode, mask: mask, type: message.type});
+ }
+ }
+
request.finished = true;
}
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/heap_snapshot_worker/heap_snapshot_worker_strings.grdp b/chromium/third_party/blink/renderer/devtools/front_end/heap_snapshot_worker/heap_snapshot_worker_strings.grdp
new file mode 100644
index 00000000000..32fd74a8a71
--- /dev/null
+++ b/chromium/third_party/blink/renderer/devtools/front_end/heap_snapshot_worker/heap_snapshot_worker_strings.grdp
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<grit-part>
+ <message name="IDS_DEVTOOLS_239026e523e6f9780426e03637c5b4a4" desc="">
+ Loading strings…
+ </message>
+ <message name="IDS_DEVTOOLS_58e8a5ca400f834526b09d680ddbc5d5" desc="">
+ Loading samples…
+ </message>
+ <message name="IDS_DEVTOOLS_6a542856aa30e3e814eaed146e67b2fd" desc="">
+ Loading nodes… <ph name="PH1">$1d</ph>%%
+ </message>
+ <message name="IDS_DEVTOOLS_7da2f27d62adf93b01c2c041f37667b9" desc="">
+ Processing snapshot…
+ </message>
+ <message name="IDS_DEVTOOLS_84c0ec1ee2bc769daf265e63bd793201" desc="">
+ Loading snapshot info…
+ </message>
+ <message name="IDS_DEVTOOLS_9bdae72f224411b7f1027a2c5c7c519b" desc="">
+ Loading locations…
+ </message>
+ <message name="IDS_DEVTOOLS_b0da59cea23d810234b75c2357748ad3" desc="">
+ Loading edges… <ph name="PH1">$1d</ph>%%
+ </message>
+ <message name="IDS_DEVTOOLS_d67d63eca2747a30e1ffaeb04389c0bb" desc="">
+ Loading allocation traces… <ph name="PH1">$1d</ph>%%
+ </message>
+</grit-part> \ No newline at end of file
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/help/ReleaseNoteText.js b/chromium/third_party/blink/renderer/devtools/front_end/help/ReleaseNoteText.js
index a1989e904e3..6b57a84b2fa 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/help/ReleaseNoteText.js
+++ b/chromium/third_party/blink/renderer/devtools/front_end/help/ReleaseNoteText.js
@@ -13,6 +13,29 @@ const commandMenuShortcut = Host.isMac() ? 'Command + Shift + P' : 'Control + Sh
/** @type {!Array<!Help.ReleaseNote>} */
Help.releaseNoteText = [
{
+ version: 18,
+ header: 'Highlights from the Chrome 76 update',
+ highlights: [
+ {
+ title: 'Autocomplete with CSS keyword values',
+ subtitle: 'Typing a keyword value like "bold" in the Styles pane now autocompletes to "font-weight: bold".',
+ link: 'https://developers.google.com/web/updates/2019/05/devtools#values',
+ },
+ {
+ title: 'A new UI for network settings',
+ subtitle:
+ 'The "Use large request rows", "Group by frame", "Show overview", and "Capture screenshots" options have moved to the new Network Settings pane.',
+ link: 'https://developers.google.com/web/updates/2019/05/devtools#settings',
+ },
+ {
+ title: 'WebSocket messages in HAR exports',
+ subtitle: 'Network logs downloaded from the Network panel now include WebSocket messages.',
+ link: 'https://developers.google.com/web/updates/2019/05/devtools#websocket',
+ },
+ ],
+ link: 'https://developers.google.com/web/updates/2019/05/devtools',
+ },
+ {
version: 17,
header: 'Highlights from the Chrome 75 update',
highlights: [
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/help/help_strings.grdp b/chromium/third_party/blink/renderer/devtools/front_end/help/help_strings.grdp
new file mode 100644
index 00000000000..8c9f0a79d26
--- /dev/null
+++ b/chromium/third_party/blink/renderer/devtools/front_end/help/help_strings.grdp
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<grit-part>
+ <message name="IDS_DEVTOOLS_6a26f548831e6a8c26bfbbd9f6ec61e0" desc="">
+ Help
+ </message>
+ <message name="IDS_DEVTOOLS_7d0ee6fed10d3d4e5c9ee496729ab519" desc="">
+ Release notes
+ </message>
+ <message name="IDS_DEVTOOLS_8aac48e1ab540a0467ac1c4b884f68c1" desc="">
+ Do not show What&apos;s New after each update
+ </message>
+ <message name="IDS_DEVTOOLS_8caba5463b13f01c4168decae23f9aff" desc="">
+ Show What&apos;s New after each update
+ </message>
+ <message name="IDS_DEVTOOLS_91770f038cd944a1d3b9b347edeb2b10" desc="">
+ What&apos;s New
+ </message>
+ <message name="IDS_DEVTOOLS_a1c58e94227389415de133efdf78ea6e" desc="">
+ Appearance
+ </message>
+</grit-part> \ No newline at end of file
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/host/InspectorFrontendHost.js b/chromium/third_party/blink/renderer/devtools/front_end/host/InspectorFrontendHost.js
index f760893dfab..bcd0d2cc4bb 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/host/InspectorFrontendHost.js
+++ b/chromium/third_party/blink/renderer/devtools/front_end/host/InspectorFrontendHost.js
@@ -230,6 +230,13 @@ Host.InspectorFrontendHostStub = class {
/**
* @override
+ * @param {string} umaName
+ */
+ recordUserMetricsAction(umaName) {
+ }
+
+ /**
+ * @override
*/
requestFileSystems() {
this.events.dispatchEventToListeners(InspectorFrontendHostAPI.Events.FileSystemsLoaded, []);
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/host/InspectorFrontendHostAPI.js b/chromium/third_party/blink/renderer/devtools/front_end/host/InspectorFrontendHostAPI.js
index b8955b271a8..6bbe4f6547b 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/host/InspectorFrontendHostAPI.js
+++ b/chromium/third_party/blink/renderer/devtools/front_end/host/InspectorFrontendHostAPI.js
@@ -247,6 +247,11 @@ InspectorFrontendHostAPI.prototype = {
recordPerformanceHistogram(histogramName, duration) {},
/**
+ * @param {string} umaName
+ */
+ recordUserMetricsAction(umaName) {},
+
+ /**
* @param {string} message
*/
sendMessageToBackend(message) {},
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/host/Platform.js b/chromium/third_party/blink/renderer/devtools/front_end/host/Platform.js
index 427b307b43f..c6fa64f6fa7 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/host/Platform.js
+++ b/chromium/third_party/blink/renderer/devtools/front_end/host/Platform.js
@@ -59,7 +59,7 @@ Host.isWin = function() {
*/
Host.isCustomDevtoolsFrontend = function() {
if (typeof Host._isCustomDevtoolsFronend === 'undefined')
- Host._isCustomDevtoolsFronend = window.location.toString().startsWith('chrome-devtools://devtools/custom/');
+ Host._isCustomDevtoolsFronend = window.location.toString().startsWith('devtools://devtools/custom/');
return Host._isCustomDevtoolsFronend;
};
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/host/host_strings.grdp b/chromium/third_party/blink/renderer/devtools/front_end/host/host_strings.grdp
new file mode 100644
index 00000000000..1f48de46b1e
--- /dev/null
+++ b/chromium/third_party/blink/renderer/devtools/front_end/host/host_strings.grdp
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<grit-part>
+ <message name="IDS_DEVTOOLS_92bb7e733a12d24684262f046afcc2fd" desc="">
+ DevTools - <ph name="URL_REPLACE___HTTPS____________">$1s</ph>
+ </message>
+</grit-part> \ No newline at end of file
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/inline_editor/bezierEditor.css b/chromium/third_party/blink/renderer/devtools/front_end/inline_editor/bezierEditor.css
index 6da7ab04914..dc0d556a840 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/inline_editor/bezierEditor.css
+++ b/chromium/third_party/blink/renderer/devtools/front_end/inline_editor/bezierEditor.css
@@ -16,10 +16,6 @@
background-color: var(--selection-bg-color);
}
-.bezier-preset-label {
- font-size: 10px;
-}
-
.bezier-preset {
width: 50px;
height: 50px;
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/inline_editor/inline_editor_strings.grdp b/chromium/third_party/blink/renderer/devtools/front_end/inline_editor/inline_editor_strings.grdp
new file mode 100644
index 00000000000..ed320a5b9c8
--- /dev/null
+++ b/chromium/third_party/blink/renderer/devtools/front_end/inline_editor/inline_editor_strings.grdp
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<grit-part>
+ <message name="IDS_DEVTOOLS_180bc3b1c5619aaef40e803f49921012" desc="">
+ Spread
+ </message>
+ <message name="IDS_DEVTOOLS_2134e3ae0c489ce87a007a082d6a9a29" desc="">
+ X offset
+ </message>
+ <message name="IDS_DEVTOOLS_575ed851c8964c290e73055ffdc085a6" desc="">
+ Y offset
+ </message>
+ <message name="IDS_DEVTOOLS_5e9fb94d2ec46e6f829196c229e2b194" desc="">
+ Outset
+ </message>
+ <message name="IDS_DEVTOOLS_8b52de510bc5497ac43abfe566be48ab" desc="">
+ Blur
+ </message>
+ <message name="IDS_DEVTOOLS_b56d315e49178ba86341ff3b4e337c6b" desc="">
+ Inset
+ </message>
+ <message name="IDS_DEVTOOLS_d65b5983f317c42c6f6dff5678e628ca" desc="">
+ Shift-click to change color format
+ </message>
+</grit-part> \ No newline at end of file
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/inspector_main/inspector_main_strings.grdp b/chromium/third_party/blink/renderer/devtools/front_end/inspector_main/inspector_main_strings.grdp
new file mode 100644
index 00000000000..a50e0df19b0
--- /dev/null
+++ b/chromium/third_party/blink/renderer/devtools/front_end/inspector_main/inspector_main_strings.grdp
@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="utf-8"?>
+<grit-part>
+ <message name="IDS_DEVTOOLS_099969ccad146161b304e766f9a1fe56" desc="">
+ Show ads on this site, if allowed
+ </message>
+ <message name="IDS_DEVTOOLS_0b2cccf3868759cb77614faf9afd0342" desc="">
+ JavaScript is disabled
+ </message>
+ <message name="IDS_DEVTOOLS_0be2a0127487580b30b7d44eb6dd57ae" desc="">
+ Paint flashing
+ </message>
+ <message name="IDS_DEVTOOLS_0ef16a6645018dec4609e392c7e9bda1" desc="">
+ Do not auto-open DevTools for popups
+ </message>
+ <message name="IDS_DEVTOOLS_115c68d941dcba0167cee3483c1bbbb2" desc="">
+ Shows layer borders (orange/olive) and tiles (cyan)
+ </message>
+ <message name="IDS_DEVTOOLS_1808fb32cf4e8a03daa326b48d4246eb" desc="">
+ Disable paused state overlay
+ </message>
+ <message name="IDS_DEVTOOLS_2b1a578586beb46008e1542e9283ad99" desc="">
+ Scrolling performance issues
+ </message>
+ <message name="IDS_DEVTOOLS_417316246f12b8235535182cc9eebe45" desc="">
+ Forces media type for testing print and screen styles
+ </message>
+ <message name="IDS_DEVTOOLS_441e4ae4f15d6bdee7939aa9bfd61010" desc="">
+ Plots frames per second, frame rate distribution, and GPU memory
+ </message>
+ <message name="IDS_DEVTOOLS_482a4dca0bbd8fcdda5acc6f95f3c279" desc="">
+ DevTools
+ </message>
+ <message name="IDS_DEVTOOLS_53f2f05226edcd77bd4351cb27d07ba8" desc="">
+ Highlights frames (red) detected to be ads.
+ </message>
+ <message name="IDS_DEVTOOLS_6eac03f446434baa29ece59d88410812" desc="">
+ FPS meter
+ </message>
+ <message name="IDS_DEVTOOLS_6f762270888a17bde49797355db7a410" desc="">
+ Shows borders around hit-test regions
+ </message>
+ <message name="IDS_DEVTOOLS_7962fd6013e985379fd3a4964d769703" desc="">
+ Hit-test borders
+ </message>
+ <message name="IDS_DEVTOOLS_7e9495c56e55fa2c5236512bf80e5d2b" desc="">
+ Don&apos;t show Chrome Data Saver warning
+ </message>
+ <message name="IDS_DEVTOOLS_8339f28e0c74e2c821b05332280c754b" desc="">
+ Force ad blocking on this site
+ </message>
+ <message name="IDS_DEVTOOLS_846495f9ceed11accf8879f555936a7d" desc="">
+ Navigation
+ </message>
+ <message name="IDS_DEVTOOLS_8634af2a16e41305fc8dca2d67360810" desc="">
+ Open dedicated DevTools for Node.js
+ </message>
+ <message name="IDS_DEVTOOLS_869a8b1ed99306604574dca474a13994" desc="">
+ Emulate CSS media
+ </message>
+ <message name="IDS_DEVTOOLS_86f849e1a655c2df19f28cb3dfe07bc9" desc="">
+ Block ads on this site
+ </message>
+ <message name="IDS_DEVTOOLS_886f598a8a9e6a4bfe0c09fcf7779611" desc="">
+ Emulate a focused page
+ </message>
+ <message name="IDS_DEVTOOLS_9182eda0635ccdc88276ba9e013c5c1b" desc="">
+ Do not emulate a focused page
+ </message>
+ <message name="IDS_DEVTOOLS_960568e27eb66ea554c3be4cfbefe3d0" desc="">
+ Layer borders
+ </message>
+ <message name="IDS_DEVTOOLS_a02c83a7dbd96295beaefb72c2bee2de" desc="">
+ Main
+ </message>
+ <message name="IDS_DEVTOOLS_a15932c4dfbbcbc1ac6f5c27c6fa530f" desc="">
+ Highlights elements (teal) that can slow down scrolling, including touch &amp; wheel event handlers and other main-thread scrolling situations.
+ </message>
+ <message name="IDS_DEVTOOLS_a6e8f9aed2ac6481dc25a18a33342d03" desc="">
+ Rendering
+ </message>
+ <message name="IDS_DEVTOOLS_cb835af5f855f79e8611dd3f8fec6aac" desc="">
+ Reload page
+ </message>
+ <message name="IDS_DEVTOOLS_d543dbe64db0c952d6e13c9519218b3e" desc="">
+ Hard reload page
+ </message>
+ <message name="IDS_DEVTOOLS_ef95393ad48336d7c3543625354a3d56" desc="">
+ Highlight ad frames
+ </message>
+ <message name="IDS_DEVTOOLS_f23c9ba06e7123f0b4c906de90fbcc9f" desc="">
+ Auto-open DevTools for popups
+ </message>
+ <message name="IDS_DEVTOOLS_f6b139a6b392ab11c9c5c8210c525688" desc="">
+ Highlights areas of the page (green) that need to be repainted
+ </message>
+</grit-part> \ No newline at end of file
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/js_profiler/js_profiler_strings.grdp b/chromium/third_party/blink/renderer/devtools/front_end/js_profiler/js_profiler_strings.grdp
new file mode 100644
index 00000000000..cbe64e017b0
--- /dev/null
+++ b/chromium/third_party/blink/renderer/devtools/front_end/js_profiler/js_profiler_strings.grdp
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<grit-part>
+ <message name="IDS_DEVTOOLS_65b4c7424dd695c30efa73da8396c90c" desc="">
+ Profiler
+ </message>
+</grit-part> \ No newline at end of file
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/langpacks/devtools_ui_strings.grd b/chromium/third_party/blink/renderer/devtools/front_end/langpacks/devtools_ui_strings.grd
new file mode 100644
index 00000000000..132a5c482b9
--- /dev/null
+++ b/chromium/third_party/blink/renderer/devtools/front_end/langpacks/devtools_ui_strings.grd
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- DevTools-specific strings. -->
+<grit latest_public_release="0" current_release="1" output_all_resource_defines="false" source_lang_id="en">
+ <outputs>
+ <output filename="devtools_ui_strings.h" type="rc_header">
+ <emit emit_type='prepend'></emit>
+ </output>
+ <output filename="devtools_ui_strings_en-US.pak" type="data_package" lang="en-US" />
+ </outputs>
+ <translations>
+ </translations>
+ <release seq="1" allow_pseudo="false">
+ <messages fallback_to_english="true">
+ <part file="../accessibility/accessibility_strings.grdp" />
+ <part file="../animation/animation_strings.grdp" />
+ <part file="../audits2/audits2_strings.grdp" />
+ <part file="../bindings/bindings_strings.grdp" />
+ <part file="../browser_debugger/browser_debugger_strings.grdp" />
+ <part file="../browser_sdk/browser_sdk_strings.grdp" />
+ <part file="../changes/changes_strings.grdp" />
+ <part file="../color_picker/color_picker_strings.grdp" />
+ <part file="../components/components_strings.grdp" />
+ <part file="../console/console_strings.grdp" />
+ <part file="../console_counters/console_counters_strings.grdp" />
+ <part file="../cookie_table/cookie_table_strings.grdp" />
+ <part file="../coverage/coverage_strings.grdp" />
+ <part file="../data_grid/data_grid_strings.grdp" />
+ <part file="../devices/devices_strings.grdp" />
+ <part file="../elements/elements_strings.grdp" />
+ <part file="../emulated_devices/emulated_devices_strings.grdp" />
+ <part file="../emulation/emulation_strings.grdp" />
+ <part file="../event_listeners/event_listeners_strings.grdp" />
+ <part file="../heap_snapshot_worker/heap_snapshot_worker_strings.grdp" />
+ <part file="../help/help_strings.grdp" />
+ <part file="../host/host_strings.grdp" />
+ <part file="../inline_editor/inline_editor_strings.grdp" />
+ <part file="../inspector_main/inspector_main_strings.grdp" />
+ <part file="../js_profiler/js_profiler_strings.grdp" />
+ <part file="../layer_viewer/layer_viewer_strings.grdp" />
+ <part file="../layers/layers_strings.grdp" />
+ <part file="../main/main_strings.grdp" />
+ <part file="../mobile_throttling/mobile_throttling_strings.grdp" />
+ <part file="../network/network_strings.grdp" />
+ <part file="../node_debugger/node_debugger_strings.grdp" />
+ <part file="../node_main/node_main_strings.grdp" />
+ <part file="../object_ui/object_ui_strings.grdp" />
+ <part file="../perf_ui/perf_ui_strings.grdp" />
+ <part file="../performance_monitor/performance_monitor_strings.grdp" />
+ <part file="../persistence/persistence_strings.grdp" />
+ <part file="../product_registry/product_registry_strings.grdp" />
+ <part file="../profiler/profiler_strings.grdp" />
+ <part file="../protocol_monitor/protocol_monitor_strings.grdp" />
+ <part file="../quick_open/quick_open_strings.grdp" />
+ <part file="../resources/resources_strings.grdp" />
+ <part file="../screencast/screencast_strings.grdp" />
+ <part file="../sdk/sdk_strings.grdp" />
+ <part file="../search/search_strings.grdp" />
+ <part file="../security/security_strings.grdp" />
+ <part file="../settings/settings_strings.grdp" />
+ <part file="../snippets/snippets_strings.grdp" />
+ <part file="../source_frame/source_frame_strings.grdp" />
+ <part file="../sources/sources_strings.grdp" />
+ <part file="../terminal/terminal_strings.grdp" />
+ <part file="../text_editor/text_editor_strings.grdp" />
+ <part file="../timeline/timeline_strings.grdp" />
+ <part file="../timeline_model/timeline_model_strings.grdp" />
+ <part file="../ui/ui_strings.grdp" />
+ <part file="../web_audio/web_audio_strings.grdp" />
+ <part file="../workspace/workspace_strings.grdp" />
+ </messages>
+ </release>
+</grit>
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/layer_viewer/PaintProfilerView.js b/chromium/third_party/blink/renderer/devtools/front_end/layer_viewer/PaintProfilerView.js
index c5d88b9fb06..011753a0298 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/layer_viewer/PaintProfilerView.js
+++ b/chromium/third_party/blink/renderer/devtools/front_end/layer_viewer/PaintProfilerView.js
@@ -42,7 +42,8 @@ LayerViewer.PaintProfilerView = class extends UI.HBox {
this._canvasContainer = this.contentElement.createChild('div', 'paint-profiler-canvas-container');
this._progressBanner = this.contentElement.createChild('div', 'full-widget-dimmed-banner hidden');
this._progressBanner.textContent = Common.UIString('Profiling\u2026');
- this._pieChart = new PerfUI.PieChart(55, this._formatPieChartTime.bind(this), true);
+ this._pieChart = new PerfUI.PieChart(
+ {chartName: ls`Profiling Results`, size: 55, formatter: this._formatPieChartTime.bind(this)});
this._pieChart.element.classList.add('paint-profiler-pie-chart');
this.contentElement.appendChild(this._pieChart.element);
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/layer_viewer/layer_viewer_strings.grdp b/chromium/third_party/blink/renderer/devtools/front_end/layer_viewer/layer_viewer_strings.grdp
new file mode 100644
index 00000000000..8fc580ff675
--- /dev/null
+++ b/chromium/third_party/blink/renderer/devtools/front_end/layer_viewer/layer_viewer_strings.grdp
@@ -0,0 +1,213 @@
+<?xml version="1.0" encoding="utf-8"?>
+<grit-part>
+ <message name="IDS_DEVTOOLS_05245b74ad79bb210a68107f7de0c27f" desc="">
+ Layer for scrolling container.
+ </message>
+ <message name="IDS_DEVTOOLS_08415c56f6c6c2efb0218629836e31bc" desc="">
+ Composition due to association with an element with a &quot;backface-visibility: hidden&quot; style.
+ </message>
+ <message name="IDS_DEVTOOLS_0aa3ae694efd06789ae1867c80d30222" desc="">
+ Composition due to association with an element with a &quot;position: fixed&quot; or &quot;position: sticky&quot; style.
+ </message>
+ <message name="IDS_DEVTOOLS_0b4eb322e51b61340668247151340346" desc="">
+ Rotate mode (V)
+ </message>
+ <message name="IDS_DEVTOOLS_0dd70cbbb618cf0ea39d7e01238ca1b9" desc="">
+ Composition due to association with an animated element.
+ </message>
+ <message name="IDS_DEVTOOLS_135d78fcc62ff8df8028c33c768900c5" desc="">
+ Layer for background.
+ </message>
+ <message name="IDS_DEVTOOLS_219e2fb2d37a581ab2bae57397b601f1" desc="">
+ &lt;unnamed&gt;
+ </message>
+ <message name="IDS_DEVTOOLS_233612553595af00e5d227e136252422" desc="">
+ Composition due to association with an element with composited descendants.
+ </message>
+ <message name="IDS_DEVTOOLS_25d066be1268d5c07cae5cc26e06ad2b" desc="">
+ Slow scroll regions
+ </message>
+ <message name="IDS_DEVTOOLS_28b5b4891eb05cc50f537526b24038a9" desc="">
+ Composition due to association with a masked element and composited descendants.
+ </message>
+ <message name="IDS_DEVTOOLS_2a2924d1d77c00d27ce2509c34861804" desc="">
+ Layer for clip.
+ </message>
+ <message name="IDS_DEVTOOLS_2ae207ddfe5cd256a768769d93a879e5" desc="">
+ Paint Profiler
+ </message>
+ <message name="IDS_DEVTOOLS_2ca2308d45c04266f0fb51786e407287" desc="">
+ Composition due to association with an element with CSS filters applied and composited descendants.
+ </message>
+ <message name="IDS_DEVTOOLS_3228417bf9ed949e7447e7c8dcb17090" desc="">
+ Memory estimate
+ </message>
+ <message name="IDS_DEVTOOLS_37de7295335e95cb7caf78303a1edad3" desc="">
+ Composition due to association with an element with a CSS 3D transform.
+ </message>
+ <message name="IDS_DEVTOOLS_398b889c147f3b2cb3c674cfb07315b5" desc="">
+ Composition due to association with an element with opacity applied and composited descendants.
+ </message>
+ <message name="IDS_DEVTOOLS_3f03ed88ee58335aa3df453443b9c8bc" desc="">
+ Profiling…
+ </message>
+ <message name="IDS_DEVTOOLS_441f5e043a240bac8dca50f90f7be3de" desc="">
+ repaints on scroll
+ </message>
+ <message name="IDS_DEVTOOLS_45567a52ec61e3e2b5469b397db3fc2a" desc="">
+ <ph name="LAYERVIEWER_LAYERDETAILSVIEW__SLOWSCROLLRECTNAMES_GET_SCROLLRECT_TYPE_">$1s</ph> <ph name="SCROLLRECT_RECT_X">$2d</ph> × <ph name="SCROLLRECT_RECT_Y">$3d</ph> (at <ph name="SCROLLRECT_RECT_WIDTH">$4d</ph>, <ph name="SCROLLRECT_RECT_HEIGHT">$5d</ph>)
+ </message>
+ <message name="IDS_DEVTOOLS_459be6cdd6650871d6b740d1ce6bc7a3" desc="">
+ mousewheel event listener
+ </message>
+ <message name="IDS_DEVTOOLS_4881cc76c5e57422d2841026b9b93692" desc="">
+ Wheel event handler
+ </message>
+ <message name="IDS_DEVTOOLS_49ceda18652e222780b8a35f506b4678" desc="">
+ Pan mode (X)
+ </message>
+ <message name="IDS_DEVTOOLS_4a1a29f7d8a02e0294dc9134e97e9134" desc="">
+ Sticky position constraint
+ </message>
+ <message name="IDS_DEVTOOLS_4ee55709b19d806bb2f83a264a8a0f75" desc="">
+ Sticky Box <ph name="STICKYBOXRECT_WIDTH">$1d</ph> × <ph name="STICKYBOXRECT_HEIGHT">$2d</ph> (at <ph name="STICKYBOXRECT_X">$3d</ph>, <ph name="STICKYBOXRECT_Y">$4d</ph>)
+ </message>
+ <message name="IDS_DEVTOOLS_5337a3314b26561ccf364e1777455933" desc="">
+ Composition due to association with a &lt;video&gt; element.
+ </message>
+ <message name="IDS_DEVTOOLS_5639e2813d9549835010567a48349127" desc="">
+ (<ph name="THIS__LAYER_WIDTH__">$1d</ph> × <ph name="THIS__LAYER_HEIGHT__">$2d</ph>)
+ </message>
+ <message name="IDS_DEVTOOLS_602f4c0713480f019b24f09218dcc7e0" desc="">
+ Reset View
+ </message>
+ <message name="IDS_DEVTOOLS_697e0fb75c6cf44734697517d44b5922" desc="">
+ Composition due to association with an element clipping compositing descendants.
+ </message>
+ <message name="IDS_DEVTOOLS_6fac3a4381f0fb07bbf498a08d301d40" desc="">
+ Repaints on scroll
+ </message>
+ <message name="IDS_DEVTOOLS_7069651490219723e31a486d60d96fc8" desc="">
+ Nearest Layer Shifting Sticky Box
+ </message>
+ <message name="IDS_DEVTOOLS_70baf8087d35f6bf5bde8b7c0645a1e8" desc="">
+ <ph name="TITLE">$1s</ph>: <ph name="NAME">$2s</ph> (<ph name="LAYER_ID__">$3s</ph>)
+ </message>
+ <message name="IDS_DEVTOOLS_71084df87a4cc161f7542a0f5295a950" desc="">
+ Select a layer to see its details
+ </message>
+ <message name="IDS_DEVTOOLS_73c57dbc070bac535d75b4abe9f614a3" desc="">
+ Composition due to association with an element overlapping other composited elements.
+ </message>
+ <message name="IDS_DEVTOOLS_74248c725e00bf9fe04df4e35b249a19" desc="">
+ Misc
+ </message>
+ <message name="IDS_DEVTOOLS_74ae7b35b54cd38a932ccc4f1d1c3775" desc="">
+ Touch event handler
+ </message>
+ <message name="IDS_DEVTOOLS_791faaf55ae39199cc0b4edde837f07a" desc="">
+ Layer for video overlay.
+ </message>
+ <message name="IDS_DEVTOOLS_7eb830853b9ed22a567e4d7582eafe7c" desc="">
+ Composition due to association with an element with CSS filters applied.
+ </message>
+ <message name="IDS_DEVTOOLS_82505980aa6b0cabf4cb8013a8a43b62" desc="">
+ Non fast scrollable
+ </message>
+ <message name="IDS_DEVTOOLS_82d7a4981a35bb7f6dfc8a5485a61bc6" desc="">
+ <ph name="LAYER_WIDTH__">$1d</ph> × <ph name="LAYER_HEIGHT__">$2d</ph> (at <ph name="LAYER_OFFSETX__">$3d</ph>,<ph name="LAYER_OFFSETY__">$4d</ph>)
+ </message>
+ <message name="IDS_DEVTOOLS_86ee74baff479d85d18f2cda9f8a9518" desc="">
+ Bitmap
+ </message>
+ <message name="IDS_DEVTOOLS_8810c4e0c498b81a6e4adaeabcb9f624" desc="">
+ Composition due to association with an element with a &quot;overflow-scrolling: touch&quot; style.
+ </message>
+ <message name="IDS_DEVTOOLS_894982f4a3bc0e770cece61dd12dde55" desc="">
+ Composition due to association with an &lt;iframe&gt; element.
+ </message>
+ <message name="IDS_DEVTOOLS_932a3ef55ce8133be7b33ded2992fd97" desc="">
+ Compositing Reasons
+ </message>
+ <message name="IDS_DEVTOOLS_93c3341232864688bcea4d53dff1bf10" desc="">
+ Composition due to association with an element with perspective applied.
+ </message>
+ <message name="IDS_DEVTOOLS_991bd14abd9e6004de4e7b9bc0769d9d" desc="">
+ Layer for foreground.
+ </message>
+ <message name="IDS_DEVTOOLS_9b8379825de60ccb900acf83934e1409" desc="">
+ Show internal layers
+ </message>
+ <message name="IDS_DEVTOOLS_9dffbf69ffba8bc38bc4e01abf4b1675" desc="">
+ Text
+ </message>
+ <message name="IDS_DEVTOOLS_a673813c8d6c5f511cc4d80830fc4503" desc="">
+ Can&apos;t display layers,
+ </message>
+ <message name="IDS_DEVTOOLS_aefd09cd861bbb01d381cfd74856e877" desc="">
+ Composition due to the element being a &lt;canvas&gt; element.
+ </message>
+ <message name="IDS_DEVTOOLS_b336b2cbaa7391e6e0dfef888d35a837" desc="">
+ touch event listener
+ </message>
+ <message name="IDS_DEVTOOLS_b4cc0ce8b989d360cf2bef966626e683" desc="">
+ Layer information is not yet available.
+ </message>
+ <message name="IDS_DEVTOOLS_b520b88ac5b8fbc5138849baddef2040" desc="">
+ Paint count
+ </message>
+ <message name="IDS_DEVTOOLS_b7fec868f7541e449cbb32b506aa3668" desc="">
+ Check <ph name="UI_XLINK_CREATE__ABOUT_GPU__">$1s</ph> for possible reasons.
+ </message>
+ <message name="IDS_DEVTOOLS_c0f4be326648f3fee18ffd278b614126" desc="">
+ Profiling Results
+ </message>
+ <message name="IDS_DEVTOOLS_c634209b1884c963528d21a21cb64ac8" desc="">
+ Nearest Layer Shifting Containing Block
+ </message>
+ <message name="IDS_DEVTOOLS_cd5be434fea99c341680590738e3b6d5" desc="">
+ WebGL support is disabled in your browser.
+ </message>
+ <message name="IDS_DEVTOOLS_ce1efcf7f040106cc8cb2f24c9efee35" desc="">
+ Show Paint Profiler
+ </message>
+ <message name="IDS_DEVTOOLS_cf4db365a841e7208aad0d474cbfa8e3" desc="">
+ Composition due to association with an element with descendants that have a negative z-index.
+ </message>
+ <message name="IDS_DEVTOOLS_d446f65fe70f9a640908576792497e25" desc="">
+ Composition due to association with an element with a reflection and composited descendants.
+ </message>
+ <message name="IDS_DEVTOOLS_dd4d335a4deb975546acc9fb5aa3ffce" desc="">
+ Composition due to association with an element that may overlap other composited elements.
+ </message>
+ <message name="IDS_DEVTOOLS_dff689f21faf977ee865e312c011c84a" desc="">
+ Root layer.
+ </message>
+ <message name="IDS_DEVTOOLS_e397c87a940fc2c10225a407c7f124a7" desc="">
+ Composition due to association with a plugin.
+ </message>
+ <message name="IDS_DEVTOOLS_e763043c4af617c6f33da361d990a77b" desc="">
+ Reset transform (0)
+ </message>
+ <message name="IDS_DEVTOOLS_e7ee6a7ae0e6f824f5609c7bdac34375" desc="">
+ Shapes
+ </message>
+ <message name="IDS_DEVTOOLS_ed3a481889f16ef0aab2349f5d8b5f12" desc="">
+ Containing Block <ph name="CONTAININGBLOCKRECT_WIDTH">$1d</ph> × <ph name="CONTAININGBLOCKRECT_HEIGHT">$2d</ph> (at <ph name="CONTAININGBLOCKRECT_X">$3d</ph>, <ph name="CONTAININGBLOCKRECT_Y">$4d</ph>)
+ </message>
+ <message name="IDS_DEVTOOLS_f1eb415fdb8a15856c29cc2b679e416b" desc="">
+ Composition due to association with an element with a &quot;transform-style: preserve-3d&quot; style.
+ </message>
+ <message name="IDS_DEVTOOLS_f2a4f55a424726ae504f2e694e3dc2a2" desc="">
+ Composition due to association with an element with CSS blending applied and composited descendants.
+ </message>
+ <message name="IDS_DEVTOOLS_fa055d01c0a331d642c2f55a39d4e1bb" desc="">
+ Composition due to association with an element that has blend mode other than &quot;normal&quot;.
+ </message>
+ <message name="IDS_DEVTOOLS_fb8ed4e0cd9d6ac3630df425c80d9036" desc="">
+ Layer for mask.
+ </message>
+ <message name="IDS_DEVTOOLS_fd63c694ddc8073cf10bb8025aa9aaaf" desc="">
+ Layer for scrollbar.
+ </message>
+</grit-part> \ No newline at end of file
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/layer_viewer/paintProfiler.css b/chromium/third_party/blink/renderer/devtools/front_end/layer_viewer/paintProfiler.css
index 48a06b32685..167456e7380 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/layer_viewer/paintProfiler.css
+++ b/chromium/third_party/blink/renderer/devtools/front_end/layer_viewer/paintProfiler.css
@@ -29,12 +29,6 @@
width: 100%;
}
-.paint-profiler-canvas-container .overview-grid-dividers-background,
-.paint-profiler-canvas-container .overview-grid-window {
- bottom: 0;
- height: auto;
-}
-
.paint-profiler-canvas-container .overview-grid-window-resizer {
z-index: 2000;
}
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/layers/layers_strings.grdp b/chromium/third_party/blink/renderer/devtools/front_end/layers/layers_strings.grdp
new file mode 100644
index 00000000000..ce01cd6b0c0
--- /dev/null
+++ b/chromium/third_party/blink/renderer/devtools/front_end/layers/layers_strings.grdp
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<grit-part>
+ <message name="IDS_DEVTOOLS_3ec365dd533ddb7ef3d1c111186ce872" desc="">
+ Details
+ </message>
+ <message name="IDS_DEVTOOLS_87bfda183c4f851a101e97bbb1bbace7" desc="">
+ Layers
+ </message>
+</grit-part> \ No newline at end of file
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/main/Main.js b/chromium/third_party/blink/renderer/devtools/front_end/main/Main.js
index 8206ed882f7..6b0399f46dc 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/main/Main.js
+++ b/chromium/third_party/blink/renderer/devtools/front_end/main/Main.js
@@ -62,6 +62,7 @@ Main.Main = class {
console.timeStamp('Main._loaded');
await Runtime.appStarted();
Runtime.setPlatform(Host.platform());
+ Runtime.setL10nCallback(ls);
InspectorFrontendHost.getPreferences(this._gotPreferences.bind(this));
}
@@ -108,6 +109,8 @@ Main.Main = class {
Runtime.experiments.register('applyCustomStylesheet', 'Allow custom UI themes');
Runtime.experiments.register('sourcesPrettyPrint', 'Automatically pretty print in the Sources Panel');
Runtime.experiments.register('backgroundServices', 'Background web platform feature events', true);
+ Runtime.experiments.register('backgroundServicesNotifications', 'Background services section for Notifications');
+ Runtime.experiments.register('backgroundServicesPushMessaging', 'Background services section for Push Messaging');
Runtime.experiments.register('blackboxJSFramesOnTimeline', 'Blackbox JavaScript frames on Timeline', true);
Runtime.experiments.register('emptySourceMapAutoStepping', 'Empty sourcemap auto-stepping');
Runtime.experiments.register('inputEventsOnTimelineOverview', 'Input events on Timeline overview', true);
@@ -129,7 +132,7 @@ Main.Main = class {
Runtime.experiments.register('timelineWebGL', 'Timeline: WebGL-based flamechart');
Runtime.experiments.cleanUpStaleExperiments();
- Runtime.experiments.setDefaultExperiments([]);
+ Runtime.experiments.setDefaultExperiments(['backgroundServices']);
if (Host.isUnderTest() && Runtime.queryParam('test').includes('live-line-level-heap-profile.js'))
Runtime.experiments.enableForTest('liveHeapProfile');
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/main/main_strings.grdp b/chromium/third_party/blink/renderer/devtools/front_end/main/main_strings.grdp
new file mode 100644
index 00000000000..5f0c5c16d86
--- /dev/null
+++ b/chromium/third_party/blink/renderer/devtools/front_end/main/main_strings.grdp
@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="utf-8"?>
+<grit-part>
+ <message name="IDS_DEVTOOLS_00463255013f500126fb5cc8c824e384" desc="">
+ Panel layout:
+ </message>
+ <message name="IDS_DEVTOOLS_08e71f00acd63d0a546ba42f9e780ddc" desc="">
+ Customize and control DevTools
+ </message>
+ <message name="IDS_DEVTOOLS_0a0afb342478f201b92cbc89d19bf14d" desc="">
+ Switch to dark theme
+ </message>
+ <message name="IDS_DEVTOOLS_13348442cc6a27032d2b4aa28b75a5d3" desc="">
+ Search
+ </message>
+ <message name="IDS_DEVTOOLS_15fa1acc2a998159c4ed2a950c5c231d" desc="">
+ Toggle drawer
+ </message>
+ <message name="IDS_DEVTOOLS_1b1ac1c7a54457ce73ddd25a5b51c47d" desc="">
+ Drawer sidebar
+ </message>
+ <message name="IDS_DEVTOOLS_1cf59b16fd253d6ff4bbee7c237cea0d" desc="">
+ Show console
+ </message>
+ <message name="IDS_DEVTOOLS_2ab5656e27a0ed871c8de44368f807c6" desc="">
+ Styles Pane
+ </message>
+ <message name="IDS_DEVTOOLS_2ad9d63b69c4a10a5cc9cad923133bc4" desc="">
+ Bottom
+ </message>
+ <message name="IDS_DEVTOOLS_36634aa462472ceb907f3aa4401d3a61" desc="">
+ Undocked
+ </message>
+ <message name="IDS_DEVTOOLS_3b40834e60f26865c1b9582f1745476e" desc="">
+ Use horizontal panel layout
+ </message>
+ <message name="IDS_DEVTOOLS_3b7e62b6a175b75f4ecf012d17ba7fef" desc="">
+ Focus debuggee
+ </message>
+ <message name="IDS_DEVTOOLS_4505cad087312551a6fbbe6ebe163e0f" desc="">
+ horizontal
+ </message>
+ <message name="IDS_DEVTOOLS_4f1133a5722c0189f59e0490b2ae1c31" desc="">
+ Go to source
+ </message>
+ <message name="IDS_DEVTOOLS_581138047ce1459b079a8c4abba128a1" desc="">
+ Go to the panel to the left/right
+ </message>
+ <message name="IDS_DEVTOOLS_586740a88e6502850bc64f9f2d04d380" desc="">
+ Placement of DevTools relative to the page. (<ph name="TOGGLEDOCKSIDESHORCUTS____NAME">$1s</ph> to restore last position)
+ </message>
+ <message name="IDS_DEVTOOLS_5bf4a92da989a6943e3fed84f18c3f0f" desc="">
+ Search across all sources
+ </message>
+ <message name="IDS_DEVTOOLS_5e2f5f3c24ae8c6ab3eca618826b0e23" desc="">
+ Extensions
+ </message>
+ <message name="IDS_DEVTOOLS_62fcd77216b456123c822a40ded03347" desc="">
+ Select node to inspect
+ </message>
+ <message name="IDS_DEVTOOLS_71f0df44b05415f2d20b59bb6188a118" desc="">
+ Toggle dock side
+ </message>
+ <message name="IDS_DEVTOOLS_75def4784fa71c4ccde7762316ed0e3e" desc="">
+ Find next/previous
+ </message>
+ <message name="IDS_DEVTOOLS_787ae37366b7a8c53f381abfd315c647" desc="">
+ Elements Panel
+ </message>
+ <message name="IDS_DEVTOOLS_8645bf45e76c3f958ae99c114c419743" desc="">
+ Hide console drawer
+ </message>
+ <message name="IDS_DEVTOOLS_92b09c7c48c520c3c55e497875da437c" desc="">
+ Right
+ </message>
+ <message name="IDS_DEVTOOLS_93445501d5239cedddc0bd6a0a453a95" desc="">
+ Dock side
+ </message>
+ <message name="IDS_DEVTOOLS_9914a0ce04a7b7b6a8e39bec55064b82" desc="">
+ Light
+ </message>
+ <message name="IDS_DEVTOOLS_9b1ed2cbe56f7a315f0a365d2b97cb59" desc="">
+ Drawer
+ </message>
+ <message name="IDS_DEVTOOLS_a18366b217ebf811ad1886e4f4f865b2" desc="">
+ Dark
+ </message>
+ <message name="IDS_DEVTOOLS_a9e4402481bd9b8e36752bf731f67eb6" desc="">
+ Theme:
+ </message>
+ <message name="IDS_DEVTOOLS_b0659ae6872366589300ed6c2033ba26" desc="">
+ Toggle device mode
+ </message>
+ <message name="IDS_DEVTOOLS_b3bf148a3dc8b3367191419e52380982" desc="">
+ Use vertical panel layout
+ </message>
+ <message name="IDS_DEVTOOLS_b8da6df14bf06283cbf588df6998722e" desc="">
+ Panel
+ </message>
+ <message name="IDS_DEVTOOLS_b94d8a074eddd267702810179875737f" desc="">
+ Debugger
+ </message>
+ <message name="IDS_DEVTOOLS_b9cd538a753713464d2ea17d7e975041" desc="">
+ More tools
+ </message>
+ <message name="IDS_DEVTOOLS_c0fef4f5cd015e4b1e5477f511dc3939" desc="">
+ Use automatic panel layout
+ </message>
+ <message name="IDS_DEVTOOLS_c2376cec424de4cead5272c492d3d269" desc="">
+ Restore last dock position
+ </message>
+ <message name="IDS_DEVTOOLS_d33bf99e0756e1d5008cb78902e38ca9" desc="">
+ All Panels
+ </message>
+ <message name="IDS_DEVTOOLS_db5d5dd2ff01f52ffee4b57ca2b1fcfd" desc="">
+ Enable Ctrl + 1-9 shortcut to switch panels
+ </message>
+ <message name="IDS_DEVTOOLS_debb0ba164edd1f9254b644de3c6d716" desc="">
+ Enable ⌘ + 1-9 shortcut to switch panels
+ </message>
+ <message name="IDS_DEVTOOLS_e472458a8014f14176e3c3c3d4dd0ad9" desc="">
+ Switch to light theme
+ </message>
+ <message name="IDS_DEVTOOLS_e6dec152d6a941fccb0a5e8cc2579cc3" desc="">
+ vertical
+ </message>
+ <message name="IDS_DEVTOOLS_eafbab965ec3970b0e97705882ebf8d0" desc="">
+ Show console drawer
+ </message>
+</grit-part> \ No newline at end of file
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/mobile_throttling/mobile_throttling_strings.grdp b/chromium/third_party/blink/renderer/devtools/front_end/mobile_throttling/mobile_throttling_strings.grdp
new file mode 100644
index 00000000000..ec6a7fbe217
--- /dev/null
+++ b/chromium/third_party/blink/renderer/devtools/front_end/mobile_throttling/mobile_throttling_strings.grdp
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="utf-8"?>
+<grit-part>
+ <message name="IDS_DEVTOOLS_07a573e3035e9f8a7380a801df3a920f" desc="">
+ Slow 3G &amp; 6x CPU slowdown
+ </message>
+ <message name="IDS_DEVTOOLS_0936559ca32dc012bcc81444bec17ea4" desc="">
+ Force disconnected from network
+ </message>
+ <message name="IDS_DEVTOOLS_1363b7d2b4c0a3ac3a89b3ba69d59be7" desc="">
+ Network throttling is enabled
+ </message>
+ <message name="IDS_DEVTOOLS_17f66753218a6a1e2762c6a60db3d7c4" desc="">
+ Mid-tier mobile
+ </message>
+ <message name="IDS_DEVTOOLS_26ae7bdd1d6fb8c4886e6fde8d12601c" desc="">
+ Latency
+ </message>
+ <message name="IDS_DEVTOOLS_275e2c1079aeffdb5f4e22580127b95b" desc="">
+ <ph name="CONDITIONS_LATENCY">$1d</ph>ms
+ </message>
+ <message name="IDS_DEVTOOLS_3602f195c0823b75591b5546c3d5df00" desc="">
+ Requests may be rewritten by local overrides
+ </message>
+ <message name="IDS_DEVTOOLS_37234a1bcbabe4e8e7448f4bbcf5c2b4" desc="">
+ <ph name="THROUGHPUTINKBPS">$1d</ph><ph name="DELIMITER">$2s</ph>kb/s
+ </message>
+ <message name="IDS_DEVTOOLS_38c8cb828795cd6ff1cddda9b4ffcfa8" desc="">
+ <ph name="THROUGHPUTINKBPS___________">$1d</ph><ph name="DELIMITER">$2s</ph>Mb/s
+ </message>
+ <message name="IDS_DEVTOOLS_4fafba98ddd8a8663d8775a928f2450e" desc="">
+ Requests may be blocked
+ </message>
+ <message name="IDS_DEVTOOLS_56d7a17ecb7d30faf8daf8a6eb57e3bb" desc="">
+ Go offline
+ </message>
+ <message name="IDS_DEVTOOLS_6ba7dc45786c25d1e5879b2166894fc5" desc="">
+ Go online
+ </message>
+ <message name="IDS_DEVTOOLS_801ab24683a4a8c433c6eb40c48bcd9d" desc="">
+ Download
+ </message>
+ <message name="IDS_DEVTOOLS_8493534a13107469ea63be99410bebfa" desc="">
+ Enable slow 3G throttling
+ </message>
+ <message name="IDS_DEVTOOLS_8d9da4bc0e49a50e09ac9f7e56789d39" desc="">
+ Offline
+ </message>
+ <message name="IDS_DEVTOOLS_8fd93ea382b6642f13ff291b76f5bc85" desc="">
+ Profile Name
+ </message>
+ <message name="IDS_DEVTOOLS_90589c47f06eb971d548591f23c285af" desc="">
+ Custom
+ </message>
+ <message name="IDS_DEVTOOLS_91412465ea9169dfd901dd5e7c96dd99" desc="">
+ Upload
+ </message>
+ <message name="IDS_DEVTOOLS_9b6545e4cea9b4ad4979d41bb9170e2b" desc="">
+ Advanced
+ </message>
+ <message name="IDS_DEVTOOLS_a808cbcba081a943f4faedda831298b5" desc="">
+ kb/s
+ </message>
+ <message name="IDS_DEVTOOLS_b27fdc01c81857f96f3d5d37d323bcb6" desc="">
+ Enable fast 3G throttling
+ </message>
+ <message name="IDS_DEVTOOLS_b9f5c797ebbf55adccdd8539a65a0241" desc="">
+ Disabled
+ </message>
+ <message name="IDS_DEVTOOLS_c47c85f963782364d32f428fcf7631ff" desc="">
+ No internet connectivity
+ </message>
+ <message name="IDS_DEVTOOLS_c939c288fa6bfab8b8bfb9b86593be20" desc="">
+ Add custom profile...
+ </message>
+ <message name="IDS_DEVTOOLS_c96084dae377c53ea7e233fc8255e6d5" desc="">
+ Fast 3G &amp; 4x CPU slowdown
+ </message>
+ <message name="IDS_DEVTOOLS_cb67c2b6640235af7393ca5970c1e887" desc="">
+ <ph name="RATE">$1d</ph>× slowdown
+ </message>
+ <message name="IDS_DEVTOOLS_d33468989239f9d3c708d05dcd7824f3" desc="">
+ <ph name="THROUGHPUTINKBPS_______">$1.1f</ph><ph name="DELIMITER">$2s</ph>Mb/s
+ </message>
+ <message name="IDS_DEVTOOLS_d49429dd3e92758c218f94ed0219d620" desc="">
+ CPU throttling is enabled
+ </message>
+ <message name="IDS_DEVTOOLS_d57c24f3fe52d16e7169b912dd647f0d" desc="">
+ optional
+ </message>
+ <message name="IDS_DEVTOOLS_eb81441fe20963ff9e8e69c5b32fc625" desc="">
+ Presets
+ </message>
+ <message name="IDS_DEVTOOLS_ee33e909372d935d190f4fcb2a92d542" desc="">
+ ms
+ </message>
+ <message name="IDS_DEVTOOLS_f410c3f1a07f566591283f599701e4ab" desc="">
+ Add…
+ </message>
+ <message name="IDS_DEVTOOLS_fa481f0018f093f34f49bd0f555653f3" desc="">
+ Check Network and Performance panels
+ </message>
+ <message name="IDS_DEVTOOLS_fcd5c08df997867efb2d80f45c4e1a6c" desc="">
+ Low-end mobile
+ </message>
+ <message name="IDS_DEVTOOLS_ff45c788a49f2900f274da0c350dcd1d" desc="">
+ Network Throttling Profiles
+ </message>
+</grit-part> \ No newline at end of file
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/network/NetworkDataGridNode.js b/chromium/third_party/blink/renderer/devtools/front_end/network/NetworkDataGridNode.js
index 28971f048ae..642523ff1bd 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/network/NetworkDataGridNode.js
+++ b/chromium/third_party/blink/renderer/devtools/front_end/network/NetworkDataGridNode.js
@@ -969,6 +969,10 @@ Network.NetworkRequestNode = class extends Network.NetworkNode {
cell.createTextChild(ls`(signed-exchange)`);
cell.title = ls`Served from Signed HTTP Exchange, resource size: ${resourceSize}`;
cell.classList.add('network-dim-cell');
+ } else if (this._request.fromPrefetchCache()) {
+ cell.createTextChild(ls`(prefetch cache)`);
+ cell.title = ls`Served from prefetch cache, resource size: ${resourceSize}`;
+ cell.classList.add('network-dim-cell');
} else if (this._request.cached()) {
cell.createTextChild(ls`(disk cache)`);
cell.title = ls`Served from disk cache, resource size: ${resourceSize}`;
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/network/NetworkLogView.js b/chromium/third_party/blink/renderer/devtools/front_end/network/NetworkLogView.js
index b1475ae123a..81b20b29561 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/network/NetworkLogView.js
+++ b/chromium/third_party/blink/renderer/devtools/front_end/network/NetworkLogView.js
@@ -402,14 +402,6 @@ Network.NetworkLogView = class extends UI.VBox {
}
/**
- * @param {!SDK.NetworkRequest} request
- * @return {boolean}
- */
- static FinishedRequestsFilter(request) {
- return request.finished;
- }
-
- /**
* @param {number} windowStart
* @param {number} windowEnd
* @param {!SDK.NetworkRequest} request
@@ -461,13 +453,13 @@ Network.NetworkLogView = class extends UI.VBox {
if (entry.isDirectory)
return;
- entry.file(this._onLoadFromFile.bind(this));
+ entry.file(this.onLoadFromFile.bind(this));
}
/**
* @param {!File} file
*/
- async _onLoadFromFile(file) {
+ async onLoadFromFile(file) {
const outputStream = new Common.StringOutputStream();
const reader = new Bindings.ChunkedFileReader(file, /* chunkSize */ 10000000);
const success = await reader.read(outputStream);
@@ -1220,7 +1212,7 @@ Network.NetworkLogView = class extends UI.VBox {
}
footerSection.appendItem(Common.UIString('Copy all as HAR'), this._copyAll.bind(this));
- contextMenu.saveSection().appendItem(Common.UIString('Save all as HAR with content'), this._exportAll.bind(this));
+ contextMenu.saveSection().appendItem(ls`Save all as HAR with content`, this.exportAll.bind(this));
contextMenu.editSection().appendItem(Common.UIString('Clear browser cache'), this._clearBrowserCache.bind(this));
contextMenu.editSection().appendItem(
@@ -1278,8 +1270,10 @@ Network.NetworkLogView = class extends UI.VBox {
}
_harRequests() {
- const httpRequests = SDK.networkLog.requests().filter(Network.NetworkLogView.HTTPRequestsFilter);
- return httpRequests.filter(Network.NetworkLogView.FinishedRequestsFilter);
+ return SDK.networkLog.requests().filter(Network.NetworkLogView.HTTPRequestsFilter).filter(request => {
+ return request.finished ||
+ (request.resourceType() === Common.resourceTypes.WebSocket && request.responseReceivedTime);
+ });
}
async _copyAll() {
@@ -1331,7 +1325,7 @@ Network.NetworkLogView = class extends UI.VBox {
InspectorFrontendHost.copyText(commands);
}
- async _exportAll() {
+ async exportAll() {
const url = SDK.targetManager.mainTarget().inspectedURL();
const parsedURL = url.asParsedURL();
const filename = parsedURL ? parsedURL.host : 'network-log';
@@ -1697,8 +1691,13 @@ Network.NetworkLogView = class extends UI.VBox {
*/
function escapeCharacter(x) {
const code = x.charCodeAt(0);
- // Add leading zero when needed to not care about the next character.
- return code < 16 ? '\\u0' + code.toString(16) : '\\u' + code.toString(16);
+ let hexString = code.toString(16);
+ // Zero pad to four digits to comply with ANSI-C Quoting:
+ // http://www.gnu.org/software/bash/manual/html_node/ANSI_002dC-Quoting.html
+ while (hexString.length < 4)
+ hexString = '0' + hexString;
+
+ return '\\u' + hexString;
}
if (/[\u0000-\u001f\u007f-\u009f!]|\'/.test(str)) {
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/network/NetworkPanel.js b/chromium/third_party/blink/renderer/devtools/front_end/network/NetworkPanel.js
index 841e4da21f7..afc839c4414 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/network/NetworkPanel.js
+++ b/chromium/third_party/blink/renderer/devtools/front_end/network/NetworkPanel.js
@@ -52,10 +52,20 @@ Network.NetworkPanel = class extends UI.Panel {
const panel = new UI.VBox();
- this._panelToolbar = new UI.Toolbar('', panel.contentElement);
+ const networkToolbarContainer = panel.contentElement.createChild('div', 'network-toolbar-container');
+ this._panelToolbar = new UI.Toolbar('', networkToolbarContainer);
+ this._rightToolbar = new UI.Toolbar('', networkToolbarContainer);
+
this._filterBar = new UI.FilterBar('networkPanel', true);
this._filterBar.show(panel.contentElement);
+ this._settingsPane = new UI.HBox();
+ this._settingsPane.element.classList.add('network-settings-pane');
+ this._settingsPane.show(panel.contentElement);
+ this._showSettingsPaneSetting = Common.settings.createSetting('networkShowSettingsToolbar', false);
+ this._showSettingsPaneSetting.addChangeListener(this._updateSettingsPaneVisibility.bind(this));
+ this._updateSettingsPaneVisibility();
+
this._filmStripPlaceholderElement = panel.contentElement.createChild('div', 'network-film-strip-placeholder');
// Create top overview component.
@@ -108,6 +118,10 @@ Network.NetworkPanel = class extends UI.Panel {
new Network.NetworkLogView(this._filterBar, this._progressBarContainer, this._networkLogLargeRowsSetting);
this._splitWidget.setSidebarWidget(this._networkLogView);
+ this._fileSelectorElement =
+ UI.createFileSelectorElement(this._networkLogView.onLoadFromFile.bind(this._networkLogView));
+ panel.element.appendChild(this._fileSelectorElement);
+
this._detailsWidget = new UI.VBox();
this._detailsWidget.element.classList.add('network-details-view');
this._splitWidget.setMainWidget(this._detailsWidget);
@@ -122,7 +136,6 @@ Network.NetworkPanel = class extends UI.Panel {
this._preserveLogSetting = Common.moduleSetting('network_log.preserve-log');
- this._offlineCheckbox = MobileThrottling.throttlingManager().createOfflineToolbarCheckbox();
this._throttlingSelect = this._createThrottlingConditionsSelect();
this._setupToolbarButtons(splitWidget);
@@ -161,13 +174,6 @@ Network.NetworkPanel = class extends UI.Panel {
}
/**
- * @return {!UI.ToolbarCheckbox}
- */
- offlineCheckboxForTest() {
- return this._offlineCheckbox;
- }
-
- /**
* @return {!UI.ToolbarComboBox}
*/
throttlingSelectForTest() {
@@ -193,9 +199,6 @@ Network.NetworkPanel = class extends UI.Panel {
clearButton.addEventListener(UI.ToolbarButton.Events.Click, () => SDK.networkLog.reset(), this);
this._panelToolbar.appendToolbarItem(clearButton);
this._panelToolbar.appendSeparator();
- const recordFilmStripButton = new UI.ToolbarSettingToggle(
- this._networkRecordFilmStripSetting, 'largeicon-camera', Common.UIString('Capture screenshots'));
- this._panelToolbar.appendToolbarItem(recordFilmStripButton);
this._panelToolbar.appendToolbarItem(this._filterBar.filterButton());
updateSidebarToggle();
@@ -209,22 +212,6 @@ Network.NetworkPanel = class extends UI.Panel {
this._panelToolbar.appendToolbarItem(searchToggle);
this._panelToolbar.appendSeparator();
- this._panelToolbar.appendText(Common.UIString('View:'));
-
- const largerRequestsButton = new UI.ToolbarSettingToggle(
- this._networkLogLargeRowsSetting, 'largeicon-large-list', Common.UIString('Use large request rows'),
- Common.UIString('Use small request rows'));
- this._panelToolbar.appendToolbarItem(largerRequestsButton);
-
- const showOverviewButton = new UI.ToolbarSettingToggle(
- this._networkLogShowOverviewSetting, 'largeicon-waterfall', Common.UIString('Show overview'),
- Common.UIString('Hide overview'));
- this._panelToolbar.appendToolbarItem(showOverviewButton);
-
- this._panelToolbar.appendToolbarItem(new UI.ToolbarSettingCheckbox(
- Common.moduleSetting('network.group-by-frame'), '', Common.UIString('Group by frame')));
-
- this._panelToolbar.appendSeparator();
this._panelToolbar.appendToolbarItem(new UI.ToolbarSettingCheckbox(
this._preserveLogSetting, Common.UIString('Do not clear log on page reload / navigation'),
Common.UIString('Preserve log')));
@@ -235,10 +222,38 @@ Network.NetworkPanel = class extends UI.Panel {
this._panelToolbar.appendToolbarItem(disableCacheCheckbox);
this._panelToolbar.appendSeparator();
- this._panelToolbar.appendToolbarItem(this._offlineCheckbox);
this._panelToolbar.appendToolbarItem(this._throttlingSelect);
- this._panelToolbar.appendToolbarItem(new UI.ToolbarItem(this._progressBarContainer));
+ this._rightToolbar.appendToolbarItem(new UI.ToolbarItem(this._progressBarContainer));
+ this._rightToolbar.appendSeparator();
+ this._rightToolbar.appendToolbarItem(
+ new UI.ToolbarSettingToggle(this._showSettingsPaneSetting, 'largeicon-settings-gear', ls`Network settings`));
+
+ const settingsToolbarLeft = new UI.Toolbar('', this._settingsPane.element);
+ settingsToolbarLeft.makeVertical();
+ settingsToolbarLeft.appendToolbarItem(
+ new UI.ToolbarSettingCheckbox(this._networkLogLargeRowsSetting, '', ls`Use large request rows`));
+ settingsToolbarLeft.appendToolbarItem(
+ new UI.ToolbarSettingCheckbox(this._networkLogShowOverviewSetting, '', ls`Show overview`));
+
+ const settingsToolbarRight = new UI.Toolbar('', this._settingsPane.element);
+ settingsToolbarRight.makeVertical();
+ settingsToolbarRight.appendToolbarItem(
+ new UI.ToolbarSettingCheckbox(Common.moduleSetting('network.group-by-frame'), '', ls`Group by frame`));
+ settingsToolbarRight.appendToolbarItem(
+ new UI.ToolbarSettingCheckbox(this._networkRecordFilmStripSetting, '', ls`Capture screenshots`));
+
+ this._panelToolbar.appendSeparator();
+ const importHarButton = new UI.ToolbarButton(ls`Import HAR file...`, 'largeicon-load');
+ importHarButton.addEventListener(UI.ToolbarButton.Events.Click, () => this._fileSelectorElement.click(), this);
+ this._panelToolbar.appendToolbarItem(importHarButton);
+ const exportHarButton = new UI.ToolbarButton(ls`Export HAR...`, 'largeicon-download');
+ exportHarButton.addEventListener(UI.ToolbarButton.Events.Click, () => this._networkLogView.exportAll(), this);
+ this._panelToolbar.appendToolbarItem(exportHarButton);
+ }
+
+ _updateSettingsPaneVisibility() {
+ this._settingsPane.element.classList.toggle('hidden', !this._showSettingsPaneSetting.get());
}
/**
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/network/RequestHeadersView.js b/chromium/third_party/blink/renderer/devtools/front_end/network/RequestHeadersView.js
index 03f766868ef..acc989f9076 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/network/RequestHeadersView.js
+++ b/chromium/third_party/blink/renderer/devtools/front_end/network/RequestHeadersView.js
@@ -376,7 +376,8 @@ Network.RequestHeadersView = class extends UI.VBox {
if (this._request.statusCode) {
const statusCodeFragment = createDocumentFragment();
- statusCodeFragment.createChild('div', 'header-name').textContent = Common.UIString('Status Code') + ': ';
+ statusCodeFragment.createChild('div', 'header-name').textContent = ls`Status Code` +
+ ': ';
statusCodeFragment.createChild('span', 'header-separator');
const statusCodeImage = statusCodeFragment.createChild('span', 'resource-status-image', 'dt-icon-label');
@@ -389,23 +390,26 @@ Network.RequestHeadersView = class extends UI.VBox {
else
statusCodeImage.type = 'smallicon-red-ball';
- requestMethodElement.title = this._formatHeader(Common.UIString('Request Method'), this._request.requestMethod);
+ requestMethodElement.title = this._formatHeader(ls`Request Method`, this._request.requestMethod);
const statusTextElement = statusCodeFragment.createChild('div', 'header-value source-code');
let statusText = this._request.statusCode + ' ' + this._request.statusText;
if (this._request.cachedInMemory()) {
- statusText += ' ' + Common.UIString('(from memory cache)');
+ statusText += ' ' + ls`(from memory cache)`;
statusTextElement.classList.add('status-from-cache');
} else if (this._request.fetchedViaServiceWorker) {
- statusText += ' ' + Common.UIString('(from ServiceWorker)');
+ statusText += ' ' + ls`(from ServiceWorker)`;
statusTextElement.classList.add('status-from-cache');
} else if (
this._request.redirectSource() && this._request.redirectSource().signedExchangeInfo() &&
!this._request.redirectSource().signedExchangeInfo().errors) {
- statusText += ' ' + Common.UIString('(from signed-exchange)');
+ statusText += ' ' + ls`(from signed-exchange)`;
+ statusTextElement.classList.add('status-from-cache');
+ } else if (this._request.fromPrefetchCache()) {
+ statusText += ' ' + ls`(from prefetch cache)`;
statusTextElement.classList.add('status-from-cache');
} else if (this._request.cached()) {
- statusText += ' ' + Common.UIString('(from disk cache)');
+ statusText += ' ' + ls`(from disk cache)`;
statusTextElement.classList.add('status-from-cache');
}
statusTextElement.textContent = statusText;
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/network/ResourceWebSocketFrameView.js b/chromium/third_party/blink/renderer/devtools/front_end/network/ResourceWebSocketFrameView.js
index 89ba17c4436..49ce176f948 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/network/ResourceWebSocketFrameView.js
+++ b/chromium/third_party/blink/renderer/devtools/front_end/network/ResourceWebSocketFrameView.js
@@ -46,7 +46,7 @@ Network.ResourceWebSocketFrameView = class extends UI.VBox {
this._dataGrid = new DataGrid.SortableDataGrid(columns);
this._dataGrid.setRowContextMenuCallback(onRowContextMenu.bind(this));
this._dataGrid.setStickToBottom(true);
- this._dataGrid.setCellClass('websocket-frame-view-td');
+ this._dataGrid.setStriped(true);
this._timeComparator =
/** @type {function(!Network.ResourceWebSocketFrameNode, !Network.ResourceWebSocketFrameNode):number} */ (
Network.ResourceWebSocketFrameNodeTimeComparator);
@@ -268,7 +268,11 @@ Network.ResourceWebSocketFrameNode = class extends DataGrid.SortableDataGridNode
let description = Network.ResourceWebSocketFrameView.opCodeDescription(frame.opCode, frame.mask);
const isTextFrame = frame.opCode === Network.ResourceWebSocketFrameView.OpCodes.TextFrame;
- if (isTextFrame) {
+ if (frame.type === SDK.NetworkRequest.WebSocketFrameType.Error) {
+ description = dataText;
+ length = ls`N/A`;
+
+ } else if (isTextFrame) {
description = dataText;
} else if (frame.opCode === Network.ResourceWebSocketFrameView.OpCodes.BinaryFrame) {
@@ -298,7 +302,6 @@ Network.ResourceWebSocketFrameNode = class extends DataGrid.SortableDataGridNode
'websocket-frame-view-row-send', this._frame.type === SDK.NetworkRequest.WebSocketFrameType.Send);
element.classList.toggle(
'websocket-frame-view-row-receive', this._frame.type === SDK.NetworkRequest.WebSocketFrameType.Receive);
- element.classList.toggle('websocket-frame-view-row-opcode', !this._isTextFrame);
super.createCells(element);
}
@@ -328,7 +331,7 @@ Network.ResourceWebSocketFrameNode = class extends DataGrid.SortableDataGridNode
* @return {?Network.BinaryResourceView}
*/
binaryView() {
- if (this._isTextFrame)
+ if (this._isTextFrame || this._frame.type === SDK.NetworkRequest.WebSocketFrameType.Error)
return null;
if (!this._binaryView)
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/network/networkConfigView.css b/chromium/third_party/blink/renderer/devtools/front_end/network/networkConfigView.css
index df86aa28e24..6cb6445effa 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/network/networkConfigView.css
+++ b/chromium/third_party/blink/renderer/devtools/front_end/network/networkConfigView.css
@@ -83,10 +83,10 @@
display: block;
}
-.network-config-ua-auto, .network-config-ua-custom {
+.network-config-ua-custom {
opacity: 0.5;
}
-.network-config-ua-auto.checked, .network-config-ua-custom.checked {
+.network-config-ua-custom.checked {
opacity: 1;
}
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/network/networkLogView.css b/chromium/third_party/blink/renderer/devtools/front_end/network/networkLogView.css
index 937c242263d..92379f56f0d 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/network/networkLogView.css
+++ b/chromium/third_party/blink/renderer/devtools/front_end/network/networkLogView.css
@@ -42,6 +42,7 @@
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
+ user-select: text;
}
.panel.network .toolbar.network-summary-bar {
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/network/networkPanel.css b/chromium/third_party/blink/renderer/devtools/front_end/network/networkPanel.css
index 7e31424b366..3bc69da1c74 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/network/networkPanel.css
+++ b/chromium/third_party/blink/renderer/devtools/front_end/network/networkPanel.css
@@ -27,7 +27,7 @@
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-.panel.network .toolbar {
+ .panel.network .toolbar {
background-color: var(--toolbar-bg-color);
border-bottom: var(--divider-border);
}
@@ -87,11 +87,6 @@
flex: 0 0 60px;
}
-.network-overview .overview-grid-window,
-.network-overview .overview-grid-dividers-background {
- height: 100%;
-}
-
.network-overview .resources-dividers-label-bar {
background-color: rgba(255, 255, 255, 0.95);
}
@@ -119,30 +114,24 @@
flex-shrink: 0;
}
-.network-blocked-urls {
- border-top: var(--divider-border);
- flex: 104px 0 0;
+.network-tabbed-pane {
+ background-color: var(--toolbar-bg-color);
}
-.open-search-view {
- align-items: center;
- background-color: hsl(50, 100%, 88%);
- border-bottom: var(--divider-border);
- cursor: pointer;
- flex-grow: 0;
- padding: 4px;
+.network-settings-pane {
+ flex: none;
+ background-color: var(--toolbar-bg-color);
}
-.open-search-view > * {
- margin: 0 4px;
+.network-settings-pane .toolbar {
+ flex: 1 1;
}
-.open-search-view .search-suggestion {
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
+.network-toolbar-container {
+ display: flex;
+ flex: none;
}
-.network-tabbed-pane {
- background-color: var(--toolbar-bg-color);
+.network-toolbar-container > :first-child {
+ flex: 1 1 auto;
}
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/network/network_strings.grdp b/chromium/third_party/blink/renderer/devtools/front_end/network/network_strings.grdp
new file mode 100644
index 00000000000..175cbe94a86
--- /dev/null
+++ b/chromium/third_party/blink/renderer/devtools/front_end/network/network_strings.grdp
@@ -0,0 +1,768 @@
+<?xml version="1.0" encoding="utf-8"?>
+<grit-part>
+ <message name="IDS_DEVTOOLS_0194336f90a2b1de65553e3bec01becd" desc="">
+ Copy as fetch
+ </message>
+ <message name="IDS_DEVTOOLS_01a8f976083c550f4d5ba8452ec80efb" desc="">
+ No custom headers
+ </message>
+ <message name="IDS_DEVTOOLS_02d56cf7754ce16d7ce0193fbca7c90a" desc="">
+ Caching
+ </message>
+ <message name="IDS_DEVTOOLS_040c4b52a3c06c6067fac76c4c7c3a2c" desc="">
+ Network conditions
+ </message>
+ <message name="IDS_DEVTOOLS_059f48d76d79fe0727740d75dc81fa94" desc="">
+ <ph name="SELECTEDTRANSFERSIZE">$1s</ph> B / <ph name="TRANSFERSIZE">$2s</ph> B transferred
+ </message>
+ <message name="IDS_DEVTOOLS_06337a0bc6e91b2adb10567bee4d6f14" desc="">
+ Copy all as HAR
+ </message>
+ <message name="IDS_DEVTOOLS_079accf18103a0f8b9a76ce09cb147d7" desc="">
+ Add pattern
+ </message>
+ <message name="IDS_DEVTOOLS_08af23a4affc4689447d59935ba3b3b3" desc="">
+ Hit <ph name="RELOADSHORTCUTDESCRIPTOR_NAME">$1s</ph> to reload and capture filmstrip.
+ </message>
+ <message name="IDS_DEVTOOLS_09bad44011fa6a5a64ada3424ad85f03" desc="">
+ <ph name="LOCALIZEDDESCRIPTION">$1s</ph> (Opcode <ph name="OPCODE">$2s</ph>)
+ </message>
+ <message name="IDS_DEVTOOLS_09c9ea004b0c0822b75bdec322b90ff4" desc="">
+ Waterfall
+ </message>
+ <message name="IDS_DEVTOOLS_0bcc4ec10c2e4cee4b9bbabd48501304" desc="">
+ Select message to browse its content.
+ </message>
+ <message name="IDS_DEVTOOLS_0db377921f4ce762c62526131097968f" desc="">
+ General
+ </message>
+ <message name="IDS_DEVTOOLS_0f44e9e39cbe2f22bd1bd7b6070cf13d" desc="">
+ Enable request blocking
+ </message>
+ <message name="IDS_DEVTOOLS_0f591b1d87c91e77d4fa11dc6e44288c" desc="">
+ Request and response timeline
+ </message>
+ <message name="IDS_DEVTOOLS_117068a6e55846888cbb60978fe82ca2" desc="">
+ Stalled
+ </message>
+ <message name="IDS_DEVTOOLS_11803f40c277b679b08ce0b8d38fdefa" desc="">
+ Preload
+ </message>
+ <message name="IDS_DEVTOOLS_12881f9e98bb240671bc3e1787d64a03" desc="">
+ Color code by resource type
+ </message>
+ <message name="IDS_DEVTOOLS_16f78b9465f03f7ec5a03c24918fbde3" desc="">
+ Status Code
+ </message>
+ <message name="IDS_DEVTOOLS_1854180b02f297deebed0ec452090842" desc="">
+ Served from memory cache, resource size: <ph name="RESOURCESIZE">$1s</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_197d4c4eb38925e0c8ab3f2998cd893f" desc="">
+ Perform a request or hit <ph name="RELOADSHORTCUTNODE">$1s</ph> to record the reload.
+ </message>
+ <message name="IDS_DEVTOOLS_1a0534b264da645e89fcf2cc86ec4cb5" desc="">
+ (from prefetch cache)
+ </message>
+ <message name="IDS_DEVTOOLS_1a8b6125c4be73210788e4fad96bdbdb" desc="">
+ Server Push
+ </message>
+ <message name="IDS_DEVTOOLS_1b581452e4e1158b75e514c99a760431" desc="">
+ Request Payload
+ </message>
+ <message name="IDS_DEVTOOLS_1c047e32d57295a9f0319976c543162e" desc="">
+ (blocked:<ph name="REASON">$1s</ph>)
+ </message>
+ <message name="IDS_DEVTOOLS_1cb07ce276f37ba2acdfb8605aaefbb8" desc="">
+ <ph name="RESOURCESIZE">$1s</ph> B resources
+ </message>
+ <message name="IDS_DEVTOOLS_1dc4a71b18d2c3a1442267136158128e" desc="">
+ Copy all as cURL (cmd)
+ </message>
+ <message name="IDS_DEVTOOLS_1eb445fa6bd078346bf63ecac35fa77c" desc="">
+ Base64
+ </message>
+ <message name="IDS_DEVTOOLS_2537b3e6907e17001b7cdf121cd39dc0" desc="">
+ (from ServiceWorker)
+ </message>
+ <message name="IDS_DEVTOOLS_26b6b5ae2c6e2575b2a451c35e94df23" desc="">
+ Waiting (TTFB)
+ </message>
+ <message name="IDS_DEVTOOLS_296d9aa276c7b25db8cf45733d8d4042" desc="">
+ Signed HTTP exchange
+ </message>
+ <message name="IDS_DEVTOOLS_29d37bdcfeb74d25d56bcf841866ae32" desc="">
+ Served from ServiceWorker, resource size: <ph name="RESOURCESIZE">$1s</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_2bbc845892f400626baab5af687527c5" desc="">
+ Start Time
+ </message>
+ <message name="IDS_DEVTOOLS_2d13df6f8b5e4c5af9f87e0dc39df69d" desc="">
+ Pending
+ </message>
+ <message name="IDS_DEVTOOLS_2ef0ae0c4d76a87b28176de205d7d346" desc="">
+ Recording frames...
+ </message>
+ <message name="IDS_DEVTOOLS_2f618132e0f9cadb9eb3759327b70e74" desc="">
+ Import HAR file...
+ </message>
+ <message name="IDS_DEVTOOLS_30ad3ea5e350075c1c0a1171c5006ed7" desc="">
+ Fetching frames...
+ </message>
+ <message name="IDS_DEVTOOLS_3136ed000d43bebb4ca53a9312fbd32c" desc="">
+ Add pattern.
+ </message>
+ <message name="IDS_DEVTOOLS_31977081ea2c828cc70e6151ab5d7da8" desc="">
+ view decoded
+ </message>
+ <message name="IDS_DEVTOOLS_31fde7b05ac8952dacf4af8a704074ec" desc="">
+ Preview
+ </message>
+ <message name="IDS_DEVTOOLS_336439019ce67912717a20d54298bf24" desc="">
+ Receiving Push
+ </message>
+ <message name="IDS_DEVTOOLS_346ff32eaa3c09983fb2ec057816d352" desc="">
+ TIME
+ </message>
+ <message name="IDS_DEVTOOLS_3681a6c01fa5b440938e8112bfc13996" desc="">
+ ServiceWorker Preparation
+ </message>
+ <message name="IDS_DEVTOOLS_36d95f430159f0ac7a477e4ee6c5ad21" desc="">
+ Remove all patterns
+ </message>
+ <message name="IDS_DEVTOOLS_376815607a4b79934f79305216a8048c" desc="">
+ Record (<ph name="RECORDNODE">$1s</ph>) or reload (<ph name="RELOADSHORTCUTNODE">$2s</ph>) to display network activity.
+ </message>
+ <message name="IDS_DEVTOOLS_37bb3bd9caf5dafb7c8f9eccb3b9800e" desc="">
+ (unable to decode value)
+ </message>
+ <message name="IDS_DEVTOOLS_383fc50a38f1666adc3f06d0bdf71467" desc="">
+ Are you sure you want to clear browser cookies?
+ </message>
+ <message name="IDS_DEVTOOLS_3b5904efd4efd03d09ee9a8f964f39d6" desc="">
+ <ph name="NUMBER_BYTESTOSTRING_RESOURCESIZE_">$1s</ph> resources
+ </message>
+ <message name="IDS_DEVTOOLS_3b83f6ae91bb21147fd97b8b8229287f" desc="">
+ Certificate URL
+ </message>
+ <message name="IDS_DEVTOOLS_3c06899dae839e1ca3051475a2b8fa05" desc="">
+ Preview not available
+ </message>
+ <message name="IDS_DEVTOOLS_3c2f5decde47940c8baf3b80dea449bd" desc="">
+ csp
+ </message>
+ <message name="IDS_DEVTOOLS_3c309d9a9f7ff31319c7ecb0a19b2b3f" desc="">
+ Select automatically
+ </message>
+ <message name="IDS_DEVTOOLS_3dab30e9b9adf193562ff9a09dcd41a5" desc="">
+ Remote Address
+ </message>
+ <message name="IDS_DEVTOOLS_3e0dc7bd31f5ad41b900fef5b7aba791" desc="">
+ Don&apos;t group network log items by frame
+ </message>
+ <message name="IDS_DEVTOOLS_41de6d6cfb8953c021bbe4ba0701c8a1" desc="">
+ Messages
+ </message>
+ <message name="IDS_DEVTOOLS_41e85145baafb89d0b709ae827218084" desc="">
+ Clear browser cache
+ </message>
+ <message name="IDS_DEVTOOLS_4202ef115ebede37eb22297113f5fb32" desc="">
+ Redirect
+ </message>
+ <message name="IDS_DEVTOOLS_42d61b587a0123390822777d84e0f6bd" desc="">
+ Response code
+ </message>
+ <message name="IDS_DEVTOOLS_44749712dbec183e983dcd78a7736c41" desc="">
+ Date
+ </message>
+ <message name="IDS_DEVTOOLS_4566ce384ed4a889beb6f6432d5906d7" desc="">
+ Network panel
+ </message>
+ <message name="IDS_DEVTOOLS_459c830504806e5747ddc40008ccbade" desc="">
+ Add custom header…
+ </message>
+ <message name="IDS_DEVTOOLS_46ff2c7bbdbb02687287512c874d391f" desc="">
+ signed-exchange
+ </message>
+ <message name="IDS_DEVTOOLS_490aa6e856ccf208a054389e47ce0d06" desc="">
+ Id
+ </message>
+ <message name="IDS_DEVTOOLS_4a5a4b959ef84dd7b7ee73e837b6a54e" desc="">
+ Reveal in Network panel
+ </message>
+ <message name="IDS_DEVTOOLS_4a7ba0d17eafde708ca8f5f34debcfef" desc="">
+ <ph name="TRANSFERSIZE">$1s</ph> B transferred
+ </message>
+ <message name="IDS_DEVTOOLS_4bd7c2ff07dcc66801a9368957d4bff8" desc="">
+ Initiator
+ </message>
+ <message name="IDS_DEVTOOLS_4c3880bb027f159e801041b1021e88e8" desc="">
+ Method
+ </message>
+ <message name="IDS_DEVTOOLS_4dea2ac78e9450e62e96c166ef9f5d4c" desc="">
+ Manage Header Columns…
+ </message>
+ <message name="IDS_DEVTOOLS_4e88c13fb97f356a81c48bf2644bef51" desc="">
+ Connection Start
+ </message>
+ <message name="IDS_DEVTOOLS_5023e5b1d1c02cf168a9a67dda6d2d87" desc="">
+ Show overview
+ </message>
+ <message name="IDS_DEVTOOLS_502996d9790340c5fd7b86a5b93b1c9f" desc="">
+ Priority
+ </message>
+ <message name="IDS_DEVTOOLS_5101cdda28ea3097ac00cdbfdcedc353" desc="">
+ Use default colors
+ </message>
+ <message name="IDS_DEVTOOLS_51360304ea03557e79bdf5ff9cd2e234" desc="">
+ Issuer
+ </message>
+ <message name="IDS_DEVTOOLS_53fa249ce3d02c8a686b657b31d02ee7" desc="">
+ Copy response
+ </message>
+ <message name="IDS_DEVTOOLS_5639d3df5aea3d9e78027b843ee3cbb2" desc="">
+ Receive
+ </message>
+ <message name="IDS_DEVTOOLS_566bbee0f961ad71b54c3c2fd36db053" desc="">
+ extension
+ </message>
+ <message name="IDS_DEVTOOLS_56ecb97c626815b7f982c04e736f624b" desc="">
+ Response headers
+ </message>
+ <message name="IDS_DEVTOOLS_57db0f3677bfe1e5af2f568c71369e9e" desc="">
+ Save all as HAR with content
+ </message>
+ <message name="IDS_DEVTOOLS_58f6ae6f525fa723c603752e682be6a7" desc="">
+ This request has no response data available.
+ </message>
+ <message name="IDS_DEVTOOLS_59535aed1e49266dfd0b93172f5a7242" desc="">
+ Group by frame
+ </message>
+ <message name="IDS_DEVTOOLS_597b56e53847cd6a4712ac183f61fa68" desc="">
+ Cookies
+ </message>
+ <message name="IDS_DEVTOOLS_5cb98890f19c13e5fce52287187d9803" desc="">
+ <ph name="SELECTEDNODENUMBER">$1s</ph> / <ph name="NODECOUNT">$2s</ph> requests
+ </message>
+ <message name="IDS_DEVTOOLS_5e2f683aacb9d5f3635b3f88583dec80" desc="">
+ Custom...
+ </message>
+ <message name="IDS_DEVTOOLS_5f0ea62e5bc9f795512ef292ff162a2a" desc="">
+ Disable cache (while DevTools is open)
+ </message>
+ <message name="IDS_DEVTOOLS_5f903b8316b9649547e1b3ceef934183" desc="">
+ Stop recording network log
+ </message>
+ <message name="IDS_DEVTOOLS_611a2b5dcde004cf68ffd56345584d40" desc="">
+ ETag
+ </message>
+ <message name="IDS_DEVTOOLS_619d32de7168c6e770464dfc43e374d1" desc="">
+ Request Headers
+ </message>
+ <message name="IDS_DEVTOOLS_6311ae17c1ee52b36e68aaf4ad066387" desc="">
+ Other
+ </message>
+ <message name="IDS_DEVTOOLS_6490fac2ddb40e1e2a7e0c43fb661c7b" desc="">
+ Failed to load response data
+ </message>
+ <message name="IDS_DEVTOOLS_649635a49f102b60bd81884f3e2fd3ca" desc="">
+ Collecting content…
+ </message>
+ <message name="IDS_DEVTOOLS_65a9d5faea2e8027d9a96544c579e312" desc="">
+ Certificate SHA256
+ </message>
+ <message name="IDS_DEVTOOLS_6638d1cbb8be347d80370bc5bb58a0d1" desc="">
+ Copy as UTF-8
+ </message>
+ <message name="IDS_DEVTOOLS_6a7c804797a8bb913c82824a6465ede1" desc="">
+ Header Name
+ </message>
+ <message name="IDS_DEVTOOLS_6a98894cd6b4628f0b5117412aab083e" desc="">
+ Cache-Control
+ </message>
+ <message name="IDS_DEVTOOLS_6c2a1bf87fb84c91fc7e1120f4e3d0c7" desc="">
+ Content Download
+ </message>
+ <message name="IDS_DEVTOOLS_6c3ae60298916e218f26a95f4ff21085" desc="">
+ Response Cookies
+ </message>
+ <message name="IDS_DEVTOOLS_6dd7482f131dc036ea08395a7f3f5e08" desc="">
+ Enter a custom user agent
+ </message>
+ <message name="IDS_DEVTOOLS_6e68a529a38966508d348e9f65d7ea31" desc="">
+ Record network log
+ </message>
+ <message name="IDS_DEVTOOLS_71fb2761cd2a446400a8069fe16cd45e" desc="">
+ Block request domain
+ </message>
+ <message name="IDS_DEVTOOLS_722e6ea747a62b7f93bb017d3dd04cbd" desc="">
+ Continuation Frame
+ </message>
+ <message name="IDS_DEVTOOLS_72d569ab3718d10a89315f80cf05cc73" desc="">
+ Group network log by frame
+ </message>
+ <message name="IDS_DEVTOOLS_73c1ba64f0484588be030de81de469ae" desc="">
+ Initial connection
+ </message>
+ <message name="IDS_DEVTOOLS_7543ba96bb16a5f17f8fb25bdd995d3f" desc="">
+ Copy as Base64
+ </message>
+ <message name="IDS_DEVTOOLS_76669aaf74dda2a59e3c363da10c3faf" desc="">
+ Reading Push
+ </message>
+ <message name="IDS_DEVTOOLS_77f02f5047451625e1c6bb24884cdfe6" desc="">
+ Copied as Hex
+ </message>
+ <message name="IDS_DEVTOOLS_79307e20670213e6f99203c2d81bbbaf" desc="">
+ (ServiceWorker)
+ </message>
+ <message name="IDS_DEVTOOLS_7954bc50e461d57fa640f77741cea491" desc="">
+ Resource Scheduling
+ </message>
+ <message name="IDS_DEVTOOLS_795f3202b17cb6bc3d4b771d8c6c9eaf" desc="">
+ other
+ </message>
+ <message name="IDS_DEVTOOLS_7b5bea45778433caf34b0ba556a7d93b" desc="">
+ (failed)
+ </message>
+ <message name="IDS_DEVTOOLS_7c49b153d4b59f8c0cf8c3e18dc80cb7" desc="">
+ origin
+ </message>
+ <message name="IDS_DEVTOOLS_7de2b6840dd6a1683f809daaf2d95fb0" desc="">
+ Hex Viewer
+ </message>
+ <message name="IDS_DEVTOOLS_7e1c4c7b01e0fd0ad1e89ca7512f353e" desc="">
+ Ping Message
+ </message>
+ <message name="IDS_DEVTOOLS_804910399e8d26511871e33416ccd127" desc="">
+ Served from disk cache, resource size: <ph name="RESOURCESIZE">$1s</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_814f9c3c7e7aa04c21f2e61f5b2dcf18" desc="">
+ Copy response headers
+ </message>
+ <message name="IDS_DEVTOOLS_8166a4b3fb4979da3a24ed21ced7fdf7" desc="">
+ Learn more
+ </message>
+ <message name="IDS_DEVTOOLS_827452688eed02a12178e96f924ac529" desc="">
+ Scheme
+ </message>
+ <message name="IDS_DEVTOOLS_838c672414343cdd527a63d910fb132c" desc="">
+ Hide data URLs
+ </message>
+ <message name="IDS_DEVTOOLS_850985cd851d0fe440f03f77762e2590" desc="">
+ Content-Length
+ </message>
+ <message name="IDS_DEVTOOLS_8644fe7afb1a31ea7274f5ee90dff50b" desc="">
+ view URL encoded
+ </message>
+ <message name="IDS_DEVTOOLS_878ff0bac714397ab62012691efc2087" desc="">
+ Text Message
+ </message>
+ <message name="IDS_DEVTOOLS_881e9a305ce80960413ab7f227ef879e" desc="">
+ User agent
+ </message>
+ <message name="IDS_DEVTOOLS_883d7615c4d2de3fa1218f1298c46d0e" desc="">
+ Headers
+ </message>
+ <message name="IDS_DEVTOOLS_884680dd63eae99eab1a407133df66b7" desc="">
+ View certificate
+ </message>
+ <message name="IDS_DEVTOOLS_888a77f5ac0748b6c8001822417df8b6" desc="">
+ Protocol
+ </message>
+ <message name="IDS_DEVTOOLS_889f316cd1f0ac68f8ea3052e8568061" desc="">
+ Copy as PowerShell
+ </message>
+ <message name="IDS_DEVTOOLS_896ef2edb423627350de605744e10385" desc="">
+ Set Cookies
+ </message>
+ <message name="IDS_DEVTOOLS_8c074f405ad9737b1b59d35d6aab7cab" desc="">
+ Last-Modified
+ </message>
+ <message name="IDS_DEVTOOLS_8c09001c99ecb6fdd8d6023fcf039054" desc="">
+ Signature
+ </message>
+ <message name="IDS_DEVTOOLS_8c2297c17712046f3a7ffd65c2c5ad50" desc="">
+ Validity URL
+ </message>
+ <message name="IDS_DEVTOOLS_8e40e89c8c95a050dcadea2d7e4d40cc" desc="">
+ devtools
+ </message>
+ <message name="IDS_DEVTOOLS_8eb2a485218c2fd5b53651ec35337858" desc="">
+ Use large request rows
+ </message>
+ <message name="IDS_DEVTOOLS_8eed70a0dcf3e8f43d0548cd1e8f22ed" desc="">
+ Hides data: and blob: URLs
+ </message>
+ <message name="IDS_DEVTOOLS_8f32afe4e92699a3c6923a66815f5e16" desc="">
+ Request sent
+ </message>
+ <message name="IDS_DEVTOOLS_8f3d10eb21bd36347c258679eba9e92b" desc="">
+ Finished
+ </message>
+ <message name="IDS_DEVTOOLS_90198f1c07c67e3a44ccc6853651ca2c" desc="">
+ Response Headers
+ </message>
+ <message name="IDS_DEVTOOLS_9146d056f26c33effdc2f83dd9e79395" desc="">
+ Copy all as cURL (bash)
+ </message>
+ <message name="IDS_DEVTOOLS_91d92a76f6e3919419b019b07889c73b" desc="">
+ Clear browser cookies
+ </message>
+ <message name="IDS_DEVTOOLS_92480c24ad37b4f15c6a43fd54ec2376" desc="">
+ WebSocket messages
+ </message>
+ <message name="IDS_DEVTOOLS_9254e453e41bb4058ee1e8c1a2b81a4d" desc="">
+ Queueing
+ </message>
+ <message name="IDS_DEVTOOLS_935f218785830f964d0c537b23027045" desc="">
+ <ph name="NUMBER_BYTESTOSTRING_SELECTEDTRANSFERSIZE_">$1s</ph> / <ph name="NUMBER_BYTESTOSTRING_TRANSFERSIZE_">$2s</ph> transferred
+ </message>
+ <message name="IDS_DEVTOOLS_948ff4d0d124f02ff1dc0a9c56ef8ade" desc="">
+ Recording network activity…
+ </message>
+ <message name="IDS_DEVTOOLS_94966d90747b97d1f0f206c98a8b1ac3" desc="">
+ Send
+ </message>
+ <message name="IDS_DEVTOOLS_96b0141273eabab320119c467cdcaf17" desc="">
+ Total
+ </message>
+ <message name="IDS_DEVTOOLS_96d960cc2b3394824ebfbf25bb960a90" desc="">
+ <ph name="LOCALIZEDDESCRIPTION">$1s</ph> (Opcode <ph name="OPCODE">$2s</ph>, mask)
+ </message>
+ <message name="IDS_DEVTOOLS_96e9bc575b5d3ed541113a249da8bd24" desc="">
+ Capture screenshots
+ </message>
+ <message name="IDS_DEVTOOLS_97b7320892b0db86ff1d8dc28ba1af95" desc="">
+ Are you sure you want to clear browser cache?
+ </message>
+ <message name="IDS_DEVTOOLS_97f0a2ba508f8299c686818366ad712a" desc="">
+ (data)
+ </message>
+ <message name="IDS_DEVTOOLS_985187565936a7c1e02c9f96852c0f9a" desc="">
+ subresource-filter
+ </message>
+ <message name="IDS_DEVTOOLS_986371172510b03c03ac7cd17c1f84d4" desc="">
+ Served from Signed HTTP Exchange, resource size: <ph name="RESOURCESIZE">$1s</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_986491ef3610ed7ef82bd863e4ee00a2" desc="">
+ Request blocking
+ </message>
+ <message name="IDS_DEVTOOLS_9979c41f94d4d232c06b4c87f2d0f951" desc="">
+ Push /
+ </message>
+ <message name="IDS_DEVTOOLS_9a41e9b9ca01e7239185b042be18f9eb" desc="">
+ Connection ID
+ </message>
+ <message name="IDS_DEVTOOLS_9a83ab0d60fed7c37d928ccb30d1b6ae" desc="">
+ Parser
+ </message>
+ <message name="IDS_DEVTOOLS_9aa1b03934893d7134a660af4204f2a9" desc="">
+ Server
+ </message>
+ <message name="IDS_DEVTOOLS_9c1ab57e621c2bb257798752dbbe6f14" desc="">
+ view source
+ </message>
+ <message name="IDS_DEVTOOLS_9cabd6c0f7878c8106104aee4a24a41e" desc="">
+ Copy as cURL (cmd)
+ </message>
+ <message name="IDS_DEVTOOLS_9e08e91089d39bc26c4c57e9780c2f60" desc="">
+ (from memory cache)
+ </message>
+ <message name="IDS_DEVTOOLS_9e65b51e82f2a9b9f72ebe3e083582bb" desc="">
+ (empty)
+ </message>
+ <message name="IDS_DEVTOOLS_9ffaf77e2c524827dff95993361e7115" desc="">
+ Raw response data
+ </message>
+ <message name="IDS_DEVTOOLS_a00705e19cc5f358d77688d197604cc3" desc="">
+ <ph name="NUMBER_BYTESTOSTRING_TRANSFERSIZE_">$1s</ph> transferred
+ </message>
+ <message name="IDS_DEVTOOLS_a0820b213c0f695e95fc0c278a05400f" desc="">
+ <ph name="COUNT">$1d</ph> blocked
+ </message>
+ <message name="IDS_DEVTOOLS_a217246afb12245a032617715f81923b" desc="">
+ Manage Header Columns
+ </message>
+ <message name="IDS_DEVTOOLS_a227f203e4a2e520debf44ae78f16847" desc="">
+ Copied as Base64
+ </message>
+ <message name="IDS_DEVTOOLS_a249aec821f73349cc457658bd6c04f3" desc="">
+ Copy as Hex
+ </message>
+ <message name="IDS_DEVTOOLS_a299d2f506523f8104dc4202de7b0c64" desc="">
+ Export HAR...
+ </message>
+ <message name="IDS_DEVTOOLS_a5d6e0224f694699dde6d1bd34d608bd" desc="">
+ Copy as cURL
+ </message>
+ <message name="IDS_DEVTOOLS_a612782072a3b8f151c5e2120ef20efd" desc="">
+ Copy to clipboard
+ </message>
+ <message name="IDS_DEVTOOLS_a74e6894e1f36ce12a6773b9a6b9aea8" desc="">
+ <ph name="NODECOUNT">$1s</ph> requests
+ </message>
+ <message name="IDS_DEVTOOLS_a76d4ef5f3f6a672bbfab2865563e530" desc="">
+ Time
+ </message>
+ <message name="IDS_DEVTOOLS_a976624c5265b8187b19aea9df9230eb" desc="">
+ Color-code resource types
+ </message>
+ <message name="IDS_DEVTOOLS_abe6fec6834dc303e1abfb03f9874786" desc="">
+ DOMContentLoaded: <ph name="NUMBER_SECONDSTOSTRING_THIS__MAINREQUESTDOMCONTENTLOADEDTIME___BASETIME_">$1s</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_ac5eb504b5a840271e066bf6fd3000b8" desc="">
+ view parsed
+ </message>
+ <message name="IDS_DEVTOOLS_ad86890fb40822a3b12627efaca4ecd7" desc="">
+ (disk cache)
+ </message>
+ <message name="IDS_DEVTOOLS_add0160d0ea7e2969930b281a6ba1456" desc="">
+ Drop HAR files here
+ </message>
+ <message name="IDS_DEVTOOLS_ae3b3df9970b49b6523e608759bc957d" desc="">
+ UTF-8
+ </message>
+ <message name="IDS_DEVTOOLS_af0a229a0c5be77de07889743db3b409" desc="">
+ Copied as UTF-8
+ </message>
+ <message name="IDS_DEVTOOLS_af6ef9fe7e48178f3765aa8e44f9ce5d" desc="">
+ Group network log items by frame
+ </message>
+ <message name="IDS_DEVTOOLS_b021df6aac4654c454f46c77646e745f" desc="">
+ Label
+ </message>
+ <message name="IDS_DEVTOOLS_b1f63146853f7f450d8622aae6a73408" desc="">
+ Copy as cURL (bash)
+ </message>
+ <message name="IDS_DEVTOOLS_b2844b8e17ecaaeae68d018fe9418af0" desc="">
+ Valid until
+ </message>
+ <message name="IDS_DEVTOOLS_b4774747599df05309e1de2e2734dd3e" desc="">
+ Request to ServiceWorker
+ </message>
+ <message name="IDS_DEVTOOLS_b6434258c743f8673997b5aeb3721c27" desc="">
+ Request Method
+ </message>
+ <message name="IDS_DEVTOOLS_b72ac10807b29c77f5b7e4b80ea40414" desc="">
+ Explanation
+ </message>
+ <message name="IDS_DEVTOOLS_b926fd82158cde57655d0cd1dd8dbc70" desc="">
+ Query String Parameters
+ </message>
+ <message name="IDS_DEVTOOLS_b9449f52ba4f16fc7dd7fb7cd0c6c5c7" desc="">
+ Network throttling
+ </message>
+ <message name="IDS_DEVTOOLS_b94a47df08b4ab492c78deb7a2940662" desc="">
+ Disable cache
+ </message>
+ <message name="IDS_DEVTOOLS_b9ad5629c19552041dadd5b4feb22772" desc="">
+ Response Time
+ </message>
+ <message name="IDS_DEVTOOLS_ba2a9c6c8c77e03f83ef8bf543612275" desc="">
+ Length
+ </message>
+ <message name="IDS_DEVTOOLS_bd474658f3a7ae560cc97b6b64264045" desc="">
+ mixed-content
+ </message>
+ <message name="IDS_DEVTOOLS_bd9176ee57c46268a853e038b133966a" desc="">
+ Keep-Alive
+ </message>
+ <message name="IDS_DEVTOOLS_bdaacef16991cfa4cf17a388579e7c06" desc="">
+ EventStream
+ </message>
+ <message name="IDS_DEVTOOLS_c02504bf83e5cc0d2f582f189a804aef" desc="">
+ Request Cookies
+ </message>
+ <message name="IDS_DEVTOOLS_c2cc7082a89c1ad6631a2f66af5f00c0" desc="">
+ Connection
+ </message>
+ <message name="IDS_DEVTOOLS_c33fa8b7d663932b656f0f7f53a74e77" desc="">
+ Requests are not blocked.
+ </message>
+ <message name="IDS_DEVTOOLS_c3c14eb17a6cf9c6120f381790ed06eb" desc="">
+ Copy all as PowerShell
+ </message>
+ <message name="IDS_DEVTOOLS_c4e4fcc7d371549aec967e7157ba436d" desc="">
+ SignedExchange error
+ </message>
+ <message name="IDS_DEVTOOLS_c54dcc2fd5e72371ef21f1553d79e740" desc="">
+ (canceled)
+ </message>
+ <message name="IDS_DEVTOOLS_c6f969f563d21beac9731f177053484c" desc="">
+ <ph name="SELECTEDRESOURCESIZE">$1s</ph> B / <ph name="RESOURCESIZE">$2s</ph> B resources
+ </message>
+ <message name="IDS_DEVTOOLS_c7892ebbb139886662c6f2fc8c450710" desc="">
+ Subject
+ </message>
+ <message name="IDS_DEVTOOLS_c81e295bfd7fbaec6257ea14992f4643" desc="">
+ Request and response cookies
+ </message>
+ <message name="IDS_DEVTOOLS_c84718b71b8ad70dde23736e79e25e83" desc="">
+ Pong Message
+ </message>
+ <message name="IDS_DEVTOOLS_c91a577b72313356fad611c55f43c10f" desc="">
+ End Time
+ </message>
+ <message name="IDS_DEVTOOLS_cb64a2679b345ae476ea3a7fb6a70080" desc="">
+ Binary Message
+ </message>
+ <message name="IDS_DEVTOOLS_cc0af601bfd673427a8abb171f62c707" desc="">
+ content-type
+ </message>
+ <message name="IDS_DEVTOOLS_cebd9a3a94f022d3600e0f81a9aa2060" desc="">
+ <ph name="NUMBER_BYTESTOSTRING_SELECTEDRESOURCESIZE_">$1s</ph> / <ph name="NUMBER_BYTESTOSTRING_RESOURCESIZE_">$2s</ph> resources
+ </message>
+ <message name="IDS_DEVTOOLS_cf5c8b06caaf075b4e453ce29d27760f" desc="">
+ Served from prefetch cache, resource size: <ph name="RESOURCESIZE">$1s</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_cfc36842a01da69c484ffdcc6782f437" desc="">
+ Expires
+ </message>
+ <message name="IDS_DEVTOOLS_d0a9f074f48f9416d043f27687c1f030" desc="">
+ Proxy negotiation
+ </message>
+ <message name="IDS_DEVTOOLS_d0e5383d7c91948cfab6cacccec8812d" desc="">
+ (from signed-exchange)
+ </message>
+ <message name="IDS_DEVTOOLS_d3b69e993f4e9bf9c479c7e794ede387" desc="">
+ Timing
+ </message>
+ <message name="IDS_DEVTOOLS_d64ed3e9c10229648e069f56e32f4c8e" desc="">
+ Response
+ </message>
+ <message name="IDS_DEVTOOLS_d76e44f856d0114826e7436a630a3fa7" desc="">
+ (signed-exchange)
+ </message>
+ <message name="IDS_DEVTOOLS_d7e76ea0c048939444b2aa8653f048d0" desc="">
+ Record (<ph name="RECORDNODE">$1s</ph>) to display network activity.
+ </message>
+ <message name="IDS_DEVTOOLS_d82a834165b99c4ea0969316296a2bc2" desc="">
+ Vary
+ </message>
+ <message name="IDS_DEVTOOLS_db67b2de0114bd82fe1383aa067fa6b2" desc="">
+ Unblock <ph name="CROPPEDURL">$1s</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_dc30bc0c7914db5918da4263fce93ad2" desc="">
+ Clear
+ </message>
+ <message name="IDS_DEVTOOLS_dc5d60b066d9a30e68dd648dcabf8579" desc="">
+ This request has no cookies.
+ </message>
+ <message name="IDS_DEVTOOLS_dc66e209093fbef0daa224f2b6401b39" desc="">
+ Request/Response
+ </message>
+ <message name="IDS_DEVTOOLS_dd47445f60115097d07d4cf2e61d933b" desc="">
+ CAUTION: request is not finished yet!
+ </message>
+ <message name="IDS_DEVTOOLS_de4642e93235c872dcc21d7e4c926c36" desc="">
+ Copy all as fetch
+ </message>
+ <message name="IDS_DEVTOOLS_de9b14d980b77c264d42463f407180be" desc="">
+ Provisional headers are shown
+ </message>
+ <message name="IDS_DEVTOOLS_df080c10e2e9f1e98c180fe2645f6132" desc="">
+ Request URL
+ </message>
+ <message name="IDS_DEVTOOLS_e186ebc46177c666cd1d5bda52ade420" desc="">
+ Response preview
+ </message>
+ <message name="IDS_DEVTOOLS_e1905358311029126da11f4e24fca90d" desc="">
+  (<ph name="PARAMS_LENGTH">$1d</ph>)
+ </message>
+ <message name="IDS_DEVTOOLS_e44c5fc0f8fc0dc0181254373cb07c47" desc="">
+ Load: <ph name="NUMBER_SECONDSTOSTRING_THIS__MAINREQUESTLOADTIME___BASETIME_">$1s</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_e49d4e7e01be604cfb0cf20a72e0853c" desc="">
+ Server Timing
+ </message>
+ <message name="IDS_DEVTOOLS_e6702855087694e24e954afab8b7e5d0" desc="">
+ Connection Close Message
+ </message>
+ <message name="IDS_DEVTOOLS_e6fb9da54f521b9c33d41121d4fcd35c" desc="">
+ (memory cache)
+ </message>
+ <message name="IDS_DEVTOOLS_e77fef0167598bb39846637ac3915f4e" desc="">
+ Clear All
+ </message>
+ <message name="IDS_DEVTOOLS_ea52c36203c5f99c3ce2442d531b1a22" desc="">
+ SSL
+ </message>
+ <message name="IDS_DEVTOOLS_eb0bd7de3ba805621bf9e03e4d16b510" desc="">
+ Queued at <ph name="CALCULATOR_FORMATVALUE_REQUEST_ISSUETIME______">$1s</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_eb0f48a107df1a0f343d4cd513b555e6" desc="">
+ Certificate
+ </message>
+ <message name="IDS_DEVTOOLS_eb902cf204f3e4dfffeb56d92a9b5c26" desc="">
+ Valid from
+ </message>
+ <message name="IDS_DEVTOOLS_ec53a8c4f07baed5d8825072c89799be" desc="">
+ Status
+ </message>
+ <message name="IDS_DEVTOOLS_ec559fc895e8cc77ef0c4d6fdff5bdcb" desc="">
+ Form Data
+ </message>
+ <message name="IDS_DEVTOOLS_ec9dca2a4b061ad202945d88657e5ddf" desc="">
+ Started at <ph name="CALCULATOR_FORMATVALUE_REQUEST_STARTTIME____">$1s</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_edfffa5a1ffba7492b25869813e7e15e" desc="">
+ Content-Encoding
+ </message>
+ <message name="IDS_DEVTOOLS_ef110dd7355d7315c73995a47fe77dfd" desc="">
+ DNS Lookup
+ </message>
+ <message name="IDS_DEVTOOLS_f1019fecd69b0e6b6bd12db7f58bbb90" desc="">
+ Copy message
+ </message>
+ <message name="IDS_DEVTOOLS_f1495279152e772a4ecf5cbf17a07c64" desc="">
+ Copy message...
+ </message>
+ <message name="IDS_DEVTOOLS_f15c1cae7882448b3fb0404682e17e61" desc="">
+ Content
+ </message>
+ <message name="IDS_DEVTOOLS_f312b3f268931a1367de22756237b197" desc="">
+ Headers and request body
+ </message>
+ <message name="IDS_DEVTOOLS_f3f97de67c80480904f958df15b8a57b" desc="">
+ Integrity
+ </message>
+ <message name="IDS_DEVTOOLS_f508b22c8fc4486b19fee39d5ded3841" desc="">
+ Network settings
+ </message>
+ <message name="IDS_DEVTOOLS_f531e0844f007af2fa80b328e7c82e72" desc="">
+ (from disk cache)
+ </message>
+ <message name="IDS_DEVTOOLS_f6068daa29dbb05a7ead1e3b5a48bbee" desc="">
+ Data
+ </message>
+ <message name="IDS_DEVTOOLS_f6c804a6be9719c98a260380833bfde7" desc="">
+ Block request URL
+ </message>
+ <message name="IDS_DEVTOOLS_f6d1d4157b75f9b68298f7df187a177c" desc="">
+ Finish: <ph name="NUMBER_SECONDSTOSTRING_MAXTIME___BASETIME_">$1s</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_f9069c6541beaac49cce4b2542069f02" desc="">
+ Referrer Policy
+ </message>
+ <message name="IDS_DEVTOOLS_f907e651164789346ae0a1e257c462d8" desc="">
+ Script
+ </message>
+ <message name="IDS_DEVTOOLS_f95d3d09fc16ae9294fbef87ac8d17cb" desc="">
+ (pending)
+ </message>
+ <message name="IDS_DEVTOOLS_fae900d6e2cf6b54ffae8cad77b9e2a6" desc="">
+ (prefetch cache)
+ </message>
+ <message name="IDS_DEVTOOLS_fb0df508eafce0076286884cd92fc8fd" desc="">
+ Copy request headers
+ </message>
+ <message name="IDS_DEVTOOLS_fb6024596d77a7d0ac213f1f12fa1d8b" desc="">
+ Text pattern to block matching requests; use * for wildcard
+ </message>
+ <message name="IDS_DEVTOOLS_fd747cf7093bd6b5c8eb3b40658a3b13" desc="">
+ Total Duration
+ </message>
+ <message name="IDS_DEVTOOLS_fe1bc3eb2f3e1a9a90b5401eb6baa5b9" desc="">
+ Copy all as cURL
+ </message>
+</grit-part> \ No newline at end of file
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/network/requestHeadersView.css b/chromium/third_party/blink/renderer/devtools/front_end/network/requestHeadersView.css
index f86498786b0..ba7944462f0 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/network/requestHeadersView.css
+++ b/chromium/third_party/blink/renderer/devtools/front_end/network/requestHeadersView.css
@@ -14,14 +14,6 @@
margin-right: 3px;
}
-.request-headers-view .filter-input {
- outline: none !important;
- border: none;
- border-bottom: solid 1px #ccc;
- flex: 0 0 19px;
- padding: 0 4px;
-}
-
.request-headers-tree {
flex-grow: 1;
overflow-y: auto;
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/network/webSocketFrameView.css b/chromium/third_party/blink/renderer/devtools/front_end/network/webSocketFrameView.css
index 9e95e84982f..ec662ef6482 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/network/webSocketFrameView.css
+++ b/chromium/third_party/blink/renderer/devtools/front_end/network/webSocketFrameView.css
@@ -17,10 +17,6 @@
background-image: none;
}
-.websocket-frame-view-td {
- border-bottom: 1px solid #ccc;
-}
-
.websocket-frame-view .data-grid tr.selected {
background-color: #def;
}
@@ -31,13 +27,15 @@
}
.websocket-frame-view-row-send td:first-child::before {
- content: "\2B06 ";
+ content: "\2B06";
color: #080;
+ padding-right: 4px;
}
.websocket-frame-view-row-receive td:first-child::before {
- content: "\2B07 ";
+ content: "\2B07";
color: #E65100;
+ padding-right: 4px;
}
.data-grid:focus .websocket-frame-view-row-send.selected td:first-child::before,
@@ -45,17 +43,7 @@
color: white;
}
-.websocket-frame-view-row-send {
- background-color: rgb(226, 247, 218);
-}
-
-.websocket-frame-view-row-opcode {
- background-color: rgb(255, 255, 232);
- color: rgb(170, 111, 71);
-}
-
.websocket-frame-view-row-error {
- background-color: rgb(255, 237, 237);
color: rgb(182, 0, 0);
}
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/node_debugger/node_debugger_strings.grdp b/chromium/third_party/blink/renderer/devtools/front_end/node_debugger/node_debugger_strings.grdp
new file mode 100644
index 00000000000..0e094599b60
--- /dev/null
+++ b/chromium/third_party/blink/renderer/devtools/front_end/node_debugger/node_debugger_strings.grdp
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<grit-part>
+ <message name="IDS_DEVTOOLS_6c3a6944a808a7c0bbb6788dbec54a9f" desc="">
+ Node
+ </message>
+</grit-part> \ No newline at end of file
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/node_main/NodeConnectionsPanel.js b/chromium/third_party/blink/renderer/devtools/front_end/node_main/NodeConnectionsPanel.js
index ddc77d1eb9d..c4d42746960 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/node_main/NodeConnectionsPanel.js
+++ b/chromium/third_party/blink/renderer/devtools/front_end/node_main/NodeConnectionsPanel.js
@@ -163,7 +163,7 @@ NodeMain.NodeConnectionsView = class extends UI.VBox {
this._editor = editor;
const content = editor.contentElement();
const fields = content.createChild('div', 'network-discovery-edit-row');
- const input = editor.createInput('address', 'text', 'Network address (e.g. localhost:9229)', addressValidator);
+ const input = editor.createInput('address', 'text', ls`Network address (e.g. localhost:9229)`, addressValidator);
fields.createChild('div', 'network-discovery-value network-discovery-address').appendChild(input);
return editor;
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/node_main/nodeConnectionsPanel.css b/chromium/third_party/blink/renderer/devtools/front_end/node_main/nodeConnectionsPanel.css
index 5f4e87540c0..3e7b58836f8 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/node_main/nodeConnectionsPanel.css
+++ b/chromium/third_party/blink/renderer/devtools/front_end/node_main/nodeConnectionsPanel.css
@@ -4,13 +4,6 @@
* found in the LICENSE file.
*/
-.network-discovery-header {
- display: flex;
- align-items: center;
- flex-direction: row;
- margin-top: 5px;
-}
-
.add-network-target-button {
margin: 10px 25px;
align-self: flex-start;
@@ -74,10 +67,6 @@
white-space: pre-wrap;
}
-.network-discovery-header {
- display: none;
-}
-
.node-panel {
align-items: center;
justify-content: flex-start;
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/node_main/node_main_strings.grdp b/chromium/third_party/blink/renderer/devtools/front_end/node_main/node_main_strings.grdp
new file mode 100644
index 00000000000..45a7dadd4b2
--- /dev/null
+++ b/chromium/third_party/blink/renderer/devtools/front_end/node_main/node_main_strings.grdp
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<grit-part>
+ <message name="IDS_DEVTOOLS_28e2b83d6f10a98be7535c7b40b05c6e" desc="">
+ Add connection
+ </message>
+ <message name="IDS_DEVTOOLS_3fd49f986cbd5dd3148c27c9aaaaa700" desc="">
+ Network address (e.g. localhost:9229)
+ </message>
+ <message name="IDS_DEVTOOLS_75997049f01ae448c39b8a937c4e2035" desc="">
+ No connections specified
+ </message>
+ <message name="IDS_DEVTOOLS_81c731365b52528d7d0fdb477ebc3b1d" desc="">
+ Specify network endpoint and DevTools will connect to it automatically.
+ </message>
+ <message name="IDS_DEVTOOLS_b1f0f05f6f7dcbf25e065bb4c31fec72" desc="">
+ Node.js: <ph name="TARGETINFO_URL">$1s</ph>
+ </message>
+</grit-part> \ No newline at end of file
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/object_ui/objectPopover.css b/chromium/third_party/blink/renderer/devtools/front_end/object_ui/objectPopover.css
index c04f20228f1..59e332c68cb 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/object_ui/objectPopover.css
+++ b/chromium/third_party/blink/renderer/devtools/front_end/object_ui/objectPopover.css
@@ -55,9 +55,3 @@
white-space: nowrap;
overflow: hidden;
}
-
-.function-location-step-into {
- position: relative;
- height: 14px;
- transform: rotate(-90deg);
-}
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/object_ui/objectValue.css b/chromium/third_party/blink/renderer/devtools/front_end/object_ui/objectValue.css
index 6d7599640b5..afbc104b8fd 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/object_ui/objectValue.css
+++ b/chromium/third_party/blink/renderer/devtools/front_end/object_ui/objectValue.css
@@ -69,12 +69,6 @@
color: rgb(128, 128, 128);
}
-.object-value {
- text-overflow: ellipsis;
- overflow: hidden;
- -webkit-user-select: text;
-}
-
.object-value-calculate-value-button:hover {
text-decoration: underline;
}
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/object_ui/object_ui_strings.grdp b/chromium/third_party/blink/renderer/devtools/front_end/object_ui/object_ui_strings.grdp
new file mode 100644
index 00000000000..46d6fa3852b
--- /dev/null
+++ b/chromium/third_party/blink/renderer/devtools/front_end/object_ui/object_ui_strings.grdp
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="utf-8"?>
+<grit-part>
+ <message name="IDS_DEVTOOLS_1381e657bdaaff914f1cf300d9ae12ba" desc="">
+ The property is computed with a getter
+ </message>
+ <message name="IDS_DEVTOOLS_1e7528fc0ca67eed52813139d5208882" desc="">
+ No property getter
+ </message>
+ <message name="IDS_DEVTOOLS_21a396ebc3d3f5a85721e8328da386dc" desc="">
+ &lt;string is too large to edit&gt;
+ </message>
+ <message name="IDS_DEVTOOLS_2c8631472a99e236bd93244d69705c7c" desc="">
+ Copy property path
+ </message>
+ <message name="IDS_DEVTOOLS_2f68e12de25d8be39f50adf5f7714b3d" desc="">
+ Show as JavaScript object
+ </message>
+ <message name="IDS_DEVTOOLS_376f6694932cd7a556445e2058dd4255" desc="">
+ empty × <ph name="COUNT">$1d</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_4ced885857185cb26f013fcaaa03a086" desc="">
+ &lt;unreadable&gt;
+ </message>
+ <message name="IDS_DEVTOOLS_59aeb2c9970b7b25be2fab2317e31fcb" desc="">
+ keywords
+ </message>
+ <message name="IDS_DEVTOOLS_a2e4822a98337283e39f7b60acf85ec9" desc="">
+ empty
+ </message>
+ <message name="IDS_DEVTOOLS_a6565c5180039dd2ca1249796bba00a5" desc="">
+ No properties
+ </message>
+ <message name="IDS_DEVTOOLS_a73e6bf278578e09d2351ee2ec7a7908" desc="">
+ Keys
+ </message>
+ <message name="IDS_DEVTOOLS_a983530c8e824d30e214200ef6f8a2d7" desc="">
+ (...)
+ </message>
+ <message name="IDS_DEVTOOLS_ad921d60486366258809553a3db49a4a" desc="">
+ unknown
+ </message>
+ <message name="IDS_DEVTOOLS_b0d4998a26f5b5742ad38c4af8817e32" desc="">
+ Exception
+ </message>
+ <message name="IDS_DEVTOOLS_b46f6ce1cece499f73c9d5c36e4a3de4" desc="">
+ Invoke property getter
+ </message>
+ <message name="IDS_DEVTOOLS_d50bbea3c85be098dcf221e622cd7718" desc="">
+ Lexical scope variables
+ </message>
+</grit-part> \ No newline at end of file
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/perf_ui/PieChart.js b/chromium/third_party/blink/renderer/devtools/front_end/perf_ui/PieChart.js
index 773c9ed0eeb..4ce73b2a40a 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/perf_ui/PieChart.js
+++ b/chromium/third_party/blink/renderer/devtools/front_end/perf_ui/PieChart.js
@@ -28,20 +28,25 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
+/** @typedef {{size: number, formatter: function(number):string, showLegend: (boolean|undefined), chartName: string}} */
+PerfUI.PieChartOptions;
+
/**
* @unrestricted
*/
PerfUI.PieChart = class {
/**
- * @param {number} size
- * @param {function(number):string=} formatter
- * @param {boolean=} showTotal
+ * @param {!PerfUI.PieChartOptions} options
*/
- constructor(size, formatter, showTotal) {
+ constructor(options) {
+ const {size, formatter, showLegend, chartName} = options;
this.element = createElement('div');
this._shadowRoot = UI.createShadowRootWithCoreStyles(this.element, 'perf_ui/pieChart.css');
const root = this._shadowRoot.createChild('div', 'root');
- const svg = this._createSVGChild(root, 'svg');
+ UI.ARIAUtils.markAsGroup(root);
+ UI.ARIAUtils.setAccessibleName(root, chartName);
+ this._chartRoot = root.createChild('div', 'chart-root');
+ const svg = this._createSVGChild(this._chartRoot, 'svg');
this._group = this._createSVGChild(svg, 'g');
this._innerR = 0.618;
const strokeWidth = 1 / size;
@@ -55,12 +60,13 @@ PerfUI.PieChart = class {
circle.setAttribute('stroke', 'hsl(0, 0%, 80%)');
circle.setAttribute('fill', 'transparent');
circle.setAttribute('stroke-width', strokeWidth);
- this._foregroundElement = root.createChild('div', 'pie-chart-foreground');
- if (showTotal)
- this._totalElement = this._foregroundElement.createChild('div', 'pie-chart-total');
+ this._foregroundElement = this._chartRoot.createChild('div', 'pie-chart-foreground');
+ this._totalElement = this._foregroundElement.createChild('div', 'pie-chart-total');
this._formatter = formatter;
this._slices = [];
this._lastAngle = -Math.PI / 2;
+ if (showLegend)
+ this._legend = root.createChild('div', 'pie-chart-legend');
this._setSize(size);
}
@@ -78,8 +84,12 @@ PerfUI.PieChart = class {
totalString = this._formatter ? this._formatter(totalValue) : totalValue;
else
totalString = '';
- if (this._totalElement)
- this._totalElement.textContent = totalString;
+ this._totalElement.textContent = totalString;
+ if (this._legend) {
+ this._legend.removeChildren();
+ const legendItem = this._addLegendItem(totalValue, ls`Total`);
+ UI.ARIAUtils.setLabelledBy(this._totalElement, legendItem);
+ }
}
/**
@@ -88,15 +98,16 @@ PerfUI.PieChart = class {
_setSize(value) {
this._group.setAttribute('transform', 'scale(' + (value / 2) + ') translate(1, 1) scale(0.99, 0.99)');
const size = value + 'px';
- this.element.style.width = size;
- this.element.style.height = size;
+ this._chartRoot.style.width = size;
+ this._chartRoot.style.height = size;
}
/**
* @param {number} value
* @param {string} color
+ * @param {string=} name
*/
- addSlice(value, color) {
+ addSlice(value, color, name) {
let sliceAngle = value / this._totalValue * 2 * Math.PI;
if (!isFinite(sliceAngle))
return;
@@ -117,6 +128,10 @@ PerfUI.PieChart = class {
`M${x1},${y1} A1,1,0,${largeArc},1,${x2},${y2} L${x3},${y3} A${r2},${r2},0,${largeArc},0,${x4},${y4} Z`);
path.setAttribute('fill', color);
this._slices.push(path);
+ if (this._legend) {
+ const legendItem = this._addLegendItem(value, name, color);
+ UI.ARIAUtils.setLabelledBy(path, legendItem);
+ }
}
/**
@@ -129,4 +144,30 @@ PerfUI.PieChart = class {
parent.appendChild(child);
return child;
}
+
+ /**
+ * @param {number} value
+ * @param {string=} name
+ * @param {string=} color
+ * @returns {!Element}
+ */
+ _addLegendItem(value, name, color) {
+ const node = this._legend.ownerDocument.createElement('div');
+ node.className = 'pie-chart-legend-row';
+ // make sure total always appears at the bottom
+ if (this._legend.childElementCount)
+ this._legend.insertBefore(node, this._legend.lastElementChild);
+ else
+ this._legend.appendChild(node);
+ const sizeDiv = node.createChild('div', 'pie-chart-size');
+ const swatchDiv = node.createChild('div', 'pie-chart-swatch');
+ const nameDiv = node.createChild('div', 'pie-chart-name');
+ if (color)
+ swatchDiv.style.backgroundColor = color;
+ else
+ swatchDiv.classList.add('pie-chart-empty-swatch');
+ nameDiv.textContent = name;
+ sizeDiv.textContent = this._formatter ? this._formatter(value) : value;
+ return node;
+ }
};
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/perf_ui/filmStripView.css b/chromium/third_party/blink/renderer/devtools/front_end/perf_ui/filmStripView.css
index 34143c63136..ab3ed8385eb 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/perf_ui/filmStripView.css
+++ b/chromium/third_party/blink/renderer/devtools/front_end/perf_ui/filmStripView.css
@@ -30,15 +30,6 @@
cursor: pointer;
}
-.film-strip-view .frame-limit-reached {
- font-size: 24px;
- color: #888;
- justify-content: center;
- display: inline-flex;
- flex-direction: column;
- flex: none;
-}
-
.film-strip-view .frame .thumbnail {
min-width: 24px;
display: flex;
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/perf_ui/perf_ui_strings.grdp b/chromium/third_party/blink/renderer/devtools/front_end/perf_ui/perf_ui_strings.grdp
new file mode 100644
index 00000000000..d38f94e003b
--- /dev/null
+++ b/chromium/third_party/blink/renderer/devtools/front_end/perf_ui/perf_ui_strings.grdp
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="utf-8"?>
+<grit-part>
+ <message name="IDS_DEVTOOLS_105078d294d30c978ca2badf7f376934" desc="">
+ Scroll
+ </message>
+ <message name="IDS_DEVTOOLS_28d0edd045e05cf5af64e35ae0c4c6ef" desc="">
+ Low
+ </message>
+ <message name="IDS_DEVTOOLS_2bd10b449de36fcff52a5d91a97a7365" desc="">
+ %.<ph name="FRACTIONDIGITS">$1s</ph>f
+ </message>
+ <message name="IDS_DEVTOOLS_3c4684d2d502d7f9d20e05451c2f581c" desc="">
+ Next frame
+ </message>
+ <message name="IDS_DEVTOOLS_3f21c340f01b96cb3325a5d38ece9da6" desc="">
+ Live memory allocation annotations
+ </message>
+ <message name="IDS_DEVTOOLS_4789f23283b3a61f858b641a1bef19a3" desc="">
+ Memory
+ </message>
+ <message name="IDS_DEVTOOLS_4a6d0345e7b6cfcf339237b9cf2d27b4" desc="">
+ Flamechart mouse wheel action:
+ </message>
+ <message name="IDS_DEVTOOLS_529a032eab49b8ddc6f49f8bcc086607" desc="">
+ Previous frame
+ </message>
+ <message name="IDS_DEVTOOLS_582996407922dab08d5cf2b3d2a7c1c9" desc="">
+ Highest
+ </message>
+ <message name="IDS_DEVTOOLS_655d20c1ca69519ca647684edbb2db35" desc="">
+ High
+ </message>
+ <message name="IDS_DEVTOOLS_77c168e60d966216cd1261c200f87e27" desc="">
+ Show live memory allocation annotations
+ </message>
+ <message name="IDS_DEVTOOLS_87f8a6ab85c9ced3702b4ea641ad4bb5" desc="">
+ Medium
+ </message>
+ <message name="IDS_DEVTOOLS_8d8fcc1abd550c5f25dbfaa57d59cb67" desc="">
+ MB
+ </message>
+ <message name="IDS_DEVTOOLS_90c96ccfe47a731972d5e64deb5fea36" desc="">
+ Hide live memory allocation annotations
+ </message>
+ <message name="IDS_DEVTOOLS_ab57fd0432e25d5b3013133a1c910d56" desc="">
+ KB
+ </message>
+ <message name="IDS_DEVTOOLS_b5b8e20937205384be7b9e0c29a28fdb" desc="">
+ Lowest
+ </message>
+ <message name="IDS_DEVTOOLS_d085f278b95f303c39ba30f1817cca95" desc="">
+ Collect garbage
+ </message>
+ <message name="IDS_DEVTOOLS_dac0f9afd816c579ba5c6d7a987c4ba6" desc="">
+ <ph name="VALUE">$1.1f</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_e2885880b7034cd40dce71aeffa3662f" desc="">
+ Doubleclick to zoom image. Click to view preceding requests.
+ </message>
+</grit-part> \ No newline at end of file
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/perf_ui/pieChart.css b/chromium/third_party/blink/renderer/devtools/front_end/perf_ui/pieChart.css
index bef554fa1e8..ee46974086e 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/perf_ui/pieChart.css
+++ b/chromium/third_party/blink/renderer/devtools/front_end/perf_ui/pieChart.css
@@ -5,9 +5,15 @@
*/
.root {
+ align-items: center;
+ display: flex;
+ min-width: fit-content;
+ white-space: nowrap;
+}
+
+.chart-root {
position: relative;
- width: 100%;
- height: 100%;
+ overflow: hidden;
}
.pie-chart-foreground {
@@ -17,10 +23,45 @@
z-index: 10;
top: 0;
display: flex;
+ pointer-events: none;
}
.pie-chart-total {
margin: auto;
padding: 2px 5px;
background-color: rgba(255, 255, 255, 0.6);
+ pointer-events: auto;
+}
+
+.pie-chart-legend {
+ margin-left: 30px;
+}
+
+.pie-chart-legend-row {
+ margin: 5px auto;
+ padding-right: 25px;
+}
+
+.pie-chart-swatch {
+ display: inline-block;
+ width: 11px;
+ height: 11px;
+ margin: 0 6px;
+ top: 1px;
+ position: relative;
+ border: 1px solid rgba(100, 100, 100, 0.2);
+}
+
+.pie-chart-swatch.pie-chart-empty-swatch {
+ border: none;
+}
+
+.pie-chart-name {
+ display: inline-block;
+}
+
+.pie-chart-size {
+ display: inline-block;
+ text-align: right;
+ width: 70px;
}
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/performance_monitor/PerformanceMonitor.js b/chromium/third_party/blink/renderer/devtools/front_end/performance_monitor/PerformanceMonitor.js
index 393bf78815c..500e1891ffe 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/performance_monitor/PerformanceMonitor.js
+++ b/chromium/third_party/blink/renderer/devtools/front_end/performance_monitor/PerformanceMonitor.js
@@ -157,10 +157,10 @@ PerformanceMonitor.PerformanceMonitor = class extends UI.HBox {
if (x < -50)
break;
ctx.beginPath();
- ctx.moveTo(Math.round(x) + 0.5, 0);
- ctx.lineTo(Math.round(x) + 0.5, this._height);
+ ctx.moveTo(x, 0);
+ ctx.lineTo(x, this._height);
if (sec >= 0 && sec % labelDistanceSeconds === 0)
- ctx.fillText(new Date(sec * 1000).toLocaleTimeString(), Math.round(x) + 4, 12);
+ ctx.fillText(new Date(sec * 1000).toLocaleTimeString(), x + 4, 12);
ctx.strokeStyle = sec % labelDistanceSeconds ? lightGray : this._gridColor;
ctx.stroke();
}
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/performance_monitor/performanceMonitor.css b/chromium/third_party/blink/renderer/devtools/front_end/performance_monitor/performanceMonitor.css
index 262906723df..05f87bee06f 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/performance_monitor/performanceMonitor.css
+++ b/chromium/third_party/blink/renderer/devtools/front_end/performance_monitor/performanceMonitor.css
@@ -84,15 +84,3 @@
.perfmon-indicator:not(.active) .perfmon-indicator-value {
opacity: 0;
}
-
-.perfmon-indicator-close {
- padding-left: 4px;
-}
-
-.perfmon-indicator:not(:hover) .perfmon-indicator-close {
- opacity: 0;
-}
-
-.perfmon-add-button:not(:hover) {
- color: #bbb;
-}
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/performance_monitor/performance_monitor_strings.grdp b/chromium/third_party/blink/renderer/devtools/front_end/performance_monitor/performance_monitor_strings.grdp
new file mode 100644
index 00000000000..33164578d89
--- /dev/null
+++ b/chromium/third_party/blink/renderer/devtools/front_end/performance_monitor/performance_monitor_strings.grdp
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<grit-part>
+ <message name="IDS_DEVTOOLS_029ce83ef9e87df61fb9e580ac165b4a" desc="">
+ DOM Nodes
+ </message>
+ <message name="IDS_DEVTOOLS_23ab71fd0704d52052b95e54f8e72fb9" desc="">
+ Performance monitor
+ </message>
+ <message name="IDS_DEVTOOLS_2bd1b3d3ed5950a8e5a28340e368a4ee" desc="">
+ Document Frames
+ </message>
+ <message name="IDS_DEVTOOLS_5c1131c8862a07ce54be057f516c840e" desc="">
+ Layouts / sec
+ </message>
+ <message name="IDS_DEVTOOLS_6cce53fb6e5ccd4313ae3ec26fa42ca4" desc="">
+ JS event listeners
+ </message>
+ <message name="IDS_DEVTOOLS_81f2166e08f25234e2fbb2cd3175f83e" desc="">
+ Graphs displaying a real-time view of performance metrics
+ </message>
+ <message name="IDS_DEVTOOLS_9ff3fcf082193aaf2b6889fb4662706a" desc="">
+ JS heap size
+ </message>
+ <message name="IDS_DEVTOOLS_ac2137ec7c503f6997ddb414265791a9" desc="">
+ CPU usage
+ </message>
+ <message name="IDS_DEVTOOLS_b4cb01a2ff8576df8cbad0872cc6e4a2" desc="">
+ Style recalcs / sec
+ </message>
+ <message name="IDS_DEVTOOLS_e99180abf47a8b3a856e0bcb2656990a" desc="">
+ Paused
+ </message>
+ <message name="IDS_DEVTOOLS_f28128b38efbc6134dc40751ee21fd29" desc="">
+ Documents
+ </message>
+</grit-part> \ No newline at end of file
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/performance_test_runner/TimelineDataTestRunner.js b/chromium/third_party/blink/renderer/devtools/front_end/performance_test_runner/TimelineDataTestRunner.js
index 57eb6ec0a13..a566dc1e643 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/performance_test_runner/TimelineDataTestRunner.js
+++ b/chromium/third_party/blink/renderer/devtools/front_end/performance_test_runner/TimelineDataTestRunner.js
@@ -5236,7 +5236,7 @@ PerformanceTestRunner.timelineData = function() {
'frame': '0x176b9c2a8000',
'scriptId': '65',
'scriptLine': 939,
- 'scriptName': 'chrome-devtools://devtools/bundled/ui/UIUtils.js'
+ 'scriptName': 'devtools://devtools/bundled/ui/UIUtils.js'
}
},
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/persistence/persistence_strings.grdp b/chromium/third_party/blink/renderer/devtools/front_end/persistence/persistence_strings.grdp
new file mode 100644
index 00000000000..4a042b49449
--- /dev/null
+++ b/chromium/third_party/blink/renderer/devtools/front_end/persistence/persistence_strings.grdp
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="utf-8"?>
+<grit-part>
+ <message name="IDS_DEVTOOLS_03250d684b667899552f89911582dbdc" desc="">
+ <ph name="ITEM">$1s</ph> (via .devtools)
+ </message>
+ <message name="IDS_DEVTOOLS_03a21915504df93cf5dba0636080f62e" desc="">
+ Workspace
+ </message>
+ <message name="IDS_DEVTOOLS_03ad5ac9c1a313e19064670f92981353" desc="">
+ Add folder…
+ </message>
+ <message name="IDS_DEVTOOLS_14f221497f99c10993cd293628adeefd" desc="">
+ Open in containing folder
+ </message>
+ <message name="IDS_DEVTOOLS_17d5f7dcd4ef6b9702a8b2ac7d237e5b" desc="">
+ Enable override network requests
+ </message>
+ <message name="IDS_DEVTOOLS_25ee7702f0b5dbe737d8f0f2ba3ce591" desc="">
+ Save for overrides
+ </message>
+ <message name="IDS_DEVTOOLS_486658cc6336ffa59ef2fdff0b977a91" desc="">
+ Excluded folders
+ </message>
+ <message name="IDS_DEVTOOLS_5f6bb21e40e670952b73ca35eafbe35a" desc="">
+ Disable override network requests
+ </message>
+ <message name="IDS_DEVTOOLS_62def4422771353f5e30763d92474b43" desc="">
+ Linked to source map: <ph name="BINDING_NETWORK_URL___TRIMMIDDLE_____">$1s</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_8d646fe956bbc874d742471885ffd77c" desc="">
+ Folder exclude pattern
+ </message>
+ <message name="IDS_DEVTOOLS_ab130072b340b847d8d45ec45d191c3b" desc="">
+ Mappings are inferred automatically.
+ </message>
+ <message name="IDS_DEVTOOLS_afb4ea732ebcf8bd51a3d99a1b8909a8" desc="">
+ Linked to <ph name="PATH">$1s</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_cf703cce77386955bfbff86f6ad9be03" desc="">
+ Unable to add filesystem: <ph name="ERRORMESSAGE">$1s</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_da0b472ac86851a3c0b623260d09546c" desc="">
+ Persistence
+ </message>
+ <message name="IDS_DEVTOOLS_e13c8cb15857d020445d01a8817f7d34" desc="">
+ File system error: <ph name="ERROR_MESSAGE">$1s</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_e2b63f5cab4f80fb6745f2f941105371" desc="">
+ Enable Local Overrides
+ </message>
+ <message name="IDS_DEVTOOLS_ec211f7c20af43e742bf2570c3cb84f9" desc="">
+ Add
+ </message>
+ <message name="IDS_DEVTOOLS_fddede572fa09e1b1bb28504d8c43343" desc="">
+ Folder path
+ </message>
+</grit-part> \ No newline at end of file
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/product_registry/product_registry_strings.grdp b/chromium/third_party/blink/renderer/devtools/front_end/product_registry/product_registry_strings.grdp
new file mode 100644
index 00000000000..af16ee26a68
--- /dev/null
+++ b/chromium/third_party/blink/renderer/devtools/front_end/product_registry/product_registry_strings.grdp
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<grit-part>
+ <message name="IDS_DEVTOOLS_8cb0e09c4d24f1c4aef14d8e2f1592a6" desc="">
+ Show third party badges
+ </message>
+ <message name="IDS_DEVTOOLS_c9b7856510bf5901af2e388926d77b94" desc="">
+ Show third party URL badges
+ </message>
+ <message name="IDS_DEVTOOLS_e56f0c64e0eb84e8799baa5bf890acb5" desc="">
+ Do not show third party badges
+ </message>
+</grit-part> \ No newline at end of file
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/profiler/HeapProfileView.js b/chromium/third_party/blink/renderer/devtools/front_end/profiler/HeapProfileView.js
index 3c220b1d759..d97ff382e02 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/profiler/HeapProfileView.js
+++ b/chromium/third_party/blink/renderer/devtools/front_end/profiler/HeapProfileView.js
@@ -453,8 +453,7 @@ Profiler.SamplingNativeHeapSnapshotType = class extends Profiler.SamplingHeapPro
get description() {
return ls`Native memory snapshots show sampled native allocations in the renderer process since start up.
- Chrome has to be started with --sampling-heap-profiler flag.
- Check flags at chrome://flags`;
+ Chrome has to be started with --memlog=all flag. Check flags at chrome://flags`;
}
/**
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/profiler/HeapSnapshotView.js b/chromium/third_party/blink/renderer/devtools/front_end/profiler/HeapSnapshotView.js
index c33e9506279..6bedd8e7abe 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/profiler/HeapSnapshotView.js
+++ b/chromium/third_party/blink/renderer/devtools/front_end/profiler/HeapSnapshotView.js
@@ -292,7 +292,6 @@ Profiler.HeapSnapshotView = class extends UI.SimpleView {
this._statisticsView.addRecord(statistics.jsArrays, Common.UIString('JS Arrays'), '#7af');
this._statisticsView.addRecord(statistics.native, Common.UIString('Typed Arrays'), '#fc5');
this._statisticsView.addRecord(statistics.system, Common.UIString('System Objects'), '#98f');
- this._statisticsView.addRecord(statistics.total, Common.UIString('Total'));
return statistics;
}
@@ -1611,10 +1610,14 @@ Profiler.HeapSnapshotStatisticsView = class extends UI.VBox {
constructor() {
super();
this.element.classList.add('heap-snapshot-statistics-view');
- this._pieChart = new PerfUI.PieChart(150, Profiler.HeapSnapshotStatisticsView._valueFormatter, true);
+ this._pieChart = new PerfUI.PieChart({
+ chartName: ls`Heap memory usage`,
+ size: 150,
+ formatter: Profiler.HeapSnapshotStatisticsView._valueFormatter,
+ showLegend: true
+ });
this._pieChart.element.classList.add('heap-snapshot-stats-pie-chart');
this.element.appendChild(this._pieChart.element);
- this._labels = this.element.createChild('div', 'heap-snapshot-stats-legend');
}
/**
@@ -1635,22 +1638,10 @@ Profiler.HeapSnapshotStatisticsView = class extends UI.VBox {
/**
* @param {number} value
* @param {string} name
- * @param {string=} color
+ * @param {string} color
*/
addRecord(value, name, color) {
- if (color)
- this._pieChart.addSlice(value, color);
-
- const node = this._labels.createChild('div');
- const swatchDiv = node.createChild('div', 'heap-snapshot-stats-swatch');
- const nameDiv = node.createChild('div', 'heap-snapshot-stats-name');
- const sizeDiv = node.createChild('div', 'heap-snapshot-stats-size');
- if (color)
- swatchDiv.style.backgroundColor = color;
- else
- swatchDiv.classList.add('heap-snapshot-stats-empty-swatch');
- nameDiv.textContent = name;
- sizeDiv.textContent = Profiler.HeapSnapshotStatisticsView._valueFormatter(value);
+ this._pieChart.addSlice(value, color, name);
}
};
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/profiler/IsolateSelector.js b/chromium/third_party/blink/renderer/devtools/front_end/profiler/IsolateSelector.js
index eccc2ea8f11..e32dd0f89ce 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/profiler/IsolateSelector.js
+++ b/chromium/third_party/blink/renderer/devtools/front_end/profiler/IsolateSelector.js
@@ -8,7 +8,7 @@
*/
Profiler.IsolateSelector = class extends UI.VBox {
constructor() {
- super(true);
+ super(false);
/** @type {!UI.ListModel<!Profiler.IsolateSelector.ListItem>} */
this._items = new UI.ListModel();
@@ -16,12 +16,18 @@ Profiler.IsolateSelector = class extends UI.VBox {
this._list = new UI.ListControl(this._items, this, UI.ListMode.NonViewport);
this.contentElement.appendChild(this._list.element);
- this.registerRequiredCSS('profiler/profileLauncherView.css');
/** @type {!Map<!SDK.IsolateManager.Isolate, !Profiler.IsolateSelector.ListItem>} */
this._itemByIsolate = new Map();
- SDK.isolateManager.observeIsolates(this);
+ this._totalElement = createElementWithClass('div', 'profile-memory-usage-item hbox');
+ this._totalValueDiv = this._totalElement.createChild('div', 'profile-memory-usage-item-size');
+ this._totalTrendDiv = this._totalElement.createChild('div', 'profile-memory-usage-item-trend');
+ this._totalElement.createChild('div').textContent = ls`Total JS heap size`;
+ const trendIntervalMinutes = Math.round(SDK.IsolateManager.MemoryTrendWindowMs / 60e3);
+ this._totalTrendDiv.title = ls`Total page JS heap size change trend over the last ${trendIntervalMinutes} minutes.`;
+ this._totalValueDiv.title = ls`Total page JS heap size across all VM instances.`;
+ SDK.isolateManager.observeIsolates(this);
SDK.targetManager.addEventListener(SDK.TargetManager.Events.NameChanged, this._targetChanged, this);
SDK.targetManager.addEventListener(SDK.TargetManager.Events.InspectedURLChanged, this._targetChanged, this);
}
@@ -97,6 +103,40 @@ Profiler.IsolateSelector = class extends UI.VBox {
const listItem = this._itemByIsolate.get(isolate);
if (listItem)
listItem.updateStats();
+ this._updateTotal();
+ }
+
+ _updateTotal() {
+ let total = 0;
+ let trend = 0;
+ for (const isolate of SDK.isolateManager.isolates()) {
+ total += isolate.usedHeapSize();
+ trend += isolate.usedHeapSizeGrowRate();
+ }
+ this._totalValueDiv.textContent = Number.bytesToString(total);
+ Profiler.IsolateSelector._formatTrendElement(trend, this._totalTrendDiv);
+ }
+
+ /**
+ * @param {number} trendValueMs
+ * @param {!Element} element
+ */
+ static _formatTrendElement(trendValueMs, element) {
+ const changeRateBytesPerSecond = trendValueMs * 1e3;
+ const changeRateThresholdBytesPerSecond = 1024;
+ if (Math.abs(changeRateBytesPerSecond) < changeRateThresholdBytesPerSecond)
+ return;
+ const changeRateText = Number.bytesToString(Math.abs(changeRateBytesPerSecond));
+ const changeText = changeRateBytesPerSecond > 0 ? ls`\u2B06${changeRateText}/s` : ls`\u2B07${changeRateText}/s`;
+ element.classList.toggle('increasing', changeRateBytesPerSecond > 0);
+ element.textContent = changeText;
+ }
+
+ /**
+ * @return {!Element}
+ */
+ totalMemoryElement() {
+ return this._totalElement;
}
/**
@@ -143,6 +183,7 @@ Profiler.IsolateSelector = class extends UI.VBox {
}
_update() {
+ this._updateTotal();
this._list.invalidateRange(0, this._items.length);
}
};
@@ -154,35 +195,25 @@ Profiler.IsolateSelector.ListItem = class {
constructor(isolate) {
this._isolate = isolate;
const trendIntervalMinutes = Math.round(SDK.IsolateManager.MemoryTrendWindowMs / 60e3);
- this.element = createElementWithClass('div', 'profile-isolate-item hbox');
- this._heapDiv = this.element.createChild('div', 'profile-isolate-item-heap');
- this._trendDiv = this.element.createChild('div', 'profile-isolate-item-trend');
- this._trendDiv.setAttribute('title', ls`Heap size change trend over the last ${trendIntervalMinutes} minutes.`);
- this._nameDiv = this.element.createChild('div', 'profile-isolate-item-name');
- this._heapDiv.setAttribute('title', ls`Heap size in use by live JS objects.`);
+ this.element = createElementWithClass('div', 'profile-memory-usage-item hbox');
+ this._heapDiv = this.element.createChild('div', 'profile-memory-usage-item-size');
+ this._trendDiv = this.element.createChild('div', 'profile-memory-usage-item-trend');
+ this._nameDiv = this.element.createChild('div', 'profile-memory-usage-item-name');
+ this._heapDiv.title = ls`Heap size in use by live JS objects.`;
+ this._trendDiv.title = ls`Heap size change trend over the last ${trendIntervalMinutes} minutes.`;
this.updateTitle();
}
/**
- * @return {!SDK.RuntimeModel}
+ * @return {?SDK.RuntimeModel}
*/
model() {
- return this._isolate.models().values().next().value;
+ return this._isolate.runtimeModel();
}
updateStats() {
- this._heapDiv.removeChildren();
this._heapDiv.textContent = Number.bytesToString(this._isolate.usedHeapSize());
-
- const changeRateBytesPerSecond = this._isolate.usedHeapSizeGrowRate() * 1e3;
- const changeRateThresholdBytesPerSecond = 1024;
- if (Math.abs(changeRateBytesPerSecond) < changeRateThresholdBytesPerSecond || this._isolate.samplesCount() < 5)
- return;
- const changeRateText = changeRateBytesPerSecond > 0 ?
- ls`\u2B06${Number.bytesToString(changeRateBytesPerSecond)}/s` :
- ls`\u2B07${Number.bytesToString(-changeRateBytesPerSecond)}/s`;
- this._trendDiv.classList.toggle('increasing', changeRateBytesPerSecond > 0);
- this._trendDiv.textContent = changeRateText;
+ Profiler.IsolateSelector._formatTrendElement(this._isolate.usedHeapSizeGrowRate(), this._trendDiv);
}
updateTitle() {
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/profiler/LiveHeapProfileView.js b/chromium/third_party/blink/renderer/devtools/front_end/profiler/LiveHeapProfileView.js
index f195b0da6f0..12ee406ad2c 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/profiler/LiveHeapProfileView.js
+++ b/chromium/third_party/blink/renderer/devtools/front_end/profiler/LiveHeapProfileView.js
@@ -21,6 +21,7 @@ Profiler.LiveHeapProfileView = class extends UI.VBox {
align: DataGrid.DataGrid.Align.Right,
sort: DataGrid.DataGrid.Order.Descending
},
+ {id: 'isolates', title: ls`VMs`, width: '40px', fixedWidth: true, align: DataGrid.DataGrid.Align.Right},
{id: 'url', title: ls`Script URL`, fixedWidth: false, sortable: true}
];
this._dataGrid = new DataGrid.SortableDataGrid(columns);
@@ -30,8 +31,7 @@ Profiler.LiveHeapProfileView = class extends UI.VBox {
this._dataGrid.addEventListener(DataGrid.DataGrid.Events.OpenedNode, this._revealSourceForSelectedNode, this);
this._dataGrid.addEventListener(DataGrid.DataGrid.Events.SortingChanged, this._sortingChanged, this);
this._dataGrid.asWidget().show(this.contentElement);
-
- this._pollTimer = setTimeout(() => this._poll());
+ this._currentPollId = 0;
}
/**
@@ -45,43 +45,49 @@ Profiler.LiveHeapProfileView = class extends UI.VBox {
* @override
*/
willHide() {
- clearTimeout(this._pollTimer);
- this._pollTimer = 0;
+ ++this._currentPollId;
}
async _poll() {
- const models = SDK.targetManager.models(SDK.HeapProfilerModel);
- const profiles = await Promise.all(models.map(model => model.getSamplingProfile()));
- if (!this._pollTimer)
- return;
- profiles.remove(null);
- this._update(profiles);
- this._pollTimer = setTimeout(() => this._poll(), 3000);
+ const pollId = this._currentPollId;
+ do {
+ const isolates = Array.from(SDK.isolateManager.isolates());
+ const profiles = await Promise.all(
+ isolates.map(isolate => isolate.heapProfilerModel() && isolate.heapProfilerModel().getSamplingProfile()));
+ if (this._currentPollId !== pollId)
+ return;
+ this._update(isolates, profiles);
+ await new Promise(r => setTimeout(r, 3000));
+ } while (this._currentPollId === pollId);
}
/**
- * @param {!Array<!Protocol.HeapProfiler.SamplingHeapProfile>} profiles
+ * @param {!Array<!SDK.IsolateManager.Isolate>} isolates
+ * @param {!Array<?Protocol.HeapProfiler.SamplingHeapProfile>} profiles
*/
- _update(profiles) {
- /** @type {!Map<string, number>} */
- const sizeByUrl = new Map();
- for (const profile of profiles)
- processNode('', profile.head);
+ _update(isolates, profiles) {
+ /** @type {!Map<string, !{size: number, isolates: !Set<!SDK.IsolateManager.Isolate>}>} */
+ const dataByUrl = new Map();
+ profiles.forEach((profile, index) => {
+ if (profile)
+ processNodeTree(isolates[index], '', profile.head);
+ });
const rootNode = this._dataGrid.rootNode();
const exisitingNodes = new Set();
- for (const pair of sizeByUrl) {
+ for (const pair of dataByUrl) {
const url = /** @type {string} */ (pair[0]);
- const size = /** @type {number} */ (pair[1]);
+ const size = /** @type {number} */ (pair[1].size);
+ const isolateCount = /** @type {number} */ (pair[1].isolates.size);
if (!url) {
console.info(`Node with empty URL: ${size} bytes`); // eslint-disable-line no-console
continue;
}
let node = this._gridNodeByUrl.get(url);
if (node) {
- node.updateSize(size);
+ node.updateNode(size, isolateCount);
} else {
- node = new Profiler.LiveHeapProfileView.GridNode(url, size);
+ node = new Profiler.LiveHeapProfileView.GridNode(url, size, isolateCount);
this._gridNodeByUrl.set(url, node);
rootNode.appendChild(node);
}
@@ -97,14 +103,22 @@ Profiler.LiveHeapProfileView = class extends UI.VBox {
this._sortingChanged();
/**
+ * @param {!SDK.IsolateManager.Isolate} isolate
* @param {string} parentUrl
* @param {!Protocol.HeapProfiler.SamplingHeapProfileNode} node
*/
- function processNode(parentUrl, node) {
+ function processNodeTree(isolate, parentUrl, node) {
const url = node.callFrame.url || parentUrl || systemNodeName(node) || anonymousScriptName(node);
- if (node.selfSize)
- sizeByUrl.set(url, (sizeByUrl.get(url) || 0) + node.selfSize);
- node.children.forEach(child => processNode(url, child));
+ node.children.forEach(processNodeTree.bind(null, isolate, url));
+ if (!node.selfSize)
+ return;
+ let data = dataByUrl.get(url);
+ if (!data) {
+ data = {size: 0, isolates: new Set()};
+ dataByUrl.set(url, data);
+ }
+ data.size += node.selfSize;
+ data.isolates.add(isolate);
}
/**
@@ -159,20 +173,24 @@ Profiler.LiveHeapProfileView.GridNode = class extends DataGrid.SortableDataGridN
/**
* @param {string} url
* @param {number} size
+ * @param {number} isolateCount
*/
- constructor(url, size) {
+ constructor(url, size, isolateCount) {
super();
this._url = url;
this._size = size;
+ this._isolateCount = isolateCount;
}
/**
* @param {number} size
+ * @param {number} isolateCount
*/
- updateSize(size) {
- if (this._size === size)
+ updateNode(size, isolateCount) {
+ if (this._size === size && this._isolateCount === isolateCount)
return;
this._size = size;
+ this._isolateCount = isolateCount;
this.refresh();
}
@@ -185,13 +203,15 @@ Profiler.LiveHeapProfileView.GridNode = class extends DataGrid.SortableDataGridN
const cell = this.createTD(columnId);
switch (columnId) {
case 'url':
- cell.title = this._url;
cell.textContent = this._url;
break;
case 'size':
cell.textContent = Number.withThousandsSeparator(Math.round(this._size / 1e3));
cell.createChild('span', 'size-units').textContent = ls`KB`;
break;
+ case 'isolates':
+ cell.textContent = this._isolateCount;
+ break;
}
return cell;
}
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/profiler/ProfileLauncherView.js b/chromium/third_party/blink/renderer/devtools/front_end/profiler/ProfileLauncherView.js
index 9b201bf694d..f0787a717bb 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/profiler/ProfileLauncherView.js
+++ b/chromium/third_party/blink/renderer/devtools/front_end/profiler/ProfileLauncherView.js
@@ -37,27 +37,30 @@ Profiler.ProfileLauncherView = class extends UI.VBox {
*/
constructor(profilesPanel) {
super();
+ this.registerRequiredCSS('profiler/profileLauncherView.css');
+
this._panel = profilesPanel;
this.element.classList.add('profile-launcher-view');
+ this._contentElement = this.element.createChild('div', 'profile-launcher-view-content vbox');
+
+ const profileTypeSelectorElement = this._contentElement.createChild('div', 'vbox');
+ this._selectedProfileTypeSetting = Common.settings.createSetting('selectedProfileType', 'CPU');
+ this._profileTypeHeaderElement = profileTypeSelectorElement.createChild('h1');
+ this._profileTypeSelectorForm = profileTypeSelectorElement.createChild('form');
- this._contentElement = this.element.createChild('div', 'profile-launcher-view-content');
- this._innerContentElement = this._contentElement.createChild('div');
- const controlDiv = this._contentElement.createChild('div', 'vbox profile-launcher-control');
- controlDiv.createChild('h1').textContent = ls`Select JavaScript VM instance`;
- const targetDiv = controlDiv.createChild('div', 'vbox profile-launcher-target-list');
- new Profiler.IsolateSelector().show(targetDiv);
- this._controlButton =
- UI.createTextButton('', this._controlButtonClicked.bind(this), 'profile-launcher-button', true /* primary */);
- this._contentElement.appendChild(this._controlButton);
+ const isolateSelectorElement = this._contentElement.createChild('div', 'vbox profile-isolate-selector-block');
+ isolateSelectorElement.createChild('h1').textContent = ls`Select JavaScript VM instance`;
+ const isolateSelector = new Profiler.IsolateSelector();
+ isolateSelector.show(isolateSelectorElement.createChild('div', 'vbox profile-launcher-target-list'));
+ isolateSelectorElement.appendChild(isolateSelector.totalMemoryElement());
+
+ const buttonsDiv = this._contentElement.createChild('div', 'hbox profile-launcher-buttons');
+ this._controlButton = UI.createTextButton('', this._controlButtonClicked.bind(this), '', /* primary */ true);
+ this._loadButton = UI.createTextButton(ls`Load`, this._loadButtonClicked.bind(this), '');
+ buttonsDiv.appendChild(this._controlButton);
+ buttonsDiv.appendChild(this._loadButton);
this._recordButtonEnabled = true;
- this._loadButton =
- UI.createTextButton(Common.UIString('Load'), this._loadButtonClicked.bind(this), 'profile-launcher-button');
- this._contentElement.appendChild(this._loadButton);
- this._selectedProfileTypeSetting = Common.settings.createSetting('selectedProfileType', 'CPU');
- this._header = this._innerContentElement.createChild('h1');
- this._profileTypeSelectorForm = this._innerContentElement.createChild('form');
- this._innerContentElement.createChild('div', 'flexible-space');
/** @type {!Map<string, !HTMLOptionElement>} */
this._typeIdToOptionElement = new Map();
}
@@ -127,9 +130,9 @@ Profiler.ProfileLauncherView = class extends UI.VBox {
if (customContent)
this._profileTypeSelectorForm.createChild('p').appendChild(customContent);
if (this._typeIdToOptionElement.size > 1)
- this._header.textContent = ls`Select profiling type`;
+ this._profileTypeHeaderElement.textContent = ls`Select profiling type`;
else
- this._header.textContent = profileType.name;
+ this._profileTypeHeaderElement.textContent = profileType.name;
}
restoreSelectedProfileType() {
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/profiler/heapProfiler.css b/chromium/third_party/blink/renderer/devtools/front_end/profiler/heapProfiler.css
index 7e5ce499e7f..45027e45a0f 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/profiler/heapProfiler.css
+++ b/chromium/third_party/blink/renderer/devtools/front_end/profiler/heapProfiler.css
@@ -182,38 +182,6 @@
flex-shrink: 0;
}
-.heap-snapshot-stats-legend {
- margin-left: 24px;
- flex-shrink: 0;
-}
-
-.heap-snapshot-stats-legend > div {
- margin-top: 1px;
- width: 170px;
-}
-
-.heap-snapshot-stats-swatch {
- display: inline-block;
- width: 10px;
- height: 10px;
- border: 1px solid rgba(100, 100, 100, 0.3);
-}
-
-.heap-snapshot-stats-swatch.heap-snapshot-stats-empty-swatch {
- border: none;
-}
-
-.heap-snapshot-stats-name,
-.heap-snapshot-stats-size {
- display: inline-block;
- margin-left: 6px;
-}
-
-.heap-snapshot-stats-size {
- float: right;
- text-align: right;
-}
-
.heap-allocation-stack .stack-frame {
display: flex;
justify-content: space-between;
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/profiler/profileLauncherView.css b/chromium/third_party/blink/renderer/devtools/front_end/profiler/profileLauncherView.css
index 85a773f16f0..24824af831e 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/profiler/profileLauncherView.css
+++ b/chromium/third_party/blink/renderer/devtools/front_end/profiler/profileLauncherView.css
@@ -4,37 +4,112 @@
* found in the LICENSE file.
*/
-.profile-isolate-item {
+.profile-launcher-view {
+ overflow: auto;
+}
+
+.profile-launcher-view-content {
+ margin: 10px 16px;
+ flex: auto 1 0;
+}
+
+.profile-launcher-view-content h1 {
+ font-size: 15px;
+ font-weight: normal;
+ margin: 6px 0 10px 0;
+}
+
+.profile-launcher-view-content [is=dt-radio] {
+ font-size: 13px;
+}
+
+.profile-launcher-view-content p {
+ color: grey;
+ margin-top: 1px;
+ margin-left: 22px;
+}
+
+.profile-launcher-view-content p [is=dt-checkbox] {
+ display: flex;
+}
+
+.profile-launcher-view-content button.running {
+ color: hsl(0, 100%, 58%);
+}
+
+.profile-launcher-view-content button.running:hover {
+ color: hsl(0, 100%, 42%);
+}
+
+body.inactive .profile-launcher-view-content button.running:not(.toolbar-item) {
+ color: rgb(220, 130, 130);
+}
+
+.profile-launcher-view-content > div {
+ flex: auto 0 0;
+}
+
+.profile-launcher-view-content > .profile-isolate-selector-block {
+ flex: auto 1 0;
+}
+
+.profile-isolate-selector-block button {
+ min-width: 110px;
+}
+
+.profile-launcher-target-list {
+ margin-bottom: 6px;
+ border: 1px solid #ddd;
+ flex: 150px 1 0;
+}
+
+.profile-memory-usage-item {
padding: 4px;
line-height: 16px;
- border-left: 2px solid transparent;
+ border-left: 3px solid transparent;
overflow-x: hidden;
}
-.profile-isolate-item:hover {
+.profile-launcher-target-list .profile-memory-usage-item:hover {
background-color: hsla(0, 0%, 0%, 0.05);
}
-.profile-isolate-item.selected {
+.profile-memory-usage-item.selected {
border-color: #4285f4;
background-color: #4285f420;
}
-.profile-isolate-item > div {
+.profile-memory-usage-item > div {
flex-shrink: 0;
margin-right: 12px;
}
-.profile-isolate-item-heap {
+.profile-memory-usage-item-size {
width: 60px;
text-align: right;
}
-.profile-isolate-item-trend {
+.profile-memory-usage-item-trend {
width: 80px;
color: green;
}
-.profile-isolate-item-trend.increasing {
+.profile-memory-usage-item-trend.increasing {
color: red;
}
+
+.profile-isolate-selector-block > .profile-memory-usage-item {
+ margin-left: 1px;
+ margin-bottom: 4px;
+ font-weight: bolder;
+}
+
+.profile-launcher-buttons {
+ flex-wrap: wrap;
+}
+
+.profile-launcher-buttons button {
+ min-width: 120px;
+ height: 28px;
+ margin: 4px 16px 4px 0;
+}
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/profiler/profiler_strings.grdp b/chromium/third_party/blink/renderer/devtools/front_end/profiler/profiler_strings.grdp
new file mode 100644
index 00000000000..b46a803f4e4
--- /dev/null
+++ b/chromium/third_party/blink/renderer/devtools/front_end/profiler/profiler_strings.grdp
@@ -0,0 +1,439 @@
+<?xml version="1.0" encoding="utf-8"?>
+<grit-part>
+ <message name="IDS_DEVTOOLS_00018e8c8fc32e1ec073c0cdbadb5575" desc="">
+ <ph name="NUMBER_WITHTHOUSANDSSEPARATOR_VALUE________">$1s</ph> KB
+ </message>
+ <message name="IDS_DEVTOOLS_007c41a9025be2c8e14b496ed3ee00f8" desc="">
+ Save…
+ </message>
+ <message name="IDS_DEVTOOLS_02184526968aa861a744df910647fcf0" desc="">
+ Freed Size
+ </message>
+ <message name="IDS_DEVTOOLS_0257542bea15eb6baa3fc0364cd3ba24" desc="">
+ <ph name="NUMBER_WITHTHOUSANDSSEPARATOR_MATH_ROUND_VALUE_________">$1s</ph> KB
+ </message>
+ <message name="IDS_DEVTOOLS_030361ea56fa177ebcbefe708a45b0f2" desc="">
+ # Deleted
+ </message>
+ <message name="IDS_DEVTOOLS_04042b5589b3d4fd4e1e7e44265ad247" desc="">
+ Total page JS heap size change trend over the last <ph name="TRENDINTERVALMINUTES">$1s</ph> minutes.
+ </message>
+ <message name="IDS_DEVTOOLS_05ce989cc1015cd221844376fc4cf206" desc="">
+ Snapshot <ph name="PROFILE_UID">$1d</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_07b20ae970048fc2002d756f27acc863" desc="">
+ Renderer
+ </message>
+ <message name="IDS_DEVTOOLS_07d2bff541ce0f9ec4389e93a97997ee" desc="">
+ Objects allocated between <ph name="LIST_I______TITLE">$1s</ph> and <ph name="LIST_I__TITLE">$2s</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_0a63e0039bb8cb9846ad74ace8e1e5de" desc="">
+ Call tree
+ </message>
+ <message name="IDS_DEVTOOLS_0aa6f4210bf373c95eda00232e93cd98" desc="">
+ Distance
+ </message>
+ <message name="IDS_DEVTOOLS_11a755d598c0c417f9a36758c3da7481" desc="">
+ Stop
+ </message>
+ <message name="IDS_DEVTOOLS_13b5bfe96f3e2fe411c9f66f4a582adf" desc="">
+ in
+ </message>
+ <message name="IDS_DEVTOOLS_164c4aca31febd73a41b50c4a9c406be" desc="">
+ Snapshotting…
+ </message>
+ <message name="IDS_DEVTOOLS_17321b102f09de9aaa68f2b16a530247" desc="">
+ Total JS heap size
+ </message>
+ <message name="IDS_DEVTOOLS_17c34fb9ce9a7a20604a5f10e447edce" desc="">
+ Heap size change trend over the last <ph name="TRENDINTERVALMINUTES">$1s</ph> minutes.
+ </message>
+ <message name="IDS_DEVTOOLS_1816452291df3cd48db5667463361f25" desc="">
+ Focus selected function
+ </message>
+ <message name="IDS_DEVTOOLS_1d36783e12317ed400ebeddeb072a27b" desc="">
+ Chart
+ </message>
+ <message name="IDS_DEVTOOLS_1eaeeaeb638fdf7f6eeb047abbfd0f1a" desc="">
+ Self Time
+ </message>
+ <message name="IDS_DEVTOOLS_1f1e990a1d2ba8ab4dd873a192237c30" desc="">
+ <ph name="VALUE">$1.1f</ph> ms
+ </message>
+ <message name="IDS_DEVTOOLS_27c0ad7a8ff8f9df8e13bb2d974c95d0" desc="">
+ Allocation
+ </message>
+ <message name="IDS_DEVTOOLS_290612199861c31d1036b185b4e69b75" desc="">
+ Summary
+ </message>
+ <message name="IDS_DEVTOOLS_2d7b69664bc4226fb198124fb707e57c" desc="">
+ Snapshot <ph name="THIS_NEXTPROFILEUID__">$1s</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_2db1f9be46028cfdf9b8f96a0110e637" desc="">
+ <ph name="VALUE">$1.2f</ph> %%
+ </message>
+ <message name="IDS_DEVTOOLS_2def01e5dee6051b68f5b1e5e2fc8ad4" desc="">
+ System Objects
+ </message>
+ <message name="IDS_DEVTOOLS_2f318b400ebcb22420251535452efef0" desc="">
+ Containment
+ </message>
+ <message name="IDS_DEVTOOLS_32e679bdbd5dd7a0bacf024bc30e8a75" desc="">
+ Recording…
+ </message>
+ <message name="IDS_DEVTOOLS_35066690e799cd4e59123262e41b29c5" desc="">
+ Stop CPU profiling
+ </message>
+ <message name="IDS_DEVTOOLS_36917e785bd31d786ab9dd7790a9a4c2" desc="">
+ JS Heap
+ </message>
+ <message name="IDS_DEVTOOLS_3a9619400e054970a7ab8b67c4ce5109" desc="">
+ Restore all functions
+ </message>
+ <message name="IDS_DEVTOOLS_3ae3895607d1203d8e73e18dd4c4551c" desc="">
+ Allocation profiles show sampled native memory allocations from the renderer process.
+ </message>
+ <message name="IDS_DEVTOOLS_3b6077563702806850baeddff55ee1c6" desc="">
+ Preview is not available
+ </message>
+ <message name="IDS_DEVTOOLS_3ce9ab6602763824b2f317965c6a1a20" desc="">
+ Heap size in use by live JS objects.
+ </message>
+ <message name="IDS_DEVTOOLS_3e6defd685231cdd12065add41996c89" desc="">
+ All objects
+ </message>
+ <message name="IDS_DEVTOOLS_3eea5ef5cf936633884b33c458451013" desc="">
+ Show native functions in JS Profile
+ </message>
+ <message name="IDS_DEVTOOLS_412ec4c9168f10f6e2061f65f0358079" desc="">
+ Typed Arrays
+ </message>
+ <message name="IDS_DEVTOOLS_41a813362d7dc28fd247f233f620cb7b" desc="">
+ Can&apos;t load profile while another profile is being recorded.
+ </message>
+ <message name="IDS_DEVTOOLS_42db600672cae99246e499a23827146b" desc="">
+ Heap snapshot profiles show memory distribution among your page&apos;s JavaScript objects and related DOM nodes.
+ </message>
+ <message name="IDS_DEVTOOLS_4307cf6e92b003765b9f493109f8fa51" desc="">
+ Native memory allocation sampling
+ </message>
+ <message name="IDS_DEVTOOLS_43190a68dbd847e2f98a7ddd04b2eec5" desc="">
+ Live Size
+ </message>
+ <message name="IDS_DEVTOOLS_433660c1f9743978edc4ca196b5b9f19" desc="">
+ Find by cost (&gt;50ms), name or file
+ </message>
+ <message name="IDS_DEVTOOLS_435eaeed5b69a2dfb7f343e28d109ce6" desc="">
+ Distance from window object
+ </message>
+ <message name="IDS_DEVTOOLS_4715ae2a2790290ba123375faa3a53f2" desc="">
+ High resolution CPU profiling
+ </message>
+ <message name="IDS_DEVTOOLS_497031794414a552435f90151ac3b54b" desc="">
+ Object
+ </message>
+ <message name="IDS_DEVTOOLS_4b08055cf5445d820914943222d4910c" desc="">
+ Script URL
+ </message>
+ <message name="IDS_DEVTOOLS_4ca19c06c6e03c07bced1d97ca861cf0" desc="">
+ # Delta
+ </message>
+ <message name="IDS_DEVTOOLS_4d4d76db5d9ef72b504f83d89af5b6dd" desc="">
+ Selected size: <ph name="NUMBER_BYTESTOSTRING_EVENT_DATA_SIZE_">$1s</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_4d8aa0a7e336e08bad365b81a197f184" desc="">
+ NATIVE SAMPLING PROFILES
+ </message>
+ <message name="IDS_DEVTOOLS_4daace4b0bc45c13739427cfc06cf7b7" desc="">
+ Text (Top Down)
+ </message>
+ <message name="IDS_DEVTOOLS_5209fac92c957988ce1453bb139790ce" desc="">
+ Failed to read file
+ </message>
+ <message name="IDS_DEVTOOLS_54a238e21ab577ca9c3100d0ed4cd02d" desc="">
+ Retained Size
+ </message>
+ <message name="IDS_DEVTOOLS_54ae9758deaa74226306072bea256c3c" desc="">
+ Stop heap profiling
+ </message>
+ <message name="IDS_DEVTOOLS_54afafa921428eed23978f633af4ce99" desc="">
+ Allocation sampling
+ </message>
+ <message name="IDS_DEVTOOLS_57b1250c3cbec60c67810ac83afb2c64" desc="">
+ (internal array)
+ </message>
+ <message name="IDS_DEVTOOLS_5dd1d9f5baa173ae9267b3631da17a83" desc="">
+ Self size
+ </message>
+ <message name="IDS_DEVTOOLS_5e0ebd581894697a7ae357bea6b7e590" desc="">
+ Start CPU profiling
+ </message>
+ <message name="IDS_DEVTOOLS_60dcffb26f0ed1b0c73f8cea5d5d9772" desc="">
+ Native memory allocation snapshot (<ph name="PROCESSTYPE">$1s</ph>)
+ </message>
+ <message name="IDS_DEVTOOLS_61b4b76027d49142c386737a0e94cedb" desc="">
+ NATIVE SNAPSHOTS
+ </message>
+ <message name="IDS_DEVTOOLS_62b96ca53ee08544d8d96269112df323" desc="">
+ JS Arrays
+ </message>
+ <message name="IDS_DEVTOOLS_678d0a4421b60dc59999ac02837496a6" desc="">
+ Constructor
+ </message>
+ <message name="IDS_DEVTOOLS_6b59ba1fcfd868474cae169876f9cbfa" desc="">
+ Native memory snapshots show sampled native allocations in the renderer process since start up.
+ Chrome has to be started with --memlog=all flag. Check flags at chrome://flags
+ </message>
+ <message name="IDS_DEVTOOLS_6bb61b1a929f2a0186f2671cd8258bd9" desc="">
+ Not optimized: <ph name="THIS__DEOPTREASON">$1s</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_6d27e30b2f09c2a451a6d123c1a35805" desc="">
+ Run <ph name="_">$1d</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_6db0d0f1832acb4a56fc82f2317e61e6" desc="">
+ Parsing…
+ </message>
+ <message name="IDS_DEVTOOLS_6e9dd9cf5419fd65f433f1e4bbc5e6ad" desc="">
+ SAMPLING PROFILES
+ </message>
+ <message name="IDS_DEVTOOLS_710686e22674bcc79ef72c2485ca96b9" desc="">
+ Alloc. Size
+ </message>
+ <message name="IDS_DEVTOOLS_7327aea04bd0403771340a3fe03aa42b" desc="">
+ Stopping…
+ </message>
+ <message name="IDS_DEVTOOLS_7381d487d18845b379422325c0a768d6" desc="">
+ Loaded
+ </message>
+ <message name="IDS_DEVTOOLS_75d436b4fd4142db941be900a86b9b3e" desc="">
+ Allocation stack
+ </message>
+ <message name="IDS_DEVTOOLS_7602c7108888133a3e00de63256ae444" desc="">
+ Shallow Size
+ </message>
+ <message name="IDS_DEVTOOLS_7806c2199c12b018327832bcb3ae20ce" desc="">
+ Detached from DOM tree
+ </message>
+ <message name="IDS_DEVTOOLS_78a1e5aee115faf6ebf8f2a38ce553d4" desc="">
+ Clear all profiles
+ </message>
+ <message name="IDS_DEVTOOLS_7ae47a5ac9257db8c7bb89c7afa4db7c" desc="">
+ Take snapshot
+ </message>
+ <message name="IDS_DEVTOOLS_7cb94d94002a34c350cad72e6649c5fe" desc="">
+ Stack was not recorded for this object because it had been allocated before this profile recording started.
+ </message>
+ <message name="IDS_DEVTOOLS_7d3d3a2b500a662396911596807715d0" desc="">
+ Tree (Top Down)
+ </message>
+ <message name="IDS_DEVTOOLS_7e2586c09a41264908762549314a94c0" desc="">
+ CPU PROFILES
+ </message>
+ <message name="IDS_DEVTOOLS_85000e6433d4ac4033e6d7f5a3466f92" desc="">
+ Reveal in Summary view
+ </message>
+ <message name="IDS_DEVTOOLS_86408593c34af77fdd90df932f8b5261" desc="">
+ Function
+ </message>
+ <message name="IDS_DEVTOOLS_86a699c935e3e7e36e334bb61a336f02" desc="">
+ Start heap profiling
+ </message>
+ <message name="IDS_DEVTOOLS_86de9c70eae18dbd7e1f99cc73f5ce43" desc="">
+ # New
+ </message>
+ <message name="IDS_DEVTOOLS_89be9433646f5939040a78971a5d103a" desc="">
+ Strings
+ </message>
+ <message name="IDS_DEVTOOLS_8b8561904173cf8ded80c66eb9628bc3" desc="">
+ ⬇<ph name="CHANGERATETEXT">$1s</ph>/s
+ </message>
+ <message name="IDS_DEVTOOLS_8df507632e20dff27e88902c825db002" desc="">
+ Heap profiler is recording
+ </message>
+ <message name="IDS_DEVTOOLS_8e77c83fffc021286d4790b1a28bd695" desc="">
+ Select profiling type
+ </message>
+ <message name="IDS_DEVTOOLS_9075bd476d18e24259dc388a4569b723" desc="">
+ Record memory allocations using sampling method.
+ This profile type has minimal performance overhead and can be used for long running operations.
+ It provides good approximation of allocations broken down by JavaScript execution stack.
+ </message>
+ <message name="IDS_DEVTOOLS_9206de0db462c24e8a56433e2f7b7c75" desc="">
+ Heap Snapshot
+ </message>
+ <message name="IDS_DEVTOOLS_959f661cf87130eea5c8e5671c013741" desc="">
+ Objects allocated before <ph name="LIST_I__TITLE">$1s</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_967d1bd7c21531622e5edfa6c5bf320a" desc="">
+ Take heap snapshot
+ </message>
+ <message name="IDS_DEVTOOLS_974eabe9dfc86e52b41b310218ac7d05" desc="">
+ Total size
+ </message>
+ <message name="IDS_DEVTOOLS_9794a8cf80d4f6b67dca3c7381847486" desc="">
+ Self Size (bytes)
+ </message>
+ <message name="IDS_DEVTOOLS_9d247d9b5e90f2c983240d32113d06d2" desc="">
+ Load…
+ </message>
+ <message name="IDS_DEVTOOLS_9e854bf5f75e670228f33f9fe857793d" desc="">
+ Size of the object plus the graph it retains in bytes
+ </message>
+ <message name="IDS_DEVTOOLS_9f29da220ed82809ec5dd70af4e52904" desc="">
+ Total Time
+ </message>
+ <message name="IDS_DEVTOOLS_a6122a65eaa676f700ae68d393054a37" desc="">
+ Start
+ </message>
+ <message name="IDS_DEVTOOLS_a73538b7cd30c19b094438e16da9403d" desc="">
+ Exclude selected function
+ </message>
+ <message name="IDS_DEVTOOLS_a7bd935a88c629dc11c52e0c16c2a8a0" desc="">
+ <ph name="DISTANCE">$1d</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_a8445619abd08f3ba0ebfcb31183f7f9" desc="">
+ −
+ </message>
+ <message name="IDS_DEVTOOLS_a92758ee94689bc49f2d6b891e746737" desc="">
+ HEAP SNAPSHOTS
+ </message>
+ <message name="IDS_DEVTOOLS_a97cce5b0a66cd7d7b7b7d2e06b7605c" desc="">
+ Can&apos;t load file. Supported file extensions: &apos;<ph name="ARRAY_FROM_EXTENSIONS__JOIN________">$1s</ph>&apos;.
+ </message>
+ <message name="IDS_DEVTOOLS_aab112fba39c10ed5df335ae0e47f329" desc="">
+ Not optimized
+ </message>
+ <message name="IDS_DEVTOOLS_ad49e602302b1ca117245c4f19ef4450" desc="">
+ Retainers
+ </message>
+ <message name="IDS_DEVTOOLS_ad857c29fb46afef4e17d658f34ead22" desc="">
+ An error occurred when a call to method &apos;<ph name="DATA_ERRORMETHODNAME">$1s</ph>&apos; was requested
+ </message>
+ <message name="IDS_DEVTOOLS_aebc3d61d99dd094fd29afc12dcd8e1f" desc="">
+ Allocation instrumentation on timeline
+ </message>
+ <message name="IDS_DEVTOOLS_b59674dba88cebbb4b94a32066ad3dd0" desc="">
+ Loading… <ph name="NUMBER_BYTESTOSTRING_THIS__JSONIFIEDPROFILE_LENGTH_">$1d</ph>%%
+ </message>
+ <message name="IDS_DEVTOOLS_b8e4045b98241a124561c4d2a69731b8" desc="">
+ Heavy (Bottom Up)
+ </message>
+ <message name="IDS_DEVTOOLS_bc033a16b36d2d313489933a63a938cf" desc="">
+ Live Heap Profile
+ </message>
+ <message name="IDS_DEVTOOLS_bd0a5e31e9b3c87eb2d3c19b00cedfc3" desc="">
+ Heap memory usage
+ </message>
+ <message name="IDS_DEVTOOLS_c22d30084d8ddc9a571512ddee6a83e9" desc="">
+ Total time
+ </message>
+ <message name="IDS_DEVTOOLS_c2b9b79ea4770ae01a139fe953310039" desc="">
+ Live Count
+ </message>
+ <message name="IDS_DEVTOOLS_c33e404a441c6ba9648f88af3c68a1ca" desc="">
+ Statistics
+ </message>
+ <message name="IDS_DEVTOOLS_c9cc8cce247e49bae79f15173ce97354" desc="">
+ Save
+ </message>
+ <message name="IDS_DEVTOOLS_ca0dbad92a874b2f69b549293387925e" desc="">
+ Code
+ </message>
+ <message name="IDS_DEVTOOLS_ca425f84afc5ad77fc9c4d75eed8113f" desc="">
+ ⬆<ph name="CHANGERATETEXT">$1s</ph>/s
+ </message>
+ <message name="IDS_DEVTOOLS_cce99c598cfdb9773ab041d54c3d973a" desc="">
+ Profile
+ </message>
+ <message name="IDS_DEVTOOLS_d06bb9eb4ee32f700ffc1c9f8e5c0a25" desc="">
+ Aggregated self time
+ </message>
+ <message name="IDS_DEVTOOLS_d0f25115288c15321ecf672f0d6a83ea" desc="">
+ Profiles
+ </message>
+ <message name="IDS_DEVTOOLS_d1c7c250869b52eefda57caa7e6eda20" desc="">
+ Stop recording heap profile
+ </message>
+ <message name="IDS_DEVTOOLS_d3d9fdef0e91fc4aba18e57475fd74ea" desc="">
+ VMs
+ </message>
+ <message name="IDS_DEVTOOLS_d46b0b413885c920720180d0af60ff54" desc="">
+ Record JavaScript CPU Profile
+ </message>
+ <message name="IDS_DEVTOOLS_d4bbbe0308b348c609eb4cab28150f80" desc="">
+ Heap snapshot
+ </message>
+ <message name="IDS_DEVTOOLS_d5a263d11105678cc9ae7d29efc4ccc8" desc="">
+
+ Allocation timelines show instrumented JavaScript memory allocations over time.
+ Once profile is recorded you can select a time interval to see objects that
+ were allocated within it and still alive by the end of recording.
+ Use this profile type to isolate memory leaks.
+ </message>
+ <message name="IDS_DEVTOOLS_d5e5683e3f616ed72e310476bb97f33f" desc="">
+ Size of the object itself in bytes
+ </message>
+ <message name="IDS_DEVTOOLS_d9319f0a43aaf399eebd2d28713e823a" desc="">
+ Select JavaScript VM instance
+ </message>
+ <message name="IDS_DEVTOOLS_d9c86ffece4f8636e406975843aa7b4d" desc="">
+ Live objects
+ </message>
+ <message name="IDS_DEVTOOLS_da9157d11966e9225d29d4f1f0ca3d75" desc="">
+ Total page JS heap size across all VM instances.
+ </message>
+ <message name="IDS_DEVTOOLS_dc1270259e986e0406259be39a53c8ad" desc="">
+ Record allocation stacks (extra performance overhead)
+ </message>
+ <message name="IDS_DEVTOOLS_dce00dbf94282d9be42f7d6a4ebc2c41" desc="">
+ Self time
+ </message>
+ <message name="IDS_DEVTOOLS_ddacdca2bfda777bb0cb7668d76df5f4" desc="">
+ (Anonymous Script <ph name="NODE_CALLFRAME_SCRIPTID">$1s</ph>)
+ </message>
+ <message name="IDS_DEVTOOLS_df3b67aec764dd36b2a1e94d7f205051" desc="">
+ ALLOCATION TIMELINES
+ </message>
+ <message name="IDS_DEVTOOLS_e098faba9dade304f660aed30940747a" desc="">
+ Start recording heap profile
+ </message>
+ <message name="IDS_DEVTOOLS_e93f994f01c537c4e2f7d8528c3eb5e9" desc="">
+ Count
+ </message>
+ <message name="IDS_DEVTOOLS_ea1c7351fd540546f03ac089a7b41eb3" desc="">
+ Profile loading failed: <ph name="ERROR_MESSAGE">$1s</ph>.
+ </message>
+ <message name="IDS_DEVTOOLS_ed195e39f2d26aed511b5c86c75935d8" desc="">
+ Size Delta
+ </message>
+ <message name="IDS_DEVTOOLS_eec806d119a5eddd61e2ccd21bfd9b20" desc="">
+ Aggregated total time
+ </message>
+ <message name="IDS_DEVTOOLS_ef15fd2f45e6bb5ce57587895ba64f93" desc="">
+ Browser
+ </message>
+ <message name="IDS_DEVTOOLS_f19dbf2edb3a0bd74b0524d960ff21eb" desc="">
+ Load
+ </message>
+ <message name="IDS_DEVTOOLS_f3e40bc520cf1f22e4d36d5c5f8d2618" desc="">
+ User object reachable from window
+ </message>
+ <message name="IDS_DEVTOOLS_f4dab52bcaa99b605451620178a1ee4e" desc="">
+ File &apos;<ph name="READER_FILENAME__">$1s</ph>&apos; read error: <ph name="READER_ERROR___MESSAGE">$2s</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_f6c0e3a1c3cfabd32ae8d3ae741fcf0a" desc="">
+ Comparison
+ </message>
+ <message name="IDS_DEVTOOLS_f6ff777632b4b524d2f203c78359eed2" desc="">
+ Saving… <ph name="PERCENTVALUE">$1d</ph>%%
+ </message>
+ <message name="IDS_DEVTOOLS_fbbe8b507083defdbfe14a341551c77b" desc="">
+ CPU profiles show where the execution time is spent in your page&apos;s JavaScript functions.
+ </message>
+ <message name="IDS_DEVTOOLS_fdbd92f0c6b67291ca954b74885d434e" desc="">
+ Profile <ph name="TYPE_NEXTPROFILEUID__">$1d</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_ffd4ebcdf9ad139d4cd2c84d853f4f34" desc="">
+ Total Size (bytes)
+ </message>
+</grit-part> \ No newline at end of file
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/profiler/profilesPanel.css b/chromium/third_party/blink/renderer/devtools/front_end/profiler/profilesPanel.css
index 4849d7b36c3..9c967957a64 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/profiler/profilesPanel.css
+++ b/chromium/third_party/blink/renderer/devtools/front_end/profiler/profilesPanel.css
@@ -112,75 +112,6 @@
color: white;
}
-
-.profile-launcher-view {
- overflow: auto;
-}
-
-.profile-launcher-view-content {
- padding: 10px 16px;
-}
-
-.profile-launcher-view-content h1 {
- font-size: 15px;
- font-weight: normal;
- padding: 6px 0;
- margin: 0 0 5px 0;
-}
-
-.profile-launcher-view-content [is=dt-radio] {
- font-size: 13px;
-}
-
-.profile-launcher-control {
- align-items: flex-start;
- flex-wrap: wrap;
- margin-top: 10px;
- margin-right: 6px;
-}
-
-.profile-launcher-control button {
- min-width: 110px;
-}
-
-.profile-launcher-target-list {
- width: 100%;
- height: 150px;
- margin-bottom: 10px;
- border: 1px solid #ddd;
-}
-
-.profile-launcher-target {
- align-items: baseline;
-}
-
-.profile-launcher-target > * {
- flex: 0 0 auto;
- margin-right: 8px;
-}
-
-.profile-launcher-view-content p {
- color: grey;
- margin-top: 1px;
- margin-left: 22px;
-}
-
-.profile-launcher-view-content p [is=dt-checkbox] {
- display: flex;
-}
-
-.profile-launcher-view-content button.running {
- color: hsl(0, 100%, 58%);
-}
-
-.profile-launcher-view-content button.running:hover {
- color: hsl(0, 100%, 42%);
-}
-
-body.inactive .profile-launcher-view-content button.running:not(.toolbar-item) {
- color: rgb(220, 130, 130);
-}
-
.highlighted-row {
-webkit-animation: row_highlight 2s 0s;
}
@@ -190,26 +121,6 @@ body.inactive .profile-launcher-view-content button.running:not(.toolbar-item) {
to { background-color: rgba(255, 255, 120, 0); }
}
-.profile-canvas-decoration span[is=dt-icon-label] {
- margin-right: 4px;
-}
-
-.profile-canvas-decoration {
- color: red;
- margin: -14px 0 13px 22px;
- padding-left: 14px;
-}
-
-.profile-canvas-decoration button {
- margin: 0 0 0 10px !important;
-}
-
-.profile-launcher-button {
- min-width: 120px;
- height: 28px;
- margin: 8px 16px 8px 0;
-}
-
.cpu-profile-flame-chart-overview-container {
overflow: hidden;
position: absolute;
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/protocol_monitor/protocol_monitor_strings.grdp b/chromium/third_party/blink/renderer/devtools/front_end/protocol_monitor/protocol_monitor_strings.grdp
new file mode 100644
index 00000000000..b9ce807d9ab
--- /dev/null
+++ b/chromium/third_party/blink/renderer/devtools/front_end/protocol_monitor/protocol_monitor_strings.grdp
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<grit-part>
+ <message name="IDS_DEVTOOLS_02674a4ef33e11c879283629996c8ff8" desc="">
+ Direction
+ </message>
+ <message name="IDS_DEVTOOLS_15c2d85f1fae22a3c3a0594510a1f611" desc="">
+ Request
+ </message>
+ <message name="IDS_DEVTOOLS_2448f896f98bcda2db043a999a00e1d2" desc="">
+ <ph name="THIS_DATA_COLUMNID_">$1s</ph> ms
+ </message>
+ <message name="IDS_DEVTOOLS_5b6cf869265c13af8566f192b4ab3d2a" desc="">
+ Documentation
+ </message>
+ <message name="IDS_DEVTOOLS_6a0d9eaee314c567fd72fb97ee707a36" desc="">
+ Record
+ </message>
+ <message name="IDS_DEVTOOLS_a3d5de3eac8bb00ae86fd1a1005f1500" desc="">
+ Timestamp
+ </message>
+ <message name="IDS_DEVTOOLS_a854885880458e27324853c6f46e28f7" desc="">
+ No message selected
+ </message>
+ <message name="IDS_DEVTOOLS_c2474d3f42e95aac175f984da6d91cf5" desc="">
+ Protocol monitor
+ </message>
+</grit-part> \ No newline at end of file
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/quick_open/quick_open_strings.grdp b/chromium/third_party/blink/renderer/devtools/front_end/quick_open/quick_open_strings.grdp
new file mode 100644
index 00000000000..a1176471c3c
--- /dev/null
+++ b/chromium/third_party/blink/renderer/devtools/front_end/quick_open/quick_open_strings.grdp
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<grit-part>
+ <message name="IDS_DEVTOOLS_06f884351ae9dbaaca31602b74d0ed4e" desc="">
+ Type &apos;?&apos; to see available commands
+ </message>
+ <message name="IDS_DEVTOOLS_22b6fe30dec1ae9c09480cce01cd4065" desc="">
+ Run command
+ </message>
+ <message name="IDS_DEVTOOLS_74540c79e377bea903e1023a46df5574" desc="">
+ Open file
+ </message>
+ <message name="IDS_DEVTOOLS_8bb9829a676055080c3d4507e0b5f201" desc="">
+ No commands found
+ </message>
+ <message name="IDS_DEVTOOLS_af9ccba3ec4346e3acf785f9bea514d8" desc="">
+ Show <ph name="EXTENSION_TITLE__">$1s</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_e576c23d915755d83e2d1f47bd9f6c22" desc="">
+ No results found
+ </message>
+</grit-part> \ No newline at end of file
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/resources/AppManifestView.js b/chromium/third_party/blink/renderer/devtools/front_end/resources/AppManifestView.js
index baef908a2cd..b93e2686374 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/resources/AppManifestView.js
+++ b/chromium/third_party/blink/renderer/devtools/front_end/resources/AppManifestView.js
@@ -11,11 +11,8 @@ Resources.AppManifestView = class extends UI.VBox {
this.registerRequiredCSS('resources/appManifestView.css');
this._emptyView = new UI.EmptyWidget(Common.UIString('No manifest detected'));
- const p = this._emptyView.appendParagraph();
- const linkElement = UI.XLink.create(
- 'https://developers.google.com/web/fundamentals/engage-and-retain/web-app-manifest/?utm_source=devtools',
- Common.UIString('Read more about the web manifest'));
- p.appendChild(UI.formatLocalized('A web manifest allows you to control how your app behaves when launched and displayed to the user. %s', [linkElement]));
+ this._emptyView.appendLink(
+ 'https://developers.google.com/web/fundamentals/engage-and-retain/web-app-manifest/?utm_source=devtools');
this._emptyView.show(this.contentElement);
this._emptyView.hideWidget();
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/resources/ApplicationPanelSidebar.js b/chromium/third_party/blink/renderer/devtools/front_end/resources/ApplicationPanelSidebar.js
index de8b0eb4d34..636971545f7 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/resources/ApplicationPanelSidebar.js
+++ b/chromium/third_party/blink/renderer/devtools/front_end/resources/ApplicationPanelSidebar.js
@@ -55,37 +55,39 @@ Resources.ApplicationPanelSidebar = class extends UI.VBox {
this._applicationTreeElement.appendChild(this.serviceWorkersTreeElement);
const clearStorageTreeElement = new Resources.ClearStorageTreeElement(panel);
this._applicationTreeElement.appendChild(clearStorageTreeElement);
- if (Runtime.experiments.isEnabled('backgroundServices')) {
- this.backgroundFetchTreeElement =
- new Resources.BackgroundServiceTreeElement(panel, Protocol.BackgroundService.ServiceName.BackgroundFetch);
- this._applicationTreeElement.appendChild(this.backgroundFetchTreeElement);
- this.backgroundSyncTreeElement =
- new Resources.BackgroundServiceTreeElement(panel, Protocol.BackgroundService.ServiceName.BackgroundSync);
- this._applicationTreeElement.appendChild(this.backgroundSyncTreeElement);
- }
const storageTreeElement = this._addSidebarSection(Common.UIString('Storage'));
this.localStorageListTreeElement =
new Resources.StorageCategoryTreeElement(panel, Common.UIString('Local Storage'), 'LocalStorage');
+ this.localStorageListTreeElement.setLink(
+ 'https://developers.google.com/web/tools/chrome-devtools/storage/localstorage?utm_source=devtools');
const localStorageIcon = UI.Icon.create('mediumicon-table', 'resource-tree-item');
this.localStorageListTreeElement.setLeadingIcons([localStorageIcon]);
storageTreeElement.appendChild(this.localStorageListTreeElement);
this.sessionStorageListTreeElement =
new Resources.StorageCategoryTreeElement(panel, Common.UIString('Session Storage'), 'SessionStorage');
+ this.sessionStorageListTreeElement.setLink(
+ 'https://developers.google.com/web/tools/chrome-devtools/storage/sessionstorage?utm_source=devtools');
const sessionStorageIcon = UI.Icon.create('mediumicon-table', 'resource-tree-item');
this.sessionStorageListTreeElement.setLeadingIcons([sessionStorageIcon]);
storageTreeElement.appendChild(this.sessionStorageListTreeElement);
this.indexedDBListTreeElement = new Resources.IndexedDBTreeElement(panel);
+ this.indexedDBListTreeElement.setLink(
+ 'https://developers.google.com/web/tools/chrome-devtools/storage/indexeddb?utm_source=devtools');
storageTreeElement.appendChild(this.indexedDBListTreeElement);
this.databasesListTreeElement =
new Resources.StorageCategoryTreeElement(panel, Common.UIString('Web SQL'), 'Databases');
+ this.databasesListTreeElement.setLink(
+ 'https://developers.google.com/web/tools/chrome-devtools/storage/websql?utm_source=devtools');
const databaseIcon = UI.Icon.create('mediumicon-database', 'resource-tree-item');
this.databasesListTreeElement.setLeadingIcons([databaseIcon]);
storageTreeElement.appendChild(this.databasesListTreeElement);
this.cookieListTreeElement = new Resources.StorageCategoryTreeElement(panel, Common.UIString('Cookies'), 'Cookies');
+ this.cookieListTreeElement.setLink(
+ 'https://developers.google.com/web/tools/chrome-devtools/storage/cookies?utm_source=devtools');
const cookieIcon = UI.Icon.create('mediumicon-cookie', 'resource-tree-item');
this.cookieListTreeElement.setLeadingIcons([cookieIcon]);
storageTreeElement.appendChild(this.cookieListTreeElement);
@@ -95,11 +97,35 @@ Resources.ApplicationPanelSidebar = class extends UI.VBox {
cacheTreeElement.appendChild(this.cacheStorageListTreeElement);
this.applicationCacheListTreeElement =
new Resources.StorageCategoryTreeElement(panel, Common.UIString('Application Cache'), 'ApplicationCache');
+ this.applicationCacheListTreeElement.setLink(
+ 'https://developers.google.com/web/tools/chrome-devtools/storage/applicationcache?utm_source=devtools');
const applicationCacheIcon = UI.Icon.create('mediumicon-table', 'resource-tree-item');
this.applicationCacheListTreeElement.setLeadingIcons([applicationCacheIcon]);
cacheTreeElement.appendChild(this.applicationCacheListTreeElement);
+ if (Runtime.experiments.isEnabled('backgroundServices')) {
+ const backgroundServiceTreeElement = this._addSidebarSection(ls`Background Services`);
+
+ this.backgroundFetchTreeElement =
+ new Resources.BackgroundServiceTreeElement(panel, Protocol.BackgroundService.ServiceName.BackgroundFetch);
+ backgroundServiceTreeElement.appendChild(this.backgroundFetchTreeElement);
+ this.backgroundSyncTreeElement =
+ new Resources.BackgroundServiceTreeElement(panel, Protocol.BackgroundService.ServiceName.BackgroundSync);
+ backgroundServiceTreeElement.appendChild(this.backgroundSyncTreeElement);
+
+ if (Runtime.experiments.isEnabled('backgroundServicesNotifications')) {
+ this.notificationsTreeElement =
+ new Resources.BackgroundServiceTreeElement(panel, Protocol.BackgroundService.ServiceName.Notifications);
+ backgroundServiceTreeElement.appendChild(this.notificationsTreeElement);
+ }
+ if (Runtime.experiments.isEnabled('backgroundServicesPushMessaging')) {
+ this.pushMessagingTreeElement =
+ new Resources.BackgroundServiceTreeElement(panel, Protocol.BackgroundService.ServiceName.PushMessaging);
+ backgroundServiceTreeElement.appendChild(this.pushMessagingTreeElement);
+ }
+ }
+
this._resourcesSection = new Resources.ResourcesSection(panel, this._addSidebarSection(Common.UIString('Frames')));
/** @type {!Map.<!Resources.Database, !Object.<string, !Resources.DatabaseTableView>>} */
@@ -217,6 +243,10 @@ Resources.ApplicationPanelSidebar = class extends UI.VBox {
if (Runtime.experiments.isEnabled('backgroundServices')) {
this.backgroundFetchTreeElement._initialize(backgroundServiceModel);
this.backgroundSyncTreeElement._initialize(backgroundServiceModel);
+ if (Runtime.experiments.isEnabled('backgroundServicesNotifications'))
+ this.notificationsTreeElement._initialize(backgroundServiceModel);
+ if (Runtime.experiments.isEnabled('backgroundServicesPushMessaging'))
+ this.pushMessagingTreeElement._initialize(backgroundServiceModel);
}
}
@@ -647,20 +677,27 @@ Resources.StorageCategoryTreeElement = class extends Resources.BaseStorageTreeEl
this._expandedSetting =
Common.settings.createSetting('resources' + settingsKey + 'Expanded', settingsKey === 'Frames');
this._categoryName = categoryName;
+ this._categoryLink = null;
}
-
get itemURL() {
return 'category://' + this._categoryName;
}
/**
+ * @param {string} link
+ */
+ setLink(link) {
+ this._categoryLink = link;
+ }
+
+ /**
* @override
* @return {boolean}
*/
onselect(selectedByUser) {
super.onselect(selectedByUser);
- this._storagePanel.showCategoryView(this._categoryName);
+ this._storagePanel.showCategoryView(this._categoryName, this._categoryLink);
return false;
}
@@ -694,7 +731,7 @@ Resources.BackgroundServiceTreeElement = class extends Resources.BaseStorageTree
* @param {!Protocol.BackgroundService.ServiceName} serviceName
*/
constructor(storagePanel, serviceName) {
- super(storagePanel, Resources.BackgroundServiceTreeElement._getUIString(serviceName), false);
+ super(storagePanel, Resources.BackgroundServiceView.getUIString(serviceName), false);
/** @const {!Protocol.BackgroundService.ServiceName} */
this._serviceName = serviceName;
@@ -708,22 +745,26 @@ Resources.BackgroundServiceTreeElement = class extends Resources.BaseStorageTree
/** @private {?Resources.BackgroundServiceModel} */
this._model = null;
- const backgroundServiceIcon = UI.Icon.create('mediumicon-table', 'resource-tree-item');
+ const backgroundServiceIcon = UI.Icon.create(this._getIconType(), 'resource-tree-item');
this.setLeadingIcons([backgroundServiceIcon]);
}
/**
- * @param {string} serviceName The name of the background service.
- * @return {string} The UI String to display.
+ * @return {string}
*/
- static _getUIString(serviceName) {
- switch (serviceName) {
+ _getIconType() {
+ switch (this._serviceName) {
case Protocol.BackgroundService.ServiceName.BackgroundFetch:
- return Common.UIString('Background Fetch');
+ return 'mediumicon-fetch';
case Protocol.BackgroundService.ServiceName.BackgroundSync:
- return Common.UIString('Background Sync');
+ return 'mediumicon-sync';
+ case Protocol.BackgroundService.ServiceName.PushMessaging:
+ return 'mediumicon-cloud';
+ case Protocol.BackgroundService.ServiceName.Notifications:
+ return 'mediumicon-bell';
default:
- return '';
+ console.error(`Service ${this._serviceName} does not have a dedicated icon`);
+ return 'mediumicon-table';
}
}
@@ -758,6 +799,7 @@ Resources.BackgroundServiceTreeElement = class extends Resources.BaseStorageTree
if (!this._view)
this._view = new Resources.BackgroundServiceView(this._serviceName, this._model);
this.showView(this._view);
+ UI.context.setFlavor(Resources.BackgroundServiceView, this._view);
return false;
}
};
@@ -1645,6 +1687,7 @@ Resources.CookieTreeElement = class extends Resources.BaseStorageTreeElement {
super(storagePanel, cookieDomain ? cookieDomain : Common.UIString('Local Files'), false);
this._target = frame.resourceTreeModel().target();
this._cookieDomain = cookieDomain;
+ this.tooltip = ls`cookies used by frames from ` + cookieDomain;
const icon = UI.Icon.create('mediumicon-cookie', 'resource-tree-item');
this.setLeadingIcons([icon]);
}
@@ -1707,7 +1750,7 @@ Resources.ApplicationCacheManifestTreeElement = class extends Resources.BaseStor
*/
onselect(selectedByUser) {
super.onselect(selectedByUser);
- this._storagePanel.showCategoryView(this._manifestURL);
+ this._storagePanel.showCategoryView(this._manifestURL, null);
return false;
}
};
@@ -1779,10 +1822,28 @@ Resources.StorageCategoryView = class extends UI.VBox {
this.element.classList.add('storage-view');
this._emptyWidget = new UI.EmptyWidget('');
+ this._linkElement = null;
this._emptyWidget.show(this.element);
}
+ /**
+ * @param {string} text
+ */
setText(text) {
this._emptyWidget.text = text;
}
+
+ /**
+ * @param {?string} link
+ */
+ setLink(link) {
+ if (link && !this._linkElement)
+ this._linkElement = this._emptyWidget.appendLink(link);
+ if (!link && this._linkElement)
+ this._linkElement.classList.add('hidden');
+ if (link && this._linkElement) {
+ this._linkElement.setAttribute('href', link);
+ this._linkElement.classList.remove('hidden');
+ }
+ }
};
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/resources/BackgroundServiceView.js b/chromium/third_party/blink/renderer/devtools/front_end/resources/BackgroundServiceView.js
index 4021f43d285..45456bc595a 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/resources/BackgroundServiceView.js
+++ b/chromium/third_party/blink/renderer/devtools/front_end/resources/BackgroundServiceView.js
@@ -4,12 +4,32 @@
Resources.BackgroundServiceView = class extends UI.VBox {
/**
+ * @param {string} serviceName The name of the background service.
+ * @return {string} The UI String to display.
+ */
+ static getUIString(serviceName) {
+ switch (serviceName) {
+ case Protocol.BackgroundService.ServiceName.BackgroundFetch:
+ return ls`Background Fetch`;
+ case Protocol.BackgroundService.ServiceName.BackgroundSync:
+ return ls`Background Sync`;
+ case Protocol.BackgroundService.ServiceName.PushMessaging:
+ return ls`Push Messaging`;
+ case Protocol.BackgroundService.ServiceName.Notifications:
+ return ls`Notifications`;
+ default:
+ return '';
+ }
+ }
+
+ /**
* @param {!Protocol.BackgroundService.ServiceName} serviceName
* @param {!Resources.BackgroundServiceModel} model
*/
constructor(serviceName, model) {
super(true);
this.registerRequiredCSS('resources/backgroundServiceView.css');
+ this.registerRequiredCSS('ui/emptyWidget.css');
/** @const {!Protocol.BackgroundService.ServiceName} */
this._serviceName = serviceName;
@@ -30,6 +50,9 @@ Resources.BackgroundServiceView = class extends UI.VBox {
this._securityOriginManager.addEventListener(
SDK.SecurityOriginManager.Events.MainSecurityOriginChanged, () => this._onOriginChanged());
+
+ /** @const {!UI.Action} */
+ this._recordAction = /** @type {!UI.Action} */ (UI.actionRegistry.action('background-service.toggle-recording'));
/** @type {?UI.ToolbarToggle} */
this._recordButton = null;
@@ -57,6 +80,9 @@ Resources.BackgroundServiceView = class extends UI.VBox {
/** @const {!UI.VBox} */
this._previewPanel = new UI.VBox();
+ /** @type {?Resources.BackgroundServiceView.EventDataNode} */
+ this._selectedEventNode = null;
+
/** @type {?UI.Widget} */
this._preview = null;
@@ -70,10 +96,7 @@ Resources.BackgroundServiceView = class extends UI.VBox {
* Creates the toolbar UI element.
*/
async _setupToolbar() {
- this._recordButton =
- new UI.ToolbarToggle(ls`Toggle Record`, 'largeicon-start-recording', 'largeicon-stop-recording');
- this._recordButton.addEventListener(UI.ToolbarButton.Events.Click, () => this._toggleRecording());
- this._recordButton.setToggleWithRedColor(true);
+ this._recordButton = UI.Toolbar.createActionButton(this._recordAction);
this._toolbar.appendToolbarItem(this._recordButton);
const clearButton = new UI.ToolbarButton(ls`Clear`, 'largeicon-clear');
@@ -82,16 +105,16 @@ Resources.BackgroundServiceView = class extends UI.VBox {
this._toolbar.appendSeparator();
- this._originCheckbox =
- new UI.ToolbarCheckbox(ls`Show events from other domains`, undefined, () => this._refreshView());
- this._toolbar.appendToolbarItem(this._originCheckbox);
-
- this._toolbar.appendSeparator();
-
this._saveButton = new UI.ToolbarButton(ls`Save events`, 'largeicon-download');
this._saveButton.addEventListener(UI.ToolbarButton.Events.Click, () => this._saveToFile());
this._saveButton.setEnabled(false);
this._toolbar.appendToolbarItem(this._saveButton);
+
+ this._toolbar.appendSeparator();
+
+ this._originCheckbox =
+ new UI.ToolbarCheckbox(ls`Show events from other domains`, undefined, () => this._refreshView());
+ this._toolbar.appendToolbarItem(this._originCheckbox);
}
/**
@@ -108,9 +131,10 @@ Resources.BackgroundServiceView = class extends UI.VBox {
* Clears the grid and panel.
*/
_clearView() {
+ this._selectedEventNode = null;
this._dataGrid.rootNode().removeChildren();
- this._showPreview(null);
this._saveButton.setEnabled(false);
+ this._showPreview(null);
}
/**
@@ -135,7 +159,12 @@ Resources.BackgroundServiceView = class extends UI.VBox {
const state = /** @type {!Resources.BackgroundServiceModel.RecordingState} */ (event.data);
if (state.serviceName !== this._serviceName)
return;
+
+ if (state.isRecording === this._recordButton.toggled())
+ return;
+
this._recordButton.setToggled(state.isRecording);
+ this._showPreview(this._selectedEventNode);
}
/**
@@ -163,8 +192,10 @@ Resources.BackgroundServiceView = class extends UI.VBox {
const dataNode = new Resources.BackgroundServiceView.EventDataNode(data, serviceEvent.eventMetadata);
this._dataGrid.rootNode().appendChild(dataNode);
- // There's at least one event. So we can allow saving the events.
- this._saveButton.setEnabled(true);
+ if (this._dataGrid.rootNode().children.length === 1) {
+ this._saveButton.setEnabled(true);
+ this._showPreview(this._selectedEventNode);
+ }
}
/**
@@ -174,9 +205,9 @@ Resources.BackgroundServiceView = class extends UI.VBox {
const columns = /** @type {!Array<!DataGrid.DataGrid.ColumnDescriptor>} */ ([
{id: 'id', title: ls`#`, weight: 1},
{id: 'timestamp', title: ls`Timestamp`, weight: 8},
- {id: 'origin', title: ls`Origin`, weight: 10},
- {id: 'swSource', title: ls`SW Source`, weight: 4},
{id: 'eventName', title: ls`Event`, weight: 10},
+ {id: 'origin', title: ls`Origin`, weight: 10},
+ {id: 'swScope', title: ls`SW Scope`, weight: 2},
{id: 'instanceId', title: ls`Instance ID`, weight: 10},
]);
const dataGrid = new DataGrid.DataGrid(columns);
@@ -195,22 +226,18 @@ Resources.BackgroundServiceView = class extends UI.VBox {
* @return {!Resources.BackgroundServiceView.EventData}
*/
_createEventData(serviceEvent) {
- let swSource = '';
-
- // Try to get the script name of the Service Worker registration to be more user-friendly.
- const registrations = this._serviceWorkerManager.registrations().get(serviceEvent.serviceWorkerRegistrationId);
- if (registrations && registrations.versions.size) {
- // Any version will do since we care about the script URL.
- const version = registrations.versions.values().next().value;
- // Get the relative path.
- swSource = version.scriptURL.substr(version.securityOrigin.length);
- }
+ let swScope = '';
+
+ // Try to get the scope of the Service Worker registration to be more user-friendly.
+ const registration = this._serviceWorkerManager.registrations().get(serviceEvent.serviceWorkerRegistrationId);
+ if (registration)
+ swScope = registration.scopeURL.substr(registration.securityOrigin.length);
return {
- id: this._dataGrid.rootNode().children.length,
+ id: this._dataGrid.rootNode().children.length + 1,
timestamp: UI.formatTimestamp(serviceEvent.timestamp * 1000, /* full= */ true),
origin: serviceEvent.origin,
- swSource,
+ swScope,
eventName: serviceEvent.eventName,
instanceId: serviceEvent.instanceId,
};
@@ -238,13 +265,38 @@ Resources.BackgroundServiceView = class extends UI.VBox {
* @param {?Resources.BackgroundServiceView.EventDataNode} dataNode
*/
_showPreview(dataNode) {
+ if (this._selectedEventNode && this._selectedEventNode === dataNode)
+ return;
+
+ this._selectedEventNode = dataNode;
+
if (this._preview)
this._preview.detach();
- if (dataNode)
- this._preview = dataNode.createPreview();
- else
- this._preview = new UI.EmptyWidget(ls`Select a value to preview`);
+ if (this._selectedEventNode) {
+ this._preview = this._selectedEventNode.createPreview();
+ } else if (this._dataGrid.rootNode().children.length) {
+ // Inform users that grid entries are clickable.
+ this._preview = new UI.EmptyWidget(ls`Select an entry to view metadata`);
+ } else if (this._recordButton.toggled()) {
+ // Inform users that we are recording/waiting for events.
+ this._preview = new UI.EmptyWidget(
+ ls`Recording ${Resources.BackgroundServiceView.getUIString(this._serviceName)} activity...`);
+ } else {
+ this._preview = new UI.VBox();
+ this._preview.contentElement.classList.add('empty-view-scroller');
+ const centered = this._preview.contentElement.createChild('div', 'empty-view');
+
+ const landingRecordButton = UI.Toolbar.createActionButton(this._recordAction);
+
+ const recordKey = createElementWithClass('b', 'background-service-shortcut');
+ recordKey.textContent =
+ UI.shortcutRegistry.shortcutDescriptorsForAction('background-service.toggle-recording')[0].name;
+
+ centered.createChild('h2').appendChild(UI.formatLocalized(
+ 'Click the record button %s or hit %s to start recording.',
+ [UI.createInlineButton(landingRecordButton), recordKey]));
+ }
this._preview.show(this._previewPanel.contentElement);
}
@@ -271,7 +323,7 @@ Resources.BackgroundServiceView = class extends UI.VBox {
* id: number,
* timestamp: string,
* origin: string,
- * swSource: string,
+ * swScope: string,
* eventName: string,
* instanceId: string,
* }}
@@ -287,16 +339,51 @@ Resources.BackgroundServiceView.EventDataNode = class extends DataGrid.DataGridN
super(data);
/** @const {!Array<!Protocol.BackgroundService.EventMetadata>} */
- this._eventMetadata = eventMetadata;
+ this._eventMetadata = eventMetadata.sort((m1, m2) => m1.key.compareTo(m2.key));
}
/**
- * @return {!UI.SearchableView}
+ * @return {!UI.VBox}
*/
createPreview() {
- const metadata = {};
- for (const entry of this._eventMetadata)
- metadata[entry.key] = entry.value;
- return SourceFrame.JSONView.createViewSync(metadata);
+ const preview = new UI.VBox();
+ preview.element.classList.add('background-service-metadata');
+
+ for (const entry of this._eventMetadata) {
+ const div = createElementWithClass('div', 'background-service-metadata-entry');
+ div.createChild('div', 'background-service-metadata-name').textContent = entry.key + ': ';
+ div.createChild('div', 'background-service-metadata-value source-code').textContent = entry.value;
+ preview.element.appendChild(div);
+ }
+
+ if (!preview.element.children.length) {
+ const div = createElementWithClass('div', 'background-service-metadata-entry');
+ div.createChild('div', 'background-service-metadata-name').textContent = ls`No metadata for this event`;
+ preview.element.appendChild(div);
+ }
+
+ return preview;
+ }
+};
+
+/**
+ * @implements {UI.ActionDelegate}
+ * @unrestricted
+ */
+Resources.BackgroundServiceView.ActionDelegate = class {
+ /**
+ * @override
+ * @param {!UI.Context} context
+ * @param {string} actionId
+ * @return {boolean}
+ */
+ handleAction(context, actionId) {
+ const view = context.flavor(Resources.BackgroundServiceView);
+ switch (actionId) {
+ case 'background-service.toggle-recording':
+ view._toggleRecording();
+ return true;
+ }
+ return false;
}
};
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/resources/ClearStorageView.js b/chromium/third_party/blink/renderer/devtools/front_end/resources/ClearStorageView.js
index ceb8b9f56de..94c15bc7433 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/resources/ClearStorageView.js
+++ b/chromium/third_party/blink/renderer/devtools/front_end/resources/ClearStorageView.js
@@ -33,19 +33,18 @@ Resources.ClearStorageView = class extends UI.ThrottledWidget {
this._settings.set(type, Common.settings.createSetting('clear-storage-' + type, true));
const quota = this._reportView.appendSection(Common.UIString('Usage'));
- this._quotaRow = quota.appendRow();
+ this._quotaRow = quota.appendSelectableRow();
const learnMoreRow = quota.appendRow();
const learnMore = UI.XLink.create(
'https://developers.google.com/web/tools/chrome-devtools/progressive-web-apps#opaque-responses',
ls`Learn more`);
learnMoreRow.appendChild(learnMore);
this._quotaUsage = null;
- this._pieChart = new PerfUI.PieChart(110, Number.bytesToString, true);
- this._pieChartLegend = createElement('div');
+ this._pieChart = new PerfUI.PieChart(
+ {chartName: ls`Storage Usage`, size: 110, formatter: Number.bytesToString, showLegend: true});
const usageBreakdownRow = quota.appendRow();
usageBreakdownRow.classList.add('usage-breakdown-row');
usageBreakdownRow.appendChild(this._pieChart.element);
- usageBreakdownRow.appendChild(this._pieChartLegend);
const clearButtonSection = this._reportView.appendSection('', 'clear-storage-button').appendRow();
this._clearButton = UI.createTextButton(ls`Clear site data`, this._clear.bind(this));
@@ -53,16 +52,19 @@ Resources.ClearStorageView = class extends UI.ThrottledWidget {
const application = this._reportView.appendSection(Common.UIString('Application'));
this._appendItem(application, Common.UIString('Unregister service workers'), 'service_workers');
+ application.markFieldListAsGroup();
const storage = this._reportView.appendSection(Common.UIString('Storage'));
this._appendItem(storage, Common.UIString('Local and session storage'), 'local_storage');
this._appendItem(storage, Common.UIString('IndexedDB'), 'indexeddb');
this._appendItem(storage, Common.UIString('Web SQL'), 'websql');
this._appendItem(storage, Common.UIString('Cookies'), 'cookies');
+ storage.markFieldListAsGroup();
const caches = this._reportView.appendSection(Common.UIString('Cache'));
this._appendItem(caches, Common.UIString('Cache storage'), 'cache_storage');
this._appendItem(caches, Common.UIString('Application cache'), 'appcache');
+ caches.markFieldListAsGroup();
SDK.targetManager.observeTargets(this);
}
@@ -234,11 +236,7 @@ Resources.ClearStorageView = class extends UI.ThrottledWidget {
continue;
const title = this._getStorageTypeName(usageForType.storageType);
const color = this._pieColors.get(usageForType.storageType) || '#ccc';
- this._pieChart.addSlice(value, color);
- const rowElement = this._pieChartLegend.createChild('div', 'usage-breakdown-legend-row');
- rowElement.createChild('span', 'usage-breakdown-legend-value').textContent = Number.bytesToString(value);
- rowElement.createChild('span', 'usage-breakdown-legend-swatch').style.backgroundColor = color;
- rowElement.createChild('span', 'usage-breakdown-legend-title').textContent = title;
+ this._pieChart.addSlice(value, color, title);
}
}
@@ -251,7 +249,6 @@ Resources.ClearStorageView = class extends UI.ThrottledWidget {
*/
_resetPieChart(total) {
this._pieChart.setTotal(total);
- this._pieChartLegend.removeChildren();
}
/**
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/resources/ResourcesPanel.js b/chromium/third_party/blink/renderer/devtools/front_end/resources/ResourcesPanel.js
index 96c091e9587..9dd82a4b4f4 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/resources/ResourcesPanel.js
+++ b/chromium/third_party/blink/renderer/devtools/front_end/resources/ResourcesPanel.js
@@ -118,11 +118,13 @@ Resources.ResourcesPanel = class extends UI.PanelWithSidebar {
/**
* @param {string} categoryName
+ * @param {string|null} categoryLink
*/
- showCategoryView(categoryName) {
+ showCategoryView(categoryName, categoryLink) {
if (!this._categoryView)
this._categoryView = new Resources.StorageCategoryView();
this._categoryView.setText(categoryName);
+ this._categoryView.setLink(categoryLink);
this.showView(this._categoryView);
}
@@ -156,17 +158,6 @@ Resources.ResourcesPanel = class extends UI.PanelWithSidebar {
}
/**
- * @param {string} text
- */
- showEmptyWidget(text) {
- if (!this._emptyWidget)
- this._emptyWidget = new UI.EmptyWidget(text);
- else
- this._emptyWidget.text = text;
- this.showView(this._emptyWidget);
- }
-
- /**
* @param {!SDK.Target} target
* @param {string} cookieDomain
*/
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/resources/ResourcesSection.js b/chromium/third_party/blink/renderer/devtools/front_end/resources/ResourcesSection.js
index 3187665ae3f..d1b37fb4902 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/resources/ResourcesSection.js
+++ b/chromium/third_party/blink/renderer/devtools/front_end/resources/ResourcesSection.js
@@ -169,7 +169,7 @@ Resources.FrameTreeElement = class extends Resources.BaseStorageTreeElement {
*/
onselect(selectedByUser) {
super.onselect(selectedByUser);
- this._section._panel.showCategoryView(this.titleAsText());
+ this._section._panel.showCategoryView(this.titleAsText(), null);
this.listItemElement.classList.remove('hovered');
SDK.OverlayModel.hideDOMNodeHighlight();
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/resources/ServiceWorkersView.js b/chromium/third_party/blink/renderer/devtools/front_end/resources/ServiceWorkersView.js
index 1ade28a54e0..723764373b6 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/resources/ServiceWorkersView.js
+++ b/chromium/third_party/blink/renderer/devtools/front_end/resources/ServiceWorkersView.js
@@ -38,16 +38,15 @@ Resources.ServiceWorkersView = class extends UI.VBox {
this._otherSWFilter.addEventListener('keydown', event => {
if (event.target !== this._otherSWFilter)
return;
- if (isEnterKey(event) || event.keyCode === UI.KeyboardShortcut.Keys.Space.code)
+ if (isEnterKey(event) || event.key === ' ')
this._toggleFilter();
});
const filterLabel = this._otherSWFilter.createChild('label', 'service-worker-filter-label');
- filterLabel.textContent = Common.UIString('Service workers from other domains');
- filterLabel.setAttribute('for', 'expand-all');
+ filterLabel.textContent = Common.UIString('Service workers from other origins');
filterLabel.addEventListener('click', () => this._toggleFilter());
const toolbar = new UI.Toolbar('service-worker-filter-toolbar', this._otherSWFilter);
- this._filter = new UI.ToolbarInput('Filter', 1);
+ this._filter = new UI.ToolbarInput(ls`Filter service worker`, 1);
this._filter.addEventListener(UI.ToolbarInput.Event.TextChanged, () => this._filterChanged());
toolbar.appendToolbarItem(this._filter);
@@ -303,7 +302,7 @@ Resources.ServiceWorkersView = class extends UI.VBox {
let path = parsedURL.path;
if (path.endsWith('/'))
path = path.substring(0, path.length - 1);
- return parsedURL.host + path;
+ return parsedURL.domain() + path;
}
_updateListVisibility() {
@@ -375,6 +374,7 @@ Resources.ServiceWorkersView.Section = class {
editor.value = initialValue;
editor.placeholder = placeholder;
+ UI.ARIAUtils.setAccessibleName(editor, label);
form.addEventListener('submit', e => {
callback(editor.value || '');
@@ -437,11 +437,19 @@ Resources.ServiceWorkersView.Section = class {
this._sourceField.removeChildren();
const fileName = Common.ParsedURL.extractName(version.scriptURL);
const name = this._sourceField.createChild('div', 'report-field-value-filename');
- name.appendChild(Components.Linkifier.linkifyURL(version.scriptURL, {text: fileName}));
+ const link = Components.Linkifier.linkifyURL(version.scriptURL, {text: fileName});
+ link.tabIndex = 0;
+ name.appendChild(link);
if (this._registration.errors.length) {
const errorsLabel = UI.createIconLabel(String(this._registration.errors.length), 'smallicon-error');
errorsLabel.classList.add('link');
+ errorsLabel.tabIndex = 0;
+ UI.ARIAUtils.setAccessibleName(errorsLabel, ls`${this._registration.errors.length} registration errors`);
errorsLabel.addEventListener('click', () => Common.console.show());
+ errorsLabel.addEventListener('keydown', event => {
+ if (isEnterKey(event) || event.key === ' ')
+ Common.console.show();
+ });
name.appendChild(errorsLabel);
}
this._sourceField.createChild('div', 'report-field-value-subtitle').textContent =
@@ -480,11 +488,11 @@ Resources.ServiceWorkersView.Section = class {
Common.UIString('#%s activated and is %s', active.id, active.runningStatus));
if (active.isRunning() || active.isStarting()) {
- createLink(activeEntry, Common.UIString('stop'), this._stopButtonClicked.bind(this, active.id));
+ this._createLink(activeEntry, Common.UIString('stop'), this._stopButtonClicked.bind(this, active.id));
if (!this._targetForVersionId(active.id))
- createLink(activeEntry, Common.UIString('inspect'), this._inspectButtonClicked.bind(this, active.id));
+ this._createLink(activeEntry, Common.UIString('inspect'), this._inspectButtonClicked.bind(this, active.id));
} else if (active.isStartable()) {
- createLink(activeEntry, Common.UIString('start'), this._startButtonClicked.bind(this));
+ this._createLink(activeEntry, Common.UIString('start'), this._startButtonClicked.bind(this));
}
this._updateClientsField(active);
} else if (redundant) {
@@ -497,37 +505,43 @@ Resources.ServiceWorkersView.Section = class {
if (waiting) {
const waitingEntry = this._addVersion(
versionsStack, 'service-worker-waiting-circle', Common.UIString('#%s waiting to activate', waiting.id));
- createLink(waitingEntry, Common.UIString('skipWaiting'), this._skipButtonClicked.bind(this));
+ this._createLink(waitingEntry, Common.UIString('skipWaiting'), this._skipButtonClicked.bind(this));
waitingEntry.createChild('div', 'service-worker-subtitle').textContent =
Common.UIString('Received %s', new Date(waiting.scriptResponseTime * 1000).toLocaleString());
if (!this._targetForVersionId(waiting.id) && (waiting.isRunning() || waiting.isStarting()))
- createLink(waitingEntry, Common.UIString('inspect'), this._inspectButtonClicked.bind(this, waiting.id));
+ this._createLink(waitingEntry, Common.UIString('inspect'), this._inspectButtonClicked.bind(this, waiting.id));
}
if (installing) {
const installingEntry = this._addVersion(
- versionsStack, 'service-worker-installing-circle', Common.UIString('#%s installing', installing.id));
+ versionsStack, 'service-worker-installing-circle', Common.UIString('#%s trying to install', installing.id));
installingEntry.createChild('div', 'service-worker-subtitle').textContent =
Common.UIString('Received %s', new Date(installing.scriptResponseTime * 1000).toLocaleString());
- if (!this._targetForVersionId(installing.id) && (installing.isRunning() || installing.isStarting()))
- createLink(installingEntry, Common.UIString('inspect'), this._inspectButtonClicked.bind(this, installing.id));
- }
-
- /**
- * @param {!Element} parent
- * @param {string} title
- * @param {function()} listener
- * @return {!Element}
- */
- function createLink(parent, title, listener) {
- const span = parent.createChild('span', 'link');
- span.textContent = title;
- span.addEventListener('click', listener, false);
- return span;
+ if (!this._targetForVersionId(installing.id) && (installing.isRunning() || installing.isStarting())) {
+ this._createLink(
+ installingEntry, Common.UIString('inspect'), this._inspectButtonClicked.bind(this, installing.id));
+ }
}
return Promise.resolve();
}
/**
+ * @param {!Element} parent
+ * @param {string} title
+ * @param {function()} listener
+ * @param {string=} className
+ * @param {boolean=} useCapture
+ * @return {!Element}
+ */
+ _createLink(parent, title, listener, className, useCapture) {
+ const button = parent.createChild('button', className);
+ button.classList.add('link');
+ button.textContent = title;
+ button.tabIndex = 0;
+ button.addEventListener('click', listener, useCapture);
+ return button;
+ }
+
+ /**
* @param {!Common.Event} event
*/
_unregisterButtonClicked(event) {
@@ -581,9 +595,8 @@ Resources.ServiceWorkersView.Section = class {
element.removeChildren();
const clientString = element.createChild('span', 'service-worker-client-string');
clientString.createTextChild(targetInfo.url);
- const focusLabel = element.createChild('label', 'link service-worker-client-focus-link');
- focusLabel.createTextChild('focus');
- focusLabel.addEventListener('click', this._activateTarget.bind(this, targetInfo.targetId), true);
+ this._createLink(
+ element, ls`focus`, this._activateTarget.bind(this, targetInfo.targetId), 'service-worker-client-focus-link');
}
/**
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/resources/backgroundServiceView.css b/chromium/third_party/blink/renderer/devtools/front_end/resources/backgroundServiceView.css
index c276c7a68c0..0685076071e 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/resources/backgroundServiceView.css
+++ b/chromium/third_party/blink/renderer/devtools/front_end/resources/backgroundServiceView.css
@@ -7,3 +7,31 @@
flex: auto;
border: none;
}
+
+.background-service-shortcut {
+ color: hsla(0, 0%, 50%, 1);
+}
+
+.background-service-metadata {
+ padding-left: 5px;
+ padding-top: 10px;
+}
+
+.background-service-metadata-entry {
+ padding-left: 10px;
+ padding-bottom: 5px;
+}
+
+.background-service-metadata-name {
+ color: rgb(33%, 33%, 33%);
+ display: inline-block;
+ margin-right: 0.25em;
+ font-weight: bold;
+}
+
+.background-service-metadata-value {
+ display: inline;
+ margin-right: 1em;
+ white-space: pre-wrap;
+ word-break: break-all;
+} \ No newline at end of file
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/resources/clearStorageView.css b/chromium/third_party/blink/renderer/devtools/front_end/resources/clearStorageView.css
index 9cb3cf5061a..e1bb6a1c141 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/resources/clearStorageView.css
+++ b/chromium/third_party/blink/renderer/devtools/front_end/resources/clearStorageView.css
@@ -26,27 +26,3 @@
.usage-breakdown-row {
min-width: fit-content;
}
-
-.usage-breakdown-legend-row {
- margin: 5px auto;
-}
-
-.usage-breakdown-legend-title {
- display: inline-block;
-}
-
-.usage-breakdown-legend-value {
- display: inline-block;
- width: 70px;
- text-align: right;
-}
-
-.usage-breakdown-legend-swatch {
- display: inline-block;
- width: 11px;
- height: 11px;
- margin: 0 6px;
- position: relative;
- top: 1px;
- border: 1px solid rgba(0, 0, 0, 0.2);
-}
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/resources/indexedDBViews.css b/chromium/third_party/blink/renderer/devtools/front_end/resources/indexedDBViews.css
index d19972cc149..c1749e9a13e 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/resources/indexedDBViews.css
+++ b/chromium/third_party/blink/renderer/devtools/front_end/resources/indexedDBViews.css
@@ -28,11 +28,6 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-.indexed-db-database-view {
- -webkit-user-select: text;
- margin-top: 5px;
-}
-
.indexed-db-data-view .data-view-toolbar {
position: relative;
background-color: #eee;
@@ -68,10 +63,6 @@
line-height: inherit;
}
-.indexed-db-data-view .primitive-value {
- padding-top: 1px;
-}
-
.indexed-db-data-view .data-grid .data-container td .section .header .title {
white-space: nowrap;
text-overflow: ellipsis;
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/resources/module.json b/chromium/third_party/blink/renderer/devtools/front_end/resources/module.json
index 8837019372d..6b962caeee2 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/resources/module.json
+++ b/chromium/third_party/blink/renderer/devtools/front_end/resources/module.json
@@ -23,6 +23,38 @@
"actionId": "resources.clear",
"title": "Clear site data",
"className": "Resources.ClearStorageView.ActionDelegate"
+ },
+ {
+ "type": "action",
+ "actionId": "background-service.toggle-recording",
+ "iconClass": "largeicon-start-recording",
+ "toggledIconClass": "largeicon-stop-recording",
+ "toggleWithRedColor": true,
+ "contextTypes": [
+ "Resources.BackgroundServiceView"
+ ],
+ "className": "Resources.BackgroundServiceView.ActionDelegate",
+ "category": "Background Services",
+ "options": [
+ {
+ "value": true,
+ "title": "Start recording events"
+ },
+ {
+ "value": false,
+ "title": "Stop recording events"
+ }
+ ],
+ "bindings": [
+ {
+ "platform": "windows,linux",
+ "shortcut": "Ctrl+E"
+ },
+ {
+ "platform": "mac",
+ "shortcut": "Meta+E"
+ }
+ ]
}
],
"dependencies": [
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/resources/resourcesPanel.css b/chromium/third_party/blink/renderer/devtools/front_end/resources/resourcesPanel.css
index 6349e004401..ac97a8737b3 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/resources/resourcesPanel.css
+++ b/chromium/third_party/blink/renderer/devtools/front_end/resources/resourcesPanel.css
@@ -37,16 +37,6 @@
background-color: var(--toolbar-bg-color);
}
-li.selected .base-storage-tree-element-subtitle {
- color: white;
-}
-
-.base-storage-tree-element-subtitle {
- padding-left: 2px;
- color: rgb(80, 80, 80);
- text-shadow: none;
-}
-
.resources.panel .status {
float: right;
height: 16px;
@@ -139,31 +129,6 @@ li.selected .base-storage-tree-element-subtitle {
-webkit-user-select: text;
}
-.resource-sidebar-tree-item .icon {
- content: url(Images/resourcePlainIconSmall.png);
-}
-
-.resource-sidebar-tree-item.resources-type-image .icon {
- position: relative;
- background-image: url(Images/resourcePlainIcon.png);
- background-repeat: no-repeat;
- content: "";
-}
-
-.resources-type-image .image-resource-icon-preview {
- position: absolute;
- margin: auto;
- min-width: 1px;
- min-height: 1px;
- top: 2px;
- bottom: 1px;
- left: 3px;
- right: 3px;
- max-width: 8px;
- max-height: 11px;
- overflow: hidden;
-}
-
.resources-sidebar {
padding: 0;
}
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/resources/resources_strings.grdp b/chromium/third_party/blink/renderer/devtools/front_end/resources/resources_strings.grdp
new file mode 100644
index 00000000000..55c8211d450
--- /dev/null
+++ b/chromium/third_party/blink/renderer/devtools/front_end/resources/resources_strings.grdp
@@ -0,0 +1,398 @@
+<?xml version="1.0" encoding="utf-8"?>
+<grit-part>
+ <message name="IDS_DEVTOOLS_01abfc750a0c942167651c40d088531d" desc="">
+ #
+ </message>
+ <message name="IDS_DEVTOOLS_05b2812ab435addb8ae4853ead93f1b3" desc="">
+ Received <ph name="NEW_DATE_VERSION_SCRIPTRESPONSETIME_________TOLOCALESTRING__">$1s</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_06933067aafd48425d67bcb01bba5cb6" desc="">
+ Update
+ </message>
+ <message name="IDS_DEVTOOLS_09428a9282bbb3ffcf3caa7826f0bf83" desc="">
+ An unexpected error <ph name="SQLERROR_CODE">$1s</ph> occurred.
+ </message>
+ <message name="IDS_DEVTOOLS_0d6fa553290eb4bf9eabe203a43b01d9" desc="">
+ Application cache
+ </message>
+ <message name="IDS_DEVTOOLS_0f558243fbf45f1cd840fff01957f57b" desc="">
+ Clients
+ </message>
+ <message name="IDS_DEVTOOLS_1351a3eaa0f925dad980e83905bc1230" desc="">
+ Worker: <ph name="TARGETINFO_URL">$1s</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_136e9c46f48bf8798df663c4e786c3e3" desc="">
+ Update on reload
+ </message>
+ <message name="IDS_DEVTOOLS_15fa5e18dc110ac96ef35fd19abc78b3" desc="">
+ Time Cached
+ </message>
+ <message name="IDS_DEVTOOLS_1722d5b7f86af20cbd8d1981f23a15a3" desc="">
+ cookies used by frames from
+ </message>
+ <message name="IDS_DEVTOOLS_1818d506396d77b3d035f719885c4cd1" desc="">
+ focus
+ </message>
+ <message name="IDS_DEVTOOLS_1bea0f12b50db07ee7f2265b790417ff" desc="">
+ Installability
+ </message>
+ <message name="IDS_DEVTOOLS_1fece652e0dde2e00d1a7662f081dd71" desc="">
+ The &quot;<ph name="THIS_TABLENAME">$1s</ph>&quot;
+table is empty.
+ </message>
+ <message name="IDS_DEVTOOLS_22554c2f3f431fa4243965df392b9ea9" desc="">
+ AppCache
+ </message>
+ <message name="IDS_DEVTOOLS_29104d3ede0231043a4b92a90b9c2873" desc="">
+ Some entries may have been modified
+ </message>
+ <message name="IDS_DEVTOOLS_2b81bb9b3deebcbfa05edad7a845005a" desc="">
+ Frames
+ </message>
+ <message name="IDS_DEVTOOLS_2bf0a735c3ff964861a2b55319edd355" desc="">
+ Unregister service workers
+ </message>
+ <message name="IDS_DEVTOOLS_2e9d8504b07d0bdf4887f27c070cbbb6" desc="">
+ autoIncrement
+ </message>
+ <message name="IDS_DEVTOOLS_301addf2037879acf2a972b157d2f4a7" desc="">
+ Local Files
+ </message>
+ <message name="IDS_DEVTOOLS_3472423ee4037c94e20d64b3aea8aa49" desc="">
+ <ph name="SCOPEURL">$1s</ph> - deleted
+ </message>
+ <message name="IDS_DEVTOOLS_34b6cd75171affba6957e308dcbd92be" desc="">
+ Version
+ </message>
+ <message name="IDS_DEVTOOLS_368d9ac76af05f714092bc808a426bfc" desc="">
+ Background color
+ </message>
+ <message name="IDS_DEVTOOLS_37acadd70183e7ed00222ff38248a6ff" desc="">
+ <ph name="NUMBER_BYTESTOSTRING_RESPONSE_USAGE_">$1s</ph> used out of <ph name="NUMBER_BYTESTOSTRING_RESPONSE_QUOTA_">$2s</ph> storage quota. 
+ </message>
+ <message name="IDS_DEVTOOLS_3a771376134eb624f3e1fdd3d92d9f4c" desc="">
+ Select a cache entry above to preview
+ </message>
+ <message name="IDS_DEVTOOLS_3afd748bcc6315d69cff002ec6c377ed" desc="">
+ <ph name="THIS__REGISTRATION_ERRORS_LENGTH">$1s</ph> registration errors
+ </message>
+ <message name="IDS_DEVTOOLS_3eab5d12656f2f4462f6594019e77355" desc="">
+ Visible columns
+ </message>
+ <message name="IDS_DEVTOOLS_3edf8ca26a1ec14dd6e91dd277ae1de6" desc="">
+ Origin
+ </message>
+ <message name="IDS_DEVTOOLS_458efe6e41ed41835b8d84b28db3f394" desc="">
+ Service workers from other origins
+ </message>
+ <message name="IDS_DEVTOOLS_45e035baf33a8e403766a606457f8b10" desc="">
+ Theme color
+ </message>
+ <message name="IDS_DEVTOOLS_4f36f645368158bc46346b8902fc2566" desc="">
+ #<ph name="ACTIVE_ID">$1s</ph> activated and is <ph name="ACTIVE_RUNNINGSTATUS">$2s</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_50868c2251b0c3b64ca50052891aec4c" desc="">
+ Push data
+ </message>
+ <message name="IDS_DEVTOOLS_536cf547cb6ecfe32be6ed3ffdabf893" desc="">
+ Clear site data
+ </message>
+ <message name="IDS_DEVTOOLS_54f664c70c22054ea0d8d26fc3997ce7" desc="">
+ Online
+ </message>
+ <message name="IDS_DEVTOOLS_55bce575c41275ddaf5fbd1beb7d6018" desc="">
+ #<ph name="INSTALLING_ID">$1s</ph> trying to install
+ </message>
+ <message name="IDS_DEVTOOLS_579fdc74b6520ab8906ecddf3e62d951" desc="">
+ Application Cache
+ </message>
+ <message name="IDS_DEVTOOLS_5bb07b23ba5cd47d49a0a030556b21ba" desc="">
+ Background Fetch
+ </message>
+ <message name="IDS_DEVTOOLS_625bee64c286ac3018d57e87162f44e9" desc="">
+ Delete database
+ </message>
+ <message name="IDS_DEVTOOLS_626e8008b253bc4fbef9dca0a3f63903" desc="">
+ Instance ID
+ </message>
+ <message name="IDS_DEVTOOLS_65ebb2ea77ddbe405def1ad1d01e2e7b" desc="">
+ Bypass the service worker and load resources from the network
+ </message>
+ <message name="IDS_DEVTOOLS_6670d47e57b4fe982554519effc771c5" desc="">
+ Object stores
+ </message>
+ <message name="IDS_DEVTOOLS_673eb027e9c056f57140322807351dd5" desc="">
+ unique
+ </message>
+ <message name="IDS_DEVTOOLS_6827a85b76e967f6a129e08f9272e76d" desc="">
+ Local Storage
+ </message>
+ <message name="IDS_DEVTOOLS_6c202452e44c42e323204da2a3a3c24a" desc="">
+ File System
+ </message>
+ <message name="IDS_DEVTOOLS_6e72748dc2f2224dfabb374ca0cc988f" desc="">
+ #<ph name="REDUNDANT_ID">$1s</ph> is redundant
+ </message>
+ <message name="IDS_DEVTOOLS_76c18f2b1e4155961e10434e3d83317f" desc="">
+ Key generator value: <ph name="STRING_METADATA_KEYGENERATORVALUE_">$1s</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_76c3e002d3c052bd6a909366a8dc3845" desc="">
+ Manifest
+ </message>
+ <message name="IDS_DEVTOOLS_795a813f20a4d4b04f85ddb86287fce4" desc="">
+ Storage quota is limited in Incognito mode
+ </message>
+ <message name="IDS_DEVTOOLS_798a0aef3a97a3eab63d88a0b6c07341" desc="">
+ SW Scope
+ </message>
+ <message name="IDS_DEVTOOLS_7a06b1cc41f027f75bc7be8ee937c344" desc="">
+ Database no longer has expected version.
+ </message>
+ <message name="IDS_DEVTOOLS_7adc295d89feec026fbcee16448c31d8" desc="">
+ <ph name="UNREACHABLEMAINORIGIN">$1s</ph> (failed to load)
+ </message>
+ <message name="IDS_DEVTOOLS_7d52bfc51222e4122623057310cba1ce" desc="">
+ Show previous page
+ </message>
+ <message name="IDS_DEVTOOLS_7e91f7be5e9ff7a50a44d4a7f21afb90" desc="">
+ Start URL
+ </message>
+ <message name="IDS_DEVTOOLS_7ed01b26177166f3627e29da31bc7e28" desc="">
+ No Application Cache information available.
+ </message>
+ <message name="IDS_DEVTOOLS_83b33e9633245178cb76ecb91dd424d8" desc="">
+ Select a value to preview
+ </message>
+ <message name="IDS_DEVTOOLS_86befdf33863a849060cf9f6d2425cdb" desc="">
+ Security origin
+ </message>
+ <message name="IDS_DEVTOOLS_87e059dc2492bd5041581f05daef12f7" desc="">
+ Filter by Path
+ </message>
+ <message name="IDS_DEVTOOLS_886b9bffdebad3a988a8da87b1affa2d" desc="">
+ Filter service worker
+ </message>
+ <message name="IDS_DEVTOOLS_897356954c2cd3d41b221e3f24f99bba" desc="">
+ Key
+ </message>
+ <message name="IDS_DEVTOOLS_8c4aa541ee911e8d80451ef8cc304806" desc="">
+ Storage
+ </message>
+ <message name="IDS_DEVTOOLS_8f67973007158337346584551b093be8" desc="">
+ Icons
+ </message>
+ <message name="IDS_DEVTOOLS_90e4c7584668933aebe8cf1cbccfe82d" desc="">
+ Please confirm delete of &quot;<ph name="THIS__DATABASE_DATABASEID_NAME">$1s</ph>&quot; database.
+ </message>
+ <message name="IDS_DEVTOOLS_9122ec25094d00855f48a500241c6008" desc="">
+ Service Workers
+ </message>
+ <message name="IDS_DEVTOOLS_9350cbb84e8ab827898a783d8f724951" desc="">
+ inspect
+ </message>
+ <message name="IDS_DEVTOOLS_94aa6cfa461998abe42d53963f1344c3" desc="">
+ An error occurred trying to
+read the &quot;<ph name="THIS_TABLENAME">$1s</ph>&quot; table.
+ </message>
+ <message name="IDS_DEVTOOLS_98fc9226c3fe878e39cd048fbd1c3692" desc="">
+ Short name
+ </message>
+ <message name="IDS_DEVTOOLS_9999106349673567ecaf1c32c07301a5" desc="">
+ #<ph name="WAITING_ID">$1s</ph> waiting to activate
+ </message>
+ <message name="IDS_DEVTOOLS_9b2a7456cec10d8b5ab8ce656598320b" desc="">
+ Key path:
+ </message>
+ <message name="IDS_DEVTOOLS_9b790a1c94937c437f9801d3c970efa7" desc="">
+ (empty)
+ </message>
+ <message name="IDS_DEVTOOLS_9c6a9d9f033001a9b3104984d319563b" desc="">
+ Push
+ </message>
+ <message name="IDS_DEVTOOLS_9d4a8f2dfe3c62f3ce3011035d28fb66" desc="">
+ Unregister
+ </message>
+ <message name="IDS_DEVTOOLS_9dce9dd0f39a17c2e029174f5bc86ef9" desc="">
+ Background Sync
+ </message>
+ <message name="IDS_DEVTOOLS_9ff9f5649294f7200b671d6389d17d9a" desc="">
+ multiEntry
+ </message>
+ <message name="IDS_DEVTOOLS_a049ac2b4afe0fb6e78656082858067e" desc="">
+ Storage Usage
+ </message>
+ <message name="IDS_DEVTOOLS_a274f4d4670213a9045ce258c6c56b80" desc="">
+ Notifications
+ </message>
+ <message name="IDS_DEVTOOLS_a4ecfc70574394990cf17bd83df499f7" desc="">
+ Event
+ </message>
+ <message name="IDS_DEVTOOLS_a7d5ee58baead2f3bc229d3d9c047875" desc="">
+ Unregister service worker
+ </message>
+ <message name="IDS_DEVTOOLS_a89edb1e05005c844b684d1eb0de111a" desc="">
+ Cache Storage
+ </message>
+ <message name="IDS_DEVTOOLS_ab0cf104f39708eabd07b8cb67e149ba" desc="">
+ Cache
+ </message>
+ <message name="IDS_DEVTOOLS_ab6ee23f23d1d5f342588e64297efc1c" desc="">
+ Session Storage
+ </message>
+ <message name="IDS_DEVTOOLS_acb91a6bfd0644c5b90280f9ebf38774" desc="">
+ Response-Type
+ </message>
+ <message name="IDS_DEVTOOLS_ad2669a90d3964bc67a1a34152122845" desc="">
+ Matching entries: <ph name="THIS__RETURNCOUNT">$1s</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_ae262bf758227f7e319ba799a861681a" desc="">
+ Local and session storage
+ </message>
+ <message name="IDS_DEVTOOLS_b275ec0eb3bbc2f5ab8988fe15b47817" desc="">
+ Errors and warnings
+ </message>
+ <message name="IDS_DEVTOOLS_b5dc9b0e6beecb1e80f6f1b5b3050f12" desc="">
+ Application panel
+ </message>
+ <message name="IDS_DEVTOOLS_b66b856833f34a841b51c7207dbc601f" desc="">
+ IndexedDB
+ </message>
+ <message name="IDS_DEVTOOLS_b704442a84076f1139cd70604553e8dc" desc="">
+ Clear object store
+ </message>
+ <message name="IDS_DEVTOOLS_b9987a246a537f4fe86f1f2e3d10dbdb" desc="">
+ Display
+ </message>
+ <message name="IDS_DEVTOOLS_ba8d2e1eca2bf52ab3cd0202d4d04c07" desc="">
+ Test push message from DevTools.
+ </message>
+ <message name="IDS_DEVTOOLS_bb8839cf9d324a22591ff426c28c5345" desc="">
+ Show next page
+ </message>
+ <message name="IDS_DEVTOOLS_be8545ae7ab0276e15898aae7acfbd7a" desc="">
+ Resource
+ </message>
+ <message name="IDS_DEVTOOLS_bebc9b50966d8d2bd1913a3c25b707d4" desc="">
+ Data may be stale
+ </message>
+ <message name="IDS_DEVTOOLS_bec9bd97f1cda22686854c090b5133fc" desc="">
+ Save events
+ </message>
+ <message name="IDS_DEVTOOLS_c13af79d63bfcb3f07bc3810418c99f8" desc="">
+ Delete Selected
+ </message>
+ <message name="IDS_DEVTOOLS_c1ea3facd2946b59df718d8dd2737cfa" desc="">
+ Background Services
+ </message>
+ <message name="IDS_DEVTOOLS_c64518704ce0c0d5501a45763f464276" desc="">
+ Usage
+ </message>
+ <message name="IDS_DEVTOOLS_c6661c86882ff82da47747b673907fa2" desc="">
+ No manifest detected
+ </message>
+ <message name="IDS_DEVTOOLS_c76eb02deaa41ffd58d22d08c213fea5" desc="">
+ Select an entry to view metadata
+ </message>
+ <message name="IDS_DEVTOOLS_c7bc3fddddb62d5b656adc30cea77a55" desc="">
+ Presentation
+ </message>
+ <message name="IDS_DEVTOOLS_c9a5ab3cec5c1de816c0f8ea8d7edfed" desc="">
+ Stop recording events
+ </message>
+ <message name="IDS_DEVTOOLS_c9c5c65fb4af9cf90eb99b3b84424189" desc="">
+ Identity
+ </message>
+ <message name="IDS_DEVTOOLS_cc0041e1d664fd87ad1cfaae4265893f" desc="">
+ Bypass for network
+ </message>
+ <message name="IDS_DEVTOOLS_cc8763e24276418641ca188290e3334c" desc="">
+ On page reload, force the service worker to update, and activate it
+ </message>
+ <message name="IDS_DEVTOOLS_ccdc0553283bddb674e37e272a9832f0" desc="">
+ Clearing...
+ </message>
+ <message name="IDS_DEVTOOLS_cd461eb091b5b58a6fe5a1b5edba4c5f" desc="">
+ Refresh Caches
+ </message>
+ <message name="IDS_DEVTOOLS_ce0540adc848ff5957d4d857984592d1" desc="">
+ Cache storage
+ </message>
+ <message name="IDS_DEVTOOLS_ce9d3c5ae4d74bd1e8d01732e264e36b" desc="">
+ No metadata for this event
+ </message>
+ <message name="IDS_DEVTOOLS_cfde4f71aaac6d02831a661f4f9990f1" desc="">
+ App Manifest
+ </message>
+ <message name="IDS_DEVTOOLS_d3b206d196cd6be3a2764c1fb90b200f" desc="">
+ Delete selected
+ </message>
+ <message name="IDS_DEVTOOLS_d4f61ad886e0b169b0394d97bb1a649a" desc="">
+ Recording <ph name="RESOURCES_BACKGROUNDSERVICEVIEW_GETUISTRING_THIS__SERVICENAME_">$1s</ph> activity...
+ </message>
+ <message name="IDS_DEVTOOLS_d6f875d9f87efbee1a96b8c4f5784d47" desc="">
+ Primary key
+ </message>
+ <message name="IDS_DEVTOOLS_d892ca11530be1235ec05eb368ecaf37" desc="">
+ Start from key
+ </message>
+ <message name="IDS_DEVTOOLS_d8e87c0927539672f54462c837be0b7f" desc="">
+ Sync
+ </message>
+ <message name="IDS_DEVTOOLS_da131b6bd53f501c1323af4b198740d2" desc="">
+ Push Messaging
+ </message>
+ <message name="IDS_DEVTOOLS_dc105ac52c237f9f09c74b0767f64f74" desc="">
+ Content-Type
+ </message>
+ <message name="IDS_DEVTOOLS_dc5f1eac93c7e0c1f63f360b24fd8489" desc="">
+ Refresh database
+ </message>
+ <message name="IDS_DEVTOOLS_dc87ca61695d643744b53bca9bf3f1d5" desc="">
+ Total entries: <ph name="STRING_METADATA_ENTRIESCOUNT_">$1s</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_ddcf50c29294d4414f3f7c1bbc892cb5" desc="">
+ Resources
+ </message>
+ <message name="IDS_DEVTOOLS_e00a7ac13697ba51e098449fd644935b" desc="">
+ Show events from other domains
+ </message>
+ <message name="IDS_DEVTOOLS_e307db07b3975fef922a80d07455ee5e" desc="">
+ Database
+ </message>
+ <message name="IDS_DEVTOOLS_e44ec1cd1aa0128f893c1c815ea1abe0" desc="">
+ Click the record button <ph name="UI_CREATEINLINEBUTTON_LANDINGRECORDBUTTON_">$1s</ph> or hit <ph name="RECORDKEY">$2s</ph> to start recording.
+ </message>
+ <message name="IDS_DEVTOOLS_e498749f3c42246d50b15c81c101d988" desc="">
+ Application
+ </message>
+ <message name="IDS_DEVTOOLS_e60593abb5603af48307343eb862d86a" desc="">
+ DOM Storage
+ </message>
+ <message name="IDS_DEVTOOLS_e918a12b0b4a962aff8b7119643af250" desc="">
+ skipWaiting
+ </message>
+ <message name="IDS_DEVTOOLS_ea2b2676c28c0db26d39331a336c6b92" desc="">
+ start
+ </message>
+ <message name="IDS_DEVTOOLS_ec1e074d56484165315c26a9baebaebd" desc="">
+ Web SQL
+ </message>
+ <message name="IDS_DEVTOOLS_ec3c33fb128aab90f46c922f8f7098f1" desc="">
+ Start recording events
+ </message>
+ <message name="IDS_DEVTOOLS_ed1f65c89bd76342be87bec8edd63904" desc="">
+ Refresh IndexedDB
+ </message>
+ <message name="IDS_DEVTOOLS_eeb6ddeed2e08678ebc14eb39c8340bf" desc="">
+ IDB
+ </message>
+ <message name="IDS_DEVTOOLS_ef34ee8b3523f523efcf74d28fab2b47" desc="">
+ Sync tag
+ </message>
+ <message name="IDS_DEVTOOLS_ef399b2d446bb37b7c32ad2cc1b6045b" desc="">
+ stop
+ </message>
+ <message name="IDS_DEVTOOLS_f31bbdd1b3e85bccd652680e16935819" desc="">
+ Source
+ </message>
+</grit-part> \ No newline at end of file
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/resources/serviceWorkerCacheViews.css b/chromium/third_party/blink/renderer/devtools/front_end/resources/serviceWorkerCacheViews.css
index 1b3ad5a5211..45325a159ac 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/resources/serviceWorkerCacheViews.css
+++ b/chromium/third_party/blink/renderer/devtools/front_end/resources/serviceWorkerCacheViews.css
@@ -11,11 +11,6 @@
padding-right: 10px;
}
-.service-worker-cache-data-view .data-view-toolbar .key-input {
- margin: auto 0;
- width: 200px;
-}
-
.service-worker-cache-data-view .data-grid {
flex: auto;
}
@@ -46,10 +41,6 @@
line-height: inherit;
}
-.service-worker-cache-data-view .primitive-value {
- padding-top: 1px;
-}
-
.service-worker-cache-data-view .data-grid .data-container td .section .header .title {
white-space: nowrap;
text-overflow: ellipsis;
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/resources/serviceWorkersView.css b/chromium/third_party/blink/renderer/devtools/front_end/resources/serviceWorkersView.css
index e10e38f2b8a..544bd0279c0 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/resources/serviceWorkersView.css
+++ b/chromium/third_party/blink/renderer/devtools/front_end/resources/serviceWorkersView.css
@@ -4,38 +4,6 @@
* found in the LICENSE file.
*/
-.service-worker-error-stack {
- max-height: 200px;
- overflow: auto;
- display: flex;
- flex-direction: column;
- border: 1px solid #ccc;
- background-color: #fff0f0;
- color: red;
- line-height: 18px;
- margin: 10px 2px 0 -14px;
- white-space: initial;
-}
-
-.service-worker-error-stack > div {
- flex: none;
- padding: 3px 4px;
-}
-
-.service-worker-error-stack > div:not(:last-child) {
- border-bottom: 1px solid #ffd7d7;
-}
-
-.service-worker-error-stack label {
- flex: auto;
-}
-
-.service-worker-error-stack .devtools-link {
- float: right;
- color: rgb(33%, 33%, 33%);
- cursor: pointer;
-}
-
.service-worker-version-stack {
position: relative;
}
@@ -90,7 +58,7 @@
}
.link {
- margin-left: 10px;
+ margin-left: 7px;
}
.service-worker-editor-with-button {
@@ -120,7 +88,8 @@
.service-worker-client-focus-link {
flex: none;
- margin-right: 5px;
+ margin-right: 2px;
+ align-self: center;
}
.service-worker-notification-editor.source-code {
@@ -166,15 +135,21 @@
margin-left: 4px;
}
+.service-worker-filter[data-keyboard-focus="true"]:focus {
+ background-color: var(--toolbar-bg-color);
+}
+
.service-worker-filter-label::before {
-webkit-user-select: none;
-webkit-mask-image: url(Images/treeoutlineTriangles.png);
-webkit-mask-size: 32px 24px;
- content: "aa";
+ content: '';
color: transparent;
background-color: rgb(110, 110, 110);
text-shadow: none;
height: 12px;
+ width: 10px;
+ display: inline-block;
}
@media (-webkit-min-device-pixel-ratio: 1.1) {
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/screencast/screencast_strings.grdp b/chromium/third_party/blink/renderer/devtools/front_end/screencast/screencast_strings.grdp
new file mode 100644
index 00000000000..6b5de3ae828
--- /dev/null
+++ b/chromium/third_party/blink/renderer/devtools/front_end/screencast/screencast_strings.grdp
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<grit-part>
+ <message name="IDS_DEVTOOLS_30b6c2858b9a03c8518c8804bb96067c" desc="">
+ Profiling in progress
+ </message>
+ <message name="IDS_DEVTOOLS_e2ed1dadec9e90b7108be8256808a5c0" desc="">
+ Toggle screencast
+ </message>
+ <message name="IDS_DEVTOOLS_f775403b2922abfa05ae76f922fcacf3" desc="">
+ The tab is inactive
+ </message>
+</grit-part> \ No newline at end of file
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/sdk/CSSMetadata.js b/chromium/third_party/blink/renderer/devtools/front_end/sdk/CSSMetadata.js
index 9a3b89a1525..42a2e2495d8 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/sdk/CSSMetadata.js
+++ b/chromium/third_party/blink/renderer/devtools/front_end/sdk/CSSMetadata.js
@@ -73,8 +73,36 @@ SDK.CSSMetadata = class {
}
}
}
- this._values.sort();
+ this._values.sort(SDK.CSSMetadata._sortPrefixesToEnd);
this._valuesSet = new Set(this._values);
+
+ /** @type {!Array<string>} */
+ this._nameValuePresets = [];
+ /** @type {!Array<string>} */
+ this._nameValuePresetsIncludingSVG = [];
+ for (const name of this._valuesSet) {
+ const values = this._specificPropertyValues(name)
+ .filter(value => CSS.supports(name, value))
+ .sort(SDK.CSSMetadata._sortPrefixesToEnd);
+ const presets = values.map(value => `${name}: ${value}`);
+ if (!this.isSVGProperty(name))
+ this._nameValuePresets.pushAll(presets);
+ this._nameValuePresetsIncludingSVG.pushAll(presets);
+ }
+ }
+
+ /**
+ * @param {string} a
+ * @param {string} b
+ */
+ static _sortPrefixesToEnd(a, b) {
+ const aIsPrefixed = a.startsWith('-webkit-');
+ const bIsPrefixed = b.startsWith('-webkit-');
+ if (aIsPrefixed && !bIsPrefixed)
+ return 1;
+ if (!aIsPrefixed && bIsPrefixed)
+ return -1;
+ return a < b ? -1 : (a > b ? 1 : 0);
}
/**
@@ -85,6 +113,14 @@ SDK.CSSMetadata = class {
}
/**
+ * @param {boolean=} includeSVG
+ * @return {!Array<string>}
+ */
+ nameValuePresets(includeSVG) {
+ return includeSVG ? this._nameValuePresetsIncludingSVG : this._nameValuePresets;
+ }
+
+ /**
* @param {string} name
* @return {boolean}
*/
@@ -188,24 +224,31 @@ SDK.CSSMetadata = class {
* @param {string} propertyName
* @return {!Array<string>}
*/
- propertyValues(propertyName) {
- const acceptedKeywords = ['inherit', 'initial', 'unset'];
- propertyName = propertyName.toLowerCase();
+ _specificPropertyValues(propertyName) {
const unprefixedName = propertyName.replace(/^-webkit-/, '');
const entry = SDK.CSSMetadata._propertyDataMap[propertyName] || SDK.CSSMetadata._propertyDataMap[unprefixedName];
- if (entry && entry.values)
- acceptedKeywords.pushAll(entry.values);
- const commonKeywords = ['auto', 'none'];
- for (const commonKeyword of commonKeywords) {
+ const keywords = entry && entry.values ? entry.values.slice() : [];
+ for (const commonKeyword of ['auto', 'none']) {
if (CSS.supports(propertyName, commonKeyword))
- acceptedKeywords.push(commonKeyword);
+ keywords.push(commonKeyword);
}
+ return keywords;
+ }
+
+ /**
+ * @param {string} propertyName
+ * @return {!Array<string>}
+ */
+ propertyValues(propertyName) {
+ const acceptedKeywords = ['inherit', 'initial', 'unset'];
+ propertyName = propertyName.toLowerCase();
+ acceptedKeywords.pushAll(this._specificPropertyValues(propertyName));
if (this.isColorAwareProperty(propertyName)) {
acceptedKeywords.push('currentColor');
for (const color in Common.Color.Nicknames)
acceptedKeywords.push(color);
}
- return acceptedKeywords.sort();
+ return acceptedKeywords.sort(SDK.CSSMetadata._sortPrefixesToEnd);
}
/**
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/sdk/ChildTargetManager.js b/chromium/third_party/blink/renderer/devtools/front_end/sdk/ChildTargetManager.js
index 2463c543987..21743afdba8 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/sdk/ChildTargetManager.js
+++ b/chromium/third_party/blink/renderer/devtools/front_end/sdk/ChildTargetManager.js
@@ -121,6 +121,9 @@ SDK.ChildTargetManager = class extends SDK.SDKModel {
let type = SDK.Target.Type.Browser;
if (targetInfo.type === 'iframe')
type = SDK.Target.Type.Frame;
+ // TODO(lfg): ensure proper capabilities for child pages (e.g. portals).
+ else if (targetInfo.type === 'page')
+ type = SDK.Target.Type.Frame;
else if (targetInfo.type === 'worker')
type = SDK.Target.Type.Worker;
else if (targetInfo.type === 'service_worker')
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/sdk/ConsoleModel.js b/chromium/third_party/blink/renderer/devtools/front_end/sdk/ConsoleModel.js
index a001d3b2507..e77e21b3fd3 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/sdk/ConsoleModel.js
+++ b/chromium/third_party/blink/renderer/devtools/front_end/sdk/ConsoleModel.js
@@ -132,7 +132,7 @@ SDK.ConsoleModel = class extends Common.Object {
returnByValue: false,
generatePreview: true
},
- /* userGesture */ true, awaitPromise);
+ Common.settings.moduleSetting('consoleUserActivationEval').get(), awaitPromise);
Host.userMetrics.actionTaken(Host.UserMetrics.Action.ConsoleEvaluated);
if (result.error)
return;
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/sdk/CookieModel.js b/chromium/third_party/blink/renderer/devtools/front_end/sdk/CookieModel.js
index cf3ab19d590..44e68236f27 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/sdk/CookieModel.js
+++ b/chromium/third_party/blink/renderer/devtools/front_end/sdk/CookieModel.js
@@ -102,6 +102,7 @@ SDK.CookieModel = class extends SDK.SDKModel {
}
/**
+ * Returns cookies needed by current page's frames whose security origins are |domain|.
* @param {?string} domain
* @return {!Promise<!Array<!SDK.Cookie>>}
*/
@@ -111,8 +112,8 @@ SDK.CookieModel = class extends SDK.SDKModel {
* @param {!SDK.Resource} resource
*/
function populateResourceURLs(resource) {
- const url = resource.documentURL.asParsedURL();
- if (url && (!domain || url.securityOrigin() === domain))
+ const documentURL = resource.documentURL.asParsedURL();
+ if (documentURL && (!domain || documentURL.securityOrigin() === domain))
resourceURLs.push(resource.url);
}
const resourceTreeModel = this.target().model(SDK.ResourceTreeModel);
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/sdk/DOMModel.js b/chromium/third_party/blink/renderer/devtools/front_end/sdk/DOMModel.js
index 24e43865fd6..9d91e7c3995 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/sdk/DOMModel.js
+++ b/chromium/third_party/blink/renderer/devtools/front_end/sdk/DOMModel.js
@@ -115,7 +115,7 @@ SDK.DOMNode = class {
this._contentDocument = new SDK.DOMDocument(this._domModel, payload.contentDocument);
this._contentDocument.parentNode = this;
this._children = [];
- } else if (payload.nodeName === 'IFRAME' && payload.frameId) {
+ } else if ((payload.nodeName === 'IFRAME' || payload.nodeName === 'PORTAL') && payload.frameId) {
const childTarget = SDK.targetManager.targetById(payload.frameId);
const childModel = childTarget ? childTarget.model(SDK.DOMModel) : null;
if (childModel)
@@ -231,6 +231,13 @@ SDK.DOMNode = class {
}
/**
+ * @return {boolean}
+ */
+ isPortal() {
+ return this._nodeName === 'PORTAL';
+ }
+
+ /**
* @return {?SDK.DOMNode}
*/
importedDocument() {
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/sdk/HARLog.js b/chromium/third_party/blink/renderer/devtools/front_end/sdk/HARLog.js
index 15a4c782cc6..21fa0e73b38 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/sdk/HARLog.js
+++ b/chromium/third_party/blink/renderer/devtools/front_end/sdk/HARLog.js
@@ -174,14 +174,24 @@ SDK.HARLog.Entry = class {
};
// Chrome specific.
+
if (harEntry._request.cached())
entry._fromCache = harEntry._request.cachedInMemory() ? 'memory' : 'disk';
if (harEntry._request.connectionId !== '0')
entry.connection = harEntry._request.connectionId;
+
const page = SDK.NetworkLog.PageLoad.forRequest(harEntry._request);
if (page)
entry.pageref = 'page_' + page.id;
+
+ if (harEntry._request.resourceType() === Common.resourceTypes.WebSocket) {
+ const messages = [];
+ for (const message of harEntry._request.frames())
+ messages.push({type: message.type, time: message.time, opcode: message.opCode, data: message.text});
+ entry._webSocketMessages = messages;
+ }
+
return entry;
}
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/sdk/IsolateManager.js b/chromium/third_party/blink/renderer/devtools/front_end/sdk/IsolateManager.js
index 7680c3e9016..d24d9b3a2db 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/sdk/IsolateManager.js
+++ b/chromium/third_party/blink/renderer/devtools/front_end/sdk/IsolateManager.js
@@ -176,8 +176,24 @@ SDK.IsolateManager.Isolate = class {
return this._models;
}
+ /**
+ * @return {?SDK.RuntimeModel}
+ */
+ runtimeModel() {
+ return this._models.values().next().value || null;
+ }
+
+ /**
+ * @return {?SDK.HeapProfilerModel}
+ */
+ heapProfilerModel() {
+ const runtimeModel = this.runtimeModel();
+ return runtimeModel && runtimeModel.heapProfilerModel();
+ }
+
async _update() {
- const usage = await this._models.values().next().value.heapUsage();
+ const model = this.runtimeModel();
+ const usage = model && await model.heapUsage();
if (!usage)
return;
this._usedHeapSize = usage.usedSize;
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/sdk/NetworkManager.js b/chromium/third_party/blink/renderer/devtools/front_end/sdk/NetworkManager.js
index 295624142f0..fa24c340bef 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/sdk/NetworkManager.js
+++ b/chromium/third_party/blink/renderer/devtools/front_end/sdk/NetworkManager.js
@@ -229,7 +229,7 @@ SDK.NetworkManager.Conditions;
/** @type {!SDK.NetworkManager.Conditions} */
SDK.NetworkManager.NoThrottlingConditions = {
- title: Common.UIString('No throttling'),
+ title: ls`Online`,
download: -1,
upload: -1,
latency: 0
@@ -339,6 +339,10 @@ SDK.NetworkDispatcher = class {
if (response.fromDiskCache)
networkRequest.setFromDiskCache();
+
+ if (response.fromPrefetchCache)
+ networkRequest.setFromPrefetchCache();
+
networkRequest.timing = response.timing;
networkRequest.protocol = response.protocol;
@@ -519,22 +523,13 @@ SDK.NetworkDispatcher = class {
// net::ParsedCookie::kMaxCookieSize = 4096 (net/cookies/parsed_cookie.h)
if ('set-cookie' in lowercaseHeaders && lowercaseHeaders['set-cookie'].length > 4096) {
- const message = Common.UIString(
- 'Set-Cookie header is ignored in response from url: %s. Cookie length should be less than or equal to 4096 characters.',
- response.url);
- this._manager.dispatchEventToListeners(
- SDK.NetworkManager.Events.MessageGenerated, {message: message, requestId: requestId, warning: true});
- }
-
- if ('public-key-pins' in lowercaseHeaders || 'public-key-pins-report-only' in lowercaseHeaders) {
- if (!this._hpkpDomains)
- this._hpkpDomains = new Set();
- const parsed = new Common.ParsedURL(response.url);
- if (parsed.isValid && !this._hpkpDomains.has(parsed.host)) {
- this._hpkpDomains.add(parsed.host);
+ const values = lowercaseHeaders['set-cookie'].split('\n');
+ for (let i = 0; i < values.length; ++i) {
+ if (values[i].length <= 4096)
+ continue;
const message = Common.UIString(
- 'HTTP-Based Public Key Pinning is deprecated. Chrome 69 and later will ignore HPKP response headers. (Host: %s)',
- parsed.host);
+ 'Set-Cookie header is ignored in response from url: %s. Cookie length should be less than or equal to 4096 characters.',
+ response.url);
this._manager.dispatchEventToListeners(
SDK.NetworkManager.Events.MessageGenerated, {message: message, requestId: requestId, warning: true});
}
@@ -681,7 +676,7 @@ SDK.NetworkDispatcher = class {
if (!networkRequest)
return;
- networkRequest.addFrame(response, time, false);
+ networkRequest.addProtocolFrame(response, time, false);
networkRequest.responseReceivedTime = time;
this._updateNetworkRequest(networkRequest);
@@ -698,7 +693,7 @@ SDK.NetworkDispatcher = class {
if (!networkRequest)
return;
- networkRequest.addFrame(response, time, true);
+ networkRequest.addProtocolFrame(response, time, true);
networkRequest.responseReceivedTime = time;
this._updateNetworkRequest(networkRequest);
@@ -715,7 +710,7 @@ SDK.NetworkDispatcher = class {
if (!networkRequest)
return;
- networkRequest.addFrameError(errorMessage, time);
+ networkRequest.addProtocolFrameError(errorMessage, time);
networkRequest.responseReceivedTime = time;
this._updateNetworkRequest(networkRequest);
@@ -818,10 +813,8 @@ SDK.NetworkDispatcher = class {
this._inflightRequestsByURL[networkRequest.url()] = networkRequest;
// The following relies on the fact that loaderIds and requestIds are
// globally unique and that the main request has them equal.
- if (networkRequest.loaderId === networkRequest.requestId()) {
+ if (networkRequest.loaderId === networkRequest.requestId())
SDK.multitargetNetworkManager._inflightMainResourceRequests.set(networkRequest.requestId(), networkRequest);
- delete this._hpkpDomains;
- }
this._manager.dispatchEventToListeners(SDK.NetworkManager.Events.RequestStarted, networkRequest);
}
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/sdk/NetworkRequest.js b/chromium/third_party/blink/renderer/devtools/front_end/sdk/NetworkRequest.js
index ad5234855e8..74145c0dc52 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/sdk/NetworkRequest.js
+++ b/chromium/third_party/blink/renderer/devtools/front_end/sdk/NetworkRequest.js
@@ -459,6 +459,13 @@ SDK.NetworkRequest = class extends Common.Object {
return !!this._fromMemoryCache && !this._transferSize;
}
+ /**
+ * @return {boolean}
+ */
+ fromPrefetchCache() {
+ return !!this._fromPrefetchCache;
+ }
+
setFromMemoryCache() {
this._fromMemoryCache = true;
delete this._timing;
@@ -468,6 +475,10 @@ SDK.NetworkRequest = class extends Common.Object {
this._fromDiskCache = true;
}
+ setFromPrefetchCache() {
+ this._fromPrefetchCache = true;
+ }
+
/**
* Returns true if the request was intercepted by a service worker and it
* provided its own response.
@@ -1195,8 +1206,8 @@ SDK.NetworkRequest = class extends Common.Object {
* @param {string} errorMessage
* @param {number} time
*/
- addFrameError(errorMessage, time) {
- this._addFrame({
+ addProtocolFrameError(errorMessage, time) {
+ this.addFrame({
type: SDK.NetworkRequest.WebSocketFrameType.Error,
text: errorMessage,
time: this.pseudoWallTime(time),
@@ -1210,9 +1221,9 @@ SDK.NetworkRequest = class extends Common.Object {
* @param {number} time
* @param {boolean} sent
*/
- addFrame(response, time, sent) {
+ addProtocolFrame(response, time, sent) {
const type = sent ? SDK.NetworkRequest.WebSocketFrameType.Send : SDK.NetworkRequest.WebSocketFrameType.Receive;
- this._addFrame({
+ this.addFrame({
type: type,
text: response.payloadData,
time: this.pseudoWallTime(time),
@@ -1224,7 +1235,7 @@ SDK.NetworkRequest = class extends Common.Object {
/**
* @param {!SDK.NetworkRequest.WebSocketFrame} frame
*/
- _addFrame(frame) {
+ addFrame(frame) {
this._frames.push(frame);
this.dispatchEventToListeners(SDK.NetworkRequest.Events.WebsocketFrameAdded, frame);
}
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/sdk/ResourceTreeModel.js b/chromium/third_party/blink/renderer/devtools/front_end/sdk/ResourceTreeModel.js
index d3c947f1a89..a167c7e8cfd 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/sdk/ResourceTreeModel.js
+++ b/chromium/third_party/blink/renderer/devtools/front_end/sdk/ResourceTreeModel.js
@@ -1015,4 +1015,12 @@ SDK.PageDispatcher = class {
*/
compilationCacheProduced(url, data) {
}
+
+ /**
+ * @override
+ * @param {!Protocol.Page.FrameId} frameId
+ * @param {string} url
+ */
+ downloadWillBegin(frameId, url) {
+ }
};
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/sdk/ScreenCaptureModel.js b/chromium/third_party/blink/renderer/devtools/front_end/sdk/ScreenCaptureModel.js
index bdc42f99bd1..64064d8a29e 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/sdk/ScreenCaptureModel.js
+++ b/chromium/third_party/blink/renderer/devtools/front_end/sdk/ScreenCaptureModel.js
@@ -235,6 +235,14 @@ SDK.ScreenCaptureModel = class extends SDK.SDKModel {
*/
compilationCacheProduced(url, data) {
}
+
+ /**
+ * @override
+ * @param {!Protocol.Page.FrameId} frameId
+ * @param {string} url
+ */
+ downloadWillBegin(frameId, url) {
+ }
};
SDK.SDKModel.register(SDK.ScreenCaptureModel, SDK.Target.Capability.ScreenCapture, false);
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/sdk/sdk_strings.grdp b/chromium/third_party/blink/renderer/devtools/front_end/sdk/sdk_strings.grdp
new file mode 100644
index 00000000000..6353de9e4c8
--- /dev/null
+++ b/chromium/third_party/blink/renderer/devtools/front_end/sdk/sdk_strings.grdp
@@ -0,0 +1,303 @@
+<?xml version="1.0" encoding="utf-8"?>
+<grit-part>
+ <message name="IDS_DEVTOOLS_07553a11db31a4433684be32cc4716e3" desc="">
+ Cross-Origin Read Blocking (CORB) blocked cross-origin response <ph name="NETWORKREQUEST_URL__">$1s</ph> with MIME type <ph name="NETWORKREQUEST_MIMETYPE">$2s</ph>. See https://www.chromestatus.com/feature/5629709824032768 for more details.
+ </message>
+ <message name="IDS_DEVTOOLS_07ba1c48fc0b478df5462700f993fa5e" desc="">
+ <ph name="NETWORKREQUEST_RESOURCETYPE___TITLE__">$1s</ph> failed loading: <ph name="NETWORKREQUEST_REQUESTMETHOD">$2s</ph> &quot;<ph name="NETWORKREQUEST_URL__">$3s</ph>&quot;.
+ </message>
+ <message name="IDS_DEVTOOLS_09cdd6a7321c64bae05b8cca859f1461" desc="">
+ Enable cache
+ </message>
+ <message name="IDS_DEVTOOLS_0fe1f9158e2f164da1332501f9e65702" desc="">
+ Navigated to <ph name="EVENT_DATA_URL">$1s</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_1023bf87beb1d2947824df00fa0898ad" desc="">
+ Disable async stack traces
+ </message>
+ <message name="IDS_DEVTOOLS_185bf49541541933dc3fd1fb89d3fea3" desc="">
+ Enable custom formatters
+ </message>
+ <message name="IDS_DEVTOOLS_1985576209a186984f171efd81e91e3d" desc="">
+ &lt;anonymous&gt;
+ </message>
+ <message name="IDS_DEVTOOLS_21070fd87b02611a5426d726a70a5502" desc="">
+ No value found for parameter &quot;<ph name="PARAMNAME">$1s</ph>&quot;.
+ </message>
+ <message name="IDS_DEVTOOLS_212af9ab36fa426a9e52bc1ebfd8665b" desc="">
+ Drag / drop
+ </message>
+ <message name="IDS_DEVTOOLS_23e5a7b7976e412ece233ceaf8257bc2" desc="">
+ Clipboard
+ </message>
+ <message name="IDS_DEVTOOLS_23e8e5daea7e9dc939ae4298a6f74e36" desc="">
+ ServerTiming: <ph name="MSG">$1s</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_28e486be4b3bad598b6e9eaa34ebec76" desc="">
+ Set-Cookie header is ignored in response from url: <ph name="RESPONSE_URL">$1s</ph>. Cookie length should be less than or equal to 4096 characters.
+ </message>
+ <message name="IDS_DEVTOOLS_2973958e77629e3a167a1a4c60dd5c5f" desc="">
+ Slow 3G
+ </message>
+ <message name="IDS_DEVTOOLS_3034e08ec0b14678ddb50284eef02ee4" desc="">
+ Do not preserve log upon navigation
+ </message>
+ <message name="IDS_DEVTOOLS_328d7fa69bbeeeefd8b3db6e1f06a17b" desc="">
+ With Block
+ </message>
+ <message name="IDS_DEVTOOLS_3437f1aa3e12219221092a45e62c9d4f" desc="">
+ Profile &apos;<ph name="DATA_TITLE">$1s</ph>&apos; finished.
+ </message>
+ <message name="IDS_DEVTOOLS_365e0172a2e97b0a26274c5bd2e4bad0" desc="">
+ Script Blocked by Content Security Policy
+ </message>
+ <message name="IDS_DEVTOOLS_38fe155e13d77298cfd5688c3378fa85" desc="">
+ Emulate CSS screen media type
+ </message>
+ <message name="IDS_DEVTOOLS_3b563524fdb17b4a86590470d40bef74" desc="">
+ Media
+ </message>
+ <message name="IDS_DEVTOOLS_3d9320c6e796b65a6c91fcd64e27fa88" desc="">
+ Hide frames per second (FPS) meter
+ </message>
+ <message name="IDS_DEVTOOLS_3ff9f750075f426831f71818a8f4ff12" desc="">
+ Request was blocked by DevTools: &quot;<ph name="NETWORKREQUEST_URL__">$1s</ph>&quot;.
+ </message>
+ <message name="IDS_DEVTOOLS_40dba446b661ae69dea3a8e026f76dfd" desc="">
+ Hide paint flashing rectangles
+ </message>
+ <message name="IDS_DEVTOOLS_4249b3308a0ed3e1e90e0a91ca11cf21" desc="">
+ WebGL Error Fired
+ </message>
+ <message name="IDS_DEVTOOLS_4636cded1f8a4578c9e8e7f2fd9cfdee" desc="">
+ (binary)
+ </message>
+ <message name="IDS_DEVTOOLS_4a2c6d480468877dd33d9a5bae54b549" desc="">
+ WebGL Warning Fired
+ </message>
+ <message name="IDS_DEVTOOLS_4bfca2e69ec73893d36ebcdcce35cf36" desc="">
+ Suspend AudioContext
+ </message>
+ <message name="IDS_DEVTOOLS_4cc00b9253c692417d3b0765d5ae5e79" desc="">
+ Unable to parse &quot;<ph name="PARAMNAME">$1s</ph>&quot; value &quot;<ph name="PARAMVALUE">$2s</ph>&quot;.
+ </message>
+ <message name="IDS_DEVTOOLS_4cc6684df7b4a92b1dec6fce3264fac8" desc="">
+ Global
+ </message>
+ <message name="IDS_DEVTOOLS_509820290d57f333403f490dde7316f4" desc="">
+ Local
+ </message>
+ <message name="IDS_DEVTOOLS_509a7f125ba127d220887938738af707" desc="">
+ Failed to save to temp variable.
+ </message>
+ <message name="IDS_DEVTOOLS_52da3e7fcf6abefc2a8807df4b759ef8" desc="">
+ setInterval fired
+ </message>
+ <message name="IDS_DEVTOOLS_599eba19aa93a929cb8589f148b8a6c4" desc="">
+ screen
+ </message>
+ <message name="IDS_DEVTOOLS_5c63ad6312d0451b3d1012e5ea8fd08f" desc="">
+ Emulate CSS print media type
+ </message>
+ <message name="IDS_DEVTOOLS_5fe9d4f417e5f34919b0b6e5f0431ec1" desc="">
+ Hide hit-test borders
+ </message>
+ <message name="IDS_DEVTOOLS_61cf8510205077b6f5491d38cd44c0f7" desc="">
+ Pointer
+ </message>
+ <message name="IDS_DEVTOOLS_62efb9ec331e364b96efe68c8b03ca20" desc="">
+ Worker
+ </message>
+ <message name="IDS_DEVTOOLS_62fce3f916fe47f75c391fd5e4fc3eca" desc="">
+ Consider disabling <ph name="COMMON_UISTRING__CHROME_DATA_SAVER__">$1s</ph> while debugging. For more info see: <ph name="_HTTPS___SUPPORT_GOOGLE_COM_CHROME__P_DATASAVER_">$2s</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_6617a779f50f7afb7949c7ea3ad52b28" desc="">
+ Show hit-test borders
+ </message>
+ <message name="IDS_DEVTOOLS_6948a469c79f7dd5426e4f291cba3db1" desc="">
+ Chrome Data Saver
+ </message>
+ <message name="IDS_DEVTOOLS_6ce4d85a628a88bbdb3ac24a8e5a9c2e" desc="">
+ Keyboard
+ </message>
+ <message name="IDS_DEVTOOLS_6e2e8696272b40b7a9745c998a39b177" desc="">
+ Close AudioContext
+ </message>
+ <message name="IDS_DEVTOOLS_6ea5359e01a41842884943125518289b" desc="">
+ Canvas
+ </message>
+ <message name="IDS_DEVTOOLS_6fdb8f0232e380cf106312e7b880d8d2" desc="">
+ Preserve log upon navigation
+ </message>
+ <message name="IDS_DEVTOOLS_7121afd196f5c52bef488d5a0f4c097b" desc="">
+ Script First Statement
+ </message>
+ <message name="IDS_DEVTOOLS_794f64c7f20487f6e13679201deeab3d" desc="">
+ Picture-in-Picture
+ </message>
+ <message name="IDS_DEVTOOLS_7c2bc755363ab11a1611bfa369654ff8" desc="">
+ Show frames per second (FPS) meter
+ </message>
+ <message name="IDS_DEVTOOLS_81961fe251f4d1cb4df131561dedf319" desc="">
+ Hide layer borders
+ </message>
+ <message name="IDS_DEVTOOLS_83f2229658949472d34f78e19475fcdd" desc="">
+ Show layer borders
+ </message>
+ <message name="IDS_DEVTOOLS_9028784c589c0c809700c7fbc66a5d96" desc="">
+ Resource interpreted as <ph name="NETWORKREQUEST_RESOURCETYPE___TITLE__">$1s</ph> but transferred with MIME type <ph name="NETWORKREQUEST_MIMETYPE">$2s</ph>: &quot;<ph name="NETWORKREQUEST_URL__">$3s</ph>&quot;.
+ </message>
+ <message name="IDS_DEVTOOLS_90da6f38945a1c7e7ba11e3adcbe6919" desc="">
+ Pause on exceptions
+ </message>
+ <message name="IDS_DEVTOOLS_9108ae673b7efa9620aec771edc9d4de" desc="">
+ setTimeout fired
+ </message>
+ <message name="IDS_DEVTOOLS_930c85a96d7227c515891c4f86a17c30" desc="">
+ Disable JavaScript
+ </message>
+ <message name="IDS_DEVTOOLS_93dee6366d66361f36985cf5c88346aa" desc="">
+ Create AudioContext
+ </message>
+ <message name="IDS_DEVTOOLS_95bbad55f11c237ed89546e748093ba7" desc="">
+ Request Animation Frame
+ </message>
+ <message name="IDS_DEVTOOLS_96d008db67fc0b5551a926842bbb6a71" desc="">
+ Notification
+ </message>
+ <message name="IDS_DEVTOOLS_9850063efe194af1c63d2aa61ef94c62" desc="">
+ Create canvas context
+ </message>
+ <message name="IDS_DEVTOOLS_9dd7b9f5cc1c19a830f153c3e8f1ad89" desc="">
+ Fast 3G
+ </message>
+ <message name="IDS_DEVTOOLS_9f7d4cb9fefed9daf0e9e4aad0620497" desc="">
+ Do not highlight ad frames
+ </message>
+ <message name="IDS_DEVTOOLS_a155bce1e541d9234013102c2e613941" desc="">
+ ServiceWorkerCacheAgent error deleting cache entry <ph name="CACHE_TOSTRING__">$1s</ph> in cache: <ph name="RESPONSE_PROTOCOL_ERROR_">$2s</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_a1595abbb4c3a326636dd178757cd6c1" desc="">
+ Control
+ </message>
+ <message name="IDS_DEVTOOLS_a720fc15eb9ec85751969e8615ace9e1" desc="">
+ Duplicate parameter &quot;<ph name="PARAMNAME">$1s</ph>&quot; ignored.
+ </message>
+ <message name="IDS_DEVTOOLS_ac4aac1ba23d844f4976e9fcd1fd4a61" desc="">
+ WebGL Error Fired (<ph name="ERRORNAME">$1s</ph>)
+ </message>
+ <message name="IDS_DEVTOOLS_af4bb376939e77df0e7c2332b837a866" desc="">
+ Closure
+ </message>
+ <message name="IDS_DEVTOOLS_b28354b543375bfa94dabaeda722927f" desc="">
+ top
+ </message>
+ <message name="IDS_DEVTOOLS_b43356cdb7bdec437e117bb1ed5625bc" desc="">
+ Capture async stack traces
+ </message>
+ <message name="IDS_DEVTOOLS_b50ec339cd40d39d5ff4ca56379e61c6" desc="">
+ Paused in debugger
+ </message>
+ <message name="IDS_DEVTOOLS_b600e0facf21b7d4a9a769a60b236ba1" desc="">
+ Enable JavaScript
+ </message>
+ <message name="IDS_DEVTOOLS_ba50636875d999db0c9218b48b23027d" desc="">
+ Do not capture async stack traces
+ </message>
+ <message name="IDS_DEVTOOLS_ba5b676ccf658f863ef2e3df082ee262" desc="">
+ Animation Frame Fired
+ </message>
+ <message name="IDS_DEVTOOLS_bc955333ff170762be4971a8fde558cf" desc="">
+ WebAudio
+ </message>
+ <message name="IDS_DEVTOOLS_c432f4e5fdec5760a2f06b38f646168e" desc="">
+ Profile &apos;<ph name="DATA_TITLE">$1s</ph>&apos; started.
+ </message>
+ <message name="IDS_DEVTOOLS_c5d59568835d0760e318829b800ee06d" desc="">
+ Catch
+ </message>
+ <message name="IDS_DEVTOOLS_c64d5c0d5233c7d6e85a41c6dd3c3a3f" desc="">
+ Resume AudioContext
+ </message>
+ <message name="IDS_DEVTOOLS_c89686a387d2b12b3c729ce35a0bcb5b" desc="">
+ Window
+ </message>
+ <message name="IDS_DEVTOOLS_c9ad95228aa735bdda1aebf38da022af" desc="">
+ Parse
+ </message>
+ <message name="IDS_DEVTOOLS_cedab6b9e4e794e93bba797e8aff218a" desc="">
+ <ph name="NETWORKREQUEST_RESOURCETYPE___TITLE__">$1s</ph> finished loading: <ph name="NETWORKREQUEST_REQUESTMETHOD">$2s</ph> &quot;<ph name="NETWORKREQUEST_URL__">$3s</ph>&quot;.
+ </message>
+ <message name="IDS_DEVTOOLS_d24a22fef757966373800aa9795458dc" desc="">
+ ? [sm]
+ </message>
+ <message name="IDS_DEVTOOLS_d31827f0a164d52b636bb1f71ca4a351" desc="">
+ Cancel Animation Frame
+ </message>
+ <message name="IDS_DEVTOOLS_d4fad802fc7bf0248d34c685533bd56f" desc="">
+ Disable request blocking
+ </message>
+ <message name="IDS_DEVTOOLS_d6b6b668dbca9d4fe774bb654226ebe3" desc="">
+ Animation
+ </message>
+ <message name="IDS_DEVTOOLS_dcd9c13c4f8ae68ea7ae92edf9191264" desc="">
+ Deprecated syntax found. Please use: &lt;name&gt;;dur=&lt;duration&gt;;desc=&lt;description&gt;
+ </message>
+ <message name="IDS_DEVTOOLS_df9f4292c1d025cbada13b25744d34e5" desc="">
+ Do not emulate CSS media type
+ </message>
+ <message name="IDS_DEVTOOLS_e1e4c8c9ccd9fc39c391da4bcd093fb2" desc="">
+ Block
+ </message>
+ <message name="IDS_DEVTOOLS_e2b60c37530e144372a7943df0f6017d" desc="">
+ &lt;iframe&gt;
+ </message>
+ <message name="IDS_DEVTOOLS_e402c138065e7eece783dc30c6079192" desc="">
+ XHR
+ </message>
+ <message name="IDS_DEVTOOLS_e485c975c1d6c17d9dfd81128b83f63a" desc="">
+ Set innerHTML
+ </message>
+ <message name="IDS_DEVTOOLS_e55f75a29310d7b60f7ac1d390c8ae42" desc="">
+ Module
+ </message>
+ <message name="IDS_DEVTOOLS_e69d85cd1acdf030f0cede48b61d7720" desc="">
+ Hide scroll performance bottlenecks
+ </message>
+ <message name="IDS_DEVTOOLS_edb020d2175281d94054136e09a3e132" desc="">
+ Do not pause on exceptions
+ </message>
+ <message name="IDS_DEVTOOLS_efa547f7d0b9924fdc7b301838c99fad" desc="">
+ No emulation
+ </message>
+ <message name="IDS_DEVTOOLS_efb4777327e6f704fb1519c1882f93ec" desc="">
+ Timer
+ </message>
+ <message name="IDS_DEVTOOLS_eff8d530f562a22a45fbf1ee83299353" desc="">
+ Show scroll performance bottlenecks
+ </message>
+ <message name="IDS_DEVTOOLS_f107ac919ab14339cdb22cd00fccd215" desc="">
+ Show paint flashing rectangles
+ </message>
+ <message name="IDS_DEVTOOLS_f2a47c6809d88e175dade0ef7b16aa13" desc="">
+ Mouse
+ </message>
+ <message name="IDS_DEVTOOLS_f6137609f4decf877ede5bd3a3125629" desc="">
+ DevTools: CPU profile parser is fixing <ph name="COUNT">$1s</ph> missing samples.
+ </message>
+ <message name="IDS_DEVTOOLS_f7531e2d0ea27233ce00b5f01c5bf335" desc="">
+ print
+ </message>
+ <message name="IDS_DEVTOOLS_f9778c8e7464e4bb037ec2463879588f" desc="">
+ DOM Mutation
+ </message>
+ <message name="IDS_DEVTOOLS_f99d691018d8f37dda14a9cd29c1d1ee" desc="">
+ Script blocked due to Content Security Policy directive: <ph name="AUXDATA__DIRECTIVETEXT__">$1s</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_fa79cdac06c8d2166fd5cda17ccbc0ce" desc="">
+ Extraneous trailing characters.
+ </message>
+ <message name="IDS_DEVTOOLS_ff92304ed0236a5f972fd90e9b47fae4" desc="">
+ Unrecognized parameter &quot;<ph name="PARAMNAME">$1s</ph>&quot;.
+ </message>
+</grit-part> \ No newline at end of file
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/search/search_strings.grdp b/chromium/third_party/blink/renderer/devtools/front_end/search/search_strings.grdp
new file mode 100644
index 00000000000..ef34ad6c364
--- /dev/null
+++ b/chromium/third_party/blink/renderer/devtools/front_end/search/search_strings.grdp
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<grit-part>
+ <message name="IDS_DEVTOOLS_2f04f3e6eee339eeb0ddb6c39606424d" desc="">
+ Use Regular Expression
+ </message>
+ <message name="IDS_DEVTOOLS_44b4e531d5b06deb40b631e4aa3c7e36" desc="">
+ Show <ph name="MATCHESLEFTCOUNT">$1d</ph> more
+ </message>
+ <message name="IDS_DEVTOOLS_617778f774bc264b169dde60f223285f" desc="">
+ Indexing…
+ </message>
+ <message name="IDS_DEVTOOLS_9fc52b55092ab8a92303e86722013b36" desc="">
+ Search interrupted.
+ </message>
+ <message name="IDS_DEVTOOLS_ab29eba562fe20ebb94fed224813c109" desc="">
+ Search finished.
+ </message>
+ <message name="IDS_DEVTOOLS_b20aa447d2e9b2d5065ac0ac4ed7bcc2" desc="">
+ Found <ph name="THIS__SEARCHMATCHESCOUNT">$1d</ph> matching lines in <ph name="THIS__NONEMPTYSEARCHRESULTSCOUNT">$2d</ph> files.
+ </message>
+ <message name="IDS_DEVTOOLS_c440d4f6fc7dd9239ada58277b900249" desc="">
+ Found <ph name="THIS__SEARCHMATCHESCOUNT">$1d</ph> matching lines in 1 file.
+ </message>
+ <message name="IDS_DEVTOOLS_c949475bc69a57c419ac976fe8870652" desc="">
+ Match Case
+ </message>
+ <message name="IDS_DEVTOOLS_d1e64da6074bf343a0a6bd2cd6515189" desc="">
+ Indexing interrupted.
+ </message>
+ <message name="IDS_DEVTOOLS_f4c8ff50c8f0b548e3297aeaf3b304b4" desc="">
+ Found 1 matching line in 1 file.
+ </message>
+ <message name="IDS_DEVTOOLS_f7e2fe044011a710d68a3c4e165ef7bf" desc="">
+ No matches found.
+ </message>
+</grit-part> \ No newline at end of file
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/security/SecurityModel.js b/chromium/third_party/blink/renderer/devtools/front_end/security/SecurityModel.js
index d380a9c8f52..0e476593f54 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/security/SecurityModel.js
+++ b/chromium/third_party/blink/renderer/devtools/front_end/security/SecurityModel.js
@@ -73,13 +73,11 @@ Security.SecurityModel.Events = {
Security.PageSecurityState = class {
/**
* @param {!Protocol.Security.SecurityState} securityState
- * @param {boolean} schemeIsCryptographic
* @param {!Array<!Protocol.Security.SecurityStateExplanation>} explanations
* @param {?string} summary
*/
- constructor(securityState, schemeIsCryptographic, explanations, summary) {
+ constructor(securityState, explanations, summary) {
this.securityState = securityState;
- this.schemeIsCryptographic = schemeIsCryptographic;
this.explanations = explanations;
this.summary = summary;
}
@@ -103,8 +101,7 @@ Security.SecurityDispatcher = class {
* @param {?string=} summary
*/
securityStateChanged(securityState, schemeIsCryptographic, explanations, insecureContentStatus, summary) {
- const pageSecurityState =
- new Security.PageSecurityState(securityState, schemeIsCryptographic, explanations, summary || null);
+ const pageSecurityState = new Security.PageSecurityState(securityState, explanations, summary || null);
this._model.dispatchEventToListeners(Security.SecurityModel.Events.SecurityStateChanged, pageSecurityState);
}
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/security/SecurityPanel.js b/chromium/third_party/blink/renderer/devtools/front_end/security/SecurityPanel.js
index 5512cc3ab6c..8227c47cc70 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/security/SecurityPanel.js
+++ b/chromium/third_party/blink/renderer/devtools/front_end/security/SecurityPanel.js
@@ -92,13 +92,12 @@ Security.SecurityPanel = class extends UI.PanelWithSidebar {
/**
* @param {!Protocol.Security.SecurityState} newSecurityState
- * @param {boolean} schemeIsCryptographic
* @param {!Array<!Protocol.Security.SecurityStateExplanation>} explanations
* @param {?string} summary
*/
- _updateSecurityState(newSecurityState, schemeIsCryptographic, explanations, summary) {
+ _updateSecurityState(newSecurityState, explanations, summary) {
this._sidebarMainViewElement.setSecurityState(newSecurityState);
- this._mainView.updateSecurityState(newSecurityState, schemeIsCryptographic, explanations, summary);
+ this._mainView.updateSecurityState(newSecurityState, explanations, summary);
}
/**
@@ -107,10 +106,9 @@ Security.SecurityPanel = class extends UI.PanelWithSidebar {
_onSecurityStateChanged(event) {
const data = /** @type {!Security.PageSecurityState} */ (event.data);
const securityState = /** @type {!Protocol.Security.SecurityState} */ (data.securityState);
- const schemeIsCryptographic = /** @type {boolean} */ (data.schemeIsCryptographic);
const explanations = /** @type {!Array<!Protocol.Security.SecurityStateExplanation>} */ (data.explanations);
const summary = /** @type {?string} */ (data.summary);
- this._updateSecurityState(securityState, schemeIsCryptographic, explanations, summary);
+ this._updateSecurityState(securityState, explanations, summary);
}
selectAndSwitchToMainView() {
@@ -378,42 +376,55 @@ Security.SecurityPanelSidebarTree = class extends UI.TreeOutlineInShadow {
this._showOriginInPanel = showOriginInPanel;
this._mainOrigin = null;
- /** @type {!Map<!Security.SecurityPanelSidebarTree.OriginGroupName, !UI.TreeElement>} */
+ /** @type {!Map<!Security.SecurityPanelSidebarTree.OriginGroup, !UI.TreeElement>} */
this._originGroups = new Map();
- for (const key in Security.SecurityPanelSidebarTree.OriginGroupName) {
- const originGroupName = Security.SecurityPanelSidebarTree.OriginGroupName[key];
- const originGroup = new UI.TreeElement(originGroupName, true);
- originGroup.selectable = false;
- originGroup.setCollapsible(false);
- originGroup.expand();
- originGroup.listItemElement.classList.add('security-sidebar-origins');
- this._originGroups.set(originGroupName, originGroup);
- this.appendChild(originGroup);
+ /** @type {!Map<!Security.SecurityPanelSidebarTree.OriginGroup, string>} */
+ this._originGroupTitles = new Map([
+ [Security.SecurityPanelSidebarTree.OriginGroup.MainOrigin, ls`Main origin`],
+ [Security.SecurityPanelSidebarTree.OriginGroup.NonSecure, ls`Non-secure origins`],
+ [Security.SecurityPanelSidebarTree.OriginGroup.Secure, ls`Secure origins`],
+ [Security.SecurityPanelSidebarTree.OriginGroup.Unknown, ls`Unknown / canceled`],
+ ]);
+
+ for (const key in Security.SecurityPanelSidebarTree.OriginGroup) {
+ const group = Security.SecurityPanelSidebarTree.OriginGroup[key];
+ const element = this._createOriginGroupElement(this._originGroupTitles.get(group));
+ this._originGroups.set(group, element);
+ this.appendChild(element);
}
+
this._clearOriginGroups();
// This message will be removed by clearOrigins() during the first new page load after the panel was opened.
const mainViewReloadMessage = new UI.TreeElement(Common.UIString('Reload to view details'));
mainViewReloadMessage.selectable = false;
mainViewReloadMessage.listItemElement.classList.add('security-main-view-reload-message');
- this._originGroups.get(Security.SecurityPanelSidebarTree.OriginGroupName.MainOrigin)
- .appendChild(mainViewReloadMessage);
+ this._originGroups.get(Security.SecurityPanelSidebarTree.OriginGroup.MainOrigin).appendChild(mainViewReloadMessage);
/** @type {!Map<!Security.SecurityPanel.Origin, !Security.SecurityPanelSidebarTreeElement>} */
this._elementsByOrigin = new Map();
}
/**
+ * @param {string} originGroupTitle
+ * @return {!UI.TreeElement}
+ */
+ _createOriginGroupElement(originGroupTitle) {
+ const originGroup = new UI.TreeElement(originGroupTitle, true);
+ originGroup.selectable = false;
+ originGroup.setCollapsible(false);
+ originGroup.expand();
+ originGroup.listItemElement.classList.add('security-sidebar-origins');
+ return originGroup;
+ }
+
+ /**
* @param {boolean} hidden
*/
toggleOriginsList(hidden) {
- for (const key in Security.SecurityPanelSidebarTree.OriginGroupName) {
- const originGroupName = Security.SecurityPanelSidebarTree.OriginGroupName[key];
- const group = this._originGroups.get(originGroupName);
- if (group)
- group.hidden = hidden;
- }
+ for (const element of this._originGroups.values())
+ element.hidden = hidden;
}
/**
@@ -447,17 +458,21 @@ Security.SecurityPanelSidebarTree = class extends UI.TreeOutlineInShadow {
let newParent;
if (origin === this._mainOrigin) {
- newParent = this._originGroups.get(Security.SecurityPanelSidebarTree.OriginGroupName.MainOrigin);
+ newParent = this._originGroups.get(Security.SecurityPanelSidebarTree.OriginGroup.MainOrigin);
+ if (securityState === Protocol.Security.SecurityState.Secure)
+ newParent.title = ls`Main origin (secure)`;
+ else
+ newParent.title = ls`Main origin (non-secure)`;
} else {
switch (securityState) {
case Protocol.Security.SecurityState.Secure:
- newParent = this._originGroups.get(Security.SecurityPanelSidebarTree.OriginGroupName.Secure);
+ newParent = this._originGroups.get(Security.SecurityPanelSidebarTree.OriginGroup.Secure);
break;
case Protocol.Security.SecurityState.Unknown:
- newParent = this._originGroups.get(Security.SecurityPanelSidebarTree.OriginGroupName.Unknown);
+ newParent = this._originGroups.get(Security.SecurityPanelSidebarTree.OriginGroup.Unknown);
break;
default:
- newParent = this._originGroups.get(Security.SecurityPanelSidebarTree.OriginGroupName.NonSecure);
+ newParent = this._originGroups.get(Security.SecurityPanelSidebarTree.OriginGroup.NonSecure);
break;
}
}
@@ -479,7 +494,9 @@ Security.SecurityPanelSidebarTree = class extends UI.TreeOutlineInShadow {
originGroup.removeChildren();
originGroup.hidden = true;
}
- this._originGroups.get(Security.SecurityPanelSidebarTree.OriginGroupName.MainOrigin).hidden = false;
+ const mainOrigin = this._originGroups.get(Security.SecurityPanelSidebarTree.OriginGroup.MainOrigin);
+ mainOrigin.title = this._originGroupTitles.get(Security.SecurityPanelSidebarTree.OriginGroup.MainOrigin);
+ mainOrigin.hidden = false;
}
clearOrigins() {
@@ -488,16 +505,12 @@ Security.SecurityPanelSidebarTree = class extends UI.TreeOutlineInShadow {
}
};
-/**
- * A mapping from Javascript key IDs to names (sidebar section titles).
- * Note: The names are used as keys into a map, so they must be distinct from each other.
- * @enum {string}
- */
-Security.SecurityPanelSidebarTree.OriginGroupName = {
- MainOrigin: Common.UIString('Main origin'),
- NonSecure: Common.UIString('Non-secure origins'),
- Secure: Common.UIString('Secure origins'),
- Unknown: Common.UIString('Unknown / canceled')
+/** @enum */
+Security.SecurityPanelSidebarTree.OriginGroup = {
+ MainOrigin: Symbol('MainOrigin'),
+ NonSecure: Symbol('NonSecure'),
+ Secure: Symbol('Secure'),
+ Unknown: Symbol('Unknown')
};
/**
@@ -640,11 +653,10 @@ Security.SecurityMainView = class extends UI.VBox {
/**
* @param {!Protocol.Security.SecurityState} newSecurityState
- * @param {boolean} schemeIsCryptographic
* @param {!Array<!Protocol.Security.SecurityStateExplanation>} explanations
* @param {?string} summary
*/
- updateSecurityState(newSecurityState, schemeIsCryptographic, explanations, summary) {
+ updateSecurityState(newSecurityState, explanations, summary) {
// Remove old state.
// It's safe to call this even when this._securityState is undefined.
this._summarySection.classList.remove('security-summary-' + this._securityState);
@@ -663,7 +675,6 @@ Security.SecurityMainView = class extends UI.VBox {
this._summaryText.textContent = summary || summaryExplanationStrings[this._securityState];
this._explanations = explanations;
- this._schemeIsCryptographic = schemeIsCryptographic;
this.refreshExplanations();
}
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/security/mainView.css b/chromium/third_party/blink/renderer/devtools/front_end/security/mainView.css
index 4979fb3c38d..f06c287242b 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/security/mainView.css
+++ b/chromium/third_party/blink/renderer/devtools/front_end/security/mainView.css
@@ -152,18 +152,6 @@
margin-bottom: 8px;
}
-.security-explanation-neutral .security-section-title,
-.security-explanation-warning .security-section-title
-{
- color: #cb3626;
- font-weight: bold;
-}
-.security-explanation-insecure .security-section-title
-{
- color: rgb(216, 71, 60);
- font-weight: bold;
-}
-
.security-mixed-content {
margin-top: 8px;
}
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/security/security_strings.grdp b/chromium/third_party/blink/renderer/devtools/front_end/security/security_strings.grdp
new file mode 100644
index 00000000000..46bc61e732a
--- /dev/null
+++ b/chromium/third_party/blink/renderer/devtools/front_end/security/security_strings.grdp
@@ -0,0 +1,144 @@
+<?xml version="1.0" encoding="utf-8"?>
+<grit-part>
+ <message name="IDS_DEVTOOLS_02e168aecffdbc00d48c952eba310b02" desc="">
+ Main origin
+ </message>
+ <message name="IDS_DEVTOOLS_0f22d804f6720086f2ffe6c4e9d7d3fd" desc="">
+ Unknown / canceled
+ </message>
+ <message name="IDS_DEVTOOLS_1238f21584e6dc18c44c4d96fc9bef13" desc="">
+ Issued at
+ </message>
+ <message name="IDS_DEVTOOLS_1dc6f97ea55d39e862637dcb0298a3ff" desc="">
+ Open full certificate details
+ </message>
+ <message name="IDS_DEVTOOLS_22b29ad1d12365f80273c5b173b2ac6b" desc="">
+ Not secure (broken)
+ </message>
+ <message name="IDS_DEVTOOLS_22fcd09f19102f883a8e337ea1624b20" desc="">
+ Log ID
+ </message>
+ <message name="IDS_DEVTOOLS_278dded33791cce4bb389fdf6a516856" desc="">
+ Your connection to this origin is not secure.
+ </message>
+ <message name="IDS_DEVTOOLS_2ad7083a628c9593e4c538deab838d77" desc="">
+ This page is not secure (broken HTTPS).
+ </message>
+ <message name="IDS_DEVTOOLS_2fae32629d4ef4fc6341f1751b405e45" desc="">
+ Security
+ </message>
+ <message name="IDS_DEVTOOLS_36cc7ab088ee5ea657c3d1e47016901b" desc="">
+ The security details above are from the first inspected response.
+ </message>
+ <message name="IDS_DEVTOOLS_3b878279a04dc47d60932cb294d96259" desc="">
+ Overview
+ </message>
+ <message name="IDS_DEVTOOLS_3bc80b82af3a60973d57e8ff762b87eb" desc="">
+ Your page requested non-secure resources that were blocked.
+ </message>
+ <message name="IDS_DEVTOOLS_4212f531450435498e750858b23cc739" desc="">
+ No security details are available for this origin.
+ </message>
+ <message name="IDS_DEVTOOLS_45c618734371071e7c335c06c1d2852d" desc="">
+ This page is secure (valid HTTPS).
+ </message>
+ <message name="IDS_DEVTOOLS_46b0ab970c4705a3a388a6d86aa831c2" desc="">
+ Main origin (secure)
+ </message>
+ <message name="IDS_DEVTOOLS_472acd9e75af12adb6421b3eedc8f975" desc="">
+ Reload the page to record requests for HTTP resources.
+ </message>
+ <message name="IDS_DEVTOOLS_4b1f76eea8c3d555f4fe2a9efe4513a5" desc="">
+ SCT
+ </message>
+ <message name="IDS_DEVTOOLS_4e6509e12a8c0ebf2b39fd7e158d48c2" desc="">
+ This origin is a non-HTTPS secure origin.
+ </message>
+ <message name="IDS_DEVTOOLS_55c917250d323e0d8572a1c3673bc80d" desc="">
+ The security of this page is unknown.
+ </message>
+ <message name="IDS_DEVTOOLS_5a70e1c7b4fa71a69851e44cda14dff7" desc="">
+ Secure origins
+ </message>
+ <message name="IDS_DEVTOOLS_628b50e6d53ec0d0e9b62971872e6b8b" desc="">
+ Show more (<ph name="SANLIST_LENGTH">$1d</ph> total)
+ </message>
+ <message name="IDS_DEVTOOLS_62a0282d39568be094470486eaf70c4f" desc="">
+ SAN
+ </message>
+ <message name="IDS_DEVTOOLS_6792733f0a02ad04a0a660c9a0bcfad1" desc="">
+ Main origin (non-secure)
+ </message>
+ <message name="IDS_DEVTOOLS_6f5168da8d36a44f8c196c8aa3ff3e40" desc="">
+ Certificate Transparency
+ </message>
+ <message name="IDS_DEVTOOLS_71d09158378f6d5172ac991d5f26a1c1" desc="">
+ Log name
+ </message>
+ <message name="IDS_DEVTOOLS_77ee7df08008633ded94db7e019a2bcc" desc="">
+ Non-secure origins
+ </message>
+ <message name="IDS_DEVTOOLS_7d5b05ab7e3853d483726a5b1a94c475" desc="">
+ Signature algorithm
+ </message>
+ <message name="IDS_DEVTOOLS_7e025c9c2b87ac6d946747ea156b3f37" desc="">
+ Blocked mixed content
+ </message>
+ <message name="IDS_DEVTOOLS_918fa99baa381e2902ad2185ea659228" desc="">
+ Hash algorithm
+ </message>
+ <message name="IDS_DEVTOOLS_9859694a15c021aa640bfda6b3e4423f" desc="">
+ Key exchange group
+ </message>
+ <message name="IDS_DEVTOOLS_98bce0cf672e732251f6f4327749ed18" desc="">
+ (n/a)
+ </message>
+ <message name="IDS_DEVTOOLS_9b30e34fce49de00a7fefd64aa5371fd" desc="">
+ This page is not secure.
+ </message>
+ <message name="IDS_DEVTOOLS_9c5ad7ee1f9630b92891a478327e670f" desc="">
+ View <ph name="FILTERREQUESTCOUNT">$1d</ph> requests in Network Panel
+ </message>
+ <message name="IDS_DEVTOOLS_a10edd2a3893a9ba446fb26e7c27556a" desc="">
+ This request complies with Chrome&apos;s Certificate Transparency policy.
+ </message>
+ <message name="IDS_DEVTOOLS_a2b16c6b3db371738d0e5c3f3ba2b54d" desc="">
+ This response was loaded from cache. Some security details might be missing.
+ </message>
+ <message name="IDS_DEVTOOLS_a574d935216052d2d6ee69b743cd4147" desc="">
+ Show full details
+ </message>
+ <message name="IDS_DEVTOOLS_a5f643359ba723c6f26cc3a3cfc14874" desc="">
+ No security information
+ </message>
+ <message name="IDS_DEVTOOLS_a7ec70e97f31322dc2e9aaa805b102ab" desc="">
+ View <ph name="FILTERREQUESTCOUNT">$1d</ph> request in Network Panel
+ </message>
+ <message name="IDS_DEVTOOLS_b92f649b203ca680d444432324771186" desc="">
+ This request does not comply with Chrome&apos;s Certificate Transparency policy.
+ </message>
+ <message name="IDS_DEVTOOLS_c3db8a95444ea6caa45cc7dcb6e78d64" desc="">
+ Security overview
+ </message>
+ <message name="IDS_DEVTOOLS_c64a179b75e6bf377700187bea8de65e" desc="">
+ Reload to view details
+ </message>
+ <message name="IDS_DEVTOOLS_c8ef68c0fce4f4bfe0219809473d3651" desc="">
+ Cipher
+ </message>
+ <message name="IDS_DEVTOOLS_d42c8bbf1d0f4a65f4dec450f2bc4439" desc="">
+ Key exchange
+ </message>
+ <message name="IDS_DEVTOOLS_decb9f523d4cf5dc037b61cb555e6bf3" desc="">
+ Not secure
+ </message>
+ <message name="IDS_DEVTOOLS_ebcaa68d6546adbf82e22d0384d945cf" desc="">
+ Hide full details
+ </message>
+ <message name="IDS_DEVTOOLS_f701897bd65f88245ebde54a818953a1" desc="">
+ Signature data
+ </message>
+ <message name="IDS_DEVTOOLS_ffb9069b5d779f0a9e37dfbd47d9edfb" desc="">
+ Validation status
+ </message>
+</grit-part> \ No newline at end of file
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/security_test_runner/SecurityTestRunner.js b/chromium/third_party/blink/renderer/devtools/front_end/security_test_runner/SecurityTestRunner.js
index 96ac4a929d2..1842949f9d8 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/security_test_runner/SecurityTestRunner.js
+++ b/chromium/third_party/blink/renderer/devtools/front_end/security_test_runner/SecurityTestRunner.js
@@ -8,15 +8,15 @@
*/
SecurityTestRunner.dumpSecurityPanelSidebarOrigins = function() {
- for (const key in Security.SecurityPanelSidebarTree.OriginGroupName) {
- const originGroupName = Security.SecurityPanelSidebarTree.OriginGroupName[key];
- const originGroup = Security.SecurityPanel._instance()._sidebarTree._originGroups.get(originGroupName);
+ for (const key in Security.SecurityPanelSidebarTree.OriginGroup) {
+ const originGroup = Security.SecurityPanelSidebarTree.OriginGroup[key];
+ const element = Security.SecurityPanel._instance()._sidebarTree._originGroups.get(originGroup);
- if (originGroup.hidden)
+ if (element.hidden)
continue;
- TestRunner.addResult('Group: ' + originGroupName);
- const originTitles = originGroup.childrenListElement.getElementsByTagName('span');
+ TestRunner.addResult('Group: ' + element.title);
+ const originTitles = element.childrenListElement.getElementsByTagName('span');
for (const originTitle of originTitles) {
if (originTitle.className !== 'tree-element-title')
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/settings/FrameworkBlackboxSettingsTab.js b/chromium/third_party/blink/renderer/devtools/front_end/settings/FrameworkBlackboxSettingsTab.js
index 262d25bf40e..a47ea0f8022 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/settings/FrameworkBlackboxSettingsTab.js
+++ b/chromium/third_party/blink/renderer/devtools/front_end/settings/FrameworkBlackboxSettingsTab.js
@@ -12,10 +12,14 @@ Settings.FrameworkBlackboxSettingsTab = class extends UI.VBox {
super(true);
this.registerRequiredCSS('settings/frameworkBlackboxSettingsTab.css');
- this.contentElement.createChild('div', 'header').textContent = Common.UIString('Framework Blackbox Patterns');
- this.contentElement.createChild('div', 'blackbox-content-scripts')
- .appendChild(UI.SettingsUI.createSettingCheckbox(
- Common.UIString('Blackbox content scripts'), Common.moduleSetting('skipContentScripts'), true));
+ this.contentElement.createChild('div', 'header').textContent = Common.UIString('Framework Blackboxing');
+ this.contentElement.createChild('div', 'intro').textContent =
+ ls`Debugger will skip through the scripts and will not stop on exceptions thrown by them.`;
+
+ const blackboxContentScripts = this.contentElement.createChild('div', 'blackbox-content-scripts');
+ blackboxContentScripts.appendChild(UI.SettingsUI.createSettingCheckbox(
+ ls`Blackbox content scripts`, Common.moduleSetting('skipContentScripts'), true));
+ blackboxContentScripts.title = ls`Blackbox content scripts (extension scripts in the page)`;
this._blackboxLabel = Common.UIString('Blackbox');
this._disabledLabel = Common.UIString('Disabled');
@@ -68,7 +72,8 @@ Settings.FrameworkBlackboxSettingsTab = class extends UI.VBox {
const element = createElementWithClass('div', 'blackbox-list-item');
const pattern = element.createChild('div', 'blackbox-pattern');
pattern.textContent = item.pattern;
- pattern.title = item.pattern;
+ pattern.title = ls`Blackbox scripts whose names match` +
+ ' \'' + item.pattern + '\'';
element.createChild('div', 'blackbox-separator');
element.createChild('div', 'blackbox-behavior').textContent =
item.disabled ? this._disabledLabel : this._blackboxLabel;
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/settings/frameworkBlackboxSettingsTab.css b/chromium/third_party/blink/renderer/devtools/front_end/settings/frameworkBlackboxSettingsTab.css
index cf607ac5aa8..28b6d061758 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/settings/frameworkBlackboxSettingsTab.css
+++ b/chromium/third_party/blink/renderer/devtools/front_end/settings/frameworkBlackboxSettingsTab.css
@@ -16,6 +16,10 @@
flex: none;
}
+.intro {
+ margin-top: 10px;
+}
+
.blackbox-content-scripts {
margin-top: 10px;
flex: none;
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/settings/settingsScreen.css b/chromium/third_party/blink/renderer/devtools/front_end/settings/settingsScreen.css
index 99890414946..181dc27ef83 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/settings/settingsScreen.css
+++ b/chromium/third_party/blink/renderer/devtools/front_end/settings/settingsScreen.css
@@ -44,11 +44,6 @@
margin-left: 20px;
}
-.settings-tab .field-error-message {
- color: DarkRed;
- height: 0; /* Avoid changing element height when content is set. */
-}
-
.settings-line {
padding-bottom: 5px;
margin-bottom: 5px;
@@ -115,18 +110,10 @@ fieldset {
flex-shrink: 0;
}
-#general-tab-content .settings-block fieldset legend {
- font-size: 14px;
-}
-
.settings-block p p {
padding-left: 30px;
}
-.settings-content p.settings-section {
- margin: 0 0 15px 0;
-}
-
.settings-experiments-warning-subsection-warning {
color: rgb(200, 0, 0);
}
@@ -160,10 +147,6 @@ fieldset {
padding: 0;
}
-.settings-tab input.numeric {
- text-align: right;
-}
-
.settings-tab-container {
flex: auto;
overflow: hidden;
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/settings/settings_strings.grdp b/chromium/third_party/blink/renderer/devtools/front_end/settings/settings_strings.grdp
new file mode 100644
index 00000000000..594f0c99f0c
--- /dev/null
+++ b/chromium/third_party/blink/renderer/devtools/front_end/settings/settings_strings.grdp
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<grit-part>
+ <message name="IDS_DEVTOOLS_0f653ae68147586eb189d7baf37a696a" desc="">
+ Restore defaults and reload
+ </message>
+ <message name="IDS_DEVTOOLS_29e9d8e295b1d5b3002d2d3d5baa4c37" desc="">
+ Shortcuts
+ </message>
+ <message name="IDS_DEVTOOLS_2cce43a6505a5d1bdf7ea98bf7fd1bc8" desc="">
+ Blackbox
+ </message>
+ <message name="IDS_DEVTOOLS_331f303e56b067dd84abf94c3bd349c4" desc="">
+ Framework Blackboxing
+ </message>
+ <message name="IDS_DEVTOOLS_4829262cecb9828817b33e0f9c907f91" desc="">
+ Experiments
+ </message>
+ <message name="IDS_DEVTOOLS_57391192dfa1f247ad015a0fe2eca48e" desc="">
+ Pattern
+ </message>
+ <message name="IDS_DEVTOOLS_89bacc9715d030658f2602ce65426a7f" desc="">
+ WARNING:
+ </message>
+ <message name="IDS_DEVTOOLS_ae25bc3ceebf44be4b59d0ade0e53f0b" desc="">
+ No blackboxed patterns
+ </message>
+ <message name="IDS_DEVTOOLS_b39a035a995fc6597c8eb942210d1527" desc="">
+ Behavior
+ </message>
+ <message name="IDS_DEVTOOLS_b791f463c10f80e87e887e1f863f6209" desc="">
+ Add pattern...
+ </message>
+ <message name="IDS_DEVTOOLS_c745d3ac390f120535d734cd14e2f6aa" desc="">
+ Blackbox content scripts (extension scripts in the page)
+ </message>
+ <message name="IDS_DEVTOOLS_c9deece3e6de26d07ef6409b96f21fd0" desc="">
+ Blackboxing
+ </message>
+ <message name="IDS_DEVTOOLS_ce85958ff51e825dcf797d0451b96b71" desc="">
+ Blackbox scripts whose names match
+ </message>
+ <message name="IDS_DEVTOOLS_d0834fcec6337785ee749c8f5464f6f6" desc="">
+ Preferences
+ </message>
+ <message name="IDS_DEVTOOLS_d2ef7dcdede23820e315ca1c3425ba4f" desc="">
+ Debugger will skip through the scripts and will not stop on exceptions thrown by them.
+ </message>
+ <message name="IDS_DEVTOOLS_e3b2f7d0af9c89f5ea504968ffcd2ef0" desc="">
+ These experiments could be dangerous and may require restart.
+ </message>
+ <message name="IDS_DEVTOOLS_ffebb5ad32e2b253aa418b8d7a70028e" desc="">
+ Blackbox content scripts
+ </message>
+</grit-part> \ No newline at end of file
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/snippets/snippets_strings.grdp b/chromium/third_party/blink/renderer/devtools/front_end/snippets/snippets_strings.grdp
new file mode 100644
index 00000000000..7f0cb369bc9
--- /dev/null
+++ b/chromium/third_party/blink/renderer/devtools/front_end/snippets/snippets_strings.grdp
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<grit-part>
+ <message name="IDS_DEVTOOLS_b1d75786654fa93f10c31c3b544bbd03" desc="">
+ Run snippet
+ </message>
+ <message name="IDS_DEVTOOLS_e0fe9b9cadde935642ad15a85c79d7b1" desc="">
+ No snippets found.
+ </message>
+</grit-part> \ No newline at end of file
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/source_frame/SourceFrame.js b/chromium/third_party/blink/renderer/devtools/front_end/source_frame/SourceFrame.js
index 1a7f0ce81d0..7b7e6625d18 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/source_frame/SourceFrame.js
+++ b/chromium/third_party/blink/renderer/devtools/front_end/source_frame/SourceFrame.js
@@ -733,7 +733,7 @@ SourceFrame.SourceFrame = class extends UI.SimpleView {
let textRange = selections[0];
if (textRange.isEmpty()) {
const location = this._prettyToRawLocation(textRange.endLine, textRange.endColumn);
- this._sourcePosition.setText(`Line ${location[0] + 1}, Column ${location[1] + 1}`);
+ this._sourcePosition.setText(ls`Line ${location[0] + 1}, Column ${location[1] + 1}`);
return;
}
textRange = textRange.normalize();
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/source_frame/source_frame_strings.grdp b/chromium/third_party/blink/renderer/devtools/front_end/source_frame/source_frame_strings.grdp
new file mode 100644
index 00000000000..a1d41c70f56
--- /dev/null
+++ b/chromium/third_party/blink/renderer/devtools/front_end/source_frame/source_frame_strings.grdp
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="utf-8"?>
+<grit-part>
+ <message name="IDS_DEVTOOLS_0818b6e40afc14684d727176bd222aa0" desc="">
+ Set indentation to 2 spaces
+ </message>
+ <message name="IDS_DEVTOOLS_194f5394ae2e9c74dc3c441b92862d1d" desc="">
+ Font
+ </message>
+ <message name="IDS_DEVTOOLS_22a4f3a07431f171506336782f211c61" desc="">
+ Drop image file here
+ </message>
+ <message name="IDS_DEVTOOLS_261e3ec3b2545f38725d7bfe67146cc6" desc="">
+ Set indentation to 8 spaces
+ </message>
+ <message name="IDS_DEVTOOLS_33443fc55632401a517b16878389f2f6" desc="">
+ Set indentation to 4 spaces
+ </message>
+ <message name="IDS_DEVTOOLS_4cfa6c981549e990fe2344e4c805405e" desc="">
+ Find
+ </message>
+ <message name="IDS_DEVTOOLS_59cc7cb8dfb2491cc5dfe8ebc546d797" desc="">
+ Pretty print
+ </message>
+ <message name="IDS_DEVTOOLS_5ada9c9e1dad2e7e20aaa7688d7bd6c7" desc="">
+ Line <ph name="LOCATION_______">$1s</ph>, Column <ph name="LOCATION_______">$2s</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_6efb3f8d955fc3395726044acec66129" desc="">
+ <ph name="THIS__IMAGEPREVIEWELEMENT_NATURALWIDTH">$1d</ph> × <ph name="THIS__IMAGEPREVIEWELEMENT_NATURALHEIGHT">$2d</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_700a6fe957fe2782a2412e4397bce276" desc="">
+ Open image in new tab
+ </message>
+ <message name="IDS_DEVTOOLS_70a0a440eed4f94a3632d346b03d9a53" desc="">
+ 2 spaces
+ </message>
+ <message name="IDS_DEVTOOLS_7894a953b2e5c818b263e862929417f3" desc="">
+ Tab character
+ </message>
+ <message name="IDS_DEVTOOLS_84ce71f0603df8984b0adcf5248189e3" desc="">
+ Copy image URL
+ </message>
+ <message name="IDS_DEVTOOLS_89733eed06340faa760afff3b68a90ba" desc="">
+ <ph name="SELECTEDTEXT_LENGTH">$1d</ph> characters selected
+ </message>
+ <message name="IDS_DEVTOOLS_a04563146775acda156e27c41a068e65" desc="">
+ Nothing to preview
+ </message>
+ <message name="IDS_DEVTOOLS_abd971c026bf77d9ed737cebeed94889" desc="">
+ Default indentation:
+ </message>
+ <message name="IDS_DEVTOOLS_af70cf4b9f56cd69eb56ae32f21e8416" desc="">
+ <ph name="SELECTIONS_LENGTH">$1d</ph> selection regions
+ </message>
+ <message name="IDS_DEVTOOLS_be53a0541a6d36f6ecb879fa2c584b08" desc="">
+ Image
+ </message>
+ <message name="IDS_DEVTOOLS_c144a6b9ff31ca0302b1cf94d4d540a0" desc="">
+ <ph name="TEXTRANGE_ENDLINE___TEXTRANGE_STARTLINE____">$1d</ph> lines, <ph name="SELECTEDTEXT_LENGTH">$2d</ph> characters selected
+ </message>
+ <message name="IDS_DEVTOOLS_d7c4338058e90b2cad7c9ff93588c1ec" desc="">
+ 8 spaces
+ </message>
+ <message name="IDS_DEVTOOLS_ea1fe1846b8a6d69ebf101a05a5fc194" desc="">
+ Copy image as data URI
+ </message>
+ <message name="IDS_DEVTOOLS_fb49df2db96d183474fb9e954a9f0e52" desc="">
+ Set indentation to tab character
+ </message>
+ <message name="IDS_DEVTOOLS_fb61758d0f0fda4ba867c3d5a46c16a7" desc="">
+ Sources
+ </message>
+ <message name="IDS_DEVTOOLS_fe81050cdc3adc7c1912fc08b7aec77f" desc="">
+ 4 spaces
+ </message>
+</grit-part> \ No newline at end of file
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/sources/breakpointEditDialog.css b/chromium/third_party/blink/renderer/devtools/front_end/sources/breakpointEditDialog.css
index b10996702b7..39009ebbeb2 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/sources/breakpointEditDialog.css
+++ b/chromium/third_party/blink/renderer/devtools/front_end/sources/breakpointEditDialog.css
@@ -35,8 +35,3 @@
font-family: sans-serif;
font-size: 12px;
}
-
-:host-context(.sources-edit-breakpoint-dialog) .source-frame-breakpoint-editor:hover,
-:host-context(.sources-edit-breakpoint-dialog) .source-frame-breakpoint-editor:focus-within {
- box-shadow: var(--focus-ring-inactive-shadow);
-}
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/sources/module.json b/chromium/third_party/blink/renderer/devtools/front_end/sources/module.json
index cbe60290464..f3e264a3a43 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/sources/module.json
+++ b/chromium/third_party/blink/renderer/devtools/front_end/sources/module.json
@@ -933,9 +933,7 @@
"javaScriptBreakpointsSidebarPane.css",
"navigatorTree.css",
"navigatorView.css",
- "revisionHistory.css",
"scopeChainSidebarPane.css",
- "serviceWorkersSidebar.css",
"sourcesPanel.css",
"sourcesView.css",
"threadsSidebarPane.css",
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/sources/revisionHistory.css b/chromium/third_party/blink/renderer/devtools/front_end/sources/revisionHistory.css
deleted file mode 100644
index e8144aa401f..00000000000
--- a/chromium/third_party/blink/renderer/devtools/front_end/sources/revisionHistory.css
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright (C) 2012 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- * its contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-.revision-history-link {
- text-decoration: underline;
- cursor: pointer;
- color: #00e;
- padding: 0 4px;
-}
-
-.revision-history-link-row {
- padding-left: 16px;
-}
-
-li.revision-history-line {
- padding-left: 6px;
- -webkit-user-select: text;
-}
-
-.webkit-line-number {
- border-right: 1px solid #BBB;
- background-color: #F0F0F0;
-}
-
-li.revision-history-revision {
- padding-left: 16px;
-}
-
-.revision-history-line-added {
- background-color: rgb(153, 238, 153);
-}
-
-.revision-history-line-removed {
- background-color: rgb(255, 221, 221);
-}
-
-.revision-history-line-separator .webkit-line-number {
- color: transparent;
-}
-
-.revision-history-line {
- white-space: nowrap;
-}
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/sources/serviceWorkersSidebar.css b/chromium/third_party/blink/renderer/devtools/front_end/sources/serviceWorkersSidebar.css
index dc867f31d8a..0df08cc128f 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/sources/serviceWorkersSidebar.css
+++ b/chromium/third_party/blink/renderer/devtools/front_end/sources/serviceWorkersSidebar.css
@@ -14,12 +14,3 @@
.service-worker:last-child {
border-bottom: none;
}
-
-.service-worker-scope {
- color: #777;
- flex: auto;
- margin: 5px 5px 0 0;
- white-space: nowrap;
- overflow: hidden;
- text-overflow: ellipsis;
-}
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/sources/sourcesPanel.css b/chromium/third_party/blink/renderer/devtools/front_end/sources/sourcesPanel.css
index 17d4d4aff62..05c22cdaa68 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/sources/sourcesPanel.css
+++ b/chromium/third_party/blink/renderer/devtools/front_end/sources/sourcesPanel.css
@@ -56,14 +56,6 @@
height: 28px;
}
-.panel.sources .sidebar-pane-stack {
- overflow: auto;
-}
-
-.cursor-pointer {
- cursor: pointer;
-}
-
.cursor-auto {
cursor: auto;
}
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/sources/sourcesView.css b/chromium/third_party/blink/renderer/devtools/front_end/sources/sourcesView.css
index 8fe79b5786f..d28dab81ffe 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/sources/sourcesView.css
+++ b/chromium/third_party/blink/renderer/devtools/front_end/sources/sourcesView.css
@@ -46,11 +46,6 @@
cursor: default;
}
-.sources-toolbar-spacer {
- flex: auto;
- pointer-events: none;
-}
-
.source-frame-debugger-script {
background-color: rgba(255, 255, 194, 0.5);
}
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/sources/sources_strings.grdp b/chromium/third_party/blink/renderer/devtools/front_end/sources/sources_strings.grdp
new file mode 100644
index 00000000000..eadd29dca5a
--- /dev/null
+++ b/chromium/third_party/blink/renderer/devtools/front_end/sources/sources_strings.grdp
@@ -0,0 +1,483 @@
+<?xml version="1.0" encoding="utf-8"?>
+<grit-part>
+ <message name="IDS_DEVTOOLS_00a2f9d16aa26eb89a776a3d1ed4f9cd" desc="">
+ Expression to check before pausing, e.g. x &gt; 5
+ </message>
+ <message name="IDS_DEVTOOLS_01f0097c3b7f0774139005734eacbae4" desc="">
+ Add property path to watch
+ </message>
+ <message name="IDS_DEVTOOLS_035e70b676c1a7f341f758eb10a3bd1d" desc="">
+ Add conditional breakpoint…
+ </message>
+ <message name="IDS_DEVTOOLS_03bfaee27b3b5cfb28deef84a0f416e5" desc="">
+ Threads
+ </message>
+ <message name="IDS_DEVTOOLS_03c2e7e41ffc181a4e84080b4710e81e" desc="">
+ New
+ </message>
+ <message name="IDS_DEVTOOLS_05184fe2fb6c76214bc56796837f1c9b" desc="">
+ Next call frame
+ </message>
+ <message name="IDS_DEVTOOLS_06a75795f2a3be3930c707d64fd488c0" desc="">
+ Show trailing whitespace characters
+ </message>
+ <message name="IDS_DEVTOOLS_08355a3ae65d425a4a6bac94ce97dcb4" desc="">
+ Edit breakpoint…
+ </message>
+ <message name="IDS_DEVTOOLS_08fb8cd30c88d3b186962bb2c3226479" desc="">
+ Enabled all breakpoints in line
+ </message>
+ <message name="IDS_DEVTOOLS_0ab9daf7d77e9446aeae5f66be24e800" desc="">
+ Never pause here
+ </message>
+ <message name="IDS_DEVTOOLS_0b7328e087472930bcd6e51a840bb454" desc="">
+ Open color picker.
+ </message>
+ <message name="IDS_DEVTOOLS_0c2c743a6d4f5bb5d3689cd87f7f5e1b" desc="">
+ Disable CSS source maps
+ </message>
+ <message name="IDS_DEVTOOLS_0d09bbb2a0380f333de821bf7b3aec61" desc="">
+ Not paused
+ </message>
+ <message name="IDS_DEVTOOLS_1223c0b07c7cf71289fa7f390c192ab5" desc="">
+ Bracket matching
+ </message>
+ <message name="IDS_DEVTOOLS_127c3c0187f2be68a7c19273f4d8a71b" desc="">
+ Delete all watch expressions
+ </message>
+ <message name="IDS_DEVTOOLS_14acf8c40287aedb6124add396f6d1c5" desc="">
+ Local Modifications...
+ </message>
+ <message name="IDS_DEVTOOLS_160023e58c0251b10b570f6b43914bfc" desc="">
+ Drop workspace folder here
+ </message>
+ <message name="IDS_DEVTOOLS_1cd54499835432c724e9654327ca5788" desc="">
+ Code folding
+ </message>
+ <message name="IDS_DEVTOOLS_1ced1baad9bf7cd516caae0aa7558853" desc="">
+ Debugger paused
+ </message>
+ <message name="IDS_DEVTOOLS_1d76fdc8e9a79fa435ee5a2afa4c9bb8" desc="">
+ Paused before potential out-of-memory crash
+ </message>
+ <message name="IDS_DEVTOOLS_1f15646f60fc3c1dea747963f02d51ac" desc="">
+ Group by folder
+ </message>
+ <message name="IDS_DEVTOOLS_216a9080bf22a993b2d7f9331d34cc68" desc="">
+ Don&apos;t pause on exceptions
+ </message>
+ <message name="IDS_DEVTOOLS_23682ad11e062879a37272dce2948fa5" desc="">
+ Clear configuration
+ </message>
+ <message name="IDS_DEVTOOLS_25eeda4a035b17ed5a353480e79dc6fb" desc="">
+ Do not detect indentation
+ </message>
+ <message name="IDS_DEVTOOLS_26fff70cf6b5204fa5154fa62f5b7b69" desc="">
+ Add to watch
+ </message>
+ <message name="IDS_DEVTOOLS_27cd6a52dd9de75342d5115dc6bca6ba" desc="">
+ Associated files are available via file tree or <ph name="UI_SHORTCUTREGISTRY_SHORTCUTTITLEFORACTION__QUICKOPEN_SHOW__">$1s</ph>.
+ </message>
+ <message name="IDS_DEVTOOLS_30af0d86fe286708503f94e65c4da3f6" desc="">
+ Paused on breakpoint
+ </message>
+ <message name="IDS_DEVTOOLS_30e71ab6fb45b9773731a0af4d7fb3b4" desc="">
+ Do not show whitespace characters
+ </message>
+ <message name="IDS_DEVTOOLS_327cbc7239d92013006f601d8b9aff8f" desc="">
+ Remove folder from workspace
+ </message>
+ <message name="IDS_DEVTOOLS_33121362971f65350982fbfea136c37d" desc="">
+ Log a message to Console, do not break
+ </message>
+ <message name="IDS_DEVTOOLS_339ba442656bbc8e43e64b427dc598ff" desc="">
+ Type a number to go to that line.
+ </message>
+ <message name="IDS_DEVTOOLS_3486ec2a2dd86270ed12b46a54372d06" desc="">
+ Blackbox all content scripts
+ </message>
+ <message name="IDS_DEVTOOLS_348b4e067738aac6d7d6c30ccdb59beb" desc="">
+ Source Map detected.
+ </message>
+ <message name="IDS_DEVTOOLS_34b75062caaa3ec1d9e1ee9b725ae303" desc="">
+ Do not automatically reveal files in sidebar
+ </message>
+ <message name="IDS_DEVTOOLS_37d2aa45fbe4026fc347be7b07a8a468" desc="">
+ Deactivate breakpoints
+ </message>
+ <message name="IDS_DEVTOOLS_38173eb2f7725d12dfcf1a920a77ecb4" desc="">
+ Create new snippet
+ </message>
+ <message name="IDS_DEVTOOLS_3831f64f248899a06a6bbc8b82fccfdf" desc="">
+ Log message, e.g. &apos;x is&apos;, x
+ </message>
+ <message name="IDS_DEVTOOLS_38b6dddcf45b3d2c9fc86ce4dd2592ba" desc="">
+ Add expression
+ </message>
+ <message name="IDS_DEVTOOLS_3a4c2017c43ba6b63be4576d17893645" desc="">
+ Source map found, but ignored for blackboxed file.
+ </message>
+ <message name="IDS_DEVTOOLS_3a9bd88b445fd1f4d4d8c3ce995be74a" desc="">
+ Step over next function call
+ </message>
+ <message name="IDS_DEVTOOLS_3e27fe84bd1fddd585c8d06e6307b67a" desc="">
+ Remove all breakpoints in line
+ </message>
+ <message name="IDS_DEVTOOLS_3fd3dddd9661349b90b648bba2748f1b" desc="">
+ Sources panel
+ </message>
+ <message name="IDS_DEVTOOLS_41c03dfb0ea5890d60756ad55c6e47b1" desc="">
+ Detect indentation
+ </message>
+ <message name="IDS_DEVTOOLS_434a4d8ac15ff124add730be03574f41" desc="">
+ Enable all breakpoints
+ </message>
+ <message name="IDS_DEVTOOLS_4541d5953fd7db4d62ef89e9717f845a" desc="">
+ Disable autocompletion
+ </message>
+ <message name="IDS_DEVTOOLS_46e8256224399a2d32a2f988a21d6562" desc="">
+ Select folder for overrides
+ </message>
+ <message name="IDS_DEVTOOLS_47dbdb85aee276cd77a84a067af48aa5" desc="">
+ Enable tab moves focus
+ </message>
+ <message name="IDS_DEVTOOLS_48c7c41b72e1d678923ce3571aa65b2d" desc="">
+ Step
+ </message>
+ <message name="IDS_DEVTOOLS_4b3812a22a58f04fb5a0598658a3bd27" desc="">
+ Go to symbol
+ </message>
+ <message name="IDS_DEVTOOLS_4ba67b3e9f4bf3135a50fa54c133fba6" desc="">
+ Conditional breakpoint
+ </message>
+ <message name="IDS_DEVTOOLS_4bc16757f0e30f62902ac7f86f19b23b" desc="">
+ Show function definition
+ </message>
+ <message name="IDS_DEVTOOLS_51eb42e9c7ed7951fea0d51a1e4a2cfc" desc="">
+ Go to line <ph name="POSITION_LINE">$1s</ph>.
+ </message>
+ <message name="IDS_DEVTOOLS_520d0db389f362bf79ef56ca0af3dcab" desc="">
+ Format
+ </message>
+ <message name="IDS_DEVTOOLS_52b3bc5e77aa070243c36cd40a4d6b6d" desc="">
+ Autocompletion
+ </message>
+ <message name="IDS_DEVTOOLS_58943fa26a94bc86f7f45106080e4496" desc="">
+ Resume script execution
+ </message>
+ <message name="IDS_DEVTOOLS_590d0b32e1139c6c3bcb0f99ed978dff" desc="">
+ subtree modifications
+ </message>
+ <message name="IDS_DEVTOOLS_5a0a64ecca63ba9a006b6397cbdc2b8c" desc="">
+ Go to line
+ </message>
+ <message name="IDS_DEVTOOLS_5a3bb6a64da384e59876cd0bc00a6eae" desc="">
+ Unblackbox this script
+ </message>
+ <message name="IDS_DEVTOOLS_5bcc1f50ed61246502d37ce93368dda8" desc="">
+ Paused on XHR or fetch
+ </message>
+ <message name="IDS_DEVTOOLS_5d113f2038d289f391614c39043629e8" desc="">
+ Scope
+ </message>
+ <message name="IDS_DEVTOOLS_5e7d63192de1cf31345f98b0252bc523" desc="">
+ &lt;not available&gt;
+ </message>
+ <message name="IDS_DEVTOOLS_6005268f51bade5b1f650b47b7ff68ff" desc="">
+ Stop blackboxing all content scripts
+ </message>
+ <message name="IDS_DEVTOOLS_610fbde3ea8bddc086a8f50a83f0fedf" desc="">
+ Previous call frame
+ </message>
+ <message name="IDS_DEVTOOLS_6121be69f70b38551bf15d90d0806778" desc="">
+ Automatically reveal files in sidebar
+ </message>
+ <message name="IDS_DEVTOOLS_61cb6bc6751fc6b516847995380fdced" desc="">
+ New snippet
+ </message>
+ <message name="IDS_DEVTOOLS_64c5d2b51d86c5e1d22a77a4ea5ed174" desc="">
+ Disable code folding
+ </message>
+ <message name="IDS_DEVTOOLS_6700b68e0b1cd0ed13778682cc1b376d" desc="">
+ Enable code folding
+ </message>
+ <message name="IDS_DEVTOOLS_681e10aecbafd7dd385fa51798ca0fd6" desc="">
+ New file
+ </message>
+ <message name="IDS_DEVTOOLS_686182a69271ee4d9caa32b17ad56e9f" desc="">
+ Show whitespace characters:
+ </message>
+ <message name="IDS_DEVTOOLS_68b3c10a88384bc903eb0bcb08f5e17c" desc="">
+ Disable JavaScript source maps
+ </message>
+ <message name="IDS_DEVTOOLS_69a309503a6b6e3265981a5db92c82ac" desc="">
+ Paused on promise rejection
+ </message>
+ <message name="IDS_DEVTOOLS_6bb8aa3b54918eeb27dafcace1e5addd" desc="">
+ (no domain)
+ </message>
+ <message name="IDS_DEVTOOLS_6cc39b227b3571623cfa817ed5df1c8b" desc="">
+ Disable all breakpoints
+ </message>
+ <message name="IDS_DEVTOOLS_6e0fdbff6068d8b45cac1f4ae39d6798" desc="">
+ Enable autocompletion
+ </message>
+ <message name="IDS_DEVTOOLS_6f92b50cf0c9932b9359e4cfa2a6473b" desc="">
+ Restart frame
+ </message>
+ <message name="IDS_DEVTOOLS_70f2eb480d2c49d1ca88ba9da0af545a" desc="">
+ Debugger will skip stepping through this script, and will not stop on exceptions
+ </message>
+ <message name="IDS_DEVTOOLS_7129472c5eb598faf47e4e877f2618fd" desc="">
+ Breakpoint
+ </message>
+ <message name="IDS_DEVTOOLS_74313a1b4f28fd0980e0c7677b38373c" desc="">
+ Show all whitespace characters
+ </message>
+ <message name="IDS_DEVTOOLS_74662a9a81d3f50d9d1f3dddf044b550" desc="">
+ Exclude folder
+ </message>
+ <message name="IDS_DEVTOOLS_74ff4bad28abee3489bd8ca138b80bb6" desc="">
+ No files found
+ </message>
+ <message name="IDS_DEVTOOLS_77898d40c8a26a07d05eedb991359804" desc="">
+ (source mapped from <ph name="COMPONENTS_LINKIFIER_LINKIFYURL_ORIGINURL_">$1s</ph>)
+ </message>
+ <message name="IDS_DEVTOOLS_7b5c591188e24ed71b8c72b32e86af5e" desc="">
+ Disable all breakpoints in line
+ </message>
+ <message name="IDS_DEVTOOLS_7e469e0762bb1a977747a18457c2e66f" desc="">
+ Show blackboxed frames
+ </message>
+ <message name="IDS_DEVTOOLS_80bd21c435b5e5ba6890161f3bc4bfd7" desc="">
+ Search in folder
+ </message>
+ <message name="IDS_DEVTOOLS_820587f2a3808a99f9ffcc0576b31681" desc="">
+ Make a copy…
+ </message>
+ <message name="IDS_DEVTOOLS_8317db413bca5e9ed3305fdac525ddd2" desc="">
+ No variables
+ </message>
+ <message name="IDS_DEVTOOLS_8560d166d251804230566118358414e5" desc="">
+ Add watch expression
+ </message>
+ <message name="IDS_DEVTOOLS_87837d0ddaa832891236be71b7bf6935" desc="">
+ Pause on caught exceptions
+ </message>
+ <message name="IDS_DEVTOOLS_906646d2d69e110dcd4cfc74e5790f6f" desc="">
+ Paused on event listener
+ </message>
+ <message name="IDS_DEVTOOLS_923dab99a01b578dbf1ec09277a0ed2e" desc="">
+ Rename…
+ </message>
+ <message name="IDS_DEVTOOLS_945efe35b9e3950bd1a796a9310736a6" desc="">
+ Go to line <ph name="POSITION_LINE">$1s</ph> and column <ph name="POSITION_COLUMN">$2s</ph>.
+ </message>
+ <message name="IDS_DEVTOOLS_9757132fffae1fe86f7c3329dc189e8d" desc="">
+ Paused on exception
+ </message>
+ <message name="IDS_DEVTOOLS_97edd5423acfdf412ad9ba7f4eaa6d39" desc="">
+ No file selected.
+ </message>
+ <message name="IDS_DEVTOOLS_9bbb0377ecbf31fdcfcce3283e815311" desc="">
+ Ctrl+Enter
+ </message>
+ <message name="IDS_DEVTOOLS_9ce5614862050d067b2fca22f4190d12" desc="">
+ Source map URL:
+ </message>
+ <message name="IDS_DEVTOOLS_9db6195620a7743228ce74addf1414d8" desc="">
+ Associated files should be added to the file tree. You can debug these resolved source files as regular JavaScript files.
+ </message>
+ <message name="IDS_DEVTOOLS_9f7753821d867a81273a50de2b1e0cac" desc="">
+ Pause script execution
+ </message>
+ <message name="IDS_DEVTOOLS_a0b40b72aff4851f0c49348f8868b935" desc="">
+ Disable bracket matching
+ </message>
+ <message name="IDS_DEVTOOLS_a17411e9872c82855a0dc0d000e50c22" desc="">
+ Call Stack
+ </message>
+ <message name="IDS_DEVTOOLS_a1942a7798767819b93df38c18d1696d" desc="">
+ Display variable values inline while debugging
+ </message>
+ <message name="IDS_DEVTOOLS_a22d670bd986f8f534fe07a96b38f217" desc="">
+ Add logpoint…
+ </message>
+ <message name="IDS_DEVTOOLS_a271d86904edd95b1e28f6df6c74c9ac" desc="">
+ Disable tab moves focus
+ </message>
+ <message name="IDS_DEVTOOLS_a2c01e3ac442e470bc38437752707518" desc="">
+ Return value
+ </message>
+ <message name="IDS_DEVTOOLS_a2ca04f270c5acfa0cda3aa0fc6976c5" desc="">
+ Do not search in anonymous and content scripts
+ </message>
+ <message name="IDS_DEVTOOLS_a3fec1fa9178602843f79537c66b1496" desc="">
+ Step out of current function
+ </message>
+ <message name="IDS_DEVTOOLS_a570cb902fdec05031ec1a25634bdbdb" desc="">
+ Open a JavaScript or CSS file to see symbols
+ </message>
+ <message name="IDS_DEVTOOLS_a6e75eb31dc77e8d077fb6f92909e191" desc="">
+ Open folder
+ </message>
+ <message name="IDS_DEVTOOLS_a7706b6eb022a90c58cf658d0085d6d1" desc="">
+ Possible ways to cancel this behavior are:
+ </message>
+ <message name="IDS_DEVTOOLS_a95c3c1dc2719e527889096bbd7b662c" desc="">
+ Search in all files
+ </message>
+ <message name="IDS_DEVTOOLS_abe5b14af1d1b81dffc5d6009dead621" desc="">
+ Pause only when the condition is true
+ </message>
+ <message name="IDS_DEVTOOLS_ac52cf637478f3656a1fdee5c02324fd" desc="">
+ Filesystem
+ </message>
+ <message name="IDS_DEVTOOLS_acd2fcf9aed3ee59e77566016a828d14" desc="">
+ Paused on debugged function
+ </message>
+ <message name="IDS_DEVTOOLS_ae76c8d643589ff25d35455a80f12061" desc="">
+ Do not display variable values inline while debugging
+ </message>
+ <message name="IDS_DEVTOOLS_b16d05636bde9fe84392fd4af198e9c1" desc="">
+ Quick source
+ </message>
+ <message name="IDS_DEVTOOLS_b1a3aaa0de38001a39eeaf44c523a98c" desc="">
+ Changes to this file were not saved to file system.
+ </message>
+ <message name="IDS_DEVTOOLS_b2accffe28bb4f4b596c9be64a28d281" desc="">
+ Snippets
+ </message>
+ <message name="IDS_DEVTOOLS_b402b605feaea6029ac976f4963e20cd" desc="">
+ Are you sure you want to close unsaved file: <ph name="UISOURCECODE_NAME__">$1s</ph>?
+ </message>
+ <message name="IDS_DEVTOOLS_b526d5bfa95ab0d53b118425336d52a3" desc="">
+ Are you sure you want to remove this folder?
+ </message>
+ <message name="IDS_DEVTOOLS_b55fd1bae7b054568efa40f60f5b6c43" desc="">
+ Enable CSS source maps
+ </message>
+ <message name="IDS_DEVTOOLS_b7e7eecbc4a9a1151ccae2f9c5aa7b14" desc="">
+ Trailing
+ </message>
+ <message name="IDS_DEVTOOLS_b8f2563abb6a5253a6f11f95be0b9b62" desc="">
+ Open in Sources panel
+ </message>
+ <message name="IDS_DEVTOOLS_b918846bd0a77b2051d8c4019201315f" desc="">
+ Remove other breakpoints
+ </message>
+ <message name="IDS_DEVTOOLS_b9947e230aa5ac451e3b0649bdb1c7fc" desc="">
+ DevTools have unsaved changes that will be permanently lost.
+ </message>
+ <message name="IDS_DEVTOOLS_bb9f288b958ce8c8d250cb392e2f1309" desc="">
+ You can click the <ph name="TOOLBAR_ELEMENT">$1s</ph> button on the bottom status bar, and continue debugging with the new formatted source.
+ </message>
+ <message name="IDS_DEVTOOLS_bd1066101df937dfc5704f95ef779f62" desc="">
+ No watch expressions
+ </message>
+ <message name="IDS_DEVTOOLS_c081841ffd8efaef2ee0c7bf0507758a" desc="">
+ Enable bracket matching
+ </message>
+ <message name="IDS_DEVTOOLS_c12de9f9edb401ca79a3291f1831ae6f" desc="">
+ Closure (<ph name="UI_BEAUTIFYFUNCTIONNAME_SCOPENAME_">$1s</ph>)
+ </message>
+ <message name="IDS_DEVTOOLS_c2e59ab4f410655458110ae524bdc9be" desc="">
+ Go to &quot;<ph name="COMMON_UISTRING__BLACKBOXING__">$1s</ph>&quot; tab in settings
+ </message>
+ <message name="IDS_DEVTOOLS_c322e65e12002c3bd486ff62ff5b1fd6" desc="">
+ node removal
+ </message>
+ <message name="IDS_DEVTOOLS_c42094126c68a61cc5359460681e1d90" desc="">
+ ⌘+Enter
+ </message>
+ <message name="IDS_DEVTOOLS_c5301693c4e792bcd5a479ef38fb8f8d" desc="">
+ Run
+ </message>
+ <message name="IDS_DEVTOOLS_c70f6a5cffc2538db7304f46556f0b30" desc="">
+ Add selected text to watches
+ </message>
+ <message name="IDS_DEVTOOLS_c79e1cbadc868bad54f2eabe113c06f0" desc="">
+ Enable breakpoint
+ </message>
+ <message name="IDS_DEVTOOLS_cd26a6a87959e99fdf99f5ccccef0464" desc="">
+ Disable breakpoint
+ </message>
+ <message name="IDS_DEVTOOLS_d07d651006c823c6f008158f6eb63056" desc="">
+ Resume with all pauses blocked for 500 ms
+ </message>
+ <message name="IDS_DEVTOOLS_d127dbe7fc7834601145be34349fc60f" desc="">
+ Evaluate selected text in console
+ </message>
+ <message name="IDS_DEVTOOLS_d13c3f7baed576768b11a714ef4d90e2" desc="">
+ paused
+ </message>
+ <message name="IDS_DEVTOOLS_d19dc64c372f09800d8117286c3d0aff" desc="">
+ Breakpoints
+ </message>
+ <message name="IDS_DEVTOOLS_d1d71571592bcbb9f99bf726a9d0fe0a" desc="">
+ Delete watch expression
+ </message>
+ <message name="IDS_DEVTOOLS_d280677ba371231189ef4c4fdaa9b4b3" desc="">
+ Pretty-print this minified file?
+ </message>
+ <message name="IDS_DEVTOOLS_d318592071e92890f8046b4eeeecbdf1" desc="">
+ attribute modifications
+ </message>
+ <message name="IDS_DEVTOOLS_d6444e40ec843a5dc64161f9eafe07a4" desc="">
+ Logpoint
+ </message>
+ <message name="IDS_DEVTOOLS_da1c6b95e46b078b40e1a53bc7c44f17" desc="">
+ Step into next function call
+ </message>
+ <message name="IDS_DEVTOOLS_dab88f58b06d64f6f2b0c157580c8d36" desc="">
+ Add source map…
+ </message>
+ <message name="IDS_DEVTOOLS_db49f36ab9f08d646ff4416ab5009ab9" desc="">
+ This script is blackboxed in debugger
+ </message>
+ <message name="IDS_DEVTOOLS_dbcfcc422f1a9f6e817bb7670a93f7d3" desc="">
+ Are you sure you want to exclude this folder?
+ </message>
+ <message name="IDS_DEVTOOLS_de1b7eb1c5cad7712d521bade538de6e" desc="">
+ Search in anonymous and content scripts
+ </message>
+ <message name="IDS_DEVTOOLS_e3de97b1a66edbe3fceddb1d5db2df2d" desc="">
+ Copy value
+ </message>
+ <message name="IDS_DEVTOOLS_e64479370fed877b3ff0b51ee73c95ac" desc="">
+ Reveal in sidebar
+ </message>
+ <message name="IDS_DEVTOOLS_e68f8487d76aeb933b5b06d7999a0e44" desc="">
+ Enable JavaScript source maps
+ </message>
+ <message name="IDS_DEVTOOLS_ed5eceb0fe85ceeeabf4b4b93eeca711" desc="">
+ Continue to here
+ </message>
+ <message name="IDS_DEVTOOLS_f0a47f037ca7a988466a647277ef1134" desc="">
+ Paused on assertion
+ </message>
+ <message name="IDS_DEVTOOLS_f20658650d987d31063b593c05980397" desc="">
+ Watch
+ </message>
+ <message name="IDS_DEVTOOLS_f2e95c3adb199ba9a0ec03526b6126ba" desc="">
+ Drop in a folder to add to workspace
+ </message>
+ <message name="IDS_DEVTOOLS_f395c33fe9c382316b99128e087cb697" desc="">
+ Close All
+ </message>
+ <message name="IDS_DEVTOOLS_f515d5945239e7a61fa267bd058134f1" desc="">
+ Add folder to workspace
+ </message>
+ <message name="IDS_DEVTOOLS_f96985d765ed09d4930d76a3ca869508" desc="">
+ Terminate current JavaScript call
+ </message>
+ <message name="IDS_DEVTOOLS_fd1be3efcf102a4183d9445d789574f4" desc="">
+ Are you sure you want to delete this file?
+ </message>
+ <message name="IDS_DEVTOOLS_fd8c5cf684c7bd30f907a74603e204ac" desc="">
+ Activate breakpoints
+ </message>
+ <message name="IDS_DEVTOOLS_fe6e43324287cedf01c16c9eb8d2b121" desc="">
+ Copy stack trace
+ </message>
+</grit-part> \ No newline at end of file
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/terminal/terminal_strings.grdp b/chromium/third_party/blink/renderer/devtools/front_end/terminal/terminal_strings.grdp
new file mode 100644
index 00000000000..a47f40cabef
--- /dev/null
+++ b/chromium/third_party/blink/renderer/devtools/front_end/terminal/terminal_strings.grdp
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<grit-part>
+ <message name="IDS_DEVTOOLS_514d8a494f087c0d549b9536c2ef3bd9" desc="">
+ Terminal
+ </message>
+ <message name="IDS_DEVTOOLS_69685b2a57646d0d0bc125b5f94f3931" desc="">
+ Terminal service is not available
+ </message>
+</grit-part> \ No newline at end of file
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/test_runner/TestRunner.js b/chromium/third_party/blink/renderer/devtools/front_end/test_runner/TestRunner.js
index d997b506750..abb4457fdac 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/test_runner/TestRunner.js
+++ b/chromium/third_party/blink/renderer/devtools/front_end/test_runner/TestRunner.js
@@ -242,6 +242,8 @@ TestRunner.createKeyEvent = function(key, ctrlKey, altKey, shiftKey, metaKey) {
};
/**
+ * Wraps a test function with an exception filter. Does not work
+ * correctly for async functions; use safeAsyncWrap instead.
* @param {!Function|undefined} func
* @param {!Function=} onexception
* @return {!Function}
@@ -268,6 +270,31 @@ TestRunner.safeWrap = function(func, onexception) {
};
/**
+ * Wraps a test function that returns a Promise with an exception
+ * filter. Does not work correctly for functions which don't return
+ * a Promise; use safeWrap instead.
+ * @param {function(...):Promise<*>} func
+ * @return {function(...):Promise<*>}
+ */
+TestRunner.safeAsyncWrap = function(func) {
+ /**
+ * @this {*}
+ */
+ async function result() {
+ if (!func)
+ return;
+ const wrapThis = this;
+ try {
+ return await func.apply(wrapThis, arguments);
+ } catch (e) {
+ TestRunner.addResult('Exception while running: ' + func + '\n' + (e.stack || e));
+ TestRunner.completeTest();
+ }
+ }
+ return result;
+};
+
+/**
* @param {!Node} node
* @return {string}
*/
@@ -1076,6 +1103,21 @@ TestRunner.runTestSuite = function(testSuite) {
};
/**
+ * @param {!Array<function():Promise<*>>} testSuite
+ */
+TestRunner.runAsyncTestSuite = async function(testSuite) {
+ for (const nextTest of testSuite) {
+ TestRunner.addResult('');
+ TestRunner.addResult(
+ 'Running: ' +
+ /function\s([^(]*)/.exec(nextTest)[1]);
+ await TestRunner.safeAsyncWrap(nextTest)();
+ }
+
+ TestRunner.completeTest();
+};
+
+/**
* @param {*} expected
* @param {*} found
* @param {string} message
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/text_editor/text_editor_strings.grdp b/chromium/third_party/blink/renderer/devtools/front_end/text_editor/text_editor_strings.grdp
new file mode 100644
index 00000000000..06bb4357fd9
--- /dev/null
+++ b/chromium/third_party/blink/renderer/devtools/front_end/text_editor/text_editor_strings.grdp
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<grit-part>
+ <message name="IDS_DEVTOOLS_55212da7537e29610e52134f4097f0b2" desc="">
+ Code editor
+ </message>
+</grit-part> \ No newline at end of file
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/timeline/TimelineUIUtils.js b/chromium/third_party/blink/renderer/devtools/front_end/timeline/TimelineUIUtils.js
index 7c64b4973eb..4242a120f51 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/timeline/TimelineUIUtils.js
+++ b/chromium/third_party/blink/renderer/devtools/front_end/timeline/TimelineUIUtils.js
@@ -1523,12 +1523,16 @@ Timeline.TimelineUIUtils = class {
total += aggregatedStats[categoryName];
const element = createElementWithClass('div', 'timeline-details-view-pie-chart-wrapper hbox');
- const pieChart = new PerfUI.PieChart(110, value => Number.preciseMillisToString(value), true);
+ const pieChart = new PerfUI.PieChart({
+ chartName: ls`Time spent in rendering`,
+ size: 110,
+ formatter: value => Number.preciseMillisToString(value),
+ showLegend: true,
+ });
pieChart.element.classList.add('timeline-details-view-pie-chart');
pieChart.setTotal(total);
const pieChartContainer = element.createChild('div', 'vbox');
pieChartContainer.appendChild(pieChart.element);
- const footerElement = element.createChild('div', 'timeline-aggregated-info-legend');
/**
* @param {string} name
@@ -1539,12 +1543,7 @@ Timeline.TimelineUIUtils = class {
function appendLegendRow(name, title, value, color) {
if (!value)
return;
- pieChart.addSlice(value, color);
- const rowElement = footerElement.createChild('div');
- rowElement.createChild('span', 'timeline-aggregated-legend-value').textContent =
- Number.preciseMillisToString(value, 1);
- rowElement.createChild('span', 'timeline-aggregated-legend-swatch').style.backgroundColor = color;
- rowElement.createChild('span', 'timeline-aggregated-legend-title').textContent = title;
+ pieChart.addSlice(value, color, title);
}
// In case of self time, first add self, then children of the same category.
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/timeline/timelinePanel.css b/chromium/third_party/blink/renderer/devtools/front_end/timeline/timelinePanel.css
index 7ee4ac9091a..225c6a9caf4 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/timeline/timelinePanel.css
+++ b/chromium/third_party/blink/renderer/devtools/front_end/timeline/timelinePanel.css
@@ -53,10 +53,6 @@
border-bottom: 1px solid #bbb;
}
-#timeline-overview-panel .timeline-graph-bar {
- pointer-events: none;
-}
-
#timeline-overview-grid {
background-color: rgb(255, 255, 255);
}
@@ -78,19 +74,6 @@
flex: auto;
}
-.timeline-view-stack {
- flex: auto;
- display: flex;
-}
-
-#timeline-container .devtools-link {
- color: inherit;
-}
-
-.timeline-graph-side.hovered {
- background-color: rgba(0, 0, 0, 0.05) !important;
-}
-
.timeline.panel .status-pane-container {
z-index: 1000;
display: flex;
@@ -189,45 +172,12 @@
height: 100%;
}
-#timeline-graphs {
- position: absolute;
- left: 0;
- right: 0;
- max-height: 100%;
- top: 20px;
-}
-
-.timeline-aggregated-legend-title {
- display: inline-block;
-}
-
-.timeline-aggregated-legend-value {
- display: inline-block;
- width: 70px;
- text-align: right;
-}
-
-.timeline-aggregated-legend-swatch {
- display: inline-block;
- width: 11px;
- height: 11px;
- margin: 0 6px;
- position: relative;
- top: 1px;
- border: 1px solid rgba(0, 0, 0, 0.2);
-}
-
.popover ul {
margin: 0;
padding: 0;
list-style-type: none;
}
-#resources-container-content {
- overflow: hidden;
- min-height: 100%;
-}
-
.memory-graph-label {
position: absolute;
right: 0;
@@ -278,18 +228,6 @@
flex-shrink: 1;
}
-.memory-counter-selector-info {
- flex: 0 0 auto;
- margin-left: 5px;
- white-space: nowrap;
-}
-
-.memory-counter-selector-info .range {
- margin: 0 4px;
- align-items: center;
- display: inline-flex;
-}
-
.memory-counter-value {
margin: 8px;
}
@@ -302,11 +240,6 @@
line-height: 18px;
}
-.timeline-filters-header {
- overflow: hidden;
- flex: none;
-}
-
.timeline-details {
vertical-align: top;
}
@@ -413,12 +346,6 @@
line-height: 11px;
}
-.timeline-details-view-row-value .timeline-details-warning-marker {
- white-space: nowrap;
- text-overflow: ellipsis;
- overflow: hidden;
-}
-
.timeline-details-view-pie-chart-wrapper {
margin: 4px 0;
}
@@ -438,12 +365,6 @@
line-height: 12px;
}
-.timeline-aggregated-info-legend > div {
- overflow: hidden;
- white-space: nowrap;
- text-overflow: ellipsis;
-}
-
.timeline-flamechart {
overflow: hidden;
}
@@ -469,10 +390,6 @@
margin-bottom: -1px;
}
-.timeline-status-pane.full-widget-dimmed-banner {
- text-align: left !important;
-}
-
.timeline-layers-view > div:last-child,
.timeline-layers-view-properties > div:last-child {
background-color: #eee;
@@ -493,10 +410,6 @@
z-index: 0;
}
-.timeline-gap {
- flex: none;
-}
-
.timeline-filmstrip-preview > img {
margin-top: 5px;
max-width: 500px;
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/timeline/timeline_strings.grdp b/chromium/third_party/blink/renderer/devtools/front_end/timeline/timeline_strings.grdp
new file mode 100644
index 00000000000..72eb2f76499
--- /dev/null
+++ b/chromium/third_party/blink/renderer/devtools/front_end/timeline/timeline_strings.grdp
@@ -0,0 +1,942 @@
+<?xml version="1.0" encoding="utf-8"?>
+<grit-part>
+ <message name="IDS_DEVTOOLS_0007333f80790cc7ef6b97ce5e0ac297" desc="">
+ Layout Invalidations
+ </message>
+ <message name="IDS_DEVTOOLS_0060636b449d1da5a8581bfee180f0c2" desc="">
+ and
+ </message>
+ <message name="IDS_DEVTOOLS_00c3783a786856df24fd85e1093ef516" desc="">
+ DCL
+ </message>
+ <message name="IDS_DEVTOOLS_00eeb588b8336923c7a236079c87c908" desc="">
+ Install Timer
+ </message>
+ <message name="IDS_DEVTOOLS_01b26724a7b11aab03f175512e2c9f0f" desc="">
+ Show recent timeline sessions
+ </message>
+ <message name="IDS_DEVTOOLS_01da20cf88fba2246309c541bddac1b1" desc="">
+ Documents: <ph name="PH1">$1s</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_01ea16e89d02c33ef2a6a5db67665e0a" desc="">
+ Main — <ph name="TRACK_URL">$1s</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_02a3a357710cc2a5dfdfb74ed012fb59" desc="">
+ Url
+ </message>
+ <message name="IDS_DEVTOOLS_04cbdd8baeb482d9ff2e48b186479a06" desc="">
+ Streaming Wasm Response
+ </message>
+ <message name="IDS_DEVTOOLS_05b8804bd8a147740eb7a35786c71a3c" desc="">
+ Node:
+ </message>
+ <message name="IDS_DEVTOOLS_0638b5f626aa994ad5da95ce95288a66" desc="">
+ [ unknown node ]
+ </message>
+ <message name="IDS_DEVTOOLS_064866c00b4298761dd36ec9df9be72f" desc="">
+ Hit Test
+ </message>
+ <message name="IDS_DEVTOOLS_06a83455a448479eb950ea190d815439" desc="">
+ Malformed CPU profile format
+ </message>
+ <message name="IDS_DEVTOOLS_06b8c6c83d552c894d01ad5c418e566b" desc="">
+ Receive Response
+ </message>
+ <message name="IDS_DEVTOOLS_0712dbe6e0a2a72e3c3bd1fc42b8ccb3" desc="">
+ Style Invalidations
+ </message>
+ <message name="IDS_DEVTOOLS_07535d965500993cdde8e7d0c686c993" desc="">
+ Onload Event
+ </message>
+ <message name="IDS_DEVTOOLS_077569834980c53bd3805bb49d62d910" desc="">
+ - Network throttling is enabled
+ </message>
+ <message name="IDS_DEVTOOLS_07f0007f9cefa79303d1093070975149" desc="">
+ - JavaScript sampling is disabled
+ </message>
+ <message name="IDS_DEVTOOLS_07fa8e7d7b4634db5e410fc35dba40f4" desc="">
+ Long frame
+ </message>
+ <message name="IDS_DEVTOOLS_0877b8db99f11ff69875bf025df75c7f" desc="">
+ Animation Frame Requested
+ </message>
+ <message name="IDS_DEVTOOLS_08790b919dc10c98ef4f4678e4a4cc98" desc="">
+ Fire Idle Callback
+ </message>
+ <message name="IDS_DEVTOOLS_08c1f153a1c6f21e1064581df9b05ee8" desc="">
+ Layer tree
+ </message>
+ <message name="IDS_DEVTOOLS_08d5a8363f4ad65b14c8f9a32dd93944" desc="">
+ JS Frame
+ </message>
+ <message name="IDS_DEVTOOLS_08db5f30f625a406882862b8a29b1bc6" desc="">
+ Major GC
+ </message>
+ <message name="IDS_DEVTOOLS_09d66464ad53e6080988ad30824ea023" desc="">
+ Frame — <ph name="TRACK_URL">$1s</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_0d015d96f63a8c12d96b8399482b593f" desc="">
+ Uncategorized
+ </message>
+ <message name="IDS_DEVTOOLS_0d43b55b13285fd05236204c9a884f18" desc="">
+ (<ph name="TIMELINE_TIMELINEHISTORYMANAGER__COARSEAGE_STARTEDAT_">$1s</ph> ago)
+ </message>
+ <message name="IDS_DEVTOOLS_0d58f3789fa2779bb4b2b86f90cab764" desc="">
+ Nodes That Need Layout
+ </message>
+ <message name="IDS_DEVTOOLS_0e6dea9a8306a3ef170cb8c78263debe" desc="">
+ Click the record button <ph name="RECORDBUTTON">$1s</ph> or hit <ph name="RECORDKEY">$2s</ph> to start a new recording.
+Click the reload button <ph name="RELOADBUTTON">$3s</ph> or hit <ph name="RELOADKEY">$4s</ph> to record the page load.
+ </message>
+ <message name="IDS_DEVTOOLS_0e8dfe937d359c7df31b16ea7e9cca81" desc="">
+ Hide chrome frame in Layers view
+ </message>
+ <message name="IDS_DEVTOOLS_10aab9f12eca6bca3a6215914bab2745" desc="">
+ Allotted Time
+ </message>
+ <message name="IDS_DEVTOOLS_121ee86db6c7660edb3864de279ef742" desc="">
+ <ph name="ELAPSED_TOFIXED_PRECISE_________">$1s</ph> sec
+ </message>
+ <message name="IDS_DEVTOOLS_12ddabfc2210fb123f96a03f03816024" desc="">
+ Recurring handler took <ph name="NUMBER_MILLISTOSTRING_EVENT_DURATION__TRUE_">$1s</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_1572a49e8ab36a669016c48d7fca5d76" desc="">
+ Cache Consume Options
+ </message>
+ <message name="IDS_DEVTOOLS_16bfbf9c462762cf1cba4134ec53c504" desc="">
+ Loading
+ </message>
+ <message name="IDS_DEVTOOLS_177845b60fde99c43c2af204188dd7c6" desc="">
+ No Grouping
+ </message>
+ <message name="IDS_DEVTOOLS_17f2327f2e0ec63f2a2e6300fc1b70a7" desc="">
+ Show memory timeline
+ </message>
+ <message name="IDS_DEVTOOLS_187c6ad3a74cc93ac6c2229d398e383e" desc="">
+ Nodes
+ </message>
+ <message name="IDS_DEVTOOLS_18fe96f0c47fa8c62afe3be31d97b880" desc="">
+ Finish Loading
+ </message>
+ <message name="IDS_DEVTOOLS_1b01d1ef7772f8e0c0e0427e4faad653" desc="">
+ Listeners: <ph name="PH1">$1s</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_1b2c363066d5912ae8b27a1527f3d45e" desc="">
+ Group by Domain
+ </message>
+ <message name="IDS_DEVTOOLS_1e3eaaac8d3c9cffea8ee7f03a8a6121" desc="">
+ DOMContentLoaded Event
+ </message>
+ <message name="IDS_DEVTOOLS_205fd38626b73da9d837e61b2c7af71f" desc="">
+ Evaluate Script
+ </message>
+ <message name="IDS_DEVTOOLS_20ec6a94230f361368789ddd8bec855c" desc="">
+ Malformed timeline input, wrong JSON brackets balance
+ </message>
+ <message name="IDS_DEVTOOLS_21263b6755fb99797d30820fd4d2b4f0" desc="">
+ <ph name="URL">$1s</ph> [<ph name="STARTLINE____">$2s</ph>…<ph name="ENDLINE____">$3s</ph>]
+ </message>
+ <message name="IDS_DEVTOOLS_217b22459b85349fbfbb7e797719cc37" desc="">
+ Receive WebSocket Handshake
+ </message>
+ <message name="IDS_DEVTOOLS_2267d2f9ecae3136874e6017d01f4574" desc="">
+ Group by Activity
+ </message>
+ <message name="IDS_DEVTOOLS_232e59f3380381caf0634ab2f035dbf2" desc="">
+ (from service worker)
+ </message>
+ <message name="IDS_DEVTOOLS_237f26bfdd9351cd363bca657ff35551" desc="">
+ . Long frame times are an indication of
+ </message>
+ <message name="IDS_DEVTOOLS_2383a71629ce9189cb494c3fb8af7ac4" desc="">
+ Heaviest stack
+ </message>
+ <message name="IDS_DEVTOOLS_23ca9d66c8f521090421155382ef94b9" desc="">
+ Key Down
+ </message>
+ <message name="IDS_DEVTOOLS_248307dc00d11b9b67fdbfd34507f0aa" desc="">
+ XHR Load
+ </message>
+ <message name="IDS_DEVTOOLS_24aa4117da86c41684ad25742832dfa6" desc="">
+ Async
+ </message>
+ <message name="IDS_DEVTOOLS_25a5e1f05232eae2d3a9c1ff4cb83869" desc="">
+ Function Call
+ </message>
+ <message name="IDS_DEVTOOLS_277b749cfb8e0389d1b89e7cb671753a" desc="">
+ Context Menu
+ </message>
+ <message name="IDS_DEVTOOLS_2875ec54afbd9922e0553f4b441aa54b" desc="">
+ Painting
+ </message>
+ <message name="IDS_DEVTOOLS_2a0e96bf571559add541036a25ca1d36" desc="">
+ Call Stacks
+ </message>
+ <message name="IDS_DEVTOOLS_2a5021aea912316167342b34cbf358b4" desc="">
+ Compile Module
+ </message>
+ <message name="IDS_DEVTOOLS_2ae3330084b44abd37672d0ca603471e" desc="">
+ <ph name="BEGINDATA__DIRTYOBJECTS__">$1s</ph> of <ph name="BEGINDATA__TOTALOBJECTS__">$2s</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_2b2195634ae5a0d7c6dada694bdcdc65" desc="">
+ Callback ID
+ </message>
+ <message name="IDS_DEVTOOLS_2b55387dd066c5bac646ac61543d152d" desc="">
+ CPU
+ </message>
+ <message name="IDS_DEVTOOLS_2b66d07a14b9e6da66cde6baab473e92" desc="">
+ <ph name="SELFCATEGORY_TITLE">$1s</ph> (children)
+ </message>
+ <message name="IDS_DEVTOOLS_2d2af0b530003b552681f91e29c509d1" desc="">
+ Recalculation Forced
+ </message>
+ <message name="IDS_DEVTOOLS_2da2415714a5e7450a9a127431c02a41" desc="">
+ Send Request
+ </message>
+ <message name="IDS_DEVTOOLS_2f3e2f48b161c9cadd45dcdffd726c79" desc="">
+ JS Heap: <ph name="PH1">$1s</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_2f709c2af7d47a610e3c48a87d1ec429" desc="">
+ Invalidate Layout
+ </message>
+ <message name="IDS_DEVTOOLS_2fc3f5e968c02091e3ba9863088f0651" desc="">
+ Callback Function
+ </message>
+ <message name="IDS_DEVTOOLS_31084046e4a000cc4ac980dc68ea9ce9" desc="">
+ Parse Script
+ </message>
+ <message name="IDS_DEVTOOLS_316853cc3718335f11c048e33b9be98a" desc="">
+ Click
+ </message>
+ <message name="IDS_DEVTOOLS_31c6b3fdfaaa80dba2dbf92a4600524c" desc="">
+ Sign
+ </message>
+ <message name="IDS_DEVTOOLS_3227e479f6541c685b08023affdc8c69" desc="">
+ Consumed Cache Size
+ </message>
+ <message name="IDS_DEVTOOLS_324118a6721dd6b8a9b9f4e327df2bf5" desc="">
+ Input
+ </message>
+ <message name="IDS_DEVTOOLS_33991558a089f674da1c5c26fd0a6161" desc="">
+ jank
+ </message>
+ <message name="IDS_DEVTOOLS_347aadfc505a4bc6b2f9d81363d2331c" desc="">
+ NET
+ </message>
+ <message name="IDS_DEVTOOLS_3581b739d9d4895d0f69d9a897b02a3f" desc="">
+ Verify Reply
+ </message>
+ <message name="IDS_DEVTOOLS_359783360b8522c55aa7a9c7d5593d5d" desc="">
+ Pinch End
+ </message>
+ <message name="IDS_DEVTOOLS_361beede47de122bfb91fe1da6e3f1a7" desc="">
+ Legacy Timeline format is not supported.
+ </message>
+ <message name="IDS_DEVTOOLS_38108192a74ae7b3deda8762ff299109" desc="">
+ <ph name="TITLE">$1s</ph> - Details
+ </message>
+ <message name="IDS_DEVTOOLS_390afae8f87b5024e0c32c4e6ce3e2da" desc="">
+ Run Microtasks
+ </message>
+ <message name="IDS_DEVTOOLS_3b419ceb25fddb807ea9483f65fded06" desc="">
+ Capture settings
+ </message>
+ <message name="IDS_DEVTOOLS_3d1f92a565d3b1a61880236e33c49bf3" desc="">
+ Timeline
+ </message>
+ <message name="IDS_DEVTOOLS_3de9387fc230ce74214446e58c4fefde" desc="">
+ Compile
+ </message>
+ <message name="IDS_DEVTOOLS_3df7062234c9e55d49648289c5b2c80f" desc="">
+ Time spent in rendering
+ </message>
+ <message name="IDS_DEVTOOLS_3e8e23cb13898f3f9760a0f1d9203bd1" desc="">
+ Stack trace:
+ </message>
+ <message name="IDS_DEVTOOLS_3eec15d0ba9a93d3176bab9218bb2570" desc="">
+ Failed to save timeline: <ph name="ERROR_MESSAGE">$1s</ph> (<ph name="ERROR_NAME">$2s</ph>, <ph name="ERROR_CODE">$3s</ph>)
+ </message>
+ <message name="IDS_DEVTOOLS_3f978efb26e66c6c9af5db34268ccf41" desc="">
+ Compiled Wasm Module
+ </message>
+ <message name="IDS_DEVTOOLS_40a15f22bd3574304d7843344006e0b6" desc="">
+ First Contentful Paint
+ </message>
+ <message name="IDS_DEVTOOLS_41b1478092e85f8c8fa1f98e5efc9b35" desc="">
+ Layout Forced
+ </message>
+ <message name="IDS_DEVTOOLS_427b6d816d7fdd86cabe48d8180a3cc9" desc="">
+ Image URL
+ </message>
+ <message name="IDS_DEVTOOLS_44ff4e8748811d0661f820aeb28ecaf4" desc="">
+ XHR Ready State Change
+ </message>
+ <message name="IDS_DEVTOOLS_46a2a41cc6e552044816a2d04634545d" desc="">
+ State
+ </message>
+ <message name="IDS_DEVTOOLS_46fa564bb1eed5cd3992cac85e8f094b" desc="">
+ Screenshots
+ </message>
+ <message name="IDS_DEVTOOLS_476f68367f02309b39daf298981e30c5" desc="">
+ Minor GC
+ </message>
+ <message name="IDS_DEVTOOLS_4802a5ac6005a6ab9c68a2fb29e30a3e" desc="">
+ Paint
+ </message>
+ <message name="IDS_DEVTOOLS_485ee6de8f9a0e36c182bb56a05b2ca2" desc="">
+ Mouse Wheel
+ </message>
+ <message name="IDS_DEVTOOLS_48c84951d13f2944b6003832cd4ffcba" desc="">
+ <ph name="EVENTDATA__ENCODEDDATALENGTH__">$1s</ph> Bytes
+ </message>
+ <message name="IDS_DEVTOOLS_498f79c4c5bbde77f1bceb6c86fd0f6d" desc="">
+ Show
+ </message>
+ <message name="IDS_DEVTOOLS_4bbc0d1543b5258061fd5c8590fdbe9e" desc="">
+ Encoded Data
+ </message>
+ <message name="IDS_DEVTOOLS_4c2a8fe7eaf24721cc7a9f0175115bd4" desc="">
+ Message
+ </message>
+ <message name="IDS_DEVTOOLS_4dab9fd6bdee5285598246c6ea7cc88f" desc="">
+ Fling Halt
+ </message>
+ <message name="IDS_DEVTOOLS_4ebada6a2af2bcba53ded1d7b414f081" desc="">
+ FP
+ </message>
+ <message name="IDS_DEVTOOLS_4fec5edf718a9ca2c6245167b78f029a" desc="">
+ Scroll End
+ </message>
+ <message name="IDS_DEVTOOLS_50294a317f78ab6caf9ad2558a4b7484" desc="">
+ Invalidations
+ </message>
+ <message name="IDS_DEVTOOLS_504d75604f56770c3c513de2c49ecbe8" desc="">
+ Wasm Module Cache Hit
+ </message>
+ <message name="IDS_DEVTOOLS_5288680dbe452673259047491b87d17d" desc="">
+ CPU time
+ </message>
+ <message name="IDS_DEVTOOLS_52f9ec21735243ad9917cda3ca077d32" desc="">
+ GPU
+ </message>
+ <message name="IDS_DEVTOOLS_53081d6225e780e0f0d94351251be91c" desc="">
+ (changed &quot;<ph name="INVALIDATION_SELECTORPART">$1s</ph>&quot;<ph name="EXTRADATA">$2s</ph>)
+ </message>
+ <message name="IDS_DEVTOOLS_539dddc574d3cd85ba73df93df7a76d0" desc="">
+ Stack Trace
+ </message>
+ <message name="IDS_DEVTOOLS_5402f18025999ebf70fd56d8ca1b1909" desc="">
+ GC Event
+ </message>
+ <message name="IDS_DEVTOOLS_5481039ec867c9ad2d5a313287124961" desc="">
+ Fling Start
+ </message>
+ <message name="IDS_DEVTOOLS_548babdfd161a8fc2d4b634b682a456d" desc="">
+ (changed attribute to &quot;<ph name="INVALIDATION_CHANGEDATTRIBUTE">$1s</ph>&quot;<ph name="EXTRADATA">$2s</ph>)
+ </message>
+ <message name="IDS_DEVTOOLS_54fd6de66ec40dc89ec90ba5429094d7" desc="">
+ Group by Category
+ </message>
+ <message name="IDS_DEVTOOLS_5564c00b6210082e536c897014f72361" desc="">
+ Start profiling and reload page
+ </message>
+ <message name="IDS_DEVTOOLS_55b4b48b80795ee9b6a3220ca415786d" desc="">
+ Schedule Style Recalculation
+ </message>
+ <message name="IDS_DEVTOOLS_57f06e0eceb273507ade79baf8d3a2d4" desc="">
+ Tap Begin
+ </message>
+ <message name="IDS_DEVTOOLS_585bc08ce62507965db6ec748c5a251e" desc="">
+ Timer ID
+ </message>
+ <message name="IDS_DEVTOOLS_5878904937ecbc1d0556f79782ab03cd" desc="">
+ Scroll Update
+ </message>
+ <message name="IDS_DEVTOOLS_59cf59caeba8075dec6a745b083edd0c" desc="">
+ Time Waiting for Main Thread
+ </message>
+ <message name="IDS_DEVTOOLS_5a750f86ef41f22f852c43351e3ff383" desc="">
+ Verify
+ </message>
+ <message name="IDS_DEVTOOLS_5af8622e730a34a15962fb8f46df1b5e" desc="">
+ Captures advanced paint instrumentation, introduces significant performance overhead
+ </message>
+ <message name="IDS_DEVTOOLS_5bcd94bc1f71db5659b35ad5deeb94c7" desc="">
+ Fling
+ </message>
+ <message name="IDS_DEVTOOLS_5c593b83b0fca15af4b50ca95c9d3e87" desc="">
+ Sign Reply
+ </message>
+ <message name="IDS_DEVTOOLS_5e8170b28aaa693ca9170bb0d65b3043" desc="">
+ Destroy WebSocket
+ </message>
+ <message name="IDS_DEVTOOLS_5faec6160efeed8f7d29c081b92e8890" desc="">
+ User Timing
+ </message>
+ <message name="IDS_DEVTOOLS_5fbceaa309bba91ee916d46e06ac0080" desc="">
+ Touch Move
+ </message>
+ <message name="IDS_DEVTOOLS_5fe7053d3a0e35c2a3242996e690e160" desc="">
+ Update Layer
+ </message>
+ <message name="IDS_DEVTOOLS_60c21f78ce2dcd2da001fa3221c8ca15" desc="">
+ Nodes:
+ </message>
+ <message name="IDS_DEVTOOLS_60f718c3ba644a198920a74083ccb80f" desc="">
+ Blackboxed
+ </message>
+ <message name="IDS_DEVTOOLS_611d29c748a7931c825a247fcf3f290e" desc="">
+ Encrypt
+ </message>
+ <message name="IDS_DEVTOOLS_61b67ca7c1d8eea5b55d23bbb615d944" desc="">
+ Recalculate Style
+ </message>
+ <message name="IDS_DEVTOOLS_6347d5359bdee6d82717b4ad73aee504" desc="">
+ Frame Started Loading
+ </message>
+ <message name="IDS_DEVTOOLS_63b8e6041614e4130722f79ab66087e6" desc="">
+ Send WebSocket Handshake
+ </message>
+ <message name="IDS_DEVTOOLS_63e467c0720678aa503a5f0c022d56c5" desc="">
+ First Invalidated
+ </message>
+ <message name="IDS_DEVTOOLS_640d76ebf7917e7353ea0444790c9794" desc="">
+ Image Resize
+ </message>
+ <message name="IDS_DEVTOOLS_66f1aed235ade25269a561e81cbbb43a" desc="">
+ Scripting
+ </message>
+ <message name="IDS_DEVTOOLS_67eed98f4bc75c4ab261b79a0e2c52cd" desc="">
+ Cache Rejected
+ </message>
+ <message name="IDS_DEVTOOLS_686155af75a60a0f6e9d80c1f7edd3e9" desc="">
+ JavaScript
+ </message>
+ <message name="IDS_DEVTOOLS_6978c23868116ca3eccb809bc699742e" desc="">
+ - Significant overhead due to paint instrumentation
+ </message>
+ <message name="IDS_DEVTOOLS_6a389f626da11df07508bf251de59c23" desc="">
+ Frame Start
+ </message>
+ <message name="IDS_DEVTOOLS_6aafe894685594a908a8996d68e88028" desc="">
+ Hide records shorter than <ph name="DURATIONMS">$1d</ph> ms
+ </message>
+ <message name="IDS_DEVTOOLS_6c906c5f560faeb38f51683bc22fb212" desc="">
+ Group by Subdomain
+ </message>
+ <message name="IDS_DEVTOOLS_6d12d9901547700bfcefb2a3e5cff2b6" desc="">
+ heaviest stack
+ </message>
+ <message name="IDS_DEVTOOLS_6d1b752b6cdcfb71d098cc271bc133aa" desc="">
+ Embedder Callback
+ </message>
+ <message name="IDS_DEVTOOLS_6d555ca89f5ca9fc68e5d418b4cf732b" desc="">
+ Draw Frame
+ </message>
+ <message name="IDS_DEVTOOLS_6d8a59067ffe0498f3f5f2c03025b799" desc="">
+ Group by URL
+ </message>
+ <message name="IDS_DEVTOOLS_70582905817c902e7a334c24718cba88" desc="">
+ Touch End
+ </message>
+ <message name="IDS_DEVTOOLS_70bac6f11765f731510b0ac659fd26a1" desc="">
+ Malformed timeline data: <ph name="E_TOSTRING__">$1s</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_70d68501018d9d6496e55cad8a2c3ba1" desc="">
+ Load profile...
+ </message>
+ <message name="IDS_DEVTOOLS_7125f394de382b13a7e7a5a4b6d23364" desc="">
+ Raster
+ </message>
+ <message name="IDS_DEVTOOLS_71613aba6474d2e2dc12d00cc46743f0" desc="">
+ Touch Start
+ </message>
+ <message name="IDS_DEVTOOLS_7363d05ecc1497f2f8ae05b334b45651" desc="">
+ Disable JavaScript samples
+ </message>
+ <message name="IDS_DEVTOOLS_73cf2f244bc0cb0d205b99c04fa13978" desc="">
+ Tap
+ </message>
+ <message name="IDS_DEVTOOLS_762e3a77ecdd773da2b859e6807529a2" desc="">
+ Decrypt
+ </message>
+ <message name="IDS_DEVTOOLS_76e815d5323a5f3c80a3d186c416e92b" desc="">
+ [Chrome extensions overhead]
+ </message>
+ <message name="IDS_DEVTOOLS_76ecb02d1f339c2dd6f14c41ead368c1" desc="">
+ Handler took <ph name="NUMBER_MILLISTOSTRING_EVENT_DURATION__TRUE_">$1s</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_77c18a89217b2a9a2553ac9a0598b99a" desc="">
+ Rasterizer Thread <ph name="RASTERCOUNT">$1s</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_7820708244a842157c5fc8186e7b2bfa" desc="">
+ Wasm Module Cache Invalid
+ </message>
+ <message name="IDS_DEVTOOLS_787ddae3fd4c1a93cc28af8bb3940bdc" desc="">
+ Image Decode
+ </message>
+ <message name="IDS_DEVTOOLS_798afebf1a5e9d795a96f0c82cccaae2" desc="">
+ Cached Wasm Module
+ </message>
+ <message name="IDS_DEVTOOLS_7b3a6b02f467b95f2b5267aa94708c07" desc="">
+ Thread <ph name="__THREADINDEX">$1s</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_7d341c08fd102f0b86285b5ff2e26ea7" desc="">
+ <ph name="TITLE">$1s</ph>: <ph name="EVENTDATA__MESSAGE__">$2s</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_80a4b8755d836d50c19e6eefb976bc2e" desc="">
+ <ph name="SELFCATEGORY_TITLE">$1s</ph> (self)
+ </message>
+ <message name="IDS_DEVTOOLS_81e91be8db96be69e372f0c715ec7444" desc="">
+ Collected
+ </message>
+ <message name="IDS_DEVTOOLS_81ff3427527105233469f158360d8b02" desc="">
+ Select item for details.
+ </message>
+ <message name="IDS_DEVTOOLS_83561bf6ac8333e0d1627887d533907c" desc="">
+ Drop timeline file or URL here
+ </message>
+ <message name="IDS_DEVTOOLS_83e393be9178c404eb013bca48782312" desc="">
+ <ph name="CLIPWIDTH">$1s</ph> × <ph name="CLIPHEIGHT">$2s</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_86c8559f4d7d1d74dc3e04baf2b65cc6" desc="">
+ Decoded Body
+ </message>
+ <message name="IDS_DEVTOOLS_871646cb17b6936aa29df33b8d550051" desc="">
+ Update Layer Tree
+ </message>
+ <message name="IDS_DEVTOOLS_87644f7e0957c4bf2990aedfe046b71e" desc="">
+ GPU Memory [KB]: <ph name="PH1">$1s</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_87ba2ecc8b6915e8bd6f5089918229fd" desc="">
+ Range
+ </message>
+ <message name="IDS_DEVTOOLS_883b293ae308d8e3caf1614c8a2fda61" desc="">
+ Group by Frame
+ </message>
+ <message name="IDS_DEVTOOLS_88d982014902936a7e7ab24058c88ed0" desc="">
+ Unknown cause for
+ </message>
+ <message name="IDS_DEVTOOLS_89be1120d42e0cbacbf46eee77766b76" desc="">
+ .
+ </message>
+ <message name="IDS_DEVTOOLS_8a51f964740c2a7cb6e68404bda36ef1" desc="">
+ <ph name="NUMBER_BYTESTOSTRING_DELTA_">$1s</ph> collected
+ </message>
+ <message name="IDS_DEVTOOLS_8af5f76068f881acfad9d2880a4e2310" desc="">
+ Input Latency
+ </message>
+ <message name="IDS_DEVTOOLS_8b8747bfcec728cdf8d54030e4d28451" desc="">
+ Processing profile…
+ </message>
+ <message name="IDS_DEVTOOLS_8b92f105e7b7e01e4c7ed00d415318f3" desc="">
+ Stylesheet URL
+ </message>
+ <message name="IDS_DEVTOOLS_8c311ee6ad411f13da478e4996907ffa" desc="">
+ After recording, select an area of interest in the overview by dragging.
+Then, zoom and pan the timeline with the mousewheel or <ph name="NAVIGATENODE">$1s</ph> keys.
+<ph name="LEARNMORENODE">$2s</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_8cd016d3ad1e59b37133d6c993455d70" desc="">
+ Timer Installed
+ </message>
+ <message name="IDS_DEVTOOLS_8cda3116eb86d6a743edfebd3c2eda15" desc="">
+ Request Idle Callback
+ </message>
+ <message name="IDS_DEVTOOLS_8d98af06b412f3f2455c2786e88aabdb" desc="">
+ Nodes: <ph name="PH1">$1s</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_8dc1f1afb0dcd5282b146c8cf5d758e1" desc="">
+ Unexpected entryIndex <ph name="ENTRYINDEX">$1d</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_8f25fae98e6ef6ff87364e590df8cee5" desc="">
+ Long task
+ </message>
+ <message name="IDS_DEVTOOLS_8f27b153047f3da699b39221b47b3217" desc="">
+ Initializing profiler…
+ </message>
+ <message name="IDS_DEVTOOLS_91412421a30e87ce15a4f10ea39f6682" desc="">
+ WASD
+ </message>
+ <message name="IDS_DEVTOOLS_920fd776137a582939eac4fc07808754" desc="">
+ <ph name="NUMBER_MILLISTOSTRING_FRAME_ENDTIME___FRAME_STARTTIME__TRUE_">$1s</ph> (at <ph name="NUMBER_MILLISTOSTRING_FRAME_STARTTIMEOFFSET__TRUE_">$2s</ph>)
+ </message>
+ <message name="IDS_DEVTOOLS_92f0ea95e53565026335b840b8788bf4" desc="">
+ <ph name="NUMBER_MILLISTOSTRING_TOTALTIME__TRUE_">$1s</ph> (self <ph name="NUMBER_MILLISTOSTRING_SELFTIME__TRUE_">$2s</ph>)
+ </message>
+ <message name="IDS_DEVTOOLS_932cc5549fb2d58c13ce13653469d309" desc="">
+ Mouse Down
+ </message>
+ <message name="IDS_DEVTOOLS_9352d706112654ca7c3f2595bc529cf5" desc="">
+ Paint Image
+ </message>
+ <message name="IDS_DEVTOOLS_9399a34c7d7f4a7c046016e38f80e046" desc="">
+ is a likely performance bottleneck.
+ </message>
+ <message name="IDS_DEVTOOLS_93c8e71d1b0e18d58736d3e255a14533" desc="">
+ Buffer usage
+ </message>
+ <message name="IDS_DEVTOOLS_956f8281d37fdceec7698094b6236870" desc="">
+ (from cache)
+ </message>
+ <message name="IDS_DEVTOOLS_9669f96ca9d2e20feda07d349d3cac86" desc="">
+ Key Up
+ </message>
+ <message name="IDS_DEVTOOLS_976e665bbff13a2a2a2eb4a83b8bb602" desc="">
+ Save profile...
+ </message>
+ <message name="IDS_DEVTOOLS_97c091732895087b8900d81105e54446" desc="">
+ Frame Start (main thread)
+ </message>
+ <message name="IDS_DEVTOOLS_997a8c473db4f81c5fb3d5900030d44d" desc="">
+ (no recordings)
+ </message>
+ <message name="IDS_DEVTOOLS_9a2837081f4b4cd67f625bd8e7567383" desc="">
+ Compile Script
+ </message>
+ <message name="IDS_DEVTOOLS_9a4a3be092449d965b794e48c6f6163c" desc="">
+ Rasterize Paint
+ </message>
+ <message name="IDS_DEVTOOLS_9bedd08947719ccd339c3493e6701d4b" desc="">
+ Request Main Thread Frame
+ </message>
+ <message name="IDS_DEVTOOLS_9c80c1f042e925ffbb94db9a17eb03df" desc="">
+ Dedicated Worker
+ </message>
+ <message name="IDS_DEVTOOLS_9d07f3bb674a88ea26f10e6b7589e000" desc="">
+ Aggregated Time
+ </message>
+ <message name="IDS_DEVTOOLS_9d2ee5f9ab058df4d72a137e13bd4df2" desc="">
+ [ <ph name="INVALIDATION_NODENAME">$1s</ph> ]
+ </message>
+ <message name="IDS_DEVTOOLS_a10717d996573373c8f9a01c49bbb6a5" desc="">
+ Loading profile…
+ </message>
+ <message name="IDS_DEVTOOLS_a3b61900010aa9472919c6c7ac247fed" desc="">
+ (changed id to &quot;<ph name="INVALIDATION_CHANGEDID">$1s</ph>&quot;<ph name="EXTRADATA">$2s</ph>)
+ </message>
+ <message name="IDS_DEVTOOLS_a45da96d0bf6575970f2d27af22be28a" desc="">
+ System
+ </message>
+ <message name="IDS_DEVTOOLS_a580a76abe8b0912889d80f5c4cb9559" desc="">
+ Group by Product
+ </message>
+ <message name="IDS_DEVTOOLS_a6f22a2373839a1d417d7a4078f0383a" desc="">
+ - CPU throttling is enabled
+ </message>
+ <message name="IDS_DEVTOOLS_a7c815fafe60ae637d38216fa6300395" desc="">
+ FCP
+ </message>
+ <message name="IDS_DEVTOOLS_aa40d845ecb78d5bd01ff8b0cc9e213e" desc="">
+ Receive Data
+ </message>
+ <message name="IDS_DEVTOOLS_aa49e59ec25c5938e9629495e54b913a" desc="">
+ Worker — <ph name="TRACK_URL">$1s</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_ab0b54125d50a09e75f3829e7e90b8ea" desc="">
+ WebSocket Protocol
+ </message>
+ <message name="IDS_DEVTOOLS_ac3b5b333d7529f2d6e178a1d326315c" desc="">
+ Disables JavaScript sampling, reduces overhead when running against mobile devices
+ </message>
+ <message name="IDS_DEVTOOLS_ac5bb077c33753116b5e91ff1766e7bc" desc="">
+ Received
+ </message>
+ <message name="IDS_DEVTOOLS_aed0e2bd848c2ac9dddb03d8c21c67b6" desc="">
+ Touch Cancel
+ </message>
+ <message name="IDS_DEVTOOLS_b030f7d30297555390c6d2d23af55fa1" desc="">
+ moments
+ </message>
+ <message name="IDS_DEVTOOLS_b06f8ae307ae18937eff67f286f45a20" desc="">
+ Repeats
+ </message>
+ <message name="IDS_DEVTOOLS_b0f2106d388ba5a6a92ac83146df9770" desc="">
+ Idle callback execution extended beyond deadline by <ph name="EXCEEDEDMS">$1s</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_b14bde4124700a984f3840be64c98bf2" desc="">
+ Invoked by Timeout
+ </message>
+ <message name="IDS_DEVTOOLS_b24dc7fd5bcbe91ffc080f0220f50dfe" desc="">
+ DOM GC
+ </message>
+ <message name="IDS_DEVTOOLS_b2ef7b20ebc78fa300ef24c1965033bc" desc="">
+ Pending for
+ </message>
+ <message name="IDS_DEVTOOLS_b357598ce3db447b0138d1a5ea6b76cc" desc="">
+ Layout root
+ </message>
+ <message name="IDS_DEVTOOLS_b3bfefedfa27aa11e79f637b22b16d09" desc="">
+ [V8 Runtime]
+ </message>
+ <message name="IDS_DEVTOOLS_b49fe3f49a656887d446c2da3851a88a" desc="">
+ Network request
+ </message>
+ <message name="IDS_DEVTOOLS_b4c7087912916a68642000d8759baec2" desc="">
+ Scroll Begin
+ </message>
+ <message name="IDS_DEVTOOLS_b53fbbb58656447400f07904e68c0f12" desc="">
+ Create WebSocket
+ </message>
+ <message name="IDS_DEVTOOLS_b59387e4d62a4e3fe4285a1311dcd272" desc="">
+ Event Log
+ </message>
+ <message name="IDS_DEVTOOLS_b6722804f5872cdd88347da194d42087" desc="">
+ HEAP
+ </message>
+ <message name="IDS_DEVTOOLS_b8a4d4c7e6bb7b5534b856ce7a9ccde0" desc="">
+ Drag
+ </message>
+ <message name="IDS_DEVTOOLS_b9048f8879ceb809dd8d8bc0866306b5" desc="">
+ , and <ph name="INVALIDATIONNODES_LENGTH____">$1s</ph> others
+ </message>
+ <message name="IDS_DEVTOOLS_b94c9f4242a696995ec1a85feeb138e2" desc="">
+ Layer Root
+ </message>
+ <message name="IDS_DEVTOOLS_b9749b1e497d9193cd4307bb9e341287" desc="">
+ Decrypt Reply
+ </message>
+ <message name="IDS_DEVTOOLS_b9f3a3a888d3796e0248b3f65b14349e" desc="">
+ Bottom-Up
+ </message>
+ <message name="IDS_DEVTOOLS_bd03acccca092608aac93f5fadb091d5" desc="">
+ Streamed
+ </message>
+ <message name="IDS_DEVTOOLS_be7e368875c5373b1cfbc3b97abc8742" desc="">
+ ≥ <ph name="DURATIONMS">$1d</ph> ms
+ </message>
+ <message name="IDS_DEVTOOLS_be85f6b3661854c85ddbde4c1429b2a2" desc="">
+ (<ph name="CLIP___">$1s</ph>, <ph name="CLIP___">$2s</ph>)
+ </message>
+ <message name="IDS_DEVTOOLS_be97c5beb33f5316b2c221bfbb95852b" desc="">
+ MIME Type
+ </message>
+ <message name="IDS_DEVTOOLS_bea8bf1ee3b28d900843d6ea1e0440db" desc="">
+ Tap Halt
+ </message>
+ <message name="IDS_DEVTOOLS_bf4bbfdff02c062ac1a0badec650946d" desc="">
+ Async Task
+ </message>
+ <message name="IDS_DEVTOOLS_c123b11aa670647408778a3b81a21d70" desc="">
+ FPS
+ </message>
+ <message name="IDS_DEVTOOLS_c26f31b8ab9b92198caf6894823b14f7" desc="">
+ <ph name="HOURS">$1s</ph> h
+ </message>
+ <message name="IDS_DEVTOOLS_c4030781aba9b3bf12bc9d7c031b586d" desc="">
+ [unattributed]
+ </message>
+ <message name="IDS_DEVTOOLS_c472e98c996b5d0a818722fcbe0af52d" desc="">
+ Key Character
+ </message>
+ <message name="IDS_DEVTOOLS_c5374020999c64f3332f04b296f61a19" desc="">
+ <ph name="WIDTH">$1d</ph> × <ph name="HEIGHT">$2d</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_c5c7073f423645e437dd5d02419a911a" desc="">
+ Mouse Up
+ </message>
+ <message name="IDS_DEVTOOLS_c85a251cc457840f1e032f1b733e9398" desc="">
+ Timeout
+ </message>
+ <message name="IDS_DEVTOOLS_c86fd16c7ad825ebab7026a3e8fa7c4e" desc="">
+ Parse Stylesheet
+ </message>
+ <message name="IDS_DEVTOOLS_c91e491bb45df4c3796656945c4b86a2" desc="">
+ (changed pesudo to &quot;<ph name="INVALIDATION_CHANGEDPSEUDO">$1s</ph>&quot;<ph name="EXTRADATA">$2s</ph>)
+ </message>
+ <message name="IDS_DEVTOOLS_cba3eb593893730dfd61ce641be2502a" desc="">
+ Network:
+ </message>
+ <message name="IDS_DEVTOOLS_cbacb5bbda9c8eeb8e3a7e8e53fbcc59" desc="">
+ Timer Fired
+ </message>
+ <message name="IDS_DEVTOOLS_cbf04be3b9563f7d53998e76488efb4a" desc="">
+ Mouse Move
+ </message>
+ <message name="IDS_DEVTOOLS_cc4950eab5e0aaef9820cc6388a97640" desc="">
+ Related Node
+ </message>
+ <message name="IDS_DEVTOOLS_cdcf2d0d2f648704b8223f9a96ad0b14" desc="">
+ Parse HTML
+ </message>
+ <message name="IDS_DEVTOOLS_cdfb064314e94077caa817714d943c6f" desc="">
+ Elements Affected
+ </message>
+ <message name="IDS_DEVTOOLS_ce5bf551379459c1c61d2a204061c455" desc="">
+ Location
+ </message>
+ <message name="IDS_DEVTOOLS_cf56f8ebb3727b1d4d5a17fb18d4df74" desc="">
+ Paint Setup
+ </message>
+ <message name="IDS_DEVTOOLS_d0369e883465f2849df8b38966901bbf" desc="">
+ CPU:
+ </message>
+ <message name="IDS_DEVTOOLS_d07a2a1ecbb76d84f08a686e6c9639ea" desc="">
+ Evaluate Module
+ </message>
+ <message name="IDS_DEVTOOLS_d0c91aff68287a1a0003af56b91cadde" desc="">
+ [<ph name="MIN">$1s</ph> – <ph name="MAX">$2s</ph>]
+ </message>
+ <message name="IDS_DEVTOOLS_d14e91fe7abe33fc8a05c193fc812d68" desc="">
+ Mime Type
+ </message>
+ <message name="IDS_DEVTOOLS_d20caec3b48a1eef164cb4ca81ba2587" desc="">
+ L
+ </message>
+ <message name="IDS_DEVTOOLS_d24cdb5cd4bcfa9bab80d1fd5dc08b91" desc="">
+ <ph name="URL">$1s</ph> [<ph name="STARTLINE____">$2s</ph>…]
+ </message>
+ <message name="IDS_DEVTOOLS_d3064df90a9cacec6d462ba65032fd08" desc="">
+ CPU profile for a target is not available.
+ </message>
+ <message name="IDS_DEVTOOLS_d47c9bd21b8b13b29cb0757777f54d04" desc="">
+ Idle Callback Requested
+ </message>
+ <message name="IDS_DEVTOOLS_d49a276b363c437fe2446074595fd325" desc="">
+ <ph name="REASON">$1s</ph> for
+ </message>
+ <message name="IDS_DEVTOOLS_d5b4c38ebb6e58f520e8d1e816ad841e" desc="">
+ Stopping timeline…
+ </message>
+ <message name="IDS_DEVTOOLS_d5e3345f0d0b507c8993b1ca0e0ac2c4" desc="">
+ First Paint
+ </message>
+ <message name="IDS_DEVTOOLS_d84fe3f1d290e4855cc0487b5ea18a4a" desc="">
+ Pinch Begin
+ </message>
+ <message name="IDS_DEVTOOLS_d88a137b62e15eece2884fa04bc36099" desc="">
+ <ph name="THIS__STYLE_TITLE">$1s</ph> at <ph name="STARTTIME">$2s</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_d97477d6d8a838ead9348185bb5b6742" desc="">
+ Thread
+ </message>
+ <message name="IDS_DEVTOOLS_da3c710f68f0c891ecad19dcbf2ab349" desc="">
+ Console Time
+ </message>
+ <message name="IDS_DEVTOOLS_da5b09b6bbef223b458f5a5318c1261d" desc="">
+ First Meaningful Paint
+ </message>
+ <message name="IDS_DEVTOOLS_dbcc430b9ebc8e22dc874b108f77e4a9" desc="">
+ Timings
+ </message>
+ <message name="IDS_DEVTOOLS_dc1085228e13a69521f0d08a4f03c304" desc="">
+ Call Tree
+ </message>
+ <message name="IDS_DEVTOOLS_dc16531c312e4d4c024ffd577d123887" desc="">
+ Listeners
+ </message>
+ <message name="IDS_DEVTOOLS_dc63e2b8b0f6f66d3dd2dc5d49483eec" desc="">
+ Show all records
+ </message>
+ <message name="IDS_DEVTOOLS_dd694dc279a5fbefed6a8323c15f4e67" desc="">
+ Cancel Idle Callback
+ </message>
+ <message name="IDS_DEVTOOLS_dd810137d5737309d18208a7be75773f" desc="">
+ Malformed timeline data: Unknown JSON format
+ </message>
+ <message name="IDS_DEVTOOLS_dde38f333e095c2293593f504fd701a2" desc="">
+ JavaScript Profiler
+ </message>
+ <message name="IDS_DEVTOOLS_de1ec1ac3add3d69ffedffd437af7056" desc="">
+ Pinch Update
+ </message>
+ <message name="IDS_DEVTOOLS_df2c48ebe0a4927e0f33ce3adeaa265b" desc="">
+ Range: <ph name="NUMBER_MILLISTOSTRING_STARTOFFSET_">$1s</ph> – <ph name="NUMBER_MILLISTOSTRING_ENDOFFSET_">$2s</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_df839b886d238c3ce6de2fa9f9615518" desc="">
+ FMP
+ </message>
+ <message name="IDS_DEVTOOLS_dfe67b764ba5e3f6b674f049db64e165" desc="">
+ First Layout Invalidation
+ </message>
+ <message name="IDS_DEVTOOLS_e02d2ae03de9d493df2b6b2d2813d302" desc="">
+ Duration
+ </message>
+ <message name="IDS_DEVTOOLS_e0c70bcb54d7f58615eb895c232049ce" desc="">
+ Composite Layers
+ </message>
+ <message name="IDS_DEVTOOLS_e1851406e1e939d1ddaf625e577d6731" desc="">
+ <ph name="MINUTES">$1s</ph> m
+ </message>
+ <message name="IDS_DEVTOOLS_e2daed94bbd6483ac087b1da9a06e3fd" desc="">
+ <ph name="NUMBER_PRECISEMILLISTOSTRING_FRAME_DURATION____">$1s</ph> ~ <ph name="_______FRAME_DURATION">$2.0f</ph> fps
+ </message>
+ <message name="IDS_DEVTOOLS_e599161956d626eda4cb0a5ffb85271c" desc="">
+ Idle
+ </message>
+ <message name="IDS_DEVTOOLS_e5cfc515f312c9e85f367e9854d9963e" desc="">
+ Digest
+ </message>
+ <message name="IDS_DEVTOOLS_e6dd8524d6da96536b22201a9a46285a" desc="">
+ GPU Memory
+ </message>
+ <message name="IDS_DEVTOOLS_e77edad5ae632de2e062ef4bb6c80d8a" desc="">
+ took <ph name="NUMBER_MILLISTOSTRING_EVENT_DURATION__TRUE_">$1s</ph>.
+ </message>
+ <message name="IDS_DEVTOOLS_e88587c08bb701308040c1d45394ecad" desc="">
+ Tap Down
+ </message>
+ <message name="IDS_DEVTOOLS_ea972b3952b64289353946d365786435" desc="">
+ Encrypt Reply
+ </message>
+ <message name="IDS_DEVTOOLS_eaeb30f9f18e0c50b178676f3eaef45f" desc="">
+ Task
+ </message>
+ <message name="IDS_DEVTOOLS_ebd9bec4d70abc789d439c1f136b0538" desc="">
+ Layout
+ </message>
+ <message name="IDS_DEVTOOLS_ec21eddec143497cea80ab45444a5dab" desc="">
+ Owner Element
+ </message>
+ <message name="IDS_DEVTOOLS_ecfc2dffe568c10a67dbc6d3724cfde2" desc="">
+ Activity
+ </message>
+ <message name="IDS_DEVTOOLS_ed3fec59c125d9d20096de997602a46d" desc="">
+ Remove Timer
+ </message>
+ <message name="IDS_DEVTOOLS_ee1532a0110d6e08d330eca2f822a8c1" desc="">
+ Interactions
+ </message>
+ <message name="IDS_DEVTOOLS_eecac07978e7842e41f7dbc578482368" desc="">
+ Produced Cache Size
+ </message>
+ <message name="IDS_DEVTOOLS_ef5db075f5ef10fbe063c7108aa49b25" desc="">
+ <ph name="DOMAIN">$1s</ph> #<ph name="SEQUENCENUMBER">$2d</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_f17085a56d199cb15adf7c101d611bcc" desc="">
+ (changed class to &quot;<ph name="INVALIDATION_CHANGEDCLASS">$1s</ph>&quot;<ph name="EXTRADATA">$2s</ph>)
+ </message>
+ <message name="IDS_DEVTOOLS_f34ebd9ed4156c54fbd77bb3a5b3107a" desc="">
+ Save profile…
+ </message>
+ <message name="IDS_DEVTOOLS_f466ef0697891303497dfbf951a14b1d" desc="">
+ Idle Frame
+ </message>
+ <message name="IDS_DEVTOOLS_f4843c1c797abf1a256c8802b6cd9f51" desc="">
+ Dimensions
+ </message>
+ <message name="IDS_DEVTOOLS_f4af86c1492aed890460419da6d5e5e9" desc="">
+ <ph name="NUMBER_BYTESTOSTRING_MINUSEDHEAPSIZE_">$1s</ph> – <ph name="NUMBER_BYTESTOSTRING_MAXUSEDHEAPSIZE_">$2s</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_f5baffc95ebfe1ede488388589db922b" desc="">
+ Other Invalidations
+ </message>
+ <message name="IDS_DEVTOOLS_fa7c73b6eb5f3c3b77e47d8a4557af3e" desc="">
+ Load profile…
+ </message>
+ <message name="IDS_DEVTOOLS_faa313428f0d69de3acffbd44c3df1ec" desc="">
+ Enable advanced paint instrumentation (slow)
+ </message>
+ <message name="IDS_DEVTOOLS_fb29a86861ace71b3d0203222b687dc0" desc="">
+ Digest Reply
+ </message>
+ <message name="IDS_DEVTOOLS_fc763cb31e9938f37737394681228f83" desc="">
+ ,
+ </message>
+ <message name="IDS_DEVTOOLS_fd87735db5aee919b6f95f0413a5f542" desc="">
+ Forced reflow
+ </message>
+ <message name="IDS_DEVTOOLS_feab2dfada0f566072a2a5c3268c2b02" desc="">
+ Subframe
+ </message>
+</grit-part> \ No newline at end of file
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/timeline_model/timeline_model_strings.grdp b/chromium/third_party/blink/renderer/devtools/front_end/timeline_model/timeline_model_strings.grdp
new file mode 100644
index 00000000000..8e9b291a2b0
--- /dev/null
+++ b/chromium/third_party/blink/renderer/devtools/front_end/timeline_model/timeline_model_strings.grdp
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<grit-part>
+ <message name="IDS_DEVTOOLS_3f2fac4932c34252407760c51ae69add" desc="">
+ Two flings at the same time? <ph name="FLINGSTART_STARTTIME">$1s</ph> vs <ph name="EVENT_STARTTIME">$2s</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_939f0ea548384887196004acbb969c45" desc="">
+ Two touches at the same time? <ph name="TOUCHSTART_STARTTIME">$1s</ph> vs <ph name="EVENT_STARTTIME">$2s</ph>
+ </message>
+</grit-part> \ No newline at end of file
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/ui/ARIAUtils.js b/chromium/third_party/blink/renderer/devtools/front_end/ui/ARIAUtils.js
index 12f2070156c..84e9ceec8a9 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/ui/ARIAUtils.js
+++ b/chromium/third_party/blink/renderer/devtools/front_end/ui/ARIAUtils.js
@@ -84,6 +84,15 @@ UI.ARIAUtils.markAsHidden = function(element) {
/**
* @param {!Element} element
+ * @param {number} level
+ */
+UI.ARIAUtils.markAsHeading = function(element, level) {
+ element.setAttribute('role', 'heading');
+ element.setAttribute('aria-level', level);
+};
+
+/**
+ * @param {!Element} element
* @param {?string} placeholder
*/
UI.ARIAUtils.setPlaceholder = function(element, placeholder) {
@@ -101,6 +110,14 @@ UI.ARIAUtils.markAsPresentation = function(element) {
};
/**
+ * @param {!Element} element
+ */
+UI.ARIAUtils.ensureId = function(element) {
+ if (!element.id)
+ element.id = UI.ARIAUtils.nextId('ariaElement');
+};
+
+/**
* @param {string} prefix
* @return {string}
*/
@@ -178,6 +195,15 @@ UI.ARIAUtils.setAccessibleName = function(element, name) {
};
/**
+ * @param {!Element} element
+ * @param {!Element} labelElement
+ */
+UI.ARIAUtils.setLabelledBy = function(element, labelElement) {
+ UI.ARIAUtils.ensureId(labelElement);
+ element.setAttribute('aria-labelledby', labelElement.id);
+};
+
+/**
* @param {string} message
* @param {!Element} element
*/
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/ui/EmptyWidget.js b/chromium/third_party/blink/renderer/devtools/front_end/ui/EmptyWidget.js
index c35c25455e8..9ac0493fce4 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/ui/EmptyWidget.js
+++ b/chromium/third_party/blink/renderer/devtools/front_end/ui/EmptyWidget.js
@@ -52,6 +52,14 @@ UI.EmptyWidget = class extends UI.VBox {
}
/**
+ * @param {string} link
+ * @return {!Node}
+ */
+ appendLink(link) {
+ return this._contentElement.appendChild(UI.XLink.create(link, 'Learn more'));
+ }
+
+ /**
* @param {string} text
*/
set text(text) {
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/ui/Icon.js b/chromium/third_party/blink/renderer/devtools/front_end/ui/Icon.js
index 9d1fd5e6500..0b17d4166df 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/ui/Icon.js
+++ b/chromium/third_party/blink/renderer/devtools/front_end/ui/Icon.js
@@ -165,6 +165,10 @@ UI.Icon.Descriptors = {
'mediumicon-bug': {position: 'd1', spritesheet: 'mediumicons', isMask: true},
'mediumicon-list': {position: 'e5', spritesheet: 'mediumicons', isMask: true},
'mediumicon-warning': {position: 'd5', spritesheet: 'mediumicons', isMask: true},
+ 'mediumicon-sync': {position: 'a5', spritesheet: 'mediumicons', isMask: true},
+ 'mediumicon-fetch': {position: 'b5', spritesheet: 'mediumicons', isMask: true},
+ 'mediumicon-cloud': {position: 'a6', spritesheet: 'mediumicons', isMask: true},
+ 'mediumicon-bell': {position: 'b6', spritesheet: 'mediumicons', isMask: true},
'badge-navigator-file-sync': {position: 'a9', spritesheet: 'largeicons'},
'largeicon-activate-breakpoints': {position: 'b9', spritesheet: 'largeicons', isMask: true},
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/ui/ReportView.js b/chromium/third_party/blink/renderer/devtools/front_end/ui/ReportView.js
index 462bc23ef07..ab90dc59a44 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/ui/ReportView.js
+++ b/chromium/third_party/blink/renderer/devtools/front_end/ui/ReportView.js
@@ -16,6 +16,7 @@ UI.ReportView = class extends UI.VBox {
this._headerElement = this._contentBox.createChild('div', 'report-header vbox');
this._titleElement = this._headerElement.createChild('div', 'report-title');
this._titleElement.textContent = title;
+ UI.ARIAUtils.markAsHeading(this._titleElement, 1);
this._sectionList = this._contentBox.createChild('div', 'vbox');
}
@@ -117,7 +118,8 @@ UI.ReportView.Section = class extends UI.VBox {
this.element.classList.add(className);
this._headerElement = this.element.createChild('div', 'report-section-header');
this._titleElement = this._headerElement.createChild('div', 'report-section-title');
- this._titleElement.textContent = title;
+ this.setTitle(title);
+ UI.ARIAUtils.markAsHeading(this._titleElement, 2);
this._fieldList = this.element.createChild('div', 'vbox');
/** @type {!Map.<string, !Element>} */
this._fieldMap = new Map();
@@ -136,6 +138,7 @@ UI.ReportView.Section = class extends UI.VBox {
setTitle(title) {
if (this._titleElement.textContent !== title)
this._titleElement.textContent = title;
+ this._titleElement.classList.toggle('hidden', !this._titleElement.textContent);
}
/**
@@ -201,8 +204,20 @@ UI.ReportView.Section = class extends UI.VBox {
return this._fieldList.createChild('div', 'report-row');
}
+ /**
+ * @return {!Element}
+ */
+ appendSelectableRow() {
+ return this._fieldList.createChild('div', 'report-row report-row-selectable');
+ }
+
clearContent() {
this._fieldList.removeChildren();
this._fieldMap.clear();
}
+
+ markFieldListAsGroup() {
+ UI.ARIAUtils.markAsGroup(this._fieldList);
+ UI.ARIAUtils.setAccessibleName(this._fieldList, this.title());
+ }
};
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/ui/ShortcutsScreen.js b/chromium/third_party/blink/renderer/devtools/front_end/ui/ShortcutsScreen.js
index 9bcd4f061b8..45b955f5832 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/ui/ShortcutsScreen.js
+++ b/chromium/third_party/blink/renderer/devtools/front_end/ui/ShortcutsScreen.js
@@ -57,6 +57,7 @@ UI.ShortcutsScreen = class {
UI.shortcutRegistry.shortcutDescriptorsForAction('elements.edit-as-html'),
Common.UIString('Toggle edit as HTML'));
+ // Styles pane
const stylesPaneSection = UI.shortcutsScreen.section(Common.UIString('Styles Pane'));
const nextPreviousProperty = UI.ShortcutsScreen.ElementsPanelShortcuts.NextProperty.concat(
@@ -83,118 +84,143 @@ UI.ShortcutsScreen = class {
stylesPaneSection.addAlternateKeys(
UI.ShortcutsScreen.ElementsPanelShortcuts.DecrementBy01, Common.UIString('Decrement by %f', 0.1));
+ // Console
+ const consoleSection = UI.shortcutsScreen.section(Common.UIString('Console'));
+
+ consoleSection.addAlternateKeys(
+ UI.shortcutRegistry.shortcutDescriptorsForAction('console.clear'), Common.UIString('Clear console'));
+ consoleSection.addRelatedKeys(
+ UI.ShortcutsScreen.ConsolePanelShortcuts.AcceptSuggestion, Common.UIString('Accept suggestion'));
+ consoleSection.addAlternateKeys(
+ UI.ShortcutsScreen.ConsolePanelShortcuts.ClearConsolePrompt, Common.UIString('Clear console prompt'));
+ consoleSection.addRelatedKeys(
+ UI.ShortcutsScreen.ConsolePanelShortcuts.NextPreviousLine, Common.UIString('Next/previous line'));
+
+ if (Host.isMac()) {
+ consoleSection.addRelatedKeys(
+ UI.ShortcutsScreen.ConsolePanelShortcuts.NextPreviousCommand, Common.UIString('Next/previous command'));
+ }
+
+ consoleSection.addKey(UI.ShortcutsScreen.ConsolePanelShortcuts.ExecuteCommand, Common.UIString('Execute command'));
+
// Debugger
- let section = UI.shortcutsScreen.section(Common.UIString('Debugger'));
+ const debuggerSection = UI.shortcutsScreen.section(Common.UIString('Debugger'));
- section.addAlternateKeys(
+ debuggerSection.addAlternateKeys(
UI.shortcutRegistry.shortcutDescriptorsForAction('debugger.toggle-pause'), Common.UIString('Pause/ Continue'));
- section.addAlternateKeys(
+ debuggerSection.addAlternateKeys(
UI.shortcutRegistry.shortcutDescriptorsForAction('debugger.step-over'), Common.UIString('Step over'));
- section.addAlternateKeys(
+ debuggerSection.addAlternateKeys(
UI.shortcutRegistry.shortcutDescriptorsForAction('debugger.step-into'), Common.UIString('Step into'));
- section.addAlternateKeys(
+ debuggerSection.addAlternateKeys(
UI.shortcutRegistry.shortcutDescriptorsForAction('debugger.step-out'), Common.UIString('Step out'));
const nextAndPrevFrameKeys =
UI.shortcutRegistry.shortcutDescriptorsForAction('debugger.next-call-frame')
.concat(UI.shortcutRegistry.shortcutDescriptorsForAction('debugger.previous-call-frame'));
- section.addRelatedKeys(nextAndPrevFrameKeys, Common.UIString('Next/previous call frame'));
+ debuggerSection.addRelatedKeys(nextAndPrevFrameKeys, Common.UIString('Next/previous call frame'));
- section.addAlternateKeys(
+ debuggerSection.addAlternateKeys(
UI.ShortcutsScreen.SourcesPanelShortcuts.EvaluateSelectionInConsole,
Common.UIString('Evaluate selection in console'));
- section.addAlternateKeys(
+ debuggerSection.addAlternateKeys(
UI.ShortcutsScreen.SourcesPanelShortcuts.AddSelectionToWatch, Common.UIString('Add selection to watch'));
- section.addAlternateKeys(
+ debuggerSection.addAlternateKeys(
UI.shortcutRegistry.shortcutDescriptorsForAction('debugger.toggle-breakpoint'),
Common.UIString('Toggle breakpoint'));
- section.addAlternateKeys(
+ debuggerSection.addAlternateKeys(
UI.shortcutRegistry.shortcutDescriptorsForAction('debugger.toggle-breakpoint-enabled'),
Common.UIString('Toggle breakpoint enabled'));
- section.addAlternateKeys(
+ debuggerSection.addAlternateKeys(
UI.shortcutRegistry.shortcutDescriptorsForAction('debugger.toggle-breakpoints-active'),
Common.UIString('Toggle all breakpoints'));
// Editing
- section = UI.shortcutsScreen.section(Common.UIString('Text Editor'));
- section.addAlternateKeys(
+ const editingSection = UI.shortcutsScreen.section(Common.UIString('Text Editor'));
+
+ editingSection.addAlternateKeys(
UI.shortcutRegistry.shortcutDescriptorsForAction('sources.go-to-member'), Common.UIString('Go to member'));
- section.addAlternateKeys(
+ editingSection.addAlternateKeys(
UI.ShortcutsScreen.SourcesPanelShortcuts.ToggleAutocompletion, Common.UIString('Autocompletion'));
- section.addAlternateKeys(
+ editingSection.addAlternateKeys(
UI.shortcutRegistry.shortcutDescriptorsForAction('sources.go-to-line'), Common.UIString('Go to line'));
- section.addAlternateKeys(
+ editingSection.addAlternateKeys(
UI.shortcutRegistry.shortcutDescriptorsForAction('sources.jump-to-previous-location'),
Common.UIString('Jump to previous editing location'));
- section.addAlternateKeys(
+ editingSection.addAlternateKeys(
UI.shortcutRegistry.shortcutDescriptorsForAction('sources.jump-to-next-location'),
Common.UIString('Jump to next editing location'));
- section.addAlternateKeys(UI.ShortcutsScreen.SourcesPanelShortcuts.ToggleComment, Common.UIString('Toggle comment'));
- section.addAlternateKeys(
+ editingSection.addAlternateKeys(
+ UI.ShortcutsScreen.SourcesPanelShortcuts.ToggleComment, Common.UIString('Toggle comment'));
+ editingSection.addAlternateKeys(
UI.ShortcutsScreen.SourcesPanelShortcuts.IncreaseCSSUnitByOne, Common.UIString('Increment CSS unit by 1'));
- section.addAlternateKeys(
+ editingSection.addAlternateKeys(
UI.ShortcutsScreen.SourcesPanelShortcuts.DecreaseCSSUnitByOne, Common.UIString('Decrement CSS unit by 1'));
- section.addAlternateKeys(
+ editingSection.addAlternateKeys(
UI.ShortcutsScreen.SourcesPanelShortcuts.IncreaseCSSUnitByTen, Common.UIString('Increment CSS unit by 10'));
- section.addAlternateKeys(
+ editingSection.addAlternateKeys(
UI.ShortcutsScreen.SourcesPanelShortcuts.DecreaseCSSUnitByTen, Common.UIString('Decrement CSS unit by 10'));
- section.addAlternateKeys(
+ editingSection.addAlternateKeys(
UI.ShortcutsScreen.SourcesPanelShortcuts.SelectNextOccurrence, Common.UIString('Select next occurrence'));
- section.addAlternateKeys(UI.ShortcutsScreen.SourcesPanelShortcuts.SoftUndo, Common.UIString('Soft undo'));
- section.addAlternateKeys(
+ editingSection.addAlternateKeys(UI.ShortcutsScreen.SourcesPanelShortcuts.SoftUndo, Common.UIString('Soft undo'));
+ editingSection.addAlternateKeys(
UI.ShortcutsScreen.SourcesPanelShortcuts.GotoMatchingBracket, Common.UIString('Go to matching bracket'));
- section.addAlternateKeys(
+ editingSection.addAlternateKeys(
UI.shortcutRegistry.shortcutDescriptorsForAction('sources.close-editor-tab'),
Common.UIString('Close editor tab'));
- section.addAlternateKeys(
+ editingSection.addAlternateKeys(
UI.shortcutRegistry.shortcutDescriptorsForAction('sources.switch-file'),
Common.UIString('Switch between files with the same name and different extensions.'));
// Performance panel
- section = UI.shortcutsScreen.section(Common.UIString('Performance Panel'));
- section.addAlternateKeys(
+ const performanceSection = UI.shortcutsScreen.section(Common.UIString('Performance Panel'));
+
+ performanceSection.addAlternateKeys(
UI.shortcutRegistry.shortcutDescriptorsForAction('timeline.toggle-recording'),
Common.UIString('Start/stop recording'));
- section.addAlternateKeys(
+ performanceSection.addAlternateKeys(
UI.shortcutRegistry.shortcutDescriptorsForAction('timeline.record-reload'),
Common.UIString('Record page reload'));
- section.addAlternateKeys(
+ performanceSection.addAlternateKeys(
UI.shortcutRegistry.shortcutDescriptorsForAction('timeline.save-to-file'), Common.UIString('Save profile'));
- section.addAlternateKeys(
+ performanceSection.addAlternateKeys(
UI.shortcutRegistry.shortcutDescriptorsForAction('timeline.load-from-file'), Common.UIString('Load profile'));
- section.addRelatedKeys(
+ performanceSection.addRelatedKeys(
UI.shortcutRegistry.shortcutDescriptorsForAction('timeline.jump-to-previous-frame')
.concat(UI.shortcutRegistry.shortcutDescriptorsForAction('timeline.jump-to-next-frame')),
Common.UIString('Jump to previous/next frame'));
- section.addRelatedKeys(
+ performanceSection.addRelatedKeys(
UI.shortcutRegistry.shortcutDescriptorsForAction('timeline.show-history'),
Common.UIString('Pick a recording from history'));
- section.addRelatedKeys(
+ performanceSection.addRelatedKeys(
UI.shortcutRegistry.shortcutDescriptorsForAction('timeline.previous-recording')
.concat(UI.shortcutRegistry.shortcutDescriptorsForAction('timeline.next-recording')),
Common.UIString('Show previous/next recording'));
// Memory panel
- section = UI.shortcutsScreen.section(Common.UIString('Memory Panel'));
- section.addAlternateKeys(
+ const memorySection = UI.shortcutsScreen.section(Common.UIString('Memory Panel'));
+
+ memorySection.addAlternateKeys(
UI.shortcutRegistry.shortcutDescriptorsForAction('profiler.heap-toggle-recording'),
Common.UIString('Start/stop recording'));
// Layers panel
- section = UI.shortcutsScreen.section(Common.UIString('Layers Panel'));
- section.addAlternateKeys(UI.ShortcutsScreen.LayersPanelShortcuts.ResetView, Common.UIString('Reset view'));
- section.addAlternateKeys(UI.ShortcutsScreen.LayersPanelShortcuts.PanMode, Common.UIString('Switch to pan mode'));
- section.addAlternateKeys(
+ const layersSection = UI.shortcutsScreen.section(Common.UIString('Layers Panel'));
+
+ layersSection.addAlternateKeys(UI.ShortcutsScreen.LayersPanelShortcuts.ResetView, Common.UIString('Reset view'));
+ layersSection.addAlternateKeys(
+ UI.ShortcutsScreen.LayersPanelShortcuts.PanMode, Common.UIString('Switch to pan mode'));
+ layersSection.addAlternateKeys(
UI.ShortcutsScreen.LayersPanelShortcuts.RotateMode, Common.UIString('Switch to rotate mode'));
- section.addAlternateKeys(
+ layersSection.addAlternateKeys(
UI.ShortcutsScreen.LayersPanelShortcuts.TogglePanRotate,
Common.UIString('Temporarily toggle pan/rotate mode while held'));
- section.addAlternateKeys(UI.ShortcutsScreen.LayersPanelShortcuts.ZoomIn, Common.UIString('Zoom in'));
- section.addAlternateKeys(UI.ShortcutsScreen.LayersPanelShortcuts.ZoomOut, Common.UIString('Zoom out'));
- section.addRelatedKeys(
+ layersSection.addAlternateKeys(UI.ShortcutsScreen.LayersPanelShortcuts.ZoomIn, Common.UIString('Zoom in'));
+ layersSection.addAlternateKeys(UI.ShortcutsScreen.LayersPanelShortcuts.ZoomOut, Common.UIString('Zoom out'));
+ layersSection.addRelatedKeys(
UI.ShortcutsScreen.LayersPanelShortcuts.Up.concat(UI.ShortcutsScreen.LayersPanelShortcuts.Down),
Common.UIString('Pan or rotate up/down'));
- section.addRelatedKeys(
+ layersSection.addRelatedKeys(
UI.ShortcutsScreen.LayersPanelShortcuts.Left.concat(UI.ShortcutsScreen.LayersPanelShortcuts.Right),
Common.UIString('Pan or rotate left/right'));
}
@@ -402,6 +428,27 @@ UI.ShortcutsScreen.ElementsPanelShortcuts = {
DecrementBy01: [UI.KeyboardShortcut.makeDescriptor(UI.KeyboardShortcut.Keys.Down, UI.KeyboardShortcut.Modifiers.Alt)]
};
+UI.ShortcutsScreen.ConsolePanelShortcuts = {
+ AcceptSuggestion: [
+ UI.KeyboardShortcut.makeDescriptor(UI.KeyboardShortcut.Keys.Tab),
+ UI.KeyboardShortcut.makeDescriptor(UI.KeyboardShortcut.Keys.Right)
+ ],
+
+ ClearConsolePrompt: [UI.KeyboardShortcut.makeDescriptor('u', UI.KeyboardShortcut.Modifiers.Ctrl)],
+
+ ExecuteCommand: UI.KeyboardShortcut.makeDescriptor(UI.KeyboardShortcut.Keys.Enter),
+
+ NextPreviousLine: [
+ UI.KeyboardShortcut.makeDescriptor(UI.KeyboardShortcut.Keys.Down),
+ UI.KeyboardShortcut.makeDescriptor(UI.KeyboardShortcut.Keys.Up)
+ ],
+
+ NextPreviousCommand: [
+ UI.KeyboardShortcut.makeDescriptor('N', UI.KeyboardShortcut.Modifiers.Alt),
+ UI.KeyboardShortcut.makeDescriptor('P', UI.KeyboardShortcut.Modifiers.Alt)
+ ],
+};
+
UI.ShortcutsScreen.SourcesPanelShortcuts = {
SelectNextOccurrence: [UI.KeyboardShortcut.makeDescriptor('d', UI.KeyboardShortcut.Modifiers.CtrlOrMeta)],
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/ui/SoftContextMenu.js b/chromium/third_party/blink/renderer/devtools/front_end/ui/SoftContextMenu.js
index e67dd08002c..accf2332f47 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/ui/SoftContextMenu.js
+++ b/chromium/third_party/blink/renderer/devtools/front_end/ui/SoftContextMenu.js
@@ -138,10 +138,13 @@ UI.SoftContextMenu = class {
menuItemElement._actionId = item.id;
let accessibleName = item.label;
- if (item.checked)
- accessibleName += ', checked';
- if (item.shortcut)
- accessibleName += ', ' + item.shortcut;
+ if (item.checked && item.shortcut)
+ accessibleName = ls`${item.label}, checked, ${item.shortcut}`;
+ else if (item.shortcut)
+ accessibleName = ls`${item.label}, ${item.shortcut}`;
+ else if (item.checked)
+ accessibleName = ls`${item.label}, checked`;
+
UI.ARIAUtils.setAccessibleName(menuItemElement, accessibleName);
return menuItemElement;
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/ui/SoftDropDown.js b/chromium/third_party/blink/renderer/devtools/front_end/ui/SoftDropDown.js
index 6d21c347456..799b2e29ada 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/ui/SoftDropDown.js
+++ b/chromium/third_party/blink/renderer/devtools/front_end/ui/SoftDropDown.js
@@ -15,6 +15,8 @@ UI.SoftDropDown = class {
this._selectedItem = null;
this._model = model;
+ this._placeholderText = ls`(no item selected)`;
+
this.element = createElementWithClass('button', 'soft-dropdown');
UI.appendStyle(this.element, 'ui/softDropDownButton.css');
this._titleElement = this.element.createChild('span', 'title');
@@ -183,6 +185,15 @@ UI.SoftDropDown = class {
}
/**
+ * @param {string} text
+ */
+ setPlaceholderText(text) {
+ this._placeholderText = text;
+ if (!this._selectedItem)
+ this._titleElement.textContent = this._placeholderText;
+ }
+
+ /**
* @param {!Common.Event} event
*/
_itemsReplaced(event) {
@@ -202,7 +213,7 @@ UI.SoftDropDown = class {
if (this._selectedItem)
this._titleElement.textContent = this._delegate.titleFor(this._selectedItem);
else
- this._titleElement.textContent = '';
+ this._titleElement.textContent = this._placeholderText;
this._delegate.itemSelected(this._selectedItem);
}
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/ui/SuggestBox.js b/chromium/third_party/blink/renderer/devtools/front_end/ui/SuggestBox.js
index d3cd95eee53..f460d14f58b 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/ui/SuggestBox.js
+++ b/chromium/third_party/blink/renderer/devtools/front_end/ui/SuggestBox.js
@@ -365,7 +365,8 @@ UI.SuggestBox = class {
* priority: (number|undefined),
* isSecondary: (boolean|undefined),
* subtitleRenderer: (function():!Element|undefined),
- * selectionRange: ({startColumn: number, endColumn: number}|undefined)
+ * selectionRange: ({startColumn: number, endColumn: number}|undefined),
+ * hideGhostText: (boolean|undefined)
* }}
*/
UI.SuggestBox.Suggestion;
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/ui/TextPrompt.js b/chromium/third_party/blink/renderer/devtools/front_end/ui/TextPrompt.js
index 16a47b549ce..b0e26a1d3d7 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/ui/TextPrompt.js
+++ b/chromium/third_party/blink/renderer/devtools/front_end/ui/TextPrompt.js
@@ -148,9 +148,9 @@ UI.TextPrompt = class extends Common.Object {
*/
textWithCurrentSuggestion() {
const text = this.text();
- if (!this._queryRange)
+ if (!this._queryRange || !this._currentSuggestion)
return text;
- const suggestion = this._currentSuggestion ? this._currentSuggestion.text : '';
+ const suggestion = this._currentSuggestion.text;
return text.substring(0, this._queryRange.startColumn) + suggestion + text.substring(this._queryRange.endColumn);
}
@@ -379,6 +379,10 @@ UI.TextPrompt = class extends Common.Object {
}
_refreshGhostText() {
+ if (this._currentSuggestion && this._currentSuggestion.hideGhostText) {
+ this._ghostTextElement.remove();
+ return;
+ }
if (this._queryRange && this._currentSuggestion && this._isCaretAtEndOfPrompt() &&
this._currentSuggestion.text.startsWith(this.text().substring(this._queryRange.startColumn))) {
this._ghostTextElement.textContent =
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/ui/Tooltip.js b/chromium/third_party/blink/renderer/devtools/front_end/ui/Tooltip.js
index 253f22fe793..765893a4e2b 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/ui/Tooltip.js
+++ b/chromium/third_party/blink/renderer/devtools/front_end/ui/Tooltip.js
@@ -62,11 +62,12 @@ UI.Tooltip = class {
this._hide(false);
for (const element of path) {
- // The offsetParent is null when the element or an ancestor has 'display: none'.
- if (!(element instanceof Element) || element === this._anchorElement ||
- (element.nodeName !== 'SLOT' && element.offsetParent === null)) {
+ if (element === this._anchorElement)
return;
- } else if (element[UI.Tooltip._symbol]) {
+ // The offsetParent is null when the element or an ancestor has 'display: none'.
+ if (!(element instanceof Element) || element.offsetParent === null)
+ continue;
+ if (element[UI.Tooltip._symbol]) {
this._show(element, mouseEvent);
return;
}
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/ui/filter.css b/chromium/third_party/blink/renderer/devtools/front_end/ui/filter.css
index b09df818315..eb39eced25c 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/ui/filter.css
+++ b/chromium/third_party/blink/renderer/devtools/front_end/ui/filter.css
@@ -93,13 +93,6 @@
background: rgba(0, 0, 0, 0.5);
}
-.filter-combobox-filter {
- margin-left: 5px;
- margin-right: 2px;
- flex: 0 0 auto;
- display: inline-block;
-}
-
.filter-checkbox-filter {
padding-left: 4px;
padding-right: 2px;
@@ -117,19 +110,6 @@
margin: auto 0;
}
-.filter-checkbox-filter .checkbox-filter-checkbox {
- width: 10px;
- height: 10px;
- margin: auto 3px;
- padding: 0;
- border-radius: 2px;
- border: solid 1px;
- display: inline-block;
- overflow: visible;
- opacity: 0.8;
- flex-shrink: 0;
-}
-
.filter-input-field {
margin: 0 3px;
padding-left: 3px;
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/ui/inspectorCommon.css b/chromium/third_party/blink/renderer/devtools/front_end/ui/inspectorCommon.css
index 5cbb2c7f9b6..525ae58605e 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/ui/inspectorCommon.css
+++ b/chromium/third_party/blink/renderer/devtools/front_end/ui/inspectorCommon.css
@@ -102,10 +102,6 @@ iframe.fill {
flex: auto;
}
-.flex-auto-important {
- flex: auto !important;
-}
-
.flex-none {
flex: none;
}
@@ -440,3 +436,14 @@ span[is=dt-icon-label] {
:host-context(.-theme-with-dark-background) *::selection {
background-color: #9e9e9e;
}
+
+button.link {
+ border: none;
+ background: none;
+ padding: 3px;
+}
+
+button.link[data-keyboard-focus="true"]:focus {
+ background-color: rgba(0, 0, 0, 0.08);
+ border-radius: 2px;
+}
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/ui/inspectorSyntaxHighlight.css b/chromium/third_party/blink/renderer/devtools/front_end/ui/inspectorSyntaxHighlight.css
index 1ea9518593c..0a49a009d4c 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/ui/inspectorSyntaxHighlight.css
+++ b/chromium/third_party/blink/renderer/devtools/front_end/ui/inspectorSyntaxHighlight.css
@@ -134,12 +134,6 @@
color: hsl(0, 0%, 67%);
}
-.webkit-html-end-of-file {
- /* Keep this in sync with view-source.css (.webkit-html-end-of-file) */
- color: rgb(255, 0, 0);
- font-weight: bold;
-}
-
/* Default CodeMirror Theme */
.cm-negative {color: #d44;}
.cm-positive {color: #292;}
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/ui/inspectorSyntaxHighlightDark.css b/chromium/third_party/blink/renderer/devtools/front_end/ui/inspectorSyntaxHighlightDark.css
index 03463733dea..011ca04f99d 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/ui/inspectorSyntaxHighlightDark.css
+++ b/chromium/third_party/blink/renderer/devtools/front_end/ui/inspectorSyntaxHighlightDark.css
@@ -59,16 +59,7 @@
.webkit-html-css-node{color:rgb(207, 208, 208);}
.webkit-html-js-node{color:rgb(207, 208, 208);}
.webkit-html-pseudo-element{color:rgb(93, 175, 215);}
-.webkit-css-selector{color:rgb(255, 163, 79);}
-.webkit-css-at-rule{color:rgb(188, 164, 197);}
-.webkit-css-color{color:rgb(255, 163, 79);}
-.webkit-css-comment{color:rgb(116, 116, 116);}
-.webkit-css-important{color:rgb(255, 26, 26);}
-.webkit-css-keyword{color:rgb(255, 163, 79);}
-.webkit-css-number{color:rgb(217, 217, 217);}
.webkit-css-property{color: rgb(53, 212, 199);}
-.webkit-css-string{color:rgb(231, 194, 111);}
-.webkit-css-url{color:rgb(231, 194, 111);}
.cm-def{color:var(--dom-tag-name-color);}
.cm-header{color:var(--dom-tag-name-color);}
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/ui/reportView.css b/chromium/third_party/blink/renderer/devtools/front_end/ui/reportView.css
index 50c2f2f446a..e9250f884e7 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/ui/reportView.css
+++ b/chromium/third_party/blink/renderer/devtools/front_end/ui/reportView.css
@@ -91,3 +91,7 @@
color: #888;
line-height: 14px;
}
+
+.report-row-selectable {
+ user-select: text;
+}
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/ui/splitWidget.css b/chromium/third_party/blink/renderer/devtools/front_end/ui/splitWidget.css
index 58edda6c40b..b4f60ae9398 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/ui/splitWidget.css
+++ b/chromium/third_party/blink/renderer/devtools/front_end/ui/splitWidget.css
@@ -66,10 +66,6 @@
z-index: 500;
}
-.shadow-split-widget-resizer-border {
- pointer-events: none;
-}
-
.shadow-split-widget.vbox > .shadow-split-widget-sidebar.no-default-splitter {
border: 0 !important;
}
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/ui/treeoutline.css b/chromium/third_party/blink/renderer/devtools/front_end/ui/treeoutline.css
index 3664057f1d7..baae3780135 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/ui/treeoutline.css
+++ b/chromium/third_party/blink/renderer/devtools/front_end/ui/treeoutline.css
@@ -68,10 +68,6 @@ ol.tree-outline,
list-style-type: none;
}
-.tree-outline-no-padding {
- padding: 0;
-}
-
.tree-outline ol {
padding-left: 12px;
}
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/ui/ui_strings.grdp b/chromium/third_party/blink/renderer/devtools/front_end/ui/ui_strings.grdp
new file mode 100644
index 00000000000..cd35e680a95
--- /dev/null
+++ b/chromium/third_party/blink/renderer/devtools/front_end/ui/ui_strings.grdp
@@ -0,0 +1,291 @@
+<?xml version="1.0" encoding="utf-8"?>
+<grit-part>
+ <message name="IDS_DEVTOOLS_00618c7a664449da0ec12190348c685a" desc="">
+ Switch between files with the same name and different extensions.
+ </message>
+ <message name="IDS_DEVTOOLS_0118d8300f0ad71843ef9f47acca779f" desc="">
+ Close others
+ </message>
+ <message name="IDS_DEVTOOLS_02b411e36e8eaa1f554ca176a106a79d" desc="">
+ <ph name="MEGABYTES">$1.0f</ph> MB
+ </message>
+ <message name="IDS_DEVTOOLS_0c89face91afb1a048a34349404d11c0" desc="">
+ Add selection to watch
+ </message>
+ <message name="IDS_DEVTOOLS_0cbca9a34ab68b4be10dd4d09dd61bfd" desc="">
+ Search previous
+ </message>
+ <message name="IDS_DEVTOOLS_0d76841780a2811f3c24a4f8faf129d0" desc="">
+ Show previous/next recording
+ </message>
+ <message name="IDS_DEVTOOLS_0ebe6df8a3ac338e0512acc741823fdb" desc="">
+ Replace
+ </message>
+ <message name="IDS_DEVTOOLS_0f8854fb5bc175b0cd33a1e8518b366f" desc="">
+ Switch to pan mode
+ </message>
+ <message name="IDS_DEVTOOLS_10f0bad7213cafe18fb1cf55180a11da" desc="">
+ (async)
+ </message>
+ <message name="IDS_DEVTOOLS_1299e7f10b9d0110e7fa5368d1307500" desc="">
+ long text was truncated (<ph name="TOTALBYTES">$1s</ph>)
+ </message>
+ <message name="IDS_DEVTOOLS_16d0b9499edfdb8274382a91686ae1ae" desc="">
+ Performance Panel
+ </message>
+ <message name="IDS_DEVTOOLS_17d440bf27df66479f0fb39cb4f4ad09" desc="">
+ Reset view
+ </message>
+ <message name="IDS_DEVTOOLS_1d5f9d3b8b2be8824c18022f024a43a0" desc="">
+ Decrement value
+ </message>
+ <message name="IDS_DEVTOOLS_21e2320215eb46d452e7494f3dd1c798" desc="">
+ Next/previous property
+ </message>
+ <message name="IDS_DEVTOOLS_2c0924faed417c521b57d553c678ec21" desc="">
+ Step into
+ </message>
+ <message name="IDS_DEVTOOLS_2dfef1e9ae6e4da36eb0bbeea94742b9" desc="">
+ <ph name="MEGABYTES">$1.1f</ph> MB
+ </message>
+ <message name="IDS_DEVTOOLS_2ea54663ae9e3a586132a34a98d85ccf" desc="">
+ Async Call
+ </message>
+ <message name="IDS_DEVTOOLS_3a39eb38e879f66d1c57dedd478272da" desc="">
+ Open in new tab
+ </message>
+ <message name="IDS_DEVTOOLS_3b41735478b3a3fd8bcc06f6c7a6b56c" desc="">
+ Copy link address
+ </message>
+ <message name="IDS_DEVTOOLS_3b5f1c7ab5345e75ee764983f8091933" desc="">
+ Pan or rotate up/down
+ </message>
+ <message name="IDS_DEVTOOLS_3b9dc6454ee96394b3d853e8d597ebc6" desc="">
+ Increment value
+ </message>
+ <message name="IDS_DEVTOOLS_3f0b6654f9648ab6331823837c2b9f73" desc="">
+ Step over
+ </message>
+ <message name="IDS_DEVTOOLS_3f9eccbca028a6949c39933d13f82e56" desc="">
+ Step out
+ </message>
+ <message name="IDS_DEVTOOLS_44ac014b674d7d86a04702e6fd1fa858" desc="">
+ Reconnect when ready by reopening DevTools.
+ </message>
+ <message name="IDS_DEVTOOLS_47df0ee8f6dc4f553c907c49e686216c" desc="">
+ Memory Panel
+ </message>
+ <message name="IDS_DEVTOOLS_47e0270ab1827aab8faa1c85d89bd48f" desc="">
+ <ph name="UI_KEYBOARDSHORTCUT_SHORTCUTTOSTRING_____UI_KEYBOARDSHORTCUT_MODIFIERS_CTRLORMETA_">$1s</ph>Click to select multiple types
+ </message>
+ <message name="IDS_DEVTOOLS_4819fdb79641baf4a4c8a2ca2159a312" desc="">
+ <ph name="BYTES">$1.0f</ph> B
+ </message>
+ <message name="IDS_DEVTOOLS_48f12760504bf8e958a4bdde56d4fa46" desc="">
+ 1 match
+ </message>
+ <message name="IDS_DEVTOOLS_4b50fa6fd1a6a30c9b16f71dd2600574" desc="">
+ Jump to next editing location
+ </message>
+ <message name="IDS_DEVTOOLS_4c4306efb0e40e97e5f8693613b1fcfd" desc="">
+ Go to matching bracket
+ </message>
+ <message name="IDS_DEVTOOLS_4f348d8d1f134f0980102a4a6508cd5e" desc="">
+ Pan or rotate left/right
+ </message>
+ <message name="IDS_DEVTOOLS_52ebc26c2921d5b84fc670dff9891821" desc="">
+ Zoom out
+ </message>
+ <message name="IDS_DEVTOOLS_534d1b2eaff704d4888de7c4a5e282c0" desc="">
+ Debugging connection was closed. Reason:
+ </message>
+ <message name="IDS_DEVTOOLS_5372591390f99dcf8e0467c671abbc23" desc="">
+ Switch to rotate mode
+ </message>
+ <message name="IDS_DEVTOOLS_56797cefb1efc9130f7c48a7d1db0f0c" desc="">
+ Panels
+ </message>
+ <message name="IDS_DEVTOOLS_5ccb2f9327ce0aba7567b62e9e1d15a5" desc="">
+ Close tabs to the right
+ </message>
+ <message name="IDS_DEVTOOLS_5d3d95cb74ad59528ab385023f8a2a39" desc="">
+ Save profile
+ </message>
+ <message name="IDS_DEVTOOLS_63e29f78b2e7788d9234a5790897fa71" desc="">
+ DevTools was disconnected from the page.
+ </message>
+ <message name="IDS_DEVTOOLS_650654cb12c12b00e68b4384e0aede82" desc="">
+ <ph name="THIS__ONLYCOMPLETION_TEXT">$1s</ph>, suggestion
+ </message>
+ <message name="IDS_DEVTOOLS_678b7bbae3b9b67cee8bce1fac3067d7" desc="">
+ Full list of DevTools keyboard shortcuts and gestures
+ </message>
+ <message name="IDS_DEVTOOLS_6a5fa3625d6317cd74f686720d9c411e" desc="">
+ Promise rejected
+ </message>
+ <message name="IDS_DEVTOOLS_6e0e121820384f135321cb766273f4da" desc="">
+ Soft undo
+ </message>
+ <message name="IDS_DEVTOOLS_6ed5ccb02cd39be4a7a98739f5696d43" desc="">
+ Record page reload
+ </message>
+ <message name="IDS_DEVTOOLS_7102e4c0bf381bdbaa934e3dccb5b283" desc="">
+ (anonymous)
+ </message>
+ <message name="IDS_DEVTOOLS_71fc9f874ad2b8e691e9e797eda7d353" desc="">
+ Expand/collapse
+ </message>
+ <message name="IDS_DEVTOOLS_728618db1e2c850d3f7363ff2768d6b6" desc="">
+ Increment CSS unit by 10
+ </message>
+ <message name="IDS_DEVTOOLS_7423ba80f2fff2568d2c642c6be84ede" desc="">
+ Close drawer
+ </message>
+ <message name="IDS_DEVTOOLS_75cfe68daf4ccd62d15e9e0fb5ec1097" desc="">
+ Increment CSS unit by 1
+ </message>
+ <message name="IDS_DEVTOOLS_76f8c7ad696be0b330b46afe79ac279d" desc="">
+ Start/stop recording
+ </message>
+ <message name="IDS_DEVTOOLS_79fb17b82d0adb283dc78efc0d7f73e8" desc="">
+ Temporarily toggle pan/rotate mode while held
+ </message>
+ <message name="IDS_DEVTOOLS_7b91156d64b76a5dda815937fce9119d" desc="">
+ Zoom in
+ </message>
+ <message name="IDS_DEVTOOLS_7cf206a681131cf4d86fc190f2d9ad27" desc="">
+ Reconnect DevTools
+ </message>
+ <message name="IDS_DEVTOOLS_7dce122004969d56ae2e0245cb754d35" desc="">
+ Edit
+ </message>
+ <message name="IDS_DEVTOOLS_84e1d403df34bad00840ee636021698c" desc="">
+ Close <ph name="THIS_TITLE">$1s</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_860429066968657205b314b6b4143da7" desc="">
+ Layers Panel
+ </message>
+ <message name="IDS_DEVTOOLS_86e8f8f8327d28b74e5bd3ab581f77ee" desc="">
+ e.g. /small[\d]+/ url:a.com/b
+ </message>
+ <message name="IDS_DEVTOOLS_89345110b204ed302eddff2ddbd0f4d9" desc="">
+ Toggle breakpoint enabled
+ </message>
+ <message name="IDS_DEVTOOLS_894dab8359b886762113f6b64ce9f107" desc="">
+ Replace all
+ </message>
+ <message name="IDS_DEVTOOLS_8e44b2127a4fb456a78feced6731a496" desc="">
+ <ph name="CURRENTMATCHINDEX____">$1d</ph> of <ph name="MATCHES">$2d</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_925f3a6eef3896d617fc0ab413f9c123" desc="">
+ <ph name="MATCHES">$1d</ph> matches
+ </message>
+ <message name="IDS_DEVTOOLS_92d347b9338f3ffaa227ee482078bbb7" desc="">
+ Toggle comment
+ </message>
+ <message name="IDS_DEVTOOLS_966f6f045ff62d8c920c755930f4fd7b" desc="">
+ Toggle edit as HTML
+ </message>
+ <message name="IDS_DEVTOOLS_96ec2a08daf01bc10adc6e4ac4c76ceb" desc="">
+ Decrement CSS unit by 10
+ </message>
+ <message name="IDS_DEVTOOLS_96fb9e0d650af5b1fc4ec6c7bc11b49b" desc="">
+ More Tools
+ </message>
+ <message name="IDS_DEVTOOLS_9f52d2760e4266c7904c59fd9d3e7321" desc="">
+ Pick a recording from history
+ </message>
+ <message name="IDS_DEVTOOLS_9f98ff6e7e9fd0475daeb2005234ab5d" desc="">
+ <ph name="KILOBYTES">$1.0f</ph> KB
+ </message>
+ <message name="IDS_DEVTOOLS_a7659dc1b20557ca85c11efc57ace59f" desc="">
+ Toggle all breakpoints
+ </message>
+ <message name="IDS_DEVTOOLS_a950da8e902568f9a6879abe4313efe7" desc="">
+ Once page is reloaded, DevTools will automatically reconnect.
+ </message>
+ <message name="IDS_DEVTOOLS_addec426932e71323700afa1911f8f1c" desc="">
+ more
+ </message>
+ <message name="IDS_DEVTOOLS_ae240dc70adad29732bb1fdf0c746b84" desc="">
+ <ph name="KILOBYTES">$1.1f</ph> KB
+ </message>
+ <message name="IDS_DEVTOOLS_b014fff4db17dba07ddb6ea5efafd32e" desc="">
+ Jump to previous/next frame
+ </message>
+ <message name="IDS_DEVTOOLS_b1402575685f74c0c38dabac64e95cc0" desc="">
+ Navigate elements
+ </message>
+ <message name="IDS_DEVTOOLS_b228e7bd736e688236ab3aa37996bf8f" desc="">
+ Decrement by <ph name="__">$1f</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_b79165bf6163186253ed04568e1aee11" desc="">
+ Pause/ Continue
+ </message>
+ <message name="IDS_DEVTOOLS_b79f0c59be8253d3acb4515071312bda" desc="">
+ Hide <ph name="THIS__SHOWHIDESIDEBARBUTTONTITLE">$1s</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_b7ad6a024765bbfbff22dedf9afe0d17" desc="">
+ Jump to previous editing location
+ </message>
+ <message name="IDS_DEVTOOLS_bc39d641a1e16fb73f2ce5520d250ed0" desc="">
+ Go to member
+ </message>
+ <message name="IDS_DEVTOOLS_bd474df0d4b1bb32aac1b31560b962fb" desc="">
+ Next/previous call frame
+ </message>
+ <message name="IDS_DEVTOOLS_c449b64ade0e464abfc5cb5368775233" desc="">
+ Decrement CSS unit by 1
+ </message>
+ <message name="IDS_DEVTOOLS_d06337cfbcc777e0a7caa50ef1a9986a" desc="">
+ More tabs
+ </message>
+ <message name="IDS_DEVTOOLS_d2923d7d060c61c17d06c22166b2be41" desc="">
+ Promise resolved
+ </message>
+ <message name="IDS_DEVTOOLS_d9f57fb1f634a4e047fd69b574434c7f" desc="">
+ Evaluate selection in console
+ </message>
+ <message name="IDS_DEVTOOLS_dd73c24f4702950125e2fcb7d26ca5fe" desc="">
+ Show more (<ph name="TOTALBYTES">$1s</ph>)
+ </message>
+ <message name="IDS_DEVTOOLS_dd92c3884d43902407a4c2f0d8cc0eb1" desc="">
+ Toggle breakpoint
+ </message>
+ <message name="IDS_DEVTOOLS_e0aa021e21dddbd6d8cecec71e9cf564" desc="">
+ OK
+ </message>
+ <message name="IDS_DEVTOOLS_e0f1691bdb67d9859e5a6a8d7c26e6a1" desc="">
+ Text Editor
+ </message>
+ <message name="IDS_DEVTOOLS_e118bd20c49240fd8387f3bd901cb4f1" desc="">
+ Load profile
+ </message>
+ <message name="IDS_DEVTOOLS_e6290b661dba9591e4c505fb50257d0c" desc="">
+ Search next
+ </message>
+ <message name="IDS_DEVTOOLS_e7a555523728cc11719011fa5a7e77ba" desc="">
+ Select next occurrence
+ </message>
+ <message name="IDS_DEVTOOLS_e81c4e4f2b7b93b481e13a8553c2ae1b" desc="">
+ or
+ </message>
+ <message name="IDS_DEVTOOLS_e9947a82726be2fb77368eb27c082402" desc="">
+ (no item selected)
+ </message>
+ <message name="IDS_DEVTOOLS_f68d3333dcde01f3ef29184f1bcdf1c5" desc="">
+ never show
+ </message>
+ <message name="IDS_DEVTOOLS_f6c46678b34ad4b4c0241c9487a26b59" desc="">
+ Increment by <ph name="__">$1f</ph>
+ </message>
+ <message name="IDS_DEVTOOLS_f8fbc6412a360fc4f854f34a776e2af2" desc="">
+ Another profiler is already active
+ </message>
+ <message name="IDS_DEVTOOLS_fa66e32280e1ee04b8e8cd36626b65f0" desc="">
+ Close editor tab
+ </message>
+ <message name="IDS_DEVTOOLS_fbbbb283efc814825613301c22951ba7" desc="">
+ Close all
+ </message>
+</grit-part> \ No newline at end of file
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/ui/viewContainers.css b/chromium/third_party/blink/renderer/devtools/front_end/ui/viewContainers.css
index 5b720a794f4..3a73ed046ef 100644
--- a/chromium/third_party/blink/renderer/devtools/front_end/ui/viewContainers.css
+++ b/chromium/third_party/blink/renderer/devtools/front_end/ui/viewContainers.css
@@ -27,10 +27,6 @@
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-.sidebar-hidden-override {
- display: none !important;
-}
-
.expandable-view-title {
display: flex;
align-items: center;
@@ -72,10 +68,3 @@
top: 0;
}
-.sidebar-pane-container .toolbar {
- border-bottom: 1px solid #eee;
-}
-
-.sidebar-pane-container .toolbar > * {
- pointer-events: auto;
-}
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/web_audio/AudioContextContentBuilder.js b/chromium/third_party/blink/renderer/devtools/front_end/web_audio/AudioContextContentBuilder.js
new file mode 100644
index 00000000000..714d40d1c33
--- /dev/null
+++ b/chromium/third_party/blink/renderer/devtools/front_end/web_audio/AudioContextContentBuilder.js
@@ -0,0 +1,89 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+WebAudio.ContextDetailBuilder = class {
+ /**
+ * @param {!Protocol.WebAudio.BaseAudioContext} context
+ */
+ constructor(context) {
+ this._fragment = createDocumentFragment();
+ this._container = createElementWithClass('div', 'context-detail-container');
+ this._fragment.appendChild(this._container);
+ this._build(context);
+ }
+
+ /**
+ * @param {!Protocol.WebAudio.BaseAudioContext} context
+ */
+ _build(context) {
+ const title = context.contextType === 'realtime' ? ls`AudioContext` : ls`OfflineAudioContext`;
+ this._addTitle(title, context.contextId);
+ this._addEntry(ls`State`, context.contextState);
+ this._addEntry(ls`Sample Rate`, context.sampleRate, 'Hz');
+ if (context.contextType === 'realtime')
+ this._addEntry(ls`Callback Buffer Size`, context.callbackBufferSize, 'frames');
+ this._addEntry(ls`Max Output Channels`, context.maxOutputChannelCount, 'ch');
+ }
+
+ /**
+ * @param {string} title
+ * @param {string} subtitle
+ */
+ _addTitle(title, subtitle) {
+ this._container.appendChild(UI.html`
+ <div class="context-detail-header">
+ <div class="context-detail-title">${title}</div>
+ <div class="context-detail-subtitle">${subtitle}</div>
+ </div>
+ `);
+ }
+
+ /**
+ * @param {string} entry
+ * @param {(string|number)} value
+ * @param {string=} unit
+ */
+ _addEntry(entry, value, unit) {
+ const valueWithUnit = value + (unit ? ` ${unit}` : '');
+ this._container.appendChild(UI.html`
+ <div class="context-detail-row">
+ <div class="context-detail-row-entry">${entry}</div>
+ <div class="context-detail-row-value">${valueWithUnit}</div>
+ </div>
+ `);
+ }
+
+ /**
+ * @return {!DocumentFragment}
+ */
+ getFragment() {
+ return this._fragment;
+ }
+};
+
+WebAudio.AudioContextSummaryBuilder = class {
+ /**
+ * @param {!Protocol.WebAudio.ContextId} contextId
+ * @param {!Protocol.WebAudio.ContextRealtimeData} contextRealtimeData
+ */
+ constructor(contextId, contextRealtimeData) {
+ const time = contextRealtimeData.currentTime.toFixed(3);
+ const capacity = (contextRealtimeData.renderCapacity * 100).toFixed(3);
+ this._fragment = createDocumentFragment();
+ this._fragment.appendChild(UI.html`
+ <div class="context-summary-container">
+ <span>${ls`Current Time`}: ${time} s</span>
+ <span>\u2758</span>
+ <span>${ls`Render Capacity`}: ${capacity} %</span>
+ </div>
+ `);
+ }
+
+ /**
+ * @return {!DocumentFragment}
+ */
+ getFragment() {
+ return this._fragment;
+ }
+}; \ No newline at end of file
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/web_audio/AudioContextSelector.js b/chromium/third_party/blink/renderer/devtools/front_end/web_audio/AudioContextSelector.js
new file mode 100644
index 00000000000..f40f41cf7f5
--- /dev/null
+++ b/chromium/third_party/blink/renderer/devtools/front_end/web_audio/AudioContextSelector.js
@@ -0,0 +1,157 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @implements {UI.SoftDropDown.Delegate<!Protocol.WebAudio.BaseAudioContext>}
+ */
+WebAudio.AudioContextSelector = class extends Common.Object {
+ constructor(title) {
+ super();
+
+ /** @type {!UI.ListModel<!Protocol.WebAudio.BaseAudioContext>} */
+ this._items = new UI.ListModel();
+
+ /** @type {!UI.SoftDropDown<!Protocol.WebAudio.BaseAudioContext>} */
+ this._dropDown = new UI.SoftDropDown(this._items, this);
+ this._dropDown.setPlaceholderText(ls`(no recordings)`);
+
+ this._toolbarItem = new UI.ToolbarItem(this._dropDown.element);
+ this._toolbarItem.setEnabled(false);
+ this._toolbarItem.setTitle(title);
+ this._items.addEventListener(UI.ListModel.Events.ItemsReplaced, this._onListItemReplaced, this);
+ this._toolbarItem.element.classList.add('toolbar-has-dropdown');
+
+ /** @type {?Protocol.WebAudio.BaseAudioContext} */
+ this._selectedContext = null;
+ }
+
+ _onListItemReplaced() {
+ this._toolbarItem.setEnabled(!!this._items.length);
+ }
+
+ /**
+ * @param {!Common.Event} event
+ */
+ contextCreated(event) {
+ const context = /** @type {!Protocol.WebAudio.BaseAudioContext} */ (event.data);
+ this._items.insert(this._items.length, context);
+
+ // Select if this is the first item.
+ if (this._items.length === 1)
+ this._dropDown.selectItem(context);
+ }
+
+ /**
+ * @param {!Common.Event} event
+ */
+ contextDestroyed(event) {
+ const contextId = /** @type {!Protocol.WebAudio.ContextId} */ (event.data);
+ const contextIndex = this._items.findIndex(context => context.contextId === contextId);
+ if (contextIndex > -1)
+ this._items.remove(contextIndex);
+ }
+
+ /**
+ * @param {!Common.Event} event
+ */
+ contextChanged(event) {
+ const changedContext = /** @type {!Protocol.WebAudio.BaseAudioContext} */ (event.data);
+ const contextIndex = this._items.findIndex(context => context.contextId === changedContext.contextId);
+ if (contextIndex > -1) {
+ this._items.remove(contextIndex);
+ this._items.insert(contextIndex, changedContext);
+
+ // If the changed context is currently selected by user. Re-select it
+ // because the actual element is replaced with a new one.
+ if (this._selectedContext && this._selectedContext.contextId === changedContext.contextId)
+ this._dropDown.selectItem(changedContext);
+ }
+ }
+
+ /**
+ * @override
+ * @param {!Protocol.WebAudio.BaseAudioContext} item
+ * @return {!Element}
+ */
+ createElementForItem(item) {
+ const element = createElementWithClass('div');
+ const shadowRoot = UI.createShadowRootWithCoreStyles(element, 'web_audio/audioContextSelector.css');
+ const title = shadowRoot.createChild('div', 'title');
+ title.createTextChild(this.titleFor(item).trimEnd(100));
+ return element;
+ }
+
+ /**
+ * @return {?Protocol.WebAudio.BaseAudioContext}
+ */
+ selectedContext() {
+ if (!this._selectedContext)
+ return null;
+
+ return this._selectedContext;
+ }
+
+ /**
+ * @override
+ * @param {?Protocol.WebAudio.BaseAudioContext} from
+ * @param {?Protocol.WebAudio.BaseAudioContext} to
+ * @param {?Element} fromElement
+ * @param {?Element} toElement
+ */
+ highlightedItemChanged(from, to, fromElement, toElement) {
+ if (fromElement)
+ fromElement.classList.remove('highlighted');
+ if (toElement)
+ toElement.classList.add('highlighted');
+ }
+
+ /**
+ * @override
+ * @param {!Protocol.WebAudio.BaseAudioContext} item
+ * @return {boolean}
+ */
+ isItemSelectable(item) {
+ return true;
+ }
+
+ /**
+ * @override
+ * @param {?Protocol.WebAudio.BaseAudioContext} item
+ */
+ itemSelected(item) {
+ if (!item)
+ return;
+
+ // It's possible that no context is selected yet.
+ if (!this._selectedContext || this._selectedContext.contextId !== item.contextId)
+ this._selectedContext = item;
+
+ this.dispatchEventToListeners(WebAudio.AudioContextSelector.Events.ContextSelected, item);
+ }
+
+ reset() {
+ this._items.replaceAll([]);
+ }
+
+ /**
+ * @override
+ * @param {!Protocol.WebAudio.BaseAudioContext} context
+ * @return {string}
+ */
+ titleFor(context) {
+ return `${context.contextType} (${context.contextId.substr(-6)})`;
+ }
+
+ /**
+ * @return {!UI.ToolbarItem}
+ */
+ toolbarItem() {
+ return this._toolbarItem;
+ }
+};
+
+/** @enum {symbol} */
+WebAudio.AudioContextSelector.Events = {
+ ContextSelected: Symbol('ContextSelected')
+}; \ No newline at end of file
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/web_audio/WebAudioModel.js b/chromium/third_party/blink/renderer/devtools/front_end/web_audio/WebAudioModel.js
new file mode 100644
index 00000000000..aa1ee5ab7e6
--- /dev/null
+++ b/chromium/third_party/blink/renderer/devtools/front_end/web_audio/WebAudioModel.js
@@ -0,0 +1,115 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @implements {Protocol.WebAudioDispatcher}
+ */
+WebAudio.WebAudioModel = class extends SDK.SDKModel {
+ /**
+ * @param {!SDK.Target} target
+ */
+ constructor(target) {
+ super(target);
+
+ this._enabled = false;
+
+ /** @type {!Map<!Protocol.WebAudio.ContextId, !Protocol.WebAudio.BaseAudioContext>} */
+ this._contextMapById = new Map();
+
+ this._agent = target.webAudioAgent();
+ target.registerWebAudioDispatcher(this);
+
+ // TODO(crbug.com/963510): Some OfflineAudioContexts are not uninitialized
+ // properly because LifeCycleObserver::ContextDestroyed() is not fired for
+ // unknown reasons. This creates inconsistency in BaseAudioContextTracker
+ // and AudioContextSelector in DevTools.
+ //
+ // To resolve this inconsistency, we flush the leftover from the previous
+ // frame when the current page is loaded. This call can be omitted when the
+ // bug is fixed.
+ SDK.targetManager.addModelListener(
+ SDK.ResourceTreeModel, SDK.ResourceTreeModel.Events.FrameNavigated, this._flushContexts, this);
+ }
+
+ _flushContexts() {
+ this._contextMapById.clear();
+ this.dispatchEventToListeners(WebAudio.WebAudioModel.Events.ModelReset);
+ }
+
+ /**
+ * @override
+ * @return {!Promise}
+ */
+ suspendModel() {
+ this._contextMapById.clear();
+ return this._agent.disable();
+ }
+
+ /**
+ * @override
+ * @return {!Promise}
+ */
+ resumeModel() {
+ if (!this._enabled)
+ return Promise.resolve();
+ return this._agent.enable();
+ }
+
+ ensureEnabled() {
+ if (this._enabled)
+ return;
+ this._agent.enable();
+ this._enabled = true;
+ }
+
+ /**
+ * @param {!Protocol.WebAudio.BaseAudioContext} context
+ * @override
+ */
+ contextCreated(context) {
+ this._contextMapById.set(context.contextId, context);
+ this.dispatchEventToListeners(WebAudio.WebAudioModel.Events.ContextCreated, context);
+ }
+
+ /**
+ * @param {!Protocol.WebAudio.ContextId} contextId
+ * @override
+ */
+ contextDestroyed(contextId) {
+ this._contextMapById.delete(contextId);
+ this.dispatchEventToListeners(WebAudio.WebAudioModel.Events.ContextDestroyed, contextId);
+ }
+
+ /**
+ * @param {!Protocol.WebAudio.BaseAudioContext} context
+ * @override
+ */
+ contextChanged(context) {
+ if (!this._contextMapById.has(context.contextId))
+ return;
+
+ this._contextMapById.set(context.contextId, context);
+ this.dispatchEventToListeners(WebAudio.WebAudioModel.Events.ContextChanged, context);
+ }
+
+ /**
+ * @param {!Protocol.WebAudio.ContextId} contextId
+ * @return {!Promise<?Protocol.WebAudio.ContextRealtimeData>}
+ */
+ async requestRealtimeData(contextId) {
+ if (!this._contextMapById.has(contextId))
+ return Promise.resolve();
+ return await this._agent.getRealtimeData(contextId);
+ }
+};
+
+SDK.SDKModel.register(WebAudio.WebAudioModel, SDK.Target.Capability.DOM, false);
+
+/** @enum {symbol} */
+WebAudio.WebAudioModel.Events = {
+ ContextCreated: Symbol('ContextCreated'),
+ ContextDestroyed: Symbol('ContextDestroyed'),
+ ContextChanged: Symbol('ContextChanged'),
+ ModelReset: Symbol('ModelReset'),
+};
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/web_audio/WebAudioView.js b/chromium/third_party/blink/renderer/devtools/front_end/web_audio/WebAudioView.js
new file mode 100644
index 00000000000..67e85109b38
--- /dev/null
+++ b/chromium/third_party/blink/renderer/devtools/front_end/web_audio/WebAudioView.js
@@ -0,0 +1,185 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @implements {SDK.SDKModelObserver<!WebAudio.WebAudioModel>}
+ */
+WebAudio.WebAudioView = class extends UI.ThrottledWidget {
+ constructor() {
+ super(true, 1000);
+ this.element.classList.add('web-audio-drawer');
+ this.registerRequiredCSS('web_audio/webAudio.css');
+
+ // Creates the toolbar.
+ const toolbarContainer = this.contentElement.createChild(
+ 'div', 'web-audio-toolbar-container vbox');
+ this._contextSelector = new WebAudio.AudioContextSelector(ls`BaseAudioContexts`);
+ const toolbar = new UI.Toolbar('web-audio-toolbar', toolbarContainer);
+ toolbar.appendToolbarItem(UI.Toolbar.createActionButtonForId('components.collect-garbage'));
+ toolbar.appendSeparator();
+ toolbar.appendToolbarItem(this._contextSelector.toolbarItem());
+
+ // Creates the detail view.
+ this._detailViewContainer = this.contentElement.createChild('div', 'vbox flex-auto');
+
+ // Creates the landing page.
+ this._landingPage = new UI.VBox();
+ this._landingPage.contentElement.classList.add('web-audio-landing-page', 'fill');
+ this._landingPage.contentElement.appendChild(UI.html`
+ <div>
+ <p>${ls`Open a page that uses Web Audio API to start monitoring.`}</p>
+ </div>
+ `);
+ this._landingPage.show(this._detailViewContainer);
+
+ // Creates the summary bar.
+ this._summaryBarContainer = this.contentElement.createChild('div', 'web-audio-summary-container');
+
+ this._contextSelector.addEventListener(WebAudio.AudioContextSelector.Events.ContextSelected, event => {
+ const context =
+ /** @type {!Protocol.WebAudio.BaseAudioContext} */ (event.data);
+ this._updateDetailView(context);
+ this.doUpdate();
+ });
+
+ SDK.targetManager.observeModels(WebAudio.WebAudioModel, this);
+ }
+
+ /**
+ * @override
+ */
+ wasShown() {
+ for (const model of SDK.targetManager.models(WebAudio.WebAudioModel))
+ this._addEventListeners(model);
+ }
+
+ /**
+ * @override
+ */
+ willHide() {
+ for (const model of SDK.targetManager.models(WebAudio.WebAudioModel))
+ this._removeEventListeners(model);
+ }
+
+ /**
+ * @override
+ * @param {!WebAudio.WebAudioModel} webAudioModel
+ */
+ modelAdded(webAudioModel) {
+ if (this.isShowing())
+ this._addEventListeners(webAudioModel);
+ }
+
+ /**
+ * @override
+ * @param {!WebAudio.WebAudioModel} webAudioModel
+ */
+ modelRemoved(webAudioModel) {
+ this._removeEventListeners(webAudioModel);
+ }
+
+ /**
+ * @override
+ * @return {!Promise<?>}
+ */
+ async doUpdate() {
+ await this._pollRealtimeData();
+ this.update();
+ }
+
+ /**
+ * @param {!WebAudio.WebAudioModel} webAudioModel
+ */
+ _addEventListeners(webAudioModel) {
+ webAudioModel.ensureEnabled();
+ webAudioModel.addEventListener(WebAudio.WebAudioModel.Events.ContextCreated, this._contextCreated, this);
+ webAudioModel.addEventListener(WebAudio.WebAudioModel.Events.ContextDestroyed, this._contextDestroyed, this);
+ webAudioModel.addEventListener(WebAudio.WebAudioModel.Events.ContextChanged, this._contextChanged, this);
+ webAudioModel.addEventListener(WebAudio.WebAudioModel.Events.ModelReset, this._reset, this);
+ }
+
+ /**
+ * @param {!WebAudio.WebAudioModel} webAudioModel
+ */
+ _removeEventListeners(webAudioModel) {
+ webAudioModel.removeEventListener(WebAudio.WebAudioModel.Events.ContextCreated, this._contextCreated, this);
+ webAudioModel.removeEventListener(WebAudio.WebAudioModel.Events.ContextDestroyed, this._contextDestroyed, this);
+ webAudioModel.removeEventListener(WebAudio.WebAudioModel.Events.ContextChanged, this._contextChanged, this);
+ webAudioModel.removeEventListener(WebAudio.WebAudioModel.Events.ModelReset, this._reset, this);
+ }
+
+ /**
+ * @param {!Common.Event} event
+ */
+ _contextCreated(event) {
+ this._contextSelector.contextCreated(event);
+ }
+
+ /**
+ * @param {!Common.Event} event
+ */
+ _contextDestroyed(event) {
+ this._contextSelector.contextDestroyed(event);
+ }
+
+ /**
+ * @param {!Common.Event} event
+ */
+ _contextChanged(event) {
+ this._contextSelector.contextChanged(event);
+ }
+
+ _reset() {
+ if (this._landingPage.isShowing())
+ this._landingPage.detach();
+ this._contextSelector.reset();
+ this._detailViewContainer.removeChildren();
+ this._landingPage.show(this._detailViewContainer);
+ }
+
+ /**
+ * @param {!Protocol.WebAudio.BaseAudioContext} context
+ */
+ _updateDetailView(context) {
+ if (this._landingPage.isShowing())
+ this._landingPage.detach();
+ const detailBuilder = new WebAudio.ContextDetailBuilder(context);
+ this._detailViewContainer.removeChildren();
+ this._detailViewContainer.appendChild(detailBuilder.getFragment());
+ }
+
+ /**
+ * @param {!Protocol.WebAudio.ContextId} contextId
+ * @param {!Protocol.WebAudio.ContextRealtimeData} contextRealtimeData
+ */
+ _updateSummaryBar(contextId, contextRealtimeData) {
+ const summaryBuilder =
+ new WebAudio.AudioContextSummaryBuilder(contextId, contextRealtimeData);
+ this._summaryBarContainer.removeChildren();
+ this._summaryBarContainer.appendChild(summaryBuilder.getFragment());
+ }
+
+ _clearSummaryBar() {
+ this._summaryBarContainer.removeChildren();
+ }
+
+ async _pollRealtimeData() {
+ const context = this._contextSelector.selectedContext();
+ if (!context) {
+ this._clearSummaryBar();
+ return;
+ }
+
+ for (const model of SDK.targetManager.models(WebAudio.WebAudioModel)) {
+ // Display summary only for real-time context.
+ if (context.contextType === 'realtime') {
+ const realtimeData = await model.requestRealtimeData(context.contextId);
+ if (realtimeData && realtimeData.currentTime && realtimeData.renderCapacity)
+ this._updateSummaryBar(context.contextId, realtimeData);
+ } else {
+ this._clearSummaryBar();
+ }
+ }
+ }
+};
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/web_audio/audioContextSelector.css b/chromium/third_party/blink/renderer/devtools/front_end/web_audio/audioContextSelector.css
new file mode 100644
index 00000000000..a689f25cd3e
--- /dev/null
+++ b/chromium/third_party/blink/renderer/devtools/front_end/web_audio/audioContextSelector.css
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2019 The Chromium Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+:host {
+ padding: 2px 1px 2px 2px;
+ white-space: nowrap;
+ display: flex;
+ flex-direction: column;
+ height: 36px;
+ justify-content: center;
+}
+
+.title {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ flex-grow: 0;
+} \ No newline at end of file
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/web_audio/module.json b/chromium/third_party/blink/renderer/devtools/front_end/web_audio/module.json
new file mode 100644
index 00000000000..7212a6e642c
--- /dev/null
+++ b/chromium/third_party/blink/renderer/devtools/front_end/web_audio/module.json
@@ -0,0 +1,29 @@
+{
+ "extensions": [
+ {
+ "type": "view",
+ "location": "drawer-view",
+ "id": "web-audio",
+ "title": "WebAudio",
+ "persistence": "closeable",
+ "order": 100,
+ "className": "WebAudio.WebAudioView",
+ "tags": "audio"
+ }
+ ],
+ "dependencies": [
+ "components",
+ "sdk",
+ "ui"
+ ],
+ "scripts": [
+ "WebAudioModel.js",
+ "AudioContextSelector.js",
+ "AudioContextContentBuilder.js",
+ "WebAudioView.js"
+ ],
+ "resources": [
+ "webAudio.css",
+ "audioContextSelector.css"
+ ]
+} \ No newline at end of file
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/web_audio/webAudio.css b/chromium/third_party/blink/renderer/devtools/front_end/web_audio/webAudio.css
new file mode 100644
index 00000000000..0cbba877656
--- /dev/null
+++ b/chromium/third_party/blink/renderer/devtools/front_end/web_audio/webAudio.css
@@ -0,0 +1,97 @@
+/*
+ * Copyright 2019 The Chromium Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+:host {
+ overflow: hidden;
+}
+
+.web-audio-toolbar-container {
+ background-color: var(--toolbar-bg-color);
+ border-bottom: var(--divider-border);
+}
+
+.web-audio-toolbar {
+ display: inline-block;
+}
+
+.web-audio-landing-page {
+ position: absolute;
+ background-color: white;
+ justify-content: center;
+ align-items: center;
+ overflow: auto;
+ font-size: 13px;
+ color: #777;
+}
+
+.web-audio-landing-page > div {
+ max-width: 500px;
+ margin: 10px;
+}
+
+.web-audio-landing-page > div > p {
+ flex: none;
+ white-space: pre-line;
+}
+
+.context-detail-container {
+ flex: none;
+ display: flex;
+ background-color: white;
+ flex-direction: column;
+}
+
+.context-detail-header {
+ border-bottom: 1px solid rgb(230, 230, 230);
+ padding: 12px 24px;
+ margin-bottom: 10px;
+}
+
+.context-detail-title {
+ font-size: 15px;
+ font-weight: 400;
+}
+
+.context-detail-subtitle {
+ font-size: 12px;
+ margin-top: 10px;
+ user-select: text;
+}
+
+.context-detail-row {
+ flex-direction: row;
+ display: flex;
+ line-height: 18px;
+ padding-left: 24px;
+}
+
+.context-detail-row-entry:not(:empty) {
+ color: hsla(0, 0%, 46%, 1);
+ overflow: hidden;
+ width: 130px;
+}
+
+.context-detail-row-value {
+ user-select: text;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ overflow: hidden;
+}
+
+.context-summary-container {
+ flex: 0 0 27px;
+ line-height: 27px;
+ padding-left: 5px;
+ background-color: #eee;
+ border-top: 1px solid #ccc;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ overflow: hidden;
+}
+
+.context-summary-container span {
+ margin-right: 6px;
+}
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/web_audio/web_audio_strings.grdp b/chromium/third_party/blink/renderer/devtools/front_end/web_audio/web_audio_strings.grdp
new file mode 100644
index 00000000000..665fadf2bc7
--- /dev/null
+++ b/chromium/third_party/blink/renderer/devtools/front_end/web_audio/web_audio_strings.grdp
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<grit-part>
+ <message name="IDS_DEVTOOLS_13d286ca90ba61a4151f3dcb6e353cc8" desc="">
+ OfflineAudioContext
+ </message>
+ <message name="IDS_DEVTOOLS_28fce67b0d0976eaca9b69748126a6d2" desc="">
+ Open a page that uses Web Audio API to start monitoring.
+ </message>
+ <message name="IDS_DEVTOOLS_40097404a926dce6324e58f598bd7dcb" desc="">
+ Render Capacity
+ </message>
+ <message name="IDS_DEVTOOLS_40734192aacef5d658541080315dd644" desc="">
+ Callback Buffer Size
+ </message>
+ <message name="IDS_DEVTOOLS_545e39748691e8a65093c525011a321b" desc="">
+ Max Output Channels
+ </message>
+ <message name="IDS_DEVTOOLS_5f8695ebb8bc9a78c593ee7bfae153a5" desc="">
+ AudioContext
+ </message>
+ <message name="IDS_DEVTOOLS_b78dc7712ef83a078c1c68822d2a1a3f" desc="">
+ BaseAudioContexts
+ </message>
+ <message name="IDS_DEVTOOLS_f047f03535a9154caf9a858b5aed17c0" desc="">
+ Current Time
+ </message>
+ <message name="IDS_DEVTOOLS_f579f693ac9ecb3fb9e822bf32028e13" desc="">
+ Sample Rate
+ </message>
+</grit-part> \ No newline at end of file
diff --git a/chromium/third_party/blink/renderer/devtools/front_end/workspace/workspace_strings.grdp b/chromium/third_party/blink/renderer/devtools/front_end/workspace/workspace_strings.grdp
new file mode 100644
index 00000000000..a38a40556a7
--- /dev/null
+++ b/chromium/third_party/blink/renderer/devtools/front_end/workspace/workspace_strings.grdp
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<grit-part>
+ <message name="IDS_DEVTOOLS_818fc883495655418c9124800c52b7ee" desc="">
+ This file was changed externally. Would you like to reload it?
+ </message>
+</grit-part> \ No newline at end of file
diff --git a/chromium/third_party/blink/renderer/devtools/package.json b/chromium/third_party/blink/renderer/devtools/package.json
index 4a01845de94..2c03d53e7e3 100644
--- a/chromium/third_party/blink/renderer/devtools/package.json
+++ b/chromium/third_party/blink/renderer/devtools/package.json
@@ -15,6 +15,7 @@
"check-gn": "node scripts/check_gn.js",
"check-json": "node scripts/json_validator/validate_module_json.js",
"check-loc": "node scripts/check_localizability.js -a",
+ "check-grdp": "node scripts/check_localizable_resources.js",
"generate-jsconfig": "node scripts/generate_jsconfig.js"
},
"repository": {
diff --git a/chromium/third_party/blink/renderer/devtools/scripts/build/build_release_applications.py b/chromium/third_party/blink/renderer/devtools/scripts/build/build_release_applications.py
index 278719004b0..74e1c104275 100755
--- a/chromium/third_party/blink/renderer/devtools/scripts/build/build_release_applications.py
+++ b/chromium/third_party/blink/renderer/devtools/scripts/build/build_release_applications.py
@@ -184,7 +184,8 @@ class ReleaseBuilder(object):
for resource_name in resource_names:
resource_name = path.normpath(resource_name).replace('\\', '/')
output.write('Runtime.cachedResources["%s"] = "' % resource_name)
- resource_content = read_file(path.join(self.application_dir, resource_name)) + resource_source_url(resource_name)
+ resource_content = read_file(path.join(self.application_dir, resource_name))
+ resource_content += resource_source_url(resource_name).encode('utf-8')
resource_content = resource_content.replace('\\', '\\\\')
resource_content = resource_content.replace('\n', '\\n')
resource_content = resource_content.replace('"', '\\"')
diff --git a/chromium/third_party/blink/renderer/devtools/scripts/check_gn.js b/chromium/third_party/blink/renderer/devtools/scripts/check_gn.js
index cbf2f878007..b3af5ae0ec5 100644
--- a/chromium/third_party/blink/renderer/devtools/scripts/check_gn.js
+++ b/chromium/third_party/blink/renderer/devtools/scripts/check_gn.js
@@ -88,7 +88,9 @@ function checkAllDevToolsFiles() {
const moduleJSON = require(moduleJSONPath);
const scripts = moduleJSON.scripts || [];
const resources = moduleJSON.resources || [];
- const files = scripts.concat(resources)
+ const files = ['module.json']
+ .concat(scripts)
+ .concat(resources)
.map(relativePathFromBuildGN)
.filter(file => excludedFiles.every(excludedFile => !file.includes(excludedFile)));
moduleFiles = moduleFiles.concat(files);
diff --git a/chromium/third_party/blink/renderer/devtools/scripts/check_localizability.js b/chromium/third_party/blink/renderer/devtools/scripts/check_localizability.js
index be7fe4c1710..30102a702b1 100644
--- a/chromium/third_party/blink/renderer/devtools/scripts/check_localizability.js
+++ b/chromium/third_party/blink/renderer/devtools/scripts/check_localizability.js
@@ -11,21 +11,11 @@
// In this case, add it to the excluded errors at the top of the script.
const path = require('path');
+const localizationUtils = require('./localization_utils/localization_utils');
+const esprimaTypes = localizationUtils.esprimaTypes;
+const escodegen = localizationUtils.escodegen;
+const esprima = localizationUtils.esprima;
-// Use modules in third_party/node/node_modules
-const THIRD_PARTY_PATH = path.resolve(__dirname, '..', '..', '..', '..');
-const REPO_NODE_MODULES_PATH = path.resolve(THIRD_PARTY_PATH, 'node', 'node_modules');
-const escodegen = require(path.resolve(REPO_NODE_MODULES_PATH, 'escodegen'));
-const esprima = require(path.resolve(REPO_NODE_MODULES_PATH, 'esprima'));
-
-const fs = require('fs');
-const {promisify} = require('util');
-const readDirAsync = promisify(fs.readdir);
-const readFileAsync = promisify(fs.readFile);
-const statAsync = promisify(fs.stat);
-
-const excludeFiles = ['lighthouse-dt-bundle.js', 'Tests.js'];
-const excludeDirs = ['_test_runner', 'Images', 'node_modules'];
// Exclude known errors
const excludeErrors = [
'Common.UIString(view.title())', 'Common.UIString(setting.title() || \'\')', 'Common.UIString(option.text)',
@@ -34,16 +24,6 @@ const excludeErrors = [
'Common.UIString(extension.title())', 'Common.UIString(this._currentValueLabel, value)'
];
-const esprimaTypes = {
- BI_EXPR: 'BinaryExpression',
- CALL_EXPR: 'CallExpression',
- COND_EXPR: 'ConditionalExpression',
- IDENTIFIER: 'Identifier',
- MEMBER_EXPR: 'MemberExpression',
- TAGGED_TEMP_EXPR: 'TaggedTemplateExpression',
- TEMP_LITERAL: 'TemplateLiteral'
-};
-
const usage = `Usage: node ${path.basename(process.argv[0])} [-a | <.js file path>*]
-a: If present, check all devtools frontend .js files
@@ -62,7 +42,7 @@ async function main() {
let filePaths = [];
if (process.argv[2] === '-a') {
const frontendPath = path.resolve(__dirname, '..', 'front_end');
- await getFilesFromDirectory(frontendPath, filePaths);
+ await localizationUtils.getFilesFromDirectory(frontendPath, filePaths, ['.js']);
} else {
filePaths = process.argv.slice(2);
}
@@ -86,73 +66,15 @@ async function main() {
main();
-function verifyIdentifier(node, name) {
- return node !== undefined && node.type === esprimaTypes.IDENTIFIER && node.name === name;
-}
-
-/**
- * Verify callee of objectName.propertyName(), e.g. Common.UIString().
- */
-function verifyCallExpressionCallee(callee, objectName, propertyName) {
- return callee !== undefined && callee.type === esprimaTypes.MEMBER_EXPR && callee.computed === false &&
- verifyIdentifier(callee.object, objectName) && verifyIdentifier(callee.property, propertyName);
-}
-
-function isNodeCallOnObject(node, objectName, propertyName) {
- return node !== undefined && node.type === esprimaTypes.CALL_EXPR &&
- verifyCallExpressionCallee(node.callee, objectName, propertyName);
-}
-
-function isNodeCommonUIStringCall(node) {
- return isNodeCallOnObject(node, 'Common', 'UIString');
-}
-
-function isNodeUIformatLocalized(node) {
- return isNodeCallOnObject(node, 'UI', 'formatLocalized');
-}
-
-function isNodelsTaggedTemplateExpression(node) {
- return node !== undefined && node.type === esprimaTypes.TAGGED_TEMP_EXPR && verifyIdentifier(node.tag, 'ls') &&
- node.quasi !== undefined && node.quasi.type !== undefined && node.quasi.type === esprimaTypes.TEMP_LITERAL;
-}
-
function includesConditionalExpression(listOfElements) {
return listOfElements.filter(ele => ele !== undefined && ele.type === esprimaTypes.COND_EXPR).length > 0;
}
-function getLocalizationCase(node) {
- if (isNodeCommonUIStringCall(node))
- return 'Common.UIString';
- else if (isNodelsTaggedTemplateExpression(node))
- return 'Tagged Template';
- else if (isNodeUIformatLocalized(node))
- return 'UI.formatLocalized';
- else
- return null;
-}
-
-function isLocalizationCall(node) {
- return isNodeCommonUIStringCall(node) || isNodelsTaggedTemplateExpression(node) || isNodeUIformatLocalized(node);
-}
-
function addError(error, errors) {
if (!errors.includes(error))
errors.push(error);
}
-function getLocation(node) {
- if (node !== undefined && node.loc !== undefined && node.loc.start !== undefined && node.loc.end !== undefined &&
- node.loc.start.line !== undefined && node.loc.end.line !== undefined) {
- const startLine = node.loc.start.line;
- const endLine = node.loc.end.line;
- if (startLine === endLine)
- return ` Line ${startLine}`;
- else
- return ` Line ${node.loc.start.line}-${node.loc.end.line}`;
- }
- return '';
-}
-
function buildConcatenatedNodesList(node, nodes) {
if (!node)
return;
@@ -173,7 +95,7 @@ function buildConcatenatedNodesList(node, nodes) {
*/
function checkConcatenation(parentNode, node, filePath, errors) {
function isWord(node) {
- return (node.type === 'Literal' && !!node.value.match(/[a-z]/i));
+ return (node.type === esprimaTypes.LITERAL && !!node.value.match(/[a-z]/i));
}
function isConcatenation(node) {
return (node !== undefined && node.type === esprimaTypes.BI_EXPR && node.operator === '+');
@@ -183,16 +105,18 @@ function checkConcatenation(parentNode, node, filePath, errors) {
return;
if (isConcatenation(node)) {
- let concatenatedNodes = [];
+ const concatenatedNodes = [];
buildConcatenatedNodesList(node, concatenatedNodes);
- const hasLocalizationCall = !!concatenatedNodes.find(currentNode => isLocalizationCall(currentNode));
+ const hasLocalizationCall =
+ !!concatenatedNodes.find(currentNode => localizationUtils.isLocalizationCall(currentNode));
if (hasLocalizationCall) {
const hasAlphabeticLiteral = !!concatenatedNodes.find(currentNode => isWord(currentNode));
if (hasAlphabeticLiteral) {
const code = escodegen.generate(node);
addError(
`${filePath}${
- getLocation(node)}: string concatenation should be changed to variable substitution with ls: ${code}`,
+ localizationUtils.getLocationMessage(
+ node.loc)}: string concatenation should be changed to variable substitution with ls: ${code}`,
errors);
}
}
@@ -200,26 +124,18 @@ function checkConcatenation(parentNode, node, filePath, errors) {
}
/**
- * Verify if callee is functionName() or object.functionName().
- */
-function verifyFunctionCallee(callee, functionName) {
- return callee !== undefined &&
- ((callee.type === esprimaTypes.IDENTIFIER && callee.name === functionName) ||
- (callee.type === esprimaTypes.MEMBER_EXPR && verifyIdentifier(callee.property, functionName)));
-}
-
-/**
* Check if an argument of a function is localized.
*/
function checkFunctionArgument(functionName, argumentIndex, node, filePath, errors) {
- if (node !== undefined && node.type === esprimaTypes.CALL_EXPR && verifyFunctionCallee(node.callee, functionName) &&
- node.arguments !== undefined && node.arguments.length > argumentIndex) {
+ if (node !== undefined && node.type === esprimaTypes.CALL_EXPR &&
+ localizationUtils.verifyFunctionCallee(node.callee, functionName) && node.arguments !== undefined &&
+ node.arguments.length > argumentIndex) {
const arg = node.arguments[argumentIndex];
// No need to localize empty strings.
- if (arg.type == 'Literal' && arg.value === '')
+ if (arg.type === esprimaTypes.LITERAL && arg.value === '')
return;
- if (!isLocalizationCall(arg)) {
+ if (!localizationUtils.isLocalizationCall(arg)) {
let order = '';
switch (argumentIndex) {
case 0:
@@ -235,8 +151,8 @@ function checkFunctionArgument(functionName, argumentIndex, node, filePath, erro
order = `${argumentIndex + 1}th`;
}
addError(
- `${filePath}${getLocation(node)}: ${order} argument to ${functionName}() should be localized: ${
- escodegen.generate(node)}`,
+ `${filePath}${localizationUtils.getLocationMessage(node.loc)}: ${order} argument to ${
+ functionName}() should be localized: ${escodegen.generate(node)}`,
errors);
}
}
@@ -266,19 +182,22 @@ function analyzeNode(parentNode, node, filePath, errors) {
return;
}
- const locCase = getLocalizationCase(node);
+ const locCase = localizationUtils.getLocalizationCase(node);
const code = escodegen.generate(node);
switch (locCase) {
case 'Common.UIString':
case 'UI.formatLocalized':
const firstArgType = node.arguments[0].type;
- if (firstArgType !== 'Literal' && firstArgType !== 'TemplateLiteral' && firstArgType !== 'Identifier' &&
- !excludeErrors.includes(code)) {
- addError(`${filePath}${getLocation(node)}: first argument to call should be a string: ${code}`, errors);
+ if (firstArgType !== esprimaTypes.LITERAL && firstArgType !== esprimaTypes.TEMP_LITERAL &&
+ firstArgType !== esprimaTypes.IDENTIFIER && !excludeErrors.includes(code)) {
+ addError(
+ `${filePath}${localizationUtils.getLocationMessage(node.loc)}: first argument to call should be a string: ${
+ code}`,
+ errors);
}
if (includesConditionalExpression(node.arguments.slice(1))) {
addError(
- `${filePath}${getLocation(node)}: conditional(s) found in ${
+ `${filePath}${localizationUtils.getLocationMessage(node.loc)}: conditional(s) found in ${
code}. Please extract conditional(s) out of the localization call.`,
errors);
}
@@ -286,7 +205,7 @@ function analyzeNode(parentNode, node, filePath, errors) {
case 'Tagged Template':
if (includesConditionalExpression(node.quasi.expressions)) {
addError(
- `${filePath}${getLocation(node)}: conditional(s) found in ${
+ `${filePath}${localizationUtils.getLocationMessage(node.loc)}: conditional(s) found in ${
code}. Please extract conditional(s) out of the localization call.`,
errors);
}
@@ -294,8 +213,6 @@ function analyzeNode(parentNode, node, filePath, errors) {
default:
// String concatenation to localization call(s) should be changed
checkConcatenation(parentNode, node, filePath, errors);
- // 3rd argument to createInput() should be localized
- checkFunctionArgument('createInput', 2, node, filePath, errors);
break;
}
@@ -305,42 +222,11 @@ function analyzeNode(parentNode, node, filePath, errors) {
}
}
-function getRelativeFilePathFromSrc(fullFilePath) {
- return path.relative(path.resolve(THIRD_PARTY_PATH, '..'), fullFilePath);
-}
-
async function auditFileForLocalizability(filePath, errors) {
- const fileContent = await readFileAsync(filePath);
- const ast = esprima.parse(fileContent.toString(), {loc: true});
+ const fileContent = await localizationUtils.parseFileContent(filePath);
+ const ast = esprima.parse(fileContent, {loc: true});
- const relativeFilePath = getRelativeFilePathFromSrc(filePath);
+ const relativeFilePath = localizationUtils.getRelativeFilePathFromSrc(filePath);
for (const node of ast.body)
analyzeNode(undefined, node, relativeFilePath, errors);
}
-
-function shouldParseDirectory(directoryName) {
- return !excludeDirs.reduce((result, dir) => result || directoryName.indexOf(dir) !== -1, false);
-}
-
-function shouldParseFile(filePath) {
- return (path.extname(filePath) === '.js' && !excludeFiles.includes(path.basename(filePath)));
-}
-
-async function getFilesFromItem(itemPath, filePaths) {
- const stat = await statAsync(itemPath);
- if (stat.isDirectory() && shouldParseDirectory(itemPath))
- return await getFilesFromDirectory(itemPath, filePaths);
-
- if (shouldParseFile(itemPath))
- filePaths.push(itemPath);
-}
-
-async function getFilesFromDirectory(directoryPath, filePaths) {
- const itemNames = await readDirAsync(directoryPath);
- const promises = [];
- for (const itemName of itemNames) {
- const itemPath = path.resolve(directoryPath, itemName);
- promises.push(getFilesFromItem(itemPath, filePaths));
- }
- await Promise.all(promises);
-}
diff --git a/chromium/third_party/blink/renderer/devtools/scripts/check_localizable_resources.js b/chromium/third_party/blink/renderer/devtools/scripts/check_localizable_resources.js
new file mode 100644
index 00000000000..946cbcf93ef
--- /dev/null
+++ b/chromium/third_party/blink/renderer/devtools/scripts/check_localizable_resources.js
@@ -0,0 +1,240 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Copyright (C) Microsoft Corporation. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * This script is part of the presubmit check that parses DevTools frontend .js and
+ * module.json files, collects localizable strings, checks if frontend strings are
+ * in .grd/.grdp files and reports error if present.
+ *
+ * If argument '--autofix' is present, add the new resources to and remove unused
+ * messages from GRDP files.
+ */
+
+const fs = require('fs');
+const path = require('path');
+const {promisify} = require('util');
+const writeFileAsync = promisify(fs.writeFile);
+const appendFileAsync = promisify(fs.appendFile);
+const checkLocalizedStrings = require('./localization_utils/check_localized_strings');
+const localizationUtils = require('./localization_utils/localization_utils');
+
+const grdpFileStart = '<?xml version="1.0" encoding="utf-8"?>\n<grit-part>\n';
+const grdpFileEnd = '</grit-part>';
+
+async function main() {
+ let frontendStrings;
+ let IDSkeys;
+
+ try {
+ [frontendStrings, IDSkeys] = await checkLocalizedStrings.parseLocalizableResourceMaps(false);
+
+ if (process.argv.includes('--autofix')) {
+ await autofix(frontendStrings, IDSkeys);
+ } else {
+ await getErrors(frontendStrings, IDSkeys);
+ }
+ } catch (e) {
+ console.log(`Error: ${e.message}`);
+ process.exit(1);
+ }
+}
+
+main();
+
+async function getErrors(frontendStrings, IDSkeys) {
+ const toAddError = await checkLocalizedStrings.getAndReportResourcesToAdd(frontendStrings, IDSkeys);
+ const toRemoveError = checkLocalizedStrings.getAndReportResourcesToRemove(frontendStrings, IDSkeys);
+ let error = `${toAddError ? toAddError : ''}${toRemoveError ? toRemoveError : ''}`;
+
+ if (error === '') {
+ console.log('DevTools localizable resources checker passed.');
+ return;
+ }
+
+ error += '\nThe errors are potentially fixable with the `--autofix` option.';
+
+ throw new Error(error);
+}
+
+async function autofix(frontendStrings, IDSkeys) {
+ const resourceAdded = await addResourcesToGRDP(frontendStrings, IDSkeys);
+ const resourceRemoved = await removeResourcesFromGRDP(frontendStrings, IDSkeys);
+
+ if (!resourceAdded && !resourceRemoved) {
+ console.log('DevTools localizable resources checker passed.');
+ return;
+ }
+
+ let message =
+ 'Found changes to localizable DevTools strings.\nDevTools localizable resources checker has updated the appropriate grdp file(s).';
+ if (resourceAdded)
+ message += '\nManually write a description for any new <message> entries.';
+ message += '\nUse git status to see what has changed.';
+ throw new Error(message);
+}
+
+// Return true if any resources are added
+async function addResourcesToGRDP(frontendStrings, IDSkeys) {
+ const keysToAddToGRD = checkLocalizedStrings.getDifference(IDSkeys, frontendStrings);
+ if (keysToAddToGRD.size === 0)
+ return false;
+
+ const frontendPath = path.resolve(__dirname, '..', 'front_end');
+ const frontendDirs = await localizationUtils.getChildDirectoriesFromDirectory(frontendPath);
+ // Map file path to its parent grdp file path
+ const filePathToGrdpFilePath = new Map();
+ // Map grdp file path to strings to be added to that file so that we only need to
+ // modify every grdp file once
+ const grdpFilePathToStrings = new Map();
+
+ // Get the grdp files that need to be modified
+ for (const [key, stringObj] of keysToAddToGRD) {
+ let grdpFilePath = '';
+ if (filePathToGrdpFilePath.has(stringObj.filepath)) {
+ grdpFilePath = filePathToGrdpFilePath.get(stringObj.filepath);
+ } else {
+ grdpFilePath = localizationUtils.getGRDPFilePath(stringObj.filepath, frontendDirs);
+ filePathToGrdpFilePath.set(stringObj.filepath, grdpFilePath);
+ }
+
+ if (!grdpFilePathToStrings.has(grdpFilePath))
+ grdpFilePathToStrings.set(grdpFilePath, []);
+
+ // Add the IDS key to stringObj so we have access to it later
+ stringObj.ids = key;
+ grdpFilePathToStrings.get(grdpFilePath).push(stringObj);
+ }
+
+ const promises = [];
+
+ const grdpFilePathsToAdd = [];
+ for (let [grdpFilePath, stringsToAdd] of grdpFilePathToStrings) {
+ // The grdp file doesn't exist, so create one.
+ if (!fs.existsSync(grdpFilePath)) {
+ let grdpMessagesToAdd = '';
+ for (const stringObj of stringsToAdd)
+ grdpMessagesToAdd += localizationUtils.createGrdpMessage(stringObj.ids, stringObj);
+
+ // Create a new grdp file and reference it in the parent grd file
+ promises.push(appendFileAsync(grdpFilePath, `${grdpFileStart}${grdpMessagesToAdd}${grdpFileEnd}`));
+ grdpFilePathsToAdd.push(
+ path.relative(path.dirname(localizationUtils.GRD_PATH), grdpFilePath).split(path.sep).join('/'));
+ continue;
+ }
+
+ const grdpFileContent = await localizationUtils.parseFileContent(grdpFilePath);
+ const grdpFileLines = grdpFileContent.split('\n');
+
+ let newGrdpFileContent = '';
+ const IDSRegex = new RegExp(`"(${localizationUtils.IDSPrefix}.*?)"`);
+ for (let i = 0; i < grdpFileLines.length; i++) {
+ const grdpLine = grdpFileLines[i];
+ const match = grdpLine.match(IDSRegex);
+ // match[0]: full match
+ // match[1]: message IDS key
+ if (match) {
+ const ids = match[1];
+ const stringsToAddRemaining = [];
+ for (const stringObj of stringsToAdd) {
+ // Insert the new <message> in sorted order.
+ if (ids > stringObj.ids)
+ newGrdpFileContent += localizationUtils.createGrdpMessage(stringObj.ids, stringObj);
+ else
+ stringsToAddRemaining.push(stringObj);
+ }
+ stringsToAdd = stringsToAddRemaining;
+ } else if (grdpLine.includes(grdpFileEnd)) {
+ // Just hit the end tag, so insert any remaining <message>s.
+ for (const stringObj of stringsToAdd)
+ newGrdpFileContent += localizationUtils.createGrdpMessage(stringObj.ids, stringObj);
+ }
+ newGrdpFileContent += grdpLine;
+ if (i < grdpFileLines.length - 1)
+ newGrdpFileContent += '\n';
+ }
+
+ promises.push(writeFileAsync(grdpFilePath, newGrdpFileContent));
+ }
+ promises.push(addChildGRDPFilePathsToGRD(grdpFilePathsToAdd.sort()));
+ await Promise.all(promises);
+ return true;
+}
+
+async function addChildGRDPFilePathsToGRD(relativeGrdpFilePaths) {
+ function createPartFileEntry(relativeGrdpFilePath) {
+ return ` <part file="${relativeGrdpFilePath}" />\n`;
+ }
+
+ const grdFileContent = await localizationUtils.parseFileContent(localizationUtils.GRD_PATH);
+ const grdLines = grdFileContent.split('\n');
+
+ let newGrdFileContent = '';
+ for (let i = 0; i < grdLines.length; i++) {
+ const grdLine = grdLines[i];
+ // match[0]: full match
+ // match[1]: relative grdp file path
+ const match = grdLine.match(/<part file="(.*?)"/);
+ if (match) {
+ const relativeGrdpFilePathsRemaining = [];
+ for (const relativeGrdpFilePath of relativeGrdpFilePaths) {
+ if (relativeGrdpFilePath < match[1])
+ newGrdFileContent += createPartFileEntry(relativeGrdpFilePath);
+ else
+ relativeGrdpFilePathsRemaining.push(relativeGrdpFilePath);
+ }
+ relativeGrdpFilePaths = relativeGrdpFilePathsRemaining;
+ } else if (grdLine.includes('</messages>')) {
+ for (const relativeGrdpFilePath of relativeGrdpFilePaths)
+ newGrdFileContent += createPartFileEntry(relativeGrdpFilePath);
+ }
+ newGrdFileContent += grdLine;
+ if (i < grdLines.length - 1)
+ newGrdFileContent += '\n';
+ }
+ return writeFileAsync(localizationUtils.GRD_PATH, newGrdFileContent);
+}
+
+// Return true if any resources are removed
+async function removeResourcesFromGRDP(frontendStrings, IDSkeys) {
+ const keysToRemoveFromGRD = checkLocalizedStrings.getDifference(frontendStrings, IDSkeys);
+ if (keysToRemoveFromGRD.size === 0)
+ return false;
+
+ // Map grdp file path to message IDS keys to remove
+ const grdpFilePathToKeys = new Map();
+ for (const [key, messageObj] of keysToRemoveFromGRD) {
+ if (!grdpFilePathToKeys.has(messageObj.filepath))
+ grdpFilePathToKeys.set(messageObj.filepath, []);
+
+ grdpFilePathToKeys.get(messageObj.filepath).push(key);
+ }
+
+ const promises = [];
+ for (const [grdpFilePath, listOfKeys] of grdpFilePathToKeys) {
+ let newGrdpFileContent = '';
+ const grdpFileContent = await localizationUtils.parseFileContent(grdpFilePath);
+ const grdpFileLines = grdpFileContent.split('\n');
+
+ for (let i = 0; i < grdpFileLines.length; i++) {
+ if (!lineContainsIDS(grdpFileLines[i], listOfKeys)) {
+ newGrdpFileContent += grdpFileLines[i];
+ if (i < grdpFileLines.length - 1)
+ newGrdpFileContent += '\n';
+ continue;
+ }
+
+ while (!grdpFileLines[i].includes('</message>'))
+ i++;
+ }
+
+ promises.push(writeFileAsync(grdpFilePath, newGrdpFileContent));
+ }
+ await Promise.all(promises);
+ return true;
+}
+
+function lineContainsIDS(line, listOfIDS) {
+ return listOfIDS.some(ids => line.includes(ids));
+}
diff --git a/chromium/third_party/blink/renderer/devtools/scripts/localization_utils/check_localized_strings.js b/chromium/third_party/blink/renderer/devtools/scripts/localization_utils/check_localized_strings.js
new file mode 100644
index 00000000000..be79c23b7c3
--- /dev/null
+++ b/chromium/third_party/blink/renderer/devtools/scripts/localization_utils/check_localized_strings.js
@@ -0,0 +1,384 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * Functions in this script parse DevTools frontend .js and module.json files,
+ * collect localizable strings, check if frontend strings are in .grd/.grdp
+ * files and report error if present.
+ */
+
+const fs = require('fs');
+const path = require('path');
+const {promisify} = require('util');
+const writeFileAsync = promisify(fs.writeFile);
+const localizationUtils = require('./localization_utils');
+const escodegen = localizationUtils.escodegen;
+const esprimaTypes = localizationUtils.esprimaTypes;
+const esprima = localizationUtils.esprima;
+const DEVTOOLS_FRONTEND_PATH = path.resolve(__dirname, '..', '..', 'front_end');
+const extensionStringKeys = ['category', 'destination', 'title', 'title-mac'];
+
+// Format of frontendStrings
+// { IDS_md5-hash => {
+// string: string,
+// code: string,
+// filepath: string,
+// location: {
+// start: {
+// line: number, (1-based)
+// column: number (0-based)
+// },
+// end: {
+// line: number,
+// column: number
+// }
+// },
+// arguments: string[]
+// }
+// }
+const frontendStrings = new Map();
+
+// Format
+// {
+// IDS_KEY => {
+// filepath: string,
+// location: {
+// start: {
+// line: number
+// },
+// end: {
+// line: number
+// }
+// }
+// }
+// }
+const IDSkeys = new Map();
+
+const devtoolsFrontendPath = path.resolve(__dirname, '..', '..', 'front_end');
+
+async function parseLocalizableResourceMaps(isDebug) {
+ const devtoolsFiles = [];
+ await localizationUtils.getFilesFromDirectory(devtoolsFrontendPath, devtoolsFiles, ['.js', 'module.json']);
+
+ const promises = [parseLocalizableStrings(devtoolsFiles, isDebug), parseIDSKeys(localizationUtils.GRD_PATH, isDebug)];
+ return Promise.all(promises);
+}
+
+/**
+ * The following functions parse localizable strings (wrapped in
+ * Common.UIString, UI.formatLocalized or ls``) from devtools frontend files.
+ */
+
+async function parseLocalizableStrings(devtoolsFiles, isDebug) {
+ const promises = devtoolsFiles.map(filePath => parseLocalizableStringsFromFile(filePath));
+ await Promise.all(promises);
+ if (isDebug)
+ await writeFileAsync(path.resolve(__dirname, 'localizable_strings.json'), JSON.stringify(frontendStrings));
+ return frontendStrings;
+}
+
+async function parseLocalizableStringsFromFile(filePath) {
+ const fileContent = await localizationUtils.parseFileContent(filePath);
+ if (path.basename(filePath) === 'module.json')
+ return parseLocalizableStringFromModuleJson(fileContent, filePath);
+
+ const ast = esprima.parse(fileContent, {loc: true});
+ for (const node of ast.body)
+ parseLocalizableStringFromNode(node, filePath);
+}
+
+function parseLocalizableStringFromModuleJson(fileContent, filePath) {
+ const fileJSON = JSON.parse(fileContent);
+ if (!fileJSON.extensions)
+ return;
+
+ for (const extension of fileJSON.extensions) {
+ for (const key in extension) {
+ if (extensionStringKeys.includes(key)) {
+ addString(extension[key], extension[key], filePath);
+ } else if (key === 'device') {
+ addString(extension.device.title, extension.device.title, filePath);
+ } else if (key === 'options') {
+ for (const option of extension.options) {
+ addString(option.title, option.title, filePath);
+ if (option.text !== undefined)
+ addString(option.text, option.text, filePath);
+ }
+ }
+ }
+ }
+}
+
+function parseLocalizableStringFromNode(node, filePath) {
+ if (!node)
+ return;
+
+ if (Array.isArray(node)) {
+ for (const child of node)
+ parseLocalizableStringFromNode(child, filePath);
+
+ return;
+ }
+
+ const keys = Object.keys(node);
+ const objKeys = keys.filter(key => key !== 'loc' && typeof node[key] === 'object');
+ if (objKeys.length === 0) {
+ // base case: all values are non-objects -> node is a leaf
+ return;
+ }
+
+ const locCase = localizationUtils.getLocalizationCase(node);
+ switch (locCase) {
+ case 'Common.UIString':
+ handleCommonUIString(node, filePath);
+ break;
+ case 'UI.formatLocalized':
+ if (node.arguments !== undefined && node.arguments[1] !== undefined && node.arguments[1].elements !== undefined)
+ handleCommonUIString(node, filePath, node.arguments[1].elements);
+ break;
+ case 'Tagged Template':
+ handleTemplateLiteral(node.quasi, escodegen.generate(node), filePath);
+ break;
+ case null:
+ break;
+ default:
+ throw new Error(
+ `${filePath}${localizationUtils.getLocationMessage(node.loc)}: unexpected localization case for node: ${
+ escodegen.generate(node)}`);
+ }
+
+ for (const key of objKeys) {
+ // recursively parse all the child nodes
+ parseLocalizableStringFromNode(node[key], filePath);
+ }
+}
+
+function handleCommonUIString(node, filePath, argumentNodes) {
+ if (argumentNodes === undefined)
+ argumentNodes = node.arguments.slice(1);
+ const firstArgType = node.arguments[0].type;
+ switch (firstArgType) {
+ case esprimaTypes.LITERAL:
+ const message = node.arguments[0].value;
+ addString(message, escodegen.generate(node), filePath, node.loc, argumentNodes);
+ break;
+ case esprimaTypes.TEMP_LITERAL:
+ handleTemplateLiteral(node.arguments[0], escodegen.generate(node), filePath, argumentNodes);
+ break;
+ default:
+ break;
+ }
+}
+
+function handleTemplateLiteral(node, code, filePath, argumentNodes) {
+ if (node.expressions.length === 0) {
+ // template literal does not contain any variables, parse the value
+ addString(node.quasis[0].value.cooked, code, filePath, node.loc, argumentNodes);
+ return;
+ }
+
+ argumentNodes = node.expressions;
+ let processedMsg = '';
+ for (let i = 0; i < node.quasis.length; i++) {
+ processedMsg += node.quasis[i].value.cooked;
+ if (i < node.expressions.length) {
+ // add placeholder for variable so that
+ // the ph tag gets generated
+ processedMsg += '%s';
+ }
+ }
+ addString(processedMsg, code, filePath, node.loc, argumentNodes);
+}
+
+function addString(str, code, filePath, location, argumentNodes) {
+ const currentString = {
+ string: str,
+ code: code,
+ filepath: filePath,
+ };
+ if (location)
+ currentString.location = location;
+ if (argumentNodes && argumentNodes.length > 0)
+ currentString.arguments = argumentNodes.map(argNode => escodegen.generate(argNode));
+
+ // In the case of duplicates, to enforce that entries are added to
+ // a consistent GRDP file, we use the file path that sorts lowest as
+ // the winning entry into frontendStrings.
+ const ids = localizationUtils.getIDSKey(str);
+ if (frontendStrings.has(ids) && frontendStrings.get(ids).filepath <= filePath)
+ return;
+ frontendStrings.set(ids, currentString);
+}
+
+/**
+ * The following functions parse <message>s and their IDS keys from
+ * devtools frontend grdp files.
+ */
+
+async function parseIDSKeys(grdFilePath, isDebug) {
+ // NOTE: this function assumes that no <message> tags are present in the parent
+ const grdpFilePaths = await parseGRDFile(grdFilePath);
+ await parseGRDPFiles(grdpFilePaths);
+ if (isDebug)
+ await writeFileAsync(path.resolve(__dirname, 'IDS_Keys.json'), JSON.stringify(IDSkeys));
+ return IDSkeys;
+}
+
+async function parseGRDFile(grdFilePath) {
+ const fileContent = await localizationUtils.parseFileContent(grdFilePath);
+ const grdFileDir = path.dirname(grdFilePath);
+ const partFileRegex = /<part file="(.*?)"/g;
+
+ let match;
+ const grdpFilePaths = new Set();
+ while ((match = partFileRegex.exec(fileContent)) !== null) {
+ if (match.index === partFileRegex.lastIndex)
+ partFileRegex.lastIndex++;
+ // match[0]: full match
+ // match[1]: part file path
+ grdpFilePaths.add(path.resolve(grdFileDir, match[1]));
+ }
+ return grdpFilePaths;
+}
+
+function parseGRDPFiles(grdpFilePaths) {
+ const promises = Array.from(grdpFilePaths, grdpFilePath => parseGRDPFile(grdpFilePath));
+ return Promise.all(promises);
+}
+
+function trimGrdpPlaceholder(placeholder) {
+ const exampleRegex = new RegExp('<ex>.*?<\/ex>', 'gms');
+ // $1s<ex>my example</ex> -> $1s
+ return placeholder.replace(exampleRegex, '').trim();
+}
+
+function convertToFrontendPlaceholders(message) {
+ // <ph name="phname">$1s<ex>my example</ex></ph> and <ph name="phname2">$2.3f</ph>
+ // match[0]: <ph name="phname1">$1s</ph>
+ // match[1]: $1s<ex>my example</ex>
+ let placeholderRegex = new RegExp('<ph[^>]*>(.*?)<\/ph>', 'gms');
+ let match;
+ while ((match = placeholderRegex.exec(message)) !== null) {
+ const placeholder = match[0];
+ const placeholderValue = trimGrdpPlaceholder(match[1]);
+ const newPlaceholderValue = placeholderValue.replace(/\$[1-9]/, '%');
+ message =
+ message.substring(0, match.index) + newPlaceholderValue + message.substring(match.index + placeholder.length);
+ // Modified the message, so search from the beginning of the string again.
+ placeholderRegex.lastIndex = 0;
+ }
+ return message;
+}
+
+function trimGrdpMessage(message) {
+ // ' Message text \n ' trims to ' Message text '.
+ const fixedLeadingWhitespace = 4; // GRDP encoding uses 4 leading spaces.
+ const trimmedMessage = message.substring(4);
+ return trimmedMessage.substring(0, trimmedMessage.lastIndexOf('\n'));
+}
+
+async function parseGRDPFile(filePath) {
+ const fileContent = await localizationUtils.parseFileContent(filePath);
+
+ function lineNumberOfIndex(str, index) {
+ const stringToIndex = str.substr(0, index);
+ return stringToIndex.split('\n').length;
+ }
+
+ // Example:
+ // <message name="IDS_*" desc="*">
+ // Message text here with optional placeholders <ph name="phname">$1s</ph>
+ // </message>
+ // match[0]: the entire '<message>...</message>' block.
+ // match[1]: ' Message text here with optional placeholders <ph name="phname">$1s</ph>\n '
+ const messageRegex = new RegExp('<message[^>]*>\s*\n(.*?)<\/message>', 'gms');
+ let match;
+ while ((match = messageRegex.exec(fileContent)) !== null) {
+ const line = lineNumberOfIndex(fileContent, match.index);
+
+ let message = match[1];
+ message = trimGrdpMessage(message);
+ message = convertToFrontendPlaceholders(message);
+ message = localizationUtils.sanitizeStringIntoFrontendFormat(message);
+
+ const ids = localizationUtils.getIDSKey(message);
+ IDSkeys.set(ids, {filepath: filePath, location: {start: {line}, end: {line}}});
+ }
+}
+
+/**
+ * The following functions compare frontend localizable strings
+ * with grdp <message>s and report error of resources to add or
+ * remove.
+ */
+async function getAndReportResourcesToAdd(frontendStrings, IDSkeys) {
+ const keysToAddToGRD = getDifference(IDSkeys, frontendStrings);
+ if (keysToAddToGRD.size === 0)
+ return;
+
+ let errorStr = 'The following frontend string(s) need to be added to GRD/GRDP file(s).\n';
+ errorStr += 'Please refer to auto-generated message(s) below and modify as needed.\n\n';
+
+ const frontendDirs = await localizationUtils.getChildDirectoriesFromDirectory(DEVTOOLS_FRONTEND_PATH);
+ const fileToGRDPMap = new Map();
+
+ // Example error message:
+ // third_party/blink/renderer/devtools/front_end/network/NetworkDataGridNode.js Line 973: ls`(disk cache)`
+ // Add a new message tag for this string to third_party\blink\renderer\devtools\front_end\network\network_strings.grdp
+ // <message name="IDS_DEVTOOLS_ad86890fb40822a3b12627efaca4ecd7" desc="Fill in the description.">
+ // (disk cache)
+ // </message>
+ for (const [key, stringObj] of keysToAddToGRD) {
+ let relativeGRDPFilePath = '';
+ if (fileToGRDPMap.has(stringObj.filepath)) {
+ relativeGRDPFilePath = fileToGRDPMap.get(stringObj.filepath);
+ } else {
+ relativeGRDPFilePath = localizationUtils.getRelativeFilePathFromSrc(
+ localizationUtils.getGRDPFilePath(stringObj.filepath, frontendDirs));
+ fileToGRDPMap.set(stringObj.filepath, relativeGRDPFilePath);
+ }
+ errorStr += `${localizationUtils.getRelativeFilePathFromSrc(stringObj.filepath)}${
+ localizationUtils.getLocationMessage(stringObj.location)}: ${stringObj.code}\n`;
+ errorStr += `Add a new message tag for this string to ${
+ localizationUtils.getRelativeFilePathFromSrc(
+ localizationUtils.getGRDPFilePath(stringObj.filepath, frontendDirs))}\n\n`;
+ errorStr += localizationUtils.createGrdpMessage(key, stringObj);
+ }
+ return errorStr;
+}
+
+function getAndReportResourcesToRemove(frontendStrings, IDSkeys) {
+ const keysToRemoveFromGRD = getDifference(frontendStrings, IDSkeys);
+ if (keysToRemoveFromGRD.size === 0)
+ return;
+
+ let errorStr =
+ '\nThe message(s) associated with the following IDS key(s) should be removed from its GRD/GRDP file(s):\n';
+ // Example error message:
+ // third_party/blink/renderer/devtools/front_end/help/help_strings.grdp Line 18: IDS_DEVTOOLS_7d0ee6fed10d3d4e5c9ee496729ab519
+ for (const [key, keyObj] of keysToRemoveFromGRD) {
+ errorStr += `${localizationUtils.getRelativeFilePathFromSrc(keyObj.filepath)}${
+ localizationUtils.getLocationMessage(keyObj.location)}: ${key}\n\n`;
+ }
+ return errorStr;
+}
+
+/**
+ * Output a Map containing entries that are in @comparison but not @reference in sorted order.
+ */
+function getDifference(reference, comparison) {
+ const difference = [];
+ for (const [key, value] of comparison) {
+ if (!reference.has(key))
+ difference.push([key, value]);
+ }
+ return new Map(difference.sort());
+}
+
+module.exports = {
+ parseLocalizableResourceMaps,
+ getAndReportResourcesToAdd,
+ getAndReportResourcesToRemove,
+ getDifference
+};
diff --git a/chromium/third_party/blink/renderer/devtools/scripts/localization_utils/localization_utils.js b/chromium/third_party/blink/renderer/devtools/scripts/localization_utils/localization_utils.js
new file mode 100644
index 00000000000..11119c5b681
--- /dev/null
+++ b/chromium/third_party/blink/renderer/devtools/scripts/localization_utils/localization_utils.js
@@ -0,0 +1,269 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+const fs = require('fs');
+const md5 = require('./md5');
+const {promisify} = require('util');
+const path = require('path');
+const readFileAsync = promisify(fs.readFile);
+const readDirAsync = promisify(fs.readdir);
+const statAsync = promisify(fs.stat);
+
+const esprimaTypes = {
+ BI_EXPR: 'BinaryExpression',
+ CALL_EXPR: 'CallExpression',
+ COND_EXPR: 'ConditionalExpression',
+ IDENTIFIER: 'Identifier',
+ LITERAL: 'Literal',
+ MEMBER_EXPR: 'MemberExpression',
+ TAGGED_TEMP_EXPR: 'TaggedTemplateExpression',
+ TEMP_LITERAL: 'TemplateLiteral'
+};
+
+const excludeFiles = ['lighthouse-dt-bundle.js', 'Tests.js'];
+const excludeDirs = ['test_runner', 'Images', 'langpacks', 'node_modules'];
+const cppSpecialCharactersMap = {
+ '"': '\\"',
+ '\\': '\\\\',
+ '\n': '\\n'
+};
+const IDSPrefix = 'IDS_DEVTOOLS_';
+
+const THIRD_PARTY_PATH = path.resolve(__dirname, '..', '..', '..', '..', '..');
+const SRC_PATH = path.resolve(THIRD_PARTY_PATH, '..');
+const GRD_PATH = path.resolve(__dirname, '..', '..', 'front_end', 'langpacks', 'devtools_ui_strings.grd');
+const REPO_NODE_MODULES_PATH = path.resolve(THIRD_PARTY_PATH, 'node', 'node_modules');
+const escodegen = require(path.resolve(REPO_NODE_MODULES_PATH, 'escodegen'));
+const esprima = require(path.resolve(REPO_NODE_MODULES_PATH, 'esprima'));
+
+function getRelativeFilePathFromSrc(filePath) {
+ return path.relative(SRC_PATH, filePath);
+}
+
+function shouldParseDirectory(directoryName) {
+ return !excludeDirs.some(dir => directoryName.includes(dir));
+}
+
+/**
+ * @filepath can be partial path or full path, as long as it contains the file name.
+ */
+function shouldParseFile(filepath) {
+ return !excludeFiles.includes(path.basename(filepath));
+}
+
+async function parseFileContent(filePath) {
+ const fileContent = await readFileAsync(filePath);
+ return fileContent.toString();
+}
+
+function isNodeCallOnObject(node, objectName, propertyName) {
+ return node !== undefined && node.type === esprimaTypes.CALL_EXPR &&
+ verifyCallExpressionCallee(node.callee, objectName, propertyName);
+}
+
+function isNodeCommonUIStringCall(node) {
+ return isNodeCallOnObject(node, 'Common', 'UIString');
+}
+
+function isNodeUIformatLocalized(node) {
+ return isNodeCallOnObject(node, 'UI', 'formatLocalized');
+}
+
+function isNodelsTaggedTemplateExpression(node) {
+ return node !== undefined && node.type === esprimaTypes.TAGGED_TEMP_EXPR && verifyIdentifier(node.tag, 'ls') &&
+ node.quasi !== undefined && node.quasi.type !== undefined && node.quasi.type === esprimaTypes.TEMP_LITERAL;
+}
+
+/**
+ * Verify callee of objectName.propertyName(), e.g. Common.UIString().
+ */
+function verifyCallExpressionCallee(callee, objectName, propertyName) {
+ return callee !== undefined && callee.type === esprimaTypes.MEMBER_EXPR && callee.computed === false &&
+ verifyIdentifier(callee.object, objectName) && verifyIdentifier(callee.property, propertyName);
+}
+
+function verifyIdentifier(node, name) {
+ return node !== undefined && node.type === esprimaTypes.IDENTIFIER && node.name === name;
+}
+
+function getLocalizationCase(node) {
+ if (isNodeCommonUIStringCall(node))
+ return 'Common.UIString';
+ else if (isNodelsTaggedTemplateExpression(node))
+ return 'Tagged Template';
+ else if (isNodeUIformatLocalized(node))
+ return 'UI.formatLocalized';
+ else
+ return null;
+}
+
+function isLocalizationCall(node) {
+ return isNodeCommonUIStringCall(node) || isNodelsTaggedTemplateExpression(node) || isNodeUIformatLocalized(node);
+}
+
+/**
+ * Verify if callee is functionName() or object.functionName().
+ */
+function verifyFunctionCallee(callee, functionName) {
+ return callee !== undefined &&
+ ((callee.type === esprimaTypes.IDENTIFIER && callee.name === functionName) ||
+ (callee.type === esprimaTypes.MEMBER_EXPR && verifyIdentifier(callee.property, functionName)));
+}
+
+function getLocationMessage(location) {
+ if (location !== undefined && location.start !== undefined && location.end !== undefined &&
+ location.start.line !== undefined && location.end.line !== undefined) {
+ const startLine = location.start.line;
+ const endLine = location.end.line;
+ if (startLine === endLine)
+ return ` Line ${startLine}`;
+ else
+ return ` Line ${location.start.line}-${location.end.line}`;
+ }
+ return '';
+}
+
+function sanitizeStringIntoGRDFormat(str) {
+ return str.replace(/&/g, '&amp;')
+ .replace(/</g, '&lt;')
+ .replace(/>/g, '&gt;')
+ .replace(/"/g, '&quot;')
+ .replace(/'/g, '&apos;')
+}
+
+function sanitizeStringIntoFrontendFormat(str) {
+ return str.replace(/&apos;/g, '\'')
+ .replace(/&quot;/g, '"')
+ .replace(/&gt;/g, '>')
+ .replace(/&lt;/g, '<')
+ .replace(/&amp;/g, '&');
+}
+
+function sanitizeString(str, specialCharactersMap) {
+ let sanitizedStr = '';
+ for (let i = 0; i < str.length; i++) {
+ let currChar = str.charAt(i);
+ if (specialCharactersMap[currChar] !== undefined)
+ currChar = specialCharactersMap[currChar];
+
+ sanitizedStr += currChar;
+ }
+ return sanitizedStr;
+}
+
+function sanitizeStringIntoCppFormat(str) {
+ return sanitizeString(str, cppSpecialCharactersMap);
+}
+
+async function getFilesFromItem(itemPath, filePaths, acceptedFileEndings) {
+ const stat = await statAsync(itemPath);
+ if (stat.isDirectory() && shouldParseDirectory(itemPath))
+ return await getFilesFromDirectory(itemPath, filePaths, acceptedFileEndings);
+
+ const hasAcceptedEnding =
+ acceptedFileEndings.some(acceptedEnding => itemPath.toLowerCase().endsWith(acceptedEnding.toLowerCase()));
+ if (hasAcceptedEnding && shouldParseFile(itemPath))
+ filePaths.push(itemPath);
+}
+
+async function getFilesFromDirectory(directoryPath, filePaths, acceptedFileEndings) {
+ const itemNames = await readDirAsync(directoryPath);
+ const promises = [];
+ for (const itemName of itemNames) {
+ const itemPath = path.resolve(directoryPath, itemName);
+ promises.push(getFilesFromItem(itemPath, filePaths, acceptedFileEndings));
+ }
+ return Promise.all(promises);
+}
+
+async function getChildDirectoriesFromDirectory(directoryPath) {
+ const dirPaths = [];
+ const itemNames = await readDirAsync(directoryPath);
+ for (const itemName of itemNames) {
+ const itemPath = path.resolve(directoryPath, itemName);
+ const stat = await statAsync(itemPath);
+ if (stat.isDirectory() && shouldParseDirectory(itemName))
+ dirPaths.push(itemPath);
+ }
+ return dirPaths;
+}
+
+/**
+ * Get the parent grdp file path for the input frontend file path.
+ * NOTE: Naming convention of a grdp file is the name of the child directory under
+ * devtools/front_end plus _strings.grdp
+ */
+function getGRDPFilePath(frontendFilepath, frontendDirs) {
+ const frontendDirsLowerCase = frontendDirs.map(dir => dir.toLowerCase());
+ const dirpath = path.dirname(frontendFilepath);
+ if (frontendDirsLowerCase.includes(dirpath.toLowerCase()))
+ return path.resolve(dirpath, `${path.basename(dirpath)}_strings.grdp`);
+}
+
+function modifyStringIntoGRDFormat(str, args) {
+ let sanitizedStr = sanitizeStringIntoGRDFormat(str);
+
+ const phRegex = /%d|%f|%s|%.[0-9]f/gm;
+ if (!str.match(phRegex))
+ return sanitizedStr;
+
+ let phNames;
+ if (args !== undefined)
+ phNames = args.map(arg => arg.replace(/[^a-zA-Z]/gm, '_').toUpperCase());
+ else
+ phNames = ['PH1', 'PH2', 'PH3', 'PH4', 'PH5', 'PH6', 'PH7', 'PH8', 'PH9'];
+
+ // It replaces all placeholders with <ph> tags.
+ let match;
+ let count = 1;
+ while ((match = phRegex.exec(sanitizedStr)) !== null) {
+ // This is necessary to avoid infinite loops with zero-width matches
+ if (match.index === phRegex.lastIndex)
+ phRegex.lastIndex++;
+
+ // match[0]: the placeholder (e.g. %d, %s, %.2f, etc.)
+ const ph = match[0];
+ // e.g. $1s, $1d, $1.2f
+ const newPh = `$${count}` + ph.substr(1);
+
+ const i = sanitizedStr.indexOf(ph);
+ sanitizedStr = `${sanitizedStr.substring(0, i)}<ph name="${phNames[count - 1]}">${newPh}</ph>${
+ sanitizedStr.substring(i + ph.length)}`;
+ count++;
+ }
+ return sanitizedStr;
+}
+
+function createGrdpMessage(ids, stringObj) {
+ let message = ` <message name="${ids}" desc="">\n`;
+ message += ` ${modifyStringIntoGRDFormat(stringObj.string, stringObj.arguments)}\n`;
+ message += ' </message>\n';
+ return message;
+}
+
+function getIDSKey(str) {
+ return `${IDSPrefix}${md5(str)}`
+}
+
+module.exports = {
+ createGrdpMessage,
+ escodegen,
+ esprima,
+ esprimaTypes,
+ getChildDirectoriesFromDirectory,
+ getFilesFromDirectory,
+ getGRDPFilePath,
+ getIDSKey,
+ getLocalizationCase,
+ getLocationMessage,
+ getRelativeFilePathFromSrc,
+ GRD_PATH,
+ IDSPrefix,
+ isLocalizationCall,
+ modifyStringIntoGRDFormat,
+ parseFileContent,
+ sanitizeStringIntoCppFormat,
+ sanitizeStringIntoFrontendFormat,
+ verifyFunctionCallee
+}; \ No newline at end of file
diff --git a/chromium/third_party/blink/renderer/devtools/scripts/localization_utils/md5.js b/chromium/third_party/blink/renderer/devtools/scripts/localization_utils/md5.js
new file mode 100644
index 00000000000..3f59f3785ab
--- /dev/null
+++ b/chromium/third_party/blink/renderer/devtools/scripts/localization_utils/md5.js
@@ -0,0 +1,157 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/*
+ * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
+ * Digest Algorithm, as defined in RFC 1321.
+ * Version 2.1 Copyright (C) Paul Johnston 1999 - 2002.
+ * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
+ * Distributed under the BSD License
+ * See http://pajhome.org.uk/crypt/md5 for more info.
+ */
+function md5(s) {
+ return binl2hex(core_md5(str2binl(s), s.length * 8));
+}
+
+function core_md5(x, len) {
+ /* append padding */
+ x[len >> 5] |= 0x80 << ((len) % 32);
+ x[(((len + 64) >>> 9) << 4) + 14] = len;
+
+ var a = 1732584193;
+ var b = -271733879;
+ var c = -1732584194;
+ var d = 271733878;
+
+ for (var i = 0; i < x.length; i += 16) {
+ var olda = a;
+ var oldb = b;
+ var oldc = c;
+ var oldd = d;
+
+ a = md5_ff(a, b, c, d, x[i + 0], 7, -680876936);
+ d = md5_ff(d, a, b, c, x[i + 1], 12, -389564586);
+ c = md5_ff(c, d, a, b, x[i + 2], 17, 606105819);
+ b = md5_ff(b, c, d, a, x[i + 3], 22, -1044525330);
+ a = md5_ff(a, b, c, d, x[i + 4], 7, -176418897);
+ d = md5_ff(d, a, b, c, x[i + 5], 12, 1200080426);
+ c = md5_ff(c, d, a, b, x[i + 6], 17, -1473231341);
+ b = md5_ff(b, c, d, a, x[i + 7], 22, -45705983);
+ a = md5_ff(a, b, c, d, x[i + 8], 7, 1770035416);
+ d = md5_ff(d, a, b, c, x[i + 9], 12, -1958414417);
+ c = md5_ff(c, d, a, b, x[i + 10], 17, -42063);
+ b = md5_ff(b, c, d, a, x[i + 11], 22, -1990404162);
+ a = md5_ff(a, b, c, d, x[i + 12], 7, 1804603682);
+ d = md5_ff(d, a, b, c, x[i + 13], 12, -40341101);
+ c = md5_ff(c, d, a, b, x[i + 14], 17, -1502002290);
+ b = md5_ff(b, c, d, a, x[i + 15], 22, 1236535329);
+
+ a = md5_gg(a, b, c, d, x[i + 1], 5, -165796510);
+ d = md5_gg(d, a, b, c, x[i + 6], 9, -1069501632);
+ c = md5_gg(c, d, a, b, x[i + 11], 14, 643717713);
+ b = md5_gg(b, c, d, a, x[i + 0], 20, -373897302);
+ a = md5_gg(a, b, c, d, x[i + 5], 5, -701558691);
+ d = md5_gg(d, a, b, c, x[i + 10], 9, 38016083);
+ c = md5_gg(c, d, a, b, x[i + 15], 14, -660478335);
+ b = md5_gg(b, c, d, a, x[i + 4], 20, -405537848);
+ a = md5_gg(a, b, c, d, x[i + 9], 5, 568446438);
+ d = md5_gg(d, a, b, c, x[i + 14], 9, -1019803690);
+ c = md5_gg(c, d, a, b, x[i + 3], 14, -187363961);
+ b = md5_gg(b, c, d, a, x[i + 8], 20, 1163531501);
+ a = md5_gg(a, b, c, d, x[i + 13], 5, -1444681467);
+ d = md5_gg(d, a, b, c, x[i + 2], 9, -51403784);
+ c = md5_gg(c, d, a, b, x[i + 7], 14, 1735328473);
+ b = md5_gg(b, c, d, a, x[i + 12], 20, -1926607734);
+
+ a = md5_hh(a, b, c, d, x[i + 5], 4, -378558);
+ d = md5_hh(d, a, b, c, x[i + 8], 11, -2022574463);
+ c = md5_hh(c, d, a, b, x[i + 11], 16, 1839030562);
+ b = md5_hh(b, c, d, a, x[i + 14], 23, -35309556);
+ a = md5_hh(a, b, c, d, x[i + 1], 4, -1530992060);
+ d = md5_hh(d, a, b, c, x[i + 4], 11, 1272893353);
+ c = md5_hh(c, d, a, b, x[i + 7], 16, -155497632);
+ b = md5_hh(b, c, d, a, x[i + 10], 23, -1094730640);
+ a = md5_hh(a, b, c, d, x[i + 13], 4, 681279174);
+ d = md5_hh(d, a, b, c, x[i + 0], 11, -358537222);
+ c = md5_hh(c, d, a, b, x[i + 3], 16, -722521979);
+ b = md5_hh(b, c, d, a, x[i + 6], 23, 76029189);
+ a = md5_hh(a, b, c, d, x[i + 9], 4, -640364487);
+ d = md5_hh(d, a, b, c, x[i + 12], 11, -421815835);
+ c = md5_hh(c, d, a, b, x[i + 15], 16, 530742520);
+ b = md5_hh(b, c, d, a, x[i + 2], 23, -995338651);
+
+ a = md5_ii(a, b, c, d, x[i + 0], 6, -198630844);
+ d = md5_ii(d, a, b, c, x[i + 7], 10, 1126891415);
+ c = md5_ii(c, d, a, b, x[i + 14], 15, -1416354905);
+ b = md5_ii(b, c, d, a, x[i + 5], 21, -57434055);
+ a = md5_ii(a, b, c, d, x[i + 12], 6, 1700485571);
+ d = md5_ii(d, a, b, c, x[i + 3], 10, -1894986606);
+ c = md5_ii(c, d, a, b, x[i + 10], 15, -1051523);
+ b = md5_ii(b, c, d, a, x[i + 1], 21, -2054922799);
+ a = md5_ii(a, b, c, d, x[i + 8], 6, 1873313359);
+ d = md5_ii(d, a, b, c, x[i + 15], 10, -30611744);
+ c = md5_ii(c, d, a, b, x[i + 6], 15, -1560198380);
+ b = md5_ii(b, c, d, a, x[i + 13], 21, 1309151649);
+ a = md5_ii(a, b, c, d, x[i + 4], 6, -145523070);
+ d = md5_ii(d, a, b, c, x[i + 11], 10, -1120210379);
+ c = md5_ii(c, d, a, b, x[i + 2], 15, 718787259);
+ b = md5_ii(b, c, d, a, x[i + 9], 21, -343485551);
+
+ a = safe_add(a, olda);
+ b = safe_add(b, oldb);
+ c = safe_add(c, oldc);
+ d = safe_add(d, oldd);
+ }
+ return Array(a, b, c, d);
+}
+
+function md5_cmn(q, a, b, x, s, t) {
+ return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s), b);
+}
+
+function md5_ff(a, b, c, d, x, s, t) {
+ return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
+}
+
+function md5_gg(a, b, c, d, x, s, t) {
+ return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
+}
+
+function md5_hh(a, b, c, d, x, s, t) {
+ return md5_cmn(b ^ c ^ d, a, b, x, s, t);
+}
+
+function md5_ii(a, b, c, d, x, s, t) {
+ return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
+}
+
+function safe_add(x, y) {
+ var lsw = (x & 0xFFFF) + (y & 0xFFFF);
+ var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
+ return (msw << 16) | (lsw & 0xFFFF);
+}
+
+function bit_rol(num, cnt) {
+ return (num << cnt) | (num >>> (32 - cnt));
+}
+
+function str2binl(str) {
+ var bin = Array();
+ var mask = (1 << 8) - 1;
+ for (var i = 0; i < str.length * 8; i += 8)
+ bin[i >> 5] |= (str.charCodeAt(i / 8) & mask) << (i % 32);
+ return bin;
+}
+
+function binl2hex(binarray) {
+ var hex_tab = '0123456789abcdef';
+ var str = '';
+ for (var i = 0; i < binarray.length * 4; i++) {
+ str += hex_tab.charAt((binarray[i >> 2] >> ((i % 4) * 8 + 4)) & 0xF) +
+ hex_tab.charAt((binarray[i >> 2] >> ((i % 4) * 8)) & 0xF);
+ }
+ return str;
+}
+
+module.exports = md5; \ No newline at end of file
diff --git a/chromium/third_party/blink/renderer/devtools/scripts/run_old_devtools/index.js b/chromium/third_party/blink/renderer/devtools/scripts/run_old_devtools/index.js
index 1a91738075c..13ac9328568 100644
--- a/chromium/third_party/blink/renderer/devtools/scripts/run_old_devtools/index.js
+++ b/chromium/third_party/blink/renderer/devtools/scripts/run_old_devtools/index.js
@@ -37,7 +37,8 @@ const CHROMIUM_DEFAULT_PATH = path.resolve(__dirname, '..', '..', '..', '..', '.
await page.waitForSelector('a');
const realURL = await page.evaluate(() => document.querySelector('a').href);
- const url = `chrome-devtools://devtools/custom/${realURL.substring('http://localhost:9227/devtools/'.length)}&remoteVersion=${chromeVersion}`;
+ const path = realURL.substring('http://localhost:9227/devtools/'.length);
+ const url = `devtools://devtools/custom/${path}&remoteVersion=${chromeVersion}`;
await page.goto(url);
})();
@@ -65,4 +66,4 @@ async function downloadChrome(revision) {
function toMegabytes(bytes) {
const mb = bytes / 1024 / 1024;
return `${Math.round(mb * 10) / 10} Mb`;
-} \ No newline at end of file
+}
diff --git a/chromium/third_party/blink/renderer/devtools/scripts/unused_css/index.js b/chromium/third_party/blink/renderer/devtools/scripts/unused_css/index.js
new file mode 100644
index 00000000000..98f2fdf1a12
--- /dev/null
+++ b/chromium/third_party/blink/renderer/devtools/scripts/unused_css/index.js
@@ -0,0 +1,149 @@
+const fs = require('fs');
+const path = require('path');
+const css = require('css');
+const cssWhat = require('css-what');
+const acorn = require('acorn');
+
+const utils = require('../utils');
+const promisify = require('util').promisify;
+const readFile = promisify(fs.readFile);
+const FRONTEND_PATH = path.join(__dirname, '..', '..', 'front_end');
+
+const classes = new Set();
+const strings = new Set();
+const trickyStrings = new Set([
+ 'crc-node__tree-hostname',
+ 'tooltip-boundary',
+ 'terminal',
+ 'terminal-cursor',
+ 'composition-view'
+]);
+(async function() {
+ await Promise.all(fs.readdirSync(FRONTEND_PATH).map(dir => processFolder(dir)));
+ const unused = [];
+ for (const className of classes) {
+ if (strings.has(className) || trickyStrings.has(className))
+ continue;
+ if (className.startsWith('CodeMirror'))
+ continue;
+ if (className.startsWith('xterm-'))
+ continue;
+ if (className.startsWith('lh-'))
+ continue;
+ if (className.startsWith('cm-'))
+ continue;
+ if (className.startsWith('navigator-'))
+ continue;
+ if (className.startsWith('object-value-'))
+ continue;
+ if (className.startsWith('security-summary-'))
+ continue;
+ if (className.startsWith('security-explanation-title-'))
+ continue;
+ if (className.startsWith('security-explanation-'))
+ continue;
+ if (className.startsWith('lock-icon-'))
+ continue;
+ if (className.startsWith('security-property-'))
+ continue;
+ if (className.startsWith('url-scheme-'))
+ continue;
+ if (className.startsWith('infobar-'))
+ continue;
+ if (className.startsWith('shadow-root-depth-'))
+ continue;
+ if (className.startsWith('timeline-overview-'))
+ continue;
+ if (className.startsWith('spritesheet-'))
+ continue;
+ if (className.startsWith('report-icon--'))
+ continue;
+
+ if (checkSuffix('-start'))
+ continue;
+ if (checkSuffix('-end'))
+ continue;
+ if (checkSuffix('-column'))
+ continue;
+ if (checkSuffix('-overview-grid'))
+ continue;
+ if (checkSuffix('-overview-container'))
+ continue;
+ if (checkSuffix('-icon'))
+ continue;
+ unused.push(className);
+
+ function checkSuffix(suffix) {
+ return className.endsWith(suffix) && strings.has(className.substring(0, className.length - suffix.length));
+ }
+ }
+ console.log(unused);
+ console.log(unused.length);
+})();
+
+
+async function processFolder(dir) {
+ if (!utils.isDir(path.join(FRONTEND_PATH, dir)))
+ return;
+ const modulePath = path.join(FRONTEND_PATH, dir, 'module.json');
+ if (!utils.isFile(modulePath))
+ return;
+ const content = JSON.parse(await readFile(modulePath, 'utf8'));
+ const promises = [];
+ for (const resource of content.resources || []) {
+ if (!resource.endsWith('.css'))
+ continue;
+ promises.push(processCSSFile(path.join(FRONTEND_PATH, dir, resource)));
+ }
+ const skips = new Set(content.skip_compilation || []);
+ for (const script of content.scripts || []) {
+ if (skips.has(script))
+ continue;
+ promises.push(processScriptFile(path.join(FRONTEND_PATH, dir, script)));
+ }
+ await Promise.all(promises);
+}
+
+async function processCSSFile(cssFile) {
+ const content = await readFile(cssFile, 'utf8');
+ try {
+ const ast = css.parse(content);
+ for (const rule of ast.stylesheet.rules) {
+ for (const selector of rule.selectors || []) {
+ for (const token of parseSimpleSelector(selector)) {
+ if (token.name === 'class' || token.name === 'id')
+ classes.add(token.value);
+ }
+ }
+ }
+ } catch(e) {
+ console.log(cssFile, e)
+ }
+}
+
+function parseSimpleSelector(selector) {
+ // css-what isn't the best. Try catch.
+ try {
+ const parsed = cssWhat(selector)
+ return parsed[0] || [];
+ } catch(e) {
+ return [];
+ }
+}
+
+async function processScriptFile(scriptFile) {
+ const content = await readFile(scriptFile, 'utf8');
+ const tokens = acorn.tokenizer(content);
+ for (const token of tokens) {
+ if(token.type.label === 'string' || token.type.label === 'template') {
+ for (const word of token.value.split(' '))
+ strings.add(word);
+ const regex = /class\s*=\s*['"]?([\w\-_ ]*)/ig;
+ let result;
+ while ((result = regex.exec(token.value))) {
+ for (const word of result[1].split(' '))
+ strings.add(word);
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/chromium/third_party/blink/renderer/devtools/scripts/unused_css/package.json b/chromium/third_party/blink/renderer/devtools/scripts/unused_css/package.json
new file mode 100644
index 00000000000..108e0bbae1c
--- /dev/null
+++ b/chromium/third_party/blink/renderer/devtools/scripts/unused_css/package.json
@@ -0,0 +1,11 @@
+{
+ "name": "unused_css",
+ "scripts": {
+ "start": "node index.js"
+ },
+ "dependencies": {
+ "acorn": "^6.1.1",
+ "css": "^2.2.4",
+ "css-what": "^2.1.3"
+ }
+}